el-text-editor 0.0.91 → 0.0.92

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.
@@ -33,9 +33,9 @@ export class ElTextEditorComponent {
33
33
  this.toolbarLeft = 0;
34
34
  this.fonts = ['Arial', 'Courier New', 'Georgia', 'Times New Roman', 'Verdana'];
35
35
  this.fontSizes = [10, 12, 14, 16, 18, 20, 24, 28, 32, 36];
36
- this.selectedFont = 'Arial';
37
36
  this.currentListLevel = 0; // Track the current list level
38
37
  this.listStyles = ["decimal", "lower-alpha", "lower-roman"];
38
+ this.selectedFont = 'Arial';
39
39
  this.selectedFontSize = 14;
40
40
  this.isTableSelected = false;
41
41
  this.tableAdded = false;
@@ -758,7 +758,6 @@ export class ElTextEditorComponent {
758
758
  // this.checkActiveStates();
759
759
  // this.checkFormatBlock();
760
760
  // }
761
- // Helper function to find the closest <li> element
762
761
  getClosestListItem(node) {
763
762
  while (node && node !== document) {
764
763
  if (node.nodeName === "LI") {
@@ -1074,21 +1073,53 @@ export class ElTextEditorComponent {
1074
1073
  // this.tableAdded = true;
1075
1074
  // this.checkTableSelection();
1076
1075
  // }
1076
+ // handleTabKey(event: any) {
1077
+ // if (event.key === "Tab") {
1078
+ // event.preventDefault(); // Stop default tabbing behavior
1079
+ // const selection = window.getSelection();
1080
+ // if (!selection || selection.rangeCount === 0) return;
1081
+ // const range = selection.getRangeAt(0);
1082
+ // const tabNode = document.createElement("span"); // Create a span element for the tab space
1083
+ // tabNode.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;"; // Four non-breaking spaces to mimic tab
1084
+ // range.deleteContents(); // Remove any selected text
1085
+ // range.insertNode(tabNode); // Insert the tab space as span
1086
+ // range.setStartAfter(tabNode); // Move cursor after the inserted span
1087
+ // range.setEndAfter(tabNode);
1088
+ // selection.removeAllRanges();
1089
+ // selection.addRange(range);
1090
+ // }
1091
+ // }
1077
1092
  handleTabKey(event) {
1078
1093
  if (event.key === "Tab") {
1079
- event.preventDefault(); // Stop default tabbing behavior
1094
+ event.preventDefault(); // Prevent default tab behavior
1095
+ const editor = document.getElementById("editor");
1096
+ if (!editor)
1097
+ return;
1080
1098
  const selection = window.getSelection();
1081
1099
  if (!selection || selection.rangeCount === 0)
1082
1100
  return;
1083
1101
  const range = selection.getRangeAt(0);
1084
- const tabNode = document.createElement("span"); // Create a span element for the tab space
1085
- tabNode.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;"; // Four non-breaking spaces to mimic tab
1086
- range.deleteContents(); // Remove any selected text
1087
- range.insertNode(tabNode); // Insert the tab space as span
1088
- range.setStartAfter(tabNode); // Move cursor after the inserted span
1089
- range.setEndAfter(tabNode);
1090
- selection.removeAllRanges();
1091
- selection.addRange(range);
1102
+ const listItem = this.getClosestListItem(range.startContainer);
1103
+ if (listItem) {
1104
+ // If inside a list item, handle multi-level list indentation
1105
+ if (event.shiftKey) {
1106
+ this.decreaseListLevel(listItem);
1107
+ }
1108
+ else {
1109
+ this.increaseListLevel(listItem);
1110
+ }
1111
+ }
1112
+ else {
1113
+ // If outside a list item, insert a tab space
1114
+ const tabNode = document.createElement("span");
1115
+ tabNode.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;";
1116
+ range.deleteContents();
1117
+ range.insertNode(tabNode);
1118
+ range.setStartAfter(tabNode);
1119
+ range.setEndAfter(tabNode);
1120
+ selection.removeAllRanges();
1121
+ selection.addRange(range);
1122
+ }
1092
1123
  }
1093
1124
  }
1094
1125
  // addTable() {
@@ -2170,14 +2201,14 @@ ElTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
2170
2201
  provide: NG_VALUE_ACCESSOR,
2171
2202
  useExisting: forwardRef(() => ElTextEditorComponent),
2172
2203
  multi: true
2173
- }], viewQueries: [{ propertyName: "TextEditor", first: true, predicate: ["textEditor"], descendants: true }, { propertyName: "fullscreen", first: true, predicate: ["fullscreen"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\r\n class=\"container els-text-editor px-0\"\r\n id=\"textEditor\"\r\n #fullscreen=\"ngxFullscreen\"\r\n #textEditor\r\n ngxFullscreen\r\n>\r\n <div\r\n *ngIf=\"toolbarMode === 'fixed'\"\r\n class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\"\r\n role=\"toolbar\"\r\n [style.background]=\"themeModeBgClr()\"\r\n [ngStyle]=\"{\r\n 'pointer-events': disableToolbar ? 'none' : 'auto',\r\n 'border-top-left-radius': IsOpen ? '0' : '20px',\r\n 'border-top-right-radius': IsOpen ? '0' : '20px'\r\n }\"\r\n aria-label=\"Toolbar with button groups\"\r\n style=\"\r\n border-top-left-radius: 20px !important;\r\n border-top-right-radius: 20px !important;\r\n \"\r\n >\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Header Options\"\r\n >\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n [style.border-radius]=\"'5px'\"\r\n id=\"headerDropdown\"\r\n [style.border]=\"themeMode()\"\r\n [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle\r\n >\r\n <span>{{ selectedFormatBlock | titlecase }}</span>\r\n <i class=\"mdi mdi-chevron-down\"></i>\r\n </button>\r\n <div\r\n ngbDropdownMenu\r\n aria-labelledby=\"headerDropdown\"\r\n class=\"els-text-format\"\r\n [style.border]=\"themeMode()\"\r\n >\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h1>')\"\r\n >\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h2>')\"\r\n >\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h3>')\"\r\n >\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h4>')\"\r\n >\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h5>')\"\r\n >\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h6>')\"\r\n >\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<p>')\"\r\n >\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group\"\r\n role=\"group\"\r\n aria-label=\"Font Options\"\r\n >\r\n <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select> -->\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n id=\"headerDropdown\"\r\n style=\"width: 100px\"\r\n [style.border]=\"themeMode()\"\r\n [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle\r\n >\r\n <span\r\n style=\"width: 85px; font-weight: 700 !important\"\r\n class=\"text-truncate\"\r\n >{{ selectedFont | titlecase }}</span\r\n >\r\n <i class=\"mdi mdi-chevron-down\"></i>\r\n </button>\r\n <div\r\n ngbDropdownMenu\r\n aria-labelledby=\"headerDropdown\"\r\n class=\"els-text-format\"\r\n [style.border]=\"themeMode()\"\r\n >\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n *ngFor=\"let font of fonts\"\r\n (click)=\"changeFont(font)\"\r\n [style.color]=\"themeModeClr()\"\r\n >\r\n <span>{{ font }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"py-0\"\r\n style=\"height: fit-content\"\r\n [style.color]=\"themeModeClr()\"\r\n >\r\n <div\r\n class=\"btn-group els-button-group me-2 mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\"\r\n >\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\"\r\n >\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\"\r\n >\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\"\r\n >\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <input\r\n type=\"color\"\r\n id=\"textColorPicker\"\r\n style=\"\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n z-index: 100;\r\n opacity: 0;\r\n \"\r\n (change)=\"setTextColor($event)\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n style=\"position: relative\"\r\n (click)=\"openColorPicker('textColorPicker')\"\r\n >\r\n <i\r\n class=\"mdi mdi-format-color-text icon-with-underline\"\r\n [style.color]=\"selectedTextColor\"\r\n ></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n aria-label=\"Background Color\"\r\n style=\"position: relative\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\"\r\n >\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <input\r\n type=\"color\"\r\n id=\"bgColorPicker\"\r\n style=\"\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n z-index: 100;\r\n opacity: 0;\r\n \"\r\n (change)=\"setBackgroundColor($event)\"\r\n />\r\n </div>\r\n <div\r\n class=\"vertical-line ms-2 border\"\r\n [style.border-left]=\"themeModeClrVerticalLine()\"\r\n ></div>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertOrderedList')\"\r\n >\r\n <i class=\"mdi mdi-format-list-numbered\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"\r\n >\r\n <i class=\"mdi mdi-format-list-bulleted\"></i>\r\n </button>\r\n <div ngbDropdown class=\"ql-align\">\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\"\r\n aria-expanded=\"false\"\r\n ngbDropdownToggle\r\n >\r\n <i class=\"mdi mdi-format-align-left\"></i>\r\n </button>\r\n <div\r\n ngbDropdownMenu\r\n aria-labelledby=\"dropdownBasic1\"\r\n style=\"width: 3px\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyLeft')\"\r\n >\r\n <i class=\"mdi mdi-format-align-left\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyCenter')\"\r\n >\r\n <i class=\"mdi mdi-format-align-center\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyRight')\"\r\n >\r\n <i class=\"mdi mdi-format-align-right\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyFull')\"\r\n >\r\n <i class=\"mdi mdi-format-align-justify\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n <div\r\n class=\"vertical-line ms-2 border\"\r\n [style.border-left]=\"themeModeClrVerticalLine()\"\r\n ></div>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\"\r\n >\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\"\r\n >\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addLink()\"\r\n >\r\n <i class=\"mdi mdi-link-variant\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"insertsImage()\"\r\n >\r\n <i class=\"mdi mdi-image\"></i>\r\n </button>\r\n <input\r\n type=\"file\"\r\n id=\"imageInput\"\r\n style=\"display: none\"\r\n (change)=\"handleImageUpload($event)\"\r\n accept=\"image/*\"\r\n />\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Table Options\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addTable()\"\r\n >\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"\r\n >\r\n <i class=\"mdi mdi-table-row-plus-after\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"\r\n >\r\n <i class=\"mdi mdi-table-row-remove\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"\r\n >\r\n <i class=\"mdi mdi-table-column-plus-after\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"\r\n >\r\n <i class=\"mdi mdi-table-column-remove\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n *ngIf=\"isTableSelected\"\r\n [style.color]=\"tHeadBgColor\"\r\n (click)=\"openColorPicker('tHeadbgColorPicker')\"\r\n >\r\n <i class=\"mdi mdi-table-edit\"></i>\r\n </button>\r\n <input\r\n type=\"color\"\r\n id=\"tHeadbgColorPicker\"\r\n style=\"\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n z-index: 100;\r\n opacity: 0;\r\n \"\r\n (change)=\"setTheadBgColor($event)\"\r\n />\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n <i class=\"mdi mdi-undo\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n <i class=\"mdi mdi-redo\"></i>\r\n </button>\r\n </div> -->\r\n <div\r\n class=\"btn-group els-button-group\"\r\n role=\"group\"\r\n aria-label=\"Table Options\"\r\n >\r\n <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button> -->\r\n <button\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"clearTextEditor()\"\r\n style=\"width: fit-content !important\"\r\n >\r\n <i class=\"mdi mdi-close-circle\"></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group\"\r\n role=\"group\"\r\n aria-label=\"Table Options\"\r\n >\r\n <button\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"toggleFullscreen1()\"\r\n >\r\n <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n <i class=\"mdi mdi-fullscreen-exit\"></i>\r\n <!-- Collapse Icon -->\r\n </ng-container>\r\n <ng-template #fullscreenIcon>\r\n <i class=\"mdi mdi-fullscreen\"></i>\r\n <!-- Expand Icon -->\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"toolbarMode === 'bubble'\"\r\n class=\"bubble-toolbar border p-2\"\r\n [ngStyle]=\"{\r\n 'top.px': toolbarTop,\r\n 'left.px': toolbarLeft,\r\n display: showToolbar ? 'block' : 'none'\r\n }\"\r\n >\r\n <div\r\n class=\"btn-group els-button-group\"\r\n role=\"group\"\r\n aria-label=\"Font Options\"\r\n >\r\n <select\r\n class=\"els-form-select\"\r\n [(ngModel)]=\"selectedFont\"\r\n (change)=\"changeFont($event)\"\r\n >\r\n <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\"\r\n >\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\"\r\n >\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\"\r\n >\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\"\r\n >\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n class=\"mdi mdi-format-quote-close\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n class=\"mdi mdi-code-tags\"></i></button>\r\n </div> -->\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertOrderedList')\"\r\n >\r\n <i class=\"mdi mdi-format-list-numbered\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"\r\n >\r\n <i class=\"mdi mdi-format-list-bulleted\"></i>\r\n </button>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <!-- <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-color-fill\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n (change)=\"logEvent($event, 'change')\"\r\n (input)=\"logEvent($event, 'input')\"\r\n >\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n [style]=\"{color: color}\"></i>\r\n <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n </div> -->\r\n <input\r\n type=\"color\"\r\n id=\"textColorPicker\"\r\n style=\"\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n z-index: 100;\r\n opacity: 0;\r\n \"\r\n (change)=\"setTextColor($event)\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n style=\"position: relative\"\r\n (click)=\"openColorPicker('textColorPicker')\"\r\n >\r\n <i\r\n class=\"mdi mdi-format-color-text icon-with-underline\"\r\n [style.color]=\"selectedTextColor\"\r\n ></i>\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n </div> -->\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n aria-label=\"Background Color\"\r\n style=\"position: relative\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\"\r\n >\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n <input\r\n type=\"color\"\r\n id=\"bgColorPicker\"\r\n style=\"\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n z-index: 100;\r\n opacity: 0;\r\n \"\r\n (change)=\"setBackgroundColor($event)\"\r\n />\r\n </div>\r\n\r\n <!-- </div> -->\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"mdi mdi-format-header-1\"></i>\r\n </button>\r\n <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n </div>\r\n </div>\r\n </div> -->\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Header Options\"\r\n >\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\"\r\n id=\"headerDropdown\"\r\n ngbDropdownToggle\r\n >\r\n <span style=\"width: 85px\">{{ selectedFormatBlock | titlecase }}</span>\r\n <i class=\"mdi mdi-chevron-down text-dark\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h1>')\"\r\n >\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h2>')\"\r\n >\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h3>')\"\r\n >\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h4>')\"\r\n >\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h5>')\"\r\n >\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h6>')\"\r\n >\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<p>')\"\r\n >\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n class=\"mdi mdi-format-superscript\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n class=\"mdi mdi-format-subscript\"></i></button> -->\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\"\r\n >\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\"\r\n >\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <div ngbDropdown class=\"ql-align\">\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\"\r\n aria-expanded=\"false\"\r\n ngbDropdownToggle\r\n >\r\n <i class=\"mdi mdi-format-align-left\"></i>\r\n </button>\r\n <div\r\n ngbDropdownMenu\r\n aria-labelledby=\"dropdownBasic1\"\r\n style=\"width: 3px\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('justifyLeft')\"\r\n >\r\n <i class=\"mdi mdi-format-align-left\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('justifyCenter')\"\r\n >\r\n <i class=\"mdi mdi-format-align-center\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('justifyRight')\"\r\n >\r\n <i class=\"mdi mdi-format-align-right\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('justifyFull')\"\r\n >\r\n <i class=\"mdi mdi-format-align-justify\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('removeFormat')\"\r\n >\r\n <i class=\"mdi mdi-format-clear\"></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addLink()\"\r\n >\r\n <i class=\"mdi mdi-link-variant\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"insertsImage()\"\r\n >\r\n <i class=\"mdi mdi-image\"></i>\r\n </button>\r\n <input\r\n type=\"file\"\r\n id=\"imageInput\"\r\n style=\"display: none\"\r\n (change)=\"handleImageUpload($event)\"\r\n accept=\"image/*\"\r\n />\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Table Options\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addTable()\"\r\n >\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"\r\n >\r\n <i class=\"mdi mdi-table-row-plus-after\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"\r\n >\r\n <i class=\"mdi mdi-table-row-remove\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"\r\n >\r\n <i class=\"mdi mdi-table-column-plus-after\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"\r\n >\r\n <i class=\"mdi mdi-table-column-remove\"></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Table Options\"\r\n >\r\n <button\r\n *ngIf=\"selectedImage\"\r\n class=\"btn btn-white els-toolbar-button-2\"\r\n (click)=\"editImage()\"\r\n style=\"position: absolute\"\r\n >\r\n Edit Image\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n </div> -->\r\n <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle (click)=\"addTable()\">\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n \r\n <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"tableWidth\">Table Width</label>\r\n <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellWidth\">Cell Width</label>\r\n <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellHeight\">Cell Height</label>\r\n <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n placeholder=\"Height\">\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n [style.min-height]=\"IsOpen ? '85vh !important' : '405px !important'\"\r\n (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important;\r\n \" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n \r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n }\"\r\n [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <div\r\n [attr.contenteditable]=\"contentEditable\"\r\n id=\"editor\"\r\n class=\"p-3 custom-scrollbar non-focus overflow-auto\"\r\n #editor\r\n style=\"position: relative !important; overflow: auto\"\r\n [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{\r\n 'font-family': selectedFont,\r\n 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': IsOpen ? '0' : '20px',\r\n 'border-bottom-right-radius': IsOpen ? '0' : '20px',\r\n 'min-height': IsOpen ? '93vh' : '405px',\r\n 'max-height': IsOpen ? '93vh' : '405px'\r\n }\"\r\n placeholder=\"Insert text here ...\"\r\n readonly\r\n (mouseup)=\"onTextSelect($event)\"\r\n (input)=\"onModelChange($event)\"\r\n [innerHTML]=\"sanitizedContent\"\r\n (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\"\r\n (keydown)=\"handleTabKey($event)\"\r\n ></div>\r\n\r\n <table *ngIf=\"parsedTable\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of parsedTable.rows\">\r\n <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";*{font-family:Noto Sans Telugu UI,sans-serif}#editor{position:relative!important;overflow:auto;max-height:405px;min-height:405px;padding:16px;box-sizing:border-box}#editor.open{max-height:93vh;border-bottom-left-radius:0;border-bottom-right-radius:0}#editor:focus{outline:none!important;border-color:transparent!important}#editor img{max-width:100%;height:auto}.bubble-toolbar{position:absolute;background-color:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 2px 5px #00000026;z-index:1000;display:none}.els-text-editor{box-sizing:border-box}.els-btn-toolbar{width:\"1028px\"}.els-toolbar-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.els-toolbar-button-2{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:100px;color:#fff}.els-toolbar-button-2 :hover{color:#555!important}.els-toolbar-dropdown-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px}.els-toolbar-dropdown-button:focus{outline:none}.els-form-select{cursor:pointer;display:inline-block;height:80%;padding-left:8px;padding-right:5px;position:relative;width:100%;color:#000}.els-button-group{margin-right:15px}.els-form-select:focus{outline:none}.els-border{border:#ccc}.els-border:focus{outline:none}.els-dropdown-item{width:50px!important}.els-toolbar-button.active,.btn-toolbar .btn.active,.btn-toolbar .btn:hover{color:#06c}.dropdown-toggle:after{display:none}.table-container{overflow-x:auto;width:100%}table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent;border-collapse:collapse;table-layout:fixed}table td,table th{padding:.75rem;vertical-align:top;border:1px solid #dee2e6;word-wrap:break-word}@media (max-width: 576px){table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;border-spacing:0}table thead,table tbody,table tr,table th,table td{display:block}table thead tr{position:absolute;top:-9999px;left:-9999px}table tr{margin-bottom:.625rem;border:1px solid #ccc}table td,table th{border:none;border-bottom:1px solid #ddd;position:relative;padding-left:50%;white-space:normal;text-align:left}table td:before,table th:before{position:absolute;top:.75rem;left:.75rem;width:45%;padding-right:.75rem;white-space:nowrap;text-align:left;font-weight:700}}table.resizable{overflow:hidden;resize:both}.btn-group .btn{display:flex;align-items:center;justify-content:center}.btn-group .mdi{font-size:18px}.icon-with-underline{text-decoration:underline}pre{background-color:#f0f0f0;border:1px solid #ccc;border-radius:5px;overflow-x:auto}code{display:block;white-space:pre-wrap;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:14px}.parent-container{height:100%;overflow:visible}.custom-scrollbar::-webkit-scrollbar{width:4px}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:#888;border-radius:10px;cursor:pointer}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#555}.custom-scrollbar::-webkit-scrollbar-track{background:transparent;border-radius:10px}.pasted-table{border-collapse:collapse;width:100%}.pasted-table td{border:1px solid black;padding:8px}.pasted-table tr:nth-child(even){background-color:#f2f2f2}.pasted-table tr:hover{background-color:#ddd}.vertical-line{height:28px;margin:0 auto}.image-edit-button{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;background-color:#fff!important;border:2px solid #fff!important;padding:10px!important;color:#313a46!important;z-index:1000!important;-webkit-user-select:none!important;user-select:none!important;opacity:.5!important;cursor:default!important;transition:none!important;animation:none!important;pointer-events:none!important}.image-edit-button:hover{background-color:#f0f0f0}img{position:relative}.els-text-format{font-weight:800!important}.els-text-format>button{color:#000!important}.els-text-format>button:hover{background-color:#7d6d6d!important;color:#fff!important}.fullscreen-editor{width:100vw!important;height:100vh!important;position:fixed;top:0;left:0;z-index:999;background-color:#fff;border:none;border-radius:0;padding:0!important}\n"], directives: [{ type: i3.NgxFullscreenDirective, selector: "[ngxFullscreen]", inputs: ["ngxFullscreen"], outputs: ["transition", "errors"], exportAs: ["ngxFullscreen"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i5.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i5.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], pipes: { "titlecase": i4.TitleCasePipe } });
2204
+ }], viewQueries: [{ propertyName: "TextEditor", first: true, predicate: ["textEditor"], descendants: true }, { propertyName: "fullscreen", first: true, predicate: ["fullscreen"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container els-text-editor px-0\" id=\"textEditor\" #fullscreen=\"ngxFullscreen\"\r\n #textEditor\r\n ngxFullscreen>\r\n <div *ngIf=\"toolbarMode === 'fixed'\" class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\" role=\"toolbar\" [style.background]=\"themeModeBgClr()\"\r\n [ngStyle]=\"{\r\n 'pointer-events': disableToolbar ? 'none' : 'auto',\r\n 'border-top-left-radius': IsOpen ? '0' : '20px',\r\n 'border-top-right-radius': IsOpen ? '0' : '20px'\r\n}\"\r\naria-label=\"Toolbar with button groups\"\r\nstyle=\"border-top-left-radius: 20px !important; border-top-right-radius: 20px !important;\"\r\n>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\" [style.border-radius]=\"'5px'\"\r\n id=\"headerDropdown\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\" ngbDropdownToggle>\r\n <span>{{selectedFormatBlock | titlecase}}</span> <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select> -->\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n id=\"headerDropdown\" style=\"width: 100px\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px; font-weight: 700 !important;\" class=\"text-truncate\">{{selectedFont |\r\n titlecase}}</span>\r\n <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" *ngFor=\"let font of fonts\"\r\n (click)=\"changeFont(font)\" [style.color]=\"themeModeClr()\">\r\n <span>{{ font }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"py-0\" style=\"height: fit-content;\" [style.color]=\"themeModeClr()\">\r\n <div class=\"btn-group els-button-group me-2 mr-2 \" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"><i class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyLeft')\"><i class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyCenter')\"><i class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyRight')\"><i class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyFull')\"><i class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"><i class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n <button \r\n \r\n type=\"button\" \r\n class=\"btn btn-white els-toolbar-button\" \r\n *ngIf=\"isTableSelected\" \r\n [style.color]=\"tHeadBgColor\" \r\n (click)=\"openColorPicker('tHeadbgColorPicker')\" \r\n > \r\n <i class=\"mdi mdi-table-edit\"></i> \r\n </button> \r\n <input \r\n type=\"color\" \r\n id=\"tHeadbgColorPicker\" \r\n style=\" \r\n position: absolute; \r\n top: 100%; \r\n left: 0; \r\n z-index: 100; \r\n opacity: 0; \r\n \" \r\n (change)=\"setTheadBgColor($event)\" \r\n />\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n <i class=\"mdi mdi-undo\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n <i class=\"mdi mdi-redo\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button> -->\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"clearTextEditor()\"\r\n style=\" width: fit-content !important;\">\r\n <i class=\"mdi mdi-close-circle\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"toggleFullscreen1()\">\r\n <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n <i class=\"mdi mdi-fullscreen-exit\"></i> <!-- Collapse Icon -->\r\n </ng-container>\r\n <ng-template #fullscreenIcon>\r\n <i class=\"mdi mdi-fullscreen\"></i> <!-- Expand Icon -->\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"toolbarMode === 'bubble'\" class=\"bubble-toolbar border p-2\"\r\n [ngStyle]=\"{'top.px': toolbarTop, 'left.px': toolbarLeft, 'display': showToolbar ? 'block' : 'none'}\">\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <select class=\"els-form-select\" [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n class=\"mdi mdi-format-quote-close\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n class=\"mdi mdi-code-tags\"></i></button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertUnorderedList')\"><i\r\n class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <!-- <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-color-fill\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n (change)=\"logEvent($event, 'change')\"\r\n (input)=\"logEvent($event, 'input')\"\r\n >\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n [style]=\"{color: color}\"></i>\r\n <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n </div> -->\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n\r\n\r\n <!-- </div> -->\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"mdi mdi-format-header-1\"></i>\r\n </button>\r\n <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n </div>\r\n </div>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\" id=\"headerDropdown\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px;\">{{selectedFormatBlock | titlecase}}</span> <i\r\n class=\"mdi mdi-chevron-down text-dark\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n class=\"mdi mdi-format-superscript\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n class=\"mdi mdi-format-subscript\"></i></button> -->\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyLeft')\"><i\r\n class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyCenter')\"><i\r\n class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyRight')\"><i\r\n class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyFull')\"><i\r\n class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('removeFormat')\"><i\r\n class=\"mdi mdi-format-clear\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addRow()\"><i\r\n class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n </div> -->\r\n <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle (click)=\"addTable()\">\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n \r\n <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"tableWidth\">Table Width</label>\r\n <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellWidth\">Cell Width</label>\r\n <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellHeight\">Cell Height</label>\r\n <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n placeholder=\"Height\">\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n [style.min-height]=\"IsOpen ? '85vh !important' : '405px !important'\"\r\n (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important;\r\n \" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n \r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n }\"\r\n [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <div [attr.contenteditable]=\"contentEditable\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important; overflow: auto;\" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\" [ngStyle]=\"{\r\n 'font-family': selectedFont, \r\n 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': IsOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': IsOpen ? '0' :'20px',\r\n 'min-height': IsOpen ? '93vh' : '405px',\r\n 'max-height': IsOpen ? '93vh' : '405px'\r\n }\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n (input)=\"onModelChange($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\" (keydown)=\"handleTabKey($event)\">\r\n </div>\r\n\r\n <table *ngIf=\"parsedTable\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of parsedTable.rows\">\r\n <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n</div>", styles: ["@charset \"UTF-8\";*{font-family:Noto Sans Telugu UI,sans-serif}#editor{position:relative!important;overflow:auto;max-height:405px;min-height:405px;padding:16px;box-sizing:border-box}#editor.open{max-height:93vh;border-bottom-left-radius:0;border-bottom-right-radius:0}#editor:focus{outline:none!important;border-color:transparent!important}#editor img{max-width:100%;height:auto}.bubble-toolbar{position:absolute;background-color:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 2px 5px #00000026;z-index:1000;display:none}.els-text-editor{box-sizing:border-box}.els-btn-toolbar{width:\"1028px\"}.els-toolbar-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.els-toolbar-button-2{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:100px;color:#fff}.els-toolbar-button-2 :hover{color:#555!important}.els-toolbar-dropdown-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px}.els-toolbar-dropdown-button:focus{outline:none}.els-form-select{cursor:pointer;display:inline-block;height:80%;padding-left:8px;padding-right:5px;position:relative;width:100%;color:#000}.els-button-group{margin-right:15px}.els-form-select:focus{outline:none}.els-border{border:#ccc}.els-border:focus{outline:none}.els-dropdown-item{width:50px!important}.els-toolbar-button.active,.btn-toolbar .btn.active,.btn-toolbar .btn:hover{color:#06c}.dropdown-toggle:after{display:none}.table-container{overflow-x:auto;width:100%}table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent;border-collapse:collapse;table-layout:fixed}table td,table th{padding:.75rem;vertical-align:top;border:1px solid #dee2e6;word-wrap:break-word}@media (max-width: 576px){table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;border-spacing:0}table thead,table tbody,table tr,table th,table td{display:block}table thead tr{position:absolute;top:-9999px;left:-9999px}table tr{margin-bottom:.625rem;border:1px solid #ccc}table td,table th{border:none;border-bottom:1px solid #ddd;position:relative;padding-left:50%;white-space:normal;text-align:left}table td:before,table th:before{position:absolute;top:.75rem;left:.75rem;width:45%;padding-right:.75rem;white-space:nowrap;text-align:left;font-weight:700}}table.resizable{overflow:hidden;resize:both}.btn-group .btn{display:flex;align-items:center;justify-content:center}.btn-group .mdi{font-size:18px}.icon-with-underline{text-decoration:underline}pre{background-color:#f0f0f0;border:1px solid #ccc;border-radius:5px;overflow-x:auto}code{display:block;white-space:pre-wrap;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:14px}.parent-container{height:100%;overflow:visible}.custom-scrollbar::-webkit-scrollbar{width:4px}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:#888;border-radius:10px;cursor:pointer}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#555}.custom-scrollbar::-webkit-scrollbar-track{background:transparent;border-radius:10px}.pasted-table{border-collapse:collapse;width:100%}.pasted-table td{border:1px solid black;padding:8px}.pasted-table tr:nth-child(even){background-color:#f2f2f2}.pasted-table tr:hover{background-color:#ddd}.vertical-line{height:28px;margin:0 auto}.image-edit-button{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;background-color:#fff!important;border:2px solid #fff!important;padding:10px!important;color:#313a46!important;z-index:1000!important;-webkit-user-select:none!important;user-select:none!important;opacity:.5!important;cursor:default!important;transition:none!important;animation:none!important;pointer-events:none!important}.image-edit-button:hover{background-color:#f0f0f0}img{position:relative}.els-text-format{font-weight:800!important}.els-text-format>button{color:#000!important}.els-text-format>button:hover{background-color:#7d6d6d!important;color:#fff!important}.fullscreen-editor{width:100vw!important;height:100vh!important;position:fixed;top:0;left:0;z-index:999;background-color:#fff;border:none;border-radius:0;padding:0!important}\n"], directives: [{ type: i3.NgxFullscreenDirective, selector: "[ngxFullscreen]", inputs: ["ngxFullscreen"], outputs: ["transition", "errors"], exportAs: ["ngxFullscreen"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i5.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i5.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i5.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], pipes: { "titlecase": i4.TitleCasePipe } });
2174
2205
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ElTextEditorComponent, decorators: [{
2175
2206
  type: Component,
2176
2207
  args: [{ selector: 'text-editor', providers: [{
2177
2208
  provide: NG_VALUE_ACCESSOR,
2178
2209
  useExisting: forwardRef(() => ElTextEditorComponent),
2179
2210
  multi: true
2180
- }], template: "<div\r\n class=\"container els-text-editor px-0\"\r\n id=\"textEditor\"\r\n #fullscreen=\"ngxFullscreen\"\r\n #textEditor\r\n ngxFullscreen\r\n>\r\n <div\r\n *ngIf=\"toolbarMode === 'fixed'\"\r\n class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\"\r\n role=\"toolbar\"\r\n [style.background]=\"themeModeBgClr()\"\r\n [ngStyle]=\"{\r\n 'pointer-events': disableToolbar ? 'none' : 'auto',\r\n 'border-top-left-radius': IsOpen ? '0' : '20px',\r\n 'border-top-right-radius': IsOpen ? '0' : '20px'\r\n }\"\r\n aria-label=\"Toolbar with button groups\"\r\n style=\"\r\n border-top-left-radius: 20px !important;\r\n border-top-right-radius: 20px !important;\r\n \"\r\n >\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Header Options\"\r\n >\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n [style.border-radius]=\"'5px'\"\r\n id=\"headerDropdown\"\r\n [style.border]=\"themeMode()\"\r\n [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle\r\n >\r\n <span>{{ selectedFormatBlock | titlecase }}</span>\r\n <i class=\"mdi mdi-chevron-down\"></i>\r\n </button>\r\n <div\r\n ngbDropdownMenu\r\n aria-labelledby=\"headerDropdown\"\r\n class=\"els-text-format\"\r\n [style.border]=\"themeMode()\"\r\n >\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h1>')\"\r\n >\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h2>')\"\r\n >\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h3>')\"\r\n >\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h4>')\"\r\n >\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h5>')\"\r\n >\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h6>')\"\r\n >\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<p>')\"\r\n >\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group\"\r\n role=\"group\"\r\n aria-label=\"Font Options\"\r\n >\r\n <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select> -->\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n id=\"headerDropdown\"\r\n style=\"width: 100px\"\r\n [style.border]=\"themeMode()\"\r\n [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle\r\n >\r\n <span\r\n style=\"width: 85px; font-weight: 700 !important\"\r\n class=\"text-truncate\"\r\n >{{ selectedFont | titlecase }}</span\r\n >\r\n <i class=\"mdi mdi-chevron-down\"></i>\r\n </button>\r\n <div\r\n ngbDropdownMenu\r\n aria-labelledby=\"headerDropdown\"\r\n class=\"els-text-format\"\r\n [style.border]=\"themeMode()\"\r\n >\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n *ngFor=\"let font of fonts\"\r\n (click)=\"changeFont(font)\"\r\n [style.color]=\"themeModeClr()\"\r\n >\r\n <span>{{ font }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"py-0\"\r\n style=\"height: fit-content\"\r\n [style.color]=\"themeModeClr()\"\r\n >\r\n <div\r\n class=\"btn-group els-button-group me-2 mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\"\r\n >\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\"\r\n >\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\"\r\n >\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\"\r\n >\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <input\r\n type=\"color\"\r\n id=\"textColorPicker\"\r\n style=\"\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n z-index: 100;\r\n opacity: 0;\r\n \"\r\n (change)=\"setTextColor($event)\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n style=\"position: relative\"\r\n (click)=\"openColorPicker('textColorPicker')\"\r\n >\r\n <i\r\n class=\"mdi mdi-format-color-text icon-with-underline\"\r\n [style.color]=\"selectedTextColor\"\r\n ></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n aria-label=\"Background Color\"\r\n style=\"position: relative\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\"\r\n >\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <input\r\n type=\"color\"\r\n id=\"bgColorPicker\"\r\n style=\"\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n z-index: 100;\r\n opacity: 0;\r\n \"\r\n (change)=\"setBackgroundColor($event)\"\r\n />\r\n </div>\r\n <div\r\n class=\"vertical-line ms-2 border\"\r\n [style.border-left]=\"themeModeClrVerticalLine()\"\r\n ></div>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertOrderedList')\"\r\n >\r\n <i class=\"mdi mdi-format-list-numbered\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"\r\n >\r\n <i class=\"mdi mdi-format-list-bulleted\"></i>\r\n </button>\r\n <div ngbDropdown class=\"ql-align\">\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\"\r\n aria-expanded=\"false\"\r\n ngbDropdownToggle\r\n >\r\n <i class=\"mdi mdi-format-align-left\"></i>\r\n </button>\r\n <div\r\n ngbDropdownMenu\r\n aria-labelledby=\"dropdownBasic1\"\r\n style=\"width: 3px\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyLeft')\"\r\n >\r\n <i class=\"mdi mdi-format-align-left\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyCenter')\"\r\n >\r\n <i class=\"mdi mdi-format-align-center\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyRight')\"\r\n >\r\n <i class=\"mdi mdi-format-align-right\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyFull')\"\r\n >\r\n <i class=\"mdi mdi-format-align-justify\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n <div\r\n class=\"vertical-line ms-2 border\"\r\n [style.border-left]=\"themeModeClrVerticalLine()\"\r\n ></div>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\"\r\n >\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\"\r\n >\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addLink()\"\r\n >\r\n <i class=\"mdi mdi-link-variant\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"insertsImage()\"\r\n >\r\n <i class=\"mdi mdi-image\"></i>\r\n </button>\r\n <input\r\n type=\"file\"\r\n id=\"imageInput\"\r\n style=\"display: none\"\r\n (change)=\"handleImageUpload($event)\"\r\n accept=\"image/*\"\r\n />\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Table Options\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addTable()\"\r\n >\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"\r\n >\r\n <i class=\"mdi mdi-table-row-plus-after\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"\r\n >\r\n <i class=\"mdi mdi-table-row-remove\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"\r\n >\r\n <i class=\"mdi mdi-table-column-plus-after\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"\r\n >\r\n <i class=\"mdi mdi-table-column-remove\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n *ngIf=\"isTableSelected\"\r\n [style.color]=\"tHeadBgColor\"\r\n (click)=\"openColorPicker('tHeadbgColorPicker')\"\r\n >\r\n <i class=\"mdi mdi-table-edit\"></i>\r\n </button>\r\n <input\r\n type=\"color\"\r\n id=\"tHeadbgColorPicker\"\r\n style=\"\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n z-index: 100;\r\n opacity: 0;\r\n \"\r\n (change)=\"setTheadBgColor($event)\"\r\n />\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n <i class=\"mdi mdi-undo\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n <i class=\"mdi mdi-redo\"></i>\r\n </button>\r\n </div> -->\r\n <div\r\n class=\"btn-group els-button-group\"\r\n role=\"group\"\r\n aria-label=\"Table Options\"\r\n >\r\n <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button> -->\r\n <button\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"clearTextEditor()\"\r\n style=\"width: fit-content !important\"\r\n >\r\n <i class=\"mdi mdi-close-circle\"></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group\"\r\n role=\"group\"\r\n aria-label=\"Table Options\"\r\n >\r\n <button\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"toggleFullscreen1()\"\r\n >\r\n <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n <i class=\"mdi mdi-fullscreen-exit\"></i>\r\n <!-- Collapse Icon -->\r\n </ng-container>\r\n <ng-template #fullscreenIcon>\r\n <i class=\"mdi mdi-fullscreen\"></i>\r\n <!-- Expand Icon -->\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n *ngIf=\"toolbarMode === 'bubble'\"\r\n class=\"bubble-toolbar border p-2\"\r\n [ngStyle]=\"{\r\n 'top.px': toolbarTop,\r\n 'left.px': toolbarLeft,\r\n display: showToolbar ? 'block' : 'none'\r\n }\"\r\n >\r\n <div\r\n class=\"btn-group els-button-group\"\r\n role=\"group\"\r\n aria-label=\"Font Options\"\r\n >\r\n <select\r\n class=\"els-form-select\"\r\n [(ngModel)]=\"selectedFont\"\r\n (change)=\"changeFont($event)\"\r\n >\r\n <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\"\r\n >\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\"\r\n >\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\"\r\n >\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\"\r\n >\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n class=\"mdi mdi-format-quote-close\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n class=\"mdi mdi-code-tags\"></i></button>\r\n </div> -->\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertOrderedList')\"\r\n >\r\n <i class=\"mdi mdi-format-list-numbered\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"\r\n >\r\n <i class=\"mdi mdi-format-list-bulleted\"></i>\r\n </button>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <!-- <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-color-fill\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n (change)=\"logEvent($event, 'change')\"\r\n (input)=\"logEvent($event, 'input')\"\r\n >\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n [style]=\"{color: color}\"></i>\r\n <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n </div> -->\r\n <input\r\n type=\"color\"\r\n id=\"textColorPicker\"\r\n style=\"\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n z-index: 100;\r\n opacity: 0;\r\n \"\r\n (change)=\"setTextColor($event)\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n style=\"position: relative\"\r\n (click)=\"openColorPicker('textColorPicker')\"\r\n >\r\n <i\r\n class=\"mdi mdi-format-color-text icon-with-underline\"\r\n [style.color]=\"selectedTextColor\"\r\n ></i>\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n </div> -->\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n aria-label=\"Background Color\"\r\n style=\"position: relative\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\"\r\n >\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n <input\r\n type=\"color\"\r\n id=\"bgColorPicker\"\r\n style=\"\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n z-index: 100;\r\n opacity: 0;\r\n \"\r\n (change)=\"setBackgroundColor($event)\"\r\n />\r\n </div>\r\n\r\n <!-- </div> -->\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"mdi mdi-format-header-1\"></i>\r\n </button>\r\n <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n </div>\r\n </div>\r\n </div> -->\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Header Options\"\r\n >\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\"\r\n id=\"headerDropdown\"\r\n ngbDropdownToggle\r\n >\r\n <span style=\"width: 85px\">{{ selectedFormatBlock | titlecase }}</span>\r\n <i class=\"mdi mdi-chevron-down text-dark\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h1>')\"\r\n >\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h2>')\"\r\n >\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h3>')\"\r\n >\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h4>')\"\r\n >\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h5>')\"\r\n >\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<h6>')\"\r\n >\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button\r\n class=\"dropdown-item pb-0\"\r\n type=\"button\"\r\n (click)=\"format('formatBlock', '<p>')\"\r\n >\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n class=\"mdi mdi-format-superscript\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n class=\"mdi mdi-format-subscript\"></i></button> -->\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\"\r\n >\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\"\r\n >\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <div ngbDropdown class=\"ql-align\">\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\"\r\n aria-expanded=\"false\"\r\n ngbDropdownToggle\r\n >\r\n <i class=\"mdi mdi-format-align-left\"></i>\r\n </button>\r\n <div\r\n ngbDropdownMenu\r\n aria-labelledby=\"dropdownBasic1\"\r\n style=\"width: 3px\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('justifyLeft')\"\r\n >\r\n <i class=\"mdi mdi-format-align-left\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('justifyCenter')\"\r\n >\r\n <i class=\"mdi mdi-format-align-center\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('justifyRight')\"\r\n >\r\n <i class=\"mdi mdi-format-align-right\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('justifyFull')\"\r\n >\r\n <i class=\"mdi mdi-format-align-justify\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('removeFormat')\"\r\n >\r\n <i class=\"mdi mdi-format-clear\"></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Text Formatting\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addLink()\"\r\n >\r\n <i class=\"mdi mdi-link-variant\"></i>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"insertsImage()\"\r\n >\r\n <i class=\"mdi mdi-image\"></i>\r\n </button>\r\n <input\r\n type=\"file\"\r\n id=\"imageInput\"\r\n style=\"display: none\"\r\n (change)=\"handleImageUpload($event)\"\r\n accept=\"image/*\"\r\n />\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Table Options\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addTable()\"\r\n >\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"\r\n >\r\n <i class=\"mdi mdi-table-row-plus-after\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"\r\n >\r\n <i class=\"mdi mdi-table-row-remove\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"\r\n >\r\n <i class=\"mdi mdi-table-column-plus-after\"></i>\r\n </button>\r\n <button\r\n *ngIf=\"isTableSelected\"\r\n type=\"button\"\r\n class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"\r\n >\r\n <i class=\"mdi mdi-table-column-remove\"></i>\r\n </button>\r\n </div>\r\n <div\r\n class=\"btn-group els-button-group mr-2\"\r\n role=\"group\"\r\n aria-label=\"Table Options\"\r\n >\r\n <button\r\n *ngIf=\"selectedImage\"\r\n class=\"btn btn-white els-toolbar-button-2\"\r\n (click)=\"editImage()\"\r\n style=\"position: absolute\"\r\n >\r\n Edit Image\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n </div> -->\r\n <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle (click)=\"addTable()\">\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n \r\n <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"tableWidth\">Table Width</label>\r\n <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellWidth\">Cell Width</label>\r\n <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellHeight\">Cell Height</label>\r\n <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n placeholder=\"Height\">\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n [style.min-height]=\"IsOpen ? '85vh !important' : '405px !important'\"\r\n (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important;\r\n \" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n \r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n }\"\r\n [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <div\r\n [attr.contenteditable]=\"contentEditable\"\r\n id=\"editor\"\r\n class=\"p-3 custom-scrollbar non-focus overflow-auto\"\r\n #editor\r\n style=\"position: relative !important; overflow: auto\"\r\n [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{\r\n 'font-family': selectedFont,\r\n 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': IsOpen ? '0' : '20px',\r\n 'border-bottom-right-radius': IsOpen ? '0' : '20px',\r\n 'min-height': IsOpen ? '93vh' : '405px',\r\n 'max-height': IsOpen ? '93vh' : '405px'\r\n }\"\r\n placeholder=\"Insert text here ...\"\r\n readonly\r\n (mouseup)=\"onTextSelect($event)\"\r\n (input)=\"onModelChange($event)\"\r\n [innerHTML]=\"sanitizedContent\"\r\n (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\"\r\n (keydown)=\"handleTabKey($event)\"\r\n ></div>\r\n\r\n <table *ngIf=\"parsedTable\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of parsedTable.rows\">\r\n <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";*{font-family:Noto Sans Telugu UI,sans-serif}#editor{position:relative!important;overflow:auto;max-height:405px;min-height:405px;padding:16px;box-sizing:border-box}#editor.open{max-height:93vh;border-bottom-left-radius:0;border-bottom-right-radius:0}#editor:focus{outline:none!important;border-color:transparent!important}#editor img{max-width:100%;height:auto}.bubble-toolbar{position:absolute;background-color:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 2px 5px #00000026;z-index:1000;display:none}.els-text-editor{box-sizing:border-box}.els-btn-toolbar{width:\"1028px\"}.els-toolbar-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.els-toolbar-button-2{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:100px;color:#fff}.els-toolbar-button-2 :hover{color:#555!important}.els-toolbar-dropdown-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px}.els-toolbar-dropdown-button:focus{outline:none}.els-form-select{cursor:pointer;display:inline-block;height:80%;padding-left:8px;padding-right:5px;position:relative;width:100%;color:#000}.els-button-group{margin-right:15px}.els-form-select:focus{outline:none}.els-border{border:#ccc}.els-border:focus{outline:none}.els-dropdown-item{width:50px!important}.els-toolbar-button.active,.btn-toolbar .btn.active,.btn-toolbar .btn:hover{color:#06c}.dropdown-toggle:after{display:none}.table-container{overflow-x:auto;width:100%}table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent;border-collapse:collapse;table-layout:fixed}table td,table th{padding:.75rem;vertical-align:top;border:1px solid #dee2e6;word-wrap:break-word}@media (max-width: 576px){table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;border-spacing:0}table thead,table tbody,table tr,table th,table td{display:block}table thead tr{position:absolute;top:-9999px;left:-9999px}table tr{margin-bottom:.625rem;border:1px solid #ccc}table td,table th{border:none;border-bottom:1px solid #ddd;position:relative;padding-left:50%;white-space:normal;text-align:left}table td:before,table th:before{position:absolute;top:.75rem;left:.75rem;width:45%;padding-right:.75rem;white-space:nowrap;text-align:left;font-weight:700}}table.resizable{overflow:hidden;resize:both}.btn-group .btn{display:flex;align-items:center;justify-content:center}.btn-group .mdi{font-size:18px}.icon-with-underline{text-decoration:underline}pre{background-color:#f0f0f0;border:1px solid #ccc;border-radius:5px;overflow-x:auto}code{display:block;white-space:pre-wrap;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:14px}.parent-container{height:100%;overflow:visible}.custom-scrollbar::-webkit-scrollbar{width:4px}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:#888;border-radius:10px;cursor:pointer}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#555}.custom-scrollbar::-webkit-scrollbar-track{background:transparent;border-radius:10px}.pasted-table{border-collapse:collapse;width:100%}.pasted-table td{border:1px solid black;padding:8px}.pasted-table tr:nth-child(even){background-color:#f2f2f2}.pasted-table tr:hover{background-color:#ddd}.vertical-line{height:28px;margin:0 auto}.image-edit-button{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;background-color:#fff!important;border:2px solid #fff!important;padding:10px!important;color:#313a46!important;z-index:1000!important;-webkit-user-select:none!important;user-select:none!important;opacity:.5!important;cursor:default!important;transition:none!important;animation:none!important;pointer-events:none!important}.image-edit-button:hover{background-color:#f0f0f0}img{position:relative}.els-text-format{font-weight:800!important}.els-text-format>button{color:#000!important}.els-text-format>button:hover{background-color:#7d6d6d!important;color:#fff!important}.fullscreen-editor{width:100vw!important;height:100vh!important;position:fixed;top:0;left:0;z-index:999;background-color:#fff;border:none;border-radius:0;padding:0!important}\n"] }]
2211
+ }], template: "<div class=\"container els-text-editor px-0\" id=\"textEditor\" #fullscreen=\"ngxFullscreen\"\r\n #textEditor\r\n ngxFullscreen>\r\n <div *ngIf=\"toolbarMode === 'fixed'\" class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\" role=\"toolbar\" [style.background]=\"themeModeBgClr()\"\r\n [ngStyle]=\"{\r\n 'pointer-events': disableToolbar ? 'none' : 'auto',\r\n 'border-top-left-radius': IsOpen ? '0' : '20px',\r\n 'border-top-right-radius': IsOpen ? '0' : '20px'\r\n}\"\r\naria-label=\"Toolbar with button groups\"\r\nstyle=\"border-top-left-radius: 20px !important; border-top-right-radius: 20px !important;\"\r\n>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\" [style.border-radius]=\"'5px'\"\r\n id=\"headerDropdown\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\" ngbDropdownToggle>\r\n <span>{{selectedFormatBlock | titlecase}}</span> <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select> -->\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n id=\"headerDropdown\" style=\"width: 100px\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px; font-weight: 700 !important;\" class=\"text-truncate\">{{selectedFont |\r\n titlecase}}</span>\r\n <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" *ngFor=\"let font of fonts\"\r\n (click)=\"changeFont(font)\" [style.color]=\"themeModeClr()\">\r\n <span>{{ font }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"py-0\" style=\"height: fit-content;\" [style.color]=\"themeModeClr()\">\r\n <div class=\"btn-group els-button-group me-2 mr-2 \" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"><i class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyLeft')\"><i class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyCenter')\"><i class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyRight')\"><i class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyFull')\"><i class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"><i class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n <button \r\n \r\n type=\"button\" \r\n class=\"btn btn-white els-toolbar-button\" \r\n *ngIf=\"isTableSelected\" \r\n [style.color]=\"tHeadBgColor\" \r\n (click)=\"openColorPicker('tHeadbgColorPicker')\" \r\n > \r\n <i class=\"mdi mdi-table-edit\"></i> \r\n </button> \r\n <input \r\n type=\"color\" \r\n id=\"tHeadbgColorPicker\" \r\n style=\" \r\n position: absolute; \r\n top: 100%; \r\n left: 0; \r\n z-index: 100; \r\n opacity: 0; \r\n \" \r\n (change)=\"setTheadBgColor($event)\" \r\n />\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n <i class=\"mdi mdi-undo\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n <i class=\"mdi mdi-redo\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button> -->\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"clearTextEditor()\"\r\n style=\" width: fit-content !important;\">\r\n <i class=\"mdi mdi-close-circle\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"toggleFullscreen1()\">\r\n <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n <i class=\"mdi mdi-fullscreen-exit\"></i> <!-- Collapse Icon -->\r\n </ng-container>\r\n <ng-template #fullscreenIcon>\r\n <i class=\"mdi mdi-fullscreen\"></i> <!-- Expand Icon -->\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"toolbarMode === 'bubble'\" class=\"bubble-toolbar border p-2\"\r\n [ngStyle]=\"{'top.px': toolbarTop, 'left.px': toolbarLeft, 'display': showToolbar ? 'block' : 'none'}\">\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <select class=\"els-form-select\" [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n class=\"mdi mdi-format-quote-close\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n class=\"mdi mdi-code-tags\"></i></button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertUnorderedList')\"><i\r\n class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <!-- <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-color-fill\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n (change)=\"logEvent($event, 'change')\"\r\n (input)=\"logEvent($event, 'input')\"\r\n >\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n [style]=\"{color: color}\"></i>\r\n <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n </div> -->\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n\r\n\r\n <!-- </div> -->\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"mdi mdi-format-header-1\"></i>\r\n </button>\r\n <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n </div>\r\n </div>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\" id=\"headerDropdown\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px;\">{{selectedFormatBlock | titlecase}}</span> <i\r\n class=\"mdi mdi-chevron-down text-dark\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n class=\"mdi mdi-format-superscript\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n class=\"mdi mdi-format-subscript\"></i></button> -->\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyLeft')\"><i\r\n class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyCenter')\"><i\r\n class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyRight')\"><i\r\n class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyFull')\"><i\r\n class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('removeFormat')\"><i\r\n class=\"mdi mdi-format-clear\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addRow()\"><i\r\n class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n </div> -->\r\n <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle (click)=\"addTable()\">\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n \r\n <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"tableWidth\">Table Width</label>\r\n <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellWidth\">Cell Width</label>\r\n <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellHeight\">Cell Height</label>\r\n <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n placeholder=\"Height\">\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n [style.min-height]=\"IsOpen ? '85vh !important' : '405px !important'\"\r\n (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important;\r\n \" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n \r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n }\"\r\n [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <div [attr.contenteditable]=\"contentEditable\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important; overflow: auto;\" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\" [ngStyle]=\"{\r\n 'font-family': selectedFont, \r\n 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': IsOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': IsOpen ? '0' :'20px',\r\n 'min-height': IsOpen ? '93vh' : '405px',\r\n 'max-height': IsOpen ? '93vh' : '405px'\r\n }\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n (input)=\"onModelChange($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\" (keydown)=\"handleTabKey($event)\">\r\n </div>\r\n\r\n <table *ngIf=\"parsedTable\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of parsedTable.rows\">\r\n <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n</div>", styles: ["@charset \"UTF-8\";*{font-family:Noto Sans Telugu UI,sans-serif}#editor{position:relative!important;overflow:auto;max-height:405px;min-height:405px;padding:16px;box-sizing:border-box}#editor.open{max-height:93vh;border-bottom-left-radius:0;border-bottom-right-radius:0}#editor:focus{outline:none!important;border-color:transparent!important}#editor img{max-width:100%;height:auto}.bubble-toolbar{position:absolute;background-color:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 2px 5px #00000026;z-index:1000;display:none}.els-text-editor{box-sizing:border-box}.els-btn-toolbar{width:\"1028px\"}.els-toolbar-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.els-toolbar-button-2{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:100px;color:#fff}.els-toolbar-button-2 :hover{color:#555!important}.els-toolbar-dropdown-button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px}.els-toolbar-dropdown-button:focus{outline:none}.els-form-select{cursor:pointer;display:inline-block;height:80%;padding-left:8px;padding-right:5px;position:relative;width:100%;color:#000}.els-button-group{margin-right:15px}.els-form-select:focus{outline:none}.els-border{border:#ccc}.els-border:focus{outline:none}.els-dropdown-item{width:50px!important}.els-toolbar-button.active,.btn-toolbar .btn.active,.btn-toolbar .btn:hover{color:#06c}.dropdown-toggle:after{display:none}.table-container{overflow-x:auto;width:100%}table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent;border-collapse:collapse;table-layout:fixed}table td,table th{padding:.75rem;vertical-align:top;border:1px solid #dee2e6;word-wrap:break-word}@media (max-width: 576px){table{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;border-spacing:0}table thead,table tbody,table tr,table th,table td{display:block}table thead tr{position:absolute;top:-9999px;left:-9999px}table tr{margin-bottom:.625rem;border:1px solid #ccc}table td,table th{border:none;border-bottom:1px solid #ddd;position:relative;padding-left:50%;white-space:normal;text-align:left}table td:before,table th:before{position:absolute;top:.75rem;left:.75rem;width:45%;padding-right:.75rem;white-space:nowrap;text-align:left;font-weight:700}}table.resizable{overflow:hidden;resize:both}.btn-group .btn{display:flex;align-items:center;justify-content:center}.btn-group .mdi{font-size:18px}.icon-with-underline{text-decoration:underline}pre{background-color:#f0f0f0;border:1px solid #ccc;border-radius:5px;overflow-x:auto}code{display:block;white-space:pre-wrap;font-family:Menlo,Monaco,Consolas,Courier New,monospace;font-size:14px}.parent-container{height:100%;overflow:visible}.custom-scrollbar::-webkit-scrollbar{width:4px}.custom-scrollbar::-webkit-scrollbar-thumb{background-color:#888;border-radius:10px;cursor:pointer}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background-color:#555}.custom-scrollbar::-webkit-scrollbar-track{background:transparent;border-radius:10px}.pasted-table{border-collapse:collapse;width:100%}.pasted-table td{border:1px solid black;padding:8px}.pasted-table tr:nth-child(even){background-color:#f2f2f2}.pasted-table tr:hover{background-color:#ddd}.vertical-line{height:28px;margin:0 auto}.image-edit-button{position:absolute!important;top:50%!important;left:50%!important;transform:translate(-50%,-50%)!important;background-color:#fff!important;border:2px solid #fff!important;padding:10px!important;color:#313a46!important;z-index:1000!important;-webkit-user-select:none!important;user-select:none!important;opacity:.5!important;cursor:default!important;transition:none!important;animation:none!important;pointer-events:none!important}.image-edit-button:hover{background-color:#f0f0f0}img{position:relative}.els-text-format{font-weight:800!important}.els-text-format>button{color:#000!important}.els-text-format>button:hover{background-color:#7d6d6d!important;color:#fff!important}.fullscreen-editor{width:100vw!important;height:100vh!important;position:fixed;top:0;left:0;z-index:999;background-color:#fff;border:none;border-radius:0;padding:0!important}\n"] }]
2181
2212
  }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i0.Renderer2 }, { type: i2.DomSanitizer }]; }, propDecorators: { editorText: [{
2182
2213
  type: Input
2183
2214
  }], editorFrom: [{
@@ -2227,4 +2258,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
2227
2258
  type: ViewChild,
2228
2259
  args: ['fullscreen']
2229
2260
  }] } });
2230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWwtdGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZWwtdGV4dC1lZGl0b3Ivc3JjL2xpYi9lbC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9lbC10ZXh0LWVkaXRvci9zcmMvbGliL2VsLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBQ3RLLE9BQU8sRUFBcUMsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU10Rix5R0FBeUc7QUFDekcsT0FBTyxFQUFFLFFBQVEsRUFBYyxNQUFNLFdBQVcsQ0FBQzs7Ozs7Ozs7QUFhakQsTUFBTSxPQUFPLHFCQUFxQjtJQXdGaEMsWUFDVSxNQUFjLEVBQ2QsS0FBcUIsRUFDckIsUUFBbUIsRUFDbkIsU0FBdUI7UUFIdkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQTFGeEIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQVN4QixnQkFBVyxHQUFnQyxPQUFPLENBQUM7UUFDbkQsb0JBQWUsR0FBWSxJQUFJLENBQUMsQ0FBQywwQkFBMEI7UUFDMUQsMEJBQXFCLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUMsQ0FBQyxxQkFBcUI7UUFDakcscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM5Qyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQy9DLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMxQyxjQUFTLEdB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QkFBQyxZQUFZO2dCQUNFLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuLy8gaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTmd4RnVsbHNjcmVlbkRpcmVjdGl2ZSB9IGZyb20gJ0B1bHRpbWF0ZS9uZ3gtZnVsbHNjcmVlbic7XHJcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSAneGxzeCc7XHJcbi8vIGltcG9ydCB7IEltYWdlRWRpdG9yTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9tb2RhbHMvaW1hZ2UtZWRpdG9yLW1vZGFsL2ltYWdlLWVkaXRvci1tb2RhbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBjb21wcmVzcywgZGVjb21wcmVzcyB9IGZyb20gJ2x6LXN0cmluZyc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0ZXh0LWVkaXRvcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2VsLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lbC10ZXh0LWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBFbFRleHRFZGl0b3JDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWVcclxuICB9XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRWxUZXh0RWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIGVkaXRvclRleHQ6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGVkaXRvckZyb206IGFueTtcclxuICBASW5wdXQoKSBlZGl0b3JBY3Rpb246IGFueTtcclxuICBASW5wdXQoKSBVc2VyUm9sZTogYW55O1xyXG4gIEBJbnB1dCgpIHN0eWxlOiBhbnk7XHJcbiAgQElucHV0KCkgZGlzYWJsZVRvb2xiYXI6IGFueTtcclxuICBASW5wdXQoKSBwbGFjZUhvbGRlcjogYW55O1xyXG4gIEBJbnB1dCgpIHJlcG9ydElkOiBhbnk7XHJcbiAgQElucHV0KCkgYmFja2dyb3VuZEltYWdlOiBhbnk7XHJcbiAgQElucHV0KCkgdG9vbGJhck1vZGU6ICdmaXhlZCcgfCAnYnViYmxlJyB8ICdub25lJyA9ICdmaXhlZCc7XHJcbiAgQElucHV0KCkgY29udGVudEVkaXRhYmxlOiBib29sZWFuID0gdHJ1ZTsgLy8gSW5wdXQgZm9yIGluaXRpYWwgdmFsdWVcclxuICBAT3V0cHV0KCkgY29udGVudEVkaXRhYmxlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7IC8vIE91dHB1dCBmb3IgY2hhbmdlc1xyXG4gIEBPdXRwdXQoKSBlZGl0b3JUZXh0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGVkaXRvckFjdGlvblJlc3BvbnNlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGVkaXRvclRleHRDbGVhciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpbWFnZUVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgaW1hZ2VFZGl0MiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBwbGFjZUhvbGRlclJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpc09wZW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgbmV3SW1hZ2VBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIFxyXG4gIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgXHJcbiAgQFZpZXdDaGlsZCgndGV4dEVkaXRvcicpIFRleHRFZGl0b3IhOiAgRWxlbWVudFJlZjxFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdmdWxsc2NyZWVuJykgZnVsbHNjcmVlbiE6IE5neEZ1bGxzY3JlZW5EaXJlY3RpdmVcclxuICAgIFxyXG4gIHNhbml0aXplZENvbnRlbnQhOiBTYWZlSHRtbDtcclxuXHJcblxyXG4gIHNob3dUb29sYmFyID0gZmFsc2U7XHJcbiAgdG9vbGJhclRvcCA9IDA7XHJcbiAgdG9vbGJhckxlZnQgPSAwO1xyXG5cclxuICBmb250cyA9IFsnQXJpYWwnLCAnQ291cmllciBOZXcnLCAnR2VvcmdpYScsICdUaW1lcyBOZXcgUm9tYW4nLCAnVmVyZGFuYSddO1xyXG4gIGZvbnRTaXplcyA9IFsxMCwgMTIsIDE0LCAxNiwgMTgsIDIwLCAyNCwgMjgsIDMyLCAzNl07XHJcbiAgc2VsZWN0ZWRGb250ID0gJ0FyaWFsJztcclxuICBjdXJyZW50TGlzdExldmVsOiBudW1iZXIgPSAwOyAvLyBUcmFjayB0aGUgY3VycmVudCBsaXN0IGxldmVsXHJcbiAgbGlzdFN0eWxlczogc3RyaW5nW10gPSBbXCJkZWNpbWFsXCIsIFwibG93ZXItYWxwaGFcIiwgXCJsb3dlci1yb21hblwiXTtcclxuICBzZWxlY3RlZEZvbnRTaXplID0gMTQ7XHJcbiAgaXNUYWJsZVNlbGVjdGVkID0gZmFsc2U7XHJcbiAgdGFibGVBZGRlZCA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkVGFibGU6IEhUTUxUYWJsZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuICBpc1BsYWNlaG9sZGVyVmlzaWJsZSA9IHRydWU7XHJcbiAgc2VsZWN0ZWRDZWxsOiBIVE1MVGFibGVDZWxsRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIFxyXG4gIGlzQm9sZEFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzSXRhbGljQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNVbmRlcmxpbmVBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1N0cmlrZXRocm91Z2hBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1N1YnNjcmlwdEFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzU3VwZXJzY3JpcHRBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgc2VsZWN0ZWRGb3JtYXRCbG9jazogc3RyaW5nID0gJ25vcm1hbCdcclxuXHJcbiAgc2VsZWN0ZWRJbWFnZTogSFRNTEltYWdlRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIGltYWdlRWRpdFVybDogc3RyaW5nID0gJyc7XHJcbiAgaW1hZ2VQb3NpdGlvblggPSAwO1xyXG4gIGltYWdlUG9zaXRpb25ZID0gMDtcclxuICBpbWFnZVJlc2l6ZVN0YXJ0WCA9IDA7XHJcbiAgaW1hZ2VSZXNpemVTdGFydFkgPSAwO1xyXG4gIGltYWdlUmVzaXplU3RhcnRXaWR0aCA9IDA7XHJcbiAgaW1hZ2VSZXNpemVTdGFydEhlaWdodCA9IDA7XHJcbiAgaW1hZ2VSZXNpemVEaXJlY3Rpb246ICd0b3BMZWZ0JyB8ICd0b3BSaWdodCcgfCAnYm90dG9tTGVmdCcgfCAnYm90dG9tUmlnaHQnIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHVuZG9TdGFjazogc3RyaW5nW10gPSBbXTtcclxuICByZWRvU3RhY2s6IHN0cmluZ1tdID0gW107XHJcbiAgaGlzdG9yeTogc3RyaW5nW10gPSBbXTtcclxuICBoaXN0b3J5SW5kZXggPSAtMTtcclxuICAvLyBlZGl0b3JUZXh0MSA9IGBgO1xyXG4gIHNlbGVjdGVkVGV4dENvbG9yOiBhbnk7XHJcbiAgb25DaGFuZ2U6IGFueSA9ICgpID0+IHt9O1xyXG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XHJcbiAgY29sb3I6IGFueSA9ICcjZGRkJztcclxuICBjb2xvckZvcm1Db250cm9sITogRm9ybUNvbnRyb2w7XHJcbiAgYmFja2dyb3VuZENvbG9yOiBhbnk7XHJcbiAgc2VsZWN0ZWRJdGVtSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwYXJzZWRUYWJsZTogeyBoZWFkZXJzOiBzdHJpbmdbXSwgcm93czogc3RyaW5nW11bXSB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIGlzRnVsbFNjcmVlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGN1cnJlbnRDYXJldFBvc2l0aW9uOiBhbnk7XHJcbiAgdXNlclJvbGU6IGFueVtdID0gW107XHJcbiAgc2hvd0VkaXRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0SGVhZEJnQ29sb3I6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxyXG4gICkge1xyXG4gICAgdGhpcy5nZXRVc2VyUm9sZXMoKVxyXG5cclxuICAgIFxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlKCkge1xyXG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXHJcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgIzQwM0Y0QSAhaW1wb3J0YW50J1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgI0QwRDBEMCAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlQ2xyKCkge1xyXG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXHJcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcclxuICAgICAgcmV0dXJuICcjZmZmICFpbXBvcnRhbnQnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJyMwMDAgIWltcG9ydGFudCdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRoZW1lTW9kZUNsclZlcnRpY2FsTGluZSgpIHtcclxuICAgIGNvbnN0IGNsck1vZGUgPSBkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS1sYXlvdXQtY29sb3InKVxyXG4gICAgaWYgKGNsck1vZGUgPT0gJ2RhcmsnKSB7XHJcbiAgICAgIHJldHVybiAnMnB4IHNvbGlkICNGRkZGRkYgIWltcG9ydGFudCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnMnB4IHNvbGlkICNEMEQwRDAgIWltcG9ydGFudCdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRoZW1lTW9kZUJnQ2xyKCkge1xyXG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXHJcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcclxuICAgICAgcmV0dXJuICcjMjgyODI4ICFpbXBvcnRhbnQnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJyNGM0YzRjMgIWltcG9ydGFudCdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRoZW1lTW9kZUJvcmRlclRvcCgpIHtcclxuICAgIGNvbnN0IGNsck1vZGUgPSBkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS1sYXlvdXQtY29sb3InKVxyXG4gICAgaWYgKGNsck1vZGUgPT0gJ2RhcmsnKSB7XHJcbiAgICAgIHJldHVybiAnMnB4IHNvbGlkICMwMDAgIWltcG9ydGFudCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnMnB4IHNvbGlkICNmZmYgIWltcG9ydGFudCdcclxuICAgIH1cclxuICB9XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3BsYWNlSG9sZGVyJ10pIHtcclxuICAgICAgdGhpcy5pbnNlcnRBdENhcmV0KHRoaXMucGxhY2VIb2xkZXIpXHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzWydyZXBvcnRJZCddKSB7XHJcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3JlcG9ydElkJywgdGhpcy5yZXBvcnRJZClcclxuICAgIH0gXHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ1VzZXJSb2xlJ10pIHsgXHJcbiAgICAgIHRoaXMuZ2V0VXNlclJvbGVzKClcclxuICAgIH1cclxuICB9XHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5pbml0RWRpdG9yKCk7XHJcbiAgICB0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcclxuICAgIHRoaXMuc2V0dXBIaXN0b3J5KCk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuY2hhbmdlJywgdGhpcy5vbkZ1bGxzY3JlZW5DaGFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRfRnVuYyh0aGlzLmVkaXRvclRleHQpXHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25jaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2hlY2tBY3RpdmVTdGF0ZXMoKTtcclxuICAgICAgdGhpcy5jaGVja0Zvcm1hdEJsb2NrKCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuYWRkQ2xpY2tMaXN0ZW5lclRvSW1hZ2VzKCk7XHJcbiAgICB0aGlzLmFkZENsaWNrTGlzdGVuZXJUb0VsZW1lbnRzKCk7XHJcbiAgICAvLyB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZShwYXJhbXMgPT4ge1xyXG4gICAgLy8gICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShwYXJhbXNbJ2RhdGEnXSk7XHJcbiAgICAvLyAgIGlmIChkYXRhLmVkaXRlZElNRykge1xyXG4gICAgLy8gICAgIGNvbnN0IGltZ1VybCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wJyk7XHJcbiAgICAvLyAgICAgaWYgKGltZ1VybCkge1xyXG4gICAgLy8gICAgICAgdGhpcy5yZXBsYWNlSW1hZ2VTcmMoaW1nVXJsLCBkYXRhLmluZGV4LmluZGV4KVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcCcpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvLyB9KVxyXG4gIH1cclxuXHJcbiAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgLy8gQ2xlYW51cCB0aGUgZXZlbnQgbGlzdGVuZXIgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZFxyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHRoaXMub25GdWxsc2NyZWVuQ2hhbmdlKTtcclxuICB9XHJcblxyXG4gIElzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHRvZ2dsZUZ1bGxzY3JlZW4xKCkge1xyXG4gICAgICB0aGlzLklzT3BlbiA9ICF0aGlzLklzT3BlbjtcclxuICAgICAgdGhpcy5pc09wZW4uZW1pdCh0aGlzLklzT3BlbilcclxuICAgICAgaWYgKHRoaXMuSXNPcGVuKSB7IFxyXG4gICAgICAgIHRoaXMuZnVsbHNjcmVlbi5lbnRlcih0aGlzLlRleHRFZGl0b3IubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mdWxsc2NyZWVuLmV4aXQoKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBvbkZ1bGxzY3JlZW5DaGFuZ2UgPSAoKSA9PiB7XHJcbiAgICBpZiAoIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSB7XHJcbiAgICAgIC8vIFdoZW4gZnVsbHNjcmVlbiBtb2RlIGlzIGV4aXRlZFxyXG4gICAgICB0aGlzLklzT3BlbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmlzT3Blbi5lbWl0KHRoaXMuSXNPcGVuKTtcclxuICAgIH1cclxuICB9O1xyXG4gIFxyXG4gIC8vIGVudGVyRnVsbHNjcmVlblZpZGVvKCkge1xyXG4gIC8vICAgY29uc29sZS5sb2coJ2V2ZW50OicsIGV2ZW50KTtcclxuICAvLyAgIGNvbnN0IGZ1bGxzY3JlZW4gPSBldmVudDtcclxuICAvLyAgIHRoaXMuaXNPcGVuID0gZXZlbnQ7XHJcbiAgLy8gICBpZiAoZnVsbHNjcmVlbikge1xyXG4gIC8vICAgICB0aGlzLmZ1bGxzY3JlZW4uZW50ZXIodGhpcy5UZXh0RWRpdG9yLm5hdGl2ZUVsZW1lbnQpO1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgdGhpcy5mdWxsc2NyZWVuLmV4aXQoKVxyXG4gIC8vICAgfVxyXG4gICAgXHJcbiAgLy8gfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuZWRpdG9yVGV4dCA9IHZhbHVlO1xyXG4gICAgICB0aGlzLmluaXRFZGl0b3IoKTtcclxuICAgICAgdGhpcy5pbml0X0Z1bmModGhpcy5lZGl0b3JUZXh0KTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbi8vICBwcml2YXRlIGFkZENsaWNrTGlzdGVuZXJUb0ltYWdlcygpIHtcclxuLy8gICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbi8vICAgaWYgKGVkaXRvcikge1xyXG4vLyAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbi8vICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuLy8gICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU1HJykge1xyXG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IHRhcmdldCBhcyBIVE1MSW1hZ2VFbGVtZW50O1xyXG4vLyAgICAgICAgIHRoaXMuaW1hZ2VFZGl0VXJsID0gdGhpcy5zZWxlY3RlZEltYWdlLnNyYztcclxuXHJcbi8vICAgICAgICAgbGV0IGNvbnRhaW5lciA9IHRoaXMuc2VsZWN0ZWRJbWFnZS5wYXJlbnRFbGVtZW50O1xyXG4vLyAgICAgICAgIGlmICghY29udGFpbmVyIHx8IGNvbnRhaW5lci5jbGFzc05hbWUgIT09ICdpbWFnZS1jb250YWluZXInKSB7XHJcbi8vICAgICAgICAgICBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuLy8gICAgICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSAnaW1hZ2UtY29udGFpbmVyJztcclxuLy8gICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbi8vICAgICAgICAgICBjb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xyXG4vLyAgICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShjb250YWluZXIsIHRoaXMuc2VsZWN0ZWRJbWFnZSk7XHJcbi8vICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zZWxlY3RlZEltYWdlKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgICAgY29uc3QgZXhpc3RpbmdCdXR0b24gPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLmltYWdlLWVkaXQtYnV0dG9uJyk7XHJcbi8vICAgICAgICAgaWYgKGV4aXN0aW5nQnV0dG9uKSB7XHJcbi8vICAgICAgICAgICBleGlzdGluZ0J1dHRvbi5yZW1vdmUoKTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4vLyAgICAgICAgIC8vIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdFZGl0JztcclxuLy8gICAgICAgICBidXR0b24uaW5uZXJUZXh0ID0gJ0VkaXQgSW1hZ2UnO1xyXG5cclxuLy8gICAgICAgICBidXR0b24uY2xhc3NOYW1lID0gJ2ltYWdlLWVkaXQtYnV0dG9uIGJ0biBidG4tc20nO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnRvcCA9ICc1MCUnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5sZWZ0ID0gJzUwJSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS56SW5kZXggPSAnMTAwMCc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuYm9yZGVyID0gJzJweCBzb2xpZCAjZmZmJztcclxuLy8gICAgICAgICAvLyBidXR0b24uc3R5bGUucGFkZGluZyA9ICcxMHB4JztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuY29sb3IgPSAnIzMxM2E0Nic7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcclxuXHJcbi8vICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuLy8gICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbi8vICAgICAgICAgICB0aGlzLmVkaXRJbWFnZSgpO1xyXG4vLyAgICAgICAgIH0pO1xyXG5cclxuLy8gICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uKTtcclxuLy8gICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xyXG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBudWxsO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9KTtcclxuLy8gICB9XHJcbiAgLy8gfVxyXG4gIGdldFVzZXJSb2xlcygpIHtcclxuICAgIHRoaXMudXNlclJvbGUgPSB0aGlzLlVzZXJSb2xlXHJcbiAgfVxyXG4gIC8vIHJvbGVDaGVjaygpIHtcclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy51c2VyUm9sZS5sZW5ndGg7ICsraSkge1xyXG4gIC8vICAgICBjb25zdCByb2xlTmFtZSA9IFtdXHJcbiAgLy8gICAgICAgcm9sZU5hbWUucHVzaCh0aGlzLnVzZXJSb2xlW2ldPy5uYW1lKTtcclxuICAvLyAgICAgcmV0dXJuIHRoaXMudXNlclJvbGVbaV0/Lm5hbWU7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICByb2xlQ2hlY2soKSB7XHJcbiAgICBsZXQgdXNlclJvbGVOYW1lOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gdGhpcy51c2VyUm9sZS5sZW5ndGg7ICsraSkge1xyXG4gICAgICB1c2VyUm9sZU5hbWUucHVzaCh0aGlzLnVzZXJSb2xlW2ldPy5uYW1lKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1c2VyUm9sZU5hbWU7XHJcbiAgfVxyXG5cclxuXHJcbi8vIHByaXZhdGUgYWRkQ2xpY2tMaXN0ZW5lclRvSW1hZ2VzKCkge1xyXG4vLyAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuLy8gICBjb25zdCByb2xlcyA9IHRoaXMucm9sZUNoZWNrKCk7IC8vIEdldCB1c2VyIHJvbGVzIGR5bmFtaWNhbGx5XHJcbi8vICAgY29uc3QgaXNBZG1pbiA9IHJvbGVzLmluY2x1ZGVzKCdBZG1pbicpO1xyXG4vLyAgIGNvbnN0IGlzQ3JlYXRvciA9IHJvbGVzLmluY2x1ZGVzKCdDcmVhdG9yJyk7XHJcbi8vICAgY29uc3QgaXNBcHByb3ZlciA9IHJvbGVzLmluY2x1ZGVzKCdBcHByb3ZlcicpO1xyXG4gIFxyXG4vLyAgIGlmIChpc0NyZWF0b3IgfHwgaXNBZG1pbikge1xyXG4vLyAgICAgaWYgKGVkaXRvcikge1xyXG4vLyAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbi8vICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuLy8gICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU1HJykge1xyXG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IHRhcmdldCBhcyBIVE1MSW1hZ2VFbGVtZW50O1xyXG4vLyAgICAgICAgIHRoaXMuaW1hZ2VFZGl0VXJsID0gdGhpcy5zZWxlY3RlZEltYWdlLnNyYztcclxuLy8gICAgICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5zZWxlY3RlZEltYWdlLnBhcmVudEVsZW1lbnQ7XHJcbi8vICAgICAgICAgaWYgKCFjb250YWluZXIgfHwgY29udGFpbmVyLmNsYXNzTmFtZSAhPT0gJ2ltYWdlLWNvbnRhaW5lcicpIHtcclxuLy8gICAgICAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9ICdpbWFnZS1jb250YWluZXInO1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuLy8gICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7ICBcclxuLy8gICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCB0aGlzLnNlbGVjdGVkSW1hZ2UpO1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0ZWRJbWFnZSk7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBjb25zdCBleGlzdGluZ0J1dHRvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuaW1hZ2UtZWRpdC1idXR0b24nKTtcclxuLy8gICAgICAgICBpZiAoZXhpc3RpbmdCdXR0b24pIHtcclxuLy8gICAgICAgICAgIGV4aXN0aW5nQnV0dG9uLnJlbW92ZSgpO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbi8vICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ICA9ICdFZGl0IEltYWdlJztcclxuLy8gICAgICAgICBidXR0b24uY2xhc3NOYW1lID0gJ2ltYWdlLWVkaXQtYnV0dG9uIGJ0biBidG4tc20nO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnRvcCA9ICc1MCUnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5sZWZ0ID0gJzUwJSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS56SW5kZXggPSAnMTAwMCc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmJzsgXHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmJvcmRlciA9ICcycHggc29saWQgI2ZmZic7IFxyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5jb2xvciA9ICcjMzEzYTQ2JztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnO1xyXG5cclxuLy8gICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4vLyAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuLy8gICAgICAgICAgIHRoaXMuZWRpdEltYWdlKCk7XHJcbi8vICAgICAgICAgfSk7XHJcblxyXG4vLyAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChidXR0b24pO1xyXG5cclxuLy8gICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xyXG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBudWxsO1xyXG4vLyAgICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW1hZ2UtZWRpdC1idXR0b24nKTtcclxuLy8gICAgICAgICBidXR0b25zLmZvckVhY2goYnV0dG9uID0+IGJ1dHRvbi5yZW1vdmUoKSk7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH0pO1xyXG4vLyAgIH1cclxuLy8gICB9XHJcbiAgLy8gfVxyXG4gIHByaXZhdGUgYWRkQ2xpY2tMaXN0ZW5lclRvSW1hZ2VzKCkge1xyXG4gIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICBjb25zdCByb2xlcyA9IHRoaXMucm9sZUNoZWNrKCk7IC8vIEdldCB1c2VyIHJvbGVzIGR5bmFtaWNhbGx5XHJcbiAgY29uc3QgaXNBZG1pbiA9IHJvbGVzLmluY2x1ZGVzKCdBZG1pbicpO1xyXG4gIGNvbnN0IGlzQ3JlYXRvciA9IHJvbGVzLmluY2x1ZGVzKCdDcmVhdG9yJyk7XHJcblxyXG4gIGlmIChpc0NyZWF0b3IgfHwgaXNBZG1pbikge1xyXG4gICAgaWYgKGVkaXRvcikge1xyXG4gICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU1HJykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLmltYWdlRWRpdFVybCA9IHRoaXMuc2VsZWN0ZWRJbWFnZS5zcmM7XHJcbiAgICAgICAgICBjb25zdCBpbWFnZXMgPSBlZGl0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpO1xyXG4gICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaW1hZ2VzW2ldID09PSB0aGlzLnNlbGVjdGVkSW1hZ2UpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLnNlbGVjdGVkSW1hZ2UucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgIGlmICghY29udGFpbmVyIHx8IGNvbnRhaW5lci5jbGFzc05hbWUgIT09ICdpbWFnZS1jb250YWluZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gJ2ltYWdlLWNvbnRhaW5lcic7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZS5wYXJlbnROb2RlPy5pbnNlcnRCZWZvcmUoY29udGFpbmVyLCB0aGlzLnNlbGVjdGVkSW1hZ2UpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zZWxlY3RlZEltYWdlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0J1dHRvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuaW1hZ2UtZWRpdC1idXR0b24nKTtcclxuICAgICAgICAgIGlmIChleGlzdGluZ0J1dHRvbikge1xyXG4gICAgICAgICAgICBleGlzdGluZ0J1dHRvbi5yZW1vdmUoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuICAgICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdFZGl0IEltYWdlJztcclxuICAgICAgICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAnaW1hZ2UtZWRpdC1idXR0b24gYnRuIGJ0bi1zbSc7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgICAgICAgYnV0dG9uLnN0eWxlLnRvcCA9ICc1MCUnO1xyXG4gICAgICAgICAgYnV0dG9uLnN0eWxlLmxlZnQgPSAnNTAlJztcclxuICAgICAgICAgIGJ1dHRvbi5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlKC01MCUsIC01MCUpJztcclxuICAgICAgICAgIGJ1dHRvbi5zdHlsZS56SW5kZXggPSAnMTAwMCc7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmYnO1xyXG4gICAgICAgICAgYnV0dG9uLnN0eWxlLmJvcmRlciA9ICcycHggc29saWQgI2ZmZic7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUuY29sb3IgPSAnIzMxM2E0Nic7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xyXG4gICAgICAgICAgYnV0dG9uLnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XHJcblxyXG4gICAgICAgICAgYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5lZGl0SW1hZ2UoKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChidXR0b24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUVkaXRCdXR0b25zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIE1vbml0b3IgZWRpdG9yIGNvbnRlbnQgY2hhbmdlcyB0byBoYW5kbGUgaW1hZ2UgZGVsZXRpb25cclxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IGVkaXRvci5xdWVyeVNlbGVjdG9yQWxsKCcuaW1hZ2UtZWRpdC1idXR0b24nKTtcclxuICAgICAgICBidXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gYnV0dG9uLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgICBpZiAoY29udGFpbmVyICYmICFjb250YWluZXIucXVlcnlTZWxlY3RvcignaW1nJykpIHtcclxuICAgICAgICAgICAgYnV0dG9uLnJlbW92ZSgpOyAvLyBSZW1vdmUgdGhlIGJ1dHRvbiBpZiB0aGUgYXNzb2NpYXRlZCBpbWFnZSBpcyBnb25lXHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmUoKTsgLy8gQ2xlYW4gdXAgdGhlIGNvbnRhaW5lclxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIE9ic2VydmUgY2hhbmdlcyBpbiB0aGUgZWRpdG9yXHJcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoZWRpdG9yLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgcmVtb3ZlRWRpdEJ1dHRvbnMoKSB7XHJcbiAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbWFnZS1lZGl0LWJ1dHRvbicpO1xyXG4gIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiBidXR0b24ucmVtb3ZlKCkpO1xyXG4gIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbiAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IG51bGw7XHJcbn1cclxuXHJcblxyXG4gIC8vIHByaXZhdGUgYWRkQ2xpY2tMaXN0ZW5lclRvSW1hZ2VzKCkge1xyXG4gIC8vIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICAvLyBpZiAoZWRpdG9yKSB7XHJcbiAgLy8gICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuICAvLyAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gIC8vICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnKSB7XHJcbiAgLy8gICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgLy8gICAgICAgdGhpcy5pbWFnZUVkaXRVcmwgPSB0aGlzLnNlbGVjdGVkSW1hZ2Uuc3JjO1xyXG5cclxuICAvLyAgICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpbWFnZVxyXG4gIC8vICAgICAgIGNvbnN0IGltYWdlcyA9IGVkaXRvci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XHJcbiAgLy8gICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAgIGlmIChpbWFnZXNbaV0gPT09IHRoaXMuc2VsZWN0ZWRJbWFnZSkge1xyXG4gIC8vICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gaTtcclxuICAvLyAgICAgICAgICAgYnJlYWs7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG5cclxuICAvLyAgICAgICBpZiAodGhpcy50b29sYmFyTW9kZSA9PT0gJ2J1YmJsZScpIHtcclxuICAvLyAgICAgICAgIHRoaXMub25UZXh0U2VsZWN0KCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbiAgLy8gICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IG51bGw7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vIH1cclxuICAvLyB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBhZGRDbGlja0xpc3RlbmVyVG9FbGVtZW50cygpIHtcclxuICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgaWYgKGVkaXRvcikge1xyXG4gICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU1HJykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IHRhcmdldCBhcyBIVE1MSW1hZ2VFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0VXJsID0gdGhpcy5zZWxlY3RlZEltYWdlLnNyYztcclxuICAgICAgICBjb25zdCBpbWFnZXMgPSBlZGl0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaW1hZ2VzW2ldID09PSB0aGlzLnNlbGVjdGVkSW1hZ2UpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ1REJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RIJykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRhcmdldC5jbG9zZXN0KCd0YWJsZScpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY2VsbHMgPSB0aGlzLnNlbGVjdGVkVGFibGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFyZ2V0LnRhZ05hbWUpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2VsbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChjZWxsc1tpXSA9PT0gdGFyZ2V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gbnVsbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnUCcgfHwgdGFyZ2V0LnRhZ05hbWUgPT09ICdTUEFOJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ0RJVicpIHtcclxuICAgICAgICBjb25zdCBwYXJhZ3JhcGhzID0gZWRpdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhcmdldC50YWdOYW1lKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFncmFwaHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChwYXJhZ3JhcGhzW2ldID09PSB0YXJnZXQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIH1cclxuXHJcbnJlcGxhY2VJbWFnZVNyYyhuZXdTcmM6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xyXG4gIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICBcclxuICBpZiAoZWRpdG9yKSB7XHJcbiAgICBlZGl0b3IuZm9jdXMoKVxyXG4gICAgY29uc3QgaW1hZ2VzID0gZWRpdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdJTUcnKTtcclxuICAgIGlmIChpbmRleCA+PSAwICkge1xyXG4gICAgICBpbWFnZXNbaW5kZXhdLnNldEF0dHJpYnV0ZSgnc3JjJywgbmV3U3JjKTtcclxuICAgIH0gXHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiAgcHJpdmF0ZSBpbml0RWRpdG9yKCkge1xyXG4gICAgLy8gSW5pdGlhbGl6ZSBlZGl0b3IgY29udGVudCBhbmQgbGlzdGVuZXJzXHJcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcblxyXG4gICAgaWYgKGVkaXRvcikge1xyXG4gICAgICBlZGl0b3IuaW5uZXJIVE1MID0gdGhpcy5lZGl0b3JUZXh0O1xyXG4gICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGVkaXRvci5pbm5lckhUTUwpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hlY2tQbGFjZWhvbGRlcigpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgLy8gSGFuZGxlIHRoZSBkaXNhYmxlZCBzdGF0ZSBpZiBuZWNlc3NhcnlcclxuICB9XHJcblxyXG4gIG9uTW9kZWxDaGFuZ2UodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IFZBTFVFID0gdmFsdWVcclxuICAgICAgdGhpcy5lZGl0b3JUZXh0ID0gVkFMVUU7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UoVkFMVUUpO1xyXG4gICAgICB0aGlzLmVkaXRvclRleHRDaGFuZ2UuZW1pdChWQUxVRSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXBwbHlJbWFnZVN0eWxlcyhjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICBkaXYuaW5uZXJIVE1MID0gY29udGVudDtcclxuICAgIGNvbnN0IGltYWdlcyA9IGRpdi5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKTtcclxuICAgIGltYWdlcy5mb3JFYWNoKGltZyA9PiB7XHJcbiAgICAgIGlmIChpbWcuc3R5bGUubWF4V2lkdGggPj0gJzcwMHB4Jykge1xyXG4gICAgICAgIGltZy5zdHlsZS5tYXhXaWR0aCA9ICc3MDBweCc7XHJcbiAgICAgICAgLy8gaW1nLndpZHRoID0gMzAwO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW1nLnN0eWxlLm1heFdpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XHJcbiAgfVxyXG5cclxuICAvLyBpbml0X0Z1bmMoaHRtbDogYW55KSB7XHJcbiAgLy8gICBpZiAoaHRtbCkge1xyXG4gIC8vICAgICBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIC8vICAgICBpZiAoZWRpdG9yKSB7IFxyXG4gIC8vICAgICAgIGVkaXRvci5mb2N1cygpXHJcbiAgLy8gICAgICAgZWRpdG9yLmlubmVySFRNTCA9IGh0bWw7XHJcbiAgLy8gICAgICAgdGhpcy5zYW5pdGl6ZWRDb250ZW50ID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5hcHBseUltYWdlU3R5bGVzKGh0bWwpKTtcclxuICAvLyAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gdGhpcy5zYW5pdGl6ZWRDb250ZW50IGFzIHN0cmluZztcclxuICAvLyAgICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoZWRpdG9yKSB7XHJcbiAgLy8gICAgICAgICAgIGVkaXRvci5mb2N1cygpXHJcbiAgLy8gICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZShlZGl0b3IuaW5uZXJIVE1MKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgXHJcbi8vICAgaW5pdF9GdW5jKGh0bWw6IGFueSkge1xyXG4vLyAgIGlmIChodG1sKSB7XHJcbi8vICAgICBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4vLyAgICAgaWYgKGVkaXRvcikge1xyXG4vLyAgICAgICAvLyBJbml0aWFsaXplIHRoZSBlZGl0b3Igd2l0aCBzYW5pdGl6ZWQgY29udGVudFxyXG4gICAgICBcclxuLy8gICAgICAgdGhpcy5zZXRFZGl0b3JDb250ZW50KGh0bWwpO1xyXG5cclxuLy8gICAgICAgLy8gU2V0IHVwIGEgTXV0YXRpb25PYnNlcnZlciB0byBoYW5kbGUgY29udGVudCBjaGFuZ2VzXHJcbi8vICAgICAgIHRoaXMuc2V0dXBNdXRhdGlvbk9ic2VydmVyKGVkaXRvcik7XHJcblxyXG4vLyAgICAgICAvLyBNb3ZlIHRoZSBjYXJldCB0byB0aGUgZW5kIGFmdGVyIGluaXRpYWwgY29udGVudCBzZXR1cFxyXG4vLyAgICAgICB0aGlzLm1vdmVDYXJldFRvRW5kKGVkaXRvcik7XHJcblxyXG4vLyAgICAgICAvLyBUcmFjayBjYXJldCBwb3NpdGlvbiBvbiBtb3VzZSBjbGlja1xyXG4vLyAgICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XHJcbi8vICAgICAgICAgaWYgKGVkaXRvcikgeyAgLy8gRW5zdXJlIGVkaXRvciBpcyBub3QgbnVsbFxyXG4vLyAgICAgICAgICAgLy8gdGhpcy50cmFja0NhcmV0UG9zaXRpb24oZWRpdG9yKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgIH0pO1xyXG4vLyAgICAgfVxyXG4vLyAgIH0gZWxzZSB7XHJcbi8vICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xyXG4vLyAgIH1cclxuLy8gfVxyXG5cclxuLy8gcHJpdmF0ZSBzZXRFZGl0b3JDb250ZW50KGh0bWw6IHN0cmluZykge1xyXG4vLyAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbi8vICAgaWYgKGVkaXRvcikge1xyXG4vLyAgICAgLy8gU2FuaXRpemUgYW5kIGFwcGx5IHN0eWxlcyB0byB0aGUgSFRNTFxyXG4vLyAgICAgdGhpcy5zYW5pdGl6ZWRDb250ZW50ID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5hcHBseUltYWdlU3R5bGVzKGh0bWwpKTtcclxuLy8gICAgIGVkaXRvci5pbm5lckhUTUwgPSB0aGlzLnNhbml0aXplZENvbnRlbnQgYXMgc3RyaW5nO1xyXG4vLyAgIH1cclxuLy8gfVxyXG5cclxuLy8gcHJpdmF0ZSBzZXR1cE11dGF0aW9uT2JzZXJ2ZXIoZWRpdG9yOiBIVE1MRWxlbWVudCkge1xyXG4vLyAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG4vLyAgICAgLy8gVXBkYXRlIG1vZGVsIHdpdGggdGhlIGN1cnJlbnQgY29udGVudFxyXG4vLyAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGVkaXRvci5pbm5lckhUTUwpO1xyXG4vLyAgIH0pO1xyXG5cclxuLy8gICBvYnNlcnZlci5vYnNlcnZlKGVkaXRvciwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XHJcbi8vIH1cclxuXHJcbi8vIFRoaXMgZnVuY3Rpb24gdHJhY2tzIHRoZSBjYXJldCBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgbW91c2UgY2xpY2tcclxucHJpdmF0ZSB0cmFja0NhcmV0UG9zaXRpb24oZWRpdG9yOiBIVE1MRWxlbWVudCkge1xyXG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgY29uc3Qgc3RhcnRPZmZzZXQgPSByYW5nZS5zdGFydE9mZnNldDtcclxuXHJcblxyXG4gICAgLy8gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBpbnNlcnQgY29udGVudCBvciBwZXJmb3JtIGFjdGlvbnMgYmFzZWQgb24gdGhlIGNhcmV0IHBvc2l0aW9uXHJcbiAgICAvLyBFeGFtcGxlOiBTYXZlIHRoZSBjdXJyZW50IGNhcmV0IHBvc2l0aW9uIGZvciBmdXR1cmUgdXNlXHJcbiAgICB0aGlzLmN1cnJlbnRDYXJldFBvc2l0aW9uID0geyBub2RlOiBzdGFydE5vZGUsIG9mZnNldDogc3RhcnRPZmZzZXQgfTtcclxuICB9XHJcbiAgfVxyXG4gIFxyXG4gIC8vIE1ldGhvZCB0byBnZXQgY2FyZXQgcG9zaXRpb24gYW5kIGluc2VydCBuZXcgZGF0YVxyXG5wcml2YXRlIGluc2VydEF0Q2FyZXQobmV3RGF0YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gIFxyXG4gIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgcmFuZ2UgKGNhcmV0IHBvc2l0aW9uKVxyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuXHJcbiAgICAvLyBDcmVhdGUgYSBkb2N1bWVudCBmcmFnbWVudCB0byBpbnNlcnQgKGFsbG93cyBoYW5kbGluZyBIVE1MIHN0cmluZ3MpXHJcbiAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIHRlbXBEaXYuaW5uZXJIVE1MID0gbmV3RGF0YTtcclxuXHJcbiAgICAvLyBBcHBlbmQgdGhlIG5ldyBkYXRhIHRvIHRoZSBmcmFnbWVudCAoc3VwcG9ydHMgSFRNTCBpbnNlcnRpb24pXHJcbiAgICB3aGlsZSAodGVtcERpdi5maXJzdENoaWxkKSB7XHJcbiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKHRlbXBEaXYuZmlyc3RDaGlsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW5zZXJ0IHRoZSBmcmFnbWVudCBhdCB0aGUgY2FyZXQgcG9zaXRpb25cclxuICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7IC8vIFJlbW92ZSBhbnkgc2VsZWN0ZWQgY29udGVudCBpZiBhcHBsaWNhYmxlXHJcbiAgICByYW5nZS5pbnNlcnROb2RlKGZyYWdtZW50KTtcclxuXHJcbiAgICAvLyBNb3ZlIHRoZSBjYXJldCBhZnRlciB0aGUgaW5zZXJ0ZWQgY29udGVudFxyXG4gICAgY29uc3QgbGFzdENoaWxkID0gZnJhZ21lbnQubGFzdENoaWxkO1xyXG5cclxuICAgIGlmIChsYXN0Q2hpbGQpIHtcclxuICAgICAgcmFuZ2Uuc2V0U3RhcnRBZnRlcihsYXN0Q2hpbGQpO1xyXG4gICAgICByYW5nZS5zZXRFbmRBZnRlcihsYXN0Q2hpbGQpO1xyXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgaWYgKGVkaXRvcikge1xyXG4gICAgICB0aGlzLm1vdmVDYXJldFRvRW5kKGVkaXRvcilcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5wbGFjZUhvbGRlclJlbW92ZS5lbWl0KClcclxuICB9XHJcbn1cclxuXHJcblxyXG4vLyAgIC8vIE1vdmUgY2FyZXQgdG8gdGhlIGVuZCBvZiB0aGUgZWRpdG9yIGNvbnRlbnRcclxuLy8gICBwcml2YXRlIG1vdmVDYXJldFRvRW5kKGVkaXRvcjogSFRNTEVsZW1lbnQpIHtcclxuLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuLy8gICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgIFxyXG4vLyAgICAgaWYgKGVkaXRvci5sYXN0Q2hpbGQpIHtcclxuLy8gICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcik7XHJcbi8vICAgICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsgLy8gQ29sbGFwc2UgdG8gdGhlIGVuZFxyXG4vLyAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4vLyAgICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHJhbmdlKTtcclxuICAgICAgXHJcbi8vICAgICB9XHJcbi8vICAgfVxyXG4gIFxyXG4gIFxyXG5cclxuXHJcbiAgaW5pdF9GdW5jKGh0bWw6IGFueSkge1xyXG4gIGlmIChodG1sKSB7XHJcbiAgICBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBlZGl0b3Igd2l0aCBzYW5pdGl6ZWQgY29udGVudFxyXG4gICAgICB0aGlzLnNldEVkaXRvckNvbnRlbnQoaHRtbCk7XHJcblxyXG4gICAgICAvLyBTZXQgdXAgYSBNdXRhdGlvbk9ic2VydmVyIHRvIGhhbmRsZSBjb250ZW50IGNoYW5nZXNcclxuICAgICAgdGhpcy5zZXR1cE11dGF0aW9uT2JzZXJ2ZXIoZWRpdG9yKTtcclxuICAgICAgXHJcbiAgICAgIC8vIE1vdmUgdGhlIGNhcmV0IHRvIHRoZSBlbmQgYWZ0ZXIgaW5pdGlhbCBjb250ZW50IHNldHVwXHJcbiAgICAgIHRoaXMubW92ZUNhcmV0VG9FbmQoZWRpdG9yKTtcclxuICAgICAgLy8gIFRyYWNrIGNhcmV0IHBvc2l0aW9uIG9uIG1vdXNlIGNsaWNrXHJcbiAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuICAgICAgICBpZiAoZWRpdG9yKSB7ICAvLyBFbnN1cmUgZWRpdG9yIGlzIG5vdCBudWxsXHJcbiAgICAgICAgICB0aGlzLnRyYWNrQ2FyZXRQb3NpdGlvbihlZGl0b3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbiAgfVxyXG59XHJcblxyXG5cclxucHJpdmF0ZSBzZXRFZGl0b3JDb250ZW50KGh0bWw6IHN0cmluZykge1xyXG4gIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgaWYgKGVkaXRvcikge1xyXG4gICAgLy8gU2FuaXRpemUgYW5kIGFwcGx5IHN0eWxlcyB0byB0aGUgSFRNTFxyXG4gICAgdGhpcy5zYW5pdGl6ZWRDb250ZW50ID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5hcHBseUltYWdlU3R5bGVzKGh0bWwpKTtcclxuICAgIGVkaXRvci5pbm5lckhUTUwgPSB0aGlzLnNhbml0aXplZENvbnRlbnQgYXMgc3RyaW5nO1xyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBzZXR1cE11dGF0aW9uT2JzZXJ2ZXIoZWRpdG9yOiBIVE1MRWxlbWVudCkge1xyXG4gIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgLy8gTW92ZSB0aGUgY2FyZXQgdG8gdGhlIGVuZCBhZnRlciBjb250ZW50IGNoYW5nZXNcclxuICAgIC8vIHRoaXMubW92ZUNhcmV0VG9FbmQoZWRpdG9yKTtcclxuICAgIC8vIFVwZGF0ZSBtb2RlbCB3aXRoIHRoZSBjdXJyZW50IGNvbnRlbnRcclxuICAgIHRoaXMub25Nb2RlbENoYW5nZShlZGl0b3IuaW5uZXJIVE1MKTtcclxuICB9KTtcclxuXHJcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xyXG59XHJcblxyXG5wcml2YXRlIG1vdmVDYXJldFRvRW5kKGVkaXRvcjogSFRNTEVsZW1lbnQpIHtcclxuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gIFxyXG4gIGlmIChlZGl0b3IubGFzdENoaWxkKSB7XHJcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcclxuICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTsgLy8gQ29sbGFwc2UgdG8gdGhlIGVuZFxyXG4gICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gICBpbml0X0Z1bmMoaHRtbDogYW55KSB7XHJcbi8vICAgaWYgKGh0bWwpIHtcclxuLy8gICAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbi8vICAgICBpZiAoZWRpdG9yKSB7XHJcbi8vICAgICAgIGVkaXRvci5mb2N1cygpO1xyXG4vLyAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gaHRtbDtcclxuXHJcbi8vICAgICAgIC8vIFNhbml0aXplIHRoZSBjb250ZW50IGFuZCBhcHBseSBzdHlsZXNcclxuLy8gICAgICAgdGhpcy5zYW5pdGl6ZWRDb250ZW50ID0gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5hcHBseUltYWdlU3R5bGVzKGh0bWwpKTtcclxuLy8gICAgICAgZWRpdG9yLmlubmVySFRNTCA9IHRoaXMuc2FuaXRpemVkQ29udGVudCBhcyBzdHJpbmc7XHJcblxyXG4vLyAgICAgICAvLyBQbGFjZSB0aGUgY2FyZXQgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudFxyXG4vLyAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbi8vICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgXHJcbi8vICAgICAgIGlmIChlZGl0b3IubGFzdENoaWxkKSB7XHJcbi8vICAgICAgICAgLy8gU2V0IHRoZSByYW5nZSBhdCB0aGUgZW5kIG9mIHRoZSBlZGl0b3IncyBjb250ZW50XHJcbi8vICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRvcik7XHJcbi8vICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOyAvLyBjb2xsYXBzZSB0byB0aGUgZW5kXHJcbi8vICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuLy8gICAgICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHJhbmdlKTtcclxuLy8gICAgICAgfVxyXG5cclxuLy8gICAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xyXG4vLyAgICAgICAgIGlmIChlZGl0b3IpIHtcclxuLy8gICAgICAgICAgIHRoaXMub25Nb2RlbENoYW5nZShlZGl0b3IuaW5uZXJIVE1MKTtcclxuXHJcbi8vICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGNhcmV0IHJlbWFpbnMgYXQgdGhlIGVuZCBhZnRlciBuZXcgY29udGVudCBpcyBhZGRlZFxyXG4vLyAgICAgICAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4vLyAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICAgICAgXHJcbi8vICAgICAgICAgICBpZiAoZWRpdG9yLmxhc3RDaGlsZCkge1xyXG4vLyAgICAgICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcclxuLy8gICAgICAgICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOyAvLyBjb2xsYXBzZSB0byB0aGUgZW5kXHJcbi8vICAgICAgICAgICAgIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbi8vICAgICAgICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgfSk7XHJcbi8vICAgICB9XHJcbi8vICAgfSBlbHNlIHtcclxuLy8gICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4gIC8vIGZvcm1hdChjb21tYW5kOiBzdHJpbmcsIHZhbHVlPzogYW55KSB7XHJcbiAgLy8gICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgLy8gICBpZiAoZWRpdG9yKSB7XHJcbiAgLy8gICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIC8vICAgICBpZiAoY29tbWFuZCA9PT0gJ3N1YnNjcmlwdCcpIHtcclxuICAvLyAgICAgICB0aGlzLmlzU3Vic2NyaXB0QWN0aXZlID0gIXRoaXMuaXNTdWJzY3JpcHRBY3RpdmU7XHJcbiAgLy8gICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3N1YnNjcmlwdCcsIGZhbHNlLCAnJyk7XHJcbiAgLy8gICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PT0gJ3N1cGVyc2NyaXB0Jykge1xyXG4gIC8vICAgICAgIHRoaXMuaXNTdXBlcnNjcmlwdEFjdGl2ZSA9ICF0aGlzLmlzU3VwZXJzY3JpcHRBY3RpdmU7XHJcbiAgLy8gICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ3N1cGVyc2NyaXB0JywgZmFsc2UsICcnKTs7XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIHZhbHVlID8/ICcnKTtcclxuICAvLyAgICAgICBpZiAodmFsdWUpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IHRhZyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWzw+XS9nLCAnJylcclxuICAvLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb3JtYXRCbG9jayA9IHRoaXMuZm9ybWF0QmxvY2tEZWNvZGUodGFnKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyAgICB0aGlzLmNoZWNrQWN0aXZlU3RhdGVzKCk7XHJcbiAgLy8gICAgdGhpcy5jaGVja0Zvcm1hdEJsb2NrKCk7XHJcbiAgLy8gfVxyXG5cclxuXHJcbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNsb3Nlc3QgPGxpPiBlbGVtZW50XHJcbiAgZ2V0Q2xvc2VzdExpc3RJdGVtKG5vZGU6IE5vZGUpOiBIVE1MRWxlbWVudCB8IG51bGwge1xyXG4gICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZG9jdW1lbnQpIHtcclxuICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT09IFwiTElcIikge1xyXG4gICAgICAgIHJldHVybiBub2RlIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGUhO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyBHZXQgdGhlIGN1cnJlbnQgbmVzdGluZyBsZXZlbCBvZiBhIGxpc3QgaXRlbVxyXG4gIGdldExpc3RJdGVtTGV2ZWwobGlzdEl0ZW06IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcclxuICAgIGxldCBsZXZlbCA9IDA7XHJcbiAgICBsZXQgcGFyZW50ID0gbGlzdEl0ZW0ucGFyZW50RWxlbWVudDtcclxuXHJcbiAgICB3aGlsZSAocGFyZW50KSB7XHJcbiAgICAgIGlmIChwYXJlbnQubm9kZU5hbWUgPT09IFwiVUxcIiB8fCBwYXJlbnQubm9kZU5hbWUgPT09IFwiT0xcIikge1xyXG4gICAgICAgIGxldCBncmFuZHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGlmIChncmFuZHBhcmVudCAmJiBncmFuZHBhcmVudC5ub2RlTmFtZSA9PT0gXCJMSVwiKSB7XHJcbiAgICAgICAgICBsZXZlbCsrO1xyXG4gICAgICAgICAgcGFyZW50ID0gZ3JhbmRwYXJlbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxldmVsO1xyXG4gIH1cclxuXHJcbiAgLy8gSW5jcmVhc2UgdGhlIGxpc3QgbGV2ZWwgKFRhYiBrZXkpXHJcbiAgaW5jcmVhc2VMaXN0TGV2ZWwobGlzdEl0ZW06IEhUTUxFbGVtZW50KSB7XHJcbiAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSB0aGlzLmdldExpc3RJdGVtTGV2ZWwobGlzdEl0ZW0pO1xyXG4gICAgaWYgKGN1cnJlbnRMZXZlbCA+PSB0aGlzLmxpc3RTdHlsZXMubGVuZ3RoIC0gMSkgcmV0dXJuO1xyXG4gICAgY29uc3QgcGFyZW50TGlzdCA9IGxpc3RJdGVtLnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBwcmV2aW91c1NpYmxpbmcgPSBsaXN0SXRlbS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCFwYXJlbnRMaXN0IHx8ICFwcmV2aW91c1NpYmxpbmcpIHJldHVybjtcclxuICAgIGNvbnN0IGlzT3JkZXJlZExpc3QgPSBwYXJlbnRMaXN0LnRhZ05hbWUgPT09IFwiT0xcIjtcclxuICAgIGxldCBzdWJsaXN0ID0gcHJldmlvdXNTaWJsaW5nLnF1ZXJ5U2VsZWN0b3IoXCJvbCwgdWxcIikgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoIXN1Ymxpc3QpIHtcclxuICAgICAgc3VibGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXNPcmRlcmVkTGlzdCA/IFwib2xcIiA6IFwidWxcIik7XHJcbiAgICAgIHByZXZpb3VzU2libGluZy5hcHBlbmRDaGlsZChzdWJsaXN0KTtcclxuICAgIH1cclxuICAgIC8vIEFwcGx5IGFwcHJvcHJpYXRlIGxpc3Qgc3R5bGVzXHJcbiAgICBpZiAoaXNPcmRlcmVkTGlzdCkge1xyXG4gICAgICBzdWJsaXN0LnN0eWxlLmxpc3RTdHlsZVR5cGUgPSB0aGlzLmxpc3RTdHlsZXNbY3VycmVudExldmVsICsgMV07IC8vIEZvciBPcmRlcmVkIGxpc3Qgc3R5bGVzXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB1bm9yZGVyZWRTdHlsZXMgPSBbXCJkaXNjXCIsIFwic3F1YXJlXCIsIFwiY2lyY2xlXCJdOyAvL0ZvciBVbm9yZGVyZWQgbGlzdCBzdHlsZXNcclxuICAgICAgc3VibGlzdC5zdHlsZS5saXN0U3R5bGVUeXBlID1cclxuICAgICAgICB1bm9yZGVyZWRTdHlsZXNbTWF0aC5taW4oY3VycmVudExldmVsICsgMSwgdW5vcmRlcmVkU3R5bGVzLmxlbmd0aCAtIDEpXTtcclxuICAgIH1cclxuXHJcbiAgICBzdWJsaXN0LmFwcGVuZENoaWxkKGxpc3RJdGVtKTtcclxuXHJcbiAgICBpZiAoaXNPcmRlcmVkTGlzdCkge1xyXG4gICAgICBsaXN0SXRlbS5zdHlsZS5saXN0U3R5bGVUeXBlID0gdGhpcy5saXN0U3R5bGVzW2N1cnJlbnRMZXZlbCArIDFdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGlzdEl0ZW0uc3R5bGUubGlzdFN0eWxlVHlwZSA9IHN1Ymxpc3Quc3R5bGUubGlzdFN0eWxlVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkhO1xyXG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGxpc3RJdGVtKTtcclxuICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcclxuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgfVxyXG5cclxuICAvLyBEZWNyZWFzZSB0aGUgbGlzdCBsZXZlbCAoU2hpZnQrVGFiIGtleSlcclxuICBkZWNyZWFzZUxpc3RMZXZlbChsaXN0SXRlbTogSFRNTEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IHRoaXMuZ2V0TGlzdEl0ZW1MZXZlbChsaXN0SXRlbSk7XHJcbiAgICBpZiAoY3VycmVudExldmVsID09PSAwKSByZXR1cm47XHJcbiAgICBjb25zdCBwYXJlbnRMaXN0ID0gbGlzdEl0ZW0ucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGdyYW5kcGFyZW50TGlzdEl0ZW0gPSBwYXJlbnRMaXN0Py5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKFxyXG4gICAgICAhcGFyZW50TGlzdCB8fFxyXG4gICAgICAhZ3JhbmRwYXJlbnRMaXN0SXRlbSB8fFxyXG4gICAgICBncmFuZHBhcmVudExpc3RJdGVtLm5vZGVOYW1lICE9PSBcIkxJXCJcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBncmFuZHBhcmVudExpc3QgPSBncmFuZHBhcmVudExpc3RJdGVtLnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAoXHJcbiAgICAgICFncmFuZHBhcmVudExpc3QgfHxcclxuICAgICAgKGdyYW5kcGFyZW50TGlzdC5ub2RlTmFtZSAhPT0gXCJVTFwiICYmIGdyYW5kcGFyZW50TGlzdC5ub2RlTmFtZSAhPT0gXCJPTFwiKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGdyYW5kcGFyZW50TGlzdC5pbnNlcnRCZWZvcmUoXHJcbiAgICAgIGxpc3RJdGVtLFxyXG4gICAgICBncmFuZHBhcmVudExpc3RJdGVtLm5leHRFbGVtZW50U2libGluZ1xyXG4gICAgKTtcclxuICAgIGlmICghcGFyZW50TGlzdC5xdWVyeVNlbGVjdG9yKFwibGlcIikpIHtcclxuICAgICAgZ3JhbmRwYXJlbnRMaXN0SXRlbS5yZW1vdmVDaGlsZChwYXJlbnRMaXN0KTtcclxuICAgIH1cclxuICAgIGNvbnN0IGlzT3JkZXJlZExpc3QgPSBncmFuZHBhcmVudExpc3Qubm9kZU5hbWUgPT09IFwiT0xcIjtcclxuICAgIGNvbnN0IHVub3JkZXJlZFN0eWxlcyA9IFtcImRpc2NcIiwgXCJzcXVhcmVcIiwgXCJjaXJjbGVcIl07XHJcbiAgICBpZiAoaXNPcmRlcmVkTGlzdCkge1xyXG4gICAgICBsaXN0SXRlbS5zdHlsZS5saXN0U3R5bGVUeXBlID0gdGhpcy5saXN0U3R5bGVzW2N1cnJlbnRMZXZlbCAtIDFdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGlzdEl0ZW0uc3R5bGUubGlzdFN0eWxlVHlwZSA9XHJcbiAgICAgICAgdW5vcmRlcmVkU3R5bGVzW01hdGgubWluKGN1cnJlbnRMZXZlbCAtIDEsIHVub3JkZXJlZFN0eWxlcy5sZW5ndGggLSAxKV07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhsaXN0SXRlbSk7XHJcbiAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XHJcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgLy8gVXBkYXRlIHRoZSBzdHlsZSBvZiB0aGUgY3VycmVudCBsaXN0IGl0ZW1cclxuICB1cGRhdGVDdXJyZW50TGlzdEl0ZW1TdHlsZShzdHlsZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICBjb25zdCBsaXN0SXRlbSA9IHRoaXMuZ2V0Q2xvc2VzdExpc3RJdGVtKHJhbmdlLnN0YXJ0Q29udGFpbmVyKTtcclxuICAgIGNvbnNvbGUubG9nKFwibGlzdGl0ZW1cIiwgbGlzdEl0ZW0pO1xyXG5cclxuICAgIGlmIChsaXN0SXRlbSkge1xyXG4gICAgICBsZXQgcGFyZW50TGlzdCA9IGxpc3RJdGVtLnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBwYXJlbnRMaXN0ICYmXHJcbiAgICAgICAgKHBhcmVudExpc3Qubm9kZU5hbWUgPT09IFwiT0xcIiB8fCBwYXJlbnRMaXN0Lm5vZGVOYW1lID09PSBcIlVMXCIpXHJcbiAgICAgICkge1xyXG4gICAgICAgIChwYXJlbnRMaXN0IGFzIEhUTUxFbGVtZW50KS5zdHlsZS5saXN0U3R5bGVUeXBlID0gc3R5bGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvcm1hdChjb21tYW5kOiBzdHJpbmcsIHZhbHVlPzogYW55KSB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVkaXRvclwiKTtcclxuICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgICAgIGlmIChjb21tYW5kID09PSBcInN1YnNjcmlwdFwiKSB7XHJcbiAgICAgICAgdGhpcy5pc1N1YnNjcmlwdEFjdGl2ZSA9ICF0aGlzLmlzU3Vic2NyaXB0QWN0aXZlO1xyXG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwic3Vic2NyaXB0XCIsIGZhbHNlLCBcIlwiKTtcclxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09PSBcInN1cGVyc2NyaXB0XCIpIHtcclxuICAgICAgICB0aGlzLmlzU3VwZXJzY3JpcHRBY3RpdmUgPSAhdGhpcy5pc1N1cGVyc2NyaXB0QWN0aXZlO1xyXG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwic3VwZXJzY3JpcHRcIiwgZmFsc2UsIFwiXCIpO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT09IFwiaW5zZXJ0T3JkZXJlZExpc3RcIikge1xyXG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBcIlwiKTtcclxuICAgICAgICAvLyBBcHBseSB0aGUgYXBwcm9wcmlhdGUgc3R5bGUgZm9yIHRoZSBjdXJyZW50IGxldmVsXHJcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50TGlzdEl0ZW1TdHlsZSh0aGlzLmxpc3RTdHlsZXNbdGhpcy5jdXJyZW50TGlzdExldmVsXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoY29tbWFuZCwgZmFsc2UsIHZhbHVlID8/IFwiXCIpO1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgY29uc3QgdGFnID0gdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bPD5dL2csIFwiXCIpO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZvcm1hdEJsb2NrID0gdGhpcy5mb3JtYXRCbG9ja0RlY29kZSh0YWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jaGVja0FjdGl2ZVN0YXRlcygpO1xyXG4gICAgdGhpcy5jaGVja0Zvcm1hdEJsb2NrKCk7XHJcbiAgfVxyXG4gIGNoZWNrQWN0aXZlU3RhdGVzKCkge1xyXG4gICAgdGhpcy5pc0JvbGRBY3RpdmUgPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnYm9sZCcpO1xyXG4gICAgdGhpcy5pc0l0YWxpY0FjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdpdGFsaWMnKTtcclxuICAgIHRoaXMuaXNVbmRlcmxpbmVBY3RpdmUgPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgndW5kZXJsaW5lJyk7XHJcbiAgICB0aGlzLmlzU3RyaWtldGhyb3VnaEFjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdHJpa2V0aHJvdWdoJyk7XHJcbiAgICB0aGlzLmlzU3Vic2NyaXB0QWN0aXZlID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3N1YnNjcmlwdCcpO1xyXG4gICAgdGhpcy5pc1N1cGVyc2NyaXB0QWN0aXZlID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3N1cGVyc2NyaXB0Jyk7XHJcbiAgfVxyXG5cclxuICBjaGVja0Zvcm1hdEJsb2NrKCkge1xyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgaWYgKGVkaXRvcikge1xyXG4gICAgICBjb25zdCBmb3JtYXRCbG9jayA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb3JtYXRCbG9jaycpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRm9ybWF0QmxvY2sgPSB0aGlzLmZvcm1hdEJsb2NrRGVjb2RlKGZvcm1hdEJsb2NrKTtcclxuICAgICAgLy8gWW91IGNhbiBmdXJ0aGVyIGhhbmRsZSB0aGUgZm9ybWF0QmxvY2sgdmFsdWUgYXMgbmVlZGVkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb3JtYXRCbG9ja0RlY29kZShkYXRhOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgc3dpdGNoIChkYXRhKSB7XHJcbiAgICAgIGNhc2UgJ2gxJzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgMSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2gyJzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgMic7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2gzJzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgMyc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2g0JzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgNCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2g1JzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgNSc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2g2JzpcclxuICAgICAgICByZXR1cm4gJ2hlYWRpbmcgNic7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3AnOlxyXG4gICAgICAgIHJldHVybiAnbm9ybWFsJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gJ25vcm1hbCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VGb250KGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRGb250ID0gZXZlbnQ7XHJcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnZm9udE5hbWUnLCBmYWxzZSwgdGhpcy5zZWxlY3RlZEZvbnQpO1xyXG4gIH1cclxuXHJcbiAgaW5zZXJ0Q29kZUJsb2NrKCkge1xyXG4gICAgY29uc3QgY29kZSA9IGBcclxuICAgICAgPHByZSBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgICAgICAgICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjaztcclxuICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cteDogYXV0bztcclxuICAgICAgICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4O1xyXG4gICAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiA1cHg7XHJcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDVweCAxMHB4O1wiPlxyXG4gICAgICAgIDxjb2RlIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcclxuICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgICAgICAgICAgICAgICBmb250LWZhbWlseTogTWVubG8sIE1vbmFjbywgQ29uc29sYXMsICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTtcclxuICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4O1wiIGNsYXNzPVwibGFuZ3VhZ2UtaHRtbFwiPkluc2VydCBjb2RlIGhlcmUuLi48L2NvZGU+XHJcbiAgICAgIDwvcHJlPlxyXG4gICAgYDtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIGNvZGUpO1xyXG4gIH1cclxuXHJcbiAgLy8gY2hhbmdlRm9udFNpemUoZXZlbnQ6IGFueSkge1xyXG4gIC8vICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvbnRTaXplJywgZmFsc2UsICc3Jyk7XHJcbiAgLy8gICBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIC8vICAgaWYgKGVkaXRvcikge1xyXG4gIC8vICAgICBsZXQgZm9udEVsZW1lbnRzID0gZWRpdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdmb250Jyk7XHJcbiAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgaWYgKGZvbnRFbGVtZW50c1tpXS5zaXplID09IFwiN1wiKSB7XHJcbiAgLy8gICAgICAgICBmb250RWxlbWVudHNbaV0ucmVtb3ZlQXR0cmlidXRlKFwic2l6ZVwiKTtcclxuICAvLyAgICAgICAgIGZvbnRFbGVtZW50c1tpXS5zdHlsZS5mb250U2l6ZSA9IHRoaXMuc2VsZWN0ZWRGb250U2l6ZSArICdweCc7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIGNoYW5nZUZvbnRTaXplKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIFxyXG4gICAgaWYgKHNlbGVjdGVkVGV4dCAmJiBzZWxlY3RlZFRleHQucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGVkVGV4dC5nZXRSYW5nZUF0KDApO1xyXG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgc3Bhbi5zdHlsZS5mb250U2l6ZSA9IHRoaXMuc2VsZWN0ZWRGb250U2l6ZSArICdweCc7XHJcbiAgICAgICAgcmFuZ2Uuc3Vycm91bmRDb250ZW50cyhzcGFuKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZExpbmsoKSB7XHJcbiAgICBsZXQgdXJsID0gcHJvbXB0KFwiRW50ZXIgdGhlIGxpbmsgaGVyZTogXCIsIFwiaHR0cDovL1wiKTtcclxuICAgIGlmICh1cmwpIHtcclxuICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjcmVhdGVMaW5rXCIsIGZhbHNlLCB1cmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5zZXJ0c0ltYWdlKCkge1xyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgaWYgKGVkaXRvcikge1xyXG4gICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgICAgbGV0IGltYWdlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1hZ2VJbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgIGlmIChpbWFnZUlucHV0KSB7XHJcbiAgICAgICAgaW1hZ2VJbnB1dC5jbGljaygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBoYW5kbGVJbWFnZVVwbG9hZChldmVudDogYW55KSB7XHJcbiAgLy8gICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xyXG4gIC8vICAgaWYgKGZpbGUpIHtcclxuICAvLyAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAvLyAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAvLyAgICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAvLyAgICAgICBpbWcuc3JjID0gZS50YXJnZXQucmVzdWx0O1xyXG4gIC8vICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgLy8gICAgICAgICAvLyBDcmVhdGUgdGhlIEhUTUwgc3RyaW5nIHdpdGggdGhlIGV4YWN0IHdpZHRoIGFuZCBoZWlnaHRcclxuICAvLyAgICAgICAgIGNvbnN0IGltZ0hUTUwgPSBgPGltZyBzcmM9XCIke2ltZy5zcmN9XCIgd2lkdGg9XCIkezc5NH1cIiA+YDtcclxuICAvLyAgICAgICAgIC8vIEluc2VydCB0aGUgaW1hZ2UgaW50byB0aGUgZWRpdG9yXHJcbiAgLy8gICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCBpbWdIVE1MKTtcclxuICAvLyAgICAgICB9O1xyXG4gIC8vICAgICB9O1xyXG4gIC8vICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGhhbmRsZUltYWdlVXBsb2FkKGV2ZW50OiBhbnkpIHtcclxuICBjb25zdCBmaWxlID0gZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xyXG4gIGNvbnN0IGVkaXRvckVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7IC8vIFJlZmVyZW5jZSB0byB0aGUgZWRpdG9yXHJcblxyXG4gIGlmIChmaWxlICYmIGVkaXRvckVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGVkaXRvcldpZHRoID0gZWRpdG9yRWxlbWVudC5vZmZzZXRXaWR0aDsgLy8gR2V0IHRoZSBlZGl0b3IncyB3aWR0aFxyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcbiAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1nLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcclxuXHJcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaW1nV2lkdGggPSBpbWcud2lkdGg7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBpbWFnZSB3aWR0aCBleGNlZWRzIHRoZSBlZGl0b3IncyB3aWR0aCwgZml0IGl0IHRvIHRoZSBlZGl0b3JcclxuICAgICAgICBjb25zdCBpbWdIVE1MID1cclxuICAgICAgICAgIGltZ1dpZHRoID4gZWRpdG9yV2lkdGhcclxuICAgICAgICAgICAgPyBgPGltZyBzcmM9XCIke2ltZy5zcmN9XCIgc3R5bGU9XCIgbWF4LXdpZHRoOiAkezcwMH1weDsgaGVpZ2h0OiBhdXRvO1wiPmBcclxuICAgICAgICAgICAgOiBgPGltZyBzcmM9XCIke2ltZy5zcmN9XCIgc3R5bGU9XCJ3aWR0aDogJHtpbWdXaWR0aH1weDsgaGVpZ2h0OiBhdXRvO1wiPmA7XHJcbiAgICAgICAgdGhpcy5uZXdJbWFnZUFkZGVkLmVtaXQoKVxyXG4gICAgICAgIC8vIEluc2VydCB0aGUgaW1hZ2UgaW50byB0aGUgZWRpdG9yXHJcbiAgICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgaW1nSFRNTCk7XHJcbiAgICAgIH07XHJcbiAgICB9O1xyXG5cclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG4gIC8vIGFkZFRhYmxlKCkge1xyXG4gIC8vICAgY29uc3QgdGFibGVXaWR0aCA9IDgyNTsgLy8gVGFibGUgd2lkdGggaW4gcGl4ZWxzXHJcbiAgLy8gICBjb25zdCBjb2xzID0gMzsgLy8gTnVtYmVyIG9mIGNvbHVtbnNcclxuICAvLyAgIGNvbnN0IGNlbGxNaW5XaWR0aCA9IHRhYmxlV2lkdGggLyBjb2xzOyAvLyBDYWxjdWxhdGUgbWluaW11bSB3aWR0aCBmb3IgZWFjaCBjZWxsXHJcblxyXG4gIC8vICAgbGV0IHRhYmxlID0gYDxiciAvPjx0YWJsZSBzdHlsZT1cIndpZHRoOiAke3RhYmxlV2lkdGh9cHg7XCI+YDtcclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7IC8vIE51bWJlciBvZiByb3dzXHJcbiAgLy8gICAgIHRhYmxlICs9ICc8dHIgPic7XHJcbiAgLy8gICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrKSB7XHJcbiAgLy8gICAgICAgdGFibGUgKz0gYDx0ZCBzdHlsZT1cIiB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgbWluLXdpZHRoOiAke2NlbGxNaW5XaWR0aH1weDtcIj4mbmJzcDs8L3RkPmA7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgICAgdGFibGUgKz0gJzwvdHI+JztcclxuICAvLyAgIH1cclxuICAvLyAgICAgdGFibGUgKz0gJzwvdGFibGU+PGJyLyA+JztcclxuICAvLyAgICAgLy8gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgdGFibGUpO1xyXG4gIC8vICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgLy8gICBpZiAoZWRpdG9yKSB7XHJcbiAgLy8gICAgIGVkaXRvci5mb2N1cygpO1xyXG4gIC8vICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCB0YWJsZSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICB0aGlzLnRhYmxlQWRkZWQgPSB0cnVlO1xyXG4gIC8vICAgdGhpcy5jaGVja1RhYmxlU2VsZWN0aW9uKCk7XHJcbiAgLy8gfVxyXG5cclxuXHJcbiAgaGFuZGxlVGFiS2V5KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09IFwiVGFiXCIpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gU3RvcCBkZWZhdWx0IHRhYmJpbmcgYmVoYXZpb3JcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgY29uc3QgdGFiTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpOyAvLyBDcmVhdGUgYSBzcGFuIGVsZW1lbnQgZm9yIHRoZSB0YWIgc3BhY2VcclxuICAgICAgdGFiTm9kZS5pbm5lckhUTUwgPSBcIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1wiOyAvLyBGb3VyIG5vbi1icmVha2luZyBzcGFjZXMgdG8gbWltaWMgdGFiXHJcbiAgICAgIFxyXG4gICAgICByYW5nZS5kZWxldGVDb250ZW50cygpOyAvLyBSZW1vdmUgYW55IHNlbGVjdGVkIHRleHRcclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZSh0YWJOb2RlKTsgLy8gSW5zZXJ0IHRoZSB0YWIgc3BhY2UgYXMgc3BhblxyXG4gICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRhYk5vZGUpOyAvLyBNb3ZlIGN1cnNvciBhZnRlciB0aGUgaW5zZXJ0ZWQgc3BhblxyXG4gICAgICByYW5nZS5zZXRFbmRBZnRlcih0YWJOb2RlKTtcclxuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuLy8gICBhZGRUYWJsZSgpIHtcclxuLy8gICBjb25zdCB0YWJsZVdpZHRoID0gODI1OyAvLyBUYWJsZSB3aWR0aCBpbiBwaXhlbHNcclxuLy8gICBjb25zdCBjb2xzID0gMzsgLy8gTnVtYmVyIG9mIGNvbHVtbnNcclxuLy8gICBjb25zdCBjZWxsTWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29sczsgLy8gQ2FsY3VsYXRlIG1pbmltdW0gd2lkdGggZm9yIGVhY2ggY2VsbFxyXG5cclxuLy8gICBsZXQgdGFibGUgPSBgPGJyIC8+PHRhYmxlIHN0eWxlPVwid2lkdGg6ICR7dGFibGVXaWR0aH1weDtcIj5gO1xyXG4vLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7IC8vIE51bWJlciBvZiByb3dzXHJcbi8vICAgICB0YWJsZSArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogJHt0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCl9XCI+YDsgLy8gQWRkIGJvcmRlci1ib3R0b20gdG8gdGhlIHJvd1xyXG4vLyAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHtcclxuLy8gICAgICAgdGFibGUgKz0gYDx0ZCBzdHlsZT1cIndvcmQtd3JhcDogYnJlYWstd29yZDsgd29yZC1icmVhazogYnJlYWstYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBtaW4td2lkdGg6ICR7Y2VsbE1pbldpZHRofXB4O1wiPiZuYnNwOzwvdGQ+YDtcclxuLy8gICAgIH1cclxuLy8gICAgIHRhYmxlICs9ICc8L3RyPic7XHJcbi8vICAgfVxyXG4vLyAgIHRhYmxlICs9ICc8L3RhYmxlPjxici8+JztcclxuXHJcbi8vICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4vLyAgIGlmIChlZGl0b3IpIHtcclxuLy8gICAgIGVkaXRvci5mb2N1cygpO1xyXG4vLyAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgdGFibGUpO1xyXG4vLyAgIH1cclxuXHJcbi8vICAgdGhpcy50YWJsZUFkZGVkID0gdHJ1ZTtcclxuLy8gICB0aGlzLmNoZWNrVGFibGVTZWxlY3Rpb24oKTtcclxuLy8gfVxyXG4vLyBhZGRUYWJsZSgpIHtcclxuLy8gICBjb25zdCB0YWJsZVdpZHRoID0gODI1O1xyXG4vLyAgIGNvbnN0IGNvbHMgPSAzO1xyXG4vLyAgIGNvbnN0IGNlbGxNaW5XaWR0aCA9IHRhYmxlV2lkdGggLyBjb2xzO1xyXG5cclxuLy8gICBsZXQgdGFibGUgPSBgPGJyIC8+PHRhYmxlIGlkPVwiY3VzdG9tVGFibGVcIiBzdHlsZT1cIndpZHRoOiAke3RhYmxlV2lkdGh9cHg7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XCI+YDtcclxuXHJcbi8vICAgdGFibGUgKz0gYDx0Ym9keT5gO1xyXG4vLyAgIHRhYmxlICs9IGA8dHIgaWQ9XCJ0YWJsZUhlYWRlclJvd1wiIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogJHt0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCl9O1wiIChjbGljayk9XCJjaGVja1RhYmxlU2VsZWN0aW9uKClcIj5gO1xyXG4vLyAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrKSB7XHJcbi8vICAgICB0YWJsZSArPSBgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbGxcIiBcclxuLy8gICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci10b3A6IDJweCBzb2xpZCBibGFjazsgXHJcbi8vICAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOyBcclxuLy8gICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogc3RhcnQ7IFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7IFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOyBcclxuLy8gICAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOiAke2NlbGxNaW5XaWR0aH1weDsgXHJcbi8vICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsgXHJcbi8vICAgICAgICAgICAgICAgICAgICAgLy8gIHBvaW50ZXItZXZlbnRzOiBub25lICFpbXBvcnRhbnQ7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwgIWltcG9ydGFudDtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xyXG4vLyBoZWlnaHQ6MjhweDtcIj48L3RkPmA7XHJcbi8vICAgfVxyXG4vLyAgIHRhYmxlICs9IGA8L3RyPmA7XHJcblxyXG4vLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XHJcbi8vICAgICB0YWJsZSArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogJHt0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCl9XCI+YDtcclxuLy8gICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrKSB7XHJcbi8vICAgICAgIHRhYmxlICs9IGA8dGQgc3R5bGU9XCJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7IFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOyBcclxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOiAke2NlbGxNaW5XaWR0aH1weDtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XCI+Jm5ic3A7PC90ZD5gO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgdGFibGUgKz0gXCI8L3RyPlwiO1xyXG4vLyAgIH1cclxuLy8gICB0YWJsZSArPSBgPC90Ym9keT48L3RhYmxlPjxici8+YDtcclxuXHJcbi8vICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlZGl0b3JcIik7XHJcbi8vICAgaWYgKGVkaXRvcikge1xyXG4vLyAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbi8vICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImluc2VydEhUTUxcIiwgZmFsc2UsIHRhYmxlKTtcclxuLy8gICB9XHJcblxyXG4vLyAgIHRoaXMudGFibGVBZGRlZCA9IHRydWU7XHJcbi8vICAgdGhpcy5jaGVja1RhYmxlU2VsZWN0aW9uKCk7XHJcblxyXG4vLyAgIC8vIEFkZCBzdHlsZXMgdG8gcHJldmVudCB0YWJsZSBzdHJ1Y3R1cmUgYnJlYWtpbmdcclxuLy8gICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcclxuLy8gICBzdHlsZS5pbm5lckhUTUwgPSBgXHJcbi8vICAgI2N1c3RvbVRhYmxlIHtcclxuLy8gICAgIHRhYmxlLWxheW91dDogZml4ZWQgIWltcG9ydGFudDtcclxuLy8gICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2UgIWltcG9ydGFudDtcclxuLy8gICB9XHJcbi8vICAgI2N1c3RvbVRhYmxlIHRyIHtcclxuLy8gICAgIGRpc3BsYXk6IHRhYmxlLXJvdyAhaW1wb3J0YW50O1xyXG4vLyAgIH1cclxuLy8gICAjY3VzdG9tVGFibGUgdGQge1xyXG4vLyAgICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xyXG4vLyAgICAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xyXG4vLyAgIH1cclxuLy8gICAjY3VzdG9tVGFibGUgLmhlYWRlci1jZWxsIHtcclxuLy8gICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcclxuLy8gICB9XHJcbi8vICAgI2N1c3RvbVRhYmxlIC5oZWFkZXItY2VsbCA+IHNwYW4ge1xyXG4vLyAgICAgZGlzcGxheTogaW5saW5lICFpbXBvcnRhbnQ7XHJcbi8vICAgICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XHJcbi8vICAgfVxyXG4vLyAgICNjdXN0b21UYWJsZSAuaGVhZGVyLWNlbGw6aG92ZXIge1xyXG4vLyAgICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XHJcbi8vICAgfVxyXG4vLyBgO1xyXG4vLyAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xyXG4vLyB9XHJcblxyXG5hZGRUYWJsZSgpIHtcclxuICBjb25zdCB0YWJsZVdpZHRoID0gODI1O1xyXG4gIGNvbnN0IGNvbHMgPSAzO1xyXG4gIGNvbnN0IGNlbGxNaW5XaWR0aCA9IHRhYmxlV2lkdGggLyBjb2xzO1xyXG5cclxuICBsZXQgdGFibGUgPSBgPGJyIC8+PHRhYmxlIGlkPVwiY3VzdG9tVGFibGVcIiBzdHlsZT1cIndpZHRoOiAke3RhYmxlV2lkdGh9cHg7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XCI+YDtcclxuICB0YWJsZSArPSBgPHRib2R5PmA7XHJcblxyXG4gIC8vIFRhYmxlIEhlYWRlciBSb3dcclxuICB0YWJsZSArPSBgPHRyIGlkPVwidGFibGVIZWFkZXJSb3dcIiBzdHlsZT1cImJvcmRlci1ib3R0b206ICR7dGhpcy50aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVGb3JUYWJsZSgpfTtcIiBvbmNsaWNrPVwiY2hlY2tUYWJsZVNlbGVjdGlvbigpXCI+YDtcclxuXHJcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHtcclxuICAgIHRhYmxlICs9IGA8dGQgY2xhc3M9XCJoZWFkZXItY2VsbFwiIFxyXG4gICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXRvcDogMnB4IHNvbGlkIGJsYWNrOyBcclxuICAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7IFxyXG4gICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBzdGFydDsgXHJcbiAgICAgICAgICAgICAgICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsgXHJcbiAgICAgICAgICAgICAgICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgXHJcbiAgICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7IFxyXG4gICAgICAgICAgICAgICAgICAgICBtaW4td2lkdGg6ICR7Y2VsbE1pbldpZHRofXB4OyBcclxuICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50OyBcclxuICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbCAhaW1wb3J0YW50O1xyXG4gICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgIGhlaWdodDoyOHB4O1wiPjwvdGQ+YDtcclxuICB9XHJcblxyXG4gIC8vIFByb3Blcmx5IGNsb3NpbmcgdGhlIGhlYWRlciByb3dcclxuICB0YWJsZSArPSBgPC90cj5gO1xyXG5cclxuICAvLyBEYXRhIFJvd3NcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xyXG4gICAgdGFibGUgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206ICR7dGhpcy50aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVGb3JUYWJsZSgpfVwiPmA7XHJcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKykge1xyXG4gICAgICB0YWJsZSArPSBgPHRkIHN0eWxlPVwid29yZC13cmFwOiBicmVhay13b3JkOyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyBcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbi13aWR0aDogJHtjZWxsTWluV2lkdGh9cHg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwgIWltcG9ydGFudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1wiPiZuYnNwOzwvdGQ+YDtcclxuICAgIH1cclxuICAgIHRhYmxlICs9IGA8L3RyPmA7XHJcbiAgfVxyXG5cclxuICB0YWJsZSArPSBgPC90Ym9keT48L3RhYmxlPjxici8+YDtcclxuXHJcbiAgLy8gSW5zZXJ0aW5nIGludG8gdGhlIGVkaXRvclxyXG4gIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZWRpdG9yXCIpO1xyXG4gIGlmIChlZGl0b3IpIHtcclxuICAgIGVkaXRvci5mb2N1cygpO1xyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbnNlcnRIVE1MXCIsIGZhbHNlLCB0YWJsZSk7XHJcbiAgfVxyXG5cclxuICB0aGlzLnRhYmxlQWRkZWQgPSB0cnVlO1xyXG4gIHRoaXMuY2hlY2tUYWJsZVNlbGVjdGlvbigpO1xyXG5cclxuICAvLyBBZGQgc3R5bGVzIHRvIHByZXZlbnQgdGFibGUgc3RydWN0dXJlIGJyZWFraW5nXHJcbiAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcbiAgc3R5bGUuaW5uZXJIVE1MID0gYFxyXG4gICNjdXN0b21UYWJsZSB7XHJcbiAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkICFpbXBvcnRhbnQ7XHJcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG4gICNjdXN0b21UYWJsZSB0ciB7XHJcbiAgICBkaXNwbGF5OiB0YWJsZS1yb3cgIWltcG9ydGFudDtcclxuICB9XHJcbiAgI2N1c3RvbVRhYmxlIHRkIHtcclxuICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwgIWltcG9ydGFudDtcclxuICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcclxuICB9XHJcbiAgI2N1c3RvbVRhYmxlIC5oZWFkZXItY2VsbCB7XHJcbiAgICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG4gICNjdXN0b21UYWJsZSAuaGVhZGVyLWNlbGwgPiBzcGFuIHtcclxuICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xyXG4gICAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xyXG4gIH1cclxuICAjY3VzdG9tVGFibGUgLmhlYWRlci1jZWxsOmhvdmVyIHtcclxuICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xyXG4gIH1cclxuYDtcclxuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcclxufVxyXG5cclxuXHJcbi8vIEZ1bmN0aW9uIHRvIGNoYW5nZSB0aGUgZmlyc3Qgcm93ICh0aGVhZCkgYmFja2dyb3VuZCBjb2xvclxyXG5zZXRUaGVhZEJnQ29sb3IoZXZlbnQ6IGFueSkge1xyXG4gIGNvbnN0IHNlbGVjdGVkQ29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XHJcblxyXG4gIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAgIGNvbnN0IGhlYWRlclJvdyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5xdWVyeVNlbGVjdG9yKFwidHJcIikgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgaWYgKGhlYWRlclJvdykge1xyXG4gICAgICBjb25zdCBoZWFkZXJDZWxscyA9IGhlYWRlclJvdy5xdWVyeVNlbGVjdG9yQWxsKFwiLmhlYWRlci1jZWxsXCIpO1xyXG4gICAgICBoZWFkZXJDZWxscy5mb3JFYWNoKChjZWxsOiBFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgKGNlbGwgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHNlbGVjdGVkQ29sb3I7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG4gIGNoZWNrVGFibGVTZWxlY3Rpb24oZXZlbnQ/OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBsZXQgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICh0YXJnZXQgJiYgKHRhcmdldC50YWdOYW1lID09PSAnVEQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEgnKSkge1xyXG4gICAgICB0aGlzLmlzVGFibGVTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRhcmdldC5jbG9zZXN0KCd0YWJsZScpIGFzIEhUTUxUYWJsZUVsZW1lbnQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzVGFibGVTZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyB0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcclxuICB9XHJcblxyXG4gIGNoZWNrUGxhY2Vob2xkZXIoKSB7XHJcbiAgICAvLyBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgLy8gaWYgKGVkaXRvcikge1xyXG4gICAgLy8gICB0aGlzLmlzUGxhY2Vob2xkZXJWaXNpYmxlID0gZWRpdG9yLmlubmVySFRNTCA9PT0gJycgfHwgZWRpdG9yLmlubmVySFRNTCA9PT0gJzxicj4nO1xyXG4gICAgLy8gICBpZiAodGhpcy5pc1BsYWNlaG9sZGVyVmlzaWJsZSkge1xyXG4gICAgLy8gICAgIC8vIGVkaXRvci5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJwbGFjZWhvbGRlclwiIHN0eWxlPVwiYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGNvbG9yOiAjMDAwMDAwXCI+SW5zZXJ0IHRleHQgaGVyZSAuLi48L3NwYW4+JztcclxuICAgIC8vICAgfSBlbHNlIHtcclxuICAgIC8vICAgICBsZXQgcGxhY2Vob2xkZXIgPSBlZGl0b3IucXVlcnlTZWxlY3RvcignLnBsYWNlaG9sZGVyJyk7XHJcbiAgICAvLyAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XHJcbiAgICAvLyAgICAgICBlZGl0b3IucmVtb3ZlQ2hpbGQocGxhY2Vob2xkZXIpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfVxyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgb25Gb2N1cygpIHtcclxuICAgIC8vIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgICAvLyBpZiAoZWRpdG9yICYmIHRoaXMuaXNQbGFjZWhvbGRlclZpc2libGUpIHtcclxuICAgIC8vICAgZWRpdG9yLmlubmVySFRNTCA9ICcnO1xyXG4gICAgLy8gICB0aGlzLmlzUGxhY2Vob2xkZXJWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICAvLyBjb2xvckNoYW5nZShuZXdDb2xvcjogc3RyaW5nKSB7XHJcbiAgLy8gICB0aGlzLmNvbG9yID0gbmV3Q29sb3I7XHJcbiAgLy8gfVxyXG5cclxuICBvbkJsdXIoKSB7XHJcbiAgICB0aGlzLmNoZWNrUGxhY2Vob2xkZXIoKTtcclxuICB9XHJcblxyXG4gIC8vIGFkZFJvdygpIHtcclxuICAvLyAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAvLyAgICAgbGV0IHJvdyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5pbnNlcnRSb3coKTtcclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgIGxldCBjZWxsID0gcm93Lmluc2VydENlbGwoaSk7XHJcbiAgLy8gICAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7JztcclxuICAvLyAgICAgICBjZWxsLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgYmxhY2snO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBhZGRSb3coKSB7XHJcbiAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gICAgbGV0IHJvdyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5pbnNlcnRSb3coKTtcclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggdGhlIGNvbHVtbnMgb2YgdGhlIGZpcnN0IHJvdyB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjZWxsc1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1swXS5jZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgY2VsbCA9IHJvdy5pbnNlcnRDZWxsKGkpO1xyXG4gICAgICBjZWxsLmlubmVySFRNTCA9ICcmbmJzcDsnO1xyXG5cclxuICAgICAgLy8gQXBwbHkgYm90dG9tIGJvcmRlciBleHBsaWNpdGx5XHJcbiAgICAgIGNlbGwuc3R5bGUuYm9yZGVyQm90dG9tID0gYDJweCBzb2xpZCAke3RoaXMudGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lQ29sb3JGb3JUYWJsZSgpfWA7IC8vIFlvdSBjYW4gcmVwbGFjZSAnYmxhY2snIHdpdGggeW91ciB0aGVtZSBjb2xvclxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gICBhZGRSb3coKSB7XHJcbi8vICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4vLyAgICAgbGV0IHJvdyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5pbnNlcnRSb3coKTtcclxuLy8gICAgIHJvdy5zdHlsZS5ib3JkZXJCb3R0b20gPSB0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCk7IC8vIEFkZCBib3R0b20gYm9yZGVyIHRvIHRoZSByb3dcclxuLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOyBpKyspIHtcclxuLy8gICAgICAgbGV0IGNlbGwgPSByb3cuaW5zZXJ0Q2VsbChpKTtcclxuLy8gICAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7JztcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbi8vIH1cclxuXHJcblxyXG4gIC8vIGRlbGV0ZVJvdygpIHtcclxuICAvLyAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAvLyAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLmRlbGV0ZVJvdygtMSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuLy8gICBkZWxldGVSb3coKSB7XHJcbi8vICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4vLyAgICAgbGV0IHJvd0luZGV4ID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoIC0gMTsgXHJcbi8vICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xyXG4vLyAgICAgICBsZXQgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4vLyAgICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbi8vICAgICAgICAgbGV0IHJvdyA9IHNlbGVjdGlvbi5hbmNob3JOb2RlPy5wYXJlbnRFbGVtZW50Py5jbG9zZXN0KCd0cicpO1xyXG4vLyAgICAgICAgIGlmIChyb3cpIHtcclxuLy8gICAgICAgICAgIHJvd0luZGV4ID0gcm93LnJvd0luZGV4O1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLmRlbGV0ZVJvdyhyb3dJbmRleCk7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4gIGRlbGV0ZVJvdygpIHtcclxuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICBpZiAoIXNlbGVjdGlvbi5yYW5nZUNvdW50KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIGNvbnN0IHNlbGVjdGVkTm9kZSA9IHJhbmdlLnN0YXJ0Q29udGFpbmVyO1xyXG4gICAgY29uc3Qgcm93ID0gc2VsZWN0ZWROb2RlLnBhcmVudEVsZW1lbnQ/LmNsb3Nlc3QoJ3RyJyk7XHJcblxyXG4gICAgaWYgKHJvdykge1xyXG4gICAgICBjb25zdCB0YWJsZSA9IHJvdy5jbG9zZXN0KCd0YWJsZScpO1xyXG4gICAgICBpZiAodGFibGUpIHtcclxuICAgICAgICB0YWJsZS5kZWxldGVSb3cocm93LnJvd0luZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuXHJcbiAgLy8gYWRkQ29sdW1uKCkge1xyXG4gIC8vICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgbGV0IGNlbGwgPSB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5pbnNlcnRDZWxsKC0xKTtcclxuICAvLyAgICAgICBjZWxsLmlubmVySFRNTCA9ICcmbmJzcDsnO1xyXG4gIC8vICAgICAgIGNlbGwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCBibGFjayc7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4vLyAgIGFkZENvbHVtbigpIHtcclxuLy8gICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XHJcbi8vICAgICBjb25zdCBjb2x1bW5Db3VudCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aCArIDE7IC8vIE5ldyBjb2x1bW4gY291bnRcclxuLy8gICAgIGNvbnN0IHRhYmxlV2lkdGggPSB0aGlzLnNlbGVjdGVkVGFibGUub2Zmc2V0V2lkdGg7XHJcbi8vICAgICBjb25zdCBtaW5XaWR0aCA9IHRhYmxlV2lkdGggLyBjb2x1bW5Db3VudDtcclxuXHJcbi8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbi8vICAgICAgIGxldCBjZWxsID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uaW5zZXJ0Q2VsbCgtMSk7XHJcbi8vICAgICAgIGNlbGwuaW5uZXJIVE1MID0gJyZuYnNwOyc7XHJcbi8vICAgICAgIGNlbGwuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCBibGFjayc7XHJcbi8vICAgICAgIGNlbGwuc3R5bGUubWluV2lkdGggPSBgJHttaW5XaWR0aH1weGA7XHJcbi8vICAgICAgIGNlbGwuc3R5bGUud29yZFdyYXAgPSAnYnJlYWstd29yZCc7XHJcbi8vICAgICAgIGNlbGwuc3R5bGUud29yZEJyZWFrID0gJ2JyZWFrLWFsbCc7XHJcbi8vICAgICAgIGNlbGwuc3R5bGUud2hpdGVTcGFjZSA9ICdub3JtYWwnO1xyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjZWxscycgbWluV2lkdGhcclxuLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuLy8gICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xyXG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmNlbGxzW2pdLnN0eWxlLm1pbldpZHRoID0gYCR7bWluV2lkdGh9cHhgO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgfVxyXG4gIC8vIH1cclxuICBcclxuICAvLyBhZGRDb2x1bW4oKSB7XHJcbiAgLy8gaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gIC8vICAgY29uc3QgY29sdW1uQ291bnQgPSB0aGlzLnNlbGVjdGVkVGFibGUucm93c1swXS5jZWxscy5sZW5ndGggKyAxOyAvLyBOZXcgY29sdW1uIGNvdW50XHJcbiAgLy8gICBjb25zdCB0YWJsZVdpZHRoID0gdGhpcy5zZWxlY3RlZFRhYmxlLm9mZnNldFdpZHRoO1xyXG4gIC8vICAgY29uc3QgbWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29sdW1uQ291bnQ7XHJcblxyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICBsZXQgY2VsbCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmluc2VydENlbGwoLTEpO1xyXG4gIC8vICAgICBjZWxsLmlubmVySFRNTCA9ICcmbmJzcDsnO1xyXG4gIC8vICAgICBjZWxsLnN0eWxlLndvcmRXcmFwID0gJ2JyZWFrLXdvcmQnO1xyXG4gIC8vICAgICBjZWxsLnN0eWxlLndvcmRCcmVhayA9ICdicmVhay1hbGwnO1xyXG4gIC8vICAgICBjZWxsLnN0eWxlLndoaXRlU3BhY2UgPSAnbm9ybWFsJztcclxuICAvLyAgICAgY2VsbC5zdHlsZS5taW5XaWR0aCA9IGAke21pbldpZHRofXB4YDtcclxuICAvLyAgICAgY2VsbC5zdHlsZS5ib3JkZXJCb3R0b20gPSBgMnB4IHNvbGlkICR7dGhpcy50aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVDb2xvckZvclRhYmxlKCl9YFxyXG4gIC8vICAgfVxyXG5cclxuICAvLyAgIC8vIFVwZGF0ZSBleGlzdGluZyByb3dzJyBib3R0b20gYm9yZGVyXHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLnN0eWxlLmJvcmRlckJvdHRvbSA9IHRoaXMudGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lRm9yVGFibGUoKTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgLy8gfVxyXG5cclxuICBhZGRDb2x1bW4oKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XHJcbiAgICAgIGNvbnN0IGNvbHVtbkNvdW50ID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoICsgMTsgLy8gTmV3IGNvbHVtbiBjb3VudFxyXG4gICAgICBjb25zdCB0YWJsZVdpZHRoID0gdGhpcy5zZWxlY3RlZFRhYmxlLm9mZnNldFdpZHRoO1xyXG4gICAgICBjb25zdCBtaW5XaWR0aCA9IHRhYmxlV2lkdGggLyBjb2x1bW5Db3VudDtcclxuXHJcbiAgICAgIC8vIEdldCB0aGUgY3VycmVudCBoZWFkZXIgYmFja2dyb3VuZCBjb2xvciBpZiBhbnlcclxuICAgICAgY29uc3QgZmlyc3RIZWFkZXJDZWxsID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbMF1cclxuICAgICAgICAuY2VsbHNbMF0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IGhlYWRlckJnQ29sb3IgPSBmaXJzdEhlYWRlckNlbGxcclxuICAgICAgICA/IGZpcnN0SGVhZGVyQ2VsbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3JcclxuICAgICAgICA6IFwiXCI7XHJcblxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGNlbGwgPSB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5pbnNlcnRDZWxsKC0xKTtcclxuICAgICAgICBjZWxsLmlubmVySFRNTCA9IFwiJm5ic3A7XCI7XHJcbiAgICAgICAgY2VsbC5zdHlsZS53b3JkV3JhcCA9IFwiYnJlYWstd29yZFwiO1xyXG4gICAgICAgIGNlbGwuc3R5bGUud29yZEJyZWFrID0gXCJicmVhay1hbGxcIjtcclxuICAgICAgICBjZWxsLnN0eWxlLndoaXRlU3BhY2UgPSBcIm5vcm1hbFwiO1xyXG4gICAgICAgIGNlbGwuc3R5bGUubWluV2lkdGggPSBgJHttaW5XaWR0aH1weGA7XHJcbiAgICAgICAgY2VsbC5zdHlsZS5ib3JkZXJCb3R0b20gPSBcIjFweCBzb2xpZCAjZDNkM2QzXCI7XHJcblxyXG4gICAgICAgIC8vIGNlbGwuc3R5bGUuYm9yZGVyQm90dG9tID0gYDJweCBzb2xpZCAke3RoaXMudGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lQ29sb3JGb3JUYWJsZSgpfWA7XHJcblxyXG4gICAgICAgIC8vIElmIGl0J3MgdGhlIGZpcnN0IHJvdywgbWFrZSBpdCBhIGhlYWRlciBjZWxsXHJcbiAgICAgICAgaWYgKGkgPT09IDApIHtcclxuICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZChcImhlYWRlci1jZWxsXCIpO1xyXG4gICAgICAgICAgY2VsbC5zdHlsZS5mb250V2VpZ2h0ID0gXCJib2xkXCI7XHJcbiAgICAgICAgICBjZWxsLnN0eWxlLnRleHRBbGlnbiA9IFwic3RhcnRcIjtcclxuICAgICAgICAgIGNlbGwuc3R5bGUucG9pbnRlckV2ZW50cyA9IFwibm9uZVwiO1xyXG4gICAgICAgICAgY2VsbC5zdHlsZS5kaXNwbGF5ID0gXCJ0YWJsZS1jZWxsXCI7XHJcbiAgICAgICAgICBjZWxsLnN0eWxlLnBvc2l0aW9uID0gXCJzdGF0aWNcIjtcclxuICAgICAgICAgIGNlbGwuc3R5bGUuYm9yZGVyVG9wID0gXCIycHggc29saWQgYmxhY2tcIjtcclxuICAgICAgICAgIC8vIGNlbGwuaW5uZXJUZXh0ID0gYEhlYWRlciAke2NvbHVtbkNvdW50fWA7XHJcblxyXG4gICAgICAgICAgLy8gQXBwbHkgdGhlIHNhbWUgYmFja2dyb3VuZCBjb2xvciBhcyBleGlzdGluZyBoZWFkZXJzXHJcbiAgICAgICAgICBpZiAoaGVhZGVyQmdDb2xvcikge1xyXG4gICAgICAgICAgICBjZWxsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGhlYWRlckJnQ29sb3I7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBVcGRhdGUgZXhpc3Rpbmcgcm93cycgYm90dG9tIGJvcmRlclxyXG4gICAgICAvLyBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIC8vICAgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uc3R5bGUuYm9yZGVyQm90dG9tID1cclxuICAgICAgLy8gICAgIHRoaXMudGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lRm9yVGFibGUoKTtcclxuICAgICAgLy8gfVxyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uY2VsbHNbal0uc3R5bGUuYm9yZGVyQm90dG9tID0gXCIxcHggc29saWQgI2QzZDNkM1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBcclxuXHJcblxyXG5cclxuXHJcbiAgZGVsZXRlQ29sdW1uKCkge1xyXG4gIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XHJcbiAgICAgIGxldCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmIChzZWxlY3Rpb24pIHtcclxuICAgICAgICBsZXQgY2VsbCA9IHNlbGVjdGlvbi5hbmNob3JOb2RlPy5wYXJlbnRFbGVtZW50Py5jbG9zZXN0KCd0ZCwgdGgnKSBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcclxuICAgICAgICBpZiAoY2VsbCkge1xyXG4gICAgICAgICAgbGV0IGNlbGxJbmRleCA9IGNlbGwuY2VsbEluZGV4O1xyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5kZWxldGVDZWxsKGNlbGxJbmRleCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4gIHRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCkge1xyXG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXHJcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgIzQxNDE0MSAhaW1wb3J0YW50J1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgIzVGNUY1RiAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lQ29sb3JGb3JUYWJsZSgpIHtcclxuICAgIGNvbnN0IGNsck1vZGUgPSBkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS1sYXlvdXQtY29sb3InKVxyXG4gICAgaWYgKGNsck1vZGUgPT0gJ2RhcmsnKSB7XHJcbiAgICAgIHJldHVybiAnIzQxNDE0MSdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnIzVGNUY1RidcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkanVzdFRhYmxlV2lkdGgoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFibGUuc3R5bGUud2lkdGggPSBldmVudC50YXJnZXQudmFsdWUgKyAncHgnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRqdXN0Q2VsbFdpZHRoKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmNlbGxzW2pdLnN0eWxlLndpZHRoID0gZXZlbnQudGFyZ2V0LnZhbHVlICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkanVzdENlbGxIZWlnaHQoZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxscy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uY2VsbHNbal0uc3R5bGUuaGVpZ2h0ID0gZXZlbnQudGFyZ2V0LnZhbHVlICsgJ3B4JztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q2FyZXRUb0VuZChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBpZiAoc2VsKSB7XHJcbiAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbGVtZW50KTtcclxuICAgIHJhbmdlLmNvbGxhcHNlKGZhbHNlKTtcclxuICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBvcGVuQ29sb3JQaWNrZXIoaW5wdXRJZDogc3RyaW5nKSB7XHJcbiAgLy8gICBjb25zdCBpbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnB1dElkKTtcclxuICAvLyAgIGlmIChpbnB1dEVsZW1lbnQpIHtcclxuICAvLyAgICAgaW5wdXRFbGVtZW50LmNsaWNrKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXRUZXh0Q29sb3IoZXZlbnQ6IGFueSkge1xyXG4gIC8vICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIC8vICAgaWYgKGVkaXRvcikge1xyXG4gIC8vICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAvLyAgICAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgLy8gICAgIHRoaXMuc2VsZWN0ZWRUZXh0Q29sb3IgPSBjb2xvcjtcclxuICAvLyAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvcmVDb2xvcicsIGZhbHNlLCBjb2xvcik7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXRCYWNrZ3JvdW5kQ29sb3IoZXZlbnQ6IGFueSkge1xyXG4gIC8vICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIC8vICAgaWYgKGVkaXRvcikge1xyXG4gIC8vICAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAvLyAgICAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgLy8gICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XHJcbiAgLy8gICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdoaWxpdGVDb2xvcicsIGZhbHNlLCBjb2xvcik7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIHNhdmVkU2VsZWN0aW9uOiBSYW5nZSB8IG51bGwgPSBudWxsO1xyXG5cclxub3BlbkNvbG9yUGlja2VyKGlucHV0SWQ6IHN0cmluZykge1xyXG4gIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgaWYgKGlucHV0RWxlbWVudCkge1xyXG4gICAgLy8gU2F2ZSB0aGUgY3VycmVudCBzZWxlY3Rpb25cclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICAgIHRoaXMuc2F2ZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgIH1cclxuICAgIGlucHV0RWxlbWVudC5jbGljaygpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gc2V0VGV4dENvbG9yKGV2ZW50OiBhbnkpIHtcclxuLy8gICBpZiAodGhpcy5zYXZlZFNlbGVjdGlvbikge1xyXG4vLyAgICAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbi8vICAgICB0aGlzLnNlbGVjdGVkVGV4dENvbG9yID0gY29sb3I7XHJcblxyXG4vLyAgICAgLy8gUmVzdG9yZSB0aGUgc2F2ZWQgc2VsZWN0aW9uXHJcbi8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbi8vICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbi8vICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuLy8gICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHRoaXMuc2F2ZWRTZWxlY3Rpb24pO1xyXG5cclxuLy8gICAgICAgLy8gQXBwbHkgdGhlIGNvbG9yIHVzaW5nIGEgc3BhblxyXG4vLyAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2F2ZWRTZWxlY3Rpb247XHJcbi8vICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbi8vICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSBjb2xvcjtcclxuLy8gICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHJhbmdlLnRvU3RyaW5nKCk7XHJcblxyXG4vLyAgICAgICAvLyBSZXBsYWNlIHRoZSBzZWxlY3RlZCB0ZXh0IHdpdGggdGhlIHN0eWxlZCBzcGFuXHJcbi8vICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbi8vICAgICAgIHJhbmdlLmluc2VydE5vZGUoc3Bhbik7XHJcblxyXG4vLyAgICAgICAvLyBDbGVhciB0aGUgc2F2ZWQgc2VsZWN0aW9uXHJcbi8vICAgICAgIHRoaXMuc2F2ZWRTZWxlY3Rpb24gPSBudWxsO1xyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuICAvLyB9XHJcbi8vICAgc2V0VGV4dENvbG9yKGV2ZW50OiBhbnkpIHtcclxuLy8gICBpZiAodGhpcy5zYXZlZFNlbGVjdGlvbikge1xyXG4vLyAgICAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbi8vICAgICB0aGlzLnNlbGVjdGVkVGV4dENvbG9yID0gY29sb3I7XHJcblxyXG4vLyAgICAgLy8gUmVzdG9yZSB0aGUgc2F2ZWQgc2VsZWN0aW9uXHJcbi8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbi8vICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4vLyAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2F2ZWRTZWxlY3Rpb247XHJcbi8vICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuLy8gICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuXHJcbi8vICAgICAgIC8vIEdldCBzZWxlY3RlZCBlbGVtZW50c1xyXG4vLyAgICAgICBjb25zdCBzZWxlY3RlZENvbnRlbnQgPSByYW5nZS5jbG9uZUNvbnRlbnRzKCk7XHJcbi8vICAgICAgIGNvbnN0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShzZWxlY3RlZENvbnRlbnQucXVlcnlTZWxlY3RvckFsbChcIipcIikpIGFzIEhUTUxFbGVtZW50W107IC8vIOKchSBFeHBsaWNpdGx5IGNhc3QgdG8gSFRNTEVsZW1lbnRbXVxyXG5cclxuLy8gICAgICAgLy8gQXBwbHkgY29sb3IgdG8gZWFjaCBlbGVtZW50IHdpdGhvdXQgbW9kaWZ5aW5nIHN0cnVjdHVyZVxyXG4vLyAgICAgICBlbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xyXG4vLyAgICAgICAgIGVsLnN0eWxlLmNvbG9yID0gY29sb3I7XHJcbi8vICAgICAgIH0pO1xyXG5cclxuLy8gICAgICAgLy8gQXBwbHkgY29sb3IgdG8gdGhlIHRvcC1sZXZlbCB0ZXh0IG5vZGVzICh3aXRob3V0IHdyYXBwaW5nIHRoZW0pXHJcbi8vICAgICAgIEFycmF5LmZyb20oc2VsZWN0ZWRDb250ZW50LmNoaWxkTm9kZXMpLmZvckVhY2goKG5vZGUpID0+IHtcclxuLy8gICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgJiYgbm9kZS50ZXh0Q29udGVudD8udHJpbSgpICE9PSBcIlwiKSB7XHJcbi8vICAgICAgICAgICBjb25zdCBwYXJlbnQgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lci5wYXJlbnRFbGVtZW50O1xyXG4vLyAgICAgICAgICAgaWYgKHBhcmVudCkge1xyXG4vLyAgICAgICAgICAgICBwYXJlbnQuc3R5bGUuY29sb3IgPSBjb2xvcjtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgIH0pO1xyXG5cclxuLy8gICAgICAgLy8gUmVwbGFjZSBzZWxlY3RlZCBjb250ZW50XHJcbi8vICAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbi8vICAgICAgIHJhbmdlLmluc2VydE5vZGUoc2VsZWN0ZWRDb250ZW50KTtcclxuXHJcbi8vICAgICAgIC8vIENsZWFyIHNhdmVkIHNlbGVjdGlvblxyXG4vLyAgICAgICB0aGlzLnNhdmVkU2VsZWN0aW9uID0gbnVsbDtcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbi8vIH1cclxuXHJcbi8vIHNldFRleHRDb2xvcihldmVudDogYW55KSB7XHJcbi8vICAgY29uc29sZS5sb2coXCJDbGlja2VkIHNldFRleHRDb2xvclwiKTtcclxuLy8gICBpZiAoIXRoaXMuc2F2ZWRTZWxlY3Rpb24pIHtcclxuLy8gICAgIGNvbnNvbGUud2FybihcIk5vIHNhdmVkIHNlbGVjdGlvbiBhdmFpbGFibGUhXCIpO1xyXG4vLyAgICAgcmV0dXJuO1xyXG4vLyAgIH1cclxuXHJcbi8vICAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbi8vICAgdGhpcy5zZWxlY3RlZFRleHRDb2xvciA9IGNvbG9yO1xyXG4vLyAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbi8vICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuLy8gICAgIGNvbnNvbGUuZXJyb3IoXCJObyB2YWxpZCBzZWxlY3Rpb24gZm91bmQhXCIpO1xyXG4vLyAgICAgcmV0dXJuO1xyXG4vLyAgIH1cclxuXHJcbi8vICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4vLyAgIHNlbGVjdGlvbi5hZGRSYW5nZSh0aGlzLnNhdmVkU2VsZWN0aW9uKTtcclxuLy8gICBjb25zdCByYW5nZSA9IHRoaXMuc2F2ZWRTZWxlY3Rpb247XHJcblxyXG4vLyAgIGNvbnN0IGdldFRhYmxlQ2VsbCA9IChub2RlOiBOb2RlIHwgbnVsbCk6IEhUTUxFbGVtZW50IHwgbnVsbCA9PiB7XHJcbi8vICAgICBsZXQgY3VycmVudE5vZGUgPSBub2RlO1xyXG4vLyAgICAgaWYgKGN1cnJlbnROb2RlICYmIGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4vLyAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XHJcbi8vICAgICB9XHJcblxyXG4vLyAgICAgd2hpbGUgKGN1cnJlbnROb2RlICYmIGN1cnJlbnROb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuLy8gICAgICAgaWYgKGN1cnJlbnROb2RlLnRhZ05hbWUgPT09IFwiVERcIiB8fCBjdXJyZW50Tm9kZS50YWdOYW1lID09PSBcIlRIXCIpIHtcclxuLy8gICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7XHJcbi8vICAgICAgIH1cclxuLy8gICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnRFbGVtZW50O1xyXG4vLyAgICAgfVxyXG4vLyAgICAgcmV0dXJuIG51bGw7XHJcbi8vICAgfTtcclxuXHJcbi8vICAgY29uc3QgdGFibGVDZWxsID1cclxuLy8gICAgIGdldFRhYmxlQ2VsbChyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcikgfHxcclxuLy8gICAgIGdldFRhYmxlQ2VsbChyYW5nZS5zdGFydENvbnRhaW5lcikgfHxcclxuLy8gICAgIGdldFRhYmxlQ2VsbChyYW5nZS5lbmRDb250YWluZXIpO1xyXG5cclxuLy8gICBpZiAodGFibGVDZWxsKSB7XHJcbi8vICAgICBjb25zb2xlLmxvZyhgUHJvY2Vzc2luZyAke3RhYmxlQ2VsbC50YWdOYW1lfSBlbGVtZW50YCk7XHJcbi8vICAgICBjb25zdCBzZWxlY3RlZFRleHQgPSBzZWxlY3Rpb24udG9TdHJpbmcoKTtcclxuXHJcbi8vICAgICBpZiAoc2VsZWN0ZWRUZXh0KSB7XHJcbi8vICAgICAgIGNvbnNvbGUubG9nKGBTZWxlY3RlZCB0ZXh0IGluICR7dGFibGVDZWxsLnRhZ05hbWV9OmAsIHNlbGVjdGVkVGV4dCk7XHJcbi8vICAgICAgIGNvbnN0IHRleHROb2RlczogVGV4dFtdID0gW107XHJcbi8vICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXHJcbi8vICAgICAgICAgdGFibGVDZWxsLFxyXG4vLyAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULFxyXG4vLyAgICAgICAgIG51bGxcclxuLy8gICAgICAgKTtcclxuLy8gICAgICAgbGV0IG5vZGU6IFRleHQgfCBudWxsO1xyXG5cclxuLy8gICAgICAgd2hpbGUgKChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkgYXMgVGV4dCB8IG51bGwpKSB7XHJcbi8vICAgICAgICAgdGV4dE5vZGVzLnB1c2gobm9kZSk7XHJcbi8vICAgICAgIH1cclxuXHJcbi8vICAgICAgIGZvciAoY29uc3QgdGV4dE5vZGUgb2YgdGV4dE5vZGVzKSB7XHJcbi8vICAgICAgICAgY29uc3QgdGV4dCA9IHRleHROb2RlLnRleHRDb250ZW50IHx8IFwiXCI7XHJcbi8vICAgICAgICAgY29uc3QgaW5kZXggPSB0ZXh0LmluZGV4T2Yoc2VsZWN0ZWRUZXh0KTtcclxuXHJcbi8vICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4vLyAgICAgICAgICAgY29uc29sZS5sb2coXHJcbi8vICAgICAgICAgICAgIGBGb3VuZCBzZWxlY3RlZCB0ZXh0IGluICR7dGFibGVDZWxsLnRhZ05hbWV9IHRleHQgbm9kZWBcclxuLy8gICAgICAgICAgICk7XHJcblxyXG4vLyAgICAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4vLyAgICAgICAgICAgc3Bhbi5zdHlsZS5jb2xvciA9IGNvbG9yO1xyXG4vLyAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHNlbGVjdGVkVGV4dDtcclxuXHJcbi8vICAgICAgICAgICBjb25zdCBiZWZvcmVUZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCk7XHJcbi8vICAgICAgICAgICBjb25zdCBhZnRlclRleHQgPSB0ZXh0LnNsaWNlKGluZGV4ICsgc2VsZWN0ZWRUZXh0Lmxlbmd0aCk7XHJcblxyXG4vLyAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XHJcbi8vICAgICAgICAgICBpZiAoYmVmb3JlVGV4dClcclxuLy8gICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYmVmb3JlVGV4dCkpO1xyXG4vLyAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoc3Bhbik7XHJcbi8vICAgICAgICAgICBpZiAoYWZ0ZXJUZXh0KVxyXG4vLyAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhZnRlclRleHQpKTtcclxuXHJcbi8vICAgICAgICAgICB0ZXh0Tm9kZS5yZXBsYWNlV2l0aChmcmFnbWVudCk7XHJcbi8vICAgICAgICAgICBicmVhazsgLy8gQXBwbHkgb25seSBvbmNlIHBlciBzZWxlY3Rpb25cclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICB9IGVsc2Uge1xyXG4vLyAgICAgY29uc29sZS5sb2coXCJObyBUSCBvciBURCBlbGVtZW50IGZvdW5kIGluIHNlbGVjdGlvblwiKTtcclxuLy8gICAgIHJldHVybjtcclxuLy8gICB9XHJcblxyXG4vLyAgIHRoaXMuc2F2ZWRTZWxlY3Rpb24gPSBudWxsO1xyXG4vLyB9XHJcblxyXG5zZXRUZXh0Q29sb3IoZXZlbnQ6IGFueSkge1xyXG4gIGNvbnNvbGUubG9nKFwiY2xpY2tlZFwiKTtcclxuXHJcbiAgaWYgKCF0aGlzLnNhdmVkU2VsZWN0aW9uKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIk5vIHNhdmVkIHNlbGVjdGlvbiBhdmFpbGFibGUhXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBjb25zdCBjb2xvciA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICBjb25zb2xlLmxvZyhcImNvbG9yXCIsIGNvbG9yKTtcclxuXHJcbiAgdGhpcy5zZWxlY3RlZFRleHRDb2xvciA9IGNvbG9yO1xyXG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIk5vIHZhbGlkIHNlbGVjdGlvbiBmb3VuZCFcIik7XHJcbiAgICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICBzZWxlY3Rpb24uYWRkUmFuZ2UodGhpcy5zYXZlZFNlbGVjdGlvbik7XHJcbiAgY29uc3QgcmFuZ2UgPSB0aGlzLnNhdmVkU2VsZWN0aW9uO1xyXG5cclxuICBjb25zdCBnZXRQYXJlbnRFbGVtZW50ID0gKG5vZGU6IE5vZGUgfCBudWxsKTogSFRNTEVsZW1lbnQgfCBudWxsID0+IHtcclxuICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTtcclxuICAgICAgaWYgKGN1cnJlbnROb2RlICYmIGN1cnJlbnROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB3aGlsZSAoY3VycmVudE5vZGUgJiYgY3VycmVudE5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IHBhcmVudEVsZW1lbnQgPVxyXG4gICAgICBnZXRQYXJlbnRFbGVtZW50KHJhbmdlLmNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKSB8fFxyXG4gICAgICBnZXRQYXJlbnRFbGVtZW50KHJhbmdlLnN0YXJ0Q29udGFpbmVyKSB8fFxyXG4gICAgICBnZXRQYXJlbnRFbGVtZW50KHJhbmdlLmVuZENvbnRhaW5lcik7XHJcblxyXG4gIGlmICghcGFyZW50RWxlbWVudCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiTm8gdmFsaWQgcGFyZW50IGVsZW1lbnQgZm91bmQhXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICAvLyAqKkhhbmRsZSBUYWJsZSBDZWxsIENhc2UqKlxyXG4gIGlmIChwYXJlbnRFbGVtZW50LnRhZ05hbWUgPT09IFwiVERcIikge1xyXG4gICAgICBwYXJlbnRFbGVtZW50LnN0eWxlLmNvbG9yID0gY29sb3I7IC8vIEFwcGx5IGNvbG9yIGRpcmVjdGx5IHRvIGNlbGxcclxuICAgICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gKipIYW5kbGUgTm9ybWFsIFRleHQgQ2FzZSoqXHJcbiAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XHJcblxyXG4gIGlmIChzZWxlY3RlZFRleHQpIHtcclxuICAgICAgY29uc3QgdGV4dE5vZGVzOiBUZXh0W10gPSBbXTtcclxuICAgICAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihcclxuICAgICAgICAgIHBhcmVudEVsZW1lbnQsXHJcbiAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcclxuICAgICAgICAgIG51bGxcclxuICAgICAgKTtcclxuICAgICAgbGV0IG5vZGU6IFRleHQgfCBudWxsO1xyXG5cclxuICAgICAgd2hpbGUgKChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkgYXMgVGV4dCB8IG51bGwpKSB7XHJcbiAgICAgICAgICB0ZXh0Tm9kZXMucHVzaChub2RlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCB0ZXh0Tm9kZSBvZiB0ZXh0Tm9kZXMpIHtcclxuICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0Tm9kZS50ZXh0Q29udGVudCB8fCBcIlwiO1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0ZXh0LmluZGV4T2Yoc2VsZWN0ZWRUZXh0KTtcclxuXHJcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSBjb2xvcjtcclxuICAgICAgICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gc2VsZWN0ZWRUZXh0O1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBiZWZvcmVUZXh0ID0gdGV4dC5zbGljZSgwLCBpbmRleCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgYWZ0ZXJUZXh0ID0gdGV4dC5zbGljZShpbmRleCArIHNlbGVjdGVkVGV4dC5sZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGJlZm9yZVRleHQpXHJcbiAgICAgICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJlZm9yZVRleHQpKTtcclxuICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChzcGFuKTtcclxuICAgICAgICAgICAgICBpZiAoYWZ0ZXJUZXh0KVxyXG4gICAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhZnRlclRleHQpKTtcclxuXHJcbiAgICAgICAgICAgICAgdGV4dE5vZGUucmVwbGFjZVdpdGgoZnJhZ21lbnQpO1xyXG4gICAgICAgICAgICAgIGJyZWFrOyAvLyBBcHBseSBvbmx5IG9uY2UgcGVyIHNlbGVjdGlvblxyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICB0aGlzLnNhdmVkU2VsZWN0aW9uID0gbnVsbDtcclxufVxyXG5cclxuICBzZXRCYWNrZ3JvdW5kQ29sb3IoZXZlbnQ6IGFueSkge1xyXG4gIGlmICh0aGlzLnNhdmVkU2VsZWN0aW9uKSB7XHJcbiAgICBjb25zdCBjb2xvciA9IGV2ZW50LnRhcmdldC52YWx1ZTtcclxuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XHJcblxyXG4gICAgLy8gUmVzdG9yZSB0aGUgc2F2ZWQgc2VsZWN0aW9uXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHRoaXMuc2F2ZWRTZWxlY3Rpb24pO1xyXG5cclxuICAgICAgLy8gQXBwbHkgdGhlIGJhY2tncm91bmQgY29sb3IgdXNpbmcgYSBzcGFuXHJcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5zYXZlZFNlbGVjdGlvbjtcclxuICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcclxuICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHJhbmdlLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAvLyBSZXBsYWNlIHRoZSBzZWxlY3RlZCB0ZXh0IHdpdGggdGhlIHN0eWxlZCBzcGFuXHJcbiAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICAgIHJhbmdlLmluc2VydE5vZGUoc3Bhbik7XHJcblxyXG4gICAgICAvLyBDbGVhciB0aGUgc2F2ZWQgc2VsZWN0aW9uXHJcbiAgICAgIHRoaXMuc2F2ZWRTZWxlY3Rpb24gPSBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICB9XHJcbiAgXHJcbiAgLy8gY29sb3JDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcclxuICAvLyAgIHRoaXMuY29sb3IgPSBldmVudC5jb2xvci5oZXg7IFxyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIGxvZ0V2ZW50KGV2ZW50OiBhbnksIHRyaWdnZXI6IGFueSkge1xyXG4gICAgY29uc3QgY29sb3IgPSBldmVudDtcclxuICAgIHRoaXMuc2V0VGV4dENvbG9yKGNvbG9yKVxyXG4gICAgdGhpcy5zZWxlY3RlZFRleHRDb2xvciA9IGV2ZW50XHJcbiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnZm9yZUNvbG9yJywgZmFsc2UsIGV2ZW50KTtcclxuICAgIC8vIHRoaXMubG9ncy51bnNoaWZ0KFt0aGlzLmxvZ3MubGVuZ3RoICsgMSwgdHJpZ2dlciwgZXZlbnRdKTtcclxuICB9XHJcbiAgXHJcblxyXG4gIGVkaXRJbWFnZSgpIHtcclxuICAgIGxldCBkYXRhIFxyXG4gICAgc3dpdGNoICh0aGlzLmVkaXRvckZyb20ubmFtZSkge1xyXG4gICAgICBjYXNlICdzZWN0aW9uLWNvbnRlbnQnOlxyXG4gICAgICAgIGRhdGEgPSB7IGVkaXRJTUc6IHRydWUsIGZyb206ICdodG1sRWRpdG9yJywgaW5kZXg6IHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgsIGlkOiB0aGlzLmVkaXRvckZyb20uaWQgfTtcclxuICAgICAgICBjb25zdCBjb21wcmVzc2VkRGF0YTogc3RyaW5nID0gY29tcHJlc3MoSlNPTi5zdHJpbmdpZnkodGhpcy5pbWFnZUVkaXRVcmwpKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcCcsIGNvbXByZXNzZWREYXRhKTtcclxuICAgICAgICBjb25zdCBjb21wcmVzc2VkRGF0YTIgPSBjb21wcmVzcyhKU09OLnN0cmluZ2lmeSh0aGlzLnNhbml0aXplZENvbnRlbnQpKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd0ZXh0RWRpdG9yJywgY29tcHJlc3NlZERhdGEyKTtcclxuICAgICAgICAvLyBhbGVydCgnZ28gdG8gZWRpdG9yIScpXHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvSU1HRWRpdG9yKGRhdGEpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0LmVtaXQoKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjcmVhdGUtZG9jdW1lbnQnOlxyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0LmVtaXQoKVxyXG4gICAgICAgIGRhdGEgPSB7IGVkaXRJTUc6IHRydWUsIGZyb206ICdjcmVhdGVEb2N1bWVudCcsIGluZGV4OiB0aGlzLnNlbGVjdGVkSXRlbUluZGV4LCBpZDogdGhpcy5lZGl0b3JGcm9tLmlkLCBzZWN0aW9uOiB0aGlzLmVkaXRvckZyb20uc2VjdGlvbiwgcmVwb3J0U2VjdGlvbklkOiB0aGlzLmVkaXRvckZyb20ucmVwb3J0U2VjdGlvbklkIH07XHJcbiAgICAgICAgLy8gdGhpcy5vcGVuRGlhbG9nKGRhdGEpXHJcbiAgICAgICAgY29uc3QgY29tcHJlc3NlZERhdGEzID0gY29tcHJlc3MoSlNPTi5zdHJpbmdpZnkodGhpcy5pbWFnZUVkaXRVcmwpKTtcclxuICAgICAgICBjb25zdCBjb21wcmVzc2VkRGF0YTQgPSBjb21wcmVzcyh0aGlzLmVkaXRvclRleHQpO1xyXG5cclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcDInLCBjb21wcmVzc2VkRGF0YTMpO1xyXG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3RleHRFZGl0b3IyJywgY29tcHJlc3NlZERhdGE0KTtcclxuICAgICAgICB0aGlzLm5hdmlnYXRlVG9JTUdFZGl0b3IoZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgbnVsbFxyXG4gICAgICAgIC8vIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wJyk7XHJcbiAgICAgICAgLy8gc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnZWRpdEltYWdlRnJvbVRlbXAyJyk7XHJcbiAgICAgICAgLy8gc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgndGVtcGxhdGVFZGl0b3InKTtcclxuICAgICAgICAvLyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCd0ZXh0RWRpdG9yJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICAvLyBpZiAodGhpcy5lZGl0b3JGcm9tID09PSAnc2VjdGlvbi1jb250ZW50Jykge1xyXG4gICAgLy8gICBjb25zdCBkYXRhID0ge2VkaXRJTUc6IHRydWUsIGZyb206ICdodG1sRWRpdG9yJywgaW5kZXg6IHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXh9XHJcbiAgICAvLyAgIHRoaXMubmF2aWdhdGVUb0lNR0VkaXRvcihkYXRhKVxyXG4gICAgLy8gICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcCcsIEpTT04uc3RyaW5naWZ5KHRoaXMuaW1hZ2VFZGl0VXJsKSlcclxuICAgIC8vICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgndGV4dEVkaXRvcicsIHRoaXMuZWRpdG9yVGV4dClcclxuICAgIC8vIH0gXHJcbiAgICBcclxuICB9XHJcblxyXG4gIG9wZW5EaWFsb2coIGl0ZW06IGFueSk6IHZvaWQge1xyXG4gICAgLy8gbGV0IGRhdGE6IGFueTtcclxuICAgIC8vICAgZGF0YSA9IGl0ZW1cclxuICAgIC8vIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oSW1hZ2VFZGl0b3JNb2RhbENvbXBvbmVudCx7XHJcbiAgICAvLyAgIG1pbldpZHRoOiAnMTAwJScsIG1pbkhlaWdodDogJzEwMHZoJywgcGFuZWxDbGFzczogJ3RoZW1lLTJCMjkzNicgLGRpc2FibGVDbG9zZTogdHJ1ZSwgZGF0YTogZGF0YVxyXG4gICAgLy8gfSk7XHJcbiAgICAvLyBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgIC8vICAgY29uc29sZS5sb2coJ3Jlc3VsdCA9PT0+IGltZyA9ICcsIHJlc3VsdClcclxuICAgIC8vICAgY29uc3QgaW1nVXJsID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAyJyk7XHJcbiAgICAvLyAgICAgaWYgKGltZ1VybCkge1xyXG4gICAgLy8gICAgICAgdGhpcy5yZXBsYWNlSW1hZ2VTcmMoaW1nVXJsLCAgcmVzdWx0LmluZGV4LmluZGV4KTtcclxuICAgIC8vICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wMicpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVwbGFjZUltYWdlU1JDKG5ld1NyYzogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRoaXMuZWRpdG9yVGV4dCwgJ3RleHQvaHRtbCcpO1xyXG4gICAgY29uc3QgaW1nVGFncyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XHJcblxyXG4gIGlmIChpbWdUYWdzICYmIGltZ1RhZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBpbWdUYWdzLmxlbmd0aCkge1xyXG4gICAgICAvLyBVcGRhdGUgdGhlIHNyYyBhdHRyaWJ1dGUgb2YgdGhlIGltZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4XHJcbiAgICAgIFxyXG4gICAgICBpbWdUYWdzW2luZGV4XS5zZXRBdHRyaWJ1dGUoJ3NyYycsIG5ld1NyYyk7XHJcbiAgICAgIHRoaXMuZWRpdG9yVGV4dCA9IGRvYy5ib2R5LmlubmVySFRNTDtcclxuICAgIFxyXG4gICAgfSBcclxuICB9IFxyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVUb0lNR0VkaXRvcihkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkbWluL2ltYWdlLWVkaXRvciddLCB7IHF1ZXJ5UGFyYW1zOiB7ZGF0YSA6IEpTT04uc3RyaW5naWZ5KGRhdGEpfSB9KVxyXG4gIH1cclxuXHJcbiAgLy8gIG9uVGV4dFNlbGVjdChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gIC8vICAgaWYgKHRoaXMudG9vbGJhck1vZGUgPT09ICdidWJibGUnKSB7XHJcbiAgLy8gICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAvLyAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAvLyAgICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gIC8vICAgICAgIGlmICghcmFuZ2UuY29sbGFwc2VkKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgLy8gICAgICAgICB0aGlzLnRvb2xiYXJUb3AgPSByZWN0LmJvdHRvbSArIHdpbmRvdy5zY3JvbGxZICsgMTA7XHJcbiAgLy8gICAgICAgICB0aGlzLnRvb2xiYXJMZWZ0ID0gcmVjdC5sZWZ0ICsgd2luZG93LnNjcm9sbFggKyAocmVjdC53aWR0aCAvIDIpIC0gNTA7XHJcbiAgLy8gICAgICAgICB0aGlzLnNob3dUb29sYmFyID0gdHJ1ZTtcclxuICAvLyAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgdGhpcy5zaG93VG9vbGJhciA9IGZhbHNlO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiBvblRleHRTZWxlY3QoZXZlbnQ/OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgaWYgKHRoaXMudG9vbGJhck1vZGUgPT09ICdidWJibGUnKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICBpZiAoIXJhbmdlLmNvbGxhcHNlZCkge1xyXG4gICAgICAgIGNvbnN0IHJlY3QgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBzY3JvbGxZID0gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsWCA9ICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcclxuICAgICAgICB0aGlzLnRvb2xiYXJUb3AgPSByZWN0LnRvcCArIHNjcm9sbFkgLSA3NTtcclxuICAgICAgICB0aGlzLnRvb2xiYXJMZWZ0ID0gcmVjdC5sZWZ0ICsgc2Nyb2xsWCArIChyZWN0LndpZHRoIC8gMikgLSAzMjU7XHJcbiAgICAgICAgdGhpcy5zaG93VG9vbGJhciA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zaG93VG9vbGJhciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3dUb29sYmFyID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5cclxuLy8gb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuLy8gICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbi8vICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YTtcclxuLy8gICAgIGlmIChjbGlwYm9hcmREYXRhKSB7XHJcbi8vICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcclxuLy8gICAgICAgaWYgKHRoaXMuaXNUYWJsZURhdGEocGFzdGVkVGV4dCkpIHtcclxuLy8gICAgICAgICBjb25zdCBodG1sID0gdGhpcy5jb252ZXJ0VGV4dFRvVGFibGUocGFzdGVkVGV4dCk7XHJcbi8vICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChodG1sKTtcclxuLy8gICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KHBhc3RlZFRleHQpO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgfVxyXG5cclxuICAvLyBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xyXG4gIC8vICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAvLyAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhO1xyXG4gIC8vICAgaWYgKGNsaXBib2FyZERhdGEpIHtcclxuICAvLyAgICAgLy8gSGFuZGxlIGltYWdlIGRhdGFcclxuICAvLyAgICAgY29uc3QgaXRlbXMgPSBjbGlwYm9hcmREYXRhLml0ZW1zO1xyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgLy8gICAgICAgaWYgKGl0ZW1zW2ldLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IGZpbGUgPSBpdGVtc1tpXS5nZXRBc0ZpbGUoKTtcclxuICAvLyAgICAgICAgIGlmIChmaWxlKSB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgLy8gICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgaW1nSHRtbCA9IGA8aW1nIHNyYz1cIiR7ZS50YXJnZXQucmVzdWx0fVwiIGFsdD1cIlBhc3RlZCBJbWFnZVwiIHN0eWxlPVwibWF4LXdpZHRoOiAxMDAlO1wiLz5gO1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoaW1nSHRtbCk7XHJcbiAgLy8gICAgICAgICAgIH07XHJcbiAgLy8gICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIC8vICAgICAgICAgICByZXR1cm47IC8vIEV4aXQgaWYgYW4gaW1hZ2UgaXMgaGFuZGxlZFxyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgLy8gSGFuZGxlIHRleHQgb3IgdGFibGUgZGF0YVxyXG4gIC8vICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XHJcbiAgLy8gICAgIGlmICh0aGlzLmlzVGFibGVEYXRhKHBhc3RlZFRleHQpKSB7XHJcbiAgLy8gICAgICAgY29uc3QgaHRtbCA9IHRoaXMuY29udmVydFRleHRUb1RhYmxlKHBhc3RlZFRleHQpO1xyXG4gIC8vICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoaHRtbCk7XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChwYXN0ZWRUZXh0KTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YTtcclxuICAgIGlmIChjbGlwYm9hcmREYXRhKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xpcGJvYXJkRGF0YS5pdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBjbGlwYm9hcmREYXRhLml0ZW1zW2ldO1xyXG5cclxuICAgICAgICBpZiAoaXRlbS50eXBlLnN0YXJ0c1dpdGgoXCJpbWFnZS9cIikpIHtcclxuICAgICAgICAgIC8vIEhhbmRsZSBpbWFnZSBwYXN0ZVxyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7XHJcbiAgICAgICAgICBpZiAoZmlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGltZ0h0bWwgPSBgPGltZyBzcmM9XCIke2UudGFyZ2V0LnJlc3VsdH1cIiBhbHQ9XCJQYXN0ZWQgSW1hZ2VcIiBzdHlsZT1cIm1heC13aWR0aDogMTAwJTtcIiAvPmA7XHJcbiAgICAgICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChpbWdIdG1sKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJ0ZXh0L2h0bWxcIikge1xyXG4gICAgICAgICAgLy8gSGFuZGxlIEhUTUwgcGFzdGVcclxuICAgICAgICAgIC8vIGNvbnN0IGh0bWxEYXRhID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC9odG1sXCIpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuaXNUYWJsZURhdGEoY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L2h0bWwnKSkpIHtcclxuICAgICAgICAgICAgY29uc3QgaHRtbCA9IHRoaXMuY29udmVydFRleHRUb1RhYmxlKGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9odG1sJykpO1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGh0bWwpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvaHRtbCcpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoaHRtbERhdGEpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBcInRleHQvcGxhaW5cIikge1xyXG4gICAgICAgICAgLy8gSGFuZGxlIHBsYWluIHRleHQgcGFzdGVcclxuICAgICAgICAgIGlmICh0aGlzLmlzVGFibGVEYXRhKGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpKSkge1xyXG4gICAgICAgICAgICBjb25zdCBodG1sID0gdGhpcy5jb252ZXJ0VGV4dFRvVGFibGUoY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJykpO1xyXG4gICAgICAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGh0bWwpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBjb25zdCBwbGFpblRleHQgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpO1xyXG4gICAgICAgICAgLy8gdGhpcy5pbnNlcnRIdG1sQXRDYXJldChwbGFpblRleHQpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNFeGNlbERhdGEoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gaHRtbC5pbmNsdWRlcygneG1sbnM6bz1cInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZVwiJykgfHwgXHJcbiAgICAgICAgICBodG1sLmluY2x1ZGVzKCd4bWxuczp4PVwidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6ZXhjZWxcIicpO1xyXG4gIH1cclxuXHJcbiAgY29udmVydEV4Y2VsSHRtbFRvVGFibGUoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xyXG4gICAgY29uc3QgdGFibGUgPSBkb2MucXVlcnlTZWxlY3RvcigndGFibGUnKTtcclxuICAgIHJldHVybiB0YWJsZSA/IHRhYmxlLm91dGVySFRNTCA6ICcnOyAvLyBFeHRyYWN0IG9ubHkgdGhlIHRhYmxlIHBhcnRcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG4gIGlzVGFibGVEYXRhKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgcm93cyA9IHRleHQuc3BsaXQoJ1xcbicpO1xyXG4gICAgcmV0dXJuIHJvd3MubGVuZ3RoID4gMSAmJiByb3dzWzBdLnNwbGl0KCdcXHQnKS5sZW5ndGggPiAxO1xyXG4gIH1cclxuXHJcbiAgLy8gY29udmVydFRleHRUb1RhYmxlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgLy8gICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgnXFxuJykuZmlsdGVyKHJvdyA9PiByb3cudHJpbSgpICE9PSAnJyk7XHJcbiAgLy8gICBjb25zdCB0YWJsZVJvd3MgPSByb3dzLm1hcChyb3cgPT4ge1xyXG4gIC8vICAgICBjb25zdCBjZWxscyA9IHJvdy5zcGxpdCgnXFx0JykubWFwKGNlbGwgPT4gYDx0ZCBjbGFzcz1cInB4LTEgcHktMVwiID4ke2NlbGx9PC90ZD5gKS5qb2luKCcnKTtcclxuICAvLyAgICAgcmV0dXJuIGA8dHIgY2xhc3M9XCJ0YWJsZS1ib3JkZXItdG9wXCIgc3R5bGU9XCJib3JkZXItdG9wOiAke3RoaXMudGhlbWVNb2RlVGFibGVCb3JkZXJUb3AoKX07IHdpZHRoOiAxMDAlICFpbXBvcnRhbnRcIj4ke2NlbGxzfTwvdHI+YDtcclxuICAvLyAgIH0pLmpvaW4oJycpO1xyXG4gIC8vICAgcmV0dXJuIGA8dGFibGU+JHt0YWJsZVJvd3N9PC90YWJsZT5gO1xyXG4gIC8vIH1cclxuXHJcbiAgY29udmVydFRleHRUb1RhYmxlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByb3dzID0gdGV4dC5zcGxpdCgnXFxuJykuZmlsdGVyKHJvdyA9PiByb3cudHJpbSgpICE9PSAnJyk7XHJcbiAgICBjb25zdCBjb2x1bW5Db3VudCA9IHJvd3NbMF0/LnNwbGl0KCdcXHQnKS5sZW5ndGggfHwgMTsgLy8gR2V0IHRoZSBudW1iZXIgb2YgY29sdW1ucyBmcm9tIHRoZSBmaXJzdCByb3dcclxuICAgIGNvbnN0IGNvbHVtbldpZHRoID0gMTAwIC8gY29sdW1uQ291bnQ7IC8vIENhbGN1bGF0ZSBjb2x1bW4gd2lkdGhcclxuXHJcbiAgICBjb25zdCB0YWJsZVJvd3MgPSByb3dzLm1hcCgocm93LCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCBjZWxscyA9IHJvdy5zcGxpdCgnXFx0JykubWFwKGNlbGwgPT4gYFxyXG4gICAgICAgIDx0ZCBjbGFzcz1cInB4LTEgcHktMSB0ZXh0LXRydW5jYXRlXCIgXHJcbiAgICAgICAgICAgIHN0eWxlPVwibWF4LXdpZHRoOiAke2NvbHVtbldpZHRofSU7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxyXG4gICAgICAgICAgJHtjZWxsfVxyXG4gICAgICAgIDwvdGQ+YCkuam9pbignJyk7XHJcblxyXG4gICAgICAvLyBBZGQgYSBib3JkZXItdG9wIGZvciBhbGwgcm93cyBleGNlcHQgdGhlIGZpcnN0IGFuZCBib3JkZXItYm90dG9tIGZvciB0aGUgbGFzdCByb3dcclxuICAgICAgY29uc3QgYm9yZGVyVG9wID0gaW5kZXggPT09IDAgPyAnJyA6IGBib3JkZXItdG9wOiAke3RoaXMudGhlbWVNb2RlVGFibGVCb3JkZXJUb3AoKX07YDtcclxuICAgICAgY29uc3QgYm9yZGVyQm90dG9tID0gaW5kZXggPT09IHJvd3MubGVuZ3RoIC0gMSA/IGBib3JkZXItYm90dG9tOiAke3RoaXMudGhlbWVNb2RlVGFibGVCb3JkZXJUb3AoKX07YCA6ICcnO1xyXG5cclxuICAgICAgcmV0dXJuIGBcclxuICAgICAgICA8dHIgXHJcbiAgICAgICAgICBzdHlsZT1cIiR7Ym9yZGVyVG9wfSAke2JvcmRlckJvdHRvbX0gd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcIj5cclxuICAgICAgICAgICR7Y2VsbHN9XHJcbiAgICAgICAgPC90cj5gO1xyXG4gICAgfSkuam9pbignJyk7XHJcblxyXG4gICAgcmV0dXJuIGBcclxuICAgICAgPHRhYmxlIHN0eWxlPVwidGFibGUtbGF5b3V0OiBmaXhlZDsgd2lkdGg6IDEwMCU7XCI+IFxyXG4gICAgICAgICR7dGFibGVSb3dzfVxyXG4gICAgICA8L3RhYmxlPmA7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGluc2VydEh0bWxBdENhcmV0KGh0bWw6IHN0cmluZykge1xyXG4gICAgY29uc3QgcmFuZ2UgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk/LmdldFJhbmdlQXQoMCk7XHJcbiAgICBpZiAocmFuZ2UpIHtcclxuICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcclxuICAgICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICB0ZW1wRGl2LmlubmVySFRNTCA9IGh0bWw7XHJcbiAgICAgIGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XHJcbiAgICAgIGxldCBub2RlO1xyXG4gICAgICB3aGlsZSAoKG5vZGUgPSB0ZW1wRGl2LmZpcnN0Q2hpbGQpKSB7XHJcbiAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChub2RlKTtcclxuICAgICAgfVxyXG4gICAgICByYW5nZS5pbnNlcnROb2RlKGZyYWcpO1xyXG4gICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0aGVtZU1vZGVUYWJsZUJvcmRlclRvcCgpIHtcclxuICAgIGNvbnN0IGNsck1vZGUgPSBkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS1sYXlvdXQtY29sb3InKVxyXG4gICAgaWYgKGNsck1vZGUgPT0gJ2RhcmsnKSB7XHJcbiAgICAgIHJldHVybiAnMXB4IHNvbGlkICNEMEQwRDA7ICFpbXBvcnRhbnQnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJzFweCBzb2xpZCAjNDE0MTQxICFpbXBvcnRhbnQnXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuIFxyXG4gIHB1YmxpYyBvcGVuRnVsbHNjcmVlbigpIHtcclxuICAgIHZhciBlbGVtOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRleHRFZGl0b3JcIik7XHJcbiAgICB0aGlzLmlzRnVsbFNjcmVlbiA9IHRydWU7XHJcbiAgICBpZiAoZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICBlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKCk7XHJcbiAgICB9IGVsc2UgaWYgKGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4pIHtcclxuICAgICAgZWxlbS5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpO1xyXG4gICAgfSBlbHNlIGlmIChlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XHJcbiAgICAgIGVsZW0ud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKTtcclxuICAgIH0gZWxzZSBpZiAoZWxlbS5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XHJcbiAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdHlsZSA9IHtcclxuICAgICAgJ21pbi1oZWlnaHQnOiAnOTB2aCcsXHJcbiAgICAgICdtYXgtaGVpZ2h0JzogJzkwdmgnLFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlRnVsbHNjcmVlbigpIHtcclxuICAgIGlmIChkb2N1bWVudC5leGl0RnVsbHNjcmVlbikge1xyXG4gICAgICBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xyXG4gICAgICB0aGlzLmlzRnVsbFNjcmVlbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnN0eWxlID0ge1xyXG4gICAgICAgICdtaW4taGVpZ2h0JzogJzQwMHB4JyxcclxuICAgICAgICAnbWF4LWhlaWdodCc6ICc0MDBweCcsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgY2xlYXJUZXh0RWRpdG9yKCkge1xyXG4gICAgdGhpcy5lZGl0b3JUZXh0Q2xlYXIuZW1pdCgpXHJcbiAgfVxyXG5cclxuICBzZXR1cEhpc3RvcnkoKSB7XHJcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xyXG4gICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICBcclxuICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4gdGhpcy5vbklucHV0KCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25JbnB1dCgpIHtcclxuICAgIHRoaXMuc2F2ZVN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBzYXZlU3RhdGUoKSB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgXHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIGNvbnN0IGVkaXRvckNvbnRlbnQgPSBlZGl0b3IuaW5uZXJIVE1MO1xyXG4gICAgICBpZiAodGhpcy5oaXN0b3J5SW5kZXggPT09IHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZWRpdG9yQ29udGVudCk7XHJcbiAgICAgICAgdGhpcy5yZWRvU3RhY2sgPSBbXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmhpc3RvcnkgPSB0aGlzLmhpc3Rvcnkuc2xpY2UoMCwgdGhpcy5oaXN0b3J5SW5kZXggKyAxKTtcclxuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaChlZGl0b3JDb250ZW50KTtcclxuICAgICAgICB0aGlzLnJlZG9TdGFjayA9IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaGlzdG9yeUluZGV4Kys7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHVuZG8oKSB7XHJcbiAgICBpZiAodGhpcy5oaXN0b3J5SW5kZXggPiAwKSB7XHJcbiAgICAgIHRoaXMucmVkb1N0YWNrLnB1c2godGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeUluZGV4XSk7XHJcbiAgICAgIHRoaXMuaGlzdG9yeUluZGV4LS07XHJcbiAgICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICBcclxuICAgICAgaWYgKGVkaXRvcikge1xyXG4gICAgICAgIHRoaXMuc2FuaXRpemVkQ29udGVudCA9IHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnlJbmRleF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZG8oKSB7XHJcbiAgICBpZiAodGhpcy5yZWRvU3RhY2subGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCByZWRvQ29udGVudCA9IHRoaXMucmVkb1N0YWNrLnBvcCgpO1xyXG4gICAgICB0aGlzLmhpc3RvcnkucHVzaChyZWRvQ29udGVudCEpO1xyXG4gICAgICB0aGlzLmhpc3RvcnlJbmRleCsrO1xyXG4gICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgXHJcbiAgICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSByZWRvQ29udGVudCE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4vLyAgIGZvcm1hdFRleHRXaXRoRGF0ZXModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcclxuLy8gICAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gZGV0ZWN0IFlZWVktTU0tREQgZm9ybWF0dGVkIGRhdGVzXHJcbi8vICAgY29uc3QgZGF0ZVJlZ2V4ID0gL1xcYlxcZHs0fS1cXGR7Mn0tXFxkezJ9XFxiL2c7XHJcblxyXG4vLyAgIC8vIFJlcGxhY2UgZm91bmQgZGF0ZXMgd2l0aCBhIGZvcm1hdHRlZCB2ZXJzaW9uXHJcbi8vICAgcmV0dXJuIHRleHQucmVwbGFjZShkYXRlUmVnZXgsIChkYXRlU3RyKSA9PiB7XHJcbi8vICAgICAvLyBDb252ZXJ0IHRoZSBkZXRlY3RlZCBkYXRlIHN0cmluZyBpbnRvIGEgRGF0ZSBvYmplY3RcclxuLy8gICAgIGNvbnN0IGRhdGVPYmogPSBuZXcgRGF0ZShkYXRlU3RyKTtcclxuICAgIFxyXG4vLyAgICAgLy8gRm9ybWF0IHRoZSBkYXRlIHRvICdNb250aCBEYXksIFllYXInIChlLmcuLCBPY3RvYmVyIDEwLCAyMDI0KVxyXG4vLyAgICAgcmV0dXJuIGRhdGVPYmoudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1VUycsIHtcclxuLy8gICAgICAgeWVhcjogJ251bWVyaWMnLFxyXG4vLyAgICAgICBtb250aDogJ2xvbmcnLFxyXG4vLyAgICAgICBkYXk6ICdudW1lcmljJyxcclxuLy8gICAgIH0pO1xyXG4vLyAgIH0pO1xyXG4gIC8vIH1cclxuICBcclxuICBmb3JtYXRUZXh0V2l0aERhdGVzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIGRldGVjdCBZWVlZLU1NLUREIGZvcm1hdHRlZCBkYXRlc1xyXG4gIGNvbnN0IGRhdGVSZWdleCA9IC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVxcYi9nO1xyXG5cclxuICAvLyBSZXBsYWNlIGZvdW5kIGRhdGVzIHdpdGggYSBmb3JtYXR0ZWQgdmVyc2lvblxyXG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoZGF0ZVJlZ2V4LCAoZGF0ZVN0cikgPT4ge1xyXG4gICAgLy8gQ29udmVydCB0aGUgZGV0ZWN0ZWQgZGF0ZSBzdHJpbmcgaW50byBhIERhdGUgb2JqZWN0XHJcbiAgICBjb25zdCBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZVN0cik7XHJcblxyXG4gICAgLy8gRXh0cmFjdCBkYXksIG1vbnRoLCBhbmQgeWVhclxyXG4gICAgY29uc3QgZGF5ID0gZGF0ZU9iai5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpOyAvLyBFbnN1cmUgZGF5IGlzIHR3byBkaWdpdHNcclxuICAgIGNvbnN0IG1vbnRoID0gZGF0ZU9iai50b0xvY2FsZVN0cmluZygnZW4tVVMnLCB7IG1vbnRoOiAnc2hvcnQnIH0pOyAvLyBHZXQgYWJicmV2aWF0ZWQgbW9udGggbmFtZVxyXG4gICAgY29uc3QgeWVhciA9IGRhdGVPYmouZ2V0RnVsbFllYXIoKTsgLy8gR2V0IGZ1bGwgeWVhclxyXG5cclxuICAgIC8vIEZvcm1hdCB0aGUgZGF0ZSBhcyAnZGQvbW1tL3l5eXknXHJcbiAgICByZXR1cm4gYCR7ZGF5fS8ke21vbnRofS8ke3llYXJ9YDtcclxuICB9KTtcclxufVxyXG5cclxuXHJcbn0iLCI8ZGl2XHJcbiAgY2xhc3M9XCJjb250YWluZXIgZWxzLXRleHQtZWRpdG9yIHB4LTBcIlxyXG4gIGlkPVwidGV4dEVkaXRvclwiXHJcbiAgI2Z1bGxzY3JlZW49XCJuZ3hGdWxsc2NyZWVuXCJcclxuICAjdGV4dEVkaXRvclxyXG4gIG5neEZ1bGxzY3JlZW5cclxuPlxyXG4gIDxkaXZcclxuICAgICpuZ0lmPVwidG9vbGJhck1vZGUgPT09ICdmaXhlZCdcIlxyXG4gICAgY2xhc3M9XCJidG4tdG9vbGJhciBlbHMtYnRuLXRvb2xiYXIgcC0yIHB5LTIgbWItMFwiXHJcbiAgICByb2xlPVwidG9vbGJhclwiXHJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJ0aGVtZU1vZGVCZ0NscigpXCJcclxuICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgJ3BvaW50ZXItZXZlbnRzJzogZGlzYWJsZVRvb2xiYXIgPyAnbm9uZScgOiAnYXV0bycsXHJcbiAgICAgICdib3JkZXItdG9wLWxlZnQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDogJzIwcHgnLFxyXG4gICAgICAnYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMnOiBJc09wZW4gPyAnMCcgOiAnMjBweCdcclxuICAgIH1cIlxyXG4gICAgYXJpYS1sYWJlbD1cIlRvb2xiYXIgd2l0aCBidXR0b24gZ3JvdXBzXCJcclxuICAgIHN0eWxlPVwiXHJcbiAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDtcclxuICAgICAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDtcclxuICAgIFwiXHJcbiAgPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIlxyXG4gICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICBhcmlhLWxhYmVsPVwiSGVhZGVyIE9wdGlvbnNcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZHJvcGRvd25cIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLWZvcm0tc2VsZWN0IGJvcmRlciBlbHMtdG9vbGJhci1kcm9wZG93bi1idXR0b24gZHJvcGRvd24tdG9nZ2xlIHRleHQtc3RhcnRcIlxyXG4gICAgICAgICAgW3N0eWxlLmJvcmRlci1yYWRpdXNdPVwiJzVweCdcIlxyXG4gICAgICAgICAgaWQ9XCJoZWFkZXJEcm9wZG93blwiXHJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyXT1cInRoZW1lTW9kZSgpXCJcclxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJ0aGVtZU1vZGVDbHIoKVwiXHJcbiAgICAgICAgICBuZ2JEcm9wZG93blRvZ2dsZVxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuPnt7IHNlbGVjdGVkRm9ybWF0QmxvY2sgfCB0aXRsZWNhc2UgfX08L3NwYW4+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktY2hldnJvbi1kb3duXCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIG5nYkRyb3Bkb3duTWVudVxyXG4gICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiaGVhZGVyRHJvcGRvd25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJlbHMtdGV4dC1mb3JtYXRcIlxyXG4gICAgICAgICAgW3N0eWxlLmJvcmRlcl09XCJ0aGVtZU1vZGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDE+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDE+SGVhZGluZyAxPC9oMT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDI+SGVhZGluZyAyPC9oMj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDM+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDM+SGVhZGluZyAzPC9oMz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDQ+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDQ+SGVhZGluZyA0PC9oND5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDU+SGVhZGluZyA1PC9oNT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDY+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDY+SGVhZGluZyA2PC9oNj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8cD4nKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxwPk5vcm1hbDwvcD5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwXCJcclxuICAgICAgcm9sZT1cImdyb3VwXCJcclxuICAgICAgYXJpYS1sYWJlbD1cIkZvbnQgT3B0aW9uc1wiXHJcbiAgICA+XHJcbiAgICAgIDwhLS0gPHNlbGVjdCBjbGFzcz1cImVscy1mb3JtLXNlbGVjdCBcIiBzdHlsZT1cIiBmb250LXdlaWdodDogNzAwICFpbXBvcnRhbnQ7IGNvbG9yOiAjZmZmO2JvcmRlcjogMnB4IHNvbGlkICM3RDZENkQgIWltcG9ydGFudDtcIiBcclxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGb250XCIgKGNoYW5nZSk9XCJjaGFuZ2VGb250KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gY2xhc3M9XCJlbHMtZm9ybS1vcHRpb25cIiAqbmdGb3I9XCJsZXQgZm9udCBvZiBmb250c1wiIFt2YWx1ZV09XCJmb250XCI+e3sgZm9udCB9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8L3NlbGVjdD4gLS0+XHJcbiAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkcm9wZG93blwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtZm9ybS1zZWxlY3QgYm9yZGVyIGVscy10b29sYmFyLWRyb3Bkb3duLWJ1dHRvbiBkcm9wZG93bi10b2dnbGUgdGV4dC1zdGFydFwiXHJcbiAgICAgICAgICBpZD1cImhlYWRlckRyb3Bkb3duXCJcclxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMHB4XCJcclxuICAgICAgICAgIFtzdHlsZS5ib3JkZXJdPVwidGhlbWVNb2RlKClcIlxyXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInRoZW1lTW9kZUNscigpXCJcclxuICAgICAgICAgIG5nYkRyb3Bkb3duVG9nZ2xlXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogODVweDsgZm9udC13ZWlnaHQ6IDcwMCAhaW1wb3J0YW50XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcclxuICAgICAgICAgICAgPnt7IHNlbGVjdGVkRm9udCB8IHRpdGxlY2FzZSB9fTwvc3BhblxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWNoZXZyb24tZG93blwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBuZ2JEcm9wZG93bk1lbnVcclxuICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT1cImhlYWRlckRyb3Bkb3duXCJcclxuICAgICAgICAgIGNsYXNzPVwiZWxzLXRleHQtZm9ybWF0XCJcclxuICAgICAgICAgIFtzdHlsZS5ib3JkZXJdPVwidGhlbWVNb2RlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHBiLTBcIlxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGZvbnQgb2YgZm9udHNcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hhbmdlRm9udChmb250KVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJ0aGVtZU1vZGVDbHIoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IGZvbnQgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJweS0wXCJcclxuICAgICAgc3R5bGU9XCJoZWlnaHQ6IGZpdC1jb250ZW50XCJcclxuICAgICAgW3N0eWxlLmNvbG9yXT1cInRoZW1lTW9kZUNscigpXCJcclxuICAgID5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbWUtMiBtci0yXCJcclxuICAgICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNCb2xkQWN0aXZlXCJcclxuICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2JvbGQnKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1ib2xkXCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzSXRhbGljQWN0aXZlXCJcclxuICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2l0YWxpYycpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWl0YWxpY1wiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc1VuZGVybGluZUFjdGl2ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCd1bmRlcmxpbmUnKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC11bmRlcmxpbmVcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNTdHJpa2V0aHJvdWdoQWN0aXZlXCJcclxuICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N0cmlrZXRocm91Z2gnKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdHJpa2V0aHJvdWdoLXZhcmlhbnRcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IENvbG9yXCI+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cImNvbG9yXCJcclxuICAgICAgICAgICAgaWQ9XCJ0ZXh0Q29sb3JQaWNrZXJcIlxyXG4gICAgICAgICAgICBzdHlsZT1cIlxyXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICAgICAgICB0b3A6IDEwMCU7XHJcbiAgICAgICAgICAgICAgbGVmdDogMDtcclxuICAgICAgICAgICAgICB6LWluZGV4OiAxMDA7XHJcbiAgICAgICAgICAgICAgb3BhY2l0eTogMDtcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRUZXh0Q29sb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Db2xvclBpY2tlcigndGV4dENvbG9yUGlja2VyJylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aVxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItdGV4dCBpY29uLXdpdGgtdW5kZXJsaW5lXCJcclxuICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRUZXh0Q29sb3JcIlxyXG4gICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJidG4tZ3JvdXBcIlxyXG4gICAgICAgICAgcm9sZT1cImdyb3VwXCJcclxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJCYWNrZ3JvdW5kIENvbG9yXCJcclxuICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImJhY2tncm91bmRDb2xvclwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ2JnQ29sb3JQaWNrZXInKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1hbHBoYS1hLWJveFwiPjwvaT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJjb2xvclwiXHJcbiAgICAgICAgICAgIGlkPVwiYmdDb2xvclBpY2tlclwiXHJcbiAgICAgICAgICAgIHN0eWxlPVwiXHJcbiAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgICAgICAgIHRvcDogMTAwJTtcclxuICAgICAgICAgICAgICBsZWZ0OiAwO1xyXG4gICAgICAgICAgICAgIHotaW5kZXg6IDEwMDtcclxuICAgICAgICAgICAgICBvcGFjaXR5OiAwO1xyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cInNldEJhY2tncm91bmRDb2xvcigkZXZlbnQpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJ2ZXJ0aWNhbC1saW5lIG1zLTIgYm9yZGVyXCJcclxuICAgICAgICAgIFtzdHlsZS5ib3JkZXItbGVmdF09XCJ0aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmUoKVwiXHJcbiAgICAgICAgPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiXHJcbiAgICAgICAgcm9sZT1cImdyb3VwXCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdpbnNlcnRPcmRlcmVkTGlzdCcpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWxpc3QtbnVtYmVyZWRcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LWJ1bGxldGVkXCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJxbC1hbGlnblwiPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiBhcnJvdy1ub25lIHRleHQtc2Vjb25kYXJ5XCJcclxuICAgICAgICAgICAgaWQ9XCJkcm9wZG93bkJhc2ljMVwiXHJcbiAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgIG5nYkRyb3Bkb3duVG9nZ2xlXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdFwiPjwvaT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICBuZ2JEcm9wZG93bk1lbnVcclxuICAgICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiZHJvcGRvd25CYXNpYzFcIlxyXG4gICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAzcHhcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlMZWZ0JylcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1sZWZ0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24gdGV4dC1kYXJrXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5Q2VudGVyJylcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1jZW50ZXJcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlSaWdodCcpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlGdWxsJylcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1qdXN0aWZ5XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIGNsYXNzPVwidmVydGljYWwtbGluZSBtcy0yIGJvcmRlclwiXHJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyLWxlZnRdPVwidGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lKClcIlxyXG4gICAgICAgID48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIlxyXG4gICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiXHJcbiAgICAgID5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc1N1YnNjcmlwdEFjdGl2ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdzdWJzY3JpcHQnKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdWJzY3JpcHRcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaXNTdXBlcnNjcmlwdEFjdGl2ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdzdXBlcnNjcmlwdCcpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXN1cGVyc2NyaXB0XCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiXHJcbiAgICAgICAgcm9sZT1cImdyb3VwXCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkTGluaygpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktbGluay12YXJpYW50XCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiaW5zZXJ0c0ltYWdlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1pbWFnZVwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcclxuICAgICAgICAgIGlkPVwiaW1hZ2VJbnB1dFwiXHJcbiAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVJbWFnZVVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgIGFjY2VwdD1cImltYWdlLypcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCJcclxuICAgICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJUYWJsZSBPcHRpb25zXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkVGFibGUoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlXCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkUm93KClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcGx1cy1hZnRlclwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdygpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtcm93LXJlbW92ZVwiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImFkZENvbHVtbigpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtY29sdW1uLXBsdXMtYWZ0ZXJcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgKm5nSWY9XCJpc1RhYmxlU2VsZWN0ZWRcIlxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb2x1bW4oKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1yZW1vdmVcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCJcclxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJ0SGVhZEJnQ29sb3JcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5Db2xvclBpY2tlcigndEhlYWRiZ0NvbG9yUGlja2VyJylcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1lZGl0XCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cImNvbG9yXCJcclxuICAgICAgICAgIGlkPVwidEhlYWRiZ0NvbG9yUGlja2VyXCJcclxuICAgICAgICAgIHN0eWxlPVwiXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICAgICAgdG9wOiAxMDAlO1xyXG4gICAgICAgICAgICBsZWZ0OiAwO1xyXG4gICAgICAgICAgICB6LWluZGV4OiAxMDA7XHJcbiAgICAgICAgICAgIG9wYWNpdHk6IDA7XHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgKGNoYW5nZSk9XCJzZXRUaGVhZEJnQ29sb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cInVuZG8oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS11bmRvXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cInJlZG8oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1yZWRvXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXBcIlxyXG4gICAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgICAgYXJpYS1sYWJlbD1cIlRhYmxlIE9wdGlvbnNcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwic2VsZWN0ZWRJbWFnZVwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24tMlwiIChjbGljayk9XCJlZGl0SW1hZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtcIj5FZGl0IEltYWdlPC9idXR0b24+IC0tPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyVGV4dEVkaXRvcigpXCJcclxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IGZpdC1jb250ZW50ICFpbXBvcnRhbnRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1jbG9zZS1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cFwiXHJcbiAgICAgICAgcm9sZT1cImdyb3VwXCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiXHJcbiAgICAgID5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVGdWxsc2NyZWVuMSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiSXNPcGVuOyBlbHNlIGZ1bGxzY3JlZW5JY29uXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mdWxsc2NyZWVuLWV4aXRcIj48L2k+XHJcbiAgICAgICAgICAgIDwhLS0gQ29sbGFwc2UgSWNvbiAtLT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNmdWxsc2NyZWVuSWNvbj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZ1bGxzY3JlZW5cIj48L2k+XHJcbiAgICAgICAgICAgIDwhLS0gRXhwYW5kIEljb24gLS0+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXZcclxuICAgICpuZ0lmPVwidG9vbGJhck1vZGUgPT09ICdidWJibGUnXCJcclxuICAgIGNsYXNzPVwiYnViYmxlLXRvb2xiYXIgYm9yZGVyIHAtMlwiXHJcbiAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICd0b3AucHgnOiB0b29sYmFyVG9wLFxyXG4gICAgICAnbGVmdC5weCc6IHRvb2xiYXJMZWZ0LFxyXG4gICAgICBkaXNwbGF5OiBzaG93VG9vbGJhciA/ICdibG9jaycgOiAnbm9uZSdcclxuICAgIH1cIlxyXG4gID5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cFwiXHJcbiAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJGb250IE9wdGlvbnNcIlxyXG4gICAgPlxyXG4gICAgICA8c2VsZWN0XHJcbiAgICAgICAgY2xhc3M9XCJlbHMtZm9ybS1zZWxlY3RcIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGb250XCJcclxuICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUZvbnQoJGV2ZW50KVwiXHJcbiAgICAgID5cclxuICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBmb250IG9mIGZvbnRzXCIgW3ZhbHVlXT1cImZvbnRcIj57eyBmb250IH19PC9vcHRpb24+XHJcbiAgICAgIDwvc2VsZWN0PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiXHJcbiAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIlxyXG4gICAgPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc0JvbGRBY3RpdmVcIlxyXG4gICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2JvbGQnKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWJvbGRcIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc0l0YWxpY0FjdGl2ZVwiXHJcbiAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnaXRhbGljJylcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1pdGFsaWNcIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc1VuZGVybGluZUFjdGl2ZVwiXHJcbiAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgndW5kZXJsaW5lJylcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC11bmRlcmxpbmVcIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpc1N0cmlrZXRocm91Z2hBY3RpdmVcIlxyXG4gICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N0cmlrZXRocm91Z2gnKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXN0cmlrZXRocm91Z2gtdmFyaWFudFwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnYmxvY2txdW90ZScpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1xdW90ZS1jbG9zZVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiaW5zZXJ0Q29kZUJsb2NrKClcIj48aSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWNvZGUtdGFnc1wiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIlxyXG4gICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCJcclxuICAgID5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2luc2VydE9yZGVyZWRMaXN0JylcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LW51bWJlcmVkXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWxpc3QtYnVsbGV0ZWRcIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkNvbG9yIEZvcm1hdHRpbmdcIj4gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBDb2xvclwiPlxyXG4gICAgICAgIDwhLS0gPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cInFsLWFsaWduXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBhcnJvdy1ub25lIHRleHQtc2Vjb25kYXJ5XCIgaWQ9XCJkcm9wZG93bkJhc2ljMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWNvbG9yLWZpbGxcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgYXJpYS1sYWJlbGxlZGJ5PVwiZHJvcGRvd25CYXNpYzFcIiBzdHlsZT1cIndpZHRoOiAzMDBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbG9yLXNrZXRjaCBjb2xvcj1cIiNmZmZcIiAob25DaGFuZ2VDb21wbGV0ZSk9XCJzZXRUZXh0Q29sb3IoJGV2ZW50KVwiPjwvY29sb3Itc2tldGNoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uIGN1c3RvbS1jb2xvci10cmlnZ2VyXCIgbmd4LWNvbG9ycy10cmlnZ2VyIFsobmdNb2RlbCldPVwiY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImxvZ0V2ZW50KCRldmVudCwgJ25nTW9kZWxDaGFuZ2UnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJsb2dFdmVudCgkZXZlbnQsICdjaGFuZ2UnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cImxvZ0V2ZW50KCRldmVudCwgJ2lucHV0JylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWNvbG9yLXRleHQgaWNvbi13aXRoLXVuZGVybGluZVwiIFtzdHlsZS5jb2xvcl09XCJjb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJ7Y29sb3I6IGNvbG9yfVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LWNvbG9ycyBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgPjwvbmd4LWNvbG9ycz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8aW5wdXRcclxuICAgICAgICAgIHR5cGU9XCJjb2xvclwiXHJcbiAgICAgICAgICBpZD1cInRleHRDb2xvclBpY2tlclwiXHJcbiAgICAgICAgICBzdHlsZT1cIlxyXG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgICAgIHRvcDogMTAwJTtcclxuICAgICAgICAgICAgbGVmdDogMDtcclxuICAgICAgICAgICAgei1pbmRleDogMTAwO1xyXG4gICAgICAgICAgICBvcGFjaXR5OiAwO1xyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIChjaGFuZ2UpPVwic2V0VGV4dENvbG9yKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ3RleHRDb2xvclBpY2tlcicpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aVxyXG4gICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWNvbG9yLXRleHQgaWNvbi13aXRoLXVuZGVybGluZVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzZWxlY3RlZFRleHRDb2xvclwiXHJcbiAgICAgICAgICA+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImJ0bi1ncm91cFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJCYWNrZ3JvdW5kIENvbG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgaWQ9XCJiZ0NvbG9yUGlja2VyXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIChjaGFuZ2UpPVwic2V0QmFja2dyb3VuZENvbG9yKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ2JnQ29sb3JQaWNrZXInKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1hbHBoYS1hLWJveFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImJ0bi1ncm91cFwiXHJcbiAgICAgICAgcm9sZT1cImdyb3VwXCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiQmFja2dyb3VuZCBDb2xvclwiXHJcbiAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJiYWNrZ3JvdW5kQ29sb3JcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5Db2xvclBpY2tlcignYmdDb2xvclBpY2tlcicpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktYWxwaGEtYS1ib3hcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPCEtLSA8aW5wdXQgc3R5bGU9XCJ3aWR0aDogMHB4ICFpbXBvcnRhbnQ7XCIgaWQ9XCJiZ0NvbG9yUGlja2VyXCIgW2NwUHJlc2V0Q29sb3JzXT1cIlsnI2ZmZicsICcjMDAwJywgJyMyODg5ZTknLCAnI2U5MjBlOScsICcjZmZmNTAwJywgJ3JnYigyMzYsNjQsNjQpJ11cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoY29sb3JQaWNrZXIpXT1cImNvbG9yXCIgKGNoYW5nZSk9XCJzZXRCYWNrZ3JvdW5kQ29sb3IoJGV2ZW50KVwiIC8+IC0tPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cImNvbG9yXCJcclxuICAgICAgICAgIGlkPVwiYmdDb2xvclBpY2tlclwiXHJcbiAgICAgICAgICBzdHlsZT1cIlxyXG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgICAgIHRvcDogMTAwJTtcclxuICAgICAgICAgICAgbGVmdDogMDtcclxuICAgICAgICAgICAgei1pbmRleDogMTAwO1xyXG4gICAgICAgICAgICBvcGFjaXR5OiAwO1xyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIChjaGFuZ2UpPVwic2V0QmFja2dyb3VuZENvbG9yKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPCEtLSA8L2Rpdj4gLS0+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiSGVhZGVyIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiBkcm9wZG93bi10b2dnbGVcIiB0eXBlPVwiYnV0dG9uXCIgaWQ9XCJoZWFkZXJEcm9wZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWhlYWRlci0xXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tbWVudVwiIGFyaWEtbGFiZWxsZWRieT1cImhlYWRlckRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Zvcm1hdEJsb2NrJywgJzxoMT4nKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWhlYWRlci0xXCI+PC9pPiBIZWFkaW5nIDE8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnZm9ybWF0QmxvY2snLCAnPGgyPicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTJcIj48L2k+IEhlYWRpbmcgMjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDM+JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1oZWFkZXItM1wiPjwvaT4gSGVhZGluZyAzPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Zvcm1hdEJsb2NrJywgJzxoND4nKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWhlYWRlci00XCI+PC9pPiBIZWFkaW5nIDQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnZm9ybWF0QmxvY2snLCAnPGg1PicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTVcIj48L2k+IEhlYWRpbmcgNTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDY+JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1oZWFkZXItNlwiPjwvaT4gSGVhZGluZyA2PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIlxyXG4gICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICBhcmlhLWxhYmVsPVwiSGVhZGVyIE9wdGlvbnNcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZHJvcGRvd25cIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItZHJvcGRvd24tYnV0dG9uIGRyb3Bkb3duLXRvZ2dsZVwiXHJcbiAgICAgICAgICBpZD1cImhlYWRlckRyb3Bkb3duXCJcclxuICAgICAgICAgIG5nYkRyb3Bkb3duVG9nZ2xlXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJ3aWR0aDogODVweFwiPnt7IHNlbGVjdGVkRm9ybWF0QmxvY2sgfCB0aXRsZWNhc2UgfX08L3NwYW4+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktY2hldnJvbi1kb3duIHRleHQtZGFya1wiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJoZWFkZXJEcm9wZG93blwiPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDE+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDE+SGVhZGluZyAxPC9oMT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDI+SGVhZGluZyAyPC9oMj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDM+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDM+SGVhZGluZyAzPC9oMz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDQ+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDQ+SGVhZGluZyA0PC9oND5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDU+SGVhZGluZyA1PC9oNT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDY+JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aDY+SGVhZGluZyA2PC9oNj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8cD4nKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxwPk5vcm1hbDwvcD5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIlxyXG4gICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCJcclxuICAgID5cclxuICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnc3VwZXJzY3JpcHQnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtc3VwZXJzY3JpcHRcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnc3Vic2NyaXB0JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXN1YnNjcmlwdFwiPjwvaT48L2J1dHRvbj4gLS0+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzU3Vic2NyaXB0QWN0aXZlXCJcclxuICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdzdWJzY3JpcHQnKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXN1YnNjcmlwdFwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzU3VwZXJzY3JpcHRBY3RpdmVcIlxyXG4gICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N1cGVyc2NyaXB0JylcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdXBlcnNjcmlwdFwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCJcclxuICAgICAgcm9sZT1cImdyb3VwXCJcclxuICAgICAgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJxbC1hbGlnblwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiBhcnJvdy1ub25lIHRleHQtc2Vjb25kYXJ5XCJcclxuICAgICAgICAgIGlkPVwiZHJvcGRvd25CYXNpYzFcIlxyXG4gICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcclxuICAgICAgICAgIG5nYkRyb3Bkb3duVG9nZ2xlXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1sZWZ0XCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIG5nYkRyb3Bkb3duTWVudVxyXG4gICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PVwiZHJvcGRvd25CYXNpYzFcIlxyXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDogM3B4XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUxlZnQnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdFwiPjwvaT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlDZW50ZXInKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tY2VudGVyXCI+PC9pPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeVJpZ2h0JylcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWFsaWduLXJpZ2h0XCI+PC9pPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUZ1bGwnKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tanVzdGlmeVwiPjwvaT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCJcclxuICAgICAgcm9sZT1cImdyb3VwXCJcclxuICAgICAgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiXHJcbiAgICA+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdyZW1vdmVGb3JtYXQnKVwiXHJcbiAgICAgID5cclxuICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWNsZWFyXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIlxyXG4gICAgICByb2xlPVwiZ3JvdXBcIlxyXG4gICAgICBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCJcclxuICAgID5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgIChjbGljayk9XCJhZGRMaW5rKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWxpbmstdmFyaWFudFwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAoY2xpY2spPVwiaW5zZXJ0c0ltYWdlKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWltYWdlXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cImZpbGVcIlxyXG4gICAgICAgIGlkPVwiaW1hZ2VJbnB1dFwiXHJcbiAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBub25lXCJcclxuICAgICAgICAoY2hhbmdlKT1cImhhbmRsZUltYWdlVXBsb2FkKCRldmVudClcIlxyXG4gICAgICAgIGFjY2VwdD1cImltYWdlLypcIlxyXG4gICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiXHJcbiAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJUYWJsZSBPcHRpb25zXCJcclxuICAgID5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgIChjbGljayk9XCJhZGRUYWJsZSgpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZVwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgKGNsaWNrKT1cImFkZFJvdygpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcGx1cy1hZnRlclwiPjwvaT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVJvdygpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcmVtb3ZlXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCJcclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAoY2xpY2spPVwiYWRkQ29sdW1uKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1wbHVzLWFmdGVyXCI+PC9pPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCJcclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAoY2xpY2spPVwiZGVsZXRlQ29sdW1uKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1yZW1vdmVcIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiXHJcbiAgICAgIHJvbGU9XCJncm91cFwiXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJUYWJsZSBPcHRpb25zXCJcclxuICAgID5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgICpuZ0lmPVwic2VsZWN0ZWRJbWFnZVwiXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbi0yXCJcclxuICAgICAgICAoY2xpY2spPVwiZWRpdEltYWdlKClcIlxyXG4gICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlXCJcclxuICAgICAgPlxyXG4gICAgICAgIEVkaXQgSW1hZ2VcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiBjdXN0b20tY29sb3ItdHJpZ2dlclwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItdGV4dCBpY29uLXdpdGgtdW5kZXJsaW5lXCIgW3N0eWxlLmNvbG9yXT1cImNvbG9yXCI+PC9pPlxyXG4gICAgICAgIDxuZ3gtY29sb3JzIFsobmdNb2RlbCldPVwiY29sb3JcIiAoY2hhbmdlKT1cImNvbG9yQ2hhbmdlZCgkZXZlbnQpXCI+PC9uZ3gtY29sb3JzPlxyXG4gICAgPC9kaXY+IC0tPlxyXG4gICAgPCEtLSA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXBcIiBuZ2JEcm9wZG93biBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgbmdiRHJvcGRvd25Ub2dnbGUgIChjbGljayk9XCJhZGRUYWJsZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93bk1lbnUgKm5nSWY9XCJpc1RhYmxlU2VsZWN0ZWQgfHwgdGFibGVBZGRlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cImFkZFJvdygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcGx1cy1hZnRlclwiPjwvaT4gQWRkIFJvd1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cImRlbGV0ZVJvdygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcmVtb3ZlXCI+PC9pPiBEZWxldGUgUm93XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwiYWRkQ29sdW1uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1wbHVzLWFmdGVyXCI+PC9pPiBBZGQgQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiAoY2xpY2spPVwiZGVsZXRlQ29sdW1uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1yZW1vdmVcIj48L2k+IERlbGV0ZSBDb2x1bW5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ0YWJsZVdpZHRoXCI+VGFibGUgV2lkdGg8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwidGFibGVXaWR0aFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGNoYW5nZSk9XCJhZGp1c3RUYWJsZVdpZHRoKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJXaWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjZWxsV2lkdGhcIj5DZWxsIFdpZHRoPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImNlbGxXaWR0aFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGNoYW5nZSk9XCJhZGp1c3RDZWxsV2lkdGgoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIldpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlbGxIZWlnaHRcIj5DZWxsIEhlaWdodDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJjZWxsSGVpZ2h0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAoY2hhbmdlKT1cImFkanVzdENlbGxIZWlnaHQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkhlaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICA8L2Rpdj5cclxuICA8IS0tIDxkaXYgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiIGlkPVwiZWRpdG9yXCIgY2xhc3M9XCJwLTMgY3VzdG9tLXNjcm9sbGJhciBub24tZm9jdXNcIiAjZWRpdG9yXHJcbiAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAyMHB4ICFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAyMHB4ICFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDtcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJ0aGVtZU1vZGVCZ0NscigpXCIgW3N0eWxlLmJvcmRlci10b3BdPVwidGhlbWVNb2RlQm9yZGVyVG9wKClcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnZm9udC1mYW1pbHknOiBzZWxlY3RlZEZvbnQsICdmb250LXNpemUnOiBzZWxlY3RlZEZvbnRTaXplICsgJ3B4J31cIiBbc3R5bGVdPVwic3R5bGVcIlxyXG4gICAgICAgIFtzdHlsZS5taW4taGVpZ2h0XT1cIklzT3BlbiA/ICc4NXZoICFpbXBvcnRhbnQnIDogICc0MDVweCAhaW1wb3J0YW50J1wiXHJcbiAgICAgICAgKGlucHV0KT1cIm9uTW9kZWxDaGFuZ2UoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiSW5zZXJ0IHRleHQgaGVyZSAuLi5cIiByZWFkb25seSAobW91c2V1cCk9XCJvblRleHRTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRDb250ZW50XCIgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50KVwiIChmb2N1cyk9XCJvbkZvY3VzKClcIiAoYmx1cik9XCJvbkJsdXIoKVwiXHJcbiAgICAgICAgKGNsaWNrKT1cImNoZWNrVGFibGVTZWxlY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgPC9kaXY+IC0tPlxyXG4gIDwhLS0gPGRpdiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgaWQ9XCJlZGl0b3JcIiBjbGFzcz1cInAtMyBjdXN0b20tc2Nyb2xsYmFyIG5vbi1mb2N1cyBvdmVyZmxvdy1hdXRvXCIgI2VkaXRvclxyXG4gICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O1xyXG4gICAgICAgICAgICAgICBcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJ0aGVtZU1vZGVCZ0NscigpXCJcclxuICAgICAgICBbc3R5bGUuYm9yZGVyLXRvcF09XCJ0aGVtZU1vZGVCb3JkZXJUb3AoKVwiXHJcbiAgICAgICAgXHJcbiAgICAgICAgW25nU3R5bGVdPVwieydmb250LWZhbWlseSc6IHNlbGVjdGVkRm9udCwgJ2ZvbnQtc2l6ZSc6IHNlbGVjdGVkRm9udFNpemUgKyAncHgnLFxyXG4gICAgICAgICAgICdib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJzogaXNPcGVuID8gJzAnIDonMjBweCcsXHJcbiAgICAgICAgICAgJ2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzJzogaXNPcGVuID8gJzAnIDonMjBweCdcclxuICAgICAgICB9XCJcclxuICAgICAgICBbc3R5bGUubWluLWhlaWdodF09XCJJc09wZW4gPyAnOTN2aCcgOiAnNDA1cHgnXCIgKGlucHV0KT1cIm9uTW9kZWxDaGFuZ2UoJGV2ZW50KVwiIHBsYWNlaG9sZGVyPVwiSW5zZXJ0IHRleHQgaGVyZSAuLi5cIlxyXG4gICAgICAgIHJlYWRvbmx5IChtb3VzZXVwKT1cIm9uVGV4dFNlbGVjdCgkZXZlbnQpXCIgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRDb250ZW50XCIgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIChibHVyKT1cIm9uQmx1cigpXCIgKGNsaWNrKT1cImNoZWNrVGFibGVTZWxlY3Rpb24oJGV2ZW50KVwiPlxyXG4gICAgPC9kaXY+IC0tPlxyXG4gIDxkaXZcclxuICAgIFthdHRyLmNvbnRlbnRlZGl0YWJsZV09XCJjb250ZW50RWRpdGFibGVcIlxyXG4gICAgaWQ9XCJlZGl0b3JcIlxyXG4gICAgY2xhc3M9XCJwLTMgY3VzdG9tLXNjcm9sbGJhciBub24tZm9jdXMgb3ZlcmZsb3ctYXV0b1wiXHJcbiAgICAjZWRpdG9yXHJcbiAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OyBvdmVyZmxvdzogYXV0b1wiXHJcbiAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJ0aGVtZU1vZGVCZ0NscigpXCJcclxuICAgIFtzdHlsZS5ib3JkZXItdG9wXT1cInRoZW1lTW9kZUJvcmRlclRvcCgpXCJcclxuICAgIFtuZ1N0eWxlXT1cIntcclxuICAgICAgJ2ZvbnQtZmFtaWx5Jzogc2VsZWN0ZWRGb250LFxyXG4gICAgICAnZm9udC1zaXplJzogc2VsZWN0ZWRGb250U2l6ZSArICdweCcsXHJcbiAgICAgICdib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDogJzIwcHgnLFxyXG4gICAgICAnYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMnOiBJc09wZW4gPyAnMCcgOiAnMjBweCcsXHJcbiAgICAgICdtaW4taGVpZ2h0JzogSXNPcGVuID8gJzkzdmgnIDogJzQwNXB4JyxcclxuICAgICAgJ21heC1oZWlnaHQnOiBJc09wZW4gPyAnOTN2aCcgOiAnNDA1cHgnXHJcbiAgICB9XCJcclxuICAgIHBsYWNlaG9sZGVyPVwiSW5zZXJ0IHRleHQgaGVyZSAuLi5cIlxyXG4gICAgcmVhZG9ubHlcclxuICAgIChtb3VzZXVwKT1cIm9uVGV4dFNlbGVjdCgkZXZlbnQpXCJcclxuICAgIChpbnB1dCk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudClcIlxyXG4gICAgW2lubmVySFRNTF09XCJzYW5pdGl6ZWRDb250ZW50XCJcclxuICAgIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIlxyXG4gICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAoYmx1cik9XCJvbkJsdXIoKVwiXHJcbiAgICAoY2xpY2spPVwiY2hlY2tUYWJsZVNlbGVjdGlvbigkZXZlbnQpXCJcclxuICAgIChrZXlkb3duKT1cImhhbmRsZVRhYktleSgkZXZlbnQpXCJcclxuICA+PC9kaXY+XHJcblxyXG4gIDx0YWJsZSAqbmdJZj1cInBhcnNlZFRhYmxlXCI+XHJcbiAgICA8dGhlYWQ+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGggKm5nRm9yPVwibGV0IGhlYWRlciBvZiBwYXJzZWRUYWJsZS5oZWFkZXJzXCI+e3sgaGVhZGVyIH19PC90aD5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGhlYWQ+XHJcbiAgICA8dGJvZHk+XHJcbiAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHBhcnNlZFRhYmxlLnJvd3NcIj5cclxuICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93XCI+e3sgY2VsbCB9fTwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L3Rib2R5PlxyXG4gIDwvdGFibGU+XHJcbjwvZGl2PlxyXG4iXX0=
2261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWwtdGV4dC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZWwtdGV4dC1lZGl0b3Ivc3JjL2xpYi9lbC10ZXh0LWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9lbC10ZXh0LWVkaXRvci9zcmMvbGliL2VsLXRleHQtZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQW1ELE1BQU0sZUFBZSxDQUFDO0FBQ3RLLE9BQU8sRUFBcUMsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU10Rix5R0FBeUc7QUFDekcsT0FBTyxFQUFFLFFBQVEsRUFBYyxNQUFNLFdBQVcsQ0FBQzs7Ozs7Ozs7QUFhakQsTUFBTSxPQUFPLHFCQUFxQjtJQXdGaEMsWUFDVSxNQUFjLEVBQ2QsS0FBcUIsRUFDckIsUUFBbUIsRUFDbkIsU0FBdUI7UUFIdkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQTFGeEIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQVN4QixnQkFBVyxHQUFnQyxPQUFPLENBQUM7UUFDbkQsb0JBQWUsR0FBWSxJQUFJLENBQUMsQ0FBQywwQkFBMEI7UUFDMUQsMEJBQXFCLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUMsQ0FBQyxxQkFBcUI7UUFDakcscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM5Qyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQy9DLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMxQyxjQUFTLEdB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QUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDSSxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUUsS0FBSztzQkFBYixLQUFLO2dCQUdtQixVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ0UsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBSZW5kZXJlcjIsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG4vLyBpbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBOZ3hGdWxsc2NyZWVuRGlyZWN0aXZlIH0gZnJvbSAnQHVsdGltYXRlL25neC1mdWxsc2NyZWVuJztcclxuaW1wb3J0ICogYXMgWExTWCBmcm9tICd4bHN4JztcclxuLy8gaW1wb3J0IHsgSW1hZ2VFZGl0b3JNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL21vZGFscy9pbWFnZS1lZGl0b3ItbW9kYWwvaW1hZ2UtZWRpdG9yLW1vZGFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IGNvbXByZXNzLCBkZWNvbXByZXNzIH0gZnJvbSAnbHotc3RyaW5nJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3RleHQtZWRpdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZWwtdGV4dC1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2VsLXRleHQtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEVsVGV4dEVkaXRvckNvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG4gIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFbFRleHRFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQElucHV0KCkgZWRpdG9yVGV4dDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgZWRpdG9yRnJvbTogYW55O1xyXG4gIEBJbnB1dCgpIGVkaXRvckFjdGlvbjogYW55O1xyXG4gIEBJbnB1dCgpIFVzZXJSb2xlOiBhbnk7XHJcbiAgQElucHV0KCkgc3R5bGU6IGFueTtcclxuICBASW5wdXQoKSBkaXNhYmxlVG9vbGJhcjogYW55O1xyXG4gIEBJbnB1dCgpIHBsYWNlSG9sZGVyOiBhbnk7XHJcbiAgQElucHV0KCkgcmVwb3J0SWQ6IGFueTtcclxuICBASW5wdXQoKSBiYWNrZ3JvdW5kSW1hZ2U6IGFueTtcclxuICBASW5wdXQoKSB0b29sYmFyTW9kZTogJ2ZpeGVkJyB8ICdidWJibGUnIHwgJ25vbmUnID0gJ2ZpeGVkJztcclxuICBASW5wdXQoKSBjb250ZW50RWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlOyAvLyBJbnB1dCBmb3IgaW5pdGlhbCB2YWx1ZVxyXG4gIEBPdXRwdXQoKSBjb250ZW50RWRpdGFibGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTsgLy8gT3V0cHV0IGZvciBjaGFuZ2VzXHJcbiAgQE91dHB1dCgpIGVkaXRvclRleHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgZWRpdG9yQWN0aW9uUmVzcG9uc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZWRpdG9yVGV4dENsZWFyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGltYWdlRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBpbWFnZUVkaXQyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHBsYWNlSG9sZGVyUmVtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGlzT3BlbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBuZXdJbWFnZUFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgXHJcbiAgQElucHV0KCkgdmFsdWU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBcclxuICBAVmlld0NoaWxkKCd0ZXh0RWRpdG9yJykgVGV4dEVkaXRvciE6ICBFbGVtZW50UmVmPEVsZW1lbnQ+O1xyXG4gIEBWaWV3Q2hpbGQoJ2Z1bGxzY3JlZW4nKSBmdWxsc2NyZWVuITogTmd4RnVsbHNjcmVlbkRpcmVjdGl2ZVxyXG4gICAgXHJcbiAgc2FuaXRpemVkQ29udGVudCE6IFNhZmVIdG1sO1xyXG5cclxuXHJcbiAgc2hvd1Rvb2xiYXIgPSBmYWxzZTtcclxuICB0b29sYmFyVG9wID0gMDtcclxuICB0b29sYmFyTGVmdCA9IDA7XHJcblxyXG4gIGZvbnRzID0gWydBcmlhbCcsICdDb3VyaWVyIE5ldycsICdHZW9yZ2lhJywgJ1RpbWVzIE5ldyBSb21hbicsICdWZXJkYW5hJ107XHJcbiAgZm9udFNpemVzID0gWzEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDI0LCAyOCwgMzIsIDM2XTtcclxuICBjdXJyZW50TGlzdExldmVsOiBudW1iZXIgPSAwOyAvLyBUcmFjayB0aGUgY3VycmVudCBsaXN0IGxldmVsXHJcbiAgbGlzdFN0eWxlczogc3RyaW5nW10gPSBbXCJkZWNpbWFsXCIsIFwibG93ZXItYWxwaGFcIiwgXCJsb3dlci1yb21hblwiXTtcclxuICBzZWxlY3RlZEZvbnQgPSAnQXJpYWwnO1xyXG4gIHNlbGVjdGVkRm9udFNpemUgPSAxNDtcclxuICBpc1RhYmxlU2VsZWN0ZWQgPSBmYWxzZTtcclxuICB0YWJsZUFkZGVkID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRUYWJsZTogSFRNTFRhYmxlRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG4gIGlzUGxhY2Vob2xkZXJWaXNpYmxlID0gdHJ1ZTtcclxuICBzZWxlY3RlZENlbGw6IEhUTUxUYWJsZUNlbGxFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgXHJcbiAgaXNCb2xkQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNJdGFsaWNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1VuZGVybGluZUFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzU3RyaWtldGhyb3VnaEFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzU3Vic2NyaXB0QWN0aXZlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNTdXBlcnNjcmlwdEFjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzZWxlY3RlZEZvcm1hdEJsb2NrOiBzdHJpbmcgPSAnbm9ybWFsJ1xyXG5cclxuICBzZWxlY3RlZEltYWdlOiBIVE1MSW1hZ2VFbGVtZW50IHwgbnVsbCA9IG51bGw7XHJcbiAgaW1hZ2VFZGl0VXJsOiBzdHJpbmcgPSAnJztcclxuICBpbWFnZVBvc2l0aW9uWCA9IDA7XHJcbiAgaW1hZ2VQb3NpdGlvblkgPSAwO1xyXG4gIGltYWdlUmVzaXplU3RhcnRYID0gMDtcclxuICBpbWFnZVJlc2l6ZVN0YXJ0WSA9IDA7XHJcbiAgaW1hZ2VSZXNpemVTdGFydFdpZHRoID0gMDtcclxuICBpbWFnZVJlc2l6ZVN0YXJ0SGVpZ2h0ID0gMDtcclxuICBpbWFnZVJlc2l6ZURpcmVjdGlvbjogJ3RvcExlZnQnIHwgJ3RvcFJpZ2h0JyB8ICdib3R0b21MZWZ0JyB8ICdib3R0b21SaWdodCcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgdW5kb1N0YWNrOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHJlZG9TdGFjazogc3RyaW5nW10gPSBbXTtcclxuICBoaXN0b3J5OiBzdHJpbmdbXSA9IFtdO1xyXG4gIGhpc3RvcnlJbmRleCA9IC0xO1xyXG4gIC8vIGVkaXRvclRleHQxID0gYGA7XHJcbiAgc2VsZWN0ZWRUZXh0Q29sb3I6IGFueTtcclxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XHJcbiAgb25Ub3VjaGVkOiBhbnkgPSAoKSA9PiB7fTtcclxuICBjb2xvcjogYW55ID0gJyNkZGQnO1xyXG4gIGNvbG9yRm9ybUNvbnRyb2whOiBGb3JtQ29udHJvbDtcclxuICBiYWNrZ3JvdW5kQ29sb3I6IGFueTtcclxuICBzZWxlY3RlZEl0ZW1JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHBhcnNlZFRhYmxlOiB7IGhlYWRlcnM6IHN0cmluZ1tdLCByb3dzOiBzdHJpbmdbXVtdIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgaXNGdWxsU2NyZWVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY3VycmVudENhcmV0UG9zaXRpb246IGFueTtcclxuICB1c2VyUm9sZTogYW55W10gPSBbXTtcclxuICBzaG93RWRpdEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHRIZWFkQmdDb2xvcjogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgKSB7XHJcbiAgICB0aGlzLmdldFVzZXJSb2xlcygpXHJcblxyXG4gICAgXHJcbiAgfVxyXG5cclxuICB0aGVtZU1vZGUoKSB7XHJcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcclxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xyXG4gICAgICByZXR1cm4gJzJweCBzb2xpZCAjNDAzRjRBICFpbXBvcnRhbnQnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJzJweCBzb2xpZCAjRDBEMEQwICFpbXBvcnRhbnQnXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0aGVtZU1vZGVDbHIoKSB7XHJcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcclxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xyXG4gICAgICByZXR1cm4gJyNmZmYgIWltcG9ydGFudCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnIzAwMCAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lKCkge1xyXG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXHJcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgI0ZGRkZGRiAhaW1wb3J0YW50J1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgI0QwRDBEMCAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlQmdDbHIoKSB7XHJcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcclxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xyXG4gICAgICByZXR1cm4gJyMyODI4MjggIWltcG9ydGFudCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnI0YzRjNGMyAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlQm9yZGVyVG9wKCkge1xyXG4gICAgY29uc3QgY2xyTW9kZSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdkYXRhLWxheW91dC1jb2xvcicpXHJcbiAgICBpZiAoY2xyTW9kZSA9PSAnZGFyaycpIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgIzAwMCAhaW1wb3J0YW50J1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcycHggc29saWQgI2ZmZiAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1sncGxhY2VIb2xkZXInXSkge1xyXG4gICAgICB0aGlzLmluc2VydEF0Q2FyZXQodGhpcy5wbGFjZUhvbGRlcilcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXNbJ3JlcG9ydElkJ10pIHtcclxuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgncmVwb3J0SWQnLCB0aGlzLnJlcG9ydElkKVxyXG4gICAgfSBcclxuXHJcbiAgICBpZiAoY2hhbmdlc1snVXNlclJvbGUnXSkgeyBcclxuICAgICAgdGhpcy5nZXRVc2VyUm9sZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmluaXRFZGl0b3IoKTtcclxuICAgIHRoaXMuY2hlY2tQbGFjZWhvbGRlcigpO1xyXG4gICAgdGhpcy5zZXR1cEhpc3RvcnkoKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLm9uRnVsbHNjcmVlbkNoYW5nZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdF9GdW5jKHRoaXMuZWRpdG9yVGV4dClcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGlvbmNoYW5nZScsICgpID0+IHtcclxuICAgICAgdGhpcy5jaGVja0FjdGl2ZVN0YXRlcygpO1xyXG4gICAgICB0aGlzLmNoZWNrRm9ybWF0QmxvY2soKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hZGRDbGlja0xpc3RlbmVyVG9JbWFnZXMoKTtcclxuICAgIHRoaXMuYWRkQ2xpY2tMaXN0ZW5lclRvRWxlbWVudHMoKTtcclxuICAgIC8vIHRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XHJcbiAgICAvLyAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHBhcmFtc1snZGF0YSddKTtcclxuICAgIC8vICAgaWYgKGRhdGEuZWRpdGVkSU1HKSB7XHJcbiAgICAvLyAgICAgY29uc3QgaW1nVXJsID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAnKTtcclxuICAgIC8vICAgICBpZiAoaW1nVXJsKSB7XHJcbiAgICAvLyAgICAgICB0aGlzLnJlcGxhY2VJbWFnZVNyYyhpbWdVcmwsIGRhdGEuaW5kZXguaW5kZXgpXHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wJyk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pXHJcbiAgfVxyXG5cclxuICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAvLyBDbGVhbnVwIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkXHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuY2hhbmdlJywgdGhpcy5vbkZ1bGxzY3JlZW5DaGFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgSXNPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgdG9nZ2xlRnVsbHNjcmVlbjEoKSB7XHJcbiAgICAgIHRoaXMuSXNPcGVuID0gIXRoaXMuSXNPcGVuO1xyXG4gICAgICB0aGlzLmlzT3Blbi5lbWl0KHRoaXMuSXNPcGVuKVxyXG4gICAgICBpZiAodGhpcy5Jc09wZW4pIHsgXHJcbiAgICAgICAgdGhpcy5mdWxsc2NyZWVuLmVudGVyKHRoaXMuVGV4dEVkaXRvci5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmZ1bGxzY3JlZW4uZXhpdCgpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICBcclxuICBwcml2YXRlIG9uRnVsbHNjcmVlbkNoYW5nZSA9ICgpID0+IHtcclxuICAgIGlmICghZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcclxuICAgICAgLy8gV2hlbiBmdWxsc2NyZWVuIG1vZGUgaXMgZXhpdGVkXHJcbiAgICAgIHRoaXMuSXNPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNPcGVuLmVtaXQodGhpcy5Jc09wZW4pO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgXHJcbiAgLy8gZW50ZXJGdWxsc2NyZWVuVmlkZW8oKSB7XHJcbiAgLy8gICBjb25zb2xlLmxvZygnZXZlbnQ6JywgZXZlbnQpO1xyXG4gIC8vICAgY29uc3QgZnVsbHNjcmVlbiA9IGV2ZW50O1xyXG4gIC8vICAgdGhpcy5pc09wZW4gPSBldmVudDtcclxuICAvLyAgIGlmIChmdWxsc2NyZWVuKSB7XHJcbiAgLy8gICAgIHRoaXMuZnVsbHNjcmVlbi5lbnRlcih0aGlzLlRleHRFZGl0b3IubmF0aXZlRWxlbWVudCk7XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLmZ1bGxzY3JlZW4uZXhpdCgpXHJcbiAgLy8gICB9XHJcbiAgICBcclxuICAvLyB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5lZGl0b3JUZXh0ID0gdmFsdWU7XHJcbiAgICAgIHRoaXMuaW5pdEVkaXRvcigpO1xyXG4gICAgICB0aGlzLmluaXRfRnVuYyh0aGlzLmVkaXRvclRleHQpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuLy8gIHByaXZhdGUgYWRkQ2xpY2tMaXN0ZW5lclRvSW1hZ2VzKCkge1xyXG4vLyAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuLy8gICBpZiAoZWRpdG9yKSB7XHJcbi8vICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuLy8gICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4vLyAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnKSB7XHJcbi8vICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbi8vICAgICAgICAgdGhpcy5pbWFnZUVkaXRVcmwgPSB0aGlzLnNlbGVjdGVkSW1hZ2Uuc3JjO1xyXG5cclxuLy8gICAgICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5zZWxlY3RlZEltYWdlLnBhcmVudEVsZW1lbnQ7XHJcbi8vICAgICAgICAgaWYgKCFjb250YWluZXIgfHwgY29udGFpbmVyLmNsYXNzTmFtZSAhPT0gJ2ltYWdlLWNvbnRhaW5lcicpIHtcclxuLy8gICAgICAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTmFtZSA9ICdpbWFnZS1jb250YWluZXInO1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuLy8gICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XHJcbi8vICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UucGFyZW50Tm9kZT8uaW5zZXJ0QmVmb3JlKGNvbnRhaW5lciwgdGhpcy5zZWxlY3RlZEltYWdlKTtcclxuLy8gICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdGVkSW1hZ2UpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICBjb25zdCBleGlzdGluZ0J1dHRvbiA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcuaW1hZ2UtZWRpdC1idXR0b24nKTtcclxuLy8gICAgICAgICBpZiAoZXhpc3RpbmdCdXR0b24pIHtcclxuLy8gICAgICAgICAgIGV4aXN0aW5nQnV0dG9uLnJlbW92ZSgpO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XHJcbi8vICAgICAgICAgLy8gYnV0dG9uLnRleHRDb250ZW50ID0gJ0VkaXQnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5pbm5lclRleHQgPSAnRWRpdCBJbWFnZSc7XHJcblxyXG4vLyAgICAgICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAnaW1hZ2UtZWRpdC1idXR0b24gYnRuIGJ0bi1zbSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUudG9wID0gJzUwJSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmxlZnQgPSAnNTAlJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnpJbmRleCA9ICcxMDAwJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmYnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5ib3JkZXIgPSAnMnB4IHNvbGlkICNmZmYnO1xyXG4vLyAgICAgICAgIC8vIGJ1dHRvbi5zdHlsZS5wYWRkaW5nID0gJzEwcHgnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5jb2xvciA9ICcjMzEzYTQ2JztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xyXG5cclxuLy8gICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4vLyAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuLy8gICAgICAgICAgIHRoaXMuZWRpdEltYWdlKCk7XHJcbi8vICAgICAgICAgfSk7XHJcblxyXG4vLyAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChidXR0b24pO1xyXG4vLyAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbi8vICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IG51bGw7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH0pO1xyXG4vLyAgIH1cclxuICAvLyB9XHJcbiAgZ2V0VXNlclJvbGVzKCkge1xyXG4gICAgdGhpcy51c2VyUm9sZSA9IHRoaXMuVXNlclJvbGVcclxuICB9XHJcbiAgLy8gcm9sZUNoZWNrKCkge1xyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnVzZXJSb2xlLmxlbmd0aDsgKytpKSB7XHJcbiAgLy8gICAgIGNvbnN0IHJvbGVOYW1lID0gW11cclxuICAvLyAgICAgICByb2xlTmFtZS5wdXNoKHRoaXMudXNlclJvbGVbaV0/Lm5hbWUpO1xyXG4gIC8vICAgICByZXR1cm4gdGhpcy51c2VyUm9sZVtpXT8ubmFtZTtcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIHJvbGVDaGVjaygpIHtcclxuICAgIGxldCB1c2VyUm9sZU5hbWU6IHN0cmluZ1tdID0gW107XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0aGlzLnVzZXJSb2xlLmxlbmd0aDsgKytpKSB7XHJcbiAgICAgIHVzZXJSb2xlTmFtZS5wdXNoKHRoaXMudXNlclJvbGVbaV0/Lm5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZXJSb2xlTmFtZTtcclxuICB9XHJcblxyXG5cclxuLy8gcHJpdmF0ZSBhZGRDbGlja0xpc3RlbmVyVG9JbWFnZXMoKSB7XHJcbi8vICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4vLyAgIGNvbnN0IHJvbGVzID0gdGhpcy5yb2xlQ2hlY2soKTsgLy8gR2V0IHVzZXIgcm9sZXMgZHluYW1pY2FsbHlcclxuLy8gICBjb25zdCBpc0FkbWluID0gcm9sZXMuaW5jbHVkZXMoJ0FkbWluJyk7XHJcbi8vICAgY29uc3QgaXNDcmVhdG9yID0gcm9sZXMuaW5jbHVkZXMoJ0NyZWF0b3InKTtcclxuLy8gICBjb25zdCBpc0FwcHJvdmVyID0gcm9sZXMuaW5jbHVkZXMoJ0FwcHJvdmVyJyk7XHJcbiAgXHJcbi8vICAgaWYgKGlzQ3JlYXRvciB8fCBpc0FkbWluKSB7XHJcbi8vICAgICBpZiAoZWRpdG9yKSB7XHJcbi8vICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuLy8gICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4vLyAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnKSB7XHJcbi8vICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbi8vICAgICAgICAgdGhpcy5pbWFnZUVkaXRVcmwgPSB0aGlzLnNlbGVjdGVkSW1hZ2Uuc3JjO1xyXG4vLyAgICAgICAgIGxldCBjb250YWluZXIgPSB0aGlzLnNlbGVjdGVkSW1hZ2UucGFyZW50RWxlbWVudDtcclxuLy8gICAgICAgICBpZiAoIWNvbnRhaW5lciB8fCBjb250YWluZXIuY2xhc3NOYW1lICE9PSAnaW1hZ2UtY29udGFpbmVyJykge1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbi8vICAgICAgICAgICBjb250YWluZXIuY2xhc3NOYW1lID0gJ2ltYWdlLWNvbnRhaW5lcic7XHJcbi8vICAgICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4vLyAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJzsgIFxyXG4vLyAgICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShjb250YWluZXIsIHRoaXMuc2VsZWN0ZWRJbWFnZSk7XHJcbi8vICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zZWxlY3RlZEltYWdlKTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIGNvbnN0IGV4aXN0aW5nQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5pbWFnZS1lZGl0LWJ1dHRvbicpO1xyXG4vLyAgICAgICAgIGlmIChleGlzdGluZ0J1dHRvbikge1xyXG4vLyAgICAgICAgICAgZXhpc3RpbmdCdXR0b24ucmVtb3ZlKCk7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcclxuLy8gICAgICAgICBidXR0b24udGV4dENvbnRlbnQgID0gJ0VkaXQgSW1hZ2UnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAnaW1hZ2UtZWRpdC1idXR0b24gYnRuIGJ0bi1zbSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUudG9wID0gJzUwJSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmxlZnQgPSAnNTAlJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKSc7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnpJbmRleCA9ICcxMDAwJztcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyNmZmYnOyBcclxuLy8gICAgICAgICBidXR0b24uc3R5bGUuYm9yZGVyID0gJzJweCBzb2xpZCAjZmZmJzsgXHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLmNvbG9yID0gJyMzMTNhNDYnO1xyXG4vLyAgICAgICAgIGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbi8vICAgICAgICAgYnV0dG9uLnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XHJcblxyXG4vLyAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XHJcbi8vICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4vLyAgICAgICAgICAgdGhpcy5lZGl0SW1hZ2UoKTtcclxuLy8gICAgICAgICB9KTtcclxuXHJcbi8vICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcblxyXG4vLyAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbi8vICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IG51bGw7XHJcbi8vICAgICAgICAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbWFnZS1lZGl0LWJ1dHRvbicpO1xyXG4vLyAgICAgICAgIGJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4gYnV0dG9uLnJlbW92ZSgpKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfSk7XHJcbi8vICAgfVxyXG4vLyAgIH1cclxuICAvLyB9XHJcbiAgcHJpdmF0ZSBhZGRDbGlja0xpc3RlbmVyVG9JbWFnZXMoKSB7XHJcbiAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIGNvbnN0IHJvbGVzID0gdGhpcy5yb2xlQ2hlY2soKTsgLy8gR2V0IHVzZXIgcm9sZXMgZHluYW1pY2FsbHlcclxuICBjb25zdCBpc0FkbWluID0gcm9sZXMuaW5jbHVkZXMoJ0FkbWluJyk7XHJcbiAgY29uc3QgaXNDcmVhdG9yID0gcm9sZXMuaW5jbHVkZXMoJ0NyZWF0b3InKTtcclxuXHJcbiAgaWYgKGlzQ3JlYXRvciB8fCBpc0FkbWluKSB7XHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSB0YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudDtcclxuICAgICAgICAgIHRoaXMuaW1hZ2VFZGl0VXJsID0gdGhpcy5zZWxlY3RlZEltYWdlLnNyYztcclxuICAgICAgICAgIGNvbnN0IGltYWdlcyA9IGVkaXRvci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XHJcbiAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpbWFnZXNbaV0gPT09IHRoaXMuc2VsZWN0ZWRJbWFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IGNvbnRhaW5lciA9IHRoaXMuc2VsZWN0ZWRJbWFnZS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgICAgaWYgKCFjb250YWluZXIgfHwgY29udGFpbmVyLmNsYXNzTmFtZSAhPT0gJ2ltYWdlLWNvbnRhaW5lcicpIHtcclxuICAgICAgICAgICAgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc05hbWUgPSAnaW1hZ2UtY29udGFpbmVyJztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlLnBhcmVudE5vZGU/Lmluc2VydEJlZm9yZShjb250YWluZXIsIHRoaXMuc2VsZWN0ZWRJbWFnZSk7XHJcbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnNlbGVjdGVkSW1hZ2UpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQnV0dG9uID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5pbWFnZS1lZGl0LWJ1dHRvbicpO1xyXG4gICAgICAgICAgaWYgKGV4aXN0aW5nQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIGV4aXN0aW5nQnV0dG9uLnJlbW92ZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xyXG4gICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ0VkaXQgSW1hZ2UnO1xyXG4gICAgICAgICAgYnV0dG9uLmNsYXNzTmFtZSA9ICdpbWFnZS1lZGl0LWJ1dHRvbiBidG4gYnRuLXNtJztcclxuICAgICAgICAgIGJ1dHRvbi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUudG9wID0gJzUwJSc7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUubGVmdCA9ICc1MCUnO1xyXG4gICAgICAgICAgYnV0dG9uLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoLTUwJSwgLTUwJSknO1xyXG4gICAgICAgICAgYnV0dG9uLnN0eWxlLnpJbmRleCA9ICcxMDAwJztcclxuICAgICAgICAgIGJ1dHRvbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZic7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUuYm9yZGVyID0gJzJweCBzb2xpZCAjZmZmJztcclxuICAgICAgICAgIGJ1dHRvbi5zdHlsZS5jb2xvciA9ICcjMzEzYTQ2JztcclxuICAgICAgICAgIGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbiAgICAgICAgICBidXR0b24uc3R5bGUudXNlclNlbGVjdCA9ICdub25lJztcclxuXHJcbiAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRJbWFnZSgpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlRWRpdEJ1dHRvbnMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gTW9uaXRvciBlZGl0b3IgY29udGVudCBjaGFuZ2VzIHRvIGhhbmRsZSBpbWFnZSBkZWxldGlvblxyXG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcclxuICAgICAgICBjb25zdCBidXR0b25zID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoJy5pbWFnZS1lZGl0LWJ1dHRvbicpO1xyXG4gICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBidXR0b24ucGFyZW50RWxlbWVudDtcclxuICAgICAgICAgIGlmIChjb250YWluZXIgJiYgIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdpbWcnKSkge1xyXG4gICAgICAgICAgICBidXR0b24ucmVtb3ZlKCk7IC8vIFJlbW92ZSB0aGUgYnV0dG9uIGlmIHRoZSBhc3NvY2lhdGVkIGltYWdlIGlzIGdvbmVcclxuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpOyAvLyBDbGVhbiB1cCB0aGUgY29udGFpbmVyXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gT2JzZXJ2ZSBjaGFuZ2VzIGluIHRoZSBlZGl0b3JcclxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShlZGl0b3IsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSByZW1vdmVFZGl0QnV0dG9ucygpIHtcclxuICBjb25zdCBidXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmltYWdlLWVkaXQtYnV0dG9uJyk7XHJcbiAgYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IGJ1dHRvbi5yZW1vdmUoKSk7XHJcbiAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcclxuICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gbnVsbDtcclxufVxyXG5cclxuXHJcbiAgLy8gcHJpdmF0ZSBhZGRDbGlja0xpc3RlbmVyVG9JbWFnZXMoKSB7XHJcbiAgLy8gY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIC8vIGlmIChlZGl0b3IpIHtcclxuICAvLyAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xyXG4gIC8vICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgLy8gICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lNRycpIHtcclxuICAvLyAgICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSB0YXJnZXQgYXMgSFRNTEltYWdlRWxlbWVudDtcclxuICAvLyAgICAgICB0aGlzLmltYWdlRWRpdFVybCA9IHRoaXMuc2VsZWN0ZWRJbWFnZS5zcmM7XHJcblxyXG4gIC8vICAgICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGltYWdlXHJcbiAgLy8gICAgICAgY29uc3QgaW1hZ2VzID0gZWRpdG9yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTtcclxuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgICAgaWYgKGltYWdlc1tpXSA9PT0gdGhpcy5zZWxlY3RlZEltYWdlKSB7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSBpO1xyXG4gIC8vICAgICAgICAgICBicmVhaztcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcblxyXG4gIC8vICAgICAgIGlmICh0aGlzLnRvb2xiYXJNb2RlID09PSAnYnViYmxlJykge1xyXG4gIC8vICAgICAgICAgdGhpcy5vblRleHRTZWxlY3QoKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcclxuICAvLyAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gbnVsbDtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG4gIC8vIH1cclxuICBcclxuICBwcml2YXRlIGFkZENsaWNrTGlzdGVuZXJUb0VsZW1lbnRzKCkge1xyXG4gIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICBpZiAoZWRpdG9yKSB7XHJcbiAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdJTUcnKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gdGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5pbWFnZUVkaXRVcmwgPSB0aGlzLnNlbGVjdGVkSW1hZ2Uuc3JjO1xyXG4gICAgICAgIGNvbnN0IGltYWdlcyA9IGVkaXRvci5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmIChpbWFnZXNbaV0gPT09IHRoaXMuc2VsZWN0ZWRJbWFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnVEQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEgnKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gdGFyZ2V0LmNsb3Nlc3QoJ3RhYmxlJykgYXMgSFRNTFRhYmxlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjZWxscyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YXJnZXQudGFnTmFtZSk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGNlbGxzW2ldID09PSB0YXJnZXQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSBudWxsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGFyZ2V0LnRhZ05hbWUgPT09ICdQJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1NQQU4nIHx8IHRhcmdldC50YWdOYW1lID09PSAnRElWJykge1xyXG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHMgPSBlZGl0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFyZ2V0LnRhZ05hbWUpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYWdyYXBocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKHBhcmFncmFwaHNbaV0gPT09IHRhcmdldCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgfVxyXG5cclxucmVwbGFjZUltYWdlU3JjKG5ld1NyYzogc3RyaW5nLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIFxyXG4gIGlmIChlZGl0b3IpIHtcclxuICAgIGVkaXRvci5mb2N1cygpXHJcbiAgICBjb25zdCBpbWFnZXMgPSBlZGl0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0lNRycpO1xyXG4gICAgaWYgKGluZGV4ID49IDAgKSB7XHJcbiAgICAgIGltYWdlc1tpbmRleF0uc2V0QXR0cmlidXRlKCdzcmMnLCBuZXdTcmMpO1xyXG4gICAgfSBcclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuICBwcml2YXRlIGluaXRFZGl0b3IoKSB7XHJcbiAgICAvLyBJbml0aWFsaXplIGVkaXRvciBjb250ZW50IGFuZCBsaXN0ZW5lcnNcclxuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuXHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvci5pbm5lckhUTUwgPSB0aGlzLmVkaXRvclRleHQ7XHJcbiAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAgICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UoZWRpdG9yLmlubmVySFRNTCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGVja1BsYWNlaG9sZGVyKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAvLyBIYW5kbGUgdGhlIGRpc2FibGVkIHN0YXRlIGlmIG5lY2Vzc2FyeVxyXG4gIH1cclxuXHJcbiAgb25Nb2RlbENoYW5nZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgY29uc3QgVkFMVUUgPSB2YWx1ZVxyXG4gICAgICB0aGlzLmVkaXRvclRleHQgPSBWQUxVRTtcclxuICAgICAgdGhpcy5vbkNoYW5nZShWQUxVRSk7XHJcbiAgICAgIHRoaXMuZWRpdG9yVGV4dENoYW5nZS5lbWl0KFZBTFVFKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhcHBseUltYWdlU3R5bGVzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIGRpdi5pbm5lckhUTUwgPSBjb250ZW50O1xyXG4gICAgY29uc3QgaW1hZ2VzID0gZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpO1xyXG4gICAgaW1hZ2VzLmZvckVhY2goaW1nID0+IHtcclxuICAgICAgaWYgKGltZy5zdHlsZS5tYXhXaWR0aCA+PSAnNzAwcHgnKSB7XHJcbiAgICAgICAgaW1nLnN0eWxlLm1heFdpZHRoID0gJzcwMHB4JztcclxuICAgICAgICAvLyBpbWcud2lkdGggPSAzMDA7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbWcuc3R5bGUubWF4V2lkdGggPSAnMTAwJSc7XHJcbiAgICAgICAgaW1nLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcclxuICB9XHJcblxyXG4gIC8vIGluaXRfRnVuYyhodG1sOiBhbnkpIHtcclxuICAvLyAgIGlmIChodG1sKSB7XHJcbiAgLy8gICAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgLy8gICAgIGlmIChlZGl0b3IpIHsgXHJcbiAgLy8gICAgICAgZWRpdG9yLmZvY3VzKClcclxuICAvLyAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gaHRtbDtcclxuICAvLyAgICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmFwcGx5SW1hZ2VTdHlsZXMoaHRtbCkpO1xyXG4gIC8vICAgICAgIGVkaXRvci5pbm5lckhUTUwgPSB0aGlzLnNhbml0aXplZENvbnRlbnQgYXMgc3RyaW5nO1xyXG4gIC8vICAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcclxuICAvLyAgICAgICAgIGlmIChlZGl0b3IpIHtcclxuICAvLyAgICAgICAgICAgZWRpdG9yLmZvY3VzKClcclxuICAvLyAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGVkaXRvci5pbm5lckhUTUwpO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9IGVsc2Uge1xyXG4gIC8vICAgICB0aGlzLnNlbGVjdGVkSW1hZ2UgPSBudWxsO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICBcclxuLy8gICBpbml0X0Z1bmMoaHRtbDogYW55KSB7XHJcbi8vICAgaWYgKGh0bWwpIHtcclxuLy8gICAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbi8vICAgICBpZiAoZWRpdG9yKSB7XHJcbi8vICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGVkaXRvciB3aXRoIHNhbml0aXplZCBjb250ZW50XHJcbiAgICAgIFxyXG4vLyAgICAgICB0aGlzLnNldEVkaXRvckNvbnRlbnQoaHRtbCk7XHJcblxyXG4vLyAgICAgICAvLyBTZXQgdXAgYSBNdXRhdGlvbk9ic2VydmVyIHRvIGhhbmRsZSBjb250ZW50IGNoYW5nZXNcclxuLy8gICAgICAgdGhpcy5zZXR1cE11dGF0aW9uT2JzZXJ2ZXIoZWRpdG9yKTtcclxuXHJcbi8vICAgICAgIC8vIE1vdmUgdGhlIGNhcmV0IHRvIHRoZSBlbmQgYWZ0ZXIgaW5pdGlhbCBjb250ZW50IHNldHVwXHJcbi8vICAgICAgIHRoaXMubW92ZUNhcmV0VG9FbmQoZWRpdG9yKTtcclxuXHJcbi8vICAgICAgIC8vIFRyYWNrIGNhcmV0IHBvc2l0aW9uIG9uIG1vdXNlIGNsaWNrXHJcbi8vICAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcclxuLy8gICAgICAgICBpZiAoZWRpdG9yKSB7ICAvLyBFbnN1cmUgZWRpdG9yIGlzIG5vdCBudWxsXHJcbi8vICAgICAgICAgICAvLyB0aGlzLnRyYWNrQ2FyZXRQb3NpdGlvbihlZGl0b3IpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgfSk7XHJcbi8vICAgICB9XHJcbi8vICAgfSBlbHNlIHtcclxuLy8gICAgIHRoaXMuc2VsZWN0ZWRJbWFnZSA9IG51bGw7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4vLyBwcml2YXRlIHNldEVkaXRvckNvbnRlbnQoaHRtbDogc3RyaW5nKSB7XHJcbi8vICAgbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuLy8gICBpZiAoZWRpdG9yKSB7XHJcbi8vICAgICAvLyBTYW5pdGl6ZSBhbmQgYXBwbHkgc3R5bGVzIHRvIHRoZSBIVE1MXHJcbi8vICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmFwcGx5SW1hZ2VTdHlsZXMoaHRtbCkpO1xyXG4vLyAgICAgZWRpdG9yLmlubmVySFRNTCA9IHRoaXMuc2FuaXRpemVkQ29udGVudCBhcyBzdHJpbmc7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4vLyBwcml2YXRlIHNldHVwTXV0YXRpb25PYnNlcnZlcihlZGl0b3I6IEhUTUxFbGVtZW50KSB7XHJcbi8vICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbi8vICAgICAvLyBVcGRhdGUgbW9kZWwgd2l0aCB0aGUgY3VycmVudCBjb250ZW50XHJcbi8vICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UoZWRpdG9yLmlubmVySFRNTCk7XHJcbi8vICAgfSk7XHJcblxyXG4vLyAgIG9ic2VydmVyLm9ic2VydmUoZWRpdG9yLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTtcclxuLy8gfVxyXG5cclxuLy8gVGhpcyBmdW5jdGlvbiB0cmFja3MgdGhlIGNhcmV0IHBvc2l0aW9uIGJhc2VkIG9uIHRoZSBtb3VzZSBjbGlja1xyXG5wcml2YXRlIHRyYWNrQ2FyZXRQb3NpdGlvbihlZGl0b3I6IEhUTUxFbGVtZW50KSB7XHJcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgY29uc3Qgc3RhcnROb2RlID0gcmFuZ2Uuc3RhcnRDb250YWluZXI7XHJcbiAgICBjb25zdCBzdGFydE9mZnNldCA9IHJhbmdlLnN0YXJ0T2Zmc2V0O1xyXG5cclxuXHJcbiAgICAvLyBZb3UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGluc2VydCBjb250ZW50IG9yIHBlcmZvcm0gYWN0aW9ucyBiYXNlZCBvbiB0aGUgY2FyZXQgcG9zaXRpb25cclxuICAgIC8vIEV4YW1wbGU6IFNhdmUgdGhlIGN1cnJlbnQgY2FyZXQgcG9zaXRpb24gZm9yIGZ1dHVyZSB1c2VcclxuICAgIHRoaXMuY3VycmVudENhcmV0UG9zaXRpb24gPSB7IG5vZGU6IHN0YXJ0Tm9kZSwgb2Zmc2V0OiBzdGFydE9mZnNldCB9O1xyXG4gIH1cclxuICB9XHJcbiAgXHJcbiAgLy8gTWV0aG9kIHRvIGdldCBjYXJldCBwb3NpdGlvbiBhbmQgaW5zZXJ0IG5ldyBkYXRhXHJcbnByaXZhdGUgaW5zZXJ0QXRDYXJldChuZXdEYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgXHJcbiAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgIC8vIEdldCB0aGUgY3VycmVudCByYW5nZSAoY2FyZXQgcG9zaXRpb24pXHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG5cclxuICAgIC8vIENyZWF0ZSBhIGRvY3VtZW50IGZyYWdtZW50IHRvIGluc2VydCAoYWxsb3dzIGhhbmRsaW5nIEhUTUwgc3RyaW5ncylcclxuICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG4gICAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgdGVtcERpdi5pbm5lckhUTUwgPSBuZXdEYXRhO1xyXG5cclxuICAgIC8vIEFwcGVuZCB0aGUgbmV3IGRhdGEgdG8gdGhlIGZyYWdtZW50IChzdXBwb3J0cyBIVE1MIGluc2VydGlvbilcclxuICAgIHdoaWxlICh0ZW1wRGl2LmZpcnN0Q2hpbGQpIHtcclxuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGVtcERpdi5maXJzdENoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJbnNlcnQgdGhlIGZyYWdtZW50IGF0IHRoZSBjYXJldCBwb3NpdGlvblxyXG4gICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTsgLy8gUmVtb3ZlIGFueSBzZWxlY3RlZCBjb250ZW50IGlmIGFwcGxpY2FibGVcclxuICAgIHJhbmdlLmluc2VydE5vZGUoZnJhZ21lbnQpO1xyXG5cclxuICAgIC8vIE1vdmUgdGhlIGNhcmV0IGFmdGVyIHRoZSBpbnNlcnRlZCBjb250ZW50XHJcbiAgICBjb25zdCBsYXN0Q2hpbGQgPSBmcmFnbWVudC5sYXN0Q2hpbGQ7XHJcblxyXG4gICAgaWYgKGxhc3RDaGlsZCkge1xyXG4gICAgICByYW5nZS5zZXRTdGFydEFmdGVyKGxhc3RDaGlsZCk7XHJcbiAgICAgIHJhbmdlLnNldEVuZEFmdGVyKGxhc3RDaGlsZCk7XHJcbiAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICAgIH1cclxuICAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIHRoaXMubW92ZUNhcmV0VG9FbmQoZWRpdG9yKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLnBsYWNlSG9sZGVyUmVtb3ZlLmVtaXQoKVxyXG4gIH1cclxufVxyXG5cclxuXHJcbi8vICAgLy8gTW92ZSBjYXJldCB0byB0aGUgZW5kIG9mIHRoZSBlZGl0b3IgY29udGVudFxyXG4vLyAgIHByaXZhdGUgbW92ZUNhcmV0VG9FbmQoZWRpdG9yOiBIVE1MRWxlbWVudCkge1xyXG4vLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4vLyAgICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xyXG4gICAgXHJcbi8vICAgICBpZiAoZWRpdG9yLmxhc3RDaGlsZCkge1xyXG4vLyAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcclxuLy8gICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOyAvLyBDb2xsYXBzZSB0byB0aGUgZW5kXHJcbi8vICAgICAgIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbi8vICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgICBcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbiAgXHJcbiAgXHJcblxyXG5cclxuICBpbml0X0Z1bmMoaHRtbDogYW55KSB7XHJcbiAgaWYgKGh0bWwpIHtcclxuICAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGVkaXRvciB3aXRoIHNhbml0aXplZCBjb250ZW50XHJcbiAgICAgIHRoaXMuc2V0RWRpdG9yQ29udGVudChodG1sKTtcclxuXHJcbiAgICAgIC8vIFNldCB1cCBhIE11dGF0aW9uT2JzZXJ2ZXIgdG8gaGFuZGxlIGNvbnRlbnQgY2hhbmdlc1xyXG4gICAgICB0aGlzLnNldHVwTXV0YXRpb25PYnNlcnZlcihlZGl0b3IpO1xyXG4gICAgICBcclxuICAgICAgLy8gTW92ZSB0aGUgY2FyZXQgdG8gdGhlIGVuZCBhZnRlciBpbml0aWFsIGNvbnRlbnQgc2V0dXBcclxuICAgICAgdGhpcy5tb3ZlQ2FyZXRUb0VuZChlZGl0b3IpO1xyXG4gICAgICAvLyAgVHJhY2sgY2FyZXQgcG9zaXRpb24gb24gbW91c2UgY2xpY2tcclxuICAgICAgZWRpdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xyXG4gICAgICAgIGlmIChlZGl0b3IpIHsgIC8vIEVuc3VyZSBlZGl0b3IgaXMgbm90IG51bGxcclxuICAgICAgICAgIHRoaXMudHJhY2tDYXJldFBvc2l0aW9uKGVkaXRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcblxyXG5wcml2YXRlIHNldEVkaXRvckNvbnRlbnQoaHRtbDogc3RyaW5nKSB7XHJcbiAgbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICBpZiAoZWRpdG9yKSB7XHJcbiAgICAvLyBTYW5pdGl6ZSBhbmQgYXBwbHkgc3R5bGVzIHRvIHRoZSBIVE1MXHJcbiAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmFwcGx5SW1hZ2VTdHlsZXMoaHRtbCkpO1xyXG4gICAgZWRpdG9yLmlubmVySFRNTCA9IHRoaXMuc2FuaXRpemVkQ29udGVudCBhcyBzdHJpbmc7XHJcbiAgfVxyXG59XHJcblxyXG5wcml2YXRlIHNldHVwTXV0YXRpb25PYnNlcnZlcihlZGl0b3I6IEhUTUxFbGVtZW50KSB7XHJcbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAvLyBNb3ZlIHRoZSBjYXJldCB0byB0aGUgZW5kIGFmdGVyIGNvbnRlbnQgY2hhbmdlc1xyXG4gICAgLy8gdGhpcy5tb3ZlQ2FyZXRUb0VuZChlZGl0b3IpO1xyXG4gICAgLy8gVXBkYXRlIG1vZGVsIHdpdGggdGhlIGN1cnJlbnQgY29udGVudFxyXG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGVkaXRvci5pbm5lckhUTUwpO1xyXG4gIH0pO1xyXG5cclxuICBvYnNlcnZlci5vYnNlcnZlKGVkaXRvciwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGNoYXJhY3RlckRhdGE6IHRydWUgfSk7XHJcbn1cclxuXHJcbnByaXZhdGUgbW92ZUNhcmV0VG9FbmQoZWRpdG9yOiBIVE1MRWxlbWVudCkge1xyXG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgXHJcbiAgaWYgKGVkaXRvci5sYXN0Q2hpbGQpIHtcclxuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpO1xyXG4gICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpOyAvLyBDb2xsYXBzZSB0byB0aGUgZW5kXHJcbiAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZSk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyAgIGluaXRfRnVuYyhodG1sOiBhbnkpIHtcclxuLy8gICBpZiAoaHRtbCkge1xyXG4vLyAgICAgbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuLy8gICAgIGlmIChlZGl0b3IpIHtcclxuLy8gICAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbi8vICAgICAgIGVkaXRvci5pbm5lckhUTUwgPSBodG1sO1xyXG5cclxuLy8gICAgICAgLy8gU2FuaXRpemUgdGhlIGNvbnRlbnQgYW5kIGFwcGx5IHN0eWxlc1xyXG4vLyAgICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmFwcGx5SW1hZ2VTdHlsZXMoaHRtbCkpO1xyXG4vLyAgICAgICBlZGl0b3IuaW5uZXJIVE1MID0gdGhpcy5zYW5pdGl6ZWRDb250ZW50IGFzIHN0cmluZztcclxuXHJcbi8vICAgICAgIC8vIFBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBjb250ZW50XHJcbi8vICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuLy8gICAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBcclxuLy8gICAgICAgaWYgKGVkaXRvci5sYXN0Q2hpbGQpIHtcclxuLy8gICAgICAgICAvLyBTZXQgdGhlIHJhbmdlIGF0IHRoZSBlbmQgb2YgdGhlIGVkaXRvcidzIGNvbnRlbnRcclxuLy8gICAgICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWRpdG9yKTtcclxuLy8gICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7IC8vIGNvbGxhcHNlIHRvIHRoZSBlbmRcclxuLy8gICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xyXG4vLyAgICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xyXG4vLyAgICAgICB9XHJcblxyXG4vLyAgICAgICBlZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XHJcbi8vICAgICAgICAgaWYgKGVkaXRvcikge1xyXG4vLyAgICAgICAgICAgdGhpcy5vbk1vZGVsQ2hhbmdlKGVkaXRvci5pbm5lckhUTUwpO1xyXG5cclxuLy8gICAgICAgICAgIC8vIEVuc3VyZSB0aGUgY2FyZXQgcmVtYWlucyBhdCB0aGUgZW5kIGFmdGVyIG5ldyBjb250ZW50IGlzIGFkZGVkXHJcbi8vICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbi8vICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICBcclxuLy8gICAgICAgICAgIGlmIChlZGl0b3IubGFzdENoaWxkKSB7XHJcbi8vICAgICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlZGl0b3IpO1xyXG4vLyAgICAgICAgICAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7IC8vIGNvbGxhcHNlIHRvIHRoZSBlbmRcclxuLy8gICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcclxuLy8gICAgICAgICAgICAgc2VsZWN0aW9uPy5hZGRSYW5nZShyYW5nZSk7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICB9KTtcclxuLy8gICAgIH1cclxuLy8gICB9IGVsc2Uge1xyXG4vLyAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gbnVsbDtcclxuLy8gICB9XHJcbi8vIH1cclxuXHJcbiAgLy8gZm9ybWF0KGNvbW1hbmQ6IHN0cmluZywgdmFsdWU/OiBhbnkpIHtcclxuICAvLyAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICAvLyAgIGlmIChlZGl0b3IpIHtcclxuICAvLyAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgLy8gICAgIGlmIChjb21tYW5kID09PSAnc3Vic2NyaXB0Jykge1xyXG4gIC8vICAgICAgIHRoaXMuaXNTdWJzY3JpcHRBY3RpdmUgPSAhdGhpcy5pc1N1YnNjcmlwdEFjdGl2ZTtcclxuICAvLyAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnc3Vic2NyaXB0JywgZmFsc2UsICcnKTtcclxuICAvLyAgICAgfSBlbHNlIGlmIChjb21tYW5kID09PSAnc3VwZXJzY3JpcHQnKSB7XHJcbiAgLy8gICAgICAgdGhpcy5pc1N1cGVyc2NyaXB0QWN0aXZlID0gIXRoaXMuaXNTdXBlcnNjcmlwdEFjdGl2ZTtcclxuICAvLyAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnc3VwZXJzY3JpcHQnLCBmYWxzZSwgJycpOztcclxuICAvLyAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgdmFsdWUgPz8gJycpO1xyXG4gIC8vICAgICAgIGlmICh2YWx1ZSkge1xyXG4gIC8vICAgICAgICAgY29uc3QgdGFnID0gdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bPD5dL2csICcnKVxyXG4gIC8vICAgICAgICAgdGhpcy5zZWxlY3RlZEZvcm1hdEJsb2NrID0gdGhpcy5mb3JtYXRCbG9ja0RlY29kZSh0YWcpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vICAgIHRoaXMuY2hlY2tBY3RpdmVTdGF0ZXMoKTtcclxuICAvLyAgICB0aGlzLmNoZWNrRm9ybWF0QmxvY2soKTtcclxuICAvLyB9XHJcblxyXG4gIGdldENsb3Nlc3RMaXN0SXRlbShub2RlOiBOb2RlKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcclxuICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IGRvY3VtZW50KSB7XHJcbiAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSBcIkxJXCIpIHtcclxuICAgICAgICByZXR1cm4gbm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgfVxyXG4gICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlITtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0IHRoZSBjdXJyZW50IG5lc3RpbmcgbGV2ZWwgb2YgYSBsaXN0IGl0ZW1cclxuICBnZXRMaXN0SXRlbUxldmVsKGxpc3RJdGVtOiBIVE1MRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICBsZXQgbGV2ZWwgPSAwO1xyXG4gICAgbGV0IHBhcmVudCA9IGxpc3RJdGVtLnBhcmVudEVsZW1lbnQ7XHJcblxyXG4gICAgd2hpbGUgKHBhcmVudCkge1xyXG4gICAgICBpZiAocGFyZW50Lm5vZGVOYW1lID09PSBcIlVMXCIgfHwgcGFyZW50Lm5vZGVOYW1lID09PSBcIk9MXCIpIHtcclxuICAgICAgICBsZXQgZ3JhbmRwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgICBpZiAoZ3JhbmRwYXJlbnQgJiYgZ3JhbmRwYXJlbnQubm9kZU5hbWUgPT09IFwiTElcIikge1xyXG4gICAgICAgICAgbGV2ZWwrKztcclxuICAgICAgICAgIHBhcmVudCA9IGdyYW5kcGFyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsZXZlbDtcclxuICB9XHJcblxyXG4gIC8vIEluY3JlYXNlIHRoZSBsaXN0IGxldmVsIChUYWIga2V5KVxyXG4gIGluY3JlYXNlTGlzdExldmVsKGxpc3RJdGVtOiBIVE1MRWxlbWVudCkge1xyXG4gICAgY29uc3QgY3VycmVudExldmVsID0gdGhpcy5nZXRMaXN0SXRlbUxldmVsKGxpc3RJdGVtKTtcclxuICAgIGlmIChjdXJyZW50TGV2ZWwgPj0gdGhpcy5saXN0U3R5bGVzLmxlbmd0aCAtIDEpIHJldHVybjtcclxuICAgIGNvbnN0IHBhcmVudExpc3QgPSBsaXN0SXRlbS5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3QgcHJldmlvdXNTaWJsaW5nID0gbGlzdEl0ZW0ucHJldmlvdXNFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmICghcGFyZW50TGlzdCB8fCAhcHJldmlvdXNTaWJsaW5nKSByZXR1cm47XHJcbiAgICBjb25zdCBpc09yZGVyZWRMaXN0ID0gcGFyZW50TGlzdC50YWdOYW1lID09PSBcIk9MXCI7XHJcbiAgICBsZXQgc3VibGlzdCA9IHByZXZpb3VzU2libGluZy5xdWVyeVNlbGVjdG9yKFwib2wsIHVsXCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCFzdWJsaXN0KSB7XHJcbiAgICAgIHN1Ymxpc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGlzT3JkZXJlZExpc3QgPyBcIm9sXCIgOiBcInVsXCIpO1xyXG4gICAgICBwcmV2aW91c1NpYmxpbmcuYXBwZW5kQ2hpbGQoc3VibGlzdCk7XHJcbiAgICB9XHJcbiAgICAvLyBBcHBseSBhcHByb3ByaWF0ZSBsaXN0IHN0eWxlc1xyXG4gICAgaWYgKGlzT3JkZXJlZExpc3QpIHtcclxuICAgICAgc3VibGlzdC5zdHlsZS5saXN0U3R5bGVUeXBlID0gdGhpcy5saXN0U3R5bGVzW2N1cnJlbnRMZXZlbCArIDFdOyAvLyBGb3IgT3JkZXJlZCBsaXN0IHN0eWxlc1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgdW5vcmRlcmVkU3R5bGVzID0gW1wiZGlzY1wiLCBcInNxdWFyZVwiLCBcImNpcmNsZVwiXTsgLy9Gb3IgVW5vcmRlcmVkIGxpc3Qgc3R5bGVzXHJcbiAgICAgIHN1Ymxpc3Quc3R5bGUubGlzdFN0eWxlVHlwZSA9XHJcbiAgICAgICAgdW5vcmRlcmVkU3R5bGVzW01hdGgubWluKGN1cnJlbnRMZXZlbCArIDEsIHVub3JkZXJlZFN0eWxlcy5sZW5ndGggLSAxKV07XHJcbiAgICB9XHJcblxyXG4gICAgc3VibGlzdC5hcHBlbmRDaGlsZChsaXN0SXRlbSk7XHJcblxyXG4gICAgaWYgKGlzT3JkZXJlZExpc3QpIHtcclxuICAgICAgbGlzdEl0ZW0uc3R5bGUubGlzdFN0eWxlVHlwZSA9IHRoaXMubGlzdFN0eWxlc1tjdXJyZW50TGV2ZWwgKyAxXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxpc3RJdGVtLnN0eWxlLmxpc3RTdHlsZVR5cGUgPSBzdWJsaXN0LnN0eWxlLmxpc3RTdHlsZVR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpITtcclxuICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhsaXN0SXRlbSk7XHJcbiAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XHJcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgLy8gRGVjcmVhc2UgdGhlIGxpc3QgbGV2ZWwgKFNoaWZ0K1RhYiBrZXkpXHJcbiAgZGVjcmVhc2VMaXN0TGV2ZWwobGlzdEl0ZW06IEhUTUxFbGVtZW50KSB7XHJcbiAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSB0aGlzLmdldExpc3RJdGVtTGV2ZWwobGlzdEl0ZW0pO1xyXG4gICAgaWYgKGN1cnJlbnRMZXZlbCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgcGFyZW50TGlzdCA9IGxpc3RJdGVtLnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBncmFuZHBhcmVudExpc3RJdGVtID0gcGFyZW50TGlzdD8ucGFyZW50RWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGlmIChcclxuICAgICAgIXBhcmVudExpc3QgfHxcclxuICAgICAgIWdyYW5kcGFyZW50TGlzdEl0ZW0gfHxcclxuICAgICAgZ3JhbmRwYXJlbnRMaXN0SXRlbS5ub2RlTmFtZSAhPT0gXCJMSVwiXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZ3JhbmRwYXJlbnRMaXN0ID0gZ3JhbmRwYXJlbnRMaXN0SXRlbS5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKFxyXG4gICAgICAhZ3JhbmRwYXJlbnRMaXN0IHx8XHJcbiAgICAgIChncmFuZHBhcmVudExpc3Qubm9kZU5hbWUgIT09IFwiVUxcIiAmJiBncmFuZHBhcmVudExpc3Qubm9kZU5hbWUgIT09IFwiT0xcIilcclxuICAgICkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBncmFuZHBhcmVudExpc3QuaW5zZXJ0QmVmb3JlKFxyXG4gICAgICBsaXN0SXRlbSxcclxuICAgICAgZ3JhbmRwYXJlbnRMaXN0SXRlbS5uZXh0RWxlbWVudFNpYmxpbmdcclxuICAgICk7XHJcbiAgICBpZiAoIXBhcmVudExpc3QucXVlcnlTZWxlY3RvcihcImxpXCIpKSB7XHJcbiAgICAgIGdyYW5kcGFyZW50TGlzdEl0ZW0ucmVtb3ZlQ2hpbGQocGFyZW50TGlzdCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBpc09yZGVyZWRMaXN0ID0gZ3JhbmRwYXJlbnRMaXN0Lm5vZGVOYW1lID09PSBcIk9MXCI7XHJcbiAgICBjb25zdCB1bm9yZGVyZWRTdHlsZXMgPSBbXCJkaXNjXCIsIFwic3F1YXJlXCIsIFwiY2lyY2xlXCJdO1xyXG4gICAgaWYgKGlzT3JkZXJlZExpc3QpIHtcclxuICAgICAgbGlzdEl0ZW0uc3R5bGUubGlzdFN0eWxlVHlwZSA9IHRoaXMubGlzdFN0eWxlc1tjdXJyZW50TGV2ZWwgLSAxXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxpc3RJdGVtLnN0eWxlLmxpc3RTdHlsZVR5cGUgPVxyXG4gICAgICAgIHVub3JkZXJlZFN0eWxlc1tNYXRoLm1pbihjdXJyZW50TGV2ZWwgLSAxLCB1bm9yZGVyZWRTdHlsZXMubGVuZ3RoIC0gMSldO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKSE7XHJcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobGlzdEl0ZW0pO1xyXG4gICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZSB0aGUgc3R5bGUgb2YgdGhlIGN1cnJlbnQgbGlzdCBpdGVtXHJcbiAgdXBkYXRlQ3VycmVudExpc3RJdGVtU3R5bGUoc3R5bGU6IHN0cmluZykge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgY29uc3QgbGlzdEl0ZW0gPSB0aGlzLmdldENsb3Nlc3RMaXN0SXRlbShyYW5nZS5zdGFydENvbnRhaW5lcik7XHJcbiAgICBjb25zb2xlLmxvZyhcImxpc3RpdGVtXCIsIGxpc3RJdGVtKTtcclxuXHJcbiAgICBpZiAobGlzdEl0ZW0pIHtcclxuICAgICAgbGV0IHBhcmVudExpc3QgPSBsaXN0SXRlbS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgcGFyZW50TGlzdCAmJlxyXG4gICAgICAgIChwYXJlbnRMaXN0Lm5vZGVOYW1lID09PSBcIk9MXCIgfHwgcGFyZW50TGlzdC5ub2RlTmFtZSA9PT0gXCJVTFwiKVxyXG4gICAgICApIHtcclxuICAgICAgICAocGFyZW50TGlzdCBhcyBIVE1MRWxlbWVudCkuc3R5bGUubGlzdFN0eWxlVHlwZSA9IHN0eWxlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb3JtYXQoY29tbWFuZDogc3RyaW5nLCB2YWx1ZT86IGFueSkge1xyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlZGl0b3JcIik7XHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvci5mb2N1cygpO1xyXG4gICAgICBpZiAoY29tbWFuZCA9PT0gXCJzdWJzY3JpcHRcIikge1xyXG4gICAgICAgIHRoaXMuaXNTdWJzY3JpcHRBY3RpdmUgPSAhdGhpcy5pc1N1YnNjcmlwdEFjdGl2ZTtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcInN1YnNjcmlwdFwiLCBmYWxzZSwgXCJcIik7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PT0gXCJzdXBlcnNjcmlwdFwiKSB7XHJcbiAgICAgICAgdGhpcy5pc1N1cGVyc2NyaXB0QWN0aXZlID0gIXRoaXMuaXNTdXBlcnNjcmlwdEFjdGl2ZTtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcInN1cGVyc2NyaXB0XCIsIGZhbHNlLCBcIlwiKTtcclxuICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09PSBcImluc2VydE9yZGVyZWRMaXN0XCIpIHtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChjb21tYW5kLCBmYWxzZSwgXCJcIik7XHJcbiAgICAgICAgLy8gQXBwbHkgdGhlIGFwcHJvcHJpYXRlIHN0eWxlIGZvciB0aGUgY3VycmVudCBsZXZlbFxyXG4gICAgICAgIHRoaXMudXBkYXRlQ3VycmVudExpc3RJdGVtU3R5bGUodGhpcy5saXN0U3R5bGVzW3RoaXMuY3VycmVudExpc3RMZXZlbF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCB2YWx1ZSA/PyBcIlwiKTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgIGNvbnN0IHRhZyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWzw+XS9nLCBcIlwiKTtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb3JtYXRCbG9jayA9IHRoaXMuZm9ybWF0QmxvY2tEZWNvZGUodGFnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY2hlY2tBY3RpdmVTdGF0ZXMoKTtcclxuICAgIHRoaXMuY2hlY2tGb3JtYXRCbG9jaygpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tBY3RpdmVTdGF0ZXMoKSB7XHJcbiAgICB0aGlzLmlzQm9sZEFjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCdib2xkJyk7XHJcbiAgICB0aGlzLmlzSXRhbGljQWN0aXZlID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpO1xyXG4gICAgdGhpcy5pc1VuZGVybGluZUFjdGl2ZSA9IGRvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKCd1bmRlcmxpbmUnKTtcclxuICAgIHRoaXMuaXNTdHJpa2V0aHJvdWdoQWN0aXZlID0gZG9jdW1lbnQucXVlcnlDb21tYW5kU3RhdGUoJ3N0cmlrZXRocm91Z2gnKTtcclxuICAgIHRoaXMuaXNTdWJzY3JpcHRBY3RpdmUgPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnc3Vic2NyaXB0Jyk7XHJcbiAgICB0aGlzLmlzU3VwZXJzY3JpcHRBY3RpdmUgPSBkb2N1bWVudC5xdWVyeUNvbW1hbmRTdGF0ZSgnc3VwZXJzY3JpcHQnKTtcclxuICB9XHJcblxyXG4gIGNoZWNrRm9ybWF0QmxvY2soKSB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1hdEJsb2NrID0gZG9jdW1lbnQucXVlcnlDb21tYW5kVmFsdWUoJ2Zvcm1hdEJsb2NrJyk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGb3JtYXRCbG9jayA9IHRoaXMuZm9ybWF0QmxvY2tEZWNvZGUoZm9ybWF0QmxvY2spO1xyXG4gICAgICAvLyBZb3UgY2FuIGZ1cnRoZXIgaGFuZGxlIHRoZSBmb3JtYXRCbG9jayB2YWx1ZSBhcyBuZWVkZWRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZvcm1hdEJsb2NrRGVjb2RlKGRhdGE6IHN0cmluZyk6IGFueSB7XHJcbiAgICBzd2l0Y2ggKGRhdGEpIHtcclxuICAgICAgY2FzZSAnaDEnOlxyXG4gICAgICAgIHJldHVybiAnaGVhZGluZyAxJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnaDInOlxyXG4gICAgICAgIHJldHVybiAnaGVhZGluZyAyJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnaDMnOlxyXG4gICAgICAgIHJldHVybiAnaGVhZGluZyAzJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnaDQnOlxyXG4gICAgICAgIHJldHVybiAnaGVhZGluZyA0JztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnaDUnOlxyXG4gICAgICAgIHJldHVybiAnaGVhZGluZyA1JztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnaDYnOlxyXG4gICAgICAgIHJldHVybiAnaGVhZGluZyA2JztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncCc6XHJcbiAgICAgICAgcmV0dXJuICdub3JtYWwnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnbm9ybWFsJztcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoYW5nZUZvbnQoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEZvbnQgPSBldmVudDtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdmb250TmFtZScsIGZhbHNlLCB0aGlzLnNlbGVjdGVkRm9udCk7XHJcbiAgfVxyXG5cclxuICBpbnNlcnRDb2RlQmxvY2soKSB7XHJcbiAgICBjb25zdCBjb2RlID0gYFxyXG4gICAgICA8cHJlIHN0eWxlPVwiZm9udC1zaXplOiAxMnB4O1xyXG4gICAgICAgICAgICAgICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IGJsYWNrO1xyXG4gICAgICAgICAgICAgICAgICBvdmVyZmxvdy14OiBhdXRvO1xyXG4gICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7XHJcbiAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6IDVweDtcclxuICAgICAgICAgICAgICAgICAgcGFkZGluZzogNXB4IDEwcHg7XCI+XHJcbiAgICAgICAgPGNvZGUgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcclxuICAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xyXG4gICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgICAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XCIgY2xhc3M9XCJsYW5ndWFnZS1odG1sXCI+SW5zZXJ0IGNvZGUgaGVyZS4uLjwvY29kZT5cclxuICAgICAgPC9wcmU+XHJcbiAgICBgO1xyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2luc2VydEhUTUwnLCBmYWxzZSwgY29kZSk7XHJcbiAgfVxyXG5cclxuICAvLyBjaGFuZ2VGb250U2l6ZShldmVudDogYW55KSB7XHJcbiAgLy8gICBkb2N1bWVudC5leGVjQ29tbWFuZCgnZm9udFNpemUnLCBmYWxzZSwgJzcnKTtcclxuICAvLyAgIGxldCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgLy8gICBpZiAoZWRpdG9yKSB7XHJcbiAgLy8gICAgIGxldCBmb250RWxlbWVudHMgPSBlZGl0b3IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ZvbnQnKTtcclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb250RWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBpZiAoZm9udEVsZW1lbnRzW2ldLnNpemUgPT0gXCI3XCIpIHtcclxuICAvLyAgICAgICAgIGZvbnRFbGVtZW50c1tpXS5yZW1vdmVBdHRyaWJ1dGUoXCJzaXplXCIpO1xyXG4gIC8vICAgICAgICAgZm9udEVsZW1lbnRzW2ldLnN0eWxlLmZvbnRTaXplID0gdGhpcy5zZWxlY3RlZEZvbnRTaXplICsgJ3B4JztcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcbiAgY2hhbmdlRm9udFNpemUoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgXHJcbiAgICBpZiAoc2VsZWN0ZWRUZXh0ICYmIHNlbGVjdGVkVGV4dC5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0ZWRUZXh0LmdldFJhbmdlQXQoMCk7XHJcbiAgICAgICAgY29uc3Qgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcclxuICAgICAgICBzcGFuLnN0eWxlLmZvbnRTaXplID0gdGhpcy5zZWxlY3RlZEZvbnRTaXplICsgJ3B4JztcclxuICAgICAgICByYW5nZS5zdXJyb3VuZENvbnRlbnRzKHNwYW4pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkTGluaygpIHtcclxuICAgIGxldCB1cmwgPSBwcm9tcHQoXCJFbnRlciB0aGUgbGluayBoZXJlOiBcIiwgXCJodHRwOi8vXCIpO1xyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImNyZWF0ZUxpbmtcIiwgZmFsc2UsIHVybCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnNlcnRzSW1hZ2UoKSB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvci5mb2N1cygpO1xyXG4gICAgICBsZXQgaW1hZ2VJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbWFnZUlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgaWYgKGltYWdlSW5wdXQpIHtcclxuICAgICAgICBpbWFnZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGhhbmRsZUltYWdlVXBsb2FkKGV2ZW50OiBhbnkpIHtcclxuICAvLyAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XHJcbiAgLy8gICBpZiAoZmlsZSkge1xyXG4gIC8vICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gIC8vICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gIC8vICAgICAgIGltZy5zcmMgPSBlLnRhcmdldC5yZXN1bHQ7XHJcbiAgLy8gICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAvLyAgICAgICAgIC8vIENyZWF0ZSB0aGUgSFRNTCBzdHJpbmcgd2l0aCB0aGUgZXhhY3Qgd2lkdGggYW5kIGhlaWdodFxyXG4gIC8vICAgICAgICAgY29uc3QgaW1nSFRNTCA9IGA8aW1nIHNyYz1cIiR7aW1nLnNyY31cIiB3aWR0aD1cIiR7Nzk0fVwiID5gO1xyXG4gIC8vICAgICAgICAgLy8gSW5zZXJ0IHRoZSBpbWFnZSBpbnRvIHRoZSBlZGl0b3JcclxuICAvLyAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIGltZ0hUTUwpO1xyXG4gIC8vICAgICAgIH07XHJcbiAgLy8gICAgIH07XHJcbiAgLy8gICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgaGFuZGxlSW1hZ2VVcGxvYWQoZXZlbnQ6IGFueSkge1xyXG4gIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XHJcbiAgY29uc3QgZWRpdG9yRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTsgLy8gUmVmZXJlbmNlIHRvIHRoZSBlZGl0b3JcclxuXHJcbiAgaWYgKGZpbGUgJiYgZWRpdG9yRWxlbWVudCkge1xyXG4gICAgY29uc3QgZWRpdG9yV2lkdGggPSBlZGl0b3JFbGVtZW50Lm9mZnNldFdpZHRoOyAvLyBHZXQgdGhlIGVkaXRvcidzIHdpZHRoXHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWcuc3JjID0gZS50YXJnZXQucmVzdWx0O1xyXG5cclxuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBpbWdXaWR0aCA9IGltZy53aWR0aDtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGltYWdlIHdpZHRoIGV4Y2VlZHMgdGhlIGVkaXRvcidzIHdpZHRoLCBmaXQgaXQgdG8gdGhlIGVkaXRvclxyXG4gICAgICAgIGNvbnN0IGltZ0hUTUwgPVxyXG4gICAgICAgICAgaW1nV2lkdGggPiBlZGl0b3JXaWR0aFxyXG4gICAgICAgICAgICA/IGA8aW1nIHNyYz1cIiR7aW1nLnNyY31cIiBzdHlsZT1cIiBtYXgtd2lkdGg6ICR7NzAwfXB4OyBoZWlnaHQ6IGF1dG87XCI+YFxyXG4gICAgICAgICAgICA6IGA8aW1nIHNyYz1cIiR7aW1nLnNyY31cIiBzdHlsZT1cIndpZHRoOiAke2ltZ1dpZHRofXB4OyBoZWlnaHQ6IGF1dG87XCI+YDtcclxuICAgICAgICB0aGlzLm5ld0ltYWdlQWRkZWQuZW1pdCgpXHJcbiAgICAgICAgLy8gSW5zZXJ0IHRoZSBpbWFnZSBpbnRvIHRoZSBlZGl0b3JcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCBpbWdIVE1MKTtcclxuICAgICAgfTtcclxuICAgIH07XHJcblxyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuXHJcbiAgLy8gYWRkVGFibGUoKSB7XHJcbiAgLy8gICBjb25zdCB0YWJsZVdpZHRoID0gODI1OyAvLyBUYWJsZSB3aWR0aCBpbiBwaXhlbHNcclxuICAvLyAgIGNvbnN0IGNvbHMgPSAzOyAvLyBOdW1iZXIgb2YgY29sdW1uc1xyXG4gIC8vICAgY29uc3QgY2VsbE1pbldpZHRoID0gdGFibGVXaWR0aCAvIGNvbHM7IC8vIENhbGN1bGF0ZSBtaW5pbXVtIHdpZHRoIGZvciBlYWNoIGNlbGxcclxuXHJcbiAgLy8gICBsZXQgdGFibGUgPSBgPGJyIC8+PHRhYmxlIHN0eWxlPVwid2lkdGg6ICR7dGFibGVXaWR0aH1weDtcIj5gO1xyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHsgLy8gTnVtYmVyIG9mIHJvd3NcclxuICAvLyAgICAgdGFibGUgKz0gJzx0ciA+JztcclxuICAvLyAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHtcclxuICAvLyAgICAgICB0YWJsZSArPSBgPHRkIHN0eWxlPVwiIHdvcmQtd3JhcDogYnJlYWstd29yZDsgd29yZC1icmVhazogYnJlYWstYWxsOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBtaW4td2lkdGg6ICR7Y2VsbE1pbldpZHRofXB4O1wiPiZuYnNwOzwvdGQ+YDtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICB0YWJsZSArPSAnPC90cj4nO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgICB0YWJsZSArPSAnPC90YWJsZT48YnIvID4nO1xyXG4gIC8vICAgICAvLyBkb2N1bWVudC5leGVjQ29tbWFuZCgnaW5zZXJ0SFRNTCcsIGZhbHNlLCB0YWJsZSk7XHJcbiAgLy8gICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICAvLyAgIGlmIChlZGl0b3IpIHtcclxuICAvLyAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgLy8gICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIHRhYmxlKTtcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMudGFibGVBZGRlZCA9IHRydWU7XHJcbiAgLy8gICB0aGlzLmNoZWNrVGFibGVTZWxlY3Rpb24oKTtcclxuICAvLyB9XHJcblxyXG5cclxuICAvLyBoYW5kbGVUYWJLZXkoZXZlbnQ6IGFueSkge1xyXG4gIC8vICAgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIikge1xyXG4gIC8vICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBTdG9wIGRlZmF1bHQgdGFiYmluZyBiZWhhdmlvclxyXG4gIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgLy8gICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcblxyXG4gIC8vICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gIC8vICAgICBjb25zdCB0YWJOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7IC8vIENyZWF0ZSBhIHNwYW4gZWxlbWVudCBmb3IgdGhlIHRhYiBzcGFjZVxyXG4gIC8vICAgICB0YWJOb2RlLmlubmVySFRNTCA9IFwiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7XCI7IC8vIEZvdXIgbm9uLWJyZWFraW5nIHNwYWNlcyB0byBtaW1pYyB0YWJcclxuICAgICAgXHJcbiAgLy8gICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7IC8vIFJlbW92ZSBhbnkgc2VsZWN0ZWQgdGV4dFxyXG4gIC8vICAgICByYW5nZS5pbnNlcnROb2RlKHRhYk5vZGUpOyAvLyBJbnNlcnQgdGhlIHRhYiBzcGFjZSBhcyBzcGFuXHJcbiAgLy8gICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIodGFiTm9kZSk7IC8vIE1vdmUgY3Vyc29yIGFmdGVyIHRoZSBpbnNlcnRlZCBzcGFuXHJcbiAgLy8gICAgIHJhbmdlLnNldEVuZEFmdGVyKHRhYk5vZGUpO1xyXG4gIC8vICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgLy8gICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBoYW5kbGVUYWJLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09IFwiVGFiXCIpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gUHJldmVudCBkZWZhdWx0IHRhYiBiZWhhdmlvclxyXG5cclxuICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJlZGl0b3JcIik7XHJcbiAgICAgIGlmICghZWRpdG9yKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xyXG4gICAgICBjb25zdCBsaXN0SXRlbSA9IHRoaXMuZ2V0Q2xvc2VzdExpc3RJdGVtKHJhbmdlLnN0YXJ0Q29udGFpbmVyKTtcclxuXHJcbiAgICAgIGlmIChsaXN0SXRlbSkge1xyXG4gICAgICAgIC8vIElmIGluc2lkZSBhIGxpc3QgaXRlbSwgaGFuZGxlIG11bHRpLWxldmVsIGxpc3QgaW5kZW50YXRpb25cclxuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgICAgIHRoaXMuZGVjcmVhc2VMaXN0TGV2ZWwobGlzdEl0ZW0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmluY3JlYXNlTGlzdExldmVsKGxpc3RJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gSWYgb3V0c2lkZSBhIGxpc3QgaXRlbSwgaW5zZXJ0IGEgdGFiIHNwYWNlXHJcbiAgICAgICAgY29uc3QgdGFiTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xyXG4gICAgICAgIHRhYk5vZGUuaW5uZXJIVE1MID0gXCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcIjtcclxuXHJcbiAgICAgICAgcmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcclxuICAgICAgICByYW5nZS5pbnNlcnROb2RlKHRhYk5vZGUpO1xyXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIodGFiTm9kZSk7XHJcbiAgICAgICAgcmFuZ2Uuc2V0RW5kQWZ0ZXIodGFiTm9kZSk7XHJcbiAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xyXG4gICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbi8vICAgYWRkVGFibGUoKSB7XHJcbi8vICAgY29uc3QgdGFibGVXaWR0aCA9IDgyNTsgLy8gVGFibGUgd2lkdGggaW4gcGl4ZWxzXHJcbi8vICAgY29uc3QgY29scyA9IDM7IC8vIE51bWJlciBvZiBjb2x1bW5zXHJcbi8vICAgY29uc3QgY2VsbE1pbldpZHRoID0gdGFibGVXaWR0aCAvIGNvbHM7IC8vIENhbGN1bGF0ZSBtaW5pbXVtIHdpZHRoIGZvciBlYWNoIGNlbGxcclxuXHJcbi8vICAgbGV0IHRhYmxlID0gYDxiciAvPjx0YWJsZSBzdHlsZT1cIndpZHRoOiAke3RhYmxlV2lkdGh9cHg7XCI+YDtcclxuLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykgeyAvLyBOdW1iZXIgb2Ygcm93c1xyXG4vLyAgICAgdGFibGUgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206ICR7dGhpcy50aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVGb3JUYWJsZSgpfVwiPmA7IC8vIEFkZCBib3JkZXItYm90dG9tIHRvIHRoZSByb3dcclxuLy8gICAgIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrKSB7XHJcbi8vICAgICAgIHRhYmxlICs9IGA8dGQgc3R5bGU9XCJ3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgbWluLXdpZHRoOiAke2NlbGxNaW5XaWR0aH1weDtcIj4mbmJzcDs8L3RkPmA7XHJcbi8vICAgICB9XHJcbi8vICAgICB0YWJsZSArPSAnPC90cj4nO1xyXG4vLyAgIH1cclxuLy8gICB0YWJsZSArPSAnPC90YWJsZT48YnIvPic7XHJcblxyXG4vLyAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuLy8gICBpZiAoZWRpdG9yKSB7XHJcbi8vICAgICBlZGl0b3IuZm9jdXMoKTtcclxuLy8gICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdpbnNlcnRIVE1MJywgZmFsc2UsIHRhYmxlKTtcclxuLy8gICB9XHJcblxyXG4vLyAgIHRoaXMudGFibGVBZGRlZCA9IHRydWU7XHJcbi8vICAgdGhpcy5jaGVja1RhYmxlU2VsZWN0aW9uKCk7XHJcbi8vIH1cclxuLy8gYWRkVGFibGUoKSB7XHJcbi8vICAgY29uc3QgdGFibGVXaWR0aCA9IDgyNTtcclxuLy8gICBjb25zdCBjb2xzID0gMztcclxuLy8gICBjb25zdCBjZWxsTWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29scztcclxuXHJcbi8vICAgbGV0IHRhYmxlID0gYDxiciAvPjx0YWJsZSBpZD1cImN1c3RvbVRhYmxlXCIgc3R5bGU9XCJ3aWR0aDogJHt0YWJsZVdpZHRofXB4OyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1wiPmA7XHJcblxyXG4vLyAgIHRhYmxlICs9IGA8dGJvZHk+YDtcclxuLy8gICB0YWJsZSArPSBgPHRyIGlkPVwidGFibGVIZWFkZXJSb3dcIiBzdHlsZT1cImJvcmRlci1ib3R0b206ICR7dGhpcy50aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVGb3JUYWJsZSgpfTtcIiAoY2xpY2spPVwiY2hlY2tUYWJsZVNlbGVjdGlvbigpXCI+YDtcclxuLy8gICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKykge1xyXG4vLyAgICAgdGFibGUgKz0gYDx0ZCBjbGFzcz1cImhlYWRlci1jZWxsXCIgXHJcbi8vICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItdG9wOiAycHggc29saWQgYmxhY2s7IFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICBmb250LXdlaWdodDogYm9sZDsgXHJcbi8vICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IHN0YXJ0OyBcclxuLy8gICAgICAgICAgICAgICAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOyBcclxuLy8gICAgICAgICAgICAgICAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyBcclxuLy8gICAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsgXHJcbi8vICAgICAgICAgICAgICAgICAgICAgIG1pbi13aWR0aDogJHtjZWxsTWluV2lkdGh9cHg7IFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0ICFpbXBvcnRhbnQ7IFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIC8vICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcclxuLy8gaGVpZ2h0OjI4cHg7XCI+PC90ZD5gO1xyXG4vLyAgIH1cclxuLy8gICB0YWJsZSArPSBgPC90cj5gO1xyXG5cclxuLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xyXG4vLyAgICAgdGFibGUgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206ICR7dGhpcy50aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVGb3JUYWJsZSgpfVwiPmA7XHJcbi8vICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHM7IGorKykge1xyXG4vLyAgICAgICB0YWJsZSArPSBgPHRkIHN0eWxlPVwid29yZC13cmFwOiBicmVhay13b3JkOyBcclxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyBcclxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsgXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi13aWR0aDogJHtjZWxsTWluV2lkdGh9cHg7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwgIWltcG9ydGFudDtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1wiPiZuYnNwOzwvdGQ+YDtcclxuLy8gICAgIH1cclxuLy8gICAgIHRhYmxlICs9IFwiPC90cj5cIjtcclxuLy8gICB9XHJcbi8vICAgdGFibGUgKz0gYDwvdGJvZHk+PC90YWJsZT48YnIvPmA7XHJcblxyXG4vLyAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZWRpdG9yXCIpO1xyXG4vLyAgIGlmIChlZGl0b3IpIHtcclxuLy8gICAgIGVkaXRvci5mb2N1cygpO1xyXG4vLyAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbnNlcnRIVE1MXCIsIGZhbHNlLCB0YWJsZSk7XHJcbi8vICAgfVxyXG5cclxuLy8gICB0aGlzLnRhYmxlQWRkZWQgPSB0cnVlO1xyXG4vLyAgIHRoaXMuY2hlY2tUYWJsZVNlbGVjdGlvbigpO1xyXG5cclxuLy8gICAvLyBBZGQgc3R5bGVzIHRvIHByZXZlbnQgdGFibGUgc3RydWN0dXJlIGJyZWFraW5nXHJcbi8vICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XHJcbi8vICAgc3R5bGUuaW5uZXJIVE1MID0gYFxyXG4vLyAgICNjdXN0b21UYWJsZSB7XHJcbi8vICAgICB0YWJsZS1sYXlvdXQ6IGZpeGVkICFpbXBvcnRhbnQ7XHJcbi8vICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlICFpbXBvcnRhbnQ7XHJcbi8vICAgfVxyXG4vLyAgICNjdXN0b21UYWJsZSB0ciB7XHJcbi8vICAgICBkaXNwbGF5OiB0YWJsZS1yb3cgIWltcG9ydGFudDtcclxuLy8gICB9XHJcbi8vICAgI2N1c3RvbVRhYmxlIHRkIHtcclxuLy8gICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwgIWltcG9ydGFudDtcclxuLy8gICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcclxuLy8gICB9XHJcbi8vICAgI2N1c3RvbVRhYmxlIC5oZWFkZXItY2VsbCB7XHJcbi8vICAgICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XHJcbi8vICAgfVxyXG4vLyAgICNjdXN0b21UYWJsZSAuaGVhZGVyLWNlbGwgPiBzcGFuIHtcclxuLy8gICAgIGRpc3BsYXk6IGlubGluZSAhaW1wb3J0YW50O1xyXG4vLyAgICAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xyXG4vLyAgIH1cclxuLy8gICAjY3VzdG9tVGFibGUgLmhlYWRlci1jZWxsOmhvdmVyIHtcclxuLy8gICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xyXG4vLyAgIH1cclxuLy8gYDtcclxuLy8gICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcclxuLy8gfVxyXG5cclxuYWRkVGFibGUoKSB7XHJcbiAgY29uc3QgdGFibGVXaWR0aCA9IDgyNTtcclxuICBjb25zdCBjb2xzID0gMztcclxuICBjb25zdCBjZWxsTWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29scztcclxuXHJcbiAgbGV0IHRhYmxlID0gYDxiciAvPjx0YWJsZSBpZD1cImN1c3RvbVRhYmxlXCIgc3R5bGU9XCJ3aWR0aDogJHt0YWJsZVdpZHRofXB4OyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1wiPmA7XHJcbiAgdGFibGUgKz0gYDx0Ym9keT5gO1xyXG5cclxuICAvLyBUYWJsZSBIZWFkZXIgUm93XHJcbiAgdGFibGUgKz0gYDx0ciBpZD1cInRhYmxlSGVhZGVyUm93XCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAke3RoaXMudGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lRm9yVGFibGUoKX07XCIgb25jbGljaz1cImNoZWNrVGFibGVTZWxlY3Rpb24oKVwiPmA7XHJcblxyXG4gIGZvciAobGV0IGogPSAwOyBqIDwgY29sczsgaisrKSB7XHJcbiAgICB0YWJsZSArPSBgPHRkIGNsYXNzPVwiaGVhZGVyLWNlbGxcIiBcclxuICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci10b3A6IDJweCBzb2xpZCBibGFjazsgXHJcbiAgICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOyBcclxuICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogc3RhcnQ7IFxyXG4gICAgICAgICAgICAgICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IFxyXG4gICAgICAgICAgICAgICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7IFxyXG4gICAgICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOyBcclxuICAgICAgICAgICAgICAgICAgICAgbWluLXdpZHRoOiAke2NlbGxNaW5XaWR0aH1weDsgXHJcbiAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQgIWltcG9ydGFudDsgXHJcbiAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGwgIWltcG9ydGFudDtcclxuICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xyXG4gICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6MjhweDtcIj48L3RkPmA7XHJcbiAgfVxyXG5cclxuICAvLyBQcm9wZXJseSBjbG9zaW5nIHRoZSBoZWFkZXIgcm93XHJcbiAgdGFibGUgKz0gYDwvdHI+YDtcclxuXHJcbiAgLy8gRGF0YSBSb3dzXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcclxuICAgIHRhYmxlICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAke3RoaXMudGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lRm9yVGFibGUoKX1cIj5gO1xyXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb2xzOyBqKyspIHtcclxuICAgICAgdGFibGUgKz0gYDx0ZCBzdHlsZT1cIndvcmQtd3JhcDogYnJlYWstd29yZDsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW4td2lkdGg6ICR7Y2VsbE1pbldpZHRofXB4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcIj4mbmJzcDs8L3RkPmA7XHJcbiAgICB9XHJcbiAgICB0YWJsZSArPSBgPC90cj5gO1xyXG4gIH1cclxuXHJcbiAgdGFibGUgKz0gYDwvdGJvZHk+PC90YWJsZT48YnIvPmA7XHJcblxyXG4gIC8vIEluc2VydGluZyBpbnRvIHRoZSBlZGl0b3JcclxuICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVkaXRvclwiKTtcclxuICBpZiAoZWRpdG9yKSB7XHJcbiAgICBlZGl0b3IuZm9jdXMoKTtcclxuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5zZXJ0SFRNTFwiLCBmYWxzZSwgdGFibGUpO1xyXG4gIH1cclxuXHJcbiAgdGhpcy50YWJsZUFkZGVkID0gdHJ1ZTtcclxuICB0aGlzLmNoZWNrVGFibGVTZWxlY3Rpb24oKTtcclxuXHJcbiAgLy8gQWRkIHN0eWxlcyB0byBwcmV2ZW50IHRhYmxlIHN0cnVjdHVyZSBicmVha2luZ1xyXG4gIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xyXG4gIHN0eWxlLmlubmVySFRNTCA9IGBcclxuICAjY3VzdG9tVGFibGUge1xyXG4gICAgdGFibGUtbGF5b3V0OiBmaXhlZCAhaW1wb3J0YW50O1xyXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZSAhaW1wb3J0YW50O1xyXG4gIH1cclxuICAjY3VzdG9tVGFibGUgdHIge1xyXG4gICAgZGlzcGxheTogdGFibGUtcm93ICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG4gICNjdXN0b21UYWJsZSB0ZCB7XHJcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsICFpbXBvcnRhbnQ7XHJcbiAgICBwb3NpdGlvbjogc3RhdGljICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG4gICNjdXN0b21UYWJsZSAuaGVhZGVyLWNlbGwge1xyXG4gICAgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50O1xyXG4gIH1cclxuICAjY3VzdG9tVGFibGUgLmhlYWRlci1jZWxsID4gc3BhbiB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUgIWltcG9ydGFudDtcclxuICAgIHBvc2l0aW9uOiBzdGF0aWMgIWltcG9ydGFudDtcclxuICB9XHJcbiAgI2N1c3RvbVRhYmxlIC5oZWFkZXItY2VsbDpob3ZlciB7XHJcbiAgICBjdXJzb3I6IGRlZmF1bHQgIWltcG9ydGFudDtcclxuICB9XHJcbmA7XHJcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XHJcbn1cclxuXHJcblxyXG4vLyBGdW5jdGlvbiB0byBjaGFuZ2UgdGhlIGZpcnN0IHJvdyAodGhlYWQpIGJhY2tncm91bmQgY29sb3Jcclxuc2V0VGhlYWRCZ0NvbG9yKGV2ZW50OiBhbnkpIHtcclxuICBjb25zdCBzZWxlY3RlZENvbG9yID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG5cclxuICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XHJcbiAgICBjb25zdCBoZWFkZXJSb3cgPSB0aGlzLnNlbGVjdGVkVGFibGUucXVlcnlTZWxlY3RvcihcInRyXCIpIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGlmIChoZWFkZXJSb3cpIHtcclxuICAgICAgY29uc3QgaGVhZGVyQ2VsbHMgPSBoZWFkZXJSb3cucXVlcnlTZWxlY3RvckFsbChcIi5oZWFkZXItY2VsbFwiKTtcclxuICAgICAgaGVhZGVyQ2VsbHMuZm9yRWFjaCgoY2VsbDogRWxlbWVudCkgPT4ge1xyXG4gICAgICAgIChjZWxsIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBzZWxlY3RlZENvbG9yO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcblxyXG5cclxuICBjaGVja1RhYmxlU2VsZWN0aW9uKGV2ZW50PzogTW91c2VFdmVudCkge1xyXG4gICAgbGV0IHRhcmdldCA9IGV2ZW50Py50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAodGFyZ2V0ICYmICh0YXJnZXQudGFnTmFtZSA9PT0gJ1REJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RIJykpIHtcclxuICAgICAgdGhpcy5pc1RhYmxlU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFibGUgPSB0YXJnZXQuY2xvc2VzdCgndGFibGUnKSBhcyBIVE1MVGFibGVFbGVtZW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc1RhYmxlU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlID0gbnVsbDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gdGhpcy5jaGVja1BsYWNlaG9sZGVyKCk7XHJcbiAgfVxyXG5cclxuICBjaGVja1BsYWNlaG9sZGVyKCkge1xyXG4gICAgLy8gbGV0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICAgIC8vIGlmIChlZGl0b3IpIHtcclxuICAgIC8vICAgdGhpcy5pc1BsYWNlaG9sZGVyVmlzaWJsZSA9IGVkaXRvci5pbm5lckhUTUwgPT09ICcnIHx8IGVkaXRvci5pbm5lckhUTUwgPT09ICc8YnI+JztcclxuICAgIC8vICAgaWYgKHRoaXMuaXNQbGFjZWhvbGRlclZpc2libGUpIHtcclxuICAgIC8vICAgICAvLyBlZGl0b3IuaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPVwicGxhY2Vob2xkZXJcIiBzdHlsZT1cImJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogIzAwMDAwMFwiPkluc2VydCB0ZXh0IGhlcmUgLi4uPC9zcGFuPic7XHJcbiAgICAvLyAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgbGV0IHBsYWNlaG9sZGVyID0gZWRpdG9yLnF1ZXJ5U2VsZWN0b3IoJy5wbGFjZWhvbGRlcicpO1xyXG4gICAgLy8gICAgIGlmIChwbGFjZWhvbGRlcikge1xyXG4gICAgLy8gICAgICAgZWRpdG9yLnJlbW92ZUNoaWxkKHBsYWNlaG9sZGVyKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIG9uRm9jdXMoKSB7XHJcbiAgICAvLyBsZXQgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gICAgLy8gaWYgKGVkaXRvciAmJiB0aGlzLmlzUGxhY2Vob2xkZXJWaXNpYmxlKSB7XHJcbiAgICAvLyAgIGVkaXRvci5pbm5lckhUTUwgPSAnJztcclxuICAgIC8vICAgdGhpcy5pc1BsYWNlaG9sZGVyVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgLy8gY29sb3JDaGFuZ2UobmV3Q29sb3I6IHN0cmluZykge1xyXG4gIC8vICAgdGhpcy5jb2xvciA9IG5ld0NvbG9yO1xyXG4gIC8vIH1cclxuXHJcbiAgb25CbHVyKCkge1xyXG4gICAgdGhpcy5jaGVja1BsYWNlaG9sZGVyKCk7XHJcbiAgfVxyXG5cclxuICAvLyBhZGRSb3coKSB7XHJcbiAgLy8gICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XHJcbiAgLy8gICAgIGxldCByb3cgPSB0aGlzLnNlbGVjdGVkVGFibGUuaW5zZXJ0Um93KCk7XHJcbiAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICBsZXQgY2VsbCA9IHJvdy5pbnNlcnRDZWxsKGkpO1xyXG4gIC8vICAgICAgIGNlbGwuaW5uZXJIVE1MID0gJyZuYnNwOyc7XHJcbiAgLy8gICAgICAgY2VsbC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIGJsYWNrJztcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgYWRkUm93KCkge1xyXG4gIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAgIGxldCByb3cgPSB0aGlzLnNlbGVjdGVkVGFibGUuaW5zZXJ0Um93KCk7XHJcblxyXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBjb2x1bW5zIG9mIHRoZSBmaXJzdCByb3cgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY2VsbHNcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGNlbGwgPSByb3cuaW5zZXJ0Q2VsbChpKTtcclxuICAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7JztcclxuXHJcbiAgICAgIC8vIEFwcGx5IGJvdHRvbSBib3JkZXIgZXhwbGljaXRseVxyXG4gICAgICBjZWxsLnN0eWxlLmJvcmRlckJvdHRvbSA9IGAycHggc29saWQgJHt0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUNvbG9yRm9yVGFibGUoKX1gOyAvLyBZb3UgY2FuIHJlcGxhY2UgJ2JsYWNrJyB3aXRoIHlvdXIgdGhlbWUgY29sb3JcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vICAgYWRkUm93KCkge1xyXG4vLyAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuLy8gICAgIGxldCByb3cgPSB0aGlzLnNlbGVjdGVkVGFibGUuaW5zZXJ0Um93KCk7XHJcbi8vICAgICByb3cuc3R5bGUuYm9yZGVyQm90dG9tID0gdGhpcy50aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVGb3JUYWJsZSgpOyAvLyBBZGQgYm90dG9tIGJvcmRlciB0byB0aGUgcm93XHJcbi8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aDsgaSsrKSB7XHJcbi8vICAgICAgIGxldCBjZWxsID0gcm93Lmluc2VydENlbGwoaSk7XHJcbi8vICAgICAgIGNlbGwuaW5uZXJIVE1MID0gJyZuYnNwOyc7XHJcbi8vICAgICB9XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG5cclxuICAvLyBkZWxldGVSb3coKSB7XHJcbiAgLy8gICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XHJcbiAgLy8gICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5kZWxldGVSb3coLTEpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbi8vICAgZGVsZXRlUm93KCkge1xyXG4vLyAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuLy8gICAgIGxldCByb3dJbmRleCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aCAtIDE7IFxyXG4vLyAgICAgaWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcclxuLy8gICAgICAgbGV0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuLy8gICAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4vLyAgICAgICAgIGxldCByb3cgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZT8ucGFyZW50RWxlbWVudD8uY2xvc2VzdCgndHInKTtcclxuLy8gICAgICAgICBpZiAocm93KSB7XHJcbi8vICAgICAgICAgICByb3dJbmRleCA9IHJvdy5yb3dJbmRleDtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5kZWxldGVSb3cocm93SW5kZXgpO1xyXG4vLyAgIH1cclxuLy8gfVxyXG5cclxuICBkZWxldGVSb3coKSB7XHJcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgaWYgKCFzZWxlY3Rpb24ucmFuZ2VDb3VudCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICBjb25zdCBzZWxlY3RlZE5vZGUgPSByYW5nZS5zdGFydENvbnRhaW5lcjtcclxuICAgIGNvbnN0IHJvdyA9IHNlbGVjdGVkTm9kZS5wYXJlbnRFbGVtZW50Py5jbG9zZXN0KCd0cicpO1xyXG5cclxuICAgIGlmIChyb3cpIHtcclxuICAgICAgY29uc3QgdGFibGUgPSByb3cuY2xvc2VzdCgndGFibGUnKTtcclxuICAgICAgaWYgKHRhYmxlKSB7XHJcbiAgICAgICAgdGFibGUuZGVsZXRlUm93KHJvdy5yb3dJbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcblxyXG4gIC8vIGFkZENvbHVtbigpIHtcclxuICAvLyAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgIGxldCBjZWxsID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uaW5zZXJ0Q2VsbCgtMSk7XHJcbiAgLy8gICAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7JztcclxuICAvLyAgICAgICBjZWxsLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgYmxhY2snO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuLy8gICBhZGRDb2x1bW4oKSB7XHJcbi8vICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4vLyAgICAgY29uc3QgY29sdW1uQ291bnQgPSB0aGlzLnNlbGVjdGVkVGFibGUucm93c1swXS5jZWxscy5sZW5ndGggKyAxOyAvLyBOZXcgY29sdW1uIGNvdW50XHJcbi8vICAgICBjb25zdCB0YWJsZVdpZHRoID0gdGhpcy5zZWxlY3RlZFRhYmxlLm9mZnNldFdpZHRoO1xyXG4vLyAgICAgY29uc3QgbWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29sdW1uQ291bnQ7XHJcblxyXG4vLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4vLyAgICAgICBsZXQgY2VsbCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmluc2VydENlbGwoLTEpO1xyXG4vLyAgICAgICBjZWxsLmlubmVySFRNTCA9ICcmbmJzcDsnO1xyXG4vLyAgICAgICBjZWxsLnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgYmxhY2snO1xyXG4vLyAgICAgICBjZWxsLnN0eWxlLm1pbldpZHRoID0gYCR7bWluV2lkdGh9cHhgO1xyXG4vLyAgICAgICBjZWxsLnN0eWxlLndvcmRXcmFwID0gJ2JyZWFrLXdvcmQnO1xyXG4vLyAgICAgICBjZWxsLnN0eWxlLndvcmRCcmVhayA9ICdicmVhay1hbGwnO1xyXG4vLyAgICAgICBjZWxsLnN0eWxlLndoaXRlU3BhY2UgPSAnbm9ybWFsJztcclxuLy8gICAgIH1cclxuXHJcbi8vICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgY2VsbHMnIG1pbldpZHRoXHJcbi8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzLmxlbmd0aDsgaSsrKSB7XHJcbi8vICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoOyBqKyspIHtcclxuLy8gICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxsc1tqXS5zdHlsZS5taW5XaWR0aCA9IGAke21pbldpZHRofXB4YDtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuICAvLyB9XHJcbiAgXHJcbiAgLy8gYWRkQ29sdW1uKCkge1xyXG4gIC8vIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAvLyAgIGNvbnN0IGNvbHVtbkNvdW50ID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbMF0uY2VsbHMubGVuZ3RoICsgMTsgLy8gTmV3IGNvbHVtbiBjb3VudFxyXG4gIC8vICAgY29uc3QgdGFibGVXaWR0aCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5vZmZzZXRXaWR0aDtcclxuICAvLyAgIGNvbnN0IG1pbldpZHRoID0gdGFibGVXaWR0aCAvIGNvbHVtbkNvdW50O1xyXG5cclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgbGV0IGNlbGwgPSB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5pbnNlcnRDZWxsKC0xKTtcclxuICAvLyAgICAgY2VsbC5pbm5lckhUTUwgPSAnJm5ic3A7JztcclxuICAvLyAgICAgY2VsbC5zdHlsZS53b3JkV3JhcCA9ICdicmVhay13b3JkJztcclxuICAvLyAgICAgY2VsbC5zdHlsZS53b3JkQnJlYWsgPSAnYnJlYWstYWxsJztcclxuICAvLyAgICAgY2VsbC5zdHlsZS53aGl0ZVNwYWNlID0gJ25vcm1hbCc7XHJcbiAgLy8gICAgIGNlbGwuc3R5bGUubWluV2lkdGggPSBgJHttaW5XaWR0aH1weGA7XHJcbiAgLy8gICAgIGNlbGwuc3R5bGUuYm9yZGVyQm90dG9tID0gYDJweCBzb2xpZCAke3RoaXMudGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lQ29sb3JGb3JUYWJsZSgpfWBcclxuICAvLyAgIH1cclxuXHJcbiAgLy8gICAvLyBVcGRhdGUgZXhpc3Rpbmcgcm93cycgYm90dG9tIGJvcmRlclxyXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5zdHlsZS5ib3JkZXJCb3R0b20gPSB0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG4gIC8vIH1cclxuXHJcbiAgYWRkQ29sdW1uKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWJsZSkge1xyXG4gICAgICBjb25zdCBjb2x1bW5Db3VudCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzWzBdLmNlbGxzLmxlbmd0aCArIDE7IC8vIE5ldyBjb2x1bW4gY291bnRcclxuICAgICAgY29uc3QgdGFibGVXaWR0aCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5vZmZzZXRXaWR0aDtcclxuICAgICAgY29uc3QgbWluV2lkdGggPSB0YWJsZVdpZHRoIC8gY29sdW1uQ291bnQ7XHJcblxyXG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgaGVhZGVyIGJhY2tncm91bmQgY29sb3IgaWYgYW55XHJcbiAgICAgIGNvbnN0IGZpcnN0SGVhZGVyQ2VsbCA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzWzBdXHJcbiAgICAgICAgLmNlbGxzWzBdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBjb25zdCBoZWFkZXJCZ0NvbG9yID0gZmlyc3RIZWFkZXJDZWxsXHJcbiAgICAgICAgPyBmaXJzdEhlYWRlckNlbGwuc3R5bGUuYmFja2dyb3VuZENvbG9yXHJcbiAgICAgICAgOiBcIlwiO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBjZWxsID0gdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uaW5zZXJ0Q2VsbCgtMSk7XHJcbiAgICAgICAgY2VsbC5pbm5lckhUTUwgPSBcIiZuYnNwO1wiO1xyXG4gICAgICAgIGNlbGwuc3R5bGUud29yZFdyYXAgPSBcImJyZWFrLXdvcmRcIjtcclxuICAgICAgICBjZWxsLnN0eWxlLndvcmRCcmVhayA9IFwiYnJlYWstYWxsXCI7XHJcbiAgICAgICAgY2VsbC5zdHlsZS53aGl0ZVNwYWNlID0gXCJub3JtYWxcIjtcclxuICAgICAgICBjZWxsLnN0eWxlLm1pbldpZHRoID0gYCR7bWluV2lkdGh9cHhgO1xyXG4gICAgICAgIGNlbGwuc3R5bGUuYm9yZGVyQm90dG9tID0gXCIxcHggc29saWQgI2QzZDNkM1wiO1xyXG5cclxuICAgICAgICAvLyBjZWxsLnN0eWxlLmJvcmRlckJvdHRvbSA9IGAycHggc29saWQgJHt0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUNvbG9yRm9yVGFibGUoKX1gO1xyXG5cclxuICAgICAgICAvLyBJZiBpdCdzIHRoZSBmaXJzdCByb3csIG1ha2UgaXQgYSBoZWFkZXIgY2VsbFxyXG4gICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoXCJoZWFkZXItY2VsbFwiKTtcclxuICAgICAgICAgIGNlbGwuc3R5bGUuZm9udFdlaWdodCA9IFwiYm9sZFwiO1xyXG4gICAgICAgICAgY2VsbC5zdHlsZS50ZXh0QWxpZ24gPSBcInN0YXJ0XCI7XHJcbiAgICAgICAgICBjZWxsLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBcIm5vbmVcIjtcclxuICAgICAgICAgIGNlbGwuc3R5bGUuZGlzcGxheSA9IFwidGFibGUtY2VsbFwiO1xyXG4gICAgICAgICAgY2VsbC5zdHlsZS5wb3NpdGlvbiA9IFwic3RhdGljXCI7XHJcbiAgICAgICAgICBjZWxsLnN0eWxlLmJvcmRlclRvcCA9IFwiMnB4IHNvbGlkIGJsYWNrXCI7XHJcbiAgICAgICAgICAvLyBjZWxsLmlubmVyVGV4dCA9IGBIZWFkZXIgJHtjb2x1bW5Db3VudH1gO1xyXG5cclxuICAgICAgICAgIC8vIEFwcGx5IHRoZSBzYW1lIGJhY2tncm91bmQgY29sb3IgYXMgZXhpc3RpbmcgaGVhZGVyc1xyXG4gICAgICAgICAgaWYgKGhlYWRlckJnQ29sb3IpIHtcclxuICAgICAgICAgICAgY2VsbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBoZWFkZXJCZ0NvbG9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIHJvd3MnIGJvdHRvbSBib3JkZXJcclxuICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAvLyAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLnN0eWxlLmJvcmRlckJvdHRvbSA9XHJcbiAgICAgIC8vICAgICB0aGlzLnRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUZvclRhYmxlKCk7XHJcbiAgICAgIC8vIH1cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmNlbGxzW2pdLnN0eWxlLmJvcmRlckJvdHRvbSA9IFwiMXB4IHNvbGlkICNkM2QzZDNcIjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcblxyXG5cclxuXHJcblxyXG4gIGRlbGV0ZUNvbHVtbigpIHtcclxuICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XHJcbiAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xyXG4gICAgICBsZXQgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgbGV0IGNlbGwgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZT8ucGFyZW50RWxlbWVudD8uY2xvc2VzdCgndGQsIHRoJykgYXMgSFRNTFRhYmxlQ2VsbEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKGNlbGwpIHtcclxuICAgICAgICAgIGxldCBjZWxsSW5kZXggPSBjZWxsLmNlbGxJbmRleDtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uZGVsZXRlQ2VsbChjZWxsSW5kZXgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuICB0aGVtZU1vZGVDbHJWZXJ0aWNhbExpbmVGb3JUYWJsZSgpIHtcclxuICAgIGNvbnN0IGNsck1vZGUgPSBkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS1sYXlvdXQtY29sb3InKVxyXG4gICAgaWYgKGNsck1vZGUgPT0gJ2RhcmsnKSB7XHJcbiAgICAgIHJldHVybiAnMnB4IHNvbGlkICM0MTQxNDEgIWltcG9ydGFudCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnMnB4IHNvbGlkICM1RjVGNUYgIWltcG9ydGFudCdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRoZW1lTW9kZUNsclZlcnRpY2FsTGluZUNvbG9yRm9yVGFibGUoKSB7XHJcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcclxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xyXG4gICAgICByZXR1cm4gJyM0MTQxNDEnXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJyM1RjVGNUYnXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGp1c3RUYWJsZVdpZHRoKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRhYmxlLnN0eWxlLndpZHRoID0gZXZlbnQudGFyZ2V0LnZhbHVlICsgJ3B4JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkanVzdENlbGxXaWR0aChldmVudDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhYmxlKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmNlbGxzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFibGUucm93c1tpXS5jZWxsc1tqXS5zdHlsZS53aWR0aCA9IGV2ZW50LnRhcmdldC52YWx1ZSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGp1c3RDZWxsSGVpZ2h0KGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFibGUpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkVGFibGUucm93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5zZWxlY3RlZFRhYmxlLnJvd3NbaV0uY2VsbHMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZS5yb3dzW2ldLmNlbGxzW2pdLnN0eWxlLmhlaWdodCA9IGV2ZW50LnRhcmdldC52YWx1ZSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldENhcmV0VG9FbmQoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcclxuICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcclxuICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcclxuICAgICAgaWYgKHNlbCkge1xyXG4gICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxlbWVudCk7XHJcbiAgICByYW5nZS5jb2xsYXBzZShmYWxzZSk7XHJcbiAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gb3BlbkNvbG9yUGlja2VyKGlucHV0SWQ6IHN0cmluZykge1xyXG4gIC8vICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7XHJcbiAgLy8gICBpZiAoaW5wdXRFbGVtZW50KSB7XHJcbiAgLy8gICAgIGlucHV0RWxlbWVudC5jbGljaygpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0VGV4dENvbG9yKGV2ZW50OiBhbnkpIHtcclxuICAvLyAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICAvLyAgIGlmIChlZGl0b3IpIHtcclxuICAvLyAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgLy8gICAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gIC8vICAgICB0aGlzLnNlbGVjdGVkVGV4dENvbG9yID0gY29sb3I7XHJcbiAgLy8gICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdmb3JlQ29sb3InLCBmYWxzZSwgY29sb3IpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgLy8gc2V0QmFja2dyb3VuZENvbG9yKGV2ZW50OiBhbnkpIHtcclxuICAvLyAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlZGl0b3InKTtcclxuICAvLyAgIGlmIChlZGl0b3IpIHtcclxuICAvLyAgICAgZWRpdG9yLmZvY3VzKCk7XHJcbiAgLy8gICAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gIC8vICAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xyXG4gIC8vICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnaGlsaXRlQ29sb3InLCBmYWxzZSwgY29sb3IpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlZFNlbGVjdGlvbjogUmFuZ2UgfCBudWxsID0gbnVsbDtcclxuXHJcbm9wZW5Db2xvclBpY2tlcihpbnB1dElkOiBzdHJpbmcpIHtcclxuICBjb25zdCBpbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpbnB1dElkKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gIGlmIChpbnB1dEVsZW1lbnQpIHtcclxuICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkge1xyXG4gICAgICB0aGlzLnNhdmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XHJcbiAgICB9XHJcbiAgICBpbnB1dEVsZW1lbnQuY2xpY2soKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIHNldFRleHRDb2xvcihldmVudDogYW55KSB7XHJcbi8vICAgaWYgKHRoaXMuc2F2ZWRTZWxlY3Rpb24pIHtcclxuLy8gICAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4vLyAgICAgdGhpcy5zZWxlY3RlZFRleHRDb2xvciA9IGNvbG9yO1xyXG5cclxuLy8gICAgIC8vIFJlc3RvcmUgdGhlIHNhdmVkIHNlbGVjdGlvblxyXG4vLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4vLyAgICAgaWYgKHNlbGVjdGlvbikge1xyXG4vLyAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbi8vICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZSh0aGlzLnNhdmVkU2VsZWN0aW9uKTtcclxuXHJcbi8vICAgICAgIC8vIEFwcGx5IHRoZSBjb2xvciB1c2luZyBhIHNwYW5cclxuLy8gICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnNhdmVkU2VsZWN0aW9uO1xyXG4vLyAgICAgICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xyXG4vLyAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gY29sb3I7XHJcbi8vICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSByYW5nZS50b1N0cmluZygpO1xyXG5cclxuLy8gICAgICAgLy8gUmVwbGFjZSB0aGUgc2VsZWN0ZWQgdGV4dCB3aXRoIHRoZSBzdHlsZWQgc3BhblxyXG4vLyAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG4vLyAgICAgICByYW5nZS5pbnNlcnROb2RlKHNwYW4pO1xyXG5cclxuLy8gICAgICAgLy8gQ2xlYXIgdGhlIHNhdmVkIHNlbGVjdGlvblxyXG4vLyAgICAgICB0aGlzLnNhdmVkU2VsZWN0aW9uID0gbnVsbDtcclxuLy8gICAgIH1cclxuLy8gICB9XHJcbiAgLy8gfVxyXG4vLyAgIHNldFRleHRDb2xvcihldmVudDogYW55KSB7XHJcbi8vICAgaWYgKHRoaXMuc2F2ZWRTZWxlY3Rpb24pIHtcclxuLy8gICAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4vLyAgICAgdGhpcy5zZWxlY3RlZFRleHRDb2xvciA9IGNvbG9yO1xyXG5cclxuLy8gICAgIC8vIFJlc3RvcmUgdGhlIHNhdmVkIHNlbGVjdGlvblxyXG4vLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4vLyAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuLy8gICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnNhdmVkU2VsZWN0aW9uO1xyXG4vLyAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbi8vICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XHJcblxyXG4vLyAgICAgICAvLyBHZXQgc2VsZWN0ZWQgZWxlbWVudHNcclxuLy8gICAgICAgY29uc3Qgc2VsZWN0ZWRDb250ZW50ID0gcmFuZ2UuY2xvbmVDb250ZW50cygpO1xyXG4vLyAgICAgICBjb25zdCBlbGVtZW50cyA9IEFycmF5LmZyb20oc2VsZWN0ZWRDb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqXCIpKSBhcyBIVE1MRWxlbWVudFtdOyAvLyDinIUgRXhwbGljaXRseSBjYXN0IHRvIEhUTUxFbGVtZW50W11cclxuXHJcbi8vICAgICAgIC8vIEFwcGx5IGNvbG9yIHRvIGVhY2ggZWxlbWVudCB3aXRob3V0IG1vZGlmeWluZyBzdHJ1Y3R1cmVcclxuLy8gICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcclxuLy8gICAgICAgICBlbC5zdHlsZS5jb2xvciA9IGNvbG9yO1xyXG4vLyAgICAgICB9KTtcclxuXHJcbi8vICAgICAgIC8vIEFwcGx5IGNvbG9yIHRvIHRoZSB0b3AtbGV2ZWwgdGV4dCBub2RlcyAod2l0aG91dCB3cmFwcGluZyB0aGVtKVxyXG4vLyAgICAgICBBcnJheS5mcm9tKHNlbGVjdGVkQ29udGVudC5jaGlsZE5vZGVzKS5mb3JFYWNoKChub2RlKSA9PiB7XHJcbi8vICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFICYmIG5vZGUudGV4dENvbnRlbnQ/LnRyaW0oKSAhPT0gXCJcIikge1xyXG4vLyAgICAgICAgICAgY29uc3QgcGFyZW50ID0gcmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIucGFyZW50RWxlbWVudDtcclxuLy8gICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuLy8gICAgICAgICAgICAgcGFyZW50LnN0eWxlLmNvbG9yID0gY29sb3I7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICB9KTtcclxuXHJcbi8vICAgICAgIC8vIFJlcGxhY2Ugc2VsZWN0ZWQgY29udGVudFxyXG4vLyAgICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG4vLyAgICAgICByYW5nZS5pbnNlcnROb2RlKHNlbGVjdGVkQ29udGVudCk7XHJcblxyXG4vLyAgICAgICAvLyBDbGVhciBzYXZlZCBzZWxlY3Rpb25cclxuLy8gICAgICAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IG51bGw7XHJcbi8vICAgICB9XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG4vLyBzZXRUZXh0Q29sb3IoZXZlbnQ6IGFueSkge1xyXG4vLyAgIGNvbnNvbGUubG9nKFwiQ2xpY2tlZCBzZXRUZXh0Q29sb3JcIik7XHJcbi8vICAgaWYgKCF0aGlzLnNhdmVkU2VsZWN0aW9uKSB7XHJcbi8vICAgICBjb25zb2xlLndhcm4oXCJObyBzYXZlZCBzZWxlY3Rpb24gYXZhaWxhYmxlIVwiKTtcclxuLy8gICAgIHJldHVybjtcclxuLy8gICB9XHJcblxyXG4vLyAgIGNvbnN0IGNvbG9yID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4vLyAgIHRoaXMuc2VsZWN0ZWRUZXh0Q29sb3IgPSBjb2xvcjtcclxuLy8gICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4vLyAgIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbi8vICAgICBjb25zb2xlLmVycm9yKFwiTm8gdmFsaWQgc2VsZWN0aW9uIGZvdW5kIVwiKTtcclxuLy8gICAgIHJldHVybjtcclxuLy8gICB9XHJcblxyXG4vLyAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcclxuLy8gICBzZWxlY3Rpb24uYWRkUmFuZ2UodGhpcy5zYXZlZFNlbGVjdGlvbik7XHJcbi8vICAgY29uc3QgcmFuZ2UgPSB0aGlzLnNhdmVkU2VsZWN0aW9uO1xyXG5cclxuLy8gICBjb25zdCBnZXRUYWJsZUNlbGwgPSAobm9kZTogTm9kZSB8IG51bGwpOiBIVE1MRWxlbWVudCB8IG51bGwgPT4ge1xyXG4vLyAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTtcclxuLy8gICAgIGlmIChjdXJyZW50Tm9kZSAmJiBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuLy8gICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnROb2RlO1xyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIHdoaWxlIChjdXJyZW50Tm9kZSAmJiBjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XHJcbi8vICAgICAgIGlmIChjdXJyZW50Tm9kZS50YWdOYW1lID09PSBcIlREXCIgfHwgY3VycmVudE5vZGUudGFnTmFtZSA9PT0gXCJUSFwiKSB7XHJcbi8vICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50RWxlbWVudDtcclxuLy8gICAgIH1cclxuLy8gICAgIHJldHVybiBudWxsO1xyXG4vLyAgIH07XHJcblxyXG4vLyAgIGNvbnN0IHRhYmxlQ2VsbCA9XHJcbi8vICAgICBnZXRUYWJsZUNlbGwocmFuZ2UuY29tbW9uQW5jZXN0b3JDb250YWluZXIpIHx8XHJcbi8vICAgICBnZXRUYWJsZUNlbGwocmFuZ2Uuc3RhcnRDb250YWluZXIpIHx8XHJcbi8vICAgICBnZXRUYWJsZUNlbGwocmFuZ2UuZW5kQ29udGFpbmVyKTtcclxuXHJcbi8vICAgaWYgKHRhYmxlQ2VsbCkge1xyXG4vLyAgICAgY29uc29sZS5sb2coYFByb2Nlc3NpbmcgJHt0YWJsZUNlbGwudGFnTmFtZX0gZWxlbWVudGApO1xyXG4vLyAgICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uLnRvU3RyaW5nKCk7XHJcblxyXG4vLyAgICAgaWYgKHNlbGVjdGVkVGV4dCkge1xyXG4vLyAgICAgICBjb25zb2xlLmxvZyhgU2VsZWN0ZWQgdGV4dCBpbiAke3RhYmxlQ2VsbC50YWdOYW1lfTpgLCBzZWxlY3RlZFRleHQpO1xyXG4vLyAgICAgICBjb25zdCB0ZXh0Tm9kZXM6IFRleHRbXSA9IFtdO1xyXG4vLyAgICAgICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxyXG4vLyAgICAgICAgIHRhYmxlQ2VsbCxcclxuLy8gICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCxcclxuLy8gICAgICAgICBudWxsXHJcbi8vICAgICAgICk7XHJcbi8vICAgICAgIGxldCBub2RlOiBUZXh0IHwgbnVsbDtcclxuXHJcbi8vICAgICAgIHdoaWxlICgobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpIGFzIFRleHQgfCBudWxsKSkge1xyXG4vLyAgICAgICAgIHRleHROb2Rlcy5wdXNoKG5vZGUpO1xyXG4vLyAgICAgICB9XHJcblxyXG4vLyAgICAgICBmb3IgKGNvbnN0IHRleHROb2RlIG9mIHRleHROb2Rlcykge1xyXG4vLyAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0Tm9kZS50ZXh0Q29udGVudCB8fCBcIlwiO1xyXG4vLyAgICAgICAgIGNvbnN0IGluZGV4ID0gdGV4dC5pbmRleE9mKHNlbGVjdGVkVGV4dCk7XHJcblxyXG4vLyAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuLy8gICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4vLyAgICAgICAgICAgICBgRm91bmQgc2VsZWN0ZWQgdGV4dCBpbiAke3RhYmxlQ2VsbC50YWdOYW1lfSB0ZXh0IG5vZGVgXHJcbi8vICAgICAgICAgICApO1xyXG5cclxuLy8gICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcclxuLy8gICAgICAgICAgIHNwYW4uc3R5bGUuY29sb3IgPSBjb2xvcjtcclxuLy8gICAgICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSBzZWxlY3RlZFRleHQ7XHJcblxyXG4vLyAgICAgICAgICAgY29uc3QgYmVmb3JlVGV4dCA9IHRleHQuc2xpY2UoMCwgaW5kZXgpO1xyXG4vLyAgICAgICAgICAgY29uc3QgYWZ0ZXJUZXh0ID0gdGV4dC5zbGljZShpbmRleCArIHNlbGVjdGVkVGV4dC5sZW5ndGgpO1xyXG5cclxuLy8gICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG4vLyAgICAgICAgICAgaWYgKGJlZm9yZVRleHQpXHJcbi8vICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGJlZm9yZVRleHQpKTtcclxuLy8gICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKHNwYW4pO1xyXG4vLyAgICAgICAgICAgaWYgKGFmdGVyVGV4dClcclxuLy8gICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYWZ0ZXJUZXh0KSk7XHJcblxyXG4vLyAgICAgICAgICAgdGV4dE5vZGUucmVwbGFjZVdpdGgoZnJhZ21lbnQpO1xyXG4vLyAgICAgICAgICAgYnJlYWs7IC8vIEFwcGx5IG9ubHkgb25jZSBwZXIgc2VsZWN0aW9uXHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICB9XHJcbi8vICAgICB9XHJcbi8vICAgfSBlbHNlIHtcclxuLy8gICAgIGNvbnNvbGUubG9nKFwiTm8gVEggb3IgVEQgZWxlbWVudCBmb3VuZCBpbiBzZWxlY3Rpb25cIik7XHJcbi8vICAgICByZXR1cm47XHJcbi8vICAgfVxyXG5cclxuLy8gICB0aGlzLnNhdmVkU2VsZWN0aW9uID0gbnVsbDtcclxuLy8gfVxyXG5cclxuc2V0VGV4dENvbG9yKGV2ZW50OiBhbnkpIHtcclxuICBjb25zb2xlLmxvZyhcImNsaWNrZWRcIik7XHJcblxyXG4gIGlmICghdGhpcy5zYXZlZFNlbGVjdGlvbikge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJObyBzYXZlZCBzZWxlY3Rpb24gYXZhaWxhYmxlIVwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgY29uc29sZS5sb2coXCJjb2xvclwiLCBjb2xvcik7XHJcblxyXG4gIHRoaXMuc2VsZWN0ZWRUZXh0Q29sb3IgPSBjb2xvcjtcclxuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcblxyXG4gIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJObyB2YWxpZCBzZWxlY3Rpb24gZm91bmQhXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgc2VsZWN0aW9uLmFkZFJhbmdlKHRoaXMuc2F2ZWRTZWxlY3Rpb24pO1xyXG4gIGNvbnN0IHJhbmdlID0gdGhpcy5zYXZlZFNlbGVjdGlvbjtcclxuXHJcbiAgY29uc3QgZ2V0UGFyZW50RWxlbWVudCA9IChub2RlOiBOb2RlIHwgbnVsbCk6IEhUTUxFbGVtZW50IHwgbnVsbCA9PiB7XHJcbiAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7XHJcbiAgICAgIGlmIChjdXJyZW50Tm9kZSAmJiBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcclxuICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgd2hpbGUgKGN1cnJlbnROb2RlICYmIGN1cnJlbnROb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICB9O1xyXG5cclxuICBjb25zdCBwYXJlbnRFbGVtZW50ID1cclxuICAgICAgZ2V0UGFyZW50RWxlbWVudChyYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcikgfHxcclxuICAgICAgZ2V0UGFyZW50RWxlbWVudChyYW5nZS5zdGFydENvbnRhaW5lcikgfHxcclxuICAgICAgZ2V0UGFyZW50RWxlbWVudChyYW5nZS5lbmRDb250YWluZXIpO1xyXG5cclxuICBpZiAoIXBhcmVudEVsZW1lbnQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIk5vIHZhbGlkIHBhcmVudCBlbGVtZW50IGZvdW5kIVwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gKipIYW5kbGUgVGFibGUgQ2VsbCBDYXNlKipcclxuICBpZiAocGFyZW50RWxlbWVudC50YWdOYW1lID09PSBcIlREXCIpIHtcclxuICAgICAgcGFyZW50RWxlbWVudC5zdHlsZS5jb2xvciA9IGNvbG9yOyAvLyBBcHBseSBjb2xvciBkaXJlY3RseSB0byBjZWxsXHJcbiAgICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vICoqSGFuZGxlIE5vcm1hbCBUZXh0IENhc2UqKlxyXG4gIGNvbnN0IHNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvbi50b1N0cmluZygpO1xyXG5cclxuICBpZiAoc2VsZWN0ZWRUZXh0KSB7XHJcbiAgICAgIGNvbnN0IHRleHROb2RlczogVGV4dFtdID0gW107XHJcbiAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXHJcbiAgICAgICAgICBwYXJlbnRFbGVtZW50LFxyXG4gICAgICAgICAgTm9kZUZpbHRlci5TSE9XX1RFWFQsXHJcbiAgICAgICAgICBudWxsXHJcbiAgICAgICk7XHJcbiAgICAgIGxldCBub2RlOiBUZXh0IHwgbnVsbDtcclxuXHJcbiAgICAgIHdoaWxlICgobm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpIGFzIFRleHQgfCBudWxsKSkge1xyXG4gICAgICAgICAgdGV4dE5vZGVzLnB1c2gobm9kZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgdGV4dE5vZGUgb2YgdGV4dE5vZGVzKSB7XHJcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gdGV4dE5vZGUudGV4dENvbnRlbnQgfHwgXCJcIjtcclxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGV4dC5pbmRleE9mKHNlbGVjdGVkVGV4dCk7XHJcblxyXG4gICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcclxuICAgICAgICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gY29sb3I7XHJcbiAgICAgICAgICAgICAgc3Bhbi50ZXh0Q29udGVudCA9IHNlbGVjdGVkVGV4dDtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgYmVmb3JlVGV4dCA9IHRleHQuc2xpY2UoMCwgaW5kZXgpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGFmdGVyVGV4dCA9IHRleHQuc2xpY2UoaW5kZXggKyBzZWxlY3RlZFRleHQubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChiZWZvcmVUZXh0KVxyXG4gICAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShiZWZvcmVUZXh0KSk7XHJcbiAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoc3Bhbik7XHJcbiAgICAgICAgICAgICAgaWYgKGFmdGVyVGV4dClcclxuICAgICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYWZ0ZXJUZXh0KSk7XHJcblxyXG4gICAgICAgICAgICAgIHRleHROb2RlLnJlcGxhY2VXaXRoKGZyYWdtZW50KTtcclxuICAgICAgICAgICAgICBicmVhazsgLy8gQXBwbHkgb25seSBvbmNlIHBlciBzZWxlY3Rpb25cclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgdGhpcy5zYXZlZFNlbGVjdGlvbiA9IG51bGw7XHJcbn1cclxuXHJcbiAgc2V0QmFja2dyb3VuZENvbG9yKGV2ZW50OiBhbnkpIHtcclxuICBpZiAodGhpcy5zYXZlZFNlbGVjdGlvbikge1xyXG4gICAgY29uc3QgY29sb3IgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xyXG5cclxuICAgIC8vIFJlc3RvcmUgdGhlIHNhdmVkIHNlbGVjdGlvblxyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbikge1xyXG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZSh0aGlzLnNhdmVkU2VsZWN0aW9uKTtcclxuXHJcbiAgICAgIC8vIEFwcGx5IHRoZSBiYWNrZ3JvdW5kIGNvbG9yIHVzaW5nIGEgc3BhblxyXG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2F2ZWRTZWxlY3Rpb247XHJcbiAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgIHNwYW4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3I7XHJcbiAgICAgIHNwYW4udGV4dENvbnRlbnQgPSByYW5nZS50b1N0cmluZygpO1xyXG5cclxuICAgICAgLy8gUmVwbGFjZSB0aGUgc2VsZWN0ZWQgdGV4dCB3aXRoIHRoZSBzdHlsZWQgc3BhblxyXG4gICAgICByYW5nZS5kZWxldGVDb250ZW50cygpO1xyXG4gICAgICByYW5nZS5pbnNlcnROb2RlKHNwYW4pO1xyXG5cclxuICAgICAgLy8gQ2xlYXIgdGhlIHNhdmVkIHNlbGVjdGlvblxyXG4gICAgICB0aGlzLnNhdmVkU2VsZWN0aW9uID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbiAgfVxyXG4gIFxyXG4gIC8vIGNvbG9yQ2hhbmdlZChldmVudDogYW55KSB7XHJcbiAgLy8gICB0aGlzLmNvbG9yID0gZXZlbnQuY29sb3IuaGV4OyBcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBsb2dFdmVudChldmVudDogYW55LCB0cmlnZ2VyOiBhbnkpIHtcclxuICAgIGNvbnN0IGNvbG9yID0gZXZlbnQ7XHJcbiAgICB0aGlzLnNldFRleHRDb2xvcihjb2xvcilcclxuICAgIHRoaXMuc2VsZWN0ZWRUZXh0Q29sb3IgPSBldmVudFxyXG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2ZvcmVDb2xvcicsIGZhbHNlLCBldmVudCk7XHJcbiAgICAvLyB0aGlzLmxvZ3MudW5zaGlmdChbdGhpcy5sb2dzLmxlbmd0aCArIDEsIHRyaWdnZXIsIGV2ZW50XSk7XHJcbiAgfVxyXG4gIFxyXG5cclxuICBlZGl0SW1hZ2UoKSB7XHJcbiAgICBsZXQgZGF0YSBcclxuICAgIHN3aXRjaCAodGhpcy5lZGl0b3JGcm9tLm5hbWUpIHtcclxuICAgICAgY2FzZSAnc2VjdGlvbi1jb250ZW50JzpcclxuICAgICAgICBkYXRhID0geyBlZGl0SU1HOiB0cnVlLCBmcm9tOiAnaHRtbEVkaXRvcicsIGluZGV4OiB0aGlzLnNlbGVjdGVkSXRlbUluZGV4LCBpZDogdGhpcy5lZGl0b3JGcm9tLmlkIH07XHJcbiAgICAgICAgY29uc3QgY29tcHJlc3NlZERhdGE6IHN0cmluZyA9IGNvbXByZXNzKEpTT04uc3RyaW5naWZ5KHRoaXMuaW1hZ2VFZGl0VXJsKSk7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAnLCBjb21wcmVzc2VkRGF0YSk7XHJcbiAgICAgICAgY29uc3QgY29tcHJlc3NlZERhdGEyID0gY29tcHJlc3MoSlNPTi5zdHJpbmdpZnkodGhpcy5zYW5pdGl6ZWRDb250ZW50KSk7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgndGV4dEVkaXRvcicsIGNvbXByZXNzZWREYXRhMik7XHJcbiAgICAgICAgLy8gYWxlcnQoJ2dvIHRvIGVkaXRvciEnKVxyXG4gICAgICAgIHRoaXMubmF2aWdhdGVUb0lNR0VkaXRvcihkYXRhKTtcclxuICAgICAgICB0aGlzLmltYWdlRWRpdC5lbWl0KClcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnY3JlYXRlLWRvY3VtZW50JzpcclxuICAgICAgICB0aGlzLmltYWdlRWRpdC5lbWl0KClcclxuICAgICAgICBkYXRhID0geyBlZGl0SU1HOiB0cnVlLCBmcm9tOiAnY3JlYXRlRG9jdW1lbnQnLCBpbmRleDogdGhpcy5zZWxlY3RlZEl0ZW1JbmRleCwgaWQ6IHRoaXMuZWRpdG9yRnJvbS5pZCwgc2VjdGlvbjogdGhpcy5lZGl0b3JGcm9tLnNlY3Rpb24sIHJlcG9ydFNlY3Rpb25JZDogdGhpcy5lZGl0b3JGcm9tLnJlcG9ydFNlY3Rpb25JZCB9O1xyXG4gICAgICAgIC8vIHRoaXMub3BlbkRpYWxvZyhkYXRhKVxyXG4gICAgICAgIGNvbnN0IGNvbXByZXNzZWREYXRhMyA9IGNvbXByZXNzKEpTT04uc3RyaW5naWZ5KHRoaXMuaW1hZ2VFZGl0VXJsKSk7XHJcbiAgICAgICAgY29uc3QgY29tcHJlc3NlZERhdGE0ID0gY29tcHJlc3ModGhpcy5lZGl0b3JUZXh0KTtcclxuXHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAyJywgY29tcHJlc3NlZERhdGEzKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd0ZXh0RWRpdG9yMicsIGNvbXByZXNzZWREYXRhNCk7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvSU1HRWRpdG9yKGRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIG51bGxcclxuICAgICAgICAvLyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcCcpO1xyXG4gICAgICAgIC8vIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wMicpO1xyXG4gICAgICAgIC8vIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ3RlbXBsYXRlRWRpdG9yJyk7XHJcbiAgICAgICAgLy8gc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgndGV4dEVkaXRvcicpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgLy8gaWYgKHRoaXMuZWRpdG9yRnJvbSA9PT0gJ3NlY3Rpb24tY29udGVudCcpIHtcclxuICAgIC8vICAgY29uc3QgZGF0YSA9IHtlZGl0SU1HOiB0cnVlLCBmcm9tOiAnaHRtbEVkaXRvcicsIGluZGV4OiB0aGlzLnNlbGVjdGVkSXRlbUluZGV4fVxyXG4gICAgLy8gICB0aGlzLm5hdmlnYXRlVG9JTUdFZGl0b3IoZGF0YSlcclxuICAgIC8vICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZWRpdEltYWdlRnJvbVRlbXAnLCBKU09OLnN0cmluZ2lmeSh0aGlzLmltYWdlRWRpdFVybCkpXHJcbiAgICAvLyAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3RleHRFZGl0b3InLCB0aGlzLmVkaXRvclRleHQpXHJcbiAgICAvLyB9IFxyXG4gICAgXHJcbiAgfVxyXG5cclxuICBvcGVuRGlhbG9nKCBpdGVtOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIGxldCBkYXRhOiBhbnk7XHJcbiAgICAvLyAgIGRhdGEgPSBpdGVtXHJcbiAgICAvLyBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEltYWdlRWRpdG9yTW9kYWxDb21wb25lbnQse1xyXG4gICAgLy8gICBtaW5XaWR0aDogJzEwMCUnLCBtaW5IZWlnaHQ6ICcxMDB2aCcsIHBhbmVsQ2xhc3M6ICd0aGVtZS0yQjI5MzYnICxkaXNhYmxlQ2xvc2U6IHRydWUsIGRhdGE6IGRhdGFcclxuICAgIC8vIH0pO1xyXG4gICAgLy8gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdyZXN1bHQgPT09PiBpbWcgPSAnLCByZXN1bHQpXHJcbiAgICAvLyAgIGNvbnN0IGltZ1VybCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2VkaXRJbWFnZUZyb21UZW1wMicpO1xyXG4gICAgLy8gICAgIGlmIChpbWdVcmwpIHtcclxuICAgIC8vICAgICAgIHRoaXMucmVwbGFjZUltYWdlU3JjKGltZ1VybCwgIHJlc3VsdC5pbmRleC5pbmRleCk7XHJcbiAgICAvLyAgICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdlZGl0SW1hZ2VGcm9tVGVtcDInKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9KTtcclxuICB9XHJcblxyXG4gIHJlcGxhY2VJbWFnZVNSQyhuZXdTcmM6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0aGlzLmVkaXRvclRleHQsICd0ZXh0L2h0bWwnKTtcclxuICAgIGNvbnN0IGltZ1RhZ3MgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpO1xyXG5cclxuICBpZiAoaW1nVGFncyAmJiBpbWdUYWdzLmxlbmd0aCA+IDApIHtcclxuICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgaW1nVGFncy5sZW5ndGgpIHtcclxuICAgICAgLy8gVXBkYXRlIHRoZSBzcmMgYXR0cmlidXRlIG9mIHRoZSBpbWcgYXQgdGhlIHNwZWNpZmllZCBpbmRleFxyXG4gICAgICBcclxuICAgICAgaW1nVGFnc1tpbmRleF0uc2V0QXR0cmlidXRlKCdzcmMnLCBuZXdTcmMpO1xyXG4gICAgICB0aGlzLmVkaXRvclRleHQgPSBkb2MuYm9keS5pbm5lckhUTUw7XHJcbiAgICBcclxuICAgIH0gXHJcbiAgfSBcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlVG9JTUdFZGl0b3IoZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hZG1pbi9pbWFnZS1lZGl0b3InXSwgeyBxdWVyeVBhcmFtczoge2RhdGEgOiBKU09OLnN0cmluZ2lmeShkYXRhKX0gfSlcclxuICB9XHJcblxyXG4gIC8vICBvblRleHRTZWxlY3QoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAvLyAgIGlmICh0aGlzLnRvb2xiYXJNb2RlID09PSAnYnViYmxlJykge1xyXG4gIC8vICAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XHJcbiAgLy8gICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XHJcbiAgLy8gICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAvLyAgICAgICBpZiAoIXJhbmdlLmNvbGxhcHNlZCkge1xyXG4gIC8vICAgICAgICAgY29uc3QgcmVjdCA9IHJhbmdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gIC8vICAgICAgICAgdGhpcy50b29sYmFyVG9wID0gcmVjdC5ib3R0b20gKyB3aW5kb3cuc2Nyb2xsWSArIDEwO1xyXG4gIC8vICAgICAgICAgdGhpcy50b29sYmFyTGVmdCA9IHJlY3QubGVmdCArIHdpbmRvdy5zY3JvbGxYICsgKHJlY3Qud2lkdGggLyAyKSAtIDUwO1xyXG4gIC8vICAgICAgICAgdGhpcy5zaG93VG9vbGJhciA9IHRydWU7XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSBmYWxzZTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gb25UZXh0U2VsZWN0KGV2ZW50PzogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gIGlmICh0aGlzLnRvb2xiYXJNb2RlID09PSAnYnViYmxlJykge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xyXG4gICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcclxuICAgICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcclxuICAgICAgaWYgKCFyYW5nZS5jb2xsYXBzZWQpIHtcclxuICAgICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsWSA9ICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbFggPSAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XHJcbiAgICAgICAgdGhpcy50b29sYmFyVG9wID0gcmVjdC50b3AgKyBzY3JvbGxZIC0gNzU7XHJcbiAgICAgICAgdGhpcy50b29sYmFyTGVmdCA9IHJlY3QubGVmdCArIHNjcm9sbFggKyAocmVjdC53aWR0aCAvIDIpIC0gMzI1O1xyXG4gICAgICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2hvd1Rvb2xiYXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93VG9vbGJhciA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuXHJcbi8vIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbi8vICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4vLyAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7XHJcbi8vICAgICBpZiAoY2xpcGJvYXJkRGF0YSkge1xyXG4vLyAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XHJcbi8vICAgICAgIGlmICh0aGlzLmlzVGFibGVEYXRhKHBhc3RlZFRleHQpKSB7XHJcbi8vICAgICAgICAgY29uc3QgaHRtbCA9IHRoaXMuY29udmVydFRleHRUb1RhYmxlKHBhc3RlZFRleHQpO1xyXG4vLyAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoaHRtbCk7XHJcbi8vICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChwYXN0ZWRUZXh0KTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuXHJcbiAgLy8gb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcclxuICAvLyAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgLy8gICBjb25zdCBjbGlwYm9hcmREYXRhID0gZXZlbnQuY2xpcGJvYXJkRGF0YTtcclxuICAvLyAgIGlmIChjbGlwYm9hcmREYXRhKSB7XHJcbiAgLy8gICAgIC8vIEhhbmRsZSBpbWFnZSBkYXRhXHJcbiAgLy8gICAgIGNvbnN0IGl0ZW1zID0gY2xpcGJvYXJkRGF0YS5pdGVtcztcclxuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgIGlmIChpdGVtc1tpXS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBmaWxlID0gaXRlbXNbaV0uZ2V0QXNGaWxlKCk7XHJcbiAgLy8gICAgICAgICBpZiAoZmlsZSkge1xyXG4gIC8vICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gIC8vICAgICAgICAgICByZWFkZXIub25sb2FkID0gKGU6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGltZ0h0bWwgPSBgPGltZyBzcmM9XCIke2UudGFyZ2V0LnJlc3VsdH1cIiBhbHQ9XCJQYXN0ZWQgSW1hZ2VcIiBzdHlsZT1cIm1heC13aWR0aDogMTAwJTtcIi8+YDtcclxuICAvLyAgICAgICAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGltZ0h0bWwpO1xyXG4gIC8vICAgICAgICAgICB9O1xyXG4gIC8vICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAvLyAgICAgICAgICAgcmV0dXJuOyAvLyBFeGl0IGlmIGFuIGltYWdlIGlzIGhhbmRsZWRcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuXHJcbiAgLy8gICAgIC8vIEhhbmRsZSB0ZXh0IG9yIHRhYmxlIGRhdGFcclxuICAvLyAgICAgY29uc3QgcGFzdGVkVGV4dCA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xyXG4gIC8vICAgICBpZiAodGhpcy5pc1RhYmxlRGF0YShwYXN0ZWRUZXh0KSkge1xyXG4gIC8vICAgICAgIGNvbnN0IGh0bWwgPSB0aGlzLmNvbnZlcnRUZXh0VG9UYWJsZShwYXN0ZWRUZXh0KTtcclxuICAvLyAgICAgICB0aGlzLmluc2VydEh0bWxBdENhcmV0KGh0bWwpO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQocGFzdGVkVGV4dCk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGV2ZW50LmNsaXBib2FyZERhdGE7XHJcbiAgICBpZiAoY2xpcGJvYXJkRGF0YSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsaXBib2FyZERhdGEuaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gY2xpcGJvYXJkRGF0YS5pdGVtc1tpXTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0udHlwZS5zdGFydHNXaXRoKFwiaW1hZ2UvXCIpKSB7XHJcbiAgICAgICAgICAvLyBIYW5kbGUgaW1hZ2UgcGFzdGVcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBpdGVtLmdldEFzRmlsZSgpO1xyXG4gICAgICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBpbWdIdG1sID0gYDxpbWcgc3JjPVwiJHtlLnRhcmdldC5yZXN1bHR9XCIgYWx0PVwiUGFzdGVkIEltYWdlXCIgc3R5bGU9XCJtYXgtd2lkdGg6IDEwMCU7XCIgLz5gO1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoaW1nSHRtbCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwidGV4dC9odG1sXCIpIHtcclxuICAgICAgICAgIC8vIEhhbmRsZSBIVE1MIHBhc3RlXHJcbiAgICAgICAgICAvLyBjb25zdCBodG1sRGF0YSA9IGNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvaHRtbFwiKTtcclxuICAgICAgICAgIGlmICh0aGlzLmlzVGFibGVEYXRhKGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9odG1sJykpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSB0aGlzLmNvbnZlcnRUZXh0VG9UYWJsZShjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvaHRtbCcpKTtcclxuICAgICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChodG1sKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L2h0bWwnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyB0aGlzLmluc2VydEh0bWxBdENhcmV0KGh0bWxEYXRhKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJ0ZXh0L3BsYWluXCIpIHtcclxuICAgICAgICAgIC8vIEhhbmRsZSBwbGFpbiB0ZXh0IHBhc3RlXHJcbiAgICAgICAgICBpZiAodGhpcy5pc1RhYmxlRGF0YShjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKSkpIHtcclxuICAgICAgICAgICAgY29uc3QgaHRtbCA9IHRoaXMuY29udmVydFRleHRUb1RhYmxlKGNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpKTtcclxuICAgICAgICAgICAgdGhpcy5pbnNlcnRIdG1sQXRDYXJldChodG1sKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQoY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gY29uc3QgcGxhaW5UZXh0ID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcclxuICAgICAgICAgIC8vIHRoaXMuaW5zZXJ0SHRtbEF0Q2FyZXQocGxhaW5UZXh0KTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzRXhjZWxEYXRhKGh0bWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGh0bWwuaW5jbHVkZXMoJ3htbG5zOm89XCJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2VcIicpIHx8IFxyXG4gICAgICAgICAgaHRtbC5pbmNsdWRlcygneG1sbnM6eD1cInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOmV4Y2VsXCInKTtcclxuICB9XHJcblxyXG4gIGNvbnZlcnRFeGNlbEh0bWxUb1RhYmxlKGh0bWw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWwsICd0ZXh0L2h0bWwnKTtcclxuICAgIGNvbnN0IHRhYmxlID0gZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XHJcbiAgICByZXR1cm4gdGFibGUgPyB0YWJsZS5vdXRlckhUTUwgOiAnJzsgLy8gRXh0cmFjdCBvbmx5IHRoZSB0YWJsZSBwYXJ0XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICBpc1RhYmxlRGF0YSh0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHJvd3MgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcclxuICAgIHJldHVybiByb3dzLmxlbmd0aCA+IDEgJiYgcm93c1swXS5zcGxpdCgnXFx0JykubGVuZ3RoID4gMTtcclxuICB9XHJcblxyXG4gIC8vIGNvbnZlcnRUZXh0VG9UYWJsZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIC8vICAgY29uc3Qgcm93cyA9IHRleHQuc3BsaXQoJ1xcbicpLmZpbHRlcihyb3cgPT4gcm93LnRyaW0oKSAhPT0gJycpO1xyXG4gIC8vICAgY29uc3QgdGFibGVSb3dzID0gcm93cy5tYXAocm93ID0+IHtcclxuICAvLyAgICAgY29uc3QgY2VsbHMgPSByb3cuc3BsaXQoJ1xcdCcpLm1hcChjZWxsID0+IGA8dGQgY2xhc3M9XCJweC0xIHB5LTFcIiA+JHtjZWxsfTwvdGQ+YCkuam9pbignJyk7XHJcbiAgLy8gICAgIHJldHVybiBgPHRyIGNsYXNzPVwidGFibGUtYm9yZGVyLXRvcFwiIHN0eWxlPVwiYm9yZGVyLXRvcDogJHt0aGlzLnRoZW1lTW9kZVRhYmxlQm9yZGVyVG9wKCl9OyB3aWR0aDogMTAwJSAhaW1wb3J0YW50XCI+JHtjZWxsc308L3RyPmA7XHJcbiAgLy8gICB9KS5qb2luKCcnKTtcclxuICAvLyAgIHJldHVybiBgPHRhYmxlPiR7dGFibGVSb3dzfTwvdGFibGU+YDtcclxuICAvLyB9XHJcblxyXG4gIGNvbnZlcnRUZXh0VG9UYWJsZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgcm93cyA9IHRleHQuc3BsaXQoJ1xcbicpLmZpbHRlcihyb3cgPT4gcm93LnRyaW0oKSAhPT0gJycpO1xyXG4gICAgY29uc3QgY29sdW1uQ291bnQgPSByb3dzWzBdPy5zcGxpdCgnXFx0JykubGVuZ3RoIHx8IDE7IC8vIEdldCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZnJvbSB0aGUgZmlyc3Qgcm93XHJcbiAgICBjb25zdCBjb2x1bW5XaWR0aCA9IDEwMCAvIGNvbHVtbkNvdW50OyAvLyBDYWxjdWxhdGUgY29sdW1uIHdpZHRoXHJcblxyXG4gICAgY29uc3QgdGFibGVSb3dzID0gcm93cy5tYXAoKHJvdywgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgY2VsbHMgPSByb3cuc3BsaXQoJ1xcdCcpLm1hcChjZWxsID0+IGBcclxuICAgICAgICA8dGQgY2xhc3M9XCJweC0xIHB5LTEgdGV4dC10cnVuY2F0ZVwiIFxyXG4gICAgICAgICAgICBzdHlsZT1cIm1heC13aWR0aDogJHtjb2x1bW5XaWR0aH0lOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5cclxuICAgICAgICAgICR7Y2VsbH1cclxuICAgICAgICA8L3RkPmApLmpvaW4oJycpO1xyXG5cclxuICAgICAgLy8gQWRkIGEgYm9yZGVyLXRvcCBmb3IgYWxsIHJvd3MgZXhjZXB0IHRoZSBmaXJzdCBhbmQgYm9yZGVyLWJvdHRvbSBmb3IgdGhlIGxhc3Qgcm93XHJcbiAgICAgIGNvbnN0IGJvcmRlclRvcCA9IGluZGV4ID09PSAwID8gJycgOiBgYm9yZGVyLXRvcDogJHt0aGlzLnRoZW1lTW9kZVRhYmxlQm9yZGVyVG9wKCl9O2A7XHJcbiAgICAgIGNvbnN0IGJvcmRlckJvdHRvbSA9IGluZGV4ID09PSByb3dzLmxlbmd0aCAtIDEgPyBgYm9yZGVyLWJvdHRvbTogJHt0aGlzLnRoZW1lTW9kZVRhYmxlQm9yZGVyVG9wKCl9O2AgOiAnJztcclxuXHJcbiAgICAgIHJldHVybiBgXHJcbiAgICAgICAgPHRyIFxyXG4gICAgICAgICAgc3R5bGU9XCIke2JvcmRlclRvcH0gJHtib3JkZXJCb3R0b219IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7XCI+XHJcbiAgICAgICAgICAke2NlbGxzfVxyXG4gICAgICAgIDwvdHI+YDtcclxuICAgIH0pLmpvaW4oJycpO1xyXG5cclxuICAgIHJldHVybiBgXHJcbiAgICAgIDx0YWJsZSBzdHlsZT1cInRhYmxlLWxheW91dDogZml4ZWQ7IHdpZHRoOiAxMDAlO1wiPiBcclxuICAgICAgICAke3RhYmxlUm93c31cclxuICAgICAgPC90YWJsZT5gO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICBpbnNlcnRIdG1sQXRDYXJldChodG1sOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJhbmdlID0gd2luZG93LmdldFNlbGVjdGlvbigpPy5nZXRSYW5nZUF0KDApO1xyXG4gICAgaWYgKHJhbmdlKSB7XHJcbiAgICAgIHJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7XHJcbiAgICAgIGNvbnN0IHRlbXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgdGVtcERpdi5pbm5lckhUTUwgPSBodG1sO1xyXG4gICAgICBjb25zdCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG4gICAgICBsZXQgbm9kZTtcclxuICAgICAgd2hpbGUgKChub2RlID0gdGVtcERpdi5maXJzdENoaWxkKSkge1xyXG4gICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQobm9kZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmFuZ2UuaW5zZXJ0Tm9kZShmcmFnKTtcclxuICAgICAgcmFuZ2UuY29sbGFwc2UoZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhlbWVNb2RlVGFibGVCb3JkZXJUb3AoKSB7XHJcbiAgICBjb25zdCBjbHJNb2RlID0gZG9jdW1lbnQuYm9keS5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGF5b3V0LWNvbG9yJylcclxuICAgIGlmIChjbHJNb2RlID09ICdkYXJrJykge1xyXG4gICAgICByZXR1cm4gJzFweCBzb2xpZCAjRDBEMEQwOyAhaW1wb3J0YW50J1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcxcHggc29saWQgIzQxNDE0MSAhaW1wb3J0YW50J1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiBcclxuICBwdWJsaWMgb3BlbkZ1bGxzY3JlZW4oKSB7XHJcbiAgICB2YXIgZWxlbTogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0ZXh0RWRpdG9yXCIpO1xyXG4gICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSB0cnVlO1xyXG4gICAgaWYgKGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbigpO1xyXG4gICAgfSBlbHNlIGlmIChlbGVtLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XHJcbiAgICAgIGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcclxuICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCk7XHJcbiAgICB9IGVsc2UgaWYgKGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xyXG4gICAgICBlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3R5bGUgPSB7XHJcbiAgICAgICdtaW4taGVpZ2h0JzogJzkwdmgnLFxyXG4gICAgICAnbWF4LWhlaWdodCc6ICc5MHZoJyxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZUZ1bGxzY3JlZW4oKSB7XHJcbiAgICBpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIHtcclxuICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcclxuICAgICAgdGhpcy5pc0Z1bGxTY3JlZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdHlsZSA9IHtcclxuICAgICAgICAnbWluLWhlaWdodCc6ICc0MDBweCcsXHJcbiAgICAgICAgJ21heC1oZWlnaHQnOiAnNDAwcHgnLFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGNsZWFyVGV4dEVkaXRvcigpIHtcclxuICAgIHRoaXMuZWRpdG9yVGV4dENsZWFyLmVtaXQoKVxyXG4gIH1cclxuXHJcbiAgc2V0dXBIaXN0b3J5KCkge1xyXG4gICAgdGhpcy5zYXZlU3RhdGUoKTtcclxuICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgXHJcbiAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgIGVkaXRvci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHRoaXMub25JbnB1dCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uSW5wdXQoKSB7XHJcbiAgICB0aGlzLnNhdmVTdGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVN0YXRlKCkge1xyXG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIFxyXG4gICAgaWYgKGVkaXRvcikge1xyXG4gICAgICBjb25zdCBlZGl0b3JDb250ZW50ID0gZWRpdG9yLmlubmVySFRNTDtcclxuICAgICAgaWYgKHRoaXMuaGlzdG9yeUluZGV4ID09PSB0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKGVkaXRvckNvbnRlbnQpO1xyXG4gICAgICAgIHRoaXMucmVkb1N0YWNrID0gW107XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5oaXN0b3J5ID0gdGhpcy5oaXN0b3J5LnNsaWNlKDAsIHRoaXMuaGlzdG9yeUluZGV4ICsgMSk7XHJcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goZWRpdG9yQ29udGVudCk7XHJcbiAgICAgICAgdGhpcy5yZWRvU3RhY2sgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmhpc3RvcnlJbmRleCsrO1xyXG4gICAgfVxyXG4gIH1cclxuICB1bmRvKCkge1xyXG4gICAgaWYgKHRoaXMuaGlzdG9yeUluZGV4ID4gMCkge1xyXG4gICAgICB0aGlzLnJlZG9TdGFjay5wdXNoKHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnlJbmRleF0pO1xyXG4gICAgICB0aGlzLmhpc3RvcnlJbmRleC0tO1xyXG4gICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZWRpdG9yJyk7XHJcbiAgXHJcbiAgICAgIGlmIChlZGl0b3IpIHtcclxuICAgICAgICB0aGlzLnNhbml0aXplZENvbnRlbnQgPSB0aGlzLmhpc3RvcnlbdGhpcy5oaXN0b3J5SW5kZXhdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWRvKCkge1xyXG4gICAgaWYgKHRoaXMucmVkb1N0YWNrLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgcmVkb0NvbnRlbnQgPSB0aGlzLnJlZG9TdGFjay5wb3AoKTtcclxuICAgICAgdGhpcy5oaXN0b3J5LnB1c2gocmVkb0NvbnRlbnQhKTtcclxuICAgICAgdGhpcy5oaXN0b3J5SW5kZXgrKztcclxuICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VkaXRvcicpO1xyXG4gIFxyXG4gICAgICBpZiAoZWRpdG9yKSB7XHJcbiAgICAgICAgdGhpcy5zYW5pdGl6ZWRDb250ZW50ID0gcmVkb0NvbnRlbnQhO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuLy8gICBmb3JtYXRUZXh0V2l0aERhdGVzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XHJcbi8vICAgLy8gUmVndWxhciBleHByZXNzaW9uIHRvIGRldGVjdCBZWVlZLU1NLUREIGZvcm1hdHRlZCBkYXRlc1xyXG4vLyAgIGNvbnN0IGRhdGVSZWdleCA9IC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVxcYi9nO1xyXG5cclxuLy8gICAvLyBSZXBsYWNlIGZvdW5kIGRhdGVzIHdpdGggYSBmb3JtYXR0ZWQgdmVyc2lvblxyXG4vLyAgIHJldHVybiB0ZXh0LnJlcGxhY2UoZGF0ZVJlZ2V4LCAoZGF0ZVN0cikgPT4ge1xyXG4vLyAgICAgLy8gQ29udmVydCB0aGUgZGV0ZWN0ZWQgZGF0ZSBzdHJpbmcgaW50byBhIERhdGUgb2JqZWN0XHJcbi8vICAgICBjb25zdCBkYXRlT2JqID0gbmV3IERhdGUoZGF0ZVN0cik7XHJcbiAgICBcclxuLy8gICAgIC8vIEZvcm1hdCB0aGUgZGF0ZSB0byAnTW9udGggRGF5LCBZZWFyJyAoZS5nLiwgT2N0b2JlciAxMCwgMjAyNClcclxuLy8gICAgIHJldHVybiBkYXRlT2JqLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tVVMnLCB7XHJcbi8vICAgICAgIHllYXI6ICdudW1lcmljJyxcclxuLy8gICAgICAgbW9udGg6ICdsb25nJyxcclxuLy8gICAgICAgZGF5OiAnbnVtZXJpYycsXHJcbi8vICAgICB9KTtcclxuLy8gICB9KTtcclxuICAvLyB9XHJcbiAgXHJcbiAgZm9ybWF0VGV4dFdpdGhEYXRlcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZXRlY3QgWVlZWS1NTS1ERCBmb3JtYXR0ZWQgZGF0ZXNcclxuICBjb25zdCBkYXRlUmVnZXggPSAvXFxiXFxkezR9LVxcZHsyfS1cXGR7Mn1cXGIvZztcclxuXHJcbiAgLy8gUmVwbGFjZSBmb3VuZCBkYXRlcyB3aXRoIGEgZm9ybWF0dGVkIHZlcnNpb25cclxuICByZXR1cm4gdGV4dC5yZXBsYWNlKGRhdGVSZWdleCwgKGRhdGVTdHIpID0+IHtcclxuICAgIC8vIENvbnZlcnQgdGhlIGRldGVjdGVkIGRhdGUgc3RyaW5nIGludG8gYSBEYXRlIG9iamVjdFxyXG4gICAgY29uc3QgZGF0ZU9iaiA9IG5ldyBEYXRlKGRhdGVTdHIpO1xyXG5cclxuICAgIC8vIEV4dHJhY3QgZGF5LCBtb250aCwgYW5kIHllYXJcclxuICAgIGNvbnN0IGRheSA9IGRhdGVPYmouZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTsgLy8gRW5zdXJlIGRheSBpcyB0d28gZGlnaXRzXHJcbiAgICBjb25zdCBtb250aCA9IGRhdGVPYmoudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtb250aDogJ3Nob3J0JyB9KTsgLy8gR2V0IGFiYnJldmlhdGVkIG1vbnRoIG5hbWVcclxuICAgIGNvbnN0IHllYXIgPSBkYXRlT2JqLmdldEZ1bGxZZWFyKCk7IC8vIEdldCBmdWxsIHllYXJcclxuXHJcbiAgICAvLyBGb3JtYXQgdGhlIGRhdGUgYXMgJ2RkL21tbS95eXl5J1xyXG4gICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfWA7XHJcbiAgfSk7XHJcbn1cclxuXHJcblxyXG59IiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lciBlbHMtdGV4dC1lZGl0b3IgcHgtMFwiIGlkPVwidGV4dEVkaXRvclwiICNmdWxsc2NyZWVuPVwibmd4RnVsbHNjcmVlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGV4dEVkaXRvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neEZ1bGxzY3JlZW4+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidG9vbGJhck1vZGUgPT09ICdmaXhlZCdcIiBjbGFzcz1cImJ0bi10b29sYmFyIGVscy1idG4tdG9vbGJhciBwLTIgcHktMiBtYi0wXCIgcm9sZT1cInRvb2xiYXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJ0aGVtZU1vZGVCZ0NscigpXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAncG9pbnRlci1ldmVudHMnOiBkaXNhYmxlVG9vbGJhciA/ICdub25lJyA6ICdhdXRvJyxcclxuICAgICdib3JkZXItdG9wLWxlZnQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDogJzIwcHgnLFxyXG4gICAgJ2JvcmRlci10b3AtcmlnaHQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDogJzIwcHgnXHJcbn1cIlxyXG5hcmlhLWxhYmVsPVwiVG9vbGJhciB3aXRoIGJ1dHRvbiBncm91cHNcIlxyXG5zdHlsZT1cImJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDtcIlxyXG4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiSGVhZGVyIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy1mb3JtLXNlbGVjdCBib3JkZXIgZWxzLXRvb2xiYXItZHJvcGRvd24tYnV0dG9uIGRyb3Bkb3duLXRvZ2dsZSB0ZXh0LXN0YXJ0XCIgW3N0eWxlLmJvcmRlci1yYWRpdXNdPVwiJzVweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiaGVhZGVyRHJvcGRvd25cIiBbc3R5bGUuYm9yZGVyXT1cInRoZW1lTW9kZSgpXCIgW3N0eWxlLmNvbG9yXT1cInRoZW1lTW9kZUNscigpXCIgbmdiRHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3tzZWxlY3RlZEZvcm1hdEJsb2NrIHwgdGl0bGVjYXNlfX08L3NwYW4+IDxpIGNsYXNzPVwibWRpIG1kaS1jaGV2cm9uLWRvd24gXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJoZWFkZXJEcm9wZG93blwiIGNsYXNzPVwiZWxzLXRleHQtZm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyXT1cInRoZW1lTW9kZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDE+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgxPkhlYWRpbmcgMTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkhlYWRpbmcgMjwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDM+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkhlYWRpbmcgMzwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDQ+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkhlYWRpbmcgNDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkhlYWRpbmcgNTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDY+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg2PkhlYWRpbmcgNjwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8cD4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5Ob3JtYWw8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkZvbnQgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICA8IS0tIDxzZWxlY3QgY2xhc3M9XCJlbHMtZm9ybS1zZWxlY3QgXCIgc3R5bGU9XCIgZm9udC13ZWlnaHQ6IDcwMCAhaW1wb3J0YW50OyBjb2xvcjogI2ZmZjtib3JkZXI6IDJweCBzb2xpZCAjN0Q2RDZEICFpbXBvcnRhbnQ7XCIgXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRm9udFwiIChjaGFuZ2UpPVwiY2hhbmdlRm9udCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uIGNsYXNzPVwiZWxzLWZvcm0tb3B0aW9uXCIgKm5nRm9yPVwibGV0IGZvbnQgb2YgZm9udHNcIiBbdmFsdWVdPVwiZm9udFwiPnt7IGZvbnQgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwiZHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLWZvcm0tc2VsZWN0IGJvcmRlciBlbHMtdG9vbGJhci1kcm9wZG93bi1idXR0b24gZHJvcGRvd24tdG9nZ2xlIHRleHQtc3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiaGVhZGVyRHJvcGRvd25cIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiIFtzdHlsZS5ib3JkZXJdPVwidGhlbWVNb2RlKClcIiBbc3R5bGUuY29sb3JdPVwidGhlbWVNb2RlQ2xyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwid2lkdGg6IDg1cHg7IGZvbnQtd2VpZ2h0OiA3MDAgIWltcG9ydGFudDtcIiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIj57e3NlbGVjdGVkRm9udCB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlY2FzZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1jaGV2cm9uLWRvd24gXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJoZWFkZXJEcm9wZG93blwiIGNsYXNzPVwiZWxzLXRleHQtZm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyXT1cInRoZW1lTW9kZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAqbmdGb3I9XCJsZXQgZm9udCBvZiBmb250c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VGb250KGZvbnQpXCIgW3N0eWxlLmNvbG9yXT1cInRoZW1lTW9kZUNscigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZvbnQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInB5LTBcIiAgc3R5bGU9XCJoZWlnaHQ6IGZpdC1jb250ZW50O1wiIFtzdHlsZS5jb2xvcl09XCJ0aGVtZU1vZGVDbHIoKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbWUtMiBtci0yIFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzQm9sZEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnYm9sZCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1ib2xkXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW2NsYXNzLmFjdGl2ZV09XCJpc0l0YWxpY0FjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnaXRhbGljJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWl0YWxpY1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIFtjbGFzcy5hY3RpdmVdPVwiaXNVbmRlcmxpbmVBY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC11bmRlcmxpbmVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzU3RyaWtldGhyb3VnaEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnc3RyaWtldGhyb3VnaCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdHJpa2V0aHJvdWdoLXZhcmlhbnRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBpZD1cInRleHRDb2xvclBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFRleHRDb2xvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ3RleHRDb2xvclBpY2tlcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItdGV4dCBpY29uLXdpdGgtdW5kZXJsaW5lXCIgW3N0eWxlLmNvbG9yXT1cInNlbGVjdGVkVGV4dENvbG9yXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkJhY2tncm91bmQgQ29sb3JcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW3N0eWxlLmNvbG9yXT1cImJhY2tncm91bmRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ2JnQ29sb3JQaWNrZXInKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktYWxwaGEtYS1ib3hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGlkPVwiYmdDb2xvclBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldEJhY2tncm91bmRDb2xvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2ZXJ0aWNhbC1saW5lIG1zLTIgYm9yZGVyXCIgW3N0eWxlLmJvcmRlci1sZWZ0XT1cInRoZW1lTW9kZUNsclZlcnRpY2FsTGluZSgpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdpbnNlcnRPcmRlcmVkTGlzdCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LW51bWJlcmVkXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnaW5zZXJ0VW5vcmRlcmVkTGlzdCcpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LWJ1bGxldGVkXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cInFsLWFsaWduXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiAgYXJyb3ctbm9uZSB0ZXh0LXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZHJvcGRvd25CYXNpYzFcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBuZ2JEcm9wZG93blRvZ2dsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1sZWZ0IFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bkJhc2ljMVwiIHN0eWxlPVwid2lkdGg6IDNweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUxlZnQnKVwiPjxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUNlbnRlcicpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1jZW50ZXJcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24gdGV4dC1kYXJrXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2p1c3RpZnlSaWdodCcpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1hbGlnbi1yaWdodFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiB0ZXh0LWRhcmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUZ1bGwnKVwiPjxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tanVzdGlmeVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZlcnRpY2FsLWxpbmUgbXMtMiBib3JkZXJcIiBbc3R5bGUuYm9yZGVyLWxlZnRdPVwidGhlbWVNb2RlQ2xyVmVydGljYWxMaW5lKClcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIFtjbGFzcy5hY3RpdmVdPVwiaXNTdWJzY3JpcHRBY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N1YnNjcmlwdCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdWJzY3JpcHRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzU3VwZXJzY3JpcHRBY3RpdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N1cGVyc2NyaXB0JylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXN1cGVyc2NyaXB0XCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiYWRkTGluaygpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWxpbmstdmFyaWFudFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiaW5zZXJ0c0ltYWdlKClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktaW1hZ2VcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImltYWdlSW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgKGNoYW5nZSk9XCJoYW5kbGVJbWFnZVVwbG9hZCgkZXZlbnQpXCIgYWNjZXB0PVwiaW1hZ2UvKlwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJhZGRUYWJsZSgpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLXRhYmxlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkUm93KClcIj48aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtcm93LXBsdXMtYWZ0ZXJcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVSb3coKVwiPjxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ29sdW1uKClcIj48aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtY29sdW1uLXBsdXMtYWZ0ZXJcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVDb2x1bW4oKVwiPjxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1jb2x1bW4tcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICBcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcclxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBcclxuICAgICAgICAgICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgXHJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidEhlYWRCZ0NvbG9yXCIgXHJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKCd0SGVhZGJnQ29sb3JQaWNrZXInKVwiIFxyXG4gICAgICAgID4gXHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtZWRpdFwiPjwvaT4gXHJcbiAgICAgICAgPC9idXR0b24+IFxyXG4gICAgICAgIDxpbnB1dCBcclxuICAgICAgICAgIHR5cGU9XCJjb2xvclwiIFxyXG4gICAgICAgICAgaWQ9XCJ0SGVhZGJnQ29sb3JQaWNrZXJcIiBcclxuICAgICAgICAgIHN0eWxlPVwiIFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7IFxyXG4gICAgICAgICAgICB0b3A6IDEwMCU7IFxyXG4gICAgICAgICAgICBsZWZ0OiAwOyBcclxuICAgICAgICAgICAgei1pbmRleDogMTAwOyBcclxuICAgICAgICAgICAgb3BhY2l0eTogMDsgXHJcbiAgICAgICAgICBcIiBcclxuICAgICAgICAgIChjaGFuZ2UpPVwic2V0VGhlYWRCZ0NvbG9yKCRldmVudClcIiBcclxuICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwidW5kbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXVuZG9cIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwicmVkbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLXJlZG9cIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uICpuZ0lmPVwic2VsZWN0ZWRJbWFnZVwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24tMlwiIChjbGljayk9XCJlZGl0SW1hZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtcIj5FZGl0IEltYWdlPC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImNsZWFyVGV4dEVkaXRvcigpXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIiB3aWR0aDogZml0LWNvbnRlbnQgIWltcG9ydGFudDtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktY2xvc2UtY2lyY2xlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cInRvZ2dsZUZ1bGxzY3JlZW4xKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiSXNPcGVuOyBlbHNlIGZ1bGxzY3JlZW5JY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mdWxsc2NyZWVuLWV4aXRcIj48L2k+IDwhLS0gQ29sbGFwc2UgSWNvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Z1bGxzY3JlZW5JY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZnVsbHNjcmVlblwiPjwvaT4gPCEtLSBFeHBhbmQgSWNvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidG9vbGJhck1vZGUgPT09ICdidWJibGUnXCIgY2xhc3M9XCJidWJibGUtdG9vbGJhciBib3JkZXIgcC0yXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7J3RvcC5weCc6IHRvb2xiYXJUb3AsICdsZWZ0LnB4JzogdG9vbGJhckxlZnQsICdkaXNwbGF5Jzogc2hvd1Rvb2xiYXIgPyAnYmxvY2snIDogJ25vbmUnfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cFwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJGb250IE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImVscy1mb3JtLXNlbGVjdFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRGb250XCIgKGNoYW5nZSk9XCJjaGFuZ2VGb250KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGZvbnQgb2YgZm9udHNcIiBbdmFsdWVdPVwiZm9udFwiPnt7IGZvbnQgfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzQm9sZEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdib2xkJylcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYm9sZFwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzSXRhbGljQWN0aXZlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ2l0YWxpYycpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWl0YWxpY1wiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzVW5kZXJsaW5lQWN0aXZlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3VuZGVybGluZScpXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXVuZGVybGluZVwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbY2xhc3MuYWN0aXZlXT1cImlzU3RyaWtldGhyb3VnaEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdzdHJpa2V0aHJvdWdoJylcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtc3RyaWtldGhyb3VnaC12YXJpYW50XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Jsb2NrcXVvdGUnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtcXVvdGUtY2xvc2VcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImluc2VydENvZGVCbG9jaygpXCI+PGkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1jb2RlLXRhZ3NcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2luc2VydE9yZGVyZWRMaXN0JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtbGlzdC1udW1iZXJlZFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1saXN0LWJ1bGxldGVkXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkNvbG9yIEZvcm1hdHRpbmdcIj4gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwicWwtYWxpZ25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IGFycm93LW5vbmUgdGV4dC1zZWNvbmRhcnlcIiBpZD1cImRyb3Bkb3duQmFzaWMxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgbmdiRHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItZmlsbFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bkJhc2ljMVwiIHN0eWxlPVwid2lkdGg6IDMwMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29sb3Itc2tldGNoIGNvbG9yPVwiI2ZmZlwiIChvbkNoYW5nZUNvbXBsZXRlKT1cInNldFRleHRDb2xvcigkZXZlbnQpXCI+PC9jb2xvci1za2V0Y2g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiBjdXN0b20tY29sb3ItdHJpZ2dlclwiIG5neC1jb2xvcnMtdHJpZ2dlciBbKG5nTW9kZWwpXT1cImNvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJsb2dFdmVudCgkZXZlbnQsICduZ01vZGVsQ2hhbmdlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwibG9nRXZlbnQoJGV2ZW50LCAnY2hhbmdlJylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJsb2dFdmVudCgkZXZlbnQsICdpbnB1dCcpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1jb2xvci10ZXh0IGljb24td2l0aC11bmRlcmxpbmVcIiBbc3R5bGUuY29sb3JdPVwiY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwie2NvbG9yOiBjb2xvcn1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1jb2xvcnMgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiID48L25neC1jb2xvcnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgaWQ9XCJ0ZXh0Q29sb3JQaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0VGV4dENvbG9yKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuQ29sb3JQaWNrZXIoJ3RleHRDb2xvclBpY2tlcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1jb2xvci10ZXh0IGljb24td2l0aC11bmRlcmxpbmVcIiBbc3R5bGUuY29sb3JdPVwic2VsZWN0ZWRUZXh0Q29sb3JcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiQmFja2dyb3VuZCBDb2xvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGlkPVwiYmdDb2xvclBpY2tlclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAoY2hhbmdlKT1cInNldEJhY2tncm91bmRDb2xvcigkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKCdiZ0NvbG9yUGlja2VyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktYWxwaGEtYS1ib3hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkJhY2tncm91bmQgQ29sb3JcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTtcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiBbc3R5bGUuY29sb3JdPVwiYmFja2dyb3VuZENvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkNvbG9yUGlja2VyKCdiZ0NvbG9yUGlja2VyJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktYWxwaGEtYS1ib3hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGlucHV0IHN0eWxlPVwid2lkdGg6IDBweCAhaW1wb3J0YW50O1wiIGlkPVwiYmdDb2xvclBpY2tlclwiIFtjcFByZXNldENvbG9yc109XCJbJyNmZmYnLCAnIzAwMCcsICcjMjg4OWU5JywgJyNlOTIwZTknLCAnI2ZmZjUwMCcsICdyZ2IoMjM2LDY0LDY0KSddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGNvbG9yUGlja2VyKV09XCJjb2xvclwiIChjaGFuZ2UpPVwic2V0QmFja2dyb3VuZENvbG9yKCRldmVudClcIiAvPiAtLT5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBpZD1cImJnQ29sb3JQaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB0b3A6IDEwMCU7IGxlZnQ6IDA7IHotaW5kZXg6IDEwMDsgb3BhY2l0eTogMDtcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0QmFja2dyb3VuZENvbG9yKCRldmVudClcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgPCEtLSA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJIZWFkZXIgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uIGRyb3Bkb3duLXRvZ2dsZVwiIHR5cGU9XCJidXR0b25cIiBpZD1cImhlYWRlckRyb3Bkb3duXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTFcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgYXJpYS1sYWJlbGxlZGJ5PVwiaGVhZGVyRHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnZm9ybWF0QmxvY2snLCAnPGgxPicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTFcIj48L2k+IEhlYWRpbmcgMTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1oZWFkZXItMlwiPjwvaT4gSGVhZGluZyAyPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Zvcm1hdEJsb2NrJywgJzxoMz4nKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWhlYWRlci0zXCI+PC9pPiBIZWFkaW5nIDM8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnZm9ybWF0QmxvY2snLCAnPGg0PicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtaGVhZGVyLTRcIj48L2k+IEhlYWRpbmcgNDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1oZWFkZXItNVwiPjwvaT4gSGVhZGluZyA1PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ2Zvcm1hdEJsb2NrJywgJzxoNj4nKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWhlYWRlci02XCI+PC9pPiBIZWFkaW5nIDY8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiSGVhZGVyIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBuZ2JEcm9wZG93biBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1kcm9wZG93bi1idXR0b24gZHJvcGRvd24tdG9nZ2xlXCIgaWQ9XCJoZWFkZXJEcm9wZG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmdiRHJvcGRvd25Ub2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJ3aWR0aDogODVweDtcIj57e3NlbGVjdGVkRm9ybWF0QmxvY2sgfCB0aXRsZWNhc2V9fTwvc3Bhbj4gPGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWNoZXZyb24tZG93biB0ZXh0LWRhcmtcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImhlYWRlckRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDE+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgxPkhlYWRpbmcgMTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDI+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkhlYWRpbmcgMjwvaDI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDM+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkhlYWRpbmcgMzwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDQ+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkhlYWRpbmcgNDwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDU+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg1PkhlYWRpbmcgNTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8aDY+JylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGg2PkhlYWRpbmcgNjwvaDY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gcGItMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdmb3JtYXRCbG9jaycsICc8cD4nKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5Ob3JtYWw8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ3N1cGVyc2NyaXB0JylcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LXN1cGVyc2NyaXB0XCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJmb3JtYXQoJ3N1YnNjcmlwdCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdWJzY3JpcHRcIj48L2k+PC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW2NsYXNzLmFjdGl2ZV09XCJpc1N1YnNjcmlwdEFjdGl2ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybWF0KCdzdWJzY3JpcHQnKVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1zdWJzY3JpcHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgW2NsYXNzLmFjdGl2ZV09XCJpc1N1cGVyc2NyaXB0QWN0aXZlXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmb3JtYXQoJ3N1cGVyc2NyaXB0JylcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtc3VwZXJzY3JpcHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZWxzLWJ1dHRvbi1ncm91cCBtci0yXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlRleHQgRm9ybWF0dGluZ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duIGNsYXNzPVwicWwtYWxpZ25cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24gYXJyb3ctbm9uZSB0ZXh0LXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJkcm9wZG93bkJhc2ljMVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIG5nYkRyb3Bkb3duVG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdCBcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCIgc3R5bGU9XCJ3aWR0aDogM3B4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5TGVmdCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tbGVmdFwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCIgKGNsaWNrKT1cImZvcm1hdCgnanVzdGlmeUNlbnRlcicpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tY2VudGVyXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5UmlnaHQnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktZm9ybWF0LWFsaWduLXJpZ2h0XCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdqdXN0aWZ5RnVsbCcpXCI+PGlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtYWxpZ24tanVzdGlmeVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGV4dCBGb3JtYXR0aW5nXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiZm9ybWF0KCdyZW1vdmVGb3JtYXQnKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLWZvcm1hdC1jbGVhclwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUZXh0IEZvcm1hdHRpbmdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIChjbGljayk9XCJhZGRMaW5rKClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1saW5rLXZhcmlhbnRcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiaW5zZXJ0c0ltYWdlKClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1pbWFnZVwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJpbWFnZUlucHV0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIChjaGFuZ2UpPVwiaGFuZGxlSW1hZ2VVcGxvYWQoJGV2ZW50KVwiIGFjY2VwdD1cImltYWdlLypcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGVscy1idXR0b24tZ3JvdXAgbXItMlwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJUYWJsZSBPcHRpb25zXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiYWRkVGFibGUoKVwiPjxpXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLXRhYmxlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIiAoY2xpY2spPVwiYWRkUm93KClcIj48aVxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcGx1cy1hZnRlclwiPjwvaT48L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzVGFibGVTZWxlY3RlZFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4td2hpdGUgZWxzLXRvb2xiYXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVSb3coKVwiPjxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1yb3ctcmVtb3ZlXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZENvbHVtbigpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1wbHVzLWFmdGVyXCI+PC9pPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUNvbHVtbigpXCI+PGkgY2xhc3M9XCJtZGkgbWRpLXRhYmxlLWNvbHVtbi1yZW1vdmVcIj48L2k+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwIG1yLTJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiVGFibGUgT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2VsZWN0ZWRJbWFnZVwiIGNsYXNzPVwiYnRuIGJ0bi13aGl0ZSBlbHMtdG9vbGJhci1idXR0b24tMlwiIChjbGljayk9XCJlZGl0SW1hZ2UoKVwiXHJcbiAgICAgICAgICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTtcIj5FZGl0IEltYWdlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvbiBjdXN0b20tY29sb3ItdHJpZ2dlclwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS1mb3JtYXQtY29sb3ItdGV4dCBpY29uLXdpdGgtdW5kZXJsaW5lXCIgW3N0eWxlLmNvbG9yXT1cImNvbG9yXCI+PC9pPlxyXG4gICAgICAgIDxuZ3gtY29sb3JzIFsobmdNb2RlbCldPVwiY29sb3JcIiAoY2hhbmdlKT1cImNvbG9yQ2hhbmdlZCgkZXZlbnQpXCI+PC9uZ3gtY29sb3JzPlxyXG4gICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBlbHMtYnV0dG9uLWdyb3VwXCIgbmdiRHJvcGRvd24gYXJpYS1sYWJlbD1cIlRhYmxlIE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXdoaXRlIGVscy10b29sYmFyLWJ1dHRvblwiIG5nYkRyb3Bkb3duVG9nZ2xlICAoY2xpY2spPVwiYWRkVGFibGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51ICpuZ0lmPVwiaXNUYWJsZVNlbGVjdGVkIHx8IHRhYmxlQWRkZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJhZGRSb3coKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtcm93LXBsdXMtYWZ0ZXJcIj48L2k+IEFkZCBSb3dcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIChjbGljayk9XCJkZWxldGVSb3coKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cIm1kaSBtZGktdGFibGUtcm93LXJlbW92ZVwiPjwvaT4gRGVsZXRlIFJvd1xyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cImFkZENvbHVtbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1jb2x1bW4tcGx1cy1hZnRlclwiPjwvaT4gQWRkIENvbHVtblxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgKGNsaWNrKT1cImRlbGV0ZUNvbHVtbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibWRpIG1kaS10YWJsZS1jb2x1bW4tcmVtb3ZlXCI+PC9pPiBEZWxldGUgQ29sdW1uXHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidGFibGVXaWR0aFwiPlRhYmxlIFdpZHRoPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cInRhYmxlV2lkdGhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIChjaGFuZ2UpPVwiYWRqdXN0VGFibGVXaWR0aCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiV2lkdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VsbFdpZHRoXCI+Q2VsbCBXaWR0aDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJjZWxsV2lkdGhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIChjaGFuZ2UpPVwiYWRqdXN0Q2VsbFdpZHRoKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJXaWR0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjZWxsSGVpZ2h0XCI+Q2VsbCBIZWlnaHQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiY2VsbEhlaWdodFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgKGNoYW5nZSk9XCJhZGp1c3RDZWxsSGVpZ2h0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJIZWlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS0gPGRpdiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCIgaWQ9XCJlZGl0b3JcIiBjbGFzcz1cInAtMyBjdXN0b20tc2Nyb2xsYmFyIG5vbi1mb2N1c1wiICNlZGl0b3JcclxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDIwcHggIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMjBweCAhaW1wb3J0YW50O1wiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInRoZW1lTW9kZUJnQ2xyKClcIiBbc3R5bGUuYm9yZGVyLXRvcF09XCJ0aGVtZU1vZGVCb3JkZXJUb3AoKVwiXHJcbiAgICAgICAgW25nU3R5bGVdPVwieydmb250LWZhbWlseSc6IHNlbGVjdGVkRm9udCwgJ2ZvbnQtc2l6ZSc6IHNlbGVjdGVkRm9udFNpemUgKyAncHgnfVwiIFtzdHlsZV09XCJzdHlsZVwiXHJcbiAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHRdPVwiSXNPcGVuID8gJzg1dmggIWltcG9ydGFudCcgOiAgJzQwNXB4ICFpbXBvcnRhbnQnXCJcclxuICAgICAgICAoaW5wdXQpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCIgcGxhY2Vob2xkZXI9XCJJbnNlcnQgdGV4dCBoZXJlIC4uLlwiIHJlYWRvbmx5IChtb3VzZXVwKT1cIm9uVGV4dFNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICBbaW5uZXJIVE1MXT1cInNhbml0aXplZENvbnRlbnRcIiAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCIgKGZvY3VzKT1cIm9uRm9jdXMoKVwiIChibHVyKT1cIm9uQmx1cigpXCJcclxuICAgICAgICAoY2xpY2spPVwiY2hlY2tUYWJsZVNlbGVjdGlvbigkZXZlbnQpXCI+XHJcbiAgICA8L2Rpdj4gLS0+XHJcbiAgICA8IS0tIDxkaXYgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiIGlkPVwiZWRpdG9yXCIgY2xhc3M9XCJwLTMgY3VzdG9tLXNjcm9sbGJhciBub24tZm9jdXMgb3ZlcmZsb3ctYXV0b1wiICNlZGl0b3JcclxuICAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDtcclxuICAgICAgICAgICAgICAgXCIgW3N0eWxlLmJhY2tncm91bmRdPVwidGhlbWVNb2RlQmdDbHIoKVwiXHJcbiAgICAgICAgW3N0eWxlLmJvcmRlci10b3BdPVwidGhlbWVNb2RlQm9yZGVyVG9wKClcIlxyXG4gICAgICAgIFxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnZm9udC1mYW1pbHknOiBzZWxlY3RlZEZvbnQsICdmb250LXNpemUnOiBzZWxlY3RlZEZvbnRTaXplICsgJ3B4JyxcclxuICAgICAgICAgICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyc6IGlzT3BlbiA/ICcwJyA6JzIwcHgnLFxyXG4gICAgICAgICAgICdib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyc6IGlzT3BlbiA/ICcwJyA6JzIwcHgnXHJcbiAgICAgICAgfVwiXHJcbiAgICAgICAgW3N0eWxlLm1pbi1oZWlnaHRdPVwiSXNPcGVuID8gJzkzdmgnIDogJzQwNXB4J1wiIChpbnB1dCk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudClcIiBwbGFjZWhvbGRlcj1cIkluc2VydCB0ZXh0IGhlcmUgLi4uXCJcclxuICAgICAgICByZWFkb25seSAobW91c2V1cCk9XCJvblRleHRTZWxlY3QoJGV2ZW50KVwiIFtpbm5lckhUTUxdPVwic2FuaXRpemVkQ29udGVudFwiIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIlxyXG4gICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIiAoYmx1cik9XCJvbkJsdXIoKVwiIChjbGljayk9XCJjaGVja1RhYmxlU2VsZWN0aW9uKCRldmVudClcIj5cclxuICAgIDwvZGl2PiAtLT5cclxuICAgIDxkaXYgW2F0dHIuY29udGVudGVkaXRhYmxlXT1cImNvbnRlbnRFZGl0YWJsZVwiIGlkPVwiZWRpdG9yXCIgY2xhc3M9XCJwLTMgY3VzdG9tLXNjcm9sbGJhciBub24tZm9jdXMgb3ZlcmZsb3ctYXV0b1wiICNlZGl0b3JcclxuICAgICAgICBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50OyBvdmVyZmxvdzogYXV0bztcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJ0aGVtZU1vZGVCZ0NscigpXCJcclxuICAgICAgICBbc3R5bGUuYm9yZGVyLXRvcF09XCJ0aGVtZU1vZGVCb3JkZXJUb3AoKVwiIFtuZ1N0eWxlXT1cIntcclxuICAgICAgICAgICAgICAgICdmb250LWZhbWlseSc6IHNlbGVjdGVkRm9udCwgXHJcbiAgICAgICAgICAgICAgICAnZm9udC1zaXplJzogc2VsZWN0ZWRGb250U2l6ZSArICdweCcsXHJcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyc6IElzT3BlbiA/ICcwJyA6JzIwcHgnLFxyXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzJzogSXNPcGVuID8gJzAnIDonMjBweCcsXHJcbiAgICAgICAgICAgICAgICAnbWluLWhlaWdodCc6IElzT3BlbiA/ICc5M3ZoJyA6ICc0MDVweCcsXHJcbiAgICAgICAgICAgICAgICAnbWF4LWhlaWdodCc6IElzT3BlbiA/ICc5M3ZoJyA6ICc0MDVweCdcclxuICAgICAgICAgICAgfVwiIHBsYWNlaG9sZGVyPVwiSW5zZXJ0IHRleHQgaGVyZSAuLi5cIiByZWFkb25seSAobW91c2V1cCk9XCJvblRleHRTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgKGlucHV0KT1cIm9uTW9kZWxDaGFuZ2UoJGV2ZW50KVwiIFtpbm5lckhUTUxdPVwic2FuaXRpemVkQ29udGVudFwiIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIiAoZm9jdXMpPVwib25Gb2N1cygpXCJcclxuICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiIChjbGljayk9XCJjaGVja1RhYmxlU2VsZWN0aW9uKCRldmVudClcIiAoa2V5ZG93bik9XCJoYW5kbGVUYWJLZXkoJGV2ZW50KVwiPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPHRhYmxlICpuZ0lmPVwicGFyc2VkVGFibGVcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgaGVhZGVyIG9mIHBhcnNlZFRhYmxlLmhlYWRlcnNcIj57eyBoZWFkZXIgfX08L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiBwYXJzZWRUYWJsZS5yb3dzXCI+XHJcbiAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93XCI+e3sgY2VsbCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90Ym9keT5cclxuICAgIDwvdGFibGU+XHJcblxyXG48L2Rpdj4iXX0=