survey-pdf 1.9.18 → 1.9.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/survey.pdf.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * surveyjs - SurveyJS PDF library v1.9.18
2
+ * surveyjs - SurveyJS PDF library v1.9.21
3
3
  * Copyright (c) 2015-2022 Devsoft Baltic OÜ - http://surveyjs.io/
4
4
  * License: MIT (http://www.opensource.org/licenses/mit-license.php)
5
5
  */
@@ -260,7 +260,7 @@ function __spreadArray(to, from, pack) {
260
260
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__pdf_render_pdf_text__ = __webpack_require__(4);
261
261
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__pdf_render_pdf_textbold__ = __webpack_require__(12);
262
262
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__pdf_render_pdf_titlepanel__ = __webpack_require__(33);
263
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__pdf_render_pdf_description__ = __webpack_require__(57);
263
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__pdf_render_pdf_description__ = __webpack_require__(58);
264
264
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__pdf_render_pdf_comment__ = __webpack_require__(25);
265
265
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__pdf_render_pdf_link__ = __webpack_require__(30);
266
266
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__pdf_render_pdf_html__ = __webpack_require__(28);
@@ -959,6 +959,11 @@ var SurveyHelper = /** @class */ (function () {
959
959
  SurveyHelper.getContentQuestion = function (question) {
960
960
  return !!question.contentQuestion ? question.contentQuestion : question;
961
961
  };
962
+ SurveyHelper.getContentQuestionType = function (question) {
963
+ if (!!question.customWidget)
964
+ return question.customWidget.pdfQuestionType;
965
+ return !!question.contentQuestion ? 'custom_model' : question.getType();
966
+ };
962
967
  SurveyHelper.getRatingMinWidth = function (controller) {
963
968
  return controller.measureText(this.RATING_MIN_WIDTH).width;
964
969
  };
@@ -1020,13 +1025,11 @@ var SurveyHelper = /** @class */ (function () {
1020
1025
  };
1021
1026
  SurveyHelper.generateQuestionFlats = function (survey, controller, question, point) {
1022
1027
  return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __awaiter */])(this, void 0, void 0, function () {
1023
- var questionComposite, questionType, flatQuestion, questionFlats, adornersOptions;
1028
+ var questionType, flatQuestion, questionFlats, adornersOptions;
1024
1029
  return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __generator */])(this, function (_a) {
1025
1030
  switch (_a.label) {
1026
1031
  case 0:
1027
- questionComposite = this.getContentQuestion(question);
1028
- questionType = question.customWidget ?
1029
- question.customWidget.pdfQuestionType : questionComposite.getType();
1032
+ questionType = this.getContentQuestionType(question);
1030
1033
  flatQuestion = __WEBPACK_IMPORTED_MODULE_4__flat_layout_flat_repository__["a" /* FlatRepository */].getInstance().
1031
1034
  create(survey, question, controller, questionType);
1032
1035
  return [4 /*yield*/, flatQuestion.generateFlats(point)];
@@ -1701,10 +1704,10 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_7__;
1701
1704
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_jspdf__ = __webpack_require__(18);
1702
1705
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_jspdf___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_jspdf__);
1703
1706
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__helper_survey__ = __webpack_require__(1);
1704
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jspdf_plugins_acroform__ = __webpack_require__(56);
1705
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jspdf_plugins_acroform_js__ = __webpack_require__(59);
1707
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__jspdf_plugins_acroform__ = __webpack_require__(57);
1708
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jspdf_plugins_acroform_js__ = __webpack_require__(60);
1706
1709
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__jspdf_plugins_acroform_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4__jspdf_plugins_acroform_js__);
1707
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__jspdf_plugins_from_html_js__ = __webpack_require__(60);
1710
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__jspdf_plugins_from_html_js__ = __webpack_require__(61);
1708
1711
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__jspdf_plugins_from_html_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5__jspdf_plugins_from_html_js__);
1709
1712
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return DocOptions; });
1710
1713
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return DocController; });
@@ -2378,6 +2381,7 @@ var FlatSurvey = /** @class */ (function () {
2378
2381
  else
2379
2382
  flats.push(pageFlats);
2380
2383
  this.popRowlines(flats[flats.length - 1]);
2384
+ point.yTop = controller.leftTopPoint.yTop;
2381
2385
  _e.label = 15;
2382
2386
  case 15:
2383
2387
  i++;
@@ -2575,7 +2579,7 @@ var TextBoldBrick = /** @class */ (function (_super) {
2575
2579
 
2576
2580
  "use strict";
2577
2581
  Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
2578
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__survey__ = __webpack_require__(53);
2582
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__survey__ = __webpack_require__(54);
2579
2583
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyPDF", function() { return __WEBPACK_IMPORTED_MODULE_0__survey__["a"]; });
2580
2584
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helper_survey__ = __webpack_require__(1);
2581
2585
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SurveyHelper", function() { return __WEBPACK_IMPORTED_MODULE_1__helper_survey__["a"]; });
@@ -2590,92 +2594,95 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
2590
2594
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatBoolean", function() { return __WEBPACK_IMPORTED_MODULE_5__flat_layout_flat_boolean__["a"]; });
2591
2595
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__flat_layout_flat_checkbox__ = __webpack_require__(36);
2592
2596
  /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatCheckbox", function() { return __WEBPACK_IMPORTED_MODULE_6__flat_layout_flat_checkbox__["a"]; });
2593
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__flat_layout_flat_comment__ = __webpack_require__(37);
2594
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatComment", function() { return __WEBPACK_IMPORTED_MODULE_7__flat_layout_flat_comment__["a"]; });
2595
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__flat_layout_flat_dropdown__ = __webpack_require__(38);
2596
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatDropdown", function() { return __WEBPACK_IMPORTED_MODULE_8__flat_layout_flat_dropdown__["a"]; });
2597
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__flat_layout_flat_expression__ = __webpack_require__(39);
2598
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatExpression", function() { return __WEBPACK_IMPORTED_MODULE_9__flat_layout_flat_expression__["a"]; });
2599
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__flat_layout_flat_file__ = __webpack_require__(40);
2600
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatFile", function() { return __WEBPACK_IMPORTED_MODULE_10__flat_layout_flat_file__["a"]; });
2601
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__flat_layout_flat_html__ = __webpack_require__(41);
2602
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatHTML", function() { return __WEBPACK_IMPORTED_MODULE_11__flat_layout_flat_html__["a"]; });
2603
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__flat_layout_flat_image__ = __webpack_require__(42);
2604
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatImage", function() { return __WEBPACK_IMPORTED_MODULE_12__flat_layout_flat_image__["a"]; });
2605
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__flat_layout_flat_imagepicker__ = __webpack_require__(43);
2606
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatImagePicker", function() { return __WEBPACK_IMPORTED_MODULE_13__flat_layout_flat_imagepicker__["a"]; });
2607
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__flat_layout_flat_paneldynamic__ = __webpack_require__(47);
2608
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatPanelDynamic", function() { return __WEBPACK_IMPORTED_MODULE_14__flat_layout_flat_paneldynamic__["a"]; });
2609
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__flat_layout_flat_radiogroup__ = __webpack_require__(11);
2610
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatRadiogroup", function() { return __WEBPACK_IMPORTED_MODULE_15__flat_layout_flat_radiogroup__["a"]; });
2611
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__flat_layout_flat_ranking__ = __webpack_require__(48);
2612
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatRanking", function() { return __WEBPACK_IMPORTED_MODULE_16__flat_layout_flat_ranking__["a"]; });
2613
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__flat_layout_flat_rating__ = __webpack_require__(49);
2614
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatRating", function() { return __WEBPACK_IMPORTED_MODULE_17__flat_layout_flat_rating__["a"]; });
2615
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__flat_layout_flat_selectbase__ = __webpack_require__(14);
2616
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatSelectBase", function() { return __WEBPACK_IMPORTED_MODULE_18__flat_layout_flat_selectbase__["a"]; });
2617
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__flat_layout_flat_signaturepad__ = __webpack_require__(50);
2618
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatSignaturePad", function() { return __WEBPACK_IMPORTED_MODULE_19__flat_layout_flat_signaturepad__["a"]; });
2619
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__flat_layout_flat_textbox__ = __webpack_require__(51);
2620
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatTextbox", function() { return __WEBPACK_IMPORTED_MODULE_20__flat_layout_flat_textbox__["a"]; });
2621
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__flat_layout_flat_survey__ = __webpack_require__(9);
2622
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatSurvey", function() { return __WEBPACK_IMPORTED_MODULE_21__flat_layout_flat_survey__["a"]; });
2623
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__flat_layout_flat_matrix__ = __webpack_require__(44);
2624
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatMatrix", function() { return __WEBPACK_IMPORTED_MODULE_22__flat_layout_flat_matrix__["a"]; });
2625
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__flat_layout_flat_matrixmultiple__ = __webpack_require__(21);
2626
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatMatrixMultiple", function() { return __WEBPACK_IMPORTED_MODULE_23__flat_layout_flat_matrixmultiple__["a"]; });
2627
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__flat_layout_flat_matrixdynamic__ = __webpack_require__(45);
2628
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatMatrixDynamic", function() { return __WEBPACK_IMPORTED_MODULE_24__flat_layout_flat_matrixdynamic__["a"]; });
2629
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__flat_layout_flat_multipletext__ = __webpack_require__(46);
2630
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatMultipleText", function() { return __WEBPACK_IMPORTED_MODULE_25__flat_layout_flat_multipletext__["a"]; });
2631
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__page_layout_page_packer__ = __webpack_require__(22);
2632
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "PagePacker", function() { return __WEBPACK_IMPORTED_MODULE_26__page_layout_page_packer__["a"]; });
2633
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__event_handler_event_handler__ = __webpack_require__(20);
2634
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "EventHandler", function() { return __WEBPACK_IMPORTED_MODULE_27__event_handler_event_handler__["a"]; });
2635
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__event_handler_draw_canvas__ = __webpack_require__(19);
2636
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "HorizontalAlign", function() { return __WEBPACK_IMPORTED_MODULE_28__event_handler_draw_canvas__["a"]; });
2637
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "VerticalAlign", function() { return __WEBPACK_IMPORTED_MODULE_28__event_handler_draw_canvas__["b"]; });
2638
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "DrawCanvas", function() { return __WEBPACK_IMPORTED_MODULE_28__event_handler_draw_canvas__["c"]; });
2639
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__pdf_render_pdf_brick__ = __webpack_require__(6);
2640
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "PdfBrick", function() { return __WEBPACK_IMPORTED_MODULE_29__pdf_render_pdf_brick__["a"]; });
2641
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__pdf_render_pdf_booleanitem__ = __webpack_require__(23);
2642
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "BooleanItemBrick", function() { return __WEBPACK_IMPORTED_MODULE_30__pdf_render_pdf_booleanitem__["a"]; });
2643
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__pdf_render_pdf_checkboxitem__ = __webpack_require__(24);
2644
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "CheckboxItemBrick", function() { return __WEBPACK_IMPORTED_MODULE_31__pdf_render_pdf_checkboxitem__["a"]; });
2645
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__pdf_render_pdf_checkitem__ = __webpack_require__(10);
2646
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "CheckItemBrick", function() { return __WEBPACK_IMPORTED_MODULE_32__pdf_render_pdf_checkitem__["a"]; });
2647
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__pdf_render_pdf_comment__ = __webpack_require__(25);
2648
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "CommentBrick", function() { return __WEBPACK_IMPORTED_MODULE_33__pdf_render_pdf_comment__["a"]; });
2649
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__pdf_render_pdf_composite__ = __webpack_require__(5);
2650
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "CompositeBrick", function() { return __WEBPACK_IMPORTED_MODULE_34__pdf_render_pdf_composite__["a"]; });
2651
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__pdf_render_pdf_custom__ = __webpack_require__(52);
2652
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "CustomBrick", function() { return __WEBPACK_IMPORTED_MODULE_35__pdf_render_pdf_custom__["a"]; });
2653
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__pdf_render_pdf_dropdown__ = __webpack_require__(26);
2654
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "DropdownBrick", function() { return __WEBPACK_IMPORTED_MODULE_36__pdf_render_pdf_dropdown__["a"]; });
2655
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__pdf_render_pdf_empty__ = __webpack_require__(27);
2656
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "EmptyBrick", function() { return __WEBPACK_IMPORTED_MODULE_37__pdf_render_pdf_empty__["a"]; });
2657
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__pdf_render_pdf_html__ = __webpack_require__(28);
2658
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "HTMLBrick", function() { return __WEBPACK_IMPORTED_MODULE_38__pdf_render_pdf_html__["a"]; });
2659
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__pdf_render_pdf_image__ = __webpack_require__(29);
2660
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ImageBrick", function() { return __WEBPACK_IMPORTED_MODULE_39__pdf_render_pdf_image__["a"]; });
2661
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__pdf_render_pdf_link__ = __webpack_require__(30);
2662
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "LinkBrick", function() { return __WEBPACK_IMPORTED_MODULE_40__pdf_render_pdf_link__["a"]; });
2663
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__pdf_render_pdf_radioitem__ = __webpack_require__(31);
2664
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "RadioItemBrick", function() { return __WEBPACK_IMPORTED_MODULE_41__pdf_render_pdf_radioitem__["a"]; });
2665
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__pdf_render_pdf_rankingitem__ = __webpack_require__(32);
2666
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "RankingItemBrick", function() { return __WEBPACK_IMPORTED_MODULE_42__pdf_render_pdf_rankingitem__["a"]; });
2667
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__pdf_render_pdf_rowline__ = __webpack_require__(15);
2668
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "RowlineBrick", function() { return __WEBPACK_IMPORTED_MODULE_43__pdf_render_pdf_rowline__["a"]; });
2669
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_44__pdf_render_pdf_textfield__ = __webpack_require__(17);
2670
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "TextFieldBrick", function() { return __WEBPACK_IMPORTED_MODULE_44__pdf_render_pdf_textfield__["a"]; });
2671
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_45__pdf_render_pdf_textbold__ = __webpack_require__(12);
2672
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "TextBoldBrick", function() { return __WEBPACK_IMPORTED_MODULE_45__pdf_render_pdf_textbold__["a"]; });
2673
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_46__pdf_render_pdf_textbox__ = __webpack_require__(16);
2674
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "TextBoxBrick", function() { return __WEBPACK_IMPORTED_MODULE_46__pdf_render_pdf_textbox__["a"]; });
2675
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_47__pdf_render_pdf_text__ = __webpack_require__(4);
2676
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "TextBrick", function() { return __WEBPACK_IMPORTED_MODULE_47__pdf_render_pdf_text__["a"]; });
2677
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_48__pdf_render_pdf_titlepanel__ = __webpack_require__(33);
2678
- /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "TitlePanelBrick", function() { return __WEBPACK_IMPORTED_MODULE_48__pdf_render_pdf_titlepanel__["a"]; });
2597
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__flat_layout_flat_custom_model__ = __webpack_require__(38);
2598
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatCustomModel", function() { return __WEBPACK_IMPORTED_MODULE_7__flat_layout_flat_custom_model__["a"]; });
2599
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__flat_layout_flat_comment__ = __webpack_require__(37);
2600
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatComment", function() { return __WEBPACK_IMPORTED_MODULE_8__flat_layout_flat_comment__["a"]; });
2601
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__flat_layout_flat_dropdown__ = __webpack_require__(39);
2602
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatDropdown", function() { return __WEBPACK_IMPORTED_MODULE_9__flat_layout_flat_dropdown__["a"]; });
2603
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__flat_layout_flat_expression__ = __webpack_require__(40);
2604
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatExpression", function() { return __WEBPACK_IMPORTED_MODULE_10__flat_layout_flat_expression__["a"]; });
2605
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__flat_layout_flat_file__ = __webpack_require__(41);
2606
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatFile", function() { return __WEBPACK_IMPORTED_MODULE_11__flat_layout_flat_file__["a"]; });
2607
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__flat_layout_flat_html__ = __webpack_require__(42);
2608
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatHTML", function() { return __WEBPACK_IMPORTED_MODULE_12__flat_layout_flat_html__["a"]; });
2609
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__flat_layout_flat_image__ = __webpack_require__(43);
2610
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatImage", function() { return __WEBPACK_IMPORTED_MODULE_13__flat_layout_flat_image__["a"]; });
2611
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__flat_layout_flat_imagepicker__ = __webpack_require__(44);
2612
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatImagePicker", function() { return __WEBPACK_IMPORTED_MODULE_14__flat_layout_flat_imagepicker__["a"]; });
2613
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__flat_layout_flat_paneldynamic__ = __webpack_require__(48);
2614
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatPanelDynamic", function() { return __WEBPACK_IMPORTED_MODULE_15__flat_layout_flat_paneldynamic__["a"]; });
2615
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__flat_layout_flat_radiogroup__ = __webpack_require__(11);
2616
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatRadiogroup", function() { return __WEBPACK_IMPORTED_MODULE_16__flat_layout_flat_radiogroup__["a"]; });
2617
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__flat_layout_flat_ranking__ = __webpack_require__(49);
2618
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatRanking", function() { return __WEBPACK_IMPORTED_MODULE_17__flat_layout_flat_ranking__["a"]; });
2619
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__flat_layout_flat_rating__ = __webpack_require__(50);
2620
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatRating", function() { return __WEBPACK_IMPORTED_MODULE_18__flat_layout_flat_rating__["a"]; });
2621
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__flat_layout_flat_selectbase__ = __webpack_require__(14);
2622
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatSelectBase", function() { return __WEBPACK_IMPORTED_MODULE_19__flat_layout_flat_selectbase__["a"]; });
2623
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__flat_layout_flat_signaturepad__ = __webpack_require__(51);
2624
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatSignaturePad", function() { return __WEBPACK_IMPORTED_MODULE_20__flat_layout_flat_signaturepad__["a"]; });
2625
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__flat_layout_flat_textbox__ = __webpack_require__(52);
2626
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatTextbox", function() { return __WEBPACK_IMPORTED_MODULE_21__flat_layout_flat_textbox__["a"]; });
2627
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__flat_layout_flat_survey__ = __webpack_require__(9);
2628
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatSurvey", function() { return __WEBPACK_IMPORTED_MODULE_22__flat_layout_flat_survey__["a"]; });
2629
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__flat_layout_flat_matrix__ = __webpack_require__(45);
2630
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatMatrix", function() { return __WEBPACK_IMPORTED_MODULE_23__flat_layout_flat_matrix__["a"]; });
2631
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__flat_layout_flat_matrixmultiple__ = __webpack_require__(21);
2632
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatMatrixMultiple", function() { return __WEBPACK_IMPORTED_MODULE_24__flat_layout_flat_matrixmultiple__["a"]; });
2633
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__flat_layout_flat_matrixdynamic__ = __webpack_require__(46);
2634
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatMatrixDynamic", function() { return __WEBPACK_IMPORTED_MODULE_25__flat_layout_flat_matrixdynamic__["a"]; });
2635
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__flat_layout_flat_multipletext__ = __webpack_require__(47);
2636
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "FlatMultipleText", function() { return __WEBPACK_IMPORTED_MODULE_26__flat_layout_flat_multipletext__["a"]; });
2637
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__page_layout_page_packer__ = __webpack_require__(22);
2638
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "PagePacker", function() { return __WEBPACK_IMPORTED_MODULE_27__page_layout_page_packer__["a"]; });
2639
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__event_handler_event_handler__ = __webpack_require__(20);
2640
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "EventHandler", function() { return __WEBPACK_IMPORTED_MODULE_28__event_handler_event_handler__["a"]; });
2641
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__event_handler_draw_canvas__ = __webpack_require__(19);
2642
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "HorizontalAlign", function() { return __WEBPACK_IMPORTED_MODULE_29__event_handler_draw_canvas__["a"]; });
2643
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "VerticalAlign", function() { return __WEBPACK_IMPORTED_MODULE_29__event_handler_draw_canvas__["b"]; });
2644
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "DrawCanvas", function() { return __WEBPACK_IMPORTED_MODULE_29__event_handler_draw_canvas__["c"]; });
2645
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__pdf_render_pdf_brick__ = __webpack_require__(6);
2646
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "PdfBrick", function() { return __WEBPACK_IMPORTED_MODULE_30__pdf_render_pdf_brick__["a"]; });
2647
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__pdf_render_pdf_booleanitem__ = __webpack_require__(23);
2648
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "BooleanItemBrick", function() { return __WEBPACK_IMPORTED_MODULE_31__pdf_render_pdf_booleanitem__["a"]; });
2649
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__pdf_render_pdf_checkboxitem__ = __webpack_require__(24);
2650
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "CheckboxItemBrick", function() { return __WEBPACK_IMPORTED_MODULE_32__pdf_render_pdf_checkboxitem__["a"]; });
2651
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__pdf_render_pdf_checkitem__ = __webpack_require__(10);
2652
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "CheckItemBrick", function() { return __WEBPACK_IMPORTED_MODULE_33__pdf_render_pdf_checkitem__["a"]; });
2653
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__pdf_render_pdf_comment__ = __webpack_require__(25);
2654
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "CommentBrick", function() { return __WEBPACK_IMPORTED_MODULE_34__pdf_render_pdf_comment__["a"]; });
2655
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__pdf_render_pdf_composite__ = __webpack_require__(5);
2656
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "CompositeBrick", function() { return __WEBPACK_IMPORTED_MODULE_35__pdf_render_pdf_composite__["a"]; });
2657
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__pdf_render_pdf_custom__ = __webpack_require__(53);
2658
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "CustomBrick", function() { return __WEBPACK_IMPORTED_MODULE_36__pdf_render_pdf_custom__["a"]; });
2659
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__pdf_render_pdf_dropdown__ = __webpack_require__(26);
2660
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "DropdownBrick", function() { return __WEBPACK_IMPORTED_MODULE_37__pdf_render_pdf_dropdown__["a"]; });
2661
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__pdf_render_pdf_empty__ = __webpack_require__(27);
2662
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "EmptyBrick", function() { return __WEBPACK_IMPORTED_MODULE_38__pdf_render_pdf_empty__["a"]; });
2663
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__pdf_render_pdf_html__ = __webpack_require__(28);
2664
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "HTMLBrick", function() { return __WEBPACK_IMPORTED_MODULE_39__pdf_render_pdf_html__["a"]; });
2665
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__pdf_render_pdf_image__ = __webpack_require__(29);
2666
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "ImageBrick", function() { return __WEBPACK_IMPORTED_MODULE_40__pdf_render_pdf_image__["a"]; });
2667
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__pdf_render_pdf_link__ = __webpack_require__(30);
2668
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "LinkBrick", function() { return __WEBPACK_IMPORTED_MODULE_41__pdf_render_pdf_link__["a"]; });
2669
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__pdf_render_pdf_radioitem__ = __webpack_require__(31);
2670
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "RadioItemBrick", function() { return __WEBPACK_IMPORTED_MODULE_42__pdf_render_pdf_radioitem__["a"]; });
2671
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__pdf_render_pdf_rankingitem__ = __webpack_require__(32);
2672
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "RankingItemBrick", function() { return __WEBPACK_IMPORTED_MODULE_43__pdf_render_pdf_rankingitem__["a"]; });
2673
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_44__pdf_render_pdf_rowline__ = __webpack_require__(15);
2674
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "RowlineBrick", function() { return __WEBPACK_IMPORTED_MODULE_44__pdf_render_pdf_rowline__["a"]; });
2675
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_45__pdf_render_pdf_textfield__ = __webpack_require__(17);
2676
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "TextFieldBrick", function() { return __WEBPACK_IMPORTED_MODULE_45__pdf_render_pdf_textfield__["a"]; });
2677
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_46__pdf_render_pdf_textbold__ = __webpack_require__(12);
2678
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "TextBoldBrick", function() { return __WEBPACK_IMPORTED_MODULE_46__pdf_render_pdf_textbold__["a"]; });
2679
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_47__pdf_render_pdf_textbox__ = __webpack_require__(16);
2680
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "TextBoxBrick", function() { return __WEBPACK_IMPORTED_MODULE_47__pdf_render_pdf_textbox__["a"]; });
2681
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_48__pdf_render_pdf_text__ = __webpack_require__(4);
2682
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "TextBrick", function() { return __WEBPACK_IMPORTED_MODULE_48__pdf_render_pdf_text__["a"]; });
2683
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_49__pdf_render_pdf_titlepanel__ = __webpack_require__(33);
2684
+ /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "TitlePanelBrick", function() { return __WEBPACK_IMPORTED_MODULE_49__pdf_render_pdf_titlepanel__["a"]; });
2685
+
2679
2686
 
2680
2687
 
2681
2688
 
@@ -3641,7 +3648,7 @@ __WEBPACK_IMPORTED_MODULE_3__flat_repository__["a" /* FlatRepository */].getInst
3641
3648
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
3642
3649
 
3643
3650
  "use strict";
3644
- /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_node_interval_tree__ = __webpack_require__(54);
3651
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_node_interval_tree__ = __webpack_require__(55);
3645
3652
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_node_interval_tree___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_node_interval_tree__);
3646
3653
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helper_survey__ = __webpack_require__(1);
3647
3654
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return PagePacker; });
@@ -4498,6 +4505,41 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
4498
4505
  /* 38 */
4499
4506
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
4500
4507
 
4508
+ "use strict";
4509
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
4510
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__flat_question__ = __webpack_require__(3);
4511
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__flat_repository__ = __webpack_require__(2);
4512
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FlatCustomModel; });
4513
+
4514
+
4515
+
4516
+ var FlatCustomModel = /** @class */ (function (_super) {
4517
+ __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */])(FlatCustomModel, _super);
4518
+ function FlatCustomModel(survey, question, controller) {
4519
+ var _this = _super.call(this, survey, question, controller) || this;
4520
+ _this.survey = survey;
4521
+ _this.controller = controller;
4522
+ return _this;
4523
+ }
4524
+ FlatCustomModel.prototype.generateFlatsContent = function (point) {
4525
+ return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["b" /* __awaiter */])(this, void 0, void 0, function () {
4526
+ var flat;
4527
+ return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0_tslib__["c" /* __generator */])(this, function (_a) {
4528
+ flat = __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInstance().create(this.survey, this.question, this.controller, this.question.getType());
4529
+ return [2 /*return*/, flat.generateFlatsContent(point)];
4530
+ });
4531
+ });
4532
+ };
4533
+ return FlatCustomModel;
4534
+ }(__WEBPACK_IMPORTED_MODULE_1__flat_question__["a" /* FlatQuestion */]));
4535
+
4536
+ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInstance().register('custom_model', FlatCustomModel);
4537
+
4538
+
4539
+ /***/ }),
4540
+ /* 39 */
4541
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
4542
+
4501
4543
  "use strict";
4502
4544
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(0);
4503
4545
  /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__flat_question__ = __webpack_require__(3);
@@ -4556,7 +4598,7 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
4556
4598
 
4557
4599
 
4558
4600
  /***/ }),
4559
- /* 39 */
4601
+ /* 40 */
4560
4602
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
4561
4603
 
4562
4604
  "use strict";
@@ -4595,7 +4637,7 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
4595
4637
 
4596
4638
 
4597
4639
  /***/ }),
4598
- /* 40 */
4640
+ /* 41 */
4599
4641
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
4600
4642
 
4601
4643
  "use strict";
@@ -4742,7 +4784,7 @@ __WEBPACK_IMPORTED_MODULE_3__flat_repository__["a" /* FlatRepository */].getInst
4742
4784
 
4743
4785
 
4744
4786
  /***/ }),
4745
- /* 41 */
4787
+ /* 42 */
4746
4788
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
4747
4789
 
4748
4790
  "use strict";
@@ -4815,7 +4857,7 @@ __WEBPACK_IMPORTED_MODULE_3__flat_repository__["a" /* FlatRepository */].getInst
4815
4857
 
4816
4858
 
4817
4859
  /***/ }),
4818
- /* 42 */
4860
+ /* 43 */
4819
4861
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
4820
4862
 
4821
4863
  "use strict";
@@ -4857,7 +4899,7 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
4857
4899
 
4858
4900
 
4859
4901
  /***/ }),
4860
- /* 43 */
4902
+ /* 44 */
4861
4903
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
4862
4904
 
4863
4905
  "use strict";
@@ -4989,7 +5031,7 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
4989
5031
 
4990
5032
 
4991
5033
  /***/ }),
4992
- /* 44 */
5034
+ /* 45 */
4993
5035
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
4994
5036
 
4995
5037
  "use strict";
@@ -5283,7 +5325,7 @@ __WEBPACK_IMPORTED_MODULE_4__flat_repository__["a" /* FlatRepository */].getInst
5283
5325
 
5284
5326
 
5285
5327
  /***/ }),
5286
- /* 45 */
5328
+ /* 46 */
5287
5329
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
5288
5330
 
5289
5331
  "use strict";
@@ -5317,7 +5359,7 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
5317
5359
 
5318
5360
 
5319
5361
  /***/ }),
5320
- /* 46 */
5362
+ /* 47 */
5321
5363
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
5322
5364
 
5323
5365
  "use strict";
@@ -5428,7 +5470,7 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
5428
5470
 
5429
5471
 
5430
5472
  /***/ }),
5431
- /* 47 */
5473
+ /* 48 */
5432
5474
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
5433
5475
 
5434
5476
  "use strict";
@@ -5490,7 +5532,7 @@ __WEBPACK_IMPORTED_MODULE_3__flat_repository__["a" /* FlatRepository */].getInst
5490
5532
 
5491
5533
 
5492
5534
  /***/ }),
5493
- /* 48 */
5535
+ /* 49 */
5494
5536
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
5495
5537
 
5496
5538
  "use strict";
@@ -5570,7 +5612,7 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
5570
5612
 
5571
5613
 
5572
5614
  /***/ }),
5573
- /* 49 */
5615
+ /* 50 */
5574
5616
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
5575
5617
 
5576
5618
  "use strict";
@@ -5719,7 +5761,7 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
5719
5761
 
5720
5762
 
5721
5763
  /***/ }),
5722
- /* 50 */
5764
+ /* 51 */
5723
5765
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
5724
5766
 
5725
5767
  "use strict";
@@ -5760,7 +5802,7 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
5760
5802
 
5761
5803
 
5762
5804
  /***/ }),
5763
- /* 51 */
5805
+ /* 52 */
5764
5806
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
5765
5807
 
5766
5808
  "use strict";
@@ -5807,7 +5849,7 @@ __WEBPACK_IMPORTED_MODULE_2__flat_repository__["a" /* FlatRepository */].getInst
5807
5849
 
5808
5850
 
5809
5851
  /***/ }),
5810
- /* 52 */
5852
+ /* 53 */
5811
5853
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
5812
5854
 
5813
5855
  "use strict";
@@ -5845,7 +5887,7 @@ var CustomBrick = /** @class */ (function (_super) {
5845
5887
 
5846
5888
 
5847
5889
  /***/ }),
5848
- /* 53 */
5890
+ /* 54 */
5849
5891
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
5850
5892
 
5851
5893
  "use strict";
@@ -6080,7 +6122,7 @@ var SurveyPDF = /** @class */ (function (_super) {
6080
6122
 
6081
6123
 
6082
6124
  /***/ }),
6083
- /* 54 */
6125
+ /* 55 */
6084
6126
  /***/ (function(module, exports, __webpack_require__) {
6085
6127
 
6086
6128
  "use strict";
@@ -6091,7 +6133,7 @@ var SurveyPDF = /** @class */ (function (_super) {
6091
6133
  // Both insertion and deletion require O(log n) time. Searching requires O(k*logn) time, where `k`
6092
6134
  // is the number of intervals in the output list.
6093
6135
  Object.defineProperty(exports, "__esModule", { value: true });
6094
- var isSame = __webpack_require__(55);
6136
+ var isSame = __webpack_require__(56);
6095
6137
  function height(node) {
6096
6138
  if (node === undefined) {
6097
6139
  return -1;
@@ -6794,7 +6836,7 @@ if (typeof Symbol === 'function') {
6794
6836
  //# sourceMappingURL=index.js.map
6795
6837
 
6796
6838
  /***/ }),
6797
- /* 55 */
6839
+ /* 56 */
6798
6840
  /***/ (function(module, exports) {
6799
6841
 
6800
6842
  //
@@ -6846,7 +6888,7 @@ module.exports = function shallowEqual(objA, objB, compare, compareContext) {
6846
6888
 
6847
6889
 
6848
6890
  /***/ }),
6849
- /* 56 */
6891
+ /* 57 */
6850
6892
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
6851
6893
 
6852
6894
  "use strict";
@@ -6865,7 +6907,7 @@ function setRadioAppearance(doc) {
6865
6907
 
6866
6908
 
6867
6909
  /***/ }),
6868
- /* 57 */
6910
+ /* 58 */
6869
6911
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
6870
6912
 
6871
6913
  "use strict";
@@ -6885,7 +6927,7 @@ var DescriptionBrick = /** @class */ (function (_super) {
6885
6927
 
6886
6928
 
6887
6929
  /***/ }),
6888
- /* 58 */
6930
+ /* 59 */
6889
6931
  /***/ (function(module, exports) {
6890
6932
 
6891
6933
  var g;
@@ -6912,7 +6954,7 @@ module.exports = g;
6912
6954
 
6913
6955
 
6914
6956
  /***/ }),
6915
- /* 59 */
6957
+ /* 60 */
6916
6958
  /***/ (function(module, exports, __webpack_require__) {
6917
6959
 
6918
6960
  /* WEBPACK VAR INJECTION */(function(global) {/* global jsPDF */
@@ -9840,10 +9882,10 @@ var jspdf = __webpack_require__(18);
9840
9882
  Appearance: AcroFormAppearance
9841
9883
  };
9842
9884
  })(jspdf.jsPDF, (typeof window !== 'undefined' && window || typeof global !== 'undefined' && global));
9843
- /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(58)))
9885
+ /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(59)))
9844
9886
 
9845
9887
  /***/ }),
9846
- /* 60 */
9888
+ /* 61 */
9847
9889
  /***/ (function(module, exports, __webpack_require__) {
9848
9890
 
9849
9891
  /**
@@ -11056,4 +11098,4 @@ var jspdf = __webpack_require__(18);
11056
11098
  /***/ })
11057
11099
  /******/ ]);
11058
11100
  });
11059
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAzZTRjYWQ4NzUwYzY5M2E1OTkyYiIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfYnJpY2sudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIlN1cnZleVwiLFwiY29tbW9uanMyXCI6XCJzdXJ2ZXktY29yZVwiLFwiY29tbW9uanNcIjpcInN1cnZleS1jb3JlXCIsXCJhbWRcIjpcInN1cnZleS1jb3JlXCJ9Iiwid2VicGFjazovLy8uL3NyYy9kb2NfY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9wZGYudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfc2VsZWN0YmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfcm93bGluZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGZpZWxkLnRzIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJyb290XCI6XCJqc3BkZlwiLFwiY29tbW9uanMyXCI6XCJqc3BkZlwiLFwiY29tbW9uanNcIjpcImpzcGRmXCIsXCJhbWRcIjpcImpzcGRmXCJ9Iiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzLnRzIiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2V2ZW50X2hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tib3hpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZW1wdHkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsLnRzIiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2Fkb3JuZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9leHByZXNzaW9uLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXgudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jdXN0b20udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1cnZleS50cyIsIndlYnBhY2s6Ly8vLi9+L25vZGUtaW50ZXJ2YWwtdHJlZS9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vfi9zaGFsbG93ZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2Rlc2NyaXB0aW9uLnRzIiwid2VicGFjazovLy8od2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2pzcGRmX3BsdWdpbnMvZnJvbV9odG1sLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87QUNWQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtREFBMkMsY0FBYzs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzlEQTtBQUFBLElBQUksYUFBYSxHQUFHLFVBQVMsQ0FBTSxFQUFFLENBQU07SUFDdkMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxjQUFjO1FBQ3JDLENBQUMsRUFBRSxTQUFTLEVBQUUs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QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsZ0NBQWdDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNE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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsZ0JBQWdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEMsd0NBQXdDLGlGQUFpRjtBQUN6SDtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0Esb0lBQW9JO0FBQ3BJO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFB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QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQSx5RkFBeUY7QUFDekY7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtB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RUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCOztBQUUvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtRkFBbUY7O0FBRW5GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxT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QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQyxpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4Qix3QkFBd0IsT0FBTztBQUMvQixpQkFBaUIsT0FBTztBQUN4Qjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyIsImZpbGUiOiIuL3BhY2thZ2VzL3N1cnZleS1wZGYvc3VydmV5LnBkZi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInN1cnZleS1jb3JlXCIpLCByZXF1aXJlKFwianNwZGZcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJTdXJ2ZXlQREZcIiwgW1wic3VydmV5LWNvcmVcIiwgXCJqc3BkZlwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTdXJ2ZXlQREZcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcImpzcGRmXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTdXJ2ZXlQREZcIl0gPSBmYWN0b3J5KHJvb3RbXCJTdXJ2ZXlcIl0sIHJvb3RbXCJqc3BkZlwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzdfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xOF9fKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEzKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAzZTRjYWQ4NzUwYzY5M2E1OTkyYiIsImRlY2xhcmUgdmFyIFJlZmxlY3Q6IGFueTtcblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkOiBhbnksIGI6IGFueSk6IGFueSB7XG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkOiBhbnksIGI6IGFueSkge1xuICAgIGlmICh0eXBlb2YgYiAhPT0gJ2Z1bmN0aW9uJyAmJiBiICE9PSBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDbGFzcyBleHRlbmRzIHZhbHVlICcgKyBTdHJpbmcoYikgKyAnIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwnKTtcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gICAgX19hc3NpZ24gPSAoPGFueT5PYmplY3QpLmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0OiBhbnkpIHtcbiAgICAgICAgZm9yICh2YXIgczogYW55LCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHM6IGFueSwgZTogYW55KSB7XG4gICAgdmFyIHQ6IGFueSA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHFbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcVtpXSkpXG4gICAgICAgICAgICAgICAgdFtxW2ldXSA9IHNbcVtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9yczogYW55LCB0YXJnZXQ6IGFueSwga2V5OiBhbnksIGRlc2M6IGFueSkge1xuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gJ2Z1bmN0aW9uJykgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25kLWFzc2lnblxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnOiBhbnksIF9hcmd1bWVudHM6IGFueSwgUDogYW55LCBnZW5lcmF0b3I6IGFueSkge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlOiBhbnkpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmU6IGFueSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlOiBhbnksIHJlamVjdDogYW55KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZTogYW55KSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZTogYW55KSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyd0aHJvdyddKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQ6IGFueSkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnOiBhbnksIGJvZHk6IGFueSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IDxhbnk+W10sIG9wczogPGFueT5bXSB9LCBmOiBhbnksIHk6IGFueSwgdDogYW55LCBnOiBhbnk7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksICd0aHJvdyc6IHZlcmIoMSksICdyZXR1cm4nOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuOiBhbnkpIHsgcmV0dXJuIGZ1bmN0aW9uICh2OiBhbnkpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3A6IGFueSkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLicpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbJ3JldHVybiddIDogb3BbMF0gPyB5Wyd0aHJvdyddIHx8ICgodCA9IHlbJ3JldHVybiddKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgKDxhbnk+XykgPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5ICh0bzogYW55LCBmcm9tOiBhbnksIHBhY2s6IGFueSkge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOiBhbnk7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiwgUXVlc3Rpb25SYXRpbmdNb2RlbCwgUXVlc3Rpb25GaWxlTW9kZWwsIExvY2FsaXphYmxlU3RyaW5nLCBRdWVzdGlvblNlbGVjdEJhc2UsIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuL2VudHJpZXMvcGRmJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSUhUTUxSZW5kZXJUeXBlIH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmltcG9ydCB7IFRpdGxlUGFuZWxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfdGl0bGVwYW5lbCc7XG5pbXBvcnQgeyBEZXNjcmlwdGlvbkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbic7XG5pbXBvcnQgeyBDb21tZW50QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbW1lbnQnO1xuaW1wb3J0IHsgTGlua0JyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9saW5rJztcbmltcG9ydCB7IEhUTUxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfaHRtbCc7XG5pbXBvcnQgeyBJbWFnZUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9pbWFnZSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5pbXBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBBZG9ybmVyc09wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5SGVscGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIEVQU0lMT046IG51bWJlciA9IDIuMjIwNDQ2MDQ5MjUwMzEzMDgwODQ3MjYzMzM2MTgxNmUtMTU7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9TVVJWRVlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjc7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9QQUdFX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4zO1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjM7XG4gICAgcHVibGljIHN0YXRpYyBERVNDUklQVElPTl9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDIuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE9USEVSX1JPV1NfQ09VTlQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfTUlOX1dJRFRIOiBudW1iZXIgPSAzO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX01JTl9IRUlHSFQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfQ09MVU1OX1dJRFRIOiBudW1iZXIgPSA1O1xuICAgIHB1YmxpYyBzdGF0aWMgTUFUUklYX0NPTFVNTl9XSURUSDogbnVtYmVyID0gNTtcbiAgICBwdWJsaWMgc3RhdGljIElNQUdFUElDS0VSX0NPVU5UOiBudW1iZXIgPSA0O1xuICAgIHB1YmxpYyBzdGF0aWMgSU1BR0VQSUNLRVJfUkFUSU86IG51bWJlciA9IDQuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE1VTFRJUExFVEVYVF9URVhUX1BFUlM6IG51bWJlciA9IE1hdGguRSAvIDEwLjA7XG4gICAgcHVibGljIHN0YXRpYyBIVE1MX1RBSUxfVEVYVF9TQ0FMRTogbnVtYmVyID0gMC4yNDtcbiAgICBwdWJsaWMgc3RhdGljIFNFTEVDVF9JVEVNX0ZMQVRfU0NBTEU6IG51bWJlciA9IDAuOTU7XG4gICAgcHVibGljIHN0YXRpYyBHQVBfQkVUV0VFTl9ST1dTOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fQ09MVU1OUzogbnVtYmVyID0gMS41O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fSVRFTV9URVhUOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfVklTSUJMRTogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIHN0YXRpYyBCT1JERVJfU0NBTEU6IG51bWJlciA9IDAuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjg7XG4gICAgcHVibGljIHN0YXRpYyBVTlZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjI7XG4gICAgcHVibGljIHN0YXRpYyBSQURJVVNfU0NBTEU6IG51bWJlciA9IDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0ZPTlRfU0NBTEU6IG51bWJlciA9IDEuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU6IG51bWJlciA9IDAuMztcbiAgICBwdWJsaWMgc3RhdGljIEhUTUxfVE9fSU1BR0VfUVVBTElUWTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfQ09MT1I6IHN0cmluZyA9ICcjOWY5ZjlmJztcbiAgICBwdWJsaWMgc3RhdGljIFRFWFRfQ09MT1I6IHN0cmluZyA9ICcjNDA0MDQwJztcbiAgICBwdWJsaWMgc3RhdGljIEJBQ0tHUk9VTkRfQ09MT1I6IHN0cmluZyA9ICcjRkZGRkZGJztcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0xPQ0FUSU9OX01BVFJJWDogc3RyaW5nID0gJ21hdHJpeCc7XG4gICAgcHVibGljIHN0YXRpYyBTVEFOREFSRF9GT05UOiBzdHJpbmcgPSAnaGVsdmV0aWNhJztcbiAgICBwdWJsaWMgc3RhdGljIENVU1RPTV9GT05UX0VOQ09ESU5HOiBzdHJpbmcgPSAnSWRlbnRpdHktSCc7XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlV2lkdGgod2lkdGg6IHN0cmluZywgbWF4V2lkdGg6IG51bWJlcixcbiAgICAgICAgY29sdW1uc0NvdW50OiBudW1iZXIgPSAxKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHdpZHRoLmluZGV4T2YoJ2NhbGMnKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG1heFdpZHRoIC8gY29sdW1uc0NvdW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlOiBudW1iZXIgPSBwYXJzZUZsb2F0KHdpZHRoKTtcbiAgICAgICAgY29uc3QgdW5pdDogc3RyaW5nID0gd2lkdGgucmVwbGFjZSgvW15BLVphLXpdL2csICcnKTtcbiAgICAgICAgbGV0IGs6IG51bWJlcjtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdwdCc6XG4gICAgICAgICAgICAgICAgayA9IDEuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMCAvIDI1LjQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjbSc6XG4gICAgICAgICAgICAgICAgayA9IDcyLjAgLyAyLjU0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW4nOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHgnOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wIC8gOTYuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3BjJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VtJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2V4JzpcbiAgICAgICAgICAgICAgICBrID0gNi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgICAgIGsgPSBtYXhXaWR0aCAvIDEwMC4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSAqIGssIG1heFdpZHRoKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBweFRvUHQodmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHZhbHVlLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgKiA3Mi4wIC8gOTYuMDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBtZXJnZVJlY3RzKC4uLnJlY3RzOiBJUmVjdFtdKTogSVJlY3Qge1xuICAgICAgICBjb25zdCByZXN1bHRSZWN0OiBJUmVjdCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiByZWN0c1swXS54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdHNbMF0ueFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogcmVjdHNbMF0ueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHJlY3RzWzBdLnlCb3RcbiAgICAgICAgfTtcbiAgICAgICAgcmVjdHMuZm9yRWFjaCgocmVjdDogSVJlY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueExlZnQgPSBNYXRoLm1pbihyZXN1bHRSZWN0LnhMZWZ0LCByZWN0LnhMZWZ0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueFJpZ2h0ID0gTWF0aC5tYXgocmVzdWx0UmVjdC54UmlnaHQsIHJlY3QueFJpZ2h0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueVRvcCA9IE1hdGgubWluKHJlc3VsdFJlY3QueVRvcCwgcmVjdC55VG9wKSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueUJvdCA9IE1hdGgubWF4KHJlc3VsdFJlY3QueUJvdCwgcmVjdC55Qm90KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRSZWN0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVBvaW50KHJlY3Q6IElSZWN0LCBpc0xlZnQ6IGJvb2xlYW4gPSB0cnVlLCBpc1RvcDogYm9vbGVhbiA9IGZhbHNlKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBpc0xlZnQgPyByZWN0LnhMZWZ0IDogcmVjdC54UmlnaHQsXG4gICAgICAgICAgICB5VG9wOiBpc1RvcCA/IHJlY3QueVRvcCA6IHJlY3QueUJvdFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJlY3QocG9pbnQ6IElQb2ludCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHBvaW50LnhMZWZ0ICsgd2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wLFxuICAgICAgICAgICAgeUJvdDogcG9pbnQueVRvcCArIGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiAwLjAsXG4gICAgICAgICAgICB4UmlnaHQ6IGNvbnRyb2xsZXIucGFwZXJXaWR0aCxcbiAgICAgICAgICAgIHlUb3A6IDAuMCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGb290ZXJSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogMC4wLFxuICAgICAgICAgICAgeFJpZ2h0OiBjb250cm9sbGVyLnBhcGVyV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIucGFwZXJIZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjaG9vc2VIdG1sRm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnc3RhbmRhcmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc0N1c3RvbUZvbnQoY29udHJvbGxlciwgY29udHJvbGxlci5mb250TmFtZSkgPyB0aGlzLlNUQU5EQVJEX0ZPTlQgOiBjb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnVzZUN1c3RvbUZvbnRJbkh0bWwgPyBjb250cm9sbGVyLmZvbnROYW1lIDogdGhpcy5TVEFOREFSRF9GT05UO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlQ3NzVGV4dFJ1bGUoZm9udFNpemU6IG51bWJlciwgZm9udFN0eWxlOiBzdHJpbmcsIGZvbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYFwiZm9udC1zaXplOiAke2ZvbnRTaXplfXB0OyBmb250LXdlaWdodDogJHtmb250U3R5bGV9OyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGNvbG9yOiAke3RoaXMuVEVYVF9DT0xPUn07XCJgO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhodG1sOiBzdHJpbmcsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmb250ID0gdGhpcy5jaG9vc2VIdG1sRm9udChjb250cm9sbGVyLCByZW5kZXJBcyk7XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cIl9fc3VydmV5cGRmX2h0bWxcIiBzdHlsZT0ke3RoaXMuZ2VuZXJhdGVDc3NUZXh0UnVsZShcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUsIGNvbnRyb2xsZXIuZm9udFN0eWxlLCBmb250KX0+YCArXG4gICAgICAgICAgICBgPHN0eWxlPi5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IDA7IGxpbmUtaGVpZ2h0OiAke2NvbnRyb2xsZXIuZm9udFNpemV9cHQgfSBib2R5IHsgbWFyZ2luOiAwOyB9PC9zdHlsZT4ke2h0bWx9PC9kaXY+YDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzcGxpdEh0bWxSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGh0bWxCcmljazogSVBkZkJyaWNrKTogSVBkZkJyaWNrIHtcbiAgICAgICAgY29uc3QgYnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBodG1sSGVpZ2h0OiBudW1iZXIgPSBodG1sQnJpY2suaGVpZ2h0O1xuICAgICAgICBjb25zdCBtaW5IZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIuZG9jLmdldEZvbnRTaXplKCk7XG4gICAgICAgIGh0bWxCcmljay55Qm90ID0gaHRtbEJyaWNrLnlUb3AgKyBtaW5IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGVtcHR5QnJpY2tDb3VudDogbnVtYmVyID0gTWF0aC5mbG9vcihodG1sSGVpZ2h0IC8gbWluSGVpZ2h0KSAtIDE7XG4gICAgICAgIGJyaWNrcy5wdXNoKGh0bWxCcmljayk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gdGhpcy5jcmVhdGVQb2ludChodG1sQnJpY2spO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZW1wdHlCcmlja0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGJyaWNrcy5wdXNoKG5ldyBFbXB0eUJyaWNrKHRoaXMuY3JlYXRlUmVjdChjdXJyUG9pbnQsIGh0bWxCcmljay53aWR0aCwgbWluSGVpZ2h0KSkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gbWluSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ0hlaWdodDogbnVtYmVyID0gaHRtbEhlaWdodCAtIChlbXB0eUJyaWNrQ291bnQgKyAxKSAqIG1pbkhlaWdodDtcbiAgICAgICAgaWYgKHJlbWFpbmluZ0hlaWdodCA+IDApIHtcbiAgICAgICAgICAgIGJyaWNrcy5wdXNoKG5ldyBFbXB0eUJyaWNrKHRoaXMuY3JlYXRlUmVjdChjdXJyUG9pbnQsIGh0bWxCcmljay53aWR0aCwgcmVtYWluaW5nSGVpZ2h0KSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2soLi4uYnJpY2tzKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVQbGFpblRleHRGbGF0PFQgZXh0ZW5kcyBJUGRmQnJpY2s+KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZywgZmFicmljOiBuZXcgKHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSA9PiBUKTogQ29tcG9zaXRlQnJpY2sge1xuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBjb250cm9sbGVyLmRvYy5zcGxpdFRleHRUb1NpemUodGV4dCxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIHBvaW50LnhMZWZ0KTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSB0aGlzLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBsaW5lcy5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNpemU6IElTaXplID0gY29udHJvbGxlci5tZWFzdXJlVGV4dChsaW5lKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhuZXcgZmFicmljKHF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVjdChjdXJyUG9pbnQsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KSwgbGluZSkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gc2l6ZS5oZWlnaHQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRleHRGbGF0PFQgZXh0ZW5kcyBJUGRmQnJpY2s+KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nLCBmYWJyaWM6IG5ldyAocXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpID0+IFQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdzdHJpbmcnIHx8ICF0aGlzLmhhc0h0bWwodGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVBsYWluVGV4dEZsYXQocG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgIHRleHQgOiB0aGlzLmdldExvY1N0cmluZyg8TG9jYWxpemFibGVTdHJpbmc+dGV4dCksIGZhYnJpYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpdEh0bWxSZWN0KGNvbnRyb2xsZXIsIGF3YWl0IHRoaXMuY3JlYXRlSFRNTEZsYXQocG9pbnQsIDxRdWVzdGlvbj5xdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayh0aGlzLmdldExvY1N0cmluZyh0ZXh0KSwgY29udHJvbGxlciwgJ3N0YW5kYXJkJykpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBoYXNIdG1sKHRleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm46IFJlZ0V4cCA9IC88XFwvP1thLXpdW1xcc1xcU10qPi9pO1xuICAgICAgICByZXR1cm4gdGV4dC5oYXNIdG1sICYmIChwYXR0ZXJuLnRlc3QoKDxhbnk+dGV4dCkucmVuZGVyZWRUZXh0KSB8fCBwYXR0ZXJuLnRlc3QodGV4dC5yZW5kZXJlZEh0bWwpKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0SHRtbE1hcmdpbnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcG9pbnQ6IElQb2ludCk6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLCB3aWR0aDogbnVtYmVyIH0ge1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gcG9pbnQueExlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IGNvbnRyb2xsZXIubWFyZ2lucy50b3AsXG4gICAgICAgICAgICBib3R0b206IGNvbnRyb2xsZXIubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGggPiBjb250cm9sbGVyLnVuaXRXaWR0aCA/IHdpZHRoIDogY29udHJvbGxlci51bml0V2lkdGhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUhUTUxSZWN0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIG1hcmdpbnM6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLCB3aWR0aDogbnVtYmVyIH0sIHJlc3VsdFk6IG51bWJlcik6IElSZWN0IHtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlUGFnZUhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3QgLSBjb250cm9sbGVyLm1hcmdpbnMudG9wO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IChjb250cm9sbGVyLmhlbHBlckRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgLSAxKSAqXG4gICAgICAgICAgICAoY29udHJvbGxlci5mb250U2l6ZSAqIE1hdGguZmxvb3IoYXZhaWxhYmxlUGFnZUhlaWdodCAvIGNvbnRyb2xsZXIuZm9udFNpemUpKVxuICAgICAgICAgICAgKyByZXN1bHRZIC0gbWFyZ2lucy50b3AgKyBTdXJ2ZXlIZWxwZXIuSFRNTF9UQUlMX1RFWFRfU0NBTEUgKiBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhZ2VzOiBudW1iZXIgPSBjb250cm9sbGVyLmhlbHBlckRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG4gICAgICAgIGNvbnRyb2xsZXIuaGVscGVyRG9jLmFkZFBhZ2UoKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG51bWJlck9mUGFnZXM7IGkrKykge1xuICAgICAgICAgICAgY29udHJvbGxlci5oZWxwZXJEb2MuZGVsZXRlUGFnZSgxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIG1hcmdpbnMud2lkdGgsIGhlaWdodCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVIVE1MRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGh0bWw6IHN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IG1hcmdpbnM6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLCB3aWR0aDogbnVtYmVyIH0gPSB0aGlzLmdldEh0bWxNYXJnaW5zKGNvbnRyb2xsZXIsIHBvaW50KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPElQZGZCcmljaz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuaGVscGVyRG9jLmZyb21IVE1MKGh0bWwsIHBvaW50LnhMZWZ0LCBtYXJnaW5zLnRvcCwge1xuICAgICAgICAgICAgICAgIHBhZ2VzcGxpdDogdHJ1ZSwgd2lkdGg6IG1hcmdpbnMud2lkdGhcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUhUTUxSZWN0KHBvaW50LCBjb250cm9sbGVyLCBtYXJnaW5zLCByZXN1bHQueSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgSFRNTEJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBodG1sKSk7XG4gICAgICAgICAgICB9LCBtYXJnaW5zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVGb250RmFjZShmb250TmFtZTogc3RyaW5nLCBmb250QmFzZTY0OiBzdHJpbmcsIGZvbnRXZWlnaHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYEBmb250LWZhY2UgeyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGAgK1xuICAgICAgICAgICAgYHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCR7Zm9udEJhc2U2NH0pIGZvcm1hdCgnd29mZicpOyBgICtcbiAgICAgICAgICAgIGBmb250LXdlaWdodDogJHtmb250V2VpZ2h0fTsgfWA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVGb250RmFjZVdpdGhJdGFsaWNTdHlsZShmb250TmFtZTogc3RyaW5nLCBmb250QmFzZTY0OiBzdHJpbmcsIGZvbnRXZWlnaHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYEBmb250LWZhY2UgeyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGAgK1xuICAgICAgICAgICAgYHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCR7Zm9udEJhc2U2NH0pIGZvcm1hdCgnd29mZicpOyBgICtcbiAgICAgICAgICAgIGBmb250LXdlaWdodDogJHtmb250V2VpZ2h0fTsgZm9udC1zdHlsZTogaXRhbGljfWA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaHRtbFRvWG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGh0bWxEb2M6IERvY3VtZW50ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCcnKTtcbiAgICAgICAgaHRtbERvYy53cml0ZShodG1sLnJlcGxhY2UoL1xcIy9nLCAnJTIzJykpO1xuICAgICAgICBodG1sRG9jLmRvY3VtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgaHRtbERvYy5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJKTtcbiAgICAgICAgaHRtbERvYy5ib2R5LnN0eWxlLm1hcmdpbiA9ICd1bnNldCc7XG4gICAgICAgIHJldHVybiAobmV3IFhNTFNlcmlhbGl6ZXIoKSkuc2VyaWFsaXplVG9TdHJpbmcoaHRtbERvYy5ib2R5KS5yZXBsYWNlKC8lMjMvZywgJyMnKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVTdmdDb250ZW50KGh0bWw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBjb25zdCBzdHlsZTogSFRNTFN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlLmlubmVySFRNTCA9ICcuX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiB1bnNldDsgbGluZS1oZWlnaHQ6IDIycHg7IH0gYm9keSB7IG1hcmdpbjogdW5zZXQ7IH0nO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgICAgY29uc3QgZGl2OiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gJ19fc3VydmV5cGRmX2h0bWwnO1xuICAgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICAgIGRpdi5zdHlsZS50b3AgPSAnLTEwMDAwcHgnO1xuICAgICAgICBkaXYuc3R5bGUubGVmdCA9ICctMTAwMDBweCc7XG4gICAgICAgIGRpdi5zdHlsZS53aWR0aCA9ICh3aWR0aCAvIDcyLjAgKiA5Ni4wKSArICdweCc7XG4gICAgICAgIGRpdi5zdHlsZS5ib3hTaXppbmcgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5jb2xvciA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmZvbnRGYW1pbHkgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5mb250ID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUubGluZUhlaWdodCA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgY29uc3QgZGl2V2lkdGg6IG51bWJlciA9IGRpdi5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgZGl2SGVpZ2h0OiBudW1iZXIgPSBkaXYub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBkaXYucmVtb3ZlKCk7XG4gICAgICAgIHN0eWxlLnJlbW92ZSgpO1xuICAgICAgICBsZXQgZGVmczogc3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChjb250cm9sbGVyLnVzZUN1c3RvbUZvbnRJbkh0bWwpIHtcbiAgICAgICAgICAgIGRlZnMgPSBgPGRlZnM+PHN0eWxlPiR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlKGNvbnRyb2xsZXIuZm9udE5hbWUsIGNvbnRyb2xsZXIuYmFzZTY0Tm9ybWFsLCAnbm9ybWFsJyl9YCArXG4gICAgICAgICAgICAgICAgYCAke3RoaXMuZ2VuZXJhdGVGb250RmFjZShjb250cm9sbGVyLmZvbnROYW1lLCBjb250cm9sbGVyLmJhc2U2NEJvbGQsICdib2xkJyl9PC9zdHlsZT48L2RlZnM+YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHMpLmZvckVhY2goZm9udE5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmb250KS5mb3JFYWNoKChmb250U3R5bGU6ICdub3JtYWwnIHwgJ2JvbGQnIHwgJ2l0YWxpYycgfCAnYm9sZGl0YWxpYycpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTdHlsZSA9PT0gJ25vcm1hbCcgfHwgZm9udFN0eWxlID09PSAnYm9sZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZnMgKz0gYCR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlKGZvbnROYW1lLCBmb250W2ZvbnRTdHlsZV0sIGZvbnRTdHlsZSl9YDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZnMgKz0gYCR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlV2l0aEl0YWxpY1N0eWxlKGZvbnROYW1lLCBmb250W2ZvbnRTdHlsZV0sIGZvbnRTdHlsZSA9PT0gJ2l0YWxpYycgPyAnbm9ybWFsJyA6ICdib2xkJyl9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlZnMgPSAnPGRlZnM+PHN0eWxlPicgKyBkZWZzICsgJzwvc3R5bGU+PC9kZWZzPic7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdmc6IHN0cmluZyA9ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4nICsgZGVmcyArXG4gICAgICAgICAgICAnPHN0eWxlPi5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IHVuc2V0OyBsaW5lLWhlaWdodDogMjJweDsgfTwvc3R5bGU+JyArXG4gICAgICAgICAgICBgPGZvcmVpZ25PYmplY3Qgd2lkdGg9XCIke2RpdldpZHRofXB4XCIgaGVpZ2h0PVwiJHtkaXZIZWlnaHR9cHhcIj5gICtcbiAgICAgICAgICAgIHRoaXMuaHRtbFRvWG1sKGh0bWwpICsgJzwvZm9yZWlnbk9iamVjdD48L3N2Zz4nO1xuICAgICAgICByZXR1cm4geyBzdmcsIGRpdldpZHRoLCBkaXZIZWlnaHQgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBodG1sVG9JbWFnZShodG1sOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPHsgdXJsOiBzdHJpbmcsIGFzcGVjdDogbnVtYmVyIH0+IHtcbiAgICAgICAgY29uc3QgeyBzdmcsIGRpdldpZHRoLCBkaXZIZWlnaHQgfSA9IFN1cnZleUhlbHBlci5jcmVhdGVTdmdDb250ZW50KGh0bWwsIHdpZHRoLCBjb250cm9sbGVyKTtcbiAgICAgICAgY29uc3QgZGF0YTogc3RyaW5nID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN2ZykpKTtcbiAgICAgICAgY29uc3QgaW1nOiBIVE1MSW1hZ2VFbGVtZW50ID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5zcmMgPSBkYXRhO1xuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGRpdldpZHRoO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBkaXZIZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBTdXJ2ZXlIZWxwZXIuQkFDS0dST1VORF9DT0xPUjtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsOiBzdHJpbmcgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWSk7XG4gICAgICAgICAgICAgICAgY2FudmFzLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1cmw6IHVybCwgYXNwZWN0OiBkaXZXaWR0aCAvIGRpdkhlaWdodCB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgdXJsOiAnZGF0YTosJywgYXNwZWN0OiB3aWR0aCAvIHRoaXMuRVBTSUxPTiB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdGV4dCwgVGV4dEJvbGRCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gdGhpcy5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplICo9IHRoaXMuVElUTEVfRk9OVF9TQ0FMRTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLm5vKSB7XG4gICAgICAgICAgICBjb25zdCBub1RleHQ6IHN0cmluZyA9IHF1ZXN0aW9uLm5vICsgJyAnO1xuICAgICAgICAgICAgbGV0IG5vRmxhdDogSVBkZkJyaWNrO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzSHRtbChxdWVzdGlvbi5sb2NUaXRsZSkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KG5vVGV4dCwgJ2JvbGQnKS53aWR0aDtcbiAgICAgICAgICAgICAgICBub0ZsYXQgPSBhd2FpdCB0aGlzLmNyZWF0ZUhUTUxGbGF0KGN1cnJQb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKG5vVGV4dCwgY29udHJvbGxlciwgJ3N0YW5kYXJkJykpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub0ZsYXQgPSBhd2FpdCB0aGlzLmNyZWF0ZUJvbGRUZXh0RmxhdChjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBub1RleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKG5vRmxhdCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBub0ZsYXQueFJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjdXJyUG9pbnQueExlZnQ7XG4gICAgICAgIGNvbnN0IHRleHRGbGF0OiBDb21wb3NpdGVCcmljayA9IDxDb21wb3NpdGVCcmljaz5hd2FpdCB0aGlzLmNyZWF0ZUJvbGRUZXh0RmxhdChcbiAgICAgICAgICAgIGN1cnJQb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHF1ZXN0aW9uLmxvY1RpdGxlKTtcbiAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKHRleHRGbGF0KTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZFRleHQ6IHN0cmluZyA9IHF1ZXN0aW9uLnJlcXVpcmVkVGV4dDtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0h0bWwocXVlc3Rpb24ubG9jVGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gdGhpcy5jcmVhdGVQb2ludCh0ZXh0RmxhdC51bmZvbGQoKVswXSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHJlcXVpcmVkVGV4dCwgJ2JvbGQnKS53aWR0aDtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgdGhpcy5jcmVhdGVIVE1MRmxhdChjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhyZXF1aXJlZFRleHQsIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQodGV4dEZsYXQudW5mb2xkKCkucG9wKCksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiwgY29udHJvbGxlciwgcmVxdWlyZWRUZXh0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZVN1cnZleVBhbmVsRmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZywgZm9udFNpemVTY2FsZTogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQocG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHRleHQsIFRpdGxlUGFuZWxCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgcmV0dXJuIHRpdGxlRmxhdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZVN1cnZleUZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVUaXRsZVN1cnZleVBhbmVsRmxhdChwb2ludCwgY29udHJvbGxlciwgdGV4dCwgdGhpcy5USVRMRV9TVVJWRVlfRk9OVF9TSVpFX1NDQUxFKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZVBhbmVsRmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZywgaXNQYWdlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVUaXRsZVN1cnZleVBhbmVsRmxhdChwb2ludCwgY29udHJvbGxlciwgdGV4dCxcbiAgICAgICAgICAgIGlzUGFnZSA/IHRoaXMuVElUTEVfUEFHRV9GT05UX1NJWkVfU0NBTEUgOiB0aGlzLlRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlRGVzY0ZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICogdGhpcy5ERVNDUklQVElPTl9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdGV4dCwgRGVzY3JpcHRpb25Ccmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSZWFkb25seVJlbmRlckFzKHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybScge1xuICAgICAgICByZXR1cm4gKDxhbnk+cXVlc3Rpb24pLnJlYWRvbmx5UmVuZGVyQXMgPT09ICdhdXRvJyA/IGNvbnRyb2xsZXIucmVhZG9ubHlSZW5kZXJBcyA6ICg8YW55PnF1ZXN0aW9uKS5yZWFkb25seVJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUNvbW1lbnRGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcm93czogbnVtYmVyLCBpc1F1ZXN0aW9uOiBib29sZWFuLCBpbmRleDogbnVtYmVyID0gMCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gdGhpcy5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCBjb250cm9sbGVyLCByb3dzKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZE9ubHkgJiYgdGhpcy5nZXRSZWFkb25seVJlbmRlckFzKHF1ZXN0aW9uLCBjb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJykge1xuICAgICAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlUmVhZE9ubHlUZXh0RmllbGRUZXh0RmxhdChcbiAgICAgICAgICAgICAgICBwb2ludCwgY29udHJvbGxlciwgcXVlc3Rpb24sIHRoaXMuZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbiwgaXNRdWVzdGlvbiksIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmc6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgICAgIGlmICh0ZXh0RmxhdC55Qm90ICsgcGFkZGluZyA+IHJlY3QueUJvdCkgcmVjdC55Qm90ID0gdGV4dEZsYXQueUJvdCArIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb21tZW50QnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sIGluZGV4KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKHF1ZXN0aW9uOiBRdWVzdGlvbiwgaXNRdWVzdGlvbjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXNRdWVzdGlvbiA/IChxdWVzdGlvbi52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHF1ZXN0aW9uLnZhbHVlICE9PSBudWxsID8gcXVlc3Rpb24udmFsdWUgOiAnJykgOlxuICAgICAgICAgICAgKHF1ZXN0aW9uLmNvbW1lbnQgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi5jb21tZW50ICE9PSBudWxsID8gcXVlc3Rpb24uY29tbWVudCA6ICcnKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudERpc3BsYXlWYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24sIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzUXVlc3Rpb24gPyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgOiBTdXJ2ZXlIZWxwZXIuZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbiwgaXNRdWVzdGlvbik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaW5Ccm93c2VyID0gdHlwZW9mIEltYWdlID09PSAnZnVuY3Rpb24nO1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2VGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBhbnksXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGltYWdlbGluazogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG5cbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5pbkJyb3dzZXIpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmFwcGx5SW1hZ2VGaXQpIHtcbiAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdXaWR0aDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCAqPSBuZXdXaWR0aCAvIHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHB0VG9QeDogbnVtYmVyID0gOTYuMCAvIDcyLjA7XG4gICAgICAgICAgICAgICAgY29uc3QgZml0VHlwZSA9ICEhcXVlc3Rpb24gJiYgISFxdWVzdGlvbi5pbWFnZUZpdCA/IHF1ZXN0aW9uLmltYWdlRml0IDogJ2NvbnRhaW4nO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhc0h0bWw6IHN0cmluZyA9XG4gICAgICAgICAgICAgICAgICAgIGA8ZGl2IHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDogJHt3aWR0aCAqIHB0VG9QeH1weDsgaGVpZ2h0OiAke2hlaWdodCAqIHB0VG9QeH1weDsnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9JyR7aW1hZ2VsaW5rfScgc3R5bGU9J29iamVjdC1maXQ6ICR7Zml0VHlwZX07IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7Jy8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IHVybCwgYXNwZWN0IH06IHsgdXJsOiBzdHJpbmcsIGFzcGVjdDogbnVtYmVyIH0gPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBTdXJ2ZXlIZWxwZXIuaHRtbFRvSW1hZ2UoY2FudmFzSHRtbCwgd2lkdGgsIGNvbnRyb2xsZXIpO1xuXG4gICAgICAgICAgICAgICAgaW1hZ2VsaW5rID0gdXJsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBodG1sOiBzdHJpbmcgPSBgPGltZyBzcmM9JyR7aW1hZ2VsaW5rfScgd2lkdGg9JyR7d2lkdGh9JyBoZWlnaHQ9JyR7aGVpZ2h0fScvPmA7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEhUTUxCcmljayhxdWVzdGlvbiwgY29udHJvbGxlciwgdGhpcy5jcmVhdGVSZWN0KHBvaW50LCB3aWR0aCwgaGVpZ2h0KSwgaHRtbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEltYWdlQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIGltYWdlbGluaywgcG9pbnQsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNhblByZXZpZXdJbWFnZShxdWVzdGlvbjogUXVlc3Rpb25GaWxlTW9kZWwsIGl0ZW06IHsgbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB9LCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcXVlc3Rpb24uY2FuUHJldmlld0ltYWdlKGl0ZW0pO1xuICAgICAgICAvLyAgJiYgIGF3YWl0IHRoaXMuZ2V0SW1hZ2VTaXplKHVybCkgIT09IG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0SW1hZ2VTaXplKHVybDogc3RyaW5nKTogUHJvbWlzZTxJU2l6ZT4ge1xuICAgICAgICBpZiAoIVN1cnZleUhlbHBlci5pbkJyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHsgd2lkdGg6IHVuZGVmaW5lZCwgaGVpZ2h0OiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlOiBhbnkgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IHVybDtcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHdpZHRoOiBpbWFnZS53aWR0aCwgaGVpZ2h0OiBpbWFnZS5oZWlnaHQgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc29sdmUobnVsbCk7IH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHdpZHRoPzogbnVtYmVyLCBjb2xvcj86IHN0cmluZyk6IElQZGZCcmljayB7XG4gICAgICAgIGxldCB4UmlnaHQ6IG51bWJlciA9IHR5cGVvZiB3aWR0aCA9PT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IDpcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0ICsgd2lkdGg7XG4gICAgICAgIHhSaWdodCA9IHhSaWdodCA+IHBvaW50LnhMZWZ0ID8geFJpZ2h0IDogcG9pbnQueExlZnQgKyB0aGlzLkVQU0lMT047XG4gICAgICAgIHJldHVybiBuZXcgUm93bGluZUJyaWNrKGNvbnRyb2xsZXIsIHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogeFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCArIHRoaXMuRVBTSUxPTixcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyB0aGlzLkVQU0lMT05cbiAgICAgICAgfSwgdHlwZW9mIGNvbG9yID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBjb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlTGlua0ZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcsIGxpbms6IHN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZVRleHQ6IENvbXBvc2l0ZUJyaWNrID0gPENvbXBvc2l0ZUJyaWNrPmF3YWl0IHRoaXMuXG4gICAgICAgICAgICBjcmVhdGVUZXh0RmxhdChwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIFRleHRCcmljayk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUxpbms6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbXBvc2l0ZVRleHQudW5mb2xkKCkuZm9yRWFjaCgodGV4dDogVGV4dEJyaWNrKSA9PiB7XG4gICAgICAgICAgICBjb21wb3NpdGVMaW5rLmFkZEJyaWNrKG5ldyBMaW5rQnJpY2sodGV4dCwgbGluaykpO1xuICAgICAgICAgICAgY29uc3QgbGluZVBvaW50OiBJUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUxpbmspO1xuICAgICAgICAgICAgY29tcG9zaXRlTGluay5hZGRCcmljayh0aGlzLmNyZWF0ZVJvd2xpbmVGbGF0KGxpbmVQb2ludCxcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21wb3NpdGVMaW5rLndpZHRoLCBMaW5rQnJpY2suQ09MT1IpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVMaW5rO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUFjcm9mb3JtUmVjdChyZWN0OiBJUmVjdCk6IG51bWJlcltdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHJlY3QueExlZnQsXG4gICAgICAgICAgICByZWN0LnlUb3AsXG4gICAgICAgICAgICByZWN0LnhSaWdodCAtIHJlY3QueExlZnQsXG4gICAgICAgICAgICByZWN0LnlCb3QgLSByZWN0LnlUb3BcbiAgICAgICAgXTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGxpbmVzOiBudW1iZXIgPSAxKTogSVJlY3Qge1xuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHBvaW50LnhMZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjb250cm9sbGVyLnVuaXRXaWR0aCk7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci51bml0SGVpZ2h0ICogbGluZXM7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJlY3QocG9pbnQsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVJlYWRPbmx5VGV4dEZpZWxkVGV4dEZsYXQocG9pbnQ6IElQb2ludCxcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcXVlc3Rpb246IFF1ZXN0aW9uLCB2YWx1ZTogc3RyaW5nLCBvbmx5Rmlyc3RMaW5lOiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgcGFkZGluZzogbnVtYmVyID0gY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgIGlmICghb25seUZpcnN0TGluZSkgcG9pbnQueVRvcCArPSBwYWRkaW5nO1xuICAgICAgICBwb2ludC54TGVmdCArPSBwYWRkaW5nO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKHBvaW50LnhMZWZ0LCBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHZhbHVlLnRvU3RyaW5nKCksIFRleHRCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gdGV4dEZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcmVuZGVyRmxhdEJvcmRlcnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZmxhdDogUGRmQnJpY2spOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLkZPUk1fQk9SREVSX1ZJU0lCTEUpIHJldHVybjtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oZmxhdC53aWR0aCwgZmxhdC5oZWlnaHQpO1xuICAgICAgICBjb25zdCB2aXNpYmxlV2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgY29uc3QgdmlzaWJsZVNjYWxlOiBudW1iZXIgPSB0aGlzLmZvcm1TY2FsZShjb250cm9sbGVyLCBmbGF0KSArIHZpc2libGVXaWR0aCAvIG1pblNpZGU7XG4gICAgICAgIGNvbnN0IHVudmlzaWJsZVdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlVOVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgY29uc3QgdW52aXNpYmxlU2NhbGU6IG51bWJlciA9IDEuMCAtIHVudmlzaWJsZVdpZHRoIC8gbWluU2lkZTtcbiAgICAgICAgY29uc3QgdW52aXNpYmxlUmFkaXVzOiBudW1iZXIgPSB0aGlzLlJBRElVU19TQ0FMRSAqIHVudmlzaWJsZVdpZHRoO1xuICAgICAgICBjb25zdCBvbGREcmF3Q29sb3I6IHN0cmluZyA9IGNvbnRyb2xsZXIuZG9jLmdldERyYXdDb2xvcigpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoZmxhdC5mb3JtQm9yZGVyQ29sb3IpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodmlzaWJsZVdpZHRoKTtcbiAgICAgICAgY29udHJvbGxlci5kb2MucmVjdCguLi50aGlzLmNyZWF0ZUFjcm9mb3JtUmVjdCh0aGlzLnNjYWxlUmVjdChmbGF0LCB2aXNpYmxlU2NhbGUpKSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcih0aGlzLkJBQ0tHUk9VTkRfQ09MT1IpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodW52aXNpYmxlV2lkdGgpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5yb3VuZGVkUmVjdCguLi50aGlzLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIHRoaXMuc2NhbGVSZWN0KGZsYXQsIHVudmlzaWJsZVNjYWxlKSksIHVudmlzaWJsZVJhZGl1cywgdW52aXNpYmxlUmFkaXVzKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKG9sZERyYXdDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgcmVuZGVyUmVhZE9ubHlUZXh0RmllbGQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcXVlc3Rpb246IFF1ZXN0aW9uLCBmbGF0OiBQZGZCcmljaywgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgb25seUZpcnN0TGluZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcG9pbnQ6IElQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoZmxhdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gZmxhdC5mb250U2l6ZTtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlUmVhZE9ubHlUZXh0RmllbGRUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBjb250cm9sbGVyLCBxdWVzdGlvbiwgdmFsdWUsIG9ubHlGaXJzdExpbmUpO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIGlmIChvbmx5Rmlyc3RMaW5lKSBhd2FpdCB0ZXh0RmxhdC51bmZvbGQoKVswXS5yZW5kZXIoKTtcbiAgICAgICAgZWxzZSBhd2FpdCB0ZXh0RmxhdC5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJGbGF0Qm9yZGVycyhjb250cm9sbGVyLCBmbGF0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRMb2NTdHJpbmcodGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5oYXNIdG1sKHRleHQpKSByZXR1cm4gdGV4dC5yZW5kZXJlZEh0bWw7XG4gICAgICAgIHJldHVybiAoPGFueT50ZXh0KS5yZW5kZXJlZFRleHQgfHwgdGV4dC5yZW5kZXJlZEh0bWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHF1ZXN0aW9uOiBRdWVzdGlvbik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHFEcm9wRG93bjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICAgICAgaWYgKHFEcm9wRG93bi5pc090aGVyU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBxRHJvcERvd24ub3RoZXJUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEhcXVlc3Rpb24uZGlzcGxheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVlc3Rpb24uZGlzcGxheVZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHFEcm9wRG93bi5zaG93T3B0aW9uc0NhcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBxRHJvcERvd24ub3B0aW9uc0NhcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnRlbnRRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24pOiBRdWVzdGlvbiB7XG4gICAgICAgIHJldHVybiAhISg8YW55PnF1ZXN0aW9uKS5jb250ZW50UXVlc3Rpb24gPyAoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uIDogcXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmF0aW5nTWluV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMuUkFUSU5HX01JTl9XSURUSCkud2lkdGg7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmF0aW5nSXRlbVRleHQocXVlc3Rpb246IFF1ZXN0aW9uUmF0aW5nTW9kZWwsXG4gICAgICAgIGluZGV4OiBudW1iZXIsIGxvY1RleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgICAgICBjb25zdCByYXRpbmdJdGVtTG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBuZXcgTG9jYWxpemFibGVTdHJpbmcobG9jVGV4dC5vd25lciwgbG9jVGV4dC51c2VNYXJrZG93bik7XG4gICAgICAgIHJhdGluZ0l0ZW1Mb2NUZXh0LnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIHF1ZXN0aW9uLm1pblJhdGVEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmF0aW5nSXRlbUxvY1RleHQudGV4dCA9IHF1ZXN0aW9uLmxvY01pblJhdGVEZXNjcmlwdGlvbi50ZXh0ICsgJyAnICsgdGhpcy5nZXRMb2NTdHJpbmcobG9jVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZXggPT09IHF1ZXN0aW9uLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aCAtIDEgJiYgcXVlc3Rpb24ubWF4UmF0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByYXRpbmdJdGVtTG9jVGV4dC50ZXh0ID0gdGhpcy5nZXRMb2NTdHJpbmcobG9jVGV4dCkgKyAnICcgKyBxdWVzdGlvbi5sb2NNYXhSYXRlRGVzY3JpcHRpb24udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmF0aW5nSXRlbUxvY1RleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW1hZ2VQaWNrZXJBdmFpbGFibGVXaWR0aChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9ICh0aGlzLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtXG4gICAgICAgICAgICAodGhpcy5JTUFHRVBJQ0tFUl9DT1VOVCAtIDEpICogY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIHdpZHRoID4gMCA/IHdpZHRoIDogY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbHVtbldpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGNvbENvdW50OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAtIChjb2xDb3VudCAtIDEpICpcbiAgICAgICAgICAgIGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5HQVBfQkVUV0VFTl9DT0xVTU5TKSAvIGNvbENvdW50O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHNldENvbHVtbk1hcmdpbnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgY29sQ291bnQ6IG51bWJlciwgY29sdW1uOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoOiBudW1iZXIgPSB0aGlzLmdldENvbHVtbldpZHRoKGNvbnRyb2xsZXIsIGNvbENvdW50KTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArIGNvbHVtbiAqXG4gICAgICAgICAgICAoY2VsbFdpZHRoICsgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyAoY29sQ291bnQgLSBjb2x1bW4gLSAxKSAqXG4gICAgICAgICAgICAoY2VsbFdpZHRoICsgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIG1vdmVSZWN0KHJlY3Q6IElSZWN0LCBsZWZ0OiBudW1iZXIgPSByZWN0LnhMZWZ0LCB0b3A6IG51bWJlciA9IHJlY3QueVRvcCk6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBsZWZ0LFxuICAgICAgICAgICAgeVRvcDogdG9wLFxuICAgICAgICAgICAgeFJpZ2h0OiBsZWZ0ICsgcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0LFxuICAgICAgICAgICAgeUJvdDogdG9wICsgcmVjdC55Qm90IC0gcmVjdC55VG9wXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2NhbGVSZWN0KHJlY3Q6IElSZWN0LCBzY2FsZTogbnVtYmVyKTogSVJlY3Qge1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gcmVjdC54UmlnaHQgLSByZWN0LnhMZWZ0O1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHJlY3QueUJvdCAtIHJlY3QueVRvcDtcbiAgICAgICAgY29uc3Qgc2NhbGVXaWR0aDogbnVtYmVyID0gKCh3aWR0aCA8IGhlaWdodCkgPyB3aWR0aCA6IGhlaWdodCkgKiAoMS4wIC0gc2NhbGUpIC8gMi4wO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHJlY3QueExlZnQgKyBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeVRvcDogcmVjdC55VG9wICsgc2NhbGVXaWR0aCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdC54UmlnaHQgLSBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeUJvdDogcmVjdC55Qm90IC0gc2NhbGVXaWR0aFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGZvcm1TY2FsZShjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBmbGF0OiBQZGZCcmljayk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IG1pblNpZGU6IG51bWJlciA9IE1hdGgubWluKGZsYXQud2lkdGgsIGZsYXQuaGVpZ2h0KTtcbiAgICAgICAgY29uc3QgYm9yZGVyV2lkdGg6IG51bWJlciA9IDIuMCAqIGNvbnRyb2xsZXIudW5pdFdpZHRoICogdGhpcy5CT1JERVJfU0NBTEU7XG4gICAgICAgIHJldHVybiAobWluU2lkZSAtIGJvcmRlcldpZHRoKSAvIG1pblNpZGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBxdWVzdGlvbjogUXVlc3Rpb24sIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uQ29tcG9zaXRlOiBRdWVzdGlvbiA9IHRoaXMuZ2V0Q29udGVudFF1ZXN0aW9uKHF1ZXN0aW9uKTtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSBxdWVzdGlvbi5jdXN0b21XaWRnZXQgP1xuICAgICAgICAgICAgcXVlc3Rpb24uY3VzdG9tV2lkZ2V0LnBkZlF1ZXN0aW9uVHlwZSA6IHF1ZXN0aW9uQ29tcG9zaXRlLmdldFR5cGUoKTtcbiAgICAgICAgY29uc3QgZmxhdFF1ZXN0aW9uOiBJRmxhdFF1ZXN0aW9uID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5cbiAgICAgICAgICAgIGNyZWF0ZShzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBxdWVzdGlvblR5cGUpO1xuICAgICAgICBjb25zdCBxdWVzdGlvbkZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IGZsYXRRdWVzdGlvbi5nZW5lcmF0ZUZsYXRzKHBvaW50KTtcbiAgICAgICAgY29uc3QgYWRvcm5lcnNPcHRpb25zOiBBZG9ybmVyc09wdGlvbnMgPSBuZXcgQWRvcm5lcnNPcHRpb25zKHBvaW50LFxuICAgICAgICAgICAgcXVlc3Rpb25GbGF0cywgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCksIFN1cnZleVBERk1vZHVsZSk7XG4gICAgICAgIGlmIChxdWVzdGlvbi5jdXN0b21XaWRnZXQgJiYgcXVlc3Rpb24uY3VzdG9tV2lkZ2V0LmlzRml0KHF1ZXN0aW9uKSAmJlxuICAgICAgICAgICAgcXVlc3Rpb24uY3VzdG9tV2lkZ2V0LnBkZlJlbmRlcikge1xuICAgICAgICAgICAgc3VydmV5Lm9uUmVuZGVyUXVlc3Rpb24udW5zaGlmdChxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUmVuZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBzdXJ2ZXkub25SZW5kZXJRdWVzdGlvbi5maXJlKHN1cnZleSwgYWRvcm5lcnNPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIFsuLi5hZG9ybmVyc09wdGlvbnMuYnJpY2tzXTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ZvbnRFeGlzdChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBmb250TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5pbnRlcm5hbC5nZXRGb250KGZvbnROYW1lKS5mb250TmFtZSA9PT0gZm9udE5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNDdXN0b21Gb250KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZvbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZG9jLmludGVybmFsLmdldEZvbnQoZm9udE5hbWUpLmVuY29kaW5nID09PSB0aGlzLkNVU1RPTV9GT05UX0VOQ09ESU5HO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGZpeEZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0N1c3RvbUZvbnQoY29udHJvbGxlciwgY29udHJvbGxlci5mb250TmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZG9jLnRleHQoJ2xvYWQgZm9udCcsIDAsIDApO1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2MuZGVsZXRlUGFnZSgxKTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkUGFnZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2xvbmUoc3JjOiBhbnkpOiBhbnkge1xuICAgICAgICBjb25zdCB0YXJnZXQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gc3JjKSB7XG4gICAgICAgICAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc3JjW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJRmxhdFF1ZXN0aW9uLCBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuXG5leHBvcnQgdHlwZSBGbGF0Q29uc3RydWN0b3IgPSBuZXcgKFxuICAgIHN1cnZleTogU3VydmV5UERGLFxuICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlclxuKSA9PiBJRmxhdFF1ZXN0aW9uO1xuZXhwb3J0IGNsYXNzIEZsYXRSZXBvc2l0b3J5IHtcbiAgICBwcml2YXRlIHF1ZXN0aW9uczogeyBbaW5kZXg6IHN0cmluZ106IEZsYXRDb25zdHJ1Y3RvciB9ID0ge307XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEZsYXRSZXBvc2l0b3J5ID0gbmV3IEZsYXRSZXBvc2l0b3J5KCk7XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBGbGF0UmVwb3NpdG9yeSB7XG4gICAgICAgIHJldHVybiBGbGF0UmVwb3NpdG9yeS5pbnN0YW5jZTtcbiAgICB9XG4gICAgcHVibGljIHJlZ2lzdGVyKG1vZGVsVHlwZTogc3RyaW5nLCByZW5kZXJlckNvbnN0cnVjdG9yOiBGbGF0Q29uc3RydWN0b3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbnNbbW9kZWxUeXBlXSA9IHJlbmRlcmVyQ29uc3RydWN0b3I7XG4gICAgfVxuICAgIHB1YmxpYyBjcmVhdGUoc3VydmV5OiBTdXJ2ZXlQREYsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGRvY0NvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHR5cGU/OiBzdHJpbmcpOiBJRmxhdFF1ZXN0aW9uIHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSB0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcgPyBxdWVzdGlvbi5nZXRUeXBlKCkgOiB0eXBlO1xuICAgICAgICBjb25zdCByZW5kZXJlckNvbnN0cnVjdG9yOiBGbGF0Q29uc3RydWN0b3IgPSB0aGlzLnF1ZXN0aW9uc1txdWVzdGlvblR5cGVdIHx8IEZsYXRRdWVzdGlvbjtcbiAgICAgICAgcmV0dXJuIG5ldyByZW5kZXJlckNvbnN0cnVjdG9yKHN1cnZleSwgcXVlc3Rpb24sIGRvY0NvbnRyb2xsZXIpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiwgTG9jYWxpemFibGVTdHJpbmcsIFNlcmlhbGl6ZXIgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGludGVyZmFjZSBJRmxhdFF1ZXN0aW9uIHtcbiAgICBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT47XG4gICAgZ2VuZXJhdGVGbGF0cyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT47XG59XG5leHBvcnQgY2xhc3MgRmxhdFF1ZXN0aW9uIGltcGxlbWVudHMgSUZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT05URU5UX0dBUF9WRVJUX1NDQUxFOiBudW1iZXIgPSAwLjU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT05URU5UX0dBUF9IT1JfU0NBTEU6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENPTlRFTlRfSU5ERU5UX1NDQUxFOiBudW1iZXIgPSAxLjA7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBERVNDX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4wNjI1O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb247XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbj5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRUaXRsZShwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUaXRsZUZsYXQocG9pbnQsXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdERlc2NyaXB0aW9uKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBkZXNjUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGRlc2NQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICBkZXNjUG9pbnQueVRvcCArPSBGbGF0UXVlc3Rpb24uREVTQ19HQVBfU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgdGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmxvY0Rlc2NyaXB0aW9uO1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZURlc2NGbGF0KGRlc2NQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0ZXh0KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzQ29tbWVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgdGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmxvY0NvbW1lbnRUZXh0O1xuICAgICAgICBjb25zdCBvdGhlclRleHRGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0ZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQob3RoZXJUZXh0RmxhdCk7XG4gICAgICAgIG90aGVyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKG90aGVyVGV4dEZsYXQsIGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQsIGZhbHNlKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29tcG9zaXRlKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRQYW5lbCA9ICg8YW55PnRoaXMucXVlc3Rpb24pLmNvbnRlbnRQYW5lbDtcbiAgICAgICAgaWYgKCEhY29udGVudFBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwodGhpcy5zdXJ2ZXksXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBjb250ZW50UGFuZWwsIHBvaW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gU3VydmV5SGVscGVyLmdldENvbnRlbnRRdWVzdGlvbih0aGlzLnF1ZXN0aW9uKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLnF1ZXN0aW9uLmluZGVudCkud2lkdGg7XG4gICAgICAgIGNvbnN0IGluZGVudFBvaW50OiBJUG9pbnQgPSB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQgKyB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5xdWVzdGlvbi5pbmRlbnQpLndpZHRoLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGNvbW1lbnRQb2ludDogSVBvaW50ID0gaW5kZW50UG9pbnQ7XG4gICAgICAgIGxldCB0aXRsZUxvY2F0aW9uOiBzdHJpbmcgPSB0aGlzLnF1ZXN0aW9uLmdldFRpdGxlTG9jYXRpb24oKTtcbiAgICAgICAgdGl0bGVMb2NhdGlvbiA9IHRoaXMucXVlc3Rpb24uaGFzVGl0bGUgPyB0aXRsZUxvY2F0aW9uIDogJ2hpZGRlbic7XG4gICAgICAgIGNvbnN0IGlzRGVzYyA9ICEhU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY0Rlc2NyaXB0aW9uKTtcbiAgICAgICAgc3dpdGNoICh0aXRsZUxvY2F0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgY2FzZSAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Rlc2MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGl0bGVGbGF0KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soZGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoZGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCksIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICAgICAgICAgICAgRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEUgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQgPSBjb250ZW50UG9pbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRGbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb21wb3NpdGUoY29udGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50RmxhdHMgIT09IG51bGwgJiYgY29udGVudEZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmNvbnRlbnRGbGF0cykueUJvdCArXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGNvbnRlbnRGbGF0cy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdib3R0b20nOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQgPSBjb250ZW50UG9pbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50RmxhdHMgIT09IG51bGwgJiYgY29udGVudEZsYXRzLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5jb250ZW50RmxhdHMpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzQ29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbW1lbnQoY29tbWVudFBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlUG9pbnQ6IElQb2ludCA9IGluZGVudFBvaW50O1xuICAgICAgICAgICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wID0gZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0ueUJvdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKHRpdGxlUG9pbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVzYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhkZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdsZWZ0Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLVxuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKGluZGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayh0aXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCwgZmFsc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Rlc2MpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGl0bGVGbGF0KSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soZGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQueExlZnQgPSBNYXRoLm1heChjb250ZW50UG9pbnQueExlZnQsIGRlc2NGbGF0LnhSaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfSE9SX1NDQUxFO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjb250ZW50UG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY29tbWVudFBvaW50LnhMZWZ0ID0gY29udGVudFBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRGbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb21wb3NpdGUoY29udGVudFBvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEZsYXRzICE9PSBudWxsICYmIGNvbnRlbnRGbGF0cy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uY29udGVudEZsYXRzKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soY29udGVudEZsYXRzLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uY29udGVudEZsYXRzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICBjYXNlIFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVg6XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGlmICh0aXRsZUxvY2F0aW9uICE9PSBTdXJ2ZXlIZWxwZXIuVElUTEVfTE9DQVRJT05fTUFUUklYKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludCA9IGNvbnRlbnRQb2ludDtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShjb250ZW50UG9pbnQpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGlmIChmbGF0cyAhPT0gbnVsbCAmJiBmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmhhc0NvbW1lbnQgJiYgdGhpcy5xdWVzdGlvbi50aXRsZUxvY2F0aW9uICE9PSAnYm90dG9tJykge1xuICAgICAgICAgICAgZmxhdHMucHVzaChhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDb21tZW50KGNvbW1lbnRQb2ludCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ3F1ZXN0aW9uJywge1xuICAgIG5hbWU6ICdyZWFkb25seVJlbmRlckFzJyxcbiAgICBkZWZhdWx0OiAnYXV0bycsXG4gICAgY2hvaWNlczogWydhdXRvJywgJ3RleHQnLCAnYWNyb2Zvcm0nXVxufSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgVGV4dEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBhbGlnbjogeyBhbGlnbjogc3RyaW5nLCBiYXNlbGluZTogc3RyaW5nIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5hbGlnbiA9IHtcbiAgICAgICAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICAgICAgICBiYXNlbGluZTogJ21pZGRsZSdcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHJpdmF0ZSBlc2NhcGVUZXh0KCkge1xuICAgICAgICB3aGlsZSAodGhpcy50ZXh0LmluZGV4T2YoJ1xcdCcpID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMudGV4dC5yZXBsYWNlKCdcXHQnLCBBcnJheSg1KS5qb2luKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IGFsaWduUG9pbnQ6IElQb2ludCA9IHRoaXMuYWxpZ25Qb2ludCh0aGlzKTtcbiAgICAgICAgbGV0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGxldCBvbGRUZXh0Q29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0VGV4dENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKHRoaXMudGV4dENvbG9yKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy50ZXh0KHRoaXMuZXNjYXBlVGV4dCgpLCBhbGlnblBvaW50LnhMZWZ0LCBhbGlnblBvaW50LnlUb3AsIHRoaXMuYWxpZ24pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldFRleHRDb2xvcihvbGRUZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFsaWduUG9pbnQocmVjdDogSVJlY3QpOiBJUG9pbnQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHJlY3QueExlZnQsXG4gICAgICAgICAgICB5VG9wOiByZWN0LnlUb3AgKyAocmVjdC55Qm90IC0gcmVjdC55VG9wKSAvIDIuMFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dC50cyIsImltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRlQnJpY2sgaW1wbGVtZW50cyBJUGRmQnJpY2sge1xuICAgIHByaXZhdGUgYnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgIHByaXZhdGUgX3hMZWZ0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeFJpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeVRvcDogbnVtYmVyO1xuICAgIHByaXZhdGUgX3lCb3Q6IG51bWJlcjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoLi4uYnJpY2tzOiBJUGRmQnJpY2tbXSkge1xuICAgICAgICB0aGlzLl94TGVmdCA9IDAuMDtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0gMC4wO1xuICAgICAgICB0aGlzLl95VG9wID0gMC4wO1xuICAgICAgICB0aGlzLl95Qm90ID0gMC4wO1xuICAgICAgICB0aGlzLmFkZEJyaWNrKC4uLmJyaWNrcyk7XG4gICAgfVxuICAgIGdldCB4TGVmdCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feExlZnQ7IH1cbiAgICBzZXQgeExlZnQoeExlZnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KHhMZWZ0IC0gdGhpcy54TGVmdCwgMC4wLCAwLjAsIDAuMCk7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0geExlZnQ7XG4gICAgfVxuICAgIGdldCB4UmlnaHQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3hSaWdodDsgfVxuICAgIHNldCB4UmlnaHQoeFJpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIHhSaWdodCAtIHRoaXMueFJpZ2h0LCAwLjAsIDAuMCk7XG4gICAgICAgIHRoaXMuX3hSaWdodCA9IHhSaWdodDtcbiAgICB9XG4gICAgZ2V0IHlUb3AoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3lUb3A7IH1cbiAgICBzZXQgeVRvcCh5VG9wOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIDAuMCwgeVRvcCAtIHRoaXMueVRvcCwgMC4wKTtcbiAgICAgICAgdGhpcy5feVRvcCA9IHlUb3A7XG4gICAgfVxuICAgIGdldCB5Qm90KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl95Qm90OyB9XG4gICAgc2V0IHlCb3QoeUJvdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2hpZnQoMC4wLCAwLjAsIDAuMCwgeUJvdCAtIHRoaXMueUJvdCk7XG4gICAgICAgIHRoaXMuX3lCb3QgPSB5Qm90O1xuICAgIH1cbiAgICBwcml2YXRlIHNoaWZ0KGxlZnRTaGlmdDogbnVtYmVyLCByaWdodFNoaWZ0OiBudW1iZXIsXG4gICAgICAgIHRvcFNoaWZ0OiBudW1iZXIsIGJvdFNoaWZ0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaCgoYnJpY2s6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgYnJpY2sueExlZnQgKz0gbGVmdFNoaWZ0O1xuICAgICAgICAgICAgYnJpY2sueFJpZ2h0ICs9IHJpZ2h0U2hpZnQ7XG4gICAgICAgICAgICBicmljay55VG9wICs9IHRvcFNoaWZ0O1xuICAgICAgICAgICAgYnJpY2sueUJvdCArPSBib3RTaGlmdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueFJpZ2h0IC0gdGhpcy54TGVmdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueUJvdCAtIHRoaXMueVRvcDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMuYnJpY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJyaWNrc1tpXS5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyaWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRCcmljayguLi5icmlja3M6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIGlmIChicmlja3MubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIHRoaXMuYnJpY2tzLnB1c2goLi4uYnJpY2tzKTtcbiAgICAgICAgICAgIGxldCBtZXJnZVJlY3QgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi50aGlzLmJyaWNrcyk7XG4gICAgICAgICAgICB0aGlzLl94TGVmdCA9IG1lcmdlUmVjdC54TGVmdDtcbiAgICAgICAgICAgIHRoaXMuX3hSaWdodCA9IG1lcmdlUmVjdC54UmlnaHQ7XG4gICAgICAgICAgICB0aGlzLl95VG9wID0gbWVyZ2VSZWN0LnlUb3A7XG4gICAgICAgICAgICB0aGlzLl95Qm90ID0gbWVyZ2VSZWN0LnlCb3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIGNvbnN0IHVuZm9sZEJyaWNrczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgdGhpcy5icmlja3MuZm9yRWFjaCgoYnJpY2s6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgdW5mb2xkQnJpY2tzLnB1c2goLi4uYnJpY2sudW5mb2xkKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuZm9sZEJyaWNrcztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsImltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGludGVyZmFjZSBJUGRmQnJpY2sgZXh0ZW5kcyBJUmVjdCwgSVNpemUge1xuICAgIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVuZm9sZCgpOiBJUGRmQnJpY2tbXTtcbiAgICBpc1BhZ2VCcmVhazogYm9vbGVhbjtcbn1cbmV4cG9ydCBjbGFzcyBQZGZCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgcHVibGljIHhMZWZ0OiBudW1iZXI7XG4gICAgcHVibGljIHhSaWdodDogbnVtYmVyO1xuICAgIHB1YmxpYyB5VG9wOiBudW1iZXI7XG4gICAgcHVibGljIHlCb3Q6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTaXplIG9mIHRleHQuIFNldCAwIGZvciBhdXRvIHNpemVcbiAgICAgKi9cbiAgICBwdWJsaWMgZm9udFNpemU6IG51bWJlcjtcbiAgICBwdWJsaWMgdGV4dENvbG9yOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuVEVYVF9DT0xPUjtcbiAgICBwdWJsaWMgZm9ybUJvcmRlckNvbG9yOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuRk9STV9CT1JERVJfQ09MT1I7XG4gICAgcHVibGljIGlzUGFnZUJyZWFrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlY3QueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVjdC54UmlnaHQ7XG4gICAgICAgIHRoaXMueVRvcCA9IHJlY3QueVRvcDtcbiAgICAgICAgdGhpcy55Qm90ID0gcmVjdC55Qm90O1xuICAgICAgICB0aGlzLmZvbnRTaXplID0gISFjb250cm9sbGVyID9cbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgOiBEb2NDb250cm9sbGVyLkZPTlRfU0laRTtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoISF0aGlzLnF1ZXN0aW9uICYmIHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSAmJiBTdXJ2ZXlIZWxwZXIuZ2V0UmVhZG9ubHlSZW5kZXJBcyhcbiAgICAgICAgICAgIDxRdWVzdGlvbj50aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpICE9PSAnYWNyb2Zvcm0nKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclJlYWRPbmx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBhd2FpdCB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgdW5mb2xkKCk6IElQZGZCcmlja1tdIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzXTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfYnJpY2sudHMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfN19fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcIlN1cnZleVwiLFwiY29tbW9uanMyXCI6XCJzdXJ2ZXktY29yZVwiLFwiY29tbW9uanNcIjpcInN1cnZleS1jb3JlXCIsXCJhbWRcIjpcInN1cnZleS1jb3JlXCJ9XG4vLyBtb2R1bGUgaWQgPSA3XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IGpzUERGLCBqc1BERk9wdGlvbnMgfSBmcm9tICdqc3BkZic7XG5pbXBvcnQgeyBJSFRNTFJlbmRlclR5cGUgfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG4vLyBpbXBvcnQgRm9udHMgZnJvbSAnLi9mb250cyc7XG5pbXBvcnQgc2V0UmFkaW9BcHBlYXJhbmNlIGZyb20gJy4vanNwZGZfcGx1Z2lucy9hY3JvZm9ybSc7XG5pbXBvcnQgJy4vanNwZGZfcGx1Z2lucy9hY3JvZm9ybS5qcyc7XG5pbXBvcnQgJy4vanNwZGZfcGx1Z2lucy9mcm9tX2h0bWwuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQb2ludCB7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB5VG9wOiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElSZWN0IGV4dGVuZHMgSVBvaW50IHtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTaXplIHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBJTWFyZ2luTFIge1xuICAgIGxlZnQ/OiBudW1iZXI7XG4gICAgcmlnaHQ/OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElNYXJnaW4gZXh0ZW5kcyBJTWFyZ2luTFIge1xuICAgIHRvcD86IG51bWJlcjtcbiAgICBib3Q/OiBudW1iZXI7XG59XG4vKipcbiAqIERlY2xhcmVzIGEgc2V0IG9mIG9wdGlvbnMgZm9yIGEgU3VydmV5UERGIGRvY3VtZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElEb2NPcHRpb25zIHtcbiAgICBvcmllbnRhdGlvbj86ICdwJyB8ICdsJztcbiAgICBmb3JtYXQ/OiBzdHJpbmcgfCBudW1iZXJbXTtcbiAgICBmb250U2l6ZT86IG51bWJlcjtcbiAgICBmb250TmFtZT86IHN0cmluZztcbiAgICBiYXNlNjROb3JtYWw/OiBzdHJpbmc7XG4gICAgYmFzZTY0Qm9sZD86IHN0cmluZztcbiAgICB1c2VDdXN0b21Gb250SW5IdG1sPzogYm9vbGVhbjtcbiAgICBtYXJnaW5zPzogSU1hcmdpbjtcbiAgICBjb21tZXJjaWFsPzogYm9vbGVhbjtcbiAgICBoYXZlQ29tbWVyY2lhbExpY2Vuc2U/OiBib29sZWFuO1xuICAgIGh0bWxSZW5kZXJBcz86IElIVE1MUmVuZGVyVHlwZTtcbiAgICBtYXRyaXhSZW5kZXJBcz86ICdhdXRvJyB8ICdsaXN0JztcbiAgICByZWFkb25seVJlbmRlckFzPzogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJztcbiAgICB0ZXh0RmllbGRSZW5kZXJBcz86ICdzaW5nbGVMaW5lJyB8ICdtdWx0aUxpbmUnO1xuICAgIGNvbXByZXNzPzogYm9vbGVhbjtcbiAgICBhcHBseUltYWdlRml0PzogYm9vbGVhbjtcbn1cbi8qKlxuICogQ29udGFpbnMgYSBzZXQgb2Ygb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgYXBwZWFyYW5jZSBvZiBhIFBERiBkb2N1bWVudCByZW5kZXJlZCBieSBTdXJ2ZXlQREYuXG4gKi9cbmV4cG9ydCBjbGFzcyBEb2NPcHRpb25zIGltcGxlbWVudHMgSURvY09wdGlvbnMge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTU1fVE9fUFQgPSA3MiAvIDI1LjQ7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBGT05UX1NJWkUgPSAxNDtcbiAgICBwcm90ZWN0ZWQgX29yaWVudGF0aW9uOiAnbCcgfCAncCc7XG4gICAgcHJvdGVjdGVkIF9mb3JtYXQ6IHN0cmluZyB8IG51bWJlcltdO1xuICAgIHByb3RlY3RlZCBfZm9udFNpemU6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX2ZvbnROYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIHN0YXRpYyBTRUdPRV9OT1JNQUw6IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdGljIFNFR09FX0JPTEQ6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgX2Jhc2U2NE5vcm1hbDogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfYmFzZTY0Qm9sZDogc3RyaW5nID0gdW5kZWZpbmVkO1xuICAgIHByb3RlY3RlZCBfdXNlQ3VzdG9tRm9udEluSHRtbDogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX21hcmdpbnM6IElNYXJnaW47XG4gICAgcHJvdGVjdGVkIF9odG1sUmVuZGVyQXM6IElIVE1MUmVuZGVyVHlwZTtcbiAgICBwcm90ZWN0ZWQgX21hdHJpeFJlbmRlckFzOiAnYXV0bycgfCAnbGlzdCc7XG4gICAgcHJvdGVjdGVkIF9yZWFkb25seVJlbmRlckFzOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nO1xuICAgIHByb3RlY3RlZCBfdGV4dEZpZWxkUmVuZGVyQXM6ICdzaW5nbGVMaW5lJyB8ICdtdWx0aUxpbmUnO1xuICAgIHByb3RlY3RlZCBfY29tcHJlc3M6IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIF9hcHBseUltYWdlRml0OiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBJRG9jT3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub3JpZW50YXRpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZm9ybWF0ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybWF0WzBdIDwgb3B0aW9ucy5mb3JtYXRbMV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvbiA9ICdwJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgdGhpcy5fb3JpZW50YXRpb24gPSAnbCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB0aGlzLl9vcmllbnRhdGlvbiA9IG9wdGlvbnMub3JpZW50YXRpb247XG4gICAgICAgIHRoaXMuX2Zvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICdhNCc7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuX2Zvcm1hdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdCA9IHRoaXMuX2Zvcm1hdC5tYXAoZiA9PiBmICogRG9jT3B0aW9ucy5NTV9UT19QVCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZm9udFNpemUgPSBvcHRpb25zLmZvbnRTaXplIHx8IERvY09wdGlvbnMuRk9OVF9TSVpFO1xuICAgICAgICB0aGlzLl9mb250TmFtZSA9IG9wdGlvbnMuZm9udE5hbWUgfHwgJ3NlZ29lJztcbiAgICAgICAgaWYgKCh0eXBlb2Ygb3B0aW9ucy5mb250TmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5iYXNlNjROb3JtYWwgIT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMuYmFzZTY0Qm9sZCAhPT0gJ3VuZGVmaW5lZCcpKSkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Tm9ybWFsID0gb3B0aW9ucy5iYXNlNjROb3JtYWwgfHwgb3B0aW9ucy5iYXNlNjRCb2xkO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Qm9sZCA9IG9wdGlvbnMuYmFzZTY0Qm9sZCB8fCBvcHRpb25zLmJhc2U2NE5vcm1hbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmZvbnROYW1lID09PSAnc2Vnb2UnKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9iYXNlNjROb3JtYWwgPSBGb250cy5TRUdPRV9OT1JNQUw7XG4gICAgICAgICAgICAvLyB0aGlzLl9iYXNlNjRCb2xkID0gRm9udHMuU0VHT0VfQk9MRDtcbiAgICAgICAgICAgIHRoaXMuX2Jhc2U2NE5vcm1hbCA9IERvY09wdGlvbnMuU0VHT0VfTk9STUFMO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Qm9sZCA9IERvY09wdGlvbnMuU0VHT0VfQk9MRDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91c2VDdXN0b21Gb250SW5IdG1sID0gb3B0aW9ucy51c2VDdXN0b21Gb250SW5IdG1sICYmIHR5cGVvZiBvcHRpb25zLmJhc2U2NE5vcm1hbCAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICAgIHRoaXMuX21hcmdpbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUob3B0aW9ucy5tYXJnaW5zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy50b3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLnRvcCA9IDEwLjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLmJvdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMuYm90ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMubGVmdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMubGVmdCA9IDEwLjA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLnJpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5yaWdodCA9IDEwLjA7XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5fbWFyZ2lucykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAoPGFueT50aGlzLl9tYXJnaW5zKVtuYW1lXSA9ICg8YW55PnRoaXMuX21hcmdpbnMpW25hbWVdICogRG9jT3B0aW9ucy5NTV9UT19QVDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2h0bWxSZW5kZXJBcyA9IG9wdGlvbnMuaHRtbFJlbmRlckFzIHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fbWF0cml4UmVuZGVyQXMgPSBvcHRpb25zLm1hdHJpeFJlbmRlckFzIHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fcmVhZG9ubHlSZW5kZXJBcyA9IG9wdGlvbnMucmVhZG9ubHlSZW5kZXJBcyB8fCAnYXV0byc7XG4gICAgICAgIHRoaXMuX3RleHRGaWVsZFJlbmRlckFzID0gb3B0aW9ucy50ZXh0RmllbGRSZW5kZXJBcyB8fCAnc2luZ2xlTGluZSc7XG4gICAgICAgIHRoaXMuX2NvbXByZXNzID0gb3B0aW9ucy5jb21wcmVzcyB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5fYXBwbHlJbWFnZUZpdCA9IG9wdGlvbnMuYXBwbHlJbWFnZUZpdCB8fCBmYWxzZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBsZWZ0VG9wUG9pbnQoKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiB0aGlzLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgIHlUb3A6IHRoaXMubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNpemU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnROYW1lO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhc2U2NE5vcm1hbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZTY0Tm9ybWFsO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGJhc2U2NEJvbGQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Jhc2U2NEJvbGQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdXNlQ3VzdG9tRm9udEluSHRtbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUN1c3RvbUZvbnRJbkh0bWw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWFyZ2lucygpOiBJTWFyZ2luIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmdpbnM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9ybWF0KCk6IHN0cmluZyB8IG51bWJlcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdDtcbiAgICB9XG4gICAgcHVibGljIGdldCBvcmllbnRhdGlvbigpOiAnbCcgfCAncCcge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb247XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaHRtbFJlbmRlckFzKCk6IElIVE1MUmVuZGVyVHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9odG1sUmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWF0cml4UmVuZGVyQXMoKTogJ2F1dG8nIHwgJ2xpc3QnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hdHJpeFJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHJlYWRvbmx5UmVuZGVyQXMoKTogJ2F1dG8nIHwgJ3RleHQnIHwgJ2Fjcm9mb3JtJyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkb25seVJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHRleHRGaWVsZFJlbmRlckFzKCk6ICdzaW5nbGVMaW5lJyB8ICdtdWx0aUxpbmUnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RleHRGaWVsZFJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGNvbXByZXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29tcHJlc3M7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYXBwbHlJbWFnZUZpdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5SW1hZ2VGaXQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRG9jQ29udHJvbGxlciBleHRlbmRzIERvY09wdGlvbnMge1xuICAgIHByaXZhdGUgX2RvYzoganNQREY7XG4gICAgcHJpdmF0ZSBfaGVscGVyRG9jOiBqc1BERjtcbiAgICBwcml2YXRlIF9mb250U3R5bGU6IHN0cmluZztcbiAgICBwcml2YXRlIG1hcmdpbnNTdGFjazogSU1hcmdpbkxSW107XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEb2NPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGpzcGRmT3B0aW9uczoganNQREZPcHRpb25zID0ge1xuICAgICAgICAgICAgb3JpZW50YXRpb246IHRoaXMub3JpZW50YXRpb24sXG4gICAgICAgICAgICB1bml0OiAncHQnLCBmb3JtYXQ6IHRoaXMuZm9ybWF0LCBjb21wcmVzczogdGhpcy5jb21wcmVzc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9kb2MgPSBuZXcganNQREYoanNwZGZPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2U2NE5vcm1hbCAhPT0gJ3VuZGVmaW5lZCcgJiYgIVN1cnZleUhlbHBlci5pc0ZvbnRFeGlzdCh0aGlzLCB0aGlzLmZvbnROYW1lKSkge1xuICAgICAgICAgICAgRG9jQ29udHJvbGxlci5hZGRGb250KHRoaXMuZm9udE5hbWUsIHRoaXMuYmFzZTY0Tm9ybWFsLCAnbm9ybWFsJyk7XG4gICAgICAgICAgICBEb2NDb250cm9sbGVyLmFkZEZvbnQodGhpcy5mb250TmFtZSwgdGhpcy5iYXNlNjRCb2xkLCAnYm9sZCcpO1xuICAgICAgICAgICAgdGhpcy5fZG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmFkaW9BcHBlYXJhbmNlKHRoaXMuX2RvYyk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYyA9IG5ldyBqc1BERihqc3BkZk9wdGlvbnMpO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udCh0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQodGhpcy5mb250TmFtZSk7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250U2l6ZSh0aGlzLmZvbnRTaXplKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnRTaXplKHRoaXMuZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgdGhpcy5tYXJnaW5zU3RhY2sgPSBbXTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjdXN0b21Gb250czogeyBbbmFtZTogc3RyaW5nXTogeyBub3JtYWw6IHN0cmluZywgYm9sZDogc3RyaW5nLCBpdGFsaWM6IHN0cmluZywgYm9sZGl0YWxpYzogc3RyaW5nIH0gfSA9IHt9O1xuICAgIHB1YmxpYyBzdGF0aWMgYWRkRm9udChmb250TmFtZTogc3RyaW5nLCBiYXNlNjQ6IHN0cmluZywgZm9udFN0eWxlOiAnbm9ybWFsJyB8ICdib2xkJyB8ICdpdGFsaWMnIHwgJ2JvbGRpdGFsaWMnKSB7XG4gICAgICAgIGxldCBmb250ID0gRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV07XG4gICAgICAgIGlmICghZm9udCkge1xuICAgICAgICAgICAgZm9udCA9IDxhbnk+e307XG4gICAgICAgICAgICBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXSA9IGZvbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9udFtmb250U3R5bGVdID0gYmFzZTY0O1xuICAgICAgICBjb25zdCBhZGRGb250Q2FsbGJhY2s6ICgpID0+IHZvaWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21Gb250ID0gRG9jQ29udHJvbGxlci5jdXN0b21Gb250c1tmb250TmFtZV07XG4gICAgICAgICAgICBpZiAoISFjdXN0b21Gb250ICYmICEhY3VzdG9tRm9udFtmb250U3R5bGVdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9udEZpbGU6IHN0cmluZyA9IGAke2ZvbnROYW1lfS0ke2ZvbnRTdHlsZX0udHRmYDtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZpbGVUb1ZGUyhmb250RmlsZSwgY3VzdG9tRm9udFtmb250U3R5bGVdKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZvbnQoZm9udEZpbGUsIGZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAoPGFueT5qc1BERikuQVBJLmV2ZW50cy5wdXNoKFsnYWRkRm9udHMnLCBhZGRGb250Q2FsbGJhY2tdKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBkb2MoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvYztcbiAgICB9XG4gICAgcHVibGljIGdldCBoZWxwZXJEb2MoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlbHBlckRvYztcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udE5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZm9udE5hbWUoZm9udE5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9mb250TmFtZSA9IGZvbnROYW1lO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udChmb250TmFtZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KGZvbnROYW1lKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFNpemU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZm9udFNpemUoZm9udFNpemU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9mb250U2l6ZSA9IGZvbnRTaXplO1xuICAgICAgICB0aGlzLl9kb2Muc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnRTdHlsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udFN0eWxlO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGZvbnRTdHlsZShmb250U3R5bGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9mb250U3R5bGUgPSBmb250U3R5bGU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLl9mb250TmFtZSwgZm9udFN0eWxlKTtcbiAgICB9XG4gICAgcHVibGljIG1lYXN1cmVUZXh0KHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nIHwgbnVtYmVyID0gMSwgZm9udFN0eWxlOiBzdHJpbmcgPSB0aGlzLl9mb250U3R5bGUsXG4gICAgICAgIGZvbnRTaXplOiBudW1iZXIgPSB0aGlzLl9mb250U2l6ZSk6IElTaXplIHtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuX2hlbHBlckRvYy5nZXRGb250U2l6ZSgpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUoZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLl9mb250TmFtZSwgZm9udFN0eWxlKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLl9oZWxwZXJEb2MuZ2V0TGluZUhlaWdodCgpIC8gdGhpcy5faGVscGVyRG9jLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IDAuMDtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgd2lkdGggPSBoZWlnaHQgKiB0ZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGV4dCA9IHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyA/IHRleHQgOiBTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHRleHQpO1xuICAgICAgICAgICAgd2lkdGggPSB0ZXh0LnNwbGl0KCcnKS5yZWR1Y2UoKHNtOiBudW1iZXIsIGNyOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgc20gKyB0aGlzLl9oZWxwZXJEb2MuZ2V0VGV4dFdpZHRoKGNyKSwgMC4wKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUob2xkRm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLl9mb250TmFtZSwgJ25vcm1hbCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIGdldCB1bml0V2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZVRleHQoKS53aWR0aDtcbiAgICB9XG4gICAgcHVibGljIGdldCB1bml0SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lYXN1cmVUZXh0KCkuaGVpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgcHVzaE1hcmdpbnMobGVmdD86IG51bWJlciwgcmlnaHQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJnaW5zU3RhY2sucHVzaCh7IGxlZnQ6IHRoaXMubWFyZ2lucy5sZWZ0LCByaWdodDogdGhpcy5tYXJnaW5zLnJpZ2h0IH0pO1xuICAgICAgICBpZiAodHlwZW9mIGxlZnQgIT09ICd1bmRlZmluZWQnKSB0aGlzLm1hcmdpbnMubGVmdCA9IGxlZnQ7XG4gICAgICAgIGlmICh0eXBlb2YgcmlnaHQgIT09ICd1bmRlZmluZWQnKSB0aGlzLm1hcmdpbnMucmlnaHQgPSByaWdodDtcbiAgICB9XG4gICAgcHVibGljIHBvcE1hcmdpbnMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1hcmdpbnM6IElNYXJnaW5MUiA9IHRoaXMubWFyZ2luc1N0YWNrLnBvcCgpO1xuICAgICAgICB0aGlzLm1hcmdpbnMubGVmdCA9IG1hcmdpbnMubGVmdDtcbiAgICAgICAgdGhpcy5tYXJnaW5zLnJpZ2h0ID0gbWFyZ2lucy5yaWdodDtcbiAgICB9XG4gICAgcHVibGljIGdldCBwYXBlcldpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aDtcbiAgICB9XG4gICAgcHVibGljIGdldCBwYXBlckhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2MuaW50ZXJuYWwucGFnZVNpemUuaGVpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0TnVtYmVyT2ZQYWdlcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kb2MuZ2V0TnVtYmVyT2ZQYWdlcygpO1xuICAgIH1cbiAgICBwdWJsaWMgYWRkUGFnZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kb2MuYWRkUGFnZSgpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0UGFnZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jLnNldFBhZ2UoaW5kZXggKyAxKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZG9jX2NvbnRyb2xsZXIudHMiLCJpbXBvcnQgeyBJRWxlbWVudCwgUXVlc3Rpb24sIFBhbmVsTW9kZWxCYXNlLCBQYW5lbE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFJvd2xpbmVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBBZG9ybmVyc1BhbmVsT3B0aW9ucywgQWRvcm5lcnNQYWdlT3B0aW9ucyB9IGZyb20gJy4uL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5pbXBvcnQgKiBhcyBTdXJ2ZXlQREZNb2R1bGUgZnJvbSAnLi4vZW50cmllcy9wZGYnO1xuXG5leHBvcnQgY2xhc3MgRmxhdFN1cnZleSB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBRVUVTX0dBUF9WRVJUX1NDQUxFOiBudW1iZXIgPSAxLjU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBQQU5FTF9DT05UX0dBUF9TQ0FMRTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUEFORUxfREVTQ19HQVBfU0NBTEU6IG51bWJlciA9IDAuMjU7XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRzUGFuZWwoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBhbmVsOiBQYW5lbE1vZGVsLCBwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBwYW5lbEZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBwYW5lbENvbnRlbnRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHBhbmVsLmlubmVySW5kZW50KS53aWR0aDtcbiAgICAgICAgcGFuZWxDb250ZW50UG9pbnQueExlZnQgKz0gY29udHJvbGxlci5tZWFzdXJlVGV4dChwYW5lbC5pbm5lckluZGVudCkud2lkdGg7XG4gICAgICAgIHBhbmVsRmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoc3VydmV5LFxuICAgICAgICAgICAgY29udHJvbGxlciwgcGFuZWwsIHBhbmVsQ29udGVudFBvaW50KSk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBjb25zdCBhZG9ybmVyc09wdGlvbnM6IEFkb3JuZXJzUGFuZWxPcHRpb25zID0gbmV3IEFkb3JuZXJzUGFuZWxPcHRpb25zKHBvaW50LFxuICAgICAgICAgICAgcGFuZWxGbGF0cywgcGFuZWwsIGNvbnRyb2xsZXIsIEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCksIFN1cnZleVBERk1vZHVsZSk7XG4gICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlclBhbmVsLmZpcmUoc3VydmV5LCBhZG9ybmVyc09wdGlvbnMpO1xuICAgICAgICByZXR1cm4gWy4uLmFkb3JuZXJzT3B0aW9ucy5icmlja3NdO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRzUGFnZVBhbmVsKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICBwYWdlUGFuZWw6IFBhbmVsTW9kZWxCYXNlLCBwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBpZiAoIXBhZ2VQYW5lbC5pc1Zpc2libGUpIHJldHVybjtcbiAgICAgICAgcGFnZVBhbmVsLm9uRmlyc3RSZW5kZXJpbmcoKTtcbiAgICAgICAgY29uc3QgcGFnZVBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmIChwYWdlUGFuZWwuZ2V0VHlwZSgpICE9PSAncGFnZScgfHwgc3VydmV5LnNob3dQYWdlVGl0bGVzKSB7XG4gICAgICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbC50aXRsZSkge1xuICAgICAgICAgICAgICAgIGlmIChwYWdlUGFuZWwgaW5zdGFuY2VvZiBQYW5lbE1vZGVsICYmIHBhZ2VQYW5lbC5ubykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUaXRsZVBhbmVsRmxhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgY29udHJvbGxlciwgcGFnZVBhbmVsLm5vLCBwYWdlUGFuZWwuZ2V0VHlwZSgpID09PSAncGFnZScpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKG5vRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IG5vRmxhdC54UmlnaHQgKyBjb250cm9sbGVyLm1lYXN1cmVUZXh0KCcgJykud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VsUGFuZWxUaXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUaXRsZVBhbmVsRmxhdChcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBjb250cm9sbGVyLCBwYWdlUGFuZWwubG9jVGl0bGUsIHBhZ2VQYW5lbC5nZXRUeXBlKCkgPT09ICdwYWdlJyk7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhwYWdlbFBhbmVsVGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQocGFnZWxQYW5lbFRpdGxlRmxhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFnZVBhbmVsLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbC50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRTdXJ2ZXkuUEFORUxfREVTQ19HQVBfU0NBTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VQYW5lbERlc2NGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlRGVzY0ZsYXQoXG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgbnVsbCwgY29udHJvbGxlciwgcGFnZVBhbmVsLmxvY0Rlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHBhZ2VQYW5lbERlc2NGbGF0KTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQocGFnZVBhbmVsRGVzY0ZsYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFjb21wb3NpdGVGbGF0LmlzRW1wdHkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dMaW5lUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChyb3dMaW5lUG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRTdXJ2ZXkuUEFORUxfQ09OVF9HQVBfU0NBTEUgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBwYWdlUGFuZWwucm93cykge1xuICAgICAgICAgICAgaWYgKCFyb3cudmlzaWJsZSkgY29udGludWU7XG4gICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKTtcbiAgICAgICAgICAgIGxldCBuZXh0TWFyZ2luTGVmdDogbnVtYmVyID0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCByb3dGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3cudmlzaWJsZUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQ6IElFbGVtZW50ID0gcm93LnZpc2libGVFbGVtZW50c1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaXNWaXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJzV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKGVsZW1lbnQucmVuZGVyV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gKHJvdy52aXNpYmxlRWxlbWVudHMubGVuZ3RoIC0gMSkgKiBjb250cm9sbGVyLnVuaXRXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgcm93LnZpc2libGVFbGVtZW50cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gbmV4dE1hcmdpbkxlZnQgKyAoKGkgIT09IDApID8gY29udHJvbGxlci51bml0V2lkdGggOiAwKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIHBlcnNXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBuZXh0TWFyZ2luTGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICsgcGVyc1dpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGFuZWxNb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICByb3dGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhbmVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBlbGVtZW50LCBjdXJyUG9pbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0ZsYXRzLnB1c2goLi4uYXdhaXQgU3VydmV5SGVscGVyLmdlbmVyYXRlUXVlc3Rpb25GbGF0cyhzdXJ2ZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCA8UXVlc3Rpb24+ZWxlbWVudCwgY3VyclBvaW50KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGlmIChyb3dGbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnJvd0ZsYXRzKS55Qm90O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRTdXJ2ZXkuUVVFU19HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKC4uLnJvd0ZsYXRzKTtcbiAgICAgICAgICAgICAgICBwYWdlUGFuZWxGbGF0cy5wdXNoKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnZVBhbmVsRmxhdHM7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIHBvcFJvd2xpbmVzKGZsYXRzOiBJUGRmQnJpY2tbXSkge1xuICAgICAgICB3aGlsZSAoZmxhdHMubGVuZ3RoID4gMCAmJiBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIFJvd2xpbmVCcmljaykge1xuICAgICAgICAgICAgZmxhdHMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0VGl0bGUoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmIChzdXJ2ZXkuc2hvd1RpdGxlKSB7XG4gICAgICAgICAgICBpZiAoc3VydmV5LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VydmV5VGl0bGVGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGl0bGVTdXJ2ZXlGbGF0KFxuICAgICAgICAgICAgICAgICAgICBwb2ludCwgY29udHJvbGxlciwgc3VydmV5LmxvY1RpdGxlKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHN1cnZleVRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgcG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoc3VydmV5VGl0bGVGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdXJ2ZXkuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoc3VydmV5LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0U3VydmV5LlBBTkVMX0RFU0NfR0FQX1NDQUxFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHN1cnZleS5sb2NEZXNjcmlwdGlvbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRMb2dvSW1hZ2Uoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChcbiAgICAgICAgICAgIHBvaW50LCBudWxsLCBjb250cm9sbGVyLCBTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHN1cnZleS5sb2NMb2dvKSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5weFRvUHQoc3VydmV5LmxvZ29XaWR0aCksIFN1cnZleUhlbHBlci5weFRvUHQoc3VydmV5LmxvZ29IZWlnaHQpKTtcbiAgICAgICAgbGV0IHNoaWZ0OiBudW1iZXIgPSAwO1xuICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgc2hpZnQgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC0gbG9nb0ZsYXQud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICBzaGlmdCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcikgLyAyLjAgLSBsb2dvRmxhdC53aWR0aCAvIDIuMDtcbiAgICAgICAgfVxuICAgICAgICBsb2dvRmxhdC54TGVmdCArPSBzaGlmdDtcbiAgICAgICAgbG9nb0ZsYXQueFJpZ2h0ICs9IHNoaWZ0O1xuICAgICAgICByZXR1cm4gbG9nb0ZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2VuZXJhdGVGbGF0cyhzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8SVBkZkJyaWNrW11bXT4ge1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBpZiAoIXN1cnZleS5oYXNMb2dvKSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIGZsYXRzLnB1c2goW3RpdGxlRmxhdF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHN1cnZleS5pc0xvZ29CZWZvcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdExvZ29JbWFnZShcbiAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQobG9nb0ZsYXQsXG4gICAgICAgICAgICAgICAgc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3RvcCcsIHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICd0b3AnKTtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAndG9wJykge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnhMZWZ0ICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGxvZ29GbGF0LndpZHRoICsgY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnhMZWZ0ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgdGl0bGVQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgdGl0bGVQb2ludCk7XG4gICAgICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ3RvcCcpIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkgZmxhdHNbMF0ucHVzaCh0aXRsZUZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRMb2dvSW1hZ2UoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSBsb2dvRmxhdC53aWR0aCArIGNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSBmbGF0c1swXS51bnNoaWZ0KHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICAgICAgbGV0IGxvZ29Qb2ludDogSVBvaW50ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKFt0aXRsZUZsYXRdKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nb1BvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ29Qb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAvIDIuMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGxvZ29Qb2ludCk7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkgZmxhdHNbMF0ucHVzaChsb2dvRmxhdCk7XG4gICAgICAgICAgICAgICAgZWxzZSBmbGF0cy5wdXNoKFtsb2dvRmxhdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBwb2ludDogSVBvaW50ID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQ7XG4gICAgICAgIGlmIChmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uZmxhdHNbMF0pKS55VG9wO1xuICAgICAgICAgICAgZmxhdHNbMF0ucHVzaChTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocG9pbnQsIGNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIHBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5QQU5FTF9DT05UX0dBUF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBzdXJ2ZXkudmlzaWJsZVBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcGFnZUZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICAgICAgcGFnZUZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUGFnZVBhbmVsKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgc3VydmV5LnZpc2libGVQYWdlc1tpXSwgcG9pbnQpKTtcbiAgICAgICAgICAgIGNvbnN0IGFkb3JuZXJzT3B0aW9uczogQWRvcm5lcnNQYWdlT3B0aW9ucyA9IG5ldyBBZG9ybmVyc1BhZ2VPcHRpb25zKHBvaW50LFxuICAgICAgICAgICAgICAgIHBhZ2VGbGF0cywgc3VydmV5LnZpc2libGVQYWdlc1tpXSwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlclBhZ2UuZmlyZShzdXJ2ZXksIGFkb3JuZXJzT3B0aW9ucyk7XG4gICAgICAgICAgICBwYWdlRmxhdHMgPSBbLi4uYWRvcm5lcnNPcHRpb25zLmJyaWNrc107XG4gICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBmbGF0cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBmbGF0c1swXS5wdXNoKC4uLnBhZ2VGbGF0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGZsYXRzLnB1c2gocGFnZUZsYXRzKTtcbiAgICAgICAgICAgIHRoaXMucG9wUm93bGluZXMoZmxhdHNbZmxhdHMubGVuZ3RoIC0gMV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfc3VydmV5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIsIElQb2ludCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgQ2hlY2tJdGVtQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAwLjc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ0hFQ0tNQVJLX1JFQURPTkxZX1NZTUJPTDogc3RyaW5nID0gJzMnO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENIRUNLTUFSS19SRUFET05MWV9GT05UOiBzdHJpbmcgPSAnemFwZmRpbmdiYXRzJztcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENIRUNLTUFSS19SRUFET05MWV9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDEuMCAtIE1hdGguRSAvIDEwLjA7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkNoZWNrYm94TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seTogYm9vbGVhbiwgcHJvdGVjdGVkIGNoZWNrZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbjtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSAmJiBTdXJ2ZXlIZWxwZXIuZ2V0UmVhZG9ubHlSZW5kZXJBcyhcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlbmRlclJlYWRPbmx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hlY2tCb3g6IGFueSA9IG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtQ2hlY2tCb3gpKCk7XG4gICAgICAgIGNvbnN0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBjaGVja0JveC5tYXhGb250U2l6ZSA9IHRoaXMuaGVpZ2h0ICogZm9ybVNjYWxlICogQ2hlY2tJdGVtQnJpY2suRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBjaGVja0JveC5jYXB0aW9uID0gQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX1NZTUJPTDtcbiAgICAgICAgY2hlY2tCb3gudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIGNoZWNrQm94LmZpZWxkTmFtZSA9IHRoaXMuZmllbGROYW1lO1xuICAgICAgICBjaGVja0JveC5yZWFkT25seSA9IHRoaXMucmVhZG9ubHk7XG4gICAgICAgIGNoZWNrQm94LmNvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgICAgIGNoZWNrQm94LnZhbHVlID0gdGhpcy5jaGVja2VkID8gJ09uJyA6IGZhbHNlO1xuICAgICAgICBjaGVja0JveC5BUyA9IHRoaXMuY2hlY2tlZCA/ICcvT24nIDogJy9PZmYnO1xuICAgICAgICBjaGVja0JveC5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcywgZm9ybVNjYWxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQoY2hlY2tCb3gpO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tlZCkge1xuICAgICAgICAgICAgY29uc3QgY2hlY2ttYXJrUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aGlzLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnROYW1lOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfRk9OVDtcbiAgICAgICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrbWFya1NpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFxuICAgICAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9TWU1CT0wpO1xuICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIGNoZWNrbWFya1NpemUud2lkdGggLyAyLjA7XG4gICAgICAgICAgICBjaGVja21hcmtQb2ludC55VG9wICs9IHRoaXMuaGVpZ2h0IC8gMi4wIC0gY2hlY2ttYXJrU2l6ZS5oZWlnaHQgLyAyLjA7XG4gICAgICAgICAgICBjb25zdCBjaGVja21hcmtGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MLCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgKDxhbnk+Y2hlY2ttYXJrRmxhdC51bmZvbGQoKVswXSkudGV4dENvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgICAgIGF3YWl0IGNoZWNrbWFya0ZsYXQucmVuZGVyKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWUgPSBvbGRGb250TmFtZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBSYWRpb0dyb3VwV3JhcCwgUmFkaW9JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0nO1xuaW1wb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuL2ZsYXRfc2VsZWN0YmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UmFkaW9ncm91cCBleHRlbmRzIEZsYXRTZWxlY3RCYXNlIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsO1xuICAgIHByaXZhdGUgcmFkaW9Hcm91cFdyYXA6IFJhZGlvR3JvdXBXcmFwO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFkaW9ncm91cE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLFxuICAgICAgICBpbmRleDogbnVtYmVyLCBrZXk/OiBzdHJpbmcsIGNoZWNrZWQ/OiBib29sZWFuKTogSVBkZkJyaWNrIHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwID0gbmV3IFJhZGlvR3JvdXBXcmFwKHRoaXMucXVlc3Rpb24uaWQgKyAoKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSA/ICcnIDoga2V5KSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSk7XG4gICAgICAgICAgICAoPGFueT50aGlzLnF1ZXN0aW9uKS5wZGZSYWRpb0dyb3VwV3JhcCA9IHRoaXMucmFkaW9Hcm91cFdyYXA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHRoaXMucmFkaW9Hcm91cFdyYXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwID0gKDxhbnk+dGhpcy5xdWVzdGlvbikucGRmUmFkaW9Hcm91cFdyYXA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNDaGVja2VkOiBib29sZWFuID0gKHR5cGVvZiBjaGVja2VkID09PSAndW5kZWZpbmVkJykgP1xuICAgICAgICAgICAgKGl0ZW0gPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtID8gdGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQgOlxuICAgICAgICAgICAgICAgIChpdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICAgICAgICAgICh0eXBlb2YgdGhpcy5xdWVzdGlvbi5pc0l0ZW1TZWxlY3RlZCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uaXNJdGVtU2VsZWN0ZWQoaXRlbSkpKSkgOiBjaGVja2VkO1xuICAgICAgICByZXR1cm4gbmV3IFJhZGlvSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgcmVjdCxcbiAgICAgICAgICAgIGluZGV4LCBpc0NoZWNrZWQsIHRoaXMucmFkaW9Hcm91cFdyYXApO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncmFkaW9ncm91cCcsIEZsYXRSYWRpb2dyb3VwKTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2J1dHRvbmdyb3VwJywgRmxhdFJhZGlvZ3JvdXApO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhZGlvZ3JvdXAudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuXG5leHBvcnQgY2xhc3MgVGV4dEJvbGRCcmljayBleHRlbmRzIFRleHRCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIHRleHQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkLnRzIiwiZXhwb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmV4cG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuZXhwb3J0IHsgSVBvaW50LCBJUmVjdCwgSVNpemUsIElNYXJnaW5MUiwgSU1hcmdpbiwgSURvY09wdGlvbnMsIERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5leHBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmVwb3NpdG9yeSc7XG5leHBvcnQgeyBJRmxhdFF1ZXN0aW9uLCBGbGF0UXVlc3Rpb24gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3F1ZXN0aW9uJztcbmV4cG9ydCB7IEZsYXRCb29sZWFuIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9ib29sZWFuJztcbmV4cG9ydCB7IEZsYXRDaGVja2JveCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gnO1xuZXhwb3J0IHsgRmxhdENvbW1lbnQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2NvbW1lbnQnO1xuZXhwb3J0IHsgRmxhdERyb3Bkb3duIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9kcm9wZG93bic7XG5leHBvcnQgeyBGbGF0RXhwcmVzc2lvbiB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbic7XG5leHBvcnQgeyBGbGF0RmlsZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZmlsZSc7XG5leHBvcnQgeyBGbGF0SFRNTCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaHRtbCc7XG5leHBvcnQgeyBGbGF0SW1hZ2UgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2ltYWdlJztcbmV4cG9ydCB7IEZsYXRJbWFnZVBpY2tlciB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXInO1xuZXhwb3J0IHsgRmxhdFBhbmVsRHluYW1pYyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljJztcbmV4cG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwJztcbmV4cG9ydCB7IEZsYXRSYW5raW5nIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nJztcbmV4cG9ydCB7IEZsYXRSYXRpbmcgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JhdGluZyc7XG5leHBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfc2VsZWN0YmFzZSc7XG5leHBvcnQgeyBGbGF0U2lnbmF0dXJlUGFkIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQnO1xuZXhwb3J0IHsgRmxhdFRleHRib3ggfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3RleHRib3gnO1xuZXhwb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfc3VydmV5JztcbmV4cG9ydCB7IEZsYXRNYXRyaXggfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeCc7XG5leHBvcnQgeyBGbGF0TWF0cml4TXVsdGlwbGUgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlJztcbmV4cG9ydCB7IEZsYXRNYXRyaXhEeW5hbWljIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhkeW5hbWljJztcbmV4cG9ydCB7IEZsYXRNdWx0aXBsZVRleHQgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X211bHRpcGxldGV4dCc7XG5leHBvcnQgeyBQYWdlUGFja2VyIH0gZnJvbSAnLi4vcGFnZV9sYXlvdXQvcGFnZV9wYWNrZXInO1xuZXhwb3J0IHsgRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyJztcbmV4cG9ydCB7IEhvcml6b250YWxBbGlnbiwgVmVydGljYWxBbGlnbiwgSURyYXdSZWN0T3B0aW9ucywgSURyYXdUZXh0T3B0aW9ucywgSURyYXdJbWFnZU9wdGlvbnMsIERyYXdDYW52YXMgfSBmcm9tICcuLi9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzJztcbmV4cG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5leHBvcnQgeyBCb29sZWFuSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0nO1xuZXhwb3J0IHsgQ2hlY2tib3hJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0nO1xuZXhwb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2l0ZW0nO1xuZXhwb3J0IHsgQ29tbWVudEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tbWVudCc7XG5leHBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5leHBvcnQgeyBDdXN0b21CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2N1c3RvbSc7XG5leHBvcnQgeyBEcm9wZG93bkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZHJvcGRvd24nO1xuZXhwb3J0IHsgRW1wdHlCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2VtcHR5JztcbmV4cG9ydCB7IEhUTUxCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2h0bWwnO1xuZXhwb3J0IHsgSW1hZ2VCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2ltYWdlJztcbmV4cG9ydCB7IExpbmtCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2xpbmsnO1xuZXhwb3J0IHsgUmFkaW9JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0nO1xuZXhwb3J0IHsgUmFua2luZ0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtJztcbmV4cG9ydCB7IFJvd2xpbmVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuZXhwb3J0IHsgVGV4dEZpZWxkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQnO1xuZXhwb3J0IHsgVGV4dEJvbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmV4cG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib3gnO1xuZXhwb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5leHBvcnQgeyBUaXRsZVBhbmVsQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsJztcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9wZGYudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25DaGVja2JveEJhc2UgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmxhdFNlbGVjdEJhc2UgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveEJhc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25DaGVja2JveEJhc2U+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZW5lcmF0ZUZsYXRJdGVtKHJlY3Q6IElSZWN0LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBJUGRmQnJpY2s7XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0V2lkdGgsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksXG4gICAgICAgICAgICBwb2ludC54TGVmdCksIGl0ZW0sIGluZGV4KTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGlmIChpdGVtLmxvY1RleHQucmVuZGVyZWRIdG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgICAgICB0ZXh0UG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS5sb2NUZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5xdWVzdGlvbi5vdGhlckl0ZW0gJiYgKGl0ZW0udmFsdWUgPT09IHRoaXMucXVlc3Rpb24udmFsdWUgfHxcbiAgICAgICAgICAgICh0eXBlb2YgdGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG90aGVyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgIG90aGVyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICAgICAgb3RoZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBTdXJ2ZXlIZWxwZXIuT1RIRVJfUk9XU19DT1VOVCwgZmFsc2UsIGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBsZXQgY29sQ291bnQ6IG51bWJlciA9IHRoaXMucXVlc3Rpb24uY29sQ291bnQ7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmNvbENvdW50ID09IDApIHtcbiAgICAgICAgICAgIGNvbENvdW50ID0gTWF0aC5mbG9vcihTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcilcbiAgICAgICAgICAgICAgICAvIHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGgpIHx8IDE7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGggPCBjb2xDb3VudCkge1xuICAgICAgICAgICAgICAgIGNvbENvdW50ID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5xdWVzdGlvbi5jb2xDb3VudCA+IDEpIHtcbiAgICAgICAgICAgIGNvbENvdW50ID0gKFN1cnZleUhlbHBlci5nZXRDb2x1bW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uY29sQ291bnQpIDxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoKSA/IDEgOiB0aGlzLnF1ZXN0aW9uLmNvbENvdW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoY29sQ291bnQgPT0gMSkgPyBhd2FpdCB0aGlzLmdlbmVyYXRlVmVydGljYWxseUl0ZW1zKHBvaW50LCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzKSA6XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQsIGNvbENvdW50KTtcblxuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMocG9pbnQ6IElQb2ludCwgaXRlbVZhbHVlczogSXRlbVZhbHVlW10pOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBpdGVtVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoY3VyclBvaW50LCBpdGVtVmFsdWVzW2ldLCBpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdCArIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGl0ZW1GbGF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50OiBJUG9pbnQsIGNvbENvdW50OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGxldCByb3c6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCwgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCwgaSAlIGNvbENvdW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoXG4gICAgICAgICAgICAgICAgY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzW2ldLCBpKTtcbiAgICAgICAgICAgIHJvdy5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgaWYgKGkgJSBjb2xDb3VudCA9PT0gY29sQ291bnQgLSAxIHx8IGkgPT09IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0xpbmVGbGF0OiBJUGRmQnJpY2sgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChyb3cpLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93TGluZUZsYXQueUJvdCArXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChyb3csIHJvd0xpbmVGbGF0KTtcbiAgICAgICAgICAgICAgICByb3cgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfc2VsZWN0YmFzZS50cyIsImltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgUm93bGluZUJyaWNrIGltcGxlbWVudHMgSVBkZkJyaWNrIHtcbiAgICB4TGVmdDogbnVtYmVyO1xuICAgIHhSaWdodDogbnVtYmVyO1xuICAgIHlUb3A6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG4gICAgcHVibGljIGlzUGFnZUJyZWFrOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGNvbG9yOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy54TGVmdCA9IHJlY3QueExlZnQ7XG4gICAgICAgIHRoaXMueFJpZ2h0ID0gcmVjdC54UmlnaHQ7XG4gICAgICAgIHRoaXMueVRvcCA9IHJlY3QueVRvcDtcbiAgICAgICAgdGhpcy55Qm90ID0gcmVjdC55Qm90O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnhSaWdodCAtIHRoaXMueExlZnQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnlCb3QgLSB0aGlzLnlUb3A7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgb2xkRHJhd0NvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldERyYXdDb2xvcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IodGhpcy5jb2xvcik7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmxpbmUodGhpcy54TGVmdCwgdGhpcy55VG9wLCB0aGlzLnhSaWdodCwgdGhpcy55VG9wKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKG9sZERyYXdDb2xvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHVuZm9sZCgpOiBJUGRmQnJpY2tbXSB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yb3dsaW5lLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblRleHRNb2RlbCwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRGaWVsZEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dGZpZWxkJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgVGV4dEJveEJyaWNrIGV4dGVuZHMgVGV4dEZpZWxkQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBwcm90ZWN0ZWQgaXNNdWx0aWxpbmU6IGJvb2xlYW4gPSBmYWxzZSwgaW5kZXg6IG51bWJlciA9IDApIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sXG4gICAgICAgICAgICAoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5pZCArIChpc1F1ZXN0aW9uID8gJycgOiAnX2NvbW1lbnQnICsgaW5kZXgpLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFF1ZXN0aW9uT3JDb21tZW50VmFsdWUoPFF1ZXN0aW9uPnF1ZXN0aW9uLCBpc1F1ZXN0aW9uKSxcbiAgICAgICAgICAgIGlzUXVlc3Rpb24gPyBTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKCg8UXVlc3Rpb25UZXh0TW9kZWw+cXVlc3Rpb24pLmxvY1BsYWNlSG9sZGVyKSA6ICcnLFxuICAgICAgICAgICAgcXVlc3Rpb24uaXNSZWFkT25seSwgaXNNdWx0aWxpbmUsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5pbnB1dFR5cGUpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJveC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0RmllbGRCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uVGV4dE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW4sXG4gICAgICAgIHByb3RlY3RlZCBmaWVsZE5hbWU6IHN0cmluZywgcHJvdGVjdGVkIHZhbHVlOiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCBwbGFjZWhvbGRlcjogc3RyaW5nLCBwcm90ZWN0ZWQgaXNSZWFkT25seTogYm9vbGVhbixcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuLCBwcm90ZWN0ZWQgaW5wdXRUeXBlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIHJlbmRlckNvbG9yUXVlc3Rpb24oKTogdm9pZCB7XG4gICAgICAgIGxldCBvbGRGaWxsQ29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0RmlsbENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RmlsbENvbG9yKHRoaXMucXVlc3Rpb24udmFsdWUgfHwgJ2JsYWNrJyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MucmVjdCh0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsXG4gICAgICAgICAgICB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgJ0YnKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRGaWxsQ29sb3Iob2xkRmlsbENvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyQ29sb3JRdWVzdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlucHV0RmllbGQ6IGFueSA9IHRoaXMuaW5wdXRUeXBlID09PSAncGFzc3dvcmQnID9cbiAgICAgICAgICAgIG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtUGFzc3dvcmRGaWVsZCkoKSA6XG4gICAgICAgICAgICBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVRleHRGaWVsZCkoKTtcbiAgICAgICAgaW5wdXRGaWVsZC5maWVsZE5hbWUgPSB0aGlzLmZpZWxkTmFtZTtcbiAgICAgICAgaW5wdXRGaWVsZC5mb250TmFtZSA9IHRoaXMuY29udHJvbGxlci5mb250TmFtZTtcbiAgICAgICAgaW5wdXRGaWVsZC5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGlucHV0RmllbGQuaXNVbmljb2RlID0gU3VydmV5SGVscGVyLmlzQ3VzdG9tRm9udChcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgaW5wdXRGaWVsZC5mb250TmFtZSk7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VHlwZSAhPT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgaW5wdXRGaWVsZC5WID0gJyAnICsgdGhpcy52YWx1ZTtcbiAgICAgICAgICAgIGlucHV0RmllbGQuRFYgPSAnICcgKyB0aGlzLnBsYWNlaG9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaW5wdXRGaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICBpbnB1dEZpZWxkLm11bHRpbGluZSA9IHRoaXMuaXNNdWx0aWxpbmU7XG4gICAgICAgIGlucHV0RmllbGQucmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHk7XG4gICAgICAgIGlucHV0RmllbGQuY29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgbGV0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBpbnB1dEZpZWxkLm1heEZvbnRTaXplID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplICogZm9ybVNjYWxlO1xuICAgICAgICBpbnB1dEZpZWxkLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZChpbnB1dEZpZWxkKTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMueExlZnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbG9yUXVlc3Rpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IFN1cnZleUhlbHBlci5yZW5kZXJSZWFkT25seVRleHRGaWVsZCh0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcyxcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0UXVlc3Rpb25PckNvbW1lbnREaXNwbGF5VmFsdWUodGhpcy5xdWVzdGlvbiwgdGhpcy5pc1F1ZXN0aW9uKSxcbiAgICAgICAgICAgICAgICAhdGhpcy5pc011bHRpbGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZC50cyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xOF9fO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcInJvb3RcIjpcImpzcGRmXCIsXCJjb21tb25qczJcIjpcImpzcGRmXCIsXCJjb21tb25qc1wiOlwianNwZGZcIixcImFtZFwiOlwianNwZGZcIn1cbi8vIG1vZHVsZSBpZCA9IDE4XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCB7IElSZWN0LCBJTWFyZ2luLCBJU2l6ZSwgRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljaywgUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuLyoqXG4gKiBIb3Jpem9udGFsIGFsaWdubWVudCB0eXBlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBlbnVtIEhvcml6b250YWxBbGlnbiB7XG4gICAgTm90U2V0ID0gJ25vdHNldCcsXG4gICAgTGVmdCA9ICdsZWZ0JyxcbiAgICBDZW50ZXIgPSAnY2VudGVyJyxcbiAgICBSaWdodCA9ICdyaWdodCdcbn1cbi8qKlxuICogVmVydGljYWwgYWxpZ25tZW50IHR5cGVzIGluIG9uUmVuZGVySGVhZGVyIGFuZCBvblJlbmRlckZvb3RlciBldmVudHNcbiAqL1xuZXhwb3J0IGVudW0gVmVydGljYWxBbGlnbiB7XG4gICAgTm90U2V0ID0gJ25vdHNldCcsXG4gICAgVG9wID0gJ3RvcCcsXG4gICAgTWlkZGxlID0gJ21pZGRsZScsXG4gICAgQm90dG9tID0gJ2JvdHRvbSdcbn1cbi8qKlxuICogQ29tbW9uIG9wdGlvbnMgb2YgcmVuZGVyaW5nIHRleHQgYW5kIGltYWdlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdSZWN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGhvcml6b250YWwgYWxpZ25tZW50IG9mIGl0ZW0sIGlmIHNldCAoY2VudGVyIGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgaG9yaXpvbnRhbEFsaWduPzogSG9yaXpvbnRhbEFsaWduO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgaXRlbSwgaWYgc2V0IChtaWRkbGUgYnkgZGVmYXVsdClcbiAgICAgKi9cbiAgICB2ZXJ0aWNhbEFsaWduPzogVmVydGljYWxBbGlnbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgbWFyZ2lucyBpbnNpZGUgdGhlIGRyYXdpbmcgcmVjdGFuZ2xlICh1c2VkIGlmIGFsaWdubWVudCBzZXQsIGFsbCB6ZXJvIGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgbWFyZ2lucz86IElNYXJnaW47XG4gICAgLyoqXG4gICAgICogT2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGV4dCByZWN0YW5nbGUgKHVzZWQgaWYgYWxpZ25tZW50IG5vdCBzZXQpXG4gICAgICovXG4gICAgcmVjdD86IElSZWN0O1xufVxuLyoqXG4gKiBPcHRpb25zIG9mIHJlbmRlcmluZyB0ZXh0IGluIG9uUmVuZGVySGVhZGVyIGFuZCBvblJlbmRlckZvb3RlciBldmVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRHJhd1RleHRPcHRpb25zIGV4dGVuZHMgSURyYXdSZWN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3RyaW5nIHRoYXQgd2lsbCBiZSBkcmF3blxuICAgICAqL1xuICAgIHRleHQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGb250IHNpemUgb2YgdGV4dCAoMTQgYnkgZGVmYXVsdClcbiAgICAgKi9cbiAgICBmb250U2l6ZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTZXQgdHJ1ZSB0byBtYWtlIHRleHQgYm9sZCAoZmFsc2UgYnkgZGVmYXVsdClcbiAgICAgKi9cbiAgICBpc0JvbGQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBPcHRpb25zIG9mIHJlbmRlcmluZyBpbWFnZXMgaW4gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElEcmF3SW1hZ2VPcHRpb25zIGV4dGVuZHMgSURyYXdSZWN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGltYWdlIHdpZHRoICh1c2VkIGlmIGFsaWdubWVudCBzZXQsIGNhbnZhcy5yZWN0J3Mgd2lkdGggYnkgZGVmYXVsdClcbiAgICAgKi9cbiAgICB3aWR0aD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgaW1hZ2UgaGVpZ2h0ICh1c2VkIGlmIGFsaWdubWVudCBzZXQsIGNhbnZhcy5yZWN0J3MgaGVpZ2h0IGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN0cmluZyB3aXRoIGJhc2U2NCBlbmNvZGVkIGltYWdlXG4gICAgICovXG4gICAgYmFzZTY0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRHJhd0NhbnZhcyBvYmplY3QgcGFzc2VkIHRvIG9uUmVuZGVySGVhZGVyIGFuZCBvblJlbmRlckZvb3RlciBldmVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIERyYXdDYW52YXMge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcGFja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBwdWJsaWMgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcHJvdGVjdGVkIF9yZWN0OiBJUmVjdCxcbiAgICAgICAgcHJvdGVjdGVkIF9jb3VudFBhZ2VzOiBudW1iZXIsXG4gICAgICAgIHByb3RlY3RlZCBfcGFnZU51bWJlcjogbnVtYmVyKSB7IH1cbiAgICAvKipcbiAgICAgKiBDb3VudCBvZiBwYWdlcyBpbiB0aGUgZG9jdW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvdW50UGFnZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50UGFnZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhZ2UgbnVtYmVyIGZyb20gMVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGFnZU51bWJlcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnZU51bWJlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgb2YgdGhlIHJlY3RhbmdsZSBhdmFpbGFibGUgZm9yIGRyYXdpbmdcbiAgICAgKiBAc2VlIElSZWN0XG4gICAgICovXG4gICAgcHVibGljIGdldCByZWN0KCk6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlY3Q7XG4gICAgfVxuICAgIHByaXZhdGUgYWxpZ25SZWN0KHJlY3RPcHRpb25zOiBJRHJhd1JlY3RPcHRpb25zLCBpdGVtU2l6ZTogSVNpemUpOiBJUmVjdCB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMgPSB7IGxlZnQ6IDAuMCwgcmlnaHQ6IDAuMCwgdG9wOiAwLjAsIGJvdDogMC4wIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMubWFyZ2lucy50b3AgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy50b3AgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90ID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMucmVjdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiA9PT0gSG9yaXpvbnRhbEFsaWduLk5vdFNldCkge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiA9IEhvcml6b250YWxBbGlnbi5DZW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiA9PT0gVmVydGljYWxBbGlnbi5Ob3RTZXQpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduID0gVmVydGljYWxBbGlnbi5NaWRkbGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUodGhpcy5yZWN0KTtcbiAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbikge1xuICAgICAgICAgICAgICAgIGNhc2UgSG9yaXpvbnRhbEFsaWduLkxlZnQ6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueExlZnQgPSB0aGlzLnJlY3QueExlZnQgKyByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gTWF0aC5taW4odGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QueExlZnQgKyByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQgKyBpdGVtU2l6ZS53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSG9yaXpvbnRhbEFsaWduLkNlbnRlcjpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54TGVmdCA9IE1hdGgubWF4KHRoaXMucmVjdC54TGVmdCArIHJlY3RPcHRpb25zLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnJlY3QueExlZnQgKyB0aGlzLnJlY3QueFJpZ2h0IC0gaXRlbVNpemUud2lkdGgpIC8gMi4wKTtcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54UmlnaHQgPSBNYXRoLm1pbih0aGlzLnJlY3QueFJpZ2h0IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnJlY3QueExlZnQgKyB0aGlzLnJlY3QueFJpZ2h0ICsgaXRlbVNpemUud2lkdGgpIC8gMi4wKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBIb3Jpem9udGFsQWxpZ24uUmlnaHQ6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueExlZnQgPSBNYXRoLm1heCh0aGlzLnJlY3QueExlZnQgKyByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QueFJpZ2h0IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodCAtIGl0ZW1TaXplLndpZHRoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVjdC54UmlnaHQgPSB0aGlzLnJlY3QueFJpZ2h0IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5yaWdodDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWN0LnhMZWZ0ID0gcmVjdE9wdGlvbnMucmVjdC54TGVmdCB8fCB0aGlzLnJlY3QueExlZnQ7XG4gICAgICAgICAgICByZWN0LnhSaWdodCA9IHJlY3RPcHRpb25zLnJlY3QueFJpZ2h0IHx8IHRoaXMucmVjdC54UmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc3dpdGNoIChyZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduLlRvcDpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55VG9wID0gdGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55Qm90ID0gTWF0aC5taW4odGhpcy5yZWN0LnlCb3QgLSByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3AgKyBpdGVtU2l6ZS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ24uTWlkZGxlOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnlUb3AgPSBNYXRoLm1heCh0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMucmVjdC55VG9wICsgdGhpcy5yZWN0LnlCb3QgLSBpdGVtU2l6ZS5oZWlnaHQpIC8gMi4wKTtcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55Qm90ID0gTWF0aC5taW4odGhpcy5yZWN0LnlCb3QgLSByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnJlY3QueVRvcCArIHRoaXMucmVjdC55Qm90ICsgaXRlbVNpemUuaGVpZ2h0KSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbi5Cb3R0b206XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueVRvcCA9IE1hdGgubWF4KHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QueUJvdCAtIHJlY3RPcHRpb25zLm1hcmdpbnMuYm90IC0gaXRlbVNpemUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55Qm90ID0gdGhpcy5yZWN0LnlCb3QgLSByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWN0LnlUb3AgPSByZWN0T3B0aW9ucy5yZWN0LnlUb3AgfHwgdGhpcy5yZWN0LnlUb3A7XG4gICAgICAgICAgICByZWN0LnlCb3QgPSByZWN0T3B0aW9ucy5yZWN0LnlCb3QgfHwgdGhpcy5yZWN0LnlCb3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgdGhpcyBtZXRob2QgdG8gZHJhdyB0ZXh0XG4gICAgICogQHBhcmFtIHRleHRPcHRpb25zIFNldCBvcHRpb25zIG9mIHRoZSBkcmF3biB0ZXh0XG4gICAgICovXG4gICAgcHVibGljIGRyYXdUZXh0KHRleHRPcHRpb25zOiBJRHJhd1RleHRPcHRpb25zKTogdm9pZCB7XG4gICAgICAgIHRleHRPcHRpb25zID0gU3VydmV5SGVscGVyLmNsb25lKHRleHRPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0T3B0aW9ucy5mb250U2l6ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmZvbnRTaXplID0gRG9jT3B0aW9ucy5GT05UX1NJWkU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0T3B0aW9ucy5pc0JvbGQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0ZXh0T3B0aW9ucy5pc0JvbGQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0U2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQodGV4dE9wdGlvbnMudGV4dCxcbiAgICAgICAgICAgIHRleHRPcHRpb25zLmlzQm9sZCA/ICdib2xkJyA6ICdub3JtYWwnLCB0ZXh0T3B0aW9ucy5mb250U2l6ZSk7XG4gICAgICAgIGNvbnN0IHRleHRSZWN0OiBJUmVjdCA9IHRoaXMuYWxpZ25SZWN0KHRleHRPcHRpb25zLCB0ZXh0U2l6ZSk7XG4gICAgICAgIGlmICghdGV4dE9wdGlvbnMuaXNCb2xkKSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tzLnB1c2gobmV3IFRleHRCcmljayhudWxsLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGV4dFJlY3QsIHRleHRPcHRpb25zLnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFja3MucHVzaChuZXcgVGV4dEJvbGRCcmljayhudWxsLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgdGV4dFJlY3QsIHRleHRPcHRpb25zLnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgICAoPFBkZkJyaWNrPnRoaXMucGFja3NbdGhpcy5wYWNrcy5sZW5ndGggLSAxXSkuZm9udFNpemUgPSB0ZXh0T3B0aW9ucy5mb250U2l6ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGlzIG1ldGhvZCB0byBkcmF3IGltYWdlXG4gICAgICogQHBhcmFtIGltYWdlT3B0aW9uc1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkcmF3SW1hZ2UoaW1hZ2VPcHRpb25zOiBJRHJhd0ltYWdlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpbWFnZU9wdGlvbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUoaW1hZ2VPcHRpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbWFnZU9wdGlvbnMud2lkdGggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpbWFnZU9wdGlvbnMud2lkdGggPSB0aGlzLnJlY3QueFJpZ2h0IC0gdGhpcy5yZWN0LnhMZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaW1hZ2VPcHRpb25zLmhlaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGltYWdlT3B0aW9ucy5oZWlnaHQgPSB0aGlzLnJlY3QueUJvdCAtIHRoaXMucmVjdC55VG9wO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGltYWdlU2l6ZTogSVNpemUgPSB7XG4gICAgICAgICAgICB3aWR0aDogaW1hZ2VPcHRpb25zLndpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBpbWFnZU9wdGlvbnMuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGltYWdlUmVjdDogSVJlY3QgPSB0aGlzLmFsaWduUmVjdChpbWFnZU9wdGlvbnMsIGltYWdlU2l6ZSk7XG4gICAgICAgIHRoaXMucGFja3MucHVzaChhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGltYWdlUmVjdCwgdHJ1ZSwgdHJ1ZSksXG4gICAgICAgICAgICBudWxsLCB0aGlzLmNvbnRyb2xsZXIsIGltYWdlT3B0aW9ucy5iYXNlNjQsXG4gICAgICAgICAgICBpbWFnZVJlY3QueFJpZ2h0IC0gaW1hZ2VSZWN0LnhMZWZ0LFxuICAgICAgICAgICAgaW1hZ2VSZWN0LnlCb3QgLSBpbWFnZVJlY3QueVRvcCkpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9kcmF3X2NhbnZhcy50cyIsImltcG9ydCB7IEV2ZW50IH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBEcmF3Q2FudmFzIH0gZnJvbSAnLi9kcmF3X2NhbnZhcyc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEV2ZW50QXN5bmM8VCBleHRlbmRzIEZ1bmN0aW9uLCBPcHRpb25zPiBleHRlbmRzIEV2ZW50PFQsIE9wdGlvbnM+IHtcbiAgICBwdWJsaWMgdW5zaGlmdChmdW5jOiBUKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0Z1bmMoZnVuYykpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzID0gbmV3IEFycmF5PFQ+KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxsYmFja3MudW5zaGlmdChmdW5jKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGZpcmUoc2VuZGVyOiBhbnksIG9wdGlvbnM6IE9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2tzID09IG51bGwpIHJldHVybjtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jYWxsYmFja3NbaV0oc2VuZGVyLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBFdmVudEhhbmRsZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgcHJvY2Vzc19oZWFkZXJfZXZlbnRzKHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwYWNrczogSVBkZkJyaWNrW11bXSk6IHZvaWQge1xuICAgICAgICBpZiAoIXN1cnZleS5oYXZlQ29tbWVyY2lhbExpY2Vuc2UpIHtcbiAgICAgICAgICAgIHN1cnZleS5vblJlbmRlckhlYWRlci5hZGQoKF8sIGNhbnZhcykgPT4ge1xuICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3VGV4dCh7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6ICdTdXJ2ZXlKUyBQREYgfCBQbGVhc2UgcHVyY2hhc2UgYSBTdXJ2ZXlKUyBQREYgZGV2ZWxvcGVyIGxpY2Vuc2UgdG8gdXNlIGl0IGluIHlvdXIgYXBwIHwgaHR0cHM6Ly9zdXJ2ZXlqcy5pby9CdXknLFxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogMTBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgc3VydmV5Lm9uUmVuZGVySGVhZGVyLmZpcmUoc3VydmV5LCBuZXcgRHJhd0NhbnZhcyhwYWNrc1tpXSwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlSGVhZGVyUmVjdChjb250cm9sbGVyKSwgcGFja3MubGVuZ3RoLCBpICsgMSkpO1xuICAgICAgICAgICAgc3VydmV5Lm9uUmVuZGVyRm9vdGVyLmZpcmUoc3VydmV5LCBuZXcgRHJhd0NhbnZhcyhwYWNrc1tpXSwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlRm9vdGVyUmVjdChjb250cm9sbGVyKSwgcGFja3MubGVuZ3RoLCBpICsgMSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9ldmVudF9oYW5kbGVyL2V2ZW50X2hhbmRsZXIudHMiLCJpbXBvcnQge1xuICAgIElRdWVzdGlvbiwgUXVlc3Rpb25NYXRyaXhEcm9wZG93bk1vZGVsQmFzZSwgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkVGFibGUsXG4gICAgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LCBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRDZWxsLCBTZXJpYWxpemVyLCBQYW5lbE1vZGVsXG59IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi9mbGF0X3NlbGVjdGJhc2UnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeE11bHRpcGxlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1JPV1M6IG51bWJlciA9IDAuNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERiwgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2U+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c0NlbGwocG9pbnQ6IElQb2ludCwgY2VsbDogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCxcbiAgICAgICAgaXNIZWFkZXI6IGJvb2xlYW4pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgaWYgKGNlbGwuaGFzUXVlc3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChjZWxsLmNlbGwuY29sdW1uLmlzU2hvd0luTXVsdGlwbGVDb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmxhdE11bHRpcGxlQ29sdW1uc1F1ZXN0aW9uOiBJRmxhdFF1ZXN0aW9uID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCBjZWxsLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwucXVlc3Rpb24uZ2V0VHlwZSgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoU3VydmV5SGVscGVyLnNjYWxlUmVjdChcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljaygoPEZsYXRTZWxlY3RCYXNlPmZsYXRNdWx0aXBsZUNvbHVtbnNRdWVzdGlvbilcbiAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlRmxhdEl0ZW0oaXRlbVJlY3QsIGNlbGwuaXRlbSwgY2VsbC5jaG9pY2VJbmRleCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2VsbC5xdWVzdGlvbi50aXRsZUxvY2F0aW9uID0gU3VydmV5SGVscGVyLlRJVExFX0xPQ0FUSU9OX01BVFJJWDtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soLi4uYXdhaXQgU3VydmV5SGVscGVyLmdlbmVyYXRlUXVlc3Rpb25GbGF0cyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIHRoaXMuY29udHJvbGxlciwgY2VsbC5xdWVzdGlvbiwgcG9pbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjZWxsLmhhc1RpdGxlKSB7XG4gICAgICAgICAgICBpZiAoaXNIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBjZWxsLmxvY1RpdGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwubG9jVGl0bGUsIFRleHRCcmljaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd0hvcmlzb250YWwocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csXG4gICAgICAgIGNvbENvdW50OiBudW1iZXIsIGNvbHVtbldpZHRoOiBudW1iZXJbXSk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGxldCBsYXN0UmlnaHRNYXJnaW46IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBsZXQgY250ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gdGhpcy5xdWVzdGlvbi5kZXRhaWxQYW5lbE1vZGUgIT09ICdub25lJyA/IDEgOiAwOyBpIDwgcm93LmNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY250ID09IGNvbENvdW50KSBicmVhaztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGxhc3RSaWdodE1hcmdpbiArXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbHVtbldpZHRoW2NudF07XG4gICAgICAgICAgICBsYXN0UmlnaHRNYXJnaW4gPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjb25zdCBjZWxsQ29udGVudDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsKFxuICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgcm93LmNlbGxzW2ldLCByb3cgPT09IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5oZWFkZXJSb3cpO1xuICAgICAgICAgICAgaWYgKCFjZWxsQ29udGVudC5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGNlbGxDb250ZW50KTtcbiAgICAgICAgICAgICAgICBjbnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dWZXJ0aWNhbChwb2ludDogSVBvaW50LCByb3c6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdyxcbiAgICAgICAgY29sQ291bnQ6IG51bWJlcik6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBNYXRoLm1pbihjb2xDb3VudCwgcm93LmNlbGxzLmxlbmd0aCk7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5zaG93SGVhZGVyICYmICghdGhpcy5pc011bHRpcGxlIHx8IGkgPiAwKSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsKGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlLmhlYWRlclJvdy5jZWxsc1tpXSwgZmFsc2UpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGNvbXBvc2l0ZS55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNDZWxsKGN1cnJQb2ludCwgcm93LmNlbGxzW2ldLCBmYWxzZSkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjb21wb3NpdGUueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb2x1bW5XaWR0aChyb3dzOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXSwgY29sQ291bnQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSAtXG4gICAgICAgICAgICAoY29sQ291bnQgLSAxKSAqIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgbGV0IHJlbWFpbldpZHRoOiBudW1iZXIgPSBhdmFpbGFibGVXaWR0aDtcbiAgICAgICAgbGV0IHJlbWFpbkNvbENvdW50OiBudW1iZXIgPSBjb2xDb3VudDtcbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGg6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgocm93c1swXS5jZWxsc1tpXS53aWR0aCxcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCwgY29sQ291bnQpIHx8IDAuMDtcbiAgICAgICAgICAgIHJlbWFpbldpZHRoIC09IHdpZHRoO1xuICAgICAgICAgICAgaWYgKHdpZHRoICE9PSAwLjApIHJlbWFpbkNvbENvdW50LS07XG4gICAgICAgICAgICBjb2x1bW5XaWR0aC5wdXNoKHdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVtYWluQ29sQ291bnQgPT09IDApIHJldHVybiBjb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgaGV1cmlzdGljV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGg7XG4gICAgICAgIGNvbnN0IGNvbHVtbk1pbldpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aChcbiAgICAgICAgICAgIHJvd3NbMF0uY2VsbHNbMF0ubWluV2lkdGgsIHJlbWFpbldpZHRoLCBjb2xDb3VudCkgfHwgMC4wO1xuICAgICAgICBjb25zdCBlcXVhbFdpZHRoOiBudW1iZXIgPSByZW1haW5XaWR0aCAvIHJlbWFpbkNvbENvdW50O1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gTWF0aC5tYXgoaGV1cmlzdGljV2lkdGgsIGNvbHVtbk1pbldpZHRoLCBlcXVhbFdpZHRoKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGNvbHVtbldpZHRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uV2lkdGhbaV0gPT09IDAuMCkgY29sdW1uV2lkdGhbaV0gPSB3aWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sdW1uV2lkdGg7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVPbmVSb3cocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csXG4gICAgICAgIGNvbENvdW50OiBudW1iZXIsIGlzV2lkZTogYm9vbGVhbiwgY29sdW1uV2lkdGg6IG51bWJlcltdKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBpZiAoaXNXaWRlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93SG9yaXNvbnRhbChwb2ludCwgcm93LCBjb2xDb3VudCwgY29sdW1uV2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dWZXJ0aWNhbChwb2ludCwgcm93LCBjb2xDb3VudCk7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0c1Jvd3MocG9pbnQ6IElQb2ludCwgcm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10sXG4gICAgICAgIGNvbENvdW50OiBudW1iZXIsIGlzV2lkZTogYm9vbGVhbik6IFByb21pc2U8Q29tcG9zaXRlQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJvd0ZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU9uZVJvdyhjdXJyUG9pbnQsIHJvd3NbaV0sIGNvbENvdW50LFxuICAgICAgICAgICAgICAgIGlzV2lkZSwgdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChyb3dzLCBjb2xDb3VudCkpO1xuICAgICAgICAgICAgaWYgKHJvd0ZsYXQuaXNFbXB0eSkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoaSAhPT0gcm93cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dGbGF0LnlCb3Q7XG4gICAgICAgICAgICAgICAgcm93RmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKHJvd0ZsYXQpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dGbGF0LnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5kZXRhaWxQYW5lbE1vZGUgIT09ICdub25lJyAmJiBpID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREZXRhaWxQYW5lbDogUGFuZWxNb2RlbCA9IHRoaXMucXVlc3Rpb24uZGV0YWlsUGFuZWxWYWx1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGN1cnJlbnREZXRhaWxQYW5lbC5xdWVzdGlvbnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudERldGFpbFBhbmVsLnF1ZXN0aW9uc1tqXS5pZCArPSAnXycgKyBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYW5lbEJyaWNrczogSVBkZkJyaWNrW10gPSBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIHRoaXMuY29udHJvbGxlciwgY3VycmVudERldGFpbFBhbmVsLCBjdXJyUG9pbnQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY3VyckNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgICAgICAgICBjdXJyQ29tcG9zaXRlLmFkZEJyaWNrKC4uLnBhbmVsQnJpY2tzKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGN1cnJDb21wb3NpdGUueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICByb3dzRmxhdHMucHVzaChjdXJyQ29tcG9zaXRlKTtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gcm93cy5sZW5ndGggLSAxICYmIHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5zaG93SGVhZGVyICYmIGlzV2lkZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXI6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU9uZVJvdyhjdXJyUG9pbnQsIHJvd3NbMF0sIGNvbENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNXaWRlLCB0aGlzLmNhbGN1bGF0ZUNvbHVtbldpZHRoKHJvd3MsIGNvbENvdW50KSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaGVhZGVyLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICByb3dzRmxhdHMucHVzaChoZWFkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgdGFibGU6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJlZFRhYmxlO1xuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsOiBib29sZWFuID0gdGhpcy5xdWVzdGlvbi5jb2x1bW5MYXlvdXQgPT09ICd2ZXJ0aWNhbCc7XG4gICAgICAgIGNvbnN0IGNvbENvdW50OiBudW1iZXIgPSB0YWJsZS5yb3dzWzBdID8gdGFibGUucm93c1swXS5jZWxscy5sZW5ndGggLVxuICAgICAgICAgICAgKHRhYmxlLmhhc1JlbW92ZVJvd3MgJiYgIWlzVmVydGljYWwgPyAodGhpcy5xdWVzdGlvbi5kZXRhaWxQYW5lbE1vZGUgIT09ICdub25lJyA/IDIgOiAxKSA6IDApIDpcbiAgICAgICAgICAgIHRhYmxlLnNob3dIZWFkZXIgJiYgdGFibGUuaGVhZGVyUm93ID8gdGFibGUuaGVhZGVyUm93LmNlbGxzLmxlbmd0aCA6XG4gICAgICAgICAgICAgICAgdGFibGUuc2hvd0Zvb3RlciAmJiB0YWJsZS5mb290ZXJSb3cgPyB0YWJsZS5mb290ZXJSb3cuY2VsbHMubGVuZ3RoIDogMDtcbiAgICAgICAgaWYgKGNvbENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW25ldyBDb21wb3NpdGVCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQocG9pbnQsIHRoaXMuY29udHJvbGxlcikpXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dzOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3dbXSA9IFtdO1xuICAgICAgICBjb25zdCBjZWxsV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRDb2x1bW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50KTtcbiAgICAgICAgY29uc3QgaXNXaWRlOiBib29sZWFuID0gdGhpcy5xdWVzdGlvbi5yZW5kZXJBcyAhPT0gJ2xpc3QnICYmXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWF0cml4UmVuZGVyQXMgIT09ICdsaXN0JyAmJlxuICAgICAgICAgICAgY2VsbFdpZHRoID49IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGg7XG4gICAgICAgIGlmICh0YWJsZS5zaG93SGVhZGVyICYmIGlzV2lkZSkgcm93cy5wdXNoKHRhYmxlLmhlYWRlclJvdyk7XG4gICAgICAgIHJvd3MucHVzaCguLi50YWJsZS5yb3dzKTtcbiAgICAgICAgaWYgKHRhYmxlLmhhc1JlbW92ZVJvd3MgJiYgaXNWZXJ0aWNhbCkgcm93cy5wb3AoKTtcbiAgICAgICAgaWYgKHRhYmxlLnNob3dGb290ZXIgJiYgaXNXaWRlKSByb3dzLnB1c2godGFibGUuZm9vdGVyUm93KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd3MocG9pbnQsIHJvd3MsIGNvbENvdW50LCBpc1dpZGUpO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnbWF0cml4ZHJvcGRvd24nLCAncmVuZGVyQXMnKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ21hdHJpeGRyb3Bkb3duJywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdsaXN0J11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignbWF0cml4ZHJvcGRvd24nLCBGbGF0TWF0cml4TXVsdGlwbGUpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeG11bHRpcGxlLnRzIiwiaW1wb3J0IEludGVydmFsVHJlZSBmcm9tICdub2RlLWludGVydmFsLXRyZWUnO1xuaW1wb3J0IHsgRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5pbnRlcmZhY2UgUGFja0ludGVydmFsIHtcbiAgICBwYWdlSW5kZXg6IG51bWJlcjtcbiAgICB4TGVmdDogbnVtYmVyO1xuICAgIHhSaWdodDogbnVtYmVyO1xuICAgIHlCb3Q6IG51bWJlcjtcbiAgICBhYnNCb3Q6IG51bWJlcjtcbn1cbmV4cG9ydCBjbGFzcyBQYWdlUGFja2VyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kQm90SW50ZXJ2YWwodHJlZTogSW50ZXJ2YWxUcmVlPFBhY2tJbnRlcnZhbD4sXG4gICAgICAgIHhMZWZ0OiBudW1iZXIsIHhSaWdodDogbnVtYmVyLCBvcHRpb25zOiBEb2NPcHRpb25zKTogUGFja0ludGVydmFsIHtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWxzOiBQYWNrSW50ZXJ2YWxbXSA9IHRyZWUuc2VhcmNoKHhMZWZ0LCB4UmlnaHQpO1xuICAgICAgICBpbnRlcnZhbHMucHVzaCh7XG4gICAgICAgICAgICBwYWdlSW5kZXg6IDAsIHhMZWZ0OlxuICAgICAgICAgICAgICAgIG9wdGlvbnMubWFyZ2lucy5sZWZ0LCB4UmlnaHQ6IG9wdGlvbnMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgeUJvdDogb3B0aW9ucy5tYXJnaW5zLnRvcCwgYWJzQm90OiBvcHRpb25zLm1hcmdpbnMudG9wXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW50ZXJ2YWxzLnJlZHVjZSgobXgsIGNyKSA9PiB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoY3IueFJpZ2h0IC0geExlZnQpIDwgU3VydmV5SGVscGVyLkVQU0lMT04gfHxcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhjci54TGVmdCAtIHhSaWdodCkgPCBTdXJ2ZXlIZWxwZXIuRVBTSUxPTikgcmV0dXJuIG14O1xuICAgICAgICAgICAgaWYgKGNyLnBhZ2VJbmRleCA8IG14LnBhZ2VJbmRleCkgcmV0dXJuIG14O1xuICAgICAgICAgICAgaWYgKGNyLnBhZ2VJbmRleCA+IG14LnBhZ2VJbmRleCkgcmV0dXJuIGNyO1xuICAgICAgICAgICAgcmV0dXJuIGNyLnlCb3QgPiBteC55Qm90ID8gY3IgOiBteDtcbiAgICAgICAgfSwgaW50ZXJ2YWxzW2ludGVydmFscy5sZW5ndGggLSAxXSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFkZFBhY2socGFja3M6IElQZGZCcmlja1tdW10sIGluZGV4OiBudW1iZXIsIGJyaWNrOiBJUGRmQnJpY2spIHtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gcGFja3MubGVuZ3RoOyBpIDw9IGluZGV4OyBpKyspIHtcbiAgICAgICAgICAgIHBhY2tzLnB1c2goW10pO1xuICAgICAgICB9XG4gICAgICAgIHBhY2tzW2luZGV4XS5wdXNoKGJyaWNrKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBwYWNrKGZsYXRzOiBJUGRmQnJpY2tbXVtdLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogSVBkZkJyaWNrW11bXSB7XG4gICAgICAgIGNvbnN0IHBhZ2VIZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJIZWlnaHQgLVxuICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnRvcCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3Q7XG4gICAgICAgIGNvbnN0IHVuZm9sZEZsYXRzOiBJUGRmQnJpY2tbXVtdID0gW107XG4gICAgICAgIGZsYXRzLmZvckVhY2goKGZsYXRzUGFnZTogSVBkZkJyaWNrW10pID0+IHtcbiAgICAgICAgICAgIHVuZm9sZEZsYXRzLnB1c2goW10pO1xuICAgICAgICAgICAgZmxhdHNQYWdlLmZvckVhY2goKGZsYXQ6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmbGF0LmhlaWdodCA+IHBhZ2VIZWlnaHQgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTikge1xuICAgICAgICAgICAgICAgICAgICB1bmZvbGRGbGF0c1t1bmZvbGRGbGF0cy5sZW5ndGggLSAxXS5wdXNoKC4uLmZsYXQudW5mb2xkKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHVuZm9sZEZsYXRzW3VuZm9sZEZsYXRzLmxlbmd0aCAtIDFdLnB1c2goZmxhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHVuZm9sZEZsYXRzLmZvckVhY2goKHVuZm9sZEZsYXRzUGFnZTogSVBkZkJyaWNrW10pID0+IHtcbiAgICAgICAgICAgIHVuZm9sZEZsYXRzUGFnZS5zb3J0KChhOiBJUGRmQnJpY2ssIGI6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhLnlUb3AgPCBiLnlUb3ApIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICBpZiAoYS55VG9wID4gYi55VG9wKSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICBpZiAoYS54TGVmdCA+IGIueExlZnQpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIGlmIChhLnhMZWZ0IDwgYi54TGVmdCkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgcGFnZUluZGV4TW9kZWw6IG51bWJlciA9IDA7XG4gICAgICAgIGNvbnN0IHBhY2tzOiBJUGRmQnJpY2tbXVtdID0gW107XG4gICAgICAgIGNvbnN0IHBhZ2VCb3Q6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJIZWlnaHQgLSBjb250cm9sbGVyLm1hcmdpbnMuYm90O1xuICAgICAgICB1bmZvbGRGbGF0cy5mb3JFYWNoKCh1bmZvbGRGbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0cmVlOiBJbnRlcnZhbFRyZWU8UGFja0ludGVydmFsPiA9IG5ldyBJbnRlcnZhbFRyZWUoKTtcbiAgICAgICAgICAgIGxldCBwYWdlSW5kZXhTaGlmdDogbnVtYmVyID0gMDtcbiAgICAgICAgICAgIHVuZm9sZEZsYXRzUGFnZS5mb3JFYWNoKChmbGF0OiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgeyBwYWdlSW5kZXgsIHlCb3QsIGFic0JvdCB9ID0gUGFnZVBhY2tlci5maW5kQm90SW50ZXJ2YWwoXG4gICAgICAgICAgICAgICAgICAgIHRyZWUsIGZsYXQueExlZnQsIGZsYXQueFJpZ2h0LCBjb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IGZsYXQuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIGZsYXQueVRvcCA9IHlCb3QgKyBmbGF0LnlUb3AgLSBhYnNCb3Q7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGZsYXQueVRvcCAtIGNvbnRyb2xsZXIubWFyZ2lucy50b3ApID4gU3VydmV5SGVscGVyLkVQU0lMT04gJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhdC55VG9wICsgaGVpZ2h0ID4gcGFnZUJvdCArIFN1cnZleUhlbHBlci5FUFNJTE9OIHx8IGZsYXQuaXNQYWdlQnJlYWspIHtcbiAgICAgICAgICAgICAgICAgICAgZmxhdC55VG9wID0gY29udHJvbGxlci5tYXJnaW5zLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmRleFNoaWZ0ID0gTWF0aC5tYXgocGFnZUluZGV4U2hpZnQsIHBhZ2VJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRyZWUuaW5zZXJ0KGZsYXQueExlZnQsIGZsYXQueFJpZ2h0LCB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmRleDogcGFnZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICB4TGVmdDogZmxhdC54TGVmdCwgeFJpZ2h0OiBmbGF0LnhSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgeUJvdDogZmxhdC55VG9wICsgaGVpZ2h0LCBhYnNCb3Q6IGZsYXQueUJvdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGZsYXQueUJvdCA9IGZsYXQueVRvcCArIGhlaWdodDtcbiAgICAgICAgICAgICAgICBQYWdlUGFja2VyLmFkZFBhY2socGFja3MsIHBhZ2VJbmRleE1vZGVsICsgcGFnZUluZGV4LCBmbGF0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGFnZUluZGV4TW9kZWwgKz0gcGFnZUluZGV4U2hpZnQgKyAxO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHBhY2tzO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGFnZV9sYXlvdXQvcGFnZV9wYWNrZXIudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQm9vbGVhbk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4vcGRmX2NoZWNraXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBCb29sZWFuSXRlbUJyaWNrIGV4dGVuZHMgQ2hlY2tJdGVtQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCxcbiAgICAgICAgICAgICg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLmlkLFxuICAgICAgICAgICAgcXVlc3Rpb24uaXNSZWFkT25seSxcbiAgICAgICAgICAgICg8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb24pLmNoZWNrZWRWYWx1ZSk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DaGVja2JveE1vZGVsLCBJdGVtVmFsdWUgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi9wZGZfY2hlY2tpdGVtJztcblxuZXhwb3J0IGNsYXNzIENoZWNrYm94SXRlbUJyaWNrIGV4dGVuZHMgQ2hlY2tJdGVtQnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LFxuICAgICAgICAgICAgKDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb24pLmlkICsgJ2luZGV4JyArIGluZGV4LFxuICAgICAgICAgICAgcXVlc3Rpb24uaXNSZWFkT25seSB8fCAhaXRlbS5pc0VuYWJsZWQsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbikuaXNJdGVtU2VsZWN0ZWQoaXRlbSkpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tib3hpdGVtLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0Qm94QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0Ym94JztcblxuZXhwb3J0IGNsYXNzIENvbW1lbnRCcmljayBleHRlbmRzIFRleHRCb3hCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgaXNRdWVzdGlvbjogYm9vbGVhbiwgaW5kZXg6IG51bWJlciA9IDApIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sIHRydWUsIGluZGV4KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbW1lbnQudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCwgSXRlbVZhbHVlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRHJvcGRvd25CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRHJvcGRvd25Nb2RlbDtcbiAgICBwcm90ZWN0ZWQgaXNRdWVzdGlvbjogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgaXNNdWx0aWxpbmU6IGJvb2xlYW47XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25Ecm9wZG93bk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNvbWJvQm94ID0gbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1Db21ib0JveCkoKTtcbiAgICAgICAgY29tYm9Cb3guZmllbGROYW1lID0gdGhpcy5xdWVzdGlvbi5pZDtcbiAgICAgICAgY29tYm9Cb3guUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpKSk7XG4gICAgICAgIGNvbWJvQm94LmVkaXQgPSBmYWxzZTtcbiAgICAgICAgY29tYm9Cb3guY29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgY29uc3Qgb3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uc2hvd09wdGlvbnNDYXB0aW9uKSB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2godGhpcy5xdWVzdGlvbi5vcHRpb25zQ2FwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5mb3JFYWNoKChpdGVtOiBJdGVtVmFsdWUpID0+IHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaChTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKGl0ZW0ubG9jVGV4dCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29tYm9Cb3guc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgY29tYm9Cb3guZm9udE5hbWUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgIGNvbWJvQm94LmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgY29tYm9Cb3gucmVhZE9ubHkgPSB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHk7XG4gICAgICAgIGNvbWJvQm94LmlzVW5pY29kZSA9IFN1cnZleUhlbHBlci5pc0N1c3RvbUZvbnQoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbWJvQm94LmZvbnROYW1lKTtcbiAgICAgICAgY29tYm9Cb3guViA9IFN1cnZleUhlbHBlci5nZXREcm9wZG93blF1ZXN0aW9uVmFsdWUodGhpcy5xdWVzdGlvbik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQoY29tYm9Cb3gpO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnModGhpcy54TGVmdCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy54UmlnaHQpO1xuICAgICAgICBhd2FpdCBTdXJ2ZXlIZWxwZXIucmVuZGVyUmVhZE9ubHlUZXh0RmllbGQodGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLCB0aGlzLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldERyb3Bkb3duUXVlc3Rpb25WYWx1ZSh0aGlzLnF1ZXN0aW9uKSwgISh0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgJiYgdGhpcy5jb250cm9sbGVyLnRleHRGaWVsZFJlbmRlckFzID09PSAnbXVsdGlMaW5lJykpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfZHJvcGRvd24udHMiLCJpbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIsIElSZWN0IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBFbXB0eUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgaXNCb3JkZXJWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihyZWN0OiBJUmVjdCxcbiAgICAgICAgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIgPSBudWxsLFxuICAgICAgICBpc0JvcmRlclZpc2libGU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihudWxsLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5pc0JvcmRlclZpc2libGUgPSBpc0JvcmRlclZpc2libGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNpemVCb3JkZXIoaXNJbmNyZWFzZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBjb2VmOiBudW1iZXIgPSBpc0luY3JlYXNlID8gMSA6IC0xO1xuICAgICAgICBjb25zdCBib3JkZXJQYWRkaW5nOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldEZvbnRTaXplKCkgKiBTdXJ2ZXlIZWxwZXIuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgdGhpcy54TGVmdCAtPSBjb2VmICogYm9yZGVyUGFkZGluZztcbiAgICAgICAgdGhpcy54UmlnaHQgKz0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgICAgIHRoaXMueUJvdCArPSBjb2VmICogYm9yZGVyUGFkZGluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmlzQm9yZGVyVmlzaWJsZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVCb3JkZXIodHJ1ZSk7XG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIucmVuZGVyRmxhdEJvcmRlcnModGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplQm9yZGVyKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfZW1wdHkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuXG5leHBvcnQgY2xhc3MgSFRNTEJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgbWFyZ2luczogeyB0b3A6IG51bWJlciwgYm90dG9tOiBudW1iZXIgfTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBodG1sOiBzdHJpbmcsIGlzSW1hZ2U6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIGlmIChpc0ltYWdlKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmdpbnMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiAwLjAsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAwLjBcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hcmdpbnMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiBjb250cm9sbGVyLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogY29udHJvbGxlci5tYXJnaW5zLmJvdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5mcm9tSFRNTCh0aGlzLmh0bWwsIHRoaXMueExlZnQsIHRoaXMueVRvcCwge1xuICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLCBwYWdlc3BsaXQ6IHRydWUsXG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKSkuZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGVsOiBIVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLm5hbWUubGFzdEluZGV4T2YoJ2pzUERGaHRtbFRleHQnLCAwKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCB0aGlzLm1hcmdpbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9odG1sLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBvaW50IH0gZnJvbSAnLi4vZW50cmllcy9wZGYnO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJvdGVjdGVkIGltYWdlOiBzdHJpbmcsXG4gICAgICAgIHBvaW50OiBJUG9pbnQsIHByb3RlY3RlZCBvcmlnaW5hbFdpZHRoOiBudW1iZXIsIHByb3RlY3RlZCBvcmlnaW5hbEhlaWdodDogbnVtYmVyKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHBvaW50LnhMZWZ0ICsgKG9yaWdpbmFsV2lkdGggfHwgMCksXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wLFxuICAgICAgICAgICAgeUJvdDogcG9pbnQueVRvcCArIChvcmlnaW5hbEhlaWdodCB8fCAwKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pc1BhZ2VCcmVhayA9IHRoaXMub3JpZ2luYWxIZWlnaHQgPT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRJbWFnZSh0aGlzLmltYWdlLCB0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsIHRoaXMub3JpZ2luYWxXaWR0aCwgdGhpcy5vcmlnaW5hbEhlaWdodCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfaW1hZ2UudHMiLCJpbXBvcnQgeyBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNDQUxFX0ZBQ1RPUl9NQUdJQzogbnVtYmVyID0gMC45NTU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT0xPUjogc3RyaW5nID0gJyMwMDAwRUUnO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXh0RmxhdDogVGV4dEJyaWNrLCBwcm90ZWN0ZWQgbGluazogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCg8TGlua0JyaWNrPnRleHRGbGF0KS5xdWVzdGlvbixcbiAgICAgICAgICAgICg8TGlua0JyaWNrPnRleHRGbGF0KS5jb250cm9sbGVyLFxuICAgICAgICAgICAgdGV4dEZsYXQsICg8TGlua0JyaWNrPnRleHRGbGF0KS50ZXh0KTtcbiAgICAgICAgdGhpcy50ZXh0Q29sb3IgPSBMaW5rQnJpY2suQ09MT1I7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG9sZFRleHRDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRUZXh0Q29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3IoU3VydmV5SGVscGVyLkJBQ0tHUk9VTkRfQ09MT1IpO1xuICAgICAgICBsZXQgZGVzY2VudDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKlxuICAgICAgICAgICAgKHRoaXMuY29udHJvbGxlci5kb2MuZ2V0TGluZUhlaWdodEZhY3RvcigpIC1cbiAgICAgICAgICAgICAgICBMaW5rQnJpY2suU0NBTEVfRkFDVE9SX01BR0lDKTtcbiAgICAgICAgbGV0IHlUb3BMaW5rOiBudW1iZXIgPSB0aGlzLnlUb3AgK1xuICAgICAgICAgICAgKHRoaXMueUJvdCAtIHRoaXMueVRvcCkgLSBkZXNjZW50O1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnRleHRXaXRoTGluayh0aGlzLnRleHQsIHRoaXMueExlZnQsXG4gICAgICAgICAgICB5VG9wTGluaywgeyB1cmw6IHRoaXMubGluayB9KTtcbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3Iob2xkVGV4dENvbG9yKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpICE9PSAndGV4dCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgc3VwZXIucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2xpbmsudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgSVNpemUsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFJhZGlvR3JvdXBXcmFwIHtcbiAgICBwcml2YXRlIF9yYWRpb0dyb3VwOiBhbnk7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByaXZhdGUgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcHJpdmF0ZSBfcmVhZE9ubHk6IGJvb2xlYW4pIHtcbiAgICB9XG4gICAgcHVibGljIGFkZFRvUGRmKGNvbG9yOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cCA9IG5ldyB0aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtUmFkaW9CdXR0b24oKTtcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cC5maWVsZE5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAudmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy5fcmFkaW9Hcm91cC5yZWFkT25seSA9IHRoaXMucmVhZE9ubHk7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAuY29sb3IgPSBjb2xvcjtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5hZGRGaWVsZCh0aGlzLl9yYWRpb0dyb3VwKTtcbiAgICB9XG4gICAgZ2V0IHJhZGlvR3JvdXAoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhZGlvR3JvdXA7XG4gICAgfVxuICAgIGdldCByZWFkT25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRPbmx5O1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhZGlvSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJBRElPTUFSS0VSX1JFQURPTkxZX1NZTUJPTDogc3RyaW5nID0gJ+KAoic7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUkFESU9NQVJLRVJfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjU3NTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByaXZhdGUgaW5kZXg6IG51bWJlciwgcHJpdmF0ZSBjaGVja2VkOiBib29sZWFuLFxuICAgICAgICBwcml2YXRlIHJhZGlvR3JvdXBXcmFwOiBSYWRpb0dyb3VwV3JhcCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucmFkaW9Hcm91cFdyYXAucmVhZE9ubHkgJiYgU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoXG4gICAgICAgICAgICA8UXVlc3Rpb24+dGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVuZGVyUmVhZE9ubHkoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRleCA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLmFkZFRvUGRmKHRoaXMuZm9ybUJvcmRlckNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5yYWRpb0dyb3VwV3JhcC5uYW1lICsgJ2luZGV4JyArIHRoaXMuaW5kZXg7XG4gICAgICAgIGxldCByYWRpb0J1dHRvbjogYW55ID0gdGhpcy5yYWRpb0dyb3VwV3JhcC5yYWRpb0dyb3VwLmNyZWF0ZU9wdGlvbihuYW1lKTtcbiAgICAgICAgcmFkaW9CdXR0b24uUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgICAgIHJhZGlvQnV0dG9uLkFTID0gJy8nICsgbmFtZTtcbiAgICAgICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC52YWx1ZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByYWRpb0J1dHRvbi5BUyA9ICcvT2ZmJztcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm9ybVNjYWxlOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZm9ybVNjYWxlKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIHJhZGlvQnV0dG9uLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLCBmb3JtU2NhbGUpKTtcbiAgICAgICAgcmFkaW9CdXR0b24uY29sb3IgPSB0aGlzLmZvcm1Cb3JkZXJDb2xvcjtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC5zZXRBcHBlYXJhbmNlKFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybS5BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGxldCByYWRpb21hcmtlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICpcbiAgICAgICAgICAgICAgICBSYWRpb0l0ZW1Ccmljay5SQURJT01BUktFUl9SRUFET05MWV9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgICAgICBsZXQgcmFkaW9tYXJrZXJTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChcbiAgICAgICAgICAgICAgICBSYWRpb0l0ZW1Ccmljay5SQURJT01BUktFUl9SRUFET05MWV9TWU1CT0wpO1xuICAgICAgICAgICAgcmFkaW9tYXJrZXJQb2ludC54TGVmdCArPSB0aGlzLndpZHRoIC8gMi4wIC0gcmFkaW9tYXJrZXJTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICAgICAgcmFkaW9tYXJrZXJQb2ludC55VG9wICs9IHRoaXMuaGVpZ2h0IC8gMi4wIC0gcmFkaW9tYXJrZXJTaXplLmhlaWdodCAvIDEuOTtcbiAgICAgICAgICAgIGxldCByYWRpb21hcmtlckZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgICAgICByYWRpb21hcmtlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfU1lNQk9MLCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgKDxhbnk+cmFkaW9tYXJrZXJGbGF0LnVuZm9sZCgpWzBdKS50ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICAgICAgYXdhaXQgcmFkaW9tYXJrZXJGbGF0LnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyLCBJUG9pbnQgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4vcGRmX2NoZWNraXRlbSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFJhbmtpbmdJdGVtQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblJhbmtpbmdNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBudW1iZXI6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25SYW5raW5nTW9kZWw+cXVlc3Rpb247XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGNvbnN0IG51bWJlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICpcbiAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIGNvbnN0IG51bWJlclNpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMubnVtYmVyKTtcbiAgICAgICAgbnVtYmVyUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIG51bWJlclNpemUud2lkdGggLyAyLjA7XG4gICAgICAgIG51bWJlclBvaW50LnlUb3AgKz0gdGhpcy5oZWlnaHQgLyAyLjAgLSBudW1iZXJTaXplLmhlaWdodCAvIDIuMDtcbiAgICAgICAgY29uc3QgbnVtYmVyRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgbnVtYmVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5udW1iZXIsIFRleHRCcmljayk7XG4gICAgICAgICg8YW55Pm51bWJlckZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgYXdhaXQgbnVtYmVyRmxhdC5yZW5kZXIoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblRleHRNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJvbGRCcmljayB9IGZyb20gJy4vcGRmX3RleHRib2xkJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgVGl0bGVQYW5lbEJyaWNrIGV4dGVuZHMgVGV4dEJvbGRCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblRleHRNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgdGV4dCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IG9sZEZvbnRTaXplID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqIFN1cnZleUhlbHBlci5USVRMRV9QQU5FTF9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfdGl0bGVwYW5lbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUGFuZWxNb2RlbCwgUGFnZU1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuXG5leHBvcnQgY2xhc3MgQWRvcm5lcnNCYXNlT3B0aW9ucyB7XG4gICAgcHVibGljIHBvaW50OiBJUG9pbnQ7XG4gICAgcHVibGljIGJyaWNrczogSVBkZkJyaWNrW107XG4gICAgcHVibGljIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXI7XG4gICAgcHVibGljIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5O1xuICAgIHB1YmxpYyBtb2R1bGU6IGFueTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5wb2ludCA9IHBvaW50O1xuICAgICAgICB0aGlzLmJyaWNrcyA9IGJyaWNrcztcbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gY29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBxdWVzdGlvbjogSVF1ZXN0aW9uO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocG9pbnQsIGJyaWNrcywgY29udHJvbGxlciwgcmVwb3NpdG9yeSwgbW9kdWxlKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IHF1ZXN0aW9uO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc1BhbmVsT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBwYW5lbDogUGFuZWxNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcGFuZWw6IFBhbmVsTW9kZWwsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICBzdXBlcihwb2ludCwgYnJpY2tzLCBjb250cm9sbGVyLCByZXBvc2l0b3J5LCBtb2R1bGUpO1xuICAgICAgICB0aGlzLnBhbmVsID0gcGFuZWw7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWRvcm5lcnNQYWdlT3B0aW9ucyBleHRlbmRzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBwYWdlOiBQYWdlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHBhZ2U6IFBhZ2VNb2RlbCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHBvaW50LCBicmlja3MsIGNvbnRyb2xsZXIsIHJlcG9zaXRvcnksIG1vZHVsZSk7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgfVxufVxuXG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9hZG9ybmVycy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgTG9jYWxpemFibGVTdHJpbmcsIFF1ZXN0aW9uQm9vbGVhbk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQm9vbGVhbkl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2Jvb2xlYW5pdGVtJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdEJvb2xlYW4gZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Cb29sZWFuTW9kZWw7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkJvb2xlYW5Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBuZXcgQm9vbGVhbkl0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChwb2ludCwgaGVpZ2h0LCBoZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KSk7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCBsb2NMYWJlbFRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gdGhpcy5xdWVzdGlvbi5pc0luZGV0ZXJtaW5hdGUgPyBudWxsIDpcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uY2hlY2tlZFZhbHVlID8gdGhpcy5xdWVzdGlvbi5sb2NMYWJlbFRydWUgOiB0aGlzLnF1ZXN0aW9uLmxvY0xhYmVsRmFsc2U7XG4gICAgICAgIGlmIChsb2NMYWJlbFRleHQgIT09IG51bGwgJiYgbG9jTGFiZWxUZXh0LnJlbmRlcmVkSHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGxvY0xhYmVsVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVGbGF0XTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2Jvb2xlYW4nLCBGbGF0Qm9vbGVhbik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkNoZWNrYm94TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4vZmxhdF9zZWxlY3RiYXNlJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ2hlY2tib3hJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2JveGl0ZW0nO1xuXG5leHBvcnQgY2xhc3MgRmxhdENoZWNrYm94IGV4dGVuZHMgRmxhdFNlbGVjdEJhc2Uge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ2hlY2tib3hNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGdlbmVyYXRlRmxhdEl0ZW0ocmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IElQZGZCcmljayB7XG4gICAgICAgIHJldHVybiBuZXcgQ2hlY2tib3hJdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0LCBpdGVtLCBpbmRleCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjaGVja2JveCcsIEZsYXRDaGVja2JveCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ29tbWVudE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdENvbW1lbnQgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Db21tZW50TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25Db21tZW50TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24ucm93cywgdHJ1ZSldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignY29tbWVudCcsIEZsYXRDb21tZW50KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jb21tZW50LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkRyb3Bkb3duTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IERyb3Bkb3duQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bic7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXREcm9wZG93biBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25Ecm9wZG93bk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaXNSZWFkT25seSAmJiB0aGlzLmNvbnRyb2xsZXIudGV4dEZpZWxkUmVuZGVyQXMgPT09ICdtdWx0aUxpbmUnKSB7XG4gICAgICAgICAgICBjb25zdCByZWN0V2l0aERpbmFtaWNCb3R0b206IElSZWN0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVJlYWRPbmx5VGV4dEZpZWxkVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgcG9pbnQsIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbiwgU3VydmV5SGVscGVyLmdldERyb3Bkb3duUXVlc3Rpb25WYWx1ZSh0aGlzLnF1ZXN0aW9uKSwgZmFsc2UpO1xuICAgICAgICAgICAgcmVjdC55Qm90ID0gTWF0aC5tYXgocmVjdC55Qm90LCByZWN0V2l0aERpbmFtaWNCb3R0b20ueUJvdCArIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKFxuICAgICAgICAgICAgbmV3IERyb3Bkb3duQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0KSk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCkge1xuICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgb3RoZXJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChcbiAgICAgICAgICAgICAgICBvdGhlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIFN1cnZleUhlbHBlci5PVEhFUl9ST1dTX0NPVU5ULCBmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlRmxhdF07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdkcm9wZG93bicsIEZsYXREcm9wZG93bik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZHJvcGRvd24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRmaWVsZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRFeHByZXNzaW9uIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25FeHByZXNzaW9uTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICByZXR1cm4gW25ldyBUZXh0RmllbGRCcmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHJlY3QsIHRydWUsXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmlkLCB0aGlzLnF1ZXN0aW9uLmRpc3BsYXlWYWx1ZSwgJycsIHRydWUsIGZhbHNlLCAndGV4dCcpXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2V4cHJlc3Npb24nLCBGbGF0RXhwcmVzc2lvbik7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25GaWxlTW9kZWwsIHN1cnZleUxvY2FsaXphdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRGaWxlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IElNQUdFX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4xOTU7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBURVhUX01JTl9TQ0FMRTogbnVtYmVyID0gNS4wO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25GaWxlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkZpbGVNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIGl0ZW06IHtcbiAgICAgICAgbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyxcbiAgICB9KTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUxpbmtGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS5uYW1lID09PSB1bmRlZmluZWQgPyAnaW1hZ2UnIDogaXRlbS5uYW1lLCBpdGVtLmNvbnRlbnQpKTtcbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5jYW5QcmV2aWV3SW1hZ2UodGhpcy5xdWVzdGlvbiwgaXRlbSwgaXRlbS5jb250ZW50KSkge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VTaXplOiBJU2l6ZSA9IGF3YWl0IFN1cnZleUhlbHBlci5nZXRJbWFnZVNpemUoaXRlbS5jb250ZW50KTtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVNpemUud2lkdGggPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCkgeyAvLyBUT0RPOiB3ZSBzaG91bGRuJ3QgdXNlIGdldFBhZ2VBdmFpbGFibGVXaWR0aCBoZXJlXG4gICAgICAgICAgICAgICAgaW1hZ2VTaXplLmhlaWdodCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHRoaXMucXVlc3Rpb24uaW1hZ2VIZWlnaHQsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbWFnZVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBpbWFnZVBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0RmlsZS5JTUFHRV9HQVBfU0NBTEU7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQoaW1hZ2VQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmNvbnRlbnQsIGltYWdlU2l6ZS53aWR0aCwgaW1hZ2VTaXplLmhlaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcml2YXRlIGFkZExpbmUocm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdLCBjdXJyUG9pbnQ6IElQb2ludCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoaW5kZXggIT09IHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24ucHJldmlld1ZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBzdXJ2ZXlMb2NhbGl6YXRpb24uZ2V0U3RyaW5nKCdub0ZpbGVDaG9zZW4nKSwgVGV4dEJyaWNrKV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW25ldyBDb21wb3NpdGVCcmljaygpXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBsZXQgeUJvdDogbnVtYmVyID0gY3VyclBvaW50LnlUb3A7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbTogeyBuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY29udGVudDogc3RyaW5nIH0gPSB0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZVtpXTtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgLSBjdXJyUG9pbnQueExlZnQ7XG4gICAgICAgICAgICBpZiAoU3VydmV5SGVscGVyLmNhblByZXZpZXdJbWFnZSh0aGlzLnF1ZXN0aW9uLCBpdGVtLCBpdGVtLmNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRXaWR0aCA9IChhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0SW1hZ2VTaXplKGl0ZW0uY29udGVudCkpLndpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50V2lkdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoISF0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHRoaXMucXVlc3Rpb24uaW1hZ2VXaWR0aCwgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlV2lkdGg6IG51bWJlciA9IE1hdGgubWF4KGNvbnRlbnRXaWR0aCwgRmxhdEZpbGUuVEVYVF9NSU5fU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoKTtcbiAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlV2lkdGggPCBjb21wb3NpdGVXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmUocm93c0ZsYXRzLCBjdXJyUG9pbnQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoY3VyclBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGN1cnJQb2ludC54TGVmdCAtIGNvbXBvc2l0ZVdpZHRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGN1cnJQb2ludCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IGl0ZW1GbGF0LndpZHRoO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVdpZHRoIDwgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSB5Qm90O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExpbmUocm93c0ZsYXRzLCBjdXJyUG9pbnQsIGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGN1cnJQb2ludCwgaXRlbSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ICs9IGl0ZW1GbGF0LnhSaWdodCAtIGl0ZW1GbGF0LnhMZWZ0O1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzRmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdmaWxlJywgRmxhdEZpbGUpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2ZpbGUudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uSHRtbE1vZGVsLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgdHlwZSBJSFRNTFJlbmRlclR5cGUgPSAnYXV0bycgfCAnc3RhbmRhcmQnIHwgJ2ltYWdlJztcbmV4cG9ydCBjbGFzcyBGbGF0SFRNTCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkh0bWxNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICBwcml2YXRlIGNob29zZVJlbmRlcihodG1sOiBzdHJpbmcpOiBJSFRNTFJlbmRlclR5cGUge1xuICAgICAgICBpZiAoLzxbXj5dKnN0eWxlW148XSo+Ly50ZXN0KGh0bWwpIHx8XG4gICAgICAgICAgICAvPFtePl0qdGFibGVbXjxdKj4vLnRlc3QoaHRtbCkgfHxcbiAgICAgICAgICAgIC8mXFx3KzsvLnRlc3QoaHRtbCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnaW1hZ2UnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnc3RhbmRhcmQnO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IHJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGUgPSA8SUhUTUxSZW5kZXJUeXBlPnRoaXMucXVlc3Rpb24ucmVuZGVyQXM7XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ2F1dG8nKSByZW5kZXJBcyA9IHRoaXMuY29udHJvbGxlci5odG1sUmVuZGVyQXM7XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ2F1dG8nKSByZW5kZXJBcyA9IHRoaXMuY2hvb3NlUmVuZGVyKFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGhpcy5xdWVzdGlvbi5sb2NIdG1sKSk7XG4gICAgICAgIGNvbnN0IGh0bWw6IHN0cmluZyA9IFN1cnZleUhlbHBlci5jcmVhdGVIdG1sQ29udGFpbmVyQmxvY2soU3VydmV5SGVscGVyLmdldExvY1N0cmluZyh0aGlzLnF1ZXN0aW9uLmxvY0h0bWwpLCB0aGlzLmNvbnRyb2xsZXIsIHJlbmRlckFzKTtcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnaW1hZ2UnKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgY29uc3QgeyB1cmwsIGFzcGVjdCB9OiB7IHVybDogc3RyaW5nLCBhc3BlY3Q6IG51bWJlciB9ID1cbiAgICAgICAgICAgICAgICBhd2FpdCBTdXJ2ZXlIZWxwZXIuaHRtbFRvSW1hZ2UoaHRtbCwgd2lkdGgsIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHdpZHRoIC8gYXNwZWN0O1xuICAgICAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHVybCwgd2lkdGgsIGhlaWdodCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbU3VydmV5SGVscGVyLnNwbGl0SHRtbFJlY3QodGhpcy5jb250cm9sbGVyLCBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSFRNTEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBodG1sKSldO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnaHRtbCcsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnaHRtbCcsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnc3RhbmRhcmQnLCAnaW1hZ2UnXVxufSk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdodG1sJywgRmxhdEhUTUwpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2h0bWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uSW1hZ2VNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRJbWFnZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkltYWdlTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkltYWdlTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCB3aWR0aFB0OiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoKTtcbiAgICAgICAgY29uc3QgaGVpZ2h0UHQ6IG51bWJlciA9IFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLmltYWdlTGluaywgd2lkdGhQdCwgaGVpZ2h0UHQpXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2ltYWdlJywgRmxhdEltYWdlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuL2ZsYXRfcmFkaW9ncm91cCc7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRJbWFnZVBpY2tlciBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWw7XG4gICAgcHJvdGVjdGVkIHJhZGlvOiBGbGF0UmFkaW9ncm91cDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uSW1hZ2VQaWNrZXJNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHBhZ2VBdmFpbGFibGVXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgY29uc3QgaW1hZ2VGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCAoPGFueT5pdGVtKS5pbWFnZUxpbmssIHBhZ2VBdmFpbGFibGVXaWR0aCwgcGFnZUF2YWlsYWJsZVdpZHRoIC8gU3VydmV5SGVscGVyLklNQUdFUElDS0VSX1JBVElPKTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soaW1hZ2VGbGF0KTtcbiAgICAgICAgbGV0IGJ1dHRvblBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnNob3dMYWJlbCkge1xuICAgICAgICAgICAgbGV0IGxhYmVsRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGJ1dHRvblBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0udGV4dCB8fCBpdGVtLnZhbHVlLCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhsYWJlbEZsYXQpO1xuICAgICAgICAgICAgYnV0dG9uUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQobGFiZWxGbGF0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICBjb25zdCBidXR0b25SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGJ1dHRvblBvaW50LCBwYWdlQXZhaWxhYmxlV2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLm11bHRpU2VsZWN0KSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKG5ldyBDaGVja0l0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgYnV0dG9uUmVjdCwgdGhpcy5xdWVzdGlvbi5pZCArICdpbmRleCcgKyBpbmRleCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgIWl0ZW0uaXNFbmFibGVkLFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24udmFsdWUuaW5kZXhPZihpdGVtLnZhbHVlKSAhPT0gLTEpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sodGhpcy5yYWRpby5nZW5lcmF0ZUZsYXRJdGVtKGJ1dHRvblJlY3QsIGl0ZW0sIGluZGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICB0aGlzLnJhZGlvID0gdGhpcy5xdWVzdGlvbi5tdWx0aVNlbGVjdCA/IG51bGwgOlxuICAgICAgICAgICAgbmV3IEZsYXRSYWRpb2dyb3VwKHRoaXMuc3VydmV5LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbbmV3IENvbXBvc2l0ZUJyaWNrKCldO1xuICAgICAgICBjb25zdCBjb2xXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldEltYWdlUGlja2VyQXZhaWxhYmxlV2lkdGgoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpIC8gU3VydmV5SGVscGVyLklNQUdFUElDS0VSX0NPVU5UO1xuICAgICAgICBsZXQgY29sczogbnVtYmVyID0gfn4oU3VydmV5SGVscGVyLlxuICAgICAgICAgICAgZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLyBjb2xXaWR0aCkgfHwgMTtcbiAgICAgICAgY29uc3QgY291bnQ6IG51bWJlciA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoO1xuICAgICAgICBjb2xzID0gY29scyA8PSBjb3VudCA/IGNvbHMgOiBjb3VudDtcbiAgICAgICAgY29uc3Qgcm93czogbnVtYmVyID0gfn4oTWF0aC5jZWlsKGNvdW50IC8gY29scykpO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgbGV0IGN1cnJNYXJnaW5MZWZ0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGNvbHM7IGorKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBpICogY29scyArIGo7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IGNvdW50KSBicmVhaztcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gY3Vyck1hcmdpbkxlZnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIGN1cnJNYXJnaW5MZWZ0IC0gY29sV2lkdGg7XG4gICAgICAgICAgICAgICAgY3Vyck1hcmdpbkxlZnQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzW2luZGV4XSwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIHlCb3QgPSBNYXRoLm1heCh5Qm90LCBpdGVtRmxhdC55Qm90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0geUJvdDtcbiAgICAgICAgICAgIGlmIChpICE9PSByb3dzIC0gMSkge1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignaW1hZ2VwaWNrZXInLCBGbGF0SW1hZ2VQaWNrZXIpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2ltYWdlcGlja2VyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbk1hdHJpeE1vZGVsLCBNYXRyaXhSb3dNb2RlbCxcbiAgICBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCwgSXRlbVZhbHVlLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIsIElQb2ludCwgSVJlY3QgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuL2ZsYXRfcmFkaW9ncm91cCc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1JPV1M6IG51bWJlciA9IDAuNTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTWF0cml4TW9kZWw7XG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIDxRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbD5xdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NYXRyaXhNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNIZWFkZXIocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgaGVhZGVyczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjb2xDb3VudDogbnVtYmVyID0gdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGggKyAodGhpcy5xdWVzdGlvbi5oYXNSb3dzID8gMSA6IDApO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5xdWVzdGlvbi5oYXNSb3dzID8gaSArIDEgOiBpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCBjb2x1bW4pO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGhlYWRlcnMucHVzaChhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQm9sZFRleHRGbGF0KGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnNbaV0ubG9jVGV4dCkpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb3NpdGVCcmljazogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soLi4uaGVhZGVycyk7XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlQnJpY2ssIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlQnJpY2spLCB0aGlzLmNvbnRyb2xsZXIpXTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dzKHBvaW50OiBJUG9pbnQsIGlzVmVydGljYWw6IGJvb2xlYW4pOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlUm93cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5OiBzdHJpbmcgPSAncm93JyArIGk7XG4gICAgICAgICAgICBjb25zdCBmbGF0c1JvdzogSVBkZkJyaWNrW10gPSBhd2FpdCBuZXcgRmxhdE1hdHJpeFJvdyh0aGlzLnN1cnZleSwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24udmlzaWJsZVJvd3NbaV0sIGtleSwgaSA9PSAwLCBpc1ZlcnRpY2FsKS5nZW5lcmF0ZUZsYXRzQ29udGVudChjdXJyUG9pbnQpO1xuICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmZsYXRzUm93KSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRNYXRyaXguR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNlbGxzLnB1c2goLi4uZmxhdHNSb3cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNlbGxXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldENvbHVtbldpZHRoKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGggKyAodGhpcy5xdWVzdGlvbi5oYXNSb3dzID8gMSA6IDApKTtcbiAgICAgICAgY29uc3QgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IHRoaXMucXVlc3Rpb24ucmVuZGVyQXMgPT09ICdsaXN0JyB8fCB0aGlzLmNvbnRyb2xsZXIubWF0cml4UmVuZGVyQXMgPT09ICdsaXN0JyB8fFxuICAgICAgICAgICAgY2VsbFdpZHRoIDwgdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aDtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgY2VsbHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGlmICghaXNWZXJ0aWNhbCAmJiB0aGlzLnF1ZXN0aW9uLnNob3dIZWFkZXIgJiYgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ29sdW1ucy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgbGV0IGhlYWRlcnM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzSGVhZGVyKGN1cnJQb2ludCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uaGVhZGVycykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gRmxhdE1hdHJpeC5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBjZWxscy5wdXNoKC4uLmhlYWRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGNlbGxzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93cyhjdXJyUG9pbnQsIGlzVmVydGljYWwpKTtcbiAgICAgICAgcmV0dXJuIGNlbGxzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZsYXRNYXRyaXhSb3cgZXh0ZW5kcyBGbGF0UmFkaW9ncm91cCB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uTWF0cml4OiBRdWVzdGlvbk1hdHJpeE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwcml2YXRlIHJvdzogTWF0cml4Um93TW9kZWwsXG4gICAgICAgIHByaXZhdGUga2V5OiBzdHJpbmcsIHByb3RlY3RlZCBpc0ZpcnN0OiBib29sZWFuID0gZmFsc2UsIHByb3RlY3RlZCBpc1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb25NYXRyaXggPSA8UXVlc3Rpb25NYXRyaXhNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmVydGljYWwgP1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzVmVydGljYWxseUNlbGxzKHBvaW50KSA6XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNIb3Jpem9udGFsbHlDZWxscyhwb2ludCk7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZVRleHRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgY29sdW1uOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNoZWNrZWQ6IGJvb2xlYW4gPSB0aGlzLnJvdy52YWx1ZSA9PSBjb2x1bW4udmFsdWU7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoY3VyclBvaW50LFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IHJhZGlvRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGl0ZW1SZWN0LCBjb2x1bW4sIGluZGV4LCB0aGlzLmtleSwgY2hlY2tlZCk7XG4gICAgICAgIGN1cnJQb2ludC55VG9wID0gcmFkaW9GbGF0LnlCb3QgKyB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGNlbGxUZXh0RmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb25NYXRyaXguZ2V0Q2VsbERpc3BsYXlMb2NUZXh0KHRoaXMucm93Lm5hbWUsIGNvbHVtbiksIFRleHRCcmljayk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2socmFkaW9GbGF0LCBjZWxsVGV4dEZsYXQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVJdGVtQ29tcG9pc3RlKHBvaW50OiBJUG9pbnQsIGNvbHVtbjogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChjdXJyUG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCByYWRpb0ZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIGl0ZW1SZWN0LnhMZWZ0KSwgY29sdW1uLCBpbmRleCwgdGhpcy5rZXksIGNoZWNrZWQpO1xuICAgICAgICBjdXJyUG9pbnQueExlZnQgPSByYWRpb0ZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IHJhZGlvVGV4dDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgY29sdW1uLmxvY1RleHQsIFRleHRCcmljayk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2socmFkaW9GbGF0LCByYWRpb1RleHQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c0hvcml6b250YWxseUNlbGxzKHBvaW50OiBJUG9pbnQpIHtcbiAgICAgICAgY29uc3QgY2VsbHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29sQ291bnQ6IG51bWJlciA9IHRoaXMucXVlc3Rpb25NYXRyaXgudmlzaWJsZUNvbHVtbnMubGVuZ3RoICsgKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzUm93cyA/IDEgOiAwKTtcbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzUm93cykge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCAwKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBjZWxscy5wdXNoKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsIHRoaXMuY29udHJvbGxlciwgdGhpcy5yb3cubG9jVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW46IEl0ZW1WYWx1ZSA9IHRoaXMucXVlc3Rpb25NYXRyaXgudmlzaWJsZUNvbHVtbnNbaV07XG4gICAgICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTnVtYmVyOiBudW1iZXIgPSB0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MgPyBpICsgMSA6IGk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQsIGNvbHVtbk51bWJlcik7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzQ2VsbFRleHQpIHtcbiAgICAgICAgICAgICAgICBjZWxscy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVUZXh0Q29tcG9zaXRlKGN1cnJQb2ludCwgY29sdW1uLCBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgICAgICAgICAgY2VsbHMucHVzaCh0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIGN1cnJQb2ludC54TGVmdCksIGNvbHVtbiwgaSwgdGhpcy5rZXksIGNoZWNrZWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soLi4uY2VsbHMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzVmVydGljYWxseUNlbGxzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd1RleHRGbGF0ID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeCxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucm93LmxvY1RleHQsIFRleHRCcmljayk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd1RleHRGbGF0LnlCb3QgKyBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgY2VsbHMucHVzaChyb3dUZXh0RmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUgPSAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNDZWxsVGV4dCkgPyB0aGlzLmdlbmVyYXRlVGV4dENvbXBvc2l0ZSA6IHRoaXMuZ2VuZXJhdGVJdGVtQ29tcG9pc3RlO1xuICAgICAgICBjZWxscy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVWZXJ0aWNhbGx5SXRlbXMoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zKSk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayguLi5jZWxscyk7XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlQnJpY2ssIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlQnJpY2spLCB0aGlzLmNvbnRyb2xsZXIpXTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ21hdHJpeCcsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4Jywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdsaXN0J11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignbWF0cml4JywgRmxhdE1hdHJpeCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBTZXJpYWxpemVyIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IEZsYXRNYXRyaXhNdWx0aXBsZSB9IGZyb20gJy4vZmxhdF9tYXRyaXhtdWx0aXBsZSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4RHluYW1pYyBleHRlbmRzIEZsYXRNYXRyaXhNdWx0aXBsZSB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBmYWxzZSk7XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXhkeW5hbWljJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdtYXRyaXhkeW5hbWljJywge1xuICAgIG5hbWU6ICdyZW5kZXJBcycsXG4gICAgZGVmYXVsdDogJ2F1dG8nLFxuICAgIGNob2ljZXM6IFsnYXV0bycsICdsaXN0J11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignbWF0cml4ZHluYW1pYycsIEZsYXRNYXRyaXhEeW5hbWljKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhkeW5hbWljLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsLCBNdWx0aXBsZVRleHRJdGVtTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uLCBJRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0VGV4dGJveCB9IGZyb20gJy4vZmxhdF90ZXh0Ym94JztcblxuZXhwb3J0IGNsYXNzIEZsYXRNdWx0aXBsZVRleHQgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUk9XU19HQVBfU0NBTEU6IG51bWJlciA9IDAuMTk1O1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbk11bHRpcGxlVGV4dE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdEl0ZW0ocG9pbnQ6IElQb2ludCwgcm93X2luZGV4OiBudW1iZXIsIGNvbF9pbmRleDogbnVtYmVyLFxuICAgICAgICBpdGVtOiBNdWx0aXBsZVRleHRJdGVtTW9kZWwpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBjb2xXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gY29sV2lkdGggKiBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUztcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLlxuICAgICAgICAgICAgY3JlYXRlQm9sZFRleHRGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubG9jVGl0bGUpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcblxuICAgICAgICBjb25zdCBmbGF0TXVsdGlwbGVUZXh0SXRlbVF1ZXN0aW9uOiBJRmxhdFF1ZXN0aW9uID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUoXG4gICAgICAgICAgICB0aGlzLnN1cnZleSwgaXRlbS5lZGl0b3IsIHRoaXMuY29udHJvbGxlciwgJ3RleHQnKTtcbiAgICAgICAgY29uc3QgaXRlbVBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZpZWxkUmVjdCh7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQgKyBjb2xXaWR0aCAqIFN1cnZleUhlbHBlci5NVUxUSVBMRVRFWFRfVEVYVF9QRVJTLCB5VG9wOiBwb2ludC55VG9wIH0sXG4gICAgICAgIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soLi4uYXdhaXQgKDxGbGF0VGV4dGJveD5mbGF0TXVsdGlwbGVUZXh0SXRlbVF1ZXN0aW9uKS5nZW5lcmF0ZUZsYXRzQ29udGVudChpdGVtUG9pbnQpKTtcblxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnF1ZXN0aW9uLmdldFJvd3MoKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgIGxldCB5Qm90OiBudW1iZXIgPSBjdXJyUG9pbnQueVRvcDtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHJvd3NbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24uY29sQ291bnQsIGopO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBpLCBqLCByb3dzW2ldW2pdKTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICB5Qm90ID0gTWF0aC5tYXgoeUJvdCwgaXRlbUZsYXQueUJvdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0geUJvdDtcbiAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdE11bHRpcGxlVGV4dC5ST1dTX0dBUF9TQ0FMRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignbXVsdGlwbGV0ZXh0JywgRmxhdE11bHRpcGxlVGV4dCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbXVsdGlwbGV0ZXh0LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRTdXJ2ZXkgfSBmcm9tICcuL2ZsYXRfc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFBhbmVsRHluYW1pYyBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgR0FQX0JFVFdFRU5fUEFORUxTOiBudW1iZXIgPSAwLjc1O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUGFuZWxEeW5hbWljTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBmb3IgKGNvbnN0IHBhbmVsIG9mIHRoaXMucXVlc3Rpb24ucGFuZWxzKSB7XG4gICAgICAgICAgICBjb25zdCBwYW5lbEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IEZsYXRTdXJ2ZXkuZ2VuZXJhdGVGbGF0c1BhbmVsKFxuICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCB0aGlzLmNvbnRyb2xsZXIsIHBhbmVsLCBjdXJyUG9pbnQpO1xuICAgICAgICAgICAgaWYgKHBhbmVsRmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5wYW5lbEZsYXRzKS55Qm90O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFBhbmVsRHluYW1pYy5HQVBfQkVUV0VFTl9QQU5FTFM7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5wYW5lbEZsYXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdwYW5lbGR5bmFtaWMnLCBGbGF0UGFuZWxEeW5hbWljKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9wYW5lbGR5bmFtaWMudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25SYW5raW5nTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgUmFua2luZ0l0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhbmtpbmcgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYW5raW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25SYW5raW5nTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1TY2FsZWRSZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5tb3ZlUmVjdChTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KFxuICAgICAgICAgICAgaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSwgcG9pbnQueExlZnQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gbmV3IFJhbmtpbmdJdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgaXRlbVNjYWxlZFJlY3QsIHRoaXMucXVlc3Rpb24uZ2V0TnVtYmVyQnlJbmRleChpbmRleCkpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCB0ZXh0RmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubG9jVGV4dCwgVGV4dEJyaWNrKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCcmljayhpdGVtRmxhdCwgdGV4dEZsYXQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBmbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdENvbXBvc2l0ZShjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb24ucmFua2luZ0Nob2ljZXNbaV0sIGkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBpdGVtRmxhdC55Qm90ICsgU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGZsYXRzLnB1c2goaXRlbUZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3JhbmtpbmcnLCBGbGF0UmFua2luZyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmFua2luZy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvblJhdGluZ01vZGVsLCBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJhZGlvZ3JvdXAgfSBmcm9tICcuL2ZsYXRfcmFkaW9ncm91cCc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0UmF0aW5nIGV4dGVuZHMgRmxhdFJhZGlvZ3JvdXAge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvblJhdGluZzogUXVlc3Rpb25SYXRpbmdNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZyA9IDxRdWVzdGlvblJhdGluZ01vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0SG9yaXNvbnRhbENvbXBvc2l0ZShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBpdGVtVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nSXRlbVRleHQoXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uUmF0aW5nLCBpbmRleCwgaXRlbS5sb2NUZXh0KTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGNvbnN0IGhhbGZXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAvIDIuMDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSBoYWxmV2lkdGg7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICs9IGhhbGZXaWR0aDtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgKz0gaGFsZldpZHRoO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuXG4gICAgICAgICAgICBjcmVhdGVCb2xkVGV4dEZsYXQodGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uUmF0aW5nLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW1UZXh0KSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIGxldCB0ZXh0V2lkdGg6IG51bWJlciA9IGNvbXBvc2l0ZUZsYXQud2lkdGg7XG4gICAgICAgIGlmICh0ZXh0V2lkdGggPCBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgodGhpcy5jb250cm9sbGVyKSkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC54TGVmdCArPSAoU3VydmV5SGVscGVyLmdldFJhdGluZ01pbldpZHRoKFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcikgLSB0ZXh0V2lkdGgpIC8gMi4wIC0gaGFsZldpZHRoO1xuICAgICAgICAgICAgdGV4dFdpZHRoID0gU3VydmV5SGVscGVyLmdldFJhdGluZ01pbldpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ZXh0V2lkdGggKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYWRpb1BvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgIHJhZGlvUG9pbnQueExlZnQgPSBwb2ludC54TGVmdDtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayh0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoXG4gICAgICAgICAgICByYWRpb1BvaW50LCB0ZXh0V2lkdGgsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KSwgaXRlbSwgaW5kZXgpKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoaXRlbVJlY3QsIFN1cnZleUhlbHBlci5TRUxFQ1RfSVRFTV9GTEFUX1NDQUxFKSxcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0KSwgaXRlbSwgaW5kZXgpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgaXRlbVRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gU3VydmV5SGVscGVyLmdldFJhdGluZ0l0ZW1UZXh0KHRoaXMucXVlc3Rpb25SYXRpbmcsIGluZGV4LCBpdGVtLmxvY1RleHQpO1xuICAgICAgICBpdGVtVGV4dCA9PSBudWxsIHx8IGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW1UZXh0LCBUZXh0QnJpY2spKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50OiBJUG9pbnQpIHtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW25ldyBDb21wb3NpdGVCcmljaygpXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SG9yaXNvbnRhbENvbXBvc2l0ZShjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlc1tpXSwgaSk7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnRXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gaXRlbUZsYXQueFJpZ2h0O1xuICAgICAgICAgICAgaWYgKFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpIDw9IGxlZnRXaWR0aCArIFN1cnZleUhlbHBlci5FUFNJTE9OKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBpdGVtRmxhdC55Qm90O1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2gobmV3IENvbXBvc2l0ZUJyaWNrKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IGlzVmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dChcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uUmF0aW5nLCBpLCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzW2ldLmxvY1RleHQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChpdGVtVGV4dCkud2lkdGggPiB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLlJBVElOR19DT0xVTU5fV0lEVEgpLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzVmVydGljYWwgPyB0aGlzLmdlbmVyYXRlVmVydGljYWxseUl0ZW1zKHBvaW50LCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzKSA6IHRoaXMuZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYXRpbmcnLCBGbGF0UmF0aW5nKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYXRpbmcudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0U2lnbmF0dXJlUGFkIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uU2lnbmF0dXJlUGFkTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IGltYWdlQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnZhbHVlLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24ud2lkdGgpLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uaGVpZ2h0KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gW2ltYWdlQnJpY2tdO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3Rlcignc2lnbmF0dXJlcGFkJywgRmxhdFNpZ25hdHVyZVBhZCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfc2lnbmF0dXJlcGFkLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblRleHRNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJveEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJveCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRUZXh0Ym94IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1VTFRJTElORV9URVhUX1JPV1NfQ09VTlQ6IG51bWJlciA9IDE7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblRleHRNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbGxlci50ZXh0RmllbGRSZW5kZXJBcyA9PT0gJ3NpbmdsZUxpbmUnKSB7XG4gICAgICAgICAgICBjb25zdCByZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgVGV4dEJveEJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgcmVjdCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBGbGF0VGV4dGJveC5NVUxUSUxJTkVfVEVYVF9ST1dTX0NPVU5ULCB0cnVlKV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCd0ZXh0JywgRmxhdFRleHRib3gpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3RleHRib3gudHMiLCJpbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IERvY0NvbnRyb2xsZXIsIElSZWN0IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG5cbiAgICBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBwcml2YXRlIHJlbmRlckZ1bmM6IChkb2M6IGFueSwgcXVlc3Rpb246IGFueSwgeExlZnQ6IG51bWJlciwgeVRvcDogbnVtYmVyKSA9PiBJUmVjdCkge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVuZGVyRnVuYyhjb250cm9sbGVyLmhlbHBlckRvYywgcXVlc3Rpb24sIDAsIDApKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJGdW5jKHRoaXMuY29udHJvbGxlci5kb2MsIHRoaXMucXVlc3Rpb24sIHRoaXMueExlZnQsIHRoaXMueVRvcCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY3VzdG9tLnRzIiwiaW1wb3J0IHsgU3VydmV5TW9kZWwsIEV2ZW50LCBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBQYWdlUGFja2VyIH0gZnJvbSAnLi9wYWdlX2xheW91dC9wYWdlX3BhY2tlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IEV2ZW50QXN5bmMsIEV2ZW50SGFuZGxlciB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyJztcbmltcG9ydCB7IERyYXdDYW52YXMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMnO1xuaW1wb3J0IHsgQWRvcm5lcnNPcHRpb25zLCBBZG9ybmVyc1BhbmVsT3B0aW9ucywgQWRvcm5lcnNQYWdlT3B0aW9ucyB9IGZyb20gJy4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuL2hlbHBlcl9zdXJ2ZXknO1xuXG4vKipcbiAqIFN1cnZleVBERiBvYmplY3QgY29udGFpbnMgb3B0aW9ucywgZXZlbnRzIGFuZCBtZXRob2RzIHRvIGV4cG9ydCBQREZcbiAqL1xuZXhwb3J0IGNsYXNzIFN1cnZleVBERiBleHRlbmRzIFN1cnZleU1vZGVsIHtcbiAgICBwcml2YXRlIF9oYXZlQ29tbWVyY2lhbExpY2Vuc2U6IGJvb2xlYW47XG4gICAgcHVibGljIG9wdGlvbnM6IElEb2NPcHRpb25zO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihqc29uT2JqZWN0OiBhbnksIG9wdGlvbnM/OiBJRG9jT3B0aW9ucykge1xuICAgICAgICBzdXBlcihqc29uT2JqZWN0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFN1cnZleUhlbHBlci5jbG9uZShvcHRpb25zKTtcbiAgICAgICAgdGhpcy5faGF2ZUNvbW1lcmNpYWxMaWNlbnNlID0gb3B0aW9ucy5jb21tZXJjaWFsIHx8IG9wdGlvbnMuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBZb3UgaGF2ZSByaWdodCB0byBzZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIGlmIHlvdSBoYXZlIGJvdWdodCB0aGUgY29tbWVyY2lhbCBsaWNlbmNlIG9ubHkuXG4gICAgICogSXQgd2lsbCByZW1vdmUgdGhlIHRleHQgYWJvdXQgbm9uLWNvbW1lcmljYWwgdXNhZ2Ugb24gdGhlIHRvcCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogU2V0dGluZyB0aGlzIHByb3BlcnR5IHRydWUgd2l0aG91dCBoYXZpbmcgYSBjb21tZXJjaWFsIGxpY2VuY2UgaXMgaWxsZWdhbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faGF2ZUNvbW1lcmNpYWxMaWNlbnNlO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGhhdmVDb21tZXJjaWFsTGljZW5zZSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faGF2ZUNvbW1lcmNpYWxMaWNlbnNlID0gdmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaW4gZmlyZWQgZm9yIGV2ZXJ5IHJlbmRlcmVkIHBhZ2VcbiAgICAgKiBAcGFyYW0gc3VydmV5IFN1cnZleVBERiBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0gY2FudmFzIERyYXdDYW52YXMgb2JqZWN0IHRoYXQgeW91IG1heSB1c2UgaXQgdG8gZHJhdyB0ZXh0IGFuZCBpbWFnZXMgaW4gdGhlIHBhZ2UgaGVhZGVyXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVySGVhZGVyOiBFdmVudDwoc3VydmV5OiBTdXJ2ZXlQREYsIGNhbnZhczogRHJhd0NhbnZhcykgPT4gYW55LCBhbnk+ID1cbiAgICAgICAgbmV3IEV2ZW50PChzdXJ2ZXk6IFN1cnZleVBERiwgY2FudmFzOiBEcmF3Q2FudmFzKSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaW4gZmlyZWQgZm9yIGV2ZXJ5IHJlbmRlcmVkIHBhZ2VcbiAgICAgKiBAcGFyYW0gc3VydmV5IFN1cnZleVBERiBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0gY2FudmFzIERyYXdDYW52YXMgb2JqZWN0IHRoYXQgeW91IG1heSB1c2UgaXQgdG8gZHJhdyB0ZXh0IGFuZCBpbWFnZXMgaW4gdGhlIHBhZ2UgZm9vdGVyXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyRm9vdGVyOiBFdmVudDwoc3VydmV5OiBTdXJ2ZXlQREYsIGNhbnZhczogRHJhd0NhbnZhcykgPT4gYW55LCBhbnk+ID1cbiAgICAgICAgbmV3IEV2ZW50PChzdXJ2ZXk6IFN1cnZleVBERiwgY2FudmFzOiBEcmF3Q2FudmFzKSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaW4gZmlyZWQgZm9yIGV2ZXJ5IHJlbmRlcmVkIHF1ZXN0aW9uXG4gICAgICogQHBhcmFtIHN1cnZleSBTdXJ2ZXlQREYgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIG9wdGlvbnMgQWRvcm5lcnNPcHRpb25zIG9iamVjdCB0aGF0IGhhdmUgb3B0aW9ucyB0byBjdXN0b20gcmVuZGVyIHRoZSBxdWVzdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlclF1ZXN0aW9uOiBFdmVudEFzeW5jPChzdXJ2ZXk6IFN1cnZleVBERiwgb3B0aW9uczogQWRvcm5lcnNPcHRpb25zKSA9PiBhbnksIGFueT4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzwoc3VydmV5OiBTdXJ2ZXlQREYsIG9wdGlvbnM6IEFkb3JuZXJzT3B0aW9ucykgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGluIGZpcmVkIGZvciBldmVyeSByZW5kZXJlZCBwYW5lbFxuICAgICAqIEBwYXJhbSBzdXJ2ZXkgU3VydmV5UERGIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFkb3JuZXJzUGFuZWxPcHRpb25zIG9iamVjdCB0aGF0IGhhdmUgb3B0aW9ucyB0byBjdXN0b20gcmVuZGVyIHRoZSBwYW5lbFxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlclBhbmVsOiBFdmVudEFzeW5jPChzdXJ2ZXk6IFN1cnZleVBERiwgb3B0aW9uczogQWRvcm5lcnNQYW5lbE9wdGlvbnMpID0+IGFueSwgYW55PiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPChzdXJ2ZXk6IFN1cnZleVBERiwgb3B0aW9uczogQWRvcm5lcnNQYW5lbE9wdGlvbnMpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpbiBmaXJlZCBmb3IgZXZlcnkgcmVuZGVyZWQgcGFnZVxuICAgICAqIEBwYXJhbSBzdXJ2ZXkgU3VydmV5UERGIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFkb3JuZXJzUGFnZU9wdGlvbnMgb2JqZWN0IHRoYXQgaGF2ZSBvcHRpb25zIHRvIGN1c3RvbSByZW5kZXIgdGhlIHBhZ2VcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJQYWdlOiBFdmVudEFzeW5jPChzdXJ2ZXk6IFN1cnZleVBERiwgb3B0aW9uczogQWRvcm5lcnNQYWdlT3B0aW9ucykgPT4gYW55LCBhbnk+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8KHN1cnZleTogU3VydmV5UERGLCBvcHRpb25zOiBBZG9ybmVyc1BhZ2VPcHRpb25zKSA9PiBhbnksIGFueT4oKTtcbiAgICBwcml2YXRlIHdhaXRGb3JRdWVzdGlvbklzUmVhZHkocXVlc3Rpb246IFF1ZXN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocXVlc3Rpb24uaXNSZWFkeSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlYWR5Q2FsbGJhY2s6IChzZW5kZXI6IFF1ZXN0aW9uLCBvcHRpb25zOiBhbnkpID0+IHZvaWQgPVxuICAgICAgICAgICAgICAgIChfLCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaXNSZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb24ub25SZWFkeUNoYW5nZWQucmVtb3ZlKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBxdWVzdGlvbi5vblJlYWR5Q2hhbmdlZC5hZGQocmVhZHlDYWxsYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIHdhaXRGb3JDb3JlSXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBxdWVzdGlvbiBvZiB0aGlzLmdldEFsbFF1ZXN0aW9ucygpKSB7XG4gICAgICAgICAgICBpZiAoISEoPGFueT5xdWVzdGlvbikuY29udGVudFBhbmVsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdDogUXVlc3Rpb25bXSA9IFtdO1xuICAgICAgICAgICAgICAgICg8YW55PnF1ZXN0aW9uKS5jb250ZW50UGFuZWwuYWRkUXVlc3Rpb25zVG9MaXN0KGxpc3QpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW5uZXJRdWVzdGlvbiBvZiBsaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclF1ZXN0aW9uSXNSZWFkeShpbm5lclF1ZXN0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGF3YWl0IHRoaXMud2FpdEZvclF1ZXN0aW9uSXNSZWFkeShcbiAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0Q29udGVudFF1ZXN0aW9uKDxRdWVzdGlvbj5xdWVzdGlvbikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgcmVuZGVyU3VydmV5KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQ29yZUlzUmVhZHkoKTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdW10gPSBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHModGhpcywgY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IHBhY2tzOiBJUGRmQnJpY2tbXVtdID0gUGFnZVBhY2tlci5wYWNrKGZsYXRzLCBjb250cm9sbGVyKTtcbiAgICAgICAgRXZlbnRIYW5kbGVyLnByb2Nlc3NfaGVhZGVyX2V2ZW50cyh0aGlzLCBjb250cm9sbGVyLCBwYWNrcyk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBwYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IHBhY2tzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuZ2V0TnVtYmVyT2ZQYWdlcygpID09PSBpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnNldFBhZ2UoaSk7XG4gICAgICAgICAgICAgICAgLy9naXptb3MgYnJpY2tzIGJvcmRlcnMgZm9yIGRlYnVnXG4gICAgICAgICAgICAgICAgLy8gcGFja3NbaV1bal0udW5mb2xkKCkuZm9yRWFjaCgocmVjdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcignZ3JlZW4nKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udHJvbGxlci5kb2MucmVjdCguLi5TdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KHJlY3QpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKCdibGFjaycpO1xuICAgICAgICAgICAgICAgIC8vICAgfVxuICAgICAgICAgICAgICAgIC8vICk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFja3NbaV1bal0ucmVuZGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBzYXZlIG1ldGhvZCBvZiBzdXJ2ZXlQREYgb2JqZWN0IHRvIGRvd25sb2FkIGZpbGUgaW4gYnJvd3Nlci4gVGhpcyBpcyBhc3luY2hyb25vdXMgbWV0aG9kXG4gICAgICogQHBhcmFtIGZpbGVOYW1lIG9wdGlvbmFsIGZpbGVuYW1lIHBhcmFtZXRlclxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzYXZlKGZpbGVOYW1lOiBzdHJpbmcgPSAnc3VydmV5X3Jlc3VsdC5wZGYnKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG5ldyBEb2NDb250cm9sbGVyKHRoaXMub3B0aW9ucyk7XG4gICAgICAgIFN1cnZleUhlbHBlci5maXhGb250KGNvbnRyb2xsZXIpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclN1cnZleShjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZG9jLnNhdmUoZmlsZU5hbWUsIHsgcmV0dXJuUHJvbWlzZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCByYXcgbWV0aG9kIG9mIHN1cnZleVBERiB0byBnZXQgUERGIGRvY3VtZW50IGFzIHN0cmluZyBvYmplY3QuIFRoaXMgaXMgYXN5bmNocm9ub3VzIG1ldGhvZFxuICAgICAqIEBwYXJhbSB0eXBlIG9taXQgdG8gZ2V0IHJhdyBzdHJpbmcsIG9yIHBhc3MgXCJibG9iXCIsIFwiYmxvYnVybFwiIG9yIFwiZGF0YXVybHN0cmluZ1wiXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHJhdyh0eXBlPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciA9IG5ldyBEb2NDb250cm9sbGVyKHRoaXMub3B0aW9ucyk7XG4gICAgICAgIFN1cnZleUhlbHBlci5maXhGb250KGNvbnRyb2xsZXIpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlclN1cnZleShjb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZG9jLm91dHB1dCh0eXBlKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc3VydmV5LnRzIiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbi8vIEFuIGF1Z21lbnRlZCBBVkwgVHJlZSB3aGVyZSBlYWNoIG5vZGUgbWFpbnRhaW5zIGEgbGlzdCBvZiByZWNvcmRzIGFuZCB0aGVpciBzZWFyY2ggaW50ZXJ2YWxzLlxyXG4vLyBSZWNvcmQgaXMgY29tcG9zZWQgb2YgYW4gaW50ZXJ2YWwgYW5kIGl0cyB1bmRlcmx5aW5nIGRhdGEsIHNlbnQgYnkgYSBjbGllbnQuIFRoaXMgYWxsb3dzIHRoZVxyXG4vLyBpbnRlcnZhbCB0cmVlIHRvIGhhdmUgdGhlIHNhbWUgaW50ZXJ2YWwgaW5zZXJ0ZWQgbXVsdGlwbGUgdGltZXMsIGFzIGxvbmcgaXRzIGRhdGEgaXMgZGlmZmVyZW50LlxyXG4vLyBCb3RoIGluc2VydGlvbiBhbmQgZGVsZXRpb24gcmVxdWlyZSBPKGxvZyBuKSB0aW1lLiBTZWFyY2hpbmcgcmVxdWlyZXMgTyhrKmxvZ24pIHRpbWUsIHdoZXJlIGBrYFxyXG4vLyBpcyB0aGUgbnVtYmVyIG9mIGludGVydmFscyBpbiB0aGUgb3V0cHV0IGxpc3QuXHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxudmFyIGlzU2FtZSA9IHJlcXVpcmUoXCJzaGFsbG93ZXF1YWxcIik7XHJcbmZ1bmN0aW9uIGhlaWdodChub2RlKSB7XHJcbiAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUuaGVpZ2h0O1xyXG4gICAgfVxyXG59XHJcbnZhciBOb2RlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gTm9kZShpbnRlcnZhbFRyZWUsIHJlY29yZCkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJ2YWxUcmVlID0gaW50ZXJ2YWxUcmVlO1xyXG4gICAgICAgIHRoaXMucmVjb3JkcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMDtcclxuICAgICAgICB0aGlzLmtleSA9IHJlY29yZC5sb3c7XHJcbiAgICAgICAgdGhpcy5tYXggPSByZWNvcmQuaGlnaDtcclxuICAgICAgICAvLyBTYXZlIHRoZSBhcnJheSBvZiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBzYW1lIGtleSBmb3IgdGhpcyBub2RlXHJcbiAgICAgICAgdGhpcy5yZWNvcmRzLnB1c2gocmVjb3JkKTtcclxuICAgIH1cclxuICAgIC8vIEdldHMgdGhlIGhpZ2hlc3QgcmVjb3JkLmhpZ2ggdmFsdWUgZm9yIHRoaXMgbm9kZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuZ2V0Tm9kZUhpZ2ggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGhpZ2ggPSB0aGlzLnJlY29yZHNbMF0uaGlnaDtcclxuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRzW2ldLmhpZ2ggPiBoaWdoKSB7XHJcbiAgICAgICAgICAgICAgICBoaWdoID0gdGhpcy5yZWNvcmRzW2ldLmhpZ2g7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGhpZ2g7XHJcbiAgICB9O1xyXG4gICAgLy8gVXBkYXRlcyBoZWlnaHQgdmFsdWUgb2YgdGhlIG5vZGUuIENhbGxlZCBkdXJpbmcgaW5zZXJ0aW9uLCByZWJhbGFuY2UsIHJlbW92YWxcclxuICAgIE5vZGUucHJvdG90eXBlLnVwZGF0ZUhlaWdodCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IE1hdGgubWF4KGhlaWdodCh0aGlzLmxlZnQpLCBoZWlnaHQodGhpcy5yaWdodCkpICsgMTtcclxuICAgIH07XHJcbiAgICAvLyBVcGRhdGVzIHRoZSBtYXggdmFsdWUgb2YgYWxsIHRoZSBwYXJlbnRzIGFmdGVyIGluc2VydGluZyBpbnRvIGFscmVhZHkgZXhpc3Rpbmcgbm9kZSwgYXMgd2VsbCBhc1xyXG4gICAgLy8gcmVtb3ZpbmcgdGhlIG5vZGUgY29tcGxldGVseSBvciByZW1vdmluZyB0aGUgcmVjb3JkIG9mIGFuIGFscmVhZHkgZXhpc3Rpbmcgbm9kZS4gU3RhcnRzIHdpdGhcclxuICAgIC8vIHRoZSBwYXJlbnQgb2YgYW4gYWZmZWN0ZWQgbm9kZSBhbmQgYnViYmxlcyB1cCB0byByb290XHJcbiAgICBOb2RlLnByb3RvdHlwZS51cGRhdGVNYXhPZlBhcmVudHMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciB0aGlzSGlnaCA9IHRoaXMuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpcy5yaWdodC5tYXgpLCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpcy5yaWdodC5tYXgsIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpc0hpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLypcclxuICAgIExlZnQtTGVmdCBjYXNlOlxyXG4gIFxyXG4gICAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlcclxuICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgICAgICB5ICAgVDQgICAgICBSaWdodCBSb3RhdGUgKHopICAgICAgICAgIHggICAgIHpcclxuICAgICAgICAvIFxcICAgICAgICAgIC0gLSAtIC0gLSAtIC0gLSAtPiAgICAgICAvIFxcICAgLyBcXFxyXG4gICAgICAgeCAgIFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAvIFxcXHJcbiAgICBUMSAgIFQyXHJcbiAgXHJcbiAgICBMZWZ0LVJpZ2h0IGNhc2U6XHJcbiAgXHJcbiAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgIHhcclxuICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICAgICB5ICAgVDQgIExlZnQgUm90YXRlICh5KSAgICAgICAgIHggIFQ0ICBSaWdodCBSb3RhdGUoeikgICAgIHkgICAgIHpcclxuICAgICAgLyBcXCAgICAgIC0gLSAtIC0gLSAtIC0gLSAtPiAgICAgLyBcXCAgICAgIC0gLSAtIC0gLSAtIC0gLT4gIC8gXFwgICAvIFxcXHJcbiAgICBUMSAgIHggICAgICAgICAgICAgICAgICAgICAgICAgICB5ICBUMyAgICAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXFxyXG4gICAgICBUMiAgIFQzICAgICAgICAgICAgICAgICAgICAgIFQxIFQyXHJcbiAgICAqL1xyXG4gICAgLy8gSGFuZGxlcyBMZWZ0LUxlZnQgY2FzZSBhbmQgTGVmdC1SaWdodCBjYXNlIGFmdGVyIHJlYmFsYW5jaW5nIEFWTCB0cmVlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5fdXBkYXRlTWF4QWZ0ZXJSaWdodFJvdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgdmFyIGxlZnQgPSBwYXJlbnQubGVmdDtcclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIGxlZnQgc2libGluZyAoeCBpbiBmaXJzdCBjYXNlLCB5IGluIHNlY29uZClcclxuICAgICAgICB2YXIgdGhpc1BhcmVudExlZnRIaWdoID0gbGVmdC5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmIChsZWZ0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiBsZWZ0LnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgbGVmdC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50TGVmdEhpZ2gsIGxlZnQucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobGVmdC5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgbGVmdC5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudExlZnRIaWdoLCBsZWZ0LmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobGVmdC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgbGVmdC5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gdGhpc1BhcmVudExlZnRIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbGVmdC5tYXggPSBNYXRoLm1heChNYXRoLm1heChsZWZ0LmxlZnQubWF4LCBsZWZ0LnJpZ2h0Lm1heCksIHRoaXNQYXJlbnRMZWZ0SGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgaXRzZWxmICh6KVxyXG4gICAgICAgIHZhciB0aGlzSGlnaCA9IHRoaXMuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzSGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpcy5yaWdodC5tYXgpLCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgcGFyZW50ICh5IGluIGZpcnN0IGNhc2UsIHggaW4gc2Vjb25kKVxyXG4gICAgICAgIHBhcmVudC5tYXggPSBNYXRoLm1heChNYXRoLm1heChwYXJlbnQubGVmdC5tYXgsIHBhcmVudC5yaWdodC5tYXgpLCBwYXJlbnQuZ2V0Tm9kZUhpZ2goKSk7XHJcbiAgICB9O1xyXG4gICAgLypcclxuICAgIFJpZ2h0LVJpZ2h0IGNhc2U6XHJcbiAgXHJcbiAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVxyXG4gICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICBUMSAgeSAgICAgTGVmdCBSb3RhdGUoeikgICAgICAgeiAgICAgeFxyXG4gICAgICAgLyBcXCAgIC0gLSAtIC0gLSAtIC0gLT4gICAgIC8gXFwgICAvIFxcXHJcbiAgICAgIFQyICB4ICAgICAgICAgICAgICAgICAgICAgIFQxIFQyIFQzIFQ0XHJcbiAgICAgICAgIC8gXFxcclxuICAgICAgICBUMyBUNFxyXG4gIFxyXG4gICAgUmlnaHQtTGVmdCBjYXNlOlxyXG4gIFxyXG4gICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhcclxuICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgICBUMSAgeSAgIFJpZ2h0IFJvdGF0ZSAoeSkgICAgIFQxICB4ICAgICAgTGVmdCBSb3RhdGUoeikgICB6ICAgICB5XHJcbiAgICAgICAgLyBcXCAgLSAtIC0gLSAtIC0gLSAtIC0+ICAgICAgLyBcXCAgIC0gLSAtIC0gLSAtIC0gLT4gIC8gXFwgICAvIFxcXHJcbiAgICAgICB4ICBUNCAgICAgICAgICAgICAgICAgICAgICAgIFQyICB5ICAgICAgICAgICAgICAgICAgIFQxIFQyIFQzIFQ0XHJcbiAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIFxcXHJcbiAgICBUMiAgIFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgVDMgVDRcclxuICAgICovXHJcbiAgICAvLyBIYW5kbGVzIFJpZ2h0LVJpZ2h0IGNhc2UgYW5kIFJpZ2h0LUxlZnQgY2FzZSBpbiByZWJhbGFuY2luZyBBVkwgdHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgdmFyIHJpZ2h0ID0gcGFyZW50LnJpZ2h0O1xyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgcmlnaHQgc2libGluZyAoeCBpbiBmaXJzdCBjYXNlLCB5IGluIHNlY29uZClcclxuICAgICAgICB2YXIgdGhpc1BhcmVudFJpZ2h0SGlnaCA9IHJpZ2h0LmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHJpZ2h0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiByaWdodC5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRSaWdodEhpZ2gsIHJpZ2h0LnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJpZ2h0LmxlZnQgIT09IHVuZGVmaW5lZCAmJiByaWdodC5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRSaWdodEhpZ2gsIHJpZ2h0LmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmlnaHQubGVmdCA9PT0gdW5kZWZpbmVkICYmIHJpZ2h0LnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmlnaHQubWF4ID0gdGhpc1BhcmVudFJpZ2h0SGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJpZ2h0Lm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHJpZ2h0LmxlZnQubWF4LCByaWdodC5yaWdodC5tYXgpLCB0aGlzUGFyZW50UmlnaHRIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBpdHNlbGYgKHopXHJcbiAgICAgICAgdmFyIHRoaXNIaWdoID0gdGhpcy5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzSGlnaCwgdGhpcy5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzSGlnaCwgdGhpcy5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXNIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heChNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzLnJpZ2h0Lm1heCksIHRoaXNIaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBwYXJlbnQgKHkgaW4gZmlyc3QgY2FzZSwgeCBpbiBzZWNvbmQpXHJcbiAgICAgICAgcGFyZW50Lm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHBhcmVudC5sZWZ0Lm1heCwgcmlnaHQubWF4KSwgcGFyZW50LmdldE5vZGVIaWdoKCkpO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLl9sZWZ0Um90YXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciByaWdodENoaWxkID0gdGhpcy5yaWdodDtcclxuICAgICAgICByaWdodENoaWxkLnBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIGlmIChyaWdodENoaWxkLnBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW50ZXJ2YWxUcmVlLnJvb3QgPSByaWdodENoaWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHJpZ2h0Q2hpbGQucGFyZW50LmxlZnQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIHJpZ2h0Q2hpbGQucGFyZW50LmxlZnQgPSByaWdodENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHJpZ2h0Q2hpbGQucGFyZW50LnJpZ2h0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICByaWdodENoaWxkLnBhcmVudC5yaWdodCA9IHJpZ2h0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yaWdodCA9IHJpZ2h0Q2hpbGQubGVmdDtcclxuICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmlnaHRDaGlsZC5sZWZ0ID0gdGhpcztcclxuICAgICAgICB0aGlzLnBhcmVudCA9IHJpZ2h0Q2hpbGQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICByaWdodENoaWxkLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLl9yaWdodFJvdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgbGVmdENoaWxkID0gdGhpcy5sZWZ0O1xyXG4gICAgICAgIGxlZnRDaGlsZC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICBpZiAobGVmdENoaWxkLnBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW50ZXJ2YWxUcmVlLnJvb3QgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobGVmdENoaWxkLnBhcmVudC5sZWZ0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0Q2hpbGQucGFyZW50LmxlZnQgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobGVmdENoaWxkLnBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgbGVmdENoaWxkLnBhcmVudC5yaWdodCA9IGxlZnRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxlZnQgPSBsZWZ0Q2hpbGQucmlnaHQ7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZWZ0Q2hpbGQucmlnaHQgPSB0aGlzO1xyXG4gICAgICAgIHRoaXMucGFyZW50ID0gbGVmdENoaWxkO1xyXG4gICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgbGVmdENoaWxkLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgfTtcclxuICAgIC8vIFJlYmFsYW5jZXMgdGhlIHRyZWUgaWYgdGhlIGhlaWdodCB2YWx1ZSBiZXR3ZWVuIHR3byBub2RlcyBvZiB0aGUgc2FtZSBwYXJlbnQgaXMgZ3JlYXRlciB0aGFuXHJcbiAgICAvLyB0d28uIFRoZXJlIGFyZSA0IGNhc2VzIHRoYXQgY2FuIGhhcHBlbiB3aGljaCBhcmUgb3V0bGluZWQgaW4gdGhlIGdyYXBoaWNzIGFib3ZlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5fcmViYWxhbmNlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmIChoZWlnaHQodGhpcy5sZWZ0KSA+PSAyICsgaGVpZ2h0KHRoaXMucmlnaHQpKSB7XHJcbiAgICAgICAgICAgIHZhciBsZWZ0ID0gdGhpcy5sZWZ0O1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0KGxlZnQubGVmdCkgPj0gaGVpZ2h0KGxlZnQucmlnaHQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBMZWZ0LUxlZnQgY2FzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmlnaHRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyUmlnaHRSb3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIExlZnQtUmlnaHQgY2FzZVxyXG4gICAgICAgICAgICAgICAgbGVmdC5fbGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmlnaHRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyUmlnaHRSb3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChoZWlnaHQodGhpcy5yaWdodCkgPj0gMiArIGhlaWdodCh0aGlzLmxlZnQpKSB7XHJcbiAgICAgICAgICAgIHZhciByaWdodCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHQocmlnaHQucmlnaHQpID49IGhlaWdodChyaWdodC5sZWZ0KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gUmlnaHQtUmlnaHQgY2FzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4QWZ0ZXJMZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSaWdodC1MZWZ0IGNhc2VcclxuICAgICAgICAgICAgICAgIHJpZ2h0Ll9yaWdodFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWF4QWZ0ZXJMZWZ0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKHJlY29yZCkge1xyXG4gICAgICAgIGlmIChyZWNvcmQubG93IDwgdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgLy8gSW5zZXJ0IGludG8gbGVmdCBzdWJ0cmVlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0ID0gbmV3IE5vZGUodGhpcy5pbnRlcnZhbFRyZWUsIHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gdGhpcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdC5pbnNlcnQocmVjb3JkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gSW5zZXJ0IGludG8gcmlnaHQgc3VidHJlZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0ID0gbmV3IE5vZGUodGhpcy5pbnRlcnZhbFRyZWUsIHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0Lmluc2VydChyZWNvcmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgbWF4IHZhbHVlIG9mIHRoaXMgYW5jZXN0b3IgaWYgbmVlZGVkXHJcbiAgICAgICAgaWYgKHRoaXMubWF4IDwgcmVjb3JkLmhpZ2gpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSByZWNvcmQuaGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVXBkYXRlIGhlaWdodCBvZiBlYWNoIG5vZGVcclxuICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgIC8vIFJlYmFsYW5jZSB0aGUgdHJlZSB0byBlbnN1cmUgYWxsIG9wZXJhdGlvbnMgYXJlIGV4ZWN1dGVkIGluIE8obG9nbikgdGltZS4gVGhpcyBpcyBlc3BlY2lhbGx5XHJcbiAgICAgICAgLy8gaW1wb3J0YW50IGluIHNlYXJjaGluZywgYXMgdGhlIHRyZWUgaGFzIGEgaGlnaCBjaGFuY2Ugb2YgZGVnZW5lcmF0aW5nIHdpdGhvdXQgdGhlIHJlYmFsYW5jaW5nXHJcbiAgICAgICAgdGhpcy5fcmViYWxhbmNlKCk7XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuX2dldE92ZXJsYXBwaW5nUmVjb3JkcyA9IGZ1bmN0aW9uIChjdXJyZW50Tm9kZSwgbG93LCBoaWdoKSB7XHJcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlLmtleSA8PSBoaWdoICYmIGxvdyA8PSBjdXJyZW50Tm9kZS5nZXROb2RlSGlnaCgpKSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGVzIGFyZSBvdmVybGFwcGluZywgY2hlY2sgaWYgaW5kaXZpZHVhbCByZWNvcmRzIGluIHRoZSBub2RlIGFyZSBvdmVybGFwcGluZ1xyXG4gICAgICAgICAgICB2YXIgdGVtcFJlc3VsdHMgPSBbXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50Tm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUucmVjb3Jkc1tpXS5oaWdoID49IGxvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBSZXN1bHRzLnB1c2goY3VycmVudE5vZGUucmVjb3Jkc1tpXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRlbXBSZXN1bHRzO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUuc2VhcmNoID0gZnVuY3Rpb24gKGxvdywgaGlnaCkge1xyXG4gICAgICAgIC8vIERvbid0IHNlYXJjaCBub2RlcyB0aGF0IGRvbid0IGV4aXN0XHJcbiAgICAgICAgaWYgKHRoaXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBsZWZ0U2VhcmNoID0gW107XHJcbiAgICAgICAgdmFyIG93blNlYXJjaCA9IFtdO1xyXG4gICAgICAgIHZhciByaWdodFNlYXJjaCA9IFtdO1xyXG4gICAgICAgIC8vIElmIGludGVydmFsIGlzIHRvIHRoZSByaWdodCBvZiB0aGUgcmlnaHRtb3N0IHBvaW50IG9mIGFueSBpbnRlcnZhbCBpbiB0aGlzIG5vZGUgYW5kIGFsbCBpdHNcclxuICAgICAgICAvLyBjaGlsZHJlbiwgdGhlcmUgd29uJ3QgYmUgYW55IG1hdGNoZXNcclxuICAgICAgICBpZiAobG93ID4gdGhpcy5tYXgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBTZWFyY2ggbGVmdCBjaGlsZHJlblxyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmxlZnQubWF4ID49IGxvdykge1xyXG4gICAgICAgICAgICBsZWZ0U2VhcmNoID0gdGhpcy5sZWZ0LnNlYXJjaChsb3csIGhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBDaGVjayB0aGlzIG5vZGVcclxuICAgICAgICBvd25TZWFyY2ggPSB0aGlzLl9nZXRPdmVybGFwcGluZ1JlY29yZHModGhpcywgbG93LCBoaWdoKTtcclxuICAgICAgICAvLyBJZiBpbnRlcnZhbCBpcyB0byB0aGUgbGVmdCBvZiB0aGUgc3RhcnQgb2YgdGhpcyBpbnRlcnZhbCwgdGhlbiBpdCBjYW4ndCBiZSBpbiBhbnkgY2hpbGQgdG9cclxuICAgICAgICAvLyB0aGUgcmlnaHRcclxuICAgICAgICBpZiAoaGlnaCA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsZWZ0U2VhcmNoLmNvbmNhdChvd25TZWFyY2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBPdGhlcndpc2UsIHNlYXJjaCByaWdodCBjaGlsZHJlblxyXG4gICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmlnaHRTZWFyY2ggPSB0aGlzLnJpZ2h0LnNlYXJjaChsb3csIGhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBSZXR1cm4gYWNjdW11bGF0ZWQgcmVzdWx0cywgaWYgYW55XHJcbiAgICAgICAgcmV0dXJuIGxlZnRTZWFyY2guY29uY2F0KG93blNlYXJjaCwgcmlnaHRTZWFyY2gpO1xyXG4gICAgfTtcclxuICAgIC8vIFNlYXJjaGVzIGZvciBhIG5vZGUgYnkgYSBga2V5YCB2YWx1ZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuc2VhcmNoRXhpc3RpbmcgPSBmdW5jdGlvbiAobG93KSB7XHJcbiAgICAgICAgaWYgKHRoaXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5rZXkgPT09IGxvdykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobG93IDwgdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0LnNlYXJjaEV4aXN0aW5nKGxvdyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnNlYXJjaEV4aXN0aW5nKGxvdyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIH07XHJcbiAgICAvLyBSZXR1cm5zIHRoZSBzbWFsbGVzdCBub2RlIG9mIHRoZSBzdWJ0cmVlXHJcbiAgICBOb2RlLnByb3RvdHlwZS5fbWluVmFsdWUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5fbWluVmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgTm9kZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgaWYgKG5vZGUua2V5IDwgdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgLy8gTm9kZSB0byBiZSByZW1vdmVkIGlzIG9uIHRoZSBsZWZ0IHNpZGVcclxuICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZWZ0LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAobm9kZS5rZXkgPiB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICAvLyBOb2RlIHRvIGJlIHJlbW92ZWQgaXMgb24gdGhlIHJpZ2h0IHNpZGVcclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gTm9kZSBoYXMgdHdvIGNoaWxkcmVuXHJcbiAgICAgICAgICAgICAgICB2YXIgbWluVmFsdWUgPSB0aGlzLnJpZ2h0Ll9taW5WYWx1ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5rZXkgPSBtaW5WYWx1ZS5rZXk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29yZHMgPSBtaW5WYWx1ZS5yZWNvcmRzO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmlnaHQucmVtb3ZlKHRoaXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudC5sZWZ0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPbmUgY2hpbGQgb3Igbm8gY2hpbGQgY2FzZSBvbiBsZWZ0IHNpZGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQubGVmdCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQubGVmdCA9IHRoaXMubGVmdDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQuX3JlYmFsYW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAocGFyZW50LnJpZ2h0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPbmUgY2hpbGQgb3Igbm8gY2hpbGQgY2FzZSBvbiByaWdodCBzaWRlXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJpZ2h0ID0gdGhpcy5yaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5yaWdodCA9IHRoaXMubGVmdDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnQuX3JlYmFsYW5jZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIE5vZGU7XHJcbn0oKSk7XHJcbmV4cG9ydHMuTm9kZSA9IE5vZGU7XHJcbnZhciBJbnRlcnZhbFRyZWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBJbnRlcnZhbFRyZWUoKSB7XHJcbiAgICAgICAgdGhpcy5jb3VudCA9IDA7XHJcbiAgICB9XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcclxuICAgICAgICBpZiAocmVjb3JkLmxvdyA+IHJlY29yZC5oaWdoKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYGxvd2AgdmFsdWUgbXVzdCBiZSBsb3dlciBvciBlcXVhbCB0byBgaGlnaGAgdmFsdWUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIEJhc2UgY2FzZTogVHJlZSBpcyBlbXB0eSwgbmV3IG5vZGUgYmVjb21lcyByb290XHJcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IG5ldyBOb2RlKHRoaXMsIHJlY29yZCk7XHJcbiAgICAgICAgICAgIHRoaXMuY291bnQrKztcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIGNoZWNrIGlmIG5vZGUgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBrZXlcclxuICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnJvb3Quc2VhcmNoRXhpc3RpbmcocmVjb3JkLmxvdyk7XHJcbiAgICAgICAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoZSByZWNvcmRzIGluIHRoaXMgbm9kZSBpZiB0aGVyZSBhbHJlYWR5IGlzIHRoZSBvbmUgd2l0aCBzYW1lIGxvdywgaGlnaCwgZGF0YVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTYW1lKG5vZGUucmVjb3Jkc1tpXSwgcmVjb3JkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJlY29yZCBpcyBzYW1lIGFzIHRoZSBvbmUgd2UncmUgdHJ5aW5nIHRvIGluc2VydDsgcmV0dXJuIGZhbHNlIHRvIGluZGljYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgaGFzIGJlZW4gaW5zZXJ0ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVjb3JkIHRvIHRoZSBub2RlXHJcbiAgICAgICAgICAgICAgICBub2RlLnJlY29yZHMucHVzaChyZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIG1heCBvZiB0aGUgbm9kZSBhbmQgaXRzIHBhcmVudHMgaWYgbmVjZXNzYXJ5XHJcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmhpZ2ggPiBub2RlLm1heCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnQrKztcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTm9kZSB3aXRoIHRoaXMga2V5IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gQ2FsbCBpbnNlcnQgZnVuY3Rpb24gb24gcm9vdCdzIG5vZGVcclxuICAgICAgICAgICAgICAgIHRoaXMucm9vdC5pbnNlcnQocmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnQrKztcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUuc2VhcmNoID0gZnVuY3Rpb24gKGxvdywgaGlnaCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBUcmVlIGlzIGVtcHR5OyByZXR1cm4gZW1wdHkgYXJyYXlcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAocmVjb3JkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucm9vdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFRyZWUgaXMgZW1wdHk7IG5vdGhpbmcgdG8gcmVtb3ZlXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5yb290LnNlYXJjaEV4aXN0aW5nKHJlY29yZC5sb3cpO1xyXG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5yZWNvcmRzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZW1vdmVkUmVjb3JkID0gdm9pZCAwO1xyXG4gICAgICAgICAgICAgICAgLy8gTm9kZSB3aXRoIHRoaXMga2V5IGhhcyAyIG9yIG1vcmUgcmVjb3Jkcy4gRmluZCB0aGUgb25lIHdlIG5lZWQgYW5kIHJlbW92ZSBpdFxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTYW1lKG5vZGUucmVjb3Jkc1tpXSwgcmVjb3JkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkUmVjb3JkID0gbm9kZS5yZWNvcmRzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJlY29yZHMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZFJlY29yZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWRSZWNvcmQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIG1heCBvZiB0aGF0IG5vZGUgYW5kIGl0cyBwYXJlbnRzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuaGlnaCA9PT0gbm9kZS5tYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVIaWdoID0gbm9kZS5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgbm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KG5vZGUubGVmdC5tYXgsIG5vZGUucmlnaHQubWF4KSwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUubGVmdCAhPT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChub2RlLmxlZnQubWF4LCBub2RlSGlnaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5sZWZ0ID09PSB1bmRlZmluZWQgJiYgbm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IE1hdGgubWF4KG5vZGUucmlnaHQubWF4LCBub2RlSGlnaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IG5vZGVIaWdoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUucmVjb3Jkcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBoYXMgb25seSAxIHJlY29yZC4gQ2hlY2sgaWYgdGhlIHJlbWFpbmluZyByZWNvcmQgaW4gdGhpcyBub2RlIGlzXHJcbiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTYW1lKG5vZGUucmVjb3Jkc1swXSwgcmVjb3JkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgcmVjb3JkIGlzIHRoZSBvbmUgd2Ugd2FudCB0byByZW1vdmUuIFJlbW92ZSB0aGUgd2hvbGUgbm9kZSBmcm9tIHRoZSB0cmVlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdC5rZXkgPT09IG5vZGUua2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHJlbW92aW5nIHRoZSByb290IGVsZW1lbnQuIENyZWF0ZSBhIGR1bW15IG5vZGUgdGhhdCB3aWxsIHRlbXBvcmFyaWx5IHRha2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9vdCdzIHBhcmVudCByb2xlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb290UGFyZW50ID0gbmV3IE5vZGUodGhpcywgeyBsb3c6IHJlY29yZC5sb3csIGhpZ2g6IHJlY29yZC5sb3cgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RQYXJlbnQubGVmdCA9IHRoaXMucm9vdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290LnBhcmVudCA9IHJvb3RQYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1vdmVkTm9kZSA9IHRoaXMucm9vdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IHJvb3RQYXJlbnQubGVmdDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucm9vdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QucGFyZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZE5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbW92ZWROb2RlID0gdGhpcy5yb290LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyByZWNvcmQgaXMgbm90IHRoZSBvbmUgd2Ugd2FudCB0byByZW1vdmVcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBObyByZWNvcmRzIGF0IGFsbCBpbiB0aGlzIG5vZGU/ISBTaG91bGRuJ3QgaGFwcGVuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbk9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgSW5PcmRlcih0aGlzLnJvb3QpO1xyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUucHJlT3JkZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcmVPcmRlcih0aGlzLnJvb3QpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBJbnRlcnZhbFRyZWU7XHJcbn0oKSk7XHJcbmV4cG9ydHMuSW50ZXJ2YWxUcmVlID0gSW50ZXJ2YWxUcmVlO1xyXG52YXIgRGF0YUludGVydmFsVHJlZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIERhdGFJbnRlcnZhbFRyZWUoKSB7XHJcbiAgICAgICAgdGhpcy50cmVlID0gbmV3IEludGVydmFsVHJlZSgpO1xyXG4gICAgfVxyXG4gICAgRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24gKGxvdywgaGlnaCwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUuaW5zZXJ0KHsgbG93OiBsb3csIGhpZ2g6IGhpZ2gsIGRhdGE6IGRhdGEgfSk7XHJcbiAgICB9O1xyXG4gICAgRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGxvdywgaGlnaCwgZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUucmVtb3ZlKHsgbG93OiBsb3csIGhpZ2g6IGhpZ2gsIGRhdGE6IGRhdGEgfSk7XHJcbiAgICB9O1xyXG4gICAgRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUuc2VhcmNoID0gZnVuY3Rpb24gKGxvdywgaGlnaCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUuc2VhcmNoKGxvdywgaGlnaCkubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2LmRhdGE7IH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluT3JkZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5pbk9yZGVyKCk7XHJcbiAgICB9O1xyXG4gICAgRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUucHJlT3JkZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudHJlZS5wcmVPcmRlcigpO1xyXG4gICAgfTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZSwgXCJjb3VudFwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyZWUuY291bnQ7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gRGF0YUludGVydmFsVHJlZTtcclxufSgpKTtcclxuZXhwb3J0cy5kZWZhdWx0ID0gRGF0YUludGVydmFsVHJlZTtcclxudmFyIEluT3JkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBJbk9yZGVyKHN0YXJ0Tm9kZSkge1xyXG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcclxuICAgICAgICBpZiAoc3RhcnROb2RlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoKHN0YXJ0Tm9kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgSW5PcmRlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyBXaWxsIG9ubHkgaGFwcGVuIGlmIHN0YWNrIGlzIGVtcHR5IGFuZCBwb3AgaXMgY2FsbGVkXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9uZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFByb2Nlc3MgdGhpcyBub2RlXHJcbiAgICAgICAgaWYgKHRoaXMuaSA8IHRoaXMuY3VycmVudE5vZGUucmVjb3Jkcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3VycmVudE5vZGUucmVjb3Jkc1t0aGlzLmkrK10sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoKHRoaXMuY3VycmVudE5vZGUucmlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gTWlnaHQgcG9wIHRoZSBsYXN0IGFuZCBzZXQgdGhpcy5jdXJyZW50Tm9kZSA9IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB0aGlzLnBvcCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5uZXh0KCk7XHJcbiAgICB9O1xyXG4gICAgSW5PcmRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgICAgICB3aGlsZSAodGhpcy5jdXJyZW50Tm9kZS5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHRoaXMuY3VycmVudE5vZGUpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5jdXJyZW50Tm9kZS5sZWZ0O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuc3RhY2sucG9wKCk7XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gSW5PcmRlcjtcclxufSgpKTtcclxuZXhwb3J0cy5Jbk9yZGVyID0gSW5PcmRlcjtcclxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcclxuICAgIEluT3JkZXIucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xyXG59XHJcbnZhciBQcmVPcmRlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIFByZU9yZGVyKHN0YXJ0Tm9kZSkge1xyXG4gICAgICAgIHRoaXMuc3RhY2sgPSBbXTtcclxuICAgICAgICB0aGlzLmkgPSAwO1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBzdGFydE5vZGU7XHJcbiAgICB9XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAvLyBXaWxsIG9ubHkgaGFwcGVuIGlmIHN0YWNrIGlzIGVtcHR5IGFuZCBwb3AgaXMgY2FsbGVkLFxyXG4gICAgICAgIC8vIHdoaWNoIG9ubHkgaGFwcGVucyBpZiB0aGVyZSBpcyBubyByaWdodCBub2RlIChpLmUgd2UgYXJlIGRvbmUpXHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZG9uZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFByb2Nlc3MgdGhpcyBub2RlXHJcbiAgICAgICAgaWYgKHRoaXMuaSA8IHRoaXMuY3VycmVudE5vZGUucmVjb3Jkcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuY3VycmVudE5vZGUucmVjb3Jkc1t0aGlzLmkrK10sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoKHRoaXMuY3VycmVudE5vZGUucmlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5wdXNoKHRoaXMuY3VycmVudE5vZGUubGVmdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9wKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpO1xyXG4gICAgfTtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKG5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrLnB1c2gobm9kZSk7XHJcbiAgICB9O1xyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gdGhpcy5zdGFjay5wb3AoKTtcclxuICAgICAgICB0aGlzLmkgPSAwO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBQcmVPcmRlcjtcclxufSgpKTtcclxuZXhwb3J0cy5QcmVPcmRlciA9IFByZU9yZGVyO1xyXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xyXG59XHJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vfi9ub2RlLWludGVydmFsLXRyZWUvbGliL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1NFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIvL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCLCBjb21wYXJlLCBjb21wYXJlQ29udGV4dCkge1xuICB2YXIgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgb2JqQSwgb2JqQikgOiB2b2lkIDA7XG5cbiAgaWYgKHJldCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuICEhcmV0O1xuICB9XG5cbiAgaWYgKG9iakEgPT09IG9iakIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gXCJvYmplY3RcIiB8fCAhb2JqQSB8fCB0eXBlb2Ygb2JqQiAhPT0gXCJvYmplY3RcIiB8fCAhb2JqQikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgYkhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5iaW5kKG9iakIpO1xuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGtleXNBLmxlbmd0aDsgaWR4KyspIHtcbiAgICB2YXIga2V5ID0ga2V5c0FbaWR4XTtcblxuICAgIGlmICghYkhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVBID0gb2JqQVtrZXldO1xuICAgIHZhciB2YWx1ZUIgPSBvYmpCW2tleV07XG5cbiAgICByZXQgPSBjb21wYXJlID8gY29tcGFyZS5jYWxsKGNvbXBhcmVDb250ZXh0LCB2YWx1ZUEsIHZhbHVlQiwga2V5KSA6IHZvaWQgMDtcblxuICAgIGlmIChyZXQgPT09IGZhbHNlIHx8IChyZXQgPT09IHZvaWQgMCAmJiB2YWx1ZUEgIT09IHZhbHVlQikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vc2hhbGxvd2VxdWFsL2luZGV4LmpzXG4vLyBtb2R1bGUgaWQgPSA1NVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXRSYWRpb0FwcGVhcmFuY2UoZG9jOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IG9sZEFwcGVhcmFuY2VGdW5jaXRpb246IEZ1bmN0aW9uID0gZG9jLkFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzTm9ybWFsO1xuICAgIGRvYy5BY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbCA9IGZ1bmN0aW9uKGZvcm1PYmplY3Q6IGFueSkge1xuICAgICAgICBjb25zdCB4b2JqOiBhbnkgPSBvbGRBcHBlYXJhbmNlRnVuY2l0aW9uKGZvcm1PYmplY3QpO1xuICAgICAgICBjb25zdCBzdHJlYW06IHN0cmluZ1tdID0geG9iai5zdHJlYW0uc3BsaXQoJ1xcbicpO1xuICAgICAgICBjb25zdCBlbmNvZGVDb2xvcjogc3RyaW5nID0gZG9jLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICBzdHJlYW1bMF0gPSBzdHJlYW1bMF0gKyAnXFxuJyArIGVuY29kZUNvbG9yICsgJ1xcbicgKyBlbmNvZGVDb2xvci50b1VwcGVyQ2FzZSgpO1xuICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKCdcXG4nKTtcbiAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgfTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvanNwZGZfcGx1Z2lucy9hY3JvZm9ybS50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5cbmV4cG9ydCBjbGFzcyBEZXNjcmlwdGlvbkJyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCwgdGV4dCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbi50cyIsInZhciBnO1xyXG5cclxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcclxuZyA9IChmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gdGhpcztcclxufSkoKTtcclxuXHJcbnRyeSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXHJcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcclxufSBjYXRjaChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxyXG5cdFx0ZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vICh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qc1xuLy8gbW9kdWxlIGlkID0gNThcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLyogZ2xvYmFsIGpzUERGICovXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZGVyIFdlaWR0LFxuICogaHR0cHM6Ly9naXRodWIuY29tL0JpZ2dBOTRcbiAqIFxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2VcbiAqL1xuXG4vKiogXG4qIGpzUERGIEFjcm9Gb3JtIFBsdWdpblxuKiBAbW9kdWxlIEFjcm9Gb3JtXG4qL1xudmFyIGpzcGRmID0gcmVxdWlyZSgnanNwZGYnKTtcbihmdW5jdGlvbiAoanNQREYsIGdsb2JhbE9iaikge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBqc1BERkFQSSA9IGpzUERGLkFQSTtcbiAgICB2YXIgc2NvcGU7XG4gICAgdmFyIHNjYWxlRmFjdG9yID0gMTtcbiAgICBmdW5jdGlvbiB0b1VuaWNvZGUoc3RyKSB7XG4gICAgICAgIHZhciB1bmljb2RlU3RyaW5nID0gJyc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgdGhlVW5pY29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgd2hpbGUgKHRoZVVuaWNvZGUubGVuZ3RoIDwgNCkge1xuICAgICAgICAgICAgICAgIHRoZVVuaWNvZGUgPSAnMCcgKyB0aGVVbmljb2RlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHVuaWNvZGVTdHJpbmcgKz0gdGhlVW5pY29kZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJzxGRUZGJyArIHVuaWNvZGVTdHJpbmcgKyAnPic7XG4gICAgfVxuICAgIHZhciBwZGZFc2NhcGUgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXFwoL2csICdcXFxcKCcpLnJlcGxhY2UoL1xcKS9nLCAnXFxcXCknKSB9O1xuICAgIHZhciBwZGZVbmVzY2FwZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXFxcXFwvZywgJ1xcXFwnKS5yZXBsYWNlKC9cXFxcXFwoL2csICcoJykucmVwbGFjZSgvXFxcXFxcKS9nLCAnKScpOyB9O1xuICAgIGZ1bmN0aW9uIGFycmF5VG9QZGZVbmljb2RlQXJyYXkodmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9ICdbICc7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b1VuaWNvZGUodmFsdWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCArPSAnIF0nXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHZhciBmMiA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlci50b0ZpeGVkKDIpOyAvLyBJZSwgJS4yZlxuICAgIH07XG5cbiAgICB2YXIgZjUgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIudG9GaXhlZCg1KTsgLy8gSWUsICUuMmZcbiAgICB9O1xuXG4gICAganNQREZBUEkuX19hY3JvZm9ybV9fID0ge307XG4gICAgdmFyIGluaGVyaXQgPSBmdW5jdGlvbiAoY2hpbGQsIHBhcmVudCkge1xuICAgICAgICBjaGlsZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICAgICAgICBjaGlsZC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICB9O1xuXG4gICAgdmFyIHNjYWxlID0gZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuICh4ICogc2NhbGVGYWN0b3IpO1xuICAgIH07XG4gICAgdmFyIGFudGlTY2FsZSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiAoeCAvIHNjYWxlRmFjdG9yKTtcbiAgICB9O1xuXG4gICAgdmFyIGNyZWF0ZUZvcm1YT2JqZWN0ID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHhvYmogPSBuZXcgQWNyb0Zvcm1YT2JqZWN0KCk7XG4gICAgICAgIHZhciBoZWlnaHQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICB4b2JqLkJCb3ggPSBbMCwgMCwgTnVtYmVyKGYyKHdpZHRoKSksIE51bWJlcihmMihoZWlnaHQpKV07XG4gICAgICAgIHJldHVybiB4b2JqO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEJpdC1PcGVyYXRpb25zXG4gICAgKi9cbiAgICB2YXIgc2V0Qml0ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLnNldEJpdCA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIG51bWJlciA9IG51bWJlciB8fCAwO1xuICAgICAgICBiaXRQb3NpdGlvbiA9IGJpdFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLnNldEJpdCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiaXRNYXNrID0gMSA8PCBiaXRQb3NpdGlvbjtcblxuICAgICAgICBudW1iZXIgfD0gYml0TWFzaztcblxuICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH07XG5cbiAgICB2YXIgY2xlYXJCaXQgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXQgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBudW1iZXIgPSBudW1iZXIgfHwgMDtcbiAgICAgICAgYml0UG9zaXRpb24gPSBiaXRQb3NpdGlvbiB8fCAwO1xuXG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBiaXRNYXNrID0gMSA8PCBiaXRQb3NpdGlvbjtcblxuICAgICAgICBudW1iZXIgJj0gfmJpdE1hc2s7XG5cbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9O1xuXG4gICAgdmFyIGdldEJpdCA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXQgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChudW1iZXIgJiAoMSA8PCBiaXRQb3NpdGlvbikpID09PSAwID8gMCA6IDE7XG4gICAgfTtcblxuICAgIC8qXG4gICAgKiBGZiBzdGFydHMgY291bnRpbmcgdGhlIGJpdCBwb3NpdGlvbiBhdCAxIGFuZCBub3QgbGlrZSBqYXZhc2NyaXB0IGF0IDBcbiAgICAqL1xuICAgIHZhciBnZXRCaXRGb3JQZGYgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmdldEJpdEZvclBkZicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRCaXQobnVtYmVyLCBiaXRQb3NpdGlvbiAtIDEpO1xuICAgIH07XG5cbiAgICB2YXIgc2V0Qml0Rm9yUGRmID0ganNQREZBUEkuX19hY3JvZm9ybV9fLnNldEJpdEZvclBkZiA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXRGb3JQZGYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0Qml0KG51bWJlciwgYml0UG9zaXRpb24gLSAxKTtcbiAgICB9O1xuXG4gICAgdmFyIGNsZWFyQml0Rm9yUGRmID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Rm9yUGRmID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0Rm9yUGRmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsZWFyQml0KG51bWJlciwgYml0UG9zaXRpb24gLSAxKTtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZUNvb3JkaW5hdGVzID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmNhbGN1bGF0ZUNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICAgICAgdmFyIGdldEhvcml6b250YWxDb29yZGluYXRlID0gdGhpcy5pbnRlcm5hbC5nZXRIb3Jpem9udGFsQ29vcmRpbmF0ZTtcbiAgICAgICAgdmFyIGdldFZlcnRpY2FsQ29vcmRpbmF0ZSA9IHRoaXMuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlO1xuICAgICAgICB2YXIgeCA9IGFyZ3NbMF07XG4gICAgICAgIHZhciB5ID0gYXJnc1sxXTtcbiAgICAgICAgdmFyIHcgPSBhcmdzWzJdO1xuICAgICAgICB2YXIgaCA9IGFyZ3NbM107XG5cbiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0ge307XG5cbiAgICAgICAgY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1ggPSBnZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSh4KSB8fCAwO1xuICAgICAgICBjb29yZGluYXRlcy5sb3dlckxlZnRfWSA9IGdldFZlcnRpY2FsQ29vcmRpbmF0ZSh5ICsgaCkgfHwgMDtcbiAgICAgICAgY29vcmRpbmF0ZXMudXBwZXJSaWdodF9YID0gZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUoeCArIHcpIHx8IDA7XG4gICAgICAgIGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWSA9IGdldFZlcnRpY2FsQ29vcmRpbmF0ZSh5KSB8fCAwO1xuXG4gICAgICAgIHJldHVybiBbTnVtYmVyKGYyKGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9YKSksIE51bWJlcihmMihjb29yZGluYXRlcy5sb3dlckxlZnRfWSkpLCBOdW1iZXIoZjIoY29vcmRpbmF0ZXMudXBwZXJSaWdodF9YKSksIE51bWJlcihmMihjb29yZGluYXRlcy51cHBlclJpZ2h0X1kpKV07XG4gICAgfTtcblxuICAgIHZhciBjYWxjdWxhdGVBcHBlYXJhbmNlU3RyZWFtID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgaWYgKGZvcm1PYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmb3JtT2JqZWN0LlYgJiYgIWZvcm1PYmplY3QuRFYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVsc2UgY2FsY3VsYXRlIGl0XG5cbiAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICB2YXIgdGV4dCA9IGZvcm1PYmplY3QuViB8fCBmb3JtT2JqZWN0LkRWO1xuICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgdGV4dCk7XG4gICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG5cbiAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICBzdHJlYW0ucHVzaCgnL1R4IEJNQycpO1xuICAgICAgICBzdHJlYW0ucHVzaCgncScpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnQlQnKTsgLy8gQmVnaW4gVGV4dFxuICAgICAgICBzdHJlYW0ucHVzaChzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKSk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCcvJyArIGZvbnRLZXkgKyAnICcgKyBmMihjYWxjUmVzLmZvbnRTaXplKSArICcgVGYnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJzEgMCAwIDEgMCAwIFRtJyk7Ly8gVHJhbnNmb3JtYXRpb24gTWF0cml4XG4gICAgICAgIHN0cmVhbS5wdXNoKGNhbGNSZXMudGV4dCk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdFVCcpOyAvLyBFbmQgVGV4dCAgICBcbiAgICAgICAgc3RyZWFtLnB1c2goJ1EnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ0VNQycpO1xuXG4gICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIHJldHVybiBhcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICB9O1xuXG4gICAgdmFyIGNhbGN1bGF0ZVggPSBmdW5jdGlvbiAoZm9ybU9iamVjdCwgdGV4dCkge1xuICAgICAgICBpZiAoZm9ybU9iamVjdC5pc1VuaWNvZGUpIHRleHQgPSBmb3JtT2JqZWN0LnRydWVWYWx1ZTtcbiAgICAgICAgIHZhciBtYXhGb250U2l6ZSA9XG4gICAgICAgICAgICBmb3JtT2JqZWN0LmZvbnRTaXplID09PSAwID8gZm9ybU9iamVjdC5tYXhGb250U2l6ZSA6IGZvcm1PYmplY3QuZm9udFNpemU7XG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IHtcbiAgICAgICAgICAgIHRleHQ6IFwiXCIsXG4gICAgICAgICAgICBmb250U2l6ZTogXCJcIlxuICAgICAgICB9O1xuICAgICAgICAvLyBSZW1vdmUgQnJhY2tldHNcbiAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyKDAsIDEpID09IFwiKFwiID8gdGV4dC5zdWJzdHIoMSkgOiB0ZXh0O1xuICAgICAgICB0ZXh0ID1cbiAgICAgICAgICAgIHRleHQuc3Vic3RyKHRleHQubGVuZ3RoIC0gMSkgPT0gXCIpXCJcbiAgICAgICAgICAgID8gdGV4dC5zdWJzdHIoMCwgdGV4dC5sZW5ndGggLSAxKVxuICAgICAgICAgICAgOiB0ZXh0O1xuICAgICAgICAvLyBzcGxpdCBpbnRvIGFycmF5IG9mIHdvcmRzXG4gICAgICAgIHZhciB0ZXh0U3BsaXQgPSB0ZXh0LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgdGV4dFNwbGl0ID0gdGV4dFNwbGl0Lm1hcChmdW5jdGlvbiAod29yZCkge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmQuc3BsaXQoXCJcXG5cIik7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICB0ZXh0U3BsaXQgPSB0ZXh0U3BsaXQubWFwKGZ1bmN0aW9uIChhcnIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2Fyci5qb2luKFwiIFwiKV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZvbnRTaXplID0gbWF4Rm9udFNpemU7IC8vIFRoZSBTdGFydGluZyBmb250U2l6ZSAoVGhlIE1heGltdW0pXG4gICAgICAgIHZhciBsaW5lU3BhY2luZyA9IDI7XG4gICAgICAgIHZhciBib3JkZXJQYWRkaW5nID0gMjtcblxuICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICBoZWlnaHQgPSBoZWlnaHQgPCAwID8gLWhlaWdodCA6IGhlaWdodDtcbiAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIHx8IDA7XG4gICAgICAgIHdpZHRoID0gd2lkdGggPCAwID8gLXdpZHRoIDogd2lkdGg7XG5cbiAgICAgICAgdmFyIGlzU21hbGxlclRoYW5XaWR0aCA9IGZ1bmN0aW9uKGksIGxhc3RMaW5lLCBmb250U2l6ZSkge1xuICAgICAgICAgICAgaWYgKGkgKyAxIDwgdGV4dFNwbGl0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHRtcCA9IGxhc3RMaW5lICsgXCIgXCIgKyB0ZXh0U3BsaXRbaSArIDFdWzBdO1xuICAgICAgICAgICAgdmFyIFRleHRXaWR0aCA9IGNhbGN1bGF0ZUZvbnRTcGFjZSh0bXAsIGZvcm1PYmplY3QsIGZvbnRTaXplKS53aWR0aDtcbiAgICAgICAgICAgIHZhciBGaWVsZFdpZHRoID0gd2lkdGggLSAyICogYm9yZGVyUGFkZGluZztcbiAgICAgICAgICAgIHJldHVybiBUZXh0V2lkdGggPD0gRmllbGRXaWR0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9udFNpemUrKztcbiAgICAgICAgRm9udFNpemU6IHdoaWxlIChmb250U2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZm9udFNpemUtLTtcbiAgICAgICAgICAgIHZhciB0ZXh0SGVpZ2h0ID0gY2FsY3VsYXRlRm9udFNwYWNlKFwiM1wiLCBmb3JtT2JqZWN0LCBmb250U2l6ZSkuaGVpZ2h0O1xuICAgICAgICAgICAgdmFyIHN0YXJ0WSA9IGZvcm1PYmplY3QubXVsdGlsaW5lXG4gICAgICAgICAgICA/IGhlaWdodCAtIGZvbnRTaXplXG4gICAgICAgICAgICA6IChoZWlnaHQgLSB0ZXh0SGVpZ2h0KSAvIDI7XG4gICAgICAgICAgICBzdGFydFkgKz0gbGluZVNwYWNpbmc7XG4gICAgICAgICAgICB2YXIgc3RhcnRYO1xuXG4gICAgICAgICAgICB2YXIgbGFzdFkgPSBzdGFydFk7XG4gICAgICAgICAgICB2YXIgZmlyc3RXb3JkSW5MaW5lID0gMCxcbiAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0gMDtcbiAgICAgICAgICAgIHZhciBsYXN0TGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGN1cnJXb3JkID0gMDtcblxuICAgICAgICAgICAgaWYgKGZvbnRTaXplIDw9IDApIHtcbiAgICAgICAgICAgIC8vIEluIGNhc2UsIHRoZSBUZXh0IGRvZXNuJ3QgZml0IGF0IGFsbFxuICAgICAgICAgICAgZm9udFNpemUgPSAxMjtcbiAgICAgICAgICAgIHRleHQgPSBcIiguLi4pIFRqXFxuXCI7XG4gICAgICAgICAgICB0ZXh0ICs9XG4gICAgICAgICAgICAgICAgXCIlIFdpZHRoIG9mIFRleHQ6IFwiICtcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVGb250U3BhY2UodGV4dCwgZm9ybU9iamVjdCwgZm9udFNpemUpLndpZHRoICtcbiAgICAgICAgICAgICAgICBcIiwgRmllbGRXaWR0aDpcIiArXG4gICAgICAgICAgICAgICAgd2lkdGggK1xuICAgICAgICAgICAgICAgIFwiXFxuXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGxhc3RMaW5lID0gXCJcIjtcbiAgICAgICAgICAgIHZhciBsaW5lQ291bnQgPSAwO1xuICAgICAgICAgICAgTGluZTogZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0U3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0ZXh0U3BsaXQuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgaXNXaXRoTmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0U3BsaXRbaV0ubGVuZ3RoICE9PSAxICYmIGN1cnJXb3JkICE9PSB0ZXh0U3BsaXRbaV0ubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgKHRleHRIZWlnaHQgKyBsaW5lU3BhY2luZykgKiAobGluZUNvdW50ICsgMikgKyBsaW5lU3BhY2luZyA+XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsYXN0TGluZSArPSB0ZXh0U3BsaXRbaV1bY3VycldvcmRdO1xuICAgICAgICAgICAgICAgIGlzV2l0aE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0gaTtcbiAgICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXN0TGluZSArPSB0ZXh0U3BsaXRbaV1bY3VycldvcmRdICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgbGFzdExpbmUgPVxuICAgICAgICAgICAgICAgICAgICBsYXN0TGluZS5zdWJzdHIobGFzdExpbmUubGVuZ3RoIC0gMSkgPT0gXCIgXCJcbiAgICAgICAgICAgICAgICAgICAgPyBsYXN0TGluZS5zdWJzdHIoMCwgbGFzdExpbmUubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgOiBsYXN0TGluZTtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyc2VJbnQoaSk7XG4gICAgICAgICAgICAgICAgdmFyIG5leHRMaW5lSXNTbWFsbGVyID0gaXNTbWFsbGVyVGhhbldpZHRoKGtleSwgbGFzdExpbmUsIGZvbnRTaXplKTtcbiAgICAgICAgICAgICAgICB2YXIgaXNMYXN0V29yZCA9IGkgPj0gdGV4dFNwbGl0Lmxlbmd0aCAtIDE7XG5cbiAgICAgICAgICAgICAgICBpZiAobmV4dExpbmVJc1NtYWxsZXIgJiYgIWlzTGFzdFdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJXb3JkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIExpbmVcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuZXh0TGluZUlzU21hbGxlciAmJiAhaXNMYXN0V29yZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcm1PYmplY3QubXVsdGlsaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGV4dEhlaWdodCArIGxpbmVTcGFjaW5nKSAqIChsaW5lQ291bnQgKyAyKSArIGxpbmVTcGFjaW5nID5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBUZXh0IGlzIGhpZ2hlciB0aGFuIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmllbGRPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAvLyBnbyBvblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0xhc3RXb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RXb3JkSW5MaW5lID0ga2V5O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZm9ybU9iamVjdC5tdWx0aWxpbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRleHRIZWlnaHQgKyBsaW5lU3BhY2luZykgKiAobGluZUNvdW50ICsgMikgKyBsaW5lU3BhY2luZyA+XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBUZXh0IGlzIGhpZ2hlciB0aGFuIHRoZSBGaWVsZE9iamVjdFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxhc3QgYmxhbmtcblxuICAgICAgICAgICAgICAgIHZhciBsaW5lID0gXCJcIjtcblxuICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSBmaXJzdFdvcmRJbkxpbmU7IHggPD0gbGFzdFdvcmRJbkxpbmU7IHgrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3VyckxpbmUgPSB0ZXh0U3BsaXRbeF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0Lm11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IGxhc3RXb3JkSW5MaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lICs9IGN1cnJMaW5lW2N1cnJXb3JkXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycldvcmQgPSAoY3VycldvcmQgKyAxKSAlIGN1cnJMaW5lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT09IGZpcnN0V29yZEluTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArPSBjdXJyTGluZVtjdXJyTGluZS5sZW5ndGggLSAxXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGluZSArPSBjdXJyTGluZVswXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBsYXN0IGJsYW5rXG4gICAgICAgICAgICAgICAgbGluZSA9XG4gICAgICAgICAgICAgICAgbGluZS5zdWJzdHIobGluZS5sZW5ndGggLSAxKSA9PSBcIiBcIlxuICAgICAgICAgICAgICAgICAgICA/IGxpbmUuc3Vic3RyKDAsIGxpbmUubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgOiBsaW5lO1xuICAgICAgICAgICAgICAgIC8vIGxhc3RMZW5ndGggLT0gYmxhbmtTcGFjZS53aWR0aDtcbiAgICAgICAgICAgICAgICBsYXN0TGVuZ3RoID0gY2FsY3VsYXRlRm9udFNwYWNlKGxpbmUsIGZvcm1PYmplY3QsIGZvbnRTaXplKS53aWR0aDtcblxuICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBzdGFydFhcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1PYmplY3QudGV4dEFsaWduKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInJpZ2h0XCI6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WCA9IHdpZHRoIC0gbGFzdExlbmd0aCAtIGJvcmRlclBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjZW50ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYID0gKHdpZHRoIC0gbGFzdExlbmd0aCkgLyAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibGVmdFwiOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WCA9IGJvcmRlclBhZGRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ZXh0ICs9IGYyKHN0YXJ0WCkgKyBcIiBcIiArIGYyKGxhc3RZKSArIFwiIFRkXFxuXCI7XG5cbiAgICAgICAgICAgICAgICBpZiAoZm9ybU9iamVjdC5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvbnRMaXN0ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGZvbnRMaXN0W3Njb3BlLmludGVybmFsLmdldEZvbnQoKS5pZF0gPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogbGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRleDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkZkVzY2FwZTogcGRmRXNjYXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUZvbnRLZXk6IHNjb3BlLmludGVybmFsLmdldEZvbnQoKS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250czogZm9udExpc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRm9udFNpemU6IGZvcm1PYmplY3QuZm9udFNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnB1Ymxpc2goJ3Bvc3RQcm9jZXNzVGV4dCcsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICc8JyArIHBheWxvYWQudGV4dCArICc+IFRqXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gJygnICsgcGRmRXNjYXBlKGxpbmUpICsgJykgVGpcXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyByZXNldCBYIGluIFBERlxuICAgICAgICAgICAgICAgIHRleHQgKz0gLWYyKHN0YXJ0WCkgKyBcIiAwIFRkXFxuXCI7XG5cbiAgICAgICAgICAgICAgICAvLyBBZnRlciBhIExpbmUsIGFkanVzdCB5IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgbGFzdFkgPSAtKGZvbnRTaXplICsgbGluZVNwYWNpbmcpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVzZXQgZm9yIG5leHQgaXRlcmF0aW9uIHN0ZXBcbiAgICAgICAgICAgICAgICBsYXN0TGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICBmaXJzdFdvcmRJbkxpbmUgPSBpc1dpdGhOZXdMaW5lID8gbGFzdFdvcmRJbkxpbmUgOiBsYXN0V29yZEluTGluZSArIDE7XG4gICAgICAgICAgICAgICAgbGluZUNvdW50Kys7XG5cbiAgICAgICAgICAgICAgICBsYXN0TGluZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgY29udGludWUgTGluZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuVmFsdWUudGV4dCA9IHRleHQ7XG4gICAgICAgIHJldHVyblZhbHVlLmZvbnRTaXplID0gZm9udFNpemU7XG5cbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIFNtYWxsIHdvcmthcm91bmQgZm9yIGNhbGN1bGF0aW5nIHRoZSBUZXh0TWV0cmljIGFwcHJveGltYXRlbHkuXG4gICAgKiBcbiAgICAqIEBwYXJhbSB0ZXh0XG4gICAgKiBAcGFyYW0gZm9udHNpemVcbiAgICAqIEByZXR1cm5zIHtUZXh0TWV0cmljc30gKEhhcyBIZWlnaHQgYW5kIFdpZHRoKVxuICAgICovXG4gICAgdmFyIGNhbGN1bGF0ZUZvbnRTcGFjZSA9IGZ1bmN0aW9uICh0ZXh0LCBmb3JtT2JqZWN0LCBmb250U2l6ZSkge1xuICAgICAgICB2YXIgZm9udCA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpO1xuICAgICAgICB2YXIgd2lkdGggPSBzY29wZS5nZXRTdHJpbmdVbml0V2lkdGgodGV4dCwgeyBmb250OiBmb250LCBmb250U2l6ZTogcGFyc2VGbG9hdChmb250U2l6ZSksIGNoYXJTcGFjZTogMCB9KSAqIHBhcnNlRmxvYXQoZm9udFNpemUpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gc2NvcGUuZ2V0U3RyaW5nVW5pdFdpZHRoKFwiM1wiLCB7IGZvbnQ6IGZvbnQsIGZvbnRTaXplOiBwYXJzZUZsb2F0KGZvbnRTaXplKSwgY2hhclNwYWNlOiAwIH0pICogcGFyc2VGbG9hdChmb250U2l6ZSkgKiAxLjU7XG4gICAgICAgIHJldHVybiB7IGhlaWdodDogaGVpZ2h0LCB3aWR0aDogd2lkdGggfTtcbiAgICB9O1xuXG4gICAgdmFyIGFjcm9mb3JtUGx1Z2luVGVtcGxhdGUgPSB7XG4gICAgICAgIGZpZWxkczogW10sXG4gICAgICAgIHhGb3JtczogW10sXG4gICAgICAgIC8qKlxuICAgICAgICAqIGFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEFjcm9Gb3JtXG4gICAgICAgICogRGljdGlvbmFyeSAwOiBUaGUgRXZlbnQtVG9rZW4sIHRoZSBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayBoYXNcbiAgICAgICAgKiAxOiBUaGUgT2JqZWN0IElEIG9mIHRoZSBSb290XG4gICAgICAgICovXG4gICAgICAgIGFjcm9Gb3JtRGljdGlvbmFyeVJvb3Q6IG51bGwsXG4gICAgICAgIC8qKlxuICAgICAgICAqIEFmdGVyIHRoZSBQREYgZ2V0cyBldmFsdWF0ZWQsIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJvb3QgaGFzIHRvIGJlXG4gICAgICAgICogcmVzZXQsIHRoaXMgaW5kaWNhdGVzLCB3aGV0aGVyIHRoZSByb290IGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZFxuICAgICAgICAqIG91dFxuICAgICAgICAqL1xuICAgICAgICBwcmludGVkT3V0OiBmYWxzZSxcbiAgICAgICAgaW50ZXJuYWw6IG51bGwsXG4gICAgICAgIGlzSW5pdGlhbGl6ZWQ6IGZhbHNlXG4gICAgfTtcblxuICAgIHZhciBhbm5vdFJlZmVyZW5jZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvL3NldCBvYmpJZCB0byB1bmRlZmluZWQgYW5kIGZvcmNlIGl0IHRvIGdldCBhIG5ldyBvYmpJZCBvbiBidWlsZERvY3VtZW50XG4gICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBmaWVsZHMgPSBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcztcbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZm9ybU9iamVjdCA9IGZpZWxkc1tpXTtcbiAgICAgICAgICAgICAgICAvL3NldCBvYmpJZCB0byB1bmRlZmluZWQgYW5kIGZvcmNlIGl0IHRvIGdldCBhIG5ldyBvYmpJZCBvbiBidWlsZERvY3VtZW50XG4gICAgICAgICAgICAgICAgZm9ybU9iamVjdC5vYmpJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAvLyBhZGQgQW5ub3QgUmVmZXJlbmNlIVxuICAgICAgICAgICAgICAgIGlmIChmb3JtT2JqZWN0Lmhhc0Fubm90YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmVzIGFuIEFubm90YXRpb24gV2lkZ2V0IGluIHRoZSBGb3JtIE9iamVjdCwgcHV0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBSZWZlcmVuY2UgaW4gdGhlIC9Bbm5vdCBhcnJheVxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVBbm5vdGF0aW9uUmVmZXJlbmNlLmNhbGwoc2NvcGUsIGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcHV0Rm9ybSA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIGlmIChzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0KSB7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0ID0gZmFsc2U7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QpIHtcbiAgICAgICAgICAgIGluaXRpYWxpemVBY3JvRm9ybS5jYWxsKHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LkZpZWxkcy5wdXNoKGZvcm1PYmplY3QpO1xuICAgIH07XG4gICAgLyoqXG4gICAgKiBDcmVhdGUgdGhlIFJlZmVyZW5jZSB0byB0aGUgd2lkZ2V0QW5ub3RhdGlvbiwgc28gdGhhdCBpdCBnZXRzIHJlZmVyZW5jZWRcbiAgICAqIGluIHRoZSBBbm5vdFtdIGludCB0aGUrIChSZXF1aXJlcyB0aGUgQW5ub3RhdGlvbiBQbHVnaW4pXG4gICAgKi9cbiAgICB2YXIgY3JlYXRlQW5ub3RhdGlvblJlZmVyZW5jZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0eXBlOiAncmVmZXJlbmNlJyxcbiAgICAgICAgICAgIG9iamVjdDogb2JqZWN0XG4gICAgICAgIH07XG4gICAgICAgIHZhciBmaW5kRW50cnkgPSBmdW5jdGlvbiAoZW50cnkpIHsgcmV0dXJuIChlbnRyeS50eXBlID09PSBvcHRpb25zLnR5cGUgJiYgZW50cnkub2JqZWN0ID09PSBvcHRpb25zLm9iamVjdCk7IH07XG4gICAgICAgIGlmIChzY29wZS5pbnRlcm5hbC5nZXRQYWdlSW5mbyhvYmplY3QucGFnZSkucGFnZUNvbnRleHQuYW5ub3RhdGlvbnMuZmluZChmaW5kRW50cnkpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmdldFBhZ2VJbmZvKG9iamVjdC5wYWdlKS5wYWdlQ29udGV4dC5hbm5vdGF0aW9ucy5wdXNoKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIENhbGxiYWNrc1xuXG4gICAgdmFyIHB1dENhdGFsb2dDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUHV0IHJlZmVyZW5jZSB0byBBY3JvRm9ybSB0byBEb2N1bWVudENhdGFsb2dcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAvLyBmb3Igc2FmZXR5LCBzaG91bGRuJ3Qgbm9ybWFsbHkgYmUgdGhlIGNhc2VcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLndyaXRlKCcvQWNyb0Zvcm0gJyArIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3Qub2JqSWQgKyAnICcgKyAwICsgJyBSJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1dENhdGFsb2dDYWxsYmFjazogUm9vdCBtaXNzaW5nLicpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQWRkcyAvQWNyb2Zvcm0gWCAwIFIgdG8gRG9jdW1lbnQgQ2F0YWxvZywgYW5kIGNyZWF0ZXMgdGhlIEFjcm9Gb3JtXG4gICAgKiBEaWN0aW9uYXJ5XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1EaWN0aW9uYXJ5Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudFxuICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMudW5zdWJzY3JpYmUoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCk7XG4gICAgICAgIGRlbGV0ZSBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Ll9ldmVudElEO1xuICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5wcmludGVkT3V0ID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBDcmVhdGVzIHRoZSBzaW5nbGUgRmllbGRzIGFuZCB3cml0ZXMgdGhlbSBpbnRvIHRoZSBEb2N1bWVudFxuICAgICogXG4gICAgKiBJZiBmaWVsZEFycmF5IGlzIHNldCwgdXNlIHRoZSBmaWVsZHMgdGhhdCBhcmUgaW5zaWRlIGl0IGluc3RlYWQgb2YgdGhlXG4gICAgKiBmaWVsZHMgZnJvbSB0aGUgQWNyb1Jvb3QgKGZvciB0aGUgRm9ybVhPYmplY3RzLi4uKVxuICAgICovXG4gICAgdmFyIGNyZWF0ZUZpZWxkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZmllbGRBcnJheSkge1xuICAgICAgICB2YXIgc3RhbmRhcmRGaWVsZHMgPSAoIWZpZWxkQXJyYXkpO1xuXG4gICAgICAgIGlmICghZmllbGRBcnJheSkge1xuICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGVyZSBpcyBubyBmaWVsZEFycmF5IHNwZWNpZmllZCwgd2Ugd2FudCB0byBwcmludCBvdXRcbiAgICAgICAgICAgIC8vIHRoZSBGaWVsZHMgb2YgdGhlIEFjcm9Gb3JtXG4gICAgICAgICAgICAvLyBQcmludCBvdXQgUm9vdFxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwubmV3T2JqZWN0RGVmZXJyZWRCZWdpbihzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Lm9iaklkLCB0cnVlKTtcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QucHV0U3RyZWFtKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZEFycmF5ID0gZmllbGRBcnJheSB8fCBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LktpZHM7XG5cbiAgICAgICAgZm9yICh2YXIgaSBpbiBmaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBpZiAoZmllbGRBcnJheS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgIHZhciBmaWVsZE9iamVjdCA9IGZpZWxkQXJyYXlbaV07XG4gICAgICAgICAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBvbGRSZWN0ID0gZmllbGRPYmplY3QuUmVjdDtcblxuICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5SZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0LlJlY3QgPSBjYWxjdWxhdGVDb29yZGluYXRlcy5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0LlJlY3QpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFdyaXRpbmcgdGhlIE9iamVjdFxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oZmllbGRPYmplY3Qub2JqSWQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgZmllbGRPYmplY3QuREEgPSBBY3JvRm9ybUFwcGVhcmFuY2UuY3JlYXRlRGVmYXVsdEFwcGVhcmFuY2VTdHJlYW0oZmllbGRPYmplY3QpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZmllbGRPYmplY3QuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0ID0gZmllbGRPYmplY3QuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmllbGRPYmplY3QuUmVjdCA9IG9sZFJlY3Q7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuaGFzQXBwZWFyYW5jZVN0cmVhbSAmJiAhZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIEFwcGVhcmFuY2VcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2UgPSBjYWxjdWxhdGVBcHBlYXJhbmNlU3RyZWFtLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleTogJ0FQJywgdmFsdWU6IFwiPDwvTiBcIiArIGFwcGVhcmFuY2UgKyBcIj4+XCIgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2goYXBwZWFyYW5jZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQXNzdW1lIEFwcGVhcmFuY2VTdHJlYW1Db250ZW50IGlzIGEgQXJyYXkgd2l0aCBOLFIsRCAoYXQgbGVhc3RcbiAgICAgICAgICAgICAgICAvLyBvbmUgb2YgdGhlbSEpXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIE4sUiBhbmQgRFxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudFtrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IChcIi9cIiArIGsgKyBcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSBcIjw8XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPj0gMSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJhbmNlU3RyZWFtIGlzIGFuIEFycmF5IG9yIE9iamVjdCFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IHZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIEZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQsIGNhbGwgaXQgaW4gb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZ2V0IHRoZSBGb3JtWE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmouY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gKFwiL1wiICsgaSArIFwiIFwiICsgb2JqICsgXCIgXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgWEZvcm0gaXMgYWxyZWFkeSB1c2VkLCBlLmcuIE9mZlN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgQ2hlY2tCb3hlcywgZG9uJ3QgYWRkIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLmluZGV4T2Yob2JqKSA+PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2gob2JqKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBGdW5jdGlvbiBpcyByZWZlcmVuY2VkLCBjYWxsIGl0IGluIG9yZGVyIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIEZvcm1YT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmouY2FsbCh0aGlzLCBmaWVsZE9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSAoXCIvXCIgKyBpICsgXCIgXCIgKyBvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi54Rm9ybXMuaW5kZXhPZihvYmopID49IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLnB1c2gob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSBcIj4+XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBhcHBlYXJhbmNlIHN0cmVhbSBpcyBhIG5vcm1hbCBPYmplY3QuLlxuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleTogJ0FQJywgdmFsdWU6IFwiPDxcXG5cIiArIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKyBcIj4+XCIgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwucHV0U3RyZWFtKHsgYWRkaXRpb25hbEtleVZhbHVlczoga2V5VmFsdWVMaXN0IH0pO1xuXG4gICAgICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwub3V0KFwiZW5kb2JqXCIpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YW5kYXJkRmllbGRzKSB7XG4gICAgICAgICAgICBjcmVhdGVYRm9ybU9iamVjdENhbGxiYWNrLmNhbGwodGhpcywgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlWEZvcm1PYmplY3RDYWxsYmFjayA9IGZ1bmN0aW9uIChmaWVsZEFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGkgaW4gZmllbGRBcnJheSkge1xuICAgICAgICAgICAgaWYgKGZpZWxkQXJyYXkuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gaTtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRPYmplY3QgPSBmaWVsZEFycmF5W2ldO1xuICAgICAgICAgICAgICAgIC8vIFN0YXJ0IFdyaXRpbmcgdGhlIE9iamVjdFxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oZmllbGRPYmplY3QgJiYgZmllbGRPYmplY3Qub2JqSWQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZE9iamVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZmllbGRPYmplY3QucHV0U3RyZWFtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRPYmplY3QucHV0U3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBmaWVsZEFycmF5W2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGluaXRpYWxpemVBY3JvRm9ybSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWwgIT09IHVuZGVmaW5lZCAmJiAodGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uaXNJbml0aWFsaXplZCA9PT0gZmFsc2UpKSB7XG5cbiAgICAgICAgICAgIHNjb3BlID0gdGhpcztcblxuICAgICAgICAgICAgQWNyb0Zvcm1GaWVsZC5GaWVsZE51bSA9IDA7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhY3JvZm9ybVBsdWdpblRlbXBsYXRlKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIEFjcm9mb3JtRGljdGlvbmFyeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjYWxlRmFjdG9yID0gc2NvcGUuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAvLyBUaGUgT2JqZWN0IE51bWJlciBvZiB0aGUgQWNyb0Zvcm0gRGljdGlvbmFyeVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCA9IG5ldyBBY3JvRm9ybURpY3Rpb25hcnkoKTtcblxuICAgICAgICAgICAgLy8gYWRkIENhbGxiYWNrIGZvciBjcmVhdGluZyB0aGUgQWNyb0Zvcm0gRGljdGlvbmFyeVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRCA9IHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ3Bvc3RQdXRSZXNvdXJjZXMnLCBBY3JvRm9ybURpY3Rpb25hcnlDYWxsYmFjayk7XG5cbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2J1aWxkRG9jdW1lbnQnLCBhbm5vdFJlZmVyZW5jZUNhbGxiYWNrKTsgLy8gYnVpbGREb2N1bWVudFxuXG4gICAgICAgICAgICAvLyBSZWdpc3RlciBldmVudCwgdGhhdCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgRG9jdW1lbnRDYXRhbG9nIGlzXG4gICAgICAgICAgICAvLyB3cml0dGVuLCBpbiBvcmRlciB0byBhZGQgL0Fjcm9Gb3JtXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwdXRDYXRhbG9nJywgcHV0Q2F0YWxvZ0NhbGxiYWNrKTtcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXZlbnQsIHRoYXQgY3JlYXRlcyBhbGwgRmllbGRzXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwb3N0UHV0UGFnZXMnLCBjcmVhdGVGaWVsZENhbGxiYWNrKTtcblxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDI2LCA3LjMuNlxuICAgIHZhciBhcnJheVRvUGRmQXJyYXkgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uYXJyYXlUb1BkZkFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSAnWyc7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSAnICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGFycmF5W2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBhcnJheVtpXS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaV0uc3Vic3RyKDAsIDEpICE9PSAnLycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9ICcoJyArIHBkZkVzY2FwZShhcnJheVtpXS50b1N0cmluZygpKSArICcpJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBhcnJheVtpXS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCArPSAnXSc7XG4gICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLl9fYWNyb2Zvcm1fXy5hcnJheVRvUGRmQXJyYXknKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoZXMoc3RyaW5nLCByZWdleCwgaW5kZXgpIHtcbiAgICAgICAgaW5kZXggfHwgKGluZGV4ID0gMSk7IC8vIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGNhcHR1cmluZyBncm91cFxuICAgICAgICB2YXIgbWF0Y2hlcyA9IFtdO1xuICAgICAgICB2YXIgbWF0Y2g7XG4gICAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyaW5nKSkge1xuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hdGNoZXM7XG4gICAgfVxuICAgIHZhciBwZGZBcnJheVRvU3RyaW5nQXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGFycmF5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBnZXRNYXRjaGVzKGFycmF5LCAvXFwoKC4qPylcXCkvZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdmFyIHRvUGRmU3RyaW5nID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgICAgICBzdHJpbmcgPSBzdHJpbmcgfHwgXCJcIjtcbiAgICAgICAgc3RyaW5nLnRvU3RyaW5nKCk7XG4gICAgICAgIHN0cmluZyA9ICcoJyArIHBkZkVzY2FwZShzdHJpbmcpICsgJyknO1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH07XG5cbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuICAgIC8vIENsYXNzZXNcbiAgICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1QREZPYmplY3RcbiAgICAqIEBjbGFzc2Rlc2MgQSBBY3JvRm9ybVBERk9iamVjdFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUERGT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX29iaklkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtUERGT2JqZWN0I29iaklkXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdvYmpJZCcsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX29iaklkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9vYmpJZCA9IHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JqSWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9vYmpJZCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAZnVuY3Rpb24gQWNyb0Zvcm1QREZPYmplY3QudG9TdHJpbmdcbiAgICAqL1xuICAgIEFjcm9Gb3JtUERGT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JqSWQgKyBcIiAwIFJcIjtcbiAgICB9O1xuXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLnB1dFN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IHRoaXMuZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtKCk7XG4gICAgICAgIHNjb3BlLmludGVybmFsLnB1dFN0cmVhbSh7IGRhdGE6IHRoaXMuc3RyZWFtLCBhZGRpdGlvbmFsS2V5VmFsdWVzOiBrZXlWYWx1ZUxpc3QgfSk7XG4gICAgICAgIHNjb3BlLmludGVybmFsLm91dChcImVuZG9ialwiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBSZXR1cm5zIGFuIGtleS12YWx1ZS1MaXN0IG9mIGFsbCBub24tY29uZmlndXJhYmxlIFZhcmlhYmxlcyBmcm9tIHRoZSBPYmplY3RcbiAgICAqIFxuICAgICogQG5hbWUgZ2V0S2V5VmFsdWVMaXN0Rm9yU3RyZWFtXG4gICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICovXG4gICAgQWNyb0Zvcm1QREZPYmplY3QucHJvdG90eXBlLmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNyZWF0ZUtleVZhbHVlTGlzdEZyb21GaWVsZE9iamVjdCA9IGZ1bmN0aW9uIChmaWVsZE9iamVjdCkge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlTGlzdCA9IFtdO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhmaWVsZE9iamVjdCkuZmlsdGVyKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGtleSAhPSAnY29udGVudCcgJiYga2V5ICE9ICdhcHBlYXJhbmNlU3RyZWFtQ29udGVudCcgJiYga2V5LnN1YnN0cmluZygwLCAxKSAhPSBcIl9cIik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBrZXlzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZmllbGRPYmplY3QsIGtleXNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eURlc2NyaXB0b3IgJiYgcHJvcGVydHlEZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGZpZWxkT2JqZWN0W2tleV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGFycmF5VG9QZGZBcnJheSh2YWx1ZSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQWNyb0Zvcm1QREZPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGl0IGlzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgUERGT2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgdGhlIHJlZmVyZW5jZSBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUub2JqSWQgKyBcIiAwIFJcIiB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUxpc3QucHVzaCh7IGtleToga2V5LCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ga2V5VmFsdWVMaXN0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVLZXlWYWx1ZUxpc3RGcm9tRmllbGRPYmplY3QodGhpcyk7XG4gICAgfTtcblxuICAgIHZhciBBY3JvRm9ybVhPYmplY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtUERGT2JqZWN0LmNhbGwodGhpcyk7XG5cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1R5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIvWE9iamVjdFwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1N1YnR5cGUnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIvRm9ybVwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0Zvcm1UeXBlJywge1xuICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQkJveCA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0JCb3gnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9CQm94O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0JCb3ggPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdSZXNvdXJjZXMnLCB7XG4gICAgICAgICAgICB2YWx1ZTogXCIyIDAgUlwiLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX3N0cmVhbTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzdHJlYW0nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3N0cmVhbSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpbmhlcml0KEFjcm9Gb3JtWE9iamVjdCwgQWNyb0Zvcm1QREZPYmplY3QpO1xuXG4gICAgdmFyIEFjcm9Gb3JtRGljdGlvbmFyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuICAgICAgICB2YXIgX0tpZHMgPSBbXTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0tpZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfS2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfS2lkcztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRmllbGRzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9LaWRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBEZWZhdWx0IEFwcGVhcmFuY2VcbiAgICAgICAgdmFyIF9EQTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdEQScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RBKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAnKCcgKyBfREEgKyAnKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9EQSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdChBY3JvRm9ybURpY3Rpb25hcnksIEFjcm9Gb3JtUERGT2JqZWN0KTtcblxuICAgIC8qKlxuICAgICogVGhlIEZpZWxkIE9iamVjdCBjb250YWlucyB0aGUgVmFyaWFibGVzLCB0aGF0IGV2ZXJ5IEZpZWxkIG5lZWRzXG4gICAgKiBcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUZpZWxkXG4gICAgKiBAY2xhc3NkZXNjIEFuIEFjcm9Gb3JtIEZpZWxkT2JqZWN0XG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1GaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1QREZPYmplY3QuY2FsbCh0aGlzKTtcblxuICAgICAgICAvL0Fubm90YXRpb24tRmxhZyBTZWUgVGFibGUgMTY1XG4gICAgICAgIHZhciBfRiA9IDQ7XG4gICAgICAgIHRoaXMuaXNVbmljb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudHJ1ZVZhbHVlID0gJyc7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfRjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9GID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRiBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS4yKSBJZiBzZXQsIHByaW50IHRoZSBhbm5vdGF0aW9uIHdoZW4gdGhlIHBhZ2UgaXMgcHJpbnRlZC4gSWYgY2xlYXIsIG5ldmVyIHByaW50IHRoZSBhbm5vdGF0aW9uLCByZWdhcmRsZXNzIG9mIHdldGhlciBpcyBpcyBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi4gXG4gICAgICAgICogTk9URSAyIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgYW5ub3RhdGlvbnMgcmVwcmVzZW50aW5nIGludGVyYWN0aXZlIHB1c2hidXR0b25zLCB3aGljaCB3b3VsZCBzZXJ2ZSBubyBtZWFuaW5nZnVsIHB1cnBvc2Ugb24gdGhlIHByaW50ZWQgcGFnZS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjc2hvd1doZW5QcmludGVkXG4gICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3Nob3dXaGVuUHJpbnRlZCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYoX0YsIDMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkYgPSBzZXRCaXRGb3JQZGYoX0YsIDMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRiA9IGNsZWFyQml0Rm9yUGRmKF9GLCAzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfRmYgPSAwO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0ZmJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GZjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9GZiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIEZmIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9SZWN0ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUmVjdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfUmVjdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9SZWN0O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBfUmVjdCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9SZWN0ID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgeC1wb3NpdGlvbiBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3hcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd4Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzBdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzBdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgeS1wb3NpdGlvbiBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3lcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd5Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzFdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzFdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN3aWR0aFxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3dpZHRoJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbMl0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzJdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzJdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjaGVpZ2h0XG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGVpZ2h0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1JlY3QgfHwgaXNOYU4oX1JlY3RbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9SZWN0WzNdKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9SZWN0WzNdID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0ZUID0gXCJcIjtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGVCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9GVFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcvQnRuJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL1R4JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL0NoJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL1NpZyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBfRlQgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgRlQgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX1QgPSBudWxsO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfVCB8fCBfVC5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBDaGlsZCBmcm9tIGEgUmFkaW/CtEdyb3VwLCB5b3UgZG9uJ3QgbmVlZCBhIEZpZWxkTmFtZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQ2hpbGRDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfVCA9IFwiRmllbGRPYmplY3RcIiArIChBY3JvRm9ybUZpZWxkLkZpZWxkTnVtKyspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJygnICsgcGRmRXNjYXBlKF9UKSArICcpJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9UID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsKSBUaGUgcGFydGlhbCBmaWVsZCBuYW1lIChzZWUgMTIuNy4zLjIsIOKAnEZpZWxkIE5hbWVz4oCdKS5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZmllbGROYW1lXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmllbGROYW1lJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfVDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9UID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfZm9udE5hbWUgPSAnaGVsdmV0aWNhJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnROYW1lIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnROYW1lXG4gICAgICAgICogQGRlZmF1bHQgJ2hlbHZldGljYSdcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZvbnROYW1lJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZm9udE5hbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udE5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnRTdHlsZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmb250U3R5bGVcbiAgICAgICAgKiBAZGVmYXVsdCAnbm9ybWFsJ1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZm9udFN0eWxlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZm9udFN0eWxlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2ZvbnRTdHlsZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2ZvbnRTaXplID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGZvbnRTaXplIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZvbnRTaXplXG4gICAgICAgICogQGRlZmF1bHQgMCAoZm9yIGF1dG8pXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmb250U2l6ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9mb250U2l6ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfZm9udFNpemUgPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfbWF4Rm9udFNpemUgPSA1MDtcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIG1heGltdW0gZm9udFNpemUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjbWF4Rm9udFNpemVcbiAgICAgICAgKiBAZGVmYXVsdCAwIChmb3IgYXV0bylcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21heEZvbnRTaXplJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbnRpU2NhbGUoX21heEZvbnRTaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9tYXhGb250U2l6ZSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9jb2xvciA9ICdibGFjayc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBjb2xvciBvZiB0aGUgdGV4dFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNjb2xvclxuICAgICAgICAqIEBkZWZhdWx0ICdibGFjaydcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfHJnYmF9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY29sb3InLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb2xvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9jb2xvciA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0RBID0gJy9GMSAwIFRmIDAgZyc7XG4gICAgICAgIC8vIERlZmluZXMgdGhlIGRlZmF1bHQgYXBwZWFyYW5jZSAoTmVlZGVkIGZvciB2YXJpYWJsZSBUZXh0KVxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0RBJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9EQVxuICAgICAgICAgICAgICAgICAgICB8fCB0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1DaGlsZENsYXNzXG4gICAgICAgICAgICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybVRleHRGaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX0RBKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBfREEgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB2YXIgX0RWID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdEVicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX0RWKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvUGRmU3RyaW5nKF9EVik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfRFY7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3Vic3RyKDAsIDEpID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9EViA9IHBkZlVuZXNjYXBlKHZhbHVlLnN1YnN0cigxLCB2YWx1ZS5sZW5ndGggLSAyKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfRFYgPSBwZGZVbmVzY2FwZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHdoaWNoIHRoZSBmaWVsZCByZXZlcnRzIHdoZW4gYSByZXNldC1mb3JtIGFjdGlvbiBpcyBleGVjdXRlZCAoc2VlIDEyLjcuNS4zLCDigJxSZXNldC1Gb3JtIEFjdGlvbuKAnSkuIFRoZSBmb3JtYXQgb2YgdGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHZhbHVlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZGVmYXVsdFZhbHVlXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZGVmYXVsdFZhbHVlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGRmVW5lc2NhcGUoX0RWLnN1YnN0cigxLCBfRFYubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfRFY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfRFYgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfViA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX1Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghX1YpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9QZGZTdHJpbmcoX1YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX1Y7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIF9WID0gdG9Vbmljb2RlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cnVlVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdWJzdHIoMCwgMSkgPT09ICcoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WID0gcGRmVW5lc2NhcGUodmFsdWUuc3Vic3RyKDEsIHZhbHVlLmxlbmd0aCAtIDIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX1YgPSBwZGZVbmVzY2FwZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfViA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBUaGUgZmllbGTigJlzIHZhbHVlLCB3aG9zZSBmb3JtYXQgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZS4gU2VlIHRoZSBkZXNjcmlwdGlvbnMgb2YgaW5kaXZpZHVhbCBmaWVsZCB0eXBlcyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3ZhbHVlXG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndmFsdWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwZGZVbmVzY2FwZShfVi5zdWJzdHIoMSwgX1YubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfVjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1CdXR0b24gPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9WID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX1YgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrIGlmIGZpZWxkIGhhcyBhbm5vdGF0aW9uc1xuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoYXNBbm5vdGF0aW9uXG4gICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQW5ub3RhdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuUmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVHlwZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmhhc0Fubm90YXRpb24pID8gXCIvQW5ub3RcIiA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnU3VidHlwZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLmhhc0Fubm90YXRpb24pID8gXCIvV2lkZ2V0XCIgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2hhc0FwcGVhcmFuY2VTdHJlYW0gPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICogdHJ1ZSBpZiBmaWVsZCBoYXMgYW4gYXBwZWFyYW5jZVN0cmVhbVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNoYXNBcHBlYXJhbmNlU3RyZWFtXG4gICAgICAgICogQHJlYWRvbmx5XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFzQXBwZWFyYW5jZVN0cmVhbScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2hhc0FwcGVhcmFuY2VTdHJlYW07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IEJvb2xlYW4odmFsdWUpO1xuICAgICAgICAgICAgICAgIF9oYXNBcHBlYXJhbmNlU3RyZWFtID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBwYWdlIG9uIHdoaWNoIHRoZSBBY3JvRm9ybUZpZWxkIGlzIHBsYWNlZFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNwYWdlXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgdmFyIF9wYWdlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3BhZ2UnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfcGFnZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX3BhZ2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9wYWdlID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIHVzZXIgbWF5IG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gQW55IGFzc29jaWF0ZWQgd2lkZ2V0IGFubm90YXRpb25zIHdpbGwgbm90IGludGVyYWN0IHdpdGggdGhlIHVzZXI7IHRoYXQgaXMsIHRoZXkgd2lsbCBub3QgcmVzcG9uZCB0byBtb3VzZSBjbGlja3Mgb3IgY2hhbmdlIHRoZWlyIGFwcGVhcmFuY2UgaW4gcmVzcG9uc2UgdG8gbW91c2UgbW90aW9ucy4gVGhpcyBmbGFnIGlzIHVzZWZ1bCBmb3IgZmllbGRzIHdob3NlIHZhbHVlcyBhcmUgY29tcHV0ZWQgb3IgaW1wb3J0ZWQgZnJvbSBhIGRhdGFiYXNlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjcmVhZE9ubHlcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JlYWRPbmx5Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBoYXZlIGEgdmFsdWUgYXQgdGhlIHRpbWUgaXQgaXMgZXhwb3J0ZWQgYnkgYSBzdWJtaXRmb3JtIGFjdGlvbiAoc2VlIDEyLjcuNS4yLCDigJxTdWJtaXQtRm9ybSBBY3Rpb27igJ0pLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjcmVxdWlyZWRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JlcXVpcmVkJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBub3QgYmUgZXhwb3J0ZWQgYnkgYSBzdWJtaXQtZm9ybSBhY3Rpb24gKHNlZSAxMi43LjUuMiwg4oCcU3VibWl0LUZvcm0gQWN0aW9u4oCdKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNub0V4cG9ydFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbm9FeHBvcnQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgdmFyIF9RID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdRJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX1EgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9RO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFswLCAxLCAyXS5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgX1EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBRIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgQSBjb2RlIHNwZWNpZnlpbmcgdGhlIGZvcm0gb2YgcXVhZGRpbmcgKGp1c3RpZmljYXRpb24pIHRoYXQgc2hhbGwgYmUgdXNlZCBpbiBkaXNwbGF5aW5nIHRoZSB0ZXh0OlxuICAgICAgICAqICdsZWZ0JywgJ2NlbnRlcicsICdyaWdodCdcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjdGV4dEFsaWduXG4gICAgICAgICogQGRlZmF1bHQgJ2xlZnQnXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0ZXh0QWxpZ24nLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX1EpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gJ2xlZnQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdjZW50ZXInO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdyaWdodCc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9RID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgX1EgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgaW5oZXJpdChBY3JvRm9ybUZpZWxkLCBBY3JvRm9ybVBERk9iamVjdCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1DaG9pY2VGaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICAvLyBGaWVsZCBUeXBlID0gQ2hvaWNlIEZpZWxkXG4gICAgICAgIHRoaXMuRlQgPSBcIi9DaFwiO1xuICAgICAgICAvLyBvcHRpb25zXG4gICAgICAgIHRoaXMuViA9ICcoKSc7XG5cbiAgICAgICAgdGhpcy5mb250TmFtZSA9ICd6YXBmZGluZ2JhdHMnO1xuICAgICAgICAvLyBUb3AgSW5kZXhcbiAgICAgICAgdmFyIF9USSA9IDA7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUSScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9USTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9USSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBNSyBmaXggZm9yIEFjcm9iYXRcbiAgICAgICAgdmFyIF9NSyA9ICc8PCAvQkcgWyAwLjk3NSAwLjk3NSAwLjk3NSBdICA+Pic7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnTUsnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTUs7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfTUsgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsKSBGb3Igc2Nyb2xsYWJsZSBsaXN0IGJveGVzLCB0aGUgdG9wIGluZGV4ICh0aGUgaW5kZXggaW4gdGhlIE9wdCBhcnJheSBvZiB0aGUgZmlyc3Qgb3B0aW9uIHZpc2libGUgaW4gdGhlIGxpc3QpLiBEZWZhdWx0IHZhbHVlOiAwLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjdG9wSW5kZXhcbiAgICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0b3BJbmRleCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1RJO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX1RJID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfT3B0ID0gW107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnT3B0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9QZGZVbmljb2RlQXJyYXkoX09wdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvUGRmQXJyYXkoX09wdCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfT3B0ID0gcGRmQXJyYXlUb1N0cmluZ0FycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIGdldE9wdGlvbnNcbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcmV0dXJucyB7YXJyYXl9IGFycmF5IG9mIE9wdGlvbnNcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9PcHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIHNldE9wdGlvbnNcbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge2FycmF5fSB2YWx1ZVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIF9PcHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvcnQpIHtcbiAgICAgICAgICAgICAgICBfT3B0LnNvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgYWRkT3B0aW9uXG4gICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkT3B0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBfT3B0LnB1c2godmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICAgICAgICAgIF9PcHQuc29ydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSByZW1vdmVPcHRpb25cbiAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgKiBAaW5zdGFuY2VcbiAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFsbEVudHJpZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLnJlbW92ZU9wdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSwgYWxsRW50cmllcykge1xuICAgICAgICAgICAgYWxsRW50cmllcyA9IGFsbEVudHJpZXMgfHwgZmFsc2VcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgfHwgXCJcIjtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgd2hpbGUgKF9PcHQuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgX09wdC5zcGxpY2UoX09wdC5pbmRleE9mKHZhbHVlKSwgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGFsbEVudHJpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIGNvbWJvIGJveDsgaWYgY2xlYXIsIHRoZSBmaWVsZCBpcyBhIGxpc3QgYm94LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjY29tYm9cbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbWJvJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxOCkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxOCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBjb21ibyBib3ggc2hhbGwgaW5jbHVkZSBhbiBlZGl0YWJsZSB0ZXh0IGJveCBhcyB3ZWxsIGFzIGEgZHJvcC1kb3duIGxpc3Q7IGlmIGNsZWFyLCBpdCBzaGFsbCBpbmNsdWRlIG9ubHkgYSBkcm9wLWRvd24gbGlzdC4gVGhpcyBmbGFnIHNoYWxsIGJlIHVzZWQgb25seSBpZiB0aGUgQ29tYm8gZmxhZyBpcyBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1DaG9pY2VGaWVsZCNlZGl0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdlZGl0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxOSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbWJvID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxOSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZOKAmXMgb3B0aW9uIGl0ZW1zIHNoYWxsIGJlIHNvcnRlZCBhbHBoYWJldGljYWxseS4gVGhpcyBmbGFnIGlzIGludGVuZGVkIGZvciB1c2UgYnkgd3JpdGVycywgbm90IGJ5IHJlYWRlcnMuIENvbmZvcm1pbmcgcmVhZGVycyBzaGFsbCBkaXNwbGF5IHRoZSBvcHRpb25zIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VyIGluIHRoZSBPcHQgYXJyYXkgKHNlZSBUYWJsZSAyMzEpLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjc29ydFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc29ydCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjApKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIwKTtcbiAgICAgICAgICAgICAgICAgICAgX09wdC5zb3J0KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIG1vcmUgdGhhbiBvbmUgb2YgdGhlIGZpZWxk4oCZcyBvcHRpb24gaXRlbXMgbWF5IGJlIHNlbGVjdGVkIHNpbXVsdGFuZW91c2x5OyBpZiBjbGVhciwgYXQgbW9zdCBvbmUgaXRlbSBzaGFsbCBiZSBzZWxlY3RlZCBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjbXVsdGlTZWxlY3RcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ211bHRpU2VsZWN0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjIpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsY2hlY2tlZC4gVGhpcyBmbGFnIHNoYWxsIG5vdCBiZSB1c2VkIHVubGVzcyB0aGUgQ29tYm8gYW5kIEVkaXQgZmxhZ3MgYXJlIGJvdGggc2V0LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjZG9Ob3RTcGVsbENoZWNrXG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNwZWxsQ2hlY2snLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIHRoZSBuZXcgdmFsdWUgc2hhbGwgYmUgY29tbWl0dGVkIGFzIHNvb24gYXMgYSBzZWxlY3Rpb24gaXMgbWFkZSAoY29tbW9ubHkgd2l0aCB0aGUgcG9pbnRpbmcgZGV2aWNlKS4gSW4gdGhpcyBjYXNlLCBzdXBwbHlpbmcgYSB2YWx1ZSBmb3IgYSBmaWVsZCBpbnZvbHZlcyB0aHJlZSBhY3Rpb25zOiBzZWxlY3RpbmcgdGhlIGZpZWxkIGZvciBmaWxsLWluLCBzZWxlY3RpbmcgYSBjaG9pY2UgZm9yIHRoZSBmaWxsLWluIHZhbHVlLCBhbmQgbGVhdmluZyB0aGF0IGZpZWxkLCB3aGljaCBmaW5hbGl6ZXMgb3Ig4oCcY29tbWl0c+KAnSB0aGUgZGF0YSBjaG9pY2UgYW5kIHRyaWdnZXJzIGFueSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkgb3IgY2hhbmdpbmcgb2YgdGhpcyBkYXRhLiBJZiB0aGlzIGZsYWcgaXMgb24sIHRoZW4gcHJvY2Vzc2luZyBkb2VzIG5vdCB3YWl0IGZvciBsZWF2aW5nIHRoZSBmaWVsZCBhY3Rpb24gdG8gb2NjdXIsIGJ1dCBpbW1lZGlhdGVseSBwcm9jZWVkcyB0byB0aGUgdGhpcmQgc3RlcC5cbiAgICAgICAgKiBUaGlzIG9wdGlvbiBlbmFibGVzIGFwcGxpY2F0aW9ucyB0byBwZXJmb3JtIGFuIGFjdGlvbiBvbmNlIGEgc2VsZWN0aW9uIGlzIG1hZGUsIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2VyIHRvIGV4aXQgdGhlIGZpZWxkLiBJZiBjbGVhciwgdGhlIG5ldyB2YWx1ZSBpcyBub3QgY29tbWl0dGVkIHVudGlsIHRoZSB1c2VyIGV4aXRzIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjY29tbWl0T25TZWxDaGFuZ2VcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbW1pdE9uU2VsQ2hhbmdlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIHRoaXMuaGFzQXBwZWFyYW5jZVN0cmVhbSA9IGZhbHNlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNob2ljZUZpZWxkLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtTGlzdEJveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtTGlzdEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1DaG9pY2VGaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmZvbnROYW1lID0gJ2hlbHZldGljYSc7XG5cbiAgICAgICAgLy9QREYgMzIwMDAtMToyMDA4LCBwYWdlIDQ0NFxuICAgICAgICB0aGlzLmNvbWJvID0gZmFsc2U7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtTGlzdEJveCwgQWNyb0Zvcm1DaG9pY2VGaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNvbWJvQm94IFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1Db21ib0JveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1MaXN0Qm94LmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuY29tYm8gPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNvbWJvQm94LCBBY3JvRm9ybUxpc3RCb3gpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1FZGl0Qm94IFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1Db21ib0JveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1MaXN0Qm94XG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1FZGl0Qm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUNvbWJvQm94LmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuZWRpdCA9IHRydWU7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtRWRpdEJveCwgQWNyb0Zvcm1Db21ib0JveCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuRlQgPSBcIi9CdG5cIjtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmFkaW8gYnV0dG9ucyBvbmx5KSBJZiBzZXQsIGV4YWN0bHkgb25lIHJhZGlvIGJ1dHRvbiBzaGFsbCBiZSBzZWxlY3RlZCBhdCBhbGwgdGltZXM7IHNlbGVjdGluZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJ1dHRvbiBoYXMgbm8gZWZmZWN0LiBJZiBjbGVhciwgY2xpY2tpbmcgdGhlIHNlbGVjdGVkIGJ1dHRvbiBkZXNlbGVjdHMgaXQsIGxlYXZpbmcgbm8gYnV0dG9uIHNlbGVjdGVkLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI25vVG9nZ2xlVG9PZmZcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdub1RvZ2dsZVRvT2ZmJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBpcyBhIHNldCBvZiByYWRpbyBidXR0b25zOyBpZiBjbGVhciwgdGhlIGZpZWxkIGlzIGEgY2hlY2tib3guIFRoaXMgZmxhZyBtYXkgYmUgc2V0IG9ubHkgaWYgdGhlIFB1c2hidXR0b24gZmxhZyBpcyBjbGVhci4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jcmFkaW9cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyYWRpbycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBwdXNoYnV0dG9uIHRoYXQgZG9lcyBub3QgcmV0YWluIGEgcGVybWFuZW50IHZhbHVlLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI3B1c2hCdXR0b25cbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwdXNoQnV0dG9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxNykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxNyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgSWYgc2V0LCBhIGdyb3VwIG9mIHJhZGlvIGJ1dHRvbnMgd2l0aGluIGEgcmFkaW8gYnV0dG9uIGZpZWxkIHRoYXQgdXNlIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgb24gc3RhdGUgd2lsbCB0dXJuIG9uIGFuZCBvZmYgaW4gdW5pc29uOyB0aGF0IGlzIGlmIG9uZSBpcyBjaGVja2VkLCB0aGV5IGFyZSBhbGwgY2hlY2tlZC4gSWYgY2xlYXIsIHRoZSBidXR0b25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKHRoZSBzYW1lIGJlaGF2aW9yIGFzIEhUTUwgcmFkaW8gYnV0dG9ucykuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNyYWRpb0lzVW5pc29uXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmFkaW9Jc1VuaXNvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NSyA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01LJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKF9NSykubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJzw8Jyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIF9NSykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJy8nICsga2V5ICsgJyAoJyArIF9NS1trZXldICsgJyknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPj4nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCdcXG4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LID0gdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEZyb20gdGhlIFBERiByZWZlcmVuY2U6XG4gICAgICAgICogKE9wdGlvbmFsLCBidXR0b24gZmllbGRzIG9ubHkpIFRoZSB3aWRnZXQgYW5ub3RhdGlvbidzIG5vcm1hbCBjYXB0aW9uIHdoaWNoIHNoYWxsIGJlIGRpc3BsYXllZCB3aGVuIGl0IGlzIG5vdCBpbnRlcmFjdGluZyB3aXRoIHRoZSB1c2VyLiBcbiAgICAgICAgKiBVbmxpa2UgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGxpc3RlZCBpbiB0aGlzIFRhYmxlIHdoaWNoIGFwcGx5IG9ubHkgdG8gd2lkZ2V0IGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBwdXNoYnV0dG9uIGZpZWxkcyAoc2VlIFB1c2hidXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIiksIHRoZSBDQSBlbnRyeSBtYXkgYmUgdXNlZCB3aXRoIGFueSB0eXBlIG9mIGJ1dHRvbiBmaWVsZCwgaW5jbHVkaW5nIGNoZWNrIGJveGVzIChzZWUgQ2hlY2sgQm94ZXMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSBhbmQgcmFkaW8gYnV0dG9ucyAoUmFkaW8gQnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLlxuICAgICAgICAqXG4gICAgICAgICogLSAnOCcgPSBDcm9zcywgXG4gICAgICAgICogLSAnbCcgPSAgQ2lyY2xlLFxuICAgICAgICAqIC0gJycgPSBub3RoaW5nXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jY2FwdGlvblxuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY2FwdGlvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01LLkNBIHx8ICcnO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsuQ0EgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfQVM7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnQVMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFJlcXVpcmVkIGlmIHRoZSBhcHBlYXJhbmNlIGRpY3Rpb25hcnkgQVAgY29udGFpbnMgb25lIG9yIG1vcmUgc3ViZGljdGlvbmFyaWVzOyBQREYgMS4yKSBUaGUgYW5ub3RhdGlvbidzIGFwcGVhcmFuY2Ugc3RhdGUsIHdoaWNoIHNlbGVjdHMgdGhlIGFwcGxpY2FibGUgYXBwZWFyYW5jZSBzdHJlYW0gZnJvbSBhbiBhcHBlYXJhbmNlIHN1YmRpY3Rpb25hcnkgKHNlZSBTZWN0aW9uIDEyLjUuNSwgXCJBcHBlYXJhbmNlIFN0cmVhbXNcIilcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2FwcGVhcmFuY2VTdGF0ZVxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYXBwZWFyYW5jZVN0YXRlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVMuc3Vic3RyKDEsIF9BUy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUJ1dHRvbiwgQWNyb0Zvcm1GaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVB1c2hCdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1QdXNoQnV0dG9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLnB1c2hCdXR0b24gPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVB1c2hCdXR0b24sIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUmFkaW9CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1SYWRpb0J1dHRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1CdXR0b24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5yYWRpbyA9IHRydWU7XG4gICAgICAgIHRoaXMucHVzaEJ1dHRvbiA9IGZhbHNlO1xuXG4gICAgICAgIHZhciBfS2lkcyA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0tpZHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfS2lkcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX0tpZHMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfS2lkcyA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtUmFkaW9CdXR0b24sIEFjcm9Gb3JtQnV0dG9uKTtcblxuICAgIC8qKlxuICAgICogVGhlIENoaWxkIGNsYXNzIG9mIGEgUmFkaW9CdXR0b24gKHRoZSByYWRpb0dyb3VwKSAtPiBUaGUgc2luZ2xlIEJ1dHRvbnNcbiAgICAqIFxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ2hpbGRDbGFzc1xuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICogQGlnbm9yZVxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ2hpbGRDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHZhciBfcGFyZW50O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1BhcmVudCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfcGFyZW50O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3BhcmVudCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX29wdGlvbk5hbWU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnb3B0aW9uTmFtZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vcHRpb25OYW1lO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX29wdGlvbk5hbWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NSyA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01LJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc8PCcpO1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gX01LKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcvJyArIGtleSArICcgKCcgKyBfTUtba2V5XSArICcpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc+PicpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuam9pbignXFxuJyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSyA9IHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBGcm9tIHRoZSBQREYgcmVmZXJlbmNlOlxuICAgICAgICAqIChPcHRpb25hbCwgYnV0dG9uIGZpZWxkcyBvbmx5KSBUaGUgd2lkZ2V0IGFubm90YXRpb24ncyBub3JtYWwgY2FwdGlvbiB3aGljaCBzaGFsbCBiZSBkaXNwbGF5ZWQgd2hlbiBpdCBpcyBub3QgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlci4gXG4gICAgICAgICogVW5saWtlIHRoZSByZW1haW5pbmcgZW50cmllcyBsaXN0ZWQgaW4gdGhpcyBUYWJsZSB3aGljaCBhcHBseSBvbmx5IHRvIHdpZGdldCBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggcHVzaGJ1dHRvbiBmaWVsZHMgKHNlZSBQdXNoYnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLCB0aGUgQ0EgZW50cnkgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdHlwZSBvZiBidXR0b24gZmllbGQsIGluY2x1ZGluZyBjaGVjayBib3hlcyAoc2VlIENoZWNrIEJveGVzIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikgYW5kIHJhZGlvIGJ1dHRvbnMgKFJhZGlvIEJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKS5cbiAgICAgICAgKlxuICAgICAgICAqIC0gJzgnID0gQ3Jvc3MsIFxuICAgICAgICAqIC0gJ2wnID0gIENpcmNsZSxcbiAgICAgICAgKiAtICcnID0gbm90aGluZ1xuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2NhcHRpb25cbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NhcHRpb24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NSy5DQSB8fCAnJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LLkNBID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0FTO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0FTJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUmVxdWlyZWQgaWYgdGhlIGFwcGVhcmFuY2UgZGljdGlvbmFyeSBBUCBjb250YWlucyBvbmUgb3IgbW9yZSBzdWJkaWN0aW9uYXJpZXM7IFBERiAxLjIpIFRoZSBhbm5vdGF0aW9uJ3MgYXBwZWFyYW5jZSBzdGF0ZSwgd2hpY2ggc2VsZWN0cyB0aGUgYXBwbGljYWJsZSBhcHBlYXJhbmNlIHN0cmVhbSBmcm9tIGFuIGFwcGVhcmFuY2Ugc3ViZGljdGlvbmFyeSAoc2VlIFNlY3Rpb24gMTIuNS41LCBcIkFwcGVhcmFuY2UgU3RyZWFtc1wiKVxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jYXBwZWFyYW5jZVN0YXRlXG4gICAgICAgICogQHR5cGUge2FueX1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdhcHBlYXJhbmNlU3RhdGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUy5zdWJzdHIoMSwgX0FTLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX0FTID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhcHRpb24gPSAnbCc7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0YXRlID0gJ09mZic7XG4gICAgICAgIC8vIHRvZG86IHNldCBBcHBlYXJhbmNlVHlwZSBhcyB2YXJpYWJsZSB0aGF0IGNhbiBiZSBzZXQgZnJvbSB0aGVcbiAgICAgICAgLy8gb3V0c2lkZS4uLlxuICAgICAgICB0aGlzLl9BcHBlYXJhbmNlVHlwZSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGU7XG4gICAgICAgIC8vIFRoZSBEZWZhdWx0IGFwcGVhcmFuY2VUeXBlIGlzIHRoZSBDaXJjbGVcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IHRoaXMuX0FwcGVhcmFuY2VUeXBlLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0odGhpcy5vcHRpb25OYW1lKTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1DaGlsZENsYXNzLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIEFjcm9Gb3JtUmFkaW9CdXR0b24ucHJvdG90eXBlLnNldEFwcGVhcmFuY2UgPSBmdW5jdGlvbiAoYXBwZWFyYW5jZSkge1xuICAgICAgICBpZiAoISgnY3JlYXRlQXBwZWFyYW5jZVN0cmVhbScgaW4gYXBwZWFyYW5jZSAmJiAnZ2V0Q0EnIGluIGFwcGVhcmFuY2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBhc3NpZ24gQXBwZWFyYW5jZSB0byBSYWRpb0J1dHRvbi4gQXBwZWFyYW5jZSB3YXMgSW52YWxpZCFcIik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgb2JqSWQgaW4gdGhpcy5LaWRzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5LaWRzLmhhc093blByb3BlcnR5KG9iaklkKSkge1xuICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHRoaXMuS2lkc1tvYmpJZF07XG4gICAgICAgICAgICAgICAgY2hpbGQuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSBhcHBlYXJhbmNlLmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0oY2hpbGQub3B0aW9uTmFtZSk7XG4gICAgICAgICAgICAgICAgY2hpbGQuY2FwdGlvbiA9IGFwcGVhcmFuY2UuZ2V0Q0EoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBBY3JvRm9ybVJhZGlvQnV0dG9uLnByb3RvdHlwZS5jcmVhdGVPcHRpb24gPSBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAvLyBDcmVhdGUgbmV3IENoaWxkIGZvciBSYWRpb0dyb3VwXG4gICAgICAgIHZhciBjaGlsZCA9IG5ldyBBY3JvRm9ybUNoaWxkQ2xhc3MoKTtcbiAgICAgICAgY2hpbGQuUGFyZW50ID0gdGhpcztcbiAgICAgICAgY2hpbGQub3B0aW9uTmFtZSA9IG5hbWU7XG4gICAgICAgIC8vIEFkZCB0byBQYXJlbnRcbiAgICAgICAgdGhpcy5LaWRzLnB1c2goY2hpbGQpO1xuXG4gICAgICAgIGFkZEZpZWxkLmNhbGwodGhpcywgY2hpbGQpO1xuXG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1DaGVja0JveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNoZWNrQm94ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUJ1dHRvbi5jYWxsKHRoaXMpO1xuXG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSAnemFwZmRpbmdiYXRzJztcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gJzMnO1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdGF0ZSA9ICdPbic7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIk9uXCI7XG4gICAgICAgIHRoaXMudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guY3JlYXRlQXBwZWFyYW5jZVN0cmVhbSgpO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUNoZWNrQm94LCBBY3JvRm9ybUJ1dHRvbik7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVRleHRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtVGV4dEZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybUZpZWxkLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMuRlQgPSAnL1R4JztcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSBmaWVsZCBtYXkgY29udGFpbiBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0OyBpZiBjbGVhciwgdGhlIGZpZWxk4oCZcyB0ZXh0IHNoYWxsIGJlIHJlc3RyaWN0ZWQgdG8gYSBzaW5nbGUgbGluZS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVRleHRGaWVsZCNtdWx0aWxpbmVcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtdWx0aWxpbmUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDEzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxMyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDEzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHJlcHJlc2VudHMgdGhlIHBhdGhuYW1lIG9mIGEgZmlsZSB3aG9zZSBjb250ZW50cyBzaGFsbCBiZSBzdWJtaXR0ZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZmlsZVNlbGVjdFxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZpbGVTZWxlY3QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIxKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS40KSBJZiBzZXQsIHRleHQgZW50ZXJlZCBpbiB0aGUgZmllbGQgc2hhbGwgbm90IGJlIHNwZWxsLWNoZWNrZWQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZG9Ob3RTcGVsbENoZWNrXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZG9Ob3RTcGVsbENoZWNrJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgbm90IHNjcm9sbCAoaG9yaXpvbnRhbGx5IGZvciBzaW5nbGUtbGluZSBmaWVsZHMsIHZlcnRpY2FsbHkgZm9yIG11bHRpcGxlLWxpbmUgZmllbGRzKSB0byBhY2NvbW1vZGF0ZSBtb3JlIHRleHQgdGhhbiBmaXRzIHdpdGhpbiBpdHMgYW5ub3RhdGlvbiByZWN0YW5nbGUuIE9uY2UgdGhlIGZpZWxkIGlzIGZ1bGwsIG5vIGZ1cnRoZXIgdGV4dCBzaGFsbCBiZSBhY2NlcHRlZCBmb3IgaW50ZXJhY3RpdmUgZm9ybSBmaWxsaW5nOyBmb3Igbm9uaW50ZXJhY3RpdmUgZm9ybSBmaWxsaW5nLCB0aGUgZmlsbGVyIHNob3VsZCB0YWtlIGNhcmUgbm90IHRvIGFkZCBtb3JlIGNoYXJhY3RlciB0aGFuIHdpbGwgdmlzaWJseSBmaXQgaW4gdGhlIGRlZmluZWQgYXJlYS4gXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjZG9Ob3RTY3JvbGxcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdkb05vdFNjcm9sbCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIE1heSBiZSBzZXQgb25seSBpZiB0aGUgTWF4TGVuIGVudHJ5IGlzIHByZXNlbnQgaW4gdGhlIHRleHQgZmllbGQgZGljdGlvbmFyeSAoc2VlIFRhYmxlIDIyOSkgYW5kIGlmIHRoZSBNdWx0aWxpbmUsIFBhc3N3b3JkLCBhbmQgRmlsZVNlbGVjdCBmbGFncyBhcmUgY2xlYXIuIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIGJlIGF1dG9tYXRpY2FsbHkgZGl2aWRlZCBpbnRvIGFzIG1hbnkgZXF1YWxseSBzcGFjZWQgcG9zaXRpb25zLCBvciBjb21icywgYXMgdGhlIHZhbHVlIG9mIE1heExlbiwgYW5kIHRoZSB0ZXh0IGlzIGxhaWQgb3V0IGludG8gdGhvc2UgY29tYnMuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjY29tYlxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbWInLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI1KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI1KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBJZiBzZXQsIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHNoYWxsIGJlIGEgcmljaCB0ZXh0IHN0cmluZyAoc2VlIDEyLjcuMy40LCDigJxSaWNoIFRleHQgU3RyaW5nc+KAnSkuIElmIHRoZSBmaWVsZCBoYXMgYSB2YWx1ZSwgdGhlIFJWIGVudHJ5IG9mIHRoZSBmaWVsZCBkaWN0aW9uYXJ5IChUYWJsZSAyMjIpIHNoYWxsIHNwZWNpZnkgdGhlIHJpY2ggdGV4dCBzdHJpbmcuXG4gICAgICAgICogXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjcmljaFRleHRcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyaWNoVGV4dCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9NYXhMZW4gPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01heExlbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NYXhMZW47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfTWF4TGVuID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZmllbGTigJlzIHRleHQsIGluIGNoYXJhY3RlcnMuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjbWF4TGVuZ3RoXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtYXhMZW5ndGgnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NYXhMZW47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX01heExlbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2hhc0FwcGVhcmFuY2VTdHJlYW0nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLlYgfHwgdGhpcy5EVik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtVGV4dEZpZWxkLCBBY3JvRm9ybUZpZWxkKTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUGFzc3dvcmRGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1UZXh0RmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVBhc3N3b3JkRmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtVGV4dEZpZWxkLmNhbGwodGhpcyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgaW50ZW5kZWQgZm9yIGVudGVyaW5nIGEgc2VjdXJlIHBhc3N3b3JkIHRoYXQgc2hvdWxkIG5vdCBiZSBlY2hvZWQgdmlzaWJseSB0byB0aGUgc2NyZWVuLiBDaGFyYWN0ZXJzIHR5cGVkIGZyb20gdGhlIGtleWJvYXJkIHNoYWxsIGluc3RlYWQgYmUgZWNob2VkIGluIHNvbWUgdW5yZWFkYWJsZSBmb3JtLCBzdWNoIGFzIGFzdGVyaXNrcyBvciBidWxsZXQgY2hhcmFjdGVycy5cbiAgICAgICAgKiBOT1RFIFRvIHByb3RlY3QgcGFzc3dvcmQgY29uZmlkZW50aWFsaXR5LCByZWFkZXJzIHNob3VsZCBuZXZlciBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIHRleHQgZmllbGQgaW4gdGhlIFBERiBmaWxlIGlmIHRoaXMgZmxhZyBpcyBzZXQuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjcGFzc3dvcmRcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwYXNzd29yZCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTQpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE0KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGFzc3dvcmQgPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVBhc3N3b3JkRmllbGQsIEFjcm9Gb3JtVGV4dEZpZWxkKTtcblxuXG4gICAgLy8gQ29udGFpbnMgTWV0aG9kcyBmb3IgY3JlYXRpbmcgc3RhbmRhcmQgYXBwZWFyYW5jZXNcbiAgICB2YXIgQWNyb0Zvcm1BcHBlYXJhbmNlID0ge1xuICAgICAgICBDaGVja0JveDoge1xuICAgICAgICAgICAgY3JlYXRlQXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICBOOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPbjogQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94Llllc05vcm1hbFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPbjogQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94Llllc1B1c2hEb3duLFxuICAgICAgICAgICAgICAgICAgICAgICAgT2ZmOiBBY3JvRm9ybUFwcGVhcmFuY2UuQ2hlY2tCb3guT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBPbiBBcHBlYXJhbmNlIGZvciBhIENoZWNrQm94XG4gICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICogQHJldHVybnMge0Fjcm9Gb3JtWE9iamVjdH1cbiAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIFllc1B1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBlbmNvZGVkQ29sb3IgPSBzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgICAgICAgICB2YXIgY2FsY1JlcyA9IGNhbGN1bGF0ZVgoZm9ybU9iamVjdCwgZm9ybU9iamVjdC5jYXB0aW9uKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkJNQ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgMSByZ1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi9cIiArIGZvbnRLZXkgKyBcIiBcIiArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgXCIgVGYgXCIgKyBlbmNvZGVkQ29sb3IpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiQlRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goY2FsY1Jlcy50ZXh0KTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkVNQ1wiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgWWVzTm9ybWFsOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBmb250S2V5ID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udChmb3JtT2JqZWN0LmZvbnROYW1lLCBmb3JtT2JqZWN0LmZvbnRTdHlsZSkuaWQ7XG4gICAgICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGNSZXMgPSBjYWxjdWxhdGVYKGZvcm1PYmplY3QsIGZvcm1PYmplY3QuY2FwdGlvbik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMih3aWR0aCkgKyBcIiBcIiArIGYyKGhlaWdodCkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIDEgcmdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMih3aWR0aCAtIDEpICsgXCIgXCIgKyBmMihoZWlnaHQgLSAxKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiV1wiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIm5cIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJCVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi9cIiArIGZvbnRLZXkgKyBcIiBcIiArIGYyKGNhbGNSZXMuZm9udFNpemUpICsgXCIgVGYgXCIgKyBlbmNvZGVkQ29sb3IpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGNhbGNSZXMudGV4dCk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJFVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIE9mZiBBcHBlYXJhbmNlIGZvciBhIENoZWNrQm94XG4gICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICogQHJldHVybnMge0Fjcm9Gb3JtWE9iamVjdH1cbiAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIFJhZGlvQnV0dG9uOiB7XG4gICAgICAgICAgICBDaXJjbGU6IHtcbiAgICAgICAgICAgICAgICBjcmVhdGVBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBEOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09mZic6IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBOOiB7fVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5OW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWw7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50LkRbbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc1B1c2hEb3duO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRDQTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2wnO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBZZXNOb3JtYWw6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIFJhZGl1cyBvZiB0aGUgQ2lyY2xlIHJlbGF0aXZlIHRvIG1pbihoZWlnaHQsIHdpZHRoKSBvZiBmb3JtT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSAoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIDw9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpID8gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gNCA6IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyA0O1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQm9yZGVycGFkZGluZy4uLlxuICAgICAgICAgICAgICAgICAgICBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzQmV6aWVyID0gTnVtYmVyKChEb3RSYWRpdXMgKiBjKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBGb2xsb3dpbmcgaXMgYSBDaXJjbGUgY3JlYXRlZCB3aXRoIEJlemllci1DdXJ2ZXMuXG4gICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1cyArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBcIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIC1cIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1c0JlemllciArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFllc1B1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSA8PSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyA0IDogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDQ7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBCb3JkZXJwYWRkaW5nLi4uXG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVzdWx0cyBmb3IgbGF0ZXIgdXNlOyBubyBuZWVkIHRvIHdhc3RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciB0aWNrcyBvbiBkb2luZyBtYXRoXG4gICAgICAgICAgICAgICAgICAgIHZhciBrID0gTnVtYmVyKChEb3RSYWRpdXMgKiAyKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtjID0gTnVtYmVyKChrICogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRjID0gTnVtYmVyKChEb3RSYWRpdXMgKiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuQmV6aWVyX0MpLnRvRml4ZWQoNSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGsgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrYyArIFwiIFwiICsgayArIFwiIC1cIiArIGsgKyBcIiBcIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIC1cIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrYyArIFwiIC1cIiArIGsgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIFwiICsgayArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goRG90UmFkaXVzICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBkYyArIFwiIFwiICsgZGMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgXCIgKyBEb3RSYWRpdXMgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGRjICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIGRjICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIERvdFJhZGl1cyArIFwiIC1cIiArIGRjICsgXCIgLVwiICsgZGMgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIC1cIiArIERvdFJhZGl1cyArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGRjICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBkYyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPZmZQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IChBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgPD0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gNCA6IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyA0O1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQm9yZGVycGFkZGluZy4uLlxuICAgICAgICAgICAgICAgICAgICBEb3RSYWRpdXMgPSBOdW1iZXIoKERvdFJhZGl1cyAqIDAuOSkudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVzdWx0cyBmb3IgbGF0ZXIgdXNlOyBubyBuZWVkIHRvIHdhc3RlXG4gICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciB0aWNrcyBvbiBkb2luZyBtYXRoXG4gICAgICAgICAgICAgICAgICAgIHZhciBrID0gTnVtYmVyKChEb3RSYWRpdXMgKiAyKS50b0ZpeGVkKDUpKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtjID0gTnVtYmVyKChrICogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtcblxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgXCIgKyBrYyArIFwiIFwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIFwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgayArIFwiIC1cIiArIGtjICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCAtXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goa2MgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgQ3Jvc3M6IHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICogQ3JlYXRlcyB0aGUgQWN0dWFsIEFwcGVhcmFuY2VEaWN0aW9uYXJ5LVJlZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICogXG4gICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICAgICAgICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICAgICAgICAgICAgICAqIEBpZ25vcmVcbiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY3JlYXRlQXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgRDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPZmYnOiBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ3Jvc3MuT2ZmUHVzaERvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBOOiB7fVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5OW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNyb3NzLlllc05vcm1hbDtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuRFtuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5Dcm9zcy5ZZXNQdXNoRG93bjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0Q0E6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc4J1xuICAgICAgICAgICAgICAgIH0sXG5cblxuICAgICAgICAgICAgICAgIFllc05vcm1hbDogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNyb3NzID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmNhbGN1bGF0ZUNyb3NzKGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAxIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC0gMikgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLSAyKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIldcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiblwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDEueCkgKyBcIiBcIiArIGYyKGNyb3NzLngxLnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDIueCkgKyBcIiBcIiArIGYyKGNyb3NzLngyLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDQueCkgKyBcIiBcIiArIGYyKGNyb3NzLng0LnkpICsgXCIgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goZjIoY3Jvc3MueDMueCkgKyBcIiBcIiArIGYyKGNyb3NzLngzLnkpICsgXCIgbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJzXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgWWVzUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY3Jvc3MgPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuY2FsY3VsYXRlQ3Jvc3MoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMSBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAtIDIpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC0gMikgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJXXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIm5cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngxLngpICsgXCIgXCIgKyBmMihjcm9zcy54MS55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngyLngpICsgXCIgXCIgKyBmMihjcm9zcy54Mi55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLng0LngpICsgXCIgXCIgKyBmMihjcm9zcy54NC55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngzLngpICsgXCIgXCIgKyBmMihjcm9zcy54My55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwic1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9mZlB1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgQXBwZWFyYW5jZVxuICAgICAgICAgICogXG4gICAgICAgICAgKiBAcmV0dXJucyB7QWNyb0Zvcm1YT2JqZWN0fVxuICAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZURlZmF1bHRBcHBlYXJhbmNlU3RyZWFtOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgLy8gU2V0IEhlbHZldGljYSB0byBTdGFuZGFyZCBGb250IChzaXplOiBhdXRvKVxuICAgICAgICAgICAgLy8gQ29sb3I6IEJsYWNrXG4gICAgICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuICAgICAgICAgICAgdmFyIGVuY29kZWRDb2xvciA9IHNjb3BlLl9fcHJpdmF0ZV9fLmVuY29kZUNvbG9yU3RyaW5nKGZvcm1PYmplY3QuY29sb3IpO1xuICAgICAgICAgICAgdmFyIGZvbnRTaXplID0gZm9ybU9iamVjdC5mb250U2l6ZTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSAnLycgKyBmb250S2V5ICsgJyAnICsgZm9udFNpemUgKyAnIFRmICcgKyBlbmNvZGVkQ29sb3I7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbCA9IHtcbiAgICAgICAgQmV6aWVyX0M6IDAuNTUxOTE1MDI0NDk0LFxuXG4gICAgICAgIGNhbGN1bGF0ZUNyb3NzOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuXG4gICAgICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBhID0gTWF0aC5taW4od2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgICAgIHZhciBjcm9zcyA9IHtcbiAgICAgICAgICAgICAgICB4MTogeyAvLyB1cHBlckxlZnRcbiAgICAgICAgICAgICAgICAgICAgeDogKHdpZHRoIC0gYSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikgKyBhLC8vIGhlaWdodCAtIGJvcmRlclBhZGRpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHgyOiB7IC8vIGxvd2VyUmlnaHRcbiAgICAgICAgICAgICAgICAgICAgeDogKCh3aWR0aCAtIGEpIC8gMikgKyBhLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikvLyBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4MzogeyAvLyBsb3dlckxlZnRcbiAgICAgICAgICAgICAgICAgICAgeDogKHdpZHRoIC0gYSkgLyAyLFxuICAgICAgICAgICAgICAgICAgICB5OiAoKGhlaWdodCAtIGEpIC8gMikvLyBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4NDogeyAvLyB1cHBlclJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIHg6ICgod2lkdGggLSBhKSAvIDIpICsgYSxcbiAgICAgICAgICAgICAgICAgICAgeTogKChoZWlnaHQgLSBhKSAvIDIpICsgYSwvLyBoZWlnaHQgLSBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIGNyb3NzO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoID0gZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IDA7XG4gICAgICAgIGlmICh0eXBlb2YgZm9ybU9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gc2NhbGUoZm9ybU9iamVjdC5SZWN0WzJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGZvcm1PYmplY3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHNjYWxlKGZvcm1PYmplY3QuUmVjdFszXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLy8gUHVibGljOlxuXG4gICAgLyoqXG4gICAgKiBBZGQgYW4gQWNyb0Zvcm0tRmllbGQgdG8gdGhlIGpzUERGLWluc3RhbmNlXG4gICAgKlxuICAgICogQG5hbWUgYWRkRmllbGRcbiAgICAqIEBmdW5jdGlvbiBcbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtPYmplY3R9IGZpZWxkT2JqZWN0XG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKi9cbiAgICB2YXIgYWRkRmllbGQgPSBqc1BERkFQSS5hZGRGaWVsZCA9IGZ1bmN0aW9uIChmaWVsZE9iamVjdCkge1xuICAgICAgICBpbml0aWFsaXplQWNyb0Zvcm0uY2FsbCh0aGlzKTtcblxuICAgICAgICBpZiAoZmllbGRPYmplY3QgaW5zdGFuY2VvZiBBY3JvRm9ybUZpZWxkKSB7XG4gICAgICAgICAgICBwdXRGb3JtLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRGaWVsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmaWVsZE9iamVjdC5wYWdlID0gc2NvcGUuaW50ZXJuYWwuZ2V0Q3VycmVudFBhZ2VJbmZvKCkucGFnZU51bWJlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQG5hbWUgYWRkQnV0dG9uXG4gICAgKiBAZnVuY3Rpb25cbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtBY3JvRm9ybUJ1dHRvbn0gb3B0aW9uc1xuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZEJ1dHRvbiA9IGZ1bmN0aW9uIChidXR0b24pIHtcbiAgICAgICAgaWYgKGJ1dHRvbiBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRCdXR0b24uJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkLmNhbGwodGhpcywgYnV0dG9uKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBAbmFtZSBhZGRUZXh0RmllbGRcbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtVGV4dEZpZWxkfSB0ZXh0RmllbGRcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqIEBkZXByZWNhdGVkXG4gICAgKi9cbiAgICBqc1BERkFQSS5hZGRUZXh0RmllbGQgPSBmdW5jdGlvbiAodGV4dEZpZWxkKSB7XG4gICAgICAgIGlmICh0ZXh0RmllbGQgaW5zdGFuY2VvZiBBY3JvRm9ybVRleHRGaWVsZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkVGV4dEZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZC5jYWxsKHRoaXMsIHRleHRGaWVsZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQG5hbWUgYWRkQ2hvaWNlRmllbGRcbiAgICAqIEBmdW5jdGlvblxuICAgICogQGluc3RhbmNlXG4gICAgKiBAcGFyYW0ge0Fjcm9Gb3JtQ2hvaWNlRmllbGR9IFxuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICogQGRlcHJlY2F0ZWRcbiAgICAqL1xuICAgIGpzUERGQVBJLmFkZENob2ljZUZpZWxkID0gZnVuY3Rpb24gKGNob2ljZUZpZWxkKSB7XG4gICAgICAgIGlmIChjaG9pY2VGaWVsZCBpbnN0YW5jZW9mIEFjcm9Gb3JtQ2hvaWNlRmllbGQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZENob2ljZUZpZWxkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZC5jYWxsKHRoaXMsIGNob2ljZUZpZWxkKTtcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBnbG9iYWxPYmogPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkNob2ljZUZpZWxkXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkxpc3RCb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQ29tYm9Cb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiRWRpdEJveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJCdXR0b25cIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiUHVzaEJ1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJSYWRpb0J1dHRvblwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJDaGVja0JveFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJUZXh0RmllbGRcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiUGFzc3dvcmRGaWVsZFwiXSkgPT09IFwidW5kZWZpbmVkXCJcbiAgICApIHtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQ2hvaWNlRmllbGRcIl0gPSBBY3JvRm9ybUNob2ljZUZpZWxkO1xuICAgICAgICBnbG9iYWxPYmpbXCJMaXN0Qm94XCJdID0gQWNyb0Zvcm1MaXN0Qm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJDb21ib0JveFwiXSA9IEFjcm9Gb3JtQ29tYm9Cb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkVkaXRCb3hcIl0gPSBBY3JvRm9ybUVkaXRCb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIkJ1dHRvblwiXSA9IEFjcm9Gb3JtQnV0dG9uO1xuICAgICAgICBnbG9iYWxPYmpbXCJQdXNoQnV0dG9uXCJdID0gQWNyb0Zvcm1QdXNoQnV0dG9uO1xuICAgICAgICBnbG9iYWxPYmpbXCJSYWRpb0J1dHRvblwiXSA9IEFjcm9Gb3JtUmFkaW9CdXR0b247XG4gICAgICAgIGdsb2JhbE9ialtcIkNoZWNrQm94XCJdID0gQWNyb0Zvcm1DaGVja0JveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiVGV4dEZpZWxkXCJdID0gQWNyb0Zvcm1UZXh0RmllbGQ7XG4gICAgICAgIGdsb2JhbE9ialtcIlBhc3N3b3JkRmllbGRcIl0gPSBBY3JvRm9ybVBhc3N3b3JkRmllbGQ7XG5cbiAgICAgICAgLy8gYmFja3dhcmRzQ29tcGF0aWJpbGl0eVxuICAgICAgICBnbG9iYWxPYmpbXCJBY3JvRm9ybVwiXSA9IHsgQXBwZWFyYW5jZTogQWNyb0Zvcm1BcHBlYXJhbmNlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgLy8gY29uc29sZS53YXJuKFwiQWNyb0Zvcm0tQ2xhc3NlcyBhcmUgbm90IHBvcHVsYXRlZCBpbnRvIGdsb2JhbC1uYW1lc3BhY2UsIGJlY2F1c2UgdGhlIGNsYXNzLU5hbWVzIGV4aXN0IGFscmVhZHkuIFRoaXMgYXZvaWRzIGNvbmZsaWN0cyB3aXRoIHRoZSBhbHJlYWR5IHVzZWQgZnJhbWV3b3JrLlwiKTtcbiAgICB9XG5cbiAgICBqc1BERkFQSS5BY3JvRm9ybUNob2ljZUZpZWxkID0gQWNyb0Zvcm1DaG9pY2VGaWVsZDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUxpc3RCb3ggPSBBY3JvRm9ybUxpc3RCb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1Db21ib0JveCA9IEFjcm9Gb3JtQ29tYm9Cb3g7XG4gICAganNQREZBUEkuQWNyb0Zvcm1FZGl0Qm94ID0gQWNyb0Zvcm1FZGl0Qm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQnV0dG9uID0gQWNyb0Zvcm1CdXR0b247XG4gICAganNQREZBUEkuQWNyb0Zvcm1QdXNoQnV0dG9uID0gQWNyb0Zvcm1QdXNoQnV0dG9uO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtUmFkaW9CdXR0b24gPSBBY3JvRm9ybVJhZGlvQnV0dG9uO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQ2hlY2tCb3ggPSBBY3JvRm9ybUNoZWNrQm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtVGV4dEZpZWxkID0gQWNyb0Zvcm1UZXh0RmllbGQ7XG4gICAganNQREZBUEkuQWNyb0Zvcm1QYXNzd29yZEZpZWxkID0gQWNyb0Zvcm1QYXNzd29yZEZpZWxkO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQXBwZWFyYW5jZSA9IEFjcm9Gb3JtQXBwZWFyYW5jZTtcblxuICAgIGpzUERGQVBJLkFjcm9Gb3JtID0ge1xuICAgICAgICBDaG9pY2VGaWVsZDogQWNyb0Zvcm1DaG9pY2VGaWVsZCxcbiAgICAgICAgTGlzdEJveDogQWNyb0Zvcm1MaXN0Qm94LFxuICAgICAgICBDb21ib0JveDogQWNyb0Zvcm1Db21ib0JveCxcbiAgICAgICAgRWRpdEJveDogQWNyb0Zvcm1FZGl0Qm94LFxuICAgICAgICBCdXR0b246IEFjcm9Gb3JtQnV0dG9uLFxuICAgICAgICBQdXNoQnV0dG9uOiBBY3JvRm9ybVB1c2hCdXR0b24sXG4gICAgICAgIFJhZGlvQnV0dG9uOiBBY3JvRm9ybVJhZGlvQnV0dG9uLFxuICAgICAgICBDaGVja0JveDogQWNyb0Zvcm1DaGVja0JveCxcbiAgICAgICAgVGV4dEZpZWxkOiBBY3JvRm9ybVRleHRGaWVsZCxcbiAgICAgICAgUGFzc3dvcmRGaWVsZDogQWNyb0Zvcm1QYXNzd29yZEZpZWxkLFxuICAgICAgICBBcHBlYXJhbmNlOiBBY3JvRm9ybUFwcGVhcmFuY2VcbiAgICB9O1xuXG4gICAganNQREYuQWNyb0Zvcm0gPSB7XG4gICAgICAgIENob2ljZUZpZWxkOiBBY3JvRm9ybUNob2ljZUZpZWxkLFxuICAgICAgICBMaXN0Qm94OiBBY3JvRm9ybUxpc3RCb3gsXG4gICAgICAgIENvbWJvQm94OiBBY3JvRm9ybUNvbWJvQm94LFxuICAgICAgICBFZGl0Qm94OiBBY3JvRm9ybUVkaXRCb3gsXG4gICAgICAgIEJ1dHRvbjogQWNyb0Zvcm1CdXR0b24sXG4gICAgICAgIFB1c2hCdXR0b246IEFjcm9Gb3JtUHVzaEJ1dHRvbixcbiAgICAgICAgUmFkaW9CdXR0b246IEFjcm9Gb3JtUmFkaW9CdXR0b24sXG4gICAgICAgIENoZWNrQm94OiBBY3JvRm9ybUNoZWNrQm94LFxuICAgICAgICBUZXh0RmllbGQ6IEFjcm9Gb3JtVGV4dEZpZWxkLFxuICAgICAgICBQYXNzd29yZEZpZWxkOiBBY3JvRm9ybVBhc3N3b3JkRmllbGQsXG4gICAgICAgIEFwcGVhcmFuY2U6IEFjcm9Gb3JtQXBwZWFyYW5jZVxuICAgIH07XG59KShqc3BkZi5qc1BERiwgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdyB8fCB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwpKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzXG4vLyBtb2R1bGUgaWQgPSA1OVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCIgIC8qKlxuICAgKiBqc1BERiBmcm9tSFRNTCBwbHVnaW4uIEJFVEEgc3RhZ2UuIEFQSSBzdWJqZWN0IHRvIGNoYW5nZS4gTmVlZHMgYnJvd3NlclxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMTIgV2lsbG93IFN5c3RlbXMgQ29ycG9yYXRpb24sIHdpbGxvdy1zeXN0ZW1zLmNvbVxuICAgKiAgICAgICAgICAgICAgIDIwMTQgSnVhbiBQYWJsbyBHYXZpcmlhLCBodHRwczovL2dpdGh1Yi5jb20vanVhbnBnYXZpcmlhXG4gICAqICAgICAgICAgICAgICAgMjAxNCBEaWVnbyBDYXNvcnJhbiwgaHR0cHM6Ly9naXRodWIuY29tL2RpZWdvY3JcbiAgICogICAgICAgICAgICAgICAyMDE0IERhbmllbCBIdXNhciwgaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGh1c2FyXG4gICAqICAgICAgICAgICAgICAgMjAxNCBXb2xmZ2FuZyBHYXNzbGVyLCBodHRwczovL2dpdGh1Yi5jb20vd29vbGZnXG4gICAqICAgICAgICAgICAgICAgMjAxNCBTdGV2ZW4gU3B1bmdpbiwgaHR0cHM6Ly9naXRodWIuY29tL2ZsYW1lbmNvXG4gICAqXG4gICAqIEBsaWNlbnNlXG4gICAqIFxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgKi9cbiAgdmFyIGpzcGRmID0gcmVxdWlyZShcImpzcGRmXCIpO1xuXG4gIChmdW5jdGlvbiAoanNQREZBUEkpIHtcbiAgICB2YXIgY2xvbmUsIF9EcmlsbEZvckNvbnRlbnQsIEZvbnROYW1lREIsIEZvbnRTdHlsZU1hcCwgVGV4dEFsaWduTWFwLCBGb250V2VpZ2h0TWFwLCBGbG9hdE1hcCwgQ2xlYXJNYXAsIEdldENTUywgUHVyZ2VXaGl0ZVNwYWNlLCBSZW5kZXJlciwgUmVzb2x2ZUZvbnQsIFJlc29sdmVVbml0ZWROdW1iZXIsIFVuaXRlZE51bWJlck1hcCwgZWxlbWVudEhhbmRsZWRFbHNld2hlcmUsIGltYWdlcywgbG9hZEltZ3MsIGNoZWNrRm9yRm9vdGVyLCBwcm9jZXNzLCB0YWJsZVRvSnNvbjtcblxuICAgIGNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgQ2xvbmUucHJvdG90eXBlID0gb2JqO1xuICAgICAgICByZXR1cm4gbmV3IENsb25lKCk7XG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBDbG9uZSgpIHt9XG4gICAgfSgpO1xuXG4gICAgUHVyZ2VXaGl0ZVNwYWNlID0gZnVuY3Rpb24gUHVyZ2VXaGl0ZVNwYWNlKGFycmF5KSB7XG4gICAgICB2YXIgZnJhZ21lbnQsIGksIGwsIGxUcmltbWVkLCByLCByVHJpbW1lZCwgdHJhaWxpbmdTcGFjZTtcbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGZyYWdtZW50ID0gdm9pZCAwO1xuICAgICAgbFRyaW1tZWQgPSBmYWxzZTtcbiAgICAgIHJUcmltbWVkID0gZmFsc2U7XG5cbiAgICAgIHdoaWxlICghbFRyaW1tZWQgJiYgaSAhPT0gbCkge1xuICAgICAgICBmcmFnbWVudCA9IGFycmF5W2ldID0gYXJyYXlbaV0udHJpbUxlZnQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICBsVHJpbW1lZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIGkgPSBsIC0gMTtcblxuICAgICAgd2hpbGUgKGwgJiYgIXJUcmltbWVkICYmIGkgIT09IC0xKSB7XG4gICAgICAgIGZyYWdtZW50ID0gYXJyYXlbaV0gPSBhcnJheVtpXS50cmltUmlnaHQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICByVHJpbW1lZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpLS07XG4gICAgICB9XG5cbiAgICAgIHIgPSAvXFxzKyQvZztcbiAgICAgIHRyYWlsaW5nU3BhY2UgPSB0cnVlO1xuICAgICAgaSA9IDA7XG5cbiAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgIC8vIExlYXZlIHRoZSBsaW5lIGJyZWFrcyBpbnRhY3RcbiAgICAgICAgaWYgKGFycmF5W2ldICE9IFwiXFx1MjAyOFwiKSB7XG4gICAgICAgICAgZnJhZ21lbnQgPSBhcnJheVtpXS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKTtcblxuICAgICAgICAgIGlmICh0cmFpbGluZ1NwYWNlKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50LnRyaW1MZWZ0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgICB0cmFpbGluZ1NwYWNlID0gci50ZXN0KGZyYWdtZW50KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhcnJheVtpXSA9IGZyYWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyID0gZnVuY3Rpb24gUmVuZGVyZXIocGRmLCB4LCB5LCBzZXR0aW5ncykge1xuICAgICAgdGhpcy5wZGYgPSBwZGY7XG4gICAgICB0aGlzLnggPSB4O1xuICAgICAgdGhpcy55ID0geTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsgLy9saXN0IG9mIGZ1bmN0aW9ucyB3aGljaCBhcmUgY2FsbGVkIGFmdGVyIGVhY2ggZWxlbWVudC1yZW5kZXJpbmcgcHJvY2Vzc1xuXG4gICAgICB0aGlzLndhdGNoRnVuY3Rpb25zID0gW107XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBSZXNvbHZlRm9udCA9IGZ1bmN0aW9uIFJlc29sdmVGb250KGNzc19mb250X2ZhbWlseV9zdHJpbmcpIHtcbiAgICAgIHZhciBuYW1lLCBwYXJ0LCBwYXJ0cztcbiAgICAgIG5hbWUgPSB2b2lkIDA7XG4gICAgICBwYXJ0cyA9IGNzc19mb250X2ZhbWlseV9zdHJpbmcuc3BsaXQoXCIsXCIpO1xuICAgICAgcGFydCA9IHBhcnRzLnNoaWZ0KCk7XG5cbiAgICAgIHdoaWxlICghbmFtZSAmJiBwYXJ0KSB7XG4gICAgICAgIG5hbWUgPSBGb250TmFtZURCW3BhcnQudHJpbSgpLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICBwYXJ0ID0gcGFydHMuc2hpZnQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfTtcblxuICAgIFJlc29sdmVVbml0ZWROdW1iZXIgPSBmdW5jdGlvbiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcpIHtcbiAgICAgIC8vSUU4IGlzc3Vlc1xuICAgICAgY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9IGNzc19saW5lX2hlaWdodF9zdHJpbmcgPT09IFwiYXV0b1wiID8gXCIwcHhcIiA6IGNzc19saW5lX2hlaWdodF9zdHJpbmc7XG5cbiAgICAgIGlmIChjc3NfbGluZV9oZWlnaHRfc3RyaW5nLmluZGV4T2YoXCJlbVwiKSA+IC0xICYmICFpc05hTihOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwiZW1cIiwgXCJcIikpKSkge1xuICAgICAgICBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID0gTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcImVtXCIsIFwiXCIpKSAqIDE4LjcxOSArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNzc19saW5lX2hlaWdodF9zdHJpbmcuaW5kZXhPZihcInB0XCIpID4gLTEgJiYgIWlzTmFOKE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJwdFwiLCBcIlwiKSkpKSB7XG4gICAgICAgIGNzc19saW5lX2hlaWdodF9zdHJpbmcgPSBOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwicHRcIiwgXCJcIikpICogMS4zMzMgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBub3JtYWwsIHVuZGVmLCB2YWx1ZTtcbiAgICAgIHVuZGVmID0gdm9pZCAwO1xuICAgICAgbm9ybWFsID0gMTYuMDA7XG4gICAgICB2YWx1ZSA9IFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB7XG4gICAgICAgIFwieHgtc21hbGxcIjogOSxcbiAgICAgICAgXCJ4LXNtYWxsXCI6IDExLFxuICAgICAgICBzbWFsbDogMTMsXG4gICAgICAgIG1lZGl1bTogMTYsXG4gICAgICAgIGxhcmdlOiAxOSxcbiAgICAgICAgXCJ4LWxhcmdlXCI6IDIzLFxuICAgICAgICBcInh4LWxhcmdlXCI6IDI4LFxuICAgICAgICBhdXRvOiAwXG4gICAgICB9W2Nzc19saW5lX2hlaWdodF9zdHJpbmddO1xuXG4gICAgICBpZiAodmFsdWUgIT09IHVuZGVmKSB7XG4gICAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSB2YWx1ZSAvIG5vcm1hbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlID0gcGFyc2VGbG9hdChjc3NfbGluZV9oZWlnaHRfc3RyaW5nKSkge1xuICAgICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gdmFsdWUgLyBub3JtYWw7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5tYXRjaCgvKFtcXGRcXC5dKykocHgpLyk7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHBhcnNlRmxvYXQodmFsdWVbMV0pIC8gbm9ybWFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gMTtcbiAgICB9O1xuXG4gICAgR2V0Q1NTID0gZnVuY3Rpb24gR2V0Q1NTKGVsZW1lbnQpIHtcbiAgICAgIHZhciBjc3MsIHRtcCwgY29tcHV0ZWRDU1NFbGVtZW50O1xuXG4gICAgICBjb21wdXRlZENTU0VsZW1lbnQgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgdmFyIGNvbXBDU1M7XG5cbiAgICAgICAgY29tcENTUyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgIGlmIChkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgbnVsbCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbC5jdXJyZW50U3R5bGUpIHtcbiAgICAgICAgICAgIHJldHVybiBlbC5jdXJyZW50U3R5bGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBlbC5zdHlsZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0oZWwpO1xuXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIHByb3AgPSBwcm9wLnJlcGxhY2UoLy1cXEQvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2guY2hhckF0KDEpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBDU1NbcHJvcF07XG4gICAgICAgIH07XG4gICAgICB9KGVsZW1lbnQpO1xuXG4gICAgICBjc3MgPSB7fTtcbiAgICAgIHRtcCA9IHZvaWQgMDtcbiAgICAgIGNzc1tcImZvbnQtZmFtaWx5XCJdID0gUmVzb2x2ZUZvbnQoY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC1mYW1pbHlcIikpIHx8IFwidGltZXNcIjtcbiAgICAgIGNzc1tcImZvbnQtc3R5bGVcIl0gPSBGb250U3R5bGVNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC1zdHlsZVwiKV0gfHwgXCJub3JtYWxcIjtcbiAgICAgIGNzc1tcInRleHQtYWxpZ25cIl0gPSBUZXh0QWxpZ25NYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwidGV4dC1hbGlnblwiKV0gfHwgXCJsZWZ0XCI7XG4gICAgICB0bXAgPSBGb250V2VpZ2h0TWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtd2VpZ2h0XCIpXSB8fCBcIm5vcm1hbFwiO1xuXG4gICAgICBpZiAodG1wID09PSBcImJvbGRcIikge1xuICAgICAgICBpZiAoY3NzW1wiZm9udC1zdHlsZVwiXSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIGNzc1tcImZvbnQtc3R5bGVcIl0gPSB0bXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3NzW1wiZm9udC1zdHlsZVwiXSA9IHRtcCArIGNzc1tcImZvbnQtc3R5bGVcIl07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY3NzW1wiZm9udC1zaXplXCJdID0gUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LXNpemVcIikpIHx8IDE7XG4gICAgICBjc3NbXCJsaW5lLWhlaWdodFwiXSA9IFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibGluZS1oZWlnaHRcIikpIHx8IDE7XG4gICAgICBjc3NbXCJkaXNwbGF5XCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwiZGlzcGxheVwiKSA9PT0gXCJpbmxpbmVcIiA/IFwiaW5saW5lXCIgOiBcImJsb2NrXCI7XG4gICAgICB0bXAgPSBjc3NbXCJkaXNwbGF5XCJdID09PSBcImJsb2NrXCI7XG4gICAgICBjc3NbXCJtYXJnaW4tdG9wXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLXRvcFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcIm1hcmdpbi1ib3R0b21cIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tYm90dG9tXCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy10b3BcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLXRvcFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZGRpbmctYm90dG9tXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1ib3R0b21cIikpIHx8IDA7XG4gICAgICBjc3NbXCJtYXJnaW4tbGVmdFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi1sZWZ0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wibWFyZ2luLXJpZ2h0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLXJpZ2h0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1sZWZ0XCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy1sZWZ0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFkZGluZy1yaWdodFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctcmlnaHRcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWdlLWJyZWFrLWJlZm9yZVwiXSA9IGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZ2UtYnJlYWstYmVmb3JlXCIpIHx8IFwiYXV0b1wiOyAvL2Zsb2F0IGFuZCBjbGVhcmluZyBvZiBmbG9hdHNcblxuICAgICAgY3NzW1wiZmxvYXRcIl0gPSBGbG9hdE1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJjc3NGbG9hdFwiKV0gfHwgXCJub25lXCI7XG4gICAgICBjc3NbXCJjbGVhclwiXSA9IENsZWFyTWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImNsZWFyXCIpXSB8fCBcIm5vbmVcIjtcbiAgICAgIGNzc1tcImNvbG9yXCJdID0gY29tcHV0ZWRDU1NFbGVtZW50KFwiY29sb3JcIik7XG4gICAgICByZXR1cm4gY3NzO1xuICAgIH07XG5cbiAgICBlbGVtZW50SGFuZGxlZEVsc2V3aGVyZSA9IGZ1bmN0aW9uIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBoYW5kbGVycywgaSwgaXNIYW5kbGVkRWxzZXdoZXJlLCBsLCBjbGFzc05hbWVzO1xuICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gZmFsc2U7XG4gICAgICBpID0gdm9pZCAwO1xuICAgICAgbCA9IHZvaWQgMDtcbiAgICAgIGhhbmRsZXJzID0gZWxlbWVudEhhbmRsZXJzW1wiI1wiICsgZWxlbWVudC5pZF07XG5cbiAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVycyhlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgbCA9IGhhbmRsZXJzLmxlbmd0aDtcblxuICAgICAgICAgIHdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpIHtcbiAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzW2ldKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbZWxlbWVudC5ub2RlTmFtZV07XG5cbiAgICAgIGlmICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGhhbmRsZXJzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZGxlcnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCkge1xuICAgICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnNbaV0oZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBUcnkgY2xhc3MgbmFtZXNcblxuXG4gICAgICBjbGFzc05hbWVzID0gdHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lID09PSAnc3RyaW5nJyA/IGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykgOiBbXTtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaGFuZGxlcnMgPSBlbGVtZW50SGFuZGxlcnNbJy4nICsgY2xhc3NOYW1lc1tpXV07XG5cbiAgICAgICAgaWYgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaGFuZGxlcnMpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICBsID0gaGFuZGxlcnMubGVuZ3RoO1xuXG4gICAgICAgICAgICB3aGlsZSAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBpICE9PSBsKSB7XG4gICAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzW2ldKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXNIYW5kbGVkRWxzZXdoZXJlO1xuICAgIH07XG5cbiAgICB0YWJsZVRvSnNvbiA9IGZ1bmN0aW9uIHRhYmxlVG9Kc29uKHRhYmxlLCByZW5kZXJlcikge1xuICAgICAgdmFyIGRhdGEsIGhlYWRlcnMsIGksIGosIHJvd0RhdGEsIHRhYmxlUm93LCB0YWJsZV9vYmosIHRhYmxlX3dpdGgsIGNlbGwsIGw7XG4gICAgICBkYXRhID0gW107XG4gICAgICBoZWFkZXJzID0gW107XG4gICAgICBpID0gMDtcbiAgICAgIGwgPSB0YWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDtcbiAgICAgIHRhYmxlX3dpdGggPSB0YWJsZS5jbGllbnRXaWR0aDtcblxuICAgICAgd2hpbGUgKGkgPCBsKSB7XG4gICAgICAgIGNlbGwgPSB0YWJsZS5yb3dzWzBdLmNlbGxzW2ldO1xuICAgICAgICBoZWFkZXJzW2ldID0ge1xuICAgICAgICAgIG5hbWU6IGNlbGwudGV4dENvbnRlbnQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcnKSxcbiAgICAgICAgICBwcm9tcHQ6IGNlbGwudGV4dENvbnRlbnQucmVwbGFjZSgvXFxyP1xcbi9nLCAnJyksXG4gICAgICAgICAgd2lkdGg6IGNlbGwuY2xpZW50V2lkdGggLyB0YWJsZV93aXRoICogcmVuZGVyZXIucGRmLmludGVybmFsLnBhZ2VTaXplLmdldFdpZHRoKClcbiAgICAgICAgfTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICBpID0gMTtcblxuICAgICAgd2hpbGUgKGkgPCB0YWJsZS5yb3dzLmxlbmd0aCkge1xuICAgICAgICB0YWJsZVJvdyA9IHRhYmxlLnJvd3NbaV07XG4gICAgICAgIHJvd0RhdGEgPSB7fTtcbiAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGogPCB0YWJsZVJvdy5jZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICByb3dEYXRhW2hlYWRlcnNbal0ubmFtZV0gPSB0YWJsZVJvdy5jZWxsc1tqXS50ZXh0Q29udGVudC5yZXBsYWNlKC9cXHI/XFxuL2csICcnKTtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnB1c2gocm93RGF0YSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlX29iaiA9IHtcbiAgICAgICAgcm93czogZGF0YSxcbiAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFyIFNraXBOb2RlID0ge1xuICAgICAgU0NSSVBUOiAxLFxuICAgICAgU1RZTEU6IDEsXG4gICAgICBOT1NDUklQVDogMSxcbiAgICAgIE9CSkVDVDogMSxcbiAgICAgIEVNQkVEOiAxLFxuICAgICAgU0VMRUNUOiAxXG4gICAgfTtcbiAgICB2YXIgbGlzdENvdW50ID0gMTtcblxuICAgIF9EcmlsbEZvckNvbnRlbnQgPSBmdW5jdGlvbiBEcmlsbEZvckNvbnRlbnQoZWxlbWVudCwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykge1xuICAgICAgdmFyIGNuLCBjbnMsIGZyYWdtZW50Q1NTLCBpLCBpc0Jsb2NrLCBsLCB0YWJsZTJqc29uLCBjYjtcbiAgICAgIGNucyA9IGVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgIGNuID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRDU1MgPSBHZXRDU1MoZWxlbWVudCk7XG4gICAgICBpc0Jsb2NrID0gZnJhZ21lbnRDU1MuZGlzcGxheSA9PT0gXCJibG9ja1wiO1xuXG4gICAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICByZW5kZXJlci5zZXRCbG9ja0JvdW5kYXJ5KCk7XG4gICAgICAgIHJlbmRlcmVyLnNldEJsb2NrU3R5bGUoZnJhZ21lbnRDU1MpO1xuICAgICAgfVxuICAgICAgaSA9IDA7XG4gICAgICBsID0gY25zLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGkgPCBsKSB7XG4gICAgICAgIGNuID0gY25zW2ldO1xuXG4gICAgICAgIGlmICh0eXBlb2YoY24pID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy9leGVjdXRlIGFsbCB3YXRjaGVyIGZ1bmN0aW9ucyB0byBlLmcuIHJlc2V0IGZsb2F0aW5nXG4gICAgICAgICAgcmVuZGVyZXIuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGNuKTtcbiAgICAgICAgICAvKioqIEhFQURFUiByZW5kZXJpbmcgKiovXG5cbiAgICAgICAgICBpZiAoY24ubm9kZVR5cGUgPT09IDEgJiYgY24ubm9kZU5hbWUgPT09ICdIRUFERVInKSB7XG4gICAgICAgICAgICB2YXIgaGVhZGVyID0gY247IC8vc3RvcmUgb2xkIHRvcCBtYXJnaW5cblxuICAgICAgICAgICAgdmFyIG9sZE1hcmdpblRvcCA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7IC8vc3Vic2NyaWJlIGZvciBuZXcgcGFnZSBldmVudCBhbmQgcmVuZGVyIGhlYWRlciBmaXJzdCBvbiBldmVyeSBwYWdlXG5cbiAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdhZGRQYWdlJywgZnVuY3Rpb24gKHBhZ2VJbmZvKSB7XG4gICAgICAgICAgICAgIC8vc2V0IGN1cnJlbnQgeSBwb3NpdGlvbiB0byBvbGQgbWFyZ2luXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSBvbGRNYXJnaW5Ub3A7IC8vcmVuZGVyIGFsbCBjaGlsZCBub2RlcyBvZiB0aGUgaGVhZGVyIGVsZW1lbnRcblxuICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGhlYWRlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7IC8vc2V0IG1hcmdpbiB0byBvbGQgbWFyZ2luICsgcmVuZGVyZWQgaGVhZGVyICsgMTAgc3BhY2UgdG8gcHJldmVudCBvdmVybGFwcGluZ1xuICAgICAgICAgICAgICAvL2ltcG9ydGFudCBmb3Igb3RoZXIgcGx1Z2lucyAoZS5nLiB0YWJsZSkgdG8gc3RhcnQgcmVuZGVyaW5nIGF0IGNvcnJlY3QgcG9zaXRpb24gYWZ0ZXIgaGVhZGVyXG5cblxuICAgICAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wID0gcmVuZGVyZXIueSArIDEwO1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDEwO1xuICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjbi5ub2RlVHlwZSA9PT0gOCAmJiBjbi5ub2RlTmFtZSA9PT0gXCIjY29tbWVudFwiKSB7XG4gICAgICAgICAgICBpZiAofmNuLnRleHRDb250ZW50LmluZGV4T2YoXCJBRERfUEFHRVwiKSkge1xuICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVUeXBlID09PSAxICYmICFTa2lwTm9kZVtjbi5ub2RlTmFtZV0pIHtcbiAgICAgICAgICAgIC8qKiogSU1BR0UgUkVOREVSSU5HICoqKi9cbiAgICAgICAgICAgIHZhciBjYWNoZWRfaW1hZ2U7XG5cbiAgICAgICAgICAgIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJJTUdcIikge1xuICAgICAgICAgICAgICB2YXIgdXJsID0gY24uZ2V0QXR0cmlidXRlKFwic3JjXCIpO1xuICAgICAgICAgICAgICBjYWNoZWRfaW1hZ2UgPSBpbWFnZXNbKHJlbmRlcmVyLnBkZi5zSGFzaENvZGUgJiYgcmVuZGVyZXIucGRmLnNIYXNoQ29kZSh1cmwpKSB8fCB1cmxdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FjaGVkX2ltYWdlKSB7XG4gICAgICAgICAgICAgIGlmIChyZW5kZXJlci5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIDwgcmVuZGVyZXIueSArIGNuLmhlaWdodCAmJiByZW5kZXJlci55ID4gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcCkge1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7IC8vY2hlY2sgaWYgd2UgaGF2ZSB0byBzZXQgYmFjayBzb21lIHZhbHVlcyBkdWUgdG8gZS5nLiBoZWFkZXIgcmVuZGVyaW5nIGZvciBuZXcgcGFnZVxuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIuZXhlY3V0ZVdhdGNoRnVuY3Rpb25zKGNuKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBpbWFnZXNDU1MgPSBHZXRDU1MoY24pO1xuICAgICAgICAgICAgICB2YXIgaW1hZ2VYID0gcmVuZGVyZXIueDtcbiAgICAgICAgICAgICAgdmFyIGZvbnRUb1VuaXRSYXRpbyA9IDEyIC8gcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yOyAvL2RlZmluZSBhZGRpdGlvbmFsIHBhZGRpbmdzLCBtYXJnaW5zIHdoaWNoIGhhdmUgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50IGZvciBtYXJnaW4gY2FsY3VsYXRpb25zXG5cbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZUxlZnQgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLWxlZnRcIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLWxlZnRcIl0pICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlUmlnaHQgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLXJpZ2h0XCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1yaWdodFwiXSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VUb3AgPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLXRvcFwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctdG9wXCJdKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZUJvdHRvbSA9IChpbWFnZXNDU1NbXCJtYXJnaW4tYm90dG9tXCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1ib3R0b21cIl0pICogZm9udFRvVW5pdFJhdGlvOyAvL2lmIGZsb2F0IGlzIHNldCB0byByaWdodCwgbW92ZSB0aGUgaW1hZ2UgdG8gdGhlIHJpZ2h0IGJvcmRlclxuICAgICAgICAgICAgICAvL2FkZCBzcGFjZSBpZiBtYXJnaW4gaXMgc2V0XG5cbiAgICAgICAgICAgICAgaWYgKGltYWdlc0NTU1snZmxvYXQnXSAhPT0gdW5kZWZpbmVkICYmIGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGltYWdlWCArPSByZW5kZXJlci5zZXR0aW5ncy53aWR0aCAtIGNuLndpZHRoIC0gYWRkaXRpb25hbFNwYWNlUmlnaHQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VYICs9IGFkZGl0aW9uYWxTcGFjZUxlZnQ7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkSW1hZ2UoY2FjaGVkX2ltYWdlLCBpbWFnZVgsIHJlbmRlcmVyLnkgKyBhZGRpdGlvbmFsU3BhY2VUb3AsIGNuLndpZHRoLCBjbi5oZWlnaHQpO1xuICAgICAgICAgICAgICBjYWNoZWRfaW1hZ2UgPSB1bmRlZmluZWQ7IC8vaWYgdGhlIGZsb2F0IHByb3AgaXMgc3BlY2lmaWVkIHdlIGhhdmUgdG8gZmxvYXQgdGhlIHRleHQgYXJvdW5kIHRoZSBpbWFnZVxuXG4gICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdyaWdodCcgfHwgaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBmdW5jdGlvbnQgdG8gc2V0IGJhY2sgY29vcmRpbmF0ZXMgYWZ0ZXIgaW1hZ2UgcmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIud2F0Y2hGdW5jdGlvbnMucHVzaChmdW5jdGlvbiAoZGlmZlgsIHRocmVzaG9sZFksIGRpZmZXaWR0aCwgZWwpIHtcbiAgICAgICAgICAgICAgICAgIC8vdW5kbyBkcmF3aW5nIGJveCBhZGFwdGlvbnMgd2hpY2ggd2VyZSBzZXQgYnkgZmxvYXRpbmdcbiAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci55ID49IHRocmVzaG9sZFkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBkaWZmWDtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggKz0gZGlmZldpZHRoO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWwgJiYgZWwubm9kZVR5cGUgPT09IDEgJiYgIVNraXBOb2RlW2VsLm5vZGVOYW1lXSAmJiByZW5kZXJlci54ICsgZWwud2lkdGggPiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MubGVmdCArIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy53aWR0aCkge1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci54ICs9IGRpZmZYO1xuICAgICAgICAgICAgICAgICAgICByZW5kZXJlci55ID0gdGhyZXNob2xkWTtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggKz0gZGlmZldpZHRoO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcgPyAtY24ud2lkdGggLSBhZGRpdGlvbmFsU3BhY2VMZWZ0IC0gYWRkaXRpb25hbFNwYWNlUmlnaHQgOiAwLCByZW5kZXJlci55ICsgY24uaGVpZ2h0ICsgYWRkaXRpb25hbFNwYWNlVG9wICsgYWRkaXRpb25hbFNwYWNlQm90dG9tLCBjbi53aWR0aCkpOyAvL3Jlc2V0IGZsb2F0aW5nIGJ5IGNsZWFyOmJvdGggZGl2c1xuICAgICAgICAgICAgICAgIC8vanVzdCBzZXQgY3Vyc29yWSBhZnRlciB0aGUgZmxvYXRpbmcgZWxlbWVudFxuXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIud2F0Y2hGdW5jdGlvbnMucHVzaChmdW5jdGlvbiAoeVBvc2l0aW9uQWZ0ZXJGbG9hdGluZywgcGFnZXMsIGVsKSB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIueSA8IHlQb3NpdGlvbkFmdGVyRmxvYXRpbmcgJiYgcGFnZXMgPT09IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLm5vZGVUeXBlID09PSAxICYmIEdldENTUyhlbCkuY2xlYXIgPT09ICdib3RoJykge1xuICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSB5UG9zaXRpb25BZnRlckZsb2F0aW5nO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIHJlbmRlcmVyLnkgKyBjbi5oZWlnaHQsIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCkpKTsgLy9pZiBmbG9hdGluZyBpcyBzZXQgd2UgZGVjcmVhc2UgdGhlIGF2YWlsYWJsZSB3aWR0aCBieSB0aGUgaW1hZ2Ugd2lkdGhcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoIC09IGNuLndpZHRoICsgYWRkaXRpb25hbFNwYWNlTGVmdCArIGFkZGl0aW9uYWxTcGFjZVJpZ2h0OyAvL2lmIGxlZnQganVzdCBhZGQgdGhlIGltYWdlIHdpZHRoIHRvIHRoZSBYIGNvb3JkaW5hdGVcblxuICAgICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBjbi53aWR0aCArIGFkZGl0aW9uYWxTcGFjZUxlZnQgKyBhZGRpdGlvbmFsU3BhY2VSaWdodDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZiBubyBmbG9hdGluZyBpcyBzZXQsIG1vdmUgdGhlIHJlbmRlcmluZyBjdXJzb3IgYWZ0ZXIgdGhlIGltYWdlIGhlaWdodFxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gY24uaGVpZ2h0ICsgYWRkaXRpb25hbFNwYWNlVG9wICsgYWRkaXRpb25hbFNwYWNlQm90dG9tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8qKiogVEFCTEUgUkVOREVSSU5HICoqKi9cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJUQUJMRVwiKSB7XG4gICAgICAgICAgICAgIHRhYmxlMmpzb24gPSB0YWJsZVRvSnNvbihjbiwgcmVuZGVyZXIpO1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDEwO1xuICAgICAgICAgICAgICByZW5kZXJlci5wZGYudGFibGUocmVuZGVyZXIueCwgcmVuZGVyZXIueSwgdGFibGUyanNvbi5yb3dzLCB0YWJsZTJqc29uLmhlYWRlcnMsIHtcbiAgICAgICAgICAgICAgICBhdXRvU2l6ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgcHJpbnRIZWFkZXJzOiBlbGVtZW50SGFuZGxlcnMucHJpbnRIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG1hcmdpbnM6IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYyxcbiAgICAgICAgICAgICAgICBjc3M6IEdldENTUyhjbilcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwuX19jZWxsX18ubGFzdENlbGwueSArXG4gICAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLmhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiT0xcIiB8fCBjbi5ub2RlTmFtZSA9PT0gXCJVTFwiKSB7XG4gICAgICAgICAgICAgIGxpc3RDb3VudCA9IDE7XG5cbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gMTA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIkxJXCIpIHtcbiAgICAgICAgICAgICAgdmFyIHRlbXAgPSByZW5kZXJlci54O1xuICAgICAgICAgICAgICByZW5kZXJlci54ICs9IDIwIC8gcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDM7XG5cbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlbmRlcmVyLnggPSB0ZW1wO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJCUlwiKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLnkgKz0gZnJhZ21lbnRDU1NbXCJmb250LXNpemVcIl0gKiByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLmFkZFRleHQoXCJcXHUyMDI4XCIsIGNsb25lKGZyYWdtZW50Q1NTKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlKGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSkge1xuICAgICAgICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY24ubm9kZVZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoY24ubm9kZVZhbHVlICYmIGNuLnBhcmVudE5vZGUubm9kZU5hbWUgPT09IFwiTElcIikge1xuICAgICAgICAgICAgICBpZiAoY24ucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lID09PSBcIk9MXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpc3RDb3VudCsrICsgJy4gJyArIHZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmb250U2l6ZSA9IGZyYWdtZW50Q1NTW1wiZm9udC1zaXplXCJdO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRYID0gKDMgLSBmb250U2l6ZSAqIDAuNzUpICogcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXRZID0gZm9udFNpemUgKiAwLjc1ICogcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICAgIHZhciByYWRpdXMgPSBmb250U2l6ZSAqIDEuNzQgLyByZW5kZXJlci5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG5cbiAgICAgICAgICAgICAgICBjYiA9IGZ1bmN0aW9uIGNiKHgsIHkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucGRmLmNpcmNsZSh4ICsgb2Zmc2V0WCwgeSArIG9mZnNldFksIHJhZGl1cywgJ0ZEJyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAvLyBPbmx5IGFkZCB0aGUgdGV4dCBpZiB0aGUgdGV4dCBub2RlIGlzIGluIHRoZSBib2R5IGVsZW1lbnRcbiAgICAgICAgICAgIC8vIEFkZCBjb21wYXRpYmlsaXR5IHdpdGggSUUxMVxuXG5cbiAgICAgICAgICAgIGlmICghIShjbi5vd25lckRvY3VtZW50LmJvZHkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oY24pICYgMTYpKSB7XG4gICAgICAgICAgICAgIHJlbmRlcmVyLmFkZFRleHQodmFsdWUsIGZyYWdtZW50Q1NTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmVuZGVyZXIuYWRkVGV4dChjbiwgZnJhZ21lbnRDU1MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgZWxlbWVudEhhbmRsZXJzLm91dFkgPSByZW5kZXJlci55O1xuXG4gICAgICBpZiAoaXNCbG9jaykge1xuICAgICAgICByZXR1cm4gcmVuZGVyZXIuc2V0QmxvY2tCb3VuZGFyeShjYik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGltYWdlcyA9IHt9O1xuXG4gICAgbG9hZEltZ3MgPSBmdW5jdGlvbiBsb2FkSW1ncyhlbGVtZW50LCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzLCBjYikge1xuICAgICAgdmFyIGltZ3MgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKSxcbiAgICAgICAgICBsID0gaW1ncy5sZW5ndGgsXG4gICAgICAgICAgZm91bmRfaW1hZ2VzLFxuICAgICAgICAgIHggPSAwO1xuXG4gICAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnB1Ymxpc2goJ2ltYWdlc0xvYWRlZCcpO1xuICAgICAgICBjYihmb3VuZF9pbWFnZXMpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBsb2FkSW1hZ2UodXJsLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgZm91bmRfaW1hZ2VzID0gKyt4O1xuICAgICAgICBpbWcuY3Jvc3NPcmlnaW4gPSAnJztcblxuICAgICAgICBpbWcub25lcnJvciA9IGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGltZy5jb21wbGV0ZSkge1xuICAgICAgICAgICAgLy90byBzdXBwb3J0IGRhdGEgdXJscyBpbiBpbWFnZXMsIHNldCB3aWR0aCBhbmQgaGVpZ2h0XG4gICAgICAgICAgICAvL2FzIHRob3NlIHZhbHVlcyBhcmUgbm90IHJlY29nbml6ZWQgYXV0b21hdGljYWxseVxuICAgICAgICAgICAgaWYgKGltZy5zcmMuaW5kZXhPZignZGF0YTppbWFnZS8nKSA9PT0gMCkge1xuICAgICAgICAgICAgICBpbWcud2lkdGggPSB3aWR0aCB8fCBpbWcud2lkdGggfHwgMDtcbiAgICAgICAgICAgICAgaW1nLmhlaWdodCA9IGhlaWdodCB8fCBpbWcuaGVpZ2h0IHx8IDA7XG4gICAgICAgICAgICB9IC8vaWYgdmFsaWQgaW1hZ2UgYWRkIHRvIGtub3duIGltYWdlcyBhcnJheVxuXG5cbiAgICAgICAgICAgIGlmIChpbWcud2lkdGggKyBpbWcuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIHZhciBoYXNoID0gKHJlbmRlcmVyLnBkZi5zSGFzaENvZGUgJiYgcmVuZGVyZXIucGRmLnNIYXNoQ29kZSh1cmwpKSB8fCB1cmw7XG4gICAgICAgICAgICAgIGltYWdlc1toYXNoXSA9IGltYWdlc1toYXNoXSB8fCBpbWc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCEgLS14KSB7XG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGltZy5zcmMgPSB1cmw7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChsLS0pIHtcbiAgICAgICAgbG9hZEltYWdlKGltZ3NbbF0uZ2V0QXR0cmlidXRlKFwic3JjXCIpLCBpbWdzW2xdLndpZHRoLCBpbWdzW2xdLmhlaWdodCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB4IHx8IGRvbmUoKTtcbiAgICB9O1xuXG4gICAgY2hlY2tGb3JGb290ZXIgPSBmdW5jdGlvbiBjaGVja0ZvckZvb3RlcihlbGVtLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSB7XG4gICAgICAvL2NoZWNrIGlmIHdlIGNhbiBmb3VuZCBhIDxmb290ZXI+IGVsZW1lbnRcbiAgICAgIHZhciBmb290ZXIgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9vdGVyXCIpO1xuXG4gICAgICBpZiAoZm9vdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9vdGVyID0gZm9vdGVyWzBdOyAvL2JhZCBoYWNrIHRvIGdldCBoZWlnaHQgb2YgZm9vdGVyXG4gICAgICAgIC8vY3JlYXQgZHVtbXkgb3V0IGFuZCBjaGVjayBuZXcgeSBhZnRlciBmYWtlIHJlbmRlcmluZ1xuXG4gICAgICAgIHZhciBvbGRPdXQgPSByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGU7XG4gICAgICAgIHZhciBvbGRZID0gcmVuZGVyZXIueTtcblxuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwud3JpdGUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgICAgICBfRHJpbGxGb3JDb250ZW50KGZvb3RlciwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG5cbiAgICAgICAgdmFyIGZvb3RlckhlaWdodCA9IE1hdGguY2VpbChyZW5kZXJlci55IC0gb2xkWSkgKyA1O1xuICAgICAgICByZW5kZXJlci55ID0gb2xkWTtcbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLndyaXRlID0gb2xkT3V0OyAvL2FkZCAyMCUgdG8gcHJldmVudCBvdmVybGFwcGluZ1xuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gKz0gZm9vdGVySGVpZ2h0OyAvL0NyZWF0ZSBmdW5jdGlvbiByZW5kZXIgaGVhZGVyIG9uIGV2ZXJ5IHBhZ2VcblxuICAgICAgICB2YXIgcmVuZGVyRm9vdGVyID0gZnVuY3Rpb24gcmVuZGVyRm9vdGVyKHBhZ2VJbmZvKSB7XG4gICAgICAgICAgdmFyIHBhZ2VOdW1iZXIgPSBwYWdlSW5mbyAhPT0gdW5kZWZpbmVkID8gcGFnZUluZm8ucGFnZU51bWJlciA6IDE7IC8vc2V0IGN1cnJlbnQgeSBwb3NpdGlvbiB0byBvbGQgbWFyZ2luXG5cbiAgICAgICAgICB2YXIgb2xkUG9zaXRpb24gPSByZW5kZXJlci55OyAvL3JlbmRlciBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGhlYWRlciBlbGVtZW50XG5cbiAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbTtcbiAgICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tIC09IGZvb3RlckhlaWdodDsgLy9jaGVjayBpZiB3ZSBoYXZlIHRvIGFkZCBwYWdlIG51bWJlcnNcblxuICAgICAgICAgIHZhciBzcGFucyA9IGZvb3Rlci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3BhbicpO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgLy9pZiB3ZSBmaW5kIHNvbWUgc3BhbiBlbGVtZW50IHdpdGggY2xhc3MgcGFnZUNvdW50ZXIsIHNldCB0aGUgcGFnZVxuICAgICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiBwYWdlQ291bnRlciBcIikgPiAtMSkge1xuICAgICAgICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPSBwYWdlTnVtYmVyO1xuICAgICAgICAgICAgfSAvL2lmIHdlIGZpbmQgc29tZSBzcGFuIGVsZW1lbnQgd2l0aCBjbGFzcyB0b3RhbFBhZ2VzLCBzZXQgYSB2YXJpYWJsZSB3aGljaCBpcyByZXBsYWNlZCBhZnRlciByZW5kZXJpbmcgb2YgYWxsIHBhZ2VzXG5cblxuICAgICAgICAgICAgaWYgKChcIiBcIiArIHNwYW5zW2ldLmNsYXNzTmFtZSArIFwiIFwiKS5yZXBsYWNlKC9bXFxuXFx0XS9nLCBcIiBcIikuaW5kZXhPZihcIiB0b3RhbFBhZ2VzIFwiKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHNwYW5zW2ldLmlubmVySFRNTCA9ICcjIyNqc1BERlZhclRvdGFsUGFnZXMjIyMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy9yZW5kZXIgZm9vdGVyIGNvbnRlbnRcblxuXG4gICAgICAgICAgX0RyaWxsRm9yQ29udGVudChmb290ZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpOyAvL3NldCBib3R0b20gbWFyZ2luIHRvIHByZXZpb3VzIGhlaWdodCBpbmNsdWRpbmcgdGhlIGZvb3RlciBoZWlnaHRcblxuXG4gICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSArPSBmb290ZXJIZWlnaHQ7IC8vaW1wb3J0YW50IGZvciBvdGhlciBwbHVnaW5zIChlLmcuIHRhYmxlKSB0byBzdGFydCByZW5kZXJpbmcgYXQgY29ycmVjdCBwb3NpdGlvbiBhZnRlciBoZWFkZXJcblxuICAgICAgICAgIHJlbmRlcmVyLnkgPSBvbGRQb3NpdGlvbjtcbiAgICAgICAgfTsgLy9jaGVjayBpZiBmb290ZXIgY29udGFpbnMgdG90YWxQYWdlcyB3aGljaCBzaG91bGQgYmUgcmVwbGFjZSBhdCB0aGUgZGlzb3Bvc2FsIG9mIHRoZSBkb2N1bWVudFxuXG5cbiAgICAgICAgdmFyIHNwYW5zID0gZm9vdGVyLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzcGFuJyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmICgoXCIgXCIgKyBzcGFuc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZSgvW1xcblxcdF0vZywgXCIgXCIpLmluZGV4T2YoXCIgdG90YWxQYWdlcyBcIikgPiAtMSkge1xuICAgICAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5zdWJzY3JpYmUoJ2h0bWxSZW5kZXJpbmdGaW5pc2hlZCcsIHJlbmRlcmVyLnBkZi5wdXRUb3RhbFBhZ2VzLmJpbmQocmVuZGVyZXIucGRmLCAnIyMjanNQREZWYXJUb3RhbFBhZ2VzIyMjJyksIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvL3JlZ2lzdGVyIGV2ZW50IHRvIHJlbmRlciBmb290ZXIgb24gZXZlcnkgbmV3IHBhZ2VcblxuXG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdhZGRQYWdlJywgcmVuZGVyRm9vdGVyLCBmYWxzZSk7IC8vcmVuZGVyIGZvb3RlciBvbiBmaXJzdCBwYWdlXG5cbiAgICAgICAgcmVuZGVyRm9vdGVyKCk7IC8vcHJldmVudCBmb290ZXIgcmVuZGVyaW5nXG5cbiAgICAgICAgU2tpcE5vZGVbJ0ZPT1RFUiddID0gMTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2VzcyA9IGZ1bmN0aW9uIHByb2Nlc3MocGRmLCBlbGVtZW50LCB4LCB5LCBzZXR0aW5ncywgY2FsbGJhY2spIHtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ICE9PSBcInN0cmluZ1wiICYmICFlbGVtZW50LnBhcmVudE5vZGUpIGVsZW1lbnQgPSAnJyArIGVsZW1lbnQuaW5uZXJIVE1MO1xuXG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgdmFyICRmcmFtZSwgJGhpZGRlbmRpdiwgZnJhbWVuYW1lLCB2aXN1YWxseWhpZGRlbjtcbiAgICAgICAgICBmcmFtZW5hbWUgPSBcImpzUERGaHRtbFRleHRcIiArIERhdGUubm93KCkudG9TdHJpbmcoKSArIChNYXRoLnJhbmRvbSgpICogMTAwMCkudG9GaXhlZCgwKTtcbiAgICAgICAgICB2aXN1YWxseWhpZGRlbiA9IFwicG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XCIgKyBcImNsaXA6IHJlY3QoMXB4IDFweCAxcHggMXB4KTsgLyogSUU2LCBJRTcgKi9cIiArIFwiY2xpcDogcmVjdCgxcHgsIDFweCwgMXB4LCAxcHgpO1wiICsgXCJwYWRkaW5nOjAgIWltcG9ydGFudDtcIiArIFwiYm9yZGVyOjAgIWltcG9ydGFudDtcIiArIFwiaGVpZ2h0OiAxcHggIWltcG9ydGFudDtcIiArIFwid2lkdGg6IDFweCAhaW1wb3J0YW50OyBcIiArIFwidG9wOmF1dG87XCIgKyBcImxlZnQ6LTEwMHB4O1wiICsgXCJvdmVyZmxvdzogaGlkZGVuO1wiO1xuICAgICAgICAgICRoaWRkZW5kaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAkaGlkZGVuZGl2LnN0eWxlLmNzc1RleHQgPSB2aXN1YWxseWhpZGRlbjtcbiAgICAgICAgICAkaGlkZGVuZGl2LmlubmVySFRNTCA9IFwiPGlmcmFtZSBzdHlsZT1cXFwiaGVpZ2h0OjFweDt3aWR0aDoxcHhcXFwiIG5hbWU9XFxcIlwiICsgZnJhbWVuYW1lICsgXCJcXFwiIC8+XCI7XG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCgkaGlkZGVuZGl2KTtcbiAgICAgICAgICAkZnJhbWUgPSB3aW5kb3cuZnJhbWVzW2ZyYW1lbmFtZV07XG4gICAgICAgICAgJGZyYW1lLmRvY3VtZW50Lm9wZW4oKTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQud3JpdGVsbihlbGVtZW50KTtcbiAgICAgICAgICAkZnJhbWUuZG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICByZXR1cm4gJGZyYW1lLmRvY3VtZW50LmJvZHk7XG4gICAgICAgIH0oZWxlbWVudC5yZXBsYWNlKC88XFwvP3NjcmlwdFtePl0qPz4vZ2ksICcnKSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdmFpbGFibGVGb250cyA9IE9iamVjdC5rZXlzKHBkZi5nZXRGb250TGlzdCgpKTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhdmFpbGFibGVGb250cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgZm9udE5hbWUgPSBhdmFpbGFibGVGb250c1tpXTtcbiAgICAgICAgdmFyIGZvbnRGYW1pbHkgPSBmb250TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZighRm9udE5hbWVEQltmb250RmFtaWx5XSkge1xuICAgICAgICAgIEZvbnROYW1lREJbZm9udEZhbWlseV0gPSBmb250TmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgciA9IG5ldyBSZW5kZXJlcihwZGYsIHgsIHksIHNldHRpbmdzKSxcbiAgICAgICAgICBvdXQ7IC8vIDEuIGxvYWQgaW1hZ2VzXG4gICAgICAvLyAyLiBwcmVwYXJlIG9wdGlvbmFsIGZvb3RlciBlbGVtZW50c1xuICAgICAgLy8gMy4gcmVuZGVyIGNvbnRlbnRcblxuICAgICAgbG9hZEltZ3MuY2FsbCh0aGlzLCBlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMsIGZ1bmN0aW9uIChmb3VuZF9pbWFnZXMpIHtcbiAgICAgICAgY2hlY2tGb3JGb290ZXIoZWxlbWVudCwgciwgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKTtcblxuICAgICAgICBfRHJpbGxGb3JDb250ZW50KGVsZW1lbnQsIHIsIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycyk7IC8vc2VuZCBldmVudCBkaXNwb3NlIGZvciBmaW5hbCB0YWtzIChlLmcuIGZvb3RlciB0b3RhbHBhZ2UgcmVwbGFjZW1lbnQpXG5cblxuICAgICAgICByLnBkZi5pbnRlcm5hbC5ldmVudHMucHVibGlzaCgnaHRtbFJlbmRlcmluZ0ZpbmlzaGVkJyk7XG4gICAgICAgIG91dCA9IHIuZGlzcG9zZSgpO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjayhvdXQpO2Vsc2UgaWYgKGZvdW5kX2ltYWdlcykgY29uc29sZS5lcnJvcignanNQREYgV2FybmluZzogcmVuZGVyaW5nIGlzc3Vlcz8gcHJvdmlkZSBhIGNhbGxiYWNrIHRvIGZyb21IVE1MIScpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gb3V0IHx8IHtcbiAgICAgICAgeDogci54LFxuICAgICAgICB5OiByLnlcbiAgICAgIH07XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5wYXJhZ3JhcGggPSB7XG4gICAgICAgIHRleHQ6IFtdLFxuICAgICAgICBzdHlsZTogW11cbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJxXCIpO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwiUVwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHRoaXMueCxcbiAgICAgICAgeTogdGhpcy55LFxuICAgICAgICByZWFkeTogdHJ1ZVxuICAgICAgfTtcbiAgICB9OyAvL0NoZWNrcyBpZiB3ZSBoYXZlIHRvIGV4ZWN1dGUgc29tZSB3YXRjaGVyIGZ1bmN0aW9uc1xuICAgIC8vZS5nLiB0byBlbmQgdGV4dCBmbG9hdGluZyBhcm91bmQgYW4gaW1hZ2VcblxuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyA9IGZ1bmN0aW9uIChlbCkge1xuICAgICAgdmFyIHJldCA9IGZhbHNlO1xuICAgICAgdmFyIG5hcnJheSA9IFtdO1xuXG4gICAgICBpZiAodGhpcy53YXRjaEZ1bmN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy53YXRjaEZ1bmN0aW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmICh0aGlzLndhdGNoRnVuY3Rpb25zW2ldKGVsKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmFycmF5LnB1c2godGhpcy53YXRjaEZ1bmN0aW9uc1tpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YXRjaEZ1bmN0aW9ucyA9IG5hcnJheTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzID0gZnVuY3Rpb24gKGZyYWdtZW50cywgc3R5bGVzKSB7XG4gICAgICB2YXIgY3VycmVudExpbmVMZW5ndGgsIGRlZmF1bHRGb250U2l6ZSwgZmYsIGZvbnRNZXRyaWNzLCBmb250TWV0cmljc0NhY2hlLCBmcmFnbWVudCwgZnJhZ21lbnRDaG9wcGVkLCBmcmFnbWVudExlbmd0aCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MsIGZzLCBrLCBsaW5lLCBsaW5lcywgbWF4TGluZUxlbmd0aCwgc3R5bGU7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcbiAgICAgIGsgPSB0aGlzLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgIGZvbnRNZXRyaWNzQ2FjaGUgPSB7fTtcbiAgICAgIGZmID0gdm9pZCAwO1xuICAgICAgZnMgPSB2b2lkIDA7XG4gICAgICBmb250TWV0cmljcyA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50ID0gdm9pZCAwO1xuICAgICAgc3R5bGUgPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudFNwZWNpZmljTWV0cmljcyA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50TGVuZ3RoID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRDaG9wcGVkID0gdm9pZCAwO1xuICAgICAgbGluZSA9IFtdO1xuICAgICAgbGluZXMgPSBbbGluZV07XG4gICAgICBjdXJyZW50TGluZUxlbmd0aCA9IDA7XG4gICAgICBtYXhMaW5lTGVuZ3RoID0gdGhpcy5zZXR0aW5ncy53aWR0aDtcblxuICAgICAgd2hpbGUgKGZyYWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudHMuc2hpZnQoKTtcbiAgICAgICAgc3R5bGUgPSBzdHlsZXMuc2hpZnQoKTtcblxuICAgICAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgICAgICBmZiA9IHN0eWxlW1wiZm9udC1mYW1pbHlcIl07XG4gICAgICAgICAgZnMgPSBzdHlsZVtcImZvbnQtc3R5bGVcIl07XG4gICAgICAgICAgZm9udE1ldHJpY3MgPSBmb250TWV0cmljc0NhY2hlW2ZmICsgZnNdO1xuXG4gICAgICAgICAgaWYgKCFmb250TWV0cmljcykge1xuICAgICAgICAgICAgZm9udE1ldHJpY3MgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KGZmLCBmcykubWV0YWRhdGEuVW5pY29kZTtcbiAgICAgICAgICAgIGZvbnRNZXRyaWNzQ2FjaGVbZmYgKyBmc10gPSBmb250TWV0cmljcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmcmFnbWVudFNwZWNpZmljTWV0cmljcyA9IHtcbiAgICAgICAgICAgIHdpZHRoczogZm9udE1ldHJpY3Mud2lkdGhzLFxuICAgICAgICAgICAga2VybmluZzogZm9udE1ldHJpY3Mua2VybmluZyxcbiAgICAgICAgICAgIGZvbnRTaXplOiBzdHlsZVtcImZvbnQtc2l6ZVwiXSAqIGRlZmF1bHRGb250U2l6ZSxcbiAgICAgICAgICAgIHRleHRJbmRlbnQ6IGN1cnJlbnRMaW5lTGVuZ3RoXG4gICAgICAgICAgfTtcbiAgICAgICAgICBmcmFnbWVudExlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aChmcmFnbWVudCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrO1xuXG4gICAgICAgICAgaWYgKGZyYWdtZW50ID09IFwiXFx1MjAyOFwiKSB7XG4gICAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExpbmVMZW5ndGggKyBmcmFnbWVudExlbmd0aCA+IG1heExpbmVMZW5ndGgpIHtcbiAgICAgICAgICAgIGZyYWdtZW50Q2hvcHBlZCA9IHRoaXMucGRmLnNwbGl0VGV4dFRvU2l6ZShmcmFnbWVudCwgbWF4TGluZUxlbmd0aCwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpO1xuICAgICAgICAgICAgbGluZS5wdXNoKFtmcmFnbWVudENob3BwZWQuc2hpZnQoKSwgc3R5bGVdKTtcblxuICAgICAgICAgICAgd2hpbGUgKGZyYWdtZW50Q2hvcHBlZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgbGluZSA9IFtbZnJhZ21lbnRDaG9wcGVkLnNoaWZ0KCksIHN0eWxlXV07XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoID0gdGhpcy5wZGYuZ2V0U3RyaW5nVW5pdFdpZHRoKGxpbmVbMF1bMF0sIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzKSAqIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLmZvbnRTaXplIC8gaztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGluZS5wdXNoKFtmcmFnbWVudCwgc3R5bGVdKTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lTGVuZ3RoICs9IGZyYWdtZW50TGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvL2lmIHRleHQgYWxpZ25tZW50IHdhcyBzZXQsIHNldCBtYXJnaW4vaW5kZW50IG9mIGVhY2ggbGluZVxuXG5cbiAgICAgIGlmIChzdHlsZVsndGV4dC1hbGlnbiddICE9PSB1bmRlZmluZWQgJiYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdjZW50ZXInIHx8IHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdyaWdodCcgfHwgc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2p1c3RpZnknKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aChsaW5lc1tpXVswXVswXSwgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MpICogZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MuZm9udFNpemUgLyBrOyAvL2lmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbiBsaW5lIHdlIGhhdmUgdG8gY2xvbmUgdGhlIHN0eWxlIG9iamVjdCBhcyBhbGwgbGluZXMgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdFxuXG4gICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBsaW5lc1tpXVswXVsxXSA9IGNsb25lKGxpbmVzW2ldWzBdWzFdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgc3BhY2UgPSBtYXhMaW5lTGVuZ3RoIC0gbGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWydtYXJnaW4tbGVmdCddID0gc3BhY2U7IC8vaWYgYWxpZ25tZW50IGlzIG5vdCByaWdodCwgaXQgaGFzIHRvIGJlIGNlbnRlciBzbyBzcGxpdCB0aGUgc3BhY2UgdG8gdGhlIGxlZnQgYW5kIHRoZSByaWdodFxuICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWydtYXJnaW4tbGVmdCddID0gc3BhY2UgLyAyOyAvL2lmIGp1c3RpZnkgd2FzIHNldCwgY2FsY3VsYXRlIHRoZSB3b3JkIHNwYWNpbmcgYW5kIGRlZmluZSBpbiBieSB1c2luZyB0aGUgY3NzIHByb3BlcnR5XG4gICAgICAgICAgfSBlbHNlIGlmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAnanVzdGlmeScpIHtcbiAgICAgICAgICAgIHZhciBjb3VudFNwYWNlcyA9IGxpbmVzW2ldWzBdWzBdLnNwbGl0KCcgJykubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWyd3b3JkLXNwYWNpbmcnXSA9IHNwYWNlIC8gY291bnRTcGFjZXM7IC8vaWdub3JlIHRoZSBsYXN0IGxpbmUgaW4ganVzdGlmeSBtb2RlXG5cbiAgICAgICAgICAgIGlmIChpID09PSBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGxpbmVzW2ldWzBdWzFdWyd3b3JkLXNwYWNpbmcnXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsaW5lcztcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLlJlbmRlclRleHRGcmFnbWVudCA9IGZ1bmN0aW9uICh0ZXh0LCBzdHlsZSkge1xuICAgICAgdmFyIGRlZmF1bHRGb250U2l6ZSwgZm9udCwgbWF4TGluZUhlaWdodDtcbiAgICAgIG1heExpbmVIZWlnaHQgPSAwO1xuICAgICAgZGVmYXVsdEZvbnRTaXplID0gMTI7XG5cbiAgICAgIGlmICh0aGlzLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKSAtIHRoaXMucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSA8IHRoaXMueSArIHRoaXMucGRmLmludGVybmFsLmdldEZvbnRTaXplKCkpIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCJFVFwiLCBcIlFcIiwgXCJRXCIpO1xuICAgICAgICBjb25zdCBjdXJyZW50UGFnZU51bWJlciA9IHRoaXMucGRmLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgICAgIGlmICh0aGlzLnBkZi5nZXROdW1iZXJPZlBhZ2VzKCkgPT09IGN1cnJlbnRQYWdlTnVtYmVyKSB0aGlzLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgIGVsc2UgdGhpcy5wZGYuc2V0UGFnZShjdXJyZW50UGFnZU51bWJlciArIDEpO1xuICAgICAgICB0aGlzLnkgPSB0aGlzLnBkZi5tYXJnaW5zX2RvYy50b3A7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwicVwiLCBcInFcIiwgXCJCVFwiLCB0aGlzLmdldFBkZkNvbG9yKHN0eWxlLmNvbG9yKSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyh0aGlzLngpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcodGhpcy55KSwgXCJUZFwiKTsgLy9tb3ZlIGN1cnNvciBieSBvbmUgbGluZSBvbiBuZXcgcGFnZVxuXG4gICAgICAgIG1heExpbmVIZWlnaHQgPSBNYXRoLm1heChtYXhMaW5lSGVpZ2h0LCBzdHlsZVtcImxpbmUtaGVpZ2h0XCJdLCBzdHlsZVtcImZvbnQtc2l6ZVwiXSk7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKDAsICgtMSAqIGRlZmF1bHRGb250U2l6ZSAqIG1heExpbmVIZWlnaHQpLnRvRml4ZWQoMiksIFwiVGRcIik7XG4gICAgICB9XG5cbiAgICAgIGZvbnQgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250KHN0eWxlW1wiZm9udC1mYW1pbHlcIl0sIHN0eWxlW1wiZm9udC1zdHlsZVwiXSk7IC8vIHRleHQgY29sb3JcblxuICAgICAgdmFyIHBkZlRleHRDb2xvciA9IHRoaXMuZ2V0UGRmQ29sb3Ioc3R5bGVbXCJjb2xvclwiXSk7XG5cbiAgICAgIGlmIChwZGZUZXh0Q29sb3IgIT09IHRoaXMubGFzdFRleHRDb2xvcikge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShwZGZUZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmxhc3RUZXh0Q29sb3IgPSBwZGZUZXh0Q29sb3I7XG4gICAgICB9IC8vc2V0IHRoZSB3b3JkIHNwYWNpbmcgZm9yIGUuZy4ganVzdGlmeSBzdHlsZVxuXG5cbiAgICAgIGlmIChzdHlsZVsnd29yZC1zcGFjaW5nJ10gIT09IHVuZGVmaW5lZCAmJiBzdHlsZVsnd29yZC1zcGFjaW5nJ10gPiAwKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKHN0eWxlWyd3b3JkLXNwYWNpbmcnXS50b0ZpeGVkKDIpLCBcIlR3XCIpO1xuICAgICAgfVxuXG5cbiAgICAgIHZhciBwZGZFc2NhcGUxNiA9IGZ1bmN0aW9uKHRleHQsIGZvbnQpIHtcbiAgICAgICAgdmFyIHdpZHRocyA9IGZvbnQubWV0YWRhdGEuVW5pY29kZS53aWR0aHM7XG4gICAgICAgIHZhciBwYWR6ID0gW1wiXCIsIFwiMFwiLCBcIjAwXCIsIFwiMDAwXCIsIFwiMDAwMFwiXTtcbiAgICAgICAgdmFyIGFyID0gW1wiXCJdO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHRleHQubGVuZ3RoLCB0OyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgdCA9IGZvbnQubWV0YWRhdGEuY2hhcmFjdGVyVG9HbHlwaCh0ZXh0LmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIGZvbnQubWV0YWRhdGEuZ2x5SWRzVXNlZC5wdXNoKHQpO1xuICAgICAgICAgIGZvbnQubWV0YWRhdGEudG9Vbmljb2RlW3RdID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgIGlmICh3aWR0aHMuaW5kZXhPZih0KSA9PSAtMSkge1xuICAgICAgICAgICAgd2lkdGhzLnB1c2godCk7XG4gICAgICAgICAgICB3aWR0aHMucHVzaChbcGFyc2VJbnQoZm9udC5tZXRhZGF0YS53aWR0aE9mR2x5cGgodCksIDEwKV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodCA9PSBcIjBcIikge1xuICAgICAgICAgICAgLy9TcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIGNtYXAuXG4gICAgICAgICAgICByZXR1cm4gYXIuam9pbihcIlwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdCA9IHQudG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgYXIucHVzaChwYWR6WzQgLSB0Lmxlbmd0aF0sIHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXIuam9pbihcIlwiKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciB1dGY4VGV4dEZ1bmN0aW9uID0gZnVuY3Rpb24odGV4dCwgZm9udCkge1xuICAgICAgICB2YXIgdGV4dCA9IHRleHQgfHwgXCJcIjtcbiAgICBcbiAgICAgICAgdmFyIHN0ciA9IFwiXCIsXG4gICAgICAgICAgcyA9IDAsXG4gICAgICAgICAgY21hcENvbmZpcm07XG4gICAgICAgIHZhciBzdHJUZXh0ID0gXCJcIjtcbiAgICAgICAgdmFyIGVuY29kaW5nID0gZm9udC5lbmNvZGluZztcbiAgICBcbiAgICAgICAgaWYgKGZvbnQuZW5jb2RpbmcgIT09IFwiSWRlbnRpdHktSFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3RyVGV4dCA9IHRleHQ7XG4gICAgXG4gICAgICAgIGZvciAocyA9IDA7IHMgPCBzdHJUZXh0Lmxlbmd0aDsgcyArPSAxKSB7XG4gICAgICAgICAgaWYgKGZvbnQubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoXCJjbWFwXCIpKSB7XG4gICAgICAgICAgICBjbWFwQ29uZmlybSA9IGZvbnQubWV0YWRhdGEuY21hcC51bmljb2RlLmNvZGVNYXBbc3RyVGV4dFtzXS5jaGFyQ29kZUF0KDApXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjbWFwQ29uZmlybSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBzdHJUZXh0W3NdLmNoYXJDb2RlQXQoMCkgPCAyNTYgJiZcbiAgICAgICAgICAgICAgZm9udC5tZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShcIlVuaWNvZGVcIilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBzdHIgKz0gc3RyVGV4dFtzXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0ciArPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHIgKz0gc3RyVGV4dFtzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGlmIChwYXJzZUludChmb250LmlkLnNsaWNlKDEpKSA8IDE0IHx8IGVuY29kaW5nID09PSBcIldpbkFuc2lFbmNvZGluZ1wiKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5wZGYuaW50ZXJuYWwucGRmRXNjYXBlKHN0ciwga2V5KVxuICAgICAgICAgICAgLnNwbGl0KFwiXCIpXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uKGN2KSB7XG4gICAgICAgICAgICAgIHJldHVybiBjdi5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgICByZXN1bHQgPSBwZGZFc2NhcGUxNihzdHIsIGZvbnQpO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9OyAgICAgIFxuXG4gICAgICAvLyB2YXIgZXNjYXBlZFRleHQgPSB0aGlzLnBkZi5pbnRlcm5hbC5wZGZFc2NhcGUodGV4dCk7XG4gICAgICAvLyB2YXIgZXNjYXBlZFRleHQgPSB1dGY4VGV4dEZ1bmN0aW9uKHRleHQsIGZvbnQpO1xuICAgICAgLy8gaWYoZXNjYXBlZFRleHQgIT0gdGV4dCkge1xuICAgICAgLy8gICBlc2NhcGVkVGV4dCA9IFwiPFwiICsgZXNjYXBlZFRleHQgKyBcIj5cIjtcbiAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIGVzY2FwZWRUZXh0ID0gXCIoXCIgKyBlc2NhcGVkVGV4dCArIFwiKVwiO1xuICAgICAgLy8gfVxuXG4gICAgICB2YXIgZXNjYXBlZFRleHQgPSBcIlwiO1xuICAgICAgaWYoZm9udC5lbmNvZGluZyAhPT0gXCJJZGVudGl0eS1IXCIpIHtcbiAgICAgICAgZXNjYXBlZFRleHQgPSBcIihcIiArIHRoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZSh0ZXh0KSArIFwiKVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXNjYXBlZFRleHQgPSBcIjxcIiArIHV0ZjhUZXh0RnVuY3Rpb24odGV4dCwgZm9udCkgKyBcIj5cIjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoXCIvXCIgKyBmb250LmlkLCAoZGVmYXVsdEZvbnRTaXplICogc3R5bGVbXCJmb250LXNpemVcIl0pLnRvRml4ZWQoMiksIFwiVGZcIiwgZXNjYXBlZFRleHQgKyBcIiBUalwiKTsgLy9zZXQgdGhlIHdvcmQgc3BhY2luZyBiYWNrIHRvIG5ldXRyYWwgPT4gMFxuXG4gICAgICBpZiAoc3R5bGVbJ3dvcmQtc3BhY2luZyddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUoMCwgXCJUd1wiKTtcbiAgICAgIH1cbiAgICB9OyAvLyBBY2NlcHRzICNGRkZGRkYsIHJnYihpbnQsaW50LGludCksIG9yIENTUyBDb2xvciBOYW1lXG5cblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5nZXRQZGZDb2xvciA9IGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgdmFyIHRleHRDb2xvcjtcbiAgICAgIHZhciByLCBnLCBiO1xuICAgICAgdmFyIHJ4ID0gL3JnYlxccypcXChcXHMqKFxcZCspLFxccyooXFxkKyksXFxzKihcXGQrXFxzKilcXCkvO1xuICAgICAgdmFyIG0gPSByeC5leGVjKHN0eWxlKTtcblxuICAgICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgICByID0gcGFyc2VJbnQobVsxXSk7XG4gICAgICAgIGcgPSBwYXJzZUludChtWzJdKTtcbiAgICAgICAgYiA9IHBhcnNlSW50KG1bM10pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHlsZSA9PT0gXCJzdHJpbmdcIiAmJiBzdHlsZS5jaGFyQXQoMCkgIT0gJyMnKSB7XG4gICAgICAgICAgdmFyIHJnYkNvbG9yID0gbmV3IFJHQkNvbG9yKHN0eWxlKTtcblxuICAgICAgICAgIGlmIChyZ2JDb2xvci5vaykge1xuICAgICAgICAgICAgc3R5bGUgPSByZ2JDb2xvci50b0hleCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZSA9ICcjMDAwMDAwJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByID0gc3R5bGUuc3Vic3RyaW5nKDEsIDMpO1xuICAgICAgICByID0gcGFyc2VJbnQociwgMTYpO1xuICAgICAgICBnID0gc3R5bGUuc3Vic3RyaW5nKDMsIDUpO1xuICAgICAgICBnID0gcGFyc2VJbnQoZywgMTYpO1xuICAgICAgICBiID0gc3R5bGUuc3Vic3RyaW5nKDUsIDcpO1xuICAgICAgICBiID0gcGFyc2VJbnQoYiwgMTYpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHIgPT09ICdzdHJpbmcnICYmIC9eI1swLTlBLUZhLWZdezZ9JC8udGVzdChyKSkge1xuICAgICAgICB2YXIgaGV4ID0gcGFyc2VJbnQoci5zdWJzdHIoMSksIDE2KTtcbiAgICAgICAgciA9IGhleCA+PiAxNiAmIDI1NTtcbiAgICAgICAgZyA9IGhleCA+PiA4ICYgMjU1O1xuICAgICAgICBiID0gaGV4ICYgMjU1O1xuICAgICAgfVxuXG4gICAgICB2YXIgZjMgPSB0aGlzLmYzO1xuXG4gICAgICBpZiAociA9PT0gMCAmJiBnID09PSAwICYmIGIgPT09IDAgfHwgdHlwZW9mIGcgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRleHRDb2xvciA9IGYzKHIgLyAyNTUpICsgJyBnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRDb2xvciA9IFtmMyhyIC8gMjU1KSwgZjMoZyAvIDI1NSksIGYzKGIgLyAyNTUpLCAncmcnXS5qb2luKCcgJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0ZXh0Q29sb3I7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5mMyA9IGZ1bmN0aW9uIChudW1iZXIpIHtcbiAgICAgIHJldHVybiBudW1iZXIudG9GaXhlZCgzKTsgLy8gSWUsICUuM2ZcbiAgICB9LCBSZW5kZXJlci5wcm90b3R5cGUucmVuZGVyUGFyYWdyYXBoID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICB2YXIgYmxvY2tzdHlsZSwgZGVmYXVsdEZvbnRTaXplLCBmb250VG9Vbml0UmF0aW8sIGZyYWdtZW50cywgaSwgbCwgbGluZSwgbGluZXMsIG1heExpbmVIZWlnaHQsIG91dCwgcGFyYWdyYXBoc3BhY2luZ19hZnRlciwgcGFyYWdyYXBoc3BhY2luZ19iZWZvcmUsIHByaW9yYmxvY2tzdHlsZSwgc3R5bGVzLCBmb250U2l6ZTtcbiAgICAgIGZyYWdtZW50cyA9IFB1cmdlV2hpdGVTcGFjZSh0aGlzLnBhcmFncmFwaC50ZXh0KTtcbiAgICAgIHN0eWxlcyA9IHRoaXMucGFyYWdyYXBoLnN0eWxlO1xuICAgICAgYmxvY2tzdHlsZSA9IHRoaXMucGFyYWdyYXBoLmJsb2Nrc3R5bGU7XG4gICAgICBwcmlvcmJsb2Nrc3R5bGUgPSB0aGlzLnBhcmFncmFwaC5wcmlvcmJsb2Nrc3R5bGUgfHwge307XG4gICAgICB0aGlzLnBhcmFncmFwaCA9IHtcbiAgICAgICAgdGV4dDogW10sXG4gICAgICAgIHN0eWxlOiBbXSxcbiAgICAgICAgYmxvY2tzdHlsZToge30sXG4gICAgICAgIHByaW9yYmxvY2tzdHlsZTogYmxvY2tzdHlsZVxuICAgICAgfTtcblxuICAgICAgaWYgKCFmcmFnbWVudHMuam9pbihcIlwiKS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsaW5lcyA9IHRoaXMuc3BsaXRGcmFnbWVudHNJbnRvTGluZXMoZnJhZ21lbnRzLCBzdHlsZXMpO1xuICAgICAgbGluZSA9IHZvaWQgMDtcbiAgICAgIG1heExpbmVIZWlnaHQgPSB2b2lkIDA7XG4gICAgICBkZWZhdWx0Rm9udFNpemUgPSAxMjtcbiAgICAgIGZvbnRUb1VuaXRSYXRpbyA9IGRlZmF1bHRGb250U2l6ZSAvIHRoaXMucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgdGhpcy5wcmlvck1hcmdpbkJvdHRvbSA9IHRoaXMucHJpb3JNYXJnaW5Cb3R0b20gfHwgMDtcbiAgICAgIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlID0gKE1hdGgubWF4KChibG9ja3N0eWxlW1wibWFyZ2luLXRvcFwiXSB8fCAwKSAtIHRoaXMucHJpb3JNYXJnaW5Cb3R0b20sIDApICsgKGJsb2Nrc3R5bGVbXCJwYWRkaW5nLXRvcFwiXSB8fCAwKSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICBwYXJhZ3JhcGhzcGFjaW5nX2FmdGVyID0gKChibG9ja3N0eWxlW1wibWFyZ2luLWJvdHRvbVwiXSB8fCAwKSArIChibG9ja3N0eWxlW1wicGFkZGluZy1ib3R0b21cIl0gfHwgMCkpICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgdGhpcy5wcmlvck1hcmdpbkJvdHRvbSA9IGJsb2Nrc3R5bGVbXCJtYXJnaW4tYm90dG9tXCJdIHx8IDA7XG5cbiAgICAgIGlmIChibG9ja3N0eWxlWydwYWdlLWJyZWFrLWJlZm9yZSddID09PSAnYWx3YXlzJykge1xuICAgICAgICB0aGlzLnBkZi5hZGRQYWdlKCk7XG4gICAgICAgIHRoaXMueSA9IDA7XG4gICAgICAgIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlID0gKChibG9ja3N0eWxlW1wibWFyZ2luLXRvcFwiXSB8fCAwKSArIChibG9ja3N0eWxlW1wicGFkZGluZy10b3BcIl0gfHwgMCkpICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgfVxuXG4gICAgICBvdXQgPSB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZTtcbiAgICAgIGkgPSB2b2lkIDA7XG4gICAgICBsID0gdm9pZCAwO1xuICAgICAgdGhpcy55ICs9IHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlO1xuICAgICAgb3V0KFwicVwiLCBcIkJUIDAgZ1wiLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKHRoaXMueCksIHRoaXMucGRmLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZVN0cmluZyh0aGlzLnkpLCBcIlRkXCIpOyAvL3N0b3JlcyB0aGUgY3VycmVudCBpbmRlbnQgb2YgY3Vyc29yIHBvc2l0aW9uXG5cbiAgICAgIHZhciBjdXJyZW50SW5kZW50ID0gMDtcblxuICAgICAgd2hpbGUgKGxpbmVzLmxlbmd0aCkge1xuICAgICAgICBsaW5lID0gbGluZXMuc2hpZnQoKTtcbiAgICAgICAgbWF4TGluZUhlaWdodCA9IDA7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICBsID0gbGluZS5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgICBpZiAobGluZVtpXVswXS50cmltKCkpIHtcbiAgICAgICAgICAgIG1heExpbmVIZWlnaHQgPSBNYXRoLm1heChtYXhMaW5lSGVpZ2h0LCBsaW5lW2ldWzFdW1wibGluZS1oZWlnaHRcIl0sIGxpbmVbaV1bMV1bXCJmb250LXNpemVcIl0pO1xuICAgICAgICAgICAgZm9udFNpemUgPSBsaW5lW2ldWzFdW1wiZm9udC1zaXplXCJdICogNztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gLy9pZiB3ZSBoYXZlIHRvIG1vdmUgdGhlIGN1cnNvciB0byBhZGFwdCB0aGUgaW5kZW50XG5cblxuICAgICAgICB2YXIgaW5kZW50TW92ZSA9IDA7XG4gICAgICAgIHZhciB3YW50ZWRJbmRlbnQgPSAwOyAvL2lmIGEgbWFyZ2luIHdhcyBhZGRlZCAoYnkgZS5nLiBhIHRleHQtYWxpZ25tZW50KSwgbW92ZSB0aGUgY3Vyc29yXG5cbiAgICAgICAgaWYgKGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSAhPT0gdW5kZWZpbmVkICYmIGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSA+IDApIHtcbiAgICAgICAgICB3YW50ZWRJbmRlbnQgPSB0aGlzLnBkZi5pbnRlcm5hbC5nZXRDb29yZGluYXRlU3RyaW5nKGxpbmVbMF1bMV1bXCJtYXJnaW4tbGVmdFwiXSk7XG4gICAgICAgICAgaW5kZW50TW92ZSA9IHdhbnRlZEluZGVudCAtIGN1cnJlbnRJbmRlbnQ7XG4gICAgICAgICAgY3VycmVudEluZGVudCA9IHdhbnRlZEluZGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpbmRlbnRNb3JlID0gTWF0aC5tYXgoYmxvY2tzdHlsZVtcIm1hcmdpbi1sZWZ0XCJdIHx8IDAsIDApICogZm9udFRvVW5pdFJhdGlvOyAvL21vdmUgdGhlIGN1cnNvclxuXG4gICAgICAgIG91dChpbmRlbnRNb3ZlICsgaW5kZW50TW9yZSwgKC0xICogZGVmYXVsdEZvbnRTaXplICogbWF4TGluZUhlaWdodCkudG9GaXhlZCgyKSwgXCJUZFwiKTtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIGwgPSBsaW5lLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAgIGlmIChsaW5lW2ldWzBdKSB7XG4gICAgICAgICAgICB0aGlzLlJlbmRlclRleHRGcmFnbWVudChsaW5lW2ldWzBdLCBsaW5lW2ldWzFdKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnkgKz0gbWF4TGluZUhlaWdodCAqIGZvbnRUb1VuaXRSYXRpbzsgLy9pZiBzb21lIHdhdGNoZXIgZnVuY3Rpb24gd2FzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWwsIHNvIGUuZy4gbWFyZ2luIGFuZCB3aWR0aHMgd2VyZSBjaGFuZ2VkLFxuICAgICAgICAvL3Jlc2V0IGxpbmUgZHJhd2luZyBhbmQgY2FsY3VsYXRlIHBvc2l0aW9uIGFuZCBsaW5lcyBhZ2FpblxuICAgICAgICAvL2UuZy4gdG8gc3RvcCB0ZXh0IGZsb2F0aW5nIGFyb3VuZCBhbiBpbWFnZVxuXG4gICAgICAgIGlmICh0aGlzLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhsaW5lWzBdWzFdKSAmJiBsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIGxvY2FsRnJhZ21lbnRzID0gW107XG4gICAgICAgICAgdmFyIGxvY2FsU3R5bGVzID0gW107IC8vY3JlYXRlIGZyYWdtZW50IGFycmF5IG9mXG5cbiAgICAgICAgICBsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsb2NhbExpbmUpIHtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIHZhciBsID0gbG9jYWxMaW5lLmxlbmd0aDtcblxuICAgICAgICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgICAgICAgaWYgKGxvY2FsTGluZVtpXVswXSkge1xuICAgICAgICAgICAgICAgIGxvY2FsRnJhZ21lbnRzLnB1c2gobG9jYWxMaW5lW2ldWzBdICsgJyAnKTtcbiAgICAgICAgICAgICAgICBsb2NhbFN0eWxlcy5wdXNoKGxvY2FsTGluZVtpXVsxXSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7IC8vc3BsaXQgbGluZXMgYWdhaW4gZHVlIHRvIHBvc3NpYmxlIGNvb3JkaW5hdGUgY2hhbmdlc1xuXG4gICAgICAgICAgbGluZXMgPSB0aGlzLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzKFB1cmdlV2hpdGVTcGFjZShsb2NhbEZyYWdtZW50cyksIGxvY2FsU3R5bGVzKTsgLy9yZXBvc2l0aW9uIHRoZSBjdXJyZW50IGN1cnNvclxuXG4gICAgICAgICAgb3V0KFwiRVRcIiwgXCJRXCIpO1xuICAgICAgICAgIG91dChcInFcIiwgXCJCVCAwIGdcIiwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyh0aGlzLngpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcodGhpcy55KSwgXCJUZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2IgJiYgdHlwZW9mIGNiID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2IuY2FsbCh0aGlzLCB0aGlzLnggLSA5LCB0aGlzLnkgLSBmb250U2l6ZSAvIDIpO1xuICAgICAgfVxuXG4gICAgICBvdXQoXCJFVFwiLCBcIlFcIik7XG4gICAgICByZXR1cm4gdGhpcy55ICs9IHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXI7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zZXRCbG9ja0JvdW5kYXJ5ID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJQYXJhZ3JhcGgoY2IpO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuc2V0QmxvY2tTdHlsZSA9IGZ1bmN0aW9uIChjc3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaC5ibG9ja3N0eWxlID0gY3NzO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuYWRkVGV4dCA9IGZ1bmN0aW9uICh0ZXh0LCBjc3MpIHtcbiAgICAgIHRoaXMucGFyYWdyYXBoLnRleHQucHVzaCh0ZXh0KTtcbiAgICAgIHJldHVybiB0aGlzLnBhcmFncmFwaC5zdHlsZS5wdXNoKGNzcyk7XG4gICAgfTtcblxuICAgIEZvbnROYW1lREIgPSB7XG4gICAgICBoZWx2ZXRpY2E6IFwiaGVsdmV0aWNhXCIsXG4gICAgICBcInNhbnMtc2VyaWZcIjogXCJoZWx2ZXRpY2FcIixcbiAgICAgIFwidGltZXMgbmV3IHJvbWFuXCI6IFwidGltZXNcIixcbiAgICAgIHNlcmlmOiBcInRpbWVzXCIsXG4gICAgICB0aW1lczogXCJ0aW1lc1wiLFxuICAgICAgbW9ub3NwYWNlOiBcImNvdXJpZXJcIixcbiAgICAgIGNvdXJpZXI6IFwiY291cmllclwiXG4gICAgfTtcbiAgICBGb250V2VpZ2h0TWFwID0ge1xuICAgICAgMTAwOiBcIm5vcm1hbFwiLFxuICAgICAgMjAwOiBcIm5vcm1hbFwiLFxuICAgICAgMzAwOiBcIm5vcm1hbFwiLFxuICAgICAgNDAwOiBcIm5vcm1hbFwiLFxuICAgICAgNTAwOiBcImJvbGRcIixcbiAgICAgIDYwMDogXCJib2xkXCIsXG4gICAgICA3MDA6IFwiYm9sZFwiLFxuICAgICAgODAwOiBcImJvbGRcIixcbiAgICAgIDkwMDogXCJib2xkXCIsXG4gICAgICBub3JtYWw6IFwibm9ybWFsXCIsXG4gICAgICBib2xkOiBcImJvbGRcIixcbiAgICAgIGJvbGRlcjogXCJib2xkXCIsXG4gICAgICBsaWdodGVyOiBcIm5vcm1hbFwiXG4gICAgfTtcbiAgICBGb250U3R5bGVNYXAgPSB7XG4gICAgICBub3JtYWw6IFwibm9ybWFsXCIsXG4gICAgICBpdGFsaWM6IFwiaXRhbGljXCIsXG4gICAgICBvYmxpcXVlOiBcIml0YWxpY1wiXG4gICAgfTtcbiAgICBUZXh0QWxpZ25NYXAgPSB7XG4gICAgICBsZWZ0OiBcImxlZnRcIixcbiAgICAgIHJpZ2h0OiBcInJpZ2h0XCIsXG4gICAgICBjZW50ZXI6IFwiY2VudGVyXCIsXG4gICAgICBqdXN0aWZ5OiBcImp1c3RpZnlcIlxuICAgIH07XG4gICAgRmxvYXRNYXAgPSB7XG4gICAgICBub25lOiAnbm9uZScsXG4gICAgICByaWdodDogJ3JpZ2h0JyxcbiAgICAgIGxlZnQ6ICdsZWZ0J1xuICAgIH07XG4gICAgQ2xlYXJNYXAgPSB7XG4gICAgICBub25lOiAnbm9uZScsXG4gICAgICBib3RoOiAnYm90aCdcbiAgICB9O1xuICAgIFVuaXRlZE51bWJlck1hcCA9IHtcbiAgICAgIG5vcm1hbDogMVxuICAgIH07XG4gICAgLyoqXG4gICAgICogQ29udmVydHMgSFRNTC1mb3JtYXR0ZWQgdGV4dCBpbnRvIGZvcm1hdHRlZCBQREYgdGV4dC5cbiAgICAgKlxuICAgICAqIE5vdGVzOlxuICAgICAqIDIwMTItMDctMThcbiAgICAgKiBQbHVnaW4gcmVsaWVzIG9uIGhhdmluZyBicm93c2VyLCBET00gYXJvdW5kLiBUaGUgSFRNTCBpcyBwdXNoZWQgaW50byBkb20gYW5kIHRyYXZlcnNlZC5cbiAgICAgKiBQbHVnaW4gcmVsaWVzIG9uIGpRdWVyeSBmb3IgQ1NTIGV4dHJhY3Rpb24uXG4gICAgICogVGFyZ2V0aW5nIEhUTUwgb3V0cHV0IGZyb20gTWFya2Rvd24gdGVtcGxhdGluZywgd2hpY2ggaXMgYSB2ZXJ5IHNpbXBsZVxuICAgICAqIG1hcmt1cCAtIGRpdiwgc3BhbiwgZW0sIHN0cm9uZywgcC4gTm8gYnItYmFzZWQgcGFyYWdyYXBoIHNlcGFyYXRpb24gc3VwcG9ydGVkIGV4cGxpY2l0bHkgKGJ1dCBzdGlsbCBtYXkgd29yay4pXG4gICAgICogSW1hZ2VzLCB0YWJsZXMgYXJlIE5PVCBzdXBwb3J0ZWQuXG4gICAgICpcbiAgICAgKiBAcHVibGljXG4gICAgICogQGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIEhUTUwge1N0cmluZ3xPYmplY3R9IEhUTUwtZm9ybWF0dGVkIHRleHQsIG9yIHBvaW50ZXIgdG8gRE9NIGVsZW1lbnQgdGhhdCBpcyB0byBiZSByZW5kZXJlZCBpbnRvIFBERi5cbiAgICAgKiBAcGFyYW0geCB7TnVtYmVyfSBzdGFydGluZyBYIGNvb3JkaW5hdGUgaW4ganNQREYgaW5zdGFuY2UncyBkZWNsYXJlZCB1bml0cy5cbiAgICAgKiBAcGFyYW0geSB7TnVtYmVyfSBzdGFydGluZyBZIGNvb3JkaW5hdGUgaW4ganNQREYgaW5zdGFuY2UncyBkZWNsYXJlZCB1bml0cy5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3Mge09iamVjdH0gQWRkaXRpb25hbCAvIG9wdGlvbmFsIHZhcmlhYmxlcyBjb250cm9sbGluZyBwYXJzaW5nLCByZW5kZXJpbmcuXG4gICAgICogQHJldHVybnMge09iamVjdH0ganNQREYgaW5zdGFuY2VcbiAgICAgKi9cblxuICAgIGpzUERGQVBJLmZyb21IVE1MID0gZnVuY3Rpb24gKEhUTUwsIHgsIHksIHNldHRpbmdzLCBjYWxsYmFjaywgbWFyZ2lucykge1xuXG4gICAgICB0aGlzLm1hcmdpbnNfZG9jID0gbWFyZ2lucyB8fCB7XG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgYm90dG9tOiAwXG4gICAgICB9O1xuICAgICAgaWYgKCFzZXR0aW5ncykgc2V0dGluZ3MgPSB7fTtcbiAgICAgIGlmICghc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzKSBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMgPSB7fTtcbiAgICAgIHJldHVybiBwcm9jZXNzKHRoaXMsIEhUTUwsIGlzTmFOKHgpID8gNCA6IHgsIGlzTmFOKHkpID8gNCA6IHksIHNldHRpbmdzLCBjYWxsYmFjayk7XG4gICAgfTtcbiAgfSkoanNwZGYuanNQREYuQVBJKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvZnJvbV9odG1sLmpzXG4vLyBtb2R1bGUgaWQgPSA2MFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9
11101
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCBmMGI0NDFiYzY1M2Q0ODNlOTFhNSIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9oZWxwZXJfc3VydmV5LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfYnJpY2sudHMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcInJvb3RcIjpcIlN1cnZleVwiLFwiY29tbW9uanMyXCI6XCJzdXJ2ZXktY29yZVwiLFwiY29tbW9uanNcIjpcInN1cnZleS1jb3JlXCIsXCJhbWRcIjpcInN1cnZleS1jb3JlXCJ9Iiwid2VicGFjazovLy8uL3NyYy9kb2NfY29udHJvbGxlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZW50cmllcy9wZGYudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfc2VsZWN0YmFzZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfcm93bGluZS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGJveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfdGV4dGZpZWxkLnRzIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJyb290XCI6XCJqc3BkZlwiLFwiY29tbW9uanMyXCI6XCJqc3BkZlwiLFwiY29tbW9uanNcIjpcImpzcGRmXCIsXCJhbWRcIjpcImpzcGRmXCJ9Iiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzLnRzIiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2V2ZW50X2hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4bXVsdGlwbGUudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY2hlY2tib3hpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21tZW50LnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9kcm9wZG93bi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfZW1wdHkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9yYWRpb2l0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BkZl9yZW5kZXIvcGRmX3JhbmtpbmdpdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl90aXRsZXBhbmVsLnRzIiwid2VicGFjazovLy8uL3NyYy9ldmVudF9oYW5kbGVyL2Fkb3JuZXJzLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2Jvb2xlYW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY2hlY2tib3gudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9jdXN0b21fbW9kZWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZHJvcGRvd24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfZXhwcmVzc2lvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9maWxlLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X2h0bWwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2VwaWNrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeGR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbXVsdGlwbGV0ZXh0LnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3BhbmVsZHluYW1pYy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYW5raW5nLnRzIiwid2VicGFjazovLy8uL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhdGluZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9zaWduYXR1cmVwYWQudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfdGV4dGJveC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvcGRmX3JlbmRlci9wZGZfY3VzdG9tLnRzIiwid2VicGFjazovLy8uL3NyYy9zdXJ2ZXkudHMiLCJ3ZWJwYWNrOi8vLy4vfi9ub2RlLWludGVydmFsLXRyZWUvbGliL2luZGV4LmpzIiwid2VicGFjazovLy8uL34vc2hhbGxvd2VxdWFsL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLnRzIiwid2VicGFjazovLy8uL3NyYy9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbi50cyIsIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzIiwid2VicGFjazovLy8uL3NyYy9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzIiwid2VicGFjazovLy8uL3NyYy9qc3BkZl9wbHVnaW5zL2Zyb21faHRtbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbURBQTJDLGNBQWM7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUM5REE7QUFBQSxJQUFJLGFBQWEsR0FBRyxVQUFTLENBQU0sRUFBRSxDQUFNO0lBQ3ZD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QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xKLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUssU0FBVSxTQUFTLENBQUMsT0FBWSxFQUFFLFVBQWUsRUFBRSxDQUFNLEVBQUUsU0FBYztJQUMzRSxTQUFTLEtBQUssQ0FBQyxLQUFVLElBQUksT0FBTyxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsT0FBWSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0SCxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLE9BQVksRUFBRSxNQUFXO1FBQy9ELFNBQVMsU0FBUyxDQUFDLEtBQVUsSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUFFO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FBRSxDQUFDLENBQUM7UUFDaEcsU0FBUyxRQUFRLENBQUMsS0FBVSxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FBRTtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQUUsQ0FBQyxDQUFDO1FBQ25HLFNBQVMsSUFBSSxDQUFDLE1BQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVLLFNBQVUsV0FBVyxDQUFDLE9BQVksRUFBRSxJQUFTO0lBQy9DLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQU8sRUFBRSxFQUFFLEdBQUcsRUFBTyxFQUFFLEVBQUUsRUFBRSxDQUFNLEVBQUUsQ0FBTSxFQUFFLENBQU0sRUFBRSxDQUFNLENBQUM7SUFDL0ksT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsY0FBYSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6SixTQUFTLElBQUksQ0FBQyxDQUFNLElBQUksT0FBTyxVQUFVLENBQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RSxTQUFTLElBQUksQ0FBQyxFQUFPO1FBQ2pCLElBQUksQ0FBQztZQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUM7WUFBRSxJQUFJO2dCQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFBRSxPQUFPLENBQUMsQ0FBQztnQkFDN0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNYLEtBQUssQ0FBQyxDQUFDO29CQUFDLEtBQUssQ0FBQzt3QkFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUFDLE1BQU07b0JBQzlCLEtBQUssQ0FBQzt3QkFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO29CQUN4RCxLQUFLLENBQUM7d0JBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQUMsU0FBUztvQkFDakQsS0FBSyxDQUFDO3dCQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQUMsU0FBUztvQkFDakQ7d0JBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTs0QkFBUSxDQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUFDLFNBQVM7eUJBQUU7d0JBQ25ILElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsZ0NBQWdDO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IseUJBQXlCO0FBQ3hEO0FBQ0EsaUZBQWlGO0FBQ2pGO0FB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QTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEMsd0NBQXdDLGlGQUFpRjtBQUN6SDtBQUNBO0FBQ0EsdUJBQXVCLGtCQUFrQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFF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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQSx5RkFBeUY7QUFDekY7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGtCQUFrQjtBQUNoQyxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsb0I7QUFDZCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLHFHOzs7Ozs7O0FDNTJGRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFD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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQyxpQkFBaUIsT0FBTztBQUN4QixpQkFBaUIsT0FBTztBQUN4Qix3QkFBd0IsT0FBTztBQUMvQixpQkFBaUIsT0FBTztBQUN4Qjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRyIsImZpbGUiOiIuL3BhY2thZ2VzL3N1cnZleS1wZGYvc3VydmV5LnBkZi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcInN1cnZleS1jb3JlXCIpLCByZXF1aXJlKFwianNwZGZcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJTdXJ2ZXlQREZcIiwgW1wic3VydmV5LWNvcmVcIiwgXCJqc3BkZlwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJTdXJ2ZXlQREZcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJzdXJ2ZXktY29yZVwiKSwgcmVxdWlyZShcImpzcGRmXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJTdXJ2ZXlQREZcIl0gPSBmYWN0b3J5KHJvb3RbXCJTdXJ2ZXlcIl0sIHJvb3RbXCJqc3BkZlwiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzdfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8xOF9fKSB7XG5yZXR1cm4gXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEzKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBmMGI0NDFiYzY1M2Q0ODNlOTFhNSIsImRlY2xhcmUgdmFyIFJlZmxlY3Q6IGFueTtcblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkOiBhbnksIGI6IGFueSk6IGFueSB7XG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkOiBhbnksIGI6IGFueSkge1xuICAgIGlmICh0eXBlb2YgYiAhPT0gJ2Z1bmN0aW9uJyAmJiBiICE9PSBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDbGFzcyBleHRlbmRzIHZhbHVlICcgKyBTdHJpbmcoYikgKyAnIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGwnKTtcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gICAgX19hc3NpZ24gPSAoPGFueT5PYmplY3QpLmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0OiBhbnkpIHtcbiAgICAgICAgZm9yICh2YXIgczogYW55LCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHM6IGFueSwgZTogYW55KSB7XG4gICAgdmFyIHQ6IGFueSA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSAnZnVuY3Rpb24nKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHFbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcVtpXSkpXG4gICAgICAgICAgICAgICAgdFtxW2ldXSA9IHNbcVtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9yczogYW55LCB0YXJnZXQ6IGFueSwga2V5OiBhbnksIGRlc2M6IGFueSkge1xuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gJ2Z1bmN0aW9uJykgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25kLWFzc2lnblxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnOiBhbnksIF9hcmd1bWVudHM6IGFueSwgUDogYW55LCBnZW5lcmF0b3I6IGFueSkge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlOiBhbnkpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmU6IGFueSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlOiBhbnksIHJlamVjdDogYW55KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZTogYW55KSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZTogYW55KSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyd0aHJvdyddKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQ6IGFueSkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnOiBhbnksIGJvZHk6IGFueSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IDxhbnk+W10sIG9wczogPGFueT5bXSB9LCBmOiBhbnksIHk6IGFueSwgdDogYW55LCBnOiBhbnk7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksICd0aHJvdyc6IHZlcmIoMSksICdyZXR1cm4nOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuOiBhbnkpIHsgcmV0dXJuIGZ1bmN0aW9uICh2OiBhbnkpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3A6IGFueSkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLicpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbJ3JldHVybiddIDogb3BbMF0gPyB5Wyd0aHJvdyddIHx8ICgodCA9IHlbJ3JldHVybiddKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgKDxhbnk+XykgPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5ICh0bzogYW55LCBmcm9tOiBhbnksIHBhY2s6IGFueSkge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOiBhbnk7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZW50cmllcy9oZWxwZXJzLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiwgUXVlc3Rpb25SYXRpbmdNb2RlbCwgUXVlc3Rpb25GaWxlTW9kZWwsIExvY2FsaXphYmxlU3RyaW5nLCBRdWVzdGlvblNlbGVjdEJhc2UsIFF1ZXN0aW9uRHJvcGRvd25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuL2VudHJpZXMvcGRmJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfbGF5b3V0L2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSUhUTUxSZW5kZXJUeXBlIH0gZnJvbSAnLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3RleHRib2xkJztcbmltcG9ydCB7IFRpdGxlUGFuZWxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfdGl0bGVwYW5lbCc7XG5pbXBvcnQgeyBEZXNjcmlwdGlvbkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9kZXNjcmlwdGlvbic7XG5pbXBvcnQgeyBDb21tZW50QnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbW1lbnQnO1xuaW1wb3J0IHsgTGlua0JyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9saW5rJztcbmltcG9ydCB7IEhUTUxCcmljayB9IGZyb20gJy4vcGRmX3JlbmRlci9wZGZfaHRtbCc7XG5pbXBvcnQgeyBJbWFnZUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9pbWFnZSc7XG5pbXBvcnQgeyBFbXB0eUJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5pbXBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX3Jvd2xpbmUnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBBZG9ybmVyc09wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuXG5leHBvcnQgY2xhc3MgU3VydmV5SGVscGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIEVQU0lMT046IG51bWJlciA9IDIuMjIwNDQ2MDQ5MjUwMzEzMDgwODQ3MjYzMzM2MTgxNmUtMTU7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9TVVJWRVlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjc7XG4gICAgcHVibGljIHN0YXRpYyBUSVRMRV9QQUdFX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS4zO1xuICAgIHB1YmxpYyBzdGF0aWMgVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjM7XG4gICAgcHVibGljIHN0YXRpYyBERVNDUklQVElPTl9GT05UX1NJWkVfU0NBTEU6IG51bWJlciA9IDIuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE9USEVSX1JPV1NfQ09VTlQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfTUlOX1dJRFRIOiBudW1iZXIgPSAzO1xuICAgIHB1YmxpYyBzdGF0aWMgUkFUSU5HX01JTl9IRUlHSFQ6IG51bWJlciA9IDI7XG4gICAgcHVibGljIHN0YXRpYyBSQVRJTkdfQ09MVU1OX1dJRFRIOiBudW1iZXIgPSA1O1xuICAgIHB1YmxpYyBzdGF0aWMgTUFUUklYX0NPTFVNTl9XSURUSDogbnVtYmVyID0gNTtcbiAgICBwdWJsaWMgc3RhdGljIElNQUdFUElDS0VSX0NPVU5UOiBudW1iZXIgPSA0O1xuICAgIHB1YmxpYyBzdGF0aWMgSU1BR0VQSUNLRVJfUkFUSU86IG51bWJlciA9IDQuMCAvIDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIE1VTFRJUExFVEVYVF9URVhUX1BFUlM6IG51bWJlciA9IE1hdGguRSAvIDEwLjA7XG4gICAgcHVibGljIHN0YXRpYyBIVE1MX1RBSUxfVEVYVF9TQ0FMRTogbnVtYmVyID0gMC4yNDtcbiAgICBwdWJsaWMgc3RhdGljIFNFTEVDVF9JVEVNX0ZMQVRfU0NBTEU6IG51bWJlciA9IDAuOTU7XG4gICAgcHVibGljIHN0YXRpYyBHQVBfQkVUV0VFTl9ST1dTOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fQ09MVU1OUzogbnVtYmVyID0gMS41O1xuICAgIHB1YmxpYyBzdGF0aWMgR0FQX0JFVFdFRU5fSVRFTV9URVhUOiBudW1iZXIgPSAwLjI1O1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfVklTSUJMRTogYm9vbGVhbiA9IHRydWU7XG4gICAgcHVibGljIHN0YXRpYyBCT1JERVJfU0NBTEU6IG51bWJlciA9IDAuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjg7XG4gICAgcHVibGljIHN0YXRpYyBVTlZJU0lCTEVfQk9SREVSX1NDQUxFOiBudW1iZXIgPSAwLjI7XG4gICAgcHVibGljIHN0YXRpYyBSQURJVVNfU0NBTEU6IG51bWJlciA9IDMuMDtcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0ZPTlRfU0NBTEU6IG51bWJlciA9IDEuMTtcbiAgICBwdWJsaWMgc3RhdGljIFZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU6IG51bWJlciA9IDAuMztcbiAgICBwdWJsaWMgc3RhdGljIEhUTUxfVE9fSU1BR0VfUVVBTElUWTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgRk9STV9CT1JERVJfQ09MT1I6IHN0cmluZyA9ICcjOWY5ZjlmJztcbiAgICBwdWJsaWMgc3RhdGljIFRFWFRfQ09MT1I6IHN0cmluZyA9ICcjNDA0MDQwJztcbiAgICBwdWJsaWMgc3RhdGljIEJBQ0tHUk9VTkRfQ09MT1I6IHN0cmluZyA9ICcjRkZGRkZGJztcbiAgICBwdWJsaWMgc3RhdGljIFRJVExFX0xPQ0FUSU9OX01BVFJJWDogc3RyaW5nID0gJ21hdHJpeCc7XG4gICAgcHVibGljIHN0YXRpYyBTVEFOREFSRF9GT05UOiBzdHJpbmcgPSAnaGVsdmV0aWNhJztcbiAgICBwdWJsaWMgc3RhdGljIENVU1RPTV9GT05UX0VOQ09ESU5HOiBzdHJpbmcgPSAnSWRlbnRpdHktSCc7XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlV2lkdGgod2lkdGg6IHN0cmluZywgbWF4V2lkdGg6IG51bWJlcixcbiAgICAgICAgY29sdW1uc0NvdW50OiBudW1iZXIgPSAxKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHdpZHRoLmluZGV4T2YoJ2NhbGMnKSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG1heFdpZHRoIC8gY29sdW1uc0NvdW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlOiBudW1iZXIgPSBwYXJzZUZsb2F0KHdpZHRoKTtcbiAgICAgICAgY29uc3QgdW5pdDogc3RyaW5nID0gd2lkdGgucmVwbGFjZSgvW15BLVphLXpdL2csICcnKTtcbiAgICAgICAgbGV0IGs6IG51bWJlcjtcbiAgICAgICAgc3dpdGNoICh1bml0KSB7XG4gICAgICAgICAgICBjYXNlICdwdCc6XG4gICAgICAgICAgICAgICAgayA9IDEuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21tJzpcbiAgICAgICAgICAgICAgICBrID0gNzIuMCAvIDI1LjQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjbSc6XG4gICAgICAgICAgICAgICAgayA9IDcyLjAgLyAyLjU0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaW4nOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncHgnOlxuICAgICAgICAgICAgICAgIGsgPSA3Mi4wIC8gOTYuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3BjJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VtJzpcbiAgICAgICAgICAgICAgICBrID0gMTIuMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2V4JzpcbiAgICAgICAgICAgICAgICBrID0gNi4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGNhc2UgJyUnOlxuICAgICAgICAgICAgICAgIGsgPSBtYXhXaWR0aCAvIDEwMC4wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLm1pbih2YWx1ZSAqIGssIG1heFdpZHRoKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBweFRvUHQodmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHZhbHVlLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgKiA3Mi4wIC8gOTYuMDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBtZXJnZVJlY3RzKC4uLnJlY3RzOiBJUmVjdFtdKTogSVJlY3Qge1xuICAgICAgICBjb25zdCByZXN1bHRSZWN0OiBJUmVjdCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiByZWN0c1swXS54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogcmVjdHNbMF0ueFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogcmVjdHNbMF0ueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHJlY3RzWzBdLnlCb3RcbiAgICAgICAgfTtcbiAgICAgICAgcmVjdHMuZm9yRWFjaCgocmVjdDogSVJlY3QpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueExlZnQgPSBNYXRoLm1pbihyZXN1bHRSZWN0LnhMZWZ0LCByZWN0LnhMZWZ0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueFJpZ2h0ID0gTWF0aC5tYXgocmVzdWx0UmVjdC54UmlnaHQsIHJlY3QueFJpZ2h0KSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueVRvcCA9IE1hdGgubWluKHJlc3VsdFJlY3QueVRvcCwgcmVjdC55VG9wKSxcbiAgICAgICAgICAgIHJlc3VsdFJlY3QueUJvdCA9IE1hdGgubWF4KHJlc3VsdFJlY3QueUJvdCwgcmVjdC55Qm90KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRSZWN0O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVBvaW50KHJlY3Q6IElSZWN0LCBpc0xlZnQ6IGJvb2xlYW4gPSB0cnVlLCBpc1RvcDogYm9vbGVhbiA9IGZhbHNlKTogSVBvaW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiBpc0xlZnQgPyByZWN0LnhMZWZ0IDogcmVjdC54UmlnaHQsXG4gICAgICAgICAgICB5VG9wOiBpc1RvcCA/IHJlY3QueVRvcCA6IHJlY3QueUJvdFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJlY3QocG9pbnQ6IElQb2ludCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcG9pbnQueExlZnQsXG4gICAgICAgICAgICB4UmlnaHQ6IHBvaW50LnhMZWZ0ICsgd2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wLFxuICAgICAgICAgICAgeUJvdDogcG9pbnQueVRvcCArIGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHhMZWZ0OiAwLjAsXG4gICAgICAgICAgICB4UmlnaHQ6IGNvbnRyb2xsZXIucGFwZXJXaWR0aCxcbiAgICAgICAgICAgIHlUb3A6IDAuMCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIubWFyZ2lucy50b3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVGb290ZXJSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogMC4wLFxuICAgICAgICAgICAgeFJpZ2h0OiBjb250cm9sbGVyLnBhcGVyV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdCxcbiAgICAgICAgICAgIHlCb3Q6IGNvbnRyb2xsZXIucGFwZXJIZWlnaHRcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjaG9vc2VIdG1sRm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHJlbmRlckFzID09PSAnc3RhbmRhcmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc0N1c3RvbUZvbnQoY29udHJvbGxlciwgY29udHJvbGxlci5mb250TmFtZSkgPyB0aGlzLlNUQU5EQVJEX0ZPTlQgOiBjb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnVzZUN1c3RvbUZvbnRJbkh0bWwgPyBjb250cm9sbGVyLmZvbnROYW1lIDogdGhpcy5TVEFOREFSRF9GT05UO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlQ3NzVGV4dFJ1bGUoZm9udFNpemU6IG51bWJlciwgZm9udFN0eWxlOiBzdHJpbmcsIGZvbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYFwiZm9udC1zaXplOiAke2ZvbnRTaXplfXB0OyBmb250LXdlaWdodDogJHtmb250U3R5bGV9OyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGNvbG9yOiAke3RoaXMuVEVYVF9DT0xPUn07XCJgO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhodG1sOiBzdHJpbmcsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlbmRlckFzOiBJSFRNTFJlbmRlclR5cGUpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBmb250ID0gdGhpcy5jaG9vc2VIdG1sRm9udChjb250cm9sbGVyLCByZW5kZXJBcyk7XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cIl9fc3VydmV5cGRmX2h0bWxcIiBzdHlsZT0ke3RoaXMuZ2VuZXJhdGVDc3NUZXh0UnVsZShcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUsIGNvbnRyb2xsZXIuZm9udFN0eWxlLCBmb250KX0+YCArXG4gICAgICAgICAgICBgPHN0eWxlPi5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IDA7IGxpbmUtaGVpZ2h0OiAke2NvbnRyb2xsZXIuZm9udFNpemV9cHQgfSBib2R5IHsgbWFyZ2luOiAwOyB9PC9zdHlsZT4ke2h0bWx9PC9kaXY+YDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzcGxpdEh0bWxSZWN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGh0bWxCcmljazogSVBkZkJyaWNrKTogSVBkZkJyaWNrIHtcbiAgICAgICAgY29uc3QgYnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBodG1sSGVpZ2h0OiBudW1iZXIgPSBodG1sQnJpY2suaGVpZ2h0O1xuICAgICAgICBjb25zdCBtaW5IZWlnaHQ6IG51bWJlciA9IGNvbnRyb2xsZXIuZG9jLmdldEZvbnRTaXplKCk7XG4gICAgICAgIGh0bWxCcmljay55Qm90ID0gaHRtbEJyaWNrLnlUb3AgKyBtaW5IZWlnaHQ7XG4gICAgICAgIGNvbnN0IGVtcHR5QnJpY2tDb3VudDogbnVtYmVyID0gTWF0aC5mbG9vcihodG1sSGVpZ2h0IC8gbWluSGVpZ2h0KSAtIDE7XG4gICAgICAgIGJyaWNrcy5wdXNoKGh0bWxCcmljayk7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gdGhpcy5jcmVhdGVQb2ludChodG1sQnJpY2spO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZW1wdHlCcmlja0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgIGJyaWNrcy5wdXNoKG5ldyBFbXB0eUJyaWNrKHRoaXMuY3JlYXRlUmVjdChjdXJyUG9pbnQsIGh0bWxCcmljay53aWR0aCwgbWluSGVpZ2h0KSkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gbWluSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZ0hlaWdodDogbnVtYmVyID0gaHRtbEhlaWdodCAtIChlbXB0eUJyaWNrQ291bnQgKyAxKSAqIG1pbkhlaWdodDtcbiAgICAgICAgaWYgKHJlbWFpbmluZ0hlaWdodCA+IDApIHtcbiAgICAgICAgICAgIGJyaWNrcy5wdXNoKG5ldyBFbXB0eUJyaWNrKHRoaXMuY3JlYXRlUmVjdChjdXJyUG9pbnQsIGh0bWxCcmljay53aWR0aCwgcmVtYWluaW5nSGVpZ2h0KSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2soLi4uYnJpY2tzKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVQbGFpblRleHRGbGF0PFQgZXh0ZW5kcyBJUGRmQnJpY2s+KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZywgZmFicmljOiBuZXcgKHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSA9PiBUKTogQ29tcG9zaXRlQnJpY2sge1xuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBjb250cm9sbGVyLmRvYy5zcGxpdFRleHRUb1NpemUodGV4dCxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIHBvaW50LnhMZWZ0KTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSB0aGlzLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlOiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBsaW5lcy5mb3JFYWNoKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNpemU6IElTaXplID0gY29udHJvbGxlci5tZWFzdXJlVGV4dChsaW5lKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhuZXcgZmFicmljKHF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUmVjdChjdXJyUG9pbnQsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KSwgbGluZSkpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gc2l6ZS5oZWlnaHQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVRleHRGbGF0PFQgZXh0ZW5kcyBJUGRmQnJpY2s+KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nLCBmYWJyaWM6IG5ldyAocXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpID0+IFQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdzdHJpbmcnIHx8ICF0aGlzLmhhc0h0bWwodGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVBsYWluVGV4dEZsYXQocG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLCB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgICAgIHRleHQgOiB0aGlzLmdldExvY1N0cmluZyg8TG9jYWxpemFibGVTdHJpbmc+dGV4dCksIGZhYnJpYyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpdEh0bWxSZWN0KGNvbnRyb2xsZXIsIGF3YWl0IHRoaXMuY3JlYXRlSFRNTEZsYXQocG9pbnQsIDxRdWVzdGlvbj5xdWVzdGlvbiwgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayh0aGlzLmdldExvY1N0cmluZyh0ZXh0KSwgY29udHJvbGxlciwgJ3N0YW5kYXJkJykpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBoYXNIdG1sKHRleHQ6IExvY2FsaXphYmxlU3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBhdHRlcm46IFJlZ0V4cCA9IC88XFwvP1thLXpdW1xcc1xcU10qPi9pO1xuICAgICAgICByZXR1cm4gdGV4dC5oYXNIdG1sICYmIChwYXR0ZXJuLnRlc3QoKDxhbnk+dGV4dCkucmVuZGVyZWRUZXh0KSB8fCBwYXR0ZXJuLnRlc3QodGV4dC5yZW5kZXJlZEh0bWwpKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0SHRtbE1hcmdpbnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcG9pbnQ6IElQb2ludCk6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLCB3aWR0aDogbnVtYmVyIH0ge1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gcG9pbnQueExlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IGNvbnRyb2xsZXIubWFyZ2lucy50b3AsXG4gICAgICAgICAgICBib3R0b206IGNvbnRyb2xsZXIubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICB3aWR0aDogd2lkdGggPiBjb250cm9sbGVyLnVuaXRXaWR0aCA/IHdpZHRoIDogY29udHJvbGxlci51bml0V2lkdGhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUhUTUxSZWN0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIG1hcmdpbnM6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLCB3aWR0aDogbnVtYmVyIH0sIHJlc3VsdFk6IG51bWJlcik6IElSZWN0IHtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlUGFnZUhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlckhlaWdodCAtIGNvbnRyb2xsZXIubWFyZ2lucy5ib3QgLSBjb250cm9sbGVyLm1hcmdpbnMudG9wO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IChjb250cm9sbGVyLmhlbHBlckRvYy5nZXROdW1iZXJPZlBhZ2VzKCkgLSAxKSAqXG4gICAgICAgICAgICAoY29udHJvbGxlci5mb250U2l6ZSAqIE1hdGguZmxvb3IoYXZhaWxhYmxlUGFnZUhlaWdodCAvIGNvbnRyb2xsZXIuZm9udFNpemUpKVxuICAgICAgICAgICAgKyByZXN1bHRZIC0gbWFyZ2lucy50b3AgKyBTdXJ2ZXlIZWxwZXIuSFRNTF9UQUlMX1RFWFRfU0NBTEUgKiBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhZ2VzOiBudW1iZXIgPSBjb250cm9sbGVyLmhlbHBlckRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG4gICAgICAgIGNvbnRyb2xsZXIuaGVscGVyRG9jLmFkZFBhZ2UoKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IG51bWJlck9mUGFnZXM7IGkrKykge1xuICAgICAgICAgICAgY29udHJvbGxlci5oZWxwZXJEb2MuZGVsZXRlUGFnZSgxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIG1hcmdpbnMud2lkdGgsIGhlaWdodCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVIVE1MRmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGh0bWw6IHN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IG1hcmdpbnM6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyLCB3aWR0aDogbnVtYmVyIH0gPSB0aGlzLmdldEh0bWxNYXJnaW5zKGNvbnRyb2xsZXIsIHBvaW50KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPElQZGZCcmljaz4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIuaGVscGVyRG9jLmZyb21IVE1MKGh0bWwsIHBvaW50LnhMZWZ0LCBtYXJnaW5zLnRvcCwge1xuICAgICAgICAgICAgICAgIHBhZ2VzcGxpdDogdHJ1ZSwgd2lkdGg6IG1hcmdpbnMud2lkdGhcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZXN1bHQ6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUhUTUxSZWN0KHBvaW50LCBjb250cm9sbGVyLCBtYXJnaW5zLCByZXN1bHQueSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXcgSFRNTEJyaWNrKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBodG1sKSk7XG4gICAgICAgICAgICB9LCBtYXJnaW5zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVGb250RmFjZShmb250TmFtZTogc3RyaW5nLCBmb250QmFzZTY0OiBzdHJpbmcsIGZvbnRXZWlnaHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYEBmb250LWZhY2UgeyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGAgK1xuICAgICAgICAgICAgYHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCR7Zm9udEJhc2U2NH0pIGZvcm1hdCgnd29mZicpOyBgICtcbiAgICAgICAgICAgIGBmb250LXdlaWdodDogJHtmb250V2VpZ2h0fTsgfWA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVGb250RmFjZVdpdGhJdGFsaWNTdHlsZShmb250TmFtZTogc3RyaW5nLCBmb250QmFzZTY0OiBzdHJpbmcsIGZvbnRXZWlnaHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gYEBmb250LWZhY2UgeyBmb250LWZhbWlseTogJHtmb250TmFtZX07IGAgK1xuICAgICAgICAgICAgYHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCR7Zm9udEJhc2U2NH0pIGZvcm1hdCgnd29mZicpOyBgICtcbiAgICAgICAgICAgIGBmb250LXdlaWdodDogJHtmb250V2VpZ2h0fTsgZm9udC1zdHlsZTogaXRhbGljfWA7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaHRtbFRvWG1sKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGh0bWxEb2M6IERvY3VtZW50ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCcnKTtcbiAgICAgICAgaHRtbERvYy53cml0ZShodG1sLnJlcGxhY2UoL1xcIy9nLCAnJTIzJykpO1xuICAgICAgICBodG1sRG9jLmRvY3VtZW50RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3htbG5zJywgaHRtbERvYy5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJKTtcbiAgICAgICAgaHRtbERvYy5ib2R5LnN0eWxlLm1hcmdpbiA9ICd1bnNldCc7XG4gICAgICAgIHJldHVybiAobmV3IFhNTFNlcmlhbGl6ZXIoKSkuc2VyaWFsaXplVG9TdHJpbmcoaHRtbERvYy5ib2R5KS5yZXBsYWNlKC8lMjMvZywgJyMnKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVTdmdDb250ZW50KGh0bWw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBjb25zdCBzdHlsZTogSFRNTFN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlLmlubmVySFRNTCA9ICcuX19zdXJ2ZXlwZGZfaHRtbCBwIHsgbWFyZ2luOiB1bnNldDsgbGluZS1oZWlnaHQ6IDIycHg7IH0gYm9keSB7IG1hcmdpbjogdW5zZXQ7IH0nO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICAgICAgY29uc3QgZGl2OiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXYuY2xhc3NOYW1lID0gJ19fc3VydmV5cGRmX2h0bWwnO1xuICAgICAgICBkaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIGRpdi5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICAgIGRpdi5zdHlsZS50b3AgPSAnLTEwMDAwcHgnO1xuICAgICAgICBkaXYuc3R5bGUubGVmdCA9ICctMTAwMDBweCc7XG4gICAgICAgIGRpdi5zdHlsZS53aWR0aCA9ICh3aWR0aCAvIDcyLjAgKiA5Ni4wKSArICdweCc7XG4gICAgICAgIGRpdi5zdHlsZS5ib3hTaXppbmcgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5jb2xvciA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2LnN0eWxlLmZvbnRGYW1pbHkgPSAnaW5pdGlhbCc7XG4gICAgICAgIGRpdi5zdHlsZS5mb250ID0gJ2luaXRpYWwnO1xuICAgICAgICBkaXYuc3R5bGUubGluZUhlaWdodCA9ICdpbml0aWFsJztcbiAgICAgICAgZGl2Lmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJywgaHRtbCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgICAgICAgY29uc3QgZGl2V2lkdGg6IG51bWJlciA9IGRpdi5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgZGl2SGVpZ2h0OiBudW1iZXIgPSBkaXYub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBkaXYucmVtb3ZlKCk7XG4gICAgICAgIHN0eWxlLnJlbW92ZSgpO1xuICAgICAgICBsZXQgZGVmczogc3RyaW5nID0gJyc7XG4gICAgICAgIGlmIChjb250cm9sbGVyLnVzZUN1c3RvbUZvbnRJbkh0bWwpIHtcbiAgICAgICAgICAgIGRlZnMgPSBgPGRlZnM+PHN0eWxlPiR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlKGNvbnRyb2xsZXIuZm9udE5hbWUsIGNvbnRyb2xsZXIuYmFzZTY0Tm9ybWFsLCAnbm9ybWFsJyl9YCArXG4gICAgICAgICAgICAgICAgYCAke3RoaXMuZ2VuZXJhdGVGb250RmFjZShjb250cm9sbGVyLmZvbnROYW1lLCBjb250cm9sbGVyLmJhc2U2NEJvbGQsICdib2xkJyl9PC9zdHlsZT48L2RlZnM+YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHMpLmZvckVhY2goZm9udE5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmb250KS5mb3JFYWNoKChmb250U3R5bGU6ICdub3JtYWwnIHwgJ2JvbGQnIHwgJ2l0YWxpYycgfCAnYm9sZGl0YWxpYycpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTdHlsZSA9PT0gJ25vcm1hbCcgfHwgZm9udFN0eWxlID09PSAnYm9sZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZnMgKz0gYCR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlKGZvbnROYW1lLCBmb250W2ZvbnRTdHlsZV0sIGZvbnRTdHlsZSl9YDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZnMgKz0gYCR7dGhpcy5nZW5lcmF0ZUZvbnRGYWNlV2l0aEl0YWxpY1N0eWxlKGZvbnROYW1lLCBmb250W2ZvbnRTdHlsZV0sIGZvbnRTdHlsZSA9PT0gJ2l0YWxpYycgPyAnbm9ybWFsJyA6ICdib2xkJyl9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlZnMgPSAnPGRlZnM+PHN0eWxlPicgKyBkZWZzICsgJzwvc3R5bGU+PC9kZWZzPic7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdmc6IHN0cmluZyA9ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj4nICsgZGVmcyArXG4gICAgICAgICAgICAnPHN0eWxlPi5fX3N1cnZleXBkZl9odG1sIHAgeyBtYXJnaW46IHVuc2V0OyBsaW5lLWhlaWdodDogMjJweDsgfTwvc3R5bGU+JyArXG4gICAgICAgICAgICBgPGZvcmVpZ25PYmplY3Qgd2lkdGg9XCIke2RpdldpZHRofXB4XCIgaGVpZ2h0PVwiJHtkaXZIZWlnaHR9cHhcIj5gICtcbiAgICAgICAgICAgIHRoaXMuaHRtbFRvWG1sKGh0bWwpICsgJzwvZm9yZWlnbk9iamVjdD48L3N2Zz4nO1xuICAgICAgICByZXR1cm4geyBzdmcsIGRpdldpZHRoLCBkaXZIZWlnaHQgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBodG1sVG9JbWFnZShodG1sOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBQcm9taXNlPHsgdXJsOiBzdHJpbmcsIGFzcGVjdDogbnVtYmVyIH0+IHtcbiAgICAgICAgY29uc3QgeyBzdmcsIGRpdldpZHRoLCBkaXZIZWlnaHQgfSA9IFN1cnZleUhlbHBlci5jcmVhdGVTdmdDb250ZW50KGh0bWwsIHdpZHRoLCBjb250cm9sbGVyKTtcbiAgICAgICAgY29uc3QgZGF0YTogc3RyaW5nID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN2ZykpKTtcbiAgICAgICAgY29uc3QgaW1nOiBIVE1MSW1hZ2VFbGVtZW50ID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5zcmMgPSBkYXRhO1xuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGRpdldpZHRoO1xuICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBkaXZIZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBTdXJ2ZXlIZWxwZXIuQkFDS0dST1VORF9DT0xPUjtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmZpbGxSZWN0KDAsIDAsIGRpdldpZHRoLCBkaXZIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsOiBzdHJpbmcgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9qcGVnJywgU3VydmV5SGVscGVyLkhUTUxfVE9fSU1BR0VfUVVBTElUWSk7XG4gICAgICAgICAgICAgICAgY2FudmFzLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoeyB1cmw6IHVybCwgYXNwZWN0OiBkaXZXaWR0aCAvIGRpdkhlaWdodCB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgdXJsOiAnZGF0YTosJywgYXNwZWN0OiB3aWR0aCAvIHRoaXMuRVBTSUxPTiB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludDogSVBvaW50LCBxdWVzdGlvbjogUXVlc3Rpb24sXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHRleHQ6IHN0cmluZyB8IExvY2FsaXphYmxlU3RyaW5nKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnYm9sZCc7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdGV4dCwgVGV4dEJvbGRCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlVGl0bGVGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gdGhpcy5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplICo9IHRoaXMuVElUTEVfRk9OVF9TQ0FMRTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLm5vKSB7XG4gICAgICAgICAgICBjb25zdCBub1RleHQ6IHN0cmluZyA9IHF1ZXN0aW9uLm5vICsgJyAnO1xuICAgICAgICAgICAgbGV0IG5vRmxhdDogSVBkZkJyaWNrO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzSHRtbChxdWVzdGlvbi5sb2NUaXRsZSkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KG5vVGV4dCwgJ2JvbGQnKS53aWR0aDtcbiAgICAgICAgICAgICAgICBub0ZsYXQgPSBhd2FpdCB0aGlzLmNyZWF0ZUhUTUxGbGF0KGN1cnJQb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKG5vVGV4dCwgY29udHJvbGxlciwgJ3N0YW5kYXJkJykpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBub0ZsYXQgPSBhd2FpdCB0aGlzLmNyZWF0ZUJvbGRUZXh0RmxhdChjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLCBjb250cm9sbGVyLCBub1RleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKG5vRmxhdCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSBub0ZsYXQueFJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBjdXJyUG9pbnQueExlZnQ7XG4gICAgICAgIGNvbnN0IHRleHRGbGF0OiBDb21wb3NpdGVCcmljayA9IDxDb21wb3NpdGVCcmljaz5hd2FpdCB0aGlzLmNyZWF0ZUJvbGRUZXh0RmxhdChcbiAgICAgICAgICAgIGN1cnJQb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHF1ZXN0aW9uLmxvY1RpdGxlKTtcbiAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKHRleHRGbGF0KTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIGlmIChxdWVzdGlvbi5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZFRleHQ6IHN0cmluZyA9IHF1ZXN0aW9uLnJlcXVpcmVkVGV4dDtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0h0bWwocXVlc3Rpb24ubG9jVGl0bGUpKSB7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50ID0gdGhpcy5jcmVhdGVQb2ludCh0ZXh0RmxhdC51bmZvbGQoKVswXSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLmZvbnRTdHlsZSA9ICdib2xkJztcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHJlcXVpcmVkVGV4dCwgJ2JvbGQnKS53aWR0aDtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgdGhpcy5jcmVhdGVIVE1MRmxhdChjdXJyUG9pbnQsIHF1ZXN0aW9uLCBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUh0bWxDb250YWluZXJCbG9jayhyZXF1aXJlZFRleHQsIGNvbnRyb2xsZXIsICdzdGFuZGFyZCcpKSk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5mb250U3R5bGUgPSAnbm9ybWFsJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQodGV4dEZsYXQudW5mb2xkKCkucG9wKCksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgdGhpcy5jcmVhdGVCb2xkVGV4dEZsYXQoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbiwgY29udHJvbGxlciwgcmVxdWlyZWRUZXh0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZVN1cnZleVBhbmVsRmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZywgZm9udFNpemVTY2FsZTogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3Qgb2xkRm9udFNpemU6IG51bWJlciA9IGNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqIGZvbnRTaXplU2NhbGU7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQocG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIHRleHQsIFRpdGxlUGFuZWxCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgcmV0dXJuIHRpdGxlRmxhdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZVN1cnZleUZsYXQocG9pbnQ6IElQb2ludCwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVUaXRsZVN1cnZleVBhbmVsRmxhdChwb2ludCwgY29udHJvbGxlciwgdGV4dCwgdGhpcy5USVRMRV9TVVJWRVlfRk9OVF9TSVpFX1NDQUxFKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVUaXRsZVBhbmVsRmxhdChwb2ludDogSVBvaW50LCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICB0ZXh0OiBzdHJpbmcgfCBMb2NhbGl6YWJsZVN0cmluZywgaXNQYWdlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVUaXRsZVN1cnZleVBhbmVsRmxhdChwb2ludCwgY29udHJvbGxlciwgdGV4dCxcbiAgICAgICAgICAgIGlzUGFnZSA/IHRoaXMuVElUTEVfUEFHRV9GT05UX1NJWkVfU0NBTEUgOiB0aGlzLlRJVExFX1BBTkVMX0ZPTlRfU0laRV9TQ0FMRSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlRGVzY0ZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplICogdGhpcy5ERVNDUklQVElPTl9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBxdWVzdGlvbiwgY29udHJvbGxlciwgdGV4dCwgRGVzY3JpcHRpb25Ccmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSZWFkb25seVJlbmRlckFzKHF1ZXN0aW9uOiBRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybScge1xuICAgICAgICByZXR1cm4gKDxhbnk+cXVlc3Rpb24pLnJlYWRvbmx5UmVuZGVyQXMgPT09ICdhdXRvJyA/IGNvbnRyb2xsZXIucmVhZG9ubHlSZW5kZXJBcyA6ICg8YW55PnF1ZXN0aW9uKS5yZWFkb25seVJlbmRlckFzO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZUNvbW1lbnRGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBRdWVzdGlvbixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcm93czogbnVtYmVyLCBpc1F1ZXN0aW9uOiBib29sZWFuLCBpbmRleDogbnVtYmVyID0gMCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gdGhpcy5jcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50LCBjb250cm9sbGVyLCByb3dzKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZE9ubHkgJiYgdGhpcy5nZXRSZWFkb25seVJlbmRlckFzKHF1ZXN0aW9uLCBjb250cm9sbGVyKSAhPT0gJ2Fjcm9mb3JtJykge1xuICAgICAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlUmVhZE9ubHlUZXh0RmllbGRUZXh0RmxhdChcbiAgICAgICAgICAgICAgICBwb2ludCwgY29udHJvbGxlciwgcXVlc3Rpb24sIHRoaXMuZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbiwgaXNRdWVzdGlvbiksIGZhbHNlKTtcbiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmc6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVkFMVUVfUkVBRE9OTFlfUEFERElOR19TQ0FMRTtcbiAgICAgICAgICAgIGlmICh0ZXh0RmxhdC55Qm90ICsgcGFkZGluZyA+IHJlY3QueUJvdCkgcmVjdC55Qm90ID0gdGV4dEZsYXQueUJvdCArIHBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb21tZW50QnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIGlzUXVlc3Rpb24sIGluZGV4KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKHF1ZXN0aW9uOiBRdWVzdGlvbiwgaXNRdWVzdGlvbjogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXNRdWVzdGlvbiA/IChxdWVzdGlvbi52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHF1ZXN0aW9uLnZhbHVlICE9PSBudWxsID8gcXVlc3Rpb24udmFsdWUgOiAnJykgOlxuICAgICAgICAgICAgKHF1ZXN0aW9uLmNvbW1lbnQgIT09IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi5jb21tZW50ICE9PSBudWxsID8gcXVlc3Rpb24uY29tbWVudCA6ICcnKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRRdWVzdGlvbk9yQ29tbWVudERpc3BsYXlWYWx1ZShxdWVzdGlvbjogUXVlc3Rpb24sIGlzUXVlc3Rpb246IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGlzUXVlc3Rpb24gPyBxdWVzdGlvbi5kaXNwbGF5VmFsdWUgOiBTdXJ2ZXlIZWxwZXIuZ2V0UXVlc3Rpb25PckNvbW1lbnRWYWx1ZShxdWVzdGlvbiwgaXNRdWVzdGlvbik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaW5Ccm93c2VyID0gdHlwZW9mIEltYWdlID09PSAnZnVuY3Rpb24nO1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlSW1hZ2VGbGF0KHBvaW50OiBJUG9pbnQsIHF1ZXN0aW9uOiBhbnksXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGltYWdlbGluazogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG5cbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5pbkJyb3dzZXIpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmFwcGx5SW1hZ2VGaXQpIHtcbiAgICAgICAgICAgICAgICBpZiAod2lkdGggPiBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdXaWR0aDogbnVtYmVyID0gY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCAqPSBuZXdXaWR0aCAvIHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IG5ld1dpZHRoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHB0VG9QeDogbnVtYmVyID0gOTYuMCAvIDcyLjA7XG4gICAgICAgICAgICAgICAgY29uc3QgZml0VHlwZSA9ICEhcXVlc3Rpb24gJiYgISFxdWVzdGlvbi5pbWFnZUZpdCA/IHF1ZXN0aW9uLmltYWdlRml0IDogJ2NvbnRhaW4nO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbnZhc0h0bWw6IHN0cmluZyA9XG4gICAgICAgICAgICAgICAgICAgIGA8ZGl2IHN0eWxlPSdvdmVyZmxvdzogaGlkZGVuOyB3aWR0aDogJHt3aWR0aCAqIHB0VG9QeH1weDsgaGVpZ2h0OiAke2hlaWdodCAqIHB0VG9QeH1weDsnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9JyR7aW1hZ2VsaW5rfScgc3R5bGU9J29iamVjdC1maXQ6ICR7Zml0VHlwZX07IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7Jy8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB7IHVybCwgYXNwZWN0IH06IHsgdXJsOiBzdHJpbmcsIGFzcGVjdDogbnVtYmVyIH0gPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBTdXJ2ZXlIZWxwZXIuaHRtbFRvSW1hZ2UoY2FudmFzSHRtbCwgd2lkdGgsIGNvbnRyb2xsZXIpO1xuXG4gICAgICAgICAgICAgICAgaW1hZ2VsaW5rID0gdXJsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBodG1sOiBzdHJpbmcgPSBgPGltZyBzcmM9JyR7aW1hZ2VsaW5rfScgd2lkdGg9JyR7d2lkdGh9JyBoZWlnaHQ9JyR7aGVpZ2h0fScvPmA7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEhUTUxCcmljayhxdWVzdGlvbiwgY29udHJvbGxlciwgdGhpcy5jcmVhdGVSZWN0KHBvaW50LCB3aWR0aCwgaGVpZ2h0KSwgaHRtbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEltYWdlQnJpY2socXVlc3Rpb24sIGNvbnRyb2xsZXIsIGltYWdlbGluaywgcG9pbnQsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNhblByZXZpZXdJbWFnZShxdWVzdGlvbjogUXVlc3Rpb25GaWxlTW9kZWwsIGl0ZW06IHsgbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB9LCB1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcXVlc3Rpb24uY2FuUHJldmlld0ltYWdlKGl0ZW0pO1xuICAgICAgICAvLyAgJiYgIGF3YWl0IHRoaXMuZ2V0SW1hZ2VTaXplKHVybCkgIT09IG51bGw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0SW1hZ2VTaXplKHVybDogc3RyaW5nKTogUHJvbWlzZTxJU2l6ZT4ge1xuICAgICAgICBpZiAoIVN1cnZleUhlbHBlci5pbkJyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHsgd2lkdGg6IHVuZGVmaW5lZCwgaGVpZ2h0OiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlOiBhbnkgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IHVybDtcbiAgICAgICAgICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHdpZHRoOiBpbWFnZS53aWR0aCwgaGVpZ2h0OiBpbWFnZS5oZWlnaHQgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlc29sdmUobnVsbCk7IH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHdpZHRoPzogbnVtYmVyLCBjb2xvcj86IHN0cmluZyk6IElQZGZCcmljayB7XG4gICAgICAgIGxldCB4UmlnaHQ6IG51bWJlciA9IHR5cGVvZiB3aWR0aCA9PT0gJ3VuZGVmaW5lZCcgP1xuICAgICAgICAgICAgY29udHJvbGxlci5wYXBlcldpZHRoIC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IDpcbiAgICAgICAgICAgIHBvaW50LnhMZWZ0ICsgd2lkdGg7XG4gICAgICAgIHhSaWdodCA9IHhSaWdodCA+IHBvaW50LnhMZWZ0ID8geFJpZ2h0IDogcG9pbnQueExlZnQgKyB0aGlzLkVQU0lMT047XG4gICAgICAgIHJldHVybiBuZXcgUm93bGluZUJyaWNrKGNvbnRyb2xsZXIsIHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCxcbiAgICAgICAgICAgIHhSaWdodDogeFJpZ2h0LFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCArIHRoaXMuRVBTSUxPTixcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyB0aGlzLkVQU0lMT05cbiAgICAgICAgfSwgdHlwZW9mIGNvbG9yID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBjb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlTGlua0ZsYXQocG9pbnQ6IElQb2ludCwgcXVlc3Rpb246IFF1ZXN0aW9uLFxuICAgICAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCB0ZXh0OiBzdHJpbmcsIGxpbms6IHN0cmluZyk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZVRleHQ6IENvbXBvc2l0ZUJyaWNrID0gPENvbXBvc2l0ZUJyaWNrPmF3YWl0IHRoaXMuXG4gICAgICAgICAgICBjcmVhdGVUZXh0RmxhdChwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHRleHQsIFRleHRCcmljayk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUxpbms6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbXBvc2l0ZVRleHQudW5mb2xkKCkuZm9yRWFjaCgodGV4dDogVGV4dEJyaWNrKSA9PiB7XG4gICAgICAgICAgICBjb21wb3NpdGVMaW5rLmFkZEJyaWNrKG5ldyBMaW5rQnJpY2sodGV4dCwgbGluaykpO1xuICAgICAgICAgICAgY29uc3QgbGluZVBvaW50OiBJUG9pbnQgPSB0aGlzLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUxpbmspO1xuICAgICAgICAgICAgY29tcG9zaXRlTGluay5hZGRCcmljayh0aGlzLmNyZWF0ZVJvd2xpbmVGbGF0KGxpbmVQb2ludCxcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21wb3NpdGVMaW5rLndpZHRoLCBMaW5rQnJpY2suQ09MT1IpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVMaW5rO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZUFjcm9mb3JtUmVjdChyZWN0OiBJUmVjdCk6IG51bWJlcltdIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHJlY3QueExlZnQsXG4gICAgICAgICAgICByZWN0LnlUb3AsXG4gICAgICAgICAgICByZWN0LnhSaWdodCAtIHJlY3QueExlZnQsXG4gICAgICAgICAgICByZWN0LnlCb3QgLSByZWN0LnlUb3BcbiAgICAgICAgXTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVUZXh0RmllbGRSZWN0KHBvaW50OiBJUG9pbnQsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGxpbmVzOiBudW1iZXIgPSAxKTogSVJlY3Qge1xuICAgICAgICBsZXQgd2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHBvaW50LnhMZWZ0IC0gY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0O1xuICAgICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjb250cm9sbGVyLnVuaXRXaWR0aCk7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gY29udHJvbGxlci51bml0SGVpZ2h0ICogbGluZXM7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJlY3QocG9pbnQsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZVJlYWRPbmx5VGV4dEZpZWxkVGV4dEZsYXQocG9pbnQ6IElQb2ludCxcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcXVlc3Rpb246IFF1ZXN0aW9uLCB2YWx1ZTogc3RyaW5nLCBvbmx5Rmlyc3RMaW5lOiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgcGFkZGluZzogbnVtYmVyID0gY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgIGlmICghb25seUZpcnN0TGluZSkgcG9pbnQueVRvcCArPSBwYWRkaW5nO1xuICAgICAgICBwb2ludC54TGVmdCArPSBwYWRkaW5nO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKHBvaW50LnhMZWZ0LCBjb250cm9sbGVyLm1hcmdpbnMucmlnaHQgKyBwYWRkaW5nKTtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHZhbHVlLnRvU3RyaW5nKCksIFRleHRCcmljayk7XG4gICAgICAgIGNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICByZXR1cm4gdGV4dEZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcmVuZGVyRmxhdEJvcmRlcnMoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZmxhdDogUGRmQnJpY2spOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLkZPUk1fQk9SREVSX1ZJU0lCTEUpIHJldHVybjtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oZmxhdC53aWR0aCwgZmxhdC5oZWlnaHQpO1xuICAgICAgICBjb25zdCB2aXNpYmxlV2lkdGg6IG51bWJlciA9IGNvbnRyb2xsZXIudW5pdEhlaWdodCAqIHRoaXMuVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgY29uc3QgdmlzaWJsZVNjYWxlOiBudW1iZXIgPSB0aGlzLmZvcm1TY2FsZShjb250cm9sbGVyLCBmbGF0KSArIHZpc2libGVXaWR0aCAvIG1pblNpZGU7XG4gICAgICAgIGNvbnN0IHVudmlzaWJsZVdpZHRoOiBudW1iZXIgPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiB0aGlzLlVOVklTSUJMRV9CT1JERVJfU0NBTEUgKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgY29uc3QgdW52aXNpYmxlU2NhbGU6IG51bWJlciA9IDEuMCAtIHVudmlzaWJsZVdpZHRoIC8gbWluU2lkZTtcbiAgICAgICAgY29uc3QgdW52aXNpYmxlUmFkaXVzOiBudW1iZXIgPSB0aGlzLlJBRElVU19TQ0FMRSAqIHVudmlzaWJsZVdpZHRoO1xuICAgICAgICBjb25zdCBvbGREcmF3Q29sb3I6IHN0cmluZyA9IGNvbnRyb2xsZXIuZG9jLmdldERyYXdDb2xvcigpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoZmxhdC5mb3JtQm9yZGVyQ29sb3IpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodmlzaWJsZVdpZHRoKTtcbiAgICAgICAgY29udHJvbGxlci5kb2MucmVjdCguLi50aGlzLmNyZWF0ZUFjcm9mb3JtUmVjdCh0aGlzLnNjYWxlUmVjdChmbGF0LCB2aXNpYmxlU2NhbGUpKSk7XG4gICAgICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcih0aGlzLkJBQ0tHUk9VTkRfQ09MT1IpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5zZXRMaW5lV2lkdGgodW52aXNpYmxlV2lkdGgpO1xuICAgICAgICBjb250cm9sbGVyLmRvYy5yb3VuZGVkUmVjdCguLi50aGlzLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIHRoaXMuc2NhbGVSZWN0KGZsYXQsIHVudmlzaWJsZVNjYWxlKSksIHVudmlzaWJsZVJhZGl1cywgdW52aXNpYmxlUmFkaXVzKTtcbiAgICAgICAgY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKG9sZERyYXdDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgcmVuZGVyUmVhZE9ubHlUZXh0RmllbGQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcXVlc3Rpb246IFF1ZXN0aW9uLCBmbGF0OiBQZGZCcmljaywgdmFsdWU6IHN0cmluZyxcbiAgICAgICAgb25seUZpcnN0TGluZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcG9pbnQ6IElQb2ludCA9IHRoaXMuY3JlYXRlUG9pbnQoZmxhdCwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IG9sZEZvbnRTaXplOiBudW1iZXIgPSBjb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gZmxhdC5mb250U2l6ZTtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuY3JlYXRlUmVhZE9ubHlUZXh0RmllbGRUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCBjb250cm9sbGVyLCBxdWVzdGlvbiwgdmFsdWUsIG9ubHlGaXJzdExpbmUpO1xuICAgICAgICBjb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIGlmIChvbmx5Rmlyc3RMaW5lKSBhd2FpdCB0ZXh0RmxhdC51bmZvbGQoKVswXS5yZW5kZXIoKTtcbiAgICAgICAgZWxzZSBhd2FpdCB0ZXh0RmxhdC5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJGbGF0Qm9yZGVycyhjb250cm9sbGVyLCBmbGF0KTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRMb2NTdHJpbmcodGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5oYXNIdG1sKHRleHQpKSByZXR1cm4gdGV4dC5yZW5kZXJlZEh0bWw7XG4gICAgICAgIHJldHVybiAoPGFueT50ZXh0KS5yZW5kZXJlZFRleHQgfHwgdGV4dC5yZW5kZXJlZEh0bWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHF1ZXN0aW9uOiBRdWVzdGlvbik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHFEcm9wRG93bjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICAgICAgaWYgKHFEcm9wRG93bi5pc090aGVyU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBxRHJvcERvd24ub3RoZXJUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEhcXVlc3Rpb24uZGlzcGxheVZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcXVlc3Rpb24uZGlzcGxheVZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHFEcm9wRG93bi5zaG93T3B0aW9uc0NhcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBxRHJvcERvd24ub3B0aW9uc0NhcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbnRlbnRRdWVzdGlvbihxdWVzdGlvbjogUXVlc3Rpb24pOiBRdWVzdGlvbiB7XG4gICAgICAgIHJldHVybiAhISg8YW55PnF1ZXN0aW9uKS5jb250ZW50UXVlc3Rpb24gPyAoPGFueT5xdWVzdGlvbikuY29udGVudFF1ZXN0aW9uIDogcXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udGVudFF1ZXN0aW9uVHlwZShxdWVzdGlvbjogUXVlc3Rpb24pOiBzdHJpbmcge1xuICAgICAgICBpZighIXF1ZXN0aW9uLmN1c3RvbVdpZGdldCkgcmV0dXJuIHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5wZGZRdWVzdGlvblR5cGU7XG4gICAgICAgIHJldHVybiAhISg8YW55PnF1ZXN0aW9uKS5jb250ZW50UXVlc3Rpb24gPyAnY3VzdG9tX21vZGVsJyA6IHF1ZXN0aW9uLmdldFR5cGUoKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSYXRpbmdNaW5XaWR0aChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIubWVhc3VyZVRleHQodGhpcy5SQVRJTkdfTUlOX1dJRFRIKS53aWR0aDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRSYXRpbmdJdGVtVGV4dChxdWVzdGlvbjogUXVlc3Rpb25SYXRpbmdNb2RlbCxcbiAgICAgICAgaW5kZXg6IG51bWJlciwgbG9jVGV4dDogTG9jYWxpemFibGVTdHJpbmcpOiBMb2NhbGl6YWJsZVN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJhdGluZ0l0ZW1Mb2NUZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IG5ldyBMb2NhbGl6YWJsZVN0cmluZyhsb2NUZXh0Lm93bmVyLCBsb2NUZXh0LnVzZU1hcmtkb3duKTtcbiAgICAgICAgcmF0aW5nSXRlbUxvY1RleHQudGV4dCA9IHRoaXMuZ2V0TG9jU3RyaW5nKGxvY1RleHQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IDAgJiYgcXVlc3Rpb24ubWluUmF0ZURlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByYXRpbmdJdGVtTG9jVGV4dC50ZXh0ID0gcXVlc3Rpb24ubG9jTWluUmF0ZURlc2NyaXB0aW9uLnRleHQgKyAnICcgKyB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbmRleCA9PT0gcXVlc3Rpb24udmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoIC0gMSAmJiBxdWVzdGlvbi5tYXhSYXRlRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJhdGluZ0l0ZW1Mb2NUZXh0LnRleHQgPSB0aGlzLmdldExvY1N0cmluZyhsb2NUZXh0KSArICcgJyArIHF1ZXN0aW9uLmxvY01heFJhdGVEZXNjcmlwdGlvbi50ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYXRpbmdJdGVtTG9jVGV4dDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLnBhcGVyV2lkdGggLSBjb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbWFnZVBpY2tlckF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gKHRoaXMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC1cbiAgICAgICAgICAgICh0aGlzLklNQUdFUElDS0VSX0NPVU5UIC0gMSkgKiBjb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICByZXR1cm4gd2lkdGggPiAwID8gd2lkdGggOiBjb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29sdW1uV2lkdGgoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgY29sQ291bnQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpIC0gKGNvbENvdW50IC0gMSkgKlxuICAgICAgICAgICAgY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkdBUF9CRVRXRUVOX0NPTFVNTlMpIC8gY29sQ291bnQ7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q29sdW1uTWFyZ2lucyhjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCBjb2xDb3VudDogbnVtYmVyLCBjb2x1bW46IG51bWJlcikge1xuICAgICAgICBjb25zdCBjZWxsV2lkdGg6IG51bWJlciA9IHRoaXMuZ2V0Q29sdW1uV2lkdGgoY29udHJvbGxlciwgY29sQ291bnQpO1xuICAgICAgICBjb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICsgY29sdW1uICpcbiAgICAgICAgICAgIChjZWxsV2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArIChjb2xDb3VudCAtIGNvbHVtbiAtIDEpICpcbiAgICAgICAgICAgIChjZWxsV2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aCAqIHRoaXMuR0FQX0JFVFdFRU5fQ09MVU1OUyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgbW92ZVJlY3QocmVjdDogSVJlY3QsIGxlZnQ6IG51bWJlciA9IHJlY3QueExlZnQsIHRvcDogbnVtYmVyID0gcmVjdC55VG9wKTogSVJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IGxlZnQsXG4gICAgICAgICAgICB5VG9wOiB0b3AsXG4gICAgICAgICAgICB4UmlnaHQ6IGxlZnQgKyByZWN0LnhSaWdodCAtIHJlY3QueExlZnQsXG4gICAgICAgICAgICB5Qm90OiB0b3AgKyByZWN0LnlCb3QgLSByZWN0LnlUb3BcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBzY2FsZVJlY3QocmVjdDogSVJlY3QsIHNjYWxlOiBudW1iZXIpOiBJUmVjdCB7XG4gICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSByZWN0LnhSaWdodCAtIHJlY3QueExlZnQ7XG4gICAgICAgIGNvbnN0IGhlaWdodDogbnVtYmVyID0gcmVjdC55Qm90IC0gcmVjdC55VG9wO1xuICAgICAgICBjb25zdCBzY2FsZVdpZHRoOiBudW1iZXIgPSAoKHdpZHRoIDwgaGVpZ2h0KSA/IHdpZHRoIDogaGVpZ2h0KSAqICgxLjAgLSBzY2FsZSkgLyAyLjA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdC54TGVmdCArIHNjYWxlV2lkdGgsXG4gICAgICAgICAgICB5VG9wOiByZWN0LnlUb3AgKyBzY2FsZVdpZHRoLFxuICAgICAgICAgICAgeFJpZ2h0OiByZWN0LnhSaWdodCAtIHNjYWxlV2lkdGgsXG4gICAgICAgICAgICB5Qm90OiByZWN0LnlCb3QgLSBzY2FsZVdpZHRoXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZm9ybVNjYWxlKGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZsYXQ6IFBkZkJyaWNrKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWluU2lkZTogbnVtYmVyID0gTWF0aC5taW4oZmxhdC53aWR0aCwgZmxhdC5oZWlnaHQpO1xuICAgICAgICBjb25zdCBib3JkZXJXaWR0aDogbnVtYmVyID0gMi4wICogY29udHJvbGxlci51bml0V2lkdGggKiB0aGlzLkJPUkRFUl9TQ0FMRTtcbiAgICAgICAgcmV0dXJuIChtaW5TaWRlIC0gYm9yZGVyV2lkdGgpIC8gbWluU2lkZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZW5lcmF0ZVF1ZXN0aW9uRmxhdHMoc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHF1ZXN0aW9uOiBRdWVzdGlvbiwgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcXVlc3Rpb25UeXBlOiBzdHJpbmcgPSB0aGlzLmdldENvbnRlbnRRdWVzdGlvblR5cGUocXVlc3Rpb24pO1xuICAgICAgICBjb25zdCBmbGF0UXVlc3Rpb246IElGbGF0UXVlc3Rpb24gPSBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLlxuICAgICAgICAgICAgY3JlYXRlKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIsIHF1ZXN0aW9uVHlwZSk7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uRmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgZmxhdFF1ZXN0aW9uLmdlbmVyYXRlRmxhdHMocG9pbnQpO1xuICAgICAgICBjb25zdCBhZG9ybmVyc09wdGlvbnM6IEFkb3JuZXJzT3B0aW9ucyA9IG5ldyBBZG9ybmVyc09wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICBxdWVzdGlvbkZsYXRzLCBxdWVzdGlvbiwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgaWYgKHF1ZXN0aW9uLmN1c3RvbVdpZGdldCAmJiBxdWVzdGlvbi5jdXN0b21XaWRnZXQuaXNGaXQocXVlc3Rpb24pICYmXG4gICAgICAgICAgICBxdWVzdGlvbi5jdXN0b21XaWRnZXQucGRmUmVuZGVyKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJRdWVzdGlvbi51bnNoaWZ0KHF1ZXN0aW9uLmN1c3RvbVdpZGdldC5wZGZSZW5kZXIpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHN1cnZleS5vblJlbmRlclF1ZXN0aW9uLmZpcmUoc3VydmV5LCBhZG9ybmVyc09wdGlvbnMpO1xuICAgICAgICByZXR1cm4gWy4uLmFkb3JuZXJzT3B0aW9ucy5icmlja3NdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9udEV4aXN0KGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIGZvbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuZG9jLmludGVybmFsLmdldEZvbnQoZm9udE5hbWUpLmZvbnROYW1lID09PSBmb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0N1c3RvbUZvbnQoY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgZm9udE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29udHJvbGxlci5kb2MuaW50ZXJuYWwuZ2V0Rm9udChmb250TmFtZSkuZW5jb2RpbmcgPT09IHRoaXMuQ1VTVE9NX0ZPTlRfRU5DT0RJTkc7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgZml4Rm9udChjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzQ3VzdG9tRm9udChjb250cm9sbGVyLCBjb250cm9sbGVyLmZvbnROYW1lKSkge1xuICAgICAgICAgICAgY29udHJvbGxlci5kb2MudGV4dCgnbG9hZCBmb250JywgMCwgMCk7XG4gICAgICAgICAgICBjb250cm9sbGVyLmRvYy5kZWxldGVQYWdlKDEpO1xuICAgICAgICAgICAgY29udHJvbGxlci5hZGRQYWdlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBjbG9uZShzcmM6IGFueSk6IGFueSB7XG4gICAgICAgIGNvbnN0IHRhcmdldDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBzcmMpIHtcbiAgICAgICAgICAgIGlmIChzcmMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzcmNbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2hlbHBlcl9zdXJ2ZXkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElGbGF0UXVlc3Rpb24sIEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5cbmV4cG9ydCB0eXBlIEZsYXRDb25zdHJ1Y3RvciA9IG5ldyAoXG4gICAgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyXG4pID0+IElGbGF0UXVlc3Rpb247XG5leHBvcnQgY2xhc3MgRmxhdFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgcXVlc3Rpb25zOiB7IFtpbmRleDogc3RyaW5nXTogRmxhdENvbnN0cnVjdG9yIH0gPSB7fTtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRmxhdFJlcG9zaXRvcnkgPSBuZXcgRmxhdFJlcG9zaXRvcnkoKTtcbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEZsYXRSZXBvc2l0b3J5IHtcbiAgICAgICAgcmV0dXJuIEZsYXRSZXBvc2l0b3J5Lmluc3RhbmNlO1xuICAgIH1cbiAgICBwdWJsaWMgcmVnaXN0ZXIobW9kZWxUeXBlOiBzdHJpbmcsIHJlbmRlcmVyQ29uc3RydWN0b3I6IEZsYXRDb25zdHJ1Y3Rvcik6IHZvaWQge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uc1ttb2RlbFR5cGVdID0gcmVuZGVyZXJDb25zdHJ1Y3RvcjtcbiAgICB9XG4gICAgcHVibGljIGNyZWF0ZShzdXJ2ZXk6IFN1cnZleVBERiwgcXVlc3Rpb246IElRdWVzdGlvbixcbiAgICAgICAgZG9jQ29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgdHlwZT86IHN0cmluZyk6IElGbGF0UXVlc3Rpb24ge1xuICAgICAgICBjb25zdCBxdWVzdGlvblR5cGU6IHN0cmluZyA9IHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJyA/IHF1ZXN0aW9uLmdldFR5cGUoKSA6IHR5cGU7XG4gICAgICAgIGNvbnN0IHJlbmRlcmVyQ29uc3RydWN0b3I6IEZsYXRDb25zdHJ1Y3RvciA9IHRoaXMucXVlc3Rpb25zW3F1ZXN0aW9uVHlwZV0gfHwgRmxhdFF1ZXN0aW9uO1xuICAgICAgICByZXR1cm4gbmV3IHJlbmRlcmVyQ29uc3RydWN0b3Ioc3VydmV5LCBxdWVzdGlvbiwgZG9jQ29udHJvbGxlcik7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnkudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uLCBMb2NhbGl6YWJsZVN0cmluZywgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElGbGF0UXVlc3Rpb24ge1xuICAgIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPjtcbiAgICBnZW5lcmF0ZUZsYXRzKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPjtcbn1cbmV4cG9ydCBjbGFzcyBGbGF0UXVlc3Rpb24gaW1wbGVtZW50cyBJRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENPTlRFTlRfR0FQX1ZFUlRfU0NBTEU6IG51bWJlciA9IDAuNTtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENPTlRFTlRfR0FQX0hPUl9TQ0FMRTogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09OVEVOVF9JTkRFTlRfU0NBTEU6IG51bWJlciA9IDEuMDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFU0NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjA2MjU7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdFRpdGxlKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlRmxhdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcik7XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0RGVzY3JpcHRpb24ocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGRlc2NQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZGVzY1BvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgIGRlc2NQb2ludC55VG9wICs9IEZsYXRRdWVzdGlvbi5ERVNDX0dBUF9TQ0FMRSAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICBjb25zdCB0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IHRoaXMucXVlc3Rpb24ubG9jRGVzY3JpcHRpb247XG4gICAgICAgIHJldHVybiBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlRGVzY0ZsYXQoZGVzY1BvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRleHQpO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNDb21tZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCB0ZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IHRoaXMucXVlc3Rpb24ubG9jQ29tbWVudFRleHQ7XG4gICAgICAgIGNvbnN0IG90aGVyVGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRleHQsIFRleHRCcmljayk7XG4gICAgICAgIGNvbnN0IG90aGVyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChvdGhlclRleHRGbGF0KTtcbiAgICAgICAgb3RoZXJQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2sob3RoZXJUZXh0RmxhdCwgYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgb3RoZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBTdXJ2ZXlIZWxwZXIuT1RIRVJfUk9XU19DT1VOVCwgZmFsc2UpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb21wb3NpdGUocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY29udGVudFBhbmVsID0gKDxhbnk+dGhpcy5xdWVzdGlvbikuY29udGVudFBhbmVsO1xuICAgICAgICBpZiAoISFjb250ZW50UGFuZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbCh0aGlzLnN1cnZleSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbnRlbnRQYW5lbCwgcG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29udGVudFF1ZXN0aW9uKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludCk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHMocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRoaXMucXVlc3Rpb24uaW5kZW50KS53aWR0aDtcbiAgICAgICAgY29uc3QgaW5kZW50UG9pbnQ6IElQb2ludCA9IHtcbiAgICAgICAgICAgIHhMZWZ0OiBwb2ludC54TGVmdCArIHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLnF1ZXN0aW9uLmluZGVudCkud2lkdGgsXG4gICAgICAgICAgICB5VG9wOiBwb2ludC55VG9wXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgY29tbWVudFBvaW50OiBJUG9pbnQgPSBpbmRlbnRQb2ludDtcbiAgICAgICAgbGV0IHRpdGxlTG9jYXRpb246IHN0cmluZyA9IHRoaXMucXVlc3Rpb24uZ2V0VGl0bGVMb2NhdGlvbigpO1xuICAgICAgICB0aXRsZUxvY2F0aW9uID0gdGhpcy5xdWVzdGlvbi5oYXNUaXRsZSA/IHRpdGxlTG9jYXRpb24gOiAnaGlkZGVuJztcbiAgICAgICAgY29uc3QgaXNEZXNjID0gISFTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jRGVzY3JpcHRpb24pO1xuICAgICAgICBzd2l0Y2ggKHRpdGxlTG9jYXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICBjYXNlICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRUaXRsZShpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2sodGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVzYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhkZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChkZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KSwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKlxuICAgICAgICAgICAgICAgICAgICBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludCA9IGNvbnRlbnRQb2ludDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRGbGF0cyAhPT0gbnVsbCAmJiBjb250ZW50RmxhdHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludC55VG9wID0gU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uY29udGVudEZsYXRzKS55Qm90ICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soY29udGVudEZsYXRzLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uY29udGVudEZsYXRzKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFF1ZXN0aW9uLkNPTlRFTlRfSU5ERU5UX1NDQUxFO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludCA9IGNvbnRlbnRQb2ludDtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50RmxhdHM6IElQZGZCcmlja1tdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tcG9zaXRlKGNvbnRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBmbGF0cy5wdXNoKC4uLmNvbnRlbnRGbGF0cyk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRGbGF0cyAhPT0gbnVsbCAmJiBjb250ZW50RmxhdHMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmNvbnRlbnRGbGF0cykpO1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5oYXNDb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tbWVudChjb21tZW50UG9pbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVQb2ludDogSVBvaW50ID0gaW5kZW50UG9pbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgPSBmbGF0c1tmbGF0cy5sZW5ndGggLSAxXS55Qm90O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9HQVBfVkVSVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUodGl0bGVQb2ludCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2sodGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICBpZiAoaXNEZXNjKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdERlc2NyaXB0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRpdGxlRmxhdCkpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGRlc2NGbGF0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5NVUxUSVBMRVRFWFRfVEVYVF9QRVJTKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoaW5kZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKHRpdGxlRmxhdCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGl0bGVGbGF0LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVzYykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXREZXNjcmlwdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludCh0aXRsZUZsYXQpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhkZXNjRmxhdCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRQb2ludC54TGVmdCA9IE1hdGgubWF4KGNvbnRlbnRQb2ludC54TGVmdCwgZGVzY0ZsYXQueFJpZ2h0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50UG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0dBUF9IT1JfU0NBTEU7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGNvbnRlbnRQb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQueExlZnQgPSBjb250ZW50UG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEZsYXRzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbXBvc2l0ZShjb250ZW50UG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50RmxhdHMgIT09IG51bGwgJiYgY29udGVudEZsYXRzLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnRQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5jb250ZW50RmxhdHMpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhjb250ZW50RmxhdHMuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaCguLi5jb250ZW50RmxhdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnaGlkZGVuJzpcbiAgICAgICAgICAgIGNhc2UgU3VydmV5SGVscGVyLlRJVExFX0xPQ0FUSU9OX01BVFJJWDpcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShpbmRlbnRQb2ludCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlTG9jYXRpb24gIT09IFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFBvaW50LnhMZWZ0ICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBGbGF0UXVlc3Rpb24uQ09OVEVOVF9JTkRFTlRfU0NBTEU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRRdWVzdGlvbi5DT05URU5UX0lOREVOVF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tbWVudFBvaW50ID0gY29udGVudFBvaW50O1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ29tcG9zaXRlKGNvbnRlbnRQb2ludCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRzICE9PSBudWxsICYmIGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50UG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4uZmxhdHMpKTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudFBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaGFzQ29tbWVudCAmJiB0aGlzLnF1ZXN0aW9uLnRpdGxlTG9jYXRpb24gIT09ICdib3R0b20nKSB7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0NvbW1lbnQoY29tbWVudFBvaW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgncXVlc3Rpb24nLCB7XG4gICAgbmFtZTogJ3JlYWRvbmx5UmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAndGV4dCcsICdhY3JvZm9ybSddXG59KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbi50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBUZXh0QnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIGFsaWduOiB7IGFsaWduOiBzdHJpbmcsIGJhc2VsaW5lOiBzdHJpbmcgfTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLmFsaWduID0ge1xuICAgICAgICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICAgICAgICAgIGJhc2VsaW5lOiAnbWlkZGxlJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBwcml2YXRlIGVzY2FwZVRleHQoKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLnRleHQuaW5kZXhPZignXFx0JykgPiAtMSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy50ZXh0LnJlcGxhY2UoJ1xcdCcsIEFycmF5KDUpLmpvaW4oU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgYWxpZ25Qb2ludDogSVBvaW50ID0gdGhpcy5hbGlnblBvaW50KHRoaXMpO1xuICAgICAgICBsZXQgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgbGV0IG9sZFRleHRDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRUZXh0Q29sb3IoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5zZXRUZXh0Q29sb3IodGhpcy50ZXh0Q29sb3IpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnRleHQodGhpcy5lc2NhcGVUZXh0KCksIGFsaWduUG9pbnQueExlZnQsIGFsaWduUG9pbnQueVRvcCwgdGhpcy5hbGlnbik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKG9sZFRleHRDb2xvcik7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYWxpZ25Qb2ludChyZWN0OiBJUmVjdCk6IElQb2ludCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4TGVmdDogcmVjdC54TGVmdCxcbiAgICAgICAgICAgIHlUb3A6IHJlY3QueVRvcCArIChyZWN0LnlCb3QgLSByZWN0LnlUb3ApIC8gMi4wXG4gICAgICAgIH07XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0LnRzIiwiaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgcHJpdmF0ZSBicmlja3M6IElQZGZCcmlja1tdID0gW107XG4gICAgcHJpdmF0ZSBfeExlZnQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF94UmlnaHQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF95VG9wOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfeUJvdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc1BhZ2VCcmVhazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciguLi5icmlja3M6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIHRoaXMuX3hMZWZ0ID0gMC4wO1xuICAgICAgICB0aGlzLl94UmlnaHQgPSAwLjA7XG4gICAgICAgIHRoaXMuX3lUb3AgPSAwLjA7XG4gICAgICAgIHRoaXMuX3lCb3QgPSAwLjA7XG4gICAgICAgIHRoaXMuYWRkQnJpY2soLi4uYnJpY2tzKTtcbiAgICB9XG4gICAgZ2V0IHhMZWZ0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl94TGVmdDsgfVxuICAgIHNldCB4TGVmdCh4TGVmdDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2hpZnQoeExlZnQgLSB0aGlzLnhMZWZ0LCAwLjAsIDAuMCwgMC4wKTtcbiAgICAgICAgdGhpcy5feExlZnQgPSB4TGVmdDtcbiAgICB9XG4gICAgZ2V0IHhSaWdodCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feFJpZ2h0OyB9XG4gICAgc2V0IHhSaWdodCh4UmlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KDAuMCwgeFJpZ2h0IC0gdGhpcy54UmlnaHQsIDAuMCwgMC4wKTtcbiAgICAgICAgdGhpcy5feFJpZ2h0ID0geFJpZ2h0O1xuICAgIH1cbiAgICBnZXQgeVRvcCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5feVRvcDsgfVxuICAgIHNldCB5VG9wKHlUb3A6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNoaWZ0KDAuMCwgMC4wLCB5VG9wIC0gdGhpcy55VG9wLCAwLjApO1xuICAgICAgICB0aGlzLl95VG9wID0geVRvcDtcbiAgICB9XG4gICAgZ2V0IHlCb3QoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3lCb3Q7IH1cbiAgICBzZXQgeUJvdCh5Qm90OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zaGlmdCgwLjAsIDAuMCwgMC4wLCB5Qm90IC0gdGhpcy55Qm90KTtcbiAgICAgICAgdGhpcy5feUJvdCA9IHlCb3Q7XG4gICAgfVxuICAgIHByaXZhdGUgc2hpZnQobGVmdFNoaWZ0OiBudW1iZXIsIHJpZ2h0U2hpZnQ6IG51bWJlcixcbiAgICAgICAgdG9wU2hpZnQ6IG51bWJlciwgYm90U2hpZnQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKChicmljazogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICBicmljay54TGVmdCArPSBsZWZ0U2hpZnQ7XG4gICAgICAgICAgICBicmljay54UmlnaHQgKz0gcmlnaHRTaGlmdDtcbiAgICAgICAgICAgIGJyaWNrLnlUb3AgKz0gdG9wU2hpZnQ7XG4gICAgICAgICAgICBicmljay55Qm90ICs9IGJvdFNoaWZ0O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5icmlja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnJpY2tzW2ldLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnJpY2tzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgcHVibGljIGFkZEJyaWNrKC4uLmJyaWNrczogSVBkZkJyaWNrW10pIHtcbiAgICAgICAgaWYgKGJyaWNrcy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgdGhpcy5icmlja3MucHVzaCguLi5icmlja3MpO1xuICAgICAgICAgICAgbGV0IG1lcmdlUmVjdCA9IFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLnRoaXMuYnJpY2tzKTtcbiAgICAgICAgICAgIHRoaXMuX3hMZWZ0ID0gbWVyZ2VSZWN0LnhMZWZ0O1xuICAgICAgICAgICAgdGhpcy5feFJpZ2h0ID0gbWVyZ2VSZWN0LnhSaWdodDtcbiAgICAgICAgICAgIHRoaXMuX3lUb3AgPSBtZXJnZVJlY3QueVRvcDtcbiAgICAgICAgICAgIHRoaXMuX3lCb3QgPSBtZXJnZVJlY3QueUJvdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgdW5mb2xkKCk6IElQZGZCcmlja1tdIHtcbiAgICAgICAgY29uc3QgdW5mb2xkQnJpY2tzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICB0aGlzLmJyaWNrcy5mb3JFYWNoKChicmljazogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRCcmlja3MucHVzaCguLi5icmljay51bmZvbGQoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdW5mb2xkQnJpY2tzO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlLnRzIiwiaW1wb3J0IHsgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQZGZCcmljayBleHRlbmRzIElSZWN0LCBJU2l6ZSB7XG4gICAgcmVuZGVyKCk6IFByb21pc2U8dm9pZD47XG4gICAgdW5mb2xkKCk6IElQZGZCcmlja1tdO1xuICAgIGlzUGFnZUJyZWFrOiBib29sZWFuO1xufVxuZXhwb3J0IGNsYXNzIFBkZkJyaWNrIGltcGxlbWVudHMgSVBkZkJyaWNrIHtcbiAgICBwdWJsaWMgeExlZnQ6IG51bWJlcjtcbiAgICBwdWJsaWMgeFJpZ2h0OiBudW1iZXI7XG4gICAgcHVibGljIHlUb3A6IG51bWJlcjtcbiAgICBwdWJsaWMgeUJvdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNpemUgb2YgdGV4dC4gU2V0IDAgZm9yIGF1dG8gc2l6ZVxuICAgICAqL1xuICAgIHB1YmxpYyBmb250U2l6ZTogbnVtYmVyO1xuICAgIHB1YmxpYyB0ZXh0Q29sb3I6IHN0cmluZyA9IFN1cnZleUhlbHBlci5URVhUX0NPTE9SO1xuICAgIHB1YmxpYyBmb3JtQm9yZGVyQ29sb3I6IHN0cmluZyA9IFN1cnZleUhlbHBlci5GT1JNX0JPUkRFUl9DT0xPUjtcbiAgICBwdWJsaWMgaXNQYWdlQnJlYWs6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHF1ZXN0aW9uOiBJUXVlc3Rpb24sXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLCByZWN0OiBJUmVjdCkge1xuICAgICAgICB0aGlzLnhMZWZ0ID0gcmVjdC54TGVmdDtcbiAgICAgICAgdGhpcy54UmlnaHQgPSByZWN0LnhSaWdodDtcbiAgICAgICAgdGhpcy55VG9wID0gcmVjdC55VG9wO1xuICAgICAgICB0aGlzLnlCb3QgPSByZWN0LnlCb3Q7XG4gICAgICAgIHRoaXMuZm9udFNpemUgPSAhIWNvbnRyb2xsZXIgP1xuICAgICAgICAgICAgY29udHJvbGxlci5mb250U2l6ZSA6IERvY0NvbnRyb2xsZXIuRk9OVF9TSVpFO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnhSaWdodCAtIHRoaXMueExlZnQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnlCb3QgLSB0aGlzLnlUb3A7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghIXRoaXMucXVlc3Rpb24gJiYgdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVuZGVyUmVhZE9ubHkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGF3YWl0IHRoaXMucmVuZGVySW50ZXJhY3RpdmUoKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlclJlYWRPbmx5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9icmljay50cyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV83X187XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wicm9vdFwiOlwiU3VydmV5XCIsXCJjb21tb25qczJcIjpcInN1cnZleS1jb3JlXCIsXCJjb21tb25qc1wiOlwic3VydmV5LWNvcmVcIixcImFtZFwiOlwic3VydmV5LWNvcmVcIn1cbi8vIG1vZHVsZSBpZCA9IDdcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IHsganNQREYsIGpzUERGT3B0aW9ucyB9IGZyb20gJ2pzcGRmJztcbmltcG9ydCB7IElIVE1MUmVuZGVyVHlwZSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9odG1sJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4vaGVscGVyX3N1cnZleSc7XG5pbXBvcnQgeyBMb2NhbGl6YWJsZVN0cmluZyB9IGZyb20gJ3N1cnZleS1jb3JlJztcbi8vIGltcG9ydCBGb250cyBmcm9tICcuL2ZvbnRzJztcbmltcG9ydCBzZXRSYWRpb0FwcGVhcmFuY2UgZnJvbSAnLi9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtJztcbmltcG9ydCAnLi9qc3BkZl9wbHVnaW5zL2Fjcm9mb3JtLmpzJztcbmltcG9ydCAnLi9qc3BkZl9wbHVnaW5zL2Zyb21faHRtbC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBvaW50IHtcbiAgICB4TGVmdDogbnVtYmVyO1xuICAgIHlUb3A6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVJlY3QgZXh0ZW5kcyBJUG9pbnQge1xuICAgIHhSaWdodDogbnVtYmVyO1xuICAgIHlCb3Q6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVNpemUge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIElNYXJnaW5MUiB7XG4gICAgbGVmdD86IG51bWJlcjtcbiAgICByaWdodD86IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSU1hcmdpbiBleHRlbmRzIElNYXJnaW5MUiB7XG4gICAgdG9wPzogbnVtYmVyO1xuICAgIGJvdD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVjbGFyZXMgYSBzZXQgb2Ygb3B0aW9ucyBmb3IgYSBTdXJ2ZXlQREYgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURvY09wdGlvbnMge1xuICAgIG9yaWVudGF0aW9uPzogJ3AnIHwgJ2wnO1xuICAgIGZvcm1hdD86IHN0cmluZyB8IG51bWJlcltdO1xuICAgIGZvbnRTaXplPzogbnVtYmVyO1xuICAgIGZvbnROYW1lPzogc3RyaW5nO1xuICAgIGJhc2U2NE5vcm1hbD86IHN0cmluZztcbiAgICBiYXNlNjRCb2xkPzogc3RyaW5nO1xuICAgIHVzZUN1c3RvbUZvbnRJbkh0bWw/OiBib29sZWFuO1xuICAgIG1hcmdpbnM/OiBJTWFyZ2luO1xuICAgIGNvbW1lcmNpYWw/OiBib29sZWFuO1xuICAgIGhhdmVDb21tZXJjaWFsTGljZW5zZT86IGJvb2xlYW47XG4gICAgaHRtbFJlbmRlckFzPzogSUhUTUxSZW5kZXJUeXBlO1xuICAgIG1hdHJpeFJlbmRlckFzPzogJ2F1dG8nIHwgJ2xpc3QnO1xuICAgIHJlYWRvbmx5UmVuZGVyQXM/OiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nO1xuICAgIHRleHRGaWVsZFJlbmRlckFzPzogJ3NpbmdsZUxpbmUnIHwgJ211bHRpTGluZSc7XG4gICAgY29tcHJlc3M/OiBib29sZWFuO1xuICAgIGFwcGx5SW1hZ2VGaXQ/OiBib29sZWFuO1xufVxuLyoqXG4gKiBDb250YWlucyBhIHNldCBvZiBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZSBhcHBlYXJhbmNlIG9mIGEgUERGIGRvY3VtZW50IHJlbmRlcmVkIGJ5IFN1cnZleVBERi5cbiAqL1xuZXhwb3J0IGNsYXNzIERvY09wdGlvbnMgaW1wbGVtZW50cyBJRG9jT3B0aW9ucyB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBNTV9UT19QVCA9IDcyIC8gMjUuNDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZPTlRfU0laRSA9IDE0O1xuICAgIHByb3RlY3RlZCBfb3JpZW50YXRpb246ICdsJyB8ICdwJztcbiAgICBwcm90ZWN0ZWQgX2Zvcm1hdDogc3RyaW5nIHwgbnVtYmVyW107XG4gICAgcHJvdGVjdGVkIF9mb250U2l6ZTogbnVtYmVyO1xuICAgIHByb3RlY3RlZCBfZm9udE5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgc3RhdGljIFNFR09FX05PUk1BTDogc3RyaW5nO1xuICAgIHB1YmxpYyBzdGF0aWMgU0VHT0VfQk9MRDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfYmFzZTY0Tm9ybWFsOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICAgcHJvdGVjdGVkIF9iYXNlNjRCb2xkOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICAgcHJvdGVjdGVkIF91c2VDdXN0b21Gb250SW5IdG1sOiBib29sZWFuO1xuICAgIHByb3RlY3RlZCBfbWFyZ2luczogSU1hcmdpbjtcbiAgICBwcm90ZWN0ZWQgX2h0bWxSZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlO1xuICAgIHByb3RlY3RlZCBfbWF0cml4UmVuZGVyQXM6ICdhdXRvJyB8ICdsaXN0JztcbiAgICBwcm90ZWN0ZWQgX3JlYWRvbmx5UmVuZGVyQXM6ICdhdXRvJyB8ICd0ZXh0JyB8ICdhY3JvZm9ybSc7XG4gICAgcHJvdGVjdGVkIF90ZXh0RmllbGRSZW5kZXJBczogJ3NpbmdsZUxpbmUnIHwgJ211bHRpTGluZSc7XG4gICAgcHJvdGVjdGVkIF9jb21wcmVzczogYm9vbGVhbjtcbiAgICBwcm90ZWN0ZWQgX2FwcGx5SW1hZ2VGaXQ6IGJvb2xlYW47XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElEb2NPcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mb3JtYXQgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtYXRbMF0gPCBvcHRpb25zLmZvcm1hdFsxXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gJ3AnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB0aGlzLl9vcmllbnRhdGlvbiA9ICdsJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHRoaXMuX29yaWVudGF0aW9uID0gb3B0aW9ucy5vcmllbnRhdGlvbjtcbiAgICAgICAgdGhpcy5fZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQgfHwgJ2E0JztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fZm9ybWF0KSkge1xuICAgICAgICAgICAgdGhpcy5fZm9ybWF0ID0gdGhpcy5fZm9ybWF0Lm1hcChmID0+IGYgKiBEb2NPcHRpb25zLk1NX1RPX1BUKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mb250U2l6ZSA9IG9wdGlvbnMuZm9udFNpemUgfHwgRG9jT3B0aW9ucy5GT05UX1NJWkU7XG4gICAgICAgIHRoaXMuX2ZvbnROYW1lID0gb3B0aW9ucy5mb250TmFtZSB8fCAnc2Vnb2UnO1xuICAgICAgICBpZiAoKHR5cGVvZiBvcHRpb25zLmZvbnROYW1lICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgKHR5cGVvZiBvcHRpb25zLmJhc2U2NE5vcm1hbCAhPT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5iYXNlNjRCb2xkICE9PSAndW5kZWZpbmVkJykpKSB7XG4gICAgICAgICAgICB0aGlzLl9iYXNlNjROb3JtYWwgPSBvcHRpb25zLmJhc2U2NE5vcm1hbCB8fCBvcHRpb25zLmJhc2U2NEJvbGQ7XG4gICAgICAgICAgICB0aGlzLl9iYXNlNjRCb2xkID0gb3B0aW9ucy5iYXNlNjRCb2xkIHx8IG9wdGlvbnMuYmFzZTY0Tm9ybWFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZm9udE5hbWUgPT09ICdzZWdvZScpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuX2Jhc2U2NE5vcm1hbCA9IEZvbnRzLlNFR09FX05PUk1BTDtcbiAgICAgICAgICAgIC8vIHRoaXMuX2Jhc2U2NEJvbGQgPSBGb250cy5TRUdPRV9CT0xEO1xuICAgICAgICAgICAgdGhpcy5fYmFzZTY0Tm9ybWFsID0gRG9jT3B0aW9ucy5TRUdPRV9OT1JNQUw7XG4gICAgICAgICAgICB0aGlzLl9iYXNlNjRCb2xkID0gRG9jT3B0aW9ucy5TRUdPRV9CT0xEO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VzZUN1c3RvbUZvbnRJbkh0bWwgPSBvcHRpb25zLnVzZUN1c3RvbUZvbnRJbkh0bWwgJiYgdHlwZW9mIG9wdGlvbnMuYmFzZTY0Tm9ybWFsICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgdGhpcy5fbWFyZ2lucyA9IFN1cnZleUhlbHBlci5jbG9uZShvcHRpb25zLm1hcmdpbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9tYXJnaW5zLnRvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMuX21hcmdpbnMudG9wID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMuYm90ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5ib3QgPSAxMC4wO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWFyZ2lucy5sZWZ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fbWFyZ2lucy5sZWZ0ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX21hcmdpbnMucmlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXJnaW5zLnJpZ2h0ID0gMTAuMDtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9tYXJnaW5zKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICg8YW55PnRoaXMuX21hcmdpbnMpW25hbWVdID0gKDxhbnk+dGhpcy5fbWFyZ2lucylbbmFtZV0gKiBEb2NPcHRpb25zLk1NX1RPX1BUO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5faHRtbFJlbmRlckFzID0gb3B0aW9ucy5odG1sUmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9tYXRyaXhSZW5kZXJBcyA9IG9wdGlvbnMubWF0cml4UmVuZGVyQXMgfHwgJ2F1dG8nO1xuICAgICAgICB0aGlzLl9yZWFkb25seVJlbmRlckFzID0gb3B0aW9ucy5yZWFkb25seVJlbmRlckFzIHx8ICdhdXRvJztcbiAgICAgICAgdGhpcy5fdGV4dEZpZWxkUmVuZGVyQXMgPSBvcHRpb25zLnRleHRGaWVsZFJlbmRlckFzIHx8ICdzaW5nbGVMaW5lJztcbiAgICAgICAgdGhpcy5fY29tcHJlc3MgPSBvcHRpb25zLmNvbXByZXNzIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLl9hcHBseUltYWdlRml0ID0gb3B0aW9ucy5hcHBseUltYWdlRml0IHx8IGZhbHNlO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGxlZnRUb3BQb2ludCgpOiBJUG9pbnQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeExlZnQ6IHRoaXMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgeVRvcDogdGhpcy5tYXJnaW5zLnRvcFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnRTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U2l6ZTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmb250TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9udE5hbWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYmFzZTY0Tm9ybWFsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlNjROb3JtYWw7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgYmFzZTY0Qm9sZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZTY0Qm9sZDtcbiAgICB9XG4gICAgcHVibGljIGdldCB1c2VDdXN0b21Gb250SW5IdG1sKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlQ3VzdG9tRm9udEluSHRtbDtcbiAgICB9XG4gICAgcHVibGljIGdldCBtYXJnaW5zKCk6IElNYXJnaW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFyZ2lucztcbiAgICB9XG4gICAgcHVibGljIGdldCBmb3JtYXQoKTogc3RyaW5nIHwgbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG9yaWVudGF0aW9uKCk6ICdsJyB8ICdwJyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGdldCBodG1sUmVuZGVyQXMoKTogSUhUTUxSZW5kZXJUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWxSZW5kZXJBcztcbiAgICB9XG4gICAgcHVibGljIGdldCBtYXRyaXhSZW5kZXJBcygpOiAnYXV0bycgfCAnbGlzdCcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF0cml4UmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgcmVhZG9ubHlSZW5kZXJBcygpOiAnYXV0bycgfCAndGV4dCcgfCAnYWNyb2Zvcm0nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5UmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdGV4dEZpZWxkUmVuZGVyQXMoKTogJ3NpbmdsZUxpbmUnIHwgJ211bHRpTGluZScge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGV4dEZpZWxkUmVuZGVyQXM7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgY29tcHJlc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wcmVzcztcbiAgICB9XG4gICAgcHVibGljIGdldCBhcHBseUltYWdlRml0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlJbWFnZUZpdDtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEb2NDb250cm9sbGVyIGV4dGVuZHMgRG9jT3B0aW9ucyB7XG4gICAgcHJpdmF0ZSBfZG9jOiBqc1BERjtcbiAgICBwcml2YXRlIF9oZWxwZXJEb2M6IGpzUERGO1xuICAgIHByaXZhdGUgX2ZvbnRTdHlsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgbWFyZ2luc1N0YWNrOiBJTWFyZ2luTFJbXTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogSURvY09wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgY29uc3QganNwZGZPcHRpb25zOiBqc1BERk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBvcmllbnRhdGlvbjogdGhpcy5vcmllbnRhdGlvbixcbiAgICAgICAgICAgIHVuaXQ6ICdwdCcsIGZvcm1hdDogdGhpcy5mb3JtYXQsIGNvbXByZXNzOiB0aGlzLmNvbXByZXNzXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2RvYyA9IG5ldyBqc1BERihqc3BkZk9wdGlvbnMpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYmFzZTY0Tm9ybWFsICE9PSAndW5kZWZpbmVkJyAmJiAhU3VydmV5SGVscGVyLmlzRm9udEV4aXN0KHRoaXMsIHRoaXMuZm9udE5hbWUpKSB7XG4gICAgICAgICAgICBEb2NDb250cm9sbGVyLmFkZEZvbnQodGhpcy5mb250TmFtZSwgdGhpcy5iYXNlNjROb3JtYWwsICdub3JtYWwnKTtcbiAgICAgICAgICAgIERvY0NvbnRyb2xsZXIuYWRkRm9udCh0aGlzLmZvbnROYW1lLCB0aGlzLmJhc2U2NEJvbGQsICdib2xkJyk7XG4gICAgICAgICAgICB0aGlzLl9kb2MgPSBuZXcganNQREYoanNwZGZPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRSYWRpb0FwcGVhcmFuY2UodGhpcy5fZG9jKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jID0gbmV3IGpzUERGKGpzcGRmT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KHRoaXMuZm9udE5hbWUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udCh0aGlzLmZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnRTaXplKHRoaXMuZm9udFNpemUpO1xuICAgICAgICB0aGlzLl9oZWxwZXJEb2Muc2V0Rm9udFNpemUodGhpcy5mb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9ICdub3JtYWwnO1xuICAgICAgICB0aGlzLm1hcmdpbnNTdGFjayA9IFtdO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGN1c3RvbUZvbnRzOiB7IFtuYW1lOiBzdHJpbmddOiB7IG5vcm1hbDogc3RyaW5nLCBib2xkOiBzdHJpbmcsIGl0YWxpYzogc3RyaW5nLCBib2xkaXRhbGljOiBzdHJpbmcgfSB9ID0ge307XG4gICAgcHVibGljIHN0YXRpYyBhZGRGb250KGZvbnROYW1lOiBzdHJpbmcsIGJhc2U2NDogc3RyaW5nLCBmb250U3R5bGU6ICdub3JtYWwnIHwgJ2JvbGQnIHwgJ2l0YWxpYycgfCAnYm9sZGl0YWxpYycpIHtcbiAgICAgICAgbGV0IGZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgaWYgKCFmb250KSB7XG4gICAgICAgICAgICBmb250ID0gPGFueT57fTtcbiAgICAgICAgICAgIERvY0NvbnRyb2xsZXIuY3VzdG9tRm9udHNbZm9udE5hbWVdID0gZm9udDtcbiAgICAgICAgfVxuICAgICAgICBmb250W2ZvbnRTdHlsZV0gPSBiYXNlNjQ7XG4gICAgICAgIGNvbnN0IGFkZEZvbnRDYWxsYmFjazogKCkgPT4gdm9pZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZvbnQgPSBEb2NDb250cm9sbGVyLmN1c3RvbUZvbnRzW2ZvbnROYW1lXTtcbiAgICAgICAgICAgIGlmICghIWN1c3RvbUZvbnQgJiYgISFjdXN0b21Gb250W2ZvbnRTdHlsZV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb250RmlsZTogc3RyaW5nID0gYCR7Zm9udE5hbWV9LSR7Zm9udFN0eWxlfS50dGZgO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmlsZVRvVkZTKGZvbnRGaWxlLCBjdXN0b21Gb250W2ZvbnRTdHlsZV0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRm9udChmb250RmlsZSwgZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgICg8YW55PmpzUERGKS5BUEkuZXZlbnRzLnB1c2goWydhZGRGb250cycsIGFkZEZvbnRDYWxsYmFja10pO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGRvYygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG9jO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlbHBlckRvYygpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVscGVyRG9jO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnROYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250TmFtZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250TmFtZShmb250TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnROYW1lID0gZm9udE5hbWU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250KGZvbnROYW1lKTtcbiAgICAgICAgdGhpcy5faGVscGVyRG9jLnNldEZvbnQoZm9udE5hbWUpO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGZvbnRTaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U2l6ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBmb250U2l6ZShmb250U2l6ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTaXplID0gZm9udFNpemU7XG4gICAgICAgIHRoaXMuX2RvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZm9udFN0eWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb250U3R5bGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZm9udFN0eWxlKGZvbnRTdHlsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2ZvbnRTdHlsZSA9IGZvbnRTdHlsZTtcbiAgICAgICAgdGhpcy5fZG9jLnNldEZvbnQodGhpcy5fZm9udE5hbWUsIGZvbnRTdHlsZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgIH1cbiAgICBwdWJsaWMgbWVhc3VyZVRleHQodGV4dDogc3RyaW5nIHwgTG9jYWxpemFibGVTdHJpbmcgfCBudW1iZXIgPSAxLCBmb250U3R5bGU6IHN0cmluZyA9IHRoaXMuX2ZvbnRTdHlsZSxcbiAgICAgICAgZm9udFNpemU6IG51bWJlciA9IHRoaXMuX2ZvbnRTaXplKTogSVNpemUge1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5faGVscGVyRG9jLmdldEZvbnRTaXplKCk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShmb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCBmb250U3R5bGUpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHRoaXMuX2hlbHBlckRvYy5nZXRMaW5lSGVpZ2h0KCkgLyB0aGlzLl9oZWxwZXJEb2MuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyID0gMC4wO1xuICAgICAgICBpZiAodHlwZW9mIHRleHQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0ZXh0ID0gdHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dCA6IFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGV4dCk7XG4gICAgICAgICAgICB3aWR0aCA9IHRleHQuc3BsaXQoJycpLnJlZHVjZSgoc206IG51bWJlciwgY3I6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICBzbSArIHRoaXMuX2hlbHBlckRvYy5nZXRUZXh0V2lkdGgoY3IpLCAwLjApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250U2l6ZShvbGRGb250U2l6ZSk7XG4gICAgICAgIHRoaXMuX2hlbHBlckRvYy5zZXRGb250KHRoaXMuX2ZvbnROYW1lLCAnbm9ybWFsJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICB9O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHVuaXRXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tZWFzdXJlVGV4dCgpLndpZHRoO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHVuaXRIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVhc3VyZVRleHQoKS5oZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBwdXNoTWFyZ2lucyhsZWZ0PzogbnVtYmVyLCByaWdodD86IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLm1hcmdpbnNTdGFjay5wdXNoKHsgbGVmdDogdGhpcy5tYXJnaW5zLmxlZnQsIHJpZ2h0OiB0aGlzLm1hcmdpbnMucmlnaHQgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgbGVmdCAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMubWFyZ2lucy5sZWZ0ID0gbGVmdDtcbiAgICAgICAgaWYgKHR5cGVvZiByaWdodCAhPT0gJ3VuZGVmaW5lZCcpIHRoaXMubWFyZ2lucy5yaWdodCA9IHJpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgcG9wTWFyZ2lucygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWFyZ2luczogSU1hcmdpbkxSID0gdGhpcy5tYXJnaW5zU3RhY2sucG9wKCk7XG4gICAgICAgIHRoaXMubWFyZ2lucy5sZWZ0ID0gbWFyZ2lucy5sZWZ0O1xuICAgICAgICB0aGlzLm1hcmdpbnMucmlnaHQgPSBtYXJnaW5zLnJpZ2h0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHBhcGVyV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IHBhcGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQ7XG4gICAgfVxuICAgIHB1YmxpYyBnZXROdW1iZXJPZlBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvYy5nZXROdW1iZXJPZlBhZ2VzKCk7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRQYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvYy5hZGRQYWdlKCk7XG4gICAgfVxuICAgIHB1YmxpYyBzZXRQYWdlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kb2Muc2V0UGFnZShpbmRleCArIDEpO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9kb2NfY29udHJvbGxlci50cyIsImltcG9ydCB7IElFbGVtZW50LCBRdWVzdGlvbiwgUGFuZWxNb2RlbEJhc2UsIFBhbmVsTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgUm93bGluZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcm93bGluZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEFkb3JuZXJzUGFuZWxPcHRpb25zLCBBZG9ybmVyc1BhZ2VPcHRpb25zIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9hZG9ybmVycyc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4uL2VudHJpZXMvcGRmJztcbmltcG9ydCAqIGFzIFN1cnZleVBERk1vZHVsZSBmcm9tICcuLi9lbnRyaWVzL3BkZic7XG5cbmV4cG9ydCBjbGFzcyBGbGF0U3VydmV5IHtcbiAgICBwdWJsaWMgc3RhdGljIFFVRVNfR0FQX1ZFUlRfU0NBTEU6IG51bWJlciA9IDEuNTtcbiAgICBwdWJsaWMgc3RhdGljIFBBTkVMX0NPTlRfR0FQX1NDQUxFOiBudW1iZXIgPSAxLjA7XG4gICAgcHVibGljIHN0YXRpYyBQQU5FTF9ERVNDX0dBUF9TQ0FMRTogbnVtYmVyID0gMC4yNTtcbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHNQYW5lbChzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcGFuZWw6IFBhbmVsTW9kZWwsIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHBhbmVsRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IHBhbmVsQ29udGVudFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ICs9IGNvbnRyb2xsZXIubWVhc3VyZVRleHQocGFuZWwuaW5uZXJJbmRlbnQpLndpZHRoO1xuICAgICAgICBwYW5lbENvbnRlbnRQb2ludC54TGVmdCArPSBjb250cm9sbGVyLm1lYXN1cmVUZXh0KHBhbmVsLmlubmVySW5kZW50KS53aWR0aDtcbiAgICAgICAgcGFuZWxGbGF0cy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1BhZ2VQYW5lbChzdXJ2ZXksXG4gICAgICAgICAgICBjb250cm9sbGVyLCBwYW5lbCwgcGFuZWxDb250ZW50UG9pbnQpKTtcbiAgICAgICAgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIGNvbnN0IGFkb3JuZXJzT3B0aW9uczogQWRvcm5lcnNQYW5lbE9wdGlvbnMgPSBuZXcgQWRvcm5lcnNQYW5lbE9wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICBwYW5lbEZsYXRzLCBwYW5lbCwgY29udHJvbGxlciwgRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKSwgU3VydmV5UERGTW9kdWxlKTtcbiAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUGFuZWwuZmlyZShzdXJ2ZXksIGFkb3JuZXJzT3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBbLi4uYWRvcm5lcnNPcHRpb25zLmJyaWNrc107XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoc3VydmV5OiBTdXJ2ZXlQREYsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHBhZ2VQYW5lbDogUGFuZWxNb2RlbEJhc2UsIHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICghcGFnZVBhbmVsLmlzVmlzaWJsZSkgcmV0dXJuO1xuICAgICAgICBwYWdlUGFuZWwub25GaXJzdFJlbmRlcmluZygpO1xuICAgICAgICBjb25zdCBwYWdlUGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgaWYgKHBhZ2VQYW5lbC5nZXRUeXBlKCkgIT09ICdwYWdlJyB8fCBzdXJ2ZXkuc2hvd1BhZ2VUaXRsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICBpZiAocGFnZVBhbmVsLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhZ2VQYW5lbCBpbnN0YW5jZW9mIFBhbmVsTW9kZWwgJiYgcGFnZVBhbmVsLm5vKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlUGFuZWxGbGF0KFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBjb250cm9sbGVyLCBwYWdlUGFuZWwubm8sIHBhZ2VQYW5lbC5nZXRUeXBlKCkgPT09ICdwYWdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobm9GbGF0KTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gbm9GbGF0LnhSaWdodCArIGNvbnRyb2xsZXIubWVhc3VyZVRleHQoJyAnKS53aWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZWxQYW5lbFRpdGxlRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRpdGxlUGFuZWxGbGF0KFxuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIGNvbnRyb2xsZXIsIHBhZ2VQYW5lbC5sb2NUaXRsZSwgcGFnZVBhbmVsLmdldFR5cGUoKSA9PT0gJ3BhZ2UnKTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHBhZ2VsUGFuZWxUaXRsZUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChwYWdlbFBhbmVsVGl0bGVGbGF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYWdlUGFuZWwuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZVBhbmVsLnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IGNvbnRyb2xsZXIudW5pdFdpZHRoICogRmxhdFN1cnZleS5QQU5FTF9ERVNDX0dBUF9TQ0FMRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZVBhbmVsRGVzY0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVEZXNjRmxhdChcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LCBudWxsLCBjb250cm9sbGVyLCBwYWdlUGFuZWwubG9jRGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2socGFnZVBhbmVsRGVzY0ZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChwYWdlUGFuZWxEZXNjRmxhdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWNvbXBvc2l0ZUZsYXQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0xpbmVQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHJvd0xpbmVQb2ludCwgY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIHBhZ2VQYW5lbEZsYXRzLnB1c2goY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5QQU5FTF9DT05UX0dBUF9TQ0FMRSArIFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHBhZ2VQYW5lbC5yb3dzKSB7XG4gICAgICAgICAgICBpZiAoIXJvdy52aXNpYmxlKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgbGV0IG5leHRNYXJnaW5MZWZ0OiBudW1iZXIgPSBjb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IHJvd0ZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvdy52aXNpYmxlRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudDogSUVsZW1lbnQgPSByb3cudmlzaWJsZUVsZW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5pc1Zpc2libGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBlcnNXaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoZWxlbWVudC5yZW5kZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggLSAocm93LnZpc2libGVFbGVtZW50cy5sZW5ndGggLSAxKSAqIGNvbnRyb2xsZXIudW5pdFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICByb3cudmlzaWJsZUVsZW1lbnRzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgPSBuZXh0TWFyZ2luTGVmdCArICgoaSAhPT0gMCkgPyBjb250cm9sbGVyLnVuaXRXaWR0aCA6IDApO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCA9IGNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0IC0gcGVyc1dpZHRoO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgIG5leHRNYXJnaW5MZWZ0ID0gY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKyBwZXJzV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQYW5lbE1vZGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd0ZsYXRzLnB1c2goLi4uYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGVsZW1lbnQsIGN1cnJQb2ludCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcm93RmxhdHMucHVzaCguLi5hd2FpdCBTdXJ2ZXlIZWxwZXIuZ2VuZXJhdGVRdWVzdGlvbkZsYXRzKHN1cnZleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIDxRdWVzdGlvbj5lbGVtZW50LCBjdXJyUG9pbnQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IGNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgaWYgKHJvd0ZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4ucm93RmxhdHMpLnlCb3Q7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdFN1cnZleS5RVUVTX0dBUF9WRVJUX1NDQUxFO1xuICAgICAgICAgICAgICAgIHBhZ2VQYW5lbEZsYXRzLnB1c2goLi4ucm93RmxhdHMpO1xuICAgICAgICAgICAgICAgIHBhZ2VQYW5lbEZsYXRzLnB1c2goU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgY29udHJvbGxlcikpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IFN1cnZleUhlbHBlci5FUFNJTE9OO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYWdlUGFuZWxGbGF0cztcbiAgICB9XG4gICAgcHJpdmF0ZSBzdGF0aWMgcG9wUm93bGluZXMoZmxhdHM6IElQZGZCcmlja1tdKSB7XG4gICAgICAgIHdoaWxlIChmbGF0cy5sZW5ndGggPiAwICYmIGZsYXRzW2ZsYXRzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgUm93bGluZUJyaWNrKSB7XG4gICAgICAgICAgICBmbGF0cy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRUaXRsZShzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgaWYgKHN1cnZleS5zaG93VGl0bGUpIHtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkudGl0bGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdXJ2ZXlUaXRsZUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUaXRsZVN1cnZleUZsYXQoXG4gICAgICAgICAgICAgICAgICAgIHBvaW50LCBjb250cm9sbGVyLCBzdXJ2ZXkubG9jVGl0bGUpO1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soc3VydmV5VGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICBwb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChzdXJ2ZXlUaXRsZUZsYXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1cnZleS5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChzdXJ2ZXkudGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRXaWR0aCAqIEZsYXRTdXJ2ZXkuUEFORUxfREVTQ19HQVBfU0NBTEU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZURlc2NGbGF0KFxuICAgICAgICAgICAgICAgICAgICBwb2ludCwgbnVsbCwgY29udHJvbGxlciwgc3VydmV5LmxvY0Rlc2NyaXB0aW9uKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGdlbmVyYXRlRmxhdExvZ29JbWFnZShzdXJ2ZXk6IFN1cnZleVBERiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIG51bGwsIGNvbnRyb2xsZXIsIFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcoc3VydmV5LmxvY0xvZ28pLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnB4VG9QdChzdXJ2ZXkubG9nb1dpZHRoKSwgU3VydmV5SGVscGVyLnB4VG9QdChzdXJ2ZXkubG9nb0hlaWdodCkpO1xuICAgICAgICBsZXQgc2hpZnQ6IG51bWJlciA9IDA7XG4gICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBzaGlmdCA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgoY29udHJvbGxlcikgLSBsb2dvRmxhdC53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIHNoaWZ0ID0gU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aChjb250cm9sbGVyKSAvIDIuMCAtIGxvZ29GbGF0LndpZHRoIC8gMi4wO1xuICAgICAgICB9XG4gICAgICAgIGxvZ29GbGF0LnhMZWZ0ICs9IHNoaWZ0O1xuICAgICAgICBsb2dvRmxhdC54UmlnaHQgKz0gc2hpZnQ7XG4gICAgICAgIHJldHVybiBsb2dvRmxhdDtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBnZW5lcmF0ZUZsYXRzKHN1cnZleTogU3VydmV5UERGLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTxJUGRmQnJpY2tbXVtdPiB7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXVtdID0gW107XG4gICAgICAgIGlmICghc3VydmV5Lmhhc0xvZ28pIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgaWYgKCF0aXRsZUZsYXQuaXNFbXB0eSkgZmxhdHMucHVzaChbdGl0bGVGbGF0XSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3VydmV5LmlzTG9nb0JlZm9yZSkge1xuICAgICAgICAgICAgY29uc3QgbG9nb0ZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0TG9nb0ltYWdlKFxuICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgZmxhdHMucHVzaChbbG9nb0ZsYXRdKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChsb2dvRmxhdCxcbiAgICAgICAgICAgICAgICBzdXJ2ZXkubG9nb1Bvc2l0aW9uID09PSAndG9wJywgc3VydmV5LmxvZ29Qb3NpdGlvbiAhPT0gJ3RvcCcpO1xuICAgICAgICAgICAgaWYgKHN1cnZleS5sb2dvUG9zaXRpb24gIT09ICd0b3AnKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgICAgIHRpdGxlUG9pbnQueExlZnQgKz0gY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gbG9nb0ZsYXQud2lkdGggKyBjb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpdGxlUG9pbnQueExlZnQgPSBjb250cm9sbGVyLmxlZnRUb3BQb2ludC54TGVmdDtcbiAgICAgICAgICAgICAgICB0aXRsZVBvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCB0aXRsZVBvaW50KTtcbiAgICAgICAgICAgIGlmIChzdXJ2ZXkubG9nb1Bvc2l0aW9uICE9PSAndG9wJykgY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSBmbGF0c1swXS5wdXNoKHRpdGxlRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3VydmV5LmxvZ29Qb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ29GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdExvZ29JbWFnZShcbiAgICAgICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBjb250cm9sbGVyLmxlZnRUb3BQb2ludCk7XG4gICAgICAgICAgICAgICAgZmxhdHMucHVzaChbbG9nb0ZsYXRdKTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ICs9IGxvZ29GbGF0LndpZHRoICsgY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0VGl0bGUoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgY29udHJvbGxlci5sZWZ0VG9wUG9pbnQpO1xuICAgICAgICAgICAgICAgIGlmICghdGl0bGVGbGF0LmlzRW1wdHkpIGZsYXRzWzBdLnVuc2hpZnQodGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdFRpdGxlKFxuICAgICAgICAgICAgICAgICAgICBzdXJ2ZXksIGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIubGVmdFRvcFBvaW50KTtcbiAgICAgICAgICAgICAgICBsZXQgbG9nb1BvaW50OiBJUG9pbnQgPSBjb250cm9sbGVyLmxlZnRUb3BQb2ludDtcbiAgICAgICAgICAgICAgICBpZiAoIXRpdGxlRmxhdC5pc0VtcHR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goW3RpdGxlRmxhdF0pO1xuICAgICAgICAgICAgICAgICAgICBsb2dvUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGl0bGVGbGF0KTtcbiAgICAgICAgICAgICAgICAgICAgbG9nb1BvaW50LnlUb3AgKz0gY29udHJvbGxlci51bml0SGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBsb2dvRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRMb2dvSW1hZ2UoXG4gICAgICAgICAgICAgICAgICAgIHN1cnZleSwgY29udHJvbGxlciwgbG9nb1BvaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZmxhdHMubGVuZ3RoICE9PSAwKSBmbGF0c1swXS5wdXNoKGxvZ29GbGF0KTtcbiAgICAgICAgICAgICAgICBlbHNlIGZsYXRzLnB1c2goW2xvZ29GbGF0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvaW50OiBJUG9pbnQgPSBjb250cm9sbGVyLmxlZnRUb3BQb2ludDtcbiAgICAgICAgaWYgKGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgcG9pbnQueVRvcCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5mbGF0c1swXSkpLnlUb3A7XG4gICAgICAgICAgICBmbGF0c1swXS5wdXNoKFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChwb2ludCwgY29udHJvbGxlcikpO1xuICAgICAgICAgICAgcG9pbnQueVRvcCArPSBjb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0U3VydmV5LlBBTkVMX0NPTlRfR0FQX1NDQUxFICsgU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHN1cnZleS52aXNpYmxlUGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBwYWdlRmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgICAgICBwYWdlRmxhdHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNQYWdlUGFuZWwoXG4gICAgICAgICAgICAgICAgc3VydmV5LCBjb250cm9sbGVyLCBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldLCBwb2ludCkpO1xuICAgICAgICAgICAgY29uc3QgYWRvcm5lcnNPcHRpb25zOiBBZG9ybmVyc1BhZ2VPcHRpb25zID0gbmV3IEFkb3JuZXJzUGFnZU9wdGlvbnMocG9pbnQsXG4gICAgICAgICAgICAgICAgcGFnZUZsYXRzLCBzdXJ2ZXkudmlzaWJsZVBhZ2VzW2ldLCBjb250cm9sbGVyLCBGbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLCBTdXJ2ZXlQREZNb2R1bGUpO1xuICAgICAgICAgICAgYXdhaXQgc3VydmV5Lm9uUmVuZGVyUGFnZS5maXJlKHN1cnZleSwgYWRvcm5lcnNPcHRpb25zKTtcbiAgICAgICAgICAgIHBhZ2VGbGF0cyA9IFsuLi5hZG9ybmVyc09wdGlvbnMuYnJpY2tzXTtcbiAgICAgICAgICAgIGlmIChpID09PSAwICYmIGZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYXRzWzBdLnB1c2goLi4ucGFnZUZsYXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgZmxhdHMucHVzaChwYWdlRmxhdHMpO1xuICAgICAgICAgICAgdGhpcy5wb3BSb3dsaW5lcyhmbGF0c1tmbGF0cy5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICBwb2ludC55VG9wID0gY29udHJvbGxlci5sZWZ0VG9wUG9pbnQueVRvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3N1cnZleS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DaGVja2JveE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyLCBJUG9pbnQgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIENoZWNrSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMC43O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENIRUNLTUFSS19SRUFET05MWV9TWU1CT0w6IHN0cmluZyA9ICczJztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfRk9OVDogc3RyaW5nID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDSEVDS01BUktfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFOiBudW1iZXIgPSAxLjAgLSBNYXRoLkUgLyAxMC4wO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25DaGVja2JveE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgcHJvdGVjdGVkIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHk6IGJvb2xlYW4sIHByb3RlY3RlZCBjaGVja2VkOiBib29sZWFuKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb247XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkgJiYgU3VydmV5SGVscGVyLmdldFJlYWRvbmx5UmVuZGVyQXMoXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIpICE9PSAnYWNyb2Zvcm0nKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZW5kZXJSZWFkT25seSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoZWNrQm94OiBhbnkgPSBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybUNoZWNrQm94KSgpO1xuICAgICAgICBjb25zdCBmb3JtU2NhbGU6IG51bWJlciA9IFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgY2hlY2tCb3gubWF4Rm9udFNpemUgPSB0aGlzLmhlaWdodCAqIGZvcm1TY2FsZSAqIENoZWNrSXRlbUJyaWNrLkZPTlRfU0laRV9TQ0FMRTtcbiAgICAgICAgY2hlY2tCb3guY2FwdGlvbiA9IENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9TWU1CT0w7XG4gICAgICAgIGNoZWNrQm94LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICBjaGVja0JveC5maWVsZE5hbWUgPSB0aGlzLmZpZWxkTmFtZTtcbiAgICAgICAgY2hlY2tCb3gucmVhZE9ubHkgPSB0aGlzLnJlYWRvbmx5O1xuICAgICAgICBjaGVja0JveC5jb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgICAgICBjaGVja0JveC52YWx1ZSA9IHRoaXMuY2hlY2tlZCA/ICdPbicgOiBmYWxzZTtcbiAgICAgICAgY2hlY2tCb3guQVMgPSB0aGlzLmNoZWNrZWQgPyAnL09uJyA6ICcvT2ZmJztcbiAgICAgICAgY2hlY2tCb3guUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVBY3JvZm9ybVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KHRoaXMsIGZvcm1TY2FsZSkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGNoZWNrQm94KTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrbWFya1BvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQodGhpcywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250TmFtZTogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnROYW1lID0gQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX0ZPTlQ7XG4gICAgICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKlxuICAgICAgICAgICAgICAgIENoZWNrSXRlbUJyaWNrLkNIRUNLTUFSS19SRUFET05MWV9GT05UX1NJWkVfU0NBTEU7XG4gICAgICAgICAgICBjb25zdCBjaGVja21hcmtTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChcbiAgICAgICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfU1lNQk9MKTtcbiAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSBjaGVja21hcmtTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICAgICAgY2hlY2ttYXJrUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIGNoZWNrbWFya1NpemUuaGVpZ2h0IC8gMi4wO1xuICAgICAgICAgICAgY29uc3QgY2hlY2ttYXJrRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIGNoZWNrbWFya1BvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgQ2hlY2tJdGVtQnJpY2suQ0hFQ0tNQVJLX1JFQURPTkxZX1NZTUJPTCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgICg8YW55PmNoZWNrbWFya0ZsYXQudW5mb2xkKClbMF0pLnRleHRDb2xvciA9IHRoaXMudGV4dENvbG9yO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgICAgICBhd2FpdCBjaGVja21hcmtGbGF0LnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnROYW1lID0gb2xkRm9udE5hbWU7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNraXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgSXRlbVZhbHVlLCBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgUmFkaW9Hcm91cFdyYXAsIFJhZGlvSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFkaW9pdGVtJztcbmltcG9ydCB7IEZsYXRTZWxlY3RCYXNlIH0gZnJvbSAnLi9mbGF0X3NlbGVjdGJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhZGlvZ3JvdXAgZXh0ZW5kcyBGbGF0U2VsZWN0QmFzZSB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbDtcbiAgICBwcml2YXRlIHJhZGlvR3JvdXBXcmFwOiBSYWRpb0dyb3VwV3JhcDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblJhZGlvZ3JvdXBNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGdlbmVyYXRlRmxhdEl0ZW0ocmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSxcbiAgICAgICAgaW5kZXg6IG51bWJlciwga2V5Pzogc3RyaW5nLCBjaGVja2VkPzogYm9vbGVhbik6IElQZGZCcmljayB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcCA9IG5ldyBSYWRpb0dyb3VwV3JhcCh0aGlzLnF1ZXN0aW9uLmlkICsgKCh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykgPyAnJyA6IGtleSksXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkpO1xuICAgICAgICAgICAgKDxhbnk+dGhpcy5xdWVzdGlvbikucGRmUmFkaW9Hcm91cFdyYXAgPSB0aGlzLnJhZGlvR3JvdXBXcmFwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJhZGlvR3JvdXBXcmFwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcCA9ICg8YW55PnRoaXMucXVlc3Rpb24pLnBkZlJhZGlvR3JvdXBXcmFwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQ2hlY2tlZDogYm9vbGVhbiA9ICh0eXBlb2YgY2hlY2tlZCA9PT0gJ3VuZGVmaW5lZCcpID9cbiAgICAgICAgICAgIChpdGVtID09PSB0aGlzLnF1ZXN0aW9uLm90aGVySXRlbSA/IHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkIDpcbiAgICAgICAgICAgICAgICAoaXRlbS52YWx1ZSA9PT0gdGhpcy5xdWVzdGlvbi52YWx1ZSB8fFxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMucXVlc3Rpb24uaXNJdGVtU2VsZWN0ZWQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKSkpIDogY2hlY2tlZDtcbiAgICAgICAgcmV0dXJuIG5ldyBSYWRpb0l0ZW1Ccmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICBpbmRleCwgaXNDaGVja2VkLCB0aGlzLnJhZGlvR3JvdXBXcmFwKTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3JhZGlvZ3JvdXAnLCBGbGF0UmFkaW9ncm91cCk7XG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdidXR0b25ncm91cCcsIEZsYXRSYWRpb2dyb3VwKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9yYWRpb2dyb3VwLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcblxuZXhwb3J0IGNsYXNzIFRleHRCb2xkQnJpY2sgZXh0ZW5kcyBUZXh0QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZWN0OiBJUmVjdCwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCB0ZXh0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ2JvbGQnO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZC50cyIsImV4cG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5leHBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmV4cG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBJTWFyZ2luTFIsIElNYXJnaW4sIElEb2NPcHRpb25zLCBEb2NPcHRpb25zLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuZXhwb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3JlcG9zaXRvcnknO1xuZXhwb3J0IHsgSUZsYXRRdWVzdGlvbiwgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9xdWVzdGlvbic7XG5leHBvcnQgeyBGbGF0Qm9vbGVhbiB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfYm9vbGVhbic7XG5leHBvcnQgeyBGbGF0Q2hlY2tib3ggfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2NoZWNrYm94JztcbmV4cG9ydCB7IEZsYXRDdXN0b21Nb2RlbCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfY3VzdG9tX21vZGVsJztcbmV4cG9ydCB7IEZsYXRDb21tZW50IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9jb21tZW50JztcbmV4cG9ydCB7IEZsYXREcm9wZG93biB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfZHJvcGRvd24nO1xuZXhwb3J0IHsgRmxhdEV4cHJlc3Npb24gfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2V4cHJlc3Npb24nO1xuZXhwb3J0IHsgRmxhdEZpbGUgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2ZpbGUnO1xuZXhwb3J0IHsgRmxhdEhUTUwgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2h0bWwnO1xuZXhwb3J0IHsgRmxhdEltYWdlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9pbWFnZSc7XG5leHBvcnQgeyBGbGF0SW1hZ2VQaWNrZXIgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X2ltYWdlcGlja2VyJztcbmV4cG9ydCB7IEZsYXRQYW5lbER5bmFtaWMgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3BhbmVsZHluYW1pYyc7XG5leHBvcnQgeyBGbGF0UmFkaW9ncm91cCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmFkaW9ncm91cCc7XG5leHBvcnQgeyBGbGF0UmFua2luZyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfcmFua2luZyc7XG5leHBvcnQgeyBGbGF0UmF0aW5nIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yYXRpbmcnO1xuZXhwb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UnO1xuZXhwb3J0IHsgRmxhdFNpZ25hdHVyZVBhZCB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfc2lnbmF0dXJlcGFkJztcbmV4cG9ydCB7IEZsYXRUZXh0Ym94IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94JztcbmV4cG9ydCB7IEZsYXRTdXJ2ZXkgfSBmcm9tICcuLi9mbGF0X2xheW91dC9mbGF0X3N1cnZleSc7XG5leHBvcnQgeyBGbGF0TWF0cml4IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXgnO1xuZXhwb3J0IHsgRmxhdE1hdHJpeE11bHRpcGxlIH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhtdWx0aXBsZSc7XG5leHBvcnQgeyBGbGF0TWF0cml4RHluYW1pYyB9IGZyb20gJy4uL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYyc7XG5leHBvcnQgeyBGbGF0TXVsdGlwbGVUZXh0IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9tdWx0aXBsZXRleHQnO1xuZXhwb3J0IHsgUGFnZVBhY2tlciB9IGZyb20gJy4uL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyJztcbmV4cG9ydCB7IEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlcic7XG5leHBvcnQgeyBIb3Jpem9udGFsQWxpZ24sIFZlcnRpY2FsQWxpZ24sIElEcmF3UmVjdE9wdGlvbnMsIElEcmF3VGV4dE9wdGlvbnMsIElEcmF3SW1hZ2VPcHRpb25zLCBEcmF3Q2FudmFzIH0gZnJvbSAnLi4vZXZlbnRfaGFuZGxlci9kcmF3X2NhbnZhcyc7XG5leHBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuZXhwb3J0IHsgQm9vbGVhbkl0ZW1CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2Jvb2xlYW5pdGVtJztcbmV4cG9ydCB7IENoZWNrYm94SXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY2hlY2tib3hpdGVtJztcbmV4cG9ydCB7IENoZWNrSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY2hlY2tpdGVtJztcbmV4cG9ydCB7IENvbW1lbnRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbW1lbnQnO1xuZXhwb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuZXhwb3J0IHsgQ3VzdG9tQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jdXN0b20nO1xuZXhwb3J0IHsgRHJvcGRvd25CcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2Ryb3Bkb3duJztcbmV4cG9ydCB7IEVtcHR5QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9lbXB0eSc7XG5leHBvcnQgeyBIVE1MQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9odG1sJztcbmV4cG9ydCB7IEltYWdlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9pbWFnZSc7XG5leHBvcnQgeyBMaW5rQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9saW5rJztcbmV4cG9ydCB7IFJhZGlvSXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfcmFkaW9pdGVtJztcbmV4cG9ydCB7IFJhbmtpbmdJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbSc7XG5leHBvcnQgeyBSb3dsaW5lQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yb3dsaW5lJztcbmV4cG9ydCB7IFRleHRGaWVsZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGZpZWxkJztcbmV4cG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym9sZCc7XG5leHBvcnQgeyBUZXh0Qm94QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0Ym94JztcbmV4cG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuZXhwb3J0IHsgVGl0bGVQYW5lbEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGl0bGVwYW5lbCc7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2VudHJpZXMvcGRmLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uQ2hlY2tib3hCYXNlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZsYXRTZWxlY3RCYXNlIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hCYXNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ2hlY2tib3hCYXNlPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYWJzdHJhY3QgZ2VuZXJhdGVGbGF0SXRlbShyZWN0OiBJUmVjdCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogSVBkZkJyaWNrO1xuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCk7XG4gICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLFxuICAgICAgICAgICAgcG9pbnQueExlZnQpLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICBjb25zdCB0ZXh0UG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIHRleHRQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBpZiAoaXRlbS5sb2NUZXh0LnJlbmRlcmVkSHRtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgdGV4dFBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubG9jVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW0gPT09IHRoaXMucXVlc3Rpb24ub3RoZXJJdGVtICYmIChpdGVtLnZhbHVlID09PSB0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8XG4gICAgICAgICAgICAodHlwZW9mIHRoaXMucXVlc3Rpb24uaXNPdGhlclNlbGVjdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnF1ZXN0aW9uLmlzT3RoZXJTZWxlY3RlZCkpKSB7XG4gICAgICAgICAgICBjb25zdCBvdGhlclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQoY29tcG9zaXRlRmxhdCk7XG4gICAgICAgICAgICBvdGhlclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUztcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUNvbW1lbnRGbGF0KFxuICAgICAgICAgICAgICAgIG90aGVyUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgU3VydmV5SGVscGVyLk9USEVSX1JPV1NfQ09VTlQsIGZhbHNlLCBpbmRleCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgbGV0IGNvbENvdW50OiBudW1iZXIgPSB0aGlzLnF1ZXN0aW9uLmNvbENvdW50O1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5jb2xDb3VudCA9PSAwKSB7XG4gICAgICAgICAgICBjb2xDb3VudCA9IE1hdGguZmxvb3IoU3VydmV5SGVscGVyLmdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpXG4gICAgICAgICAgICAgICAgLyB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoKSB8fCAxO1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoIDwgY29sQ291bnQpIHtcbiAgICAgICAgICAgICAgICBjb2xDb3VudCA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMucXVlc3Rpb24uY29sQ291bnQgPiAxKSB7XG4gICAgICAgICAgICBjb2xDb3VudCA9IChTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLmNvbENvdW50KSA8XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5NQVRSSVhfQ09MVU1OX1dJRFRIKS53aWR0aCkgPyAxIDogdGhpcy5xdWVzdGlvbi5jb2xDb3VudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGNvbENvdW50ID09IDEpID8gYXdhaXQgdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludCwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcykgOlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUhvcmlzb250YWxseUl0ZW1zKHBvaW50LCBjb2xDb3VudCk7XG5cbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlVmVydGljYWxseUl0ZW1zKHBvaW50OiBJUG9pbnQsIGl0ZW1WYWx1ZXM6IEl0ZW1WYWx1ZVtdKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgaXRlbVZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKGN1cnJQb2ludCwgaXRlbVZhbHVlc1tpXSwgaSk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGl0ZW1GbGF0LnlCb3QgKyBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgZmxhdHMucHVzaChpdGVtRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludDogSVBvaW50LCBjb2xDb3VudDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBsZXQgcm93OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQsIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0KTtcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zZXRDb2x1bW5NYXJnaW5zKHRoaXMuY29udHJvbGxlciwgY29sQ291bnQsIGkgJSBjb2xDb3VudCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKFxuICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlc1tpXSwgaSk7XG4gICAgICAgICAgICByb3cuYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGlmIChpICUgY29sQ291bnQgPT09IGNvbENvdW50IC0gMSB8fCBpID09PSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dMaW5lRmxhdDogSVBkZkJyaWNrID0gU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUG9pbnQocm93KSwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJvd0xpbmVGbGF0LnlCb3QgK1xuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2gocm93LCByb3dMaW5lRmxhdCk7XG4gICAgICAgICAgICAgICAgcm93ID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3NlbGVjdGJhc2UudHMiLCJpbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIFJvd2xpbmVCcmljayBpbXBsZW1lbnRzIElQZGZCcmljayB7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5VG9wOiBudW1iZXI7XG4gICAgeUJvdDogbnVtYmVyO1xuICAgIHB1YmxpYyBpc1BhZ2VCcmVhazogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMueExlZnQgPSByZWN0LnhMZWZ0O1xuICAgICAgICB0aGlzLnhSaWdodCA9IHJlY3QueFJpZ2h0O1xuICAgICAgICB0aGlzLnlUb3AgPSByZWN0LnlUb3A7XG4gICAgICAgIHRoaXMueUJvdCA9IHJlY3QueUJvdDtcbiAgICB9XG4gICAgcHVibGljIGdldCB3aWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy54UmlnaHQgLSB0aGlzLnhMZWZ0O1xuICAgIH1cbiAgICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy55Qm90IC0gdGhpcy55VG9wO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5jb2xvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG9sZERyYXdDb2xvcjogc3RyaW5nID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXREcmF3Q29sb3IoKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RHJhd0NvbG9yKHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy5saW5lKHRoaXMueExlZnQsIHRoaXMueVRvcCwgdGhpcy54UmlnaHQsIHRoaXMueVRvcCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcihvbGREcmF3Q29sb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyB1bmZvbGQoKTogSVBkZkJyaWNrW10ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcm93bGluZS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwsIFF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBUZXh0RmllbGRCcmljayB9IGZyb20gJy4vcGRmX3RleHRmaWVsZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRleHRCb3hCcmljayBleHRlbmRzIFRleHRGaWVsZEJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuID0gdHJ1ZSxcbiAgICAgICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuID0gZmFsc2UsIGluZGV4OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLFxuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaWQgKyAoaXNRdWVzdGlvbiA/ICcnIDogJ19jb21tZW50JyArIGluZGV4KSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRRdWVzdGlvbk9yQ29tbWVudFZhbHVlKDxRdWVzdGlvbj5xdWVzdGlvbiwgaXNRdWVzdGlvbiksXG4gICAgICAgICAgICBpc1F1ZXN0aW9uID8gU3VydmV5SGVscGVyLmdldExvY1N0cmluZygoPFF1ZXN0aW9uVGV4dE1vZGVsPnF1ZXN0aW9uKS5sb2NQbGFjZUhvbGRlcikgOiAnJyxcbiAgICAgICAgICAgIHF1ZXN0aW9uLmlzUmVhZE9ubHksIGlzTXVsdGlsaW5lLFxuICAgICAgICAgICAgKDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbikuaW5wdXRUeXBlKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RleHRib3gudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uVGV4dE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgVGV4dEZpZWxkQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblRleHRNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIHByb3RlY3RlZCBpc1F1ZXN0aW9uOiBib29sZWFuLFxuICAgICAgICBwcm90ZWN0ZWQgZmllbGROYW1lOiBzdHJpbmcsIHByb3RlY3RlZCB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhY2Vob2xkZXI6IHN0cmluZywgcHJvdGVjdGVkIGlzUmVhZE9ubHk6IGJvb2xlYW4sXG4gICAgICAgIHByb3RlY3RlZCBpc011bHRpbGluZTogYm9vbGVhbiwgcHJvdGVjdGVkIGlucHV0VHlwZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0KTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSByZW5kZXJDb2xvclF1ZXN0aW9uKCk6IHZvaWQge1xuICAgICAgICBsZXQgb2xkRmlsbENvbG9yOiBzdHJpbmcgPSB0aGlzLmNvbnRyb2xsZXIuZG9jLmdldEZpbGxDb2xvcigpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnNldEZpbGxDb2xvcih0aGlzLnF1ZXN0aW9uLnZhbHVlIHx8ICdibGFjaycpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLnJlY3QodGhpcy54TGVmdCwgdGhpcy55VG9wLFxuICAgICAgICAgICAgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQsICdGJyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0RmlsbENvbG9yKG9sZEZpbGxDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRUeXBlID09PSAnY29sb3InKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNvbG9yUXVlc3Rpb24oKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbnB1dEZpZWxkOiBhbnkgPSB0aGlzLmlucHV0VHlwZSA9PT0gJ3Bhc3N3b3JkJyA/XG4gICAgICAgICAgICBuZXcgKDxhbnk+dGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVBhc3N3b3JkRmllbGQpKCkgOlxuICAgICAgICAgICAgbmV3ICg8YW55PnRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm1UZXh0RmllbGQpKCk7XG4gICAgICAgIGlucHV0RmllbGQuZmllbGROYW1lID0gdGhpcy5maWVsZE5hbWU7XG4gICAgICAgIGlucHV0RmllbGQuZm9udE5hbWUgPSB0aGlzLmNvbnRyb2xsZXIuZm9udE5hbWU7XG4gICAgICAgIGlucHV0RmllbGQuZm9udFNpemUgPSB0aGlzLmZvbnRTaXplO1xuICAgICAgICBpbnB1dEZpZWxkLmlzVW5pY29kZSA9IFN1cnZleUhlbHBlci5pc0N1c3RvbUZvbnQoXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGlucHV0RmllbGQuZm9udE5hbWUpO1xuICAgICAgICBpZiAodGhpcy5pbnB1dFR5cGUgIT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgICAgIGlucHV0RmllbGQuViA9ICcgJyArIHRoaXMudmFsdWU7XG4gICAgICAgICAgICBpbnB1dEZpZWxkLkRWID0gJyAnICsgdGhpcy5wbGFjZWhvbGRlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlucHV0RmllbGQudmFsdWUgPSAnJztcbiAgICAgICAgaW5wdXRGaWVsZC5tdWx0aWxpbmUgPSB0aGlzLmlzTXVsdGlsaW5lO1xuICAgICAgICBpbnB1dEZpZWxkLnJlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5O1xuICAgICAgICBpbnB1dEZpZWxkLmNvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIGxldCBmb3JtU2NhbGU6IG51bWJlciA9IFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKTtcbiAgICAgICAgaW5wdXRGaWVsZC5tYXhGb250U2l6ZSA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZSAqIGZvcm1TY2FsZTtcbiAgICAgICAgaW5wdXRGaWVsZC5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcywgZm9ybVNjYWxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQoaW5wdXRGaWVsZCk7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyUmVhZE9ubHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucyh0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSB0aGlzLnhSaWdodCk7XG4gICAgICAgIGlmICh0aGlzLmlucHV0VHlwZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJDb2xvclF1ZXN0aW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBTdXJ2ZXlIZWxwZXIucmVuZGVyUmVhZE9ubHlUZXh0RmllbGQodGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldFF1ZXN0aW9uT3JDb21tZW50RGlzcGxheVZhbHVlKHRoaXMucXVlc3Rpb24sIHRoaXMuaXNRdWVzdGlvbiksXG4gICAgICAgICAgICAgICAgIXRoaXMuaXNNdWx0aWxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQudHMiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMThfXztcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJyb290XCI6XCJqc3BkZlwiLFwiY29tbW9uanMyXCI6XCJqc3BkZlwiLFwiY29tbW9uanNcIjpcImpzcGRmXCIsXCJhbWRcIjpcImpzcGRmXCJ9XG4vLyBtb2R1bGUgaWQgPSAxOFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgeyBJUmVjdCwgSU1hcmdpbiwgSVNpemUsIERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2ssIFBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBUZXh0Qm9sZEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dGJvbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbi8qKlxuICogSG9yaXpvbnRhbCBhbGlnbm1lbnQgdHlwZXMgaW4gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgZW51bSBIb3Jpem9udGFsQWxpZ24ge1xuICAgIE5vdFNldCA9ICdub3RzZXQnLFxuICAgIExlZnQgPSAnbGVmdCcsXG4gICAgQ2VudGVyID0gJ2NlbnRlcicsXG4gICAgUmlnaHQgPSAncmlnaHQnXG59XG4vKipcbiAqIFZlcnRpY2FsIGFsaWdubWVudCB0eXBlcyBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBlbnVtIFZlcnRpY2FsQWxpZ24ge1xuICAgIE5vdFNldCA9ICdub3RzZXQnLFxuICAgIFRvcCA9ICd0b3AnLFxuICAgIE1pZGRsZSA9ICdtaWRkbGUnLFxuICAgIEJvdHRvbSA9ICdib3R0b20nXG59XG4vKipcbiAqIENvbW1vbiBvcHRpb25zIG9mIHJlbmRlcmluZyB0ZXh0IGFuZCBpbWFnZXMgaW4gb25SZW5kZXJIZWFkZXIgYW5kIG9uUmVuZGVyRm9vdGVyIGV2ZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBob3Jpem9udGFsIGFsaWdubWVudCBvZiBpdGVtLCBpZiBzZXQgKGNlbnRlciBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIGhvcml6b250YWxBbGlnbj86IEhvcml6b250YWxBbGlnbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdmVydGljYWwgYWxpZ25tZW50IG9mIGl0ZW0sIGlmIHNldCAobWlkZGxlIGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgdmVydGljYWxBbGlnbj86IFZlcnRpY2FsQWxpZ247XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIG1hcmdpbnMgaW5zaWRlIHRoZSBkcmF3aW5nIHJlY3RhbmdsZSAodXNlZCBpZiBhbGlnbm1lbnQgc2V0LCBhbGwgemVybyBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIG1hcmdpbnM/OiBJTWFyZ2luO1xuICAgIC8qKlxuICAgICAqIE9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIHRleHQgcmVjdGFuZ2xlICh1c2VkIGlmIGFsaWdubWVudCBub3Qgc2V0KVxuICAgICAqL1xuICAgIHJlY3Q/OiBJUmVjdDtcbn1cbi8qKlxuICogT3B0aW9ucyBvZiByZW5kZXJpbmcgdGV4dCBpbiBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURyYXdUZXh0T3B0aW9ucyBleHRlbmRzIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFN0cmluZyB0aGF0IHdpbGwgYmUgZHJhd25cbiAgICAgKi9cbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRm9udCBzaXplIG9mIHRleHQgKDE0IGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgZm9udFNpemU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU2V0IHRydWUgdG8gbWFrZSB0ZXh0IGJvbGQgKGZhbHNlIGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgaXNCb2xkPzogYm9vbGVhbjtcbn1cbi8qKlxuICogT3B0aW9ucyBvZiByZW5kZXJpbmcgaW1hZ2VzIGluIG9uUmVuZGVySGVhZGVyIGFuZCBvblJlbmRlckZvb3RlciBldmVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRHJhd0ltYWdlT3B0aW9ucyBleHRlbmRzIElEcmF3UmVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBpbWFnZSB3aWR0aCAodXNlZCBpZiBhbGlnbm1lbnQgc2V0LCBjYW52YXMucmVjdCdzIHdpZHRoIGJ5IGRlZmF1bHQpXG4gICAgICovXG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGltYWdlIGhlaWdodCAodXNlZCBpZiBhbGlnbm1lbnQgc2V0LCBjYW52YXMucmVjdCdzIGhlaWdodCBieSBkZWZhdWx0KVxuICAgICAqL1xuICAgIGhlaWdodD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdHJpbmcgd2l0aCBiYXNlNjQgZW5jb2RlZCBpbWFnZVxuICAgICAqL1xuICAgIGJhc2U2NDogc3RyaW5nO1xufVxuXG4vKipcbiAqIERyYXdDYW52YXMgb2JqZWN0IHBhc3NlZCB0byBvblJlbmRlckhlYWRlciBhbmQgb25SZW5kZXJGb290ZXIgZXZlbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBEcmF3Q2FudmFzIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHBhY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcHVibGljIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByb3RlY3RlZCBfcmVjdDogSVJlY3QsXG4gICAgICAgIHByb3RlY3RlZCBfY291bnRQYWdlczogbnVtYmVyLFxuICAgICAgICBwcm90ZWN0ZWQgX3BhZ2VOdW1iZXI6IG51bWJlcikgeyB9XG4gICAgLyoqXG4gICAgICogQ291bnQgb2YgcGFnZXMgaW4gdGhlIGRvY3VtZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBjb3VudFBhZ2VzKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudFBhZ2VzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYWdlIG51bWJlciBmcm9tIDFcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VOdW1iZXIoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VOdW1iZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9iamVjdCB3aXRoIGNvb3JkaW5hdGVzIG9mIHRoZSByZWN0YW5nbGUgYXZhaWxhYmxlIGZvciBkcmF3aW5nXG4gICAgICogQHNlZSBJUmVjdFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVjdCgpOiBJUmVjdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWN0O1xuICAgIH1cbiAgICBwcml2YXRlIGFsaWduUmVjdChyZWN0T3B0aW9uczogSURyYXdSZWN0T3B0aW9ucywgaXRlbVNpemU6IElTaXplKTogSVJlY3Qge1xuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zID0geyBsZWZ0OiAwLjAsIHJpZ2h0OiAwLjAsIHRvcDogMC4wLCBib3Q6IDAuMCB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgPSAwLjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLnJlY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlY3RPcHRpb25zLmhvcml6b250YWxBbGlnbiA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPT09IEhvcml6b250YWxBbGlnbi5Ob3RTZXQpIHtcbiAgICAgICAgICAgICAgICByZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24gPSBIb3Jpem9udGFsQWxpZ24uQ2VudGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWN0T3B0aW9ucy52ZXJ0aWNhbEFsaWduID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgICAgIHJlY3RPcHRpb25zLnZlcnRpY2FsQWxpZ24gPT09IFZlcnRpY2FsQWxpZ24uTm90U2V0KSB7XG4gICAgICAgICAgICAgICAgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiA9IFZlcnRpY2FsQWxpZ24uTWlkZGxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNsb25lKHRoaXMucmVjdCk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMuaG9yaXpvbnRhbEFsaWduICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc3dpdGNoIChyZWN0T3B0aW9ucy5ob3Jpem9udGFsQWxpZ24pIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5MZWZ0OlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gdGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICByZWN0LnhSaWdodCA9IE1hdGgubWluKHRoaXMucmVjdC54UmlnaHQgLSByZWN0T3B0aW9ucy5tYXJnaW5zLnJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0ICsgaXRlbVNpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEhvcml6b250YWxBbGlnbi5DZW50ZXI6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueExlZnQgPSBNYXRoLm1heCh0aGlzLnJlY3QueExlZnQgKyByZWN0T3B0aW9ucy5tYXJnaW5zLmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnhMZWZ0ICsgdGhpcy5yZWN0LnhSaWdodCAtIGl0ZW1TaXplLndpZHRoKSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gTWF0aC5taW4odGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnhMZWZ0ICsgdGhpcy5yZWN0LnhSaWdodCArIGl0ZW1TaXplLndpZHRoKSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSG9yaXpvbnRhbEFsaWduLlJpZ2h0OlxuICAgICAgICAgICAgICAgICAgICByZWN0LnhMZWZ0ID0gTWF0aC5tYXgodGhpcy5yZWN0LnhMZWZ0ICsgcmVjdE9wdGlvbnMubWFyZ2lucy5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQgLSBpdGVtU2l6ZS53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueFJpZ2h0ID0gdGhpcy5yZWN0LnhSaWdodCAtIHJlY3RPcHRpb25zLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdC54TGVmdCA9IHJlY3RPcHRpb25zLnJlY3QueExlZnQgfHwgdGhpcy5yZWN0LnhMZWZ0O1xuICAgICAgICAgICAgcmVjdC54UmlnaHQgPSByZWN0T3B0aW9ucy5yZWN0LnhSaWdodCB8fCB0aGlzLnJlY3QueFJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVjdE9wdGlvbnMudmVydGljYWxBbGlnbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocmVjdE9wdGlvbnMudmVydGljYWxBbGlnbikge1xuICAgICAgICAgICAgICAgIGNhc2UgVmVydGljYWxBbGlnbi5Ub3A6XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueVRvcCA9IHRoaXMucmVjdC55VG9wICsgcmVjdE9wdGlvbnMubWFyZ2lucy50b3A7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWluKHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wICsgaXRlbVNpemUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWZXJ0aWNhbEFsaWduLk1pZGRsZTpcbiAgICAgICAgICAgICAgICAgICAgcmVjdC55VG9wID0gTWF0aC5tYXgodGhpcy5yZWN0LnlUb3AgKyByZWN0T3B0aW9ucy5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLnJlY3QueVRvcCArIHRoaXMucmVjdC55Qm90IC0gaXRlbVNpemUuaGVpZ2h0KSAvIDIuMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWluKHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5yZWN0LnlUb3AgKyB0aGlzLnJlY3QueUJvdCArIGl0ZW1TaXplLmhlaWdodCkgLyAyLjApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFZlcnRpY2FsQWxpZ24uQm90dG9tOlxuICAgICAgICAgICAgICAgICAgICByZWN0LnlUb3AgPSBNYXRoLm1heCh0aGlzLnJlY3QueVRvcCArIHJlY3RPcHRpb25zLm1hcmdpbnMudG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0LnlCb3QgLSByZWN0T3B0aW9ucy5tYXJnaW5zLmJvdCAtIGl0ZW1TaXplLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY3QueUJvdCA9IHRoaXMucmVjdC55Qm90IC0gcmVjdE9wdGlvbnMubWFyZ2lucy5ib3Q7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVjdC55VG9wID0gcmVjdE9wdGlvbnMucmVjdC55VG9wIHx8IHRoaXMucmVjdC55VG9wO1xuICAgICAgICAgICAgcmVjdC55Qm90ID0gcmVjdE9wdGlvbnMucmVjdC55Qm90IHx8IHRoaXMucmVjdC55Qm90O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoaXMgbWV0aG9kIHRvIGRyYXcgdGV4dFxuICAgICAqIEBwYXJhbSB0ZXh0T3B0aW9ucyBTZXQgb3B0aW9ucyBvZiB0aGUgZHJhd24gdGV4dFxuICAgICAqL1xuICAgIHB1YmxpYyBkcmF3VGV4dCh0ZXh0T3B0aW9uczogSURyYXdUZXh0T3B0aW9ucyk6IHZvaWQge1xuICAgICAgICB0ZXh0T3B0aW9ucyA9IFN1cnZleUhlbHBlci5jbG9uZSh0ZXh0T3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dE9wdGlvbnMuZm9udFNpemUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0ZXh0T3B0aW9ucy5mb250U2l6ZSA9IERvY09wdGlvbnMuRk9OVF9TSVpFO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dE9wdGlvbnMuaXNCb2xkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGV4dE9wdGlvbnMuaXNCb2xkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4dFNpemU6IElTaXplID0gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KHRleHRPcHRpb25zLnRleHQsXG4gICAgICAgICAgICB0ZXh0T3B0aW9ucy5pc0JvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJywgdGV4dE9wdGlvbnMuZm9udFNpemUpO1xuICAgICAgICBjb25zdCB0ZXh0UmVjdDogSVJlY3QgPSB0aGlzLmFsaWduUmVjdCh0ZXh0T3B0aW9ucywgdGV4dFNpemUpO1xuICAgICAgICBpZiAoIXRleHRPcHRpb25zLmlzQm9sZCkge1xuICAgICAgICAgICAgdGhpcy5wYWNrcy5wdXNoKG5ldyBUZXh0QnJpY2sobnVsbCwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRleHRSZWN0LCB0ZXh0T3B0aW9ucy50ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhY2tzLnB1c2gobmV3IFRleHRCb2xkQnJpY2sobnVsbCwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIHRleHRSZWN0LCB0ZXh0T3B0aW9ucy50ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgICAgKDxQZGZCcmljaz50aGlzLnBhY2tzW3RoaXMucGFja3MubGVuZ3RoIC0gMV0pLmZvbnRTaXplID0gdGV4dE9wdGlvbnMuZm9udFNpemU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgdGhpcyBtZXRob2QgdG8gZHJhdyBpbWFnZVxuICAgICAqIEBwYXJhbSBpbWFnZU9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZHJhd0ltYWdlKGltYWdlT3B0aW9uczogSURyYXdJbWFnZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaW1hZ2VPcHRpb25zID0gU3VydmV5SGVscGVyLmNsb25lKGltYWdlT3B0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgaW1hZ2VPcHRpb25zLndpZHRoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgaW1hZ2VPcHRpb25zLndpZHRoID0gdGhpcy5yZWN0LnhSaWdodCAtIHRoaXMucmVjdC54TGVmdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGltYWdlT3B0aW9ucy5oZWlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpbWFnZU9wdGlvbnMuaGVpZ2h0ID0gdGhpcy5yZWN0LnlCb3QgLSB0aGlzLnJlY3QueVRvcDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbWFnZVNpemU6IElTaXplID0ge1xuICAgICAgICAgICAgd2lkdGg6IGltYWdlT3B0aW9ucy53aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogaW1hZ2VPcHRpb25zLmhlaWdodFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpbWFnZVJlY3Q6IElSZWN0ID0gdGhpcy5hbGlnblJlY3QoaW1hZ2VPcHRpb25zLCBpbWFnZVNpemUpO1xuICAgICAgICB0aGlzLnBhY2tzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChpbWFnZVJlY3QsIHRydWUsIHRydWUpLFxuICAgICAgICAgICAgbnVsbCwgdGhpcy5jb250cm9sbGVyLCBpbWFnZU9wdGlvbnMuYmFzZTY0LFxuICAgICAgICAgICAgaW1hZ2VSZWN0LnhSaWdodCAtIGltYWdlUmVjdC54TGVmdCxcbiAgICAgICAgICAgIGltYWdlUmVjdC55Qm90IC0gaW1hZ2VSZWN0LnlUb3ApKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvZHJhd19jYW52YXMudHMiLCJpbXBvcnQgeyBFdmVudCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRHJhd0NhbnZhcyB9IGZyb20gJy4vZHJhd19jYW52YXMnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBFdmVudEFzeW5jPFQgZXh0ZW5kcyBGdW5jdGlvbiwgT3B0aW9ucz4gZXh0ZW5kcyBFdmVudDxULCBPcHRpb25zPiB7XG4gICAgcHVibGljIHVuc2hpZnQoZnVuYzogVCkge1xuICAgICAgICBpZiAodGhpcy5oYXNGdW5jKGZ1bmMpKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrcyA9IG5ldyBBcnJheTxUPigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FsbGJhY2tzLnVuc2hpZnQoZnVuYyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBmaXJlKHNlbmRlcjogYW55LCBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbGxiYWNrcyA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FsbGJhY2tzW2ldKHNlbmRlciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyIHtcbiAgICBwdWJsaWMgc3RhdGljIHByb2Nlc3NfaGVhZGVyX2V2ZW50cyhzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcGFja3M6IElQZGZCcmlja1tdW10pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFzdXJ2ZXkuaGF2ZUNvbW1lcmNpYWxMaWNlbnNlKSB7XG4gICAgICAgICAgICBzdXJ2ZXkub25SZW5kZXJIZWFkZXIuYWRkKChfLCBjYW52YXMpID0+IHtcbiAgICAgICAgICAgICAgICBjYW52YXMuZHJhd1RleHQoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiAnU3VydmV5SlMgUERGIHwgUGxlYXNlIHB1cmNoYXNlIGEgU3VydmV5SlMgUERGIGRldmVsb3BlciBsaWNlbnNlIHRvIHVzZSBpdCBpbiB5b3VyIGFwcCB8IGh0dHBzOi8vc3VydmV5anMuaW8vQnV5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IDEwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN1cnZleS5vblJlbmRlckhlYWRlci5maXJlKHN1cnZleSwgbmV3IERyYXdDYW52YXMocGFja3NbaV0sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZUhlYWRlclJlY3QoY29udHJvbGxlciksIHBhY2tzLmxlbmd0aCwgaSArIDEpKTtcbiAgICAgICAgICAgIHN1cnZleS5vblJlbmRlckZvb3Rlci5maXJlKHN1cnZleSwgbmV3IERyYXdDYW52YXMocGFja3NbaV0sIGNvbnRyb2xsZXIsXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmNyZWF0ZUZvb3RlclJlY3QoY29udHJvbGxlciksIHBhY2tzLmxlbmd0aCwgaSArIDEpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZXZlbnRfaGFuZGxlci9ldmVudF9oYW5kbGVyLnRzIiwiaW1wb3J0IHtcbiAgICBJUXVlc3Rpb24sIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25Nb2RlbEJhc2UsIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFRhYmxlLFxuICAgIFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvdywgUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkQ2VsbCwgU2VyaWFsaXplciwgUGFuZWxNb2RlbFxufSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElGbGF0UXVlc3Rpb24sIEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0U2VsZWN0QmFzZSB9IGZyb20gJy4vZmxhdF9zZWxlY3RiYXNlJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfdGV4dCc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcbmltcG9ydCB7IEZsYXRTdXJ2ZXkgfSBmcm9tICcuL2ZsYXRfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRNYXRyaXhNdWx0aXBsZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBHQVBfQkVUV0VFTl9ST1dTOiBudW1iZXIgPSAwLjU7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByb3RlY3RlZCBpc011bHRpcGxlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbk1hdHJpeERyb3Bkb3duTW9kZWxCYXNlPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNDZWxsKHBvaW50OiBJUG9pbnQsIGNlbGw6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZENlbGwsXG4gICAgICAgIGlzSGVhZGVyOiBib29sZWFuKTogUHJvbWlzZTxDb21wb3NpdGVCcmljaz4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGlmIChjZWxsLmhhc1F1ZXN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoY2VsbC5jZWxsLmNvbHVtbi5pc1Nob3dJbk11bHRpcGxlQ29sdW1ucykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZsYXRNdWx0aXBsZUNvbHVtbnNRdWVzdGlvbjogSUZsYXRRdWVzdGlvbiA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgY2VsbC5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBjZWxsLnF1ZXN0aW9uLmdldFR5cGUoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLm1vdmVSZWN0KFN1cnZleUhlbHBlci5zY2FsZVJlY3QoXG4gICAgICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpLFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KTtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soKDxGbGF0U2VsZWN0QmFzZT5mbGF0TXVsdGlwbGVDb2x1bW5zUXVlc3Rpb24pXG4gICAgICAgICAgICAgICAgICAgIC5nZW5lcmF0ZUZsYXRJdGVtKGl0ZW1SZWN0LCBjZWxsLml0ZW0sIGNlbGwuY2hvaWNlSW5kZXgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNlbGwucXVlc3Rpb24udGl0bGVMb2NhdGlvbiA9IFN1cnZleUhlbHBlci5USVRMRV9MT0NBVElPTl9NQVRSSVg7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKC4uLmF3YWl0IFN1cnZleUhlbHBlci5nZW5lcmF0ZVF1ZXN0aW9uRmxhdHMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCB0aGlzLmNvbnRyb2xsZXIsIGNlbGwucXVlc3Rpb24sIHBvaW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2VsbC5oYXNUaXRsZSkge1xuICAgICAgICAgICAgaWYgKGlzSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVCb2xkVGV4dEZsYXQocG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgY2VsbC5sb2NUaXRsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tcG9zaXRlLmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChwb2ludCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBjZWxsLmxvY1RpdGxlLCBUZXh0QnJpY2spKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dIb3Jpc29udGFsKHBvaW50OiBJUG9pbnQsIHJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LFxuICAgICAgICBjb2xDb3VudDogbnVtYmVyLCBjb2x1bW5XaWR0aDogbnVtYmVyW10pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBsZXQgbGFzdFJpZ2h0TWFyZ2luOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgK1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9DT0xVTU5TO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgbGV0IGNudCA9IDA7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHRoaXMucXVlc3Rpb24uZGV0YWlsUGFuZWxNb2RlICE9PSAnbm9uZScgPyAxIDogMDsgaSA8IHJvdy5jZWxscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNudCA9PSBjb2xDb3VudCkgYnJlYWs7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSBsYXN0UmlnaHRNYXJnaW4gK1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fQ09MVU1OUztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgLSBjb2x1bW5XaWR0aFtjbnRdO1xuICAgICAgICAgICAgbGFzdFJpZ2h0TWFyZ2luID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMucmlnaHQ7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgY29uc3QgY2VsbENvbnRlbnQ6IENvbXBvc2l0ZUJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ2VsbChcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQsIHJvdy5jZWxsc1tpXSwgcm93ID09PSB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuaGVhZGVyUm93KTtcbiAgICAgICAgICAgIGlmICghY2VsbENvbnRlbnQuaXNFbXB0eSkge1xuICAgICAgICAgICAgICAgIGNvbXBvc2l0ZS5hZGRCcmljayhjZWxsQ29udGVudCk7XG4gICAgICAgICAgICAgICAgY250Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRzUm93VmVydGljYWwocG9pbnQ6IElQb2ludCwgcm93OiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRSb3csXG4gICAgICAgIGNvbENvdW50OiBudW1iZXIpOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZTogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgTWF0aC5taW4oY29sQ291bnQsIHJvdy5jZWxscy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuc2hvd0hlYWRlciAmJiAoIXRoaXMuaXNNdWx0aXBsZSB8fCBpID4gMCkpIHtcbiAgICAgICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ2VsbChjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZS5oZWFkZXJSb3cuY2VsbHNbaV0sIGZhbHNlKSk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjb21wb3NpdGUueUJvdCArIEZsYXRNYXRyaXhNdWx0aXBsZS5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb21wb3NpdGUuYWRkQnJpY2soYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzQ2VsbChjdXJyUG9pbnQsIHJvdy5jZWxsc1tpXSwgZmFsc2UpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gY29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGU7XG4gICAgfVxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10sIGNvbENvdW50OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikgLVxuICAgICAgICAgICAgKGNvbENvdW50IC0gMSkgKiB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0NPTFVNTlM7XG4gICAgICAgIGxldCByZW1haW5XaWR0aDogbnVtYmVyID0gYXZhaWxhYmxlV2lkdGg7XG4gICAgICAgIGxldCByZW1haW5Db2xDb3VudDogbnVtYmVyID0gY29sQ291bnQ7XG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgY29sQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5wYXJzZVdpZHRoKHJvd3NbMF0uY2VsbHNbaV0ud2lkdGgsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGgsIGNvbENvdW50KSB8fCAwLjA7XG4gICAgICAgICAgICByZW1haW5XaWR0aCAtPSB3aWR0aDtcbiAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gMC4wKSByZW1haW5Db2xDb3VudC0tO1xuICAgICAgICAgICAgY29sdW1uV2lkdGgucHVzaCh3aWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbWFpbkNvbENvdW50ID09PSAwKSByZXR1cm4gY29sdW1uV2lkdGg7XG4gICAgICAgIGNvbnN0IGhldXJpc3RpY1dpZHRoOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoO1xuICAgICAgICBjb25zdCBjb2x1bW5NaW5XaWR0aDogbnVtYmVyID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgoXG4gICAgICAgICAgICByb3dzWzBdLmNlbGxzWzBdLm1pbldpZHRoLCByZW1haW5XaWR0aCwgY29sQ291bnQpIHx8IDAuMDtcbiAgICAgICAgY29uc3QgZXF1YWxXaWR0aDogbnVtYmVyID0gcmVtYWluV2lkdGggLyByZW1haW5Db2xDb3VudDtcbiAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IE1hdGgubWF4KGhldXJpc3RpY1dpZHRoLCBjb2x1bW5NaW5XaWR0aCwgZXF1YWxXaWR0aCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBjb2x1bW5XaWR0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNvbHVtbldpZHRoW2ldID09PSAwLjApIGNvbHVtbldpZHRoW2ldID0gd2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbHVtbldpZHRoO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlT25lUm93KHBvaW50OiBJUG9pbnQsIHJvdzogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93LFxuICAgICAgICBjb2xDb3VudDogbnVtYmVyLCBpc1dpZGU6IGJvb2xlYW4sIGNvbHVtbldpZHRoOiBudW1iZXJbXSk6IFByb21pc2U8Q29tcG9zaXRlQnJpY2s+IHtcbiAgICAgICAgaWYgKGlzV2lkZSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd0hvcmlzb250YWwocG9pbnQsIHJvdywgY29sQ291bnQsIGNvbHVtbldpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzUm93VmVydGljYWwocG9pbnQsIHJvdywgY29sQ291bnQpO1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRmxhdHNSb3dzKHBvaW50OiBJUG9pbnQsIHJvd3M6IFF1ZXN0aW9uTWF0cml4RHJvcGRvd25SZW5kZXJlZFJvd1tdLFxuICAgICAgICBjb2xDb3VudDogbnVtYmVyLCBpc1dpZGU6IGJvb2xlYW4pOiBQcm9taXNlPENvbXBvc2l0ZUJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb3dGbGF0OiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVPbmVSb3coY3VyclBvaW50LCByb3dzW2ldLCBjb2xDb3VudCxcbiAgICAgICAgICAgICAgICBpc1dpZGUsIHRoaXMuY2FsY3VsYXRlQ29sdW1uV2lkdGgocm93cywgY29sQ291bnQpKTtcbiAgICAgICAgICAgIGlmIChyb3dGbGF0LmlzRW1wdHkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93RmxhdC55Qm90O1xuICAgICAgICAgICAgICAgIHJvd0ZsYXQuYWRkQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KGN1cnJQb2ludCwgdGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dzRmxhdHMucHVzaChyb3dGbGF0KTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gcm93RmxhdC55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcblxuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uZGV0YWlsUGFuZWxNb2RlICE9PSAnbm9uZScgJiYgaSA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RGV0YWlsUGFuZWw6IFBhbmVsTW9kZWwgPSB0aGlzLnF1ZXN0aW9uLmRldGFpbFBhbmVsVmFsdWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjdXJyZW50RGV0YWlsUGFuZWwucXVlc3Rpb25zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXRhaWxQYW5lbC5xdWVzdGlvbnNbal0uaWQgKz0gJ18nICsgaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWxCcmlja3M6IElQZGZCcmlja1tdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzUGFuZWwoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VydmV5LCB0aGlzLmNvbnRyb2xsZXIsIGN1cnJlbnREZXRhaWxQYW5lbCwgY3VyclBvaW50KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJDb21wb3NpdGU6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgICAgICAgICAgY3VyckNvbXBvc2l0ZS5hZGRCcmljayguLi5wYW5lbEJyaWNrcyk7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSBjdXJyQ29tcG9zaXRlLnlCb3QgKyBGbGF0TWF0cml4TXVsdGlwbGUuR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2goY3VyckNvbXBvc2l0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IHJvd3MubGVuZ3RoIC0gMSAmJiB0aGlzLnF1ZXN0aW9uLnJlbmRlcmVkVGFibGUuc2hvd0hlYWRlciAmJiBpc1dpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyOiBDb21wb3NpdGVCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVPbmVSb3coY3VyclBvaW50LCByb3dzWzBdLCBjb2xDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzV2lkZSwgdGhpcy5jYWxjdWxhdGVDb2x1bW5XaWR0aChyb3dzLCBjb2xDb3VudCkpO1xuICAgICAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IGhlYWRlci55Qm90ICsgRmxhdE1hdHJpeE11bHRpcGxlLkdBUF9CRVRXRUVOX1JPV1MgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgcm93c0ZsYXRzLnB1c2goaGVhZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHRhYmxlOiBRdWVzdGlvbk1hdHJpeERyb3Bkb3duUmVuZGVyZWRUYWJsZSA9IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRUYWJsZTtcbiAgICAgICAgY29uc3QgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IHRoaXMucXVlc3Rpb24uY29sdW1uTGF5b3V0ID09PSAndmVydGljYWwnO1xuICAgICAgICBjb25zdCBjb2xDb3VudDogbnVtYmVyID0gdGFibGUucm93c1swXSA/IHRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoIC1cbiAgICAgICAgICAgICh0YWJsZS5oYXNSZW1vdmVSb3dzICYmICFpc1ZlcnRpY2FsID8gKHRoaXMucXVlc3Rpb24uZGV0YWlsUGFuZWxNb2RlICE9PSAnbm9uZScgPyAyIDogMSkgOiAwKSA6XG4gICAgICAgICAgICB0YWJsZS5zaG93SGVhZGVyICYmIHRhYmxlLmhlYWRlclJvdyA/IHRhYmxlLmhlYWRlclJvdy5jZWxscy5sZW5ndGggOlxuICAgICAgICAgICAgICAgIHRhYmxlLnNob3dGb290ZXIgJiYgdGFibGUuZm9vdGVyUm93ID8gdGFibGUuZm9vdGVyUm93LmNlbGxzLmxlbmd0aCA6IDA7XG4gICAgICAgIGlmIChjb2xDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtuZXcgQ29tcG9zaXRlQnJpY2soU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KHBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgcm93czogUXVlc3Rpb25NYXRyaXhEcm9wZG93blJlbmRlcmVkUm93W10gPSBbXTtcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoOiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIuZ2V0Q29sdW1uV2lkdGgodGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCk7XG4gICAgICAgIGNvbnN0IGlzV2lkZTogYm9vbGVhbiA9IHRoaXMucXVlc3Rpb24ucmVuZGVyQXMgIT09ICdsaXN0JyAmJlxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hdHJpeFJlbmRlckFzICE9PSAnbGlzdCcgJiZcbiAgICAgICAgICAgIGNlbGxXaWR0aCA+PSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoU3VydmV5SGVscGVyLk1BVFJJWF9DT0xVTU5fV0lEVEgpLndpZHRoO1xuICAgICAgICBpZiAodGFibGUuc2hvd0hlYWRlciAmJiBpc1dpZGUpIHJvd3MucHVzaCh0YWJsZS5oZWFkZXJSb3cpO1xuICAgICAgICByb3dzLnB1c2goLi4udGFibGUucm93cyk7XG4gICAgICAgIGlmICh0YWJsZS5oYXNSZW1vdmVSb3dzICYmIGlzVmVydGljYWwpIHJvd3MucG9wKCk7XG4gICAgICAgIGlmICh0YWJsZS5zaG93Rm9vdGVyICYmIGlzV2lkZSkgcm93cy5wdXNoKHRhYmxlLmZvb3RlclJvdyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdHNSb3dzKHBvaW50LCByb3dzLCBjb2xDb3VudCwgaXNXaWRlKTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ21hdHJpeGRyb3Bkb3duJywgJ3JlbmRlckFzJyk7XG5TZXJpYWxpemVyLmFkZFByb3BlcnR5KCdtYXRyaXhkcm9wZG93bicsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeGRyb3Bkb3duJywgRmxhdE1hdHJpeE11bHRpcGxlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9tYXRyaXhtdWx0aXBsZS50cyIsImltcG9ydCBJbnRlcnZhbFRyZWUgZnJvbSAnbm9kZS1pbnRlcnZhbC10cmVlJztcbmltcG9ydCB7IERvY09wdGlvbnMsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuaW50ZXJmYWNlIFBhY2tJbnRlcnZhbCB7XG4gICAgcGFnZUluZGV4OiBudW1iZXI7XG4gICAgeExlZnQ6IG51bWJlcjtcbiAgICB4UmlnaHQ6IG51bWJlcjtcbiAgICB5Qm90OiBudW1iZXI7XG4gICAgYWJzQm90OiBudW1iZXI7XG59XG5leHBvcnQgY2xhc3MgUGFnZVBhY2tlciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluZEJvdEludGVydmFsKHRyZWU6IEludGVydmFsVHJlZTxQYWNrSW50ZXJ2YWw+LFxuICAgICAgICB4TGVmdDogbnVtYmVyLCB4UmlnaHQ6IG51bWJlciwgb3B0aW9uczogRG9jT3B0aW9ucyk6IFBhY2tJbnRlcnZhbCB7XG4gICAgICAgIGNvbnN0IGludGVydmFsczogUGFja0ludGVydmFsW10gPSB0cmVlLnNlYXJjaCh4TGVmdCwgeFJpZ2h0KTtcbiAgICAgICAgaW50ZXJ2YWxzLnB1c2goe1xuICAgICAgICAgICAgcGFnZUluZGV4OiAwLCB4TGVmdDpcbiAgICAgICAgICAgICAgICBvcHRpb25zLm1hcmdpbnMubGVmdCwgeFJpZ2h0OiBvcHRpb25zLm1hcmdpbnMubGVmdCxcbiAgICAgICAgICAgIHlCb3Q6IG9wdGlvbnMubWFyZ2lucy50b3AsIGFic0JvdDogb3B0aW9ucy5tYXJnaW5zLnRvcFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGludGVydmFscy5yZWR1Y2UoKG14LCBjcikgPT4ge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNyLnhSaWdodCAtIHhMZWZ0KSA8IFN1cnZleUhlbHBlci5FUFNJTE9OIHx8XG4gICAgICAgICAgICAgICAgTWF0aC5hYnMoY3IueExlZnQgLSB4UmlnaHQpIDwgU3VydmV5SGVscGVyLkVQU0lMT04pIHJldHVybiBteDtcbiAgICAgICAgICAgIGlmIChjci5wYWdlSW5kZXggPCBteC5wYWdlSW5kZXgpIHJldHVybiBteDtcbiAgICAgICAgICAgIGlmIChjci5wYWdlSW5kZXggPiBteC5wYWdlSW5kZXgpIHJldHVybiBjcjtcbiAgICAgICAgICAgIHJldHVybiBjci55Qm90ID4gbXgueUJvdCA/IGNyIDogbXg7XG4gICAgICAgIH0sIGludGVydmFsc1tpbnRlcnZhbHMubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgICBwcml2YXRlIHN0YXRpYyBhZGRQYWNrKHBhY2tzOiBJUGRmQnJpY2tbXVtdLCBpbmRleDogbnVtYmVyLCBicmljazogSVBkZkJyaWNrKSB7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IHBhY2tzLmxlbmd0aDsgaSA8PSBpbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBwYWNrcy5wdXNoKFtdKTtcbiAgICAgICAgfVxuICAgICAgICBwYWNrc1tpbmRleF0ucHVzaChicmljayk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgcGFjayhmbGF0czogSVBkZkJyaWNrW11bXSwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcik6IElQZGZCcmlja1tdW10ge1xuICAgICAgICBjb25zdCBwYWdlSGVpZ2h0OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC1cbiAgICAgICAgICAgIGNvbnRyb2xsZXIubWFyZ2lucy50b3AgLSBjb250cm9sbGVyLm1hcmdpbnMuYm90O1xuICAgICAgICBjb25zdCB1bmZvbGRGbGF0czogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBmbGF0cy5mb3JFYWNoKChmbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRGbGF0cy5wdXNoKFtdKTtcbiAgICAgICAgICAgIGZsYXRzUGFnZS5mb3JFYWNoKChmbGF0OiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZmxhdC5oZWlnaHQgPiBwYWdlSGVpZ2h0ICsgU3VydmV5SGVscGVyLkVQU0lMT04pIHtcbiAgICAgICAgICAgICAgICAgICAgdW5mb2xkRmxhdHNbdW5mb2xkRmxhdHMubGVuZ3RoIC0gMV0ucHVzaCguLi5mbGF0LnVuZm9sZCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB1bmZvbGRGbGF0c1t1bmZvbGRGbGF0cy5sZW5ndGggLSAxXS5wdXNoKGZsYXQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB1bmZvbGRGbGF0cy5mb3JFYWNoKCh1bmZvbGRGbGF0c1BhZ2U6IElQZGZCcmlja1tdKSA9PiB7XG4gICAgICAgICAgICB1bmZvbGRGbGF0c1BhZ2Uuc29ydCgoYTogSVBkZkJyaWNrLCBiOiBJUGRmQnJpY2spID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYS55VG9wIDwgYi55VG9wKSByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgaWYgKGEueVRvcCA+IGIueVRvcCkgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgaWYgKGEueExlZnQgPiBiLnhMZWZ0KSByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICBpZiAoYS54TGVmdCA8IGIueExlZnQpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHBhZ2VJbmRleE1vZGVsOiBudW1iZXIgPSAwO1xuICAgICAgICBjb25zdCBwYWNrczogSVBkZkJyaWNrW11bXSA9IFtdO1xuICAgICAgICBjb25zdCBwYWdlQm90OiBudW1iZXIgPSBjb250cm9sbGVyLnBhcGVySGVpZ2h0IC0gY29udHJvbGxlci5tYXJnaW5zLmJvdDtcbiAgICAgICAgdW5mb2xkRmxhdHMuZm9yRWFjaCgodW5mb2xkRmxhdHNQYWdlOiBJUGRmQnJpY2tbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJlZTogSW50ZXJ2YWxUcmVlPFBhY2tJbnRlcnZhbD4gPSBuZXcgSW50ZXJ2YWxUcmVlKCk7XG4gICAgICAgICAgICBsZXQgcGFnZUluZGV4U2hpZnQ6IG51bWJlciA9IDA7XG4gICAgICAgICAgICB1bmZvbGRGbGF0c1BhZ2UuZm9yRWFjaCgoZmxhdDogSVBkZkJyaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHsgcGFnZUluZGV4LCB5Qm90LCBhYnNCb3QgfSA9IFBhZ2VQYWNrZXIuZmluZEJvdEludGVydmFsKFxuICAgICAgICAgICAgICAgICAgICB0cmVlLCBmbGF0LnhMZWZ0LCBmbGF0LnhSaWdodCwgY29udHJvbGxlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSBmbGF0LmhlaWdodDtcbiAgICAgICAgICAgICAgICBmbGF0LnlUb3AgPSB5Qm90ICsgZmxhdC55VG9wIC0gYWJzQm90O1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhmbGF0LnlUb3AgLSBjb250cm9sbGVyLm1hcmdpbnMudG9wKSA+IFN1cnZleUhlbHBlci5FUFNJTE9OICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYXQueVRvcCArIGhlaWdodCA+IHBhZ2VCb3QgKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTiB8fCBmbGF0LmlzUGFnZUJyZWFrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZsYXQueVRvcCA9IGNvbnRyb2xsZXIubWFyZ2lucy50b3A7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VJbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXhTaGlmdCA9IE1hdGgubWF4KHBhZ2VJbmRleFNoaWZ0LCBwYWdlSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cmVlLmluc2VydChmbGF0LnhMZWZ0LCBmbGF0LnhSaWdodCwge1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXg6IHBhZ2VJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgeExlZnQ6IGZsYXQueExlZnQsIHhSaWdodDogZmxhdC54UmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHlCb3Q6IGZsYXQueVRvcCArIGhlaWdodCwgYWJzQm90OiBmbGF0LnlCb3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmbGF0LnlCb3QgPSBmbGF0LnlUb3AgKyBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgUGFnZVBhY2tlci5hZGRQYWNrKHBhY2tzLCBwYWdlSW5kZXhNb2RlbCArIHBhZ2VJbmRleCwgZmxhdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhZ2VJbmRleE1vZGVsICs9IHBhZ2VJbmRleFNoaWZ0ICsgMTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwYWNrcztcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BhZ2VfbGF5b3V0L3BhZ2VfcGFja2VyLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuXG5leHBvcnQgY2xhc3MgQm9vbGVhbkl0ZW1CcmljayBleHRlbmRzIENoZWNrSXRlbUJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5pZCxcbiAgICAgICAgICAgIHF1ZXN0aW9uLmlzUmVhZE9ubHksXG4gICAgICAgICAgICAoPFF1ZXN0aW9uQm9vbGVhbk1vZGVsPnF1ZXN0aW9uKS5jaGVja2VkVmFsdWUpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfYm9vbGVhbml0ZW0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uQ2hlY2tib3hNb2RlbCwgSXRlbVZhbHVlIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBDaGVja0l0ZW1CcmljayB9IGZyb20gJy4vcGRmX2NoZWNraXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBDaGVja2JveEl0ZW1CcmljayBleHRlbmRzIENoZWNrSXRlbUJyaWNrIHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwgcmVjdCxcbiAgICAgICAgICAgICg8UXVlc3Rpb25DaGVja2JveE1vZGVsPnF1ZXN0aW9uKS5pZCArICdpbmRleCcgKyBpbmRleCxcbiAgICAgICAgICAgIHF1ZXN0aW9uLmlzUmVhZE9ubHkgfHwgIWl0ZW0uaXNFbmFibGVkLFxuICAgICAgICAgICAgKDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb24pLmlzSXRlbVNlbGVjdGVkKGl0ZW0pKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2NoZWNrYm94aXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgVGV4dEJveEJyaWNrIH0gZnJvbSAnLi9wZGZfdGV4dGJveCc7XG5cbmV4cG9ydCBjbGFzcyBDb21tZW50QnJpY2sgZXh0ZW5kcyBUZXh0Qm94QnJpY2sge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVjdDogSVJlY3QsIGlzUXVlc3Rpb246IGJvb2xlYW4sIGluZGV4OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHN1cGVyKHF1ZXN0aW9uLCBjb250cm9sbGVyLCByZWN0LCBpc1F1ZXN0aW9uLCB0cnVlLCBpbmRleCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9jb21tZW50LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkRyb3Bkb3duTW9kZWwsIEl0ZW1WYWx1ZSB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIERyb3Bkb3duQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkRyb3Bkb3duTW9kZWw7XG4gICAgcHJvdGVjdGVkIGlzUXVlc3Rpb246IGJvb2xlYW47XG4gICAgcHJvdGVjdGVkIGlzTXVsdGlsaW5lOiBib29sZWFuO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihxdWVzdGlvbjogSVF1ZXN0aW9uLFxuICAgICAgICBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVjdDogSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjb21ib0JveCA9IG5ldyAoPGFueT50aGlzLmNvbnRyb2xsZXIuZG9jLkFjcm9Gb3JtQ29tYm9Cb3gpKCk7XG4gICAgICAgIGNvbWJvQm94LmZpZWxkTmFtZSA9IHRoaXMucXVlc3Rpb24uaWQ7XG4gICAgICAgIGNvbWJvQm94LlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdCh0aGlzLFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5mb3JtU2NhbGUodGhpcy5jb250cm9sbGVyLCB0aGlzKSkpO1xuICAgICAgICBjb21ib0JveC5lZGl0ID0gZmFsc2U7XG4gICAgICAgIGNvbWJvQm94LmNvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnNob3dPcHRpb25zQ2FwdGlvbikge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHRoaXMucXVlc3Rpb24ub3B0aW9uc0NhcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVlc3Rpb24udmlzaWJsZUNob2ljZXMuZm9yRWFjaCgoaXRlbTogSXRlbVZhbHVlKSA9PiB7XG4gICAgICAgICAgICBvcHRpb25zLnB1c2goU3VydmV5SGVscGVyLmdldExvY1N0cmluZyhpdGVtLmxvY1RleHQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbWJvQm94LnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIGNvbWJvQm94LmZvbnROYW1lID0gdGhpcy5jb250cm9sbGVyLmZvbnROYW1lO1xuICAgICAgICBjb21ib0JveC5mb250U2l6ZSA9IHRoaXMuZm9udFNpemU7XG4gICAgICAgIGNvbWJvQm94LnJlYWRPbmx5ID0gdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5O1xuICAgICAgICBjb21ib0JveC5pc1VuaWNvZGUgPSBTdXJ2ZXlIZWxwZXIuaXNDdXN0b21Gb250KFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCBjb21ib0JveC5mb250TmFtZSk7XG4gICAgICAgIGNvbWJvQm94LlYgPSBTdXJ2ZXlIZWxwZXIuZ2V0RHJvcGRvd25RdWVzdGlvblZhbHVlKHRoaXMucXVlc3Rpb24pO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZG9jLmFkZEZpZWxkKGNvbWJvQm94KTtcbiAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKHRoaXMueExlZnQsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucGFwZXJXaWR0aCAtIHRoaXMueFJpZ2h0KTtcbiAgICAgICAgYXdhaXQgU3VydmV5SGVscGVyLnJlbmRlclJlYWRPbmx5VGV4dEZpZWxkKHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbiwgdGhpcyxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXREcm9wZG93blF1ZXN0aW9uVmFsdWUodGhpcy5xdWVzdGlvbiksICEodGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5ICYmIHRoaXMuY29udHJvbGxlci50ZXh0RmllbGRSZW5kZXJBcyA9PT0gJ211bHRpTGluZScpKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2Ryb3Bkb3duLnRzIiwiaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRW1wdHlCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIGlzQm9yZGVyVmlzaWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocmVjdDogSVJlY3QsXG4gICAgICAgIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyID0gbnVsbCxcbiAgICAgICAgaXNCb3JkZXJWaXNpYmxlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIobnVsbCwgY29udHJvbGxlciwgcmVjdCk7XG4gICAgICAgIHRoaXMuaXNCb3JkZXJWaXNpYmxlID0gaXNCb3JkZXJWaXNpYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzaXplQm9yZGVyKGlzSW5jcmVhc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29lZjogbnVtYmVyID0gaXNJbmNyZWFzZSA/IDEgOiAtMTtcbiAgICAgICAgY29uc3QgYm9yZGVyUGFkZGluZzogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmRvYy5nZXRGb250U2l6ZSgpICogU3VydmV5SGVscGVyLlZBTFVFX1JFQURPTkxZX1BBRERJTkdfU0NBTEU7XG4gICAgICAgIHRoaXMueExlZnQgLT0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgICAgIHRoaXMueFJpZ2h0ICs9IGNvZWYgKiBib3JkZXJQYWRkaW5nO1xuICAgICAgICB0aGlzLnlCb3QgKz0gY29lZiAqIGJvcmRlclBhZGRpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5pc0JvcmRlclZpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplQm9yZGVyKHRydWUpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnJlbmRlckZsYXRCb3JkZXJzKHRoaXMuY29udHJvbGxlciwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZUJvcmRlcihmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2VtcHR5LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcblxuZXhwb3J0IGNsYXNzIEhUTUxCcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIG1hcmdpbnM6IHsgdG9wOiBudW1iZXIsIGJvdHRvbTogbnVtYmVyIH07XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgaHRtbDogc3RyaW5nLCBpc0ltYWdlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICBpZiAoaXNJbWFnZSkge1xuICAgICAgICAgICAgdGhpcy5tYXJnaW5zID0ge1xuICAgICAgICAgICAgICAgIHRvcDogMC4wLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogMC4wXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXJnaW5zID0ge1xuICAgICAgICAgICAgICAgIHRvcDogY29udHJvbGxlci5tYXJnaW5zLnRvcCxcbiAgICAgICAgICAgICAgICBib3R0b206IGNvbnRyb2xsZXIubWFyZ2lucy5ib3RcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHJlbmRlckludGVyYWN0aXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgb2xkRm9udFNpemU6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gdGhpcy5mb250U2l6ZTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuZnJvbUhUTUwodGhpcy5odG1sLCB0aGlzLnhMZWZ0LCB0aGlzLnlUb3AsIHtcbiAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCwgcGFnZXNwbGl0OiB0cnVlLFxuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJykpLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlbDogSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC5uYW1lLmxhc3RJbmRleE9mKCdqc1BERmh0bWxUZXh0JywgMCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgdGhpcy5tYXJnaW5zKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5mb250U2l6ZSA9IG9sZEZvbnRTaXplO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfaHRtbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfYnJpY2snO1xuaW1wb3J0IHsgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQb2ludCB9IGZyb20gJy4uL2VudHJpZXMvcGRmJztcblxuZXhwb3J0IGNsYXNzIEltYWdlQnJpY2sgZXh0ZW5kcyBQZGZCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsIHByb3RlY3RlZCBpbWFnZTogc3RyaW5nLFxuICAgICAgICBwb2ludDogSVBvaW50LCBwcm90ZWN0ZWQgb3JpZ2luYWxXaWR0aDogbnVtYmVyLCBwcm90ZWN0ZWQgb3JpZ2luYWxIZWlnaHQ6IG51bWJlcikge1xuICAgICAgICBzdXBlcihxdWVzdGlvbiwgY29udHJvbGxlciwge1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0LFxuICAgICAgICAgICAgeFJpZ2h0OiBwb2ludC54TGVmdCArIChvcmlnaW5hbFdpZHRoIHx8IDApLFxuICAgICAgICAgICAgeVRvcDogcG9pbnQueVRvcCxcbiAgICAgICAgICAgIHlCb3Q6IHBvaW50LnlUb3AgKyAob3JpZ2luYWxIZWlnaHQgfHwgMClcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNQYWdlQnJlYWsgPSB0aGlzLm9yaWdpbmFsSGVpZ2h0ID09PSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkSW1hZ2UodGhpcy5pbWFnZSwgdGhpcy54TGVmdCwgdGhpcy55VG9wLCB0aGlzLm9yaWdpbmFsV2lkdGgsIHRoaXMub3JpZ2luYWxIZWlnaHQpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2ltYWdlLnRzIiwiaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0JztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgTGlua0JyaWNrIGV4dGVuZHMgVGV4dEJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTQ0FMRV9GQUNUT1JfTUFHSUM6IG51bWJlciA9IDAuOTU1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09MT1I6IHN0cmluZyA9ICcjMDAwMEVFJztcbiAgICBwdWJsaWMgY29uc3RydWN0b3IodGV4dEZsYXQ6IFRleHRCcmljaywgcHJvdGVjdGVkIGxpbms6IHN0cmluZykge1xuICAgICAgICBzdXBlcigoPExpbmtCcmljaz50ZXh0RmxhdCkucXVlc3Rpb24sXG4gICAgICAgICAgICAoPExpbmtCcmljaz50ZXh0RmxhdCkuY29udHJvbGxlcixcbiAgICAgICAgICAgIHRleHRGbGF0LCAoPExpbmtCcmljaz50ZXh0RmxhdCkudGV4dCk7XG4gICAgICAgIHRoaXMudGV4dENvbG9yID0gTGlua0JyaWNrLkNPTE9SO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRUZXh0Q29sb3I6IHN0cmluZyA9IHRoaXMuY29udHJvbGxlci5kb2MuZ2V0VGV4dENvbG9yKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKFN1cnZleUhlbHBlci5CQUNLR1JPVU5EX0NPTE9SKTtcbiAgICAgICAgbGV0IGRlc2NlbnQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICpcbiAgICAgICAgICAgICh0aGlzLmNvbnRyb2xsZXIuZG9jLmdldExpbmVIZWlnaHRGYWN0b3IoKSAtXG4gICAgICAgICAgICAgICAgTGlua0JyaWNrLlNDQUxFX0ZBQ1RPUl9NQUdJQyk7XG4gICAgICAgIGxldCB5VG9wTGluazogbnVtYmVyID0gdGhpcy55VG9wICtcbiAgICAgICAgICAgICh0aGlzLnlCb3QgLSB0aGlzLnlUb3ApIC0gZGVzY2VudDtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmRvYy50ZXh0V2l0aExpbmsodGhpcy50ZXh0LCB0aGlzLnhMZWZ0LFxuICAgICAgICAgICAgeVRvcExpbmssIHsgdXJsOiB0aGlzLmxpbmsgfSk7XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2Muc2V0VGV4dENvbG9yKG9sZFRleHRDb2xvcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJSZWFkT25seSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKDxRdWVzdGlvbj50aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAhPT0gJ3RleHQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHN1cGVyLnJlbmRlckludGVyYWN0aXZlKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9saW5rLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIElTaXplLCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBSYWRpb0dyb3VwV3JhcCB7XG4gICAgcHJpdmF0ZSBfcmFkaW9Hcm91cDogYW55O1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHByaXZhdGUgX3JlYWRPbmx5OiBib29sZWFuKSB7XG4gICAgfVxuICAgIHB1YmxpYyBhZGRUb1BkZihjb2xvcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAgPSBuZXcgdGhpcy5jb250cm9sbGVyLmRvYy5BY3JvRm9ybVJhZGlvQnV0dG9uKCk7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAuZmllbGROYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLnZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMuX3JhZGlvR3JvdXAucmVhZE9ubHkgPSB0aGlzLnJlYWRPbmx5O1xuICAgICAgICB0aGlzLl9yYWRpb0dyb3VwLmNvbG9yID0gY29sb3I7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuYWRkRmllbGQodGhpcy5fcmFkaW9Hcm91cCk7XG4gICAgfVxuICAgIGdldCByYWRpb0dyb3VwKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yYWRpb0dyb3VwO1xuICAgIH1cbiAgICBnZXQgcmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkT25seTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRpb0l0ZW1CcmljayBleHRlbmRzIFBkZkJyaWNrIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSQURJT01BUktFUl9SRUFET05MWV9TWU1CT0w6IHN0cmluZyA9ICfigKInO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFJBRElPTUFSS0VSX1JFQURPTkxZX0ZPTlRfU0laRV9TQ0FMRTogbnVtYmVyID0gMS41NzU7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcml2YXRlIGluZGV4OiBudW1iZXIsIHByaXZhdGUgY2hlY2tlZDogYm9vbGVhbixcbiAgICAgICAgcHJpdmF0ZSByYWRpb0dyb3VwV3JhcDogUmFkaW9Hcm91cFdyYXApIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnJhZGlvR3JvdXBXcmFwLnJlYWRPbmx5ICYmIFN1cnZleUhlbHBlci5nZXRSZWFkb25seVJlbmRlckFzKFxuICAgICAgICAgICAgPFF1ZXN0aW9uPnRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcikgIT09ICdhY3JvZm9ybScpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlbmRlclJlYWRPbmx5KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaW5kZXggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yYWRpb0dyb3VwV3JhcC5hZGRUb1BkZih0aGlzLmZvcm1Cb3JkZXJDb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMucmFkaW9Hcm91cFdyYXAubmFtZSArICdpbmRleCcgKyB0aGlzLmluZGV4O1xuICAgICAgICBsZXQgcmFkaW9CdXR0b246IGFueSA9IHRoaXMucmFkaW9Hcm91cFdyYXAucmFkaW9Hcm91cC5jcmVhdGVPcHRpb24obmFtZSk7XG4gICAgICAgIHJhZGlvQnV0dG9uLlJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlQWNyb2Zvcm1SZWN0KHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgICAgICByYWRpb0J1dHRvbi5BUyA9ICcvJyArIG5hbWU7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAudmFsdWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmFkaW9CdXR0b24uQVMgPSAnL09mZic7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZvcm1TY2FsZTogbnVtYmVyID0gU3VydmV5SGVscGVyLmZvcm1TY2FsZSh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICByYWRpb0J1dHRvbi5SZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QodGhpcywgZm9ybVNjYWxlKSk7XG4gICAgICAgIHJhZGlvQnV0dG9uLmNvbG9yID0gdGhpcy5mb3JtQm9yZGVyQ29sb3I7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICB0aGlzLnJhZGlvR3JvdXBXcmFwLnJhZGlvR3JvdXAuc2V0QXBwZWFyYW5jZShcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5kb2MuQWNyb0Zvcm0uQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVyUmVhZE9ubHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBpZiAodGhpcy5jaGVja2VkKSB7XG4gICAgICAgICAgICBsZXQgcmFkaW9tYXJrZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRoaXMsIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgbGV0IG9sZEZvbnRTaXplOiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICAgICAgbGV0IHJhZGlvbWFya2VyU2l6ZTogSVNpemUgPSB0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoXG4gICAgICAgICAgICAgICAgUmFkaW9JdGVtQnJpY2suUkFESU9NQVJLRVJfUkVBRE9OTFlfU1lNQk9MKTtcbiAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQueExlZnQgKz0gdGhpcy53aWR0aCAvIDIuMCAtIHJhZGlvbWFya2VyU2l6ZS53aWR0aCAvIDIuMDtcbiAgICAgICAgICAgIHJhZGlvbWFya2VyUG9pbnQueVRvcCArPSB0aGlzLmhlaWdodCAvIDIuMCAtIHJhZGlvbWFya2VyU2l6ZS5oZWlnaHQgLyAxLjk7XG4gICAgICAgICAgICBsZXQgcmFkaW9tYXJrZXJGbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoXG4gICAgICAgICAgICAgICAgcmFkaW9tYXJrZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIFJhZGlvSXRlbUJyaWNrLlJBRElPTUFSS0VSX1JFQURPTkxZX1NZTUJPTCwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgICg8YW55PnJhZGlvbWFya2VyRmxhdC51bmZvbGQoKVswXSkudGV4dENvbG9yID0gdGhpcy50ZXh0Q29sb3I7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICAgICAgICAgIGF3YWl0IHJhZGlvbWFya2VyRmxhdC5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfcmFkaW9pdGVtLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblJhbmtpbmdNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElSZWN0LCBJU2l6ZSwgRG9jQ29udHJvbGxlciwgSVBvaW50IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrLCBQZGZCcmljayB9IGZyb20gJy4vcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuL3BkZl9jaGVja2l0ZW0nO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBSYW5raW5nSXRlbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25SYW5raW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCBwcm90ZWN0ZWQgbnVtYmVyOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFua2luZ01vZGVsPnF1ZXN0aW9uO1xuICAgICAgICB0aGlzLnRleHRDb2xvciA9IHRoaXMuZm9ybUJvcmRlckNvbG9yO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIFN1cnZleUhlbHBlci5yZW5kZXJGbGF0Qm9yZGVycyh0aGlzLmNvbnRyb2xsZXIsIHRoaXMpO1xuICAgICAgICBjb25zdCBudW1iZXJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KHRoaXMsIHRydWUsIHRydWUpO1xuICAgICAgICBjb25zdCBvbGRGb250U2l6ZTogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLmZvbnRTaXplO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZSAqXG4gICAgICAgICAgICBDaGVja0l0ZW1Ccmljay5DSEVDS01BUktfUkVBRE9OTFlfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBjb25zdCBudW1iZXJTaXplOiBJU2l6ZSA9IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dCh0aGlzLm51bWJlcik7XG4gICAgICAgIG51bWJlclBvaW50LnhMZWZ0ICs9IHRoaXMud2lkdGggLyAyLjAgLSBudW1iZXJTaXplLndpZHRoIC8gMi4wO1xuICAgICAgICBudW1iZXJQb2ludC55VG9wICs9IHRoaXMuaGVpZ2h0IC8gMi4wIC0gbnVtYmVyU2l6ZS5oZWlnaHQgLyAyLjA7XG4gICAgICAgIGNvbnN0IG51bWJlckZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIG51bWJlclBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMubnVtYmVyLCBUZXh0QnJpY2spO1xuICAgICAgICAoPGFueT5udW1iZXJGbGF0LnVuZm9sZCgpWzBdKS50ZXh0Q29sb3IgPSB0aGlzLnRleHRDb2xvcjtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemU7XG4gICAgICAgIGF3YWl0IG51bWJlckZsYXQucmVuZGVyKCk7XG4gICAgfVxufVxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbS50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCb2xkQnJpY2sgfSBmcm9tICcuL3BkZl90ZXh0Ym9sZCc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIFRpdGxlUGFuZWxCcmljayBleHRlbmRzIFRleHRCb2xkQnJpY2sge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIHRleHQpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVuZGVySW50ZXJhY3RpdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCBvbGRGb250U2l6ZSA9IHRoaXMuY29udHJvbGxlci5mb250U2l6ZTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLmZvbnRTaXplID0gb2xkRm9udFNpemUgKiBTdXJ2ZXlIZWxwZXIuVElUTEVfUEFORUxfRk9OVF9TSVpFX1NDQUxFO1xuICAgICAgICBhd2FpdCBzdXBlci5yZW5kZXJJbnRlcmFjdGl2ZSgpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIuZm9udFNpemUgPSBvbGRGb250U2l6ZTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX3RpdGxlcGFuZWwudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFBhbmVsTW9kZWwsIFBhZ2VNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi4vZmxhdF9sYXlvdXQvZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcblxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzQmFzZU9wdGlvbnMge1xuICAgIHB1YmxpYyBwb2ludDogSVBvaW50O1xuICAgIHB1YmxpYyBicmlja3M6IElQZGZCcmlja1tdO1xuICAgIHB1YmxpYyBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyO1xuICAgIHB1YmxpYyByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeTtcbiAgICBwdWJsaWMgbW9kdWxlOiBhbnk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHRoaXMucG9pbnQgPSBwb2ludDtcbiAgICAgICAgdGhpcy5icmlja3MgPSBicmlja3M7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IGNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBZG9ybmVyc09wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcXVlc3Rpb246IElRdWVzdGlvbjtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocG9pbnQ6IElQb2ludCwgYnJpY2tzOiBJUGRmQnJpY2tbXSxcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcixcbiAgICAgICAgcmVwb3NpdG9yeTogRmxhdFJlcG9zaXRvcnksIG1vZHVsZTogYW55KSB7XG4gICAgICAgIHN1cGVyKHBvaW50LCBicmlja3MsIGNvbnRyb2xsZXIsIHJlcG9zaXRvcnksIG1vZHVsZSk7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSBxdWVzdGlvbjtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWRvcm5lcnNQYW5lbE9wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcGFuZWw6IFBhbmVsTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBvaW50OiBJUG9pbnQsIGJyaWNrczogSVBkZkJyaWNrW10sXG4gICAgICAgIHBhbmVsOiBQYW5lbE1vZGVsLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyLFxuICAgICAgICByZXBvc2l0b3J5OiBGbGF0UmVwb3NpdG9yeSwgbW9kdWxlOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocG9pbnQsIGJyaWNrcywgY29udHJvbGxlciwgcmVwb3NpdG9yeSwgbW9kdWxlKTtcbiAgICAgICAgdGhpcy5wYW5lbCA9IHBhbmVsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFkb3JuZXJzUGFnZU9wdGlvbnMgZXh0ZW5kcyBBZG9ybmVyc0Jhc2VPcHRpb25zIHtcbiAgICBwdWJsaWMgcGFnZTogUGFnZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwb2ludDogSVBvaW50LCBicmlja3M6IElQZGZCcmlja1tdLFxuICAgICAgICBwYWdlOiBQYWdlTW9kZWwsIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlcG9zaXRvcnk6IEZsYXRSZXBvc2l0b3J5LCBtb2R1bGU6IGFueSkge1xuICAgICAgICBzdXBlcihwb2ludCwgYnJpY2tzLCBjb250cm9sbGVyLCByZXBvc2l0b3J5LCBtb2R1bGUpO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIH1cbn1cblxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIExvY2FsaXphYmxlU3RyaW5nLCBRdWVzdGlvbkJvb2xlYW5Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEJvb2xlYW5JdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9ib29sZWFuaXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRCb29sZWFuIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQm9vbGVhbk1vZGVsO1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25Cb29sZWFuTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljaygpO1xuICAgICAgICBjb25zdCBoZWlnaHQ6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gbmV3IEJvb2xlYW5JdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5zY2FsZVJlY3QoU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QocG9pbnQsIGhlaWdodCwgaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBwb2ludC54TGVmdCkpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgbG9jTGFiZWxUZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IHRoaXMucXVlc3Rpb24uaXNJbmRldGVybWluYXRlID8gbnVsbCA6XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLmNoZWNrZWRWYWx1ZSA/IHRoaXMucXVlc3Rpb24ubG9jTGFiZWxUcnVlIDogdGhpcy5xdWVzdGlvbi5sb2NMYWJlbEZhbHNlO1xuICAgICAgICBpZiAobG9jTGFiZWxUZXh0ICE9PSBudWxsICYmIGxvY0xhYmVsVGV4dC5yZW5kZXJlZEh0bWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBsb2NMYWJlbFRleHQsIFRleHRCcmljaykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbY29tcG9zaXRlRmxhdF07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdib29sZWFuJywgRmxhdEJvb2xlYW4pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2Jvb2xlYW4udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25DaGVja2JveE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFNlbGVjdEJhc2UgfSBmcm9tICcuL2ZsYXRfc2VsZWN0YmFzZSc7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IENoZWNrYm94SXRlbUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY2hlY2tib3hpdGVtJztcblxuZXhwb3J0IGNsYXNzIEZsYXRDaGVja2JveCBleHRlbmRzIEZsYXRTZWxlY3RCYXNlIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ2hlY2tib3hNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkNoZWNrYm94TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBnZW5lcmF0ZUZsYXRJdGVtKHJlY3Q6IElSZWN0LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBJUGRmQnJpY2sge1xuICAgICAgICByZXR1cm4gbmV3IENoZWNrYm94SXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgcmVjdCwgaXRlbSwgaW5kZXgpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignY2hlY2tib3gnLCBGbGF0Q2hlY2tib3gpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2NoZWNrYm94LnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkNvbW1lbnRNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRDb21tZW50IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uQ29tbWVudE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uQ29tbWVudE1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgcmV0dXJuIFthd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICBwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnJvd3MsIHRydWUpXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2NvbW1lbnQnLCBGbGF0Q29tbWVudCk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfY29tbWVudC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25DdXN0b21Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0Q3VzdG9tTW9kZWwgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBmbGF0ID0gRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGUodGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5nZXRUeXBlKCkpO1xuICAgICAgICByZXR1cm4gZmxhdC5nZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludCk7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdjdXN0b21fbW9kZWwnLCBGbGF0Q3VzdG9tTW9kZWwpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2N1c3RvbV9tb2RlbC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25Ecm9wZG93bk1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBEcm9wZG93bkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfZHJvcGRvd24nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RHJvcGRvd24gZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25Ecm9wZG93bk1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRHJvcGRvd25Nb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IHJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3QocG9pbnQsIHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLmlzUmVhZE9ubHkgJiYgdGhpcy5jb250cm9sbGVyLnRleHRGaWVsZFJlbmRlckFzID09PSAnbXVsdGlMaW5lJykge1xuICAgICAgICAgICAgY29uc3QgcmVjdFdpdGhEaW5hbWljQm90dG9tOiBJUmVjdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVSZWFkT25seVRleHRGaWVsZFRleHRGbGF0KFxuICAgICAgICAgICAgICAgIHBvaW50LCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24sIFN1cnZleUhlbHBlci5nZXREcm9wZG93blF1ZXN0aW9uVmFsdWUodGhpcy5xdWVzdGlvbiksIGZhbHNlKTtcbiAgICAgICAgICAgIHJlY3QueUJvdCA9IE1hdGgubWF4KHJlY3QueUJvdCwgcmVjdFdpdGhEaW5hbWljQm90dG9tLnlCb3QgKyB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5WQUxVRV9SRUFET05MWV9QQURESU5HX1NDQUxFKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb3NpdGVGbGF0OiBDb21wb3NpdGVCcmljayA9IG5ldyBDb21wb3NpdGVCcmljayhcbiAgICAgICAgICAgIG5ldyBEcm9wZG93bkJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgcmVjdCkpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5pc090aGVyU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG90aGVyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVGbGF0KTtcbiAgICAgICAgICAgIG90aGVyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTO1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlQ29tbWVudEZsYXQoXG4gICAgICAgICAgICAgICAgb3RoZXJQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBTdXJ2ZXlIZWxwZXIuT1RIRVJfUk9XU19DT1VOVCwgZmFsc2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUZsYXRdO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZHJvcGRvd24nLCBGbGF0RHJvcGRvd24pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2Ryb3Bkb3duLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgVGV4dEZpZWxkQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0ZmllbGQnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RXhwcmVzc2lvbiBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbkV4cHJlc3Npb25Nb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uRXhwcmVzc2lvbk1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgcmV0dXJuIFtuZXcgVGV4dEZpZWxkQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCByZWN0LCB0cnVlLFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pZCwgdGhpcy5xdWVzdGlvbi5kaXNwbGF5VmFsdWUsICcnLCB0cnVlLCBmYWxzZSwgJ3RleHQnKV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdleHByZXNzaW9uJywgRmxhdEV4cHJlc3Npb24pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X2V4cHJlc3Npb24udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIFF1ZXN0aW9uRmlsZU1vZGVsLCBzdXJ2ZXlMb2NhbGl6YXRpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJU2l6ZSwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHQnO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0RmlsZSBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBJTUFHRV9HQVBfU0NBTEU6IG51bWJlciA9IDAuMTk1O1xuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVEVYVF9NSU5fU0NBTEU6IG51bWJlciA9IDUuMDtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uRmlsZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25GaWxlTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCBpdGVtOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsXG4gICAgfSk6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVMaW5rRmxhdChcbiAgICAgICAgICAgIHBvaW50LCB0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIGl0ZW0ubmFtZSA9PT0gdW5kZWZpbmVkID8gJ2ltYWdlJyA6IGl0ZW0ubmFtZSwgaXRlbS5jb250ZW50KSk7XG4gICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuY2FuUHJldmlld0ltYWdlKHRoaXMucXVlc3Rpb24sIGl0ZW0sIGl0ZW0uY29udGVudCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGltYWdlU2l6ZTogSVNpemUgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuZ2V0SW1hZ2VTaXplKGl0ZW0uY29udGVudCk7XG4gICAgICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VTaXplLndpZHRoID0gU3VydmV5SGVscGVyLnBhcnNlV2lkdGgodGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoLCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucXVlc3Rpb24uaW1hZ2VIZWlnaHQpIHsgLy8gVE9ETzogd2Ugc2hvdWxkbid0IHVzZSBnZXRQYWdlQXZhaWxhYmxlV2lkdGggaGVyZVxuICAgICAgICAgICAgICAgIGltYWdlU2l6ZS5oZWlnaHQgPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh0aGlzLnF1ZXN0aW9uLmltYWdlSGVpZ2h0LCBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW1hZ2VQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICAgICAgaW1hZ2VQb2ludC55VG9wICs9IHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0ICogRmxhdEZpbGUuSU1BR0VfR0FQX1NDQUxFO1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlSW1hZ2VGbGF0KGltYWdlUG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaXRlbS5jb250ZW50LCBpbWFnZVNpemUud2lkdGgsIGltYWdlU2l6ZS5oZWlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9zaXRlRmxhdDtcbiAgICB9XG4gICAgcHJpdmF0ZSBhZGRMaW5lKHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSwgY3VyclBvaW50OiBJUG9pbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGluZGV4ICE9PSB0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICByb3dzRmxhdHMucHVzaChuZXcgQ29tcG9zaXRlQnJpY2soKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uLnByZXZpZXdWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGbGF0KHBvaW50LCB0aGlzLnF1ZXN0aW9uLFxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgc3VydmV5TG9jYWxpemF0aW9uLmdldFN0cmluZygnbm9GaWxlQ2hvc2VuJyksIFRleHRCcmljayldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgbGV0IHlCb3Q6IG51bWJlciA9IGN1cnJQb2ludC55VG9wO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW06IHsgbmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB9ID0gdGhpcy5xdWVzdGlvbi5wcmV2aWV3VmFsdWVbaV07XG4gICAgICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0IC0gY3VyclBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgaWYgKFN1cnZleUhlbHBlci5jYW5QcmV2aWV3SW1hZ2UodGhpcy5xdWVzdGlvbiwgaXRlbSwgaXRlbS5jb250ZW50KSkge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZW50V2lkdGggPSAoYXdhaXQgU3VydmV5SGVscGVyLmdldEltYWdlU2l6ZShpdGVtLmNvbnRlbnQpKS53aWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudFdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhdGhpcy5xdWVzdGlvbi5pbWFnZVdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBTdXJ2ZXlIZWxwZXIucGFyc2VXaWR0aCh0aGlzLnF1ZXN0aW9uLmltYWdlV2lkdGgsIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvc2l0ZVdpZHRoOiBudW1iZXIgPSBNYXRoLm1heChjb250ZW50V2lkdGgsIEZsYXRGaWxlLlRFWFRfTUlOX1NDQUxFICogdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVdpZHRoIDwgY29tcG9zaXRlV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0geUJvdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMaW5lKHJvd3NGbGF0cywgY3VyclBvaW50LCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKGN1cnJQb2ludC54TGVmdCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLSBjdXJyUG9pbnQueExlZnQgLSBjb21wb3NpdGVXaWR0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShjdXJyUG9pbnQsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSBpdGVtRmxhdC53aWR0aDtcbiAgICAgICAgICAgICAgICB5Qm90ID0gTWF0aC5tYXgoeUJvdCwgaXRlbUZsYXQueUJvdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVXaWR0aCA8IHRoaXMuY29udHJvbGxlci51bml0V2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0geUJvdDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMaW5lKHJvd3NGbGF0cywgY3VyclBvaW50LCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShjdXJyUG9pbnQsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soaXRlbUZsYXQpO1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCArPSBpdGVtRmxhdC54UmlnaHQgLSBpdGVtRmxhdC54TGVmdDtcbiAgICAgICAgICAgICAgICB5Qm90ID0gTWF0aC5tYXgoeUJvdCwgaXRlbUZsYXQueUJvdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93c0ZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignZmlsZScsIEZsYXRGaWxlKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9maWxlLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkh0bWxNb2RlbCwgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IHR5cGUgSUhUTUxSZW5kZXJUeXBlID0gJ2F1dG8nIHwgJ3N0YW5kYXJkJyB8ICdpbWFnZSc7XG5leHBvcnQgY2xhc3MgRmxhdEhUTUwgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25IdG1sTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBjaG9vc2VSZW5kZXIoaHRtbDogc3RyaW5nKTogSUhUTUxSZW5kZXJUeXBlIHtcbiAgICAgICAgaWYgKC88W14+XSpzdHlsZVtePF0qPi8udGVzdChodG1sKSB8fFxuICAgICAgICAgICAgLzxbXj5dKnRhYmxlW148XSo+Ly50ZXN0KGh0bWwpIHx8XG4gICAgICAgICAgICAvJlxcdys7Ly50ZXN0KGh0bWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ltYWdlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3N0YW5kYXJkJztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCByZW5kZXJBczogSUhUTUxSZW5kZXJUeXBlID0gPElIVE1MUmVuZGVyVHlwZT50aGlzLnF1ZXN0aW9uLnJlbmRlckFzO1xuICAgICAgICBpZiAocmVuZGVyQXMgPT09ICdhdXRvJykgcmVuZGVyQXMgPSB0aGlzLmNvbnRyb2xsZXIuaHRtbFJlbmRlckFzO1xuICAgICAgICBpZiAocmVuZGVyQXMgPT09ICdhdXRvJykgcmVuZGVyQXMgPSB0aGlzLmNob29zZVJlbmRlcihTdXJ2ZXlIZWxwZXIuZ2V0TG9jU3RyaW5nKHRoaXMucXVlc3Rpb24ubG9jSHRtbCkpO1xuICAgICAgICBjb25zdCBodG1sOiBzdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlSHRtbENvbnRhaW5lckJsb2NrKFN1cnZleUhlbHBlci5nZXRMb2NTdHJpbmcodGhpcy5xdWVzdGlvbi5sb2NIdG1sKSwgdGhpcy5jb250cm9sbGVyLCByZW5kZXJBcyk7XG4gICAgICAgIGlmIChyZW5kZXJBcyA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdXJsLCBhc3BlY3QgfTogeyB1cmw6IHN0cmluZywgYXNwZWN0OiBudW1iZXIgfSA9XG4gICAgICAgICAgICAgICAgYXdhaXQgU3VydmV5SGVscGVyLmh0bWxUb0ltYWdlKGh0bWwsIHdpZHRoLCB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB3aWR0aCAvIGFzcGVjdDtcbiAgICAgICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB1cmwsIHdpZHRoLCBoZWlnaHQpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1N1cnZleUhlbHBlci5zcGxpdEh0bWxSZWN0KHRoaXMuY29udHJvbGxlciwgYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUhUTUxGbGF0KFxuICAgICAgICAgICAgcG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgaHRtbCkpXTtcbiAgICB9XG59XG5cblNlcmlhbGl6ZXIucmVtb3ZlUHJvcGVydHkoJ2h0bWwnLCAncmVuZGVyQXMnKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ2h0bWwnLCB7XG4gICAgbmFtZTogJ3JlbmRlckFzJyxcbiAgICBkZWZhdWx0OiAnYXV0bycsXG4gICAgY2hvaWNlczogWydhdXRvJywgJ3N0YW5kYXJkJywgJ2ltYWdlJ11cbn0pO1xuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcignaHRtbCcsIEZsYXRIVE1MKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9odG1sLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvbkltYWdlTW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSZXBvc2l0b3J5IH0gZnJvbSAnLi9mbGF0X3JlcG9zaXRvcnknO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfYnJpY2snO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0SW1hZ2UgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25JbWFnZU1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25JbWFnZU1vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3Qgd2lkdGhQdDogbnVtYmVyID0gU3VydmV5SGVscGVyLnB4VG9QdCg8YW55PnRoaXMucXVlc3Rpb24uaW1hZ2VXaWR0aCk7XG4gICAgICAgIGNvbnN0IGhlaWdodFB0OiBudW1iZXIgPSBTdXJ2ZXlIZWxwZXIucHhUb1B0KDxhbnk+dGhpcy5xdWVzdGlvbi5pbWFnZUhlaWdodCk7XG4gICAgICAgIHJldHVybiBbYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi5pbWFnZUxpbmssIHdpZHRoUHQsIGhlaWdodFB0KV07XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdpbWFnZScsIEZsYXRJbWFnZSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfaW1hZ2UudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgQ2hlY2tJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jaGVja2l0ZW0nO1xuaW1wb3J0IHsgQ29tcG9zaXRlQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9jb21wb3NpdGUnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0SW1hZ2VQaWNrZXIgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25JbWFnZVBpY2tlck1vZGVsO1xuICAgIHByb3RlY3RlZCByYWRpbzogRmxhdFJhZGlvZ3JvdXA7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvbkltYWdlUGlja2VyTW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVGbGF0SXRlbShwb2ludDogSVBvaW50LCBpdGVtOiBJdGVtVmFsdWUsIGluZGV4OiBudW1iZXIpOiBQcm9taXNlPElQZGZCcmljaz4ge1xuICAgICAgICBjb25zdCBwYWdlQXZhaWxhYmxlV2lkdGggPSBTdXJ2ZXlIZWxwZXIuZ2V0UGFnZUF2YWlsYWJsZVdpZHRoKHRoaXMuY29udHJvbGxlcik7XG4gICAgICAgIGNvbnN0IGltYWdlRmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVJbWFnZUZsYXQocG9pbnQsIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgKDxhbnk+aXRlbSkuaW1hZ2VMaW5rLCBwYWdlQXZhaWxhYmxlV2lkdGgsIHBhZ2VBdmFpbGFibGVXaWR0aCAvIFN1cnZleUhlbHBlci5JTUFHRVBJQ0tFUl9SQVRJTyk7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGltYWdlRmxhdCk7XG4gICAgICAgIGxldCBidXR0b25Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5zaG93TGFiZWwpIHtcbiAgICAgICAgICAgIGxldCBsYWJlbEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChidXR0b25Qb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLnRleHQgfHwgaXRlbS52YWx1ZSwgVGV4dEJyaWNrKTtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sobGFiZWxGbGF0KTtcbiAgICAgICAgICAgIGJ1dHRvblBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGxhYmVsRmxhdCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGVpZ2h0OiBudW1iZXIgPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgY29uc3QgYnV0dG9uUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlUmVjdChidXR0b25Qb2ludCwgcGFnZUF2YWlsYWJsZVdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbi5tdWx0aVNlbGVjdCkge1xuICAgICAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhuZXcgQ2hlY2tJdGVtQnJpY2sodGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLFxuICAgICAgICAgICAgICAgIGJ1dHRvblJlY3QsIHRoaXMucXVlc3Rpb24uaWQgKyAnaW5kZXgnICsgaW5kZXgsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi5pc1JlYWRPbmx5IHx8ICFpdGVtLmlzRW5hYmxlZCxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZhbHVlLmluZGV4T2YoaXRlbS52YWx1ZSkgIT09IC0xKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKHRoaXMucmFkaW8uZ2VuZXJhdGVGbGF0SXRlbShidXR0b25SZWN0LCBpdGVtLCBpbmRleCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgdGhpcy5yYWRpbyA9IHRoaXMucXVlc3Rpb24ubXVsdGlTZWxlY3QgPyBudWxsIDpcbiAgICAgICAgICAgIG5ldyBGbGF0UmFkaW9ncm91cCh0aGlzLnN1cnZleSwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgY29uc3Qgcm93c0ZsYXRzOiBDb21wb3NpdGVCcmlja1tdID0gW25ldyBDb21wb3NpdGVCcmljaygpXTtcbiAgICAgICAgY29uc3QgY29sV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRJbWFnZVBpY2tlckF2YWlsYWJsZVdpZHRoKFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyKSAvIFN1cnZleUhlbHBlci5JTUFHRVBJQ0tFUl9DT1VOVDtcbiAgICAgICAgbGV0IGNvbHM6IG51bWJlciA9IH5+KFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGdldFBhZ2VBdmFpbGFibGVXaWR0aCh0aGlzLmNvbnRyb2xsZXIpIC8gY29sV2lkdGgpIHx8IDE7XG4gICAgICAgIGNvbnN0IGNvdW50OiBudW1iZXIgPSB0aGlzLnF1ZXN0aW9uLnZpc2libGVDaG9pY2VzLmxlbmd0aDtcbiAgICAgICAgY29scyA9IGNvbHMgPD0gY291bnQgPyBjb2xzIDogY291bnQ7XG4gICAgICAgIGNvbnN0IHJvd3M6IG51bWJlciA9IH5+KE1hdGguY2VpbChjb3VudCAvIGNvbHMpKTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeUJvdDogbnVtYmVyID0gY3VyclBvaW50LnlUb3A7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGxldCBjdXJyTWFyZ2luTGVmdDogbnVtYmVyID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBjb2xzOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleDogbnVtYmVyID0gaSAqIGNvbHMgKyBqO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBjb3VudCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCA9IGN1cnJNYXJnaW5MZWZ0O1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICBjdXJyTWFyZ2luTGVmdCAtIGNvbFdpZHRoO1xuICAgICAgICAgICAgICAgIGN1cnJNYXJnaW5MZWZ0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRJdGVtKGN1cnJQb2ludCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbi52aXNpYmxlQ2hvaWNlc1tpbmRleF0sIGluZGV4KTtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKGl0ZW1GbGF0KTtcbiAgICAgICAgICAgICAgICB5Qm90ID0gTWF0aC5tYXgoeUJvdCwgaXRlbUZsYXQueUJvdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICBpZiAoaSAhPT0gcm93cyAtIDEpIHtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSBTdXJ2ZXlIZWxwZXIuRVBTSUxPTjtcbiAgICAgICAgICAgICAgICByb3dzRmxhdHMucHVzaChuZXcgQ29tcG9zaXRlQnJpY2soKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ2ltYWdlcGlja2VyJywgRmxhdEltYWdlUGlja2VyKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF9pbWFnZXBpY2tlci50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25NYXRyaXhNb2RlbCwgTWF0cml4Um93TW9kZWwsXG4gICAgUXVlc3Rpb25SYWRpb2dyb3VwTW9kZWwsIEl0ZW1WYWx1ZSwgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUG9pbnQsIElSZWN0IH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFF1ZXN0aW9uIH0gZnJvbSAnLi9mbGF0X3F1ZXN0aW9uJztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBHQVBfQkVUV0VFTl9ST1dTOiBudW1iZXIgPSAwLjU7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvbk1hdHJpeE1vZGVsO1xuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCA8UXVlc3Rpb25SYWRpb2dyb3VwTW9kZWw+cXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uTWF0cml4TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzSGVhZGVyKHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgY29sQ291bnQ6IG51bWJlciA9IHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICsgKHRoaXMucXVlc3Rpb24uaGFzUm93cyA/IDEgOiAwKTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMucXVlc3Rpb24uaGFzUm93cyA/IGkgKyAxIDogaTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCwgY29sdW1uKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQ7XG4gICAgICAgICAgICBoZWFkZXJzLnB1c2goYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUJvbGRUZXh0RmxhdChjdXJyUG9pbnQsXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLnZpc2libGVDb2x1bW5zW2ldLmxvY1RleHQpKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9zaXRlQnJpY2s6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmhlYWRlcnMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxuICAgIHByb3RlY3RlZCBhc3luYyBnZW5lcmF0ZUZsYXRzUm93cyhwb2ludDogSVBvaW50LCBpc1ZlcnRpY2FsOiBib29sZWFuKTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgbGV0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb24udmlzaWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleTogc3RyaW5nID0gJ3JvdycgKyBpO1xuICAgICAgICAgICAgY29uc3QgZmxhdHNSb3c6IElQZGZCcmlja1tdID0gYXdhaXQgbmV3IEZsYXRNYXRyaXhSb3codGhpcy5zdXJ2ZXksIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXN0aW9uLnZpc2libGVSb3dzW2ldLCBrZXksIGkgPT0gMCwgaXNWZXJ0aWNhbCkuZ2VuZXJhdGVGbGF0c0NvbnRlbnQoY3VyclBvaW50KTtcbiAgICAgICAgICAgIGN1cnJQb2ludCA9IFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChTdXJ2ZXlIZWxwZXIubWVyZ2VSZWN0cyguLi5mbGF0c1JvdykpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBGbGF0TWF0cml4LkdBUF9CRVRXRUVOX1JPV1M7XG4gICAgICAgICAgICBjZWxscy5wdXNoKC4uLmZsYXRzUm93KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2VsbHM7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRDb2x1bW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIsIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICsgKHRoaXMucXVlc3Rpb24uaGFzUm93cyA/IDEgOiAwKSk7XG4gICAgICAgIGNvbnN0IGlzVmVydGljYWw6IGJvb2xlYW4gPSB0aGlzLnF1ZXN0aW9uLnJlbmRlckFzID09PSAnbGlzdCcgfHwgdGhpcy5jb250cm9sbGVyLm1hdHJpeFJlbmRlckFzID09PSAnbGlzdCcgfHxcbiAgICAgICAgICAgIGNlbGxXaWR0aCA8IHRoaXMuY29udHJvbGxlci5tZWFzdXJlVGV4dChTdXJ2ZXlIZWxwZXIuTUFUUklYX0NPTFVNTl9XSURUSCkud2lkdGg7XG4gICAgICAgIGxldCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBpZiAoIWlzVmVydGljYWwgJiYgdGhpcy5xdWVzdGlvbi5zaG93SGVhZGVyICYmIHRoaXMucXVlc3Rpb24udmlzaWJsZUNvbHVtbnMubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzOiBJUGRmQnJpY2tbXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c0hlYWRlcihjdXJyUG9pbnQpO1xuICAgICAgICAgICAgY3VyclBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KFN1cnZleUhlbHBlci5tZXJnZVJlY3RzKC4uLmhlYWRlcnMpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wICs9IEZsYXRNYXRyaXguR0FQX0JFVFdFRU5fUk9XUyAqIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0O1xuICAgICAgICAgICAgY2VsbHMucHVzaCguLi5oZWFkZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBjZWxscy5wdXNoKC4uLmF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1Jvd3MoY3VyclBvaW50LCBpc1ZlcnRpY2FsKSk7XG4gICAgICAgIHJldHVybiBjZWxscztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGF0TWF0cml4Um93IGV4dGVuZHMgRmxhdFJhZGlvZ3JvdXAge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbk1hdHJpeDogUXVlc3Rpb25NYXRyaXhNb2RlbDtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJpdmF0ZSByb3c6IE1hdHJpeFJvd01vZGVsLFxuICAgICAgICBwcml2YXRlIGtleTogc3RyaW5nLCBwcm90ZWN0ZWQgaXNGaXJzdDogYm9vbGVhbiA9IGZhbHNlLCBwcm90ZWN0ZWQgaXNWZXJ0aWNhbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uTWF0cml4ID0gPFF1ZXN0aW9uTWF0cml4TW9kZWw+cXVlc3Rpb247XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZlcnRpY2FsID9cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2VuZXJhdGVGbGF0c1ZlcnRpY2FsbHlDZWxscyhwb2ludCkgOlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRzSG9yaXpvbnRhbGx5Q2VsbHMocG9pbnQpO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVUZXh0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGNvbHVtbjogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gdGhpcy5yb3cudmFsdWUgPT0gY29sdW1uLnZhbHVlO1xuICAgICAgICBjb25zdCBpdGVtUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KGN1cnJQb2ludCxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKSwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCByYWRpb0ZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShpdGVtUmVjdCwgY29sdW1uLCBpbmRleCwgdGhpcy5rZXksIGNoZWNrZWQpO1xuICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHJhZGlvRmxhdC55Qm90ICsgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQgKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCBjZWxsVGV4dEZsYXQgPSBhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LCB0aGlzLmNvbnRyb2xsZXIsXG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9uTWF0cml4LmdldENlbGxEaXNwbGF5TG9jVGV4dCh0aGlzLnJvdy5uYW1lLCBjb2x1bW4pLCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKHJhZGlvRmxhdCwgY2VsbFRleHRGbGF0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlSXRlbUNvbXBvaXN0ZShwb2ludDogSVBvaW50LCBjb2x1bW46IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgY2hlY2tlZDogYm9vbGVhbiA9IHRoaXMucm93LnZhbHVlID09IGNvbHVtbi52YWx1ZTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoY3VyclBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgY29uc3QgcmFkaW9GbGF0OiBJUGRmQnJpY2sgPSB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oU3VydmV5SGVscGVyLm1vdmVSZWN0KFxuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBpdGVtUmVjdC54TGVmdCksIGNvbHVtbiwgaW5kZXgsIHRoaXMua2V5LCBjaGVja2VkKTtcbiAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcmFkaW9GbGF0LnhSaWdodCArIHRoaXMuY29udHJvbGxlci51bml0V2lkdGggKiBTdXJ2ZXlIZWxwZXIuR0FQX0JFVFdFRU5fSVRFTV9URVhUO1xuICAgICAgICBjb25zdCByYWRpb1RleHQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIsIGNvbHVtbi5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0ZUJyaWNrKHJhZGlvRmxhdCwgcmFkaW9UZXh0KTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdHNIb3Jpem9udGFsbHlDZWxscyhwb2ludDogSVBvaW50KSB7XG4gICAgICAgIGNvbnN0IGNlbGxzOiBJUGRmQnJpY2tbXSA9IFtdO1xuICAgICAgICBjb25zdCBjdXJyUG9pbnQ6IElQb2ludCA9IFN1cnZleUhlbHBlci5jbG9uZShwb2ludCk7XG4gICAgICAgIGNvbnN0IGNvbENvdW50OiBudW1iZXIgPSB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zLmxlbmd0aCArICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MgPyAxIDogMCk7XG4gICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc1Jvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCBjb2xDb3VudCwgMCk7XG4gICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgY2VsbHMucHVzaChhd2FpdCBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZsYXQoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uTWF0cml4LCB0aGlzLmNvbnRyb2xsZXIsIHRoaXMucm93LmxvY1RleHQsIFRleHRCcmljaykpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnBvcE1hcmdpbnMoKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uOiBJdGVtVmFsdWUgPSB0aGlzLnF1ZXN0aW9uTWF0cml4LnZpc2libGVDb2x1bW5zW2ldO1xuICAgICAgICAgICAgY29uc3QgY2hlY2tlZDogYm9vbGVhbiA9IHRoaXMucm93LnZhbHVlID09IGNvbHVtbi52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbk51bWJlcjogbnVtYmVyID0gdGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzID8gaSArIDEgOiBpO1xuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2V0Q29sdW1uTWFyZ2lucyh0aGlzLmNvbnRyb2xsZXIsIGNvbENvdW50LCBjb2x1bW5OdW1iZXIpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdDtcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXN0aW9uTWF0cml4Lmhhc0NlbGxUZXh0KSB7XG4gICAgICAgICAgICAgICAgY2VsbHMucHVzaChhd2FpdCB0aGlzLmdlbmVyYXRlVGV4dENvbXBvc2l0ZShjdXJyUG9pbnQsIGNvbHVtbiwgaSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVJlY3Q6IElSZWN0ID0gU3VydmV5SGVscGVyLmNyZWF0ZVJlY3QoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGNlbGxzLnB1c2godGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5tb3ZlUmVjdChcbiAgICAgICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnNjYWxlUmVjdChpdGVtUmVjdCwgU3VydmV5SGVscGVyLlNFTEVDVF9JVEVNX0ZMQVRfU0NBTEUpLCBjdXJyUG9pbnQueExlZnQpLCBjb2x1bW4sIGksIHRoaXMua2V5LCBjaGVja2VkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKC4uLmNlbGxzKTtcbiAgICAgICAgcmV0dXJuIFtjb21wb3NpdGVCcmljaywgU3VydmV5SGVscGVyLmNyZWF0ZVJvd2xpbmVGbGF0KFN1cnZleUhlbHBlci5jcmVhdGVQb2ludChjb21wb3NpdGVCcmljayksIHRoaXMuY29udHJvbGxlcildO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0c1ZlcnRpY2FsbHlDZWxscyhwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCBjZWxsczogSVBkZkJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBpZiAodGhpcy5xdWVzdGlvbk1hdHJpeC5oYXNSb3dzKSB7XG4gICAgICAgICAgICBjb25zdCByb3dUZXh0RmxhdCA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChjdXJyUG9pbnQsIHRoaXMucXVlc3Rpb25NYXRyaXgsXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLCB0aGlzLnJvdy5sb2NUZXh0LCBUZXh0QnJpY2spO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgPSByb3dUZXh0RmxhdC55Qm90ICsgRmxhdFF1ZXN0aW9uLkNPTlRFTlRfR0FQX1ZFUlRfU0NBTEUgKiB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodDtcbiAgICAgICAgICAgIGNlbGxzLnB1c2gocm93VGV4dEZsYXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ2VuZXJhdGVGbGF0Q29tcG9zaXRlID0gKHRoaXMucXVlc3Rpb25NYXRyaXguaGFzQ2VsbFRleHQpID8gdGhpcy5nZW5lcmF0ZVRleHRDb21wb3NpdGUgOiB0aGlzLmdlbmVyYXRlSXRlbUNvbXBvaXN0ZTtcbiAgICAgICAgY2VsbHMucHVzaCguLi5hd2FpdCB0aGlzLmdlbmVyYXRlVmVydGljYWxseUl0ZW1zKGN1cnJQb2ludCwgdGhpcy5xdWVzdGlvbk1hdHJpeC52aXNpYmxlQ29sdW1ucykpO1xuICAgICAgICBjb25zdCBjb21wb3NpdGVCcmljazogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soLi4uY2VsbHMpO1xuICAgICAgICByZXR1cm4gW2NvbXBvc2l0ZUJyaWNrLCBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUJyaWNrKSwgdGhpcy5jb250cm9sbGVyKV07XG4gICAgfVxufVxuXG5TZXJpYWxpemVyLnJlbW92ZVByb3BlcnR5KCdtYXRyaXgnLCAncmVuZGVyQXMnKTtcblNlcmlhbGl6ZXIuYWRkUHJvcGVydHkoJ21hdHJpeCcsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeCcsIEZsYXRNYXRyaXgpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X21hdHJpeC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgU2VyaWFsaXplciB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyIH0gZnJvbSAnLi4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBGbGF0TWF0cml4TXVsdGlwbGUgfSBmcm9tICcuL2ZsYXRfbWF0cml4bXVsdGlwbGUnO1xuXG5leHBvcnQgY2xhc3MgRmxhdE1hdHJpeER5bmFtaWMgZXh0ZW5kcyBGbGF0TWF0cml4TXVsdGlwbGUge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlciwgZmFsc2UpO1xuICAgIH1cbn1cblxuU2VyaWFsaXplci5yZW1vdmVQcm9wZXJ0eSgnbWF0cml4ZHluYW1pYycsICdyZW5kZXJBcycpO1xuU2VyaWFsaXplci5hZGRQcm9wZXJ0eSgnbWF0cml4ZHluYW1pYycsIHtcbiAgICBuYW1lOiAncmVuZGVyQXMnLFxuICAgIGRlZmF1bHQ6ICdhdXRvJyxcbiAgICBjaG9pY2VzOiBbJ2F1dG8nLCAnbGlzdCddXG59KTtcbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ21hdHJpeGR5bmFtaWMnLCBGbGF0TWF0cml4RHluYW1pYyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfbWF0cml4ZHluYW1pYy50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbCwgTXVsdGlwbGVUZXh0SXRlbU1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiwgSUZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuaW1wb3J0IHsgRmxhdFRleHRib3ggfSBmcm9tICcuL2ZsYXRfdGV4dGJveCc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0TXVsdGlwbGVUZXh0IGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJPV1NfR0FQX1NDQUxFOiBudW1iZXIgPSAwLjE5NTtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uTXVsdGlwbGVUZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25NdWx0aXBsZVRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUZsYXRJdGVtKHBvaW50OiBJUG9pbnQsIHJvd19pbmRleDogbnVtYmVyLCBjb2xfaW5kZXg6IG51bWJlcixcbiAgICAgICAgaXRlbTogTXVsdGlwbGVUZXh0SXRlbU1vZGVsKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgY29sV2lkdGg6IG51bWJlciA9IFN1cnZleUhlbHBlci5nZXRQYWdlQXZhaWxhYmxlV2lkdGgodGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLnJpZ2h0ID0gdGhpcy5jb250cm9sbGVyLnBhcGVyV2lkdGggLVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm1hcmdpbnMubGVmdCAtIGNvbFdpZHRoICogU3VydmV5SGVscGVyLk1VTFRJUExFVEVYVF9URVhUX1BFUlM7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5cbiAgICAgICAgICAgIGNyZWF0ZUJvbGRUZXh0RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RpdGxlKSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG5cbiAgICAgICAgY29uc3QgZmxhdE11bHRpcGxlVGV4dEl0ZW1RdWVzdGlvbjogSUZsYXRRdWVzdGlvbiA9IEZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKFxuICAgICAgICAgICAgdGhpcy5zdXJ2ZXksIGl0ZW0uZWRpdG9yLCB0aGlzLmNvbnRyb2xsZXIsICd0ZXh0Jyk7XG4gICAgICAgIGNvbnN0IGl0ZW1Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVRleHRGaWVsZFJlY3Qoe1xuICAgICAgICAgICAgeExlZnQ6IHBvaW50LnhMZWZ0ICsgY29sV2lkdGggKiBTdXJ2ZXlIZWxwZXIuTVVMVElQTEVURVhUX1RFWFRfUEVSUywgeVRvcDogcG9pbnQueVRvcCB9LFxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKC4uLmF3YWl0ICg8RmxhdFRleHRib3g+ZmxhdE11bHRpcGxlVGV4dEl0ZW1RdWVzdGlvbikuZ2VuZXJhdGVGbGF0c0NvbnRlbnQoaXRlbVBvaW50KSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZUZsYXQ7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZW5lcmF0ZUZsYXRzQ29udGVudChwb2ludDogSVBvaW50KTogUHJvbWlzZTxJUGRmQnJpY2tbXT4ge1xuICAgICAgICBjb25zdCByb3dzRmxhdHM6IENvbXBvc2l0ZUJyaWNrW10gPSBbXTtcbiAgICAgICAgY29uc3QgY3VyclBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5xdWVzdGlvbi5nZXRSb3dzKCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByb3dzRmxhdHMucHVzaChuZXcgQ29tcG9zaXRlQnJpY2soKSk7XG4gICAgICAgICAgICBsZXQgeUJvdDogbnVtYmVyID0gY3VyclBvaW50LnlUb3A7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucHVzaE1hcmdpbnMoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCByb3dzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnB1c2hNYXJnaW5zKCk7XG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLnNldENvbHVtbk1hcmdpbnModGhpcy5jb250cm9sbGVyLCB0aGlzLnF1ZXN0aW9uLmNvbENvdW50LCBqKTtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueExlZnQgPSB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCwgaSwgaiwgcm93c1tpXVtqXSk7XG4gICAgICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICAgICAgeUJvdCA9IE1hdGgubWF4KHlCb3QsIGl0ZW1GbGF0LnlCb3QpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlci5wb3BNYXJnaW5zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICAgICAgY3VyclBvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCA9IHlCb3Q7XG4gICAgICAgICAgICByb3dzRmxhdHNbcm93c0ZsYXRzLmxlbmd0aCAtIDFdLmFkZEJyaWNrKFxuICAgICAgICAgICAgICAgIFN1cnZleUhlbHBlci5jcmVhdGVSb3dsaW5lRmxhdChjdXJyUG9pbnQsIHRoaXMuY29udHJvbGxlcikpO1xuICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRNdWx0aXBsZVRleHQuUk9XU19HQVBfU0NBTEU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ211bHRpcGxldGV4dCcsIEZsYXRNdWx0aXBsZVRleHQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X211bHRpcGxldGV4dC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbCB9IGZyb20gJ3N1cnZleS1jb3JlJztcbmltcG9ydCB7IFN1cnZleVBERiB9IGZyb20gJy4uL3N1cnZleSc7XG5pbXBvcnQgeyBJUG9pbnQsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0U3VydmV5IH0gZnJvbSAnLi9mbGF0X3N1cnZleSc7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRQYW5lbER5bmFtaWMgZXh0ZW5kcyBGbGF0UXVlc3Rpb24ge1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25QYW5lbER5bmFtaWNNb2RlbDtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdBUF9CRVRXRUVOX1BBTkVMUzogbnVtYmVyID0gMC43NTtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHN1cnZleTogU3VydmV5UERGLFxuICAgICAgICBxdWVzdGlvbjogSVF1ZXN0aW9uLCBwcm90ZWN0ZWQgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblBhbmVsRHluYW1pY01vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2VuZXJhdGVGbGF0c0NvbnRlbnQocG9pbnQ6IElQb2ludCk6IFByb21pc2U8SVBkZkJyaWNrW10+IHtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChjb25zdCBwYW5lbCBvZiB0aGlzLnF1ZXN0aW9uLnBhbmVscykge1xuICAgICAgICAgICAgY29uc3QgcGFuZWxGbGF0czogSVBkZkJyaWNrW10gPSBhd2FpdCBGbGF0U3VydmV5LmdlbmVyYXRlRmxhdHNQYW5lbChcbiAgICAgICAgICAgICAgICB0aGlzLnN1cnZleSwgdGhpcy5jb250cm9sbGVyLCBwYW5lbCwgY3VyclBvaW50KTtcbiAgICAgICAgICAgIGlmIChwYW5lbEZsYXRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gU3VydmV5SGVscGVyLm1lcmdlUmVjdHMoLi4ucGFuZWxGbGF0cykueUJvdDtcbiAgICAgICAgICAgICAgICBjdXJyUG9pbnQueVRvcCArPSB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCAqIEZsYXRQYW5lbER5bmFtaWMuR0FQX0JFVFdFRU5fUEFORUxTO1xuICAgICAgICAgICAgICAgIGZsYXRzLnB1c2goLi4ucGFuZWxGbGF0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZsYXRzO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncGFuZWxkeW5hbWljJywgRmxhdFBhbmVsRHluYW1pYyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcGFuZWxkeW5hbWljLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBJdGVtVmFsdWUsIFF1ZXN0aW9uUmFua2luZ01vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIERvY0NvbnRyb2xsZXIgfSBmcm9tICcuLi9kb2NfY29udHJvbGxlcic7XG5pbXBvcnQgeyBGbGF0UXVlc3Rpb24gfSBmcm9tICcuL2ZsYXRfcXVlc3Rpb24nO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IFJhbmtpbmdJdGVtQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9yYW5raW5naXRlbSc7XG5pbXBvcnQgeyBDb21wb3NpdGVCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2NvbXBvc2l0ZSc7XG5pbXBvcnQgeyBTdXJ2ZXlIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJfc3VydmV5JztcblxuZXhwb3J0IGNsYXNzIEZsYXRSYW5raW5nIGV4dGVuZHMgRmxhdFF1ZXN0aW9uIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb246IFF1ZXN0aW9uUmFua2luZ01vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIHByb3RlY3RlZCBjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKSB7XG4gICAgICAgIHN1cGVyKHN1cnZleSwgcXVlc3Rpb24sIGNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gPFF1ZXN0aW9uUmFua2luZ01vZGVsPnF1ZXN0aW9uO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCwgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQpO1xuICAgICAgICBjb25zdCBpdGVtU2NhbGVkUmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoU3VydmV5SGVscGVyLnNjYWxlUmVjdChcbiAgICAgICAgICAgIGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksIHBvaW50LnhMZWZ0KTtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IG5ldyBSYW5raW5nSXRlbUJyaWNrKHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlcixcbiAgICAgICAgICAgIGl0ZW1TY2FsZWRSZWN0LCB0aGlzLnF1ZXN0aW9uLmdldE51bWJlckJ5SW5kZXgoaW5kZXgpKTtcbiAgICAgICAgY29uc3QgdGV4dFBvaW50OiBJUG9pbnQgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUocG9pbnQpO1xuICAgICAgICB0ZXh0UG9pbnQueExlZnQgPSBpdGVtRmxhdC54UmlnaHQgKyB0aGlzLmNvbnRyb2xsZXIudW5pdFdpZHRoICogU3VydmV5SGVscGVyLkdBUF9CRVRXRUVOX0lURU1fVEVYVDtcbiAgICAgICAgY29uc3QgdGV4dEZsYXQ6IElQZGZCcmljayA9IGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtLmxvY1RleHQsIFRleHRCcmljayk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQnJpY2soaXRlbUZsYXQsIHRleHRGbGF0KTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgY29uc3QgZmxhdHM6IElQZGZCcmlja1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uLnJhbmtpbmdDaG9pY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtRmxhdDogSVBkZkJyaWNrID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUZsYXRDb21wb3NpdGUoY3VyclBvaW50LCB0aGlzLnF1ZXN0aW9uLnJhbmtpbmdDaG9pY2VzW2ldLCBpKTtcbiAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdCArIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9ST1dTICogdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQ7XG4gICAgICAgICAgICBmbGF0cy5wdXNoKGl0ZW1GbGF0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmxhdHM7XG4gICAgfVxufVxuXG5GbGF0UmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKCdyYW5raW5nJywgRmxhdFJhbmtpbmcpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3JhbmtpbmcudHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24sIEl0ZW1WYWx1ZSwgUXVlc3Rpb25SYXRpbmdNb2RlbCwgTG9jYWxpemFibGVTdHJpbmcgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRSYWRpb2dyb3VwIH0gZnJvbSAnLi9mbGF0X3JhZGlvZ3JvdXAnO1xuaW1wb3J0IHsgRmxhdFJlcG9zaXRvcnkgfSBmcm9tICcuL2ZsYXRfcmVwb3NpdG9yeSc7XG5pbXBvcnQgeyBJUGRmQnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBUZXh0QnJpY2sgfSBmcm9tICcuLi9wZGZfcmVuZGVyL3BkZl90ZXh0JztcbmltcG9ydCB7IENvbXBvc2l0ZUJyaWNrIH0gZnJvbSAnLi4vcGRmX3JlbmRlci9wZGZfY29tcG9zaXRlJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFJhdGluZyBleHRlbmRzIEZsYXRSYWRpb2dyb3VwIHtcbiAgICBwcm90ZWN0ZWQgcXVlc3Rpb25SYXRpbmc6IFF1ZXN0aW9uUmF0aW5nTW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgcHJvdGVjdGVkIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcgPSA8UXVlc3Rpb25SYXRpbmdNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRmxhdEhvcmlzb250YWxDb21wb3NpdGUocG9pbnQ6IElQb2ludCwgaXRlbTogSXRlbVZhbHVlLCBpbmRleDogbnVtYmVyKTogUHJvbWlzZTxJUGRmQnJpY2s+IHtcbiAgICAgICAgY29uc3QgaXRlbVRleHQ6IExvY2FsaXphYmxlU3RyaW5nID0gU3VydmV5SGVscGVyLmdldFJhdGluZ0l0ZW1UZXh0KFxuICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZywgaW5kZXgsIGl0ZW0ubG9jVGV4dCk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5wdXNoTWFyZ2lucygpO1xuICAgICAgICBjb25zdCBoYWxmV2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGggLyAyLjA7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5tYXJnaW5zLmxlZnQgKz0gaGFsZldpZHRoO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCArPSBoYWxmV2lkdGg7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ICs9IGhhbGZXaWR0aDtcbiAgICAgICAgY29uc3QgY29tcG9zaXRlRmxhdDogQ29tcG9zaXRlQnJpY2sgPSBuZXcgQ29tcG9zaXRlQnJpY2soYXdhaXQgU3VydmV5SGVscGVyLlxuICAgICAgICAgICAgY3JlYXRlQm9sZFRleHRGbGF0KHRleHRQb2ludCwgdGhpcy5xdWVzdGlvblJhdGluZywgdGhpcy5jb250cm9sbGVyLCBpdGVtVGV4dCkpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXIucG9wTWFyZ2lucygpO1xuICAgICAgICBsZXQgdGV4dFdpZHRoOiBudW1iZXIgPSBjb21wb3NpdGVGbGF0LndpZHRoO1xuICAgICAgICBpZiAodGV4dFdpZHRoIDwgU3VydmV5SGVscGVyLmdldFJhdGluZ01pbldpZHRoKHRoaXMuY29udHJvbGxlcikpIHtcbiAgICAgICAgICAgIGNvbXBvc2l0ZUZsYXQueExlZnQgKz0gKFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aChcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIpIC0gdGV4dFdpZHRoKSAvIDIuMCAtIGhhbGZXaWR0aDtcbiAgICAgICAgICAgIHRleHRXaWR0aCA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdNaW5XaWR0aCh0aGlzLmNvbnRyb2xsZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGV4dFdpZHRoICs9IHRoaXMuY29udHJvbGxlci51bml0V2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFkaW9Qb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNyZWF0ZVBvaW50KGNvbXBvc2l0ZUZsYXQpO1xuICAgICAgICByYWRpb1BvaW50LnhMZWZ0ID0gcG9pbnQueExlZnQ7XG4gICAgICAgIGNvbXBvc2l0ZUZsYXQuYWRkQnJpY2sodGhpcy5nZW5lcmF0ZUZsYXRJdGVtKFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KFxuICAgICAgICAgICAgcmFkaW9Qb2ludCwgdGV4dFdpZHRoLCB0aGlzLmNvbnRyb2xsZXIudW5pdEhlaWdodCksIGl0ZW0sIGluZGV4KSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVGbGF0Q29tcG9zaXRlKHBvaW50OiBJUG9pbnQsIGl0ZW06IEl0ZW1WYWx1ZSwgaW5kZXg6IG51bWJlcik6IFByb21pc2U8SVBkZkJyaWNrPiB7XG4gICAgICAgIGNvbnN0IGNvbXBvc2l0ZUZsYXQ6IENvbXBvc2l0ZUJyaWNrID0gbmV3IENvbXBvc2l0ZUJyaWNrKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1SZWN0OiBJUmVjdCA9IFN1cnZleUhlbHBlci5jcmVhdGVSZWN0KHBvaW50LFxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnVuaXRIZWlnaHQsIHRoaXMuY29udHJvbGxlci51bml0SGVpZ2h0KTtcbiAgICAgICAgY29uc3QgaXRlbUZsYXQ6IElQZGZCcmljayA9IHRoaXMuZ2VuZXJhdGVGbGF0SXRlbShTdXJ2ZXlIZWxwZXIubW92ZVJlY3QoXG4gICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuc2NhbGVSZWN0KGl0ZW1SZWN0LCBTdXJ2ZXlIZWxwZXIuU0VMRUNUX0lURU1fRkxBVF9TQ0FMRSksXG4gICAgICAgICAgICBwb2ludC54TGVmdCksIGl0ZW0sIGluZGV4KTtcbiAgICAgICAgY29tcG9zaXRlRmxhdC5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgIGNvbnN0IHRleHRQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgdGV4dFBvaW50LnhMZWZ0ID0gaXRlbUZsYXQueFJpZ2h0ICsgdGhpcy5jb250cm9sbGVyLnVuaXRXaWR0aCAqIFN1cnZleUhlbHBlci5HQVBfQkVUV0VFTl9JVEVNX1RFWFQ7XG4gICAgICAgIGNvbnN0IGl0ZW1UZXh0OiBMb2NhbGl6YWJsZVN0cmluZyA9IFN1cnZleUhlbHBlci5nZXRSYXRpbmdJdGVtVGV4dCh0aGlzLnF1ZXN0aW9uUmF0aW5nLCBpbmRleCwgaXRlbS5sb2NUZXh0KTtcbiAgICAgICAgaXRlbVRleHQgPT0gbnVsbCB8fCBjb21wb3NpdGVGbGF0LmFkZEJyaWNrKGF3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVUZXh0RmxhdChcbiAgICAgICAgICAgIHRleHRQb2ludCwgdGhpcy5xdWVzdGlvbiwgdGhpcy5jb250cm9sbGVyLCBpdGVtVGV4dCwgVGV4dEJyaWNrKSk7XG4gICAgICAgIHJldHVybiBjb21wb3NpdGVGbGF0O1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVIb3Jpc29udGFsbHlJdGVtcyhwb2ludDogSVBvaW50KSB7XG4gICAgICAgIGNvbnN0IHJvd3NGbGF0czogQ29tcG9zaXRlQnJpY2tbXSA9IFtuZXcgQ29tcG9zaXRlQnJpY2soKV07XG4gICAgICAgIGNvbnN0IGN1cnJQb2ludDogSVBvaW50ID0gU3VydmV5SGVscGVyLmNsb25lKHBvaW50KTtcbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GbGF0OiBJUGRmQnJpY2sgPSBhd2FpdCB0aGlzLmdlbmVyYXRlRmxhdEhvcmlzb250YWxDb21wb3NpdGUoY3VyclBvaW50LFxuICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb25SYXRpbmcudmlzaWJsZVJhdGVWYWx1ZXNbaV0sIGkpO1xuICAgICAgICAgICAgcm93c0ZsYXRzW3Jvd3NGbGF0cy5sZW5ndGggLSAxXS5hZGRCcmljayhpdGVtRmxhdCk7XG4gICAgICAgICAgICBjb25zdCBsZWZ0V2lkdGg6IG51bWJlciA9IHRoaXMuY29udHJvbGxlci5wYXBlcldpZHRoIC1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXIubWFyZ2lucy5yaWdodCAtIGl0ZW1GbGF0LnhSaWdodDtcbiAgICAgICAgICAgIGlmIChTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nTWluV2lkdGgodGhpcy5jb250cm9sbGVyKSA8PSBsZWZ0V2lkdGggKyBTdXJ2ZXlIZWxwZXIuRVBTSUxPTikge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IGl0ZW1GbGF0LnhSaWdodDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC54TGVmdCA9IHBvaW50LnhMZWZ0O1xuICAgICAgICAgICAgICAgIGN1cnJQb2ludC55VG9wID0gaXRlbUZsYXQueUJvdDtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0c1tyb3dzRmxhdHMubGVuZ3RoIC0gMV0uYWRkQnJpY2soXG4gICAgICAgICAgICAgICAgICAgICAgICBTdXJ2ZXlIZWxwZXIuY3JlYXRlUm93bGluZUZsYXQoY3VyclBvaW50LCB0aGlzLmNvbnRyb2xsZXIpKTtcbiAgICAgICAgICAgICAgICAgICAgY3VyclBvaW50LnlUb3AgKz0gU3VydmV5SGVscGVyLkVQU0lMT047XG4gICAgICAgICAgICAgICAgICAgIHJvd3NGbGF0cy5wdXNoKG5ldyBDb21wb3NpdGVCcmljaygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3NGbGF0cztcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCBpc1ZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uUmF0aW5nLnZpc2libGVSYXRlVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtVGV4dDogTG9jYWxpemFibGVTdHJpbmcgPSBTdXJ2ZXlIZWxwZXIuZ2V0UmF0aW5nSXRlbVRleHQoXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvblJhdGluZywgaSwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlc1tpXS5sb2NUZXh0KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIubWVhc3VyZVRleHQoaXRlbVRleHQpLndpZHRoID4gdGhpcy5jb250cm9sbGVyLm1lYXN1cmVUZXh0KFN1cnZleUhlbHBlci5SQVRJTkdfQ09MVU1OX1dJRFRIKS53aWR0aCkge1xuICAgICAgICAgICAgICAgIGlzVmVydGljYWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc1ZlcnRpY2FsID8gdGhpcy5nZW5lcmF0ZVZlcnRpY2FsbHlJdGVtcyhwb2ludCwgdGhpcy5xdWVzdGlvblJhdGluZy52aXNpYmxlUmF0ZVZhbHVlcykgOiB0aGlzLmdlbmVyYXRlSG9yaXNvbnRhbGx5SXRlbXMocG9pbnQpO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigncmF0aW5nJywgRmxhdFJhdGluZyk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2ZsYXRfbGF5b3V0L2ZsYXRfcmF0aW5nLnRzIiwiaW1wb3J0IHsgSVF1ZXN0aW9uLCBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsIH0gZnJvbSAnc3VydmV5LWNvcmUnO1xuaW1wb3J0IHsgU3VydmV5UERGIH0gZnJvbSAnLi4vc3VydmV5JztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQb2ludCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFN1cnZleUhlbHBlciB9IGZyb20gJy4uL2hlbHBlcl9zdXJ2ZXknO1xuXG5leHBvcnQgY2xhc3MgRmxhdFNpZ25hdHVyZVBhZCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHJvdGVjdGVkIHF1ZXN0aW9uOiBRdWVzdGlvblNpZ25hdHVyZVBhZE1vZGVsO1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgc3VydmV5OiBTdXJ2ZXlQREYsXG4gICAgICAgIHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIpIHtcbiAgICAgICAgc3VwZXIoc3VydmV5LCBxdWVzdGlvbiwgY29udHJvbGxlcik7XG4gICAgICAgIHRoaXMucXVlc3Rpb24gPSA8UXVlc3Rpb25TaWduYXR1cmVQYWRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGxldCBpbWFnZUJyaWNrID0gYXdhaXQgU3VydmV5SGVscGVyLmNyZWF0ZUltYWdlRmxhdChwb2ludCxcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24sIHRoaXMuY29udHJvbGxlciwgdGhpcy5xdWVzdGlvbi52YWx1ZSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLndpZHRoKSxcbiAgICAgICAgICAgIFN1cnZleUhlbHBlci5weFRvUHQoPGFueT50aGlzLnF1ZXN0aW9uLmhlaWdodClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIFtpbWFnZUJyaWNrXTtcbiAgICB9XG59XG5cbkZsYXRSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXIoJ3NpZ25hdHVyZXBhZCcsIEZsYXRTaWduYXR1cmVQYWQpO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9mbGF0X2xheW91dC9mbGF0X3NpZ25hdHVyZXBhZC50cyIsImltcG9ydCB7IElRdWVzdGlvbiwgUXVlc3Rpb25UZXh0TW9kZWwgfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBTdXJ2ZXlQREYgfSBmcm9tICcuLi9zdXJ2ZXknO1xuaW1wb3J0IHsgSVBvaW50LCBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IEZsYXRRdWVzdGlvbiB9IGZyb20gJy4vZmxhdF9xdWVzdGlvbic7XG5pbXBvcnQgeyBGbGF0UmVwb3NpdG9yeSB9IGZyb20gJy4vZmxhdF9yZXBvc2l0b3J5JztcbmltcG9ydCB7IElQZGZCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX2JyaWNrJztcbmltcG9ydCB7IFRleHRCb3hCcmljayB9IGZyb20gJy4uL3BkZl9yZW5kZXIvcGRmX3RleHRib3gnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi4vaGVscGVyX3N1cnZleSc7XG5cbmV4cG9ydCBjbGFzcyBGbGF0VGV4dGJveCBleHRlbmRzIEZsYXRRdWVzdGlvbiB7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBNVUxUSUxJTkVfVEVYVF9ST1dTX0NPVU5UOiBudW1iZXIgPSAxO1xuICAgIHByb3RlY3RlZCBxdWVzdGlvbjogUXVlc3Rpb25UZXh0TW9kZWw7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdXJ2ZXk6IFN1cnZleVBERixcbiAgICAgICAgcXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlcikge1xuICAgICAgICBzdXBlcihzdXJ2ZXksIHF1ZXN0aW9uLCBjb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5xdWVzdGlvbiA9IDxRdWVzdGlvblRleHRNb2RlbD5xdWVzdGlvbjtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdlbmVyYXRlRmxhdHNDb250ZW50KHBvaW50OiBJUG9pbnQpOiBQcm9taXNlPElQZGZCcmlja1tdPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXIudGV4dEZpZWxkUmVuZGVyQXMgPT09ICdzaW5nbGVMaW5lJykge1xuICAgICAgICAgICAgY29uc3QgcmVjdDogSVJlY3QgPSBTdXJ2ZXlIZWxwZXIuY3JlYXRlVGV4dEZpZWxkUmVjdChwb2ludCwgdGhpcy5jb250cm9sbGVyKTtcbiAgICAgICAgICAgIHJldHVybiBbbmV3IFRleHRCb3hCcmljayh0aGlzLnF1ZXN0aW9uLCB0aGlzLmNvbnRyb2xsZXIsIHJlY3QpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2F3YWl0IFN1cnZleUhlbHBlci5jcmVhdGVDb21tZW50RmxhdChwb2ludCwgdGhpcy5xdWVzdGlvbixcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlciwgRmxhdFRleHRib3guTVVMVElMSU5FX1RFWFRfUk9XU19DT1VOVCwgdHJ1ZSldO1xuICAgIH1cbn1cblxuRmxhdFJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5yZWdpc3RlcigndGV4dCcsIEZsYXRUZXh0Ym94KTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvZmxhdF9sYXlvdXQvZmxhdF90ZXh0Ym94LnRzIiwiaW1wb3J0IHsgUGRmQnJpY2sgfSBmcm9tICcuL3BkZl9icmljayc7XG5pbXBvcnQgeyBEb2NDb250cm9sbGVyLCBJUmVjdCB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IElRdWVzdGlvbiB9IGZyb20gJ3N1cnZleS1jb3JlJztcblxuZXhwb3J0IGNsYXNzIEN1c3RvbUJyaWNrIGV4dGVuZHMgUGRmQnJpY2sge1xuXG4gICAgY29uc3RydWN0b3IocXVlc3Rpb246IElRdWVzdGlvbiwgY29udHJvbGxlcjogRG9jQ29udHJvbGxlciwgcHJpdmF0ZSByZW5kZXJGdW5jOiAoZG9jOiBhbnksIHF1ZXN0aW9uOiBhbnksIHhMZWZ0OiBudW1iZXIsIHlUb3A6IG51bWJlcikgPT4gSVJlY3QpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlbmRlckZ1bmMoY29udHJvbGxlci5oZWxwZXJEb2MsIHF1ZXN0aW9uLCAwLCAwKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZW5kZXJJbnRlcmFjdGl2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRnVuYyh0aGlzLmNvbnRyb2xsZXIuZG9jLCB0aGlzLnF1ZXN0aW9uLCB0aGlzLnhMZWZ0LCB0aGlzLnlUb3ApO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BkZl9yZW5kZXIvcGRmX2N1c3RvbS50cyIsImltcG9ydCB7IFN1cnZleU1vZGVsLCBFdmVudCwgUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJRG9jT3B0aW9ucywgRG9jQ29udHJvbGxlciB9IGZyb20gJy4vZG9jX2NvbnRyb2xsZXInO1xuaW1wb3J0IHsgRmxhdFN1cnZleSB9IGZyb20gJy4vZmxhdF9sYXlvdXQvZmxhdF9zdXJ2ZXknO1xuaW1wb3J0IHsgUGFnZVBhY2tlciB9IGZyb20gJy4vcGFnZV9sYXlvdXQvcGFnZV9wYWNrZXInO1xuaW1wb3J0IHsgSVBkZkJyaWNrIH0gZnJvbSAnLi9wZGZfcmVuZGVyL3BkZl9icmljayc7XG5pbXBvcnQgeyBFdmVudEFzeW5jLCBFdmVudEhhbmRsZXIgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvZXZlbnRfaGFuZGxlcic7XG5pbXBvcnQgeyBEcmF3Q2FudmFzIH0gZnJvbSAnLi9ldmVudF9oYW5kbGVyL2RyYXdfY2FudmFzJztcbmltcG9ydCB7IEFkb3JuZXJzT3B0aW9ucywgQWRvcm5lcnNQYW5lbE9wdGlvbnMsIEFkb3JuZXJzUGFnZU9wdGlvbnMgfSBmcm9tICcuL2V2ZW50X2hhbmRsZXIvYWRvcm5lcnMnO1xuaW1wb3J0IHsgU3VydmV5SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJfc3VydmV5JztcblxuLyoqXG4gKiBTdXJ2ZXlQREYgb2JqZWN0IGNvbnRhaW5zIG9wdGlvbnMsIGV2ZW50cyBhbmQgbWV0aG9kcyB0byBleHBvcnQgUERGXG4gKi9cbmV4cG9ydCBjbGFzcyBTdXJ2ZXlQREYgZXh0ZW5kcyBTdXJ2ZXlNb2RlbCB7XG4gICAgcHJpdmF0ZSBfaGF2ZUNvbW1lcmNpYWxMaWNlbnNlOiBib29sZWFuO1xuICAgIHB1YmxpYyBvcHRpb25zOiBJRG9jT3B0aW9ucztcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoanNvbk9iamVjdDogYW55LCBvcHRpb25zPzogSURvY09wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoanNvbk9iamVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBTdXJ2ZXlIZWxwZXIuY2xvbmUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2hhdmVDb21tZXJjaWFsTGljZW5zZSA9IG9wdGlvbnMuY29tbWVyY2lhbCB8fCBvcHRpb25zLmhhdmVDb21tZXJjaWFsTGljZW5zZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogWW91IGhhdmUgcmlnaHQgdG8gc2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSBpZiB5b3UgaGF2ZSBib3VnaHQgdGhlIGNvbW1lcmNpYWwgbGljZW5jZSBvbmx5LlxuICAgICAqIEl0IHdpbGwgcmVtb3ZlIHRoZSB0ZXh0IGFib3V0IG5vbi1jb21tZXJpY2FsIHVzYWdlIG9uIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50LlxuICAgICAqIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0cnVlIHdpdGhvdXQgaGF2aW5nIGEgY29tbWVyY2lhbCBsaWNlbmNlIGlzIGlsbGVnYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhhdmVDb21tZXJjaWFsTGljZW5zZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hhdmVDb21tZXJjaWFsTGljZW5zZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBoYXZlQ29tbWVyY2lhbExpY2Vuc2UodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2hhdmVDb21tZXJjaWFsTGljZW5zZSA9IHZhbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGluIGZpcmVkIGZvciBldmVyeSByZW5kZXJlZCBwYWdlXG4gICAgICogQHBhcmFtIHN1cnZleSBTdXJ2ZXlQREYgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIGNhbnZhcyBEcmF3Q2FudmFzIG9iamVjdCB0aGF0IHlvdSBtYXkgdXNlIGl0IHRvIGRyYXcgdGV4dCBhbmQgaW1hZ2VzIGluIHRoZSBwYWdlIGhlYWRlclxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlckhlYWRlcjogRXZlbnQ8KHN1cnZleTogU3VydmV5UERGLCBjYW52YXM6IERyYXdDYW52YXMpID0+IGFueSwgYW55PiA9XG4gICAgICAgIG5ldyBFdmVudDwoc3VydmV5OiBTdXJ2ZXlQREYsIGNhbnZhczogRHJhd0NhbnZhcykgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGluIGZpcmVkIGZvciBldmVyeSByZW5kZXJlZCBwYWdlXG4gICAgICogQHBhcmFtIHN1cnZleSBTdXJ2ZXlQREYgb2JqZWN0IHRoYXQgZmlyZXMgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIGNhbnZhcyBEcmF3Q2FudmFzIG9iamVjdCB0aGF0IHlvdSBtYXkgdXNlIGl0IHRvIGRyYXcgdGV4dCBhbmQgaW1hZ2VzIGluIHRoZSBwYWdlIGZvb3RlclxuICAgICAqL1xuICAgIHB1YmxpYyBvblJlbmRlckZvb3RlcjogRXZlbnQ8KHN1cnZleTogU3VydmV5UERGLCBjYW52YXM6IERyYXdDYW52YXMpID0+IGFueSwgYW55PiA9XG4gICAgICAgIG5ldyBFdmVudDwoc3VydmV5OiBTdXJ2ZXlQREYsIGNhbnZhczogRHJhd0NhbnZhcykgPT4gYW55LCBhbnk+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50IGluIGZpcmVkIGZvciBldmVyeSByZW5kZXJlZCBxdWVzdGlvblxuICAgICAqIEBwYXJhbSBzdXJ2ZXkgU3VydmV5UERGIG9iamVjdCB0aGF0IGZpcmVzIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFkb3JuZXJzT3B0aW9ucyBvYmplY3QgdGhhdCBoYXZlIG9wdGlvbnMgdG8gY3VzdG9tIHJlbmRlciB0aGUgcXVlc3Rpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJRdWVzdGlvbjogRXZlbnRBc3luYzwoc3VydmV5OiBTdXJ2ZXlQREYsIG9wdGlvbnM6IEFkb3JuZXJzT3B0aW9ucykgPT4gYW55LCBhbnk+ID1cbiAgICAgICAgbmV3IEV2ZW50QXN5bmM8KHN1cnZleTogU3VydmV5UERGLCBvcHRpb25zOiBBZG9ybmVyc09wdGlvbnMpID0+IGFueSwgYW55PigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmVudCBpbiBmaXJlZCBmb3IgZXZlcnkgcmVuZGVyZWQgcGFuZWxcbiAgICAgKiBAcGFyYW0gc3VydmV5IFN1cnZleVBERiBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZG9ybmVyc1BhbmVsT3B0aW9ucyBvYmplY3QgdGhhdCBoYXZlIG9wdGlvbnMgdG8gY3VzdG9tIHJlbmRlciB0aGUgcGFuZWxcbiAgICAgKi9cbiAgICBwdWJsaWMgb25SZW5kZXJQYW5lbDogRXZlbnRBc3luYzwoc3VydmV5OiBTdXJ2ZXlQREYsIG9wdGlvbnM6IEFkb3JuZXJzUGFuZWxPcHRpb25zKSA9PiBhbnksIGFueT4gPVxuICAgICAgICBuZXcgRXZlbnRBc3luYzwoc3VydmV5OiBTdXJ2ZXlQREYsIG9wdGlvbnM6IEFkb3JuZXJzUGFuZWxPcHRpb25zKSA9PiBhbnksIGFueT4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnQgaW4gZmlyZWQgZm9yIGV2ZXJ5IHJlbmRlcmVkIHBhZ2VcbiAgICAgKiBAcGFyYW0gc3VydmV5IFN1cnZleVBERiBvYmplY3QgdGhhdCBmaXJlcyB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBZG9ybmVyc1BhZ2VPcHRpb25zIG9iamVjdCB0aGF0IGhhdmUgb3B0aW9ucyB0byBjdXN0b20gcmVuZGVyIHRoZSBwYWdlXG4gICAgICovXG4gICAgcHVibGljIG9uUmVuZGVyUGFnZTogRXZlbnRBc3luYzwoc3VydmV5OiBTdXJ2ZXlQREYsIG9wdGlvbnM6IEFkb3JuZXJzUGFnZU9wdGlvbnMpID0+IGFueSwgYW55PiA9XG4gICAgICAgIG5ldyBFdmVudEFzeW5jPChzdXJ2ZXk6IFN1cnZleVBERiwgb3B0aW9uczogQWRvcm5lcnNQYWdlT3B0aW9ucykgPT4gYW55LCBhbnk+KCk7XG4gICAgcHJpdmF0ZSB3YWl0Rm9yUXVlc3Rpb25Jc1JlYWR5KHF1ZXN0aW9uOiBRdWVzdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHF1ZXN0aW9uLmlzUmVhZHkpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWFkeUNhbGxiYWNrOiAoc2VuZGVyOiBRdWVzdGlvbiwgb3B0aW9uczogYW55KSA9PiB2b2lkID1cbiAgICAgICAgICAgICAgICAoXywgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmlzUmVhZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uLm9uUmVhZHlDaGFuZ2VkLnJlbW92ZShyZWFkeUNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcXVlc3Rpb24ub25SZWFkeUNoYW5nZWQuYWRkKHJlYWR5Q2FsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQ29yZUlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3QgcXVlc3Rpb24gb2YgdGhpcy5nZXRBbGxRdWVzdGlvbnMoKSkge1xuICAgICAgICAgICAgaWYgKCEhKDxhbnk+cXVlc3Rpb24pLmNvbnRlbnRQYW5lbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3Q6IFF1ZXN0aW9uW10gPSBbXTtcbiAgICAgICAgICAgICAgICAoPGFueT5xdWVzdGlvbikuY29udGVudFBhbmVsLmFkZFF1ZXN0aW9uc1RvTGlzdChsaXN0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlubmVyUXVlc3Rpb24gb2YgbGlzdCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JRdWVzdGlvbklzUmVhZHkoaW5uZXJRdWVzdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGlzLndhaXRGb3JRdWVzdGlvbklzUmVhZHkoXG4gICAgICAgICAgICAgICAgU3VydmV5SGVscGVyLmdldENvbnRlbnRRdWVzdGlvbig8UXVlc3Rpb24+cXVlc3Rpb24pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIHJlbmRlclN1cnZleShjb250cm9sbGVyOiBEb2NDb250cm9sbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckNvcmVJc1JlYWR5KCk7XG4gICAgICAgIGNvbnN0IGZsYXRzOiBJUGRmQnJpY2tbXVtdID0gYXdhaXQgRmxhdFN1cnZleS5nZW5lcmF0ZUZsYXRzKHRoaXMsIGNvbnRyb2xsZXIpO1xuICAgICAgICBjb25zdCBwYWNrczogSVBkZkJyaWNrW11bXSA9IFBhZ2VQYWNrZXIucGFjayhmbGF0cywgY29udHJvbGxlcik7XG4gICAgICAgIEV2ZW50SGFuZGxlci5wcm9jZXNzX2hlYWRlcl9ldmVudHModGhpcywgY29udHJvbGxlciwgcGFja3MpO1xuICAgICAgICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcGFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGo6IG51bWJlciA9IDA7IGogPCBwYWNrc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmdldE51bWJlck9mUGFnZXMoKSA9PT0gaSkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5zZXRQYWdlKGkpO1xuICAgICAgICAgICAgICAgIC8vZ2l6bW9zIGJyaWNrcyBib3JkZXJzIGZvciBkZWJ1Z1xuICAgICAgICAgICAgICAgIC8vIHBhY2tzW2ldW2pdLnVuZm9sZCgpLmZvckVhY2goKHJlY3Q6IElQZGZCcmljaykgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb250cm9sbGVyLmRvYy5zZXREcmF3Q29sb3IoJ2dyZWVuJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnJlY3QoLi4uU3VydmV5SGVscGVyLmNyZWF0ZUFjcm9mb3JtUmVjdChyZWN0KSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRyb2xsZXIuZG9jLnNldERyYXdDb2xvcignYmxhY2snKTtcbiAgICAgICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhY2tzW2ldW2pdLnJlbmRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgc2F2ZSBtZXRob2Qgb2Ygc3VydmV5UERGIG9iamVjdCB0byBkb3dubG9hZCBmaWxlIGluIGJyb3dzZXIuIFRoaXMgaXMgYXN5bmNocm9ub3VzIG1ldGhvZFxuICAgICAqIEBwYXJhbSBmaWxlTmFtZSBvcHRpb25hbCBmaWxlbmFtZSBwYXJhbWV0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2F2ZShmaWxlTmFtZTogc3RyaW5nID0gJ3N1cnZleV9yZXN1bHQucGRmJyk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIgPSBuZXcgRG9jQ29udHJvbGxlcih0aGlzLm9wdGlvbnMpO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIuZml4Rm9udChjb250cm9sbGVyKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTdXJ2ZXkoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5zYXZlKGZpbGVOYW1lLCB7IHJldHVyblByb21pc2U6IHRydWUgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgcmF3IG1ldGhvZCBvZiBzdXJ2ZXlQREYgdG8gZ2V0IFBERiBkb2N1bWVudCBhcyBzdHJpbmcgb2JqZWN0LiBUaGlzIGlzIGFzeW5jaHJvbm91cyBtZXRob2RcbiAgICAgKiBAcGFyYW0gdHlwZSBvbWl0IHRvIGdldCByYXcgc3RyaW5nLCBvciBwYXNzIFwiYmxvYlwiLCBcImJsb2J1cmxcIiBvciBcImRhdGF1cmxzdHJpbmdcIlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByYXcodHlwZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIgPSBuZXcgRG9jQ29udHJvbGxlcih0aGlzLm9wdGlvbnMpO1xuICAgICAgICBTdXJ2ZXlIZWxwZXIuZml4Rm9udChjb250cm9sbGVyKTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZW5kZXJTdXJ2ZXkoY29udHJvbGxlcik7XG4gICAgICAgIHJldHVybiBjb250cm9sbGVyLmRvYy5vdXRwdXQodHlwZSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3N1cnZleS50cyIsIlwidXNlIHN0cmljdFwiO1xyXG4vLyBBbiBhdWdtZW50ZWQgQVZMIFRyZWUgd2hlcmUgZWFjaCBub2RlIG1haW50YWlucyBhIGxpc3Qgb2YgcmVjb3JkcyBhbmQgdGhlaXIgc2VhcmNoIGludGVydmFscy5cclxuLy8gUmVjb3JkIGlzIGNvbXBvc2VkIG9mIGFuIGludGVydmFsIGFuZCBpdHMgdW5kZXJseWluZyBkYXRhLCBzZW50IGJ5IGEgY2xpZW50LiBUaGlzIGFsbG93cyB0aGVcclxuLy8gaW50ZXJ2YWwgdHJlZSB0byBoYXZlIHRoZSBzYW1lIGludGVydmFsIGluc2VydGVkIG11bHRpcGxlIHRpbWVzLCBhcyBsb25nIGl0cyBkYXRhIGlzIGRpZmZlcmVudC5cclxuLy8gQm90aCBpbnNlcnRpb24gYW5kIGRlbGV0aW9uIHJlcXVpcmUgTyhsb2cgbikgdGltZS4gU2VhcmNoaW5nIHJlcXVpcmVzIE8oaypsb2duKSB0aW1lLCB3aGVyZSBga2BcclxuLy8gaXMgdGhlIG51bWJlciBvZiBpbnRlcnZhbHMgaW4gdGhlIG91dHB1dCBsaXN0LlxyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbnZhciBpc1NhbWUgPSByZXF1aXJlKFwic2hhbGxvd2VxdWFsXCIpO1xyXG5mdW5jdGlvbiBoZWlnaHQobm9kZSkge1xyXG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBub2RlLmhlaWdodDtcclxuICAgIH1cclxufVxyXG52YXIgTm9kZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIE5vZGUoaW50ZXJ2YWxUcmVlLCByZWNvcmQpIHtcclxuICAgICAgICB0aGlzLmludGVydmFsVHJlZSA9IGludGVydmFsVHJlZTtcclxuICAgICAgICB0aGlzLnJlY29yZHMgPSBbXTtcclxuICAgICAgICB0aGlzLmhlaWdodCA9IDA7XHJcbiAgICAgICAgdGhpcy5rZXkgPSByZWNvcmQubG93O1xyXG4gICAgICAgIHRoaXMubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgLy8gU2F2ZSB0aGUgYXJyYXkgb2YgYWxsIHJlY29yZHMgd2l0aCB0aGUgc2FtZSBrZXkgZm9yIHRoaXMgbm9kZVxyXG4gICAgICAgIHRoaXMucmVjb3Jkcy5wdXNoKHJlY29yZCk7XHJcbiAgICB9XHJcbiAgICAvLyBHZXRzIHRoZSBoaWdoZXN0IHJlY29yZC5oaWdoIHZhbHVlIGZvciB0aGlzIG5vZGVcclxuICAgIE5vZGUucHJvdG90eXBlLmdldE5vZGVIaWdoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBoaWdoID0gdGhpcy5yZWNvcmRzWzBdLmhpZ2g7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLnJlY29yZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3Jkc1tpXS5oaWdoID4gaGlnaCkge1xyXG4gICAgICAgICAgICAgICAgaGlnaCA9IHRoaXMucmVjb3Jkc1tpXS5oaWdoO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBoaWdoO1xyXG4gICAgfTtcclxuICAgIC8vIFVwZGF0ZXMgaGVpZ2h0IHZhbHVlIG9mIHRoZSBub2RlLiBDYWxsZWQgZHVyaW5nIGluc2VydGlvbiwgcmViYWxhbmNlLCByZW1vdmFsXHJcbiAgICBOb2RlLnByb3RvdHlwZS51cGRhdGVIZWlnaHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBNYXRoLm1heChoZWlnaHQodGhpcy5sZWZ0KSwgaGVpZ2h0KHRoaXMucmlnaHQpKSArIDE7XHJcbiAgICB9O1xyXG4gICAgLy8gVXBkYXRlcyB0aGUgbWF4IHZhbHVlIG9mIGFsbCB0aGUgcGFyZW50cyBhZnRlciBpbnNlcnRpbmcgaW50byBhbHJlYWR5IGV4aXN0aW5nIG5vZGUsIGFzIHdlbGwgYXNcclxuICAgIC8vIHJlbW92aW5nIHRoZSBub2RlIGNvbXBsZXRlbHkgb3IgcmVtb3ZpbmcgdGhlIHJlY29yZCBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIG5vZGUuIFN0YXJ0cyB3aXRoXHJcbiAgICAvLyB0aGUgcGFyZW50IG9mIGFuIGFmZmVjdGVkIG5vZGUgYW5kIGJ1YmJsZXMgdXAgdG8gcm9vdFxyXG4gICAgTm9kZS5wcm90b3R5cGUudXBkYXRlTWF4T2ZQYXJlbnRzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSBNYXRoLm1heCh0aGlzLmxlZnQubWF4LCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXMucmlnaHQubWF4LCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IHRoaXNIaWdoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQudXBkYXRlTWF4T2ZQYXJlbnRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qXHJcbiAgICBMZWZ0LUxlZnQgY2FzZTpcclxuICBcclxuICAgICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5XHJcbiAgICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICAgXFxcclxuICAgICAgICAgeSAgIFQ0ICAgICAgUmlnaHQgUm90YXRlICh6KSAgICAgICAgICB4ICAgICB6XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgICAgLyBcXCAgIC8gXFxcclxuICAgICAgIHggICBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgLyBcXFxyXG4gICAgVDEgICBUMlxyXG4gIFxyXG4gICAgTGVmdC1SaWdodCBjYXNlOlxyXG4gIFxyXG4gICAgICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICB4XHJcbiAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXCAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgICAgeSAgIFQ0ICBMZWZ0IFJvdGF0ZSAoeSkgICAgICAgICB4ICBUNCAgUmlnaHQgUm90YXRlKHopICAgICB5ICAgICB6XHJcbiAgICAgIC8gXFwgICAgICAtIC0gLSAtIC0gLSAtIC0gLT4gICAgIC8gXFwgICAgICAtIC0gLSAtIC0gLSAtIC0+ICAvIFxcICAgLyBcXFxyXG4gICAgVDEgICB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAgVDMgICAgICAgICAgICAgICAgICAgICAgVDEgVDIgVDMgVDRcclxuICAgICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFxcclxuICAgICAgVDIgICBUMyAgICAgICAgICAgICAgICAgICAgICBUMSBUMlxyXG4gICAgKi9cclxuICAgIC8vIEhhbmRsZXMgTGVmdC1MZWZ0IGNhc2UgYW5kIExlZnQtUmlnaHQgY2FzZSBhZnRlciByZWJhbGFuY2luZyBBVkwgdHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3VwZGF0ZU1heEFmdGVyUmlnaHRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciBsZWZ0ID0gcGFyZW50LmxlZnQ7XHJcbiAgICAgICAgLy8gVXBkYXRlIG1heCBvZiBsZWZ0IHNpYmxpbmcgKHggaW4gZmlyc3QgY2FzZSwgeSBpbiBzZWNvbmQpXHJcbiAgICAgICAgdmFyIHRoaXNQYXJlbnRMZWZ0SGlnaCA9IGxlZnQuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAobGVmdC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgbGVmdC5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgodGhpc1BhcmVudExlZnRIaWdoLCBsZWZ0LnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxlZnQubGVmdCAhPT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IE1hdGgubWF4KHRoaXNQYXJlbnRMZWZ0SGlnaCwgbGVmdC5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxlZnQubGVmdCA9PT0gdW5kZWZpbmVkICYmIGxlZnQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBsZWZ0Lm1heCA9IHRoaXNQYXJlbnRMZWZ0SGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgobGVmdC5sZWZ0Lm1heCwgbGVmdC5yaWdodC5tYXgpLCB0aGlzUGFyZW50TGVmdEhpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIGl0c2VsZiAoeilcclxuICAgICAgICB2YXIgdGhpc0hpZ2ggPSB0aGlzLmdldE5vZGVIaWdoKCk7XHJcbiAgICAgICAgaWYgKHRoaXMubGVmdCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLnJpZ2h0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KHRoaXNIaWdoLCB0aGlzLmxlZnQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdGhpc0hpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1heCA9IE1hdGgubWF4KE1hdGgubWF4KHRoaXMubGVmdC5tYXgsIHRoaXMucmlnaHQubWF4KSwgdGhpc0hpZ2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHBhcmVudCAoeSBpbiBmaXJzdCBjYXNlLCB4IGluIHNlY29uZClcclxuICAgICAgICBwYXJlbnQubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgocGFyZW50LmxlZnQubWF4LCBwYXJlbnQucmlnaHQubWF4KSwgcGFyZW50LmdldE5vZGVIaWdoKCkpO1xyXG4gICAgfTtcclxuICAgIC8qXHJcbiAgICBSaWdodC1SaWdodCBjYXNlOlxyXG4gIFxyXG4gICAgICB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlcclxuICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gICBcXFxyXG4gICAgVDEgIHkgICAgIExlZnQgUm90YXRlKHopICAgICAgIHogICAgIHhcclxuICAgICAgIC8gXFwgICAtIC0gLSAtIC0gLSAtIC0+ICAgICAvIFxcICAgLyBcXFxyXG4gICAgICBUMiAgeCAgICAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAgICAvIFxcXHJcbiAgICAgICAgVDMgVDRcclxuICBcclxuICAgIFJpZ2h0LUxlZnQgY2FzZTpcclxuICBcclxuICAgICAgIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4XHJcbiAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgIC8gXFwgICAgICAgICAgICAgICAgICAgICAgICAgLyAgIFxcXHJcbiAgICAgVDEgIHkgICBSaWdodCBSb3RhdGUgKHkpICAgICBUMSAgeCAgICAgIExlZnQgUm90YXRlKHopICAgeiAgICAgeVxyXG4gICAgICAgIC8gXFwgIC0gLSAtIC0gLSAtIC0gLSAtPiAgICAgIC8gXFwgICAtIC0gLSAtIC0gLSAtIC0+ICAvIFxcICAgLyBcXFxyXG4gICAgICAgeCAgVDQgICAgICAgICAgICAgICAgICAgICAgICBUMiAgeSAgICAgICAgICAgICAgICAgICBUMSBUMiBUMyBUNFxyXG4gICAgICAvIFxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBcXFxyXG4gICAgVDIgICBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQzIFQ0XHJcbiAgICAqL1xyXG4gICAgLy8gSGFuZGxlcyBSaWdodC1SaWdodCBjYXNlIGFuZCBSaWdodC1MZWZ0IGNhc2UgaW4gcmViYWxhbmNpbmcgQVZMIHRyZWVcclxuICAgIE5vZGUucHJvdG90eXBlLl91cGRhdGVNYXhBZnRlckxlZnRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIHZhciByaWdodCA9IHBhcmVudC5yaWdodDtcclxuICAgICAgICAvLyBVcGRhdGUgbWF4IG9mIHJpZ2h0IHNpYmxpbmcgKHggaW4gZmlyc3QgY2FzZSwgeSBpbiBzZWNvbmQpXHJcbiAgICAgICAgdmFyIHRoaXNQYXJlbnRSaWdodEhpZ2ggPSByaWdodC5nZXROb2RlSGlnaCgpO1xyXG4gICAgICAgIGlmIChyaWdodC5sZWZ0ID09PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50UmlnaHRIaWdoLCByaWdodC5yaWdodC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyaWdodC5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgcmlnaHQucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heCh0aGlzUGFyZW50UmlnaHRIaWdoLCByaWdodC5sZWZ0Lm1heCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHJpZ2h0LmxlZnQgPT09IHVuZGVmaW5lZCAmJiByaWdodC5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0Lm1heCA9IHRoaXNQYXJlbnRSaWdodEhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByaWdodC5tYXggPSBNYXRoLm1heChNYXRoLm1heChyaWdodC5sZWZ0Lm1heCwgcmlnaHQucmlnaHQubWF4KSwgdGhpc1BhcmVudFJpZ2h0SGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgaXRzZWxmICh6KVxyXG4gICAgICAgIHZhciB0aGlzSGlnaCA9IHRoaXMuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMucmlnaHQubWF4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5yaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgodGhpc0hpZ2gsIHRoaXMubGVmdC5tYXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXggPSB0aGlzSGlnaDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gTWF0aC5tYXgoTWF0aC5tYXgodGhpcy5sZWZ0Lm1heCwgdGhpcy5yaWdodC5tYXgpLCB0aGlzSGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgcGFyZW50ICh5IGluIGZpcnN0IGNhc2UsIHggaW4gc2Vjb25kKVxyXG4gICAgICAgIHBhcmVudC5tYXggPSBNYXRoLm1heChNYXRoLm1heChwYXJlbnQubGVmdC5tYXgsIHJpZ2h0Lm1heCksIHBhcmVudC5nZXROb2RlSGlnaCgpKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fbGVmdFJvdGF0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgcmlnaHRDaGlsZCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcclxuICAgICAgICBpZiAocmlnaHRDaGlsZC5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVydmFsVHJlZS5yb290ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyaWdodENoaWxkLnBhcmVudC5sZWZ0ID09PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICByaWdodENoaWxkLnBhcmVudC5sZWZ0ID0gcmlnaHRDaGlsZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChyaWdodENoaWxkLnBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgcmlnaHRDaGlsZC5wYXJlbnQucmlnaHQgPSByaWdodENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmlnaHQgPSByaWdodENoaWxkLmxlZnQ7XHJcbiAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJpZ2h0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJpZ2h0Q2hpbGQubGVmdCA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSByaWdodENoaWxkO1xyXG4gICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KCk7XHJcbiAgICAgICAgcmlnaHRDaGlsZC51cGRhdGVIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgICBOb2RlLnByb3RvdHlwZS5fcmlnaHRSb3RhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIGxlZnRDaGlsZCA9IHRoaXMubGVmdDtcclxuICAgICAgICBsZWZ0Q2hpbGQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XHJcbiAgICAgICAgaWYgKGxlZnRDaGlsZC5wYXJlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVydmFsVHJlZS5yb290ID0gbGVmdENoaWxkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGxlZnRDaGlsZC5wYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgbGVmdENoaWxkLnBhcmVudC5sZWZ0ID0gbGVmdENoaWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxlZnRDaGlsZC5wYXJlbnQucmlnaHQgPT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIGxlZnRDaGlsZC5wYXJlbnQucmlnaHQgPSBsZWZ0Q2hpbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sZWZ0ID0gbGVmdENoaWxkLnJpZ2h0O1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxlZnQucGFyZW50ID0gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGVmdENoaWxkLnJpZ2h0ID0gdGhpcztcclxuICAgICAgICB0aGlzLnBhcmVudCA9IGxlZnRDaGlsZDtcclxuICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgIGxlZnRDaGlsZC51cGRhdGVIZWlnaHQoKTtcclxuICAgIH07XHJcbiAgICAvLyBSZWJhbGFuY2VzIHRoZSB0cmVlIGlmIHRoZSBoZWlnaHQgdmFsdWUgYmV0d2VlbiB0d28gbm9kZXMgb2YgdGhlIHNhbWUgcGFyZW50IGlzIGdyZWF0ZXIgdGhhblxyXG4gICAgLy8gdHdvLiBUaGVyZSBhcmUgNCBjYXNlcyB0aGF0IGNhbiBoYXBwZW4gd2hpY2ggYXJlIG91dGxpbmVkIGluIHRoZSBncmFwaGljcyBhYm92ZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX3JlYmFsYW5jZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoaGVpZ2h0KHRoaXMubGVmdCkgPj0gMiArIGhlaWdodCh0aGlzLnJpZ2h0KSkge1xyXG4gICAgICAgICAgICB2YXIgbGVmdCA9IHRoaXMubGVmdDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodChsZWZ0LmxlZnQpID49IGhlaWdodChsZWZ0LnJpZ2h0KSkge1xyXG4gICAgICAgICAgICAgICAgLy8gTGVmdC1MZWZ0IGNhc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBMZWZ0LVJpZ2h0IGNhc2VcclxuICAgICAgICAgICAgICAgIGxlZnQuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVNYXhBZnRlclJpZ2h0Um90YXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaGVpZ2h0KHRoaXMucmlnaHQpID49IDIgKyBoZWlnaHQodGhpcy5sZWZ0KSkge1xyXG4gICAgICAgICAgICB2YXIgcmlnaHQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0KHJpZ2h0LnJpZ2h0KSA+PSBoZWlnaHQocmlnaHQubGVmdCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFJpZ2h0LVJpZ2h0IGNhc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gUmlnaHQtTGVmdCBjYXNlXHJcbiAgICAgICAgICAgICAgICByaWdodC5fcmlnaHRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xlZnRSb3RhdGUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1heEFmdGVyTGVmdFJvdGF0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChyZWNvcmQpIHtcclxuICAgICAgICBpZiAocmVjb3JkLmxvdyA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIGxlZnQgc3VidHJlZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5sZWZ0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGVmdCA9IG5ldyBOb2RlKHRoaXMuaW50ZXJ2YWxUcmVlLCByZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0LnBhcmVudCA9IHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxlZnQuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEluc2VydCBpbnRvIHJpZ2h0IHN1YnRyZWVcclxuICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodCA9IG5ldyBOb2RlKHRoaXMuaW50ZXJ2YWxUcmVlLCByZWNvcmQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yaWdodC5pbnNlcnQocmVjb3JkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIG1heCB2YWx1ZSBvZiB0aGlzIGFuY2VzdG9yIGlmIG5lZWRlZFxyXG4gICAgICAgIGlmICh0aGlzLm1heCA8IHJlY29yZC5oaWdoKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gcmVjb3JkLmhpZ2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFVwZGF0ZSBoZWlnaHQgb2YgZWFjaCBub2RlXHJcbiAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQoKTtcclxuICAgICAgICAvLyBSZWJhbGFuY2UgdGhlIHRyZWUgdG8gZW5zdXJlIGFsbCBvcGVyYXRpb25zIGFyZSBleGVjdXRlZCBpbiBPKGxvZ24pIHRpbWUuIFRoaXMgaXMgZXNwZWNpYWxseVxyXG4gICAgICAgIC8vIGltcG9ydGFudCBpbiBzZWFyY2hpbmcsIGFzIHRoZSB0cmVlIGhhcyBhIGhpZ2ggY2hhbmNlIG9mIGRlZ2VuZXJhdGluZyB3aXRob3V0IHRoZSByZWJhbGFuY2luZ1xyXG4gICAgICAgIHRoaXMuX3JlYmFsYW5jZSgpO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLl9nZXRPdmVybGFwcGluZ1JlY29yZHMgPSBmdW5jdGlvbiAoY3VycmVudE5vZGUsIGxvdywgaGlnaCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5rZXkgPD0gaGlnaCAmJiBsb3cgPD0gY3VycmVudE5vZGUuZ2V0Tm9kZUhpZ2goKSkge1xyXG4gICAgICAgICAgICAvLyBOb2RlcyBhcmUgb3ZlcmxhcHBpbmcsIGNoZWNrIGlmIGluZGl2aWR1YWwgcmVjb3JkcyBpbiB0aGUgbm9kZSBhcmUgb3ZlcmxhcHBpbmdcclxuICAgICAgICAgICAgdmFyIHRlbXBSZXN1bHRzID0gW107XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VycmVudE5vZGUucmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLnJlY29yZHNbaV0uaGlnaCA+PSBsb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wUmVzdWx0cy5wdXNoKGN1cnJlbnROb2RlLnJlY29yZHNbaV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0ZW1wUmVzdWx0cztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICAvLyBEb24ndCBzZWFyY2ggbm9kZXMgdGhhdCBkb24ndCBleGlzdFxyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgbGVmdFNlYXJjaCA9IFtdO1xyXG4gICAgICAgIHZhciBvd25TZWFyY2ggPSBbXTtcclxuICAgICAgICB2YXIgcmlnaHRTZWFyY2ggPSBbXTtcclxuICAgICAgICAvLyBJZiBpbnRlcnZhbCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCBwb2ludCBvZiBhbnkgaW50ZXJ2YWwgaW4gdGhpcyBub2RlIGFuZCBhbGwgaXRzXHJcbiAgICAgICAgLy8gY2hpbGRyZW4sIHRoZXJlIHdvbid0IGJlIGFueSBtYXRjaGVzXHJcbiAgICAgICAgaWYgKGxvdyA+IHRoaXMubWF4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2VhcmNoIGxlZnQgY2hpbGRyZW5cclxuICAgICAgICBpZiAodGhpcy5sZWZ0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5sZWZ0Lm1heCA+PSBsb3cpIHtcclxuICAgICAgICAgICAgbGVmdFNlYXJjaCA9IHRoaXMubGVmdC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQ2hlY2sgdGhpcyBub2RlXHJcbiAgICAgICAgb3duU2VhcmNoID0gdGhpcy5fZ2V0T3ZlcmxhcHBpbmdSZWNvcmRzKHRoaXMsIGxvdywgaGlnaCk7XHJcbiAgICAgICAgLy8gSWYgaW50ZXJ2YWwgaXMgdG8gdGhlIGxlZnQgb2YgdGhlIHN0YXJ0IG9mIHRoaXMgaW50ZXJ2YWwsIHRoZW4gaXQgY2FuJ3QgYmUgaW4gYW55IGNoaWxkIHRvXHJcbiAgICAgICAgLy8gdGhlIHJpZ2h0XHJcbiAgICAgICAgaWYgKGhpZ2ggPCB0aGlzLmtleSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbGVmdFNlYXJjaC5jb25jYXQob3duU2VhcmNoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWFyY2ggcmlnaHQgY2hpbGRyZW5cclxuICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJpZ2h0U2VhcmNoID0gdGhpcy5yaWdodC5zZWFyY2gobG93LCBoaWdoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gUmV0dXJuIGFjY3VtdWxhdGVkIHJlc3VsdHMsIGlmIGFueVxyXG4gICAgICAgIHJldHVybiBsZWZ0U2VhcmNoLmNvbmNhdChvd25TZWFyY2gsIHJpZ2h0U2VhcmNoKTtcclxuICAgIH07XHJcbiAgICAvLyBTZWFyY2hlcyBmb3IgYSBub2RlIGJ5IGEgYGtleWAgdmFsdWVcclxuICAgIE5vZGUucHJvdG90eXBlLnNlYXJjaEV4aXN0aW5nID0gZnVuY3Rpb24gKGxvdykge1xyXG4gICAgICAgIGlmICh0aGlzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMua2V5ID09PSBsb3cpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGxvdyA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5zZWFyY2hFeGlzdGluZyhsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaWdodC5zZWFyY2hFeGlzdGluZyhsb3cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG4gICAgLy8gUmV0dXJucyB0aGUgc21hbGxlc3Qgbm9kZSBvZiB0aGUgc3VidHJlZVxyXG4gICAgTm9kZS5wcm90b3R5cGUuX21pblZhbHVlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmxlZnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlZnQuX21pblZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIE5vZGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xyXG4gICAgICAgIGlmIChub2RlLmtleSA8IHRoaXMua2V5KSB7XHJcbiAgICAgICAgICAgIC8vIE5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBvbiB0aGUgbGVmdCBzaWRlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVmdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG5vZGUua2V5ID4gdGhpcy5rZXkpIHtcclxuICAgICAgICAgICAgLy8gTm9kZSB0byBiZSByZW1vdmVkIGlzIG9uIHRoZSByaWdodCBzaWRlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJlbW92ZShub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxlZnQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgaGFzIHR3byBjaGlsZHJlblxyXG4gICAgICAgICAgICAgICAgdmFyIG1pblZhbHVlID0gdGhpcy5yaWdodC5fbWluVmFsdWUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMua2V5ID0gbWluVmFsdWUua2V5O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRzID0gbWluVmFsdWUucmVjb3JkcztcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJpZ2h0LnJlbW92ZSh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChwYXJlbnQubGVmdCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoaWxkIG9yIG5vIGNoaWxkIGNhc2Ugb24gbGVmdCBzaWRlXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSB0aGlzLnJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmlnaHQucGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmxlZnQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Ll9yZWJhbGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmVudC5yaWdodCA9PT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoaWxkIG9yIG5vIGNoaWxkIGNhc2Ugb24gcmlnaHQgc2lkZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5yaWdodCA9IHRoaXMucmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmlnaHQgPSB0aGlzLmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdC5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50LnVwZGF0ZUhlaWdodCgpO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50Ll9yZWJhbGFuY2UoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiBOb2RlO1xyXG59KCkpO1xyXG5leHBvcnRzLk5vZGUgPSBOb2RlO1xyXG52YXIgSW50ZXJ2YWxUcmVlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSW50ZXJ2YWxUcmVlKCkge1xyXG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xyXG4gICAgfVxyXG4gICAgSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbiAocmVjb3JkKSB7XHJcbiAgICAgICAgaWYgKHJlY29yZC5sb3cgPiByZWNvcmQuaGlnaCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Bsb3dgIHZhbHVlIG11c3QgYmUgbG93ZXIgb3IgZXF1YWwgdG8gYGhpZ2hgIHZhbHVlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBCYXNlIGNhc2U6IFRyZWUgaXMgZW1wdHksIG5ldyBub2RlIGJlY29tZXMgcm9vdFxyXG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBuZXcgTm9kZSh0aGlzLCByZWNvcmQpO1xyXG4gICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjaGVjayBpZiBub2RlIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUga2V5XHJcbiAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5yb290LnNlYXJjaEV4aXN0aW5nKHJlY29yZC5sb3cpO1xyXG4gICAgICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcmVjb3JkcyBpbiB0aGlzIG5vZGUgaWYgdGhlcmUgYWxyZWFkeSBpcyB0aGUgb25lIHdpdGggc2FtZSBsb3csIGhpZ2gsIGRhdGFcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbaV0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZWNvcmQgaXMgc2FtZSBhcyB0aGUgb25lIHdlJ3JlIHRyeWluZyB0byBpbnNlcnQ7IHJldHVybiBmYWxzZSB0byBpbmRpY2F0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGhhcyBiZWVuIGluc2VydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJlY29yZCB0byB0aGUgbm9kZVxyXG4gICAgICAgICAgICAgICAgbm9kZS5yZWNvcmRzLnB1c2gocmVjb3JkKTtcclxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnRzIGlmIG5lY2Vzc2FyeVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5oaWdoID4gbm9kZS5tYXgpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLm1heCA9IHJlY29yZC5oaWdoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudC51cGRhdGVNYXhPZlBhcmVudHMoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBkb2Vzbid0IGFscmVhZHkgZXhpc3QuIENhbGwgaW5zZXJ0IGZ1bmN0aW9uIG9uIHJvb3QncyBub2RlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3QuaW5zZXJ0KHJlY29yZCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvdW50Kys7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gVHJlZSBpcyBlbXB0eTsgcmV0dXJuIGVtcHR5IGFycmF5XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Quc2VhcmNoKGxvdywgaGlnaCk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKHJlY29yZCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBUcmVlIGlzIGVtcHR5OyBub3RoaW5nIHRvIHJlbW92ZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMucm9vdC5zZWFyY2hFeGlzdGluZyhyZWNvcmQubG93KTtcclxuICAgICAgICAgICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUucmVjb3Jkcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZFJlY29yZCA9IHZvaWQgMDtcclxuICAgICAgICAgICAgICAgIC8vIE5vZGUgd2l0aCB0aGlzIGtleSBoYXMgMiBvciBtb3JlIHJlY29yZHMuIEZpbmQgdGhlIG9uZSB3ZSBuZWVkIGFuZCByZW1vdmUgaXRcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5yZWNvcmRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbaV0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFJlY29yZCA9IG5vZGUucmVjb3Jkc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZWNvcmRzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWRSZWNvcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdmVkUmVjb3JkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtYXggb2YgdGhhdCBub2RlIGFuZCBpdHMgcGFyZW50cyBpZiBuZWNlc3NhcnlcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmhpZ2ggPT09IG5vZGUubWF4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlSGlnaCA9IG5vZGUuZ2V0Tm9kZUhpZ2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGVmdCAhPT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChNYXRoLm1heChub2RlLmxlZnQubWF4LCBub2RlLnJpZ2h0Lm1heCksIG5vZGVIaWdoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmxlZnQgIT09IHVuZGVmaW5lZCAmJiBub2RlLnJpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubWF4ID0gTWF0aC5tYXgobm9kZS5sZWZ0Lm1heCwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUubGVmdCA9PT0gdW5kZWZpbmVkICYmIG5vZGUucmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBNYXRoLm1heChub2RlLnJpZ2h0Lm1heCwgbm9kZUhpZ2gpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5tYXggPSBub2RlSGlnaDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50LnVwZGF0ZU1heE9mUGFyZW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChub2RlLnJlY29yZHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBOb2RlIHdpdGggdGhpcyBrZXkgaGFzIG9ubHkgMSByZWNvcmQuIENoZWNrIGlmIHRoZSByZW1haW5pbmcgcmVjb3JkIGluIHRoaXMgbm9kZSBpc1xyXG4gICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgdGhlIG9uZSB3ZSB3YW50IHRvIHJlbW92ZVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzU2FtZShub2RlLnJlY29yZHNbMF0sIHJlY29yZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVtYWluaW5nIHJlY29yZCBpcyB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlLiBSZW1vdmUgdGhlIHdob2xlIG5vZGUgZnJvbSB0aGUgdHJlZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3Qua2V5ID09PSBub2RlLmtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSByZW1vdmluZyB0aGUgcm9vdCBlbGVtZW50LiBDcmVhdGUgYSBkdW1teSBub2RlIHRoYXQgd2lsbCB0ZW1wb3JhcmlseSB0YWtlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvb3QncyBwYXJlbnQgcm9sZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdFBhcmVudCA9IG5ldyBOb2RlKHRoaXMsIHsgbG93OiByZWNvcmQubG93LCBoaWdoOiByZWNvcmQubG93IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb290UGFyZW50LmxlZnQgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdC5wYXJlbnQgPSByb290UGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZE5vZGUgPSB0aGlzLnJvb3QucmVtb3ZlKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290UGFyZW50LmxlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290LnBhcmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWROb2RlID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudC0tO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1vdmVkTm9kZSA9IHRoaXMucm9vdC5yZW1vdmUobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZE5vZGUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50LS07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgcmVjb3JkIGlzIG5vdCB0aGUgb25lIHdlIHdhbnQgdG8gcmVtb3ZlXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gTm8gcmVjb3JkcyBhdCBhbGwgaW4gdGhpcyBub2RlPyEgU2hvdWxkbid0IGhhcHBlblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIEludGVydmFsVHJlZS5wcm90b3R5cGUuaW5PcmRlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IEluT3JkZXIodGhpcy5yb290KTtcclxuICAgIH07XHJcbiAgICBJbnRlcnZhbFRyZWUucHJvdG90eXBlLnByZU9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJlT3JkZXIodGhpcy5yb290KTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gSW50ZXJ2YWxUcmVlO1xyXG59KCkpO1xyXG5leHBvcnRzLkludGVydmFsVHJlZSA9IEludGVydmFsVHJlZTtcclxudmFyIERhdGFJbnRlcnZhbFRyZWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBEYXRhSW50ZXJ2YWxUcmVlKCkge1xyXG4gICAgICAgIHRoaXMudHJlZSA9IG5ldyBJbnRlcnZhbFRyZWUoKTtcclxuICAgIH1cclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLmluc2VydCh7IGxvdzogbG93LCBoaWdoOiBoaWdoLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChsb3csIGhpZ2gsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnJlbW92ZSh7IGxvdzogbG93LCBoaWdoOiBoaWdoLCBkYXRhOiBkYXRhIH0pO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnNlYXJjaCA9IGZ1bmN0aW9uIChsb3csIGhpZ2gpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmVlLnNlYXJjaChsb3csIGhpZ2gpLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi5kYXRhOyB9KTtcclxuICAgIH07XHJcbiAgICBEYXRhSW50ZXJ2YWxUcmVlLnByb3RvdHlwZS5pbk9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUuaW5PcmRlcigpO1xyXG4gICAgfTtcclxuICAgIERhdGFJbnRlcnZhbFRyZWUucHJvdG90eXBlLnByZU9yZGVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWUucHJlT3JkZXIoKTtcclxuICAgIH07XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0YUludGVydmFsVHJlZS5wcm90b3R5cGUsIFwiY291bnRcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmVlLmNvdW50O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIERhdGFJbnRlcnZhbFRyZWU7XHJcbn0oKSk7XHJcbmV4cG9ydHMuZGVmYXVsdCA9IERhdGFJbnRlcnZhbFRyZWU7XHJcbnZhciBJbk9yZGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xyXG4gICAgZnVuY3Rpb24gSW5PcmRlcihzdGFydE5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICAgICAgaWYgKHN0YXJ0Tm9kZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaChzdGFydE5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEluT3JkZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gV2lsbCBvbmx5IGhhcHBlbiBpZiBzdGFjayBpcyBlbXB0eSBhbmQgcG9wIGlzIGNhbGxlZFxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcm9jZXNzIHRoaXMgbm9kZVxyXG4gICAgICAgIGlmICh0aGlzLmkgPCB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHNbdGhpcy5pKytdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE1pZ2h0IHBvcCB0aGUgbGFzdCBhbmQgc2V0IHRoaXMuY3VycmVudE5vZGUgPSB1bmRlZmluZWRcclxuICAgICAgICAgICAgdGhpcy5wb3AoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV4dCgpO1xyXG4gICAgfTtcclxuICAgIEluT3JkZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSBub2RlO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuY3VycmVudE5vZGUubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh0aGlzLmN1cnJlbnROb2RlKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuY3VycmVudE5vZGUubGVmdDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgSW5PcmRlci5wcm90b3R5cGUucG9wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3VycmVudE5vZGUgPSB0aGlzLnN0YWNrLnBvcCgpO1xyXG4gICAgICAgIHRoaXMuaSA9IDA7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIEluT3JkZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuSW5PcmRlciA9IEluT3JkZXI7XHJcbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBJbk9yZGVyLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcclxufVxyXG52YXIgUHJlT3JkZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBQcmVPcmRlcihzdGFydE5vZGUpIHtcclxuICAgICAgICB0aGlzLnN0YWNrID0gW107XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgICAgICB0aGlzLmN1cnJlbnROb2RlID0gc3RhcnROb2RlO1xyXG4gICAgfVxyXG4gICAgUHJlT3JkZXIucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gV2lsbCBvbmx5IGhhcHBlbiBpZiBzdGFjayBpcyBlbXB0eSBhbmQgcG9wIGlzIGNhbGxlZCxcclxuICAgICAgICAvLyB3aGljaCBvbmx5IGhhcHBlbnMgaWYgdGhlcmUgaXMgbm8gcmlnaHQgbm9kZSAoaS5lIHdlIGFyZSBkb25lKVxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnROb2RlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRvbmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBQcm9jZXNzIHRoaXMgbm9kZVxyXG4gICAgICAgIGlmICh0aGlzLmkgPCB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBkb25lOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmN1cnJlbnROb2RlLnJlY29yZHNbdGhpcy5pKytdLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Tm9kZS5yaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLnJpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudE5vZGUubGVmdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHVzaCh0aGlzLmN1cnJlbnROb2RlLmxlZnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvcCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5leHQoKTtcclxuICAgIH07XHJcbiAgICBQcmVPcmRlci5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgICAgdGhpcy5zdGFjay5wdXNoKG5vZGUpO1xyXG4gICAgfTtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Tm9kZSA9IHRoaXMuc3RhY2sucG9wKCk7XHJcbiAgICAgICAgdGhpcy5pID0gMDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gUHJlT3JkZXI7XHJcbn0oKSk7XHJcbmV4cG9ydHMuUHJlT3JkZXIgPSBQcmVPcmRlcjtcclxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcclxuICAgIFByZU9yZGVyLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcclxufVxyXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL34vbm9kZS1pbnRlcnZhbC10cmVlL2xpYi9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiLy9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQiwgY29tcGFyZSwgY29tcGFyZUNvbnRleHQpIHtcbiAgdmFyIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIG9iakEsIG9iakIpIDogdm9pZCAwO1xuXG4gIGlmIChyZXQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiAhIXJldDtcbiAgfVxuXG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgIW9iakEgfHwgdHlwZW9mIG9iakIgIT09IFwib2JqZWN0XCIgfHwgIW9iakIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBrZXlzQS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlQSA9IG9iakFba2V5XTtcbiAgICB2YXIgdmFsdWVCID0gb2JqQltrZXldO1xuXG4gICAgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgdmFsdWVBLCB2YWx1ZUIsIGtleSkgOiB2b2lkIDA7XG5cbiAgICBpZiAocmV0ID09PSBmYWxzZSB8fCAocmV0ID09PSB2b2lkIDAgJiYgdmFsdWVBICE9PSB2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9+L3NoYWxsb3dlcXVhbC9pbmRleC5qc1xuLy8gbW9kdWxlIGlkID0gNTZcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2V0UmFkaW9BcHBlYXJhbmNlKGRvYzogYW55KTogYW55IHtcbiAgICBjb25zdCBvbGRBcHBlYXJhbmNlRnVuY2l0aW9uOiBGdW5jdGlvbiA9IGRvYy5BY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLlllc05vcm1hbDtcbiAgICBkb2MuQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNOb3JtYWwgPSBmdW5jdGlvbihmb3JtT2JqZWN0OiBhbnkpIHtcbiAgICAgICAgY29uc3QgeG9iajogYW55ID0gb2xkQXBwZWFyYW5jZUZ1bmNpdGlvbihmb3JtT2JqZWN0KTtcbiAgICAgICAgY29uc3Qgc3RyZWFtOiBzdHJpbmdbXSA9IHhvYmouc3RyZWFtLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgZW5jb2RlQ29sb3I6IHN0cmluZyA9IGRvYy5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgc3RyZWFtWzBdID0gc3RyZWFtWzBdICsgJ1xcbicgKyBlbmNvZGVDb2xvciArICdcXG4nICsgZW5jb2RlQ29sb3IudG9VcHBlckNhc2UoKTtcbiAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbignXFxuJyk7XG4gICAgICAgIHJldHVybiB4b2JqO1xuICAgIH07XG59XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2pzcGRmX3BsdWdpbnMvYWNyb2Zvcm0udHMiLCJpbXBvcnQgeyBJUXVlc3Rpb24gfSBmcm9tICdzdXJ2ZXktY29yZSc7XG5pbXBvcnQgeyBJUmVjdCwgRG9jQ29udHJvbGxlciB9IGZyb20gJy4uL2RvY19jb250cm9sbGVyJztcbmltcG9ydCB7IFRleHRCcmljayB9IGZyb20gJy4vcGRmX3RleHQnO1xuXG5leHBvcnQgY2xhc3MgRGVzY3JpcHRpb25CcmljayBleHRlbmRzIFRleHRCcmljayB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHF1ZXN0aW9uOiBJUXVlc3Rpb24sIGNvbnRyb2xsZXI6IERvY0NvbnRyb2xsZXIsXG4gICAgICAgIHJlY3Q6IElSZWN0LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocXVlc3Rpb24sIGNvbnRyb2xsZXIsIHJlY3QsIHRleHQpO1xuICAgIH1cbn1cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvcGRmX3JlbmRlci9wZGZfZGVzY3JpcHRpb24udHMiLCJ2YXIgZztcclxuXHJcbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXHJcbmcgPSAoZnVuY3Rpb24oKSB7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn0pKCk7XHJcblxyXG50cnkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxyXG5cdGcgPSBnIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSB8fCAoMSxldmFsKShcInRoaXNcIik7XHJcbn0gY2F0Y2goZSkge1xyXG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXHJcblx0aWYodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIilcclxuXHRcdGcgPSB3aW5kb3c7XHJcbn1cclxuXHJcbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cclxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3NcclxuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBnO1xyXG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAod2VicGFjaykvYnVpbGRpbi9nbG9iYWwuanNcbi8vIG1vZHVsZSBpZCA9IDU5XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIi8qIGdsb2JhbCBqc1BERiAqL1xuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChjKSAyMDE2IEFsZXhhbmRlciBXZWlkdCxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9CaWdnQTk0XG4gKiBcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlXG4gKi9cblxuLyoqIFxuKiBqc1BERiBBY3JvRm9ybSBQbHVnaW5cbiogQG1vZHVsZSBBY3JvRm9ybVxuKi9cbnZhciBqc3BkZiA9IHJlcXVpcmUoJ2pzcGRmJyk7XG4oZnVuY3Rpb24gKGpzUERGLCBnbG9iYWxPYmopIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIganNQREZBUEkgPSBqc1BERi5BUEk7XG4gICAgdmFyIHNjb3BlO1xuICAgIHZhciBzY2FsZUZhY3RvciA9IDE7XG4gICAgZnVuY3Rpb24gdG9Vbmljb2RlKHN0cikge1xuICAgICAgICB2YXIgdW5pY29kZVN0cmluZyA9ICcnO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHRoZVVuaWNvZGUgPSBzdHIuY2hhckNvZGVBdChpKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIHdoaWxlICh0aGVVbmljb2RlLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgICAgICAgICB0aGVVbmljb2RlID0gJzAnICsgdGhlVW5pY29kZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB1bmljb2RlU3RyaW5nICs9IHRoZVVuaWNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICc8RkVGRicgKyB1bmljb2RlU3RyaW5nICsgJz4nO1xuICAgIH1cbiAgICB2YXIgcGRmRXNjYXBlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoL1xcKC9nLCAnXFxcXCgnKS5yZXBsYWNlKC9cXCkvZywgJ1xcXFwpJykgfTtcbiAgICB2YXIgcGRmVW5lc2NhcGUgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcXFxcXFxcL2csICdcXFxcJykucmVwbGFjZSgvXFxcXFxcKC9nLCAnKCcpLnJlcGxhY2UoL1xcXFxcXCkvZywgJyknKTsgfTtcbiAgICBmdW5jdGlvbiBhcnJheVRvUGRmVW5pY29kZUFycmF5KHZhbHVlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAnWyAnO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9Vbmljb2RlKHZhbHVlW2ldKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgKz0gJyBdJ1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB2YXIgZjIgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBudW1iZXIudG9GaXhlZCgyKTsgLy8gSWUsICUuMmZcbiAgICB9O1xuXG4gICAgdmFyIGY1ID0gZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICByZXR1cm4gbnVtYmVyLnRvRml4ZWQoNSk7IC8vIEllLCAlLjJmXG4gICAgfTtcblxuICAgIGpzUERGQVBJLl9fYWNyb2Zvcm1fXyA9IHt9O1xuICAgIHZhciBpbmhlcml0ID0gZnVuY3Rpb24gKGNoaWxkLCBwYXJlbnQpIHtcbiAgICAgICAgY2hpbGQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgICAgICAgY2hpbGQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2hpbGQ7XG4gICAgfTtcblxuICAgIHZhciBzY2FsZSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiAoeCAqIHNjYWxlRmFjdG9yKTtcbiAgICB9O1xuICAgIHZhciBhbnRpU2NhbGUgPSBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gKHggLyBzY2FsZUZhY3Rvcik7XG4gICAgfTtcblxuICAgIHZhciBjcmVhdGVGb3JtWE9iamVjdCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIHZhciB4b2JqID0gbmV3IEFjcm9Gb3JtWE9iamVjdCgpO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICB2YXIgd2lkdGggPSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgeG9iai5CQm94ID0gWzAsIDAsIE51bWJlcihmMih3aWR0aCkpLCBOdW1iZXIoZjIoaGVpZ2h0KSldO1xuICAgICAgICByZXR1cm4geG9iajtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBCaXQtT3BlcmF0aW9uc1xuICAgICovXG4gICAgdmFyIHNldEJpdCA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXQgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBudW1iZXIgPSBudW1iZXIgfHwgMDtcbiAgICAgICAgYml0UG9zaXRpb24gPSBiaXRQb3NpdGlvbiB8fCAwO1xuXG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYml0TWFzayA9IDEgPDwgYml0UG9zaXRpb247XG5cbiAgICAgICAgbnVtYmVyIHw9IGJpdE1hc2s7XG5cbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9O1xuXG4gICAgdmFyIGNsZWFyQml0ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmNsZWFyQml0ID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgbnVtYmVyID0gbnVtYmVyIHx8IDA7XG4gICAgICAgIGJpdFBvc2l0aW9uID0gYml0UG9zaXRpb24gfHwgMDtcblxuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uY2xlYXJCaXQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgYml0TWFzayA9IDEgPDwgYml0UG9zaXRpb247XG5cbiAgICAgICAgbnVtYmVyICY9IH5iaXRNYXNrO1xuXG4gICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgfTtcblxuICAgIHZhciBnZXRCaXQgPSBqc1BERkFQSS5fX2Fjcm9mb3JtX18uZ2V0Qml0ID0gZnVuY3Rpb24gKG51bWJlciwgYml0UG9zaXRpb24pIHtcbiAgICAgICAgaWYgKGlzTmFOKG51bWJlcikgfHwgaXNOYU4oYml0UG9zaXRpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzIHBhc3NlZCB0byBqc1BERi5BUEkuX19hY3JvZm9ybV9fLmdldEJpdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAobnVtYmVyICYgKDEgPDwgYml0UG9zaXRpb24pKSA9PT0gMCA/IDAgOiAxO1xuICAgIH07XG5cbiAgICAvKlxuICAgICogRmYgc3RhcnRzIGNvdW50aW5nIHRoZSBiaXQgcG9zaXRpb24gYXQgMSBhbmQgbm90IGxpa2UgamF2YXNjcmlwdCBhdCAwXG4gICAgKi9cbiAgICB2YXIgZ2V0Qml0Rm9yUGRmID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmdldEJpdEZvclBkZiA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5nZXRCaXRGb3JQZGYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0Qml0KG51bWJlciwgYml0UG9zaXRpb24gLSAxKTtcbiAgICB9O1xuXG4gICAgdmFyIHNldEJpdEZvclBkZiA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5zZXRCaXRGb3JQZGYgPSBmdW5jdGlvbiAobnVtYmVyLCBiaXRQb3NpdGlvbikge1xuICAgICAgICBpZiAoaXNOYU4obnVtYmVyKSB8fCBpc05hTihiaXRQb3NpdGlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudHMgcGFzc2VkIHRvIGpzUERGLkFQSS5fX2Fjcm9mb3JtX18uc2V0Qml0Rm9yUGRmJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNldEJpdChudW1iZXIsIGJpdFBvc2l0aW9uIC0gMSk7XG4gICAgfTtcblxuICAgIHZhciBjbGVhckJpdEZvclBkZiA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdEZvclBkZiA9IGZ1bmN0aW9uIChudW1iZXIsIGJpdFBvc2l0aW9uKSB7XG4gICAgICAgIGlmIChpc05hTihudW1iZXIpIHx8IGlzTmFOKGJpdFBvc2l0aW9uKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cyBwYXNzZWQgdG8ganNQREYuQVBJLl9fYWNyb2Zvcm1fXy5jbGVhckJpdEZvclBkZicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGVhckJpdChudW1iZXIsIGJpdFBvc2l0aW9uIC0gMSk7XG4gICAgfTtcblxuICAgIHZhciBjYWxjdWxhdGVDb29yZGluYXRlcyA9IGpzUERGQVBJLl9fYWNyb2Zvcm1fXy5jYWxjdWxhdGVDb29yZGluYXRlcyA9IGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgICAgIHZhciBnZXRIb3Jpem9udGFsQ29vcmRpbmF0ZSA9IHRoaXMuaW50ZXJuYWwuZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGU7XG4gICAgICAgIHZhciBnZXRWZXJ0aWNhbENvb3JkaW5hdGUgPSB0aGlzLmludGVybmFsLmdldFZlcnRpY2FsQ29vcmRpbmF0ZTtcbiAgICAgICAgdmFyIHggPSBhcmdzWzBdO1xuICAgICAgICB2YXIgeSA9IGFyZ3NbMV07XG4gICAgICAgIHZhciB3ID0gYXJnc1syXTtcbiAgICAgICAgdmFyIGggPSBhcmdzWzNdO1xuXG4gICAgICAgIHZhciBjb29yZGluYXRlcyA9IHt9O1xuXG4gICAgICAgIGNvb3JkaW5hdGVzLmxvd2VyTGVmdF9YID0gZ2V0SG9yaXpvbnRhbENvb3JkaW5hdGUoeCkgfHwgMDtcbiAgICAgICAgY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1kgPSBnZXRWZXJ0aWNhbENvb3JkaW5hdGUoeSArIGgpIHx8IDA7XG4gICAgICAgIGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWCA9IGdldEhvcml6b250YWxDb29yZGluYXRlKHggKyB3KSB8fCAwO1xuICAgICAgICBjb29yZGluYXRlcy51cHBlclJpZ2h0X1kgPSBnZXRWZXJ0aWNhbENvb3JkaW5hdGUoeSkgfHwgMDtcblxuICAgICAgICByZXR1cm4gW051bWJlcihmMihjb29yZGluYXRlcy5sb3dlckxlZnRfWCkpLCBOdW1iZXIoZjIoY29vcmRpbmF0ZXMubG93ZXJMZWZ0X1kpKSwgTnVtYmVyKGYyKGNvb3JkaW5hdGVzLnVwcGVyUmlnaHRfWCkpLCBOdW1iZXIoZjIoY29vcmRpbmF0ZXMudXBwZXJSaWdodF9ZKSldO1xuICAgIH07XG5cbiAgICB2YXIgY2FsY3VsYXRlQXBwZWFyYW5jZVN0cmVhbSA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIGlmIChmb3JtT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybU9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZm9ybU9iamVjdC5WICYmICFmb3JtT2JqZWN0LkRWKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbHNlIGNhbGN1bGF0ZSBpdFxuXG4gICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgdmFyIHRleHQgPSBmb3JtT2JqZWN0LlYgfHwgZm9ybU9iamVjdC5EVjtcbiAgICAgICAgdmFyIGNhbGNSZXMgPSBjYWxjdWxhdGVYKGZvcm1PYmplY3QsIHRleHQpO1xuICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuXG4gICAgICAgIC8vUERGIDMyMDAwLTE6MjAwOCwgcGFnZSA0NDRcbiAgICAgICAgc3RyZWFtLnB1c2goJy9UeCBCTUMnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ3EnKTtcbiAgICAgICAgc3RyZWFtLnB1c2goJ0JUJyk7IC8vIEJlZ2luIFRleHRcbiAgICAgICAgc3RyZWFtLnB1c2goc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcikpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnLycgKyBmb250S2V5ICsgJyAnICsgZjIoY2FsY1Jlcy5mb250U2l6ZSkgKyAnIFRmJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCcxIDAgMCAxIDAgMCBUbScpOy8vIFRyYW5zZm9ybWF0aW9uIE1hdHJpeFxuICAgICAgICBzdHJlYW0ucHVzaChjYWxjUmVzLnRleHQpO1xuICAgICAgICBzdHJlYW0ucHVzaCgnRVQnKTsgLy8gRW5kIFRleHQgICAgXG4gICAgICAgIHN0cmVhbS5wdXNoKCdRJyk7XG4gICAgICAgIHN0cmVhbS5wdXNoKCdFTUMnKTtcblxuICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50LnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICByZXR1cm4gYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQ7XG4gICAgfTtcblxuICAgIHZhciBjYWxjdWxhdGVYID0gZnVuY3Rpb24gKGZvcm1PYmplY3QsIHRleHQpIHtcbiAgICAgICAgaWYgKGZvcm1PYmplY3QuaXNVbmljb2RlKSB0ZXh0ID0gZm9ybU9iamVjdC50cnVlVmFsdWU7XG4gICAgICAgICB2YXIgbWF4Rm9udFNpemUgPVxuICAgICAgICAgICAgZm9ybU9iamVjdC5mb250U2l6ZSA9PT0gMCA/IGZvcm1PYmplY3QubWF4Rm9udFNpemUgOiBmb3JtT2JqZWN0LmZvbnRTaXplO1xuICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSB7XG4gICAgICAgICAgICB0ZXh0OiBcIlwiLFxuICAgICAgICAgICAgZm9udFNpemU6IFwiXCJcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUmVtb3ZlIEJyYWNrZXRzXG4gICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cigwLCAxKSA9PSBcIihcIiA/IHRleHQuc3Vic3RyKDEpIDogdGV4dDtcbiAgICAgICAgdGV4dCA9XG4gICAgICAgICAgICB0ZXh0LnN1YnN0cih0ZXh0Lmxlbmd0aCAtIDEpID09IFwiKVwiXG4gICAgICAgICAgICA/IHRleHQuc3Vic3RyKDAsIHRleHQubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgIDogdGV4dDtcbiAgICAgICAgLy8gc3BsaXQgaW50byBhcnJheSBvZiB3b3Jkc1xuICAgICAgICB2YXIgdGV4dFNwbGl0ID0gdGV4dC5zcGxpdChcIiBcIik7XG4gICAgICAgIHRleHRTcGxpdCA9IHRleHRTcGxpdC5tYXAoZnVuY3Rpb24gKHdvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiB3b3JkLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFmb3JtT2JqZWN0Lm11bHRpbGluZSkge1xuICAgICAgICAgICAgdGV4dFNwbGl0ID0gdGV4dFNwbGl0Lm1hcChmdW5jdGlvbiAoYXJyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFthcnIuam9pbihcIiBcIildXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmb250U2l6ZSA9IG1heEZvbnRTaXplOyAvLyBUaGUgU3RhcnRpbmcgZm9udFNpemUgKFRoZSBNYXhpbXVtKVxuICAgICAgICB2YXIgbGluZVNwYWNpbmcgPSAyO1xuICAgICAgICB2YXIgYm9yZGVyUGFkZGluZyA9IDI7XG5cbiAgICAgICAgdmFyIGhlaWdodCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgfHwgMDtcbiAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0IDwgMCA/IC1oZWlnaHQgOiBoZWlnaHQ7XG4gICAgICAgIHZhciB3aWR0aCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSB8fCAwO1xuICAgICAgICB3aWR0aCA9IHdpZHRoIDwgMCA/IC13aWR0aCA6IHdpZHRoO1xuXG4gICAgICAgIHZhciBpc1NtYWxsZXJUaGFuV2lkdGggPSBmdW5jdGlvbihpLCBsYXN0TGluZSwgZm9udFNpemUpIHtcbiAgICAgICAgICAgIGlmIChpICsgMSA8IHRleHRTcGxpdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciB0bXAgPSBsYXN0TGluZSArIFwiIFwiICsgdGV4dFNwbGl0W2kgKyAxXVswXTtcbiAgICAgICAgICAgIHZhciBUZXh0V2lkdGggPSBjYWxjdWxhdGVGb250U3BhY2UodG1wLCBmb3JtT2JqZWN0LCBmb250U2l6ZSkud2lkdGg7XG4gICAgICAgICAgICB2YXIgRmllbGRXaWR0aCA9IHdpZHRoIC0gMiAqIGJvcmRlclBhZGRpbmc7XG4gICAgICAgICAgICByZXR1cm4gVGV4dFdpZHRoIDw9IEZpZWxkV2lkdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvbnRTaXplKys7XG4gICAgICAgIEZvbnRTaXplOiB3aGlsZSAoZm9udFNpemUgPiAwKSB7XG4gICAgICAgICAgICB0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIGZvbnRTaXplLS07XG4gICAgICAgICAgICB2YXIgdGV4dEhlaWdodCA9IGNhbGN1bGF0ZUZvbnRTcGFjZShcIjNcIiwgZm9ybU9iamVjdCwgZm9udFNpemUpLmhlaWdodDtcbiAgICAgICAgICAgIHZhciBzdGFydFkgPSBmb3JtT2JqZWN0Lm11bHRpbGluZVxuICAgICAgICAgICAgPyBoZWlnaHQgLSBmb250U2l6ZVxuICAgICAgICAgICAgOiAoaGVpZ2h0IC0gdGV4dEhlaWdodCkgLyAyO1xuICAgICAgICAgICAgc3RhcnRZICs9IGxpbmVTcGFjaW5nO1xuICAgICAgICAgICAgdmFyIHN0YXJ0WDtcblxuICAgICAgICAgICAgdmFyIGxhc3RZID0gc3RhcnRZO1xuICAgICAgICAgICAgdmFyIGZpcnN0V29yZEluTGluZSA9IDAsXG4gICAgICAgICAgICBsYXN0V29yZEluTGluZSA9IDA7XG4gICAgICAgICAgICB2YXIgbGFzdExlbmd0aDtcbiAgICAgICAgICAgIHZhciBjdXJyV29yZCA9IDA7XG5cbiAgICAgICAgICAgIGlmIChmb250U2l6ZSA8PSAwKSB7XG4gICAgICAgICAgICAvLyBJbiBjYXNlLCB0aGUgVGV4dCBkb2Vzbid0IGZpdCBhdCBhbGxcbiAgICAgICAgICAgIGZvbnRTaXplID0gMTI7XG4gICAgICAgICAgICB0ZXh0ID0gXCIoLi4uKSBUalxcblwiO1xuICAgICAgICAgICAgdGV4dCArPVxuICAgICAgICAgICAgICAgIFwiJSBXaWR0aCBvZiBUZXh0OiBcIiArXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlRm9udFNwYWNlKHRleHQsIGZvcm1PYmplY3QsIGZvbnRTaXplKS53aWR0aCArXG4gICAgICAgICAgICAgICAgXCIsIEZpZWxkV2lkdGg6XCIgK1xuICAgICAgICAgICAgICAgIHdpZHRoICtcbiAgICAgICAgICAgICAgICBcIlxcblwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBsYXN0TGluZSA9IFwiXCI7XG4gICAgICAgICAgICB2YXIgbGluZUNvdW50ID0gMDtcbiAgICAgICAgICAgIExpbmU6IGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dFNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGV4dFNwbGl0Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlzV2l0aE5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dFNwbGl0W2ldLmxlbmd0aCAhPT0gMSAmJiBjdXJyV29yZCAhPT0gdGV4dFNwbGl0W2ldLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICh0ZXh0SGVpZ2h0ICsgbGluZVNwYWNpbmcpICogKGxpbmVDb3VudCArIDIpICsgbGluZVNwYWNpbmcgPlxuICAgICAgICAgICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGFzdExpbmUgKz0gdGV4dFNwbGl0W2ldW2N1cnJXb3JkXTtcbiAgICAgICAgICAgICAgICBpc1dpdGhOZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsYXN0V29yZEluTGluZSA9IGk7XG4gICAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGFzdExpbmUgKz0gdGV4dFNwbGl0W2ldW2N1cnJXb3JkXSArIFwiIFwiO1xuICAgICAgICAgICAgICAgIGxhc3RMaW5lID1cbiAgICAgICAgICAgICAgICAgICAgbGFzdExpbmUuc3Vic3RyKGxhc3RMaW5lLmxlbmd0aCAtIDEpID09IFwiIFwiXG4gICAgICAgICAgICAgICAgICAgID8gbGFzdExpbmUuc3Vic3RyKDAsIGxhc3RMaW5lLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgICAgIDogbGFzdExpbmU7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcnNlSW50KGkpO1xuICAgICAgICAgICAgICAgIHZhciBuZXh0TGluZUlzU21hbGxlciA9IGlzU21hbGxlclRoYW5XaWR0aChrZXksIGxhc3RMaW5lLCBmb250U2l6ZSk7XG4gICAgICAgICAgICAgICAgdmFyIGlzTGFzdFdvcmQgPSBpID49IHRleHRTcGxpdC5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5leHRMaW5lSXNTbWFsbGVyICYmICFpc0xhc3RXb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RMaW5lICs9IFwiIFwiO1xuICAgICAgICAgICAgICAgICAgICBjdXJyV29yZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBMaW5lXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbmV4dExpbmVJc1NtYWxsZXIgJiYgIWlzTGFzdFdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3JtT2JqZWN0Lm11bHRpbGluZSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRleHRIZWlnaHQgKyBsaW5lU3BhY2luZykgKiAobGluZUNvdW50ICsgMikgKyBsaW5lU3BhY2luZyA+XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgVGV4dCBpcyBoaWdoZXIgdGhhbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpZWxkT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBGb250U2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsYXN0V29yZEluTGluZSA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ28gb25cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNMYXN0V29yZCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0V29yZEluTGluZSA9IGtleTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGZvcm1PYmplY3QubXVsdGlsaW5lICYmXG4gICAgICAgICAgICAgICAgICAgICh0ZXh0SGVpZ2h0ICsgbGluZVNwYWNpbmcpICogKGxpbmVDb3VudCArIDIpICsgbGluZVNwYWNpbmcgPlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgVGV4dCBpcyBoaWdoZXIgdGhhbiB0aGUgRmllbGRPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgRm9udFNpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBsYXN0IGJsYW5rXG5cbiAgICAgICAgICAgICAgICB2YXIgbGluZSA9IFwiXCI7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gZmlyc3RXb3JkSW5MaW5lOyB4IDw9IGxhc3RXb3JkSW5MaW5lOyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnJMaW5lID0gdGV4dFNwbGl0W3hdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybU9iamVjdC5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ID09PSBsYXN0V29yZEluTGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArPSBjdXJyTGluZVtjdXJyV29yZF0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJXb3JkID0gKGN1cnJXb3JkICsgMSkgJSBjdXJyTGluZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ID09PSBmaXJzdFdvcmRJbkxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gY3VyckxpbmVbY3VyckxpbmUubGVuZ3RoIC0gMV0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gY3VyckxpbmVbMF0gKyBcIiBcIjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGFzdCBibGFua1xuICAgICAgICAgICAgICAgIGxpbmUgPVxuICAgICAgICAgICAgICAgIGxpbmUuc3Vic3RyKGxpbmUubGVuZ3RoIC0gMSkgPT0gXCIgXCJcbiAgICAgICAgICAgICAgICAgICAgPyBsaW5lLnN1YnN0cigwLCBsaW5lLmxlbmd0aCAtIDEpXG4gICAgICAgICAgICAgICAgICAgIDogbGluZTtcbiAgICAgICAgICAgICAgICAvLyBsYXN0TGVuZ3RoIC09IGJsYW5rU3BhY2Uud2lkdGg7XG4gICAgICAgICAgICAgICAgbGFzdExlbmd0aCA9IGNhbGN1bGF0ZUZvbnRTcGFjZShsaW5lLCBmb3JtT2JqZWN0LCBmb250U2l6ZSkud2lkdGg7XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgc3RhcnRYXG4gICAgICAgICAgICAgICAgc3dpdGNoIChmb3JtT2JqZWN0LnRleHRBbGlnbikge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJyaWdodFwiOlxuICAgICAgICAgICAgICAgICAgICBzdGFydFggPSB3aWR0aCAtIGxhc3RMZW5ndGggLSBib3JkZXJQYWRkaW5nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2VudGVyXCI6XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WCA9ICh3aWR0aCAtIGxhc3RMZW5ndGgpIC8gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImxlZnRcIjpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBzdGFydFggPSBib3JkZXJQYWRkaW5nO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGV4dCArPSBmMihzdGFydFgpICsgXCIgXCIgKyBmMihsYXN0WSkgKyBcIiBUZFxcblwiO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1PYmplY3QuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmb250TGlzdCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBmb250TGlzdFtzY29wZS5pbnRlcm5hbC5nZXRGb250KCkuaWRdID0gc2NvcGUuaW50ZXJuYWwuZ2V0Rm9udCgpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICB4OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgeTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5nOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZXg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZFc2NhcGU6IHBkZkVzY2FwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVGb250S2V5OiBzY29wZS5pbnRlcm5hbC5nZXRGb250KCkuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHM6IGZvbnRMaXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUZvbnRTaXplOiBmb3JtT2JqZWN0LmZvbnRTaXplXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmV2ZW50cy5wdWJsaXNoKCdwb3N0UHJvY2Vzc1RleHQnLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnPCcgKyBwYXlsb2FkLnRleHQgKyAnPiBUalxcbic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcoJyArIHBkZkVzY2FwZShsaW5lKSArICcpIFRqXFxuJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gcmVzZXQgWCBpbiBQREZcbiAgICAgICAgICAgICAgICB0ZXh0ICs9IC1mMihzdGFydFgpICsgXCIgMCBUZFxcblwiO1xuXG4gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYSBMaW5lLCBhZGp1c3QgeSBwb3NpdGlvblxuICAgICAgICAgICAgICAgIGxhc3RZID0gLShmb250U2l6ZSArIGxpbmVTcGFjaW5nKTtcblxuICAgICAgICAgICAgICAgIC8vIFJlc2V0IGZvciBuZXh0IGl0ZXJhdGlvbiBzdGVwXG4gICAgICAgICAgICAgICAgbGFzdExlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgZmlyc3RXb3JkSW5MaW5lID0gaXNXaXRoTmV3TGluZSA/IGxhc3RXb3JkSW5MaW5lIDogbGFzdFdvcmRJbkxpbmUgKyAxO1xuICAgICAgICAgICAgICAgIGxpbmVDb3VudCsrO1xuXG4gICAgICAgICAgICAgICAgbGFzdExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlIExpbmU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVyblZhbHVlLnRleHQgPSB0ZXh0O1xuICAgICAgICByZXR1cm5WYWx1ZS5mb250U2l6ZSA9IGZvbnRTaXplO1xuXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgKiBTbWFsbCB3b3JrYXJvdW5kIGZvciBjYWxjdWxhdGluZyB0aGUgVGV4dE1ldHJpYyBhcHByb3hpbWF0ZWx5LlxuICAgICogXG4gICAgKiBAcGFyYW0gdGV4dFxuICAgICogQHBhcmFtIGZvbnRzaXplXG4gICAgKiBAcmV0dXJucyB7VGV4dE1ldHJpY3N9IChIYXMgSGVpZ2h0IGFuZCBXaWR0aClcbiAgICAqL1xuICAgIHZhciBjYWxjdWxhdGVGb250U3BhY2UgPSBmdW5jdGlvbiAodGV4dCwgZm9ybU9iamVjdCwgZm9udFNpemUpIHtcbiAgICAgICAgdmFyIGZvbnQgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKTtcbiAgICAgICAgdmFyIHdpZHRoID0gc2NvcGUuZ2V0U3RyaW5nVW5pdFdpZHRoKHRleHQsIHsgZm9udDogZm9udCwgZm9udFNpemU6IHBhcnNlRmxvYXQoZm9udFNpemUpLCBjaGFyU3BhY2U6IDAgfSkgKiBwYXJzZUZsb2F0KGZvbnRTaXplKTtcbiAgICAgICAgdmFyIGhlaWdodCA9IHNjb3BlLmdldFN0cmluZ1VuaXRXaWR0aChcIjNcIiwgeyBmb250OiBmb250LCBmb250U2l6ZTogcGFyc2VGbG9hdChmb250U2l6ZSksIGNoYXJTcGFjZTogMCB9KSAqIHBhcnNlRmxvYXQoZm9udFNpemUpICogMS41O1xuICAgICAgICByZXR1cm4geyBoZWlnaHQ6IGhlaWdodCwgd2lkdGg6IHdpZHRoIH07XG4gICAgfTtcblxuICAgIHZhciBhY3JvZm9ybVBsdWdpblRlbXBsYXRlID0ge1xuICAgICAgICBmaWVsZHM6IFtdLFxuICAgICAgICB4Rm9ybXM6IFtdLFxuICAgICAgICAvKipcbiAgICAgICAgKiBhY3JvRm9ybURpY3Rpb25hcnlSb290IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBBY3JvRm9ybVxuICAgICAgICAqIERpY3Rpb25hcnkgMDogVGhlIEV2ZW50LVRva2VuLCB0aGUgQWNyb0Zvcm1EaWN0aW9uYXJ5Q2FsbGJhY2sgaGFzXG4gICAgICAgICogMTogVGhlIE9iamVjdCBJRCBvZiB0aGUgUm9vdFxuICAgICAgICAqL1xuICAgICAgICBhY3JvRm9ybURpY3Rpb25hcnlSb290OiBudWxsLFxuICAgICAgICAvKipcbiAgICAgICAgKiBBZnRlciB0aGUgUERGIGdldHMgZXZhbHVhdGVkLCB0aGUgcmVmZXJlbmNlIHRvIHRoZSByb290IGhhcyB0byBiZVxuICAgICAgICAqIHJlc2V0LCB0aGlzIGluZGljYXRlcywgd2hldGhlciB0aGUgcm9vdCBoYXMgYWxyZWFkeSBiZWVuIHByaW50ZWRcbiAgICAgICAgKiBvdXRcbiAgICAgICAgKi9cbiAgICAgICAgcHJpbnRlZE91dDogZmFsc2UsXG4gICAgICAgIGludGVybmFsOiBudWxsLFxuICAgICAgICBpc0luaXRpYWxpemVkOiBmYWxzZVxuICAgIH07XG5cbiAgICB2YXIgYW5ub3RSZWZlcmVuY2VDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy9zZXQgb2JqSWQgdG8gdW5kZWZpbmVkIGFuZCBmb3JjZSBpdCB0byBnZXQgYSBuZXcgb2JqSWQgb24gYnVpbGREb2N1bWVudFxuICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Lm9iaklkID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgZmllbGRzID0gc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5GaWVsZHM7XG4gICAgICAgIGZvciAodmFyIGkgaW4gZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoZmllbGRzLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvcm1PYmplY3QgPSBmaWVsZHNbaV07XG4gICAgICAgICAgICAgICAgLy9zZXQgb2JqSWQgdG8gdW5kZWZpbmVkIGFuZCBmb3JjZSBpdCB0byBnZXQgYSBuZXcgb2JqSWQgb24gYnVpbGREb2N1bWVudFxuICAgICAgICAgICAgICAgIGZvcm1PYmplY3Qub2JqSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgLy8gYWRkIEFubm90IFJlZmVyZW5jZSFcbiAgICAgICAgICAgICAgICBpZiAoZm9ybU9iamVjdC5oYXNBbm5vdGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlcyBhbiBBbm5vdGF0aW9uIFdpZGdldCBpbiB0aGUgRm9ybSBPYmplY3QsIHB1dCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVmZXJlbmNlIGluIHRoZSAvQW5ub3QgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlQW5ub3RhdGlvblJlZmVyZW5jZS5jYWxsKHNjb3BlLCBmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHB1dEZvcm0gPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICBpZiAoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ucHJpbnRlZE91dCkge1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ucHJpbnRlZE91dCA9IGZhbHNlO1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290KSB7XG4gICAgICAgICAgICBpbml0aWFsaXplQWNyb0Zvcm0uY2FsbChzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5GaWVsZHMucHVzaChmb3JtT2JqZWN0KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICogQ3JlYXRlIHRoZSBSZWZlcmVuY2UgdG8gdGhlIHdpZGdldEFubm90YXRpb24sIHNvIHRoYXQgaXQgZ2V0cyByZWZlcmVuY2VkXG4gICAgKiBpbiB0aGUgQW5ub3RbXSBpbnQgdGhlKyAoUmVxdWlyZXMgdGhlIEFubm90YXRpb24gUGx1Z2luKVxuICAgICovXG4gICAgdmFyIGNyZWF0ZUFubm90YXRpb25SZWZlcmVuY2UgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgdHlwZTogJ3JlZmVyZW5jZScsXG4gICAgICAgICAgICBvYmplY3Q6IG9iamVjdFxuICAgICAgICB9O1xuICAgICAgICB2YXIgZmluZEVudHJ5ID0gZnVuY3Rpb24gKGVudHJ5KSB7IHJldHVybiAoZW50cnkudHlwZSA9PT0gb3B0aW9ucy50eXBlICYmIGVudHJ5Lm9iamVjdCA9PT0gb3B0aW9ucy5vYmplY3QpOyB9O1xuICAgICAgICBpZiAoc2NvcGUuaW50ZXJuYWwuZ2V0UGFnZUluZm8ob2JqZWN0LnBhZ2UpLnBhZ2VDb250ZXh0LmFubm90YXRpb25zLmZpbmQoZmluZEVudHJ5KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5nZXRQYWdlSW5mbyhvYmplY3QucGFnZSkucGFnZUNvbnRleHQuYW5ub3RhdGlvbnMucHVzaChvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDYWxsYmFja3NcblxuICAgIHZhciBwdXRDYXRhbG9nQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFB1dCByZWZlcmVuY2UgdG8gQWNyb0Zvcm0gdG8gRG9jdW1lbnRDYXRhbG9nXG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gZm9yIHNhZmV0eSwgc2hvdWxkbid0IG5vcm1hbGx5IGJlIHRoZSBjYXNlXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC53cml0ZSgnL0Fjcm9Gb3JtICcgKyBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290Lm9iaklkICsgJyAnICsgMCArICcgUicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwdXRDYXRhbG9nQ2FsbGJhY2s6IFJvb3QgbWlzc2luZy4nKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEFkZHMgL0Fjcm9mb3JtIFggMCBSIHRvIERvY3VtZW50IENhdGFsb2csIGFuZCBjcmVhdGVzIHRoZSBBY3JvRm9ybVxuICAgICogRGljdGlvbmFyeVxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtRGljdGlvbmFyeUNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnRcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnVuc3Vic2NyaWJlKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuX2V2ZW50SUQpO1xuICAgICAgICBkZWxldGUgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5fZXZlbnRJRDtcbiAgICAgICAgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ucHJpbnRlZE91dCA9IHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQ3JlYXRlcyB0aGUgc2luZ2xlIEZpZWxkcyBhbmQgd3JpdGVzIHRoZW0gaW50byB0aGUgRG9jdW1lbnRcbiAgICAqIFxuICAgICogSWYgZmllbGRBcnJheSBpcyBzZXQsIHVzZSB0aGUgZmllbGRzIHRoYXQgYXJlIGluc2lkZSBpdCBpbnN0ZWFkIG9mIHRoZVxuICAgICogZmllbGRzIGZyb20gdGhlIEFjcm9Sb290IChmb3IgdGhlIEZvcm1YT2JqZWN0cy4uLilcbiAgICAqL1xuICAgIHZhciBjcmVhdGVGaWVsZENhbGxiYWNrID0gZnVuY3Rpb24gKGZpZWxkQXJyYXkpIHtcbiAgICAgICAgdmFyIHN0YW5kYXJkRmllbGRzID0gKCFmaWVsZEFycmF5KTtcblxuICAgICAgICBpZiAoIWZpZWxkQXJyYXkpIHtcbiAgICAgICAgICAgIC8vIGluIGNhc2UgdGhlcmUgaXMgbm8gZmllbGRBcnJheSBzcGVjaWZpZWQsIHdlIHdhbnQgdG8gcHJpbnQgb3V0XG4gICAgICAgICAgICAvLyB0aGUgRmllbGRzIG9mIHRoZSBBY3JvRm9ybVxuICAgICAgICAgICAgLy8gUHJpbnQgb3V0IFJvb3RcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm5ld09iamVjdERlZmVycmVkQmVnaW4oc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5vYmpJZCwgdHJ1ZSk7XG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbi5hY3JvRm9ybURpY3Rpb25hcnlSb290LnB1dFN0cmVhbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRBcnJheSA9IGZpZWxkQXJyYXkgfHwgc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdC5LaWRzO1xuXG4gICAgICAgIGZvciAodmFyIGkgaW4gZmllbGRBcnJheSkge1xuICAgICAgICAgICAgaWYgKGZpZWxkQXJyYXkuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRPYmplY3QgPSBmaWVsZEFycmF5W2ldO1xuICAgICAgICAgICAgICAgIHZhciBrZXlWYWx1ZUxpc3QgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgb2xkUmVjdCA9IGZpZWxkT2JqZWN0LlJlY3Q7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmplY3QuUmVjdCkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZE9iamVjdC5SZWN0ID0gY2FsY3VsYXRlQ29vcmRpbmF0ZXMuY2FsbCh0aGlzLCBmaWVsZE9iamVjdC5SZWN0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCBXcml0aW5nIHRoZSBPYmplY3RcbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKGZpZWxkT2JqZWN0Lm9iaklkLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0LkRBID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmNyZWF0ZURlZmF1bHRBcHBlYXJhbmNlU3RyZWFtKGZpZWxkT2JqZWN0KTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRPYmplY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGZpZWxkT2JqZWN0LmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdCA9IGZpZWxkT2JqZWN0LmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0LlJlY3QgPSBvbGRSZWN0O1xuXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0Lmhhc0FwcGVhcmFuY2VTdHJlYW0gJiYgIWZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBBcHBlYXJhbmNlXG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlID0gY2FsY3VsYXRlQXBwZWFyYW5jZVN0cmVhbS5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6ICdBUCcsIHZhbHVlOiBcIjw8L04gXCIgKyBhcHBlYXJhbmNlICsgXCI+PlwiIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5wdXNoKGFwcGVhcmFuY2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBBcHBlYXJhbmNlU3RyZWFtQ29udGVudCBpcyBhIEFycmF5IHdpdGggTixSLEQgKGF0IGxlYXN0XG4gICAgICAgICAgICAgICAgLy8gb25lIG9mIHRoZW0hKVxuICAgICAgICAgICAgICAgIGlmIChmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBOLFIgYW5kIERcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBmaWVsZE9iamVjdC5hcHBlYXJhbmNlU3RyZWFtQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkT2JqZWN0LmFwcGVhcmFuY2VTdHJlYW1Db250ZW50Lmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZmllbGRPYmplY3QuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnRba107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbVN0cmluZyArPSAoXCIvXCIgKyBrICsgXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gXCI8PFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID49IDEgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZWFyYW5jZVN0cmVhbSBpcyBhbiBBcnJheSBvciBPYmplY3QhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSB2YWx1ZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBGdW5jdGlvbiBpcyByZWZlcmVuY2VkLCBjYWxsIGl0IGluIG9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGdldCB0aGUgRm9ybVhPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gb2JqLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICs9IChcIi9cIiArIGkgKyBcIiBcIiArIG9iaiArIFwiIFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIFhGb3JtIGlzIGFscmVhZHkgdXNlZCwgZS5nLiBPZmZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIENoZWNrQm94ZXMsIGRvbid0IGFkZCBpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5pbmRleE9mKG9iaikgPj0gMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5wdXNoKG9iaik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgRnVuY3Rpb24gaXMgcmVmZXJlbmNlZCwgY2FsbCBpdCBpbiBvcmRlciB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBGb3JtWE9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gb2JqLmNhbGwodGhpcywgZmllbGRPYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gKFwiL1wiICsgaSArIFwiIFwiICsgb2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2NvcGUuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4ueEZvcm1zLmluZGV4T2Yob2JqKSA+PSAwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcy5wdXNoKG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1TdHJpbmcgKz0gXCI+PlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYXBwZWFyYW5jZSBzdHJlYW0gaXMgYSBub3JtYWwgT2JqZWN0Li5cbiAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6ICdBUCcsIHZhbHVlOiBcIjw8XFxuXCIgKyBhcHBlYXJhbmNlU3RyZWFtU3RyaW5nICsgXCI+PlwiIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLnB1dFN0cmVhbSh7IGFkZGl0aW9uYWxLZXlWYWx1ZXM6IGtleVZhbHVlTGlzdCB9KTtcblxuICAgICAgICAgICAgICAgIHNjb3BlLmludGVybmFsLm91dChcImVuZG9ialwiKTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFuZGFyZEZpZWxkcykge1xuICAgICAgICAgICAgY3JlYXRlWEZvcm1PYmplY3RDYWxsYmFjay5jYWxsKHRoaXMsIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLnhGb3Jtcyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGNyZWF0ZVhGb3JtT2JqZWN0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoZmllbGRBcnJheSkge1xuICAgICAgICBmb3IgKHZhciBpIGluIGZpZWxkQXJyYXkpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZEFycmF5Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGk7XG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkT2JqZWN0ID0gZmllbGRBcnJheVtpXTtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBXcml0aW5nIHRoZSBPYmplY3RcbiAgICAgICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZEJlZ2luKGZpZWxkT2JqZWN0ICYmIGZpZWxkT2JqZWN0Lm9iaklkLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRPYmplY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGZpZWxkT2JqZWN0LnB1dFN0cmVhbSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkT2JqZWN0LnB1dFN0cmVhbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgZmllbGRBcnJheVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBpbml0aWFsaXplQWNyb0Zvcm0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmludGVybmFsICE9PSB1bmRlZmluZWQgJiYgKHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4gPT09IHVuZGVmaW5lZCB8fCB0aGlzLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSkge1xuXG4gICAgICAgICAgICBzY29wZSA9IHRoaXM7XG5cbiAgICAgICAgICAgIEFjcm9Gb3JtRmllbGQuRmllbGROdW0gPSAwO1xuICAgICAgICAgICAgdGhpcy5pbnRlcm5hbC5hY3JvZm9ybVBsdWdpbiA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYWNyb2Zvcm1QbHVnaW5UZW1wbGF0ZSkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWwuYWNyb2Zvcm1QbHVnaW4uYWNyb0Zvcm1EaWN0aW9uYXJ5Um9vdCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4Y2VwdGlvbiB3aGlsZSBjcmVhdGluZyBBY3JvZm9ybURpY3Rpb25hcnlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY2FsZUZhY3RvciA9IHNjb3BlLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgLy8gVGhlIE9iamVjdCBOdW1iZXIgb2YgdGhlIEFjcm9Gb3JtIERpY3Rpb25hcnlcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QgPSBuZXcgQWNyb0Zvcm1EaWN0aW9uYXJ5KCk7XG5cbiAgICAgICAgICAgIC8vIGFkZCBDYWxsYmFjayBmb3IgY3JlYXRpbmcgdGhlIEFjcm9Gb3JtIERpY3Rpb25hcnlcbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmFjcm9Gb3JtRGljdGlvbmFyeVJvb3QuX2V2ZW50SUQgPSBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdwb3N0UHV0UmVzb3VyY2VzJywgQWNyb0Zvcm1EaWN0aW9uYXJ5Q2FsbGJhY2spO1xuXG4gICAgICAgICAgICBzY29wZS5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdidWlsZERvY3VtZW50JywgYW5ub3RSZWZlcmVuY2VDYWxsYmFjayk7IC8vIGJ1aWxkRG9jdW1lbnRcblxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXZlbnQsIHRoYXQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIERvY3VtZW50Q2F0YWxvZyBpc1xuICAgICAgICAgICAgLy8gd3JpdHRlbiwgaW4gb3JkZXIgdG8gYWRkIC9BY3JvRm9ybVxuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgncHV0Q2F0YWxvZycsIHB1dENhdGFsb2dDYWxsYmFjayk7XG5cbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50LCB0aGF0IGNyZWF0ZXMgYWxsIEZpZWxkc1xuICAgICAgICAgICAgc2NvcGUuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgncG9zdFB1dFBhZ2VzJywgY3JlYXRlRmllbGRDYWxsYmFjayk7XG5cbiAgICAgICAgICAgIHNjb3BlLmludGVybmFsLmFjcm9mb3JtUGx1Z2luLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vUERGIDMyMDAwLTE6MjAwOCwgcGFnZSAyNiwgNy4zLjZcbiAgICB2YXIgYXJyYXlUb1BkZkFycmF5ID0ganNQREZBUEkuX19hY3JvZm9ybV9fLmFycmF5VG9QZGZBcnJheSA9IGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheSkpIHtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gJ1snO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gJyAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBhcnJheVtpXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYXJyYXlbaV0udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldLnN1YnN0cigwLCAxKSAhPT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSAnKCcgKyBwZGZFc2NhcGUoYXJyYXlbaV0udG9TdHJpbmcoKSkgKyAnKSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgKz0gYXJyYXlbaV0udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRlbnQgKz0gJ10nO1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5fX2Fjcm9mb3JtX18uYXJyYXlUb1BkZkFycmF5Jyk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBnZXRNYXRjaGVzKHN0cmluZywgcmVnZXgsIGluZGV4KSB7XG4gICAgICAgIGluZGV4IHx8IChpbmRleCA9IDEpOyAvLyBkZWZhdWx0IHRvIHRoZSBmaXJzdCBjYXB0dXJpbmcgZ3JvdXBcbiAgICAgICAgdmFyIG1hdGNoZXMgPSBbXTtcbiAgICAgICAgdmFyIG1hdGNoO1xuICAgICAgICB3aGlsZSAobWF0Y2ggPSByZWdleC5leGVjKHN0cmluZykpIHtcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaChtYXRjaFtpbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXRjaGVzO1xuICAgIH1cbiAgICB2YXIgcGRmQXJyYXlUb1N0cmluZ0FycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgaWYgKHR5cGVvZiBhcnJheSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmVzdWx0ID0gZ2V0TWF0Y2hlcyhhcnJheSwgL1xcKCguKj8pXFwpL2cpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHZhciB0b1BkZlN0cmluZyA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICAgICAgc3RyaW5nID0gc3RyaW5nIHx8IFwiXCI7XG4gICAgICAgIHN0cmluZy50b1N0cmluZygpO1xuICAgICAgICBzdHJpbmcgPSAnKCcgKyBwZGZFc2NhcGUoc3RyaW5nKSArICcpJztcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9O1xuXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgICAvLyBDbGFzc2VzXG4gICAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtUERGT2JqZWN0XG4gICAgKiBAY2xhc3NkZXNjIEEgQWNyb0Zvcm1QREZPYmplY3RcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVBERk9iamVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9vYmpJZDtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybVBERk9iamVjdCNvYmpJZFxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnb2JqSWQnLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9vYmpJZCkge1xuICAgICAgICAgICAgICAgICAgICBfb2JqSWQgPSBzY29wZS5pbnRlcm5hbC5uZXdPYmplY3REZWZlcnJlZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX29iaklkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfb2JqSWQgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQGZ1bmN0aW9uIEFjcm9Gb3JtUERGT2JqZWN0LnRvU3RyaW5nXG4gICAgKi9cbiAgICBBY3JvRm9ybVBERk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9iaklkICsgXCIgMCBSXCI7XG4gICAgfTtcblxuICAgIEFjcm9Gb3JtUERGT2JqZWN0LnByb3RvdHlwZS5wdXRTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBrZXlWYWx1ZUxpc3QgPSB0aGlzLmdldEtleVZhbHVlTGlzdEZvclN0cmVhbSgpO1xuICAgICAgICBzY29wZS5pbnRlcm5hbC5wdXRTdHJlYW0oeyBkYXRhOiB0aGlzLnN0cmVhbSwgYWRkaXRpb25hbEtleVZhbHVlczoga2V5VmFsdWVMaXN0IH0pO1xuICAgICAgICBzY29wZS5pbnRlcm5hbC5vdXQoXCJlbmRvYmpcIik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogUmV0dXJucyBhbiBrZXktdmFsdWUtTGlzdCBvZiBhbGwgbm9uLWNvbmZpZ3VyYWJsZSBWYXJpYWJsZXMgZnJvbSB0aGUgT2JqZWN0XG4gICAgKiBcbiAgICAqIEBuYW1lIGdldEtleVZhbHVlTGlzdEZvclN0cmVhbVxuICAgICogQHJldHVybnMge3N0cmluZ31cbiAgICAqL1xuICAgIEFjcm9Gb3JtUERGT2JqZWN0LnByb3RvdHlwZS5nZXRLZXlWYWx1ZUxpc3RGb3JTdHJlYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjcmVhdGVLZXlWYWx1ZUxpc3RGcm9tRmllbGRPYmplY3QgPSBmdW5jdGlvbiAoZmllbGRPYmplY3QpIHtcbiAgICAgICAgICAgIHZhciBrZXlWYWx1ZUxpc3QgPSBbXTtcbiAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZmllbGRPYmplY3QpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gJ2NvbnRlbnQnICYmIGtleSAhPSAnYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQnICYmIGtleS5zdWJzdHJpbmcoMCwgMSkgIT0gXCJfXCIpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4ga2V5cykge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGZpZWxkT2JqZWN0LCBrZXlzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlEZXNjcmlwdG9yICYmIHByb3BlcnR5RGVzY3JpcHRvci5jb25maWd1cmFibGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBmaWVsZE9iamVjdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlTGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiBhcnJheVRvUGRmQXJyYXkodmFsdWUpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFjcm9Gb3JtUERGT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBpdCBpcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIFBERk9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIHRoZSByZWZlcmVuY2UgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlLm9iaklkICsgXCIgMCBSXCIgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVMaXN0LnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleVZhbHVlTGlzdDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gY3JlYXRlS2V5VmFsdWVMaXN0RnJvbUZpZWxkT2JqZWN0KHRoaXMpO1xuICAgIH07XG5cbiAgICB2YXIgQWNyb0Zvcm1YT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVBERk9iamVjdC5jYWxsKHRoaXMpO1xuXG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdUeXBlJywge1xuICAgICAgICAgICAgdmFsdWU6IFwiL1hPYmplY3RcIixcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdTdWJ0eXBlJywge1xuICAgICAgICAgICAgdmFsdWU6IFwiL0Zvcm1cIixcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGb3JtVHlwZScsIHtcbiAgICAgICAgICAgIHZhbHVlOiAxLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0JCb3ggPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdCQm94Jywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQkJveDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9CQm94ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUmVzb3VyY2VzJywge1xuICAgICAgICAgICAgdmFsdWU6IFwiMiAwIFJcIixcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICB3cml0ZWFibGU6IHRydWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9zdHJlYW07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc3RyZWFtJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9zdHJlYW0gPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9zdHJlYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHJlYW07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgaW5oZXJpdChBY3JvRm9ybVhPYmplY3QsIEFjcm9Gb3JtUERGT2JqZWN0KTtcblxuICAgIHZhciBBY3JvRm9ybURpY3Rpb25hcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtUERGT2JqZWN0LmNhbGwodGhpcyk7XG5cbiAgICAgICAgdmFyIF9LaWRzID0gW107XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdLaWRzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX0tpZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0tpZHM7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0ZpZWxkcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfS2lkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRGVmYXVsdCBBcHBlYXJhbmNlXG4gICAgICAgIHZhciBfREE7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnREEnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9EQSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJygnICsgX0RBICsgJyknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfREEgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGluaGVyaXQoQWNyb0Zvcm1EaWN0aW9uYXJ5LCBBY3JvRm9ybVBERk9iamVjdCk7XG5cbiAgICAvKipcbiAgICAqIFRoZSBGaWVsZCBPYmplY3QgY29udGFpbnMgdGhlIFZhcmlhYmxlcywgdGhhdCBldmVyeSBGaWVsZCBuZWVkc1xuICAgICogXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1GaWVsZFxuICAgICogQGNsYXNzZGVzYyBBbiBBY3JvRm9ybSBGaWVsZE9iamVjdFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtRmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtUERGT2JqZWN0LmNhbGwodGhpcyk7XG5cbiAgICAgICAgLy9Bbm5vdGF0aW9uLUZsYWcgU2VlIFRhYmxlIDE2NVxuICAgICAgICB2YXIgX0YgPSA0O1xuICAgICAgICB0aGlzLmlzVW5pY29kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRydWVWYWx1ZSA9ICcnO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0YnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0Y7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfRiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIEYgc3VwcGxpZWQuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuMikgSWYgc2V0LCBwcmludCB0aGUgYW5ub3RhdGlvbiB3aGVuIHRoZSBwYWdlIGlzIHByaW50ZWQuIElmIGNsZWFyLCBuZXZlciBwcmludCB0aGUgYW5ub3RhdGlvbiwgcmVnYXJkbGVzcyBvZiB3ZXRoZXIgaXMgaXMgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4uIFxuICAgICAgICAqIE5PVEUgMiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGFubm90YXRpb25zIHJlcHJlc2VudGluZyBpbnRlcmFjdGl2ZSBwdXNoYnV0dG9ucywgd2hpY2ggd291bGQgc2VydmUgbm8gbWVhbmluZ2Z1bCBwdXJwb3NlIG9uIHRoZSBwcmludGVkIHBhZ2UuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3Nob3dXaGVuUHJpbnRlZFxuICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzaG93V2hlblByaW50ZWQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKF9GLCAzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GID0gc2V0Qml0Rm9yUGRmKF9GLCAzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkYgPSBjbGVhckJpdEZvclBkZihfRiwgMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0ZmID0gMDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdGZicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfRmY7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfRmYgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgXCInICsgdmFsdWUgKyAnXCIgZm9yIGF0dHJpYnV0ZSBGZiBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfUmVjdCA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1JlY3QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoX1JlY3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfUmVjdDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX1JlY3QgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfUmVjdCA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIHgtcG9zaXRpb24gb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN4XG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAneCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9SZWN0IHx8IGlzTmFOKF9SZWN0WzBdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfUmVjdFswXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfUmVjdFswXSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIHktcG9zaXRpb24gb2YgdGhlIGZpZWxkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN5XG4gICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAneScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9SZWN0IHx8IGlzTmFOKF9SZWN0WzFdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfUmVjdFsxXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfUmVjdFsxXSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBmaWVsZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjd2lkdGhcbiAgICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd3aWR0aCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9SZWN0IHx8IGlzTmFOKF9SZWN0WzJdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfUmVjdFsyXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfUmVjdFsyXSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2hlaWdodFxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2hlaWdodCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9SZWN0IHx8IGlzTmFOKF9SZWN0WzNdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfUmVjdFszXSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfUmVjdFszXSA9IHNjYWxlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9GVCA9IFwiXCI7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRlQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfRlRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnL0J0bic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy9UeCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy9DaCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJy9TaWcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgX0ZUID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBcIicgKyB2YWx1ZSArICdcIiBmb3IgYXR0cmlidXRlIEZUIHN1cHBsaWVkLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9UID0gbnVsbDtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1QnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX1QgfHwgX1QubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGEgQ2hpbGQgZnJvbSBhIFJhZGlvwrRHcm91cCwgeW91IGRvbid0IG5lZWQgYSBGaWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUNoaWxkQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX1QgPSBcIkZpZWxkT2JqZWN0XCIgKyAoQWNyb0Zvcm1GaWVsZC5GaWVsZE51bSsrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICcoJyArIHBkZkVzY2FwZShfVCkgKyAnKSc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfVCA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbCkgVGhlIHBhcnRpYWwgZmllbGQgbmFtZSAoc2VlIDEyLjcuMy4yLCDigJxGaWVsZCBOYW1lc+KAnSkuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2ZpZWxkTmFtZVxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZpZWxkTmFtZScsIHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX1Q7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfVCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX2ZvbnROYW1lID0gJ2hlbHZldGljYSc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBmb250TmFtZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmb250TmFtZVxuICAgICAgICAqIEBkZWZhdWx0ICdoZWx2ZXRpY2EnXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmb250TmFtZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZvbnROYW1lO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2ZvbnROYW1lID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfZm9udFN0eWxlID0gJ25vcm1hbCc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBmb250U3R5bGUgb2YgdGhlIGZvbnQgdG8gYmUgdXNlZC5cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjZm9udFN0eWxlXG4gICAgICAgICogQGRlZmF1bHQgJ25vcm1hbCdcbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2ZvbnRTdHlsZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZvbnRTdHlsZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9mb250U3R5bGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9mb250U2l6ZSA9IDA7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBmb250U2l6ZSBvZiB0aGUgZm9udCB0byBiZSB1c2VkLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCNmb250U2l6ZVxuICAgICAgICAqIEBkZWZhdWx0IDAgKGZvciBhdXRvKVxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZm9udFNpemUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFudGlTY2FsZShfZm9udFNpemUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX2ZvbnRTaXplID0gc2NhbGUodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX21heEZvbnRTaXplID0gNTA7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBtYXhpbXVtIGZvbnRTaXplIG9mIHRoZSBmb250IHRvIGJlIHVzZWQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI21heEZvbnRTaXplXG4gICAgICAgICogQGRlZmF1bHQgMCAoZm9yIGF1dG8pXG4gICAgICAgICogQHR5cGUge251bWJlcn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtYXhGb250U2l6ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYW50aVNjYWxlKF9tYXhGb250U2l6ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfbWF4Rm9udFNpemUgPSBzY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfY29sb3IgPSAnYmxhY2snO1xuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgY29sb3Igb2YgdGhlIHRleHRcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjY29sb3JcbiAgICAgICAgKiBAZGVmYXVsdCAnYmxhY2snXG4gICAgICAgICogQHR5cGUge3N0cmluZ3xyZ2JhfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbG9yJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29sb3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfY29sb3IgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9EQSA9ICcvRjEgMCBUZiAwIGcnO1xuICAgICAgICAvLyBEZWZpbmVzIHRoZSBkZWZhdWx0IGFwcGVhcmFuY2UgKE5lZWRlZCBmb3IgdmFyaWFibGUgVGV4dClcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdEQScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFfREFcbiAgICAgICAgICAgICAgICAgICAgfHwgdGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQ2hpbGRDbGFzc1xuICAgICAgICAgICAgICAgICAgICB8fCB0aGlzIGluc3RhbmNlb2YgQWNyb0Zvcm1UZXh0RmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvUGRmU3RyaW5nKF9EQSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgX0RBID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgdmFyIF9EViA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnRFYnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIV9EVikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b1BkZlN0cmluZyhfRFYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gX0RWO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN1YnN0cigwLCAxKSA9PT0gJygnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfRFYgPSBwZGZVbmVzY2FwZSh2YWx1ZS5zdWJzdHIoMSwgdmFsdWUubGVuZ3RoIC0gMikpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX0RWID0gcGRmVW5lc2NhcGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX0RWID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBUaGUgZGVmYXVsdCB2YWx1ZSB0byB3aGljaCB0aGUgZmllbGQgcmV2ZXJ0cyB3aGVuIGEgcmVzZXQtZm9ybSBhY3Rpb24gaXMgZXhlY3V0ZWQgKHNlZSAxMi43LjUuMywg4oCcUmVzZXQtRm9ybSBBY3Rpb27igJ0pLiBUaGUgZm9ybWF0IG9mIHRoaXMgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB2YWx1ZS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI2RlZmF1bHRWYWx1ZVxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RlZmF1bHRWYWx1ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBkZlVuZXNjYXBlKF9EVi5zdWJzdHIoMSwgX0RWLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX0RWO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgX0RWID0gJy8nICsgdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX0RWID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX1YgPSBudWxsO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1YnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1VuaWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9WO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIV9WKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvUGRmU3RyaW5nKF9WKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9WO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVW5pY29kZSkge1xuICAgICAgICAgICAgICAgICAgICBfViA9IHRvVW5pY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ1ZVZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMgaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3Vic3RyKDAsIDEpID09PSAnKCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfViA9IHBkZlVuZXNjYXBlKHZhbHVlLnN1YnN0cigxLCB2YWx1ZS5sZW5ndGggLSAyKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WID0gcGRmVW5lc2NhcGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX1YgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKE9wdGlvbmFsOyBpbmhlcml0YWJsZSkgVGhlIGZpZWxk4oCZcyB2YWx1ZSwgd2hvc2UgZm9ybWF0IHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUuIFNlZSB0aGUgZGVzY3JpcHRpb25zIG9mIGluZGl2aWR1YWwgZmllbGQgdHlwZXMgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1GaWVsZCN2YWx1ZVxuICAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3ZhbHVlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGRmVW5lc2NhcGUoX1Yuc3Vic3RyKDEsIF9WLmxlbmd0aCAtIDEpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX1Y7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGlmICgodGhpcyBpbnN0YW5jZW9mIEFjcm9Gb3JtQnV0dG9uID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICBfViA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9WID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBDaGVjayBpZiBmaWVsZCBoYXMgYW5ub3RhdGlvbnNcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjaGFzQW5ub3RhdGlvblxuICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2hhc0Fubm90YXRpb24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLlJlY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1R5cGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5oYXNBbm5vdGF0aW9uKSA/IFwiL0Fubm90XCIgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ1N1YnR5cGUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5oYXNBbm5vdGF0aW9uKSA/IFwiL1dpZGdldFwiIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9oYXNBcHBlYXJhbmNlU3RyZWFtID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAqIHRydWUgaWYgZmllbGQgaGFzIGFuIGFwcGVhcmFuY2VTdHJlYW1cbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjaGFzQXBwZWFyYW5jZVN0cmVhbVxuICAgICAgICAqIEByZWFkb25seVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2hhc0FwcGVhcmFuY2VTdHJlYW0nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGVhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9oYXNBcHBlYXJhbmNlU3RyZWFtO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBCb29sZWFuKHZhbHVlKTtcbiAgICAgICAgICAgICAgICBfaGFzQXBwZWFyYW5jZVN0cmVhbSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBUaGUgcGFnZSBvbiB3aGljaCB0aGUgQWNyb0Zvcm1GaWVsZCBpcyBwbGFjZWRcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjcGFnZVxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIHZhciBfcGFnZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdwYWdlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRlYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghX3BhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9wYWdlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfcGFnZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBJZiBzZXQsIHRoZSB1c2VyIG1heSBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuIEFueSBhc3NvY2lhdGVkIHdpZGdldCBhbm5vdGF0aW9ucyB3aWxsIG5vdCBpbnRlcmFjdCB3aXRoIHRoZSB1c2VyOyB0aGF0IGlzLCB0aGV5IHdpbGwgbm90IHJlc3BvbmQgdG8gbW91c2UgY2xpY2tzIG9yIGNoYW5nZSB0aGVpciBhcHBlYXJhbmNlIGluIHJlc3BvbnNlIHRvIG1vdXNlIG1vdGlvbnMuIFRoaXMgZmxhZyBpcyB1c2VmdWwgZm9yIGZpZWxkcyB3aG9zZSB2YWx1ZXMgYXJlIGNvbXB1dGVkIG9yIGltcG9ydGVkIGZyb20gYSBkYXRhYmFzZS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3JlYWRPbmx5XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyZWFkT25seScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgaGF2ZSBhIHZhbHVlIGF0IHRoZSB0aW1lIGl0IGlzIGV4cG9ydGVkIGJ5IGEgc3VibWl0Zm9ybSBhY3Rpb24gKHNlZSAxMi43LjUuMiwg4oCcU3VibWl0LUZvcm0gQWN0aW9u4oCdKS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3JlcXVpcmVkXG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdyZXF1aXJlZCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMikpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgc2hhbGwgbm90IGJlIGV4cG9ydGVkIGJ5IGEgc3VibWl0LWZvcm0gYWN0aW9uIChzZWUgMTIuNy41LjIsIOKAnFN1Ym1pdC1Gb3JtIEFjdGlvbuKAnSlcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtRmllbGQjbm9FeHBvcnRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25vRXhwb3J0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAzKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIHZhciBfUSA9IG51bGw7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnUScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9RID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBfUTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChbMCwgMSwgMl0uaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIF9RID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIFwiJyArIHZhbHVlICsgJ1wiIGZvciBhdHRyaWJ1dGUgUSBzdXBwbGllZC4nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbDsgaW5oZXJpdGFibGUpIEEgY29kZSBzcGVjaWZ5aW5nIHRoZSBmb3JtIG9mIHF1YWRkaW5nIChqdXN0aWZpY2F0aW9uKSB0aGF0IHNoYWxsIGJlIHVzZWQgaW4gZGlzcGxheWluZyB0aGUgdGV4dDpcbiAgICAgICAgKiAnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUZpZWxkI3RleHRBbGlnblxuICAgICAgICAqIEBkZWZhdWx0ICdsZWZ0J1xuICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndGV4dEFsaWduJywge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9RKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdsZWZ0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAnY2VudGVyJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAncmlnaHQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9RID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBfUSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIF9RID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIGluaGVyaXQoQWNyb0Zvcm1GaWVsZCwgQWNyb0Zvcm1QREZPYmplY3QpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ2hvaWNlRmllbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgLy8gRmllbGQgVHlwZSA9IENob2ljZSBGaWVsZFxuICAgICAgICB0aGlzLkZUID0gXCIvQ2hcIjtcbiAgICAgICAgLy8gb3B0aW9uc1xuICAgICAgICB0aGlzLlYgPSAnKCknO1xuXG4gICAgICAgIHRoaXMuZm9udE5hbWUgPSAnemFwZmRpbmdiYXRzJztcbiAgICAgICAgLy8gVG9wIEluZGV4XG4gICAgICAgIHZhciBfVEkgPSAwO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnVEknLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfVEk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfVEkgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTUsgZml4IGZvciBBY3JvYmF0XG4gICAgICAgIHZhciBfTUsgPSAnPDwgL0JHIFsgMC45NzUgMC45NzUgMC45NzUgXSAgPj4nO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ01LJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX01LO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX01LID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChPcHRpb25hbCkgRm9yIHNjcm9sbGFibGUgbGlzdCBib3hlcywgdGhlIHRvcCBpbmRleCAodGhlIGluZGV4IGluIHRoZSBPcHQgYXJyYXkgb2YgdGhlIGZpcnN0IG9wdGlvbiB2aXNpYmxlIGluIHRoZSBsaXN0KS4gRGVmYXVsdCB2YWx1ZTogMC5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI3RvcEluZGV4XG4gICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndG9wSW5kZXgnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9USTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9USSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX09wdCA9IFtdO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ09wdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNVbmljb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvUGRmVW5pY29kZUFycmF5KF9PcHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlUb1BkZkFycmF5KF9PcHQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX09wdCA9IHBkZkFycmF5VG9TdHJpbmdBcnJheSh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSBnZXRPcHRpb25zXG4gICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICogQHJldHVybnMge2FycmF5fSBhcnJheSBvZiBPcHRpb25zXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBfT3B0O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQG1lbWJlcm9mIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAgICAgKiBAbmFtZSBzZXRPcHRpb25zXG4gICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICogQHBhcmFtIHthcnJheX0gdmFsdWVcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5zZXRPcHRpb25zID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBfT3B0ID0gdmFsdWU7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3J0KSB7XG4gICAgICAgICAgICAgICAgX09wdC5zb3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgKiBAbWVtYmVyb2YgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICAgICAqIEBuYW1lIGFkZE9wdGlvblxuICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgICAgICAqL1xuICAgICAgICB0aGlzLmFkZE9wdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgX09wdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNvcnQpIHtcbiAgICAgICAgICAgICAgICBfT3B0LnNvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEBtZW1iZXJvZiBBY3JvRm9ybUNob2ljZUZpZWxkXG4gICAgICAgICogQG5hbWUgcmVtb3ZlT3B0aW9uXG4gICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICAgICogQHBhcmFtIHtib29sZWFufSBhbGxFbnRyaWVzIChkZWZhdWx0OiBmYWxzZSlcbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5yZW1vdmVPcHRpb24gPSBmdW5jdGlvbiAodmFsdWUsIGFsbEVudHJpZXMpIHtcbiAgICAgICAgICAgIGFsbEVudHJpZXMgPSBhbGxFbnRyaWVzIHx8IGZhbHNlXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHx8IFwiXCI7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIHdoaWxlIChfT3B0LmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIF9PcHQuc3BsaWNlKF9PcHQuaW5kZXhPZih2YWx1ZSksIDEpO1xuICAgICAgICAgICAgICAgIGlmIChhbGxFbnRyaWVzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBjb21ibyBib3g7IGlmIGNsZWFyLCB0aGUgZmllbGQgaXMgYSBsaXN0IGJveC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI2NvbWJvXG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb21ibycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTgpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgY29tYm8gYm94IHNoYWxsIGluY2x1ZGUgYW4gZWRpdGFibGUgdGV4dCBib3ggYXMgd2VsbCBhcyBhIGRyb3AtZG93biBsaXN0OyBpZiBjbGVhciwgaXQgc2hhbGwgaW5jbHVkZSBvbmx5IGEgZHJvcC1kb3duIGxpc3QuIFRoaXMgZmxhZyBzaGFsbCBiZSB1c2VkIG9ubHkgaWYgdGhlIENvbWJvIGZsYWcgaXMgc2V0LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQ2hvaWNlRmllbGQjZWRpdFxuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZWRpdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTkpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vUERGIDMyMDAwLTE6MjAwOCwgcGFnZSA0NDRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21ibyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGTigJlzIG9wdGlvbiBpdGVtcyBzaGFsbCBiZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuIFRoaXMgZmxhZyBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IHdyaXRlcnMsIG5vdCBieSByZWFkZXJzLiBDb25mb3JtaW5nIHJlYWRlcnMgc2hhbGwgZGlzcGxheSB0aGUgb3B0aW9ucyBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1ciBpbiB0aGUgT3B0IGFycmF5IChzZWUgVGFibGUgMjMxKS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI3NvcnRcbiAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3NvcnQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIwKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyMCk7XG4gICAgICAgICAgICAgICAgICAgIF9PcHQuc29ydCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCBtb3JlIHRoYW4gb25lIG9mIHRoZSBmaWVsZOKAmXMgb3B0aW9uIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBzaW11bHRhbmVvdXNseTsgaWYgY2xlYXIsIGF0IG1vc3Qgb25lIGl0ZW0gc2hhbGwgYmUgc2VsZWN0ZWQgXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI211bHRpU2VsZWN0XG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtdWx0aVNlbGVjdCcsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjIpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIyKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBzcGVsbGNoZWNrZWQuIFRoaXMgZmxhZyBzaGFsbCBub3QgYmUgdXNlZCB1bmxlc3MgdGhlIENvbWJvIGFuZCBFZGl0IGZsYWdzIGFyZSBib3RoIHNldC4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI2RvTm90U3BlbGxDaGVja1xuICAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZG9Ob3RTcGVsbENoZWNrJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgSWYgc2V0LCB0aGUgbmV3IHZhbHVlIHNoYWxsIGJlIGNvbW1pdHRlZCBhcyBzb29uIGFzIGEgc2VsZWN0aW9uIGlzIG1hZGUgKGNvbW1vbmx5IHdpdGggdGhlIHBvaW50aW5nIGRldmljZSkuIEluIHRoaXMgY2FzZSwgc3VwcGx5aW5nIGEgdmFsdWUgZm9yIGEgZmllbGQgaW52b2x2ZXMgdGhyZWUgYWN0aW9uczogc2VsZWN0aW5nIHRoZSBmaWVsZCBmb3IgZmlsbC1pbiwgc2VsZWN0aW5nIGEgY2hvaWNlIGZvciB0aGUgZmlsbC1pbiB2YWx1ZSwgYW5kIGxlYXZpbmcgdGhhdCBmaWVsZCwgd2hpY2ggZmluYWxpemVzIG9yIOKAnGNvbW1pdHPigJ0gdGhlIGRhdGEgY2hvaWNlIGFuZCB0cmlnZ2VycyBhbnkgYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudHJ5IG9yIGNoYW5naW5nIG9mIHRoaXMgZGF0YS4gSWYgdGhpcyBmbGFnIGlzIG9uLCB0aGVuIHByb2Nlc3NpbmcgZG9lcyBub3Qgd2FpdCBmb3IgbGVhdmluZyB0aGUgZmllbGQgYWN0aW9uIHRvIG9jY3VyLCBidXQgaW1tZWRpYXRlbHkgcHJvY2VlZHMgdG8gdGhlIHRoaXJkIHN0ZXAuXG4gICAgICAgICogVGhpcyBvcHRpb24gZW5hYmxlcyBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSBhbiBhY3Rpb24gb25jZSBhIHNlbGVjdGlvbiBpcyBtYWRlLCB3aXRob3V0IHJlcXVpcmluZyB0aGUgdXNlciB0byBleGl0IHRoZSBmaWVsZC4gSWYgY2xlYXIsIHRoZSBuZXcgdmFsdWUgaXMgbm90IGNvbW1pdHRlZCB1bnRpbCB0aGUgdXNlciBleGl0cyB0aGUgZmllbGQuXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUNob2ljZUZpZWxkI2NvbW1pdE9uU2VsQ2hhbmdlXG4gICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb21taXRPblNlbENoYW5nZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjcpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI3KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB0aGlzLmhhc0FwcGVhcmFuY2VTdHJlYW0gPSBmYWxzZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1DaG9pY2VGaWVsZCwgQWNyb0Zvcm1GaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUxpc3RCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ2hvaWNlRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUxpc3RCb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQ2hvaWNlRmllbGQuY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5mb250TmFtZSA9ICdoZWx2ZXRpY2EnO1xuXG4gICAgICAgIC8vUERGIDMyMDAwLTE6MjAwOCwgcGFnZSA0NDRcbiAgICAgICAgdGhpcy5jb21ibyA9IGZhbHNlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUxpc3RCb3gsIEFjcm9Gb3JtQ2hvaWNlRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1Db21ib0JveCBcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtTGlzdEJveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtQ29tYm9Cb3ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtTGlzdEJveC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmNvbWJvID0gdHJ1ZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1Db21ib0JveCwgQWNyb0Zvcm1MaXN0Qm94KTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtRWRpdEJveCBcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQ29tYm9Cb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtTGlzdEJveFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1DaG9pY2VGaWVsZFxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtRWRpdEJveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1Db21ib0JveC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmVkaXQgPSB0cnVlO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybUVkaXRCb3gsIEFjcm9Gb3JtQ29tYm9Cb3gpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1CdXR0b25cbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUJ1dHRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLkZUID0gXCIvQnRuXCI7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFJhZGlvIGJ1dHRvbnMgb25seSkgSWYgc2V0LCBleGFjdGx5IG9uZSByYWRpbyBidXR0b24gc2hhbGwgYmUgc2VsZWN0ZWQgYXQgYWxsIHRpbWVzOyBzZWxlY3RpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBidXR0b24gaGFzIG5vIGVmZmVjdC4gSWYgY2xlYXIsIGNsaWNraW5nIHRoZSBzZWxlY3RlZCBidXR0b24gZGVzZWxlY3RzIGl0LCBsZWF2aW5nIG5vIGJ1dHRvbiBzZWxlY3RlZC5cbiAgICAgICAgKiBcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNub1RvZ2dsZVRvT2ZmXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbm9Ub2dnbGVUb09mZicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE1KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgaXMgYSBzZXQgb2YgcmFkaW8gYnV0dG9uczsgaWYgY2xlYXIsIHRoZSBmaWVsZCBpcyBhIGNoZWNrYm94LiBUaGlzIGZsYWcgbWF5IGJlIHNldCBvbmx5IGlmIHRoZSBQdXNoYnV0dG9uIGZsYWcgaXMgY2xlYXIuIFxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI3JhZGlvXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmFkaW8nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE2KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGEgcHVzaGJ1dHRvbiB0aGF0IGRvZXMgbm90IHJldGFpbiBhIHBlcm1hbmVudCB2YWx1ZS4gXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNwdXNoQnV0dG9uXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncHVzaEJ1dHRvbicsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMTcpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE3KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMTcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjUpIElmIHNldCwgYSBncm91cCBvZiByYWRpbyBidXR0b25zIHdpdGhpbiBhIHJhZGlvIGJ1dHRvbiBmaWVsZCB0aGF0IHVzZSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIG9uIHN0YXRlIHdpbGwgdHVybiBvbiBhbmQgb2ZmIGluIHVuaXNvbjsgdGhhdCBpcyBpZiBvbmUgaXMgY2hlY2tlZCwgdGhleSBhcmUgYWxsIGNoZWNrZWQuIElmIGNsZWFyLCB0aGUgYnV0dG9ucyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICh0aGUgc2FtZSBiZWhhdmlvciBhcyBIVE1MIHJhZGlvIGJ1dHRvbnMpLlxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1CdXR0b24jcmFkaW9Jc1VuaXNvblxuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3JhZGlvSXNVbmlzb24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfTUsgPSB7fTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdNSycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhfTUspLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCc8PCcpO1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBfTUspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcvJyArIGtleSArICcgKCcgKyBfTUtba2V5XSArICcpJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goJz4+Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuam9pbignXFxuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSyA9IHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiBGcm9tIHRoZSBQREYgcmVmZXJlbmNlOlxuICAgICAgICAqIChPcHRpb25hbCwgYnV0dG9uIGZpZWxkcyBvbmx5KSBUaGUgd2lkZ2V0IGFubm90YXRpb24ncyBub3JtYWwgY2FwdGlvbiB3aGljaCBzaGFsbCBiZSBkaXNwbGF5ZWQgd2hlbiBpdCBpcyBub3QgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlci4gXG4gICAgICAgICogVW5saWtlIHRoZSByZW1haW5pbmcgZW50cmllcyBsaXN0ZWQgaW4gdGhpcyBUYWJsZSB3aGljaCBhcHBseSBvbmx5IHRvIHdpZGdldCBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggcHVzaGJ1dHRvbiBmaWVsZHMgKHNlZSBQdXNoYnV0dG9ucyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpLCB0aGUgQ0EgZW50cnkgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdHlwZSBvZiBidXR0b24gZmllbGQsIGluY2x1ZGluZyBjaGVjayBib3hlcyAoc2VlIENoZWNrIEJveGVzIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikgYW5kIHJhZGlvIGJ1dHRvbnMgKFJhZGlvIEJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKS5cbiAgICAgICAgKlxuICAgICAgICAqIC0gJzgnID0gQ3Jvc3MsIFxuICAgICAgICAqIC0gJ2wnID0gIENpcmNsZSxcbiAgICAgICAgKiAtICcnID0gbm90aGluZ1xuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2NhcHRpb25cbiAgICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NhcHRpb24nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9NSy5DQSB8fCAnJztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgX01LLkNBID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgX0FTO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ0FTJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9BUztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChSZXF1aXJlZCBpZiB0aGUgYXBwZWFyYW5jZSBkaWN0aW9uYXJ5IEFQIGNvbnRhaW5zIG9uZSBvciBtb3JlIHN1YmRpY3Rpb25hcmllczsgUERGIDEuMikgVGhlIGFubm90YXRpb24ncyBhcHBlYXJhbmNlIHN0YXRlLCB3aGljaCBzZWxlY3RzIHRoZSBhcHBsaWNhYmxlIGFwcGVhcmFuY2Ugc3RyZWFtIGZyb20gYW4gYXBwZWFyYW5jZSBzdWJkaWN0aW9uYXJ5IChzZWUgU2VjdGlvbiAxMi41LjUsIFwiQXBwZWFyYW5jZSBTdHJlYW1zXCIpXG4gICAgICAgICpcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNhcHBlYXJhbmNlU3RhdGVcbiAgICAgICAgKiBAdHlwZSB7YW55fVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2FwcGVhcmFuY2VTdGF0ZScsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0FTLnN1YnN0cigxLCBfQVMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSAnLycgKyB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1CdXR0b24sIEFjcm9Gb3JtRmllbGQpO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1QdXNoQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUHVzaEJ1dHRvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1CdXR0b24uY2FsbCh0aGlzKTtcbiAgICAgICAgdGhpcy5wdXNoQnV0dG9uID0gdHJ1ZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1QdXNoQnV0dG9uLCBBY3JvRm9ybUJ1dHRvbik7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVJhZGlvQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUJ1dHRvblxuICAgICogQGV4dGVuZHMgQWNyb0Zvcm1GaWVsZFxuICAgICovXG4gICAgdmFyIEFjcm9Gb3JtUmFkaW9CdXR0b24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtQnV0dG9uLmNhbGwodGhpcyk7XG4gICAgICAgIHRoaXMucmFkaW8gPSB0cnVlO1xuICAgICAgICB0aGlzLnB1c2hCdXR0b24gPSBmYWxzZTtcblxuICAgICAgICB2YXIgX0tpZHMgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdLaWRzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX0tpZHM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9LaWRzID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgX0tpZHMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVJhZGlvQnV0dG9uLCBBY3JvRm9ybUJ1dHRvbik7XG5cbiAgICAvKipcbiAgICAqIFRoZSBDaGlsZCBjbGFzcyBvZiBhIFJhZGlvQnV0dG9uICh0aGUgcmFkaW9Hcm91cCkgLT4gVGhlIHNpbmdsZSBCdXR0b25zXG4gICAgKiBcbiAgICAqIEBjbGFzcyBBY3JvRm9ybUNoaWxkQ2xhc3NcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqIEBpZ25vcmVcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybUNoaWxkQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIEFjcm9Gb3JtRmllbGQuY2FsbCh0aGlzKTtcblxuICAgICAgICB2YXIgX3BhcmVudDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdQYXJlbnQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3BhcmVudDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9wYXJlbnQgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9vcHRpb25OYW1lO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ29wdGlvbk5hbWUnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfb3B0aW9uTmFtZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9vcHRpb25OYW1lID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfTUsgPSB7fTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdNSycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPDwnKTtcbiAgICAgICAgICAgICAgICB2YXIga2V5O1xuICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIF9NSykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnLycgKyBrZXkgKyAnICgnICsgX01LW2tleV0gKyAnKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCgnPj4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICBfTUsgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogRnJvbSB0aGUgUERGIHJlZmVyZW5jZTpcbiAgICAgICAgKiAoT3B0aW9uYWwsIGJ1dHRvbiBmaWVsZHMgb25seSkgVGhlIHdpZGdldCBhbm5vdGF0aW9uJ3Mgbm9ybWFsIGNhcHRpb24gd2hpY2ggc2hhbGwgYmUgZGlzcGxheWVkIHdoZW4gaXQgaXMgbm90IGludGVyYWN0aW5nIHdpdGggdGhlIHVzZXIuIFxuICAgICAgICAqIFVubGlrZSB0aGUgcmVtYWluaW5nIGVudHJpZXMgbGlzdGVkIGluIHRoaXMgVGFibGUgd2hpY2ggYXBwbHkgb25seSB0byB3aWRnZXQgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHB1c2hidXR0b24gZmllbGRzIChzZWUgUHVzaGJ1dHRvbnMgaW4gMTIuNy40LjIsIFwiQnV0dG9uIEZpZWxkc1wiKSwgdGhlIENBIGVudHJ5IG1heSBiZSB1c2VkIHdpdGggYW55IHR5cGUgb2YgYnV0dG9uIGZpZWxkLCBpbmNsdWRpbmcgY2hlY2sgYm94ZXMgKHNlZSBDaGVjayBCb3hlcyBpbiAxMi43LjQuMiwgXCJCdXR0b24gRmllbGRzXCIpIGFuZCByYWRpbyBidXR0b25zIChSYWRpbyBCdXR0b25zIGluIDEyLjcuNC4yLCBcIkJ1dHRvbiBGaWVsZHNcIikuXG4gICAgICAgICpcbiAgICAgICAgKiAtICc4JyA9IENyb3NzLCBcbiAgICAgICAgKiAtICdsJyA9ICBDaXJjbGUsXG4gICAgICAgICogLSAnJyA9IG5vdGhpbmdcbiAgICAgICAgKiBAbmFtZSBBY3JvRm9ybUJ1dHRvbiNjYXB0aW9uXG4gICAgICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjYXB0aW9uJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTUsuQ0EgfHwgJyc7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NSy5DQSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIF9BUztcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdBUycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfQVMgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFJlcXVpcmVkIGlmIHRoZSBhcHBlYXJhbmNlIGRpY3Rpb25hcnkgQVAgY29udGFpbnMgb25lIG9yIG1vcmUgc3ViZGljdGlvbmFyaWVzOyBQREYgMS4yKSBUaGUgYW5ub3RhdGlvbidzIGFwcGVhcmFuY2Ugc3RhdGUsIHdoaWNoIHNlbGVjdHMgdGhlIGFwcGxpY2FibGUgYXBwZWFyYW5jZSBzdHJlYW0gZnJvbSBhbiBhcHBlYXJhbmNlIHN1YmRpY3Rpb25hcnkgKHNlZSBTZWN0aW9uIDEyLjUuNSwgXCJBcHBlYXJhbmNlIFN0cmVhbXNcIilcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtQnV0dG9uI2FwcGVhcmFuY2VTdGF0ZVxuICAgICAgICAqIEB0eXBlIHthbnl9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYXBwZWFyYW5jZVN0YXRlJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfQVMuc3Vic3RyKDEsIF9BUy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9BUyA9ICcvJyArIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXB0aW9uID0gJ2wnO1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdGF0ZSA9ICdPZmYnO1xuICAgICAgICAvLyB0b2RvOiBzZXQgQXBwZWFyYW5jZVR5cGUgYXMgdmFyaWFibGUgdGhhdCBjYW4gYmUgc2V0IGZyb20gdGhlXG4gICAgICAgIC8vIG91dHNpZGUuLi5cbiAgICAgICAgdGhpcy5fQXBwZWFyYW5jZVR5cGUgPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlO1xuICAgICAgICAvLyBUaGUgRGVmYXVsdCBhcHBlYXJhbmNlVHlwZSBpcyB0aGUgQ2lyY2xlXG4gICAgICAgIHRoaXMuYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQgPSB0aGlzLl9BcHBlYXJhbmNlVHlwZS5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKHRoaXMub3B0aW9uTmFtZSk7XG4gICAgfTtcbiAgICBpbmhlcml0KEFjcm9Gb3JtQ2hpbGRDbGFzcywgQWNyb0Zvcm1GaWVsZCk7XG5cbiAgICBBY3JvRm9ybVJhZGlvQnV0dG9uLnByb3RvdHlwZS5zZXRBcHBlYXJhbmNlID0gZnVuY3Rpb24gKGFwcGVhcmFuY2UpIHtcbiAgICAgICAgaWYgKCEoJ2NyZWF0ZUFwcGVhcmFuY2VTdHJlYW0nIGluIGFwcGVhcmFuY2UgJiYgJ2dldENBJyBpbiBhcHBlYXJhbmNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgYXNzaWduIEFwcGVhcmFuY2UgdG8gUmFkaW9CdXR0b24uIEFwcGVhcmFuY2Ugd2FzIEludmFsaWQhXCIpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIG9iaklkIGluIHRoaXMuS2lkcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuS2lkcy5oYXNPd25Qcm9wZXJ0eShvYmpJZCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLktpZHNbb2JqSWRdO1xuICAgICAgICAgICAgICAgIGNoaWxkLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gYXBwZWFyYW5jZS5jcmVhdGVBcHBlYXJhbmNlU3RyZWFtKGNoaWxkLm9wdGlvbk5hbWUpO1xuICAgICAgICAgICAgICAgIGNoaWxkLmNhcHRpb24gPSBhcHBlYXJhbmNlLmdldENBKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQWNyb0Zvcm1SYWRpb0J1dHRvbi5wcm90b3R5cGUuY3JlYXRlT3B0aW9uID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgLy8gQ3JlYXRlIG5ldyBDaGlsZCBmb3IgUmFkaW9Hcm91cFxuICAgICAgICB2YXIgY2hpbGQgPSBuZXcgQWNyb0Zvcm1DaGlsZENsYXNzKCk7XG4gICAgICAgIGNoaWxkLlBhcmVudCA9IHRoaXM7XG4gICAgICAgIGNoaWxkLm9wdGlvbk5hbWUgPSBuYW1lO1xuICAgICAgICAvLyBBZGQgdG8gUGFyZW50XG4gICAgICAgIHRoaXMuS2lkcy5wdXNoKGNoaWxkKTtcblxuICAgICAgICBhZGRGaWVsZC5jYWxsKHRoaXMsIGNoaWxkKTtcblxuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQGNsYXNzIEFjcm9Gb3JtQ2hlY2tCb3hcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtQnV0dG9uXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1DaGVja0JveCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1CdXR0b24uY2FsbCh0aGlzKTtcblxuICAgICAgICB0aGlzLmZvbnROYW1lID0gJ3phcGZkaW5nYmF0cyc7XG4gICAgICAgIHRoaXMuY2FwdGlvbiA9ICczJztcbiAgICAgICAgdGhpcy5hcHBlYXJhbmNlU3RhdGUgPSAnT24nO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJPblwiO1xuICAgICAgICB0aGlzLnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICB0aGlzLmFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0gQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94LmNyZWF0ZUFwcGVhcmFuY2VTdHJlYW0oKTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1DaGVja0JveCwgQWNyb0Zvcm1CdXR0b24pO1xuXG4gICAgLyoqXG4gICAgKiBAY2xhc3MgQWNyb0Zvcm1UZXh0RmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtRmllbGRcbiAgICAqL1xuICAgIHZhciBBY3JvRm9ybVRleHRGaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgQWNyb0Zvcm1GaWVsZC5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLkZUID0gJy9UeCc7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogSWYgc2V0LCB0aGUgZmllbGQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgbGluZXMgb2YgdGV4dDsgaWYgY2xlYXIsIHRoZSBmaWVsZOKAmXMgdGV4dCBzaGFsbCBiZSByZXN0cmljdGVkIHRvIGEgc2luZ2xlIGxpbmUuIFxuICAgICAgICAqXG4gICAgICAgICogQG5hbWUgQWNyb0Zvcm1UZXh0RmllbGQjbXVsdGlsaW5lXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbXVsdGlsaW5lJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAxMykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMTMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAxMyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCB0aGUgdGV4dCBlbnRlcmVkIGluIHRoZSBmaWVsZCByZXByZXNlbnRzIHRoZSBwYXRobmFtZSBvZiBhIGZpbGUgd2hvc2UgY29udGVudHMgc2hhbGwgYmUgc3VibWl0dGVkIGFzIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuIFxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI2ZpbGVTZWxlY3RcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdmaWxlU2VsZWN0Jywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyMSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNCkgSWYgc2V0LCB0ZXh0IGVudGVyZWQgaW4gdGhlIGZpZWxkIHNoYWxsIG5vdCBiZSBzcGVsbC1jaGVja2VkLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI2RvTm90U3BlbGxDaGVja1xuICAgICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAgICAqL1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2RvTm90U3BlbGxDaGVjaycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihnZXRCaXRGb3JQZGYodGhpcy5GZiwgMjMpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmIChCb29sZWFuKHZhbHVlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gc2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDIzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLkZmID0gY2xlYXJCaXRGb3JQZGYodGhpcy5GZiwgMjMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogKFBERiAxLjQpIElmIHNldCwgdGhlIGZpZWxkIHNoYWxsIG5vdCBzY3JvbGwgKGhvcml6b250YWxseSBmb3Igc2luZ2xlLWxpbmUgZmllbGRzLCB2ZXJ0aWNhbGx5IGZvciBtdWx0aXBsZS1saW5lIGZpZWxkcykgdG8gYWNjb21tb2RhdGUgbW9yZSB0ZXh0IHRoYW4gZml0cyB3aXRoaW4gaXRzIGFubm90YXRpb24gcmVjdGFuZ2xlLiBPbmNlIHRoZSBmaWVsZCBpcyBmdWxsLCBubyBmdXJ0aGVyIHRleHQgc2hhbGwgYmUgYWNjZXB0ZWQgZm9yIGludGVyYWN0aXZlIGZvcm0gZmlsbGluZzsgZm9yIG5vbmludGVyYWN0aXZlIGZvcm0gZmlsbGluZywgdGhlIGZpbGxlciBzaG91bGQgdGFrZSBjYXJlIG5vdCB0byBhZGQgbW9yZSBjaGFyYWN0ZXIgdGhhbiB3aWxsIHZpc2libHkgZml0IGluIHRoZSBkZWZpbmVkIGFyZWEuIFxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI2RvTm90U2Nyb2xsXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZG9Ob3RTY3JvbGwnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI0KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIChQREYgMS41KSBNYXkgYmUgc2V0IG9ubHkgaWYgdGhlIE1heExlbiBlbnRyeSBpcyBwcmVzZW50IGluIHRoZSB0ZXh0IGZpZWxkIGRpY3Rpb25hcnkgKHNlZSBUYWJsZSAyMjkpIGFuZCBpZiB0aGUgTXVsdGlsaW5lLCBQYXNzd29yZCwgYW5kIEZpbGVTZWxlY3QgZmxhZ3MgYXJlIGNsZWFyLiBJZiBzZXQsIHRoZSBmaWVsZCBzaGFsbCBiZSBhdXRvbWF0aWNhbGx5IGRpdmlkZWQgaW50byBhcyBtYW55IGVxdWFsbHkgc3BhY2VkIHBvc2l0aW9ucywgb3IgY29tYnMsIGFzIHRoZSB2YWx1ZSBvZiBNYXhMZW4sIGFuZCB0aGUgdGV4dCBpcyBsYWlkIG91dCBpbnRvIHRob3NlIGNvbWJzLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI2NvbWJcbiAgICAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgICAgKi9cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb21iJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGdldEJpdEZvclBkZih0aGlzLkZmLCAyNSkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKEJvb2xlYW4odmFsdWUpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBzZXRCaXRGb3JQZGYodGhpcy5GZiwgMjUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRmYgPSBjbGVhckJpdEZvclBkZih0aGlzLkZmLCAyNSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoUERGIDEuNSkgSWYgc2V0LCB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBzaGFsbCBiZSBhIHJpY2ggdGV4dCBzdHJpbmcgKHNlZSAxMi43LjMuNCwg4oCcUmljaCBUZXh0IFN0cmluZ3PigJ0pLiBJZiB0aGUgZmllbGQgaGFzIGEgdmFsdWUsIHRoZSBSViBlbnRyeSBvZiB0aGUgZmllbGQgZGljdGlvbmFyeSAoVGFibGUgMjIyKSBzaGFsbCBzcGVjaWZ5IHRoZSByaWNoIHRleHQgc3RyaW5nLlxuICAgICAgICAqIFxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI3JpY2hUZXh0XG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncmljaFRleHQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDI2KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAyNik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDI2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBfTWF4TGVuID0gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdNYXhMZW4nLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTWF4TGVuO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX01heExlbiA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgKiAoT3B0aW9uYWw7IGluaGVyaXRhYmxlKSBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGZpZWxk4oCZcyB0ZXh0LCBpbiBjaGFyYWN0ZXJzLiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI21heExlbmd0aFxuICAgICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbWF4TGVuZ3RoJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfTWF4TGVuO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9NYXhMZW4gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdoYXNBcHBlYXJhbmNlU3RyZWFtJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5WIHx8IHRoaXMuRFYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG4gICAgaW5oZXJpdChBY3JvRm9ybVRleHRGaWVsZCwgQWNyb0Zvcm1GaWVsZCk7XG5cbiAgICAvKipcbiAgICAqIEBjbGFzcyBBY3JvRm9ybVBhc3N3b3JkRmllbGRcbiAgICAqIEBleHRlbmRzIEFjcm9Gb3JtVGV4dEZpZWxkXG4gICAgKiBAZXh0ZW5kcyBBY3JvRm9ybUZpZWxkXG4gICAgKi9cbiAgICB2YXIgQWNyb0Zvcm1QYXNzd29yZEZpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBBY3JvRm9ybVRleHRGaWVsZC5jYWxsKHRoaXMpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAqIElmIHNldCwgdGhlIGZpZWxkIGlzIGludGVuZGVkIGZvciBlbnRlcmluZyBhIHNlY3VyZSBwYXNzd29yZCB0aGF0IHNob3VsZCBub3QgYmUgZWNob2VkIHZpc2libHkgdG8gdGhlIHNjcmVlbi4gQ2hhcmFjdGVycyB0eXBlZCBmcm9tIHRoZSBrZXlib2FyZCBzaGFsbCBpbnN0ZWFkIGJlIGVjaG9lZCBpbiBzb21lIHVucmVhZGFibGUgZm9ybSwgc3VjaCBhcyBhc3Rlcmlza3Mgb3IgYnVsbGV0IGNoYXJhY3RlcnMuXG4gICAgICAgICogTk9URSBUbyBwcm90ZWN0IHBhc3N3b3JkIGNvbmZpZGVudGlhbGl0eSwgcmVhZGVycyBzaG91bGQgbmV2ZXIgc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IGZpZWxkIGluIHRoZSBQREYgZmlsZSBpZiB0aGlzIGZsYWcgaXMgc2V0LiBcbiAgICAgICAgKlxuICAgICAgICAqIEBuYW1lIEFjcm9Gb3JtVGV4dEZpZWxkI3Bhc3N3b3JkXG4gICAgICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICAgICovXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncGFzc3dvcmQnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0Qml0Rm9yUGRmKHRoaXMuRmYsIDE0KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQm9vbGVhbih2YWx1ZSkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IHNldEJpdEZvclBkZih0aGlzLkZmLCAxNCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5GZiA9IGNsZWFyQml0Rm9yUGRmKHRoaXMuRmYsIDE0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnBhc3N3b3JkID0gdHJ1ZTtcbiAgICB9O1xuICAgIGluaGVyaXQoQWNyb0Zvcm1QYXNzd29yZEZpZWxkLCBBY3JvRm9ybVRleHRGaWVsZCk7XG5cblxuICAgIC8vIENvbnRhaW5zIE1ldGhvZHMgZm9yIGNyZWF0aW5nIHN0YW5kYXJkIGFwcGVhcmFuY2VzXG4gICAgdmFyIEFjcm9Gb3JtQXBwZWFyYW5jZSA9IHtcbiAgICAgICAgQ2hlY2tCb3g6IHtcbiAgICAgICAgICAgIGNyZWF0ZUFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgYXBwZWFyYW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgTjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgT246IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5ZZXNOb3JtYWxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgRDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgT246IEFjcm9Gb3JtQXBwZWFyYW5jZS5DaGVja0JveC5ZZXNQdXNoRG93bixcbiAgICAgICAgICAgICAgICAgICAgICAgIE9mZjogQWNyb0Zvcm1BcHBlYXJhbmNlLkNoZWNrQm94Lk9mZlB1c2hEb3duXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICogUmV0dXJucyB0aGUgc3RhbmRhcmQgT24gQXBwZWFyYW5jZSBmb3IgYSBDaGVja0JveFxuICAgICAgICAgICAgICAqIFxuICAgICAgICAgICAgICAqIEByZXR1cm5zIHtBY3JvRm9ybVhPYmplY3R9XG4gICAgICAgICAgICAgICovXG4gICAgICAgICAgICBZZXNQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcbiAgICAgICAgICAgICAgICB2YXIgZW5jb2RlZENvbG9yID0gc2NvcGUuX19wcml2YXRlX18uZW5jb2RlQ29sb3JTdHJpbmcoZm9ybU9iamVjdC5jb2xvcik7XG4gICAgICAgICAgICAgICAgdmFyIGNhbGNSZXMgPSBjYWxjdWxhdGVYKGZvcm1PYmplY3QsIGZvcm1PYmplY3QuY2FwdGlvbik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJCTUNcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIDEgcmdcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIvXCIgKyBmb250S2V5ICsgXCIgXCIgKyBmMihjYWxjUmVzLmZvbnRTaXplKSArIFwiIFRmIFwiICsgZW5jb2RlZENvbG9yKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIkJUXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGNhbGNSZXMudGV4dCk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJFVFwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJFTUNcIik7XG4gICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIFllc05vcm1hbDogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgZm9udEtleSA9IHNjb3BlLmludGVybmFsLmdldEZvbnQoZm9ybU9iamVjdC5mb250TmFtZSwgZm9ybU9iamVjdC5mb250U3R5bGUpLmlkO1xuICAgICAgICAgICAgICAgIHZhciBlbmNvZGVkQ29sb3IgPSBzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgIHZhciBjYWxjUmVzID0gY2FsY3VsYXRlWChmb3JtT2JqZWN0LCBmb3JtT2JqZWN0LmNhcHRpb24pO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSBnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIod2lkdGgpICsgXCIgXCIgKyBmMihoZWlnaHQpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCAxIHJnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIod2lkdGggLSAxKSArIFwiIFwiICsgZjIoaGVpZ2h0IC0gMSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIldcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJuXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCBnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiQlRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIvXCIgKyBmb250S2V5ICsgXCIgXCIgKyBmMihjYWxjUmVzLmZvbnRTaXplKSArIFwiIFRmIFwiICsgZW5jb2RlZENvbG9yKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChjYWxjUmVzLnRleHQpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiRVRcIik7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBPZmYgQXBwZWFyYW5jZSBmb3IgYSBDaGVja0JveFxuICAgICAgICAgICAgICAqIFxuICAgICAgICAgICAgICAqIEByZXR1cm5zIHtBY3JvRm9ybVhPYmplY3R9XG4gICAgICAgICAgICAgICovXG4gICAgICAgICAgICBPZmZQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMCAwIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBSYWRpb0J1dHRvbjoge1xuICAgICAgICAgICAgQ2lyY2xlOiB7XG4gICAgICAgICAgICAgICAgY3JlYXRlQXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgRDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPZmYnOiBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ2lyY2xlLk9mZlB1c2hEb3duXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgTjoge31cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuTltuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5DaXJjbGUuWWVzTm9ybWFsO1xuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlU3RyZWFtQ29udGVudC5EW25hbWVdID0gQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNpcmNsZS5ZZXNQdXNoRG93bjtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0Q0E6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdsJztcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgWWVzTm9ybWFsOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHRoZSBSYWRpdXMgb2YgdGhlIENpcmNsZSByZWxhdGl2ZSB0byBtaW4oaGVpZ2h0LCB3aWR0aCkgb2YgZm9ybU9iamVjdFxuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSA8PSBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSA/IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDQgOiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gNDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJvcmRlcnBhZGRpbmcuLi5cbiAgICAgICAgICAgICAgICAgICAgRG90UmFkaXVzID0gTnVtYmVyKChEb3RSYWRpdXMgKiAwLjkpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5CZXppZXJfQztcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1c0JlemllciA9IE51bWJlcigoRG90UmFkaXVzICogYykudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgKiBUaGUgRm9sbG93aW5nIGlzIGEgQ2lyY2xlIGNyZWF0ZWQgd2l0aCBCZXppZXItQ3VydmVzLlxuICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXMgKyBcIiAwIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgXCIgKyBEb3RSYWRpdXMgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzQmV6aWVyICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCAtXCIgKyBEb3RSYWRpdXMgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChEb3RSYWRpdXNCZXppZXIgKyBcIiAtXCIgKyBEb3RSYWRpdXMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIC1cIiArIERvdFJhZGl1c0JlemllciArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBZZXNQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIERvdFJhZGl1cyA9IChBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgPD0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gNCA6IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyA0O1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQm9yZGVycGFkZGluZy4uLlxuICAgICAgICAgICAgICAgICAgICB2YXIgRG90UmFkaXVzID0gTnVtYmVyKChEb3RSYWRpdXMgKiAwLjkpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHJlc3VsdHMgZm9yIGxhdGVyIHVzZTsgbm8gbmVlZCB0byB3YXN0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzb3IgdGlja3Mgb24gZG9pbmcgbWF0aFxuICAgICAgICAgICAgICAgICAgICB2YXIgayA9IE51bWJlcigoRG90UmFkaXVzICogMikudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrYyA9IE51bWJlcigoayAqIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5CZXppZXJfQykudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkYyA9IE51bWJlcigoRG90UmFkaXVzICogQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLkJlemllcl9DKS50b0ZpeGVkKDUpKTtcblxuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAuNzQ5MDIzIGdcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDAgMCAxIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIC8gMikgKyBcIiBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkgLyAyKSArIFwiIGNtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgMCBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChrICsgXCIgXCIgKyBrYyArIFwiIFwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIFwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrYyArIFwiIC1cIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiLVwiICsgayArIFwiIC1cIiArIGtjICsgXCIgLVwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCAtXCIgKyBrICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goa2MgKyBcIiAtXCIgKyBrICsgXCIgXCIgKyBrICsgXCIgLVwiICsga2MgKyBcIiBcIiArIGsgKyBcIiAwIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMCAwIDEgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLyAyKSArIFwiIFwiICsgZjUoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAvIDIpICsgXCIgY21cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKERvdFJhZGl1cyArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJcIiArIERvdFJhZGl1cyArIFwiIFwiICsgZGMgKyBcIiBcIiArIGRjICsgXCIgXCIgKyBEb3RSYWRpdXMgKyBcIiAwIFwiICsgRG90UmFkaXVzICsgXCIgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBkYyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgXCIgKyBkYyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCItXCIgKyBEb3RSYWRpdXMgKyBcIiAtXCIgKyBkYyArIFwiIC1cIiArIGRjICsgXCIgLVwiICsgRG90UmFkaXVzICsgXCIgMCAtXCIgKyBEb3RSYWRpdXMgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChkYyArIFwiIC1cIiArIERvdFJhZGl1cyArIFwiIFwiICsgRG90UmFkaXVzICsgXCIgLVwiICsgZGMgKyBcIiBcIiArIERvdFJhZGl1cyArIFwiIDAgY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJmXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIlFcIik7XG4gICAgICAgICAgICAgICAgICAgIHhvYmouc3RyZWFtID0gc3RyZWFtLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB4b2JqO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT2ZmUHVzaERvd246IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBEb3RSYWRpdXMgPSAoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpIDw9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDQgOiBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gNDtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEJvcmRlcnBhZGRpbmcuLi5cbiAgICAgICAgICAgICAgICAgICAgRG90UmFkaXVzID0gTnVtYmVyKChEb3RSYWRpdXMgKiAwLjkpLnRvRml4ZWQoNSkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHJlc3VsdHMgZm9yIGxhdGVyIHVzZTsgbm8gbmVlZCB0byB3YXN0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzb3IgdGlja3Mgb24gZG9pbmcgbWF0aFxuICAgICAgICAgICAgICAgICAgICB2YXIgayA9IE51bWJlcigoRG90UmFkaXVzICogMikudG9GaXhlZCg1KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrYyA9IE51bWJlcigoayAqIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5CZXppZXJfQykudG9GaXhlZCg1KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInFcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMSAwIDAgMSBcIiArIGY1KEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAvIDIpICsgXCIgXCIgKyBmNShBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC8gMikgKyBcIiBjbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIDAgbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goayArIFwiIFwiICsga2MgKyBcIiBcIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBcIiArIGsgKyBcIiBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgLVwiICsgayArIFwiIFwiICsga2MgKyBcIiAtXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIi1cIiArIGsgKyBcIiAtXCIgKyBrYyArIFwiIC1cIiArIGtjICsgXCIgLVwiICsgayArIFwiIDAgLVwiICsgayArIFwiIGNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGtjICsgXCIgLVwiICsgayArIFwiIFwiICsgayArIFwiIC1cIiArIGtjICsgXCIgXCIgKyBrICsgXCIgMCBjXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIENyb3NzOiB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAqIENyZWF0ZXMgdGhlIEFjdHVhbCBBcHBlYXJhbmNlRGljdGlvbmFyeS1SZWZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICAqIFxuICAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAgICAgICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAgICAgICAgICAgICAgKiBAaWdub3JlXG4gICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNyZWF0ZUFwcGVhcmFuY2VTdHJlYW06IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcHBlYXJhbmNlU3RyZWFtQ29udGVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2ZmJzogQWNyb0Zvcm1BcHBlYXJhbmNlLlJhZGlvQnV0dG9uLkNyb3NzLk9mZlB1c2hEb3duXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgTjoge31cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZVN0cmVhbUNvbnRlbnQuTltuYW1lXSA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5SYWRpb0J1dHRvbi5Dcm9zcy5ZZXNOb3JtYWw7XG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2VTdHJlYW1Db250ZW50LkRbbmFtZV0gPSBBY3JvRm9ybUFwcGVhcmFuY2UuUmFkaW9CdXR0b24uQ3Jvc3MuWWVzUHVzaERvd247XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBlYXJhbmNlU3RyZWFtQ29udGVudDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldENBOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnOCdcbiAgICAgICAgICAgICAgICB9LFxuXG5cbiAgICAgICAgICAgICAgICBZZXNOb3JtYWw6IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2JqID0gbmV3IGNyZWF0ZUZvcm1YT2JqZWN0KGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBjcm9zcyA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5jYWxjdWxhdGVDcm9zcyhmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJxXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjEgMSBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSAtIDIpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpIC0gMikgKyBcIiByZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJXXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIm5cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngxLngpICsgXCIgXCIgKyBmMihjcm9zcy54MS55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngyLngpICsgXCIgXCIgKyBmMihjcm9zcy54Mi55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLng0LngpICsgXCIgXCIgKyBmMihjcm9zcy54NC55KSArIFwiIG1cIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKGYyKGNyb3NzLngzLngpICsgXCIgXCIgKyBmMihjcm9zcy54My55KSArIFwiIGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwic1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJRXCIpO1xuICAgICAgICAgICAgICAgICAgICB4b2JqLnN0cmVhbSA9IHN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geG9iajtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFllc1B1c2hEb3duOiBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgeG9iaiA9IG5ldyBjcmVhdGVGb3JtWE9iamVjdChmb3JtT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNyb3NzID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmNhbGN1bGF0ZUNyb3NzKGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gW107XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiMC43NDkwMjMgZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwIDAgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkpICsgXCIgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0SGVpZ2h0KGZvcm1PYmplY3QpKSArIFwiIHJlXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcImZcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwicVwiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIxIDEgXCIgKyBmMihBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwuZ2V0V2lkdGgoZm9ybU9iamVjdCkgLSAyKSArIFwiIFwiICsgZjIoQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldEhlaWdodChmb3JtT2JqZWN0KSAtIDIpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiV1wiKTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCJuXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54MS54KSArIFwiIFwiICsgZjIoY3Jvc3MueDEueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54Mi54KSArIFwiIFwiICsgZjIoY3Jvc3MueDIueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54NC54KSArIFwiIFwiICsgZjIoY3Jvc3MueDQueSkgKyBcIiBtXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChmMihjcm9zcy54My54KSArIFwiIFwiICsgZjIoY3Jvc3MueDMueSkgKyBcIiBsXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcInNcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiUVwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPZmZQdXNoRG93bjogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHhvYmogPSBuZXcgY3JlYXRlRm9ybVhPYmplY3QoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goXCIwLjc0OTAyMyBnXCIpO1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucHVzaChcIjAgMCBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aChmb3JtT2JqZWN0KSkgKyBcIiBcIiArIGYyKEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCkpICsgXCIgcmVcIik7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wdXNoKFwiZlwiKTtcbiAgICAgICAgICAgICAgICAgICAgeG9iai5zdHJlYW0gPSBzdHJlYW0uam9pbihcIlxcblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhvYmo7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICAqIFJldHVybnMgdGhlIHN0YW5kYXJkIEFwcGVhcmFuY2VcbiAgICAgICAgICAqIFxuICAgICAgICAgICogQHJldHVybnMge0Fjcm9Gb3JtWE9iamVjdH1cbiAgICAgICAgICAqL1xuICAgICAgICBjcmVhdGVEZWZhdWx0QXBwZWFyYW5jZVN0cmVhbTogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcbiAgICAgICAgICAgIC8vIFNldCBIZWx2ZXRpY2EgdG8gU3RhbmRhcmQgRm9udCAoc2l6ZTogYXV0bylcbiAgICAgICAgICAgIC8vIENvbG9yOiBCbGFja1xuICAgICAgICAgICAgdmFyIGZvbnRLZXkgPSBzY29wZS5pbnRlcm5hbC5nZXRGb250KGZvcm1PYmplY3QuZm9udE5hbWUsIGZvcm1PYmplY3QuZm9udFN0eWxlKS5pZDtcbiAgICAgICAgICAgIHZhciBlbmNvZGVkQ29sb3IgPSBzY29wZS5fX3ByaXZhdGVfXy5lbmNvZGVDb2xvclN0cmluZyhmb3JtT2JqZWN0LmNvbG9yKTtcbiAgICAgICAgICAgIHZhciBmb250U2l6ZSA9IGZvcm1PYmplY3QuZm9udFNpemU7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gJy8nICsgZm9udEtleSArICcgJyArIGZvbnRTaXplICsgJyBUZiAnICsgZW5jb2RlZENvbG9yO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBBY3JvRm9ybUFwcGVhcmFuY2UuaW50ZXJuYWwgPSB7XG4gICAgICAgIEJlemllcl9DOiAwLjU1MTkxNTAyNDQ5NCxcblxuICAgICAgICBjYWxjdWxhdGVDcm9zczogZnVuY3Rpb24gKGZvcm1PYmplY3QpIHtcblxuICAgICAgICAgICAgdmFyIHdpZHRoID0gQWNyb0Zvcm1BcHBlYXJhbmNlLmludGVybmFsLmdldFdpZHRoKGZvcm1PYmplY3QpO1xuICAgICAgICAgICAgdmFyIGhlaWdodCA9IEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQoZm9ybU9iamVjdCk7XG4gICAgICAgICAgICB2YXIgYSA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgICAgICB2YXIgY3Jvc3MgPSB7XG4gICAgICAgICAgICAgICAgeDE6IHsgLy8gdXBwZXJMZWZ0XG4gICAgICAgICAgICAgICAgICAgIHg6ICh3aWR0aCAtIGEpIC8gMixcbiAgICAgICAgICAgICAgICAgICAgeTogKChoZWlnaHQgLSBhKSAvIDIpICsgYSwvLyBoZWlnaHQgLSBib3JkZXJQYWRkaW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB4MjogeyAvLyBsb3dlclJpZ2h0XG4gICAgICAgICAgICAgICAgICAgIHg6ICgod2lkdGggLSBhKSAvIDIpICsgYSxcbiAgICAgICAgICAgICAgICAgICAgeTogKChoZWlnaHQgLSBhKSAvIDIpLy8gYm9yZGVyUGFkZGluZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeDM6IHsgLy8gbG93ZXJMZWZ0XG4gICAgICAgICAgICAgICAgICAgIHg6ICh3aWR0aCAtIGEpIC8gMixcbiAgICAgICAgICAgICAgICAgICAgeTogKChoZWlnaHQgLSBhKSAvIDIpLy8gYm9yZGVyUGFkZGluZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeDQ6IHsgLy8gdXBwZXJSaWdodFxuICAgICAgICAgICAgICAgICAgICB4OiAoKHdpZHRoIC0gYSkgLyAyKSArIGEsXG4gICAgICAgICAgICAgICAgICAgIHk6ICgoaGVpZ2h0IC0gYSkgLyAyKSArIGEsLy8gaGVpZ2h0IC0gYm9yZGVyUGFkZGluZ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBjcm9zcztcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRXaWR0aCA9IGZ1bmN0aW9uIChmb3JtT2JqZWN0KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwO1xuICAgICAgICBpZiAodHlwZW9mIGZvcm1PYmplY3QgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHNjYWxlKGZvcm1PYmplY3QuUmVjdFsyXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIEFjcm9Gb3JtQXBwZWFyYW5jZS5pbnRlcm5hbC5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoZm9ybU9iamVjdCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gMDtcbiAgICAgICAgaWYgKHR5cGVvZiBmb3JtT2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzY2FsZShmb3JtT2JqZWN0LlJlY3RbM10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIFB1YmxpYzpcblxuICAgIC8qKlxuICAgICogQWRkIGFuIEFjcm9Gb3JtLUZpZWxkIHRvIHRoZSBqc1BERi1pbnN0YW5jZVxuICAgICpcbiAgICAqIEBuYW1lIGFkZEZpZWxkXG4gICAgKiBAZnVuY3Rpb24gXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWVsZE9iamVjdFxuICAgICogQHJldHVybnMge2pzUERGfVxuICAgICovXG4gICAgdmFyIGFkZEZpZWxkID0ganNQREZBUEkuYWRkRmllbGQgPSBmdW5jdGlvbiAoZmllbGRPYmplY3QpIHtcbiAgICAgICAgaW5pdGlhbGl6ZUFjcm9Gb3JtLmNhbGwodGhpcyk7XG5cbiAgICAgICAgaWYgKGZpZWxkT2JqZWN0IGluc3RhbmNlb2YgQWNyb0Zvcm1GaWVsZCkge1xuICAgICAgICAgICAgcHV0Rm9ybS5jYWxsKHRoaXMsIGZpZWxkT2JqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkRmllbGQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRPYmplY3QucGFnZSA9IHNjb3BlLmludGVybmFsLmdldEN1cnJlbnRQYWdlSW5mbygpLnBhZ2VOdW1iZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBuYW1lIGFkZEJ1dHRvblxuICAgICogQGZ1bmN0aW9uXG4gICAgKiBAaW5zdGFuY2VcbiAgICAqIEBwYXJhbSB7QWNyb0Zvcm1CdXR0b259IG9wdGlvbnNcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqIEBkZXByZWNhdGVkXG4gICAgKi9cbiAgICBqc1BERkFQSS5hZGRCdXR0b24gPSBmdW5jdGlvbiAoYnV0dG9uKSB7XG4gICAgICAgIGlmIChidXR0b24gaW5zdGFuY2VvZiBBY3JvRm9ybUJ1dHRvbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBwYXNzZWQgdG8ganNQREYuYWRkQnV0dG9uLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZC5jYWxsKHRoaXMsIGJ1dHRvbik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICogQG5hbWUgYWRkVGV4dEZpZWxkXG4gICAgKiBAZnVuY3Rpb25cbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtBY3JvRm9ybVRleHRGaWVsZH0gdGV4dEZpZWxkXG4gICAgKiBAcmV0dXJucyB7anNQREZ9XG4gICAgKiBAZGVwcmVjYXRlZFxuICAgICovXG4gICAganNQREZBUEkuYWRkVGV4dEZpZWxkID0gZnVuY3Rpb24gKHRleHRGaWVsZCkge1xuICAgICAgICBpZiAodGV4dEZpZWxkIGluc3RhbmNlb2YgQWNyb0Zvcm1UZXh0RmllbGQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgcGFzc2VkIHRvIGpzUERGLmFkZFRleHRGaWVsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkRmllbGQuY2FsbCh0aGlzLCB0ZXh0RmllbGQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAqIEBuYW1lIGFkZENob2ljZUZpZWxkXG4gICAgKiBAZnVuY3Rpb25cbiAgICAqIEBpbnN0YW5jZVxuICAgICogQHBhcmFtIHtBY3JvRm9ybUNob2ljZUZpZWxkfSBcbiAgICAqIEByZXR1cm5zIHtqc1BERn1cbiAgICAqIEBkZXByZWNhdGVkXG4gICAgKi9cbiAgICBqc1BERkFQSS5hZGRDaG9pY2VGaWVsZCA9IGZ1bmN0aW9uIChjaG9pY2VGaWVsZCkge1xuICAgICAgICBpZiAoY2hvaWNlRmllbGQgaW5zdGFuY2VvZiBBY3JvRm9ybUNob2ljZUZpZWxkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCB0byBqc1BERi5hZGRDaG9pY2VGaWVsZC4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkRmllbGQuY2FsbCh0aGlzLCBjaG9pY2VGaWVsZCk7XG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgZ2xvYmFsT2JqID09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJDaG9pY2VGaWVsZFwiXSkgPT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgdHlwZW9mIChnbG9iYWxPYmpbXCJMaXN0Qm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkNvbWJvQm94XCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIkVkaXRCb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQnV0dG9uXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlB1c2hCdXR0b25cIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiUmFkaW9CdXR0b25cIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiQ2hlY2tCb3hcIl0pID09PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgIHR5cGVvZiAoZ2xvYmFsT2JqW1wiVGV4dEZpZWxkXCJdKSA9PT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICB0eXBlb2YgKGdsb2JhbE9ialtcIlBhc3N3b3JkRmllbGRcIl0pID09PSBcInVuZGVmaW5lZFwiXG4gICAgKSB7XG4gICAgICAgIGdsb2JhbE9ialtcIkNob2ljZUZpZWxkXCJdID0gQWNyb0Zvcm1DaG9pY2VGaWVsZDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiTGlzdEJveFwiXSA9IEFjcm9Gb3JtTGlzdEJveDtcbiAgICAgICAgZ2xvYmFsT2JqW1wiQ29tYm9Cb3hcIl0gPSBBY3JvRm9ybUNvbWJvQm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJFZGl0Qm94XCJdID0gQWNyb0Zvcm1FZGl0Qm94O1xuICAgICAgICBnbG9iYWxPYmpbXCJCdXR0b25cIl0gPSBBY3JvRm9ybUJ1dHRvbjtcbiAgICAgICAgZ2xvYmFsT2JqW1wiUHVzaEJ1dHRvblwiXSA9IEFjcm9Gb3JtUHVzaEJ1dHRvbjtcbiAgICAgICAgZ2xvYmFsT2JqW1wiUmFkaW9CdXR0b25cIl0gPSBBY3JvRm9ybVJhZGlvQnV0dG9uO1xuICAgICAgICBnbG9iYWxPYmpbXCJDaGVja0JveFwiXSA9IEFjcm9Gb3JtQ2hlY2tCb3g7XG4gICAgICAgIGdsb2JhbE9ialtcIlRleHRGaWVsZFwiXSA9IEFjcm9Gb3JtVGV4dEZpZWxkO1xuICAgICAgICBnbG9iYWxPYmpbXCJQYXNzd29yZEZpZWxkXCJdID0gQWNyb0Zvcm1QYXNzd29yZEZpZWxkO1xuXG4gICAgICAgIC8vIGJhY2t3YXJkc0NvbXBhdGliaWxpdHlcbiAgICAgICAgZ2xvYmFsT2JqW1wiQWNyb0Zvcm1cIl0gPSB7IEFwcGVhcmFuY2U6IEFjcm9Gb3JtQXBwZWFyYW5jZSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIC8vIGNvbnNvbGUud2FybihcIkFjcm9Gb3JtLUNsYXNzZXMgYXJlIG5vdCBwb3B1bGF0ZWQgaW50byBnbG9iYWwtbmFtZXNwYWNlLCBiZWNhdXNlIHRoZSBjbGFzcy1OYW1lcyBleGlzdCBhbHJlYWR5LiBUaGlzIGF2b2lkcyBjb25mbGljdHMgd2l0aCB0aGUgYWxyZWFkeSB1c2VkIGZyYW1ld29yay5cIik7XG4gICAgfVxuXG4gICAganNQREZBUEkuQWNyb0Zvcm1DaG9pY2VGaWVsZCA9IEFjcm9Gb3JtQ2hvaWNlRmllbGQ7XG4gICAganNQREZBUEkuQWNyb0Zvcm1MaXN0Qm94ID0gQWNyb0Zvcm1MaXN0Qm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtQ29tYm9Cb3ggPSBBY3JvRm9ybUNvbWJvQm94O1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtRWRpdEJveCA9IEFjcm9Gb3JtRWRpdEJveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUJ1dHRvbiA9IEFjcm9Gb3JtQnV0dG9uO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtUHVzaEJ1dHRvbiA9IEFjcm9Gb3JtUHVzaEJ1dHRvbjtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVJhZGlvQnV0dG9uID0gQWNyb0Zvcm1SYWRpb0J1dHRvbjtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUNoZWNrQm94ID0gQWNyb0Zvcm1DaGVja0JveDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybVRleHRGaWVsZCA9IEFjcm9Gb3JtVGV4dEZpZWxkO1xuICAgIGpzUERGQVBJLkFjcm9Gb3JtUGFzc3dvcmRGaWVsZCA9IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZDtcbiAgICBqc1BERkFQSS5BY3JvRm9ybUFwcGVhcmFuY2UgPSBBY3JvRm9ybUFwcGVhcmFuY2U7XG5cbiAgICBqc1BERkFQSS5BY3JvRm9ybSA9IHtcbiAgICAgICAgQ2hvaWNlRmllbGQ6IEFjcm9Gb3JtQ2hvaWNlRmllbGQsXG4gICAgICAgIExpc3RCb3g6IEFjcm9Gb3JtTGlzdEJveCxcbiAgICAgICAgQ29tYm9Cb3g6IEFjcm9Gb3JtQ29tYm9Cb3gsXG4gICAgICAgIEVkaXRCb3g6IEFjcm9Gb3JtRWRpdEJveCxcbiAgICAgICAgQnV0dG9uOiBBY3JvRm9ybUJ1dHRvbixcbiAgICAgICAgUHVzaEJ1dHRvbjogQWNyb0Zvcm1QdXNoQnV0dG9uLFxuICAgICAgICBSYWRpb0J1dHRvbjogQWNyb0Zvcm1SYWRpb0J1dHRvbixcbiAgICAgICAgQ2hlY2tCb3g6IEFjcm9Gb3JtQ2hlY2tCb3gsXG4gICAgICAgIFRleHRGaWVsZDogQWNyb0Zvcm1UZXh0RmllbGQsXG4gICAgICAgIFBhc3N3b3JkRmllbGQ6IEFjcm9Gb3JtUGFzc3dvcmRGaWVsZCxcbiAgICAgICAgQXBwZWFyYW5jZTogQWNyb0Zvcm1BcHBlYXJhbmNlXG4gICAgfTtcblxuICAgIGpzUERGLkFjcm9Gb3JtID0ge1xuICAgICAgICBDaG9pY2VGaWVsZDogQWNyb0Zvcm1DaG9pY2VGaWVsZCxcbiAgICAgICAgTGlzdEJveDogQWNyb0Zvcm1MaXN0Qm94LFxuICAgICAgICBDb21ib0JveDogQWNyb0Zvcm1Db21ib0JveCxcbiAgICAgICAgRWRpdEJveDogQWNyb0Zvcm1FZGl0Qm94LFxuICAgICAgICBCdXR0b246IEFjcm9Gb3JtQnV0dG9uLFxuICAgICAgICBQdXNoQnV0dG9uOiBBY3JvRm9ybVB1c2hCdXR0b24sXG4gICAgICAgIFJhZGlvQnV0dG9uOiBBY3JvRm9ybVJhZGlvQnV0dG9uLFxuICAgICAgICBDaGVja0JveDogQWNyb0Zvcm1DaGVja0JveCxcbiAgICAgICAgVGV4dEZpZWxkOiBBY3JvRm9ybVRleHRGaWVsZCxcbiAgICAgICAgUGFzc3dvcmRGaWVsZDogQWNyb0Zvcm1QYXNzd29yZEZpZWxkLFxuICAgICAgICBBcHBlYXJhbmNlOiBBY3JvRm9ybUFwcGVhcmFuY2VcbiAgICB9O1xufSkoanNwZGYuanNQREYsICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cgfHwgdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsKSk7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gLi9zcmMvanNwZGZfcGx1Z2lucy9hY3JvZm9ybS5qc1xuLy8gbW9kdWxlIGlkID0gNjBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiICAvKipcbiAgICoganNQREYgZnJvbUhUTUwgcGx1Z2luLiBCRVRBIHN0YWdlLiBBUEkgc3ViamVjdCB0byBjaGFuZ2UuIE5lZWRzIGJyb3dzZXJcbiAgICogQ29weXJpZ2h0IChjKSAyMDEyIFdpbGxvdyBTeXN0ZW1zIENvcnBvcmF0aW9uLCB3aWxsb3ctc3lzdGVtcy5jb21cbiAgICogICAgICAgICAgICAgICAyMDE0IEp1YW4gUGFibG8gR2F2aXJpYSwgaHR0cHM6Ly9naXRodWIuY29tL2p1YW5wZ2F2aXJpYVxuICAgKiAgICAgICAgICAgICAgIDIwMTQgRGllZ28gQ2Fzb3JyYW4sIGh0dHBzOi8vZ2l0aHViLmNvbS9kaWVnb2NyXG4gICAqICAgICAgICAgICAgICAgMjAxNCBEYW5pZWwgSHVzYXIsIGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxodXNhclxuICAgKiAgICAgICAgICAgICAgIDIwMTQgV29sZmdhbmcgR2Fzc2xlciwgaHR0cHM6Ly9naXRodWIuY29tL3dvb2xmZ1xuICAgKiAgICAgICAgICAgICAgIDIwMTQgU3RldmVuIFNwdW5naW4sIGh0dHBzOi8vZ2l0aHViLmNvbS9mbGFtZW5jb1xuICAgKlxuICAgKiBAbGljZW5zZVxuICAgKiBcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICovXG4gIHZhciBqc3BkZiA9IHJlcXVpcmUoXCJqc3BkZlwiKTtcblxuICAoZnVuY3Rpb24gKGpzUERGQVBJKSB7XG4gICAgdmFyIGNsb25lLCBfRHJpbGxGb3JDb250ZW50LCBGb250TmFtZURCLCBGb250U3R5bGVNYXAsIFRleHRBbGlnbk1hcCwgRm9udFdlaWdodE1hcCwgRmxvYXRNYXAsIENsZWFyTWFwLCBHZXRDU1MsIFB1cmdlV2hpdGVTcGFjZSwgUmVuZGVyZXIsIFJlc29sdmVGb250LCBSZXNvbHZlVW5pdGVkTnVtYmVyLCBVbml0ZWROdW1iZXJNYXAsIGVsZW1lbnRIYW5kbGVkRWxzZXdoZXJlLCBpbWFnZXMsIGxvYWRJbWdzLCBjaGVja0ZvckZvb3RlciwgcHJvY2VzcywgdGFibGVUb0pzb247XG5cbiAgICBjbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIENsb25lLnByb3RvdHlwZSA9IG9iajtcbiAgICAgICAgcmV0dXJuIG5ldyBDbG9uZSgpO1xuICAgICAgfTtcblxuICAgICAgZnVuY3Rpb24gQ2xvbmUoKSB7fVxuICAgIH0oKTtcblxuICAgIFB1cmdlV2hpdGVTcGFjZSA9IGZ1bmN0aW9uIFB1cmdlV2hpdGVTcGFjZShhcnJheSkge1xuICAgICAgdmFyIGZyYWdtZW50LCBpLCBsLCBsVHJpbW1lZCwgciwgclRyaW1tZWQsIHRyYWlsaW5nU3BhY2U7XG4gICAgICBpID0gMDtcbiAgICAgIGwgPSBhcnJheS5sZW5ndGg7XG4gICAgICBmcmFnbWVudCA9IHZvaWQgMDtcbiAgICAgIGxUcmltbWVkID0gZmFsc2U7XG4gICAgICByVHJpbW1lZCA9IGZhbHNlO1xuXG4gICAgICB3aGlsZSAoIWxUcmltbWVkICYmIGkgIT09IGwpIHtcbiAgICAgICAgZnJhZ21lbnQgPSBhcnJheVtpXSA9IGFycmF5W2ldLnRyaW1MZWZ0KCk7XG5cbiAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgbFRyaW1tZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaSsrO1xuICAgICAgfVxuXG4gICAgICBpID0gbCAtIDE7XG5cbiAgICAgIHdoaWxlIChsICYmICFyVHJpbW1lZCAmJiBpICE9PSAtMSkge1xuICAgICAgICBmcmFnbWVudCA9IGFycmF5W2ldID0gYXJyYXlbaV0udHJpbVJpZ2h0KCk7XG5cbiAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgclRyaW1tZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaS0tO1xuICAgICAgfVxuXG4gICAgICByID0gL1xccyskL2c7XG4gICAgICB0cmFpbGluZ1NwYWNlID0gdHJ1ZTtcbiAgICAgIGkgPSAwO1xuXG4gICAgICB3aGlsZSAoaSAhPT0gbCkge1xuICAgICAgICAvLyBMZWF2ZSB0aGUgbGluZSBicmVha3MgaW50YWN0XG4gICAgICAgIGlmIChhcnJheVtpXSAhPSBcIlxcdTIwMjhcIikge1xuICAgICAgICAgIGZyYWdtZW50ID0gYXJyYXlbaV0ucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG5cbiAgICAgICAgICBpZiAodHJhaWxpbmdTcGFjZSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBmcmFnbWVudC50cmltTGVmdCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgICAgICAgdHJhaWxpbmdTcGFjZSA9IHIudGVzdChmcmFnbWVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXJyYXlbaV0gPSBmcmFnbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH07XG5cbiAgICBSZW5kZXJlciA9IGZ1bmN0aW9uIFJlbmRlcmVyKHBkZiwgeCwgeSwgc2V0dGluZ3MpIHtcbiAgICAgIHRoaXMucGRmID0gcGRmO1xuICAgICAgdGhpcy54ID0geDtcbiAgICAgIHRoaXMueSA9IHk7XG4gICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7IC8vbGlzdCBvZiBmdW5jdGlvbnMgd2hpY2ggYXJlIGNhbGxlZCBhZnRlciBlYWNoIGVsZW1lbnQtcmVuZGVyaW5nIHByb2Nlc3NcblxuICAgICAgdGhpcy53YXRjaEZ1bmN0aW9ucyA9IFtdO1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgUmVzb2x2ZUZvbnQgPSBmdW5jdGlvbiBSZXNvbHZlRm9udChjc3NfZm9udF9mYW1pbHlfc3RyaW5nKSB7XG4gICAgICB2YXIgbmFtZSwgcGFydCwgcGFydHM7XG4gICAgICBuYW1lID0gdm9pZCAwO1xuICAgICAgcGFydHMgPSBjc3NfZm9udF9mYW1pbHlfc3RyaW5nLnNwbGl0KFwiLFwiKTtcbiAgICAgIHBhcnQgPSBwYXJ0cy5zaGlmdCgpO1xuXG4gICAgICB3aGlsZSAoIW5hbWUgJiYgcGFydCkge1xuICAgICAgICBuYW1lID0gRm9udE5hbWVEQltwYXJ0LnRyaW0oKS50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgcGFydCA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH07XG5cbiAgICBSZXNvbHZlVW5pdGVkTnVtYmVyID0gZnVuY3Rpb24gUmVzb2x2ZVVuaXRlZE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nKSB7XG4gICAgICAvL0lFOCBpc3N1ZXNcbiAgICAgIGNzc19saW5lX2hlaWdodF9zdHJpbmcgPSBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID09PSBcImF1dG9cIiA/IFwiMHB4XCIgOiBjc3NfbGluZV9oZWlnaHRfc3RyaW5nO1xuXG4gICAgICBpZiAoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5pbmRleE9mKFwiZW1cIikgPiAtMSAmJiAhaXNOYU4oTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcImVtXCIsIFwiXCIpKSkpIHtcbiAgICAgICAgY3NzX2xpbmVfaGVpZ2h0X3N0cmluZyA9IE51bWJlcihjc3NfbGluZV9oZWlnaHRfc3RyaW5nLnJlcGxhY2UoXCJlbVwiLCBcIlwiKSkgKiAxOC43MTkgKyBcInB4XCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjc3NfbGluZV9oZWlnaHRfc3RyaW5nLmluZGV4T2YoXCJwdFwiKSA+IC0xICYmICFpc05hTihOdW1iZXIoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZy5yZXBsYWNlKFwicHRcIiwgXCJcIikpKSkge1xuICAgICAgICBjc3NfbGluZV9oZWlnaHRfc3RyaW5nID0gTnVtYmVyKGNzc19saW5lX2hlaWdodF9zdHJpbmcucmVwbGFjZShcInB0XCIsIFwiXCIpKSAqIDEuMzMzICsgXCJweFwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsLCB1bmRlZiwgdmFsdWU7XG4gICAgICB1bmRlZiA9IHZvaWQgMDtcbiAgICAgIG5vcm1hbCA9IDE2LjAwO1xuICAgICAgdmFsdWUgPSBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ107XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0ge1xuICAgICAgICBcInh4LXNtYWxsXCI6IDksXG4gICAgICAgIFwieC1zbWFsbFwiOiAxMSxcbiAgICAgICAgc21hbGw6IDEzLFxuICAgICAgICBtZWRpdW06IDE2LFxuICAgICAgICBsYXJnZTogMTksXG4gICAgICAgIFwieC1sYXJnZVwiOiAyMyxcbiAgICAgICAgXCJ4eC1sYXJnZVwiOiAyOCxcbiAgICAgICAgYXV0bzogMFxuICAgICAgfVtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXTtcblxuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZikge1xuICAgICAgICByZXR1cm4gVW5pdGVkTnVtYmVyTWFwW2Nzc19saW5lX2hlaWdodF9zdHJpbmddID0gdmFsdWUgLyBub3JtYWw7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSA9IHBhcnNlRmxvYXQoY3NzX2xpbmVfaGVpZ2h0X3N0cmluZykpIHtcbiAgICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IHZhbHVlIC8gbm9ybWFsO1xuICAgICAgfVxuXG4gICAgICB2YWx1ZSA9IGNzc19saW5lX2hlaWdodF9zdHJpbmcubWF0Y2goLyhbXFxkXFwuXSspKHB4KS8pO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBVbml0ZWROdW1iZXJNYXBbY3NzX2xpbmVfaGVpZ2h0X3N0cmluZ10gPSBwYXJzZUZsb2F0KHZhbHVlWzFdKSAvIG5vcm1hbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFVuaXRlZE51bWJlck1hcFtjc3NfbGluZV9oZWlnaHRfc3RyaW5nXSA9IDE7XG4gICAgfTtcblxuICAgIEdldENTUyA9IGZ1bmN0aW9uIEdldENTUyhlbGVtZW50KSB7XG4gICAgICB2YXIgY3NzLCB0bXAsIGNvbXB1dGVkQ1NTRWxlbWVudDtcblxuICAgICAgY29tcHV0ZWRDU1NFbGVtZW50ID0gZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgIHZhciBjb21wQ1NTO1xuXG4gICAgICAgIGNvbXBDU1MgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICBpZiAoZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZWwuY3VycmVudFN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZWwuY3VycmVudFN0eWxlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZWwuc3R5bGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KGVsKTtcblxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICBwcm9wID0gcHJvcC5yZXBsYWNlKC8tXFxEL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmNoYXJBdCgxKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBjb21wQ1NTW3Byb3BdO1xuICAgICAgICB9O1xuICAgICAgfShlbGVtZW50KTtcblxuICAgICAgY3NzID0ge307XG4gICAgICB0bXAgPSB2b2lkIDA7XG4gICAgICBjc3NbXCJmb250LWZhbWlseVwiXSA9IFJlc29sdmVGb250KGNvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtZmFtaWx5XCIpKSB8fCBcInRpbWVzXCI7XG4gICAgICBjc3NbXCJmb250LXN0eWxlXCJdID0gRm9udFN0eWxlTWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcImZvbnQtc3R5bGVcIildIHx8IFwibm9ybWFsXCI7XG4gICAgICBjc3NbXCJ0ZXh0LWFsaWduXCJdID0gVGV4dEFsaWduTWFwW2NvbXB1dGVkQ1NTRWxlbWVudChcInRleHQtYWxpZ25cIildIHx8IFwibGVmdFwiO1xuICAgICAgdG1wID0gRm9udFdlaWdodE1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJmb250LXdlaWdodFwiKV0gfHwgXCJub3JtYWxcIjtcblxuICAgICAgaWYgKHRtcCA9PT0gXCJib2xkXCIpIHtcbiAgICAgICAgaWYgKGNzc1tcImZvbnQtc3R5bGVcIl0gPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICBjc3NbXCJmb250LXN0eWxlXCJdID0gdG1wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNzc1tcImZvbnQtc3R5bGVcIl0gPSB0bXAgKyBjc3NbXCJmb250LXN0eWxlXCJdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNzc1tcImZvbnQtc2l6ZVwiXSA9IFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwiZm9udC1zaXplXCIpKSB8fCAxO1xuICAgICAgY3NzW1wibGluZS1oZWlnaHRcIl0gPSBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcImxpbmUtaGVpZ2h0XCIpKSB8fCAxO1xuICAgICAgY3NzW1wiZGlzcGxheVwiXSA9IGNvbXB1dGVkQ1NTRWxlbWVudChcImRpc3BsYXlcIikgPT09IFwiaW5saW5lXCIgPyBcImlubGluZVwiIDogXCJibG9ja1wiO1xuICAgICAgdG1wID0gY3NzW1wiZGlzcGxheVwiXSA9PT0gXCJibG9ja1wiO1xuICAgICAgY3NzW1wibWFyZ2luLXRvcFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi10b3BcIikpIHx8IDA7XG4gICAgICBjc3NbXCJtYXJnaW4tYm90dG9tXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwibWFyZ2luLWJvdHRvbVwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZGRpbmctdG9wXCJdID0gdG1wICYmIFJlc29sdmVVbml0ZWROdW1iZXIoY29tcHV0ZWRDU1NFbGVtZW50KFwicGFkZGluZy10b3BcIikpIHx8IDA7XG4gICAgICBjc3NbXCJwYWRkaW5nLWJvdHRvbVwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctYm90dG9tXCIpKSB8fCAwO1xuICAgICAgY3NzW1wibWFyZ2luLWxlZnRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJtYXJnaW4tbGVmdFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcIm1hcmdpbi1yaWdodFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcIm1hcmdpbi1yaWdodFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZGRpbmctbGVmdFwiXSA9IHRtcCAmJiBSZXNvbHZlVW5pdGVkTnVtYmVyKGNvbXB1dGVkQ1NTRWxlbWVudChcInBhZGRpbmctbGVmdFwiKSkgfHwgMDtcbiAgICAgIGNzc1tcInBhZGRpbmctcmlnaHRcIl0gPSB0bXAgJiYgUmVzb2x2ZVVuaXRlZE51bWJlcihjb21wdXRlZENTU0VsZW1lbnQoXCJwYWRkaW5nLXJpZ2h0XCIpKSB8fCAwO1xuICAgICAgY3NzW1wicGFnZS1icmVhay1iZWZvcmVcIl0gPSBjb21wdXRlZENTU0VsZW1lbnQoXCJwYWdlLWJyZWFrLWJlZm9yZVwiKSB8fCBcImF1dG9cIjsgLy9mbG9hdCBhbmQgY2xlYXJpbmcgb2YgZmxvYXRzXG5cbiAgICAgIGNzc1tcImZsb2F0XCJdID0gRmxvYXRNYXBbY29tcHV0ZWRDU1NFbGVtZW50KFwiY3NzRmxvYXRcIildIHx8IFwibm9uZVwiO1xuICAgICAgY3NzW1wiY2xlYXJcIl0gPSBDbGVhck1hcFtjb21wdXRlZENTU0VsZW1lbnQoXCJjbGVhclwiKV0gfHwgXCJub25lXCI7XG4gICAgICBjc3NbXCJjb2xvclwiXSA9IGNvbXB1dGVkQ1NTRWxlbWVudChcImNvbG9yXCIpO1xuICAgICAgcmV0dXJuIGNzcztcbiAgICB9O1xuXG4gICAgZWxlbWVudEhhbmRsZWRFbHNld2hlcmUgPSBmdW5jdGlvbiBlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShlbGVtZW50LCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKSB7XG4gICAgICB2YXIgaGFuZGxlcnMsIGksIGlzSGFuZGxlZEVsc2V3aGVyZSwgbCwgY2xhc3NOYW1lcztcbiAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGZhbHNlO1xuICAgICAgaSA9IHZvaWQgMDtcbiAgICAgIGwgPSB2b2lkIDA7XG4gICAgICBoYW5kbGVycyA9IGVsZW1lbnRIYW5kbGVyc1tcIiNcIiArIGVsZW1lbnQuaWRdO1xuXG4gICAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgaXNIYW5kbGVkRWxzZXdoZXJlID0gaGFuZGxlcnMoZWxlbWVudCwgcmVuZGVyZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgIGwgPSBoYW5kbGVycy5sZW5ndGg7XG5cbiAgICAgICAgICB3aGlsZSAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBpICE9PSBsKSB7XG4gICAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVyc1tpXShlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZXJzID0gZWxlbWVudEhhbmRsZXJzW2VsZW1lbnQubm9kZU5hbWVdO1xuXG4gICAgICBpZiAoIWlzSGFuZGxlZEVsc2V3aGVyZSAmJiBoYW5kbGVycykge1xuICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXJzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVycyhlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgbCA9IGhhbmRsZXJzLmxlbmd0aDtcblxuICAgICAgICAgIHdoaWxlICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGkgIT09IGwpIHtcbiAgICAgICAgICAgIGlzSGFuZGxlZEVsc2V3aGVyZSA9IGhhbmRsZXJzW2ldKGVsZW1lbnQsIHJlbmRlcmVyKTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy8gVHJ5IGNsYXNzIG5hbWVzXG5cblxuICAgICAgY2xhc3NOYW1lcyA9IHR5cGVvZiBlbGVtZW50LmNsYXNzTmFtZSA9PT0gJ3N0cmluZycgPyBlbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpIDogW107XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGhhbmRsZXJzID0gZWxlbWVudEhhbmRsZXJzWycuJyArIGNsYXNzTmFtZXNbaV1dO1xuXG4gICAgICAgIGlmICghaXNIYW5kbGVkRWxzZXdoZXJlICYmIGhhbmRsZXJzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVycyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVycyhlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgbCA9IGhhbmRsZXJzLmxlbmd0aDtcblxuICAgICAgICAgICAgd2hpbGUgKCFpc0hhbmRsZWRFbHNld2hlcmUgJiYgaSAhPT0gbCkge1xuICAgICAgICAgICAgICBpc0hhbmRsZWRFbHNld2hlcmUgPSBoYW5kbGVyc1tpXShlbGVtZW50LCByZW5kZXJlcik7XG4gICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzSGFuZGxlZEVsc2V3aGVyZTtcbiAgICB9O1xuXG4gICAgdGFibGVUb0pzb24gPSBmdW5jdGlvbiB0YWJsZVRvSnNvbih0YWJsZSwgcmVuZGVyZXIpIHtcbiAgICAgIHZhciBkYXRhLCBoZWFkZXJzLCBpLCBqLCByb3dEYXRhLCB0YWJsZVJvdywgdGFibGVfb2JqLCB0YWJsZV93aXRoLCBjZWxsLCBsO1xuICAgICAgZGF0YSA9IFtdO1xuICAgICAgaGVhZGVycyA9IFtdO1xuICAgICAgaSA9IDA7XG4gICAgICBsID0gdGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7XG4gICAgICB0YWJsZV93aXRoID0gdGFibGUuY2xpZW50V2lkdGg7XG5cbiAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBjZWxsID0gdGFibGUucm93c1swXS5jZWxsc1tpXTtcbiAgICAgICAgaGVhZGVyc1tpXSA9IHtcbiAgICAgICAgICBuYW1lOiBjZWxsLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJyksXG4gICAgICAgICAgcHJvbXB0OiBjZWxsLnRleHRDb250ZW50LnJlcGxhY2UoL1xccj9cXG4vZywgJycpLFxuICAgICAgICAgIHdpZHRoOiBjZWxsLmNsaWVudFdpZHRoIC8gdGFibGVfd2l0aCAqIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRXaWR0aCgpXG4gICAgICAgIH07XG4gICAgICAgIGkrKztcbiAgICAgIH1cblxuICAgICAgaSA9IDE7XG5cbiAgICAgIHdoaWxlIChpIDwgdGFibGUucm93cy5sZW5ndGgpIHtcbiAgICAgICAgdGFibGVSb3cgPSB0YWJsZS5yb3dzW2ldO1xuICAgICAgICByb3dEYXRhID0ge307XG4gICAgICAgIGogPSAwO1xuXG4gICAgICAgIHdoaWxlIChqIDwgdGFibGVSb3cuY2VsbHMubGVuZ3RoKSB7XG4gICAgICAgICAgcm93RGF0YVtoZWFkZXJzW2pdLm5hbWVdID0gdGFibGVSb3cuY2VsbHNbal0udGV4dENvbnRlbnQucmVwbGFjZSgvXFxyP1xcbi9nLCAnJyk7XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YS5wdXNoKHJvd0RhdGEpO1xuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZV9vYmogPSB7XG4gICAgICAgIHJvd3M6IGRhdGEsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnNcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhciBTa2lwTm9kZSA9IHtcbiAgICAgIFNDUklQVDogMSxcbiAgICAgIFNUWUxFOiAxLFxuICAgICAgTk9TQ1JJUFQ6IDEsXG4gICAgICBPQkpFQ1Q6IDEsXG4gICAgICBFTUJFRDogMSxcbiAgICAgIFNFTEVDVDogMVxuICAgIH07XG4gICAgdmFyIGxpc3RDb3VudCA9IDE7XG5cbiAgICBfRHJpbGxGb3JDb250ZW50ID0gZnVuY3Rpb24gRHJpbGxGb3JDb250ZW50KGVsZW1lbnQsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBjbiwgY25zLCBmcmFnbWVudENTUywgaSwgaXNCbG9jaywgbCwgdGFibGUyanNvbiwgY2I7XG4gICAgICBjbnMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICBjbiA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50Q1NTID0gR2V0Q1NTKGVsZW1lbnQpO1xuICAgICAgaXNCbG9jayA9IGZyYWdtZW50Q1NTLmRpc3BsYXkgPT09IFwiYmxvY2tcIjtcblxuICAgICAgaWYgKGlzQmxvY2spIHtcbiAgICAgICAgcmVuZGVyZXIuc2V0QmxvY2tCb3VuZGFyeSgpO1xuICAgICAgICByZW5kZXJlci5zZXRCbG9ja1N0eWxlKGZyYWdtZW50Q1NTKTtcbiAgICAgIH1cbiAgICAgIGkgPSAwO1xuICAgICAgbCA9IGNucy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlIChpIDwgbCkge1xuICAgICAgICBjbiA9IGNuc1tpXTtcblxuICAgICAgICBpZiAodHlwZW9mKGNuKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIC8vZXhlY3V0ZSBhbGwgd2F0Y2hlciBmdW5jdGlvbnMgdG8gZS5nLiByZXNldCBmbG9hdGluZ1xuICAgICAgICAgIHJlbmRlcmVyLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhjbik7XG4gICAgICAgICAgLyoqKiBIRUFERVIgcmVuZGVyaW5nICoqL1xuXG4gICAgICAgICAgaWYgKGNuLm5vZGVUeXBlID09PSAxICYmIGNuLm5vZGVOYW1lID09PSAnSEVBREVSJykge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IGNuOyAvL3N0b3JlIG9sZCB0b3AgbWFyZ2luXG5cbiAgICAgICAgICAgIHZhciBvbGRNYXJnaW5Ub3AgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wOyAvL3N1YnNjcmliZSBmb3IgbmV3IHBhZ2UgZXZlbnQgYW5kIHJlbmRlciBoZWFkZXIgZmlyc3Qgb24gZXZlcnkgcGFnZVxuXG4gICAgICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYWRkUGFnZScsIGZ1bmN0aW9uIChwYWdlSW5mbykge1xuICAgICAgICAgICAgICAvL3NldCBjdXJyZW50IHkgcG9zaXRpb24gdG8gb2xkIG1hcmdpblxuICAgICAgICAgICAgICByZW5kZXJlci55ID0gb2xkTWFyZ2luVG9wOyAvL3JlbmRlciBhbGwgY2hpbGQgbm9kZXMgb2YgdGhlIGhlYWRlciBlbGVtZW50XG5cbiAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChoZWFkZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpOyAvL3NldCBtYXJnaW4gdG8gb2xkIG1hcmdpbiArIHJlbmRlcmVkIGhlYWRlciArIDEwIHNwYWNlIHRvIHByZXZlbnQgb3ZlcmxhcHBpbmdcbiAgICAgICAgICAgICAgLy9pbXBvcnRhbnQgZm9yIG90aGVyIHBsdWdpbnMgKGUuZy4gdGFibGUpIHRvIHN0YXJ0IHJlbmRlcmluZyBhdCBjb3JyZWN0IHBvc2l0aW9uIGFmdGVyIGhlYWRlclxuXG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLnRvcCA9IHJlbmRlcmVyLnkgKyAxMDtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY24ubm9kZVR5cGUgPT09IDggJiYgY24ubm9kZU5hbWUgPT09IFwiI2NvbW1lbnRcIikge1xuICAgICAgICAgICAgaWYgKH5jbi50ZXh0Q29udGVudC5pbmRleE9mKFwiQUREX1BBR0VcIikpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZFBhZ2UoKTtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3A7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlVHlwZSA9PT0gMSAmJiAhU2tpcE5vZGVbY24ubm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAvKioqIElNQUdFIFJFTkRFUklORyAqKiovXG4gICAgICAgICAgICB2YXIgY2FjaGVkX2ltYWdlO1xuXG4gICAgICAgICAgICBpZiAoY24ubm9kZU5hbWUgPT09IFwiSU1HXCIpIHtcbiAgICAgICAgICAgICAgdmFyIHVybCA9IGNuLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgICAgY2FjaGVkX2ltYWdlID0gaW1hZ2VzWyhyZW5kZXJlci5wZGYuc0hhc2hDb2RlICYmIHJlbmRlcmVyLnBkZi5zSGFzaENvZGUodXJsKSkgfHwgdXJsXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNhY2hlZF9pbWFnZSkge1xuICAgICAgICAgICAgICBpZiAocmVuZGVyZXIucGRmLmludGVybmFsLnBhZ2VTaXplLmdldEhlaWdodCgpIC0gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSA8IHJlbmRlcmVyLnkgKyBjbi5oZWlnaHQgJiYgcmVuZGVyZXIueSA+IHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy50b3ApIHtcbiAgICAgICAgICAgICAgICByZW5kZXJlci5wZGYuYWRkUGFnZSgpO1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnkgPSByZW5kZXJlci5wZGYubWFyZ2luc19kb2MudG9wOyAvL2NoZWNrIGlmIHdlIGhhdmUgdG8gc2V0IGJhY2sgc29tZSB2YWx1ZXMgZHVlIHRvIGUuZy4gaGVhZGVyIHJlbmRlcmluZyBmb3IgbmV3IHBhZ2VcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLmV4ZWN1dGVXYXRjaEZ1bmN0aW9ucyhjbik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB2YXIgaW1hZ2VzQ1NTID0gR2V0Q1NTKGNuKTtcbiAgICAgICAgICAgICAgdmFyIGltYWdlWCA9IHJlbmRlcmVyLng7XG4gICAgICAgICAgICAgIHZhciBmb250VG9Vbml0UmF0aW8gPSAxMiAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjsgLy9kZWZpbmUgYWRkaXRpb25hbCBwYWRkaW5ncywgbWFyZ2lucyB3aGljaCBoYXZlIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCBmb3IgbWFyZ2luIGNhbGN1bGF0aW9uc1xuXG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VMZWZ0ID0gKGltYWdlc0NTU1tcIm1hcmdpbi1sZWZ0XCJdICsgaW1hZ2VzQ1NTW1wicGFkZGluZy1sZWZ0XCJdKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxTcGFjZVJpZ2h0ID0gKGltYWdlc0NTU1tcIm1hcmdpbi1yaWdodFwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctcmlnaHRcIl0pICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbFNwYWNlVG9wID0gKGltYWdlc0NTU1tcIm1hcmdpbi10b3BcIl0gKyBpbWFnZXNDU1NbXCJwYWRkaW5nLXRvcFwiXSkgKiBmb250VG9Vbml0UmF0aW87XG4gICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsU3BhY2VCb3R0b20gPSAoaW1hZ2VzQ1NTW1wibWFyZ2luLWJvdHRvbVwiXSArIGltYWdlc0NTU1tcInBhZGRpbmctYm90dG9tXCJdKSAqIGZvbnRUb1VuaXRSYXRpbzsgLy9pZiBmbG9hdCBpcyBzZXQgdG8gcmlnaHQsIG1vdmUgdGhlIGltYWdlIHRvIHRoZSByaWdodCBib3JkZXJcbiAgICAgICAgICAgICAgLy9hZGQgc3BhY2UgaWYgbWFyZ2luIGlzIHNldFxuXG4gICAgICAgICAgICAgIGlmIChpbWFnZXNDU1NbJ2Zsb2F0J10gIT09IHVuZGVmaW5lZCAmJiBpbWFnZXNDU1NbJ2Zsb2F0J10gPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgICAgICBpbWFnZVggKz0gcmVuZGVyZXIuc2V0dGluZ3Mud2lkdGggLSBjbi53aWR0aCAtIGFkZGl0aW9uYWxTcGFjZVJpZ2h0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGltYWdlWCArPSBhZGRpdGlvbmFsU3BhY2VMZWZ0O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLmFkZEltYWdlKGNhY2hlZF9pbWFnZSwgaW1hZ2VYLCByZW5kZXJlci55ICsgYWRkaXRpb25hbFNwYWNlVG9wLCBjbi53aWR0aCwgY24uaGVpZ2h0KTtcbiAgICAgICAgICAgICAgY2FjaGVkX2ltYWdlID0gdW5kZWZpbmVkOyAvL2lmIHRoZSBmbG9hdCBwcm9wIGlzIHNwZWNpZmllZCB3ZSBoYXZlIHRvIGZsb2F0IHRoZSB0ZXh0IGFyb3VuZCB0aGUgaW1hZ2VcblxuICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddID09PSAncmlnaHQnIHx8IGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgLy9hZGQgZnVuY3Rpb250IHRvIHNldCBiYWNrIGNvb3JkaW5hdGVzIGFmdGVyIGltYWdlIHJlbmRlcmluZ1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLndhdGNoRnVuY3Rpb25zLnB1c2goZnVuY3Rpb24gKGRpZmZYLCB0aHJlc2hvbGRZLCBkaWZmV2lkdGgsIGVsKSB7XG4gICAgICAgICAgICAgICAgICAvL3VuZG8gZHJhd2luZyBib3ggYWRhcHRpb25zIHdoaWNoIHdlcmUgc2V0IGJ5IGZsb2F0aW5nXG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIueSA+PSB0aHJlc2hvbGRZKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gZGlmZlg7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoICs9IGRpZmZXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsICYmIGVsLm5vZGVUeXBlID09PSAxICYmICFTa2lwTm9kZVtlbC5ub2RlTmFtZV0gJiYgcmVuZGVyZXIueCArIGVsLndpZHRoID4gcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmxlZnQgKyByZW5kZXJlci5wZGYubWFyZ2luc19kb2Mud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSBkaWZmWDtcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIueSA9IHRocmVzaG9sZFk7XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldHRpbmdzLndpZHRoICs9IGRpZmZXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMsIGltYWdlc0NTU1snZmxvYXQnXSA9PT0gJ2xlZnQnID8gLWNuLndpZHRoIC0gYWRkaXRpb25hbFNwYWNlTGVmdCAtIGFkZGl0aW9uYWxTcGFjZVJpZ2h0IDogMCwgcmVuZGVyZXIueSArIGNuLmhlaWdodCArIGFkZGl0aW9uYWxTcGFjZVRvcCArIGFkZGl0aW9uYWxTcGFjZUJvdHRvbSwgY24ud2lkdGgpKTsgLy9yZXNldCBmbG9hdGluZyBieSBjbGVhcjpib3RoIGRpdnNcbiAgICAgICAgICAgICAgICAvL2p1c3Qgc2V0IGN1cnNvclkgYWZ0ZXIgdGhlIGZsb2F0aW5nIGVsZW1lbnRcblxuICAgICAgICAgICAgICAgIHJlbmRlcmVyLndhdGNoRnVuY3Rpb25zLnB1c2goZnVuY3Rpb24gKHlQb3NpdGlvbkFmdGVyRmxvYXRpbmcsIHBhZ2VzLCBlbCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnkgPCB5UG9zaXRpb25BZnRlckZsb2F0aW5nICYmIHBhZ2VzID09PSByZW5kZXJlci5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5ub2RlVHlwZSA9PT0gMSAmJiBHZXRDU1MoZWwpLmNsZWFyID09PSAnYm90aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlci55ID0geVBvc2l0aW9uQWZ0ZXJGbG9hdGluZztcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzLCByZW5kZXJlci55ICsgY24uaGVpZ2h0LCByZW5kZXJlci5wZGYuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpKSk7IC8vaWYgZmxvYXRpbmcgaXMgc2V0IHdlIGRlY3JlYXNlIHRoZSBhdmFpbGFibGUgd2lkdGggYnkgdGhlIGltYWdlIHdpZHRoXG5cbiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXR0aW5ncy53aWR0aCAtPSBjbi53aWR0aCArIGFkZGl0aW9uYWxTcGFjZUxlZnQgKyBhZGRpdGlvbmFsU3BhY2VSaWdodDsgLy9pZiBsZWZ0IGp1c3QgYWRkIHRoZSBpbWFnZSB3aWR0aCB0byB0aGUgWCBjb29yZGluYXRlXG5cbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VzQ1NTWydmbG9hdCddID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgICAgICAgIHJlbmRlcmVyLnggKz0gY24ud2lkdGggKyBhZGRpdGlvbmFsU3BhY2VMZWZ0ICsgYWRkaXRpb25hbFNwYWNlUmlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYgbm8gZmxvYXRpbmcgaXMgc2V0LCBtb3ZlIHRoZSByZW5kZXJpbmcgY3Vyc29yIGFmdGVyIHRoZSBpbWFnZSBoZWlnaHRcbiAgICAgICAgICAgICAgICByZW5kZXJlci55ICs9IGNuLmhlaWdodCArIGFkZGl0aW9uYWxTcGFjZVRvcCArIGFkZGl0aW9uYWxTcGFjZUJvdHRvbTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvKioqIFRBQkxFIFJFTkRFUklORyAqKiovXG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiVEFCTEVcIikge1xuICAgICAgICAgICAgICB0YWJsZTJqc29uID0gdGFibGVUb0pzb24oY24sIHJlbmRlcmVyKTtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAxMDtcbiAgICAgICAgICAgICAgcmVuZGVyZXIucGRmLnRhYmxlKHJlbmRlcmVyLngsIHJlbmRlcmVyLnksIHRhYmxlMmpzb24ucm93cywgdGFibGUyanNvbi5oZWFkZXJzLCB7XG4gICAgICAgICAgICAgICAgYXV0b1NpemU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHByaW50SGVhZGVyczogZWxlbWVudEhhbmRsZXJzLnByaW50SGVhZGVycyxcbiAgICAgICAgICAgICAgICBtYXJnaW5zOiByZW5kZXJlci5wZGYubWFyZ2luc19kb2MsXG4gICAgICAgICAgICAgICAgY3NzOiBHZXRDU1MoY24pXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZW5kZXJlci55ID0gcmVuZGVyZXIucGRmLmludGVybmFsLl9fY2VsbF9fLmxhc3RDZWxsLnkgK1xuICAgICAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5fX2NlbGxfXy5sYXN0Q2VsbC5oZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNuLm5vZGVOYW1lID09PSBcIk9MXCIgfHwgY24ubm9kZU5hbWUgPT09IFwiVUxcIikge1xuICAgICAgICAgICAgICBsaXN0Q291bnQgPSAxO1xuXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpKSB7XG4gICAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IDEwO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjbi5ub2RlTmFtZSA9PT0gXCJMSVwiKSB7XG4gICAgICAgICAgICAgIHZhciB0ZW1wID0gcmVuZGVyZXIueDtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueCArPSAyMCAvIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgICAgcmVuZGVyZXIueSArPSAzO1xuXG4gICAgICAgICAgICAgIGlmICghZWxlbWVudEhhbmRsZWRFbHNld2hlcmUoY24sIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpKSB7XG4gICAgICAgICAgICAgICAgX0RyaWxsRm9yQ29udGVudChjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZW5kZXJlci54ID0gdGVtcDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZU5hbWUgPT09IFwiQlJcIikge1xuICAgICAgICAgICAgICByZW5kZXJlci55ICs9IGZyYWdtZW50Q1NTW1wiZm9udC1zaXplXCJdICogcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuICAgICAgICAgICAgICByZW5kZXJlci5hZGRUZXh0KFwiXFx1MjAyOFwiLCBjbG9uZShmcmFnbWVudENTUykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKCFlbGVtZW50SGFuZGxlZEVsc2V3aGVyZShjbiwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykpIHtcbiAgICAgICAgICAgICAgICBfRHJpbGxGb3JDb250ZW50KGNuLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoY24ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNuLm5vZGVWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGNuLm5vZGVWYWx1ZSAmJiBjbi5wYXJlbnROb2RlLm5vZGVOYW1lID09PSBcIkxJXCIpIHtcbiAgICAgICAgICAgICAgaWYgKGNuLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSA9PT0gXCJPTFwiKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBsaXN0Q291bnQrKyArICcuICcgKyB2YWx1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZm9udFNpemUgPSBmcmFnbWVudENTU1tcImZvbnQtc2l6ZVwiXTtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0WCA9ICgzIC0gZm9udFNpemUgKiAwLjc1KSAqIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0WSA9IGZvbnRTaXplICogMC43NSAqIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgICAgICAgICAgICB2YXIgcmFkaXVzID0gZm9udFNpemUgKiAxLjc0IC8gcmVuZGVyZXIucGRmLmludGVybmFsLnNjYWxlRmFjdG9yO1xuXG4gICAgICAgICAgICAgICAgY2IgPSBmdW5jdGlvbiBjYih4LCB5KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnBkZi5jaXJjbGUoeCArIG9mZnNldFgsIHkgKyBvZmZzZXRZLCByYWRpdXMsICdGRCcpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gLy8gT25seSBhZGQgdGhlIHRleHQgaWYgdGhlIHRleHQgbm9kZSBpcyBpbiB0aGUgYm9keSBlbGVtZW50XG4gICAgICAgICAgICAvLyBBZGQgY29tcGF0aWJpbGl0eSB3aXRoIElFMTFcblxuXG4gICAgICAgICAgICBpZiAoISEoY24ub3duZXJEb2N1bWVudC5ib2R5LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGNuKSAmIDE2KSkge1xuICAgICAgICAgICAgICByZW5kZXJlci5hZGRUZXh0KHZhbHVlLCBmcmFnbWVudENTUyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY24gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLmFkZFRleHQoY24sIGZyYWdtZW50Q1NTKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpKys7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnRIYW5kbGVycy5vdXRZID0gcmVuZGVyZXIueTtcblxuICAgICAgaWYgKGlzQmxvY2spIHtcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnNldEJsb2NrQm91bmRhcnkoY2IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpbWFnZXMgPSB7fTtcblxuICAgIGxvYWRJbWdzID0gZnVuY3Rpb24gbG9hZEltZ3MoZWxlbWVudCwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycywgY2IpIHtcbiAgICAgIHZhciBpbWdzID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyksXG4gICAgICAgICAgbCA9IGltZ3MubGVuZ3RoLFxuICAgICAgICAgIGZvdW5kX2ltYWdlcyxcbiAgICAgICAgICB4ID0gMDtcblxuICAgICAgZnVuY3Rpb24gZG9uZSgpIHtcbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLmV2ZW50cy5wdWJsaXNoKCdpbWFnZXNMb2FkZWQnKTtcbiAgICAgICAgY2IoZm91bmRfaW1hZ2VzKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbG9hZEltYWdlKHVybCwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICBpZiAoIXVybCkgcmV0dXJuO1xuICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGZvdW5kX2ltYWdlcyA9ICsreDtcbiAgICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJyc7XG5cbiAgICAgICAgaW1nLm9uZXJyb3IgPSBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChpbWcuY29tcGxldGUpIHtcbiAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBkYXRhIHVybHMgaW4gaW1hZ2VzLCBzZXQgd2lkdGggYW5kIGhlaWdodFxuICAgICAgICAgICAgLy9hcyB0aG9zZSB2YWx1ZXMgYXJlIG5vdCByZWNvZ25pemVkIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgICAgIGlmIChpbWcuc3JjLmluZGV4T2YoJ2RhdGE6aW1hZ2UvJykgPT09IDApIHtcbiAgICAgICAgICAgICAgaW1nLndpZHRoID0gd2lkdGggfHwgaW1nLndpZHRoIHx8IDA7XG4gICAgICAgICAgICAgIGltZy5oZWlnaHQgPSBoZWlnaHQgfHwgaW1nLmhlaWdodCB8fCAwO1xuICAgICAgICAgICAgfSAvL2lmIHZhbGlkIGltYWdlIGFkZCB0byBrbm93biBpbWFnZXMgYXJyYXlcblxuXG4gICAgICAgICAgICBpZiAoaW1nLndpZHRoICsgaW1nLmhlaWdodCkge1xuICAgICAgICAgICAgICB2YXIgaGFzaCA9IChyZW5kZXJlci5wZGYuc0hhc2hDb2RlICYmIHJlbmRlcmVyLnBkZi5zSGFzaENvZGUodXJsKSkgfHwgdXJsO1xuICAgICAgICAgICAgICBpbWFnZXNbaGFzaF0gPSBpbWFnZXNbaGFzaF0gfHwgaW1nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghIC0teCkge1xuICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpbWcuc3JjID0gdXJsO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobC0tKSB7XG4gICAgICAgIGxvYWRJbWFnZShpbWdzW2xdLmdldEF0dHJpYnV0ZShcInNyY1wiKSwgaW1nc1tsXS53aWR0aCwgaW1nc1tsXS5oZWlnaHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geCB8fCBkb25lKCk7XG4gICAgfTtcblxuICAgIGNoZWNrRm9yRm9vdGVyID0gZnVuY3Rpb24gY2hlY2tGb3JGb290ZXIoZWxlbSwgcmVuZGVyZXIsIGVsZW1lbnRIYW5kbGVycykge1xuICAgICAgLy9jaGVjayBpZiB3ZSBjYW4gZm91bmQgYSA8Zm9vdGVyPiBlbGVtZW50XG4gICAgICB2YXIgZm9vdGVyID0gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcImZvb3RlclwiKTtcblxuICAgICAgaWYgKGZvb3Rlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvb3RlciA9IGZvb3RlclswXTsgLy9iYWQgaGFjayB0byBnZXQgaGVpZ2h0IG9mIGZvb3RlclxuICAgICAgICAvL2NyZWF0IGR1bW15IG91dCBhbmQgY2hlY2sgbmV3IHkgYWZ0ZXIgZmFrZSByZW5kZXJpbmdcblxuICAgICAgICB2YXIgb2xkT3V0ID0gcmVuZGVyZXIucGRmLmludGVybmFsLndyaXRlO1xuICAgICAgICB2YXIgb2xkWSA9IHJlbmRlcmVyLnk7XG5cbiAgICAgICAgcmVuZGVyZXIucGRmLmludGVybmFsLndyaXRlID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAgICAgX0RyaWxsRm9yQ29udGVudChmb290ZXIsIHJlbmRlcmVyLCBlbGVtZW50SGFuZGxlcnMpO1xuXG4gICAgICAgIHZhciBmb290ZXJIZWlnaHQgPSBNYXRoLmNlaWwocmVuZGVyZXIueSAtIG9sZFkpICsgNTtcbiAgICAgICAgcmVuZGVyZXIueSA9IG9sZFk7XG4gICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC53cml0ZSA9IG9sZE91dDsgLy9hZGQgMjAlIHRvIHByZXZlbnQgb3ZlcmxhcHBpbmdcblxuICAgICAgICByZW5kZXJlci5wZGYubWFyZ2luc19kb2MuYm90dG9tICs9IGZvb3RlckhlaWdodDsgLy9DcmVhdGUgZnVuY3Rpb24gcmVuZGVyIGhlYWRlciBvbiBldmVyeSBwYWdlXG5cbiAgICAgICAgdmFyIHJlbmRlckZvb3RlciA9IGZ1bmN0aW9uIHJlbmRlckZvb3RlcihwYWdlSW5mbykge1xuICAgICAgICAgIHZhciBwYWdlTnVtYmVyID0gcGFnZUluZm8gIT09IHVuZGVmaW5lZCA/IHBhZ2VJbmZvLnBhZ2VOdW1iZXIgOiAxOyAvL3NldCBjdXJyZW50IHkgcG9zaXRpb24gdG8gb2xkIG1hcmdpblxuXG4gICAgICAgICAgdmFyIG9sZFBvc2l0aW9uID0gcmVuZGVyZXIueTsgLy9yZW5kZXIgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBoZWFkZXIgZWxlbWVudFxuXG4gICAgICAgICAgcmVuZGVyZXIueSA9IHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5nZXRIZWlnaHQoKSAtIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b207XG4gICAgICAgICAgcmVuZGVyZXIucGRmLm1hcmdpbnNfZG9jLmJvdHRvbSAtPSBmb290ZXJIZWlnaHQ7IC8vY2hlY2sgaWYgd2UgaGF2ZSB0byBhZGQgcGFnZSBudW1iZXJzXG5cbiAgICAgICAgICB2YXIgc3BhbnMgPSBmb290ZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NwYW4nKTtcblxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIC8vaWYgd2UgZmluZCBzb21lIHNwYW4gZWxlbWVudCB3aXRoIGNsYXNzIHBhZ2VDb3VudGVyLCBzZXQgdGhlIHBhZ2VcbiAgICAgICAgICAgIGlmICgoXCIgXCIgKyBzcGFuc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZSgvW1xcblxcdF0vZywgXCIgXCIpLmluZGV4T2YoXCIgcGFnZUNvdW50ZXIgXCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgc3BhbnNbaV0uaW5uZXJIVE1MID0gcGFnZU51bWJlcjtcbiAgICAgICAgICAgIH0gLy9pZiB3ZSBmaW5kIHNvbWUgc3BhbiBlbGVtZW50IHdpdGggY2xhc3MgdG90YWxQYWdlcywgc2V0IGEgdmFyaWFibGUgd2hpY2ggaXMgcmVwbGFjZWQgYWZ0ZXIgcmVuZGVyaW5nIG9mIGFsbCBwYWdlc1xuXG5cbiAgICAgICAgICAgIGlmICgoXCIgXCIgKyBzcGFuc1tpXS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZSgvW1xcblxcdF0vZywgXCIgXCIpLmluZGV4T2YoXCIgdG90YWxQYWdlcyBcIikgPiAtMSkge1xuICAgICAgICAgICAgICBzcGFuc1tpXS5pbm5lckhUTUwgPSAnIyMjanNQREZWYXJUb3RhbFBhZ2VzIyMjJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vcmVuZGVyIGZvb3RlciBjb250ZW50XG5cblxuICAgICAgICAgIF9EcmlsbEZvckNvbnRlbnQoZm9vdGVyLCByZW5kZXJlciwgZWxlbWVudEhhbmRsZXJzKTsgLy9zZXQgYm90dG9tIG1hcmdpbiB0byBwcmV2aW91cyBoZWlnaHQgaW5jbHVkaW5nIHRoZSBmb290ZXIgaGVpZ2h0XG5cblxuICAgICAgICAgIHJlbmRlcmVyLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gKz0gZm9vdGVySGVpZ2h0OyAvL2ltcG9ydGFudCBmb3Igb3RoZXIgcGx1Z2lucyAoZS5nLiB0YWJsZSkgdG8gc3RhcnQgcmVuZGVyaW5nIGF0IGNvcnJlY3QgcG9zaXRpb24gYWZ0ZXIgaGVhZGVyXG5cbiAgICAgICAgICByZW5kZXJlci55ID0gb2xkUG9zaXRpb247XG4gICAgICAgIH07IC8vY2hlY2sgaWYgZm9vdGVyIGNvbnRhaW5zIHRvdGFsUGFnZXMgd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2UgYXQgdGhlIGRpc29wb3NhbCBvZiB0aGUgZG9jdW1lbnRcblxuXG4gICAgICAgIHZhciBzcGFucyA9IGZvb3Rlci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3BhbicpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAoKFwiIFwiICsgc3BhbnNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UoL1tcXG5cXHRdL2csIFwiIFwiKS5pbmRleE9mKFwiIHRvdGFsUGFnZXMgXCIpID4gLTEpIHtcbiAgICAgICAgICAgIHJlbmRlcmVyLnBkZi5pbnRlcm5hbC5ldmVudHMuc3Vic2NyaWJlKCdodG1sUmVuZGVyaW5nRmluaXNoZWQnLCByZW5kZXJlci5wZGYucHV0VG90YWxQYWdlcy5iaW5kKHJlbmRlcmVyLnBkZiwgJyMjI2pzUERGVmFyVG90YWxQYWdlcyMjIycpLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy9yZWdpc3RlciBldmVudCB0byByZW5kZXIgZm9vdGVyIG9uIGV2ZXJ5IG5ldyBwYWdlXG5cblxuICAgICAgICByZW5kZXJlci5wZGYuaW50ZXJuYWwuZXZlbnRzLnN1YnNjcmliZSgnYWRkUGFnZScsIHJlbmRlckZvb3RlciwgZmFsc2UpOyAvL3JlbmRlciBmb290ZXIgb24gZmlyc3QgcGFnZVxuXG4gICAgICAgIHJlbmRlckZvb3RlcigpOyAvL3ByZXZlbnQgZm9vdGVyIHJlbmRlcmluZ1xuXG4gICAgICAgIFNraXBOb2RlWydGT09URVInXSA9IDE7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByb2Nlc3MgPSBmdW5jdGlvbiBwcm9jZXNzKHBkZiwgZWxlbWVudCwgeCwgeSwgc2V0dGluZ3MsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudCAhPT0gXCJzdHJpbmdcIiAmJiAhZWxlbWVudC5wYXJlbnROb2RlKSBlbGVtZW50ID0gJycgKyBlbGVtZW50LmlubmVySFRNTDtcblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIHZhciAkZnJhbWUsICRoaWRkZW5kaXYsIGZyYW1lbmFtZSwgdmlzdWFsbHloaWRkZW47XG4gICAgICAgICAgZnJhbWVuYW1lID0gXCJqc1BERmh0bWxUZXh0XCIgKyBEYXRlLm5vdygpLnRvU3RyaW5nKCkgKyAoTWF0aC5yYW5kb20oKSAqIDEwMDApLnRvRml4ZWQoMCk7XG4gICAgICAgICAgdmlzdWFsbHloaWRkZW4gPSBcInBvc2l0aW9uOiBhYnNvbHV0ZSAhaW1wb3J0YW50O1wiICsgXCJjbGlwOiByZWN0KDFweCAxcHggMXB4IDFweCk7IC8qIElFNiwgSUU3ICovXCIgKyBcImNsaXA6IHJlY3QoMXB4LCAxcHgsIDFweCwgMXB4KTtcIiArIFwicGFkZGluZzowICFpbXBvcnRhbnQ7XCIgKyBcImJvcmRlcjowICFpbXBvcnRhbnQ7XCIgKyBcImhlaWdodDogMXB4ICFpbXBvcnRhbnQ7XCIgKyBcIndpZHRoOiAxcHggIWltcG9ydGFudDsgXCIgKyBcInRvcDphdXRvO1wiICsgXCJsZWZ0Oi0xMDBweDtcIiArIFwib3ZlcmZsb3c6IGhpZGRlbjtcIjtcbiAgICAgICAgICAkaGlkZGVuZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgJGhpZGRlbmRpdi5zdHlsZS5jc3NUZXh0ID0gdmlzdWFsbHloaWRkZW47XG4gICAgICAgICAgJGhpZGRlbmRpdi5pbm5lckhUTUwgPSBcIjxpZnJhbWUgc3R5bGU9XFxcImhlaWdodDoxcHg7d2lkdGg6MXB4XFxcIiBuYW1lPVxcXCJcIiArIGZyYW1lbmFtZSArIFwiXFxcIiAvPlwiO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoJGhpZGRlbmRpdik7XG4gICAgICAgICAgJGZyYW1lID0gd2luZG93LmZyYW1lc1tmcmFtZW5hbWVdO1xuICAgICAgICAgICRmcmFtZS5kb2N1bWVudC5vcGVuKCk7XG4gICAgICAgICAgJGZyYW1lLmRvY3VtZW50LndyaXRlbG4oZWxlbWVudCk7XG4gICAgICAgICAgJGZyYW1lLmRvY3VtZW50LmNsb3NlKCk7XG4gICAgICAgICAgcmV0dXJuICRmcmFtZS5kb2N1bWVudC5ib2R5O1xuICAgICAgICB9KGVsZW1lbnQucmVwbGFjZSgvPFxcLz9zY3JpcHRbXj5dKj8+L2dpLCAnJykpO1xuICAgICAgfVxuXG4gICAgICB2YXIgYXZhaWxhYmxlRm9udHMgPSBPYmplY3Qua2V5cyhwZGYuZ2V0Rm9udExpc3QoKSk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGZvbnROYW1lID0gYXZhaWxhYmxlRm9udHNbaV07XG4gICAgICAgIHZhciBmb250RmFtaWx5ID0gZm9udE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYoIUZvbnROYW1lREJbZm9udEZhbWlseV0pIHtcbiAgICAgICAgICBGb250TmFtZURCW2ZvbnRGYW1pbHldID0gZm9udE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHIgPSBuZXcgUmVuZGVyZXIocGRmLCB4LCB5LCBzZXR0aW5ncyksXG4gICAgICAgICAgb3V0OyAvLyAxLiBsb2FkIGltYWdlc1xuICAgICAgLy8gMi4gcHJlcGFyZSBvcHRpb25hbCBmb290ZXIgZWxlbWVudHNcbiAgICAgIC8vIDMuIHJlbmRlciBjb250ZW50XG5cbiAgICAgIGxvYWRJbWdzLmNhbGwodGhpcywgZWxlbWVudCwgciwgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzLCBmdW5jdGlvbiAoZm91bmRfaW1hZ2VzKSB7XG4gICAgICAgIGNoZWNrRm9yRm9vdGVyKGVsZW1lbnQsIHIsIHNldHRpbmdzLmVsZW1lbnRIYW5kbGVycyk7XG5cbiAgICAgICAgX0RyaWxsRm9yQ29udGVudChlbGVtZW50LCByLCBzZXR0aW5ncy5lbGVtZW50SGFuZGxlcnMpOyAvL3NlbmQgZXZlbnQgZGlzcG9zZSBmb3IgZmluYWwgdGFrcyAoZS5nLiBmb290ZXIgdG90YWxwYWdlIHJlcGxhY2VtZW50KVxuXG5cbiAgICAgICAgci5wZGYuaW50ZXJuYWwuZXZlbnRzLnB1Ymxpc2goJ2h0bWxSZW5kZXJpbmdGaW5pc2hlZCcpO1xuICAgICAgICBvdXQgPSByLmRpc3Bvc2UoKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2sob3V0KTtlbHNlIGlmIChmb3VuZF9pbWFnZXMpIGNvbnNvbGUuZXJyb3IoJ2pzUERGIFdhcm5pbmc6IHJlbmRlcmluZyBpc3N1ZXM/IHByb3ZpZGUgYSBjYWxsYmFjayB0byBmcm9tSFRNTCEnKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG91dCB8fCB7XG4gICAgICAgIHg6IHIueCxcbiAgICAgICAgeTogci55XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMucGFyYWdyYXBoID0ge1xuICAgICAgICB0ZXh0OiBbXSxcbiAgICAgICAgc3R5bGU6IFtdXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwicVwiKTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcIlFcIik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiB0aGlzLngsXG4gICAgICAgIHk6IHRoaXMueSxcbiAgICAgICAgcmVhZHk6IHRydWVcbiAgICAgIH07XG4gICAgfTsgLy9DaGVja3MgaWYgd2UgaGF2ZSB0byBleGVjdXRlIHNvbWUgd2F0Y2hlciBmdW5jdGlvbnNcbiAgICAvL2UuZy4gdG8gZW5kIHRleHQgZmxvYXRpbmcgYXJvdW5kIGFuIGltYWdlXG5cblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5leGVjdXRlV2F0Y2hGdW5jdGlvbnMgPSBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHZhciByZXQgPSBmYWxzZTtcbiAgICAgIHZhciBuYXJyYXkgPSBbXTtcblxuICAgICAgaWYgKHRoaXMud2F0Y2hGdW5jdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMud2F0Y2hGdW5jdGlvbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBpZiAodGhpcy53YXRjaEZ1bmN0aW9uc1tpXShlbCkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hcnJheS5wdXNoKHRoaXMud2F0Y2hGdW5jdGlvbnNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2F0Y2hGdW5jdGlvbnMgPSBuYXJyYXk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5zcGxpdEZyYWdtZW50c0ludG9MaW5lcyA9IGZ1bmN0aW9uIChmcmFnbWVudHMsIHN0eWxlcykge1xuICAgICAgdmFyIGN1cnJlbnRMaW5lTGVuZ3RoLCBkZWZhdWx0Rm9udFNpemUsIGZmLCBmb250TWV0cmljcywgZm9udE1ldHJpY3NDYWNoZSwgZnJhZ21lbnQsIGZyYWdtZW50Q2hvcHBlZCwgZnJhZ21lbnRMZW5ndGgsIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLCBmcywgaywgbGluZSwgbGluZXMsIG1heExpbmVMZW5ndGgsIHN0eWxlO1xuICAgICAgZGVmYXVsdEZvbnRTaXplID0gMTI7XG4gICAgICBrID0gdGhpcy5wZGYuaW50ZXJuYWwuc2NhbGVGYWN0b3I7XG4gICAgICBmb250TWV0cmljc0NhY2hlID0ge307XG4gICAgICBmZiA9IHZvaWQgMDtcbiAgICAgIGZzID0gdm9pZCAwO1xuICAgICAgZm9udE1ldHJpY3MgPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudCA9IHZvaWQgMDtcbiAgICAgIHN0eWxlID0gdm9pZCAwO1xuICAgICAgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MgPSB2b2lkIDA7XG4gICAgICBmcmFnbWVudExlbmd0aCA9IHZvaWQgMDtcbiAgICAgIGZyYWdtZW50Q2hvcHBlZCA9IHZvaWQgMDtcbiAgICAgIGxpbmUgPSBbXTtcbiAgICAgIGxpbmVzID0gW2xpbmVdO1xuICAgICAgY3VycmVudExpbmVMZW5ndGggPSAwO1xuICAgICAgbWF4TGluZUxlbmd0aCA9IHRoaXMuc2V0dGluZ3Mud2lkdGg7XG5cbiAgICAgIHdoaWxlIChmcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnRzLnNoaWZ0KCk7XG4gICAgICAgIHN0eWxlID0gc3R5bGVzLnNoaWZ0KCk7XG5cbiAgICAgICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICAgICAgZmYgPSBzdHlsZVtcImZvbnQtZmFtaWx5XCJdO1xuICAgICAgICAgIGZzID0gc3R5bGVbXCJmb250LXN0eWxlXCJdO1xuICAgICAgICAgIGZvbnRNZXRyaWNzID0gZm9udE1ldHJpY3NDYWNoZVtmZiArIGZzXTtcblxuICAgICAgICAgIGlmICghZm9udE1ldHJpY3MpIHtcbiAgICAgICAgICAgIGZvbnRNZXRyaWNzID0gdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Rm9udChmZiwgZnMpLm1ldGFkYXRhLlVuaWNvZGU7XG4gICAgICAgICAgICBmb250TWV0cmljc0NhY2hlW2ZmICsgZnNdID0gZm9udE1ldHJpY3M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZnJhZ21lbnRTcGVjaWZpY01ldHJpY3MgPSB7XG4gICAgICAgICAgICB3aWR0aHM6IGZvbnRNZXRyaWNzLndpZHRocyxcbiAgICAgICAgICAgIGtlcm5pbmc6IGZvbnRNZXRyaWNzLmtlcm5pbmcsXG4gICAgICAgICAgICBmb250U2l6ZTogc3R5bGVbXCJmb250LXNpemVcIl0gKiBkZWZhdWx0Rm9udFNpemUsXG4gICAgICAgICAgICB0ZXh0SW5kZW50OiBjdXJyZW50TGluZUxlbmd0aFxuICAgICAgICAgIH07XG4gICAgICAgICAgZnJhZ21lbnRMZW5ndGggPSB0aGlzLnBkZi5nZXRTdHJpbmdVbml0V2lkdGgoZnJhZ21lbnQsIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzKSAqIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLmZvbnRTaXplIC8gaztcblxuICAgICAgICAgIGlmIChmcmFnbWVudCA9PSBcIlxcdTIwMjhcIikge1xuICAgICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgICAgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMaW5lTGVuZ3RoICsgZnJhZ21lbnRMZW5ndGggPiBtYXhMaW5lTGVuZ3RoKSB7XG4gICAgICAgICAgICBmcmFnbWVudENob3BwZWQgPSB0aGlzLnBkZi5zcGxpdFRleHRUb1NpemUoZnJhZ21lbnQsIG1heExpbmVMZW5ndGgsIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzKTtcbiAgICAgICAgICAgIGxpbmUucHVzaChbZnJhZ21lbnRDaG9wcGVkLnNoaWZ0KCksIHN0eWxlXSk7XG5cbiAgICAgICAgICAgIHdoaWxlIChmcmFnbWVudENob3BwZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGxpbmUgPSBbW2ZyYWdtZW50Q2hvcHBlZC5zaGlmdCgpLCBzdHlsZV1dO1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50TGluZUxlbmd0aCA9IHRoaXMucGRmLmdldFN0cmluZ1VuaXRXaWR0aChsaW5lWzBdWzBdLCBmcmFnbWVudFNwZWNpZmljTWV0cmljcykgKiBmcmFnbWVudFNwZWNpZmljTWV0cmljcy5mb250U2l6ZSAvIGs7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpbmUucHVzaChbZnJhZ21lbnQsIHN0eWxlXSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZUxlbmd0aCArPSBmcmFnbWVudExlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gLy9pZiB0ZXh0IGFsaWdubWVudCB3YXMgc2V0LCBzZXQgbWFyZ2luL2luZGVudCBvZiBlYWNoIGxpbmVcblxuXG4gICAgICBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSAhPT0gdW5kZWZpbmVkICYmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAnY2VudGVyJyB8fCBzdHlsZVsndGV4dC1hbGlnbiddID09PSAncmlnaHQnIHx8IHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdqdXN0aWZ5JykpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLnBkZi5nZXRTdHJpbmdVbml0V2lkdGgobGluZXNbaV1bMF1bMF0sIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzKSAqIGZyYWdtZW50U3BlY2lmaWNNZXRyaWNzLmZvbnRTaXplIC8gazsgLy9pZiB0aGVyZSBpcyBtb3JlIHRoYW4gb24gbGluZSB3ZSBoYXZlIHRvIGNsb25lIHRoZSBzdHlsZSBvYmplY3QgYXMgYWxsIGxpbmVzIGhvbGQgYSByZWZlcmVuY2Ugb24gdGhpcyBvYmplY3RcblxuICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgbGluZXNbaV1bMF1bMV0gPSBjbG9uZShsaW5lc1tpXVswXVsxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHNwYWNlID0gbWF4TGluZUxlbmd0aCAtIGxlbmd0aDtcblxuICAgICAgICAgIGlmIChzdHlsZVsndGV4dC1hbGlnbiddID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgICBsaW5lc1tpXVswXVsxXVsnbWFyZ2luLWxlZnQnXSA9IHNwYWNlOyAvL2lmIGFsaWdubWVudCBpcyBub3QgcmlnaHQsIGl0IGhhcyB0byBiZSBjZW50ZXIgc28gc3BsaXQgdGhlIHNwYWNlIHRvIHRoZSBsZWZ0IGFuZCB0aGUgcmlnaHRcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlWyd0ZXh0LWFsaWduJ10gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICBsaW5lc1tpXVswXVsxXVsnbWFyZ2luLWxlZnQnXSA9IHNwYWNlIC8gMjsgLy9pZiBqdXN0aWZ5IHdhcyBzZXQsIGNhbGN1bGF0ZSB0aGUgd29yZCBzcGFjaW5nIGFuZCBkZWZpbmUgaW4gYnkgdXNpbmcgdGhlIGNzcyBwcm9wZXJ0eVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVbJ3RleHQtYWxpZ24nXSA9PT0gJ2p1c3RpZnknKSB7XG4gICAgICAgICAgICB2YXIgY291bnRTcGFjZXMgPSBsaW5lc1tpXVswXVswXS5zcGxpdCgnICcpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBsaW5lc1tpXVswXVsxXVsnd29yZC1zcGFjaW5nJ10gPSBzcGFjZSAvIGNvdW50U3BhY2VzOyAvL2lnbm9yZSB0aGUgbGFzdCBsaW5lIGluIGp1c3RpZnkgbW9kZVxuXG4gICAgICAgICAgICBpZiAoaSA9PT0gbGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICBsaW5lc1tpXVswXVsxXVsnd29yZC1zcGFjaW5nJ10gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGluZXM7XG4gICAgfTtcblxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5SZW5kZXJUZXh0RnJhZ21lbnQgPSBmdW5jdGlvbiAodGV4dCwgc3R5bGUpIHtcbiAgICAgIHZhciBkZWZhdWx0Rm9udFNpemUsIGZvbnQsIG1heExpbmVIZWlnaHQ7XG4gICAgICBtYXhMaW5lSGVpZ2h0ID0gMDtcbiAgICAgIGRlZmF1bHRGb250U2l6ZSA9IDEyO1xuXG4gICAgICBpZiAodGhpcy5wZGYuaW50ZXJuYWwucGFnZVNpemUuZ2V0SGVpZ2h0KCkgLSB0aGlzLnBkZi5tYXJnaW5zX2RvYy5ib3R0b20gPCB0aGlzLnkgKyB0aGlzLnBkZi5pbnRlcm5hbC5nZXRGb250U2l6ZSgpKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwiRVRcIiwgXCJRXCIsIFwiUVwiKTtcbiAgICAgICAgY29uc3QgY3VycmVudFBhZ2VOdW1iZXIgPSB0aGlzLnBkZi5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyO1xuICAgICAgICBpZiAodGhpcy5wZGYuZ2V0TnVtYmVyT2ZQYWdlcygpID09PSBjdXJyZW50UGFnZU51bWJlcikgdGhpcy5wZGYuYWRkUGFnZSgpO1xuICAgICAgICBlbHNlIHRoaXMucGRmLnNldFBhZ2UoY3VycmVudFBhZ2VOdW1iZXIgKyAxKTtcbiAgICAgICAgdGhpcy55ID0gdGhpcy5wZGYubWFyZ2luc19kb2MudG9wO1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShcInFcIiwgXCJxXCIsIFwiQlRcIiwgdGhpcy5nZXRQZGZDb2xvcihzdHlsZS5jb2xvciksIHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcodGhpcy54KSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nKHRoaXMueSksIFwiVGRcIik7IC8vbW92ZSBjdXJzb3IgYnkgb25lIGxpbmUgb24gbmV3IHBhZ2VcblxuICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgobWF4TGluZUhlaWdodCwgc3R5bGVbXCJsaW5lLWhlaWdodFwiXSwgc3R5bGVbXCJmb250LXNpemVcIl0pO1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZSgwLCAoLTEgKiBkZWZhdWx0Rm9udFNpemUgKiBtYXhMaW5lSGVpZ2h0KS50b0ZpeGVkKDIpLCBcIlRkXCIpO1xuICAgICAgfVxuXG4gICAgICBmb250ID0gdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Rm9udChzdHlsZVtcImZvbnQtZmFtaWx5XCJdLCBzdHlsZVtcImZvbnQtc3R5bGVcIl0pOyAvLyB0ZXh0IGNvbG9yXG5cbiAgICAgIHZhciBwZGZUZXh0Q29sb3IgPSB0aGlzLmdldFBkZkNvbG9yKHN0eWxlW1wiY29sb3JcIl0pO1xuXG4gICAgICBpZiAocGRmVGV4dENvbG9yICE9PSB0aGlzLmxhc3RUZXh0Q29sb3IpIHtcbiAgICAgICAgdGhpcy5wZGYuaW50ZXJuYWwud3JpdGUocGRmVGV4dENvbG9yKTtcbiAgICAgICAgdGhpcy5sYXN0VGV4dENvbG9yID0gcGRmVGV4dENvbG9yO1xuICAgICAgfSAvL3NldCB0aGUgd29yZCBzcGFjaW5nIGZvciBlLmcuIGp1c3RpZnkgc3R5bGVcblxuXG4gICAgICBpZiAoc3R5bGVbJ3dvcmQtc3BhY2luZyddICE9PSB1bmRlZmluZWQgJiYgc3R5bGVbJ3dvcmQtc3BhY2luZyddID4gMCkge1xuICAgICAgICB0aGlzLnBkZi5pbnRlcm5hbC53cml0ZShzdHlsZVsnd29yZC1zcGFjaW5nJ10udG9GaXhlZCgyKSwgXCJUd1wiKTtcbiAgICAgIH1cblxuXG4gICAgICB2YXIgcGRmRXNjYXBlMTYgPSBmdW5jdGlvbih0ZXh0LCBmb250KSB7XG4gICAgICAgIHZhciB3aWR0aHMgPSBmb250Lm1ldGFkYXRhLlVuaWNvZGUud2lkdGhzO1xuICAgICAgICB2YXIgcGFkeiA9IFtcIlwiLCBcIjBcIiwgXCIwMFwiLCBcIjAwMFwiLCBcIjAwMDBcIl07XG4gICAgICAgIHZhciBhciA9IFtcIlwiXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSB0ZXh0Lmxlbmd0aCwgdDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgIHQgPSBmb250Lm1ldGFkYXRhLmNoYXJhY3RlclRvR2x5cGgodGV4dC5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgICBmb250Lm1ldGFkYXRhLmdseUlkc1VzZWQucHVzaCh0KTtcbiAgICAgICAgICBmb250Lm1ldGFkYXRhLnRvVW5pY29kZVt0XSA9IHRleHQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICBpZiAod2lkdGhzLmluZGV4T2YodCkgPT0gLTEpIHtcbiAgICAgICAgICAgIHdpZHRocy5wdXNoKHQpO1xuICAgICAgICAgICAgd2lkdGhzLnB1c2goW3BhcnNlSW50KGZvbnQubWV0YWRhdGEud2lkdGhPZkdseXBoKHQpLCAxMCldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHQgPT0gXCIwXCIpIHtcbiAgICAgICAgICAgIC8vU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiBjbWFwLlxuICAgICAgICAgICAgcmV0dXJuIGFyLmpvaW4oXCJcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHQgPSB0LnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIGFyLnB1c2gocGFkels0IC0gdC5sZW5ndGhdLCB0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyLmpvaW4oXCJcIik7XG4gICAgICB9O1xuXG4gICAgICB2YXIgdXRmOFRleHRGdW5jdGlvbiA9IGZ1bmN0aW9uKHRleHQsIGZvbnQpIHtcbiAgICAgICAgdmFyIHRleHQgPSB0ZXh0IHx8IFwiXCI7XG4gICAgXG4gICAgICAgIHZhciBzdHIgPSBcIlwiLFxuICAgICAgICAgIHMgPSAwLFxuICAgICAgICAgIGNtYXBDb25maXJtO1xuICAgICAgICB2YXIgc3RyVGV4dCA9IFwiXCI7XG4gICAgICAgIHZhciBlbmNvZGluZyA9IGZvbnQuZW5jb2Rpbmc7XG4gICAgXG4gICAgICAgIGlmIChmb250LmVuY29kaW5nICE9PSBcIklkZW50aXR5LUhcIikge1xuICAgICAgICAgIHJldHVybiB0ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0clRleHQgPSB0ZXh0O1xuICAgIFxuICAgICAgICBmb3IgKHMgPSAwOyBzIDwgc3RyVGV4dC5sZW5ndGg7IHMgKz0gMSkge1xuICAgICAgICAgIGlmIChmb250Lm1ldGFkYXRhLmhhc093blByb3BlcnR5KFwiY21hcFwiKSkge1xuICAgICAgICAgICAgY21hcENvbmZpcm0gPSBmb250Lm1ldGFkYXRhLmNtYXAudW5pY29kZS5jb2RlTWFwW3N0clRleHRbc10uY2hhckNvZGVBdCgwKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghY21hcENvbmZpcm0pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgc3RyVGV4dFtzXS5jaGFyQ29kZUF0KDApIDwgMjU2ICYmXG4gICAgICAgICAgICAgIGZvbnQubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoXCJVbmljb2RlXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgc3RyICs9IHN0clRleHRbc107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdHIgKz0gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RyICs9IHN0clRleHRbc107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgICBpZiAocGFyc2VJbnQoZm9udC5pZC5zbGljZSgxKSkgPCAxNCB8fCBlbmNvZGluZyA9PT0gXCJXaW5BbnNpRW5jb2RpbmdcIikge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMucGRmLmludGVybmFsLnBkZkVzY2FwZShzdHIsIGtleSlcbiAgICAgICAgICAgIC5zcGxpdChcIlwiKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbihjdikge1xuICAgICAgICAgICAgICByZXR1cm4gY3YuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcgPT09IFwiSWRlbnRpdHktSFwiKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcGRmRXNjYXBlMTYoc3RyLCBmb250KTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTsgICAgICBcblxuICAgICAgLy8gdmFyIGVzY2FwZWRUZXh0ID0gdGhpcy5wZGYuaW50ZXJuYWwucGRmRXNjYXBlKHRleHQpO1xuICAgICAgLy8gdmFyIGVzY2FwZWRUZXh0ID0gdXRmOFRleHRGdW5jdGlvbih0ZXh0LCBmb250KTtcbiAgICAgIC8vIGlmKGVzY2FwZWRUZXh0ICE9IHRleHQpIHtcbiAgICAgIC8vICAgZXNjYXBlZFRleHQgPSBcIjxcIiArIGVzY2FwZWRUZXh0ICsgXCI+XCI7XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICBlc2NhcGVkVGV4dCA9IFwiKFwiICsgZXNjYXBlZFRleHQgKyBcIilcIjtcbiAgICAgIC8vIH1cblxuICAgICAgdmFyIGVzY2FwZWRUZXh0ID0gXCJcIjtcbiAgICAgIGlmKGZvbnQuZW5jb2RpbmcgIT09IFwiSWRlbnRpdHktSFwiKSB7XG4gICAgICAgIGVzY2FwZWRUZXh0ID0gXCIoXCIgKyB0aGlzLnBkZi5pbnRlcm5hbC5wZGZFc2NhcGUodGV4dCkgKyBcIilcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVzY2FwZWRUZXh0ID0gXCI8XCIgKyB1dGY4VGV4dEZ1bmN0aW9uKHRleHQsIGZvbnQpICsgXCI+XCI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKFwiL1wiICsgZm9udC5pZCwgKGRlZmF1bHRGb250U2l6ZSAqIHN0eWxlW1wiZm9udC1zaXplXCJdKS50b0ZpeGVkKDIpLCBcIlRmXCIsIGVzY2FwZWRUZXh0ICsgXCIgVGpcIik7IC8vc2V0IHRoZSB3b3JkIHNwYWNpbmcgYmFjayB0byBuZXV0cmFsID0+IDBcblxuICAgICAgaWYgKHN0eWxlWyd3b3JkLXNwYWNpbmcnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucGRmLmludGVybmFsLndyaXRlKDAsIFwiVHdcIik7XG4gICAgICB9XG4gICAgfTsgLy8gQWNjZXB0cyAjRkZGRkZGLCByZ2IoaW50LGludCxpbnQpLCBvciBDU1MgQ29sb3IgTmFtZVxuXG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZ2V0UGRmQ29sb3IgPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAgIHZhciB0ZXh0Q29sb3I7XG4gICAgICB2YXIgciwgZywgYjtcbiAgICAgIHZhciByeCA9IC9yZ2JcXHMqXFwoXFxzKihcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkK1xccyopXFwpLztcbiAgICAgIHZhciBtID0gcnguZXhlYyhzdHlsZSk7XG5cbiAgICAgIGlmIChtICE9IG51bGwpIHtcbiAgICAgICAgciA9IHBhcnNlSW50KG1bMV0pO1xuICAgICAgICBnID0gcGFyc2VJbnQobVsyXSk7XG4gICAgICAgIGIgPSBwYXJzZUludChtWzNdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3R5bGUgPT09IFwic3RyaW5nXCIgJiYgc3R5bGUuY2hhckF0KDApICE9ICcjJykge1xuICAgICAgICAgIHZhciByZ2JDb2xvciA9IG5ldyBSR0JDb2xvcihzdHlsZSk7XG5cbiAgICAgICAgICBpZiAocmdiQ29sb3Iub2spIHtcbiAgICAgICAgICAgIHN0eWxlID0gcmdiQ29sb3IudG9IZXgoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUgPSAnIzAwMDAwMCc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgciA9IHN0eWxlLnN1YnN0cmluZygxLCAzKTtcbiAgICAgICAgciA9IHBhcnNlSW50KHIsIDE2KTtcbiAgICAgICAgZyA9IHN0eWxlLnN1YnN0cmluZygzLCA1KTtcbiAgICAgICAgZyA9IHBhcnNlSW50KGcsIDE2KTtcbiAgICAgICAgYiA9IHN0eWxlLnN1YnN0cmluZyg1LCA3KTtcbiAgICAgICAgYiA9IHBhcnNlSW50KGIsIDE2KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiByID09PSAnc3RyaW5nJyAmJiAvXiNbMC05QS1GYS1mXXs2fSQvLnRlc3QocikpIHtcbiAgICAgICAgdmFyIGhleCA9IHBhcnNlSW50KHIuc3Vic3RyKDEpLCAxNik7XG4gICAgICAgIHIgPSBoZXggPj4gMTYgJiAyNTU7XG4gICAgICAgIGcgPSBoZXggPj4gOCAmIDI1NTtcbiAgICAgICAgYiA9IGhleCAmIDI1NTtcbiAgICAgIH1cblxuICAgICAgdmFyIGYzID0gdGhpcy5mMztcblxuICAgICAgaWYgKHIgPT09IDAgJiYgZyA9PT0gMCAmJiBiID09PSAwIHx8IHR5cGVvZiBnID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0ZXh0Q29sb3IgPSBmMyhyIC8gMjU1KSArICcgZyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZXh0Q29sb3IgPSBbZjMociAvIDI1NSksIGYzKGcgLyAyNTUpLCBmMyhiIC8gMjU1KSwgJ3JnJ10uam9pbignICcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGV4dENvbG9yO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuZjMgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICByZXR1cm4gbnVtYmVyLnRvRml4ZWQoMyk7IC8vIEllLCAlLjNmXG4gICAgfSwgUmVuZGVyZXIucHJvdG90eXBlLnJlbmRlclBhcmFncmFwaCA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgdmFyIGJsb2Nrc3R5bGUsIGRlZmF1bHRGb250U2l6ZSwgZm9udFRvVW5pdFJhdGlvLCBmcmFnbWVudHMsIGksIGwsIGxpbmUsIGxpbmVzLCBtYXhMaW5lSGVpZ2h0LCBvdXQsIHBhcmFncmFwaHNwYWNpbmdfYWZ0ZXIsIHBhcmFncmFwaHNwYWNpbmdfYmVmb3JlLCBwcmlvcmJsb2Nrc3R5bGUsIHN0eWxlcywgZm9udFNpemU7XG4gICAgICBmcmFnbWVudHMgPSBQdXJnZVdoaXRlU3BhY2UodGhpcy5wYXJhZ3JhcGgudGV4dCk7XG4gICAgICBzdHlsZXMgPSB0aGlzLnBhcmFncmFwaC5zdHlsZTtcbiAgICAgIGJsb2Nrc3R5bGUgPSB0aGlzLnBhcmFncmFwaC5ibG9ja3N0eWxlO1xuICAgICAgcHJpb3JibG9ja3N0eWxlID0gdGhpcy5wYXJhZ3JhcGgucHJpb3JibG9ja3N0eWxlIHx8IHt9O1xuICAgICAgdGhpcy5wYXJhZ3JhcGggPSB7XG4gICAgICAgIHRleHQ6IFtdLFxuICAgICAgICBzdHlsZTogW10sXG4gICAgICAgIGJsb2Nrc3R5bGU6IHt9LFxuICAgICAgICBwcmlvcmJsb2Nrc3R5bGU6IGJsb2Nrc3R5bGVcbiAgICAgIH07XG5cbiAgICAgIGlmICghZnJhZ21lbnRzLmpvaW4oXCJcIikudHJpbSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGluZXMgPSB0aGlzLnNwbGl0RnJhZ21lbnRzSW50b0xpbmVzKGZyYWdtZW50cywgc3R5bGVzKTtcbiAgICAgIGxpbmUgPSB2b2lkIDA7XG4gICAgICBtYXhMaW5lSGVpZ2h0ID0gdm9pZCAwO1xuICAgICAgZGVmYXVsdEZvbnRTaXplID0gMTI7XG4gICAgICBmb250VG9Vbml0UmF0aW8gPSBkZWZhdWx0Rm9udFNpemUgLyB0aGlzLnBkZi5pbnRlcm5hbC5zY2FsZUZhY3RvcjtcbiAgICAgIHRoaXMucHJpb3JNYXJnaW5Cb3R0b20gPSB0aGlzLnByaW9yTWFyZ2luQm90dG9tIHx8IDA7XG4gICAgICBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZSA9IChNYXRoLm1heCgoYmxvY2tzdHlsZVtcIm1hcmdpbi10b3BcIl0gfHwgMCkgLSB0aGlzLnByaW9yTWFyZ2luQm90dG9tLCAwKSArIChibG9ja3N0eWxlW1wicGFkZGluZy10b3BcIl0gfHwgMCkpICogZm9udFRvVW5pdFJhdGlvO1xuICAgICAgcGFyYWdyYXBoc3BhY2luZ19hZnRlciA9ICgoYmxvY2tzdHlsZVtcIm1hcmdpbi1ib3R0b21cIl0gfHwgMCkgKyAoYmxvY2tzdHlsZVtcInBhZGRpbmctYm90dG9tXCJdIHx8IDApKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgIHRoaXMucHJpb3JNYXJnaW5Cb3R0b20gPSBibG9ja3N0eWxlW1wibWFyZ2luLWJvdHRvbVwiXSB8fCAwO1xuXG4gICAgICBpZiAoYmxvY2tzdHlsZVsncGFnZS1icmVhay1iZWZvcmUnXSA9PT0gJ2Fsd2F5cycpIHtcbiAgICAgICAgdGhpcy5wZGYuYWRkUGFnZSgpO1xuICAgICAgICB0aGlzLnkgPSAwO1xuICAgICAgICBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZSA9ICgoYmxvY2tzdHlsZVtcIm1hcmdpbi10b3BcIl0gfHwgMCkgKyAoYmxvY2tzdHlsZVtcInBhZGRpbmctdG9wXCJdIHx8IDApKSAqIGZvbnRUb1VuaXRSYXRpbztcbiAgICAgIH1cblxuICAgICAgb3V0ID0gdGhpcy5wZGYuaW50ZXJuYWwud3JpdGU7XG4gICAgICBpID0gdm9pZCAwO1xuICAgICAgbCA9IHZvaWQgMDtcbiAgICAgIHRoaXMueSArPSBwYXJhZ3JhcGhzcGFjaW5nX2JlZm9yZTtcbiAgICAgIG91dChcInFcIiwgXCJCVCAwIGdcIiwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyh0aGlzLngpLCB0aGlzLnBkZi5pbnRlcm5hbC5nZXRWZXJ0aWNhbENvb3JkaW5hdGVTdHJpbmcodGhpcy55KSwgXCJUZFwiKTsgLy9zdG9yZXMgdGhlIGN1cnJlbnQgaW5kZW50IG9mIGN1cnNvciBwb3NpdGlvblxuXG4gICAgICB2YXIgY3VycmVudEluZGVudCA9IDA7XG5cbiAgICAgIHdoaWxlIChsaW5lcy5sZW5ndGgpIHtcbiAgICAgICAgbGluZSA9IGxpbmVzLnNoaWZ0KCk7XG4gICAgICAgIG1heExpbmVIZWlnaHQgPSAwO1xuICAgICAgICBpID0gMDtcbiAgICAgICAgbCA9IGxpbmUubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgICAgaWYgKGxpbmVbaV1bMF0udHJpbSgpKSB7XG4gICAgICAgICAgICBtYXhMaW5lSGVpZ2h0ID0gTWF0aC5tYXgobWF4TGluZUhlaWdodCwgbGluZVtpXVsxXVtcImxpbmUtaGVpZ2h0XCJdLCBsaW5lW2ldWzFdW1wiZm9udC1zaXplXCJdKTtcbiAgICAgICAgICAgIGZvbnRTaXplID0gbGluZVtpXVsxXVtcImZvbnQtc2l6ZVwiXSAqIDc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaSsrO1xuICAgICAgICB9IC8vaWYgd2UgaGF2ZSB0byBtb3ZlIHRoZSBjdXJzb3IgdG8gYWRhcHQgdGhlIGluZGVudFxuXG5cbiAgICAgICAgdmFyIGluZGVudE1vdmUgPSAwO1xuICAgICAgICB2YXIgd2FudGVkSW5kZW50ID0gMDsgLy9pZiBhIG1hcmdpbiB3YXMgYWRkZWQgKGJ5IGUuZy4gYSB0ZXh0LWFsaWdubWVudCksIG1vdmUgdGhlIGN1cnNvclxuXG4gICAgICAgIGlmIChsaW5lWzBdWzFdW1wibWFyZ2luLWxlZnRcIl0gIT09IHVuZGVmaW5lZCAmJiBsaW5lWzBdWzFdW1wibWFyZ2luLWxlZnRcIl0gPiAwKSB7XG4gICAgICAgICAgd2FudGVkSW5kZW50ID0gdGhpcy5wZGYuaW50ZXJuYWwuZ2V0Q29vcmRpbmF0ZVN0cmluZyhsaW5lWzBdWzFdW1wibWFyZ2luLWxlZnRcIl0pO1xuICAgICAgICAgIGluZGVudE1vdmUgPSB3YW50ZWRJbmRlbnQgLSBjdXJyZW50SW5kZW50O1xuICAgICAgICAgIGN1cnJlbnRJbmRlbnQgPSB3YW50ZWRJbmRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaW5kZW50TW9yZSA9IE1hdGgubWF4KGJsb2Nrc3R5bGVbXCJtYXJnaW4tbGVmdFwiXSB8fCAwLCAwKSAqIGZvbnRUb1VuaXRSYXRpbzsgLy9tb3ZlIHRoZSBjdXJzb3JcblxuICAgICAgICBvdXQoaW5kZW50TW92ZSArIGluZGVudE1vcmUsICgtMSAqIGRlZmF1bHRGb250U2l6ZSAqIG1heExpbmVIZWlnaHQpLnRvRml4ZWQoMiksIFwiVGRcIik7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICBsID0gbGluZS5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKGkgIT09IGwpIHtcbiAgICAgICAgICBpZiAobGluZVtpXVswXSkge1xuICAgICAgICAgICAgdGhpcy5SZW5kZXJUZXh0RnJhZ21lbnQobGluZVtpXVswXSwgbGluZVtpXVsxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy55ICs9IG1heExpbmVIZWlnaHQgKiBmb250VG9Vbml0UmF0aW87IC8vaWYgc29tZSB3YXRjaGVyIGZ1bmN0aW9uIHdhcyBleGVjdXRlZCBzdWNjZXNzZnVsLCBzbyBlLmcuIG1hcmdpbiBhbmQgd2lkdGhzIHdlcmUgY2hhbmdlZCxcbiAgICAgICAgLy9yZXNldCBsaW5lIGRyYXdpbmcgYW5kIGNhbGN1bGF0ZSBwb3NpdGlvbiBhbmQgbGluZXMgYWdhaW5cbiAgICAgICAgLy9lLmcuIHRvIHN0b3AgdGV4dCBmbG9hdGluZyBhcm91bmQgYW4gaW1hZ2VcblxuICAgICAgICBpZiAodGhpcy5leGVjdXRlV2F0Y2hGdW5jdGlvbnMobGluZVswXVsxXSkgJiYgbGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciBsb2NhbEZyYWdtZW50cyA9IFtdO1xuICAgICAgICAgIHZhciBsb2NhbFN0eWxlcyA9IFtdOyAvL2NyZWF0ZSBmcmFnbWVudCBhcnJheSBvZlxuXG4gICAgICAgICAgbGluZXMuZm9yRWFjaChmdW5jdGlvbiAobG9jYWxMaW5lKSB7XG4gICAgICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgICAgICB2YXIgbCA9IGxvY2FsTGluZS5sZW5ndGg7XG5cbiAgICAgICAgICAgIHdoaWxlIChpICE9PSBsKSB7XG4gICAgICAgICAgICAgIGlmIChsb2NhbExpbmVbaV1bMF0pIHtcbiAgICAgICAgICAgICAgICBsb2NhbEZyYWdtZW50cy5wdXNoKGxvY2FsTGluZVtpXVswXSArICcgJyk7XG4gICAgICAgICAgICAgICAgbG9jYWxTdHlsZXMucHVzaChsb2NhbExpbmVbaV1bMV0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pOyAvL3NwbGl0IGxpbmVzIGFnYWluIGR1ZSB0byBwb3NzaWJsZSBjb29yZGluYXRlIGNoYW5nZXNcblxuICAgICAgICAgIGxpbmVzID0gdGhpcy5zcGxpdEZyYWdtZW50c0ludG9MaW5lcyhQdXJnZVdoaXRlU3BhY2UobG9jYWxGcmFnbWVudHMpLCBsb2NhbFN0eWxlcyk7IC8vcmVwb3NpdGlvbiB0aGUgY3VycmVudCBjdXJzb3JcblxuICAgICAgICAgIG91dChcIkVUXCIsIFwiUVwiKTtcbiAgICAgICAgICBvdXQoXCJxXCIsIFwiQlQgMCBnXCIsIHRoaXMucGRmLmludGVybmFsLmdldENvb3JkaW5hdGVTdHJpbmcodGhpcy54KSwgdGhpcy5wZGYuaW50ZXJuYWwuZ2V0VmVydGljYWxDb29yZGluYXRlU3RyaW5nKHRoaXMueSksIFwiVGRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNiICYmIHR5cGVvZiBjYiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNiLmNhbGwodGhpcywgdGhpcy54IC0gOSwgdGhpcy55IC0gZm9udFNpemUgLyAyKTtcbiAgICAgIH1cblxuICAgICAgb3V0KFwiRVRcIiwgXCJRXCIpO1xuICAgICAgcmV0dXJuIHRoaXMueSArPSBwYXJhZ3JhcGhzcGFjaW5nX2FmdGVyO1xuICAgIH07XG5cbiAgICBSZW5kZXJlci5wcm90b3R5cGUuc2V0QmxvY2tCb3VuZGFyeSA9IGZ1bmN0aW9uIChjYikge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyUGFyYWdyYXBoKGNiKTtcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnNldEJsb2NrU3R5bGUgPSBmdW5jdGlvbiAoY3NzKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhZ3JhcGguYmxvY2tzdHlsZSA9IGNzcztcbiAgICB9O1xuXG4gICAgUmVuZGVyZXIucHJvdG90eXBlLmFkZFRleHQgPSBmdW5jdGlvbiAodGV4dCwgY3NzKSB7XG4gICAgICB0aGlzLnBhcmFncmFwaC50ZXh0LnB1c2godGV4dCk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhZ3JhcGguc3R5bGUucHVzaChjc3MpO1xuICAgIH07XG5cbiAgICBGb250TmFtZURCID0ge1xuICAgICAgaGVsdmV0aWNhOiBcImhlbHZldGljYVwiLFxuICAgICAgXCJzYW5zLXNlcmlmXCI6IFwiaGVsdmV0aWNhXCIsXG4gICAgICBcInRpbWVzIG5ldyByb21hblwiOiBcInRpbWVzXCIsXG4gICAgICBzZXJpZjogXCJ0aW1lc1wiLFxuICAgICAgdGltZXM6IFwidGltZXNcIixcbiAgICAgIG1vbm9zcGFjZTogXCJjb3VyaWVyXCIsXG4gICAgICBjb3VyaWVyOiBcImNvdXJpZXJcIlxuICAgIH07XG4gICAgRm9udFdlaWdodE1hcCA9IHtcbiAgICAgIDEwMDogXCJub3JtYWxcIixcbiAgICAgIDIwMDogXCJub3JtYWxcIixcbiAgICAgIDMwMDogXCJub3JtYWxcIixcbiAgICAgIDQwMDogXCJub3JtYWxcIixcbiAgICAgIDUwMDogXCJib2xkXCIsXG4gICAgICA2MDA6IFwiYm9sZFwiLFxuICAgICAgNzAwOiBcImJvbGRcIixcbiAgICAgIDgwMDogXCJib2xkXCIsXG4gICAgICA5MDA6IFwiYm9sZFwiLFxuICAgICAgbm9ybWFsOiBcIm5vcm1hbFwiLFxuICAgICAgYm9sZDogXCJib2xkXCIsXG4gICAgICBib2xkZXI6IFwiYm9sZFwiLFxuICAgICAgbGlnaHRlcjogXCJub3JtYWxcIlxuICAgIH07XG4gICAgRm9udFN0eWxlTWFwID0ge1xuICAgICAgbm9ybWFsOiBcIm5vcm1hbFwiLFxuICAgICAgaXRhbGljOiBcIml0YWxpY1wiLFxuICAgICAgb2JsaXF1ZTogXCJpdGFsaWNcIlxuICAgIH07XG4gICAgVGV4dEFsaWduTWFwID0ge1xuICAgICAgbGVmdDogXCJsZWZ0XCIsXG4gICAgICByaWdodDogXCJyaWdodFwiLFxuICAgICAgY2VudGVyOiBcImNlbnRlclwiLFxuICAgICAganVzdGlmeTogXCJqdXN0aWZ5XCJcbiAgICB9O1xuICAgIEZsb2F0TWFwID0ge1xuICAgICAgbm9uZTogJ25vbmUnLFxuICAgICAgcmlnaHQ6ICdyaWdodCcsXG4gICAgICBsZWZ0OiAnbGVmdCdcbiAgICB9O1xuICAgIENsZWFyTWFwID0ge1xuICAgICAgbm9uZTogJ25vbmUnLFxuICAgICAgYm90aDogJ2JvdGgnXG4gICAgfTtcbiAgICBVbml0ZWROdW1iZXJNYXAgPSB7XG4gICAgICBub3JtYWw6IDFcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIEhUTUwtZm9ybWF0dGVkIHRleHQgaW50byBmb3JtYXR0ZWQgUERGIHRleHQuXG4gICAgICpcbiAgICAgKiBOb3RlczpcbiAgICAgKiAyMDEyLTA3LTE4XG4gICAgICogUGx1Z2luIHJlbGllcyBvbiBoYXZpbmcgYnJvd3NlciwgRE9NIGFyb3VuZC4gVGhlIEhUTUwgaXMgcHVzaGVkIGludG8gZG9tIGFuZCB0cmF2ZXJzZWQuXG4gICAgICogUGx1Z2luIHJlbGllcyBvbiBqUXVlcnkgZm9yIENTUyBleHRyYWN0aW9uLlxuICAgICAqIFRhcmdldGluZyBIVE1MIG91dHB1dCBmcm9tIE1hcmtkb3duIHRlbXBsYXRpbmcsIHdoaWNoIGlzIGEgdmVyeSBzaW1wbGVcbiAgICAgKiBtYXJrdXAgLSBkaXYsIHNwYW4sIGVtLCBzdHJvbmcsIHAuIE5vIGJyLWJhc2VkIHBhcmFncmFwaCBzZXBhcmF0aW9uIHN1cHBvcnRlZCBleHBsaWNpdGx5IChidXQgc3RpbGwgbWF5IHdvcmsuKVxuICAgICAqIEltYWdlcywgdGFibGVzIGFyZSBOT1Qgc3VwcG9ydGVkLlxuICAgICAqXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBmdW5jdGlvblxuICAgICAqIEBwYXJhbSBIVE1MIHtTdHJpbmd8T2JqZWN0fSBIVE1MLWZvcm1hdHRlZCB0ZXh0LCBvciBwb2ludGVyIHRvIERPTSBlbGVtZW50IHRoYXQgaXMgdG8gYmUgcmVuZGVyZWQgaW50byBQREYuXG4gICAgICogQHBhcmFtIHgge051bWJlcn0gc3RhcnRpbmcgWCBjb29yZGluYXRlIGluIGpzUERGIGluc3RhbmNlJ3MgZGVjbGFyZWQgdW5pdHMuXG4gICAgICogQHBhcmFtIHkge051bWJlcn0gc3RhcnRpbmcgWSBjb29yZGluYXRlIGluIGpzUERGIGluc3RhbmNlJ3MgZGVjbGFyZWQgdW5pdHMuXG4gICAgICogQHBhcmFtIHNldHRpbmdzIHtPYmplY3R9IEFkZGl0aW9uYWwgLyBvcHRpb25hbCB2YXJpYWJsZXMgY29udHJvbGxpbmcgcGFyc2luZywgcmVuZGVyaW5nLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IGpzUERGIGluc3RhbmNlXG4gICAgICovXG5cbiAgICBqc1BERkFQSS5mcm9tSFRNTCA9IGZ1bmN0aW9uIChIVE1MLCB4LCB5LCBzZXR0aW5ncywgY2FsbGJhY2ssIG1hcmdpbnMpIHtcblxuICAgICAgdGhpcy5tYXJnaW5zX2RvYyA9IG1hcmdpbnMgfHwge1xuICAgICAgICB0b3A6IDAsXG4gICAgICAgIGJvdHRvbTogMFxuICAgICAgfTtcbiAgICAgIGlmICghc2V0dGluZ3MpIHNldHRpbmdzID0ge307XG4gICAgICBpZiAoIXNldHRpbmdzLmVsZW1lbnRIYW5kbGVycykgc2V0dGluZ3MuZWxlbWVudEhhbmRsZXJzID0ge307XG4gICAgICByZXR1cm4gcHJvY2Vzcyh0aGlzLCBIVE1MLCBpc05hTih4KSA/IDQgOiB4LCBpc05hTih5KSA/IDQgOiB5LCBzZXR0aW5ncywgY2FsbGJhY2spO1xuICAgIH07XG4gIH0pKGpzcGRmLmpzUERGLkFQSSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9qc3BkZl9wbHVnaW5zL2Zyb21faHRtbC5qc1xuLy8gbW9kdWxlIGlkID0gNjFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIl0sInNvdXJjZVJvb3QiOiIifQ==