@rangertechnologies/ngnxt 2.1.244 → 2.1.245

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.
Files changed (28) hide show
  1. package/esm2022/environments/version.mjs +2 -2
  2. package/esm2022/lib/components/button/nxt-button.component.mjs +5 -15
  3. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +11 -1
  4. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +8 -1
  5. package/esm2022/lib/components/datatable/datatable.component.mjs +44 -43
  6. package/esm2022/lib/components/nxt-input/nxt-input.component.mjs +26 -9
  7. package/esm2022/lib/components/pagination/pagination.component.mjs +10 -6
  8. package/esm2022/lib/pages/builder/properties/common-fields.constants.mjs +5 -5
  9. package/esm2022/lib/pages/builder/properties/properties.component.mjs +6 -6
  10. package/esm2022/lib/pipe/button-styles.pipe.mjs +26 -0
  11. package/esm2022/lib/pipe/custom-translate.pipe.mjs +10 -7
  12. package/esm2022/lib/pipe/get-value.pipe.mjs +2 -1
  13. package/esm2022/lib/pipe/question-by-row.pipe.mjs +51 -0
  14. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +2 -1
  15. package/fesm2022/rangertechnologies-ngnxt.mjs +190 -85
  16. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -1
  17. package/lib/components/button/nxt-button.component.d.ts +0 -3
  18. package/lib/components/datatable/datatable.component.d.ts +1 -2
  19. package/lib/components/nxt-input/nxt-input.component.d.ts +7 -3
  20. package/lib/components/pagination/pagination.component.d.ts +3 -2
  21. package/lib/pages/builder/properties/common-fields.constants.d.ts +29 -0
  22. package/lib/pages/builder/properties/properties.component.d.ts +32 -0
  23. package/lib/pipe/button-styles.pipe.d.ts +9 -0
  24. package/lib/pipe/custom-translate.pipe.d.ts +1 -0
  25. package/lib/pipe/question-by-row.pipe.d.ts +9 -0
  26. package/package.json +1 -1
  27. package/rangertechnologies-ngnxt-2.1.245.tgz +0 -0
  28. package/rangertechnologies-ngnxt-2.1.244.tgz +0 -0
@@ -17,6 +17,7 @@ import { CustomDropdownComponent } from '../custom-dropdown/custom-dropdown.comp
17
17
  import { CustomRadioComponent } from '../custom-radio/custom-radio.component';
18
18
  import { NxtFileUploadComponent } from '../file-upload/file-upload.component';
19
19
  import { NxtInput } from '../nxt-input/nxt-input.component';
20
+ import { QuestionByRowPipe } from '../../pipe/question-by-row.pipe';
20
21
  import * as i0 from "@angular/core";
21
22
  import * as i1 from "../../services/translation.service";
22
23
  import * as i2 from "../../services/data.service";
@@ -169,6 +170,7 @@ export class NxtDatatable {
169
170
  currentColumn = null;
170
171
  startX = 0;
171
172
  startWidth = 0;
173
+ resizeFrameId = null;
172
174
  constructor(cdRef, translationService, renderer, dataService, changeService) {
173
175
  this.cdRef = cdRef;
174
176
  this.translationService = translationService;
@@ -706,10 +708,7 @@ export class NxtDatatable {
706
708
  resizeHandles.forEach((handle) => {
707
709
  handle.addEventListener('mousedown', this.onResizeStart.bind(this));
708
710
  });
709
- // SKS22JUL25 Add global mouse events
710
- document.addEventListener('mousemove', this.onResizeMove.bind(this));
711
- document.addEventListener('mouseup', this.onResizeEnd.bind(this));
712
- }, 100);
711
+ }, 0);
713
712
  }
714
713
  onResizeStart(event) {
715
714
  event.preventDefault();
@@ -731,27 +730,38 @@ export class NxtDatatable {
731
730
  // SKS22JUL25 Add cursor style to body
732
731
  document.body.style.cursor = 'col-resize';
733
732
  document.body.style.userSelect = 'none';
733
+ this.isResizing = true;
734
+ document.addEventListener('mousemove', this.onResizeMove);
735
+ document.addEventListener('mouseup', this.onResizeEnd);
734
736
  }
735
- onResizeMove(event) {
737
+ onResizeMove = (event) => {
736
738
  if (!this.isResizing || !this.currentColumn)
737
739
  return;
738
- const deltaX = event.clientX - this.startX;
739
- const newWidth = Math.max(50, this.startWidth + deltaX); // Minimum width of 50px
740
- // SKS22JUL25 Update the column width
741
- this.currentColumn.width = newWidth + 'px';
742
- // SKS22JUL25 Apply the new width to all cells in this column
743
- this.updateColumnWidth(this.currentColumn, newWidth);
744
- }
745
- onResizeEnd(event) {
740
+ if (this.resizeFrameId) {
741
+ cancelAnimationFrame(this.resizeFrameId);
742
+ }
743
+ this.resizeFrameId = requestAnimationFrame(() => {
744
+ const deltaX = event.clientX - this.startX;
745
+ const newWidth = Math.max(50, this.startWidth + deltaX);
746
+ // SKS22JUL25 Update the column width
747
+ this.currentColumn.width = newWidth + 'px';
748
+ this.updateColumnWidth(this.currentColumn, newWidth);
749
+ });
750
+ };
751
+ onResizeEnd = (_event) => {
746
752
  if (!this.isResizing)
747
753
  return;
754
+ console.log("tabel changes");
748
755
  this.isResizing = false;
749
756
  this.currentColumn = null;
750
757
  // SKS22JUL25 Remove cursor style from body
751
758
  document.body.style.cursor = '';
752
759
  document.body.style.userSelect = '';
753
- }
760
+ document.removeEventListener('mousemove', this.onResizeMove);
761
+ document.removeEventListener('mouseup', this.onResizeEnd);
762
+ };
754
763
  updateColumnWidth(column, newWidth) {
764
+ console.log("tabel changes");
755
765
  // SKS22JUL25 Use Angular's Renderer2 for safe DOM manipulation
756
766
  const columnIndex = this.currentColumns.findIndex(col => col.uniqueIdentifier === column.uniqueIdentifier);
757
767
  if (columnIndex === -1)
@@ -761,18 +771,24 @@ export class NxtDatatable {
761
771
  // Update header cell
762
772
  const headerCell = document.querySelector(`.table-header .table-row .table-cell:nth-child(${adjustedIndex + 1})`);
763
773
  if (headerCell) {
764
- headerCell.style.width = newWidth + 'px';
774
+ this.renderer.setStyle(headerCell, 'width', newWidth + 'px');
765
775
  }
766
776
  // SKS22JUL25 Update all body cells in this column
767
- const bodyCells = document.querySelectorAll(`.table-body .table-row .table-cell:nth-child(${adjustedIndex + 1})`);
768
- bodyCells.forEach(cell => {
769
- cell.style.width = newWidth + 'px';
770
- });
777
+ const body = document.querySelector('.table-body');
778
+ if (body) {
779
+ const rows = body.querySelectorAll('.table-row');
780
+ rows.forEach(row => {
781
+ const cell = row.children[adjustedIndex];
782
+ if (cell) {
783
+ this.renderer.setStyle(cell, 'width', newWidth + 'px');
784
+ }
785
+ });
786
+ }
771
787
  }
772
788
  ngOnDestroy() {
773
- // SKS22JUL25 Clean up event listeners
774
- document.removeEventListener('mousemove', this.onResizeMove.bind(this));
775
- document.removeEventListener('mouseup', this.onResizeEnd.bind(this));
789
+ console.log("tabel changes");
790
+ document.removeEventListener('mousemove', this.onResizeMove);
791
+ document.removeEventListener('mouseup', this.onResizeEnd);
776
792
  }
777
793
  flattenRow(row) {
778
794
  const flattened = this.currentColumns.reduce((acc, col) => {
@@ -1426,6 +1442,7 @@ export class NxtDatatable {
1426
1442
  this.valueChange.emit(updatedTableData);
1427
1443
  }
1428
1444
  updateEdit(index, value, element, column) {
1445
+ console.log("tabel changes");
1429
1446
  const updatedElement = this.updateValue(element, column, value);
1430
1447
  this.dataSource.data[index] = updatedElement;
1431
1448
  this.data = this.dataSource.data;
@@ -1511,9 +1528,6 @@ export class NxtDatatable {
1511
1528
  this.NxtTableFilterEmit.emit(event);
1512
1529
  }
1513
1530
  }
1514
- get isReadOnlyArray() {
1515
- return Array.isArray(this.columns) && this.columns.some(col => col.readOnly);
1516
- }
1517
1531
  async onImageEdit(ques) {
1518
1532
  this.isImageEdit = true;
1519
1533
  this.selectedImageElement = ques;
@@ -1575,22 +1589,8 @@ export class NxtDatatable {
1575
1589
  getDropDown(event) {
1576
1590
  this.hadleDropDownDependent.emit(event);
1577
1591
  }
1578
- // SKS22JUL25 Modified getUpdatedQuestion with caching
1579
- getUpdatedQuestion(column, element, rowIndex) {
1580
- // Fallback to rowIndex if element.id is missing
1581
- const rowId = element?.id ?? rowIndex;
1582
- const key = `${rowId}-${column ?? 'unknown'}`;
1583
- if (!this.questionsCache.has(key)) {
1584
- const question = {
1585
- ...column.question,
1586
- input: this.getObjValue(element, column)
1587
- };
1588
- this.questionsCache.set(key, question);
1589
- }
1590
- return this.questionsCache.get(key);
1591
- }
1592
1592
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtDatatable, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TranslationService }, { token: i0.Renderer2 }, { token: i2.DataService }, { token: i3.ChangeService }], target: i0.ɵɵFactoryTarget.Component });
1593
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: NxtDatatable, isStandalone: true, selector: "nxt-datatable", inputs: { data: "data", tableFilterData: "tableFilterData", columns: "columns", withCheckBox: "withCheckBox", searchBar: "searchBar", tableSaveButton: "tableSaveButton", stickyColumn: "stickyColumn", tableWidth: "tableWidth", actionColumHeader: "actionColumHeader", actionButton: "actionButton", title: "title", isButtons: "isButtons", buttonArray: "buttonArray", tableId: "tableId", isEditRow: "isEditRow", isDeleteRow: "isDeleteRow", addInlineRecord: "addInlineRecord", searchConfigs: "searchConfigs", direction: "direction", pagination: "pagination", actionButtonArray: "actionButtonArray", multipleFilter: "multipleFilter", isPagination: "isPagination", isNosIndicator: "isNosIndicator", isEditable: "isEditable", from: "from", question: "question", rowTextSize: "rowTextSize", rowTextColor: "rowTextColor", apiMeta: "apiMeta", summaryRows: "summaryRows", summaryColumns: "summaryColumns", isLoading: "isLoading", tableConfig: "tableConfig", tableParams: "tableParams", listViews: "listViews", mode: "mode", languageCode: "languageCode", selectedColumn: "selectedColumn", allIcons: "allIcons" }, outputs: { tableRowClick: "tableRowClick", onEditData: "onEditData", saveButtonData: "saveButtonData", onDeleteData: "onDeleteData", buttonEmit: "buttonEmit", hyperLinkEmit: "hyperLinkEmit", sideNavEmit: "sideNavEmit", actionButtonEmit: "actionButtonEmit", columnSelected: "columnSelected", removeColumn: "removeColumn", valueChange: "valueChange", selectedValues: "selectedValues", fileEmit: "fileEmit", NxtTableParamsEmit: "NxtTableParamsEmit", NxtTableFilterEmit: "NxtTableFilterEmit", hadleDropDownDependent: "hadleDropDownDependent", NxtTableEmit: "NxtTableEmit" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"table-layout\" [id]=\"tableId\" [ngStyle]=\"{'padding-top': '1px', 'width': tableWidth}\" [dir]=\"direction\">\n <div>\n <div *ngIf=\"title\" class=\"d-flex justify-content-center table-title align-text-center\">\n {{title}}\n </div>\n <div *ngIf=\"isNosIndicator || searchBar || isButtons\" class=\"flex justify-content-between\"\n style=\"padding-bottom: 20px;\">\n <div class=\"flex\">\n <!-- SKS26APR25 List View Filter -->\n <app-list-view-filter *ngIf=\"listViews && listViews.length > 0\" [listViews]=\"listViews\"\n [selectedView]=\"selectedView\" [displayedColumns]='columns' [tableFilterArray]=\"tableFilterArray\"\n (listViewEmit)=\"listViewEmit($event)\">\n </app-list-view-filter>\n <div *ngIf=\"(!listViews || listViews.length === 0) && isNosIndicator\" class=\"noOfRec\"\n style=\"display: flex; align-items: flex-end;\">\n <p style=\"font-weight: 500; margin-right: 5px; margin-bottom: 0px;\">\n {{ 'APP.NOS' | nxtCustomTranslate : 'Nos'}} </p>\n <div style=\"color: rgb(43, 87, 249);\">{{totalRecords || totalCount}}</div>\n </div>\n </div>\n\n <div class=\"flex\" style=\"align-items: center;\">\n <div *ngIf=\"searchBar\" class=\"search\">\n <div class=\"flex search-bar\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.6413 19.25C16.6322 19.25 20.6781 15.3511 20.6781 10.5417C20.6781 5.73218 16.6322 1.83333 11.6413 1.83333C6.6504 1.83333 2.60449 5.73218 2.60449 10.5417C2.60449 15.3511 6.6504 19.25 11.6413 19.25Z\"\n stroke=\"#787486\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M21.6295 20.1667L19.7271 18.3333\" stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <input type=\"text\" placeholder=\"{{ 'APP.SEARCH' | nxtCustomTranslate : 'Search' }}\"\n (keyup)=\"searchConfigs ? emptySearch($event.target.value) : applyFilter($event.target.value)\"\n [value]=\"searchBoxValue || ''\" #input>\n <svg *ngIf=\"searchConfigs && searchBar\" class=\"configSearch\" (click)=\"onSearch(input.value)\"\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 5H20\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M14 8H17\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M21 11.5C21 16.75 16.75 21 11.5 21C6.25 21 2 16.75 2 11.5C2 6.25 6.25 2 11.5 2\"\n stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M22 22L20 20\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <div class=\"flex\" *ngIf=\"isButtons\" style=\"padding-left: 7px; gap: 7px;\">\n <div class=\"flex\" *ngFor=\"let button of buttonArray\">\n <nxt-button class=\"data-table-fsbtn\"\n (buttonClickEmit)=\"(button.type === 'group' || button.type === 'dropdown') ? commonButtonClick($event) : commonButtonClick(button)\"\n [buttonType]=\"button.class\"\n [buttonValue]=\"button.labelPath || button.label || button.name | nxtCustomTranslate : button.label || button.name \"\n [buttonConfig]=\"button.buttonConfig\" [type]=\"button.type\" class=\"ms-2 me-2\"\n [btnIconLeftSrc]=\"button.btnIconLeftSrc\" [isImageSvg]=\"button.isImageSvg\">\n </nxt-button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-margin\">\n <div class=\"table-container\"\n [ngClass]=\"{ 'resizing': isResizing }\"\n [ngStyle]=\"{ maxHeight: isPagination ? '450px' : 'auto', minHeight: dataSource.data && dataSource?.data?.length === 0 && !isLoading && from !== 'formBuilder' ? '0px' : '100px' }\"\n #tableContainer (scroll)=\"onScroll(tableContainer)\">\n <ng-container>\n <div class=\"custom-table\">\n <!--SKS15FEB25 Table Header -->\n <div class=\"table-header\" [ngClass]=\"{ 'shadow': isScrolled }\">\n <div class=\"table-row\">\n <!--SKS15FEB25 Checkbox Column -->\n <div *ngIf=\"withCheckBox\" class=\"table-cell sticky-column head-color\" [style.width]=\"'50px'\">\n <input type=\"checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"masterToggle()\"\n [checked]=\"selection?.hasValue()\"\n [indeterminate]=\"selection?.hasValue() && !isAllSelected()\"\n class=\"custom-checkbox\">\n </div>\n\n <!--SKS15FEB25 Data Columns -->\n <ng-container *ngFor=\"let column of currentColumns; let i = index\">\n <div *ngIf=\"column.summaryColumn !== true && column.summaryRow !== true && column.isHide !== true\"\n class=\"table-cell tableHeader head-color\"\n [class.sticky-column]=\"i === (stickyCondition - 1)\"\n [class.active-column]=\"activeColumn === column.uniqueIdentifier\"\n [class.selected-column]=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n (click)=\"$event.stopPropagation(); onColumnClick(column.uniqueIdentifier); column.sort ? sortData(column.fieldName) : ''\"\n (mouseenter)=\"hoveredColumn = column.fieldName\" (mouseleave)=\"hoveredColumn = null\"\n [style.width]=\"column.width || '100px'\"\n [style.flex]=\"'0 0 ' + (column.width || '100px')\"\n [style.min-width]=\"'50px'\">\n <div class=\"columnDiv\">\n <div class=\"column-header\" [style.width]=\"column.width || '100px'\">\n <!-- Add close button for selected column -->\n <div *ngIf=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n class=\"close-column-btn\"\n (click)=\"$event.stopPropagation(); removeCol(column.uniqueIdentifier)\">\n \u2715\n </div>\n <div class=\"ellipsis\" style=\"flex: 1;\" [title]=\"column.label\">\n {{ column.labelPath || column.label | nxtCustomTranslate : column.label }}\n </div>\n <div>\n <svg *ngIf=\"column.filter\"\n (click)=\"$event.stopPropagation(); filter(column.fieldName)\"\n style=\"padding-right: 2px;\" width=\"12\" height=\"11\"\n viewBox=\"0 0 12 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10.75 1.25H0.75L4.75 5.71722V8.80556L6.75 9.75V5.71722L10.75 1.25Z\"\n stroke=\"#242533\" stroke-width=\"1.2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <!--SKS15FEB25 Red dot for active filter -->\n <circle\n *ngIf=\"filterDataArray && filterDataArray[column.fieldName]?.length > 0\"\n cx=\"9\" cy=\"2\" r=\"2.5\" fill=\"red\"></circle>\n </svg>\n <div *ngIf=\"column.sort\"\n class=\"sort-indicators\">\n <span *ngIf=\"currentSortColumn === column.fieldName\" class=\"sort-direction\">\n {{ currentSortDirection === 'asc' ? '\u2191' : currentSortDirection\n === 'desc' ? '\u2193' : '' }}\n </span>\n <span\n *ngIf=\"hoveredColumn === column.fieldName && currentSortColumn !== column.fieldName\"\n class=\"sort-direction\">\n \u2191\n </span>\n </div>\n <div *ngIf=\"searchFilter && column.fieldName === selectedFilter\"\n class=\"search-component position-absolute\"\n (click)=\"$event.stopPropagation();\">\n <div class=\"card\">\n <div class=\"content\">\n <div class=\"flex\">\n <div class=\"fsearch\" [class.resized]=\"isResized\">\n <div class=\"fsearch-bar\">\n <svg class=\"searchSvg\" width=\"18\" height=\"20\"\n viewBox=\"0 0 24 22\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.6413 19.25C16.6322 19.25 20.6781 15.3511 20.6781 10.5417C20.6781 5.73218 16.6322 1.83333 11.6413 1.83333C6.6504 1.83333 2.60449 5.73218 2.60449 10.5417C2.60449 15.3511 6.6504 19.25 11.6413 19.25Z\"\n stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M21.6295 20.1667L19.7271 18.3333\"\n stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n <input class=\"width-100\" type=\"text\"\n placeholder=\"{{ 'APP.SEARCH' | nxtCustomTranslate : 'Search' }}\"\n [(ngModel)]=\"searchText\"\n class=\"searchinput\">\n </div>\n </div>\n <svg *ngIf=\"isResized\" (click)=\"closefilter()\"\n class=\"close-icon\" width=\"24\" height=\"24\"\n viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.16998 14.83L14.83 9.17001\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M14.83 14.83L9.16998 9.17001\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9 22H15C20 22 22 20 22 15V9C22 4 20 2 15 2H9C4 2 2 4 2 9V15C2 20 4 22 9 22Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"filter-content\" [style]=\"'overflow-y: auto'\">\n <div *ngFor=\"let data of filterArray | searchFilter : searchText\">\n <div class=\"mt-3 mb-3 checkboxdiv\"\n style=\"gap: 5px;\">\n <input type=\"checkbox\"\n [checked]=\"isSelected(data)\" [value]=\"data\"\n [id]=\"data\" (change)=\"checkedData(data)\">\n <div class=\"ms-2 label-data\">{{data}}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Enhanced resize handle -->\n <div class=\"resize-handle\" \n (mousedown)=\"onResizeStart($event)\"\n title=\"Drag to resize column\"></div>\n </div>\n </div>\n </ng-container>\n\n <!--SKS15FEB25 Action Column -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"table-cell head-color actionCol sticky-column\"\n [style.width]=\"'150px'\"\n style=\"padding: 12px !important;\">\n {{ actionColumHeader | nxtCustomTranslate : 'Action'}}\n </div>\n </div>\n </div>\n\n <!--SKS15FEB25 Table Body -->\n <div class=\"table-body\" *ngIf=\"!isLoading\">\n <div *ngFor=\"let element of dataSource.data; let i = index\" class=\"table-row\"\n (click)=\"tableClick(element)\">\n <!--SKS15FEB25 Checkbox Cell -->\n <div *ngIf=\"withCheckBox\" class=\"table-cell sticky-column body-color\">\n <input type=\"checkbox\" class=\"custom-checkbox\" (click)=\"$event.stopPropagation()\"\n (change)=\"separateRowSelect(selection.toggle(element), element)\"\n [checked]=\"selection.isSelected(element)\"\n [disabled]=\"(element.isPayProcessed === true)\">\n </div>\n\n <!--SKS15FEB25 Data Cells -->\n <ng-container *ngFor=\"let column of currentColumns; let last = last; ellipsis\">\n <div *ngIf=\"column.summaryColumn !== true && column.summaryRow !== true && column.isHide !== true\"\n class=\"table-cell body-color\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n [style.width]=\"column.width || '100px'\"\n [style.flex]=\"'0 0 ' + (column.width || '100px')\"\n [style.min-width]=\"'50px'\"\n [style.max-width]=\"column.width || '100px'\">\n <div>\n <div>\n <!-- SKS22JUL25 calendar -->\n <div *ngIf=\"column.type === 'calendar'\">\n <!-- <app-custom-calendar [question]=\"getUpdatedQuestion(column.fieldName, element, i)\" (eventSelected)=\"getCalendarEvent($event)\"\n (dateSelected)=\"getCurrentCalendar($event)\" (openModal)=\"openCalendarModal($event)\"\n (closeModal)=\"closeCalendarModal($event)\"></app-custom-calendar>\n <app-custom-model *ngIf=\"isCalendarModalOpen\" [modalTitle]=\"calendarModalTitle\"\n [isModalOpen]=\"isCalendarModalOpen\" [modalSize]=\"calendarModalSize\"\n [saveButtonValue]=\"calendarSaveButtonValue\" [modalFooter]=\"modalCalendarModalFooter\"\n (saveButtonEmit)=\"onCalendarModalSave()\" (cancelButtonEmit)=\"closeCalendarModal($event)\">\n <lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\"\n (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\n </app-custom-model> -->\n </div>\n\n <!-- SKS22JUL25 for pick location -->\n <app-pick-location *ngIf=\"column.type === 'location'\" [apiKey]=\"column['apiKey']\" [address]=\"question.selectedValue\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (locationSelected)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-pick-location>\n\n <!-- SKS22JUL25 Image -->\n <div *ngIf=\"column.type === 'image'\" (mouseenter)=\"isImageHover = true;\"\n (mouseleave)=\"isImageHover = false;\">\n <!-- <div *ngIf=\"isImageHover\" style=\"display: flex; justify-content: end;\">\n <svg *ngIf=\"!column.question?.isReadOnly\" (click)=\"onImageEdit(column.question)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n <svg *ngIf=\"!column.question?.isReadOnly\" (click)=\"onImageDelete(column.question)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div> -->\n <img *ngIf=\"column.question?.isReadOnly\" [src]=\"column.question?.imageData\" />\n <!-- <div *ngIf=\"!column.question?.isReadOnly\" class=\"logo-container\">\n Logo preview area\n <div class=\"logo-preview\" *ngIf=\"column.question?.input\">\n <img [src]=\"column.question?.imageData\" />\n </div>\n\n Upload button\n <div *ngIf=\"!column.question?.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>Upload Image</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\"\n (change)=\"fileChangeEvent(column.question, $event)\" style=\"display: none;\" />\n </div>\n </div> -->\n </div>\n <!-- SKS22JUL25 icon-selector -->\n <nxt-icon-selector [allIcons]=\"allIcons\" *ngIf=\"column.type === 'icon'\" [required]=\"column.question?.isOptional\" [mode]=\"mode\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\" [labelFont]=\"column.question?.font\"\n [label]=\"column.question?.questionText\"\n [labelColor]=\"column.question?.fontColor\"\n [labelSize]=\"column.question?.fontSize\" [labelWeight]=\"column.question?.fontWeight\" [showLabel]=\"column.question?.style?.showLabel\" (iconSelected)=\"updateEdit(i,$event,element,column.fieldName)\"></nxt-icon-selector>\n\n <!-- SKS22JUL25 line -->\n <hr *ngIf=\"column.type === 'line'\" class=\"custom-line\" style=\"display: inline-flex\" />\n <!-- SKS22JUL25 data table -->\n <nxt-datatable *ngIf=\"column.type === 'table'\" isEditRow isDeleteRow actionButton isButtons [question]=\"getUpdatedQuestion(column.fieldName, element, i)\" from=\"formBuilder\"\n (valueChange)=\"updateEdit(i,$event.data,element,column.fieldName)\" [apiMeta]=\"column.question?.subText\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n [tableConfig]=\"column.question?.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\">\n </nxt-datatable>\n <!-- SKS22JUL25 list -->\n <nxt-search-box *ngIf=\"column.type === 'list'\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\" [readOnly]=\"column.question?.isReadOnly\" [apiMeta]=\"column.question?.subText\"\n [id]=\"column.question?.id\" [placeHolderText]=\"column.question?.question || ''\" \n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (searchValueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </nxt-search-box>\n\n <!-- SKS22JUL25 Dropdown -->\n <app-custom-dropdown *ngIf=\"column?.type === 'dropdown' && column.question?.options\" [options]=\"column.question?.options\" [apiMeta]=\"column.question?.subText\"\n [id]=\"column.question?.id\" [selectedValue]=\"column.isShengel ? column.question?.input : column.question?.selectedValue\"\n placeholder=\"\"\n [errorMessage]=\"column.question?.errorMessage\" [error]=\"column.question?.error\" [referenceField]=\"column.question?.referenceField\"\n [readOnly]=\"column.question?.isReadOnly\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (valueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-custom-dropdown>\n <!-- SKS22JUL25 custom-radio component -->\n <div *ngIf=\"column.type === 'radio' && column.question?.options\" class=\"\">\n <app-custom-radio [options]=\"column.question?.options\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\" [apiMeta]=\"column.question?.subText\" [id]=\"column.question?.id\"\n [selectedValue]=\"column.question?.selectedValue\" [errorMessage]=\"column.question?.errorMessage\" [error]=\"column.question?.error\"\n [referenceField]=\"column.question?.referenceField\" [readOnly]=\"column.question?.isReadOnly\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n (valueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-custom-radio>\n </div>\n\n <!-- SKS22JUL25 Attachment / Files -->\n <app-file-upload *ngIf=\"column.type === 'file'\" [limitFileUploading]=\"5\" [error]=\"column.question?.error\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n [allFiles]=\"column.question?.input\" (selectedFileData)=\"updateEdit(i,$event.value,element,column.fieldName)\"\n >\n </app-file-upload>\n <!-- SKS22JUL25 Button -->\n <nxt-button\n *ngIf=\"column.type === 'button'\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n [btnHeight]=\"'50px'\" [btnWidth]=\"'150px'\" [buttonValue]=\"column.question?.question\"\n (buttonClickEmit)=\"updateEdit(i,$event,element,column.fieldName)\"\n >\n </nxt-button>\n <!-- SKS22JUL25 book type -->\n <!-- <lib-questionbook *ngIf=\"column.type === 'book'\" [qbItem]=\"column.question?.qbItem\"\n [questions]=\"readQuestions(column.question?.qbReference, column.question?.qbReferenceQuestions)\"\n (handleDropDown)=\"getDropDown($event)\">\n </lib-questionbook> -->\n <!-- SKS22JUL25 Text, Email, label, number, Boolean, rich text editor, DateTime, Date, Time-->\n <nxt-input *ngIf=\"column.type === undefined || column.type === 'text' || column.type === 'email' || column.type === 'number' || column.type === 'label' || column.type === 'boolean' || column.type === 'richtextarea' || column.type === 'datetime' || column.type === 'date' || column.type === 'time' || column.type === 'textarea'\"\n [type]=\"column.type === 'boolean' ? 'checkbox' : column.type === 'richtextarea' ? 'richtext' : column.type === undefined ? 'text' : column.type \"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n [value]=\"element | getValue: column.fieldName \"\n [hyperLink]=\"column.hyperLink\"\n (hyperlinkEmit)=\"onClickHyperlink(column.fieldName,element, column.hyperLink)\"\n [question]=\"getUpdatedQuestion(column.fieldName, element, i)\"\n [labelFont]=\"column.question?.font\"\n [label]=\"column.question?.questionText\"\n [labelColor]=\"column.question?.fontColor\"\n [labelSize]=\"column.question?.fontSize\"\n [inputValueSize]=\"column.question?.fontSize\"\n [labelWeight]=\"column.question?.fontWeight\"\n [inputWeight]=\"column.question?.fontWeight\"\n [showLabel]=\"column.question?.style?.showLabel\"\n inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"column.question?.question\"\n [required]=\"column.question?.isOptional\" inputBgColor=\"#FAFAFA\"\n [inputId]=\"column.question?.trackingId\"\n [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"column.question?.iconLeftSrc\" \n [minDate]=\"column.question?.minDate\"\n [rows]=\"3\"\n (inputValue)=\"updateEdit(i,$event.value,element,column.fieldName)\"\n >\n </nxt-input>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!--SKS15FEB25 Action Buttons -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\" class=\"table-cell actionCol\">\n <div class=\"actionButton\" style=\"display: flex; align-items: center;\">\n\n <!--SKS15FEB25 Edit Button -->\n <div *ngIf=\"isEditRow\" class=\"eicon-container\"\n matTooltip=\"{{ 'APP.EDIT_RECORD' | nxtCustomTranslate : 'Edit Record' }}\"\n style=\"padding: 2px; border: 1px solid #dcdcdc; border-radius: 5px; margin-left: 3px; margin-right: 3px;\">\n <div class=\" edit-icon\"\n style=\"padding: 2px 4px; border-radius: 5px; background-color: #f5f5f5;\">\n <svg (click)=\"onEdit(element)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n </div>\n </div>\n\n\n <!--SKS15FEB25 Delete Button -->\n <div *ngIf=\"isDeleteRow\" class=\"dicon-container\"\n [matTooltip]=\"'APP.DELETE_RECORD' | nxtCustomTranslate : 'Delete Record'\"\n style=\"padding: 2px; border: 1px solid #ffb5b5; border-radius: 5px; margin-left: 3px; margin-right: 3px;\">\n <div class=\"delete-icon\"\n style=\"padding: 2px 4px; border-radius: 5px; background-color: #feeeed;\">\n <svg (click)=\"deleteRecord(element,i)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\"\n stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\"\n stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <!--SKS15FEB25 Render inline buttons up to Size -->\n <div *ngFor=\"let button of actionButtonArray?.buttonArray; let i = index\">\n <div *ngIf=\"i < actionButtonArray?.size\"\n style=\" margin-left: 3px; margin-right: 3px;\">\n <div *ngIf=\"isConditionMet(element, button.conditions)\"\n [matTooltip]=\"button.tooltipPath || button.tooltip | nxtCustomTranslate : button.tooltip \"\n (click)=\"actionButtonClicked(button,element)\"\n (mouseenter)=\"$event.target.style.border = '1px solid ' + button.hoverBorderColor\"\n (mouseleave)=\"$event.target.style.border = '1px solid ' + button.borderColor\"\n style=\"padding: 2px; border-radius: {{button.borderRadius}}px; border: 1px solid {{button.borderColor}};\">\n <div (mouseenter)=\"$event.target.style.backgroundColor = button.hoverBackgroundColor\"\n (mouseleave)=\"$event.target.style.backgroundColor = button.backgroundColor\"\n style=\"padding: {{button.padding}}px {{button.padding + 2}}px; border-radius: {{button.borderRadius}}px; background-color: {{button.backgroundColor}};\">\n <img *ngIf=\"button.iconSrc\" #imgElement [src]=\"button.iconSrc\"\n (mouseenter)=\"imgElement.src = button.hoverIconSrc || button.iconSrc\"\n (mouseleave)=\"imgElement.src = button.iconSrc\">\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"dropdownActionButton && dropdownActionButton.length > 0\"\n class=\"dropdown\">\n <div class=\"clickable-img\" (click)=\"toggleDropdown(i)\"\n style=\" margin-left: 3px; margin-right: 3px;\">\n <div\n style=\"background-color: #f5f5f5; padding: 2px 4px; border-radius: 5px;\">\n <svg style=\"background-color: #f5f5f5; border-radius: 5px; border: 1px solid #6c757d;\"\n width=\"16\" height=\"16\" viewBox=\"0 0 40 40\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M19.9999 25.6667C23.6818 25.6667 26.6666 22.6819 26.6666 19C26.6666 15.3181 23.6818 12.3334 19.9999 12.3334C16.318 12.3334 13.3333 15.3181 13.3333 19C13.3333 22.6819 16.318 25.6667 19.9999 25.6667Z\"\n fill=\"#292D32\" stroke=\"#292D32\" stroke-width=\"1.5\"\n stroke-miterlimit=\"10\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M17.6467 18.16L20.0001 20.5067L22.3534 18.16\"\n stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <div class=\"dropdown-menu\"\n [style.right]=\"((actionButtonArray?.size ?? 0) - (actionButtonArray?.buttonArray?.size ?? 0) + (isEditRow ? 1 : 0) + (isDeleteRow ? 1 : 0) + (dropdownActionButton?.length > 0 ? 1 : 0)) * 100 + '%'\"\n *ngIf=\"currentOpenIndex === i\">\n <div *ngFor=\"let btn of dropdownActionButton\">\n <button *ngIf=\"isConditionMet(element, btn.conditions)\"\n [attr.data-id]=\"element.id\" style=\"display: flex;\" type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [matTooltip]=\"btn.tooltipPath || btn.tooltip | nxtCustomTranslate : btn.tooltip\"\n [disabled]=\"btn.buttonDisable\"\n (click)=\"actionButtonClicked(btn,element)\">\n <img *ngIf=\"btn.iconSrc\" [src]=\"btn.iconSrc\">\n <div class=\"fc-btn-text\" style=\"padding-left: 10px;\">\n {{btn.name}}</div>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- SKS20MAR25 Summary Rows -->\n <ng-container\n *ngIf=\"summaryRows && summaryRows.length > 0 && dataSource.data && dataSource?.data?.length > 0 && !isLoading\">\n <ng-container *ngIf=\"!isFullTableSummaryRow && isSummaryColumn\">\n <div *ngFor=\"let row of summaryRows\" class=\"table-row summary-row\">\n <!-- Label in the first column -->\n <div *ngIf=\"withCheckBox\" class=\"non-summary-table-cell\"></div>\n <!-- Empty cells to align with data columns -->\n <div *ngFor=\"let col of isSummaryStartColumn; let last = last\"\n class=\"non-summary-table-cell\" [class.last-cell]=\"last\">\n </div> <!-- Value or input in the last column -->\n <div class=\"summary-table-cell\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\"\n (click)=\"$event.stopPropagation(); onColumnClick(row.uniqueIdentifier)\">{{ row.label }}\n </div>\n <div class=\"summary-table-cell\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\">\n <ng-container *ngIf=\"row.type === 'calculation'\">\n <!-- Add close button for selected column -->\n <div *ngIf=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\"\n class=\"close-column-btn\"\n (click)=\"$event.stopPropagation(); removeCol(row.uniqueIdentifier)\">\n \u2715\n </div>\n {{ summaryValues[row.fieldName] | number }}\n </ng-container>\n <ng-container *ngIf=\"row.type === 'input'\">\n <input type=\"number\" [(ngModel)]=\"summaryValues[row.fieldName]\"\n (ngModelChange)=\"onSummaryInputChange()\"\n class=\"nxt-lop-input table-width\"\n style=\"font-size: {{ rowTextSize ? rowTextSize : '13px' }}; color: {{rowTextColor ? rowTextColor : '#2c3137'}};\">\n </ng-container>\n </div>\n <!-- SKS20MAR25 Empty cells to align with data columns -->\n <div *ngFor=\"let col of isSummaryEndColumn; let last = last\"\n class=\"non-summary-table-cell\">\n </div>\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"non-summary-table-cell actionCol sticky-column\">\n </div>\n </div>\n </ng-container>\n <!-- SKS13JUN25 full table summary row -->\n <ng-container *ngIf=\"isFullTableSummaryRow\">\n <div *ngFor=\"let row of summaryRows\" class=\"table-row summary-row\">\n <!-- SKS13JUN25 Checkbox column (if enabled) -->\n <div *ngIf=\"withCheckBox\" class=\"horizontal-summary-table-cell\">\n {{ row.labelPath || row.label | nxtCustomTranslate : row.label }}\n </div>\n\n <!-- SKS13JUN25 summary cell -->\n <div *ngFor=\"let col of currentColumns; let last = last\"\n class=\"horizontal-summary-table-cell\" style=\"text-align: left;\">\n @if (row?.columns?.includes(col.fieldName)) {\n {{ summaryValues[col.fieldName] | number }}\n }\n </div>\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"horizontal-summary-table-cell actionCol sticky-column\">\n </div>\n </div>\n </ng-container>\n </ng-container>\n <!--SKS28MAR25 In the Loading section -->\n <div class=\"table-body\" *ngIf=\"isLoading\">\n <!-- Repeat for 5 skeleton rows -->\n <div *ngFor=\"let _ of [1,2,3,4,5]\" class=\"table-row\">\n <!-- Checkbox Column -->\n <div *ngIf=\"withCheckBox\" class=\"skeleton-cell sticky-column\"></div>\n\n <!-- Data Columns -->\n <div *ngFor=\"let col of currentColumns\" class=\"skeleton-cell \"></div>\n\n <!-- Action Column -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\" class=\"skeleton-cell actionCol\">\n </div>\n </div>\n </div>\n <!-- <div *ngIf=\"dataSource.data && dataSource?.data?.length === 0 && !isLoading && from === 'formBuilder'\" class=\"form-builder-table-box\">\n Add / drags fields from elements sections\n </div> -->\n </div>\n </ng-container>\n </div>\n <!--SKS15FEB25 No Data Row -->\n <div *ngIf=\"dataSource.data && dataSource?.data?.length === 0 && !isLoading && from !== 'formBuilder'\"\n class=\"no-data\">\n {{'APP.NO_RECORDS_OR_DATA_FOUND' | nxtCustomTranslate : 'No records/data found.'}}\n </div>\n <!--SKS15FEB25 Pagination -->\n <div [class.shadow-hidden]=\"isShadowHidden\">\n <!-- table input save button changes -->\n <div class=\"d-flex inlineAdd justify-content-end\">\n <div class=\"flex addIconBor cursor-pointer\" *ngIf=\"addInlineRecord \"\n (click)=\"addTableRecord(inlineElement)\"\n matTooltip=\"{{ 'APP.ADD_RECORD'| nxtCustomTranslate : 'Add Record'}}\">\n <div class=\"addIcon\">\n <svg class=\"nav-icon\" xmlns=\"http://www.w3.org/2000/svg\" height=\"24\"\n viewBox=\"0 -960 960 960\" width=\"24\">\n <path\n d=\"M440-280h80v-160h160v-80H520v-160h-80v160H280v80h160v160Zm40 200q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\" />\n </svg>\n </div>\n </div>\n <!--SKS15FEB25 removed button disable logic, added another condition for button showing-->\n <!--SKS15FEB25 SR06JAN2025 button disable logic for not select any employee-->\n <nxt-button *ngIf=\"(isReadOnlyArray || tableSaveButton) && from != 'formBuilder'\"\n buttonType=\"btn btn-primary\" [buttonDisable]=\"selection?.selected?.length === 0\"\n (buttonClickEmit)=\"saveButton()\"\n buttonValue=\"{{ 'APP.SAVE' | nxtCustomTranslate : 'Save' }}\"></nxt-button>\n </div>\n <nxt-pagination *ngIf=\"isPagination\" [pageSizeOptions]=\"pageSizeOptions\"\n [collectionSize]=\"configPagination ? totalRecords || totalCount : filterTableNos\"\n [pageSize]=\"pageSize\" [currentPage]=\"pageIndex\" [firstLastButtons]=\"true\"\n (event)=\"pageParams($event)\">\n </nxt-pagination>\n </div>\n </div>\n </div>\n</div>\n\n<!--SKS15FEB25 alert on deleting record -->\n<div *ngIf=\"deleteModal\" class=\"modal modal-backdrop show d-block\" id=\"deleteRecord\" tabindex=\"-1\"\n aria-labelledby=\"deleteRecordLabel\" [attr.aria-hidden]=\"!deleteModal\">\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <b class=\"modal-title fs-5\" id=\"deleteRecordLabel\">{{ 'APP.DELETE_RECORD'| nxtCustomTranslate : 'Delete Record'}}</b>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"deleteModal = false\"></button>\n </div>\n <div class=\"modal-body\">\n {{ 'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE_THE_REC'| nxtCustomTranslate : 'Are you sure you want to delete the record'}} ?\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\" (click)=\"deleteModal = false\">{{\n 'APP.NO'| nxtCustomTranslate : 'No'}}</button>\n <button type=\"button\" class=\"btn btn-primary\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"deleteRecordData()\">{{ 'APP.YES'| nxtCustomTranslate : 'Yes'}}</button>\n </div>\n </div>\n </div>\n</div>", styles: [".custom-table{display:table;width:100%;border-collapse:collapse;table-layout:fixed;direction:var(--direction);background:var(--body-bg)}.table-header{display:table-header-group;position:sticky;top:0;z-index:100;box-shadow:none;transition:box-shadow .3s ease-in-out;background:var(--header-bg)}.shadow{box-shadow:0 4px 5px #0001!important}.table-body{display:table-row-group}.table-row{display:table-row;min-height:40px}.table-cell{position:relative;min-width:50px;padding:12px 0 12px 12px;border-bottom:solid 1px var(--border-color);max-width:none;box-sizing:border-box;overflow:visible;white-space:nowrap;text-overflow:ellipsis;display:table-cell}.table-container.resizing{-webkit-user-select:none;user-select:none;pointer-events:none}.table-container.resizing .resize-handle{pointer-events:auto}.sticky-column{position:sticky;background:inherit;z-index:5}.sticky-column .resize-handle{z-index:15}.actionCol{position:sticky;padding:unset!important;align-items:center;z-index:11;right:0;background:var(--header-bg)}.actionCol{min-width:100px!important;width:100px!important;max-width:100px!important}.actionCol .resize-handle{display:none}.table-container{width:100%;overflow-x:auto;overflow-y:auto;border-top:1px solid #e0e0e0;scrollbar-width:none}.table-container::-webkit-scrollbar{display:none}.column-header{display:flex;align-items:center;flex:1;min-width:0;overflow:hidden;padding-right:8px}.ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0}.column-header img{cursor:pointer}.shadow-hidden{position:relative}.shadow-hidden:before{content:\"\";position:absolute;z-index:11;top:-10px;left:0;width:100%;height:10px;background:linear-gradient(to top,var(--scroll-shadow),transparent)}.resize-handle{position:absolute;right:-1px;top:0;bottom:0;width:1px;cursor:col-resize;background:#ccc;z-index:10;transition:background-color .2s ease}.resize-handle:hover{background:#ccc;opacity:.7}.resize-handle:active{background:#ccc;opacity:.9}.columnDiv{position:relative;display:flex;align-items:center;width:100%;height:100%}.search{display:flex;justify-content:space-between;border:1px solid rgba(67,69,85,.3);border-radius:7px;align-self:center;padding:3px}.search-bar{width:100%;margin:5px}.configSearch{height:22px;padding:3px;margin:10p;background-color:#247dff;border-radius:4px}input::placeholder{color:#abafb1}.sort-indicators{display:inline-block;width:10px;padding-left:5px}.sort-direction{font-size:12px;color:var(--text-color);opacity:.7}.tableHeader{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .3s}.tableHeader:hover{background-color:var(--hover-bg)}.search-component{top:163%;left:0;z-index:-10;background-color:#fff;box-shadow:0 2px 10px #0000001a}[dir=rtl] .search-component{left:unset!important}input{border:none}.card{background:#fff;box-shadow:0 2px #0a0a0a1f;border-radius:8px;border-color:#e9e9e9}.fsearch{width:100%;justify-content:space-between;font-weight:400;font-size:13px;display:flex;background:#f0f5ff;border-radius:6px;align-self:center}.content{margin:6px;width:150px}.fsearch-bar{display:flex;flex-direction:row;width:100%;margin:5px;transition:width .3s ease}.search.resized{width:calc(100% - 40px)}.filter-content{width:100%;max-height:150px;padding-left:5px}.label-data{font-weight:200;font-size:12px;color:#434555d9}input[type=checkbox]{height:16px;width:16px;border-radius:5px;margin-left:2px}input[type=checkbox]:after{width:4px;height:7px;left:5px;top:3px;transform:rotate(var(--r, 20deg))}input[type=checkbox]:checked{--r: 43deg}.checkbox-cont{display:flex;align-items:center}.searchinput{border:none;background-color:#f0f5ff;width:85%;font-size:12px;color:#275efe;font-weight:600}.searchSvg{margin-right:3px}.close-icon{margin-left:4px;width:36px;height:32px;cursor:pointer;padding-top:9px;padding-bottom:9px;background-color:#ffefee;color:red;border-radius:4px;transition:background-color .3s ease,color .3s ease}.close-icon:hover{background-color:red;color:#fff}.checkboxdiv{display:flex;align-items:center}.checkboxdiv input{flex-shrink:0}input:focus,input:active,select:focus,select:active,textarea:focus,textarea:active,button:focus,button:active{outline:none!important}@supports (-webkit-appearance: none) or (-moz-appearance: none){input[type=checkbox]{--active: #275EFE;--active-inner: #fff;--focus: 2px rgba(39, 94, 254, .3);--border: #BBC1E1;--border-hover: #275EFE;--background: #fff;--disabled: #F6F8FF;--disabled-inner: #E1E6F9;-webkit-appearance:none;-moz-appearance:none;height:21px;outline:none;display:inline-block;vertical-align:top;position:relative;margin:0;cursor:pointer;border:1px solid var(--bc, var(--border));background:var(--b, var(--background))!important;transition:background .3s,border-color .3s,box-shadow .2s}input[type=checkbox]:after{content:\"\";display:block;left:0;top:0;position:absolute;transition:transform var(--d-t, .3s) var(--d-t-e, ease),opacity var(--d-o, .2s)}input[type=checkbox]:checked{--b: var(--active);--bc: var(--active);--d-o: .3s;--d-t: .6s;--d-t-e: cubic-bezier(.2, .85, .32, 1.2)}input[type=checkbox]:disabled{--b: var(--disabled);cursor:not-allowed;opacity:.9}input[type=checkbox]:disabled:checked{--b: var(--disabled-inner);--bc: var(--border)}input[type=checkbox]:disabled+label{cursor:not-allowed}input[type=checkbox]:hover:not(:checked):not(:disabled){--bc: var(--border-hover)}input[type=checkbox]:focus{box-shadow:0 0 0 var(--focus)}input[type=checkbox]:not(.switch){width:21px}input[type=checkbox]:not(.switch):after{opacity:var(--o, 0)}input[type=checkbox]:not(.switch):checked{--o: 1}input[type=checkbox]+label{font-size:14px;line-height:21px;display:inline-block;vertical-align:top;cursor:pointer;margin-left:4px}input[type=checkbox]:not(.switch){border-radius:7px}input[type=checkbox]:not(.switch):after{width:5px;height:9px;border:2px solid var(--active-inner);border-top:0;border-left:0;left:7px;top:4px;transform:rotate(var(--r, 20deg))}input[type=checkbox]:not(.switch):checked{--r: 43deg}input[type=checkbox].switch{width:38px;border-radius:11px}input[type=checkbox].switch:after{left:2px;top:2px;border-radius:50%;width:15px;height:15px;background:var(--ab, var(--border));transform:translate(var(--x, 0))}input[type=checkbox].switch:checked{--ab: var(--active-inner);--x: 17px}input[type=checkbox].switch:disabled:not(:checked):after{opacity:.6}input[type=checkbox]:indeterminate{--b: var(--active);--bc: var(--active);--d-o: .3s;--d-t: .6s;--d-t-e: cubic-bezier(.2, .85, .32, 1.2)}input[type=checkbox]:indeterminate:after{content:\"\";display:block;left:8px;top:5px;rotate:69deg;position:absolute;width:2px;height:9px;background:var(--active-inner);opacity:6;transition:transform var(--d-t, .3s) var(--d-t-e, ease),opacity var(--d-o, .2s)}}:host{--primary-color: #275EFE;--secondary-color: #6C757D;--text-color: #434555;--border-color: #e0e0e0;--hover-bg: #f9f9f9;--header-bg: #ffffff;--body-bg: #ffffff;--danger-color: #FF2C10;--scroll-shadow: rgba(0, 0, 0, .08);--box-shadow: 0 2px 10px rgba(0, 0, 0, .1)}:host(.dark-theme){--primary-color: #6c8dfa;--text-color: #ffffff;--header-bg: #2c2c2c;--body-bg: #1e1e1e;--border-color: #404040;--hover-bg: #373737}.hyper-link:hover{color:#00f!important;text-decoration:underline;cursor:pointer}.on-edit:hover .edit-icon{visibility:visible}.nxt-lop-input{border-radius:5px;color:#2c3137;font-weight:400;font-size:13px;transition:all .2s}.input-box{border:solid}.inlineAdd{align-items:center;gap:10px;padding-top:10px}.addIconBor{padding:4px;border-radius:5px;border:1px solid #6c757d;transition:background-color .3s,border-color .3s}.addIcon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.addIconBor:hover .addIcon{background-color:#bbd3ff}::ng-deep .modal-backdrop{background-color:#000000b3!important}::ng-deep .modal-backdrop.show{opacity:1!important}.eicon-container:hover .edit-icon svg path{fill:#2163ff!important}.eicon-container:hover .edit-icon{background-color:#c9d2ff!important;cursor:pointer}.eicon-container:hover{border:1px solid #2163ff!important}.dicon-container:hover .delete-icon svg path{stroke:#fff!important;fill:transparent!important}.dicon-container:hover .delete-icon{background-color:#ff7575!important;cursor:pointer}.dicon-container:hover{border:1px solid #ff2121!important}.clickable-img{position:relative;cursor:pointer;padding:2px;border:1px solid #dddddd;border-radius:5px}.clickable-img:hover{border:1px solid rgb(31,105,255);border-radius:5px}.clickable-img:hover div svg{background-color:#ecf3ff!important}.clickable-img:hover div{background-color:#ecf3ff!important}.dropdown-menu{left:unset!important;right:300%;top:12.5px;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 4px 8px #0000001a}.dropdown .dropdown-menu{display:block}.dropdown-menu .btn{display:block;padding:10px;width:100%;text-align:left;background:transparent;border:none;cursor:pointer}[dir=rtl] .search{margin-left:7px}[dir=rtl] .noOfRec{gap:4px}[dir=rtl] .sticky-column{position:sticky;right:0;z-index:11;background:var(--header-bg)}[dir=rtl] .actionCol{position:sticky;padding:unset!important;align-items:center;z-index:11;left:0;background:var(--header-bg)}[dir=rtl] .resize-handle{position:relative;left:0!important;right:14px;width:1.5px;background-color:#dddd}[dir=rtl] .sort-indicators{padding-right:5px}::ng-deep [dir=rtl] nxt-pagination .dropdown-arrow{left:5px;right:unset!important}::ng-deep [dir=rtl] nxt-button .dropdown-menu{right:unset!important;left:0!important}[dir=rtl] .dropdown-menu{left:300%!important;right:unset!important}[dir=rtl] .fc-btn-text{padding-right:10px}.selected-cell{border-left:2px solid #2196F3!important;border-right:2px solid #2196F3!important;position:relative;z-index:1}.selected-column{position:relative;border:2px solid #2196F3!important;border-bottom:none!important;border-radius:4px}.close-column-btn{position:absolute;top:3px;right:3px;width:12px;height:12px;border:solid black .5px;color:#000;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:9px;cursor:pointer;z-index:2}.close-column-btn:hover{background:#f32121!important;border:solid #f32121 .5px!important;color:#fff!important}.table-row:last-child .selected-cell{border-bottom:2px solid #2196F3!important}.hover-content{position:absolute;z-index:1;background:#fff;border:1px solid #ccc;box-shadow:0 2px 5px #00000026;padding:10px;min-width:200px;border-radius:5px;top:70%;left:0;cursor:pointer}.expense-file{text-decoration:none;transition:text-decoration .2s ease-in-out;cursor:pointer}.expense-file:hover{text-decoration:underline;color:#0056b3;cursor:pointer}.popover-container .hover-content{display:none;position:absolute;cursor:pointer}.popover-container:hover .hover-content{display:block;cursor:pointer}.summary-row{font-weight:700}.non-summary-table-cell{display:table-cell;padding:12px;text-overflow:ellipsis;white-space:nowrap;position:relative;color:var(--text-color);border:solid 1px white!important}.summary-table-cell{display:table-cell;padding:12px;text-overflow:ellipsis;white-space:nowrap;position:relative;color:var(--text-color);border:solid 1px var(--border-color)!important;border-top:solid 1.5px var(--border-color)!important}.horizontal-summary-table-cell{display:table-cell;max-width:none;box-sizing:border-box;overflow:visible;white-space:nowrap;padding:12px;text-overflow:ellipsis;position:relative;color:var(--text-color);border:solid 1px white!important;border-top:solid 1px var(--border-color)!important;border-bottom:1px solid var(--border-color)!important}.last-cell{border-right:1px solid var(--border-color)!important}.table-last-cell{border-bottom:1px solid var(--border-color)!important}.skeleton-loader{display:table;width:100%;border-collapse:collapse}.skeleton-row{display:table-row;border-bottom:1px solid var(--border-color)}.skeleton-cell{display:table-cell;padding:12px;height:35px;background:#fff;position:relative}.skeleton-cell{min-width:50px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%;animation:loading 1.5s infinite}.skeleton-cell:before{content:\"\";position:absolute;inset:3px;background:linear-gradient(90deg,#f5f5f5 25%,#eaeaea,#f5f5f5 75%);background-size:200% 100%;animation:pulse 1.5s infinite linear;border-radius:4px}.skeleton-cell.sticky-column{position:sticky;left:0;z-index:11;background:#f5f5f5}.skeleton-cell.actionCol.sticky-column{position:sticky;right:0;left:auto;background:#f5f5f5}@keyframes pulse{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes loading{0%{background-position:200% 0}to{background-position:-200% 0}}@media (max-width: 768px){.resize-handle{width:6px}.table-cell{min-width:80px}}.form-builder-table-box{height:108px;display:flex;justify-content:center;align-items:center;border:1px dashed #a8a1a1}.no-data{display:flex;align-items:anchor-center;height:60px;justify-content:center}.custom-line{width:100%;border:1px solid #000}\n"], dependencies: [{ kind: "component", type: NxtDatatable, selector: "nxt-datatable", inputs: ["data", "tableFilterData", "columns", "withCheckBox", "searchBar", "tableSaveButton", "stickyColumn", "tableWidth", "actionColumHeader", "actionButton", "title", "isButtons", "buttonArray", "tableId", "isEditRow", "isDeleteRow", "addInlineRecord", "searchConfigs", "direction", "pagination", "actionButtonArray", "multipleFilter", "isPagination", "isNosIndicator", "isEditable", "from", "question", "rowTextSize", "rowTextColor", "apiMeta", "summaryRows", "summaryColumns", "isLoading", "tableConfig", "tableParams", "listViews", "mode", "languageCode", "selectedColumn", "allIcons"], outputs: ["tableRowClick", "onEditData", "saveButtonData", "onDeleteData", "buttonEmit", "hyperLinkEmit", "sideNavEmit", "actionButtonEmit", "columnSelected", "removeColumn", "valueChange", "selectedValues", "fileEmit", "NxtTableParamsEmit", "NxtTableFilterEmit", "hadleDropDownDependent", "NxtTableEmit"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NxtButtonComponent, selector: "nxt-button", inputs: ["buttonValue", "buttonType", "type", "buttonDisable", "btnBgColor", "btnBorder", "btnTextColor", "btnHeight", "btnWidth", "btnIconLeftSrc", "btnIconRightSrc", "btnHoverBgColor", "btnHoverTextColor", "btnId", "dataDismiss", "buttonBorder", "modalToTrigger", "isImageSvg", "tabIndex", "buttonConfig", "mode", "languageCode"], outputs: ["buttonClickEmit"] }, { kind: "component", type: NxtPagination, selector: "nxt-pagination", inputs: ["pageSizeOptions", "collectionSize", "pageSize", "currentPage", "maxSize", "firstLastButtons", "nextPreviousButtons", "small"], outputs: ["event"] }, { kind: "pipe", type: NxtSearchFilterPipe, name: "searchFilter" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i7.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "pipe", type: NxtGetValuePipe, name: "getValue" }, { kind: "component", type: PickLocationComponent, selector: "app-pick-location", inputs: ["address", "from", "question", "mode", "apiKey"], outputs: ["locationSelected"] }, { kind: "component", type: IconSelectorComponent, selector: "nxt-icon-selector", inputs: ["allIcons", "themeColor", "height", "tooltipPosition", "selectedIcon", "cdnIconURL", "label", "labelFont", "labelWeight", "inputWeight", "labelSize", "labelColor", "showLabel", "required", "mode", "question", "options"], outputs: ["iconSelected"] }, { kind: "component", type: NxtSearchBox, selector: "nxt-search-box", inputs: ["placeHolderText", "question", "apiMeta", "id", "readOnly", "mode", "from"], outputs: ["searchValueChange"] }, { kind: "component", type: CustomDropdownComponent, selector: "app-custom-dropdown", inputs: ["options", "placeholder", "apiMeta", "selectedValue", "progressBar", "id", "readOnly", "errorMessage", "error", "fromShengel", "question", "referenceField", "token", "mode", "from"], outputs: ["valueChange"] }, { kind: "component", type: CustomRadioComponent, selector: "app-custom-radio", inputs: ["options", "question", "apiMeta", "selectedValue", "progressBar", "id", "readOnly", "errorMessage", "error", "fromShengel", "referenceField", "token", "mode"], outputs: ["valueChange"] }, { kind: "component", type: NxtFileUploadComponent, selector: "app-file-upload", inputs: ["allFiles", "limitFileUploading", "mode", "isShowNoFileIcon", "question", "error", "from"], outputs: ["selectedFileData", "deletedFileData"] }, { kind: "component", type: NxtInput, selector: "nxt-input", inputs: ["label", "labelFont", "labelWeight", "inputWeight", "labelSize", "inputValueSize", "labelColor", "showLabel", "svgHeight", "svgWidth", "type", "inputIconRightSrc", "inputIconLeftSrc", "required", "minLength", "pattern", "errorMessages", "maxLength", "placeholder", "inputBgColor", "inputBorder", "placeholderColor", "placeholderFont", "placeholderWeight", "placeholderSize", "inputTextColor", "inputHeight", "inputWidth", "inputId", "inputBorderSize", "inputConfig", "confPassVal", "confPass", "mode", "value", "question", "showSuggestion", "ariaOwns", "ariaHasPopup", "isLoading", "options", "minDate", "maxDate", "rows", "from", "hyperLink", "size"], outputs: ["valueChange", "inputValue", "onBlur", "onFocus", "toggleEmit", "nativeInputRef", "removeValueEmit", "hyperlinkEmit"] }, { kind: "component", type: ListViewFilterComponent, selector: "app-list-view-filter", inputs: ["listViews", "tableFilterArray", "selectedView", "displayedColumns", "availableOperators"], outputs: ["listViewEmit"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }] });
1593
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: NxtDatatable, isStandalone: true, selector: "nxt-datatable", inputs: { data: "data", tableFilterData: "tableFilterData", columns: "columns", withCheckBox: "withCheckBox", searchBar: "searchBar", tableSaveButton: "tableSaveButton", stickyColumn: "stickyColumn", tableWidth: "tableWidth", actionColumHeader: "actionColumHeader", actionButton: "actionButton", title: "title", isButtons: "isButtons", buttonArray: "buttonArray", tableId: "tableId", isEditRow: "isEditRow", isDeleteRow: "isDeleteRow", addInlineRecord: "addInlineRecord", searchConfigs: "searchConfigs", direction: "direction", pagination: "pagination", actionButtonArray: "actionButtonArray", multipleFilter: "multipleFilter", isPagination: "isPagination", isNosIndicator: "isNosIndicator", isEditable: "isEditable", from: "from", question: "question", rowTextSize: "rowTextSize", rowTextColor: "rowTextColor", apiMeta: "apiMeta", summaryRows: "summaryRows", summaryColumns: "summaryColumns", isLoading: "isLoading", tableConfig: "tableConfig", tableParams: "tableParams", listViews: "listViews", mode: "mode", languageCode: "languageCode", selectedColumn: "selectedColumn", allIcons: "allIcons" }, outputs: { tableRowClick: "tableRowClick", onEditData: "onEditData", saveButtonData: "saveButtonData", onDeleteData: "onDeleteData", buttonEmit: "buttonEmit", hyperLinkEmit: "hyperLinkEmit", sideNavEmit: "sideNavEmit", actionButtonEmit: "actionButtonEmit", columnSelected: "columnSelected", removeColumn: "removeColumn", valueChange: "valueChange", selectedValues: "selectedValues", fileEmit: "fileEmit", NxtTableParamsEmit: "NxtTableParamsEmit", NxtTableFilterEmit: "NxtTableFilterEmit", hadleDropDownDependent: "hadleDropDownDependent", NxtTableEmit: "NxtTableEmit" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "tableContainer", first: true, predicate: ["tableContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"table-layout\" [id]=\"tableId\" [ngStyle]=\"{'padding-top': '1px', 'width': tableWidth}\" [dir]=\"direction\">\n <div>\n <div *ngIf=\"title\" class=\"d-flex justify-content-center table-title align-text-center\">\n {{title}}\n </div>\n <div *ngIf=\"isNosIndicator || searchBar || isButtons\" class=\"flex justify-content-between\"\n style=\"padding-bottom: 20px;\">\n <div class=\"flex\">\n <!-- SKS26APR25 List View Filter -->\n <app-list-view-filter *ngIf=\"listViews && listViews.length > 0\" [listViews]=\"listViews\"\n [selectedView]=\"selectedView\" [displayedColumns]='columns' [tableFilterArray]=\"tableFilterArray\"\n (listViewEmit)=\"listViewEmit($event)\">\n </app-list-view-filter>\n <div *ngIf=\"(!listViews || listViews.length === 0) && isNosIndicator\" class=\"noOfRec\"\n style=\"display: flex; align-items: flex-end;\">\n <p style=\"font-weight: 500; margin-right: 5px; margin-bottom: 0px;\">\n {{ 'APP.NOS' | nxtCustomTranslate : 'Nos'}} </p>\n <div style=\"color: rgb(43, 87, 249);\">{{totalRecords || totalCount}}</div>\n </div>\n </div>\n\n <div class=\"flex\" style=\"align-items: center;\">\n <div *ngIf=\"searchBar\" class=\"search\">\n <div class=\"flex search-bar\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.6413 19.25C16.6322 19.25 20.6781 15.3511 20.6781 10.5417C20.6781 5.73218 16.6322 1.83333 11.6413 1.83333C6.6504 1.83333 2.60449 5.73218 2.60449 10.5417C2.60449 15.3511 6.6504 19.25 11.6413 19.25Z\"\n stroke=\"#787486\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M21.6295 20.1667L19.7271 18.3333\" stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <input type=\"text\" placeholder=\"{{ 'APP.SEARCH' | nxtCustomTranslate : 'Search' }}\"\n (keyup)=\"searchConfigs ? emptySearch($event.target.value) : applyFilter($event.target.value)\"\n [value]=\"searchBoxValue || ''\" #input>\n <svg *ngIf=\"searchConfigs && searchBar\" class=\"configSearch\" (click)=\"onSearch(input.value)\"\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 5H20\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M14 8H17\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M21 11.5C21 16.75 16.75 21 11.5 21C6.25 21 2 16.75 2 11.5C2 6.25 6.25 2 11.5 2\"\n stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M22 22L20 20\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <div class=\"flex\" *ngIf=\"isButtons\" style=\"padding-left: 7px; gap: 7px;\">\n <div class=\"flex\" *ngFor=\"let button of buttonArray\">\n <nxt-button class=\"data-table-fsbtn\"\n (buttonClickEmit)=\"(button.type === 'group' || button.type === 'dropdown') ? commonButtonClick($event) : commonButtonClick(button)\"\n [buttonType]=\"button.class\"\n [buttonValue]=\"button.labelPath || button.label || button.name | nxtCustomTranslate : button.label || button.name \"\n [buttonConfig]=\"button.buttonConfig\" [type]=\"button.type\" class=\"ms-2 me-2\"\n [btnIconLeftSrc]=\"button.btnIconLeftSrc\" [isImageSvg]=\"button.isImageSvg\">\n </nxt-button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-margin\">\n <div class=\"table-container\"\n [ngClass]=\"{ 'resizing': isResizing }\"\n [ngStyle]=\"{ maxHeight: isPagination ? '450px' : 'auto', minHeight: dataSource.data && dataSource?.data?.length === 0 && !isLoading && from !== 'formBuilder' ? '0px' : '100px' }\"\n #tableContainer (scroll)=\"onScroll(tableContainer)\">\n <ng-container>\n <div class=\"custom-table\">\n <!--SKS15FEB25 Table Header -->\n <div class=\"table-header\" [ngClass]=\"{ 'shadow': isScrolled }\">\n <div class=\"table-row\">\n <!--SKS15FEB25 Checkbox Column -->\n <div *ngIf=\"withCheckBox\" class=\"table-cell sticky-column head-color\" [style.width]=\"'50px'\">\n <input type=\"checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"masterToggle()\"\n [checked]=\"selection?.hasValue()\"\n [indeterminate]=\"selection?.hasValue() && !isAllSelected()\"\n class=\"custom-checkbox\">\n </div>\n\n <!--SKS15FEB25 Data Columns -->\n <ng-container *ngFor=\"let column of currentColumns; let i = index\">\n <div *ngIf=\"column.summaryColumn !== true && column.summaryRow !== true && column.isHide !== true\"\n class=\"table-cell tableHeader head-color\"\n [class.sticky-column]=\"i === (stickyCondition - 1)\"\n [class.active-column]=\"activeColumn === column.uniqueIdentifier\"\n [class.selected-column]=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n (click)=\"$event.stopPropagation(); onColumnClick(column.uniqueIdentifier); column.sort ? sortData(column.fieldName) : ''\"\n (mouseenter)=\"hoveredColumn = column.fieldName\" (mouseleave)=\"hoveredColumn = null\"\n [style.width]=\"column.width || '100px'\"\n [style.flex]=\"'0 0 ' + (column.width || '100px')\"\n [style.min-width]=\"'50px'\">\n <div class=\"columnDiv\">\n <div class=\"column-header\" [style.width]=\"column.width || '100px'\">\n <!-- Add close button for selected column -->\n <div *ngIf=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n class=\"close-column-btn\"\n (click)=\"$event.stopPropagation(); removeCol(column.uniqueIdentifier)\">\n \u2715\n </div>\n <div class=\"ellipsis\" style=\"flex: 1;\" [title]=\"column.label\">\n {{ column.labelPath || column.label | nxtCustomTranslate : column.label }}\n </div>\n <div>\n <svg *ngIf=\"column.filter\"\n (click)=\"$event.stopPropagation(); filter(column.fieldName)\"\n style=\"padding-right: 2px;\" width=\"12\" height=\"11\"\n viewBox=\"0 0 12 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10.75 1.25H0.75L4.75 5.71722V8.80556L6.75 9.75V5.71722L10.75 1.25Z\"\n stroke=\"#242533\" stroke-width=\"1.2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <!--SKS15FEB25 Red dot for active filter -->\n <circle\n *ngIf=\"filterDataArray && filterDataArray[column.fieldName]?.length > 0\"\n cx=\"9\" cy=\"2\" r=\"2.5\" fill=\"red\"></circle>\n </svg>\n <div *ngIf=\"column.sort\"\n class=\"sort-indicators\">\n <span *ngIf=\"currentSortColumn === column.fieldName\" class=\"sort-direction\">\n {{ currentSortDirection === 'asc' ? '\u2191' : currentSortDirection\n === 'desc' ? '\u2193' : '' }}\n </span>\n <span\n *ngIf=\"hoveredColumn === column.fieldName && currentSortColumn !== column.fieldName\"\n class=\"sort-direction\">\n \u2191\n </span>\n </div>\n <div *ngIf=\"searchFilter && column.fieldName === selectedFilter\"\n class=\"search-component position-absolute\"\n (click)=\"$event.stopPropagation();\">\n <div class=\"card\">\n <div class=\"content\">\n <div class=\"flex\">\n <div class=\"fsearch\" [class.resized]=\"isResized\">\n <div class=\"fsearch-bar\">\n <svg class=\"searchSvg\" width=\"18\" height=\"20\"\n viewBox=\"0 0 24 22\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.6413 19.25C16.6322 19.25 20.6781 15.3511 20.6781 10.5417C20.6781 5.73218 16.6322 1.83333 11.6413 1.83333C6.6504 1.83333 2.60449 5.73218 2.60449 10.5417C2.60449 15.3511 6.6504 19.25 11.6413 19.25Z\"\n stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M21.6295 20.1667L19.7271 18.3333\"\n stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n <input class=\"width-100\" type=\"text\"\n placeholder=\"{{ 'APP.SEARCH' | nxtCustomTranslate : 'Search' }}\"\n [(ngModel)]=\"searchText\"\n class=\"searchinput\">\n </div>\n </div>\n <svg *ngIf=\"isResized\" (click)=\"closefilter()\"\n class=\"close-icon\" width=\"24\" height=\"24\"\n viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.16998 14.83L14.83 9.17001\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M14.83 14.83L9.16998 9.17001\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9 22H15C20 22 22 20 22 15V9C22 4 20 2 15 2H9C4 2 2 4 2 9V15C2 20 4 22 9 22Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"filter-content\" [style]=\"'overflow-y: auto'\">\n <div *ngFor=\"let data of filterArray | searchFilter : searchText\">\n <div class=\"mt-3 mb-3 checkboxdiv\"\n style=\"gap: 5px;\">\n <input type=\"checkbox\"\n [checked]=\"isSelected(data)\" [value]=\"data\"\n [id]=\"data\" (change)=\"checkedData(data)\">\n <div class=\"ms-2 label-data\">{{data}}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Enhanced resize handle -->\n <div class=\"resize-handle\" \n (mousedown)=\"onResizeStart($event)\"\n title=\"Drag to resize column\"></div>\n </div>\n </div>\n </ng-container>\n\n <!--SKS15FEB25 Action Column -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"table-cell head-color actionCol sticky-column\"\n [style.width]=\"'150px'\"\n style=\"padding: 12px !important;\">\n {{ actionColumHeader | nxtCustomTranslate : 'Action'}}\n </div>\n </div>\n </div>\n\n <!--SKS15FEB25 Table Body -->\n <div class=\"table-body\" *ngIf=\"!isLoading\">\n <div *ngFor=\"let element of dataSource.data; let i = index\" class=\"table-row\"\n (click)=\"tableClick(element)\">\n <!--SKS15FEB25 Checkbox Cell -->\n <div *ngIf=\"withCheckBox\" class=\"table-col-cell sticky-column body-color\">\n <input type=\"checkbox\" class=\"custom-checkbox\" (click)=\"$event.stopPropagation()\"\n (change)=\"separateRowSelect(selection.toggle(element), element)\"\n [checked]=\"selection.isSelected(element)\"\n [disabled]=\"(element.isPayProcessed === true)\">\n </div>\n\n <!--SKS15FEB25 Data Cells -->\n <ng-container *ngFor=\"let column of currentColumns; let last = last; ellipsis\">\n <div *ngIf=\"column.summaryColumn !== true && column.summaryRow !== true && column.isHide !== true\"\n class=\"table-col-cell body-color\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n [style.width]=\"column.width || '100px'\"\n [style.flex]=\"'0 0 ' + (column.width || '100px')\"\n [style.min-width]=\"'50px'\"\n [style.max-width]=\"column.width || '100px'\">\n <div>\n <div>\n <!-- SKS22JUL25 calendar -->\n <div *ngIf=\"column.type === 'calendar'\">\n <!-- <app-custom-calendar [question]=\"column | questionByRow:element:i\" (eventSelected)=\"getCalendarEvent($event)\"\n (dateSelected)=\"getCurrentCalendar($event)\" (openModal)=\"openCalendarModal($event)\"\n (closeModal)=\"closeCalendarModal($event)\"></app-custom-calendar>\n <app-custom-model *ngIf=\"isCalendarModalOpen\" [modalTitle]=\"calendarModalTitle\"\n [isModalOpen]=\"isCalendarModalOpen\" [modalSize]=\"calendarModalSize\"\n [saveButtonValue]=\"calendarSaveButtonValue\" [modalFooter]=\"modalCalendarModalFooter\"\n (saveButtonEmit)=\"onCalendarModalSave()\" (cancelButtonEmit)=\"closeCalendarModal($event)\">\n <lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\"\n (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\n </app-custom-model> -->\n </div>\n\n <!-- SKS22JUL25 for pick location -->\n <app-pick-location *ngIf=\"column.type === 'location'\" [apiKey]=\"column['apiKey']\" [address]=\"question.selectedValue\" [question]=\"column | questionByRow:element:i\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (locationSelected)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-pick-location>\n\n <!-- SKS22JUL25 Image -->\n <div *ngIf=\"column.type === 'image'\" (mouseenter)=\"isImageHover = true;\"\n (mouseleave)=\"isImageHover = false;\">\n <!-- <div *ngIf=\"isImageHover\" style=\"display: flex; justify-content: end;\">\n <svg *ngIf=\"!column.question?.isReadOnly\" (click)=\"onImageEdit(column.question)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n <svg *ngIf=\"!column.question?.isReadOnly\" (click)=\"onImageDelete(column.question)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div> -->\n <img *ngIf=\"column.question?.isReadOnly\" [src]=\"column.question?.imageData\" />\n <!-- <div *ngIf=\"!column.question?.isReadOnly\" class=\"logo-container\">\n Logo preview area\n <div class=\"logo-preview\" *ngIf=\"column.question?.input\">\n <img [src]=\"column.question?.imageData\" />\n </div>\n\n Upload button\n <div *ngIf=\"!column.question?.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>Upload Image</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\"\n (change)=\"fileChangeEvent(column.question, $event)\" style=\"display: none;\" />\n </div>\n </div> -->\n </div>\n <!-- SKS22JUL25 icon-selector -->\n <nxt-icon-selector [allIcons]=\"allIcons\" *ngIf=\"column.type === 'icon'\" [required]=\"column.question?.isOptional\" [mode]=\"mode\" [question]=\"column | questionByRow:element:i\" [labelFont]=\"column.question?.font\"\n [label]=\"column.question?.questionText\"\n [labelColor]=\"column.question?.fontColor\"\n [labelSize]=\"column.question?.fontSize\" [labelWeight]=\"column.question?.fontWeight\" [showLabel]=\"column.question?.style?.showLabel\" (iconSelected)=\"updateEdit(i,$event,element,column.fieldName)\"></nxt-icon-selector>\n\n <!-- SKS22JUL25 line -->\n <hr *ngIf=\"column.type === 'line'\" class=\"custom-line\" style=\"display: inline-flex\" />\n <!-- SKS22JUL25 data table -->\n <nxt-datatable *ngIf=\"column.type === 'table'\" isEditRow isDeleteRow actionButton isButtons [question]=\"column | questionByRow:element:i\" from=\"formBuilder\"\n (valueChange)=\"updateEdit(i,$event.data,element,column.fieldName)\" [apiMeta]=\"column.question?.subText\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n [tableConfig]=\"column.question?.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\">\n </nxt-datatable>\n <!-- SKS22JUL25 list -->\n <nxt-search-box *ngIf=\"column.type === 'list'\" [question]=\"column | questionByRow:element:i\" [readOnly]=\"column.question?.isReadOnly\" [apiMeta]=\"column.question?.subText\"\n [id]=\"column.question?.id\" [placeHolderText]=\"column.question?.question || ''\" \n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (searchValueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </nxt-search-box>\n\n <!-- SKS22JUL25 Dropdown -->\n <app-custom-dropdown *ngIf=\"column?.type === 'dropdown' && column.question?.options\" [options]=\"column.question?.options\" [apiMeta]=\"column.question?.subText\"\n [id]=\"column.question?.id\" [selectedValue]=\"column.isShengel ? column.question?.input : column.question?.selectedValue\"\n placeholder=\"\"\n [errorMessage]=\"column.question?.errorMessage\" [error]=\"column.question?.error\" [referenceField]=\"column.question?.referenceField\"\n [readOnly]=\"column.question?.isReadOnly\" [question]=\"column | questionByRow:element:i\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (valueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-custom-dropdown>\n <!-- SKS22JUL25 custom-radio component -->\n <div *ngIf=\"column.type === 'radio' && column.question?.options\" class=\"\">\n <app-custom-radio [options]=\"column.question?.options\" [question]=\"column | questionByRow:element:i\" [apiMeta]=\"column.question?.subText\" [id]=\"column.question?.id\"\n [selectedValue]=\"column.question?.selectedValue\" [errorMessage]=\"column.question?.errorMessage\" [error]=\"column.question?.error\"\n [referenceField]=\"column.question?.referenceField\" [readOnly]=\"column.question?.isReadOnly\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n (valueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-custom-radio>\n </div>\n\n <!-- SKS22JUL25 Attachment / Files -->\n <app-file-upload *ngIf=\"column.type === 'file'\" [limitFileUploading]=\"5\" [error]=\"column.question?.error\" [question]=\"column | questionByRow:element:i\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n [allFiles]=\"column.question?.input\" (selectedFileData)=\"updateEdit(i,$event.value,element,column.fieldName)\"\n >\n </app-file-upload>\n <!-- SKS22JUL25 Button -->\n <nxt-button\n *ngIf=\"column.type === 'button'\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n [btnHeight]=\"'50px'\" [btnWidth]=\"'150px'\" [buttonValue]=\"column.question?.question\"\n (buttonClickEmit)=\"updateEdit(i,$event,element,column.fieldName)\"\n >\n </nxt-button>\n <!-- SKS22JUL25 book type -->\n <!-- <lib-questionbook *ngIf=\"column.type === 'book'\" [qbItem]=\"column.question?.qbItem\"\n [questions]=\"readQuestions(column.question?.qbReference, column.question?.qbReferenceQuestions)\"\n (handleDropDown)=\"getDropDown($event)\">\n </lib-questionbook> -->\n <!-- SKS22JUL25 Text, Email, label, number, Boolean, rich text editor, DateTime, Date, Time-->\n <nxt-input *ngIf=\"column.type === undefined || column.type === 'text' || column.type === 'email' || column.type === 'number' || column.type === 'label' || column.type === 'boolean' || column.type === 'richtextarea' || column.type === 'datetime' || column.type === 'date' || column.type === 'time' || column.type === 'textarea'\"\n [type]=\"column.type === 'boolean' ? 'checkbox' : column.type === 'richtextarea' ? 'richtext' : column.type === undefined ? 'text' : column.type \"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n [value]=\"element | getValue: column.fieldName \"\n [hyperLink]=\"column.hyperLink\"\n (hyperlinkEmit)=\"onClickHyperlink(column.fieldName,element, column.hyperLink)\"\n [question]=\"column | questionByRow:element:i\"\n [labelFont]=\"column.question?.font\"\n [label]=\"column.question?.questionText\"\n [labelColor]=\"column.question?.fontColor\"\n [labelSize]=\"column.question?.fontSize\"\n [inputValueSize]=\"column.question?.fontSize\"\n [labelWeight]=\"column.question?.fontWeight\"\n [inputWeight]=\"column.question?.fontWeight\"\n [showLabel]=\"column.question?.style?.showLabel\"\n inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"column.question?.question\"\n [required]=\"column.question?.isOptional\" inputBgColor=\"#FAFAFA\"\n [inputId]=\"column.question?.trackingId\"\n [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"column.question?.iconLeftSrc\" \n [minDate]=\"column.question?.minDate\"\n [rows]=\"3\"\n (inputValue)=\"updateEdit(i,$event.value,element,column.fieldName)\"\n >\n </nxt-input>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!--SKS15FEB25 Action Buttons -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\" class=\"table-col-cell actionCol\">\n <div class=\"actionButton\" style=\"display: flex; align-items: center;\">\n\n <!--SKS15FEB25 Edit Button -->\n <div *ngIf=\"isEditRow\" class=\"eicon-container\"\n matTooltip=\"{{ 'APP.EDIT_RECORD' | nxtCustomTranslate : 'Edit Record' }}\"\n style=\"padding: 2px; border: 1px solid #dcdcdc; border-radius: 5px; margin-left: 3px; margin-right: 3px;\">\n <div class=\" edit-icon\"\n style=\"padding: 2px 4px; border-radius: 5px; background-color: #f5f5f5;\">\n <svg (click)=\"onEdit(element)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n </div>\n </div>\n\n\n <!--SKS15FEB25 Delete Button -->\n <div *ngIf=\"isDeleteRow\" class=\"dicon-container\"\n [matTooltip]=\"'APP.DELETE_RECORD' | nxtCustomTranslate : 'Delete Record'\"\n style=\"padding: 2px; border: 1px solid #ffb5b5; border-radius: 5px; margin-left: 3px; margin-right: 3px;\">\n <div class=\"delete-icon\"\n style=\"padding: 2px 4px; border-radius: 5px; background-color: #feeeed;\">\n <svg (click)=\"deleteRecord(element,i)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\"\n stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\"\n stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <!--SKS15FEB25 Render inline buttons up to Size -->\n <div *ngFor=\"let button of actionButtonArray?.buttonArray; let i = index\">\n <div *ngIf=\"i < actionButtonArray?.size\"\n style=\" margin-left: 3px; margin-right: 3px;\">\n <div *ngIf=\"isConditionMet(element, button.conditions)\"\n [matTooltip]=\"button.tooltipPath || button.tooltip | nxtCustomTranslate : button.tooltip \"\n (click)=\"actionButtonClicked(button,element)\"\n (mouseenter)=\"$event.target.style.border = '1px solid ' + button.hoverBorderColor\"\n (mouseleave)=\"$event.target.style.border = '1px solid ' + button.borderColor\"\n style=\"padding: 2px; border-radius: {{button.borderRadius}}px; border: 1px solid {{button.borderColor}};\">\n <div (mouseenter)=\"$event.target.style.backgroundColor = button.hoverBackgroundColor\"\n (mouseleave)=\"$event.target.style.backgroundColor = button.backgroundColor\"\n style=\"padding: {{button.padding}}px {{button.padding + 2}}px; border-radius: {{button.borderRadius}}px; background-color: {{button.backgroundColor}};\">\n <img *ngIf=\"button.iconSrc\" #imgElement [src]=\"button.iconSrc\"\n (mouseenter)=\"imgElement.src = button.hoverIconSrc || button.iconSrc\"\n (mouseleave)=\"imgElement.src = button.iconSrc\">\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"dropdownActionButton && dropdownActionButton.length > 0\"\n class=\"dropdown\">\n <div class=\"clickable-img\" (click)=\"toggleDropdown(i)\"\n style=\" margin-left: 3px; margin-right: 3px;\">\n <div\n style=\"background-color: #f5f5f5; padding: 2px 4px; border-radius: 5px;\">\n <svg style=\"background-color: #f5f5f5; border-radius: 5px; border: 1px solid #6c757d;\"\n width=\"16\" height=\"16\" viewBox=\"0 0 40 40\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M19.9999 25.6667C23.6818 25.6667 26.6666 22.6819 26.6666 19C26.6666 15.3181 23.6818 12.3334 19.9999 12.3334C16.318 12.3334 13.3333 15.3181 13.3333 19C13.3333 22.6819 16.318 25.6667 19.9999 25.6667Z\"\n fill=\"#292D32\" stroke=\"#292D32\" stroke-width=\"1.5\"\n stroke-miterlimit=\"10\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M17.6467 18.16L20.0001 20.5067L22.3534 18.16\"\n stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <div class=\"dropdown-menu\"\n [style.right]=\"((actionButtonArray?.size ?? 0) - (actionButtonArray?.buttonArray?.size ?? 0) + (isEditRow ? 1 : 0) + (isDeleteRow ? 1 : 0) + (dropdownActionButton?.length > 0 ? 1 : 0)) * 100 + '%'\"\n *ngIf=\"currentOpenIndex === i\">\n <div *ngFor=\"let btn of dropdownActionButton\">\n <button *ngIf=\"isConditionMet(element, btn.conditions)\"\n [attr.data-id]=\"element.id\" style=\"display: flex;\" type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [matTooltip]=\"btn.tooltipPath || btn.tooltip | nxtCustomTranslate : btn.tooltip\"\n [disabled]=\"btn.buttonDisable\"\n (click)=\"actionButtonClicked(btn,element)\">\n <img *ngIf=\"btn.iconSrc\" [src]=\"btn.iconSrc\">\n <div class=\"fc-btn-text\" style=\"padding-left: 10px;\">\n {{btn.name}}</div>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- SKS20MAR25 Summary Rows -->\n <ng-container\n *ngIf=\"summaryRows && summaryRows.length > 0 && dataSource.data && dataSource?.data?.length > 0 && !isLoading\">\n <ng-container *ngIf=\"!isFullTableSummaryRow && isSummaryColumn\">\n <div *ngFor=\"let row of summaryRows\" class=\"table-row summary-row\">\n <!-- Label in the first column -->\n <div *ngIf=\"withCheckBox\" class=\"non-summary-table-cell\"></div>\n <!-- Empty cells to align with data columns -->\n <div *ngFor=\"let col of isSummaryStartColumn; let last = last\"\n class=\"non-summary-table-cell\" [class.last-cell]=\"last\">\n </div> <!-- Value or input in the last column -->\n <div class=\"summary-table-cell\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\"\n (click)=\"$event.stopPropagation(); onColumnClick(row.uniqueIdentifier)\">{{ row.label }}\n </div>\n <div class=\"summary-table-cell\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\">\n <ng-container *ngIf=\"row.type === 'calculation'\">\n <!-- Add close button for selected column -->\n <div *ngIf=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\"\n class=\"close-column-btn\"\n (click)=\"$event.stopPropagation(); removeCol(row.uniqueIdentifier)\">\n \u2715\n </div>\n {{ summaryValues[row.fieldName] | number }}\n </ng-container>\n <ng-container *ngIf=\"row.type === 'input'\">\n <input type=\"number\" [(ngModel)]=\"summaryValues[row.fieldName]\"\n (ngModelChange)=\"onSummaryInputChange()\"\n class=\"nxt-lop-input table-width\"\n style=\"font-size: {{ rowTextSize ? rowTextSize : '13px' }}; color: {{rowTextColor ? rowTextColor : '#2c3137'}};\">\n </ng-container>\n </div>\n <!-- SKS20MAR25 Empty cells to align with data columns -->\n <div *ngFor=\"let col of isSummaryEndColumn; let last = last\"\n class=\"non-summary-table-cell\">\n </div>\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"non-summary-table-cell actionCol sticky-column\">\n </div>\n </div>\n </ng-container>\n <!-- SKS13JUN25 full table summary row -->\n <ng-container *ngIf=\"isFullTableSummaryRow\">\n <div *ngFor=\"let row of summaryRows\" class=\"table-row summary-row\">\n <!-- SKS13JUN25 Checkbox column (if enabled) -->\n <div *ngIf=\"withCheckBox\" class=\"horizontal-summary-table-cell\">\n {{ row.labelPath || row.label | nxtCustomTranslate : row.label }}\n </div>\n\n <!-- SKS13JUN25 summary cell -->\n <div *ngFor=\"let col of currentColumns; let last = last\"\n class=\"horizontal-summary-table-cell\" style=\"text-align: left;\">\n @if (row?.columns?.includes(col.fieldName)) {\n {{ summaryValues[col.fieldName] | number }}\n }\n </div>\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"horizontal-summary-table-cell actionCol sticky-column\">\n </div>\n </div>\n </ng-container>\n </ng-container>\n <!--SKS28MAR25 In the Loading section -->\n <div class=\"table-body\" *ngIf=\"isLoading\">\n <!-- Repeat for 5 skeleton rows -->\n <div *ngFor=\"let _ of [1,2,3,4,5]\" class=\"table-row\">\n <!-- Checkbox Column -->\n <div *ngIf=\"withCheckBox\" class=\"skeleton-cell sticky-column\"></div>\n\n <!-- Data Columns -->\n <div *ngFor=\"let col of currentColumns\" class=\"skeleton-cell \"></div>\n\n <!-- Action Column -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\" class=\"skeleton-cell actionCol\">\n </div>\n </div>\n </div>\n <!-- <div *ngIf=\"dataSource.data && dataSource?.data?.length === 0 && !isLoading && from === 'formBuilder'\" class=\"form-builder-table-box\">\n Add / drags fields from elements sections\n </div> -->\n </div>\n </ng-container>\n </div>\n <!--SKS15FEB25 No Data Row -->\n <div *ngIf=\"dataSource.data && dataSource?.data?.length === 0 && !isLoading && from !== 'formBuilder'\"\n class=\"no-data\">\n {{'APP.NO_RECORDS_OR_DATA_FOUND' | nxtCustomTranslate : 'No records/data found.'}}\n </div>\n <!--SKS15FEB25 Pagination -->\n <div [class.shadow-hidden]=\"isShadowHidden\">\n <!-- table input save button changes -->\n <div class=\"d-flex inlineAdd justify-content-end\">\n <div class=\"flex addIconBor cursor-pointer\" *ngIf=\"addInlineRecord \"\n (click)=\"addTableRecord(inlineElement)\"\n matTooltip=\"{{ 'APP.ADD_RECORD'| nxtCustomTranslate : 'Add Record'}}\">\n <div class=\"addIcon\">\n <svg class=\"nav-icon\" xmlns=\"http://www.w3.org/2000/svg\" height=\"24\"\n viewBox=\"0 -960 960 960\" width=\"24\">\n <path\n d=\"M440-280h80v-160h160v-80H520v-160h-80v160H280v80h160v160Zm40 200q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\" />\n </svg>\n </div>\n </div>\n <!--SKS15FEB25 removed button disable logic, added another condition for button showing-->\n <!--SKS15FEB25 SR06JAN2025 button disable logic for not select any employee-->\n <nxt-button *ngIf=\"tableSaveButton && from != 'formBuilder'\"\n buttonType=\"btn btn-primary\" [buttonDisable]=\"selection?.selected?.length === 0\"\n (buttonClickEmit)=\"saveButton()\"\n buttonValue=\"{{ 'APP.SAVE' | nxtCustomTranslate : 'Save' }}\"></nxt-button>\n </div>\n <nxt-pagination *ngIf=\"isPagination\" [pageSizeOptions]=\"pageSizeOptions\"\n [collectionSize]=\"configPagination ? totalRecords || totalCount : filterTableNos\"\n [pageSize]=\"pageSize\" [currentPage]=\"pageIndex\" [firstLastButtons]=\"true\"\n (event)=\"pageParams($event)\">\n </nxt-pagination>\n </div>\n </div>\n </div>\n</div>\n\n<!--SKS15FEB25 alert on deleting record -->\n<div *ngIf=\"deleteModal\" class=\"modal modal-backdrop show d-block\" id=\"deleteRecord\" tabindex=\"-1\"\n aria-labelledby=\"deleteRecordLabel\" [attr.aria-hidden]=\"!deleteModal\">\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <b class=\"modal-title fs-5\" id=\"deleteRecordLabel\">{{ 'APP.DELETE_RECORD'| nxtCustomTranslate : 'Delete Record'}}</b>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"deleteModal = false\"></button>\n </div>\n <div class=\"modal-body\">\n {{ 'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE_THE_REC'| nxtCustomTranslate : 'Are you sure you want to delete the record'}} ?\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\" (click)=\"deleteModal = false\">{{\n 'APP.NO'| nxtCustomTranslate : 'No'}}</button>\n <button type=\"button\" class=\"btn btn-primary\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"deleteRecordData()\">{{ 'APP.YES'| nxtCustomTranslate : 'Yes'}}</button>\n </div>\n </div>\n </div>\n</div>", styles: [".custom-table{display:table;width:100%;border-collapse:collapse;table-layout:fixed;direction:var(--direction);background:var(--body-bg)}.table-header{display:table-header-group;position:sticky;top:0;z-index:100;box-shadow:none;transition:box-shadow .3s ease-in-out;background:var(--header-bg)}.shadow{box-shadow:0 4px 5px #0001!important}.table-body{display:table-row-group}.table-row{display:table-row;min-height:40px}.table-cell{position:relative;min-width:50px;padding:12px 0 12px 12px;border-bottom:solid 1px var(--border-color);max-width:none;box-sizing:border-box;overflow:visible;white-space:nowrap;text-overflow:ellipsis;display:table-cell}.table-col-cell{position:relative;min-width:50px;padding:2.5px 0 2.5px 12px;border-bottom:solid 1px var(--border-color);max-width:none;box-sizing:border-box;overflow:visible;white-space:nowrap;text-overflow:ellipsis;display:table-cell}.table-container.resizing{-webkit-user-select:none;user-select:none;pointer-events:none}.table-container.resizing .resize-handle{pointer-events:auto}.sticky-column{position:sticky;background:inherit;z-index:5}.sticky-column .resize-handle{z-index:15}.actionCol{position:sticky;padding:unset!important;align-items:center;z-index:11;right:0;background:var(--header-bg)}.actionCol{min-width:100px!important;width:100px!important;max-width:100px!important}.actionCol .resize-handle{display:none}.table-container{width:100%;overflow-x:auto;overflow-y:auto;border-top:1px solid #e0e0e0;scrollbar-width:none}.table-container::-webkit-scrollbar{display:none}.column-header{display:flex;align-items:center;flex:1;min-width:0;overflow:hidden;padding-right:8px}.ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0}.column-header img{cursor:pointer}.shadow-hidden{position:relative}.shadow-hidden:before{content:\"\";position:absolute;z-index:11;top:-10px;left:0;width:100%;height:10px;background:linear-gradient(to top,var(--scroll-shadow),transparent)}.resize-handle{position:absolute;right:-1px;top:0;bottom:0;width:1px;cursor:col-resize;background:#ccc;z-index:10;transition:background-color .2s ease}.resize-handle:hover{background:#ccc;opacity:.7}.resize-handle:active{background:#ccc;opacity:.9}.columnDiv{position:relative;display:flex;align-items:center;width:100%;height:100%}.search{display:flex;justify-content:space-between;border:1px solid rgba(67,69,85,.3);border-radius:7px;align-self:center;padding:3px}.search-bar{width:100%;margin:5px}.configSearch{height:22px;padding:3px;margin:10p;background-color:#247dff;border-radius:4px}input::placeholder{color:#abafb1}.sort-indicators{display:inline-block;width:10px;padding-left:5px}.sort-direction{font-size:12px;color:var(--text-color);opacity:.7}.tableHeader{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .3s}.tableHeader:hover{background-color:var(--hover-bg)}.search-component{top:163%;left:0;z-index:-10;background-color:#fff;box-shadow:0 2px 10px #0000001a}[dir=rtl] .search-component{left:unset!important}input{border:none}.card{background:#fff;box-shadow:0 2px #0a0a0a1f;border-radius:8px;border-color:#e9e9e9}.fsearch{width:100%;justify-content:space-between;font-weight:400;font-size:13px;display:flex;background:#f0f5ff;border-radius:6px;align-self:center}.content{margin:6px;width:150px}.fsearch-bar{display:flex;flex-direction:row;width:100%;margin:5px;transition:width .3s ease}.search.resized{width:calc(100% - 40px)}.filter-content{width:100%;max-height:150px;padding-left:5px}.label-data{font-weight:200;font-size:12px;color:#434555d9}input[type=checkbox]{height:16px;width:16px;border-radius:5px;margin-left:2px}input[type=checkbox]:after{width:4px;height:7px;left:5px;top:3px;transform:rotate(var(--r, 20deg))}input[type=checkbox]:checked{--r: 43deg}.checkbox-cont{display:flex;align-items:center}.searchinput{border:none;background-color:#f0f5ff;width:85%;font-size:12px;color:#275efe;font-weight:600}.searchSvg{margin-right:3px}.close-icon{margin-left:4px;width:36px;height:32px;cursor:pointer;padding-top:9px;padding-bottom:9px;background-color:#ffefee;color:red;border-radius:4px;transition:background-color .3s ease,color .3s ease}.close-icon:hover{background-color:red;color:#fff}.checkboxdiv{display:flex;align-items:center}.checkboxdiv input{flex-shrink:0}input:focus,input:active,select:focus,select:active,textarea:focus,textarea:active,button:focus,button:active{outline:none!important}@supports (-webkit-appearance: none) or (-moz-appearance: none){input[type=checkbox]{--active: #275EFE;--active-inner: #fff;--focus: 2px rgba(39, 94, 254, .3);--border: #BBC1E1;--border-hover: #275EFE;--background: #fff;--disabled: #F6F8FF;--disabled-inner: #E1E6F9;-webkit-appearance:none;-moz-appearance:none;height:21px;outline:none;display:inline-block;vertical-align:top;position:relative;margin:0;cursor:pointer;border:1px solid var(--bc, var(--border));background:var(--b, var(--background))!important;transition:background .3s,border-color .3s,box-shadow .2s}input[type=checkbox]:after{content:\"\";display:block;left:0;top:0;position:absolute;transition:transform var(--d-t, .3s) var(--d-t-e, ease),opacity var(--d-o, .2s)}input[type=checkbox]:checked{--b: var(--active);--bc: var(--active);--d-o: .3s;--d-t: .6s;--d-t-e: cubic-bezier(.2, .85, .32, 1.2)}input[type=checkbox]:disabled{--b: var(--disabled);cursor:not-allowed;opacity:.9}input[type=checkbox]:disabled:checked{--b: var(--disabled-inner);--bc: var(--border)}input[type=checkbox]:disabled+label{cursor:not-allowed}input[type=checkbox]:hover:not(:checked):not(:disabled){--bc: var(--border-hover)}input[type=checkbox]:focus{box-shadow:0 0 0 var(--focus)}input[type=checkbox]:not(.switch){width:21px}input[type=checkbox]:not(.switch):after{opacity:var(--o, 0)}input[type=checkbox]:not(.switch):checked{--o: 1}input[type=checkbox]+label{font-size:14px;line-height:21px;display:inline-block;vertical-align:top;cursor:pointer;margin-left:4px}input[type=checkbox]:not(.switch){border-radius:7px}input[type=checkbox]:not(.switch):after{width:5px;height:9px;border:2px solid var(--active-inner);border-top:0;border-left:0;left:7px;top:4px;transform:rotate(var(--r, 20deg))}input[type=checkbox]:not(.switch):checked{--r: 43deg}input[type=checkbox].switch{width:38px;border-radius:11px}input[type=checkbox].switch:after{left:2px;top:2px;border-radius:50%;width:15px;height:15px;background:var(--ab, var(--border));transform:translate(var(--x, 0))}input[type=checkbox].switch:checked{--ab: var(--active-inner);--x: 17px}input[type=checkbox].switch:disabled:not(:checked):after{opacity:.6}input[type=checkbox]:indeterminate{--b: var(--active);--bc: var(--active);--d-o: .3s;--d-t: .6s;--d-t-e: cubic-bezier(.2, .85, .32, 1.2)}input[type=checkbox]:indeterminate:after{content:\"\";display:block;left:8px;top:5px;rotate:69deg;position:absolute;width:2px;height:9px;background:var(--active-inner);opacity:6;transition:transform var(--d-t, .3s) var(--d-t-e, ease),opacity var(--d-o, .2s)}}:host{--primary-color: #275EFE;--secondary-color: #6C757D;--text-color: #434555;--border-color: #e0e0e0;--hover-bg: #f9f9f9;--header-bg: #ffffff;--body-bg: #ffffff;--danger-color: #FF2C10;--scroll-shadow: rgba(0, 0, 0, .08);--box-shadow: 0 2px 10px rgba(0, 0, 0, .1)}:host(.dark-theme){--primary-color: #6c8dfa;--text-color: #ffffff;--header-bg: #2c2c2c;--body-bg: #1e1e1e;--border-color: #404040;--hover-bg: #373737}.hyper-link:hover{color:#00f!important;text-decoration:underline;cursor:pointer}.on-edit:hover .edit-icon{visibility:visible}.nxt-lop-input{border-radius:5px;color:#2c3137;font-weight:400;font-size:13px;transition:all .2s}.input-box{border:solid}.inlineAdd{align-items:center;gap:10px;padding-top:10px}.addIconBor{padding:4px;border-radius:5px;border:1px solid #6c757d;transition:background-color .3s,border-color .3s}.addIcon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.addIconBor:hover .addIcon{background-color:#bbd3ff}::ng-deep .modal-backdrop{background-color:#000000b3!important}::ng-deep .modal-backdrop.show{opacity:1!important}.eicon-container:hover .edit-icon svg path{fill:#2163ff!important}.eicon-container:hover .edit-icon{background-color:#c9d2ff!important;cursor:pointer}.eicon-container:hover{border:1px solid #2163ff!important}.dicon-container:hover .delete-icon svg path{stroke:#fff!important;fill:transparent!important}.dicon-container:hover .delete-icon{background-color:#ff7575!important;cursor:pointer}.dicon-container:hover{border:1px solid #ff2121!important}.clickable-img{position:relative;cursor:pointer;padding:2px;border:1px solid #dddddd;border-radius:5px}.clickable-img:hover{border:1px solid rgb(31,105,255);border-radius:5px}.clickable-img:hover div svg{background-color:#ecf3ff!important}.clickable-img:hover div{background-color:#ecf3ff!important}.dropdown-menu{left:unset!important;right:300%;top:12.5px;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 4px 8px #0000001a}.dropdown .dropdown-menu{display:block}.dropdown-menu .btn{display:block;padding:10px;width:100%;text-align:left;background:transparent;border:none;cursor:pointer}[dir=rtl] .search{margin-left:7px}[dir=rtl] .noOfRec{gap:4px}[dir=rtl] .sticky-column{position:sticky;right:0;z-index:11;background:var(--header-bg)}[dir=rtl] .actionCol{position:sticky;padding:unset!important;align-items:center;z-index:11;left:0;background:var(--header-bg)}[dir=rtl] .resize-handle{position:relative;left:0!important;right:14px;width:1.5px;background-color:#dddd}[dir=rtl] .sort-indicators{padding-right:5px}::ng-deep [dir=rtl] nxt-pagination .dropdown-arrow{left:5px;right:unset!important}::ng-deep [dir=rtl] nxt-button .dropdown-menu{right:unset!important;left:0!important}[dir=rtl] .dropdown-menu{left:300%!important;right:unset!important}[dir=rtl] .fc-btn-text{padding-right:10px}.selected-cell{border-left:2px solid #2196F3!important;border-right:2px solid #2196F3!important;position:relative;z-index:1}.selected-column{position:relative;border:2px solid #2196F3!important;border-bottom:none!important;border-radius:4px}.close-column-btn{position:absolute;top:3px;right:3px;width:12px;height:12px;border:solid black .5px;color:#000;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:9px;cursor:pointer;z-index:2}.close-column-btn:hover{background:#f32121!important;border:solid #f32121 .5px!important;color:#fff!important}.table-row:last-child .selected-cell{border-bottom:2px solid #2196F3!important}.hover-content{position:absolute;z-index:1;background:#fff;border:1px solid #ccc;box-shadow:0 2px 5px #00000026;padding:10px;min-width:200px;border-radius:5px;top:70%;left:0;cursor:pointer}.expense-file{text-decoration:none;transition:text-decoration .2s ease-in-out;cursor:pointer}.expense-file:hover{text-decoration:underline;color:#0056b3;cursor:pointer}.popover-container .hover-content{display:none;position:absolute;cursor:pointer}.popover-container:hover .hover-content{display:block;cursor:pointer}.summary-row{font-weight:700}.non-summary-table-cell{display:table-cell;padding:12px;text-overflow:ellipsis;white-space:nowrap;position:relative;color:var(--text-color);border:solid 1px white!important}.summary-table-cell{display:table-cell;padding:12px;text-overflow:ellipsis;white-space:nowrap;position:relative;color:var(--text-color);border:solid 1px var(--border-color)!important;border-top:solid 1.5px var(--border-color)!important}.horizontal-summary-table-cell{display:table-cell;max-width:none;box-sizing:border-box;overflow:visible;white-space:nowrap;padding:12px;text-overflow:ellipsis;position:relative;color:var(--text-color);border:solid 1px white!important;border-top:solid 1px var(--border-color)!important;border-bottom:1px solid var(--border-color)!important}.last-cell{border-right:1px solid var(--border-color)!important}.table-last-cell{border-bottom:1px solid var(--border-color)!important}.skeleton-loader{display:table;width:100%;border-collapse:collapse}.skeleton-row{display:table-row;border-bottom:1px solid var(--border-color)}.skeleton-cell{display:table-cell;padding:12px;height:35px;background:#fff;position:relative}.skeleton-cell:before{content:\"\";position:absolute;inset:3px;background:linear-gradient(90deg,#f5f5f5 25%,#eaeaea,#f5f5f5 75%);background-size:200% 100%;animation:pulse 1.5s infinite linear;border-radius:4px}.skeleton-cell.sticky-column{position:sticky;left:0;z-index:11;background:#f5f5f5}.skeleton-cell.actionCol.sticky-column{position:sticky;right:0;left:auto;background:#f5f5f5}@keyframes pulse{0%{background-position:200% 0}to{background-position:-200% 0}}.form-builder-table-box{height:108px;display:flex;justify-content:center;align-items:center;border:1px dashed #a8a1a1}.no-data{display:flex;align-items:anchor-center;height:60px;justify-content:center}.custom-line{width:100%;border:1px solid #000}\n"], dependencies: [{ kind: "component", type: NxtDatatable, selector: "nxt-datatable", inputs: ["data", "tableFilterData", "columns", "withCheckBox", "searchBar", "tableSaveButton", "stickyColumn", "tableWidth", "actionColumHeader", "actionButton", "title", "isButtons", "buttonArray", "tableId", "isEditRow", "isDeleteRow", "addInlineRecord", "searchConfigs", "direction", "pagination", "actionButtonArray", "multipleFilter", "isPagination", "isNosIndicator", "isEditable", "from", "question", "rowTextSize", "rowTextColor", "apiMeta", "summaryRows", "summaryColumns", "isLoading", "tableConfig", "tableParams", "listViews", "mode", "languageCode", "selectedColumn", "allIcons"], outputs: ["tableRowClick", "onEditData", "saveButtonData", "onDeleteData", "buttonEmit", "hyperLinkEmit", "sideNavEmit", "actionButtonEmit", "columnSelected", "removeColumn", "valueChange", "selectedValues", "fileEmit", "NxtTableParamsEmit", "NxtTableFilterEmit", "hadleDropDownDependent", "NxtTableEmit"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i4.DecimalPipe, name: "number" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NxtButtonComponent, selector: "nxt-button", inputs: ["buttonValue", "buttonType", "type", "buttonDisable", "btnBgColor", "btnBorder", "btnTextColor", "btnHeight", "btnWidth", "btnIconLeftSrc", "btnIconRightSrc", "btnHoverBgColor", "btnHoverTextColor", "btnId", "dataDismiss", "buttonBorder", "modalToTrigger", "isImageSvg", "tabIndex", "buttonConfig", "mode", "languageCode"], outputs: ["buttonClickEmit"] }, { kind: "component", type: NxtPagination, selector: "nxt-pagination", inputs: ["pageSizeOptions", "collectionSize", "pageSize", "currentPage", "maxSize", "firstLastButtons", "nextPreviousButtons", "small"], outputs: ["event"] }, { kind: "pipe", type: NxtSearchFilterPipe, name: "searchFilter" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i7.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "pipe", type: NxtGetValuePipe, name: "getValue" }, { kind: "component", type: PickLocationComponent, selector: "app-pick-location", inputs: ["address", "from", "question", "mode", "apiKey"], outputs: ["locationSelected"] }, { kind: "component", type: IconSelectorComponent, selector: "nxt-icon-selector", inputs: ["allIcons", "themeColor", "height", "tooltipPosition", "selectedIcon", "cdnIconURL", "label", "labelFont", "labelWeight", "inputWeight", "labelSize", "labelColor", "showLabel", "required", "mode", "question", "options"], outputs: ["iconSelected"] }, { kind: "component", type: NxtSearchBox, selector: "nxt-search-box", inputs: ["placeHolderText", "question", "apiMeta", "id", "readOnly", "mode", "from"], outputs: ["searchValueChange"] }, { kind: "component", type: CustomDropdownComponent, selector: "app-custom-dropdown", inputs: ["options", "placeholder", "apiMeta", "selectedValue", "progressBar", "id", "readOnly", "errorMessage", "error", "fromShengel", "question", "referenceField", "token", "mode", "from"], outputs: ["valueChange"] }, { kind: "component", type: CustomRadioComponent, selector: "app-custom-radio", inputs: ["options", "question", "apiMeta", "selectedValue", "progressBar", "id", "readOnly", "errorMessage", "error", "fromShengel", "referenceField", "token", "mode"], outputs: ["valueChange"] }, { kind: "component", type: NxtFileUploadComponent, selector: "app-file-upload", inputs: ["allFiles", "limitFileUploading", "mode", "isShowNoFileIcon", "question", "error", "from"], outputs: ["selectedFileData", "deletedFileData"] }, { kind: "component", type: NxtInput, selector: "nxt-input", inputs: ["label", "labelFont", "labelWeight", "inputWeight", "labelSize", "inputValueSize", "labelColor", "showLabel", "svgHeight", "svgWidth", "type", "inputIconRightSrc", "inputIconLeftSrc", "required", "minLength", "pattern", "errorMessages", "maxLength", "placeholder", "inputBgColor", "inputBorder", "placeholderColor", "placeholderFont", "placeholderWeight", "placeholderSize", "inputTextColor", "inputHeight", "inputWidth", "inputId", "inputBorderSize", "inputConfig", "confPassVal", "confPass", "mode", "value", "question", "showSuggestion", "ariaOwns", "ariaHasPopup", "isLoading", "options", "minDate", "maxDate", "rows", "from", "hyperLink", "size"], outputs: ["valueChange", "inputValue", "onBlur", "onFocus", "toggleEmit", "nativeInputRef", "removeValueEmit", "hyperlinkEmit"] }, { kind: "component", type: ListViewFilterComponent, selector: "app-list-view-filter", inputs: ["listViews", "tableFilterArray", "selectedView", "displayedColumns", "availableOperators"], outputs: ["listViewEmit"] }, { kind: "pipe", type: NxtCustomTranslatePipe, name: "nxtCustomTranslate" }, { kind: "pipe", type: QuestionByRowPipe, name: "questionByRow" }] });
1594
1594
  }
1595
1595
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: NxtDatatable, decorators: [{
1596
1596
  type: Component,
@@ -1612,9 +1612,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1612
1612
  NxtFileUploadComponent,
1613
1613
  NxtInput,
1614
1614
  ListViewFilterComponent,
1615
- NxtCustomTranslatePipe
1615
+ NxtCustomTranslatePipe,
1616
+ QuestionByRowPipe
1616
1617
  // RowResizerDirective
1617
- ], template: "<div class=\"table-layout\" [id]=\"tableId\" [ngStyle]=\"{'padding-top': '1px', 'width': tableWidth}\" [dir]=\"direction\">\n <div>\n <div *ngIf=\"title\" class=\"d-flex justify-content-center table-title align-text-center\">\n {{title}}\n </div>\n <div *ngIf=\"isNosIndicator || searchBar || isButtons\" class=\"flex justify-content-between\"\n style=\"padding-bottom: 20px;\">\n <div class=\"flex\">\n <!-- SKS26APR25 List View Filter -->\n <app-list-view-filter *ngIf=\"listViews && listViews.length > 0\" [listViews]=\"listViews\"\n [selectedView]=\"selectedView\" [displayedColumns]='columns' [tableFilterArray]=\"tableFilterArray\"\n (listViewEmit)=\"listViewEmit($event)\">\n </app-list-view-filter>\n <div *ngIf=\"(!listViews || listViews.length === 0) && isNosIndicator\" class=\"noOfRec\"\n style=\"display: flex; align-items: flex-end;\">\n <p style=\"font-weight: 500; margin-right: 5px; margin-bottom: 0px;\">\n {{ 'APP.NOS' | nxtCustomTranslate : 'Nos'}} </p>\n <div style=\"color: rgb(43, 87, 249);\">{{totalRecords || totalCount}}</div>\n </div>\n </div>\n\n <div class=\"flex\" style=\"align-items: center;\">\n <div *ngIf=\"searchBar\" class=\"search\">\n <div class=\"flex search-bar\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.6413 19.25C16.6322 19.25 20.6781 15.3511 20.6781 10.5417C20.6781 5.73218 16.6322 1.83333 11.6413 1.83333C6.6504 1.83333 2.60449 5.73218 2.60449 10.5417C2.60449 15.3511 6.6504 19.25 11.6413 19.25Z\"\n stroke=\"#787486\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M21.6295 20.1667L19.7271 18.3333\" stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <input type=\"text\" placeholder=\"{{ 'APP.SEARCH' | nxtCustomTranslate : 'Search' }}\"\n (keyup)=\"searchConfigs ? emptySearch($event.target.value) : applyFilter($event.target.value)\"\n [value]=\"searchBoxValue || ''\" #input>\n <svg *ngIf=\"searchConfigs && searchBar\" class=\"configSearch\" (click)=\"onSearch(input.value)\"\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 5H20\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M14 8H17\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M21 11.5C21 16.75 16.75 21 11.5 21C6.25 21 2 16.75 2 11.5C2 6.25 6.25 2 11.5 2\"\n stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M22 22L20 20\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <div class=\"flex\" *ngIf=\"isButtons\" style=\"padding-left: 7px; gap: 7px;\">\n <div class=\"flex\" *ngFor=\"let button of buttonArray\">\n <nxt-button class=\"data-table-fsbtn\"\n (buttonClickEmit)=\"(button.type === 'group' || button.type === 'dropdown') ? commonButtonClick($event) : commonButtonClick(button)\"\n [buttonType]=\"button.class\"\n [buttonValue]=\"button.labelPath || button.label || button.name | nxtCustomTranslate : button.label || button.name \"\n [buttonConfig]=\"button.buttonConfig\" [type]=\"button.type\" class=\"ms-2 me-2\"\n [btnIconLeftSrc]=\"button.btnIconLeftSrc\" [isImageSvg]=\"button.isImageSvg\">\n </nxt-button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-margin\">\n <div class=\"table-container\"\n [ngClass]=\"{ 'resizing': isResizing }\"\n [ngStyle]=\"{ maxHeight: isPagination ? '450px' : 'auto', minHeight: dataSource.data && dataSource?.data?.length === 0 && !isLoading && from !== 'formBuilder' ? '0px' : '100px' }\"\n #tableContainer (scroll)=\"onScroll(tableContainer)\">\n <ng-container>\n <div class=\"custom-table\">\n <!--SKS15FEB25 Table Header -->\n <div class=\"table-header\" [ngClass]=\"{ 'shadow': isScrolled }\">\n <div class=\"table-row\">\n <!--SKS15FEB25 Checkbox Column -->\n <div *ngIf=\"withCheckBox\" class=\"table-cell sticky-column head-color\" [style.width]=\"'50px'\">\n <input type=\"checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"masterToggle()\"\n [checked]=\"selection?.hasValue()\"\n [indeterminate]=\"selection?.hasValue() && !isAllSelected()\"\n class=\"custom-checkbox\">\n </div>\n\n <!--SKS15FEB25 Data Columns -->\n <ng-container *ngFor=\"let column of currentColumns; let i = index\">\n <div *ngIf=\"column.summaryColumn !== true && column.summaryRow !== true && column.isHide !== true\"\n class=\"table-cell tableHeader head-color\"\n [class.sticky-column]=\"i === (stickyCondition - 1)\"\n [class.active-column]=\"activeColumn === column.uniqueIdentifier\"\n [class.selected-column]=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n (click)=\"$event.stopPropagation(); onColumnClick(column.uniqueIdentifier); column.sort ? sortData(column.fieldName) : ''\"\n (mouseenter)=\"hoveredColumn = column.fieldName\" (mouseleave)=\"hoveredColumn = null\"\n [style.width]=\"column.width || '100px'\"\n [style.flex]=\"'0 0 ' + (column.width || '100px')\"\n [style.min-width]=\"'50px'\">\n <div class=\"columnDiv\">\n <div class=\"column-header\" [style.width]=\"column.width || '100px'\">\n <!-- Add close button for selected column -->\n <div *ngIf=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n class=\"close-column-btn\"\n (click)=\"$event.stopPropagation(); removeCol(column.uniqueIdentifier)\">\n \u2715\n </div>\n <div class=\"ellipsis\" style=\"flex: 1;\" [title]=\"column.label\">\n {{ column.labelPath || column.label | nxtCustomTranslate : column.label }}\n </div>\n <div>\n <svg *ngIf=\"column.filter\"\n (click)=\"$event.stopPropagation(); filter(column.fieldName)\"\n style=\"padding-right: 2px;\" width=\"12\" height=\"11\"\n viewBox=\"0 0 12 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10.75 1.25H0.75L4.75 5.71722V8.80556L6.75 9.75V5.71722L10.75 1.25Z\"\n stroke=\"#242533\" stroke-width=\"1.2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <!--SKS15FEB25 Red dot for active filter -->\n <circle\n *ngIf=\"filterDataArray && filterDataArray[column.fieldName]?.length > 0\"\n cx=\"9\" cy=\"2\" r=\"2.5\" fill=\"red\"></circle>\n </svg>\n <div *ngIf=\"column.sort\"\n class=\"sort-indicators\">\n <span *ngIf=\"currentSortColumn === column.fieldName\" class=\"sort-direction\">\n {{ currentSortDirection === 'asc' ? '\u2191' : currentSortDirection\n === 'desc' ? '\u2193' : '' }}\n </span>\n <span\n *ngIf=\"hoveredColumn === column.fieldName && currentSortColumn !== column.fieldName\"\n class=\"sort-direction\">\n \u2191\n </span>\n </div>\n <div *ngIf=\"searchFilter && column.fieldName === selectedFilter\"\n class=\"search-component position-absolute\"\n (click)=\"$event.stopPropagation();\">\n <div class=\"card\">\n <div class=\"content\">\n <div class=\"flex\">\n <div class=\"fsearch\" [class.resized]=\"isResized\">\n <div class=\"fsearch-bar\">\n <svg class=\"searchSvg\" width=\"18\" height=\"20\"\n viewBox=\"0 0 24 22\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.6413 19.25C16.6322 19.25 20.6781 15.3511 20.6781 10.5417C20.6781 5.73218 16.6322 1.83333 11.6413 1.83333C6.6504 1.83333 2.60449 5.73218 2.60449 10.5417C2.60449 15.3511 6.6504 19.25 11.6413 19.25Z\"\n stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M21.6295 20.1667L19.7271 18.3333\"\n stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n <input class=\"width-100\" type=\"text\"\n placeholder=\"{{ 'APP.SEARCH' | nxtCustomTranslate : 'Search' }}\"\n [(ngModel)]=\"searchText\"\n class=\"searchinput\">\n </div>\n </div>\n <svg *ngIf=\"isResized\" (click)=\"closefilter()\"\n class=\"close-icon\" width=\"24\" height=\"24\"\n viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.16998 14.83L14.83 9.17001\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M14.83 14.83L9.16998 9.17001\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9 22H15C20 22 22 20 22 15V9C22 4 20 2 15 2H9C4 2 2 4 2 9V15C2 20 4 22 9 22Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"filter-content\" [style]=\"'overflow-y: auto'\">\n <div *ngFor=\"let data of filterArray | searchFilter : searchText\">\n <div class=\"mt-3 mb-3 checkboxdiv\"\n style=\"gap: 5px;\">\n <input type=\"checkbox\"\n [checked]=\"isSelected(data)\" [value]=\"data\"\n [id]=\"data\" (change)=\"checkedData(data)\">\n <div class=\"ms-2 label-data\">{{data}}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Enhanced resize handle -->\n <div class=\"resize-handle\" \n (mousedown)=\"onResizeStart($event)\"\n title=\"Drag to resize column\"></div>\n </div>\n </div>\n </ng-container>\n\n <!--SKS15FEB25 Action Column -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"table-cell head-color actionCol sticky-column\"\n [style.width]=\"'150px'\"\n style=\"padding: 12px !important;\">\n {{ actionColumHeader | nxtCustomTranslate : 'Action'}}\n </div>\n </div>\n </div>\n\n <!--SKS15FEB25 Table Body -->\n <div class=\"table-body\" *ngIf=\"!isLoading\">\n <div *ngFor=\"let element of dataSource.data; let i = index\" class=\"table-row\"\n (click)=\"tableClick(element)\">\n <!--SKS15FEB25 Checkbox Cell -->\n <div *ngIf=\"withCheckBox\" class=\"table-cell sticky-column body-color\">\n <input type=\"checkbox\" class=\"custom-checkbox\" (click)=\"$event.stopPropagation()\"\n (change)=\"separateRowSelect(selection.toggle(element), element)\"\n [checked]=\"selection.isSelected(element)\"\n [disabled]=\"(element.isPayProcessed === true)\">\n </div>\n\n <!--SKS15FEB25 Data Cells -->\n <ng-container *ngFor=\"let column of currentColumns; let last = last; ellipsis\">\n <div *ngIf=\"column.summaryColumn !== true && column.summaryRow !== true && column.isHide !== true\"\n class=\"table-cell body-color\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n [style.width]=\"column.width || '100px'\"\n [style.flex]=\"'0 0 ' + (column.width || '100px')\"\n [style.min-width]=\"'50px'\"\n [style.max-width]=\"column.width || '100px'\">\n <div>\n <div>\n <!-- SKS22JUL25 calendar -->\n <div *ngIf=\"column.type === 'calendar'\">\n <!-- <app-custom-calendar [question]=\"getUpdatedQuestion(column.fieldName, element, i)\" (eventSelected)=\"getCalendarEvent($event)\"\n (dateSelected)=\"getCurrentCalendar($event)\" (openModal)=\"openCalendarModal($event)\"\n (closeModal)=\"closeCalendarModal($event)\"></app-custom-calendar>\n <app-custom-model *ngIf=\"isCalendarModalOpen\" [modalTitle]=\"calendarModalTitle\"\n [isModalOpen]=\"isCalendarModalOpen\" [modalSize]=\"calendarModalSize\"\n [saveButtonValue]=\"calendarSaveButtonValue\" [modalFooter]=\"modalCalendarModalFooter\"\n (saveButtonEmit)=\"onCalendarModalSave()\" (cancelButtonEmit)=\"closeCalendarModal($event)\">\n <lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\"\n (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\n </app-custom-model> -->\n </div>\n\n <!-- SKS22JUL25 for pick location -->\n <app-pick-location *ngIf=\"column.type === 'location'\" [apiKey]=\"column['apiKey']\" [address]=\"question.selectedValue\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (locationSelected)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-pick-location>\n\n <!-- SKS22JUL25 Image -->\n <div *ngIf=\"column.type === 'image'\" (mouseenter)=\"isImageHover = true;\"\n (mouseleave)=\"isImageHover = false;\">\n <!-- <div *ngIf=\"isImageHover\" style=\"display: flex; justify-content: end;\">\n <svg *ngIf=\"!column.question?.isReadOnly\" (click)=\"onImageEdit(column.question)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n <svg *ngIf=\"!column.question?.isReadOnly\" (click)=\"onImageDelete(column.question)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div> -->\n <img *ngIf=\"column.question?.isReadOnly\" [src]=\"column.question?.imageData\" />\n <!-- <div *ngIf=\"!column.question?.isReadOnly\" class=\"logo-container\">\n Logo preview area\n <div class=\"logo-preview\" *ngIf=\"column.question?.input\">\n <img [src]=\"column.question?.imageData\" />\n </div>\n\n Upload button\n <div *ngIf=\"!column.question?.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>Upload Image</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\"\n (change)=\"fileChangeEvent(column.question, $event)\" style=\"display: none;\" />\n </div>\n </div> -->\n </div>\n <!-- SKS22JUL25 icon-selector -->\n <nxt-icon-selector [allIcons]=\"allIcons\" *ngIf=\"column.type === 'icon'\" [required]=\"column.question?.isOptional\" [mode]=\"mode\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\" [labelFont]=\"column.question?.font\"\n [label]=\"column.question?.questionText\"\n [labelColor]=\"column.question?.fontColor\"\n [labelSize]=\"column.question?.fontSize\" [labelWeight]=\"column.question?.fontWeight\" [showLabel]=\"column.question?.style?.showLabel\" (iconSelected)=\"updateEdit(i,$event,element,column.fieldName)\"></nxt-icon-selector>\n\n <!-- SKS22JUL25 line -->\n <hr *ngIf=\"column.type === 'line'\" class=\"custom-line\" style=\"display: inline-flex\" />\n <!-- SKS22JUL25 data table -->\n <nxt-datatable *ngIf=\"column.type === 'table'\" isEditRow isDeleteRow actionButton isButtons [question]=\"getUpdatedQuestion(column.fieldName, element, i)\" from=\"formBuilder\"\n (valueChange)=\"updateEdit(i,$event.data,element,column.fieldName)\" [apiMeta]=\"column.question?.subText\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n [tableConfig]=\"column.question?.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\">\n </nxt-datatable>\n <!-- SKS22JUL25 list -->\n <nxt-search-box *ngIf=\"column.type === 'list'\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\" [readOnly]=\"column.question?.isReadOnly\" [apiMeta]=\"column.question?.subText\"\n [id]=\"column.question?.id\" [placeHolderText]=\"column.question?.question || ''\" \n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (searchValueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </nxt-search-box>\n\n <!-- SKS22JUL25 Dropdown -->\n <app-custom-dropdown *ngIf=\"column?.type === 'dropdown' && column.question?.options\" [options]=\"column.question?.options\" [apiMeta]=\"column.question?.subText\"\n [id]=\"column.question?.id\" [selectedValue]=\"column.isShengel ? column.question?.input : column.question?.selectedValue\"\n placeholder=\"\"\n [errorMessage]=\"column.question?.errorMessage\" [error]=\"column.question?.error\" [referenceField]=\"column.question?.referenceField\"\n [readOnly]=\"column.question?.isReadOnly\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (valueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-custom-dropdown>\n <!-- SKS22JUL25 custom-radio component -->\n <div *ngIf=\"column.type === 'radio' && column.question?.options\" class=\"\">\n <app-custom-radio [options]=\"column.question?.options\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\" [apiMeta]=\"column.question?.subText\" [id]=\"column.question?.id\"\n [selectedValue]=\"column.question?.selectedValue\" [errorMessage]=\"column.question?.errorMessage\" [error]=\"column.question?.error\"\n [referenceField]=\"column.question?.referenceField\" [readOnly]=\"column.question?.isReadOnly\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n (valueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-custom-radio>\n </div>\n\n <!-- SKS22JUL25 Attachment / Files -->\n <app-file-upload *ngIf=\"column.type === 'file'\" [limitFileUploading]=\"5\" [error]=\"column.question?.error\" [question]=\"getUpdatedQuestion(column.fieldName, element, i)\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n [allFiles]=\"column.question?.input\" (selectedFileData)=\"updateEdit(i,$event.value,element,column.fieldName)\"\n >\n </app-file-upload>\n <!-- SKS22JUL25 Button -->\n <nxt-button\n *ngIf=\"column.type === 'button'\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n [btnHeight]=\"'50px'\" [btnWidth]=\"'150px'\" [buttonValue]=\"column.question?.question\"\n (buttonClickEmit)=\"updateEdit(i,$event,element,column.fieldName)\"\n >\n </nxt-button>\n <!-- SKS22JUL25 book type -->\n <!-- <lib-questionbook *ngIf=\"column.type === 'book'\" [qbItem]=\"column.question?.qbItem\"\n [questions]=\"readQuestions(column.question?.qbReference, column.question?.qbReferenceQuestions)\"\n (handleDropDown)=\"getDropDown($event)\">\n </lib-questionbook> -->\n <!-- SKS22JUL25 Text, Email, label, number, Boolean, rich text editor, DateTime, Date, Time-->\n <nxt-input *ngIf=\"column.type === undefined || column.type === 'text' || column.type === 'email' || column.type === 'number' || column.type === 'label' || column.type === 'boolean' || column.type === 'richtextarea' || column.type === 'datetime' || column.type === 'date' || column.type === 'time' || column.type === 'textarea'\"\n [type]=\"column.type === 'boolean' ? 'checkbox' : column.type === 'richtextarea' ? 'richtext' : column.type === undefined ? 'text' : column.type \"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n [value]=\"element | getValue: column.fieldName \"\n [hyperLink]=\"column.hyperLink\"\n (hyperlinkEmit)=\"onClickHyperlink(column.fieldName,element, column.hyperLink)\"\n [question]=\"getUpdatedQuestion(column.fieldName, element, i)\"\n [labelFont]=\"column.question?.font\"\n [label]=\"column.question?.questionText\"\n [labelColor]=\"column.question?.fontColor\"\n [labelSize]=\"column.question?.fontSize\"\n [inputValueSize]=\"column.question?.fontSize\"\n [labelWeight]=\"column.question?.fontWeight\"\n [inputWeight]=\"column.question?.fontWeight\"\n [showLabel]=\"column.question?.style?.showLabel\"\n inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"column.question?.question\"\n [required]=\"column.question?.isOptional\" inputBgColor=\"#FAFAFA\"\n [inputId]=\"column.question?.trackingId\"\n [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"column.question?.iconLeftSrc\" \n [minDate]=\"column.question?.minDate\"\n [rows]=\"3\"\n (inputValue)=\"updateEdit(i,$event.value,element,column.fieldName)\"\n >\n </nxt-input>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!--SKS15FEB25 Action Buttons -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\" class=\"table-cell actionCol\">\n <div class=\"actionButton\" style=\"display: flex; align-items: center;\">\n\n <!--SKS15FEB25 Edit Button -->\n <div *ngIf=\"isEditRow\" class=\"eicon-container\"\n matTooltip=\"{{ 'APP.EDIT_RECORD' | nxtCustomTranslate : 'Edit Record' }}\"\n style=\"padding: 2px; border: 1px solid #dcdcdc; border-radius: 5px; margin-left: 3px; margin-right: 3px;\">\n <div class=\" edit-icon\"\n style=\"padding: 2px 4px; border-radius: 5px; background-color: #f5f5f5;\">\n <svg (click)=\"onEdit(element)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n </div>\n </div>\n\n\n <!--SKS15FEB25 Delete Button -->\n <div *ngIf=\"isDeleteRow\" class=\"dicon-container\"\n [matTooltip]=\"'APP.DELETE_RECORD' | nxtCustomTranslate : 'Delete Record'\"\n style=\"padding: 2px; border: 1px solid #ffb5b5; border-radius: 5px; margin-left: 3px; margin-right: 3px;\">\n <div class=\"delete-icon\"\n style=\"padding: 2px 4px; border-radius: 5px; background-color: #feeeed;\">\n <svg (click)=\"deleteRecord(element,i)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\"\n stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\"\n stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <!--SKS15FEB25 Render inline buttons up to Size -->\n <div *ngFor=\"let button of actionButtonArray?.buttonArray; let i = index\">\n <div *ngIf=\"i < actionButtonArray?.size\"\n style=\" margin-left: 3px; margin-right: 3px;\">\n <div *ngIf=\"isConditionMet(element, button.conditions)\"\n [matTooltip]=\"button.tooltipPath || button.tooltip | nxtCustomTranslate : button.tooltip \"\n (click)=\"actionButtonClicked(button,element)\"\n (mouseenter)=\"$event.target.style.border = '1px solid ' + button.hoverBorderColor\"\n (mouseleave)=\"$event.target.style.border = '1px solid ' + button.borderColor\"\n style=\"padding: 2px; border-radius: {{button.borderRadius}}px; border: 1px solid {{button.borderColor}};\">\n <div (mouseenter)=\"$event.target.style.backgroundColor = button.hoverBackgroundColor\"\n (mouseleave)=\"$event.target.style.backgroundColor = button.backgroundColor\"\n style=\"padding: {{button.padding}}px {{button.padding + 2}}px; border-radius: {{button.borderRadius}}px; background-color: {{button.backgroundColor}};\">\n <img *ngIf=\"button.iconSrc\" #imgElement [src]=\"button.iconSrc\"\n (mouseenter)=\"imgElement.src = button.hoverIconSrc || button.iconSrc\"\n (mouseleave)=\"imgElement.src = button.iconSrc\">\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"dropdownActionButton && dropdownActionButton.length > 0\"\n class=\"dropdown\">\n <div class=\"clickable-img\" (click)=\"toggleDropdown(i)\"\n style=\" margin-left: 3px; margin-right: 3px;\">\n <div\n style=\"background-color: #f5f5f5; padding: 2px 4px; border-radius: 5px;\">\n <svg style=\"background-color: #f5f5f5; border-radius: 5px; border: 1px solid #6c757d;\"\n width=\"16\" height=\"16\" viewBox=\"0 0 40 40\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M19.9999 25.6667C23.6818 25.6667 26.6666 22.6819 26.6666 19C26.6666 15.3181 23.6818 12.3334 19.9999 12.3334C16.318 12.3334 13.3333 15.3181 13.3333 19C13.3333 22.6819 16.318 25.6667 19.9999 25.6667Z\"\n fill=\"#292D32\" stroke=\"#292D32\" stroke-width=\"1.5\"\n stroke-miterlimit=\"10\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M17.6467 18.16L20.0001 20.5067L22.3534 18.16\"\n stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <div class=\"dropdown-menu\"\n [style.right]=\"((actionButtonArray?.size ?? 0) - (actionButtonArray?.buttonArray?.size ?? 0) + (isEditRow ? 1 : 0) + (isDeleteRow ? 1 : 0) + (dropdownActionButton?.length > 0 ? 1 : 0)) * 100 + '%'\"\n *ngIf=\"currentOpenIndex === i\">\n <div *ngFor=\"let btn of dropdownActionButton\">\n <button *ngIf=\"isConditionMet(element, btn.conditions)\"\n [attr.data-id]=\"element.id\" style=\"display: flex;\" type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [matTooltip]=\"btn.tooltipPath || btn.tooltip | nxtCustomTranslate : btn.tooltip\"\n [disabled]=\"btn.buttonDisable\"\n (click)=\"actionButtonClicked(btn,element)\">\n <img *ngIf=\"btn.iconSrc\" [src]=\"btn.iconSrc\">\n <div class=\"fc-btn-text\" style=\"padding-left: 10px;\">\n {{btn.name}}</div>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- SKS20MAR25 Summary Rows -->\n <ng-container\n *ngIf=\"summaryRows && summaryRows.length > 0 && dataSource.data && dataSource?.data?.length > 0 && !isLoading\">\n <ng-container *ngIf=\"!isFullTableSummaryRow && isSummaryColumn\">\n <div *ngFor=\"let row of summaryRows\" class=\"table-row summary-row\">\n <!-- Label in the first column -->\n <div *ngIf=\"withCheckBox\" class=\"non-summary-table-cell\"></div>\n <!-- Empty cells to align with data columns -->\n <div *ngFor=\"let col of isSummaryStartColumn; let last = last\"\n class=\"non-summary-table-cell\" [class.last-cell]=\"last\">\n </div> <!-- Value or input in the last column -->\n <div class=\"summary-table-cell\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\"\n (click)=\"$event.stopPropagation(); onColumnClick(row.uniqueIdentifier)\">{{ row.label }}\n </div>\n <div class=\"summary-table-cell\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\">\n <ng-container *ngIf=\"row.type === 'calculation'\">\n <!-- Add close button for selected column -->\n <div *ngIf=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\"\n class=\"close-column-btn\"\n (click)=\"$event.stopPropagation(); removeCol(row.uniqueIdentifier)\">\n \u2715\n </div>\n {{ summaryValues[row.fieldName] | number }}\n </ng-container>\n <ng-container *ngIf=\"row.type === 'input'\">\n <input type=\"number\" [(ngModel)]=\"summaryValues[row.fieldName]\"\n (ngModelChange)=\"onSummaryInputChange()\"\n class=\"nxt-lop-input table-width\"\n style=\"font-size: {{ rowTextSize ? rowTextSize : '13px' }}; color: {{rowTextColor ? rowTextColor : '#2c3137'}};\">\n </ng-container>\n </div>\n <!-- SKS20MAR25 Empty cells to align with data columns -->\n <div *ngFor=\"let col of isSummaryEndColumn; let last = last\"\n class=\"non-summary-table-cell\">\n </div>\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"non-summary-table-cell actionCol sticky-column\">\n </div>\n </div>\n </ng-container>\n <!-- SKS13JUN25 full table summary row -->\n <ng-container *ngIf=\"isFullTableSummaryRow\">\n <div *ngFor=\"let row of summaryRows\" class=\"table-row summary-row\">\n <!-- SKS13JUN25 Checkbox column (if enabled) -->\n <div *ngIf=\"withCheckBox\" class=\"horizontal-summary-table-cell\">\n {{ row.labelPath || row.label | nxtCustomTranslate : row.label }}\n </div>\n\n <!-- SKS13JUN25 summary cell -->\n <div *ngFor=\"let col of currentColumns; let last = last\"\n class=\"horizontal-summary-table-cell\" style=\"text-align: left;\">\n @if (row?.columns?.includes(col.fieldName)) {\n {{ summaryValues[col.fieldName] | number }}\n }\n </div>\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"horizontal-summary-table-cell actionCol sticky-column\">\n </div>\n </div>\n </ng-container>\n </ng-container>\n <!--SKS28MAR25 In the Loading section -->\n <div class=\"table-body\" *ngIf=\"isLoading\">\n <!-- Repeat for 5 skeleton rows -->\n <div *ngFor=\"let _ of [1,2,3,4,5]\" class=\"table-row\">\n <!-- Checkbox Column -->\n <div *ngIf=\"withCheckBox\" class=\"skeleton-cell sticky-column\"></div>\n\n <!-- Data Columns -->\n <div *ngFor=\"let col of currentColumns\" class=\"skeleton-cell \"></div>\n\n <!-- Action Column -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\" class=\"skeleton-cell actionCol\">\n </div>\n </div>\n </div>\n <!-- <div *ngIf=\"dataSource.data && dataSource?.data?.length === 0 && !isLoading && from === 'formBuilder'\" class=\"form-builder-table-box\">\n Add / drags fields from elements sections\n </div> -->\n </div>\n </ng-container>\n </div>\n <!--SKS15FEB25 No Data Row -->\n <div *ngIf=\"dataSource.data && dataSource?.data?.length === 0 && !isLoading && from !== 'formBuilder'\"\n class=\"no-data\">\n {{'APP.NO_RECORDS_OR_DATA_FOUND' | nxtCustomTranslate : 'No records/data found.'}}\n </div>\n <!--SKS15FEB25 Pagination -->\n <div [class.shadow-hidden]=\"isShadowHidden\">\n <!-- table input save button changes -->\n <div class=\"d-flex inlineAdd justify-content-end\">\n <div class=\"flex addIconBor cursor-pointer\" *ngIf=\"addInlineRecord \"\n (click)=\"addTableRecord(inlineElement)\"\n matTooltip=\"{{ 'APP.ADD_RECORD'| nxtCustomTranslate : 'Add Record'}}\">\n <div class=\"addIcon\">\n <svg class=\"nav-icon\" xmlns=\"http://www.w3.org/2000/svg\" height=\"24\"\n viewBox=\"0 -960 960 960\" width=\"24\">\n <path\n d=\"M440-280h80v-160h160v-80H520v-160h-80v160H280v80h160v160Zm40 200q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\" />\n </svg>\n </div>\n </div>\n <!--SKS15FEB25 removed button disable logic, added another condition for button showing-->\n <!--SKS15FEB25 SR06JAN2025 button disable logic for not select any employee-->\n <nxt-button *ngIf=\"(isReadOnlyArray || tableSaveButton) && from != 'formBuilder'\"\n buttonType=\"btn btn-primary\" [buttonDisable]=\"selection?.selected?.length === 0\"\n (buttonClickEmit)=\"saveButton()\"\n buttonValue=\"{{ 'APP.SAVE' | nxtCustomTranslate : 'Save' }}\"></nxt-button>\n </div>\n <nxt-pagination *ngIf=\"isPagination\" [pageSizeOptions]=\"pageSizeOptions\"\n [collectionSize]=\"configPagination ? totalRecords || totalCount : filterTableNos\"\n [pageSize]=\"pageSize\" [currentPage]=\"pageIndex\" [firstLastButtons]=\"true\"\n (event)=\"pageParams($event)\">\n </nxt-pagination>\n </div>\n </div>\n </div>\n</div>\n\n<!--SKS15FEB25 alert on deleting record -->\n<div *ngIf=\"deleteModal\" class=\"modal modal-backdrop show d-block\" id=\"deleteRecord\" tabindex=\"-1\"\n aria-labelledby=\"deleteRecordLabel\" [attr.aria-hidden]=\"!deleteModal\">\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <b class=\"modal-title fs-5\" id=\"deleteRecordLabel\">{{ 'APP.DELETE_RECORD'| nxtCustomTranslate : 'Delete Record'}}</b>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"deleteModal = false\"></button>\n </div>\n <div class=\"modal-body\">\n {{ 'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE_THE_REC'| nxtCustomTranslate : 'Are you sure you want to delete the record'}} ?\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\" (click)=\"deleteModal = false\">{{\n 'APP.NO'| nxtCustomTranslate : 'No'}}</button>\n <button type=\"button\" class=\"btn btn-primary\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"deleteRecordData()\">{{ 'APP.YES'| nxtCustomTranslate : 'Yes'}}</button>\n </div>\n </div>\n </div>\n</div>", styles: [".custom-table{display:table;width:100%;border-collapse:collapse;table-layout:fixed;direction:var(--direction);background:var(--body-bg)}.table-header{display:table-header-group;position:sticky;top:0;z-index:100;box-shadow:none;transition:box-shadow .3s ease-in-out;background:var(--header-bg)}.shadow{box-shadow:0 4px 5px #0001!important}.table-body{display:table-row-group}.table-row{display:table-row;min-height:40px}.table-cell{position:relative;min-width:50px;padding:12px 0 12px 12px;border-bottom:solid 1px var(--border-color);max-width:none;box-sizing:border-box;overflow:visible;white-space:nowrap;text-overflow:ellipsis;display:table-cell}.table-container.resizing{-webkit-user-select:none;user-select:none;pointer-events:none}.table-container.resizing .resize-handle{pointer-events:auto}.sticky-column{position:sticky;background:inherit;z-index:5}.sticky-column .resize-handle{z-index:15}.actionCol{position:sticky;padding:unset!important;align-items:center;z-index:11;right:0;background:var(--header-bg)}.actionCol{min-width:100px!important;width:100px!important;max-width:100px!important}.actionCol .resize-handle{display:none}.table-container{width:100%;overflow-x:auto;overflow-y:auto;border-top:1px solid #e0e0e0;scrollbar-width:none}.table-container::-webkit-scrollbar{display:none}.column-header{display:flex;align-items:center;flex:1;min-width:0;overflow:hidden;padding-right:8px}.ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0}.column-header img{cursor:pointer}.shadow-hidden{position:relative}.shadow-hidden:before{content:\"\";position:absolute;z-index:11;top:-10px;left:0;width:100%;height:10px;background:linear-gradient(to top,var(--scroll-shadow),transparent)}.resize-handle{position:absolute;right:-1px;top:0;bottom:0;width:1px;cursor:col-resize;background:#ccc;z-index:10;transition:background-color .2s ease}.resize-handle:hover{background:#ccc;opacity:.7}.resize-handle:active{background:#ccc;opacity:.9}.columnDiv{position:relative;display:flex;align-items:center;width:100%;height:100%}.search{display:flex;justify-content:space-between;border:1px solid rgba(67,69,85,.3);border-radius:7px;align-self:center;padding:3px}.search-bar{width:100%;margin:5px}.configSearch{height:22px;padding:3px;margin:10p;background-color:#247dff;border-radius:4px}input::placeholder{color:#abafb1}.sort-indicators{display:inline-block;width:10px;padding-left:5px}.sort-direction{font-size:12px;color:var(--text-color);opacity:.7}.tableHeader{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .3s}.tableHeader:hover{background-color:var(--hover-bg)}.search-component{top:163%;left:0;z-index:-10;background-color:#fff;box-shadow:0 2px 10px #0000001a}[dir=rtl] .search-component{left:unset!important}input{border:none}.card{background:#fff;box-shadow:0 2px #0a0a0a1f;border-radius:8px;border-color:#e9e9e9}.fsearch{width:100%;justify-content:space-between;font-weight:400;font-size:13px;display:flex;background:#f0f5ff;border-radius:6px;align-self:center}.content{margin:6px;width:150px}.fsearch-bar{display:flex;flex-direction:row;width:100%;margin:5px;transition:width .3s ease}.search.resized{width:calc(100% - 40px)}.filter-content{width:100%;max-height:150px;padding-left:5px}.label-data{font-weight:200;font-size:12px;color:#434555d9}input[type=checkbox]{height:16px;width:16px;border-radius:5px;margin-left:2px}input[type=checkbox]:after{width:4px;height:7px;left:5px;top:3px;transform:rotate(var(--r, 20deg))}input[type=checkbox]:checked{--r: 43deg}.checkbox-cont{display:flex;align-items:center}.searchinput{border:none;background-color:#f0f5ff;width:85%;font-size:12px;color:#275efe;font-weight:600}.searchSvg{margin-right:3px}.close-icon{margin-left:4px;width:36px;height:32px;cursor:pointer;padding-top:9px;padding-bottom:9px;background-color:#ffefee;color:red;border-radius:4px;transition:background-color .3s ease,color .3s ease}.close-icon:hover{background-color:red;color:#fff}.checkboxdiv{display:flex;align-items:center}.checkboxdiv input{flex-shrink:0}input:focus,input:active,select:focus,select:active,textarea:focus,textarea:active,button:focus,button:active{outline:none!important}@supports (-webkit-appearance: none) or (-moz-appearance: none){input[type=checkbox]{--active: #275EFE;--active-inner: #fff;--focus: 2px rgba(39, 94, 254, .3);--border: #BBC1E1;--border-hover: #275EFE;--background: #fff;--disabled: #F6F8FF;--disabled-inner: #E1E6F9;-webkit-appearance:none;-moz-appearance:none;height:21px;outline:none;display:inline-block;vertical-align:top;position:relative;margin:0;cursor:pointer;border:1px solid var(--bc, var(--border));background:var(--b, var(--background))!important;transition:background .3s,border-color .3s,box-shadow .2s}input[type=checkbox]:after{content:\"\";display:block;left:0;top:0;position:absolute;transition:transform var(--d-t, .3s) var(--d-t-e, ease),opacity var(--d-o, .2s)}input[type=checkbox]:checked{--b: var(--active);--bc: var(--active);--d-o: .3s;--d-t: .6s;--d-t-e: cubic-bezier(.2, .85, .32, 1.2)}input[type=checkbox]:disabled{--b: var(--disabled);cursor:not-allowed;opacity:.9}input[type=checkbox]:disabled:checked{--b: var(--disabled-inner);--bc: var(--border)}input[type=checkbox]:disabled+label{cursor:not-allowed}input[type=checkbox]:hover:not(:checked):not(:disabled){--bc: var(--border-hover)}input[type=checkbox]:focus{box-shadow:0 0 0 var(--focus)}input[type=checkbox]:not(.switch){width:21px}input[type=checkbox]:not(.switch):after{opacity:var(--o, 0)}input[type=checkbox]:not(.switch):checked{--o: 1}input[type=checkbox]+label{font-size:14px;line-height:21px;display:inline-block;vertical-align:top;cursor:pointer;margin-left:4px}input[type=checkbox]:not(.switch){border-radius:7px}input[type=checkbox]:not(.switch):after{width:5px;height:9px;border:2px solid var(--active-inner);border-top:0;border-left:0;left:7px;top:4px;transform:rotate(var(--r, 20deg))}input[type=checkbox]:not(.switch):checked{--r: 43deg}input[type=checkbox].switch{width:38px;border-radius:11px}input[type=checkbox].switch:after{left:2px;top:2px;border-radius:50%;width:15px;height:15px;background:var(--ab, var(--border));transform:translate(var(--x, 0))}input[type=checkbox].switch:checked{--ab: var(--active-inner);--x: 17px}input[type=checkbox].switch:disabled:not(:checked):after{opacity:.6}input[type=checkbox]:indeterminate{--b: var(--active);--bc: var(--active);--d-o: .3s;--d-t: .6s;--d-t-e: cubic-bezier(.2, .85, .32, 1.2)}input[type=checkbox]:indeterminate:after{content:\"\";display:block;left:8px;top:5px;rotate:69deg;position:absolute;width:2px;height:9px;background:var(--active-inner);opacity:6;transition:transform var(--d-t, .3s) var(--d-t-e, ease),opacity var(--d-o, .2s)}}:host{--primary-color: #275EFE;--secondary-color: #6C757D;--text-color: #434555;--border-color: #e0e0e0;--hover-bg: #f9f9f9;--header-bg: #ffffff;--body-bg: #ffffff;--danger-color: #FF2C10;--scroll-shadow: rgba(0, 0, 0, .08);--box-shadow: 0 2px 10px rgba(0, 0, 0, .1)}:host(.dark-theme){--primary-color: #6c8dfa;--text-color: #ffffff;--header-bg: #2c2c2c;--body-bg: #1e1e1e;--border-color: #404040;--hover-bg: #373737}.hyper-link:hover{color:#00f!important;text-decoration:underline;cursor:pointer}.on-edit:hover .edit-icon{visibility:visible}.nxt-lop-input{border-radius:5px;color:#2c3137;font-weight:400;font-size:13px;transition:all .2s}.input-box{border:solid}.inlineAdd{align-items:center;gap:10px;padding-top:10px}.addIconBor{padding:4px;border-radius:5px;border:1px solid #6c757d;transition:background-color .3s,border-color .3s}.addIcon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.addIconBor:hover .addIcon{background-color:#bbd3ff}::ng-deep .modal-backdrop{background-color:#000000b3!important}::ng-deep .modal-backdrop.show{opacity:1!important}.eicon-container:hover .edit-icon svg path{fill:#2163ff!important}.eicon-container:hover .edit-icon{background-color:#c9d2ff!important;cursor:pointer}.eicon-container:hover{border:1px solid #2163ff!important}.dicon-container:hover .delete-icon svg path{stroke:#fff!important;fill:transparent!important}.dicon-container:hover .delete-icon{background-color:#ff7575!important;cursor:pointer}.dicon-container:hover{border:1px solid #ff2121!important}.clickable-img{position:relative;cursor:pointer;padding:2px;border:1px solid #dddddd;border-radius:5px}.clickable-img:hover{border:1px solid rgb(31,105,255);border-radius:5px}.clickable-img:hover div svg{background-color:#ecf3ff!important}.clickable-img:hover div{background-color:#ecf3ff!important}.dropdown-menu{left:unset!important;right:300%;top:12.5px;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 4px 8px #0000001a}.dropdown .dropdown-menu{display:block}.dropdown-menu .btn{display:block;padding:10px;width:100%;text-align:left;background:transparent;border:none;cursor:pointer}[dir=rtl] .search{margin-left:7px}[dir=rtl] .noOfRec{gap:4px}[dir=rtl] .sticky-column{position:sticky;right:0;z-index:11;background:var(--header-bg)}[dir=rtl] .actionCol{position:sticky;padding:unset!important;align-items:center;z-index:11;left:0;background:var(--header-bg)}[dir=rtl] .resize-handle{position:relative;left:0!important;right:14px;width:1.5px;background-color:#dddd}[dir=rtl] .sort-indicators{padding-right:5px}::ng-deep [dir=rtl] nxt-pagination .dropdown-arrow{left:5px;right:unset!important}::ng-deep [dir=rtl] nxt-button .dropdown-menu{right:unset!important;left:0!important}[dir=rtl] .dropdown-menu{left:300%!important;right:unset!important}[dir=rtl] .fc-btn-text{padding-right:10px}.selected-cell{border-left:2px solid #2196F3!important;border-right:2px solid #2196F3!important;position:relative;z-index:1}.selected-column{position:relative;border:2px solid #2196F3!important;border-bottom:none!important;border-radius:4px}.close-column-btn{position:absolute;top:3px;right:3px;width:12px;height:12px;border:solid black .5px;color:#000;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:9px;cursor:pointer;z-index:2}.close-column-btn:hover{background:#f32121!important;border:solid #f32121 .5px!important;color:#fff!important}.table-row:last-child .selected-cell{border-bottom:2px solid #2196F3!important}.hover-content{position:absolute;z-index:1;background:#fff;border:1px solid #ccc;box-shadow:0 2px 5px #00000026;padding:10px;min-width:200px;border-radius:5px;top:70%;left:0;cursor:pointer}.expense-file{text-decoration:none;transition:text-decoration .2s ease-in-out;cursor:pointer}.expense-file:hover{text-decoration:underline;color:#0056b3;cursor:pointer}.popover-container .hover-content{display:none;position:absolute;cursor:pointer}.popover-container:hover .hover-content{display:block;cursor:pointer}.summary-row{font-weight:700}.non-summary-table-cell{display:table-cell;padding:12px;text-overflow:ellipsis;white-space:nowrap;position:relative;color:var(--text-color);border:solid 1px white!important}.summary-table-cell{display:table-cell;padding:12px;text-overflow:ellipsis;white-space:nowrap;position:relative;color:var(--text-color);border:solid 1px var(--border-color)!important;border-top:solid 1.5px var(--border-color)!important}.horizontal-summary-table-cell{display:table-cell;max-width:none;box-sizing:border-box;overflow:visible;white-space:nowrap;padding:12px;text-overflow:ellipsis;position:relative;color:var(--text-color);border:solid 1px white!important;border-top:solid 1px var(--border-color)!important;border-bottom:1px solid var(--border-color)!important}.last-cell{border-right:1px solid var(--border-color)!important}.table-last-cell{border-bottom:1px solid var(--border-color)!important}.skeleton-loader{display:table;width:100%;border-collapse:collapse}.skeleton-row{display:table-row;border-bottom:1px solid var(--border-color)}.skeleton-cell{display:table-cell;padding:12px;height:35px;background:#fff;position:relative}.skeleton-cell{min-width:50px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%;animation:loading 1.5s infinite}.skeleton-cell:before{content:\"\";position:absolute;inset:3px;background:linear-gradient(90deg,#f5f5f5 25%,#eaeaea,#f5f5f5 75%);background-size:200% 100%;animation:pulse 1.5s infinite linear;border-radius:4px}.skeleton-cell.sticky-column{position:sticky;left:0;z-index:11;background:#f5f5f5}.skeleton-cell.actionCol.sticky-column{position:sticky;right:0;left:auto;background:#f5f5f5}@keyframes pulse{0%{background-position:200% 0}to{background-position:-200% 0}}@keyframes loading{0%{background-position:200% 0}to{background-position:-200% 0}}@media (max-width: 768px){.resize-handle{width:6px}.table-cell{min-width:80px}}.form-builder-table-box{height:108px;display:flex;justify-content:center;align-items:center;border:1px dashed #a8a1a1}.no-data{display:flex;align-items:anchor-center;height:60px;justify-content:center}.custom-line{width:100%;border:1px solid #000}\n"] }]
1618
+ ], template: "<div class=\"table-layout\" [id]=\"tableId\" [ngStyle]=\"{'padding-top': '1px', 'width': tableWidth}\" [dir]=\"direction\">\n <div>\n <div *ngIf=\"title\" class=\"d-flex justify-content-center table-title align-text-center\">\n {{title}}\n </div>\n <div *ngIf=\"isNosIndicator || searchBar || isButtons\" class=\"flex justify-content-between\"\n style=\"padding-bottom: 20px;\">\n <div class=\"flex\">\n <!-- SKS26APR25 List View Filter -->\n <app-list-view-filter *ngIf=\"listViews && listViews.length > 0\" [listViews]=\"listViews\"\n [selectedView]=\"selectedView\" [displayedColumns]='columns' [tableFilterArray]=\"tableFilterArray\"\n (listViewEmit)=\"listViewEmit($event)\">\n </app-list-view-filter>\n <div *ngIf=\"(!listViews || listViews.length === 0) && isNosIndicator\" class=\"noOfRec\"\n style=\"display: flex; align-items: flex-end;\">\n <p style=\"font-weight: 500; margin-right: 5px; margin-bottom: 0px;\">\n {{ 'APP.NOS' | nxtCustomTranslate : 'Nos'}} </p>\n <div style=\"color: rgb(43, 87, 249);\">{{totalRecords || totalCount}}</div>\n </div>\n </div>\n\n <div class=\"flex\" style=\"align-items: center;\">\n <div *ngIf=\"searchBar\" class=\"search\">\n <div class=\"flex search-bar\">\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.6413 19.25C16.6322 19.25 20.6781 15.3511 20.6781 10.5417C20.6781 5.73218 16.6322 1.83333 11.6413 1.83333C6.6504 1.83333 2.60449 5.73218 2.60449 10.5417C2.60449 15.3511 6.6504 19.25 11.6413 19.25Z\"\n stroke=\"#787486\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M21.6295 20.1667L19.7271 18.3333\" stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\n <input type=\"text\" placeholder=\"{{ 'APP.SEARCH' | nxtCustomTranslate : 'Search' }}\"\n (keyup)=\"searchConfigs ? emptySearch($event.target.value) : applyFilter($event.target.value)\"\n [value]=\"searchBoxValue || ''\" #input>\n <svg *ngIf=\"searchConfigs && searchBar\" class=\"configSearch\" (click)=\"onSearch(input.value)\"\n width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 5H20\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M14 8H17\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M21 11.5C21 16.75 16.75 21 11.5 21C6.25 21 2 16.75 2 11.5C2 6.25 6.25 2 11.5 2\"\n stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M22 22L20 20\" stroke=\"#ffffff\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <div class=\"flex\" *ngIf=\"isButtons\" style=\"padding-left: 7px; gap: 7px;\">\n <div class=\"flex\" *ngFor=\"let button of buttonArray\">\n <nxt-button class=\"data-table-fsbtn\"\n (buttonClickEmit)=\"(button.type === 'group' || button.type === 'dropdown') ? commonButtonClick($event) : commonButtonClick(button)\"\n [buttonType]=\"button.class\"\n [buttonValue]=\"button.labelPath || button.label || button.name | nxtCustomTranslate : button.label || button.name \"\n [buttonConfig]=\"button.buttonConfig\" [type]=\"button.type\" class=\"ms-2 me-2\"\n [btnIconLeftSrc]=\"button.btnIconLeftSrc\" [isImageSvg]=\"button.isImageSvg\">\n </nxt-button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"table-margin\">\n <div class=\"table-container\"\n [ngClass]=\"{ 'resizing': isResizing }\"\n [ngStyle]=\"{ maxHeight: isPagination ? '450px' : 'auto', minHeight: dataSource.data && dataSource?.data?.length === 0 && !isLoading && from !== 'formBuilder' ? '0px' : '100px' }\"\n #tableContainer (scroll)=\"onScroll(tableContainer)\">\n <ng-container>\n <div class=\"custom-table\">\n <!--SKS15FEB25 Table Header -->\n <div class=\"table-header\" [ngClass]=\"{ 'shadow': isScrolled }\">\n <div class=\"table-row\">\n <!--SKS15FEB25 Checkbox Column -->\n <div *ngIf=\"withCheckBox\" class=\"table-cell sticky-column head-color\" [style.width]=\"'50px'\">\n <input type=\"checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"masterToggle()\"\n [checked]=\"selection?.hasValue()\"\n [indeterminate]=\"selection?.hasValue() && !isAllSelected()\"\n class=\"custom-checkbox\">\n </div>\n\n <!--SKS15FEB25 Data Columns -->\n <ng-container *ngFor=\"let column of currentColumns; let i = index\">\n <div *ngIf=\"column.summaryColumn !== true && column.summaryRow !== true && column.isHide !== true\"\n class=\"table-cell tableHeader head-color\"\n [class.sticky-column]=\"i === (stickyCondition - 1)\"\n [class.active-column]=\"activeColumn === column.uniqueIdentifier\"\n [class.selected-column]=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n (click)=\"$event.stopPropagation(); onColumnClick(column.uniqueIdentifier); column.sort ? sortData(column.fieldName) : ''\"\n (mouseenter)=\"hoveredColumn = column.fieldName\" (mouseleave)=\"hoveredColumn = null\"\n [style.width]=\"column.width || '100px'\"\n [style.flex]=\"'0 0 ' + (column.width || '100px')\"\n [style.min-width]=\"'50px'\">\n <div class=\"columnDiv\">\n <div class=\"column-header\" [style.width]=\"column.width || '100px'\">\n <!-- Add close button for selected column -->\n <div *ngIf=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n class=\"close-column-btn\"\n (click)=\"$event.stopPropagation(); removeCol(column.uniqueIdentifier)\">\n \u2715\n </div>\n <div class=\"ellipsis\" style=\"flex: 1;\" [title]=\"column.label\">\n {{ column.labelPath || column.label | nxtCustomTranslate : column.label }}\n </div>\n <div>\n <svg *ngIf=\"column.filter\"\n (click)=\"$event.stopPropagation(); filter(column.fieldName)\"\n style=\"padding-right: 2px;\" width=\"12\" height=\"11\"\n viewBox=\"0 0 12 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10.75 1.25H0.75L4.75 5.71722V8.80556L6.75 9.75V5.71722L10.75 1.25Z\"\n stroke=\"#242533\" stroke-width=\"1.2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <!--SKS15FEB25 Red dot for active filter -->\n <circle\n *ngIf=\"filterDataArray && filterDataArray[column.fieldName]?.length > 0\"\n cx=\"9\" cy=\"2\" r=\"2.5\" fill=\"red\"></circle>\n </svg>\n <div *ngIf=\"column.sort\"\n class=\"sort-indicators\">\n <span *ngIf=\"currentSortColumn === column.fieldName\" class=\"sort-direction\">\n {{ currentSortDirection === 'asc' ? '\u2191' : currentSortDirection\n === 'desc' ? '\u2193' : '' }}\n </span>\n <span\n *ngIf=\"hoveredColumn === column.fieldName && currentSortColumn !== column.fieldName\"\n class=\"sort-direction\">\n \u2191\n </span>\n </div>\n <div *ngIf=\"searchFilter && column.fieldName === selectedFilter\"\n class=\"search-component position-absolute\"\n (click)=\"$event.stopPropagation();\">\n <div class=\"card\">\n <div class=\"content\">\n <div class=\"flex\">\n <div class=\"fsearch\" [class.resized]=\"isResized\">\n <div class=\"fsearch-bar\">\n <svg class=\"searchSvg\" width=\"18\" height=\"20\"\n viewBox=\"0 0 24 22\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.6413 19.25C16.6322 19.25 20.6781 15.3511 20.6781 10.5417C20.6781 5.73218 16.6322 1.83333 11.6413 1.83333C6.6504 1.83333 2.60449 5.73218 2.60449 10.5417C2.60449 15.3511 6.6504 19.25 11.6413 19.25Z\"\n stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M21.6295 20.1667L19.7271 18.3333\"\n stroke=\"#787486\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n <input class=\"width-100\" type=\"text\"\n placeholder=\"{{ 'APP.SEARCH' | nxtCustomTranslate : 'Search' }}\"\n [(ngModel)]=\"searchText\"\n class=\"searchinput\">\n </div>\n </div>\n <svg *ngIf=\"isResized\" (click)=\"closefilter()\"\n class=\"close-icon\" width=\"24\" height=\"24\"\n viewBox=\"0 0 24 24\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9.16998 14.83L14.83 9.17001\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M14.83 14.83L9.16998 9.17001\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M9 22H15C20 22 22 20 22 15V9C22 4 20 2 15 2H9C4 2 2 4 2 9V15C2 20 4 22 9 22Z\"\n stroke=\"currentColor\" stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <div class=\"filter-content\" [style]=\"'overflow-y: auto'\">\n <div *ngFor=\"let data of filterArray | searchFilter : searchText\">\n <div class=\"mt-3 mb-3 checkboxdiv\"\n style=\"gap: 5px;\">\n <input type=\"checkbox\"\n [checked]=\"isSelected(data)\" [value]=\"data\"\n [id]=\"data\" (change)=\"checkedData(data)\">\n <div class=\"ms-2 label-data\">{{data}}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <!-- Enhanced resize handle -->\n <div class=\"resize-handle\" \n (mousedown)=\"onResizeStart($event)\"\n title=\"Drag to resize column\"></div>\n </div>\n </div>\n </ng-container>\n\n <!--SKS15FEB25 Action Column -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"table-cell head-color actionCol sticky-column\"\n [style.width]=\"'150px'\"\n style=\"padding: 12px !important;\">\n {{ actionColumHeader | nxtCustomTranslate : 'Action'}}\n </div>\n </div>\n </div>\n\n <!--SKS15FEB25 Table Body -->\n <div class=\"table-body\" *ngIf=\"!isLoading\">\n <div *ngFor=\"let element of dataSource.data; let i = index\" class=\"table-row\"\n (click)=\"tableClick(element)\">\n <!--SKS15FEB25 Checkbox Cell -->\n <div *ngIf=\"withCheckBox\" class=\"table-col-cell sticky-column body-color\">\n <input type=\"checkbox\" class=\"custom-checkbox\" (click)=\"$event.stopPropagation()\"\n (change)=\"separateRowSelect(selection.toggle(element), element)\"\n [checked]=\"selection.isSelected(element)\"\n [disabled]=\"(element.isPayProcessed === true)\">\n </div>\n\n <!--SKS15FEB25 Data Cells -->\n <ng-container *ngFor=\"let column of currentColumns; let last = last; ellipsis\">\n <div *ngIf=\"column.summaryColumn !== true && column.summaryRow !== true && column.isHide !== true\"\n class=\"table-col-cell body-color\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === column.uniqueIdentifier\"\n [style.width]=\"column.width || '100px'\"\n [style.flex]=\"'0 0 ' + (column.width || '100px')\"\n [style.min-width]=\"'50px'\"\n [style.max-width]=\"column.width || '100px'\">\n <div>\n <div>\n <!-- SKS22JUL25 calendar -->\n <div *ngIf=\"column.type === 'calendar'\">\n <!-- <app-custom-calendar [question]=\"column | questionByRow:element:i\" (eventSelected)=\"getCalendarEvent($event)\"\n (dateSelected)=\"getCurrentCalendar($event)\" (openModal)=\"openCalendarModal($event)\"\n (closeModal)=\"closeCalendarModal($event)\"></app-custom-calendar>\n <app-custom-model *ngIf=\"isCalendarModalOpen\" [modalTitle]=\"calendarModalTitle\"\n [isModalOpen]=\"isCalendarModalOpen\" [modalSize]=\"calendarModalSize\"\n [saveButtonValue]=\"calendarSaveButtonValue\" [modalFooter]=\"modalCalendarModalFooter\"\n (saveButtonEmit)=\"onCalendarModalSave()\" (cancelButtonEmit)=\"closeCalendarModal($event)\">\n <lib-questionbook [qbItem]=\"qbRefrenceBook\" [questions]=\"referenceQuestions\"\n (handleQuestion)=\"handleQuestionEvent($event)\"></lib-questionbook>\n </app-custom-model> -->\n </div>\n\n <!-- SKS22JUL25 for pick location -->\n <app-pick-location *ngIf=\"column.type === 'location'\" [apiKey]=\"column['apiKey']\" [address]=\"question.selectedValue\" [question]=\"column | questionByRow:element:i\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (locationSelected)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-pick-location>\n\n <!-- SKS22JUL25 Image -->\n <div *ngIf=\"column.type === 'image'\" (mouseenter)=\"isImageHover = true;\"\n (mouseleave)=\"isImageHover = false;\">\n <!-- <div *ngIf=\"isImageHover\" style=\"display: flex; justify-content: end;\">\n <svg *ngIf=\"!column.question?.isReadOnly\" (click)=\"onImageEdit(column.question)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n <svg *ngIf=\"!column.question?.isReadOnly\" (click)=\"onImageDelete(column.question)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\" stroke-width=\"1.5\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div> -->\n <img *ngIf=\"column.question?.isReadOnly\" [src]=\"column.question?.imageData\" />\n <!-- <div *ngIf=\"!column.question?.isReadOnly\" class=\"logo-container\">\n Logo preview area\n <div class=\"logo-preview\" *ngIf=\"column.question?.input\">\n <img [src]=\"column.question?.imageData\" />\n </div>\n\n Upload button\n <div *ngIf=\"!column.question?.imageData\" class=\"logo-upload-placeholder\">\n <label for=\"logo-upload-{{i}}\" class=\"logo-upload-label\">\n <img src=\"../assets/icons/Image.svg\" alt=\"Upload\" />\n <span>Upload Image</span>\n </label>\n <input type=\"file\" id=\"logo-upload-{{i}}\" accept=\"image/*\"\n (change)=\"fileChangeEvent(column.question, $event)\" style=\"display: none;\" />\n </div>\n </div> -->\n </div>\n <!-- SKS22JUL25 icon-selector -->\n <nxt-icon-selector [allIcons]=\"allIcons\" *ngIf=\"column.type === 'icon'\" [required]=\"column.question?.isOptional\" [mode]=\"mode\" [question]=\"column | questionByRow:element:i\" [labelFont]=\"column.question?.font\"\n [label]=\"column.question?.questionText\"\n [labelColor]=\"column.question?.fontColor\"\n [labelSize]=\"column.question?.fontSize\" [labelWeight]=\"column.question?.fontWeight\" [showLabel]=\"column.question?.style?.showLabel\" (iconSelected)=\"updateEdit(i,$event,element,column.fieldName)\"></nxt-icon-selector>\n\n <!-- SKS22JUL25 line -->\n <hr *ngIf=\"column.type === 'line'\" class=\"custom-line\" style=\"display: inline-flex\" />\n <!-- SKS22JUL25 data table -->\n <nxt-datatable *ngIf=\"column.type === 'table'\" isEditRow isDeleteRow actionButton isButtons [question]=\"column | questionByRow:element:i\" from=\"formBuilder\"\n (valueChange)=\"updateEdit(i,$event.data,element,column.fieldName)\" [apiMeta]=\"column.question?.subText\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n [tableConfig]=\"column.question?.tableConfig\" tableId=\"\" direction=\"ltr\" tableWidth=\"auto\">\n </nxt-datatable>\n <!-- SKS22JUL25 list -->\n <nxt-search-box *ngIf=\"column.type === 'list'\" [question]=\"column | questionByRow:element:i\" [readOnly]=\"column.question?.isReadOnly\" [apiMeta]=\"column.question?.subText\"\n [id]=\"column.question?.id\" [placeHolderText]=\"column.question?.question || ''\" \n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (searchValueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </nxt-search-box>\n\n <!-- SKS22JUL25 Dropdown -->\n <app-custom-dropdown *ngIf=\"column?.type === 'dropdown' && column.question?.options\" [options]=\"column.question?.options\" [apiMeta]=\"column.question?.subText\"\n [id]=\"column.question?.id\" [selectedValue]=\"column.isShengel ? column.question?.input : column.question?.selectedValue\"\n placeholder=\"\"\n [errorMessage]=\"column.question?.errorMessage\" [error]=\"column.question?.error\" [referenceField]=\"column.question?.referenceField\"\n [readOnly]=\"column.question?.isReadOnly\" [question]=\"column | questionByRow:element:i\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n (valueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-custom-dropdown>\n <!-- SKS22JUL25 custom-radio component -->\n <div *ngIf=\"column.type === 'radio' && column.question?.options\" class=\"\">\n <app-custom-radio [options]=\"column.question?.options\" [question]=\"column | questionByRow:element:i\" [apiMeta]=\"column.question?.subText\" [id]=\"column.question?.id\"\n [selectedValue]=\"column.question?.selectedValue\" [errorMessage]=\"column.question?.errorMessage\" [error]=\"column.question?.error\"\n [referenceField]=\"column.question?.referenceField\" [readOnly]=\"column.question?.isReadOnly\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n (valueChange)=\"updateEdit(i,$event,element,column.fieldName)\">\n </app-custom-radio>\n </div>\n\n <!-- SKS22JUL25 Attachment / Files -->\n <app-file-upload *ngIf=\"column.type === 'file'\" [limitFileUploading]=\"5\" [error]=\"column.question?.error\" [question]=\"column | questionByRow:element:i\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n [allFiles]=\"column.question?.input\" (selectedFileData)=\"updateEdit(i,$event.value,element,column.fieldName)\"\n >\n </app-file-upload>\n <!-- SKS22JUL25 Button -->\n <nxt-button\n *ngIf=\"column.type === 'button'\"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\"\n [btnHeight]=\"'50px'\" [btnWidth]=\"'150px'\" [buttonValue]=\"column.question?.question\"\n (buttonClickEmit)=\"updateEdit(i,$event,element,column.fieldName)\"\n >\n </nxt-button>\n <!-- SKS22JUL25 book type -->\n <!-- <lib-questionbook *ngIf=\"column.type === 'book'\" [qbItem]=\"column.question?.qbItem\"\n [questions]=\"readQuestions(column.question?.qbReference, column.question?.qbReferenceQuestions)\"\n (handleDropDown)=\"getDropDown($event)\">\n </lib-questionbook> -->\n <!-- SKS22JUL25 Text, Email, label, number, Boolean, rich text editor, DateTime, Date, Time-->\n <nxt-input *ngIf=\"column.type === undefined || column.type === 'text' || column.type === 'email' || column.type === 'number' || column.type === 'label' || column.type === 'boolean' || column.type === 'richtextarea' || column.type === 'datetime' || column.type === 'date' || column.type === 'time' || column.type === 'textarea'\"\n [type]=\"column.type === 'boolean' ? 'checkbox' : column.type === 'richtextarea' ? 'richtext' : column.type === undefined ? 'text' : column.type \"\n [mode]=\"from === 'formBuilder' && element.editRow && !column.question?.isReadOnly ? 'edit' : 'view'\" [from]=\"'nxtTable'\"\n [value]=\"element | getValue: column.fieldName \"\n [hyperLink]=\"column.hyperLink\"\n (hyperlinkEmit)=\"onClickHyperlink(column.fieldName,element, column.hyperLink)\"\n [question]=\"column | questionByRow:element:i\"\n [labelFont]=\"column.question?.font\"\n [label]=\"column.question?.questionText\"\n [labelColor]=\"column.question?.fontColor\"\n [labelSize]=\"column.question?.fontSize\"\n [inputValueSize]=\"column.question?.fontSize\"\n [labelWeight]=\"column.question?.fontWeight\"\n [inputWeight]=\"column.question?.fontWeight\"\n [showLabel]=\"column.question?.style?.showLabel\"\n inputBorder=\"none\" svgHeight=\"20px\" svgWidth=\"20px\"\n [placeholder]=\"column.question?.question\"\n [required]=\"column.question?.isOptional\" inputBgColor=\"#FAFAFA\"\n [inputId]=\"column.question?.trackingId\"\n [errorMessages]=\"{ required: 'This field is required' }\"\n [inputIconLeftSrc]=\"column.question?.iconLeftSrc\" \n [minDate]=\"column.question?.minDate\"\n [rows]=\"3\"\n (inputValue)=\"updateEdit(i,$event.value,element,column.fieldName)\"\n >\n </nxt-input>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!--SKS15FEB25 Action Buttons -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\" class=\"table-col-cell actionCol\">\n <div class=\"actionButton\" style=\"display: flex; align-items: center;\">\n\n <!--SKS15FEB25 Edit Button -->\n <div *ngIf=\"isEditRow\" class=\"eicon-container\"\n matTooltip=\"{{ 'APP.EDIT_RECORD' | nxtCustomTranslate : 'Edit Record' }}\"\n style=\"padding: 2px; border: 1px solid #dcdcdc; border-radius: 5px; margin-left: 3px; margin-right: 3px;\">\n <div class=\" edit-icon\"\n style=\"padding: 2px 4px; border-radius: 5px; background-color: #f5f5f5;\">\n <svg (click)=\"onEdit(element)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.1067 6.07174L9.92833 4.8934L2.16667 12.6551V13.8334H3.345L11.1067 6.07174ZM12.285 4.8934L13.4633 3.71507L12.285 2.53674L11.1067 3.71507L12.285 4.8934ZM4.035 15.5001H0.5V11.9642L11.6958 0.768403C11.8521 0.612177 12.064 0.524414 12.285 0.524414C12.506 0.524414 12.7179 0.612177 12.8742 0.768403L15.2317 3.1259C15.3879 3.28218 15.4757 3.4941 15.4757 3.71507C15.4757 3.93604 15.3879 4.14796 15.2317 4.30424L4.03583 15.5001H4.035Z\"\n fill=\"#6C757D\" />\n </svg>\n </div>\n </div>\n\n\n <!--SKS15FEB25 Delete Button -->\n <div *ngIf=\"isDeleteRow\" class=\"dicon-container\"\n [matTooltip]=\"'APP.DELETE_RECORD' | nxtCustomTranslate : 'Delete Record'\"\n style=\"padding: 2px; border: 1px solid #ffb5b5; border-radius: 5px; margin-left: 3px; margin-right: 3px;\">\n <div class=\"delete-icon\"\n style=\"padding: 2px 4px; border-radius: 5px; background-color: #feeeed;\">\n <svg (click)=\"deleteRecord(element,i)\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M14 3.98726C11.78 3.76726 9.54667 3.65393 7.32 3.65393C6 3.65393 4.68 3.7206 3.36 3.85393L2 3.98726\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M5.6665 3.31362L5.81317 2.44028C5.91984 1.80695 5.99984 1.33362 7.1265 1.33362H8.87317C9.99984 1.33362 10.0865 1.83362 10.1865 2.44695L10.3332 3.31362\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path\n d=\"M12.5667 6.09375L12.1334 12.8071C12.06 13.8537 12 14.6671 10.14 14.6671H5.86002C4.00002 14.6671 3.94002 13.8537 3.86668 12.8071L3.43335 6.09375\"\n stroke=\"#FF2C10\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.88647 11.0004H9.10647\" stroke=\"#FF2C10\"\n stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M6.3335 8.33325H9.66683\" stroke=\"#FF2C10\"\n stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <!--SKS15FEB25 Render inline buttons up to Size -->\n <div *ngFor=\"let button of actionButtonArray?.buttonArray; let i = index\">\n <div *ngIf=\"i < actionButtonArray?.size\"\n style=\" margin-left: 3px; margin-right: 3px;\">\n <div *ngIf=\"isConditionMet(element, button.conditions)\"\n [matTooltip]=\"button.tooltipPath || button.tooltip | nxtCustomTranslate : button.tooltip \"\n (click)=\"actionButtonClicked(button,element)\"\n (mouseenter)=\"$event.target.style.border = '1px solid ' + button.hoverBorderColor\"\n (mouseleave)=\"$event.target.style.border = '1px solid ' + button.borderColor\"\n style=\"padding: 2px; border-radius: {{button.borderRadius}}px; border: 1px solid {{button.borderColor}};\">\n <div (mouseenter)=\"$event.target.style.backgroundColor = button.hoverBackgroundColor\"\n (mouseleave)=\"$event.target.style.backgroundColor = button.backgroundColor\"\n style=\"padding: {{button.padding}}px {{button.padding + 2}}px; border-radius: {{button.borderRadius}}px; background-color: {{button.backgroundColor}};\">\n <img *ngIf=\"button.iconSrc\" #imgElement [src]=\"button.iconSrc\"\n (mouseenter)=\"imgElement.src = button.hoverIconSrc || button.iconSrc\"\n (mouseleave)=\"imgElement.src = button.iconSrc\">\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"dropdownActionButton && dropdownActionButton.length > 0\"\n class=\"dropdown\">\n <div class=\"clickable-img\" (click)=\"toggleDropdown(i)\"\n style=\" margin-left: 3px; margin-right: 3px;\">\n <div\n style=\"background-color: #f5f5f5; padding: 2px 4px; border-radius: 5px;\">\n <svg style=\"background-color: #f5f5f5; border-radius: 5px; border: 1px solid #6c757d;\"\n width=\"16\" height=\"16\" viewBox=\"0 0 40 40\" fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M19.9999 25.6667C23.6818 25.6667 26.6666 22.6819 26.6666 19C26.6666 15.3181 23.6818 12.3334 19.9999 12.3334C16.318 12.3334 13.3333 15.3181 13.3333 19C13.3333 22.6819 16.318 25.6667 19.9999 25.6667Z\"\n fill=\"#292D32\" stroke=\"#292D32\" stroke-width=\"1.5\"\n stroke-miterlimit=\"10\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n <path d=\"M17.6467 18.16L20.0001 20.5067L22.3534 18.16\"\n stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </div>\n\n <div class=\"dropdown-menu\"\n [style.right]=\"((actionButtonArray?.size ?? 0) - (actionButtonArray?.buttonArray?.size ?? 0) + (isEditRow ? 1 : 0) + (isDeleteRow ? 1 : 0) + (dropdownActionButton?.length > 0 ? 1 : 0)) * 100 + '%'\"\n *ngIf=\"currentOpenIndex === i\">\n <div *ngFor=\"let btn of dropdownActionButton\">\n <button *ngIf=\"isConditionMet(element, btn.conditions)\"\n [attr.data-id]=\"element.id\" style=\"display: flex;\" type=\"button\"\n class=\"btn btn-icon {{btn.buttonType}} tooltip-container\"\n [matTooltip]=\"btn.tooltipPath || btn.tooltip | nxtCustomTranslate : btn.tooltip\"\n [disabled]=\"btn.buttonDisable\"\n (click)=\"actionButtonClicked(btn,element)\">\n <img *ngIf=\"btn.iconSrc\" [src]=\"btn.iconSrc\">\n <div class=\"fc-btn-text\" style=\"padding-left: 10px;\">\n {{btn.name}}</div>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- SKS20MAR25 Summary Rows -->\n <ng-container\n *ngIf=\"summaryRows && summaryRows.length > 0 && dataSource.data && dataSource?.data?.length > 0 && !isLoading\">\n <ng-container *ngIf=\"!isFullTableSummaryRow && isSummaryColumn\">\n <div *ngFor=\"let row of summaryRows\" class=\"table-row summary-row\">\n <!-- Label in the first column -->\n <div *ngIf=\"withCheckBox\" class=\"non-summary-table-cell\"></div>\n <!-- Empty cells to align with data columns -->\n <div *ngFor=\"let col of isSummaryStartColumn; let last = last\"\n class=\"non-summary-table-cell\" [class.last-cell]=\"last\">\n </div> <!-- Value or input in the last column -->\n <div class=\"summary-table-cell\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\"\n (click)=\"$event.stopPropagation(); onColumnClick(row.uniqueIdentifier)\">{{ row.label }}\n </div>\n <div class=\"summary-table-cell\"\n [class.selected-cell]=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\">\n <ng-container *ngIf=\"row.type === 'calculation'\">\n <!-- Add close button for selected column -->\n <div *ngIf=\"mode === 'edit' && isEditable && selectedColumn === row.uniqueIdentifier\"\n class=\"close-column-btn\"\n (click)=\"$event.stopPropagation(); removeCol(row.uniqueIdentifier)\">\n \u2715\n </div>\n {{ summaryValues[row.fieldName] | number }}\n </ng-container>\n <ng-container *ngIf=\"row.type === 'input'\">\n <input type=\"number\" [(ngModel)]=\"summaryValues[row.fieldName]\"\n (ngModelChange)=\"onSummaryInputChange()\"\n class=\"nxt-lop-input table-width\"\n style=\"font-size: {{ rowTextSize ? rowTextSize : '13px' }}; color: {{rowTextColor ? rowTextColor : '#2c3137'}};\">\n </ng-container>\n </div>\n <!-- SKS20MAR25 Empty cells to align with data columns -->\n <div *ngFor=\"let col of isSummaryEndColumn; let last = last\"\n class=\"non-summary-table-cell\">\n </div>\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"non-summary-table-cell actionCol sticky-column\">\n </div>\n </div>\n </ng-container>\n <!-- SKS13JUN25 full table summary row -->\n <ng-container *ngIf=\"isFullTableSummaryRow\">\n <div *ngFor=\"let row of summaryRows\" class=\"table-row summary-row\">\n <!-- SKS13JUN25 Checkbox column (if enabled) -->\n <div *ngIf=\"withCheckBox\" class=\"horizontal-summary-table-cell\">\n {{ row.labelPath || row.label | nxtCustomTranslate : row.label }}\n </div>\n\n <!-- SKS13JUN25 summary cell -->\n <div *ngFor=\"let col of currentColumns; let last = last\"\n class=\"horizontal-summary-table-cell\" style=\"text-align: left;\">\n @if (row?.columns?.includes(col.fieldName)) {\n {{ summaryValues[col.fieldName] | number }}\n }\n </div>\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\"\n class=\"horizontal-summary-table-cell actionCol sticky-column\">\n </div>\n </div>\n </ng-container>\n </ng-container>\n <!--SKS28MAR25 In the Loading section -->\n <div class=\"table-body\" *ngIf=\"isLoading\">\n <!-- Repeat for 5 skeleton rows -->\n <div *ngFor=\"let _ of [1,2,3,4,5]\" class=\"table-row\">\n <!-- Checkbox Column -->\n <div *ngIf=\"withCheckBox\" class=\"skeleton-cell sticky-column\"></div>\n\n <!-- Data Columns -->\n <div *ngFor=\"let col of currentColumns\" class=\"skeleton-cell \"></div>\n\n <!-- Action Column -->\n <div *ngIf=\"actionButton || isDeleteRow || isEditRow\" class=\"skeleton-cell actionCol\">\n </div>\n </div>\n </div>\n <!-- <div *ngIf=\"dataSource.data && dataSource?.data?.length === 0 && !isLoading && from === 'formBuilder'\" class=\"form-builder-table-box\">\n Add / drags fields from elements sections\n </div> -->\n </div>\n </ng-container>\n </div>\n <!--SKS15FEB25 No Data Row -->\n <div *ngIf=\"dataSource.data && dataSource?.data?.length === 0 && !isLoading && from !== 'formBuilder'\"\n class=\"no-data\">\n {{'APP.NO_RECORDS_OR_DATA_FOUND' | nxtCustomTranslate : 'No records/data found.'}}\n </div>\n <!--SKS15FEB25 Pagination -->\n <div [class.shadow-hidden]=\"isShadowHidden\">\n <!-- table input save button changes -->\n <div class=\"d-flex inlineAdd justify-content-end\">\n <div class=\"flex addIconBor cursor-pointer\" *ngIf=\"addInlineRecord \"\n (click)=\"addTableRecord(inlineElement)\"\n matTooltip=\"{{ 'APP.ADD_RECORD'| nxtCustomTranslate : 'Add Record'}}\">\n <div class=\"addIcon\">\n <svg class=\"nav-icon\" xmlns=\"http://www.w3.org/2000/svg\" height=\"24\"\n viewBox=\"0 -960 960 960\" width=\"24\">\n <path\n d=\"M440-280h80v-160h160v-80H520v-160h-80v160H280v80h160v160Zm40 200q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\" />\n </svg>\n </div>\n </div>\n <!--SKS15FEB25 removed button disable logic, added another condition for button showing-->\n <!--SKS15FEB25 SR06JAN2025 button disable logic for not select any employee-->\n <nxt-button *ngIf=\"tableSaveButton && from != 'formBuilder'\"\n buttonType=\"btn btn-primary\" [buttonDisable]=\"selection?.selected?.length === 0\"\n (buttonClickEmit)=\"saveButton()\"\n buttonValue=\"{{ 'APP.SAVE' | nxtCustomTranslate : 'Save' }}\"></nxt-button>\n </div>\n <nxt-pagination *ngIf=\"isPagination\" [pageSizeOptions]=\"pageSizeOptions\"\n [collectionSize]=\"configPagination ? totalRecords || totalCount : filterTableNos\"\n [pageSize]=\"pageSize\" [currentPage]=\"pageIndex\" [firstLastButtons]=\"true\"\n (event)=\"pageParams($event)\">\n </nxt-pagination>\n </div>\n </div>\n </div>\n</div>\n\n<!--SKS15FEB25 alert on deleting record -->\n<div *ngIf=\"deleteModal\" class=\"modal modal-backdrop show d-block\" id=\"deleteRecord\" tabindex=\"-1\"\n aria-labelledby=\"deleteRecordLabel\" [attr.aria-hidden]=\"!deleteModal\">\n <div class=\"modal-dialog\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <b class=\"modal-title fs-5\" id=\"deleteRecordLabel\">{{ 'APP.DELETE_RECORD'| nxtCustomTranslate : 'Delete Record'}}</b>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"deleteModal = false\"></button>\n </div>\n <div class=\"modal-body\">\n {{ 'APP.ARE_YOU_SURE_YOU_WANT_TO_DELETE_THE_REC'| nxtCustomTranslate : 'Are you sure you want to delete the record'}} ?\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\" (click)=\"deleteModal = false\">{{\n 'APP.NO'| nxtCustomTranslate : 'No'}}</button>\n <button type=\"button\" class=\"btn btn-primary\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\n (click)=\"deleteRecordData()\">{{ 'APP.YES'| nxtCustomTranslate : 'Yes'}}</button>\n </div>\n </div>\n </div>\n</div>", styles: [".custom-table{display:table;width:100%;border-collapse:collapse;table-layout:fixed;direction:var(--direction);background:var(--body-bg)}.table-header{display:table-header-group;position:sticky;top:0;z-index:100;box-shadow:none;transition:box-shadow .3s ease-in-out;background:var(--header-bg)}.shadow{box-shadow:0 4px 5px #0001!important}.table-body{display:table-row-group}.table-row{display:table-row;min-height:40px}.table-cell{position:relative;min-width:50px;padding:12px 0 12px 12px;border-bottom:solid 1px var(--border-color);max-width:none;box-sizing:border-box;overflow:visible;white-space:nowrap;text-overflow:ellipsis;display:table-cell}.table-col-cell{position:relative;min-width:50px;padding:2.5px 0 2.5px 12px;border-bottom:solid 1px var(--border-color);max-width:none;box-sizing:border-box;overflow:visible;white-space:nowrap;text-overflow:ellipsis;display:table-cell}.table-container.resizing{-webkit-user-select:none;user-select:none;pointer-events:none}.table-container.resizing .resize-handle{pointer-events:auto}.sticky-column{position:sticky;background:inherit;z-index:5}.sticky-column .resize-handle{z-index:15}.actionCol{position:sticky;padding:unset!important;align-items:center;z-index:11;right:0;background:var(--header-bg)}.actionCol{min-width:100px!important;width:100px!important;max-width:100px!important}.actionCol .resize-handle{display:none}.table-container{width:100%;overflow-x:auto;overflow-y:auto;border-top:1px solid #e0e0e0;scrollbar-width:none}.table-container::-webkit-scrollbar{display:none}.column-header{display:flex;align-items:center;flex:1;min-width:0;overflow:hidden;padding-right:8px}.ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;min-width:0}.column-header img{cursor:pointer}.shadow-hidden{position:relative}.shadow-hidden:before{content:\"\";position:absolute;z-index:11;top:-10px;left:0;width:100%;height:10px;background:linear-gradient(to top,var(--scroll-shadow),transparent)}.resize-handle{position:absolute;right:-1px;top:0;bottom:0;width:1px;cursor:col-resize;background:#ccc;z-index:10;transition:background-color .2s ease}.resize-handle:hover{background:#ccc;opacity:.7}.resize-handle:active{background:#ccc;opacity:.9}.columnDiv{position:relative;display:flex;align-items:center;width:100%;height:100%}.search{display:flex;justify-content:space-between;border:1px solid rgba(67,69,85,.3);border-radius:7px;align-self:center;padding:3px}.search-bar{width:100%;margin:5px}.configSearch{height:22px;padding:3px;margin:10p;background-color:#247dff;border-radius:4px}input::placeholder{color:#abafb1}.sort-indicators{display:inline-block;width:10px;padding-left:5px}.sort-direction{font-size:12px;color:var(--text-color);opacity:.7}.tableHeader{cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .3s}.tableHeader:hover{background-color:var(--hover-bg)}.search-component{top:163%;left:0;z-index:-10;background-color:#fff;box-shadow:0 2px 10px #0000001a}[dir=rtl] .search-component{left:unset!important}input{border:none}.card{background:#fff;box-shadow:0 2px #0a0a0a1f;border-radius:8px;border-color:#e9e9e9}.fsearch{width:100%;justify-content:space-between;font-weight:400;font-size:13px;display:flex;background:#f0f5ff;border-radius:6px;align-self:center}.content{margin:6px;width:150px}.fsearch-bar{display:flex;flex-direction:row;width:100%;margin:5px;transition:width .3s ease}.search.resized{width:calc(100% - 40px)}.filter-content{width:100%;max-height:150px;padding-left:5px}.label-data{font-weight:200;font-size:12px;color:#434555d9}input[type=checkbox]{height:16px;width:16px;border-radius:5px;margin-left:2px}input[type=checkbox]:after{width:4px;height:7px;left:5px;top:3px;transform:rotate(var(--r, 20deg))}input[type=checkbox]:checked{--r: 43deg}.checkbox-cont{display:flex;align-items:center}.searchinput{border:none;background-color:#f0f5ff;width:85%;font-size:12px;color:#275efe;font-weight:600}.searchSvg{margin-right:3px}.close-icon{margin-left:4px;width:36px;height:32px;cursor:pointer;padding-top:9px;padding-bottom:9px;background-color:#ffefee;color:red;border-radius:4px;transition:background-color .3s ease,color .3s ease}.close-icon:hover{background-color:red;color:#fff}.checkboxdiv{display:flex;align-items:center}.checkboxdiv input{flex-shrink:0}input:focus,input:active,select:focus,select:active,textarea:focus,textarea:active,button:focus,button:active{outline:none!important}@supports (-webkit-appearance: none) or (-moz-appearance: none){input[type=checkbox]{--active: #275EFE;--active-inner: #fff;--focus: 2px rgba(39, 94, 254, .3);--border: #BBC1E1;--border-hover: #275EFE;--background: #fff;--disabled: #F6F8FF;--disabled-inner: #E1E6F9;-webkit-appearance:none;-moz-appearance:none;height:21px;outline:none;display:inline-block;vertical-align:top;position:relative;margin:0;cursor:pointer;border:1px solid var(--bc, var(--border));background:var(--b, var(--background))!important;transition:background .3s,border-color .3s,box-shadow .2s}input[type=checkbox]:after{content:\"\";display:block;left:0;top:0;position:absolute;transition:transform var(--d-t, .3s) var(--d-t-e, ease),opacity var(--d-o, .2s)}input[type=checkbox]:checked{--b: var(--active);--bc: var(--active);--d-o: .3s;--d-t: .6s;--d-t-e: cubic-bezier(.2, .85, .32, 1.2)}input[type=checkbox]:disabled{--b: var(--disabled);cursor:not-allowed;opacity:.9}input[type=checkbox]:disabled:checked{--b: var(--disabled-inner);--bc: var(--border)}input[type=checkbox]:disabled+label{cursor:not-allowed}input[type=checkbox]:hover:not(:checked):not(:disabled){--bc: var(--border-hover)}input[type=checkbox]:focus{box-shadow:0 0 0 var(--focus)}input[type=checkbox]:not(.switch){width:21px}input[type=checkbox]:not(.switch):after{opacity:var(--o, 0)}input[type=checkbox]:not(.switch):checked{--o: 1}input[type=checkbox]+label{font-size:14px;line-height:21px;display:inline-block;vertical-align:top;cursor:pointer;margin-left:4px}input[type=checkbox]:not(.switch){border-radius:7px}input[type=checkbox]:not(.switch):after{width:5px;height:9px;border:2px solid var(--active-inner);border-top:0;border-left:0;left:7px;top:4px;transform:rotate(var(--r, 20deg))}input[type=checkbox]:not(.switch):checked{--r: 43deg}input[type=checkbox].switch{width:38px;border-radius:11px}input[type=checkbox].switch:after{left:2px;top:2px;border-radius:50%;width:15px;height:15px;background:var(--ab, var(--border));transform:translate(var(--x, 0))}input[type=checkbox].switch:checked{--ab: var(--active-inner);--x: 17px}input[type=checkbox].switch:disabled:not(:checked):after{opacity:.6}input[type=checkbox]:indeterminate{--b: var(--active);--bc: var(--active);--d-o: .3s;--d-t: .6s;--d-t-e: cubic-bezier(.2, .85, .32, 1.2)}input[type=checkbox]:indeterminate:after{content:\"\";display:block;left:8px;top:5px;rotate:69deg;position:absolute;width:2px;height:9px;background:var(--active-inner);opacity:6;transition:transform var(--d-t, .3s) var(--d-t-e, ease),opacity var(--d-o, .2s)}}:host{--primary-color: #275EFE;--secondary-color: #6C757D;--text-color: #434555;--border-color: #e0e0e0;--hover-bg: #f9f9f9;--header-bg: #ffffff;--body-bg: #ffffff;--danger-color: #FF2C10;--scroll-shadow: rgba(0, 0, 0, .08);--box-shadow: 0 2px 10px rgba(0, 0, 0, .1)}:host(.dark-theme){--primary-color: #6c8dfa;--text-color: #ffffff;--header-bg: #2c2c2c;--body-bg: #1e1e1e;--border-color: #404040;--hover-bg: #373737}.hyper-link:hover{color:#00f!important;text-decoration:underline;cursor:pointer}.on-edit:hover .edit-icon{visibility:visible}.nxt-lop-input{border-radius:5px;color:#2c3137;font-weight:400;font-size:13px;transition:all .2s}.input-box{border:solid}.inlineAdd{align-items:center;gap:10px;padding-top:10px}.addIconBor{padding:4px;border-radius:5px;border:1px solid #6c757d;transition:background-color .3s,border-color .3s}.addIcon{padding:1px;border-radius:5px;background-color:#ddd;transition:background-color .3s}.addIconBor:hover .addIcon{background-color:#bbd3ff}::ng-deep .modal-backdrop{background-color:#000000b3!important}::ng-deep .modal-backdrop.show{opacity:1!important}.eicon-container:hover .edit-icon svg path{fill:#2163ff!important}.eicon-container:hover .edit-icon{background-color:#c9d2ff!important;cursor:pointer}.eicon-container:hover{border:1px solid #2163ff!important}.dicon-container:hover .delete-icon svg path{stroke:#fff!important;fill:transparent!important}.dicon-container:hover .delete-icon{background-color:#ff7575!important;cursor:pointer}.dicon-container:hover{border:1px solid #ff2121!important}.clickable-img{position:relative;cursor:pointer;padding:2px;border:1px solid #dddddd;border-radius:5px}.clickable-img:hover{border:1px solid rgb(31,105,255);border-radius:5px}.clickable-img:hover div svg{background-color:#ecf3ff!important}.clickable-img:hover div{background-color:#ecf3ff!important}.dropdown-menu{left:unset!important;right:300%;top:12.5px;background-color:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 4px 8px #0000001a}.dropdown .dropdown-menu{display:block}.dropdown-menu .btn{display:block;padding:10px;width:100%;text-align:left;background:transparent;border:none;cursor:pointer}[dir=rtl] .search{margin-left:7px}[dir=rtl] .noOfRec{gap:4px}[dir=rtl] .sticky-column{position:sticky;right:0;z-index:11;background:var(--header-bg)}[dir=rtl] .actionCol{position:sticky;padding:unset!important;align-items:center;z-index:11;left:0;background:var(--header-bg)}[dir=rtl] .resize-handle{position:relative;left:0!important;right:14px;width:1.5px;background-color:#dddd}[dir=rtl] .sort-indicators{padding-right:5px}::ng-deep [dir=rtl] nxt-pagination .dropdown-arrow{left:5px;right:unset!important}::ng-deep [dir=rtl] nxt-button .dropdown-menu{right:unset!important;left:0!important}[dir=rtl] .dropdown-menu{left:300%!important;right:unset!important}[dir=rtl] .fc-btn-text{padding-right:10px}.selected-cell{border-left:2px solid #2196F3!important;border-right:2px solid #2196F3!important;position:relative;z-index:1}.selected-column{position:relative;border:2px solid #2196F3!important;border-bottom:none!important;border-radius:4px}.close-column-btn{position:absolute;top:3px;right:3px;width:12px;height:12px;border:solid black .5px;color:#000;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:9px;cursor:pointer;z-index:2}.close-column-btn:hover{background:#f32121!important;border:solid #f32121 .5px!important;color:#fff!important}.table-row:last-child .selected-cell{border-bottom:2px solid #2196F3!important}.hover-content{position:absolute;z-index:1;background:#fff;border:1px solid #ccc;box-shadow:0 2px 5px #00000026;padding:10px;min-width:200px;border-radius:5px;top:70%;left:0;cursor:pointer}.expense-file{text-decoration:none;transition:text-decoration .2s ease-in-out;cursor:pointer}.expense-file:hover{text-decoration:underline;color:#0056b3;cursor:pointer}.popover-container .hover-content{display:none;position:absolute;cursor:pointer}.popover-container:hover .hover-content{display:block;cursor:pointer}.summary-row{font-weight:700}.non-summary-table-cell{display:table-cell;padding:12px;text-overflow:ellipsis;white-space:nowrap;position:relative;color:var(--text-color);border:solid 1px white!important}.summary-table-cell{display:table-cell;padding:12px;text-overflow:ellipsis;white-space:nowrap;position:relative;color:var(--text-color);border:solid 1px var(--border-color)!important;border-top:solid 1.5px var(--border-color)!important}.horizontal-summary-table-cell{display:table-cell;max-width:none;box-sizing:border-box;overflow:visible;white-space:nowrap;padding:12px;text-overflow:ellipsis;position:relative;color:var(--text-color);border:solid 1px white!important;border-top:solid 1px var(--border-color)!important;border-bottom:1px solid var(--border-color)!important}.last-cell{border-right:1px solid var(--border-color)!important}.table-last-cell{border-bottom:1px solid var(--border-color)!important}.skeleton-loader{display:table;width:100%;border-collapse:collapse}.skeleton-row{display:table-row;border-bottom:1px solid var(--border-color)}.skeleton-cell{display:table-cell;padding:12px;height:35px;background:#fff;position:relative}.skeleton-cell:before{content:\"\";position:absolute;inset:3px;background:linear-gradient(90deg,#f5f5f5 25%,#eaeaea,#f5f5f5 75%);background-size:200% 100%;animation:pulse 1.5s infinite linear;border-radius:4px}.skeleton-cell.sticky-column{position:sticky;left:0;z-index:11;background:#f5f5f5}.skeleton-cell.actionCol.sticky-column{position:sticky;right:0;left:auto;background:#f5f5f5}@keyframes pulse{0%{background-position:200% 0}to{background-position:-200% 0}}.form-builder-table-box{height:108px;display:flex;justify-content:center;align-items:center;border:1px dashed #a8a1a1}.no-data{display:flex;align-items:anchor-center;height:60px;justify-content:center}.custom-line{width:100%;border:1px solid #000}\n"] }]
1618
1619
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.TranslationService }, { type: i0.Renderer2 }, { type: i2.DataService }, { type: i3.ChangeService }], propDecorators: { data: [{
1619
1620
  type: Input
1620
1621
  }], tableFilterData: [{
@@ -1739,4 +1740,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1739
1740
  type: HostListener,
1740
1741
  args: ['document:click', ['$event']]
1741
1742
  }] } });
1742
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2RhdGF0YWJsZS9kYXRhdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvZGF0YXRhYmxlL2RhdGF0YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBYyxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBRXpGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEw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LFNBQVMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUMxRyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ2xILElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDdEgsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUMxRyxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ2xJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDckgsSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksSUFB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QXJCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkEwQmEsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPO2dCQUNXLGNBQWM7c0JBQTFDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQWkzQmlCLGVBQWU7c0JBQTFELFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFZpZXdDaGlsZCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE54dEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2J1dHRvbi9ueHQtYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRQYWdpbmF0aW9uIH0gZnJvbSAnLi4vcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRTZWFyY2hGaWx0ZXJQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZS9zZWFyY2gtZmlsdGVyL3NlYXJjaC1maWx0ZXIucGlwZSc7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFuZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY2hhbmdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOeHRHZXRWYWx1ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlL2dldC12YWx1ZS5waXBlJztcbmltcG9ydCB7IExpc3RWaWV3RmlsdGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vbGlzdC12aWV3LWZpbHRlci9saXN0LXZpZXctZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE54dEN1c3RvbVRyYW5zbGF0ZVBpcGUgfSBmcm9tICcuLi8uLi9waXBlL2N1c3RvbS10cmFuc2xhdGUucGlwZSc7XG5pbXBvcnQgeyBQaWNrTG9jYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9waWNrLWxvY2F0aW9uL3BpY2stbG9jYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IEljb25TZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24tc2VsZWN0b3IvaWNvbi1zZWxlY3Rvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnh0U2VhcmNoQm94IH0gZnJvbSAnLi4vc2VhcmNoLWJveC9zZWFyY2gtYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDdXN0b21Ecm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2N1c3RvbS1kcm9wZG93bi9jdXN0b20tZHJvcGRvd24uY29tcG9uZW50JztcbmltcG9ydCB7IEN1c3RvbVJhZGlvQ29tcG9uZW50IH0gZnJvbSAnLi4vY3VzdG9tLXJhZGlvL2N1c3RvbS1yYWRpby5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnh0RmlsZVVwbG9hZENvbXBvbmVudCB9IGZyb20gJy4uL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRJbnB1dCB9IGZyb20gJy4uL254dC1pbnB1dC9ueHQtaW5wdXQuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnh0LWRhdGF0YWJsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOeHRCdXR0b25Db21wb25lbnQsXG4gICAgTnh0UGFnaW5hdGlvbixcbiAgICBOeHRTZWFyY2hGaWx0ZXJQaXBlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTnh0R2V0VmFsdWVQaXBlLFxuICAgIFBpY2tMb2NhdGlvbkNvbXBvbmVudCxcbiAgICBOeHREYXRhdGFibGUsXG4gICAgSWNvblNlbGVjdG9yQ29tcG9uZW50LFxuICAgIE54dFNlYXJjaEJveCxcbiAgICBDdXN0b21Ecm9wZG93bkNvbXBvbmVudCxcbiAgICBDdXN0b21SYWRpb0NvbXBvbmVudCxcbiAgICBOeHRGaWxlVXBsb2FkQ29tcG9uZW50LFxuICAgIE54dElucHV0LFxuICAgIExpc3RWaWV3RmlsdGVyQ29tcG9uZW50LFxuICAgIE54dEN1c3RvbVRyYW5zbGF0ZVBpcGVcbiAgICAvLyBSb3dSZXNpemVyRGlyZWN0aXZlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZGF0YXRhYmxlLmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIE54dERhdGF0YWJsZSB7XG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107ICAvLyAgZ2V0IGRhdGEgdGhhdCB0byBiZSBkaXNwbGF5ZWQgaW4gYSBhcnJheVxuICBASW5wdXQoKSB0YWJsZUZpbHRlckRhdGE6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnM6IEFycmF5PGFueT4gPSBbXTsgLy8gQ29sdW1ucyBoYXZlIGEgbGFiZWwsIGEgY29sdW1uIHR5cGUsIGFuZCBmaWx0ZXIgZGV0YWlscy5cbiAgQElucHV0KCkgd2l0aENoZWNrQm94OiBib29sZWFuOyAgLy8gZ2V0IGlmIHdpdGggb3Igd2l0aG91dCBjaGVja2JveCBpbiB0YWJsZVxuICBASW5wdXQoKSBzZWFyY2hCYXI6IGJvb2xlYW47IC8vIGlmIGl0IGlzIHRydWUsIHRoZSBzZWFyY2ggYmFyIHdpbGwgYmUgZGlzcGxheWVkIG9uIHRhYmxlXG4gIEBJbnB1dCgpIHRhYmxlU2F2ZUJ1dHRvbiA9IGZhbHNlOyAvLyBzYXZlIGJ1dHRvbiBmb3IgZWRpdGluZyBMT1AgaW4gcGF5cm9sbCB0YWJsZSwgIGNoYW5nZWQgbmFtZSBmcm9tICdzYXZlTE9QJ1xuICBASW5wdXQoKSBzdGlja3lDb2x1bW4gPSBmYWxzZTsgLy8gaWYgdGhlIGxhc3QgY29sdW1uIHNob3VsZCBiZSBzdGlja3ksIGl0IHNob3VsZCBiZSBzZW50IGFzIGJvb2xlYW4gdmFsdWVcbiAgQElucHV0KCkgdGFibGVXaWR0aCA9ICcxMDAlJzsgLy8gd2lkdGggb2YgdGFibGUgY2FuIGJlIGFkanVzdGVkIGZyb20gcGFyZW50LCBieSBkZWZhdWx0IGl0IGlzIDEwMCVcbiAgQElucHV0KCkgYWN0aW9uQ29sdW1IZWFkZXIgPSAnQVBQLkFDVElPTic7ICAvLyB0byBjaGFuZ2UgdGhlIGhlYWRlciBmb3IgYWN0aW9uIGNvbHVtblxuICBASW5wdXQoKSBhY3Rpb25CdXR0b246IGJvb2xlYW47ICAvL3RvIHNob3cgYnV0dG9uIGNvbHVtIGFzIGFjdGlvblxuICBASW5wdXQoKSB0aXRsZTogYW55Oy8vIHRoZSB0aXRsZSBmb3IgdGhlIHRhYmxlO1xuICBASW5wdXQoKSBpc0J1dHRvbnM6IGJvb2xlYW47Ly8gaXMgYnV0dG9uIHByZXNlbnQgaW4gdGFibGU7XG4gIEBJbnB1dCgpIGJ1dHRvbkFycmF5OiBhbnk7Ly8gYnV0dG9ucyB0byBiZSBkaXNwbGF5ZWQ7XG4gIEBJbnB1dCgpIHRhYmxlSWQ6IGFueSA9ICdpZCc7IC8vIGlkIG9mIHRhYmxlXG4gIEBJbnB1dCgpIGlzRWRpdFJvdzogYm9vbGVhbjsgLy8gaWYgaXQgaXMgdHJ1ZSwgdGhlIHJvdyBjYW4gYmUgZWRpdGVkXG4gIEBJbnB1dCgpIGlzRGVsZXRlUm93OiBib29sZWFuOyAvLyBpZiBpdCBpcyB0cnVlLCB0aGUgcm93IGNhbiBiZSBkZWxldGVkXG4gIEBJbnB1dCgpIGFkZElubGluZVJlY29yZDogYm9vbGVhbjsgLy8gaWYgaXQgaXMgdHJ1ZSwgdGhlIHJvdyBjYW4gYmUgYWRkZWQgaW5saW5lXG4gIEBJbnB1dCgpIHNlYXJjaENvbmZpZ3M6IGFueTsgLy8gc2VhcmNoIGNvbmZpZ3VyYXRpb25zXG4gIEBJbnB1dCgpIGRpcmVjdGlvbjogJ3J0bCcgfCAnbHRyJyA9ICdsdHInOyAvLyBkaXJlY3Rpb24gb2YgdGFibGVcbiAgQElucHV0KCkgcGFnaW5hdGlvbjogYW55OyAvLyBwYWdpbmF0aW9uIGNvbmZpZ3VyYXRpb25zXG4gIEBJbnB1dCgpIGFjdGlvbkJ1dHRvbkFycmF5OiBhbnk7IC8vIGFjdGlvbiBidXR0b24gY29uZmlndXJhdGlvbnNcbiAgQElucHV0KCkgbXVsdGlwbGVGaWx0ZXI6IGFueTsgLy8gaWYgcGFnaW5hdGlvbiB0cnVlIHRoZW4gdGhpcyB3aWxsIGJlIHVzZWRcbiAgQElucHV0KCkgaXNQYWdpbmF0aW9uOiBhbnk7IC8vIHBhZ2luYXRpb24gY29uZmlndXJhdGlvbnMgaWYgdHJ1ZSB0aGVuIHBhZ2luYXRpb24gd2lsbCBiZSBlbmFibGVkXG4gIEBJbnB1dCgpIGlzTm9zSW5kaWNhdG9yOiBhbnk7IC8vIGlmIHRydWUgdGhlbiBubyBkYXRhIGluZGljYXRvciB3aWxsIGJlIHNob3duXG4gIEBJbnB1dCgpIGlzRWRpdGFibGU6IGFueTsgLy8gaWYgdHJ1ZSB0aGVuIHRhYmxlIHdpbGwgYmUgZWRpdGFibGVcbiAgQElucHV0KCkgZnJvbTogYW55OyAvLyBmcm9tIGRhdGUgcGFsdGZvcm0gYmFzZWQgaW5pdGlhbGl6ZSBpbnB1dHMgZXg6LSAnZm9ybUJ1aWxkZXInXG4gIEBJbnB1dCgpIHF1ZXN0aW9uOiBhbnk7IC8vIHF1ZXN0aW9uIGlzIHVzZWQgZm9yIG54dCBmb3JtIGJ1aWxkZXIgdGFibGUgcHJldmlld1xuICBASW5wdXQoKSByb3dUZXh0U2l6ZTogYW55OyAvLyBzaXplIG9mIHJvdyB0ZXh0XG4gIEBJbnB1dCgpIHJvd1RleHRDb2xvcjogYW55OyAvLyBjb2xvciBvZiByb3cgdGV4dFxuICBASW5wdXQoKSBhcGlNZXRhOiBzdHJpbmc7IC8vIGFwaSBtZXRhIGlzIHVzZWQgZm9yIG54dCBmb3JtIGJ1aWxkZXIgdGFibGUgcHJldmlld1xuICBASW5wdXQoKSBzdW1tYXJ5Um93czogYW55OyAvLyBJbnB1dCBmb3IgY29uZmlndXJhYmxlIHN1bW1hcnkgcm93c1xuICBASW5wdXQoKSBzdW1tYXJ5Q29sdW1uczogYW55OyAvLyBJbnB1dCBmb3Igc3VtbWFyeSBjb2x1bW5zIGNvbmZpZ1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGFueTsgLy9TS1MyOE1BUjI1IElucHV0IGZvciBsb2FkaW5nIGluZGljYXRvclxuICBASW5wdXQoKSB0YWJsZUNvbmZpZzogYW55OyAvLyB0YWJsZSBjb25maWcgZm9yIG54dCBmb3JtIGJ1aWxkZXIgdGFibGVcbiAgQElucHV0KCkgdGFibGVQYXJhbXM6IGFueTsgLy9TS1MxN0FQUjI1IFJlY2VpdmVzIHRhYmxlUGFyYW1zIGluZm9ybWF0aW9uIGZyb20gcGFyZW50IGNvbXBvbmVudFxuICBASW5wdXQoKSBsaXN0Vmlld3M6IGFueVtdID0gW107IC8vU0tTMjZBUFIyNSBQcmVkZWZpbmVkIGxpc3Qgdmlld3NcbiAgQElucHV0KCkgbW9kZTogJ3ZpZXcnIHwgJ2VkaXQnIHwgJ3ByaW50JyA9ICdlZGl0JzsgLy8gU0tTMTFKVU4yNSBOZXcgbW9kZSBpbnB1dFxuICBASW5wdXQoKSBsYW5ndWFnZUNvZGU6IHN0cmluZzsgLy9TS1MyOEpVTjI1IGZvciB0cmFuc2xhdGlvblxuICBASW5wdXQoKSBzZWxlY3RlZENvbHVtbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIFNLUzIySlVMMjUgdG8gZ2V0IHRoZSBzZWxlY3RlZCBjb2x1bW5cbiAgQElucHV0KCkgYWxsSWNvbnM6IGFueVtdID0gW107IC8vIFNLUzIySlVMMjUgaWNvbiBzZWxlY3RvciBjb21wb25lbnQgaW5wdXRcblxuICBAT3V0cHV0KCkgdGFibGVSb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PjsgLy8gZGF0YXMgdG8gYmUgcGFzc2VkIHdoZW4gdGFibGUgcm93IGlzIGNsaWNrZWRcbiAgQE91dHB1dCgpIG9uRWRpdERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT47IC8vIGlmIGVkaXQgYnV0dG9uIGlzIGNsaWNrZWQsIHRoZSBkYXRhIG9mIHRoYXQgcm93IHdpbGwgYmUgcGFzc2VkXG4gIEBPdXRwdXQoKSBzYXZlQnV0dG9uRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PjsgLy8gZWRpdGVkIHJvd3MgZGF0YSB3aWxsIGJlIHBhc3NlZFxuICBAT3V0cHV0KCkgb25EZWxldGVEYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+OyAgLy8gd2hlbiBkZWxldGUgYnV0dG9uIGNsaWNrZWQgcGFzcyB0aGUgZGF0YVxuICBAT3V0cHV0KCkgYnV0dG9uRW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PjsgLy8gdGhpcyB3aWxsIGVtaXQgYSB0YWJsZSB0b3AgYnV0dG9uIGNsaWNrIGV2ZW50XG4gIEBPdXRwdXQoKSBoeXBlckxpbmtFbWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+OyAvLyBoeXBlciBsaW5rIGNsaWNrIGV2ZW50XG4gIEBPdXRwdXQoKSBzaWRlTmF2RW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBkYXRhOiBhbnksIGNvbDogYW55LCBjb25maWc6IGFueSB9PjsgLy8gcmlnaHRuYXYgY29sdW1uIGVtaXRcbiAgQE91dHB1dCgpIGFjdGlvbkJ1dHRvbkVtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT47IC8vIGRhdGFzIHRvIGJlIHBhc3NlZCB3aGVuIHRhYmxlIHJvdyBhY3RpdmUgYnV0dG9uIGlzIGNsaWNrZWRcbiAgQE91dHB1dCgpIGNvbHVtblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHVuaXF1ZUlkZW50aWZpZXI6IHN0cmluZywgZGF0YTogYW55W10gfT4oKTtcbiAgQE91dHB1dCgpIHJlbW92ZUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyB1bmlxdWVJZGVudGlmaWVyOiBzdHJpbmcsIGRhdGE6IGFueVtdIH0+KCk7XG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGVkVmFsdWVzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTsgLy8gdG8gcGFzcyB0aGUgc2VsZWN0ZWQgY2hlY2tib3ggdmFsdWVzXG4gIEBPdXRwdXQoKSBmaWxlRW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpOyAvLyB0byBwYXNzIHRoZSBmaWxlXG4gIEBPdXRwdXQoKSBOeHRUYWJsZVBhcmFtc0VtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT47IC8vU0tTMTdBUFIyNSB0byBwYXNzIHRoZSB0YWJsZVBhcmFtcyBpbmZvcm1hdGlvblxuICBAT3V0cHV0KCkgTnh0VGFibGVGaWx0ZXJFbWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+OyAvL1NLUzNNQVkyNSBmaWx0ZXIgY29sdW1uIHZhbCBnZXQgZW1pdCBcbiAgQE91dHB1dCgpIGhhZGxlRHJvcERvd25EZXBlbmRlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgTnh0VGFibGVFbWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvLyB7XG4gIC8vICAgXCJwYWdpbmF0aW9uXCI6IHsgICAgICAgLy8gNFxuICAvLyAgICAgICBcInBhZ2VTaXplXCI6IDEwLFxuICAvLyAgICAgICBcInBhZ2VJbmRleFwiOiAxMFxuICAvLyAgIH0sXG4gIC8vICAgXCJ0YWJsZVNlYXJjaFwiOiB7ICAgICAgLy8gMVxuICAvLyAgICAgICBcImZpZWxkc1wiIDogW1xuICAvLyAgICAgICAgICAgXCJsaWdodFR5cGVcIixcbiAgLy8gICAgICAgICAgIFwic3lzdGVtXCIsXG4gIC8vICAgICAgICAgICBcInN0YXR1c1wiXG4gIC8vICAgICAgIF0gLFxuICAvLyAgICAgICBcInZhbHVlXCI6ICdyLTAwMScgXG4gIC8vICAgfSwgIFxuICAvLyAgIFwic2VhcmNoRmlsdGVyRGF0YVwiOiB7ICAvLyAyXG4gIC8vICAgICAgIFwibGlnaHRUeXBlXCI6IFtcbiAgLy8gICAgICAgICAgIFwiQUFcIixcbiAgLy8gICAgICAgICAgIFwiQkJcIiBcbiAgLy8gICAgICAgXVxuICAvLyAgIH0sXG4gIC8vICAgXCJzb3J0XCI6IHsgICAgICAgICAgICAgIC8vIDNcbiAgLy8gICAgICAgXCJjb2x1bW5cIjogXCJhc3NldENvZGVcIixcbiAgLy8gICAgICAgXCJkaXJlY3Rpb25cIjogXCJhc2NcIlxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydCE6IE1hdFNvcnQ7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQ29udGFpbmVyJykgdGFibGVDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBzZWxlY3Rpb246IGFueTsgLy8gdG8gZ2V0IHRoZSBzZWxlY3RlZCByb3dcbiAgc3RpY2t5Q29uZGl0aW9uITogbnVtYmVyOyAvLyB0byBnZXQgdGhlIHN0aWNreSBjb2x1bW4gaW5kZXhcbiAgc2VhcmNoRmlsdGVyID0gZmFsc2U7IC8vIHRvIGdldCB0aGUgc2VhcmNoIGZpbHRlclxuICBmaWx0ZXJBcnJheTogQXJyYXk8YW55PiA9IFtdOyAvLyB0byBnZXQgdGhlIGZpbHRlciBhcnJheVxuICBzZWxlY3RlZEZpbHRlcjogYW55OyAvLyB0byBnZXQgdGhlIHNlbGVjdGVkIGZpbHRlclxuICBwYWdlU2l6ZU9wdGlvbnM6IEFycmF5PGFueT4gIC8vIGZvciBwYWdpbmF0aW9uIGdldCB0aGUgcGFnZSBzaXplIG9wdGlvbnNcbiAgZGF0YVNvdXJjZTogYW55OyAgLy8gZm9yIHRhYmxlIGRhdGEgc291cmNlXG4gIHRvdGFsQ291bnQhOiBudW1iZXIgLy8gY291bnQgb2YgdG90YWwgcmVjb3Jkc1xuICBzZWFyY2hCb3hWYWx1ZTogYW55OyAvLyB0byBnZXQgdGhlIHNlYXJjaCBib3ggdmFsdWVcbiAgcHJldlNlYXJjaDogYW55OyAvLyB0byBnZXQgdGhlIHByZXZpb3VzIHNlYXJjaCB2YWx1ZVxuICBhY3RpdmVDb2x1bW46IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyBUcmFjayB0aGUgYWN0aXZlIGNvbHVtblxuICBpc1Njcm9sbGVkID0gZmFsc2U7IC8vIEJvb2xlYW4gZmxhZyB0byB0cmFjayBzY3JvbGwgc3RhdGVcbiAgaXNTaGFkb3dIaWRkZW4gPSBmYWxzZTsgLy8gQm9vbGVhbiBmbGFnIHRvIHRyYWNrIHNoYWRvdyBzdGF0ZVxuICBjdXJyZW50U29ydENvbHVtbjogc3RyaW5nID0gJyc7IC8vIHRvIGdldCB0aGUgY3VycmVudCBzb3J0IGNvbHVtblxuICBjdXJyZW50U29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCAnbm9uZScgPSAnbm9uZSc7IC8vIHRvIGdldCB0aGUgY3VycmVudCBzb3J0IGRpcmVjdGlvblxuICBvcmlnaW5hbERhdGE6IGFueTsgLy8gU3RvcmUgb3JpZ2luYWwgZGF0YSBmb3Igc29ydGluZ1xuICBob3ZlcmVkQ29sdW1uOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgdGhlIGhvdmVyZWQgY29sdW1uXG4gIHNlYXJjaFRleHQ6IGFueTsgLy8gdG8gZ2V0IHRoZSBzZWFyY2ggdGV4dFxuICBtdWx0aXBsZUZpbHRlckFycmF5OiBhbnk7IC8vIHRvIGdldCB0aGUgbXVsdGlwbGUgZmlsdGVyIGFycmF5XG4gIHRhYmxlRmlsdGVyQXJyYXk6IGFueTsgLy8gdG8gZ2V0IHRoZSB0YWJsZSBmaWx0ZXIgYXJyYXlcbiAgZmlsdGVyRGF0YUFycmF5OiBhbnkgPSB7fSAvLyB0byBnZXQgdGhlIGZpbHRlciBkYXRhIGFycmF5XG4gIGlzUmVzaXplZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBmb3IgdGFibGUgY29sdW1uIHJlc2l6ZVxuICBzRmlsdGVyRGF0YTogYW55OyAvLyB0byBnZXQgdGhlIHNlYXJjaCBmaWx0ZXIgZGF0YVxuICBjdXJyZW50Q29sdW1uczogQXJyYXk8YW55PiA9IFtdO1xuICBpbmxpbmVFbGVtZW50OiBhbnkgLy8gZm9yIGFkZCBhIG5ldyByb3cgb24gdGFibGVcbiAgcGFnZVNpemU6IGFueSAgLy8gZm9yIHBhZ2luYXRpb24gZ2V0IHRoZSBwYWdlIHNpemVcbiAgcGFnZUluZGV4OiBhbnkgLy8gZm9yIHBhZ2luYXRpb24gZ2V0IHRoZSBwYWdlIGluZGV4XG4gIHRvdGFsUmVjb3JkczogbnVtYmVyOyAvLyBmb3IgcGFnaW5hdGlvbiBnZXQgdGhlIHRvdGFsIHJlY29yZHNcbiAgY29uZmlnUGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlOyAvLyBmbGFnIGZvciBjb25maWcgcGFnaW5hdGlvblxuICBkZWxldGVEYXRhOiBhbnk7IC8vIHRvIGdldCB0aGUgZGVsZXRlIHJvd1xuICBkZWxldGVNb2RhbCA9IGZhbHNlOyAvLyBmb3IgY29uZm9ybWF0aW9uIHBvcHVwXG4gIGRyb3Bkb3duQWN0aW9uQnV0dG9uOiBhbnk7IC8vIGZvciBhY3Rpb24gY29sdW1uIGRyb3Bkb3duIGJ1dHRvblxuICBjdXJyZW50T3BlbkluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gdHJhY2sgdGhlIGN1cnJlbnQgb3BlbiBhY3Rpb24gZHJvcGRvd24gaWNvbiBpbmRleFxuICBjbGlja0xpc3RlbmVyOiBhbnk7IC8vIGFjdGlvbiBjb2x1bW4gZHJvcGRvd24gYnV0dG9uIGNsaWNrIGxpc3RlbmVyIGZvciBjbG9zZSBhIGRyb3Bkb3duIGJ1dHRvblxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjsgIC8vIGZvciB0YWJsZSBkYXRhIHN1YnNjcmlwdGlvblxuICBkZWxldGVJbmRleDogbnVtYmVyOyAvLyB0byBnZXQgdGhlIGRlbGV0ZSBpbmRleFxuICBzaG93UG9wb3ZlciA9IHRydWU7XG4gIHN1bW1hcnlWYWx1ZXM6IHsgW2xhYmVsOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9OyAvLyBTS1MyME1BUjI1IE9iamVjdCB0byBzdG9yZSBzdW1tYXJ5IHJvdyB2YWx1ZXNcbiAgaXNTdW1tYXJ5Q29sdW1uOiBib29sZWFuID0gZmFsc2U7IC8vIFNLUzIwTUFSMjUgRmxhZyB0byBjaGVjayBpZiB0aGUgY29sdW1uIGlzIGluIHRoZSBkaXNwbHljb2x1bW5zIGFycmF5XG4gIGlzU3VtbWFyeVN0YXJ0Q29sdW1uOiBhbnlbXTtcbiAgaXNTdW1tYXJ5RW5kQ29sdW1uOiBhbnlbXTtcbiAgZmlsdGVyQm94RGF0YTogYW55O1xuICBmaWx0ZXJUYWJsZU5vczogYW55O1xuICBzZWxlY3RlZFZpZXc6IGFueSA9ICcnOyAgICAgICAgIC8vIFNlbGVjdGVkIGxpc3QgdmlldyBuYW1lXG4gIGlzRHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7IC8vIFRyYWNrcyBkcm9wZG93biB2aXNpYmlsaXR5XG4gIGN1cnJlbnRWaWV3RmlsdGVyOiBhbnlcbiAgaXNGdWxsVGFibGVTdW1tYXJ5Um93OiBib29sZWFuID0gZmFsc2U7IC8vIFNLUzEzSlVOMjUgRmxhZyB0byBjaGVjayBpZiB0aGUgdGFibGUgaGFzIGZ1bGwgc3VtbWFyeSByb3dcbiAgaXNJbWFnZUhvdmVyID0gZmFsc2U7XG4gIGlzSW1hZ2VFZGl0OiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkSW1hZ2VFbGVtZW50OiBhbnk7XG4gIHByaXZhdGUgcXVlc3Rpb25zQ2FjaGU6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG4gIGlzUmVzaXppbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjdXJyZW50Q29sdW1uOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIHN0YXJ0WCA9IDA7XG4gIHByaXZhdGUgc3RhcnRXaWR0aCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UscHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSwgcHJpdmF0ZSBjaGFuZ2VTZXJ2aWNlOiBDaGFuZ2VTZXJ2aWNlKSB7IH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydjb2x1bW5zJ10pIHtcbiAgICAgIHRoaXMucXVlc3Rpb25zQ2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhU291cmNlID0geyBkYXRhOiBbXSB9OyAvLyBvciB1c2UgYSBwcm9wZXIgZGF0YSBzdHJ1Y3R1cmVcbiAgICB0aGlzLmN1cnJlbnRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXG4gICAgaWYgKHRoaXMuZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJykge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5xdWVzdGlvbj8uaW5wdXQgPyB0aGlzLnF1ZXN0aW9uPy5pbnB1dCA6IHRoaXMuZGF0YSA/IHRoaXMuZGF0YSA6IFtdXG4gICAgICBsZXQgcGFyc2VkTWV0YSA9IHR5cGVvZiB0aGlzLnF1ZXN0aW9uPy5bJ2ZpZWxkc01ldGEnXSA9PT0gJ29iamVjdCcgPyB0aGlzLnF1ZXN0aW9uPy5bJ2ZpZWxkc01ldGEnXSA6IHRoaXMucXVlc3Rpb24/LlsnZmllbGRzTWV0YSddICA/IEpTT04ucGFyc2UodGhpcy5xdWVzdGlvbj8uWydmaWVsZHNNZXRhJ10pIDogW107XG4gICAgICBpZiAoIHBhcnNlZE1ldGEgPT09IG51bGwgfHwgIHBhcnNlZE1ldGEgPT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheShwYXJzZWRNZXRhKSB8fCBwYXJzZWRNZXRhPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCdObyB2YWxpZCBtZXRhZGF0YSBwcm92aWRlZCcpOyBcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU0tTMjJKVUwyNSBUcmFuc2Zvcm0gdGhlIHBhcnNlZE1ldGFcbiAgICAgIGNvbnN0IHVwZGF0ZWRNZXRhID0gcGFyc2VkTWV0YS5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB7IC4uLml0ZW0gfTtcbiAgICAgICAgLy8gUmVuYW1lIGFwaU5hbWUgdG8gZmllbGROYW1lXG4gICAgICAgIGlmIChuZXdJdGVtLmFwaU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5ld0l0ZW0uZmllbGROYW1lID0gbmV3SXRlbS5hcGlOYW1lO1xuICAgICAgICAgIGRlbGV0ZSBuZXdJdGVtLmFwaU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU0tTMjJKVUwyNSBSZW5hbWUgZmxkVHlwZSB0byB0eXBlIGFuZCBsb3dlcmNhc2UgaXRcbiAgICAgICAgaWYgKG5ld0l0ZW0uZmxkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3SXRlbS50eXBlID0gbmV3SXRlbS5mbGRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgZGVsZXRlIG5ld0l0ZW0uZmxkVHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SXRlbTtcbiAgICAgIH0pO1xuICAgICAgcGFyc2VkTWV0YSA9IHVwZGF0ZWRNZXRhO1xuICAgICAgdGhpcy5jdXJyZW50Q29sdW1ucyA9IHVwZGF0ZWRNZXRhXG4gICAgICBpZiAodGhpcy50YWJsZUNvbmZpZykge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLnRhYmxlQ29uZmlnO1xuICAgICAgICB0aGlzLmlzTm9zSW5kaWNhdG9yID0gY29uZmlnPy5pc05vc0luZGljYXRvciAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRkSW5saW5lUmVjb3JkID0gY29uZmlnLmFkZElubGluZVJlY29yZCAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNQYWdpbmF0aW9uID0gY29uZmlnLmlzUGFnaW5hdGlvbiAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uID0gY29uZmlnLmFjdGlvbkJ1dHRvbiAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNEZWxldGVSb3cgPSBjb25maWcuaXNEZWxldGVSb3cgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRWRpdFJvdyA9IGNvbmZpZy5pc0VkaXRSb3cgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLnNlYXJjaEJhciA9IGNvbmZpZy5zZWFyY2hCYXIgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQnV0dG9ucyA9IGNvbmZpZy5pc0J1dHRvbnMgIT09IGZhbHNlOyAvL3N1bW1hcnlDb2x1bW5cbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IGNvbmZpZy5pdGVtc1BlclBhZ2UgfHwgNTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdW1tYXJ5Q29sdW1ucyA9IHBhcnNlZE1ldGFcbiAgICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnN1bW1hcnlDb2x1bW4gPT09IHRydWUpXG4gICAgICAgIC5tYXAoKHsgYXBpTmFtZSwgZmxkVHlwZSwgLi4ucmVzdCB9KSA9PiAoe1xuICAgICAgICAgIGZpZWxkTmFtZTogYXBpTmFtZSxcbiAgICAgICAgICB0eXBlOiBmbGRUeXBlLFxuICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgfSkpO1xuICAgICAgdGhpcy5zdW1tYXJ5Um93cyA9IHBhcnNlZE1ldGFcbiAgICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnN1bW1hcnlSb3cgPT09IHRydWUpXG4gICAgICAgIC5tYXAoKHsgYXBpTmFtZSwgZmxkVHlwZSwgLi4ucmVzdCB9KSA9PiAoe1xuICAgICAgICAgIGZpZWxkTmFtZTogYXBpTmFtZSxcbiAgICAgICAgICB0eXBlOiBmbGRUeXBlLFxuICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgYHRoaXMuZGF0YWAgaXMgYW4gYXJyYXlcbiAgICBpZiAoIXRoaXMuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0RhdGEgaXMgbm90IGluaXRpYWxpemVkIG9yIGlzIG5vdCBhbiBhcnJheScpO1xuICAgICAgdGhpcy5kYXRhID0gW107ICAvLyBJbml0aWFsaXplIGFzIGFuIGVtcHR5IGFycmF5IGlmIGl0J3Mgbm90IHZhbGlkXG4gICAgfVxuICAgIC8vIEVuc3VyZSBgdGhpcy5kYXRhU291cmNlLmRhdGFgIGlzIGluaXRpYWxpemVkXG4gICAgLy9TS1MxNUZFQjI1IEluaXRpYWxpemUgdGhpcyBpbiB5b3VyIGRhdGEgZmV0Y2ggbWV0aG9kXG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEnXSkge1xuICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSB0aGlzLmRhdGEubWFwKHJvdyA9PiB0aGlzLmZsYXR0ZW5Sb3cocm93KSk7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhO1xuICAgICAgdGhpcy5jb21wdXRlU3VtbWFyeVZhbHVlcygnb25DaGFuZ2UnKTsgLy8gSWYgeW91IGhhdmUgc3VtbWFyeSByb3dzXG4gICAgfVxuICAgIHRoaXMub3JpZ2luYWxEYXRhID0gWy4uLnRoaXMuZGF0YV07XG4gICAgdGhpcy5zRmlsdGVyRGF0YSA9IFsuLi50aGlzLmRhdGFdO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5vcmlnaW5hbERhdGE7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMucGFnaW5hdGlvbj8ucGFnZVNpemUgPyB0aGlzLnBhZ2luYXRpb25bJ3BhZ2VTaXplJ10gOiB0aGlzLnBhZ2VTaXplIHx8IDEwO1xuICAgIHRoaXMucGFnZUluZGV4ID0gdGhpcy5wYWdpbmF0aW9uPy5wYWdlSW5kZXggPyB0aGlzLnBhZ2luYXRpb25bJ3BhZ2VJbmRleCddIDogdGhpcy5wYWdlSW5kZXggfHwgMTtcbiAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IHRoaXMucGFnaW5hdGlvbj8udG90YWxSZWNvcmRzID8gdGhpcy5wYWdpbmF0aW9uWyd0b3RhbFJlY29yZHMnXSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IHRoaXMucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zID8gdGhpcy5wYWdpbmF0aW9uWydwYWdlU2l6ZU9wdGlvbnMnXSA6IFsnNScsICcxMCcsICcyNScsICc1MCcsICcxMDAnLCAnMjAwJ107XG4gICAgdGhpcy5jb25maWdQYWdpbmF0aW9uID0gISEodGhpcy5wYWdpbmF0aW9uICYmIE9iamVjdC5rZXlzKHRoaXMucGFnaW5hdGlvbikubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5pc1BhZ2luYXRpb24gPT09IHVuZGVmaW5lZCB8fCB0aGlzLmlzUGFnaW5hdGlvbiA9PT0gdHJ1ZSA/IHRoaXMuaXNQYWdpbmF0aW9uID0gdHJ1ZSA6IHRoaXMuaXNQYWdpbmF0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5pc05vc0luZGljYXRvciA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuaXNOb3NJbmRpY2F0b3IgPT09IHRydWUgPyB0aGlzLmlzTm9zSW5kaWNhdG9yID0gdHJ1ZSA6IHRoaXMuaXNOb3NJbmRpY2F0b3IgPSBmYWxzZTtcbiAgICB0aGlzLmlzRWRpdGFibGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmlzRWRpdGFibGUgPT09IGZhbHNlID8gdGhpcy5pc0VkaXRhYmxlID0gZmFsc2UgOiB0aGlzLmlzRWRpdGFibGUgPSB0cnVlXG5cblxuICAgIC8vIFNLUzIwTUFSMjUgQ2hlY2sgaWYgdGhlIGRpc3BseWNvbHVtbidzIGhhdmUgYSBzdW1tYXJ5IGNvbHVtblxuICAgIGlmICh0aGlzLnN1bW1hcnlSb3dzICYmIHRoaXMuc3VtbWFyeVJvd3M/Lmxlbmd0aCA+IDAgJiYgdGhpcy5jdXJyZW50Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmlzRnVsbFRhYmxlU3VtbWFyeVJvdyA9IHRoaXMuc3VtbWFyeVJvd3NbMF0udHlwZSA9PT0gJ2Z1bGxSb3cnIHx8ICB0aGlzLnN1bW1hcnlSb3dzWzBdLnR5cGUgPT09ICdmdWxscm93JyA/IHRydWUgOiBmYWxzZTtcbiAgICAgIHRoaXMuaXNTdW1tYXJ5Q29sdW1uID0gdGhpcy5jdXJyZW50Q29sdW1ucy5zb21lKGVsZW1lbnQgPT4gZWxlbWVudCA9PT0gdGhpcy5zdW1tYXJ5Um93c1swXS5jb2x1bW4pO1xuICAgICAgaWYgKHRoaXMuaXNTdW1tYXJ5Q29sdW1uICYmICF0aGlzLmlzRnVsbFRhYmxlU3VtbWFyeVJvdykge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY3VycmVudENvbHVtbnMuaW5kZXhPZih0aGlzLnN1bW1hcnlSb3dzWzBdLmNvbHVtbik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLmlzU3VtbWFyeVN0YXJ0Q29sdW1uID0gdGhpcy5jdXJyZW50Q29sdW1ucy5zbGljZSgwLCBpbmRleCAtIDEpO1xuICAgICAgICAgIHRoaXMuaXNTdW1tYXJ5RW5kQ29sdW1uID0gdGhpcy5jdXJyZW50Q29sdW1ucy5zbGljZShpbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRoaXMuaW5saW5lRWxlbWVudCA9IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmN1cnJlbnRDb2x1bW5zLm1hcChrZXkgPT4gW2tleSwgXCJcIl0pKTtcblxuICAgIHRoaXMuZHJvcGRvd25BY3Rpb25CdXR0b24gPSAodGhpcy5hY3Rpb25CdXR0b25BcnJheT8uYnV0dG9uQXJyYXkgJiYgdGhpcy5hY3Rpb25CdXR0b25BcnJheT8uYnV0dG9uQXJyYXk/Lmxlbmd0aCA+IDApID8gdGhpcy5hY3Rpb25CdXR0b25BcnJheT8uYnV0dG9uQXJyYXk/LnNsaWNlKHRoaXMuYWN0aW9uQnV0dG9uQXJyYXk/LnNpemUpIDogW107XG4gICAgXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgICB9LCAxMDApXG4gICAgdGhpcy50b3RhbENvdW50ID0gdGhpcy50b3RhbFJlY29yZHMgfHwgdGhpcy5kYXRhPy5sZW5ndGhcbiAgICB0aGlzLmZpbHRlclRhYmxlTm9zID0gdGhpcy50b3RhbFJlY29yZHMgfHwgdGhpcy5kYXRhPy5sZW5ndGhcbiAgICBpZiAodGhpcy5zdGlja3lDb2x1bW4gPT09IHRydWUgJiYgdGhpcy5jdXJyZW50Q29sdW1ucykge1xuICAgICAgdGhpcy5zdGlja3lDb25kaXRpb24gPSB0aGlzLmN1cnJlbnRDb2x1bW5zPy5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RpY2t5Q29uZGl0aW9uID0gdGhpcy5jdXJyZW50Q29sdW1ucz8ubGVuZ3RoICsgMTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VhcmNoQ29uZmlncz8uc2VhcmNoRmlsdGVyVmFsKSB7XG4gICAgICB0aGlzLnNlYXJjaEJveFZhbHVlID0gdGhpcy5zZWFyY2hDb25maWdzPy5zZWFyY2hGaWx0ZXJWYWw7IC8vIFNob3cgdmFsdWUgaW4gdGhlIHNlYXJjaCBib3hcbiAgICAgIHRoaXMucHJldlNlYXJjaCA9IHRoaXMuc2VhcmNoQ29uZmlncz8uc2VhcmNoRmlsdGVyVmFsO1xuICAgIH1cbiAgICBpZih0aGlzLmN1cnJlbnRWaWV3RmlsdGVyID09PSB1bmRlZmluZWQgfHwgdGhpcy5jdXJyZW50Vmlld0ZpbHRlciA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5jdXJyZW50Vmlld0ZpbHRlciA9IHRoaXMubGlzdFZpZXdzICYmIHRoaXMubGlzdFZpZXdzLmxlbmd0aCA+IDAgPyB0aGlzLmxpc3RWaWV3c1swXSA6IG51bGw7XG4gICAgfVxuICAgIGlmKHRoaXMuY3VycmVudFZpZXdGaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyICE9PSBudWxsKXtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gdGhpcy5jdXJyZW50Vmlld0ZpbHRlci5maWx0ZXJOYW1lO1xuICAgICAgaWYodGhpcy5jdXJyZW50Vmlld0ZpbHRlci5pc0RlZmF1bHQgfHwgdGhpcy5jdXJyZW50Vmlld0ZpbHRlci5maWx0ZXJOYW1lID09PSBcIkFsbCBEYXRhXCIpe1xuICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jdXJyZW50Vmlld0ZpbHRlcj8uY29sdW1ucyB8fCBbXTtcbiAgICAgICAgY29uc3QgdXBkYXRlQ29sdW1uID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSBjb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IGNvbHVtbi5maWVsZE5hbWUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICBpc0hpZGU6ICFtYXRjaCxcbiAgICAgICAgICAgIGZpbHRlcjogISFtYXRjaD8uZmlsdGVyYWJsZSxcbiAgICAgICAgICAgIHNvcnQ6ICEhbWF0Y2g/LnNvcnRhYmxlXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY3VycmVudENvbHVtbnMgPSBbLi4udXBkYXRlQ29sdW1uXVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjdXJyZW50RmlsdGVyQ29sdW1ucyA9IHRoaXMuY3VycmVudENvbHVtbnM/LmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmZpbHRlciA9PT0gdHJ1ZSkubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmllbGROYW1lKVxuICAgIGlmIChjdXJyZW50RmlsdGVyQ29sdW1ucz8ubGVuZ3RoID4gMCAmJiB0aGlzLmNvbmZpZ1BhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm11bHRpcGxlRmlsdGVyQXJyYXkgPSB7fTtcbiAgICAgIGNvbnN0IGZpbHRPYmpzOiBhbnkgPSB7fTtcbiAgICAgIGN1cnJlbnRGaWx0ZXJDb2x1bW5zLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm11bHRpcGxlRmlsdGVyQXJyYXlbZWxlbWVudF0gPSBudWxsO1xuICAgICAgICBmaWx0T2Jqc1tlbGVtZW50XSA9IFtdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmRhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgY3VycmVudEZpbHRlckNvbHVtbnMuZm9yRWFjaCgoa2V5OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0T2JqVmFsdWUoZWxlbWVudCwga2V5KTsgIC8vIDwtIGdldCBuZXN0ZWQgdmFsdWVcbiAgICBcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZmlsdE9ianNba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheVtrZXldID0gbmV3IFNldChmaWx0T2Jqc1trZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm11bHRpcGxlRmlsdGVyQXJyYXkgPSB0aGlzLm11bHRpcGxlRmlsdGVyQXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheSA9IHRoaXMubXVsdGlwbGVGaWx0ZXI7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWx0ZXJlZCBhcnJheSB0aGF0IGV4Y2x1ZGVzIGFueSBjb2x1bW4gd2l0aCAnWydcbiAgICBjb25zdCB0ZW1wRmlsdGVyQ29sdW1ucyA9IHRoaXMuY3VycmVudENvbHVtbnM/LmZpbHRlcihjb2wgPT4gIWNvbC5maWVsZE5hbWUuaW5jbHVkZXMoJ1snKSk7XG4gICAgXG4gICAgaWYgKHRlbXBGaWx0ZXJDb2x1bW5zPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWx0T2JqczogYW55ID0ge307XG4gICAgXG4gICAgICAvLyBTS1MyNk1BWTI1IEluaXRpYWxpemUgc2V0cyB0byBjb2xsZWN0IHVuaXF1ZSB2YWx1ZXMgZm9yIGVhY2ggY29sdW1uXG4gICAgICB0ZW1wRmlsdGVyQ29sdW1ucy5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xuICAgICAgICBmaWx0T2Jqc1tjb2wuZmllbGROYW1lXSA9IG5ldyBTZXQoKTtcbiAgICAgIH0pO1xuICAgIFxuICAgICAgLy8gU0tTMjZNQVkyNSBDb2xsZWN0IHVuaXF1ZSB2YWx1ZXMgZnJvbSB0YWJsZUZpbHRlckRhdGFcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJEYXRhPy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgdGVtcEZpbHRlckNvbHVtbnMuZm9yRWFjaCgoY29sOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0T2JqVmFsdWUoZWxlbWVudCwgY29sLmZpZWxkTmFtZSk7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZpbHRPYmpzW2NvbC5maWVsZE5hbWVdLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIFxuICAgICAgLy8gU0tTMjZNQVkyNSBBcHBlbmQgXCJ2YWx1ZVwiIHByb3BlcnR5IHRvIGVhY2ggY29sdW1uIG9iamVjdCB3aXRoIHRoZSBhcnJheSBvZiB1bmlxdWUgdmFsdWVzXG4gICAgICB0aGlzLnRhYmxlRmlsdGVyQXJyYXkgPSBbLi4udGVtcEZpbHRlckNvbHVtbnMubWFwKChjb2w6IGFueSkgPT4gKHtcbiAgICAgICAgLi4uY29sLFxuICAgICAgICB2YWx1ZTogQXJyYXkuZnJvbShmaWx0T2Jqc1tjb2wuZmllbGROYW1lXSlcbiAgICAgIH0pKV07XG4gICAgfSAgICBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRhYmxlQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHRhYmxlQm9keSA9IHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudGFibGUtYm9keScpO1xuICAgICAgICBpZiAodGFibGVCb2R5ICYmIHRoaXMuaXNQYWdpbmF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5pc1NoYWRvd0hpZGRlbiA9ICEodGFibGVCb2R5LnNjcm9sbEhlaWdodCA8IDQ1MClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDE1MDApOyAvLyBXYWl0cyAxMDBtcyBmb3IgcmVuZGVyaW5nXG4gICAgLy8gU0tTMjBNQVIyNSBJbml0aWFsaXplIHN1bW1hcnlWYWx1ZXMgZm9yIGlucHV0IHJvd3MgYW5kIGNvbXB1dGUgdmFsdWVzXG4gICAgaWYgKGNoYW5nZXNbJ3N1bW1hcnlSb3dzJ10gfHwgY2hhbmdlc1snc3VtbWFyeUNvbHVtbnMnXSB8fCBjaGFuZ2VzWydkYXRhJ10pIHtcbiAgICAgIHRoaXMuY29tcHV0ZVN1bW1hcnlDb2x1bW5zKCk7IC8vIENvbXB1dGUgcGVyLXJvdyBzdW1tYXJ5IGNvbHVtbnMgZmlyc3RcbiAgICAgIHRoaXMuc3VtbWFyeVJvd3M/LmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgaWYgKHJvdy50eXBlID09PSAnaW5wdXQnICYmIHRoaXMuc3VtbWFyeVZhbHVlc1tyb3cuZmllbGROYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5zdW1tYXJ5VmFsdWVzW3Jvdy5maWVsZE5hbWVdID0gMDsgLy8gRGVmYXVsdCB0byAwIGZvciBpbnB1dHNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbXB1dGVTdW1tYXJ5VmFsdWVzKCdvbkNoYW5nZScpO1xuICAgIH1cbiAgICB0aGlzLnNlYXJjaENvbmZpZ3MgJiYgdGhpcy5zZWFyY2hCb3hWYWx1ZSA/IHRoaXMuZW1wdHlTZWFyY2godGhpcy5zZWFyY2hCb3hWYWx1ZSkgOiB0aGlzLmFwcGx5RmlsdGVyKHRoaXMudGFibGVQYXJhbXM/LnRhYmxlU2VhcmNoLCdvbkNoYW5nZScpIC8vIFNLUzE3QVBSMjUgdXBkYXRlIHNlYXJjaCBib3ggdmFsdWVcbiAgICBpZiAoY2hhbmdlc1snbGFuZ3VhZ2VDb2RlJ10pIHtcbiAgICAgIGlmICh0aGlzLmxhbmd1YWdlQ29kZSkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5zZXRMYW5ndWFnZSh0aGlzLmxhbmd1YWdlQ29kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xuICAgIGlmICghdGhpcy50b3RhbFJlY29yZHMgJiYgdGhpcy5kYXRhICYmIHRoaXMuaXNQYWdpbmF0aW9uICYmICFjaGFuZ2VzWyd0YWJsZVBhcmFtcyddKSB7XG4gICAgICBjb25zdCBwYWdlSW5kZXggPSBOdW1iZXIodGhpcy5wYWdlSW5kZXgpIHx8IDA7XG4gICAgICBjb25zdCBwYWdlU2l6ZSA9IE51bWJlcih0aGlzLnBhZ2VTaXplKSB8fCAxMDtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gKHBhZ2VJbmRleCAtIDEpICogcGFnZVNpemU7XG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIHBhZ2VTaXplO1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLmRhdGE/LnNsaWNlKHN0YXJ0LCBlbmQpIHx8IFtdO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IHsgZGF0YTogW10gfTsgLy8gb3IgdXNlIGEgcHJvcGVyIGRhdGEgc3RydWN0dXJlXG4gICAgdGhpcy5jdXJyZW50Q29sdW1ucyA9IHRoaXMuY29sdW1uc1xuICAgIC8vIFNLUzEzTUFSMjUgZ2V0IGRhdGEgZnJvbSBxdWVzdGlvbiBpZiBmcm9tIGZvcm1CdWlsZGVyXG4gICAgaWYgKHRoaXMuZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJykge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNoYW5nZVNlcnZpY2UuY3VzdG9tQ2hhbmdlJC5zdWJzY3JpYmUoXG4gICAgICAgIChjaGFuZ2VWYWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChjaGFuZ2VWYWx1ZSA9PSAnZGF0YUJpbmQnKSB7XG4gICAgICAgICAgICB0aGlzLm5nT25DaGFuZ2VzKHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLnF1ZXN0aW9uPy5pbnB1dCA/IHRoaXMucXVlc3Rpb24/LmlucHV0IDogdGhpcy5kYXRhID8gdGhpcy5kYXRhIDogW11cbiAgICAgIGxldCBwYXJzZWRNZXRhID0gdHlwZW9mIHRoaXMucXVlc3Rpb24/LlsnZmllbGRzTWV0YSddID09PSAnb2JqZWN0JyA/IHRoaXMucXVlc3Rpb24/LlsnZmllbGRzTWV0YSddIDogdGhpcy5xdWVzdGlvbj8uWydmaWVsZHNNZXRhJ10gPyBKU09OLnBhcnNlKHRoaXMucXVlc3Rpb24/LlsnZmllbGRzTWV0YSddKSA6IFtdO1xuICAgICAgaWYgKCBwYXJzZWRNZXRhID09PSBudWxsIHx8ICBwYXJzZWRNZXRhID09PSB1bmRlZmluZWQgfHwgIUFycmF5LmlzQXJyYXkocGFyc2VkTWV0YSkgfHwgcGFyc2VkTWV0YT8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignTm8gdmFsaWQgbWV0YWRhdGEgcHJvdmlkZWQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU0tTMjJKVUwyNSBUcmFuc2Zvcm0gdGhlIHBhcnNlZE1ldGFcbiAgICAgIGNvbnN0IHVwZGF0ZWRNZXRhID0gcGFyc2VkTWV0YS5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB7IC4uLml0ZW0gfTtcbiAgICAgICAgLy8gUmVuYW1lIGFwaU5hbWUgdG8gZmllbGROYW1lXG4gICAgICAgIGlmIChuZXdJdGVtLmFwaU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5ld0l0ZW0uZmllbGROYW1lID0gbmV3SXRlbS5hcGlOYW1lO1xuICAgICAgICAgIGRlbGV0ZSBuZXdJdGVtLmFwaU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU0tTMjJKVUwyNSBSZW5hbWUgZmxkVHlwZSB0byB0eXBlIGFuZCBsb3dlcmNhc2UgaXRcbiAgICAgICAgaWYgKG5ld0l0ZW0uZmxkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3SXRlbS50eXBlID0gbmV3SXRlbS5mbGRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgZGVsZXRlIG5ld0l0ZW0uZmxkVHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SXRlbTtcbiAgICAgIH0pO1xuICAgICAgcGFyc2VkTWV0YSA9IHVwZGF0ZWRNZXRhO1xuICAgICAgdGhpcy5jdXJyZW50Q29sdW1ucyA9IHVwZGF0ZWRNZXRhXG4gICAgICBpZiAodGhpcy50YWJsZUNvbmZpZykge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLnRhYmxlQ29uZmlnO1xuICAgICAgICB0aGlzLmlzTm9zSW5kaWNhdG9yID0gY29uZmlnPy5pc05vc0luZGljYXRvciAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRkSW5saW5lUmVjb3JkID0gY29uZmlnLmFkZElubGluZVJlY29yZCAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNQYWdpbmF0aW9uID0gY29uZmlnLmlzUGFnaW5hdGlvbiAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uID0gY29uZmlnLmFjdGlvbkJ1dHRvbiAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNEZWxldGVSb3cgPSBjb25maWcuaXNEZWxldGVSb3cgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRWRpdFJvdyA9IGNvbmZpZy5pc0VkaXRSb3cgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLnNlYXJjaEJhciA9IGNvbmZpZy5zZWFyY2hCYXIgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQnV0dG9ucyA9IGNvbmZpZy5pc0J1dHRvbnMgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gY29uZmlnLml0ZW1zUGVyUGFnZSB8fCA1O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN1bW1hcnlDb2x1bW5zID0gcGFyc2VkTWV0YVxuICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uc3VtbWFyeUNvbHVtbiA9PT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeyBhcGlOYW1lLCBmbGRUeXBlLCAuLi5yZXN0IH0pID0+ICh7XG4gICAgICAgICAgZmllbGROYW1lOiBhcGlOYW1lLFxuICAgICAgICAgIHR5cGU6IGZsZFR5cGUsXG4gICAgICAgICAgLi4ucmVzdFxuICAgICAgICB9KSk7XG4gICAgICB0aGlzLnN1bW1hcnlSb3dzID0gcGFyc2VkTWV0YVxuICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uc3VtbWFyeVJvdyA9PT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeyBhcGlOYW1lLCBmbGRUeXBlLCAuLi5yZXN0IH0pID0+ICh7XG4gICAgICAgICAgZmllbGROYW1lOiBhcGlOYW1lLFxuICAgICAgICAgIHR5cGU6IGZsZFR5cGUsXG4gICAgICAgICAgLi4ucmVzdFxuICAgICAgICB9KSk7XG4gICAgICAgIGlmICh0aGlzLmFwaU1ldGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxldCBvcHRpb25zID0gW107XG4gICAgICAgICAgLy8gQVAtMjZNQVIyNSBFbnN1cmUgdGhhdCB0aGlzLmFwaU1ldGEgaXMgYWx3YXlzIGFuIG9iamVjdC4gIFxuICAgICAgICAgLy9BUC0yNk1BUjI1IElmIGl0J3MgYWxyZWFkeSBhbiBvYmplY3QsIGtlZXAgaXQgYXMgaXM7IG90aGVyd2lzZSwgcGFyc2UgaXQgZnJvbSBhIEpTT04gc3RyaW5nLlxuICAgICAgICAgIHRoaXMuYXBpTWV0YSA9IHR5cGVvZiB0aGlzLmFwaU1ldGEgPT09ICdvYmplY3QnID8gdGhpcy5hcGlNZXRhIDogSlNPTi5wYXJzZSh0aGlzLmFwaU1ldGEpO1xuICAgICAgICAgIGxldCBhcGlPYmo6IGFueSA9IHRoaXMuYXBpTWV0YTtcbiAgICAgICAgICBpZiAoYXBpT2JqICYmIGFwaU9iai5lbmRwb2ludCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5hcGlSZXNwb25zZShhcGlPYmouZW5kcG9pbnQpPy5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgIGxldCByZXNwb25zZXM7XG4gICAgICAgICAgICAgIGlmIChhcGlPYmoudmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgICAvLyBWRCAyMk1heTI0IC0gaGFuZGxpbmcgbXVsdGlwbGUgY2hpbGQgb2JqZWN0c1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlcyA9IHRoaXMuZGF0YVNlcnZpY2UuZ2V0VmFsdWUoYXBpUmVzcG9uc2UsIGFwaU9iai52YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgICAgICAgICAvLyBIQSAxOUpBTjI0IFRvIGF2b2lkIHVuZGVmaW5lZCBlcnJvciBpbiBjb25zb2xlXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZXM/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgcmVzcCA9IHJlc3BvbnNlc1tpXTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXNwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHJlc3VsdHM7XG4gICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBWRCAxOUpBTjI0IC0gaWYgcmVzcG9uc2UgaGFzIHZhbHVlKHdoaWNoIGlzIGFycmF5KSBvbmx5XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gYXBpUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHJlc3BvbnNlcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5tYXAoKG9iajogYW55KSA9PiAoeyAuLi5vYmosIGVkaXQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhID0gb3B0aW9ucztcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVkQgTk9WMjMgLSBoYW5kbGUgdGhlIGRlcGVuZGVudCB1cGRhdGUgZm9yIGRyb3Bkb3duXG4gICAgICAgICAgbGV0IHNvdXJjZUlkID0gYXBpT2JqPy5zb3VyY2VRdWVzdGlvbklkO1xuICAgICAgICAgIGxldCBmaWVsZCA9IGFwaU9iaj8uZmllbGQ7ICAgICAgICAvLyBWRCAxM01BWTI0IC0gZHluYW1pYyBmaWVsZCBjaGFuZ2VzXG4gICAgICAgICAgaWYgKHNvdXJjZUlkKSB7XG4gICAgICAgICAgICAvLyAvLyBWRCAxME1heTI0IFN1YnNjcmliZSBmb3IgdGhlIGNoYW5nZXNcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jaGFuZ2VTZXJ2aWNlLmNoYW5nZUFubm91bmNlZCQuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAoY2hhbmdlVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlVmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlVmFsdWUudmFsdWVPYmogIT0gdW5kZWZpbmVkICYmIGNoYW5nZVZhbHVlLmZyb21RdWVzdGlvbklkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlVmFsdWUuZnJvbVF1ZXN0aW9uSWQgIT09IG51bGwgJiYgY2hhbmdlVmFsdWUuZnJvbVF1ZXN0aW9uSWQgIT09ICcnICYmICBhcGlPYmouc291cmNlUXVlc3Rpb25JZCAhPT0gdW5kZWZpbmVkICYmIGFwaU9iai5zb3VyY2VRdWVzdGlvbklkICE9PSBudWxsICYmIGFwaU9iai5zb3VyY2VRdWVzdGlvbklkICE9PSAnJyAmJiBjaGFuZ2VWYWx1ZS5mcm9tUXVlc3Rpb25JZCA9PSBhcGlPYmouc291cmNlUXVlc3Rpb25JZCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5tYXAoKG9iajogYW55KSA9PiAoeyAuLi5vYmosIGVkaXQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBjaGFuZ2VWYWx1ZS52YWx1ZU9iajtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbGlkSXRlbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZEIDEzTUFZMjQgLSBiaW5kIGR5bmFtaWMgZmllbGRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBWRCAyNkp1bjI0IC0gdG8gaGFuZGxlIG11bHRpcGxlIG9iamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iakVsZW1lbnRWYWx1ZSA9IHRoaXMuZGF0YVNlcnZpY2UuZ2V0VmFsdWUoZWxlbWVudCwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqSXRlbVZhbHVlID0gdGhpcy5kYXRhU2VydmljZS5nZXRWYWx1ZShpdGVtLCBmaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmpFbGVtZW50VmFsdWUgPT0gb2JqSXRlbVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSXRlbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vUlMgMTRGRUIyMDI1XG4gICAgICAgICAgICAgICAgICAgIC8vVXBkYXRlIFBhZ2luYXRpb24gYmVmb3JlIGVtaXRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gWy4uLnRoaXMuZGF0YSwgaXRlbV07XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbLi4udGhpcy5kYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IFsuLi50aGlzLmRhdGFdO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc0ZpbHRlckRhdGEgPSBbLi4udGhpcy5kYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uaW5wdXQgPSB0aGlzLm9yaWdpbmFsRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmVtaXRUYWJsZURhdGFWYWx1ZSh7ZGF0YTogdGhpcy5kYXRhLCBzdW1tYXJ5VmFsdWVzOiB0aGlzLnN1bW1hcnlWYWx1ZXN9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTS1MyME1BUjI1IE1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nT25DaGFuZ2VzKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZpY2UuY29uZmlybUNoYW5nZShhcGlPYmo/LnNvdXJjZVF1ZXN0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWFyY2hCYXIgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnNlYXJjaEJhciA9PT0gdHJ1ZSA/IHRoaXMuc2VhcmNoQmFyID0gdHJ1ZSA6IHRoaXMuc2VhcmNoQmFyID0gZmFsc2U7XG4gICAgdGhpcy53aXRoQ2hlY2tCb3ggPT09IHVuZGVmaW5lZCB8fCB0aGlzLndpdGhDaGVja0JveCA9PT0gZmFsc2UgPyB0aGlzLndpdGhDaGVja0JveCA9IGZhbHNlIDogdGhpcy53aXRoQ2hlY2tCb3ggPSB0cnVlO1xuICAgIHRoaXMuaXNFZGl0Um93ID09PSB1bmRlZmluZWQgfHwgdGhpcy5pc0VkaXRSb3cgPT09IGZhbHNlID8gdGhpcy5pc0VkaXRSb3cgPSBmYWxzZSA6IHRoaXMuaXNFZGl0Um93ID0gdHJ1ZTtcbiAgICB0aGlzLmlzRGVsZXRlUm93ID09PSB1bmRlZmluZWQgfHwgdGhpcy5pc0RlbGV0ZVJvdyA9PT0gZmFsc2UgPyB0aGlzLmlzRGVsZXRlUm93ID0gZmFsc2UgOiB0aGlzLmlzRGVsZXRlUm93ID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGlvbkJ1dHRvbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuYWN0aW9uQnV0dG9uID09PSBmYWxzZSA/IHRoaXMuYWN0aW9uQnV0dG9uID0gZmFsc2UgOiB0aGlzLmFjdGlvbkJ1dHRvbiA9IHRydWU7XG4gICAgdGhpcy5pc0J1dHRvbnMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmlzQnV0dG9ucyA9PT0gZmFsc2UgPyB0aGlzLmlzQnV0dG9ucyA9IGZhbHNlIDogdGhpcy5pc0J1dHRvbnMgPSB0cnVlO1xuICAgIHRoaXMuYWRkSW5saW5lUmVjb3JkID09PSB1bmRlZmluZWQgfHwgdGhpcy5hZGRJbmxpbmVSZWNvcmQgPT09IGZhbHNlID8gdGhpcy5hZGRJbmxpbmVSZWNvcmQgPSBmYWxzZSA6IHRoaXMuYWRkSW5saW5lUmVjb3JkID0gdHJ1ZTtcbiAgICB0aGlzLmlzUGFnaW5hdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuaXNQYWdpbmF0aW9uID09PSB0cnVlID8gdGhpcy5pc1BhZ2luYXRpb24gPSB0cnVlIDogdGhpcy5pc1BhZ2luYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmlzTm9zSW5kaWNhdG9yID09PSB1bmRlZmluZWQgfHwgdGhpcy5pc05vc0luZGljYXRvciA9PT0gdHJ1ZSA/IHRoaXMuaXNOb3NJbmRpY2F0b3IgPSB0cnVlIDogdGhpcy5pc05vc0luZGljYXRvciA9IGZhbHNlO1xuICAgIHRoaXMuaXNFZGl0YWJsZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuaXNFZGl0YWJsZSA9PT0gZmFsc2UgPyB0aGlzLmlzRWRpdGFibGUgPSBmYWxzZSA6IHRoaXMuaXNFZGl0YWJsZSA9IHRydWVcblxuICAgIHRoaXMuaW5saW5lRWxlbWVudCA9IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmN1cnJlbnRDb2x1bW5zLm1hcChrZXkgPT4gW2tleSwgXCJcIl0pKTtcblxuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnBhZ2luYXRpb24/LnBhZ2VTaXplID8gdGhpcy5wYWdpbmF0aW9uWydwYWdlU2l6ZSddIDogdGhpcy50YWJsZVBhcmFtcz8ucGFnaW5hdGlvbj8ucGFnZVNpemUgfHwxMDtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IHRoaXMucGFnaW5hdGlvbj8ucGFnZUluZGV4ID8gdGhpcy5wYWdpbmF0aW9uWydwYWdlSW5kZXgnXSA6IHRoaXMudGFibGVQYXJhbXM/LnBhZ2luYXRpb24/LnBhZ2VJbmRleCB8fDE7XG4gICAgdGhpcy50b3RhbFJlY29yZHMgPSB0aGlzLnBhZ2luYXRpb24/LnRvdGFsUmVjb3JkcyA/IHRoaXMucGFnaW5hdGlvblsndG90YWxSZWNvcmRzJ10gOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnMgPSB0aGlzLnBhZ2luYXRpb24/LnBhZ2VTaXplT3B0aW9ucyA/IHRoaXMucGFnaW5hdGlvblsncGFnZVNpemVPcHRpb25zJ10gOiBbJzUnLCAnMTAnLCAnMjUnLCAnNTAnLCAnMTAwJywgJzIwMCddO1xuICAgIHRoaXMuY29uZmlnUGFnaW5hdGlvbiA9ICEhKHRoaXMucGFnaW5hdGlvbiAmJiBPYmplY3Qua2V5cyh0aGlzLnBhZ2luYXRpb24pLmxlbmd0aCA+IDApO1xuXG4gICAgdGhpcy5kcm9wZG93bkFjdGlvbkJ1dHRvbiA9IHRoaXMuYWN0aW9uQnV0dG9uQXJyYXk/LmJ1dHRvbkFycmF5Py5zbGljZSh0aGlzLmFjdGlvbkJ1dHRvbkFycmF5Py5zaXplKTtcblxuICAgIHRoaXMub3JpZ2luYWxEYXRhID0gWy4uLnRoaXMuZGF0YV07XG4gICAgdGhpcy5zRmlsdGVyRGF0YSA9IFsuLi50aGlzLmRhdGFdO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5vcmlnaW5hbERhdGE7XG5cbiAgICAvLyBTS1MyME1BUjI1IENoZWNrIGlmIHRoZSBkaXNwbHljb2x1bW4ncyBoYXZlIGEgc3VtbWFyeSBjb2x1bW5cbiAgICBpZiAodGhpcy5zdW1tYXJ5Um93cyAmJiB0aGlzLnN1bW1hcnlSb3dzPy5sZW5ndGggPiAwICYmIHRoaXMuY3VycmVudENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pc0Z1bGxUYWJsZVN1bW1hcnlSb3cgPSB0aGlzLnN1bW1hcnlSb3dzWzBdLnR5cGUgPT09ICdmdWxsUm93JyB8fCAgdGhpcy5zdW1tYXJ5Um93c1swXS50eXBlID09PSAnZnVsbHJvdycgPyB0cnVlIDogZmFsc2U7XG4gICAgICB0aGlzLmlzU3VtbWFyeUNvbHVtbiA9IHRoaXMuY3VycmVudENvbHVtbnMuc29tZShlbGVtZW50ID0+IGVsZW1lbnQgPT09IHRoaXMuc3VtbWFyeVJvd3NbMF0uY29sdW1uKTtcbiAgICAgIGlmICh0aGlzLmlzU3VtbWFyeUNvbHVtbiAmJiAhdGhpcy5pc0Z1bGxUYWJsZVN1bW1hcnlSb3cpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRDb2x1bW5zLmluZGV4T2YodGhpcy5zdW1tYXJ5Um93c1swXS5jb2x1bW4pO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5pc1N1bW1hcnlTdGFydENvbHVtbiA9IHRoaXMuY3VycmVudENvbHVtbnMuc2xpY2UoMCwgaW5kZXggLSAxKTtcbiAgICAgICAgICB0aGlzLmlzU3VtbWFyeUVuZENvbHVtbiA9IHRoaXMuY3VycmVudENvbHVtbnMuc2xpY2UoaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmKHRoaXMuY3VycmVudFZpZXdGaWx0ZXIgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyID09PSBudWxsKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyID0gdGhpcy5saXN0Vmlld3MgJiYgdGhpcy5saXN0Vmlld3MubGVuZ3RoID4gMCA/IHRoaXMubGlzdFZpZXdzWzBdIDogbnVsbDtcbiAgICB9XG4gICAgaWYodGhpcy5jdXJyZW50Vmlld0ZpbHRlciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY3VycmVudFZpZXdGaWx0ZXIgIT09IG51bGwpe1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyLmZpbHRlck5hbWU7XG4gICAgICBpZih0aGlzLmN1cnJlbnRWaWV3RmlsdGVyLmlzRGVmYXVsdCB8fCB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyLmZpbHRlck5hbWUgPT09IFwiQWxsIERhdGFcIil7XG4gICAgICAgIHRoaXMuY3VycmVudENvbHVtbnMgPSB0aGlzLmNvbHVtbnNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyPy5jb2x1bW5zIHx8IFtdO1xuICAgICAgICBjb25zdCB1cGRhdGVDb2x1bW4gPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gY29sdW1uLmZpZWxkTmFtZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgIGlzSGlkZTogIW1hdGNoLFxuICAgICAgICAgICAgZmlsdGVyOiAhIW1hdGNoPy5maWx0ZXJhYmxlLFxuICAgICAgICAgICAgc29ydDogISFtYXRjaD8uc29ydGFibGVcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1ucyA9IFsuLi51cGRhdGVDb2x1bW5dXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXJDb2x1bW5zID0gdGhpcy5jdXJyZW50Q29sdW1ucz8uZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZmlsdGVyID09PSB0cnVlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5maWVsZE5hbWUpXG4gICAgaWYgKGN1cnJlbnRGaWx0ZXJDb2x1bW5zPy5sZW5ndGggPiAwICYmIHRoaXMuY29uZmlnUGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheSA9IHt9O1xuICAgICAgY29uc3QgZmlsdE9ianM6IGFueSA9IHt9O1xuICAgICAgY3VycmVudEZpbHRlckNvbHVtbnMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheVtlbGVtZW50XSA9IG51bGw7XG4gICAgICAgIGZpbHRPYmpzW2VsZW1lbnRdID0gW107XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICBjdXJyZW50RmlsdGVyQ29sdW1ucy5mb3JFYWNoKChrZXk6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRPYmpWYWx1ZShlbGVtZW50LCBrZXkpOyAgLy8gPC0gZ2V0IG5lc3RlZCB2YWx1ZVxuICAgIFxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmaWx0T2Jqc1trZXldLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbHRlckFycmF5W2tleV0gPSBuZXcgU2V0KGZpbHRPYmpzW2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheSA9IHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tdWx0aXBsZUZpbHRlckFycmF5ID0gdGhpcy5tdWx0aXBsZUZpbHRlcjtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbHRlcmVkIGFycmF5IHRoYXQgZXhjbHVkZXMgYW55IGNvbHVtbiB3aXRoICdbJ1xuICAgIGNvbnN0IHRlbXBGaWx0ZXJDb2x1bW5zID0gdGhpcy5jb2x1bW5zPy5maWx0ZXIoY29sID0+ICFjb2wuZmllbGROYW1lLmluY2x1ZGVzKCdbJykpO1xuICAgIFxuICAgIGlmICh0ZW1wRmlsdGVyQ29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsdE9ianM6IGFueSA9IHt9O1xuICAgIFxuICAgICAgLy8gU0tTMjZNQVkyNSBJbml0aWFsaXplIHNldHMgdG8gY29sbGVjdCB1bmlxdWUgdmFsdWVzIGZvciBlYWNoIGNvbHVtblxuICAgICAgdGVtcEZpbHRlckNvbHVtbnMuZm9yRWFjaCgoY29sOiBhbnkpID0+IHtcbiAgICAgICAgZmlsdE9ianNbY29sLmZpZWxkTmFtZV0gPSBuZXcgU2V0KCk7XG4gICAgICB9KTtcbiAgICBcbiAgICAgIC8vIFNLUzI2TUFZMjUgQ29sbGVjdCB1bmlxdWUgdmFsdWVzIGZyb20gdGFibGVGaWx0ZXJEYXRhXG4gICAgICB0aGlzLnRhYmxlRmlsdGVyRGF0YT8uZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgIHRlbXBGaWx0ZXJDb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE9ialZhbHVlKGVsZW1lbnQsIGNvbC5maWVsZE5hbWUpO1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmaWx0T2Jqc1tjb2wuZmllbGROYW1lXS5hZGQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICBcbiAgICAgIC8vIFNLUzI2TUFZMjUgQXBwZW5kIFwidmFsdWVcIiBwcm9wZXJ0eSB0byBlYWNoIGNvbHVtbiBvYmplY3Qgd2l0aCB0aGUgYXJyYXkgb2YgdW5pcXVlIHZhbHVlc1xuICAgICAgdGhpcy50YWJsZUZpbHRlckFycmF5ID0gWy4uLnRlbXBGaWx0ZXJDb2x1bW5zLm1hcCgoY29sOiBhbnkpID0+ICh7XG4gICAgICAgIC4uLmNvbCxcbiAgICAgICAgdmFsdWU6IEFycmF5LmZyb20oZmlsdE9ianNbY29sLmZpZWxkTmFtZV0pXG4gICAgICB9KSldXG4gICAgfSAgICAgICAgICBcbiAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICAgIH0sIDApXG4gICAgdGhpcy50b3RhbENvdW50ID0gdGhpcy50b3RhbFJlY29yZHMgfHwgdGhpcy5kYXRhPy5sZW5ndGhcbiAgICB0aGlzLmZpbHRlclRhYmxlTm9zID0gdGhpcy50b3RhbFJlY29yZHMgfHwgdGhpcy5kYXRhPy5sZW5ndGhcbiAgICBjb25zdCBOeHREYXRhVGFibGUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdOeHREYXRhVGFibGUnKSk7XG4gICAgdGhpcy5jdXJyZW50U29ydENvbHVtbiA9IE54dERhdGFUYWJsZT8uY3VycmVudFNvcnRDb2x1bW47XG4gICAgdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiA9IE54dERhdGFUYWJsZT8uY3VycmVudFNvcnREaXJlY3Rpb247XG4gICAgaWYgKE54dERhdGFUYWJsZT8uYWRkUmVjb3JkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnBhZ2VTaXplID0gTnh0RGF0YVRhYmxlPy5wYWdlU2l6ZVxuICAgICAgdGhpcy5wYWdlSW5kZXggPSBOeHREYXRhVGFibGU/LnBhZ2VJbmRleFxuICAgICAgdmFyIG9iajogYW55ID0ge307XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5pbmxpbmVFbGVtZW50KTtcbiAgICAgIGtleXMuZm9yRWFjaCgoZWxlbWVudEtleTogYW55KSA9PiB7XG4gICAgICAgIG9ialtlbGVtZW50S2V5XSA9ICcnO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmRhdGEucHVzaChvYmopO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0gdGhpcy5kYXRhO1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkYXRhO1xuXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QodGhpcy5kYXRhW3RoaXMuZGF0YS5sZW5ndGggLSAxXSk7XG4gICAgICB0aGlzLmRhdGFbdGhpcy5kYXRhLmxlbmd0aCAtIDFdLmVkaXRSb3cgPSB0cnVlO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ054dERhdGFUYWJsZScsIEpTT04uc3RyaW5naWZ5KHsgYWRkUmVjb3JkOiBmYWxzZSwgcGFnZVNpemU6IDEwLCBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LCBjdXJyZW50U29ydENvbHVtbjogdGhpcy5jdXJyZW50U29ydENvbHVtbiwgY3VycmVudFNvcnREaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gfSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGlja3lDb2x1bW4gPT09IHRydWUgJiYgdGhpcy5jdXJyZW50Q29sdW1ucykge1xuICAgICAgdGhpcy5zdGlja3lDb25kaXRpb24gPSB0aGlzLmN1cnJlbnRDb2x1bW5zPy5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RpY2t5Q29uZGl0aW9uID0gdGhpcy5jdXJyZW50Q29sdW1ucz8ubGVuZ3RoICsgMTtcbiAgICB9XG5cbiAgICAvLyBTS1MxOU1BUjI1IGFkZCBmaXJzdCBsaW5lIGZvciBmb3JtYnVpbGRlciB0YWJsZVxuICAgIGlmICh0aGlzLmlzRWRpdGFibGUgJiYgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgeyB0aGlzLmFkZFRhYmxlUmVjb3JkKCB0aGlzLmlubGluZUVsZW1lbnQsIFwib25Jbml0XCIpIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudGFibGVDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdGFibGVCb2R5ID0gdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YWJsZS1ib2R5Jyk7XG4gICAgICAgIGlmICh0YWJsZUJvZHkgJiYgdGhpcy5pc1BhZ2luYXRpb24pIHtcbiAgICAgICAgICB0aGlzLmlzU2hhZG93SGlkZGVuID0gISh0YWJsZUJvZHkuc2Nyb2xsSGVpZ2h0IDwgNDUwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMTUwMCk7IC8vIFdhaXRzIDEwMG1zIGZvciByZW5kZXJpbmdcbiAgICAvLyBTS1MxN0FQUjI1IHRhYmxlIHBhcmVtcyBkYXRhIHVwZGF0ZVxuICAgIGlmICh0aGlzLnNlYXJjaENvbmZpZ3M/LnNlYXJjaEZpbHRlclZhbCkge1xuICAgICAgdGhpcy5zZWFyY2hCb3hWYWx1ZSA9IHRoaXMuc2VhcmNoQ29uZmlncz8uc2VhcmNoRmlsdGVyVmFsOyAvLyBTaG93IHZhbHVlIGluIHRoZSBzZWFyY2ggYm94XG4gICAgICB0aGlzLnByZXZTZWFyY2ggPSB0aGlzLnNlYXJjaENvbmZpZ3M/LnNlYXJjaEZpbHRlclZhbDtcbiAgICB9IGVsc2UgaWYodGhpcy50YWJsZVBhcmFtcz8udGFibGVTZWFyY2gpe1xuICAgICAgdGhpcy5zZWFyY2hCb3hWYWx1ZSA9IHRoaXMudGFibGVQYXJhbXM/LnRhYmxlU2VhcmNoO1xuICAgIH1cbiAgICB0aGlzLnNlYXJjaENvbmZpZ3MgJiYgdGhpcy5zZWFyY2hCb3hWYWx1ZSA/IHRoaXMuZW1wdHlTZWFyY2godGhpcy5zZWFyY2hCb3hWYWx1ZSkgOiAnJ1xuICAgIHRoaXMuZmlsdGVyRGF0YUFycmF5ID0gdGhpcy50YWJsZVBhcmFtcz8uc2VhcmNoRmlsdGVyRGF0YSA/IHRoaXMudGFibGVQYXJhbXM/LnNlYXJjaEZpbHRlckRhdGEgOiB7fTtcbiAgICB0aGlzLnNvcnREYXRhKHRoaXMudGFibGVQYXJhbXM/LnNvcnQ/LmNvbHVtbiwgdGhpcy50YWJsZVBhcmFtcz8uc29ydD8uZGlyZWN0aW9uLHRydWUpXG4gICAgbGV0IGxhbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFuZ3VhZ2UnKVxuICAgIGlmICh0aGlzLmxhbmd1YWdlQ29kZSkge1xuICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2Uuc2V0TGFuZ3VhZ2UodGhpcy5sYW5ndWFnZUNvZGUpO1xuICAgIH0gZWxzZSBpZihsYW5nICYmIGxhbmcgIT09ICcnKSB7XG4gICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IGxhbmdcbiAgICB9XG4gICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRpb25zTG9hZGVkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7IC8vIEZvcmNlIHBpcGUgcmUtZXZhbHVhdGlvblxuICAgIH0pO1xuICAgIGlmICh0aGlzLmNvbmZpZ1BhZ2luYXRpb24gPT09IGZhbHNlICYmIHRoaXMuZGF0YSAmJiB0aGlzLmlzUGFnaW5hdGlvbikge1xuICAgICAgY29uc3QgcGFnZUluZGV4ID0gTnVtYmVyKHRoaXMucGFnZUluZGV4KSB8fCAwO1xuICAgICAgY29uc3QgcGFnZVNpemUgPSBOdW1iZXIodGhpcy5wYWdlU2l6ZSkgfHwgMTA7XG4gICAgICBjb25zdCBzdGFydCA9IChwYWdlSW5kZXggLSAxKSAqIHBhZ2VTaXplO1xuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBwYWdlU2l6ZTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5kYXRhPy5zbGljZShzdGFydCwgZW5kKSB8fCBbXTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzUGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLmRhdGFcbiAgICB9XG4gICAgdGhpcy5zdW1tYXJ5Um93cz8ubGVuZ3RoID4gMCA/IHRoaXMuY29tcHV0ZVN1bW1hcnlWYWx1ZXMoJ29uQ2hhbmdlJykgOicnOyAvLyBDb21wdXRlIHBlci1yb3cgc3VtbWFyeSBjb2x1bW5zIGZpcnN0XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtblJlc2l6ZXJzKCk7XG4gIH1cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29sdW1uUmVzaXplcnMoKSB7XG4gICAgLy8gU0tTMjJKVUwyNSBXYWl0IGZvciB0aGUgdmlldyB0byBiZSBmdWxseSByZW5kZXJlZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzaXplSGFuZGxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXNpemUtaGFuZGxlJyk7XG4gICAgICBcbiAgICAgIHJlc2l6ZUhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vblJlc2l6ZVN0YXJ0LmJpbmQodGhpcykpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNLUzIySlVMMjUgQWRkIGdsb2JhbCBtb3VzZSBldmVudHNcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25SZXNpemVNb3ZlLmJpbmQodGhpcykpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVFbmQuYmluZCh0aGlzKSk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIG9uUmVzaXplU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICBcbiAgICB0aGlzLmlzUmVzaXppbmcgPSB0cnVlO1xuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgXG4gICAgLy8gU0tTMjJKVUwyNSBGaW5kIHRoZSBjb2x1bW4gaGVhZGVyIHRoYXQgY29udGFpbnMgdGhpcyByZXNpemUgaGFuZGxlXG4gICAgY29uc3QgY29sdW1uSGVhZGVyID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnLnRhYmxlLWNlbGwnKTtcbiAgICBpZiAoY29sdW1uSGVhZGVyICYmIGNvbHVtbkhlYWRlciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIGNvbHVtbkhlYWRlci5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLnN0YXJ0V2lkdGggPSBjb2x1bW5IZWFkZXIub2Zmc2V0V2lkdGg7XG4gIFxuICAgICAgLy8gU0tTMjJKVUwyNSBGaW5kIHRoZSBjb2x1bW4gaW5kZXhcbiAgICAgIGNvbnN0IHNpYmxpbmdzID0gQXJyYXkuZnJvbShjb2x1bW5IZWFkZXIucGFyZW50Tm9kZS5jaGlsZHJlbik7XG4gICAgICBjb25zdCBjb2x1bW5JbmRleCA9IHNpYmxpbmdzLmluZGV4T2YoY29sdW1uSGVhZGVyKTtcbiAgICAgIGNvbnN0IGFkanVzdGVkSW5kZXggPSB0aGlzLndpdGhDaGVja0JveCA/IGNvbHVtbkluZGV4IC0gMSA6IGNvbHVtbkluZGV4O1xuICBcbiAgICAgIGlmIChhZGp1c3RlZEluZGV4ID49IDAgJiYgYWRqdXN0ZWRJbmRleCA8IHRoaXMuY3VycmVudENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudENvbHVtbiA9IHRoaXMuY3VycmVudENvbHVtbnNbYWRqdXN0ZWRJbmRleF07XG4gICAgICB9XG4gICAgfVxuICBcbiAgICAvLyBTS1MyMkpVTDI1IEFkZCBjdXJzb3Igc3R5bGUgdG8gYm9keVxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2NvbC1yZXNpemUnO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9ICdub25lJztcbiAgfVxuICBcblxuICBwcml2YXRlIG9uUmVzaXplTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5pc1Jlc2l6aW5nIHx8ICF0aGlzLmN1cnJlbnRDb2x1bW4pIHJldHVybjtcbiAgICBcbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5zdGFydFg7XG4gICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heCg1MCwgdGhpcy5zdGFydFdpZHRoICsgZGVsdGFYKTsgLy8gTWluaW11bSB3aWR0aCBvZiA1MHB4XG4gICAgXG4gICAgLy8gU0tTMjJKVUwyNSBVcGRhdGUgdGhlIGNvbHVtbiB3aWR0aFxuICAgIHRoaXMuY3VycmVudENvbHVtbi53aWR0aCA9IG5ld1dpZHRoICsgJ3B4JztcbiAgICBcbiAgICAvLyBTS1MyMkpVTDI1IEFwcGx5IHRoZSBuZXcgd2lkdGggdG8gYWxsIGNlbGxzIGluIHRoaXMgY29sdW1uXG4gICAgdGhpcy51cGRhdGVDb2x1bW5XaWR0aCh0aGlzLmN1cnJlbnRDb2x1bW4sIG5ld1dpZHRoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZXNpemVFbmQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNSZXNpemluZykgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMuaXNSZXNpemluZyA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudENvbHVtbiA9IG51bGw7XG4gICAgXG4gICAgLy8gU0tTMjJKVUwyNSBSZW1vdmUgY3Vyc29yIHN0eWxlIGZyb20gYm9keVxuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJyc7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbHVtbldpZHRoKGNvbHVtbjogYW55LCBuZXdXaWR0aDogbnVtYmVyKSB7XG4gICAgLy8gU0tTMjJKVUwyNSBVc2UgQW5ndWxhcidzIFJlbmRlcmVyMiBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uXG4gICAgY29uc3QgY29sdW1uSW5kZXggPSB0aGlzLmN1cnJlbnRDb2x1bW5zLmZpbmRJbmRleChjb2wgPT4gY29sLnVuaXF1ZUlkZW50aWZpZXIgPT09IGNvbHVtbi51bmlxdWVJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoY29sdW1uSW5kZXggPT09IC0xKSByZXR1cm47XG4gICAgXG4gICAgLy8gU0tTMjJKVUwyNSBBZGp1c3QgaW5kZXggaWYgY2hlY2tib3ggY29sdW1uIGV4aXN0c1xuICAgIGNvbnN0IGFkanVzdGVkSW5kZXggPSB0aGlzLndpdGhDaGVja0JveCA/IGNvbHVtbkluZGV4ICsgMSA6IGNvbHVtbkluZGV4O1xuICAgIFxuICAgIC8vIFVwZGF0ZSBoZWFkZXIgY2VsbFxuICAgIGNvbnN0IGhlYWRlckNlbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGFibGUtaGVhZGVyIC50YWJsZS1yb3cgLnRhYmxlLWNlbGw6bnRoLWNoaWxkKCR7YWRqdXN0ZWRJbmRleCArIDF9KWApO1xuICAgIGlmIChoZWFkZXJDZWxsKSB7XG4gICAgICAoaGVhZGVyQ2VsbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUud2lkdGggPSBuZXdXaWR0aCArICdweCc7XG4gICAgfVxuICAgIFxuICAgIC8vIFNLUzIySlVMMjUgVXBkYXRlIGFsbCBib2R5IGNlbGxzIGluIHRoaXMgY29sdW1uXG4gICAgY29uc3QgYm9keUNlbGxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLnRhYmxlLWJvZHkgLnRhYmxlLXJvdyAudGFibGUtY2VsbDpudGgtY2hpbGQoJHthZGp1c3RlZEluZGV4ICsgMX0pYCk7XG4gICAgYm9keUNlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICAoY2VsbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUud2lkdGggPSBuZXdXaWR0aCArICdweCc7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBTS1MyMkpVTDI1IENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25SZXNpemVNb3ZlLmJpbmQodGhpcykpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uUmVzaXplRW5kLmJpbmQodGhpcykpO1xuICB9XG4gIHByaXZhdGUgZmxhdHRlblJvdyhyb3c6IGFueSk6IGFueSB7XG4gICAgY29uc3QgZmxhdHRlbmVkID0gdGhpcy5jdXJyZW50Q29sdW1ucy5yZWR1Y2UoKGFjYywgY29sKSA9PiB7XG4gICAgICBhY2NbY29sLmZpZWxkTmFtZV0gPSB0aGlzLmdldE9ialZhbHVlKHJvdywgY29sLmZpZWxkTmFtZSkgPz8gJy0nOyAvLyBEZWZhdWx0IHRvICctJyBpZiBudWxsL3VuZGVmaW5lZFxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9KTtcbiAgICByZXR1cm4geyAuLi5yb3csIGZsYXR0ZW5lZCB9O1xuICB9XG4gIC8vIFNLUzIwTUFSMjUgc3VtbWFyeSBjb2x1bW5zIGNhbGNcbiAgY29tcHV0ZVN1bW1hcnlDb2x1bW5zKCkge1xuICAgIGlmICh0aGlzLnN1bW1hcnlDb2x1bW5zICYmIHRoaXMuc3VtbWFyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLm1hcChyb3cgPT4ge1xuICAgICAgICBjb25zdCBuZXdSb3cgPSB7IC4uLnJvdyB9O1xuICAgICAgICB0aGlzLnN1bW1hcnlDb2x1bW5zLmZvckVhY2goc3VtbWFyeUNvbCA9PiB7XG4gICAgICAgICAgaWYgKHN1bW1hcnlDb2wudHlwZSA9PT0gJ2NhbGN1bGF0aW9uJyAmJiBzdW1tYXJ5Q29sLm9wZXJhdGlvbiA9PT0gJ3N1bScgJiYgc3VtbWFyeUNvbC5vcGVyYW5kcykge1xuICAgICAgICAgICAgY29uc3Qgc3VtID0gc3VtbWFyeUNvbC5vcGVyYW5kcy5yZWR1Y2UoKGFjYywgb3BlcmFuZCkgPT4gYWNjICsgKE51bWJlcihuZXdSb3dbb3BlcmFuZF0pIHx8IDApLCAwKTtcbiAgICAgICAgICAgIG5ld1Jvd1tzdW1tYXJ5Q29sLmZpZWxkTmFtZV0gPSBzdW07XG4gICAgICAgICAgfSBlbHNlIGlmIChzdW1tYXJ5Q29sLnR5cGUgPT09ICdjYWxjdWxhdGlvbicgJiYgc3VtbWFyeUNvbC5vcGVyYXRpb24gPT09ICdzdWJ0cmFjdCcgJiYgc3VtbWFyeUNvbC5vcGVyYW5kcykge1xuICAgICAgICAgICAgY29uc3QgW2ZpcnN0T3BlcmFuZCwgLi4ucmVzdE9wZXJhbmRzXSA9IHN1bW1hcnlDb2wub3BlcmFuZHM7XG4gICAgICAgICAgICBsZXQgc3VtID0gTnVtYmVyKG5ld1Jvd1tmaXJzdE9wZXJhbmRdKSB8fCAwOyAvLyBTdGFydCB3aXRoIHRoZSBmaXJzdCBvcGVyYW5kXG4gICAgICAgICAgICBzdW0gPSByZXN0T3BlcmFuZHMucmVkdWNlKChhY2MsIG9wZXJhbmQpID0+IGFjYyAtIChOdW1iZXIobmV3Um93W29wZXJhbmRdKSB8fCAwKSwgc3VtKTtcbiAgICAgICAgICAgIG5ld1Jvd1tzdW1tYXJ5Q29sLmZpZWxkTmFtZV0gPSBzdW07XG4gICAgICAgICAgfSBlbHNlIGlmIChzdW1tYXJ5Q29sLnR5cGUgPT09ICdjYWxjdWxhdGlvbicgJiYgc3VtbWFyeUNvbC5vcGVyYXRpb24gPT09ICdtdWx0aXBseScgJiYgc3VtbWFyeUNvbC5vcGVyYW5kcykge1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjdCA9IHN1bW1hcnlDb2wub3BlcmFuZHMucmVkdWNlKChhY2MsIG9wZXJhbmQpID0+IGFjYyAqIChOdW1iZXIobmV3Um93W29wZXJhbmRdKSB8fCAwKSwgMSk7IC8vIFN0YXJ0IHdpdGggMVxuICAgICAgICAgICAgbmV3Um93W3N1bW1hcnlDb2wuZmllbGROYW1lXSA9IHByb2R1Y3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld1JvdztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLmRhdGE7IC8vIFVwZGF0ZSBkYXRhU291cmNlXG4gICAgICBpZiAoIXRoaXMudG90YWxSZWNvcmRzICYmIHRoaXMuZGF0YSAmJiB0aGlzLmlzUGFnaW5hdGlvbikge1xuICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBOdW1iZXIodGhpcy5wYWdlSW5kZXgpIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhZ2VTaXplID0gTnVtYmVyKHRoaXMucGFnZVNpemUpIHx8IDEwO1xuICAgICAgICBjb25zdCBzdGFydCA9IChwYWdlSW5kZXggLSAxKSAqIHBhZ2VTaXplO1xuICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIHBhZ2VTaXplO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YT8uc2xpY2Uoc3RhcnQsIGVuZCkgfHwgW107XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzUGFnaW5hdGlvbikge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBTS1MyME1BUjI1IENvbXB1dGUgdmFsdWVzIGZvciBzdW1tYXJ5IHJvd3NcbiAgY29tcHV0ZVN1bW1hcnlWYWx1ZXMoZnJvbT8pIHtcbiAgICB0aGlzLnN1bW1hcnlSb3dzPy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICBpZiAocm93LnR5cGUgPT09ICdjYWxjdWxhdGlvbicpIHtcbiAgICAgICAgaWYgKHJvdy5vcGVyYXRpb24gPT09ICdzdW0nICYmIHJvdy5jb2x1bW4pIHtcbiAgICAgICAgICAvLyBDb3JyZWN0IHN1bSBvcGVyYXRpb25cbiAgICAgICAgICB0aGlzLnN1bW1hcnlWYWx1ZXNbcm93LmZpZWxkTmFtZV0gPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjLCBkYXRhUm93KSA9PiBhY2MgKyAoTnVtYmVyKGRhdGFSb3dbcm93LmNvbHVtbl0pIHx8IDApLFxuICAgICAgICAgICAgMFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAocm93Lm9wZXJhdGlvbiA9PT0gJ3N1YnRyYWN0JyAmJiByb3cuY29sdW1uKSB7XG4gICAgICAgICAgLy8gU3VidHJhY3Qgc2hvdWxkIHN0YXJ0IHdpdGggdGhlIGZpcnN0IHZhbHVlXG4gICAgICAgICAgdGhpcy5zdW1tYXJ5VmFsdWVzW3Jvdy5maWVsZE5hbWVdID0gdGhpcy5kYXRhU291cmNlLmRhdGEucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgZGF0YVJvdywgaW5kZXgpID0+IGluZGV4ID09PSAwID8gTnVtYmVyKGRhdGFSb3dbcm93LmNvbHVtbl0pIHx8IDAgOiBhY2MgLSAoTnVtYmVyKGRhdGFSb3dbcm93LmNvbHVtbl0pIHx8IDApLFxuICAgICAgICAgICAgMFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAocm93Lm9wZXJhdGlvbiA9PT0gJ211bHRpcGx5JyAmJiByb3cuY29sdW1uKSB7XG4gICAgICAgICAgLy8gTXVsdGlwbHkgc2hvdWxkIHN0YXJ0IHdpdGggMVxuICAgICAgICAgIHRoaXMuc3VtbWFyeVZhbHVlc1tyb3cuZmllbGROYW1lXSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGRhdGFSb3cpID0+IGFjYyAqIChOdW1iZXIoZGF0YVJvd1tyb3cuY29sdW1uXSkgfHwgMCksIC8vIFVzZSAxIGluc3RlYWQgb2YgMFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAocm93Lm9wZXJhdGlvbiA9PT0gJ3N1YnRyYWN0JyAmJiByb3cub3BlcmFuZHMpIHtcbiAgICAgICAgICAvLyBTdWJ0cmFjdCBiYXNlZCBvbiBvcGVyYW5kc1xuICAgICAgICAgIGNvbnN0IFtvcDEsIG9wMl0gPSByb3cub3BlcmFuZHM7XG4gICAgICAgICAgdGhpcy5zdW1tYXJ5VmFsdWVzW3Jvdy5maWVsZE5hbWVdID0gKHRoaXMuc3VtbWFyeVZhbHVlc1tvcDFdIHx8IDApIC0gKHRoaXMuc3VtbWFyeVZhbHVlc1tvcDJdIHx8IDApO1xuICAgICAgICB9IGVsc2UgaWYgKHJvdy5vcGVyYXRpb24gPT09ICdzdW0nICYmIHJvdy5vcGVyYW5kcykge1xuICAgICAgICAgIC8vIFN1bSBiYXNlZCBvbiBvcGVyYW5kc1xuICAgICAgICAgIGNvbnN0IFtvcDEsIG9wMl0gPSByb3cub3BlcmFuZHM7XG4gICAgICAgICAgdGhpcy5zdW1tYXJ5VmFsdWVzW3Jvdy5maWVsZE5hbWVdID0gKHRoaXMuc3VtbWFyeVZhbHVlc1tvcDFdIHx8IDApICsgKHRoaXMuc3VtbWFyeVZhbHVlc1tvcDJdIHx8IDApO1xuICAgICAgICB9IGVsc2UgaWYgKHJvdy5vcGVyYXRpb24gPT09ICdtdWx0aXBseScgJiYgcm93Lm9wZXJhbmRzKSB7XG4gICAgICAgICAgLy8gTXVsdGlwbHkgYmFzZWQgb24gb3BlcmFuZHNcbiAgICAgICAgICBjb25zdCBbb3AxLCBvcDJdID0gcm93Lm9wZXJhbmRzO1xuICAgICAgICAgIHRoaXMuc3VtbWFyeVZhbHVlc1tyb3cuZmllbGROYW1lXSA9ICh0aGlzLnN1bW1hcnlWYWx1ZXNbb3AxXSB8fCAwKSAqICh0aGlzLnN1bW1hcnlWYWx1ZXNbb3AyXSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU0tTMTNKVU4yNSBTdW0gdGhlIHZhbHVlcyBieSBkZWZhdWx0LlxuICAgICAgaWYocm93LnR5cGUgPT09ICdmdWxsUm93JyB8fCByb3cudHlwZSA9PT0gJ2Z1bGxyb3cnKXtcbiAgICAgICAgcm93Py5jb2x1bW5zPy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIHRoaXMuc3VtbWFyeVZhbHVlc1tlbGVtZW50XSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGRhdGFSb3cpID0+IGFjYyArIChOdW1iZXIoZGF0YVJvd1tlbGVtZW50XSkgfHwgMCksXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGZyb20gIT09ICdvbkNoYW5nZScgJiYgZnJvbSAhPT0gJ29uSW5pdCcgJiYgdGhpcy5mcm9tID09PSAnZm9ybUJ1aWxkZXInKSB7XG4gICAgICBpZih0aGlzLmZyb20gPT09ICdmb3JtQnVpbGRlcicpICB0aGlzLm9yaWdpbmFsRGF0YSA9IHRoaXMuZGF0YSAvL1NLUzdKVU4yNSBPbmx5IGFzc2lnbiBkYXRhIHRvIG9yaWdpbmFsRGF0YSBpZiBmcm9tIGZvcm1CdWlsZGVyXG4gICAgICB0aGlzLmVtaXRUYWJsZURhdGFWYWx1ZSh7ZGF0YTogdGhpcy5vcmlnaW5hbERhdGEsIHN1bW1hcnlWYWx1ZXM6IHRoaXMuc3VtbWFyeVZhbHVlc30pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzIwTUFSMjUgSGFuZGxlIG1hbnVhbCBpbnB1dCBjaGFuZ2VzIGluIHN1bW1hcnkgcm93cyBcbiAgb25TdW1tYXJ5SW5wdXRDaGFuZ2UoKSB7XG4gICAgdGhpcy5jb21wdXRlU3VtbWFyeVZhbHVlcygpO1xuICB9XG4gIC8vIFNLUzE1RkVCMjUgQ3VzdG9tIHNvcnQgZnVuY3Rpb25cbiAgc29ydERhdGEoY29sdW1uOiBzdHJpbmcsIHNvcnRpbmdTdGF0ZT86IGFueSB8IHVuZGVmaW5lZCwgY3VycmVudFN0YXRlPzphbnkgfHVuZGVmaW5lZCwgZnJvbT86YW55KSB7XG4gICAgLy8gRGVmaW5lIHNvcnRpbmcgc3RhdGVzXG4gICAgY29uc3Qgc29ydGluZ1N0YXRlcyA9IFsnYXNjJywgJ2Rlc2MnLCAnbm9uZSddO1xuICAgIGlmICh0aGlzLmNvbmZpZ1BhZ2luYXRpb24gPT09IGZhbHNlIHx8IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA9PT0gdGhpcy50b3RhbFJlY29yZHMpIHtcbiAgICAgIC8vIERldGVybWluZSB0aGUgY3VycmVudCBzb3J0aW5nIHN0YXRlXG4gICAgICBpZiAodGhpcy5jdXJyZW50U29ydENvbHVtbiA9PT0gY29sdW1uICYmICFzb3J0aW5nU3RhdGUpIHtcbiAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzb3J0aW5nIHN0YXRlXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHNvcnRpbmdTdGF0ZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiA9IHNvcnRpbmdTdGF0ZXNbKGN1cnJlbnRJbmRleCArIDEpICUgc29ydGluZ1N0YXRlcy5sZW5ndGhdIGFzIFwiYXNjXCIgfCBcImRlc2NcIiB8IFwibm9uZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgYSBuZXcgY29sdW1uIGlzIHNlbGVjdGVkLCBzdGFydCB3aXRoIGFzY2VuZGluZyBzb3J0XG4gICAgICAgIHRoaXMuY3VycmVudFNvcnRDb2x1bW4gPSBjb2x1bW47XG4gICAgICAgIHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gPSBzb3J0aW5nU3RhdGUgfHwgJ2FzYyc7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5maWx0ZXJCb3hEYXRhICYmIHRoaXMuZmlsdGVyQm94RGF0YS5sZW5ndGggPiAwID8gdGhpcy5maWx0ZXJCb3hEYXRhIDogdGhpcy5kYXRhU291cmNlLmRhdGE7XG4gICAgICAvLyBPbmx5IHNvcnQgaWYgdGhlIGRpcmVjdGlvbiBpcyAnYXNjJyBvciAnZGVzYydcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uID09PSAnYXNjJyB8fCB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uID09PSAnZGVzYycpIHtcbiAgICAgICAgZGF0YS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgbGV0IHZhbHVlQSA9IHRoaXMuZ2V0T2JqVmFsdWUoYSwgY29sdW1uKTtcbiAgICAgICAgICBsZXQgdmFsdWVCID0gdGhpcy5nZXRPYmpWYWx1ZShiLCBjb2x1bW4pO1xuICAgICAgICAgIC8vIEhhbmRsZSB1bmRlZmluZWQgb3IgbnVsbCB2YWx1ZXNcbiAgICAgICAgICBpZiAodmFsdWVBID09IG51bGwgJiYgdmFsdWVCID09IG51bGwpIHJldHVybiAwOyAvLyBCb3RoIGFyZSBudWxsL3VuZGVmaW5lZFxuICAgICAgICAgIGlmICh2YWx1ZUEgPT0gbnVsbCkgcmV0dXJuIHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xOyAvLyB2YWx1ZUEgaXMgbnVsbFxuICAgICAgICAgIGlmICh2YWx1ZUIgPT0gbnVsbCkgcmV0dXJuIHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gLTEgOiAxOyAvLyB2YWx1ZUIgaXMgbnVsbFxuICAgICAgICAgIC8vIEhhbmRsZSBkYXRlIHNvcnRpbmdcbiAgICAgICAgICBpZiAodGhpcy5jb2x1bW5zPy5zb21lKGNvbCA9PiBjb2wuZmllbGROYW1lID09PSBjb2x1bW4gJiYgY29sLnR5cGUgPT09ICdkYXRlJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVBID0gbmV3IERhdGUodmFsdWVBKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVCID0gbmV3IERhdGUodmFsdWVCKTtcbiAgICAgICAgICAgIHZhbHVlQSA9IGRhdGVBLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHZhbHVlQiA9IGRhdGVCLmdldFRpbWUoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZUEgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YWx1ZUIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgbnVtYmVyIHNvcnRpbmdcbiAgICAgICAgICAgIHZhbHVlQSA9IE51bWJlcih2YWx1ZUEpO1xuICAgICAgICAgICAgdmFsdWVCID0gTnVtYmVyKHZhbHVlQik7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWVBID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWVCID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIHN0cmluZyBjb21wYXJpc29uXG4gICAgICAgICAgICB2YWx1ZUEgPSB2YWx1ZUEudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHZhbHVlQiA9IHZhbHVlQi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDb21wYXJlIHZhbHVlc1xuICAgICAgICAgIGlmICh2YWx1ZUEgPCB2YWx1ZUIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IC0xIDogMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlQSA+IHZhbHVlQikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB2YWx1ZXMgYXJlIHRoZSBzYW1lLCByZXR1cm4gMCB0byBtYWludGFpbiBvcmlnaW5hbCBvcmRlclxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbLi4uZGF0YV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBOdW1iZXIodGhpcy5wYWdlSW5kZXgpIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhZ2VTaXplID0gTnVtYmVyKHRoaXMucGFnZVNpemUpIHx8IDEwO1xuICAgICAgICBjb25zdCBzdGFydCA9IChwYWdlSW5kZXggLSAxKSAqIHBhZ2VTaXplO1xuICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIHBhZ2VTaXplO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZmlsdGVyQm94RGF0YSA/IHRoaXMuZmlsdGVyQm94RGF0YT8uc2xpY2Uoc3RhcnQsIGVuZCkgfHwgW10gOiB0aGlzLmRhdGE/LnNsaWNlKHN0YXJ0LCBlbmQpIHx8IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc29ydGluZyBzdGF0ZVxuICAgICAgaWYgKHRoaXMuY3VycmVudFNvcnRDb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHNvcnRpbmcgc3RhdGVcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc29ydGluZ1N0YXRlcy5pbmRleE9mKHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uID0gc29ydGluZ1N0YXRlc1soY3VycmVudEluZGV4ICsgMSkgJSBzb3J0aW5nU3RhdGVzLmxlbmd0aF0gYXMgXCJhc2NcIiB8IFwiZGVzY1wiIHwgXCJub25lXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBhIG5ldyBjb2x1bW4gaXMgc2VsZWN0ZWQsIHN0YXJ0IHdpdGggYXNjZW5kaW5nIHNvcnRcbiAgICAgICAgdGhpcy5jdXJyZW50U29ydENvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgICAgfVxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ054dERhdGFUYWJsZScsIEpTT04uc3RyaW5naWZ5KHsgYWRkUmVjb3JkOiBmYWxzZSwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsIGN1cnJlbnRTb3J0Q29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBjdXJyZW50U29ydERpcmVjdGlvbjogdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiB9KSk7XG4gICAgICAvLyBPbmx5IHNvcnQgaWYgdGhlIGRpcmVjdGlvbiBpcyAnYXNjJyBvciAnZGVzYydcbiAgICAgIGlmKGN1cnJlbnRTdGF0ZSAhPT0gdHJ1ZSAmJiBmcm9tICE9PSAnb25DaGFuZ2UnKXRoaXMuTnh0VGFibGVFbWl0LmVtaXQoeyBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLCBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4IH0sIHRhYmxlU2VhcmNoOiB7IGZpZWxkczogdGhpcy5jdXJyZW50Q29sdW1ucywgdmFsdWU6IHRoaXMuc2VhcmNoQm94VmFsdWUgfSwgc2VhcmNoRmlsdGVyRGF0YTogdGhpcy5maWx0ZXJEYXRhQXJyYXksIHNvcnQ6IHsgY29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBkaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24sbGlzdFZpZXc6IHRoaXMuc2VsZWN0ZWRWaWV3fSB9KVxuICAgIH1cbiAgICBpZihmcm9tICE9PSAnb25DaGFuZ2UnKXRoaXMuTnh0VGFibGVQYXJhbXNFbWl0LmVtaXQoeyBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLCBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4IH0sdGFibGVTZWFyY2g6IHRoaXMuc2VhcmNoQm94VmFsdWUsIHNlYXJjaEZpbHRlckRhdGE6IHRoaXMuZmlsdGVyRGF0YUFycmF5LCBzb3J0OiB7IGNvbHVtbjogdGhpcy5jdXJyZW50U29ydENvbHVtbiwgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uICxsaXN0VmlldzogdGhpcy5zZWxlY3RlZFZpZXd9fSlcbiAgICBpZihmcm9tID09PSAnb25DaGFuZ2UnKSB0aGlzLnBhZ2VQYXJhbXModGhpcy50YWJsZVBhcmFtcz8ucGFnaW5hdGlvbiwnb25DaGFuZ2UnKVxuICAgIHRoaXMub25TdW1tYXJ5SW5wdXRDaGFuZ2UoKVxuICB9XG5cbiAgb25TY3JvbGwodGFibGVDb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5pc1Njcm9sbGVkID0gdGFibGVDb250YWluZXIuc2Nyb2xsVG9wID4gMDtcbiAgICBjb25zdCB0YWJsZUJvZHlIZWlnaHQgPSB0YWJsZUNvbnRhaW5lci5zY3JvbGxIZWlnaHQ7XG4gICAgY29uc3QgaXNBdEJvdHRvbSA9IHRhYmxlQm9keUhlaWdodCAtIHRhYmxlQ29udGFpbmVyLnNjcm9sbFRvcCA8PSB0YWJsZUNvbnRhaW5lci5jbGllbnRIZWlnaHQgKyAxO1xuICAgIC8vU0tTMTVGRUIyNSBFbnN1cmUgc2hhZG93IGlzIGhpZGRlbiBvbmx5IGlmIHRhYmxlIGJvZHkgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiA0MDBweFxuICAgIGlmICh0aGlzLmlzUGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5pc1NoYWRvd0hpZGRlbiA9ICEoaXNBdEJvdHRvbSB8fCB0YWJsZUJvZHlIZWlnaHQgPCA0NTApO1xuICAgIH1cbiAgfVxuXG4gIC8vU0tTMTVGRUIyNSBsb3NpbmcgdGhlIGZpbHRlciBjb21wb25lbnQgd2hlbiB0aGUgbW91c2UgaXMgY2xpY2tlZCBvdXRzaWRlIHRhYmxlXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSkgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnNlYXJjaEZpbHRlciA9IGZhbHNlO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBwcmV2ZW50cyBhbnkgb3RoZXIgZGVmYXVsdCBhY3Rpb25cbiAgfVxuXG4gIC8vU0tTMTVGRUIyNSBmaWx0ZXIgZGF0YSB0aGF0IHRvIGJlIGRpc3BsYXllZCBpbiBoZWFkZXIgZmlsdGVyIGljb24gaXMgcGFzc2VkIGluICdmaWx0ZXJBcnJheScgYXJyYXlcbiAgZmlsdGVyKGRhdGFzOiBhbnkpIHtcbiAgICB0aGlzLmZpbHRlckFycmF5ID0gW107XG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlciA9IGRhdGFzO1xuICAgIHRoaXMuZmlsdGVyQXJyYXkgPSBbLi4udGhpcy5tdWx0aXBsZUZpbHRlckFycmF5Py5bZGF0YXNdXTtcbiAgICB0aGlzLnNlYXJjaEZpbHRlciA9ICF0aGlzLnNlYXJjaEZpbHRlcjtcbiAgICB0aGlzLmlzUmVzaXplZCA9IHRoaXMuZmlsdGVyRGF0YUFycmF5W3RoaXMuc2VsZWN0ZWRGaWx0ZXJdPy5sZW5ndGggPiAwXG4gIH1cblxuICAvLyBTS1MxNUZFQjI1ICBlbWl0dGluZyBwYWdyIHNpemUgYW5kIGluZGV4IHRvIHBhcmVudCBvbiBwYWdpbmF0aW5nXG4gIHBhZ2VQYXJhbXMoZXZlbnQ6IGFueSwgZnJvbT86YW55KSB7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBldmVudD8ucGFnZUluZGV4IHx8IHRoaXMucGFnZUluZGV4XG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50Py5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VTaXplXG4gICAgdGhpcy5maWx0ZXJUYWJsZU5vcyA9IHRoaXMuZmlsdGVyQm94RGF0YT8ubGVuZ3RoXG4gICAgaWYodGhpcy5mcm9tID09PSAnZm9ybUJ1aWxkZXInKSB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZmlsdGVyQm94RGF0YSA9IHRoaXMuZGF0YVxuICAgIGlmICh0aGlzLmNvbmZpZ1BhZ2luYXRpb24gPT09IGZhbHNlIHx8IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA9PT0gdGhpcy50b3RhbFJlY29yZHMpIHtcbiAgICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5hcHBseUZpbHRlcih0aGlzLnNlYXJjaEJveFZhbHVlICwgJ3BhZ2VQYXJhbXMnKVxuICAgICAgY29uc3Qgc3RhcnQgPSAoTnVtYmVyKHRoaXMucGFnZUluZGV4KSAtIDEpICogTnVtYmVyKHRoaXMucGFnZVNpemUpO1xuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBOdW1iZXIodGhpcy5wYWdlU2l6ZSk7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZmlsdGVyQm94RGF0YT8uc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICB0aGlzLm9uU3VtbWFyeUlucHV0Q2hhbmdlKClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZnJvbSAhPT0gJ29uQ2hhbmdlJyl0aGlzLk54dFRhYmxlRW1pdC5lbWl0KHsgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSwgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCB9LCB0YWJsZVNlYXJjaDogeyBmaWVsZHM6IHRoaXMuY3VycmVudENvbHVtbnMsIHZhbHVlOiB0aGlzLnNlYXJjaEJveFZhbHVlIH0sIHNlYXJjaEZpbHRlckRhdGE6IHRoaXMuZmlsdGVyRGF0YUFycmF5LCBzb3J0OiB7IGNvbHVtbjogdGhpcy5jdXJyZW50U29ydENvbHVtbiwgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uICxsaXN0VmlldzogdGhpcy5zZWxlY3RlZFZpZXd9IH0pXG4gICAgfVxuICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5OeHRUYWJsZVBhcmFtc0VtaXQuZW1pdCh7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXggfSx0YWJsZVNlYXJjaDogdGhpcy5zZWFyY2hCb3hWYWx1ZSwgc2VhcmNoRmlsdGVyRGF0YTogdGhpcy5maWx0ZXJEYXRhQXJyYXksIHNvcnQ6IHsgY29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBkaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gLGxpc3RWaWV3OiB0aGlzLnNlbGVjdGVkVmlld319KVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSBhcHBseSBzZWFyY2ggYmFyIGZpbHRlciB1c2luZyBtYXRcbiAgYXBwbHlGaWx0ZXIoZXZlbnQ6IGFueSwgZnJvbT86IGFueSkge1xuICAgIGxldCBmaWx0ZXJWYWx1ZSA9IGV2ZW50O1xuICAgIGZpbHRlclZhbHVlID8gZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSA6IGZpbHRlclZhbHVlID0gJyc7XG4gICAgdGhpcy5zZWFyY2hCb3hWYWx1ZSA9IGZpbHRlclZhbHVlXG4gICAgaWYgKCFmaWx0ZXJWYWx1ZSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLm9yaWdpbmFsRGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhLmZpbHRlcihpdGVtID0+XG4gICAgICAgIHRoaXMuY3VycmVudENvbHVtbnMuc29tZShjb2x1bW4gPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRPYmpWYWx1ZShpdGVtLGNvbHVtbi5maWVsZE5hbWUpPy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKGZpbHRlclZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmKGZyb20gIT09ICdwYWdlUGFyYW1zJyAmJiBmcm9tICE9PSAnb25DaGFuZ2UnKSB0aGlzLnBhZ2VJbmRleCA9IDFcbiAgICB0aGlzLnNGaWx0ZXJEYXRhID0gdGhpcy5kYXRhU291cmNlLmRhdGFcbiAgICB0aGlzLmZpbHRlclRhYmxlTm9zID0gdGhpcy5zRmlsdGVyRGF0YT8ubGVuZ3RoXG4gICAgdGhpcy50b3RhbENvdW50ID0gdGhpcy5kYXRhLmxlbmd0aFxuICAgIGNvbnN0IHN0YXJ0ID0gKE51bWJlcih0aGlzLnBhZ2VJbmRleCkgLSAxKSAqIE51bWJlcih0aGlzLnBhZ2VTaXplKTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIE51bWJlcih0aGlzLnBhZ2VTaXplKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhPy5zbGljZShzdGFydCwgZW5kKTtcbiAgICB0aGlzLmZpbHRlclJldGFpbihmcm9tID09PSAnb25DaGFuZ2UnID8gdGhpcy50YWJsZVBhcmFtcz8uc2VhcmNoRmlsdGVyRGF0YSB8fCB0aGlzLmZpbHRlckRhdGFBcnJheSA6IHRoaXMuZmlsdGVyRGF0YUFycmF5LGZyb20gKVxuICB9XG5cbiAgLyoqIFNLUzE1RkVCMjUgV2hldGhlciB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVsZW1lbnRzIG1hdGNoZXMgdGhlIHRvdGFsIG51bWJlciBvZiByb3dzLiAqL1xuICBpc0FsbFNlbGVjdGVkKCkge1xuICAgIC8vIGNoZWNrIGlmIGFsbCByb3dzIGFyZSBzZWxlY3RlZFxuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xuICB9XG5cbiAgLyoqIFNLUzE1RkVCMjUgU2VsZWN0cyBhbGwgcm93cyBpZiB0aGV5IGFyZSBub3QgYWxsIHNlbGVjdGVkOyBvdGhlcndpc2UgY2xlYXIgc2VsZWN0aW9uLiAqL1xuICBtYXN0ZXJUb2dnbGUoKSB7XG4gICAgLy8gaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gdGhlbiBjbGVhciB0aGF0IHNlbGVjdGlvblxuICAgIC8vIGVtaXQgdGhlIHNlbGVjdGVkIHZhbHVlIG9ubHkgdG8gcGFyZW50XG4gICAgaWYgKHRoaXMuaXNTb21lU2VsZWN0ZWQoKSkge1xuICAgICAgLy8gICB0byByZW1vdmUgdGhlIGVkaXRSb3csIGlmIHRoZSBjaGVja2JveCBpcyB1bmNoZWNrZWRcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudD8uZWRpdFJvdykgZWxlbWVudC5lZGl0Um93ID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLmVtaXQodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIGVpdGhlciBzZWxlY3QgYWxsIGl0ZW1zIG9yIGNsZWFyIHRoZSBzZWxlY3Rpb25cbiAgICAgIC8vIGVtaXQgdGhlIHNlbGVjdGVkIHZhbHVlcyB0byBwYXJlbnRcbiAgICAgIHRoaXMuaXNBbGxTZWxlY3RlZCgpID8gdGhpcy5zZWxlY3Rpb24uY2xlYXIoKSA6IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZvckVhY2goKHJvdzogYW55KSA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLmVtaXQodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgQ2hlY2tzIHdoZXRoZXIgYW55IGl0ZW1zIGFyZSBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIHRhYmxlLlxuICBpc1NvbWVTZWxlY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgZW1pdCB0aGUgY2hlY2sgYm94IHZhbHVlcywgdGhhdCBzZWxlY3RlZCBzZXBhcmF0ZWx5XG4gIHNlcGFyYXRlUm93U2VsZWN0KGRhdGE6IGFueSwgZWxlbWVudDogYW55KSB7XG4gICAgLy8gICB0byByZW1vdmUgdGhlIGVkaXRSb3cgaWQgY2hlY2sgYm94IGlzIHVuY2hlY2tlZCBvbiBzZXBhcmF0ZSByb3dcbiAgICBpZiAoZGF0YSAmJiBlbGVtZW50Py5lZGl0Um93KSB7XG4gICAgICBlbGVtZW50LmVkaXRSb3cgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMuZW1pdCh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZClcbiAgICB9XG4gIH1cblxuICAvL1NLUzE1RkVCMjUgZGF0YSB0aGF0IHRvIGJlIHBhc3NlZCwgd2hlbiB0YWJsZSByb3cgaXMgY2xpY2tlZFxuICB0YWJsZUNsaWNrKGRhdGE6IGFueSkge1xuICAgIHRoaXMudGFibGVSb3dDbGljay5lbWl0KGRhdGEpO1xuICB9XG4gIGdldE5lc3RlZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghb2JqIHx8ICFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBcbiAgICByZXR1cm4gcGF0aFxuICAgICAgLnJlcGxhY2UoL1xcWyhcXGQrKVxcXS9nLCAnLiQxJykgLy8gdHVybnMgXCJtZW1iZXJzWzBdXCIgaW50byBcIm1lbWJlcnMuMFwiXG4gICAgICAuc3BsaXQoJy4nKVxuICAgICAgLnJlZHVjZSgoYWNjLCBwYXJ0KSA9PiAoYWNjICYmIGFjY1twYXJ0XSAhPT0gdW5kZWZpbmVkKSA/IGFjY1twYXJ0XSA6IHVuZGVmaW5lZCwgb2JqKTtcbiAgfVxuICBcbiAgLy9TS1MxNUZFQjI1IFJldGFpbiB0aGUgZmlsdGVyZGF0YVxuICBmaWx0ZXJSZXRhaW4oZmlsdGVya2V5OiBhbnksIGZyb20/OmFueSkge1xuICAgIGlmIChmaWx0ZXJrZXkgJiYgT2JqZWN0LmtleXMoZmlsdGVya2V5KS5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5zRmlsdGVyRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICBsZXQgaXNEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGZpbHRlcmtleSkpIHtcbiAgICAgICAgaWYgKGZpbHRlcmtleVtrZXldICYmIGZpbHRlcmtleVtrZXldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpc0RhdGFDaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc0RhdGFDaGVja2VkKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc0ZpbHRlckRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMoZmlsdGVya2V5KSkge1xuICAgICAgICAgIGlmIChmaWx0ZXJrZXlba2V5XSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc0ZpbHRlckRhdGEuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE5lc3RlZFZhbHVlKGl0ZW0sIGtleSk7XG4gICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJrZXlba2V5XS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IGRhdGExID0gWy4uLnRoaXMuZGF0YSwgLi4uZGF0YV07XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZXMoZGF0YTEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZihmcm9tICE9PSAncGFnZVBhcmFtcycgJiYgZnJvbSAhPT0gJ29uQ2hhbmdlJykgdGhpcy5wYWdlSW5kZXggPSAxXG4gICAgY29uc3Qgc3RhcnQgPSAoTnVtYmVyKHRoaXMucGFnZUluZGV4KSAtIDEpICogTnVtYmVyKHRoaXMucGFnZVNpemUpO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgTnVtYmVyKHRoaXMucGFnZVNpemUpO1xuICAgIHRoaXMuZmlsdGVyQm94RGF0YSA9IHRoaXMuZGF0YVxuICAgIHRoaXMuZmlsdGVyVGFibGVOb3MgPSB0aGlzLmZpbHRlckJveERhdGE/Lmxlbmd0aFxuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5kYXRhPy5zbGljZShzdGFydCwgZW5kKTtcbiAgICB0aGlzLmRhdGEgPSB0aGlzLm9yaWdpbmFsRGF0YVxuICAgIHRoaXMuc29ydERhdGEodGhpcy5jdXJyZW50U29ydENvbHVtbiAsdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbix1bmRlZmluZWQsZnJvbSlcbiAgfVxuXG4vLyBTS1MxNUZFQjI1IHRvIHJlbW92ZSBkdXBsaWNhdGUgb2JqZWN0IGZyb20gdHdvIGFycmF5cyAoc2FmZSBzdHJpbmdpZnkpXG5yZW1vdmVEdXBsaWNhdGVzKG9iamVjdHM6IGFueSkge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHVuaXF1ZU9iamVjdHM6IGFueVtdID0gW107XG5cbiAgY29uc3Qgc2FmZVN0cmluZ2lmeSA9IChvYmo6IGFueSkgPT4ge1xuICAgIGNvbnN0IHNlZW5PYmpzID0gbmV3IFdlYWtTZXQoKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsOyAvLyByZXBsYWNlIHVuZGVmaW5lZCB0byBhdm9pZCBpc3N1ZXNcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNlZW5PYmpzLmhhcyh2YWx1ZSkpIHJldHVybjsgLy8gc2tpcCBjaXJjdWxhclxuICAgICAgICBzZWVuT2Jqcy5hZGQodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9O1xuXG4gIG9iamVjdHMuZm9yRWFjaCgob2JqOiBhbnkpID0+IHtcbiAgICBjb25zdCBrZXkgPSBzYWZlU3RyaW5naWZ5KG9iaik7XG4gICAgaWYgKCFzZWVuLmhhcyhrZXkpKSB7XG4gICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgdW5pcXVlT2JqZWN0cy5wdXNoKG9iaik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdW5pcXVlT2JqZWN0cztcbn1cblxuICAvLyBTS1MxNUZFQjI1ICBvbiBkZWxldGUgY2xpY2sgc2F2ZSB0aGUgZGF0YSBpbiB2YXJpYWJsZXNcbiAgZGVsZXRlUmVjb3JkKGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmZyb20gPT09ICdmb3JtQnVpbGRlcicpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gWy4uLnRoaXMuZGF0YVNvdXJjZS5kYXRhXTsgLy8gQ3JlYXRlIGEgbmV3IHJlZmVyZW5jZVxuICAgICAgdXBkYXRlZERhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdXBkYXRlZERhdGE7IC8vIFJlYXNzaWduIHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgdGhpcy5kYXRhID0gdXBkYXRlZERhdGE7IC8vIFN5bmMgdGhpcy5kYXRhXG4gICAgICB0aGlzLmNvbXB1dGVTdW1tYXJ5VmFsdWVzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVsZXRlRGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLmRlbGV0ZUluZGV4ID0gaW5kZXg7XG4gICAgICB0aGlzLmRlbGV0ZU1vZGFsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBTS1MxNUZFQjI1ICBhZnRlciBjbGlja2luZyB5ZXMgaW4gZGVsZXRlIGFsZXJ0IG1vZGFsLCBlbWl0IHRvIHBhcmVudFxuICBkZWxldGVSZWNvcmREYXRhKCkge1xuICAgIHRoaXMub25EZWxldGVEYXRhLmVtaXQoeyBkYXRhOiB0aGlzLmRlbGV0ZURhdGEsIGFsbERhdGE6IHRoaXMuZGF0YSB9KTtcbiAgICB0aGlzLmRlbGV0ZU1vZGFsID0gZmFsc2U7XG4gIH1cblxuICAvL1NLUzE1RkVCMjUgdG8gc2F2ZSB0aGUgZWRpdGVkIGRhdGEgaW4gdGFibGU7XG4gIHNhdmVCdXR0b24oKSB7XG4gICAgLy8gZW1pdHRpbmcgYWxsIGRhdGEgd2l0aCBzZWxlY3RlZCBkYXRhXG4gICAgdGhpcy5zYXZlQnV0dG9uRGF0YS5lbWl0KHsgc2VsZWN0ZWREYXRhOiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCwgYWxsRGF0YTogdGhpcy5kYXRhIH0pO1xuICB9XG5cbiAgLy9TS1MxNUZFQjI1IHBhc3MgdGhlIHJlamVjdGVkIHJlYXNvblxuICBvbkVkaXQoZGF0YTogYW55KSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JykgZGF0YS5lZGl0Um93ID0gdHJ1ZTsgLy8gbWFkZSBlZGl0aW5nIHJvdyBhcyB0cnVlIC8vICBzb2x2ZSB1bmRlZmluZWQgZXJyb3Igb24gc3RyaW5nXG4gICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KGRhdGEpO1xuICAgIHRoaXMub25FZGl0RGF0YS5lbWl0KHsgZGF0YTogZGF0YSwgYWxsRGF0YTogdGhpcy5kYXRhIH0pO1xuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSB0YWJsZSB0b3AgYnV0dG9ucyBlbWl0XG4gIGNvbW1vbkJ1dHRvbkNsaWNrKGJ1dHRvbjogYW55KSB7XG4gICAgdGhpcy5idXR0b25FbWl0LmVtaXQoYnV0dG9uKTtcbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIGRhdGEgZnJvbSBvYmplY3RzLiBcbiAgLy8gSW4gJ2VsZW1lbnQnIHdlIHdpbGwgcGFzcyBvYmplY3QgYW5kIGluICdjb2x1bW4nIHdlIHdpbGwgcGFzcyBwYXRoIGFzIHN0cmluZyBlZy5lbXBsb3llZS5maW5hbmNlSW5mb1swXS51YW4gdG8gcmV0aWV2ZSB1YW4gdmFsdWUgXG4gIGdldE9ialZhbHVlKGVsZW1lbnQ6IGFueSwgY29sdW1uOiBzdHJpbmcpIHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIWNvbHVtbikge1xuICAgICAgcmV0dXJuICcnOyAvLyBSZXR1cm4gZW1wdHkgc3RyaW5nIG9yIG51bGwgaWYgZWxlbWVudCBvciBjb2x1bW4gaXMgaW52YWxpZFxuICAgIH1cbiAgICBsZXQgZmxkcyA9IGNvbHVtbi5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyZW50ID0gZWxlbWVudDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBzcGxpdEZsZHMgPSBmbGRzW2ldLnNwbGl0KCdbJyk7XG4gICAgICBpZiAoc3BsaXRGbGRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudFtmbGRzW2ldXSA/PyAnJzsgLy8gVXNlIG51bGxpc2ggY29hbGVzY2luZyB0byBoYW5kbGUgdW5kZWZpbmVkL251bGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBpbmRleCA9IE51bWJlcihzcGxpdEZsZHNbMV0uc3BsaXQoJ10nKVswXSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3NwbGl0Rmxkc1swXV0/LltpbmRleF0gPz8gJyc7IC8vIFNhZmVseSBhY2Nlc3MgYXJyYXkgaW5kZXhcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbiAgLy9TS1MxNUZFQjI1IGh5cGVybGlubCBjb2x1bW5zIG9ubHkgZW1pdHRlZFxuICBvbkNsaWNrSHlwZXJsaW5rKGNvbHVtbjogYW55LCBlbGVtZW50OiBhbnksIGlzSHlwZXJMaW5rOiBhbnkpIHtcbiAgICBpZiAoaXNIeXBlckxpbmspIHRoaXMuaHlwZXJMaW5rRW1pdC5lbWl0KHsgY29sdW1uOiBjb2x1bW4sIGVsZW1lbnQ6IGVsZW1lbnQgfSk7XG4gIH1cblxuICAvLyBTS1MxNUZFQjI1IG9uIGFkZCByZWNvcmQgaW4gdGFibGUsIHRoZSAnaW5saW5lRWxlbWVudCcgdmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIHRhYmxlIGRhdGEgXG4gIGFkZFRhYmxlUmVjb3JkKGVsZW1lbnQ6IGFueSxmcm9tPzphbnkpIHtcbiAgICBpZiAodGhpcy5jb25maWdQYWdpbmF0aW9uID09PSBmYWxzZSB8fCB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IHRoaXMudG90YWxSZWNvcmRzKSB7XG4gICAgICB2YXIgb2JqOiBhbnkgPSB7fTtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50KTtcbiAgICAgIGtleXMuZm9yRWFjaCgoZWxlbWVudEtleTogYW55KSA9PiB7XG4gICAgICAgIG9ialtlbGVtZW50S2V5XSA9ICcnO1xuICAgICAgfSk7XG4gICAgICAvLyBTS1MyME1BUjI1IENvbXB1dGUgc3VtbWFyeSBjb2x1bW5zIGZvciB0aGUgbmV3IHJvd1xuICAgICAgaWYgKHRoaXMuc3VtbWFyeUNvbHVtbnMgJiYgdGhpcy5zdW1tYXJ5Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc3VtbWFyeUNvbHVtbnMuZm9yRWFjaChzdW1tYXJ5Q29sID0+IHtcbiAgICAgICAgICBpZiAoc3VtbWFyeUNvbC50eXBlID09PSAnY2FsY3VsYXRpb24nICYmIHN1bW1hcnlDb2wub3BlcmF0aW9uID09PSAnc3VtJyAmJiBzdW1tYXJ5Q29sLm9wZXJhbmRzKSB7XG4gICAgICAgICAgICBjb25zdCBzdW0gPSBzdW1tYXJ5Q29sLm9wZXJhbmRzLnJlZHVjZSgoYWNjLCBvcGVyYW5kKSA9PiBhY2MgKyAoTnVtYmVyKG9ialtvcGVyYW5kXSkgfHwgMCksIDApO1xuICAgICAgICAgICAgb2JqW3N1bW1hcnlDb2wuZmllbGROYW1lXSA9IHN1bTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN1bW1hcnlDb2wudHlwZSA9PT0gJ2NhbGN1bGF0aW9uJyAmJiBzdW1tYXJ5Q29sLm9wZXJhdGlvbiA9PT0gJ3N1YnRyYWN0JyAmJiBzdW1tYXJ5Q29sLm9wZXJhbmRzKSB7XG4gICAgICAgICAgICBjb25zdCBzdW0gPSBzdW1tYXJ5Q29sLm9wZXJhbmRzLnJlZHVjZSgoYWNjLCBvcGVyYW5kKSA9PiBhY2MgLSAoTnVtYmVyKG9ialtvcGVyYW5kXSkgfHwgMCksIDApO1xuICAgICAgICAgICAgb2JqW3N1bW1hcnlDb2wuZmllbGROYW1lXSA9IHN1bTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN1bW1hcnlDb2wudHlwZSA9PT0gJ2NhbGN1bGF0aW9uJyAmJiBzdW1tYXJ5Q29sLm9wZXJhdGlvbiA9PT0gJ211bHRpcGx5JyAmJiBzdW1tYXJ5Q29sLm9wZXJhbmRzKSB7XG4gICAgICAgICAgICBjb25zdCBzdW0gPSBzdW1tYXJ5Q29sLm9wZXJhbmRzLnJlZHVjZSgoYWNjLCBvcGVyYW5kKSA9PiBhY2MgKiAoTnVtYmVyKG9ialtvcGVyYW5kXSkgfHwgMCksIDApO1xuICAgICAgICAgICAgb2JqW3N1bW1hcnlDb2wuZmllbGROYW1lXSA9IHN1bTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoc3VtbWFyeUNvbC50eXBlID09PSAnY2FsY3VsYXRpb24nICYmIHN1bW1hcnlDb2wub3BlcmF0aW9uID09PSAnc3VidHJhY3QnICYmIHN1bW1hcnlDb2wub3BlcmFuZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1bSA9IHN1bW1hcnlDb2wub3BlcmFuZHMuc2xpY2UoMSkucmVkdWNlKFxuICAgICAgICAgICAgICAoYWNjLCBvcGVyYW5kKSA9PiBhY2MgLSAoTnVtYmVyKG9ialtvcGVyYW5kXSkgfHwgMCksXG4gICAgICAgICAgICAgIE51bWJlcihvYmpbc3VtbWFyeUNvbC5vcGVyYW5kc1swXV0pIHx8IDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvYmpbc3VtbWFyeUNvbC5maWVsZE5hbWVdID0gc3VtO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChzdW1tYXJ5Q29sLnR5cGUgPT09ICdjYWxjdWxhdGlvbicgJiYgc3VtbWFyeUNvbC5vcGVyYXRpb24gPT09ICdtdWx0aXBseScgJiYgc3VtbWFyeUNvbC5vcGVyYW5kcykge1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjdCA9IHN1bW1hcnlDb2wub3BlcmFuZHMucmVkdWNlKFxuICAgICAgICAgICAgICAoYWNjLCBvcGVyYW5kKSA9PiBhY2MgKiAoTnVtYmVyKG9ialtvcGVyYW5kXSkgfHwgMCksXG4gICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvYmpbc3VtbWFyeUNvbC5maWVsZE5hbWVdID0gcHJvZHVjdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhLnB1c2gob2JqKTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gIHRoaXMuZGF0YTtcbiAgICAgIHRoaXMub3JpZ2luYWxEYXRhID0gIHRoaXMuZGF0YTtcblxuICAgICAgaWYgKHRoaXMuc3RpY2t5Q29sdW1uID09PSB0cnVlICYmIHRoaXMuY3VycmVudENvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5zdGlja3lDb25kaXRpb24gPSB0aGlzLmN1cnJlbnRDb2x1bW5zPy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0aWNreUNvbmRpdGlvbiA9IHRoaXMuY3VycmVudENvbHVtbnM/Lmxlbmd0aCArIDE7XG4gICAgICB9XG4gICAgICB0aGlzLnBhZ2VTaXplID0gMTBcbiAgICAgIHRoaXMudG90YWxDb3VudCA9IHRoaXMuZGF0YS5sZW5ndGhcbiAgICAgIHRoaXMuZmlsdGVyVGFibGVOb3MgKz0gMSBcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gTWF0aC5jZWlsKHRoaXMudG90YWxDb3VudCAvIHRoaXMucGFnZVNpemUpO1xuICAgICAgY29uc3Qgc3RhcnQgPSAoTnVtYmVyKHRoaXMucGFnZUluZGV4KSAtIDEpICogTnVtYmVyKHRoaXMucGFnZVNpemUpO1xuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBOdW1iZXIodGhpcy5wYWdlU2l6ZSk7XG4gICAgICBpZiAoIXRoaXMuaXNQYWdpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5kYXRhXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YT8uc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QodGhpcy5kYXRhW3RoaXMuZGF0YS5sZW5ndGggLSAxXSk7XG4gICAgICB0aGlzLmRhdGFbdGhpcy5kYXRhLmxlbmd0aCAtIDFdLmVkaXRSb3cgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYWdlSW5kZXggPSBNYXRoLmNlaWwodGhpcy50b3RhbFJlY29yZHMgLyAxMCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnTnh0RGF0YVRhYmxlJywgSlNPTi5zdHJpbmdpZnkoeyBhZGRSZWNvcmQ6IHRydWUsIHBhZ2VTaXplOiAxMCwgcGFnZUluZGV4OiBwYWdlSW5kZXgsIGN1cnJlbnRTb3J0Q29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBjdXJyZW50U29ydERpcmVjdGlvbjogdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiB9KSk7XG4gICAgICBpZihmcm9tICE9PSAnb25DaGFuZ2UnKXRoaXMuTnh0VGFibGVFbWl0LmVtaXQoeyBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiAxMCwgcGFnZUluZGV4OiBwYWdlSW5kZXggfSwgdGFibGVTZWFyY2g6IHsgZmllbGRzOiB0aGlzLmN1cnJlbnRDb2x1bW5zLCB2YWx1ZTogdGhpcy5zZWFyY2hCb3hWYWx1ZSB9LCBzZWFyY2hGaWx0ZXJEYXRhOiB0aGlzLmZpbHRlckRhdGFBcnJheSwgc29ydDogeyBjb2x1bW46IHRoaXMuY3VycmVudFNvcnRDb2x1bW4sIGRpcmVjdGlvbjogdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiAsbGlzdFZpZXc6IHRoaXMuc2VsZWN0ZWRWaWV3fSB9KVxuICAgIH1cbiAgICB0aGlzLmNvbXB1dGVTdW1tYXJ5VmFsdWVzKGZyb20pO1xuICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5OeHRUYWJsZVBhcmFtc0VtaXQuZW1pdCh7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXggfSx0YWJsZVNlYXJjaDogdGhpcy5zZWFyY2hCb3hWYWx1ZSwgc2VhcmNoRmlsdGVyRGF0YTogdGhpcy5maWx0ZXJEYXRhQXJyYXksIHNvcnQ6IHsgY29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBkaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gLGxpc3RWaWV3OiB0aGlzLnNlbGVjdGVkVmlld319KVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSBBY3Rpb24gYnV0dG9uIGNvbmRpdGlvbmFsbHkgZGlzcGxheWVkIGZ1bmN0aW9uXG4gIGlzQ29uZGl0aW9uTWV0KGVsZW1lbnQ6IGFueSwgY29uZGl0aW9uczogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKGNvbmRpdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgeyBhbmRDb25kaXRpb25MaXN0LCBvckNvbmRpdGlvbkxpc3QgfSA9IGNvbmRpdGlvbnM7XG4gICAgICAvLyAgSWYgYW5kQ29uZGl0aW9uTGlzdCBleGlzdHMsIGNoZWNrIHRoYXQgYWxsIGNvbmRpdGlvbnMgYXJlIG1ldFxuICAgICAgY29uc3QgaXNBbmRDb25kaXRpb25NZXQgPSBhbmRDb25kaXRpb25MaXN0ID8gYW5kQ29uZGl0aW9uTGlzdC5ldmVyeSgoY29uZDogeyBjb25kaXRpb246IHN0cmluZyB8IGFueVtdOyBjb2x1bW46IHN0cmluZyB8IG51bWJlcjsgfSkgPT5cbiAgICAgICAgY29uZC5jb25kaXRpb24uaW5jbHVkZXMoZWxlbWVudFtjb25kLmNvbHVtbl0pXG4gICAgICApIDogdHJ1ZTsgLy8gIElmIG5vIGFuZENvbmRpdGlvbkxpc3QsIGNvbnNpZGVyIGl0IGFzIGFsd2F5cyBtZXRcbiAgICAgIC8vICBJZiBvckNvbmRpdGlvbkxpc3QgZXhpc3RzLCBjaGVjayBpZiBhdCBsZWFzdCBvbmUgY29uZGl0aW9uIGlzIG1ldFxuICAgICAgY29uc3QgaXNPckNvbmRpdGlvbk1ldCA9IG9yQ29uZGl0aW9uTGlzdCA/IG9yQ29uZGl0aW9uTGlzdC5zb21lKChjb25kOiB7IGNvbmRpdGlvbjogc3RyaW5nIHwgYW55W107IGNvbHVtbjogc3RyaW5nIHwgbnVtYmVyOyB9KSA9PlxuICAgICAgICBjb25kLmNvbmRpdGlvbi5pbmNsdWRlcyhlbGVtZW50W2NvbmQuY29sdW1uXSlcbiAgICAgICkgOiB0cnVlOyAvLyAgSWYgbm8gb3JDb25kaXRpb25MaXN0LCBjb25zaWRlciBpdCBhcyBhbHdheXMgbWV0XG4gICAgICAvLyAgUmV0dXJuIHRydWUgaWYgdGhlIEFORCBjb25kaXRpb24gaXMgbWV0IGFuZCB0aGUgT1IgY29uZGl0aW9uIGlzIG1ldFxuICAgICAgcmV0dXJuIGlzQW5kQ29uZGl0aW9uTWV0ICYmIGlzT3JDb25kaXRpb25NZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgY29uZmlnIHNlYXJjaCBmaWx0ZXIgYm94IGZ1bmN0aW9uXG4gIG9uU2VhcmNoKGV2ZW50OiBhbnksZnJvbT86YW55KSB7XG4gICAgdGhpcy5zZWFyY2hCb3hWYWx1ZSA9IGV2ZW50OyAvLyBVcGRhdGUgdGhlIGRpc3BsYXllZCB2YWx1ZSBpbiB0aGUgc2VhcmNoIGJveFxuICAgIGlmICh0aGlzLnNlYXJjaENvbmZpZ3MgfHwgdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoID09PSB0aGlzLnRvdGFsUmVjb3Jkcykge1xuICAgICAgdGhpcy5wYWdlSW5kZXggPSAxXG4gICAgICB0aGlzLnBhZ2VTaXplID0gMTBcbiAgICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5OeHRUYWJsZUVtaXQuZW1pdCh7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogTnVtYmVyKHRoaXMucGFnZUluZGV4KSB9LCB0YWJsZVNlYXJjaDogeyBmaWVsZHM6IHRoaXMuY3VycmVudENvbHVtbnMsIHZhbHVlOiB0aGlzLnNlYXJjaEJveFZhbHVlIH0sIHNlYXJjaEZpbHRlckRhdGE6IHRoaXMuZmlsdGVyRGF0YUFycmF5LCBzb3J0OiB7IGNvbHVtbjogdGhpcy5jdXJyZW50U29ydENvbHVtbiwgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uICxsaXN0VmlldzogdGhpcy5zZWxlY3RlZFZpZXd9IH0pXG4gICAgfVxuICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5OeHRUYWJsZVBhcmFtc0VtaXQuZW1pdCh7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXggfSx0YWJsZVNlYXJjaDogdGhpcy5zZWFyY2hCb3hWYWx1ZSwgc2VhcmNoRmlsdGVyRGF0YTogdGhpcy5maWx0ZXJEYXRhQXJyYXksIHNvcnQ6IHsgY29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBkaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gLGxpc3RWaWV3OiB0aGlzLnNlbGVjdGVkVmlld319KVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSBJZiB0aGUgdmFsdWUgaW4gdGhlIHNlYXJjaCBib3ggaXMgZW1wdHksIGNhbGwgdGhlIG9uU2VhcmNoIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHlcbiAgZW1wdHlTZWFyY2goZXZlbnQ6IGFueSkge1xuICAgIGlmICghZXZlbnQudHJpbSgpICYmICh0aGlzLnByZXZTZWFyY2ggIT0gZXZlbnQudHJpbSgpKSkge1xuICAgICAgdGhpcy5vblNlYXJjaChldmVudClcbiAgICB9XG4gICAgdGhpcy5wcmV2U2VhcmNoID0gZXZlbnQudHJpbSgpXG4gIH1cblxuICAvLyBTS1MxNUZFQjI1IGluZm9TaWRlc2NyZWVuIGVtaXQgXG4gIG9uU2lkZU5hdkluZm9DbGljayhkYXRhOiBhbnksIGNvbDogYW55KSB7XG4gICAgdGhpcy5zaWRlTmF2RW1pdC5lbWl0KHtcbiAgICAgIGRhdGEsIGNvbCxcbiAgICAgIGNvbmZpZzogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgZm9yIGFjdGl2ZSBjb2x1bW4gc2VsZWN0XG4gIG9uQ29sdW1uQ2xpY2sodW5pcXVlSWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVDb2x1bW4gPSB1bmlxdWVJZGVudGlmaWVyO1xuICAgIGlmICghdGhpcy5pc0VkaXRhYmxlKSB7XG4gICAgICAvLyBFeGlzdGluZyBzb3J0L2ZpbHRlciBsb2dpY1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uID09PSB1bmlxdWVJZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uID0gbnVsbDtcbiAgICAgIHRoaXMuY29sdW1uU2VsZWN0ZWQuZW1pdChudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbiA9IHVuaXF1ZUlkZW50aWZpZXI7XG4gICAgICBjb25zdCBjb2x1bW5EYXRhID0gdGhpcy5kYXRhU291cmNlLmRhdGEubWFwKHJvdyA9PiAoe1xuICAgICAgICB2YWx1ZTogcm93W3VuaXF1ZUlkZW50aWZpZXJdLFxuICAgICAgICBpZDogcm93LmlkIC8vIG9yIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmNvbHVtblNlbGVjdGVkLmVtaXQoeyB1bmlxdWVJZGVudGlmaWVyLCBkYXRhOiBjb2x1bW5EYXRhIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgZm9yIGNsb3NlIHNlYXJjaCBmaWx0ZXIgYm94XG4gIGNsb3NlZmlsdGVyKGZyb20/OmFueSkge1xuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplIHx8IDEwXG4gICAgdGhpcy5wYWdlSW5kZXggPSAxXG4gICAgdGhpcy5maWx0ZXJEYXRhQXJyYXlbdGhpcy5zZWxlY3RlZEZpbHRlcl0gPSBbXVxuICAgIHRoaXMuaXNSZXNpemVkID0gZmFsc2VcbiAgICBpZiAodGhpcy5jb25maWdQYWdpbmF0aW9uID09PSBmYWxzZSB8fCB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IHRoaXMudG90YWxSZWNvcmRzKSB7XG4gICAgICB0aGlzLmZpbHRlclJldGFpbih0aGlzLmZpbHRlckRhdGFBcnJheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZnJvbSAhPT0gJ29uQ2hhbmdlJyl0aGlzLk54dFRhYmxlRW1pdC5lbWl0KHsgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogMTAsIHBhZ2VJbmRleDogMSB9LCB0YWJsZVNlYXJjaDogeyBmaWVsZHM6IHRoaXMuY3VycmVudENvbHVtbnMsIHZhbHVlOiB0aGlzLnNlYXJjaEJveFZhbHVlIH0sIHNlYXJjaEZpbHRlckRhdGE6IHRoaXMuZmlsdGVyRGF0YUFycmF5LCBzb3J0OiB7IGNvbHVtbjogdGhpcy5jdXJyZW50U29ydENvbHVtbiwgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uICxsaXN0VmlldzogdGhpcy5zZWxlY3RlZFZpZXd9IH0pXG4gICAgfVxuICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5OeHRUYWJsZVBhcmFtc0VtaXQuZW1pdCh7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXggfSx0YWJsZVNlYXJjaDogdGhpcy5zZWFyY2hCb3hWYWx1ZSwgc2VhcmNoRmlsdGVyRGF0YTogdGhpcy5maWx0ZXJEYXRhQXJyYXksIHNvcnQ6IHsgY29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBkaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gLGxpc3RWaWV3OiB0aGlzLnNlbGVjdGVkVmlld319KVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSBzZWFyY2ggZmlsdGVyIGJveCBjaGVja2JveCByZXRhaW5cbiAgaXNTZWxlY3RlZChldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyRGF0YUFycmF5W3RoaXMuc2VsZWN0ZWRGaWx0ZXJdICYmIHRoaXMuZmlsdGVyRGF0YUFycmF5W3RoaXMuc2VsZWN0ZWRGaWx0ZXJdLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSBzZWFyY2ggZmlsdGVyIGJveCBjaGVja2JveCBzZWxlY3RcbiAgY2hlY2tlZERhdGEoZXZlbnQ6IGFueSxmcm9tPzphbnkpIHtcbiAgICBsZXQgc2VsZWN0ZWRBcnJheSA9IFtdXG4gICAgc2VsZWN0ZWRBcnJheSA9IHRoaXMuZmlsdGVyRGF0YUFycmF5W3RoaXMuc2VsZWN0ZWRGaWx0ZXJdID8gdGhpcy5maWx0ZXJEYXRhQXJyYXlbdGhpcy5zZWxlY3RlZEZpbHRlcl0gOiBbXVxuICAgIGlmIChzZWxlY3RlZEFycmF5ICYmIHNlbGVjdGVkQXJyYXkuaW5jbHVkZXMoZXZlbnQpKSB7XG4gICAgICBzZWxlY3RlZEFycmF5ID0gc2VsZWN0ZWRBcnJheS5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbSAhPT0gZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RlZEFycmF5LnB1c2goZXZlbnQpO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlckRhdGFBcnJheVt0aGlzLnNlbGVjdGVkRmlsdGVyXSA9IHNlbGVjdGVkQXJyYXlcbiAgICB0aGlzLmlzUmVzaXplZCA9IHNlbGVjdGVkQXJyYXk/Lmxlbmd0aCA+IDBcbiAgICBpZiAodGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoICE9PSB0aGlzLnRvdGFsUmVjb3JkcyAmJiB0aGlzLmNvbmZpZ1BhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gMVxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IDEwXG4gICAgICBpZihmcm9tICE9PSAnb25DaGFuZ2UnKXRoaXMuTnh0VGFibGVFbWl0LmVtaXQoeyBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLCBwYWdlSW5kZXg6IE51bWJlcih0aGlzLnBhZ2VJbmRleCkgfSwgdGFibGVTZWFyY2g6IHsgZmllbGRzOiB0aGlzLmN1cnJlbnRDb2x1bW5zLCB2YWx1ZTogdGhpcy5zZWFyY2hCb3hWYWx1ZSB9LCBzZWFyY2hGaWx0ZXJEYXRhOiB0aGlzLmZpbHRlckRhdGFBcnJheSwgc29ydDogeyBjb2x1bW46IHRoaXMuY3VycmVudFNvcnRDb2x1bW4sIGRpcmVjdGlvbjogdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiAsbGlzdFZpZXc6IHRoaXMuc2VsZWN0ZWRWaWV3fSB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlclJldGFpbih0aGlzLmZpbHRlckRhdGFBcnJheSlcbiAgICB9XG4gICAgaWYoZnJvbSAhPT0gJ29uQ2hhbmdlJyl0aGlzLk54dFRhYmxlUGFyYW1zRW1pdC5lbWl0KHsgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSwgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCB9LHRhYmxlU2VhcmNoOiB0aGlzLnNlYXJjaEJveFZhbHVlLCBzZWFyY2hGaWx0ZXJEYXRhOiB0aGlzLmZpbHRlckRhdGFBcnJheSwgc29ydDogeyBjb2x1bW46IHRoaXMuY3VycmVudFNvcnRDb2x1bW4sIGRpcmVjdGlvbjogdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiAsbGlzdFZpZXc6IHRoaXMuc2VsZWN0ZWRWaWV3fX0pXG4gIH1cblxuICAvLyBTS1MxNUZFQjI1ICBhY3Rpb24gY29sdW1uIGRyb3Bkb3duIGJ1dHRvbnMgY2xvc2VcbiAgcHJpdmF0ZSBhZGRDbGlja091dHNpZGVMaXN0ZW5lcigpIHtcbiAgICBpZiAoIXRoaXMuY2xpY2tMaXN0ZW5lcikge1xuICAgICAgdGhpcy5jbGlja0xpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5kcm9wZG93bicpKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50T3BlbkluZGV4ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnJlbW92ZUNsaWNrTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy9TS1MxNUZFQjI1IGlmIGNsb3NlIHRoZSBkcm9wZG93biBtZW51IHN0b3AgdGhlIGNsaWNrIGxpc3RlbmVyXG4gIHByaXZhdGUgcmVtb3ZlQ2xpY2tMaXN0ZW5lcigpIHtcbiAgICBpZiAodGhpcy5jbGlja0xpc3RlbmVyKSB7XG4gICAgICB0aGlzLmNsaWNrTGlzdGVuZXIoKTtcbiAgICAgIHRoaXMuY2xpY2tMaXN0ZW5lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSAgYWN0aW9uIGNvbHVtbiBkcm9wZG93biBidXR0b25zIG9wZW4gLyBjbG9zZVxuICB0b2dnbGVEcm9wZG93bihpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50T3BlbkluZGV4ID0gdGhpcy5jdXJyZW50T3BlbkluZGV4ID09PSBpbmRleCA/IG51bGwgOiBpbmRleDtcbiAgICB0aGlzLmFkZENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gIH1cblxuICAvL1NLUzE1RkVCMjUgYWN0aW9uIGJ1dHRvbiBldm50IGVtaXRcbiAgYWN0aW9uQnV0dG9uQ2xpY2tlZChldmVudDogYW55LCBkYXRhOiBhbnkpIHtcbiAgICB0aGlzLmFjdGlvbkJ1dHRvbkVtaXQuZW1pdCh7IGV2ZW50LCBkYXRhIH0pXG4gIH1cblxuICByZW1vdmVDb2wodW5pcXVlSWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbiA9IG51bGw7XG4gICAgLy8gRW1pdCBkZXNlbGVjdGlvblxuICAgIGlmICghdGhpcy5pc0VkaXRhYmxlKSB7XG4gICAgICAvLyBFeGlzdGluZyBzb3J0L2ZpbHRlciBsb2dpY1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbkRhdGEgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5tYXAocm93ID0+ICh7XG4gICAgICB2YWx1ZTogcm93W3VuaXF1ZUlkZW50aWZpZXJdLFxuICAgICAgaWQ6IHJvdy5pZCAvLyBvciB1bmlxdWUgaWRlbnRpZmllclxuICAgIH0pKTtcbiAgICB0aGlzLnJlbW92ZUNvbHVtbi5lbWl0KHsgdW5pcXVlSWRlbnRpZmllciwgZGF0YTogY29sdW1uRGF0YSB9KTtcblxuICB9XG4gIGVtaXRUYWJsZURhdGFWYWx1ZSh1cGRhdGVkVGFibGVEYXRhOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodXBkYXRlZFRhYmxlRGF0YSk7XG4gIH1cblxuICB1cGRhdGVFZGl0KGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnksIGVsZW1lbnQ6IGFueSwgY29sdW1uOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB1cGRhdGVkRWxlbWVudCA9IHRoaXMudXBkYXRlVmFsdWUoZWxlbWVudCwgY29sdW1uLCB2YWx1ZSk7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGFbaW5kZXhdID0gdXBkYXRlZEVsZW1lbnQ7XG4gICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhU291cmNlLmRhdGFcbiAgICAvLyBTS1MyMkpVTDI1IEludmFsaWRhdGUgY2FjaGUgZm9yIHRoaXMgcm93IGFuZCBjb2x1bW5cbiAgICBjb25zdCByb3dJZCA9IGVsZW1lbnQ/LmlkID8/IGluZGV4O1xuICAgIGNvbnN0IGtleSA9IGAke3Jvd0lkfS0ke2NvbHVtbiA/PyAndW5rbm93bid9YDtcbiAgICB0aGlzLnF1ZXN0aW9uc0NhY2hlLmRlbGV0ZShrZXkpO1xuICAgIC8vIFNLUzIwTUFSMjUgRW5zdXJlIHRoaXMuZGF0YSBpcyB1cGRhdGVkIHNpbmNlIHN1bW1hcnkgdXNlcyB0aGUgZnVsbCBkYXRhc2V0XG4gICAgY29uc3QgZGF0YUluZGV4ID0gdGhpcy5kYXRhLmZpbmRJbmRleCgoaXRlbTogYW55KSA9PiBpdGVtID09PSBlbGVtZW50KTtcbiAgICBpZiAoZGF0YUluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5kYXRhW2RhdGFJbmRleF0gPSB1cGRhdGVkRWxlbWVudDtcbiAgICB9XG4gICAgLy8gUmVjb21wdXRlIHN1bW1hcnkgY29sdW1ucyBmb3IgdGhlIHVwZGF0ZWQgcm93XG4gICAgaWYgKHRoaXMuc3VtbWFyeUNvbHVtbnMgJiYgdGhpcy5zdW1tYXJ5Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnN1bW1hcnlDb2x1bW5zLmZvckVhY2goc3VtbWFyeUNvbCA9PiB7XG4gICAgICAgIGlmIChzdW1tYXJ5Q29sLnR5cGUgPT09ICdjYWxjdWxhdGlvbicgJiYgc3VtbWFyeUNvbC5vcGVyYW5kcyAmJiBzdW1tYXJ5Q29sLm9wZXJhbmRzLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChzdW1tYXJ5Q29sLm9wZXJhdGlvbiA9PT0gJ3N1bScpIHtcbiAgICAgICAgICAgIHVwZGF0ZWRFbGVtZW50W3N1bW1hcnlDb2wuZmllbGROYW1lXSA9IHN1bW1hcnlDb2wub3BlcmFuZHMucmVkdWNlKFxuICAgICAgICAgICAgICAoYWNjLCBvcGVyYW5kKSA9PiBhY2MgKyAoTnVtYmVyKHVwZGF0ZWRFbGVtZW50W29wZXJhbmRdKSB8fCAwKSxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN1bW1hcnlDb2wub3BlcmF0aW9uID09PSAnbXVsdGlwbHknKSB7XG4gICAgICAgICAgICB1cGRhdGVkRWxlbWVudFtzdW1tYXJ5Q29sLmZpZWxkTmFtZV0gPSBzdW1tYXJ5Q29sLm9wZXJhbmRzLnJlZHVjZShcbiAgICAgICAgICAgICAgKGFjYywgb3BlcmFuZCkgPT4gYWNjICogKE51bWJlcih1cGRhdGVkRWxlbWVudFtvcGVyYW5kXSkgfHwgMCksICAvLyBTdGFydCB3aXRoIDEgaW5zdGVhZCBvZiAwXG4gICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdW1tYXJ5Q29sLm9wZXJhdGlvbiA9PT0gJ3N1YnRyYWN0Jykge1xuICAgICAgICAgICAgdXBkYXRlZEVsZW1lbnRbc3VtbWFyeUNvbC5maWVsZE5hbWVdID0gc3VtbWFyeUNvbC5vcGVyYW5kcy5zbGljZSgxKS5yZWR1Y2UoXG4gICAgICAgICAgICAgIChhY2MsIG9wZXJhbmQpID0+IGFjYyAtIChOdW1iZXIodXBkYXRlZEVsZW1lbnRbb3BlcmFuZF0pIHx8IDApLFxuICAgICAgICAgICAgICBOdW1iZXIodXBkYXRlZEVsZW1lbnRbc3VtbWFyeUNvbC5vcGVyYW5kc1swXV0pIHx8IDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhW2luZGV4XSA9IHVwZGF0ZWRFbGVtZW50O1xuICAgICAgaWYgKGRhdGFJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5kYXRhW2RhdGFJbmRleF0gPSB1cGRhdGVkRWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJykge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGFbaW5kZXhdID0gdGhpcy51cGRhdGVWYWx1ZShlbGVtZW50LCBjb2x1bW4sIHZhbHVlKTtcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhXG4gICAgfVxuICAgIHRoaXMuY29tcHV0ZVN1bW1hcnlWYWx1ZXMoKTtcbiAgfVxuICAvLyBTS1MxOE1BUjI1IHVwZGF0ZSBlbGVtZW50XG4gIHVwZGF0ZVZhbHVlKGVsZW1lbnQ6IGFueSwgY29sdW1uOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBsZXQgZmxkcyA9IGNvbHVtbj8uc3BsaXQoJy4nKTtcbiAgICBsZXQgb2JqID0gZWxlbWVudDsgLy8gS2VlcCByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIG9iamVjdFxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbGRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgbGV0IHNwbGl0RmxkcyA9IGZsZHNbaV0uc3BsaXQoJ1snKTtcbiAgICAgIGlmIChzcGxpdEZsZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIG9iaiA9IG9ialtmbGRzW2ldXSB8fCAob2JqW2ZsZHNbaV1dID0ge30pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGluZGV4ID0gTnVtYmVyKHNwbGl0Rmxkc1sxXS5zcGxpdCgnXScpWzBdKTtcbiAgICAgICAgb2JqID0gb2JqW3NwbGl0Rmxkc1swXV0gfHwgKG9ialtzcGxpdEZsZHNbMF1dID0gW10pO1xuICAgICAgICBvYmogPSBvYmpbaW5kZXhdIHx8IChvYmpbaW5kZXhdID0ge30pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgZmluYWwgcHJvcGVydHlcbiAgICBsZXQgbGFzdEtleSA9IGZsZHNbZmxkcy5sZW5ndGggLSAxXTtcbiAgICBsZXQgc3BsaXRMYXN0S2V5ID0gbGFzdEtleS5zcGxpdCgnWycpO1xuICAgIGlmIChzcGxpdExhc3RLZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICBvYmpbbGFzdEtleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGluZGV4ID0gTnVtYmVyKHNwbGl0TGFzdEtleVsxXS5zcGxpdCgnXScpWzBdKTtcbiAgICAgIG9ialtzcGxpdExhc3RLZXlbMF1dW2luZGV4XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgZXhwZW5zZUF0dGFjaG1lbnQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZmlsZUVtaXQuZW1pdChldmVudClcbiAgfVxuICBsaXN0Vmlld0VtaXQoZXZlbnQpe1xuICAgIGlmKGV2ZW50LmFjdGlvbiA9PT0gJ2ZpbHRlckdldCcpe1xuICAgICAgZXZlbnRbJ2RhdGEnXT0gdGhpcy5jb2x1bW5zPy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5maWx0ZXIgPT09IHRydWUpLm1hcChjb2x1bW4gPT4gY29sdW1uLmZpZWxkTmFtZSlcbiAgICAgIGlmKCF0aGlzLnRhYmxlRmlsdGVyRGF0YSB8fCB0aGlzLnRhYmxlRmlsdGVyRGF0YS5sZW5ndGggPT09IDApe1xuICAgICAgICB0aGlzLk54dFRhYmxlRmlsdGVyRW1pdC5lbWl0KGV2ZW50KVxuICAgICAgfVxuICAgIH0gZWxzZXsgXG4gICAgICBpZiAoZXZlbnQuYWN0aW9uID09PSAnc2VsZWN0JyB8fCBldmVudC5hY3Rpb24gPT09ICdzYXZlJykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IGV2ZW50LmRhdGEuZmlsdGVyTmFtZTtcbiAgICAgICAgdGhpcy5jdXJyZW50Vmlld0ZpbHRlciA9IGV2ZW50LmRhdGE7XG4gICAgICAgIHRoaXMubmdPbkNoYW5nZXMoe30pXG4gICAgICB9XG4gICAgICB0aGlzLk54dFRhYmxlRmlsdGVyRW1pdC5lbWl0KGV2ZW50KVxuICAgIH1cbiAgfVxuICBnZXQgaXNSZWFkT25seUFycmF5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMuY29sdW1ucykgJiYgdGhpcy5jb2x1bW5zLnNvbWUoY29sID0+IGNvbC5yZWFkT25seSk7XG4gIH1cbiAgYXN5bmMgb25JbWFnZUVkaXQocXVlczogYW55KSB7XG4gICAgdGhpcy5pc0ltYWdlRWRpdCA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZEltYWdlRWxlbWVudCA9IHF1ZXM7XG4gIH1cbiAgYXN5bmMgb25JbWFnZURlbGV0ZShxdWVzOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgcXVlcy5pbWFnZURhdGEgPSAnJztcbiAgICAgIHF1ZXMub3JnSW1hZ2VEYXRhID0gJyc7XG4gICAgICAvLyBTS1MyMkpVTDI1IEluaXRpYWxpemUgbG9nbyBzaXplIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgaWYgKCFxdWVzLmltYWdlU2l6ZSkge1xuICAgICAgICBxdWVzLmltYWdlU2l6ZSA9IHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxNTAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGF3YWl0IHRoaXMuY2hpbGRFdmVudENhcHR1cmUocXVlcy5pbWFnZURhdGEsIHF1ZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVhZGluZyBmaWxlOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG4gICAvLyBTS1MyNU1BUjI1IGltYWdlIGFkZFxuICAgYXN5bmMgZmlsZUNoYW5nZUV2ZW50KHF1ZXM6IGFueSwgZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGF3YWl0IHRoaXMucmVhZEZpbGVBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgIHF1ZXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgICAgICBxdWVzLm9yZ0ltYWdlRGF0YSA9IGltYWdlRGF0YTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBsb2dvIHNpemUgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmICghcXVlcy5pbWFnZVNpemUpIHtcbiAgICAgICAgICBxdWVzLmltYWdlU2l6ZSA9IHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxNTAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF3YWl0IHRoaXMuY2hpbGRFdmVudENhcHR1cmUoaW1hZ2VEYXRhLCBxdWVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIGZpbGU6XCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpO1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9KTtcbiAgfVxuICAvLyBTS1MyOE1BUjI1IGZvciBuZXN0ZWQgYm9vayByZWFkXG4gIHJlYWRRdWVzdGlvbnMocWJJZDogYW55LCBxdWVzOmFueSkge1xuICAgIGxldCBxdWVzdGlvbnMgPSBbXTtcbiAgICAvLyBTS1MyMkpVTDI1IEFkZGVkIHRlcm5hcnkgdG8gYXZvaWQgdW5kZWZpbmVkXG4gICAgZm9yICh2YXIgc3EgaW4gcXVlcy5ib29rUXVlc3Rpb25zTWFwW3FiSWRdLnN1YlF1ZXN0aW9ucykge1xuICAgICAgbGV0IHE6IGFueSA9IHF1ZXMuYm9va1F1ZXN0aW9uc01hcFtxYklkXS5zdWJRdWVzdGlvbnNbc3FdO1xuICAgICAgLy8gaWYgcXVlc3Rpb24gaXMgdGhlcmUgcHJvY2Vzc1xuICAgICAgaWYgKHEpIHtcbiAgICAgICAgICBxdWVzdGlvbnMucHVzaChxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9ucztcbiAgfVxuICBnZXREcm9wRG93bihldmVudDogYW55KSB7XG4gICAgdGhpcy5oYWRsZURyb3BEb3duRGVwZW5kZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLy8gU0tTMjJKVUwyNSBNb2RpZmllZCBnZXRVcGRhdGVkUXVlc3Rpb24gd2l0aCBjYWNoaW5nXG4gIGdldFVwZGF0ZWRRdWVzdGlvbihjb2x1bW46IGFueSwgZWxlbWVudDogYW55LCByb3dJbmRleDogbnVtYmVyKSB7XG4gICAgLy8gRmFsbGJhY2sgdG8gcm93SW5kZXggaWYgZWxlbWVudC5pZCBpcyBtaXNzaW5nXG4gICAgY29uc3Qgcm93SWQgPSBlbGVtZW50Py5pZCA/PyByb3dJbmRleDtcbiAgICBjb25zdCBrZXkgPSBgJHtyb3dJZH0tJHtjb2x1bW4gPz8gJ3Vua25vd24nfWA7XG4gICAgaWYgKCF0aGlzLnF1ZXN0aW9uc0NhY2hlLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCBxdWVzdGlvbiA9IHtcbiAgICAgICAgLi4uY29sdW1uLnF1ZXN0aW9uLFxuICAgICAgICBpbnB1dDogdGhpcy5nZXRPYmpWYWx1ZShlbGVtZW50LCBjb2x1bW4pXG4gICAgICB9O1xuICAgICAgdGhpcy5xdWVzdGlvbnNDYWNoZS5zZXQoa2V5LCBxdWVzdGlvbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnF1ZXN0aW9uc0NhY2hlLmdldChrZXkpO1xuICB9ICBcbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YWJsZS1sYXlvdXRcIiBbaWRdPVwidGFibGVJZFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy10b3AnOiAnMXB4JywgJ3dpZHRoJzogdGFibGVXaWR0aH1cIiBbZGlyXT1cImRpcmVjdGlvblwiPlxuICAgIDxkaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJ0aXRsZVwiIGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgdGFibGUtdGl0bGUgYWxpZ24tdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIHt7dGl0bGV9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImlzTm9zSW5kaWNhdG9yIHx8IHNlYXJjaEJhciB8fCBpc0J1dHRvbnNcIiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLWJvdHRvbTogMjBweDtcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBTS1MyNkFQUjI1IExpc3QgVmlldyBGaWx0ZXIgLS0+XG4gICAgICAgICAgICAgICAgPGFwcC1saXN0LXZpZXctZmlsdGVyICpuZ0lmPVwibGlzdFZpZXdzICYmIGxpc3RWaWV3cy5sZW5ndGggPiAwXCIgW2xpc3RWaWV3c109XCJsaXN0Vmlld3NcIlxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRWaWV3XT1cInNlbGVjdGVkVmlld1wiIFtkaXNwbGF5ZWRDb2x1bW5zXT0nY29sdW1ucycgW3RhYmxlRmlsdGVyQXJyYXldPVwidGFibGVGaWx0ZXJBcnJheVwiXG4gICAgICAgICAgICAgICAgICAgIChsaXN0Vmlld0VtaXQpPVwibGlzdFZpZXdFbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1saXN0LXZpZXctZmlsdGVyPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIoIWxpc3RWaWV3cyB8fCBsaXN0Vmlld3MubGVuZ3RoID09PSAwKSAmJiBpc05vc0luZGljYXRvclwiIGNsYXNzPVwibm9PZlJlY1wiXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1wiPlxuICAgICAgICAgICAgICAgICAgICA8cCBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiAwcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnQVBQLk5PUycgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnTm9zJ319IDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImNvbG9yOiByZ2IoNDMsIDg3LCAyNDkpO1wiPnt7dG90YWxSZWNvcmRzIHx8IHRvdGFsQ291bnR9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCIgc3R5bGU9XCJhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWFyY2hCYXJcIiBjbGFzcz1cInNlYXJjaFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzZWFyY2gtYmFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjY0MTMgMTkuMjVDMTYuNjMyMiAxOS4yNSAyMC42NzgxIDE1LjM1MTEgMjAuNjc4MSAxMC41NDE3QzIwLjY3ODEgNS43MzIxOCAxNi42MzIyIDEuODMzMzMgMTEuNjQxMyAxLjgzMzMzQzYuNjUwNCAxLjgzMzMzIDIuNjA0NDkgNS43MzIxOCAyLjYwNDQ5IDEwLjU0MTdDMi42MDQ0OSAxNS4zNTExIDYuNjUwNCAxOS4yNSAxMS42NDEzIDE5LjI1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM3ODc0ODZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjEuNjI5NSAyMC4xNjY3TDE5LjcyNzEgMTguMzMzM1wiIHN0cm9rZT1cIiM3ODc0ODZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cInt7ICdBUFAuU0VBUkNIJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdTZWFyY2gnICB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cInNlYXJjaENvbmZpZ3MgPyBlbXB0eVNlYXJjaCgkZXZlbnQudGFyZ2V0LnZhbHVlKSA6IGFwcGx5RmlsdGVyKCRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VhcmNoQm94VmFsdWUgfHwgJydcIiAjaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwic2VhcmNoQ29uZmlncyAmJiBzZWFyY2hCYXJcIiBjbGFzcz1cImNvbmZpZ1NlYXJjaFwiIChjbGljayk9XCJvblNlYXJjaChpbnB1dC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDVIMjBcIiBzdHJva2U9XCIjZmZmZmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0IDhIMTdcIiBzdHJva2U9XCIjZmZmZmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIxIDExLjVDMjEgMTYuNzUgMTYuNzUgMjEgMTEuNSAyMUM2LjI1IDIxIDIgMTYuNzUgMiAxMS41QzIgNi4yNSA2LjI1IDIgMTEuNSAyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI2ZmZmZmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMiAyMkwyMCAyMFwiIHN0cm9rZT1cIiNmZmZmZmZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIiAqbmdJZj1cImlzQnV0dG9uc1wiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiA3cHg7IGdhcDogN3B4O1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiICpuZ0Zvcj1cImxldCBidXR0b24gb2YgYnV0dG9uQXJyYXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxueHQtYnV0dG9uIGNsYXNzPVwiZGF0YS10YWJsZS1mc2J0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbkNsaWNrRW1pdCk9XCIoYnV0dG9uLnR5cGUgPT09ICdncm91cCcgfHwgYnV0dG9uLnR5cGUgPT09ICdkcm9wZG93bicpID8gY29tbW9uQnV0dG9uQ2xpY2soJGV2ZW50KSA6IGNvbW1vbkJ1dHRvbkNsaWNrKGJ1dHRvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25UeXBlXT1cImJ1dHRvbi5jbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1dHRvblZhbHVlXT1cImJ1dHRvbi5sYWJlbFBhdGggfHwgYnV0dG9uLmxhYmVsIHx8IGJ1dHRvbi5uYW1lIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogYnV0dG9uLmxhYmVsIHx8IGJ1dHRvbi5uYW1lIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1dHRvbkNvbmZpZ109XCJidXR0b24uYnV0dG9uQ29uZmlnXCIgW3R5cGVdPVwiYnV0dG9uLnR5cGVcIiBjbGFzcz1cIm1zLTIgbWUtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J0bkljb25MZWZ0U3JjXT1cImJ1dHRvbi5idG5JY29uTGVmdFNyY1wiIFtpc0ltYWdlU3ZnXT1cImJ1dHRvbi5pc0ltYWdlU3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L254dC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1tYXJnaW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3Jlc2l6aW5nJzogaXNSZXNpemluZyB9XCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IG1heEhlaWdodDogaXNQYWdpbmF0aW9uID8gJzQ1MHB4JyA6ICdhdXRvJywgbWluSGVpZ2h0OiBkYXRhU291cmNlLmRhdGEgJiYgZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID09PSAwICYmICFpc0xvYWRpbmcgJiYgZnJvbSAhPT0gJ2Zvcm1CdWlsZGVyJyA/ICcwcHgnIDogJzEwMHB4JyB9XCJcbiAgICAgICAgICAgICAgICAjdGFibGVDb250YWluZXIgKHNjcm9sbCk9XCJvblNjcm9sbCh0YWJsZUNvbnRhaW5lcilcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBUYWJsZSBIZWFkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtaGVhZGVyXCIgW25nQ2xhc3NdPVwieyAnc2hhZG93JzogaXNTY3JvbGxlZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBDaGVja2JveCBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ3aXRoQ2hlY2tCb3hcIiBjbGFzcz1cInRhYmxlLWNlbGwgc3RpY2t5LWNvbHVtbiBoZWFkLWNvbG9yXCIgW3N0eWxlLndpZHRoXT1cIic1MHB4J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIm1hc3RlclRvZ2dsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24/Lmhhc1ZhbHVlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbj8uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TS1MxNUZFQjI1IERhdGEgQ29sdW1ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGN1cnJlbnRDb2x1bW5zOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLnN1bW1hcnlDb2x1bW4gIT09IHRydWUgJiYgY29sdW1uLnN1bW1hcnlSb3cgIT09IHRydWUgJiYgY29sdW1uLmlzSGlkZSAhPT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJsZS1jZWxsIHRhYmxlSGVhZGVyIGhlYWQtY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zdGlja3ktY29sdW1uXT1cImkgPT09IChzdGlja3lDb25kaXRpb24gLSAxKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZS1jb2x1bW5dPVwiYWN0aXZlQ29sdW1uID09PSBjb2x1bW4udW5pcXVlSWRlbnRpZmllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkLWNvbHVtbl09XCJtb2RlID09PSAnZWRpdCcgJiYgaXNFZGl0YWJsZSAmJiBzZWxlY3RlZENvbHVtbiA9PT0gY29sdW1uLnVuaXF1ZUlkZW50aWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IG9uQ29sdW1uQ2xpY2soY29sdW1uLnVuaXF1ZUlkZW50aWZpZXIpOyBjb2x1bW4uc29ydCA/IHNvcnREYXRhKGNvbHVtbi5maWVsZE5hbWUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyZWRDb2x1bW4gPSBjb2x1bW4uZmllbGROYW1lXCIgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZENvbHVtbiA9IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGggfHwgJzEwMHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZsZXhdPVwiJzAgMCAnICsgKGNvbHVtbi53aWR0aCB8fCAnMTAwcHgnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aF09XCInNTBweCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uRGl2XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4taGVhZGVyXCIgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aCB8fCAnMTAwcHgnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBjbG9zZSBidXR0b24gZm9yIHNlbGVjdGVkIGNvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtb2RlID09PSAnZWRpdCcgJiYgaXNFZGl0YWJsZSAmJiBzZWxlY3RlZENvbHVtbiA9PT0gY29sdW1uLnVuaXF1ZUlkZW50aWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xvc2UtY29sdW1uLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgcmVtb3ZlQ29sKGNvbHVtbi51bmlxdWVJZGVudGlmaWVyKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKclVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWxsaXBzaXNcIiBzdHlsZT1cImZsZXg6IDE7XCIgW3RpdGxlXT1cImNvbHVtbi5sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGNvbHVtbi5sYWJlbFBhdGggfHwgY29sdW1uLmxhYmVsIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogY29sdW1uLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImNvbHVtbi5maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBmaWx0ZXIoY29sdW1uLmZpZWxkTmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDJweDtcIiB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEyIDExXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEwLjc1IDEuMjVIMC43NUw0Ljc1IDUuNzE3MjJWOC44MDU1Nkw2Ljc1IDkuNzVWNS43MTcyMkwxMC43NSAxLjI1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjMjQyNTMzXCIgc3Ryb2tlLXdpZHRoPVwiMS4yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TS1MxNUZFQjI1IFJlZCBkb3QgZm9yIGFjdGl2ZSBmaWx0ZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZmlsdGVyRGF0YUFycmF5ICYmIGZpbHRlckRhdGFBcnJheVtjb2x1bW4uZmllbGROYW1lXT8ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeD1cIjlcIiBjeT1cIjJcIiByPVwiMi41XCIgZmlsbD1cInJlZFwiPjwvY2lyY2xlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2x1bW4uc29ydFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic29ydC1pbmRpY2F0b3JzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY3VycmVudFNvcnRDb2x1bW4gPT09IGNvbHVtbi5maWVsZE5hbWVcIiBjbGFzcz1cInNvcnQtZGlyZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjdXJyZW50U29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAn4oaRJyA6IGN1cnJlbnRTb3J0RGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gJ2Rlc2MnID8gJ+KGkycgOiAnJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImhvdmVyZWRDb2x1bW4gPT09IGNvbHVtbi5maWVsZE5hbWUgJiYgY3VycmVudFNvcnRDb2x1bW4gIT09IGNvbHVtbi5maWVsZE5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzb3J0LWRpcmVjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4oaRXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VhcmNoRmlsdGVyICYmIGNvbHVtbi5maWVsZE5hbWUgPT09IHNlbGVjdGVkRmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtY29tcG9uZW50IHBvc2l0aW9uLWFic29sdXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZzZWFyY2hcIiBbY2xhc3MucmVzaXplZF09XCJpc1Jlc2l6ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmc2VhcmNoLWJhclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJzZWFyY2hTdmdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDIyXCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjY0MTMgMTkuMjVDMTYuNjMyMiAxOS4yNSAyMC42NzgxIDE1LjM1MTEgMjAuNjc4MSAxMC41NDE3QzIwLjY3ODEgNS43MzIxOCAxNi42MzIyIDEuODMzMzMgMTEuNjQxMyAxLjgzMzMzQzYuNjUwNCAxLjgzMzMzIDIuNjA0NDkgNS43MzIxOCAyLjYwNDQ5IDEwLjU0MTdDMi42MDQ0OSAxNS4zNTExIDYuNjUwNCAxOS4yNSAxMS42NDEzIDE5LjI1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNzg3NDg2XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIxLjYyOTUgMjAuMTY2N0wxOS43MjcxIDE4LjMzMzNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzc4NzQ4NlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ3aWR0aC0xMDBcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ0FQUC5TRUFSQ0gnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NlYXJjaCcgIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2hpbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiaXNSZXNpemVkXCIgKGNsaWNrKT1cImNsb3NlZmlsdGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbG9zZS1pY29uXCIgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTkuMTY5OTggMTQuODNMMTQuODMgOS4xNzAwMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE0LjgzIDE0LjgzTDkuMTY5OTggOS4xNzAwMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOSAyMkgxNUMyMCAyMiAyMiAyMCAyMiAxNVY5QzIyIDQgMjAgMiAxNSAySDlDNCAyIDIgNCAyIDlWMTVDMiAyMCA0IDIyIDkgMjJaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1jb250ZW50XCIgW3N0eWxlXT1cIidvdmVyZmxvdy15OiBhdXRvJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkYXRhIG9mIGZpbHRlckFycmF5IHwgc2VhcmNoRmlsdGVyIDogc2VhcmNoVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgbWItMyBjaGVja2JveGRpdlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJnYXA6IDVweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChkYXRhKVwiIFt2YWx1ZV09XCJkYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImRhdGFcIiAoY2hhbmdlKT1cImNoZWNrZWREYXRhKGRhdGEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1zLTIgbGFiZWwtZGF0YVwiPnt7ZGF0YX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW5oYW5jZWQgcmVzaXplIGhhbmRsZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc2l6ZS1oYW5kbGVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJlc2l6ZVN0YXJ0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkRyYWcgdG8gcmVzaXplIGNvbHVtblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TS1MxNUZFQjI1IEFjdGlvbiBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3Rpb25CdXR0b24gfHwgaXNEZWxldGVSb3cgfHwgaXNFZGl0Um93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFibGUtY2VsbCBoZWFkLWNvbG9yIGFjdGlvbkNvbCBzdGlja3ktY29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInMTUwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogMTJweCAhaW1wb3J0YW50O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgYWN0aW9uQ29sdW1IZWFkZXIgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQWN0aW9uJ319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TS1MxNUZFQjI1IFRhYmxlIEJvZHkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9keVwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGVsZW1lbnQgb2YgZGF0YVNvdXJjZS5kYXRhOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJ0YWJsZS1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidGFibGVDbGljayhlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBDaGVja2JveCBDZWxsIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwid2l0aENoZWNrQm94XCIgY2xhc3M9XCJ0YWJsZS1jZWxsIHN0aWNreS1jb2x1bW4gYm9keS1jb2xvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXBhcmF0ZVJvd1NlbGVjdChzZWxlY3Rpb24udG9nZ2xlKGVsZW1lbnQpLCBlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmlzU2VsZWN0ZWQoZWxlbWVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoZWxlbWVudC5pc1BheVByb2Nlc3NlZCA9PT0gdHJ1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNLUzE1RkVCMjUgRGF0YSBDZWxscyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGN1cnJlbnRDb2x1bW5zOyBsZXQgbGFzdCA9IGxhc3Q7IGVsbGlwc2lzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLnN1bW1hcnlDb2x1bW4gIT09IHRydWUgJiYgY29sdW1uLnN1bW1hcnlSb3cgIT09IHRydWUgJiYgY29sdW1uLmlzSGlkZSAhPT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0YWJsZS1jZWxsIGJvZHktY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZC1jZWxsXT1cIm1vZGUgPT09ICdlZGl0JyAmJiBpc0VkaXRhYmxlICYmIHNlbGVjdGVkQ29sdW1uID09PSBjb2x1bW4udW5pcXVlSWRlbnRpZmllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aCB8fCAnMTAwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleF09XCInMCAwICcgKyAoY29sdW1uLndpZHRoIHx8ICcxMDBweCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cIic1MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aF09XCJjb2x1bW4ud2lkdGggfHwgJzEwMHB4J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjJKVUwyNSBjYWxlbmRhciAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdjYWxlbmRhcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxhcHAtY3VzdG9tLWNhbGVuZGFyIFtxdWVzdGlvbl09XCJnZXRVcGRhdGVkUXVlc3Rpb24oY29sdW1uLmZpZWxkTmFtZSwgZWxlbWVudCwgaSlcIiAoZXZlbnRTZWxlY3RlZCk9XCJnZXRDYWxlbmRhckV2ZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0ZVNlbGVjdGVkKT1cImdldEN1cnJlbnRDYWxlbmRhcigkZXZlbnQpXCIgKG9wZW5Nb2RhbCk9XCJvcGVuQ2FsZW5kYXJNb2RhbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsb3NlTW9kYWwpPVwiY2xvc2VDYWxlbmRhck1vZGFsKCRldmVudClcIj48L2FwcC1jdXN0b20tY2FsZW5kYXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1jdXN0b20tbW9kZWwgKm5nSWY9XCJpc0NhbGVuZGFyTW9kYWxPcGVuXCIgW21vZGFsVGl0bGVdPVwiY2FsZW5kYXJNb2RhbFRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzTW9kYWxPcGVuXT1cImlzQ2FsZW5kYXJNb2RhbE9wZW5cIiBbbW9kYWxTaXplXT1cImNhbGVuZGFyTW9kYWxTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhdmVCdXR0b25WYWx1ZV09XCJjYWxlbmRhclNhdmVCdXR0b25WYWx1ZVwiIFttb2RhbEZvb3Rlcl09XCJtb2RhbENhbGVuZGFyTW9kYWxGb290ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2F2ZUJ1dHRvbkVtaXQpPVwib25DYWxlbmRhck1vZGFsU2F2ZSgpXCIgKGNhbmNlbEJ1dHRvbkVtaXQpPVwiY2xvc2VDYWxlbmRhck1vZGFsKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1xdWVzdGlvbmJvb2sgW3FiSXRlbV09XCJxYlJlZnJlbmNlQm9va1wiIFtxdWVzdGlvbnNdPVwicmVmZXJlbmNlUXVlc3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYW5kbGVRdWVzdGlvbik9XCJoYW5kbGVRdWVzdGlvbkV2ZW50KCRldmVudClcIj48L2xpYi1xdWVzdGlvbmJvb2s+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtY3VzdG9tLW1vZGVsPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgZm9yIHBpY2sgbG9jYXRpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLXBpY2stbG9jYXRpb24gICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdsb2NhdGlvbidcIiBbYXBpS2V5XT1cImNvbHVtblsnYXBpS2V5J11cIiBbYWRkcmVzc109XCJxdWVzdGlvbi5zZWxlY3RlZFZhbHVlXCIgW3F1ZXN0aW9uXT1cImdldFVwZGF0ZWRRdWVzdGlvbihjb2x1bW4uZmllbGROYW1lLCBlbGVtZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJyAmJiBlbGVtZW50LmVkaXRSb3cgJiYgIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seSA/ICdlZGl0JyA6ICd2aWV3J1wiIFtmcm9tXT1cIidueHRUYWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2NhdGlvblNlbGVjdGVkKT1cInVwZGF0ZUVkaXQoaSwkZXZlbnQsZWxlbWVudCxjb2x1bW4uZmllbGROYW1lKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtcGljay1sb2NhdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyMkpVTDI1IEltYWdlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnaW1hZ2UnXCIgKG1vdXNlZW50ZXIpPVwiaXNJbWFnZUhvdmVyID0gdHJ1ZTtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImlzSW1hZ2VIb3ZlciA9IGZhbHNlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cImlzSW1hZ2VIb3ZlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBlbmQ7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhY29sdW1uLnF1ZXN0aW9uPy5pc1JlYWRPbmx5XCIgKGNsaWNrKT1cIm9uSW1hZ2VFZGl0KGNvbHVtbi5xdWVzdGlvbilcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTExLjEwNjcgNi4wNzE3NEw5LjkyODMzIDQuODkzNEwyLjE2NjY3IDEyLjY1NTFWMTMuODMzNEgzLjM0NUwxMS4xMDY3IDYuMDcxNzRaTTEyLjI4NSA0Ljg5MzRMMTMuNDYzMyAzLjcxNTA3TDEyLjI4NSAyLjUzNjc0TDExLjEwNjcgMy43MTUwN0wxMi4yODUgNC44OTM0Wk00LjAzNSAxNS41MDAxSDAuNVYxMS45NjQyTDExLjY5NTggMC43Njg0MDNDMTEuODUyMSAwLjYxMjE3NyAxMi4wNjQgMC41MjQ0MTQgMTIuMjg1IDAuNTI0NDE0QzEyLjUwNiAwLjUyNDQxNCAxMi43MTc5IDAuNjEyMTc3IDEyLjg3NDIgMC43Njg0MDNMMTUuMjMxNyAzLjEyNTlDMTUuMzg3OSAzLjI4MjE4IDE1LjQ3NTcgMy40OTQxIDE1LjQ3NTcgMy43MTUwN0MxNS40NzU3IDMuOTM2MDQgMTUuMzg3OSA0LjE0Nzk2IDE1LjIzMTcgNC4zMDQyNEw0LjAzNTgzIDE1LjUwMDFINC4wMzVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzZDNzU3RFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seVwiIChjbGljayk9XCJvbkltYWdlRGVsZXRlKGNvbHVtbi5xdWVzdGlvbilcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0IDMuOTg3MjZDMTEuNzggMy43NjcyNiA5LjU0NjY3IDMuNjUzOTMgNy4zMiAzLjY1MzkzQzYgMy42NTM5MyA0LjY4IDMuNzIwNiAzLjM2IDMuODUzOTNMMiAzLjk4NzI2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk01LjY2NjUgMy4zMTM2Mkw1LjgxMzE3IDIuNDQwMjhDNS45MTk4NCAxLjgwNjk1IDUuOTk5ODQgMS4zMzM2MiA3LjEyNjUgMS4zMzM2Mkg4Ljg3MzE3QzkuOTk5ODQgMS4zMzM2MiAxMC4wODY1IDEuODMzNjIgMTAuMTg2NSAyLjQ0Njk1TDEwLjMzMzIgMy4zMTM2MlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIuNTY2NyA2LjA5Mzc1TDEyLjEzMzQgMTIuODA3MUMxMi4wNiAxMy44NTM3IDEyIDE0LjY2NzEgMTAuMTQgMTQuNjY3MUg1Ljg2MDAyQzQuMDAwMDIgMTQuNjY3MSAzLjk0MDAyIDEzLjg1MzcgMy44NjY2OCAxMi44MDcxTDMuNDMzMzUgNi4wOTM3NVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi4zMzM1IDguMzMzMjVIOS42NjY4M1wiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiY29sdW1uLnF1ZXN0aW9uPy5pc1JlYWRPbmx5XCIgW3NyY109XCJjb2x1bW4ucXVlc3Rpb24/LmltYWdlRGF0YVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seVwiIGNsYXNzPVwibG9nby1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nbyBwcmV2aWV3IGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ28tcHJldmlld1wiICpuZ0lmPVwiY29sdW1uLnF1ZXN0aW9uPy5pbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImNvbHVtbi5xdWVzdGlvbj8uaW1hZ2VEYXRhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBsb2FkIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5xdWVzdGlvbj8uaW1hZ2VEYXRhXCIgY2xhc3M9XCJsb2dvLXVwbG9hZC1wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImxvZ28tdXBsb2FkLXt7aX19XCIgY2xhc3M9XCJsb2dvLXVwbG9hZC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL0ltYWdlLnN2Z1wiIGFsdD1cIlVwbG9hZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+VXBsb2FkIEltYWdlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwibG9nby11cGxvYWQte3tpfX1cIiBhY2NlcHQ9XCJpbWFnZS8qXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudChjb2x1bW4ucXVlc3Rpb24sICRldmVudClcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgaWNvbi1zZWxlY3RvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxueHQtaWNvbi1zZWxlY3RvciBbYWxsSWNvbnNdPVwiYWxsSWNvbnNcIiAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnaWNvbidcIiBbcmVxdWlyZWRdPVwiY29sdW1uLnF1ZXN0aW9uPy5pc09wdGlvbmFsXCIgW21vZGVdPVwibW9kZVwiIFtxdWVzdGlvbl09XCJnZXRVcGRhdGVkUXVlc3Rpb24oY29sdW1uLmZpZWxkTmFtZSwgZWxlbWVudCwgaSlcIiBbbGFiZWxGb250XT1cImNvbHVtbi5xdWVzdGlvbj8uZm9udFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5xdWVzdGlvbj8ucXVlc3Rpb25UZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxDb2xvcl09XCJjb2x1bW4ucXVlc3Rpb24/LmZvbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsU2l6ZV09XCJjb2x1bW4ucXVlc3Rpb24/LmZvbnRTaXplXCIgW2xhYmVsV2VpZ2h0XT1cImNvbHVtbi5xdWVzdGlvbj8uZm9udFdlaWdodFwiIFtzaG93TGFiZWxdPVwiY29sdW1uLnF1ZXN0aW9uPy5zdHlsZT8uc2hvd0xhYmVsXCIgKGljb25TZWxlY3RlZCk9XCJ1cGRhdGVFZGl0KGksJGV2ZW50LGVsZW1lbnQsY29sdW1uLmZpZWxkTmFtZSlcIj48L254dC1pY29uLXNlbGVjdG9yPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgbGluZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnbGluZSdcIiBjbGFzcz1cImN1c3RvbS1saW5lXCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgZGF0YSB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxueHQtZGF0YXRhYmxlICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICd0YWJsZSdcIiBpc0VkaXRSb3cgaXNEZWxldGVSb3cgYWN0aW9uQnV0dG9uIGlzQnV0dG9ucyBbcXVlc3Rpb25dPVwiZ2V0VXBkYXRlZFF1ZXN0aW9uKGNvbHVtbi5maWVsZE5hbWUsIGVsZW1lbnQsIGkpXCIgZnJvbT1cImZvcm1CdWlsZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwidXBkYXRlRWRpdChpLCRldmVudC5kYXRhLGVsZW1lbnQsY29sdW1uLmZpZWxkTmFtZSlcIiBbYXBpTWV0YV09XCJjb2x1bW4ucXVlc3Rpb24/LnN1YlRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlXT1cImZyb20gPT09ICdmb3JtQnVpbGRlcicgJiYgZWxlbWVudC5lZGl0Um93ICYmICFjb2x1bW4ucXVlc3Rpb24/LmlzUmVhZE9ubHkgPyAnZWRpdCcgOiAndmlldydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YWJsZUNvbmZpZ109XCJjb2x1bW4ucXVlc3Rpb24/LnRhYmxlQ29uZmlnXCIgdGFibGVJZD1cIlwiIGRpcmVjdGlvbj1cImx0clwiIHRhYmxlV2lkdGg9XCJhdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L254dC1kYXRhdGFibGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgbGlzdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxueHQtc2VhcmNoLWJveCAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2xpc3QnXCIgW3F1ZXN0aW9uXT1cImdldFVwZGF0ZWRRdWVzdGlvbihjb2x1bW4uZmllbGROYW1lLCBlbGVtZW50LCBpKVwiIFtyZWFkT25seV09XCJjb2x1bW4ucXVlc3Rpb24/LmlzUmVhZE9ubHlcIiBbYXBpTWV0YV09XCJjb2x1bW4ucXVlc3Rpb24/LnN1YlRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJjb2x1bW4ucXVlc3Rpb24/LmlkXCIgW3BsYWNlSG9sZGVyVGV4dF09XCJjb2x1bW4ucXVlc3Rpb24/LnF1ZXN0aW9uIHx8ICcnXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJyAmJiBlbGVtZW50LmVkaXRSb3cgJiYgIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seSA/ICdlZGl0JyA6ICd2aWV3J1wiIFtmcm9tXT1cIidueHRUYWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWFyY2hWYWx1ZUNoYW5nZSk9XCJ1cGRhdGVFZGl0KGksJGV2ZW50LGVsZW1lbnQsY29sdW1uLmZpZWxkTmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbnh0LXNlYXJjaC1ib3g+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjJKVUwyNSBEcm9wZG93biAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtY3VzdG9tLWRyb3Bkb3duICpuZ0lmPVwiY29sdW1uPy50eXBlID09PSAnZHJvcGRvd24nICYmIGNvbHVtbi5xdWVzdGlvbj8ub3B0aW9uc1wiIFtvcHRpb25zXT1cImNvbHVtbi5xdWVzdGlvbj8ub3B0aW9uc1wiIFthcGlNZXRhXT1cImNvbHVtbi5xdWVzdGlvbj8uc3ViVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cImNvbHVtbi5xdWVzdGlvbj8uaWRcIiBbc2VsZWN0ZWRWYWx1ZV09XCJjb2x1bW4uaXNTaGVuZ2VsID8gY29sdW1uLnF1ZXN0aW9uPy5pbnB1dCA6IGNvbHVtbi5xdWVzdGlvbj8uc2VsZWN0ZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlcnJvck1lc3NhZ2VdPVwiY29sdW1uLnF1ZXN0aW9uPy5lcnJvck1lc3NhZ2VcIiBbZXJyb3JdPVwiY29sdW1uLnF1ZXN0aW9uPy5lcnJvclwiIFtyZWZlcmVuY2VGaWVsZF09XCJjb2x1bW4ucXVlc3Rpb24/LnJlZmVyZW5jZUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29sdW1uLnF1ZXN0aW9uPy5pc1JlYWRPbmx5XCIgW3F1ZXN0aW9uXT1cImdldFVwZGF0ZWRRdWVzdGlvbihjb2x1bW4uZmllbGROYW1lLCBlbGVtZW50LCBpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJyAmJiBlbGVtZW50LmVkaXRSb3cgJiYgIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seSA/ICdlZGl0JyA6ICd2aWV3J1wiIFtmcm9tXT1cIidueHRUYWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ1cGRhdGVFZGl0KGksJGV2ZW50LGVsZW1lbnQsY29sdW1uLmZpZWxkTmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjJKVUwyNSBjdXN0b20tcmFkaW8gY29tcG9uZW50IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi50eXBlID09PSAncmFkaW8nICYmIGNvbHVtbi5xdWVzdGlvbj8ub3B0aW9uc1wiIGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1jdXN0b20tcmFkaW8gW29wdGlvbnNdPVwiY29sdW1uLnF1ZXN0aW9uPy5vcHRpb25zXCIgW3F1ZXN0aW9uXT1cImdldFVwZGF0ZWRRdWVzdGlvbihjb2x1bW4uZmllbGROYW1lLCBlbGVtZW50LCBpKVwiIFthcGlNZXRhXT1cImNvbHVtbi5xdWVzdGlvbj8uc3ViVGV4dFwiIFtpZF09XCJjb2x1bW4ucXVlc3Rpb24/LmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVdPVwiY29sdW1uLnF1ZXN0aW9uPy5zZWxlY3RlZFZhbHVlXCIgW2Vycm9yTWVzc2FnZV09XCJjb2x1bW4ucXVlc3Rpb24/LmVycm9yTWVzc2FnZVwiIFtlcnJvcl09XCJjb2x1bW4ucXVlc3Rpb24/LmVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlZmVyZW5jZUZpZWxkXT1cImNvbHVtbi5xdWVzdGlvbj8ucmVmZXJlbmNlRmllbGRcIiBbcmVhZE9ubHldPVwiY29sdW1uLnF1ZXN0aW9uPy5pc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJyAmJiBlbGVtZW50LmVkaXRSb3cgJiYgIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seSA/ICdlZGl0JyA6ICd2aWV3J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ1cGRhdGVFZGl0KGksJGV2ZW50LGVsZW1lbnQsY29sdW1uLmZpZWxkTmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC1jdXN0b20tcmFkaW8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyMkpVTDI1IEF0dGFjaG1lbnQgLyBGaWxlcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtZmlsZS11cGxvYWQgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2ZpbGUnXCIgW2xpbWl0RmlsZVVwbG9hZGluZ109XCI1XCIgW2Vycm9yXT1cImNvbHVtbi5xdWVzdGlvbj8uZXJyb3JcIiBbcXVlc3Rpb25dPVwiZ2V0VXBkYXRlZFF1ZXN0aW9uKGNvbHVtbi5maWVsZE5hbWUsIGVsZW1lbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZV09XCJmcm9tID09PSAnZm9ybUJ1aWxkZXInICYmIGVsZW1lbnQuZWRpdFJvdyAmJiAhY29sdW1uLnF1ZXN0aW9uPy5pc1JlYWRPbmx5ID8gJ2VkaXQnIDogJ3ZpZXcnXCIgW2Zyb21dPVwiJ254dFRhYmxlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsbEZpbGVzXT1cImNvbHVtbi5xdWVzdGlvbj8uaW5wdXRcIiAoc2VsZWN0ZWRGaWxlRGF0YSk9XCJ1cGRhdGVFZGl0KGksJGV2ZW50LnZhbHVlLGVsZW1lbnQsY29sdW1uLmZpZWxkTmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWZpbGUtdXBsb2FkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyMkpVTDI1IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxueHQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2J1dHRvbidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlXT1cImZyb20gPT09ICdmb3JtQnVpbGRlcicgJiYgZWxlbWVudC5lZGl0Um93ICYmICFjb2x1bW4ucXVlc3Rpb24/LmlzUmVhZE9ubHkgPyAnZWRpdCcgOiAndmlldydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidG5IZWlnaHRdPVwiJzUwcHgnXCIgW2J0bldpZHRoXT1cIicxNTBweCdcIiBbYnV0dG9uVmFsdWVdPVwiY29sdW1uLnF1ZXN0aW9uPy5xdWVzdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbkNsaWNrRW1pdCk9XCJ1cGRhdGVFZGl0KGksJGV2ZW50LGVsZW1lbnQsY29sdW1uLmZpZWxkTmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbnh0LWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjJKVUwyNSBib29rIHR5cGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxsaWItcXVlc3Rpb25ib29rICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdib29rJ1wiIFtxYkl0ZW1dPVwiY29sdW1uLnF1ZXN0aW9uPy5xYkl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVzdGlvbnNdPVwicmVhZFF1ZXN0aW9ucyhjb2x1bW4ucXVlc3Rpb24/LnFiUmVmZXJlbmNlLCBjb2x1bW4ucXVlc3Rpb24/LnFiUmVmZXJlbmNlUXVlc3Rpb25zKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhbmRsZURyb3BEb3duKT1cImdldERyb3BEb3duKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGliLXF1ZXN0aW9uYm9vaz4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgVGV4dCwgRW1haWwsIGxhYmVsLCBudW1iZXIsIEJvb2xlYW4sIHJpY2ggdGV4dCBlZGl0b3IsIERhdGVUaW1lLCBEYXRlLCBUaW1lLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnh0LWlucHV0ICAqbmdJZj1cImNvbHVtbi50eXBlID09PSB1bmRlZmluZWQgfHwgY29sdW1uLnR5cGUgPT09ICd0ZXh0JyB8fCBjb2x1bW4udHlwZSA9PT0gJ2VtYWlsJyB8fCBjb2x1bW4udHlwZSA9PT0gJ251bWJlcicgfHwgY29sdW1uLnR5cGUgPT09ICdsYWJlbCcgfHwgY29sdW1uLnR5cGUgPT09ICdib29sZWFuJyB8fCBjb2x1bW4udHlwZSA9PT0gJ3JpY2h0ZXh0YXJlYScgfHwgY29sdW1uLnR5cGUgPT09ICdkYXRldGltZScgfHwgY29sdW1uLnR5cGUgPT09ICdkYXRlJyB8fCBjb2x1bW4udHlwZSA9PT0gJ3RpbWUnIHx8IGNvbHVtbi50eXBlID09PSAndGV4dGFyZWEnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJjb2x1bW4udHlwZSA9PT0gJ2Jvb2xlYW4nID8gJ2NoZWNrYm94JyA6IGNvbHVtbi50eXBlID09PSAncmljaHRleHRhcmVhJyA/ICdyaWNodGV4dCcgOiBjb2x1bW4udHlwZSA9PT0gdW5kZWZpbmVkID8gJ3RleHQnIDogY29sdW1uLnR5cGUgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZV09XCJmcm9tID09PSAnZm9ybUJ1aWxkZXInICYmIGVsZW1lbnQuZWRpdFJvdyAmJiAhY29sdW1uLnF1ZXN0aW9uPy5pc1JlYWRPbmx5ID8gJ2VkaXQnIDogJ3ZpZXcnXCIgW2Zyb21dPVwiJ254dFRhYmxlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImVsZW1lbnQgfCBnZXRWYWx1ZTogY29sdW1uLmZpZWxkTmFtZSBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoeXBlckxpbmtdPVwiY29sdW1uLmh5cGVyTGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh5cGVybGlua0VtaXQpPVwib25DbGlja0h5cGVybGluayhjb2x1bW4uZmllbGROYW1lLGVsZW1lbnQsIGNvbHVtbi5oeXBlckxpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25dPVwiZ2V0VXBkYXRlZFF1ZXN0aW9uKGNvbHVtbi5maWVsZE5hbWUsIGVsZW1lbnQsIGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxGb250XT1cImNvbHVtbi5xdWVzdGlvbj8uZm9udFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5xdWVzdGlvbj8ucXVlc3Rpb25UZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxDb2xvcl09XCJjb2x1bW4ucXVlc3Rpb24/LmZvbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsU2l6ZV09XCJjb2x1bW4ucXVlc3Rpb24/LmZvbnRTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRWYWx1ZVNpemVdPVwiY29sdW1uLnF1ZXN0aW9uPy5mb250U2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsV2VpZ2h0XT1cImNvbHVtbi5xdWVzdGlvbj8uZm9udFdlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0V2VpZ2h0XT1cImNvbHVtbi5xdWVzdGlvbj8uZm9udFdlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dMYWJlbF09XCJjb2x1bW4ucXVlc3Rpb24/LnN0eWxlPy5zaG93TGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Qm9yZGVyPVwibm9uZVwiIHN2Z0hlaWdodD1cIjIwcHhcIiBzdmdXaWR0aD1cIjIwcHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb2x1bW4ucXVlc3Rpb24/LnF1ZXN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnF1ZXN0aW9uPy5pc09wdGlvbmFsXCIgaW5wdXRCZ0NvbG9yPVwiI0ZBRkFGQVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0SWRdPVwiY29sdW1uLnF1ZXN0aW9uPy50cmFja2luZ0lkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXJyb3JNZXNzYWdlc109XCJ7IHJlcXVpcmVkOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0SWNvbkxlZnRTcmNdPVwiY29sdW1uLnF1ZXN0aW9uPy5pY29uTGVmdFNyY1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5EYXRlXT1cImNvbHVtbi5xdWVzdGlvbj8ubWluRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0VmFsdWUpPVwidXBkYXRlRWRpdChpLCRldmVudC52YWx1ZSxlbGVtZW50LGNvbHVtbi5maWVsZE5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L254dC1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNLUzE1RkVCMjUgQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3Rpb25CdXR0b24gfHwgaXNEZWxldGVSb3cgfHwgaXNFZGl0Um93XCIgY2xhc3M9XCJ0YWJsZS1jZWxsIGFjdGlvbkNvbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbkJ1dHRvblwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TS1MxNUZFQjI1IEVkaXQgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0VkaXRSb3dcIiBjbGFzcz1cImVpY29uLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyAnQVBQLkVESVRfUkVDT1JEJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdFZGl0IFJlY29yZCcgIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAycHg7IGJvcmRlcjogMXB4IHNvbGlkICNkY2RjZGM7IGJvcmRlci1yYWRpdXM6IDVweDsgbWFyZ2luLWxlZnQ6IDNweDsgbWFyZ2luLXJpZ2h0OiAzcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgZWRpdC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogMnB4IDRweDsgYm9yZGVyLXJhZGl1czogNXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAoY2xpY2spPVwib25FZGl0KGVsZW1lbnQpXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS4xMDY3IDYuMDcxNzRMOS45MjgzMyA0Ljg5MzRMMi4xNjY2NyAxMi42NTUxVjEzLjgzMzRIMy4zNDVMMTEuMTA2NyA2LjA3MTc0Wk0xMi4yODUgNC44OTM0TDEzLjQ2MzMgMy43MTUwN0wxMi4yODUgMi41MzY3NEwxMS4xMDY3IDMuNzE1MDdMMTIuMjg1IDQuODkzNFpNNC4wMzUgMTUuNTAwMUgwLjVWMTEuOTY0MkwxMS42OTU4IDAuNzY4NDAzQzExLjg1MjEgMC42MTIxNzcgMTIuMDY0IDAuNTI0NDE0IDEyLjI4NSAwLjUyNDQxNEMxMi41MDYgMC41MjQ0MTQgMTIuNzE3OSAwLjYxMjE3NyAxMi44NzQyIDAuNzY4NDAzTDE1LjIzMTcgMy4xMjU5QzE1LjM4NzkgMy4yODIxOCAxNS40NzU3IDMuNDk0MSAxNS40NzU3IDMuNzE1MDdDMTUuNDc1NyAzLjkzNjA0IDE1LjM4NzkgNC4xNDc5NiAxNS4yMzE3IDQuMzA0MjRMNC4wMzU4MyAxNS41MDAxSDQuMDM1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjNkM3NTdEXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNLUzE1RkVCMjUgRGVsZXRlIEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNEZWxldGVSb3dcIiBjbGFzcz1cImRpY29uLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cIidBUFAuREVMRVRFX1JFQ09SRCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRGVsZXRlIFJlY29yZCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDJweDsgYm9yZGVyOiAxcHggc29saWQgI2ZmYjViNTsgYm9yZGVyLXJhZGl1czogNXB4OyBtYXJnaW4tbGVmdDogM3B4OyBtYXJnaW4tcmlnaHQ6IDNweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlbGV0ZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogMnB4IDRweDsgYm9yZGVyLXJhZGl1czogNXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmVlZWVkO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAoY2xpY2spPVwiZGVsZXRlUmVjb3JkKGVsZW1lbnQsaSlcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE0IDMuOTg3MjZDMTEuNzggMy43NjcyNiA5LjU0NjY3IDMuNjUzOTMgNy4zMiAzLjY1MzkzQzYgMy42NTM5MyA0LjY4IDMuNzIwNiAzLjM2IDMuODUzOTNMMiAzLjk4NzI2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk01LjY2NjUgMy4zMTM2Mkw1LjgxMzE3IDIuNDQwMjhDNS45MTk4NCAxLjgwNjk1IDUuOTk5ODQgMS4zMzM2MiA3LjEyNjUgMS4zMzM2Mkg4Ljg3MzE3QzkuOTk5ODQgMS4zMzM2MiAxMC4wODY1IDEuODMzNjIgMTAuMTg2NSAyLjQ0Njk1TDEwLjMzMzIgMy4zMTM2MlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTIuNTY2NyA2LjA5Mzc1TDEyLjEzMzQgMTIuODA3MUMxMi4wNiAxMy44NTM3IDEyIDE0LjY2NzEgMTAuMTQgMTQuNjY3MUg1Ljg2MDAyQzQuMDAwMDIgMTQuNjY3MSAzLjk0MDAyIDEzLjg1MzcgMy44NjY2OCAxMi44MDcxTDMuNDMzMzUgNi4wOTM3NVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi44ODY0NyAxMS4wMDA0SDkuMTA2NDdcIiBzdHJva2U9XCIjRkYyQzEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMzMzNSA4LjMzMzI1SDkuNjY2ODNcIiBzdHJva2U9XCIjRkYyQzEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TS1MxNUZFQjI1IFJlbmRlciBpbmxpbmUgYnV0dG9ucyB1cCB0byBTaXplIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBhY3Rpb25CdXR0b25BcnJheT8uYnV0dG9uQXJyYXk7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImkgPCBhY3Rpb25CdXR0b25BcnJheT8uc2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIiBtYXJnaW4tbGVmdDogM3B4OyBtYXJnaW4tcmlnaHQ6IDNweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0NvbmRpdGlvbk1ldChlbGVtZW50LCBidXR0b24uY29uZGl0aW9ucylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImJ1dHRvbi50b29sdGlwUGF0aCB8fCBidXR0b24udG9vbHRpcCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IGJ1dHRvbi50b29sdGlwIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkJ1dHRvbkNsaWNrZWQoYnV0dG9uLGVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCIkZXZlbnQudGFyZ2V0LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgJyArIGJ1dHRvbi5ob3ZlckJvcmRlckNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCIkZXZlbnQudGFyZ2V0LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgJyArIGJ1dHRvbi5ib3JkZXJDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAycHg7IGJvcmRlci1yYWRpdXM6IHt7YnV0dG9uLmJvcmRlclJhZGl1c319cHg7ICBib3JkZXI6IDFweCBzb2xpZCB7e2J1dHRvbi5ib3JkZXJDb2xvcn19O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKG1vdXNlZW50ZXIpPVwiJGV2ZW50LnRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBidXR0b24uaG92ZXJCYWNrZ3JvdW5kQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCIkZXZlbnQudGFyZ2V0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJ1dHRvbi5iYWNrZ3JvdW5kQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IHt7YnV0dG9uLnBhZGRpbmd9fXB4IHt7YnV0dG9uLnBhZGRpbmcgKyAyfX1weDsgYm9yZGVyLXJhZGl1czoge3tidXR0b24uYm9yZGVyUmFkaXVzfX1weDsgYmFja2dyb3VuZC1jb2xvcjoge3tidXR0b24uYmFja2dyb3VuZENvbG9yfX07XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJidXR0b24uaWNvblNyY1wiICNpbWdFbGVtZW50IFtzcmNdPVwiYnV0dG9uLmljb25TcmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiaW1nRWxlbWVudC5zcmMgPSBidXR0b24uaG92ZXJJY29uU3JjIHx8IGJ1dHRvbi5pY29uU3JjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImltZ0VsZW1lbnQuc3JjID0gYnV0dG9uLmljb25TcmNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcGRvd25BY3Rpb25CdXR0b24gJiYgZHJvcGRvd25BY3Rpb25CdXR0b24ubGVuZ3RoID4gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcGRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNsaWNrYWJsZS1pbWdcIiAoY2xpY2spPVwidG9nZ2xlRHJvcGRvd24oaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCIgbWFyZ2luLWxlZnQ6IDNweDsgbWFyZ2luLXJpZ2h0OiAzcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OyBwYWRkaW5nOiAycHggNHB4OyBib3JkZXItcmFkaXVzOiA1cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7IGJvcmRlci1yYWRpdXM6IDVweDsgYm9yZGVyOiAxcHggc29saWQgIzZjNzU3ZDtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDQwIDQwXCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTE5Ljk5OTkgMjUuNjY2N0MyMy42ODE4IDI1LjY2NjcgMjYuNjY2NiAyMi42ODE5IDI2LjY2NjYgMTlDMjYuNjY2NiAxNS4zMTgxIDIzLjY4MTggMTIuMzMzNCAxOS45OTk5IDEyLjMzMzRDMTYuMzE4IDEyLjMzMzQgMTMuMzMzMyAxNS4zMTgxIDEzLjMzMzMgMTlDMTMuMzMzMyAyMi42ODE5IDE2LjMxOCAyNS42NjY3IDE5Ljk5OTkgMjUuNjY2N1pcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMyOTJEMzJcIiBzdHJva2U9XCIjMjkyRDMyXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1taXRlcmxpbWl0PVwiMTBcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNy42NDY3IDE4LjE2TDIwLjAwMDEgMjAuNTA2N0wyMi4zNTM0IDE4LjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIndoaXRlXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnJpZ2h0XT1cIigoYWN0aW9uQnV0dG9uQXJyYXk/LnNpemUgPz8gMCkgLSAoYWN0aW9uQnV0dG9uQXJyYXk/LmJ1dHRvbkFycmF5Py5zaXplID8/IDApICsgKGlzRWRpdFJvdyA/IDEgOiAwKSArIChpc0RlbGV0ZVJvdyA/IDEgOiAwKSArIChkcm9wZG93bkFjdGlvbkJ1dHRvbj8ubGVuZ3RoID4gMCA/IDEgOiAwKSkgKiAxMDAgKyAnJSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50T3BlbkluZGV4ID09PSBpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBidG4gb2YgZHJvcGRvd25BY3Rpb25CdXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNDb25kaXRpb25NZXQoZWxlbWVudCwgYnRuLmNvbmRpdGlvbnMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1pZF09XCJlbGVtZW50LmlkXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4taWNvbiB7e2J0bi5idXR0b25UeXBlfX0gdG9vbHRpcC1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJidG4udG9vbHRpcFBhdGggfHwgYnRuLnRvb2x0aXAgfCBueHRDdXN0b21UcmFuc2xhdGUgOiBidG4udG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidG4uYnV0dG9uRGlzYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25CdXR0b25DbGlja2VkKGJ0bixlbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiYnRuLmljb25TcmNcIiBbc3JjXT1cImJ0bi5pY29uU3JjXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmYy1idG4tdGV4dFwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAxMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tidG4ubmFtZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyME1BUjI1IFN1bW1hcnkgUm93cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInN1bW1hcnlSb3dzICYmIHN1bW1hcnlSb3dzLmxlbmd0aCA+IDAgJiYgZGF0YVNvdXJjZS5kYXRhICYmIGRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCA+IDAgJiYgIWlzTG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNGdWxsVGFibGVTdW1tYXJ5Um93ICYmIGlzU3VtbWFyeUNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Ygc3VtbWFyeVJvd3NcIiBjbGFzcz1cInRhYmxlLXJvdyBzdW1tYXJ5LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMYWJlbCBpbiB0aGUgZmlyc3QgY29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIndpdGhDaGVja0JveFwiIGNsYXNzPVwibm9uLXN1bW1hcnktdGFibGUtY2VsbFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbXB0eSBjZWxscyB0byBhbGlnbiB3aXRoIGRhdGEgY29sdW1ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbCBvZiBpc1N1bW1hcnlTdGFydENvbHVtbjsgbGV0IGxhc3QgPSBsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5vbi1zdW1tYXJ5LXRhYmxlLWNlbGxcIiBbY2xhc3MubGFzdC1jZWxsXT1cImxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiA8IS0tIFZhbHVlIG9yIGlucHV0IGluIHRoZSBsYXN0IGNvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXRhYmxlLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZC1jZWxsXT1cIm1vZGUgPT09ICdlZGl0JyAmJiBpc0VkaXRhYmxlICYmIHNlbGVjdGVkQ29sdW1uID09PSByb3cudW5pcXVlSWRlbnRpZmllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgb25Db2x1bW5DbGljayhyb3cudW5pcXVlSWRlbnRpZmllcilcIj57eyByb3cubGFiZWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdGFibGUtY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNlbGVjdGVkLWNlbGxdPVwibW9kZSA9PT0gJ2VkaXQnICYmIGlzRWRpdGFibGUgJiYgc2VsZWN0ZWRDb2x1bW4gPT09IHJvdy51bmlxdWVJZGVudGlmaWVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdy50eXBlID09PSAnY2FsY3VsYXRpb24nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIGNsb3NlIGJ1dHRvbiBmb3Igc2VsZWN0ZWQgY29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibW9kZSA9PT0gJ2VkaXQnICYmIGlzRWRpdGFibGUgJiYgc2VsZWN0ZWRDb2x1bW4gPT09IHJvdy51bmlxdWVJZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xvc2UtY29sdW1uLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyByZW1vdmVDb2wocm93LnVuaXF1ZUlkZW50aWZpZXIpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDinJVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHN1bW1hcnlWYWx1ZXNbcm93LmZpZWxkTmFtZV0gfCBudW1iZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LnR5cGUgPT09ICdpbnB1dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cInN1bW1hcnlWYWx1ZXNbcm93LmZpZWxkTmFtZV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TdW1tYXJ5SW5wdXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm54dC1sb3AtaW5wdXQgdGFibGUtd2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmb250LXNpemU6IHt7IHJvd1RleHRTaXplID8gcm93VGV4dFNpemUgOiAnMTNweCcgfX07IGNvbG9yOiB7e3Jvd1RleHRDb2xvciA/IHJvd1RleHRDb2xvciA6ICcjMmMzMTM3J319O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIwTUFSMjUgRW1wdHkgY2VsbHMgdG8gYWxpZ24gd2l0aCBkYXRhIGNvbHVtbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2wgb2YgaXNTdW1tYXJ5RW5kQ29sdW1uOyBsZXQgbGFzdCA9IGxhc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9uLXN1bW1hcnktdGFibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aW9uQnV0dG9uIHx8IGlzRGVsZXRlUm93IHx8IGlzRWRpdFJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJub24tc3VtbWFyeS10YWJsZS1jZWxsIGFjdGlvbkNvbCBzdGlja3ktY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTS1MxM0pVTjI1IGZ1bGwgdGFibGUgc3VtbWFyeSByb3cgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzRnVsbFRhYmxlU3VtbWFyeVJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2Ygc3VtbWFyeVJvd3NcIiBjbGFzcz1cInRhYmxlLXJvdyBzdW1tYXJ5LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTS1MxM0pVTjI1IENoZWNrYm94IGNvbHVtbiAoaWYgZW5hYmxlZCkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwid2l0aENoZWNrQm94XCIgY2xhc3M9XCJob3Jpem9udGFsLXN1bW1hcnktdGFibGUtY2VsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHJvdy5sYWJlbFBhdGggfHwgcm93LmxhYmVsIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogcm93LmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTS1MxM0pVTjI1IHN1bW1hcnkgY2VsbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbCBvZiBjdXJyZW50Q29sdW1uczsgbGV0IGxhc3QgPSBsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhvcml6b250YWwtc3VtbWFyeS10YWJsZS1jZWxsXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBsZWZ0O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocm93Py5jb2x1bW5zPy5pbmNsdWRlcyhjb2wuZmllbGROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHN1bW1hcnlWYWx1ZXNbY29sLmZpZWxkTmFtZV0gfCBudW1iZXIgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3Rpb25CdXR0b24gfHwgaXNEZWxldGVSb3cgfHwgaXNFZGl0Um93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhvcml6b250YWwtc3VtbWFyeS10YWJsZS1jZWxsIGFjdGlvbkNvbCBzdGlja3ktY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TS1MyOE1BUjI1IEluIHRoZSBMb2FkaW5nIHNlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm9keVwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZXBlYXQgZm9yIDUgc2tlbGV0b24gcm93cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBfIG9mIFsxLDIsMyw0LDVdXCIgY2xhc3M9XCJ0YWJsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDaGVja2JveCBDb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ3aXRoQ2hlY2tCb3hcIiBjbGFzcz1cInNrZWxldG9uLWNlbGwgc3RpY2t5LWNvbHVtblwiPjwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0YSBDb2x1bW5zIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2wgb2YgY3VycmVudENvbHVtbnNcIiBjbGFzcz1cInNrZWxldG9uLWNlbGwgXCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY3Rpb24gQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aW9uQnV0dG9uIHx8IGlzRGVsZXRlUm93IHx8IGlzRWRpdFJvd1wiIGNsYXNzPVwic2tlbGV0b24tY2VsbCBhY3Rpb25Db2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cImRhdGFTb3VyY2UuZGF0YSAmJiBkYXRhU291cmNlPy5kYXRhPy5sZW5ndGggPT09IDAgJiYgIWlzTG9hZGluZyAmJiBmcm9tID09PSAnZm9ybUJ1aWxkZXInXCIgY2xhc3M9XCJmb3JtLWJ1aWxkZXItdGFibGUtYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkICAvIGRyYWdzIGZpZWxkcyBmcm9tIGVsZW1lbnRzIHNlY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBObyBEYXRhIFJvdyAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkYXRhU291cmNlLmRhdGEgJiYgZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID09PSAwICYmICFpc0xvYWRpbmcgJiYgZnJvbSAhPT0gJ2Zvcm1CdWlsZGVyJ1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJuby1kYXRhXCI+XG4gICAgICAgICAgICAgICAge3snQVBQLk5PX1JFQ09SRFNfT1JfREFUQV9GT1VORCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnTm8gcmVjb3Jkcy9kYXRhIGZvdW5kLid9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBQYWdpbmF0aW9uIC0tPlxuICAgICAgICAgICAgPGRpdiBbY2xhc3Muc2hhZG93LWhpZGRlbl09XCJpc1NoYWRvd0hpZGRlblwiPlxuICAgICAgICAgICAgICAgIDwhLS0gdGFibGUgaW5wdXQgc2F2ZSBidXR0b24gY2hhbmdlcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGlubGluZUFkZCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFkZEljb25Cb3IgY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImFkZElubGluZVJlY29yZCBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZFRhYmxlUmVjb3JkKGlubGluZUVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyAnQVBQLkFERF9SRUNPUkQnfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQWRkIFJlY29yZCd9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZEljb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwibmF2LWljb25cIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAtOTYwIDk2MCA5NjBcIiB3aWR0aD1cIjI0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTQ0MC0yODBoODB2LTE2MGgxNjB2LTgwSDUyMHYtMTYwaC04MHYxNjBIMjgwdjgwaDE2MHYxNjBabTQwIDIwMHEtODMgMC0xNTYtMzEuNVQxOTctMTk3cS01NC01NC04NS41LTEyN1Q4MC00ODBxMC04MyAzMS41LTE1NlQxOTctNzYzcTU0LTU0IDEyNy04NS41VDQ4MC04ODBxODMgMCAxNTYgMzEuNVQ3NjMtNzYzcTU0IDU0IDg1LjUgMTI3VDg4MC00ODBxMCA4My0zMS41IDE1NlQ3NjMtMTk3cS01NCA1NC0xMjcgODUuNVQ0ODAtODBabTAtODBxMTM0IDAgMjI3LTkzdDkzLTIyN3EwLTEzNC05My0yMjd0LTIyNy05M3EtMTM0IDAtMjI3IDkzdC05MyAyMjdxMCAxMzQgOTMgMjI3dDIyNyA5M1ptMC0zMjBaXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLVNLUzE1RkVCMjUgcmVtb3ZlZCBidXR0b24gZGlzYWJsZSBsb2dpYywgYWRkZWQgYW5vdGhlciBjb25kaXRpb24gZm9yIGJ1dHRvbiBzaG93aW5nLS0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS1TS1MxNUZFQjI1IFNSMDZKQU4yMDI1IGJ1dHRvbiBkaXNhYmxlIGxvZ2ljIGZvciBub3Qgc2VsZWN0IGFueSBlbXBsb3llZS0tPlxuICAgICAgICAgICAgICAgICAgICA8bnh0LWJ1dHRvbiAqbmdJZj1cIihpc1JlYWRPbmx5QXJyYXkgIHx8IHRhYmxlU2F2ZUJ1dHRvbikgJiYgZnJvbSAhPSAnZm9ybUJ1aWxkZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblR5cGU9XCJidG4gYnRuLXByaW1hcnlcIiBbYnV0dG9uRGlzYWJsZV09XCJzZWxlY3Rpb24/LnNlbGVjdGVkPy5sZW5ndGggPT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbkNsaWNrRW1pdCk9XCJzYXZlQnV0dG9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uVmFsdWU9XCJ7eyAnQVBQLlNBVkUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NhdmUnICB9fVwiPjwvbnh0LWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bnh0LXBhZ2luYXRpb24gKm5nSWY9XCJpc1BhZ2luYXRpb25cIiBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb2xsZWN0aW9uU2l6ZV09XCJjb25maWdQYWdpbmF0aW9uID8gdG90YWxSZWNvcmRzIHx8IHRvdGFsQ291bnQgOiBmaWx0ZXJUYWJsZU5vc1wiXG4gICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiIFtjdXJyZW50UGFnZV09XCJwYWdlSW5kZXhcIiBbZmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgKGV2ZW50KT1cInBhZ2VQYXJhbXMoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvbnh0LXBhZ2luYXRpb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLVNLUzE1RkVCMjUgYWxlcnQgb24gZGVsZXRpbmcgcmVjb3JkIC0tPlxuPGRpdiAqbmdJZj1cImRlbGV0ZU1vZGFsXCIgY2xhc3M9XCJtb2RhbCBtb2RhbC1iYWNrZHJvcCBzaG93ICBkLWJsb2NrXCIgaWQ9XCJkZWxldGVSZWNvcmRcIiB0YWJpbmRleD1cIi0xXCJcbiAgICBhcmlhLWxhYmVsbGVkYnk9XCJkZWxldGVSZWNvcmRMYWJlbFwiIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFkZWxldGVNb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8YiBjbGFzcz1cIm1vZGFsLXRpdGxlIGZzLTVcIiBpZD1cImRlbGV0ZVJlY29yZExhYmVsXCI+e3sgJ0FQUC5ERUxFVEVfUkVDT1JEJ3wgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0RlbGV0ZSBSZWNvcmQnfX08L2I+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVNb2RhbCA9IGZhbHNlXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAge3sgJ0FQUC5BUkVfWU9VX1NVUkVfWU9VX1dBTlRfVE9fREVMRVRFX1RIRV9SRUMnfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgcmVjb3JkJ319ID9cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJkZWxldGVNb2RhbCA9IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ0FQUC5OTyd8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdObyd9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUmVjb3JkRGF0YSgpXCI+e3sgJ0FQUC5ZRVMnfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnWWVzJ319PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
1743
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2RhdGF0YWJsZS9kYXRhdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvZGF0YXRhYmxlL2RhdGF0YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBYyxZQUFZLEVBQStDLE1BQU0sZUFBZSxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBRXpGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEw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LEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN0SCxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzFHLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDbEgsSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN0SCxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzFHLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDbEksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUNySCxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzdILElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFFN0csSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5GLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFFBQVEsSUFBRyxFQUFFLENBQUM7UUFDdEgsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxJQUFHLENBQUMsQ0FBQztRQUN6SCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENB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c0JBQXZCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQTBCYSxJQUFJO3NCQUF2QixTQUFTO3VCQUFDLE9BQU87Z0JBQ1csY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBeTNCaUIsZUFBZTtzQkFBMUQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0U29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTnh0QnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vYnV0dG9uL254dC1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IE54dFBhZ2luYXRpb24gfSBmcm9tICcuLi9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE54dFNlYXJjaEZpbHRlclBpcGUgfSBmcm9tICcuLi8uLi9waXBlL3NlYXJjaC1maWx0ZXIvc2VhcmNoLWZpbHRlci5waXBlJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5nZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jaGFuZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE54dEdldFZhbHVlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGUvZ2V0LXZhbHVlLnBpcGUnO1xuaW1wb3J0IHsgTGlzdFZpZXdGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi9saXN0LXZpZXctZmlsdGVyL2xpc3Qtdmlldy1maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTnh0Q3VzdG9tVHJhbnNsYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGUvY3VzdG9tLXRyYW5zbGF0ZS5waXBlJztcbmltcG9ydCB7IFBpY2tMb2NhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL3BpY2stbG9jYXRpb24vcGljay1sb2NhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvblNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi1zZWxlY3Rvci9pY29uLXNlbGVjdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRTZWFyY2hCb3ggfSBmcm9tICcuLi9zZWFyY2gtYm94L3NlYXJjaC1ib3guY29tcG9uZW50JztcbmltcG9ydCB7IEN1c3RvbURyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vY3VzdG9tLWRyb3Bkb3duL2N1c3RvbS1kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3VzdG9tUmFkaW9Db21wb25lbnQgfSBmcm9tICcuLi9jdXN0b20tcmFkaW8vY3VzdG9tLXJhZGlvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeHRGaWxlVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi4vZmlsZS11cGxvYWQvZmlsZS11cGxvYWQuY29tcG9uZW50JztcbmltcG9ydCB7IE54dElucHV0IH0gZnJvbSAnLi4vbnh0LWlucHV0L254dC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUXVlc3Rpb25CeVJvd1BpcGUgfSBmcm9tICcuLi8uLi9waXBlL3F1ZXN0aW9uLWJ5LXJvdy5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnh0LWRhdGF0YWJsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOeHRCdXR0b25Db21wb25lbnQsXG4gICAgTnh0UGFnaW5hdGlvbixcbiAgICBOeHRTZWFyY2hGaWx0ZXJQaXBlLFxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgTnh0R2V0VmFsdWVQaXBlLFxuICAgIFBpY2tMb2NhdGlvbkNvbXBvbmVudCxcbiAgICBOeHREYXRhdGFibGUsXG4gICAgSWNvblNlbGVjdG9yQ29tcG9uZW50LFxuICAgIE54dFNlYXJjaEJveCxcbiAgICBDdXN0b21Ecm9wZG93bkNvbXBvbmVudCxcbiAgICBDdXN0b21SYWRpb0NvbXBvbmVudCxcbiAgICBOeHRGaWxlVXBsb2FkQ29tcG9uZW50LFxuICAgIE54dElucHV0LFxuICAgIExpc3RWaWV3RmlsdGVyQ29tcG9uZW50LFxuICAgIE54dEN1c3RvbVRyYW5zbGF0ZVBpcGUsXG4gICAgUXVlc3Rpb25CeVJvd1BpcGVcbiAgICAvLyBSb3dSZXNpemVyRGlyZWN0aXZlXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vZGF0YXRhYmxlLmNvbXBvbmVudC5jc3MnXG59KVxuZXhwb3J0IGNsYXNzIE54dERhdGF0YWJsZSB7XG4gIEBJbnB1dCgpIGRhdGE6IGFueVtdID0gW107ICAvLyAgZ2V0IGRhdGEgdGhhdCB0byBiZSBkaXNwbGF5ZWQgaW4gYSBhcnJheVxuICBASW5wdXQoKSB0YWJsZUZpbHRlckRhdGE6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIGNvbHVtbnM6IEFycmF5PGFueT4gPSBbXTsgLy8gQ29sdW1ucyBoYXZlIGEgbGFiZWwsIGEgY29sdW1uIHR5cGUsIGFuZCBmaWx0ZXIgZGV0YWlscy5cbiAgQElucHV0KCkgd2l0aENoZWNrQm94OiBib29sZWFuOyAgLy8gZ2V0IGlmIHdpdGggb3Igd2l0aG91dCBjaGVja2JveCBpbiB0YWJsZVxuICBASW5wdXQoKSBzZWFyY2hCYXI6IGJvb2xlYW47IC8vIGlmIGl0IGlzIHRydWUsIHRoZSBzZWFyY2ggYmFyIHdpbGwgYmUgZGlzcGxheWVkIG9uIHRhYmxlXG4gIEBJbnB1dCgpIHRhYmxlU2F2ZUJ1dHRvbiA9IGZhbHNlOyAvLyBzYXZlIGJ1dHRvbiBmb3IgZWRpdGluZyBMT1AgaW4gcGF5cm9sbCB0YWJsZSwgIGNoYW5nZWQgbmFtZSBmcm9tICdzYXZlTE9QJ1xuICBASW5wdXQoKSBzdGlja3lDb2x1bW4gPSBmYWxzZTsgLy8gaWYgdGhlIGxhc3QgY29sdW1uIHNob3VsZCBiZSBzdGlja3ksIGl0IHNob3VsZCBiZSBzZW50IGFzIGJvb2xlYW4gdmFsdWVcbiAgQElucHV0KCkgdGFibGVXaWR0aCA9ICcxMDAlJzsgLy8gd2lkdGggb2YgdGFibGUgY2FuIGJlIGFkanVzdGVkIGZyb20gcGFyZW50LCBieSBkZWZhdWx0IGl0IGlzIDEwMCVcbiAgQElucHV0KCkgYWN0aW9uQ29sdW1IZWFkZXIgPSAnQVBQLkFDVElPTic7ICAvLyB0byBjaGFuZ2UgdGhlIGhlYWRlciBmb3IgYWN0aW9uIGNvbHVtblxuICBASW5wdXQoKSBhY3Rpb25CdXR0b246IGJvb2xlYW47ICAvL3RvIHNob3cgYnV0dG9uIGNvbHVtIGFzIGFjdGlvblxuICBASW5wdXQoKSB0aXRsZTogYW55Oy8vIHRoZSB0aXRsZSBmb3IgdGhlIHRhYmxlO1xuICBASW5wdXQoKSBpc0J1dHRvbnM6IGJvb2xlYW47Ly8gaXMgYnV0dG9uIHByZXNlbnQgaW4gdGFibGU7XG4gIEBJbnB1dCgpIGJ1dHRvbkFycmF5OiBhbnk7Ly8gYnV0dG9ucyB0byBiZSBkaXNwbGF5ZWQ7XG4gIEBJbnB1dCgpIHRhYmxlSWQ6IGFueSA9ICdpZCc7IC8vIGlkIG9mIHRhYmxlXG4gIEBJbnB1dCgpIGlzRWRpdFJvdzogYm9vbGVhbjsgLy8gaWYgaXQgaXMgdHJ1ZSwgdGhlIHJvdyBjYW4gYmUgZWRpdGVkXG4gIEBJbnB1dCgpIGlzRGVsZXRlUm93OiBib29sZWFuOyAvLyBpZiBpdCBpcyB0cnVlLCB0aGUgcm93IGNhbiBiZSBkZWxldGVkXG4gIEBJbnB1dCgpIGFkZElubGluZVJlY29yZDogYm9vbGVhbjsgLy8gaWYgaXQgaXMgdHJ1ZSwgdGhlIHJvdyBjYW4gYmUgYWRkZWQgaW5saW5lXG4gIEBJbnB1dCgpIHNlYXJjaENvbmZpZ3M6IGFueTsgLy8gc2VhcmNoIGNvbmZpZ3VyYXRpb25zXG4gIEBJbnB1dCgpIGRpcmVjdGlvbjogJ3J0bCcgfCAnbHRyJyA9ICdsdHInOyAvLyBkaXJlY3Rpb24gb2YgdGFibGVcbiAgQElucHV0KCkgcGFnaW5hdGlvbjogYW55OyAvLyBwYWdpbmF0aW9uIGNvbmZpZ3VyYXRpb25zXG4gIEBJbnB1dCgpIGFjdGlvbkJ1dHRvbkFycmF5OiBhbnk7IC8vIGFjdGlvbiBidXR0b24gY29uZmlndXJhdGlvbnNcbiAgQElucHV0KCkgbXVsdGlwbGVGaWx0ZXI6IGFueTsgLy8gaWYgcGFnaW5hdGlvbiB0cnVlIHRoZW4gdGhpcyB3aWxsIGJlIHVzZWRcbiAgQElucHV0KCkgaXNQYWdpbmF0aW9uOiBhbnk7IC8vIHBhZ2luYXRpb24gY29uZmlndXJhdGlvbnMgaWYgdHJ1ZSB0aGVuIHBhZ2luYXRpb24gd2lsbCBiZSBlbmFibGVkXG4gIEBJbnB1dCgpIGlzTm9zSW5kaWNhdG9yOiBhbnk7IC8vIGlmIHRydWUgdGhlbiBubyBkYXRhIGluZGljYXRvciB3aWxsIGJlIHNob3duXG4gIEBJbnB1dCgpIGlzRWRpdGFibGU6IGFueTsgLy8gaWYgdHJ1ZSB0aGVuIHRhYmxlIHdpbGwgYmUgZWRpdGFibGVcbiAgQElucHV0KCkgZnJvbTogYW55OyAvLyBmcm9tIGRhdGUgcGFsdGZvcm0gYmFzZWQgaW5pdGlhbGl6ZSBpbnB1dHMgZXg6LSAnZm9ybUJ1aWxkZXInXG4gIEBJbnB1dCgpIHF1ZXN0aW9uOiBhbnk7IC8vIHF1ZXN0aW9uIGlzIHVzZWQgZm9yIG54dCBmb3JtIGJ1aWxkZXIgdGFibGUgcHJldmlld1xuICBASW5wdXQoKSByb3dUZXh0U2l6ZTogYW55OyAvLyBzaXplIG9mIHJvdyB0ZXh0XG4gIEBJbnB1dCgpIHJvd1RleHRDb2xvcjogYW55OyAvLyBjb2xvciBvZiByb3cgdGV4dFxuICBASW5wdXQoKSBhcGlNZXRhOiBzdHJpbmc7IC8vIGFwaSBtZXRhIGlzIHVzZWQgZm9yIG54dCBmb3JtIGJ1aWxkZXIgdGFibGUgcHJldmlld1xuICBASW5wdXQoKSBzdW1tYXJ5Um93czogYW55OyAvLyBJbnB1dCBmb3IgY29uZmlndXJhYmxlIHN1bW1hcnkgcm93c1xuICBASW5wdXQoKSBzdW1tYXJ5Q29sdW1uczogYW55OyAvLyBJbnB1dCBmb3Igc3VtbWFyeSBjb2x1bW5zIGNvbmZpZ1xuICBASW5wdXQoKSBpc0xvYWRpbmc6IGFueTsgLy9TS1MyOE1BUjI1IElucHV0IGZvciBsb2FkaW5nIGluZGljYXRvclxuICBASW5wdXQoKSB0YWJsZUNvbmZpZzogYW55OyAvLyB0YWJsZSBjb25maWcgZm9yIG54dCBmb3JtIGJ1aWxkZXIgdGFibGVcbiAgQElucHV0KCkgdGFibGVQYXJhbXM6IGFueTsgLy9TS1MxN0FQUjI1IFJlY2VpdmVzIHRhYmxlUGFyYW1zIGluZm9ybWF0aW9uIGZyb20gcGFyZW50IGNvbXBvbmVudFxuICBASW5wdXQoKSBsaXN0Vmlld3M6IGFueVtdID0gW107IC8vU0tTMjZBUFIyNSBQcmVkZWZpbmVkIGxpc3Qgdmlld3NcbiAgQElucHV0KCkgbW9kZTogJ3ZpZXcnIHwgJ2VkaXQnIHwgJ3ByaW50JyA9ICdlZGl0JzsgLy8gU0tTMTFKVU4yNSBOZXcgbW9kZSBpbnB1dFxuICBASW5wdXQoKSBsYW5ndWFnZUNvZGU6IHN0cmluZzsgLy9TS1MyOEpVTjI1IGZvciB0cmFuc2xhdGlvblxuICBASW5wdXQoKSBzZWxlY3RlZENvbHVtbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vIFNLUzIySlVMMjUgdG8gZ2V0IHRoZSBzZWxlY3RlZCBjb2x1bW5cbiAgQElucHV0KCkgYWxsSWNvbnM6IGFueVtdID0gW107IC8vIFNLUzIySlVMMjUgaWNvbiBzZWxlY3RvciBjb21wb25lbnQgaW5wdXRcblxuICBAT3V0cHV0KCkgdGFibGVSb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PjsgLy8gZGF0YXMgdG8gYmUgcGFzc2VkIHdoZW4gdGFibGUgcm93IGlzIGNsaWNrZWRcbiAgQE91dHB1dCgpIG9uRWRpdERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT47IC8vIGlmIGVkaXQgYnV0dG9uIGlzIGNsaWNrZWQsIHRoZSBkYXRhIG9mIHRoYXQgcm93IHdpbGwgYmUgcGFzc2VkXG4gIEBPdXRwdXQoKSBzYXZlQnV0dG9uRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PjsgLy8gZWRpdGVkIHJvd3MgZGF0YSB3aWxsIGJlIHBhc3NlZFxuICBAT3V0cHV0KCkgb25EZWxldGVEYXRhID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+OyAgLy8gd2hlbiBkZWxldGUgYnV0dG9uIGNsaWNrZWQgcGFzcyB0aGUgZGF0YVxuICBAT3V0cHV0KCkgYnV0dG9uRW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PjsgLy8gdGhpcyB3aWxsIGVtaXQgYSB0YWJsZSB0b3AgYnV0dG9uIGNsaWNrIGV2ZW50XG4gIEBPdXRwdXQoKSBoeXBlckxpbmtFbWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+OyAvLyBoeXBlciBsaW5rIGNsaWNrIGV2ZW50XG4gIEBPdXRwdXQoKSBzaWRlTmF2RW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBkYXRhOiBhbnksIGNvbDogYW55LCBjb25maWc6IGFueSB9PjsgLy8gcmlnaHRuYXYgY29sdW1uIGVtaXRcbiAgQE91dHB1dCgpIGFjdGlvbkJ1dHRvbkVtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT47IC8vIGRhdGFzIHRvIGJlIHBhc3NlZCB3aGVuIHRhYmxlIHJvdyBhY3RpdmUgYnV0dG9uIGlzIGNsaWNrZWRcbiAgQE91dHB1dCgpIGNvbHVtblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHVuaXF1ZUlkZW50aWZpZXI6IHN0cmluZywgZGF0YTogYW55W10gfT4oKTtcbiAgQE91dHB1dCgpIHJlbW92ZUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8eyB1bmlxdWVJZGVudGlmaWVyOiBzdHJpbmcsIGRhdGE6IGFueVtdIH0+KCk7XG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHNlbGVjdGVkVmFsdWVzID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTsgLy8gdG8gcGFzcyB0aGUgc2VsZWN0ZWQgY2hlY2tib3ggdmFsdWVzXG4gIEBPdXRwdXQoKSBmaWxlRW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpOyAvLyB0byBwYXNzIHRoZSBmaWxlXG4gIEBPdXRwdXQoKSBOeHRUYWJsZVBhcmFtc0VtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT47IC8vU0tTMTdBUFIyNSB0byBwYXNzIHRoZSB0YWJsZVBhcmFtcyBpbmZvcm1hdGlvblxuICBAT3V0cHV0KCkgTnh0VGFibGVGaWx0ZXJFbWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+OyAvL1NLUzNNQVkyNSBmaWx0ZXIgY29sdW1uIHZhbCBnZXQgZW1pdCBcbiAgQE91dHB1dCgpIGhhZGxlRHJvcERvd25EZXBlbmRlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgTnh0VGFibGVFbWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvLyB7XG4gIC8vICAgXCJwYWdpbmF0aW9uXCI6IHsgICAgICAgLy8gNFxuICAvLyAgICAgICBcInBhZ2VTaXplXCI6IDEwLFxuICAvLyAgICAgICBcInBhZ2VJbmRleFwiOiAxMFxuICAvLyAgIH0sXG4gIC8vICAgXCJ0YWJsZVNlYXJjaFwiOiB7ICAgICAgLy8gMVxuICAvLyAgICAgICBcImZpZWxkc1wiIDogW1xuICAvLyAgICAgICAgICAgXCJsaWdodFR5cGVcIixcbiAgLy8gICAgICAgICAgIFwic3lzdGVtXCIsXG4gIC8vICAgICAgICAgICBcInN0YXR1c1wiXG4gIC8vICAgICAgIF0gLFxuICAvLyAgICAgICBcInZhbHVlXCI6ICdyLTAwMScgXG4gIC8vICAgfSwgIFxuICAvLyAgIFwic2VhcmNoRmlsdGVyRGF0YVwiOiB7ICAvLyAyXG4gIC8vICAgICAgIFwibGlnaHRUeXBlXCI6IFtcbiAgLy8gICAgICAgICAgIFwiQUFcIixcbiAgLy8gICAgICAgICAgIFwiQkJcIiBcbiAgLy8gICAgICAgXVxuICAvLyAgIH0sXG4gIC8vICAgXCJzb3J0XCI6IHsgICAgICAgICAgICAgIC8vIDNcbiAgLy8gICAgICAgXCJjb2x1bW5cIjogXCJhc3NldENvZGVcIixcbiAgLy8gICAgICAgXCJkaXJlY3Rpb25cIjogXCJhc2NcIlxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydCE6IE1hdFNvcnQ7XG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQ29udGFpbmVyJykgdGFibGVDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBzZWxlY3Rpb246IGFueTsgLy8gdG8gZ2V0IHRoZSBzZWxlY3RlZCByb3dcbiAgc3RpY2t5Q29uZGl0aW9uITogbnVtYmVyOyAvLyB0byBnZXQgdGhlIHN0aWNreSBjb2x1bW4gaW5kZXhcbiAgc2VhcmNoRmlsdGVyID0gZmFsc2U7IC8vIHRvIGdldCB0aGUgc2VhcmNoIGZpbHRlclxuICBmaWx0ZXJBcnJheTogQXJyYXk8YW55PiA9IFtdOyAvLyB0byBnZXQgdGhlIGZpbHRlciBhcnJheVxuICBzZWxlY3RlZEZpbHRlcjogYW55OyAvLyB0byBnZXQgdGhlIHNlbGVjdGVkIGZpbHRlclxuICBwYWdlU2l6ZU9wdGlvbnM6IEFycmF5PGFueT4gIC8vIGZvciBwYWdpbmF0aW9uIGdldCB0aGUgcGFnZSBzaXplIG9wdGlvbnNcbiAgZGF0YVNvdXJjZTogYW55OyAgLy8gZm9yIHRhYmxlIGRhdGEgc291cmNlXG4gIHRvdGFsQ291bnQhOiBudW1iZXIgLy8gY291bnQgb2YgdG90YWwgcmVjb3Jkc1xuICBzZWFyY2hCb3hWYWx1ZTogYW55OyAvLyB0byBnZXQgdGhlIHNlYXJjaCBib3ggdmFsdWVcbiAgcHJldlNlYXJjaDogYW55OyAvLyB0byBnZXQgdGhlIHByZXZpb3VzIHNlYXJjaCB2YWx1ZVxuICBhY3RpdmVDb2x1bW46IHN0cmluZyB8IG51bGwgPSBudWxsOyAvLyBUcmFjayB0aGUgYWN0aXZlIGNvbHVtblxuICBpc1Njcm9sbGVkID0gZmFsc2U7IC8vIEJvb2xlYW4gZmxhZyB0byB0cmFjayBzY3JvbGwgc3RhdGVcbiAgaXNTaGFkb3dIaWRkZW4gPSBmYWxzZTsgLy8gQm9vbGVhbiBmbGFnIHRvIHRyYWNrIHNoYWRvdyBzdGF0ZVxuICBjdXJyZW50U29ydENvbHVtbjogc3RyaW5nID0gJyc7IC8vIHRvIGdldCB0aGUgY3VycmVudCBzb3J0IGNvbHVtblxuICBjdXJyZW50U29ydERpcmVjdGlvbjogJ2FzYycgfCAnZGVzYycgfCAnbm9uZScgPSAnbm9uZSc7IC8vIHRvIGdldCB0aGUgY3VycmVudCBzb3J0IGRpcmVjdGlvblxuICBvcmlnaW5hbERhdGE6IGFueTsgLy8gU3RvcmUgb3JpZ2luYWwgZGF0YSBmb3Igc29ydGluZ1xuICBob3ZlcmVkQ29sdW1uOiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgdGhlIGhvdmVyZWQgY29sdW1uXG4gIHNlYXJjaFRleHQ6IGFueTsgLy8gdG8gZ2V0IHRoZSBzZWFyY2ggdGV4dFxuICBtdWx0aXBsZUZpbHRlckFycmF5OiBhbnk7IC8vIHRvIGdldCB0aGUgbXVsdGlwbGUgZmlsdGVyIGFycmF5XG4gIHRhYmxlRmlsdGVyQXJyYXk6IGFueTsgLy8gdG8gZ2V0IHRoZSB0YWJsZSBmaWx0ZXIgYXJyYXlcbiAgZmlsdGVyRGF0YUFycmF5OiBhbnkgPSB7fSAvLyB0byBnZXQgdGhlIGZpbHRlciBkYXRhIGFycmF5XG4gIGlzUmVzaXplZDogYm9vbGVhbiA9IGZhbHNlOyAvLyBmb3IgdGFibGUgY29sdW1uIHJlc2l6ZVxuICBzRmlsdGVyRGF0YTogYW55OyAvLyB0byBnZXQgdGhlIHNlYXJjaCBmaWx0ZXIgZGF0YVxuICBjdXJyZW50Q29sdW1uczogQXJyYXk8YW55PiA9IFtdO1xuICBpbmxpbmVFbGVtZW50OiBhbnkgLy8gZm9yIGFkZCBhIG5ldyByb3cgb24gdGFibGVcbiAgcGFnZVNpemU6IGFueSAgLy8gZm9yIHBhZ2luYXRpb24gZ2V0IHRoZSBwYWdlIHNpemVcbiAgcGFnZUluZGV4OiBhbnkgLy8gZm9yIHBhZ2luYXRpb24gZ2V0IHRoZSBwYWdlIGluZGV4XG4gIHRvdGFsUmVjb3JkczogbnVtYmVyOyAvLyBmb3IgcGFnaW5hdGlvbiBnZXQgdGhlIHRvdGFsIHJlY29yZHNcbiAgY29uZmlnUGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlOyAvLyBmbGFnIGZvciBjb25maWcgcGFnaW5hdGlvblxuICBkZWxldGVEYXRhOiBhbnk7IC8vIHRvIGdldCB0aGUgZGVsZXRlIHJvd1xuICBkZWxldGVNb2RhbCA9IGZhbHNlOyAvLyBmb3IgY29uZm9ybWF0aW9uIHBvcHVwXG4gIGRyb3Bkb3duQWN0aW9uQnV0dG9uOiBhbnk7IC8vIGZvciBhY3Rpb24gY29sdW1uIGRyb3Bkb3duIGJ1dHRvblxuICBjdXJyZW50T3BlbkluZGV4OiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gdHJhY2sgdGhlIGN1cnJlbnQgb3BlbiBhY3Rpb24gZHJvcGRvd24gaWNvbiBpbmRleFxuICBjbGlja0xpc3RlbmVyOiBhbnk7IC8vIGFjdGlvbiBjb2x1bW4gZHJvcGRvd24gYnV0dG9uIGNsaWNrIGxpc3RlbmVyIGZvciBjbG9zZSBhIGRyb3Bkb3duIGJ1dHRvblxuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjsgIC8vIGZvciB0YWJsZSBkYXRhIHN1YnNjcmlwdGlvblxuICBkZWxldGVJbmRleDogbnVtYmVyOyAvLyB0byBnZXQgdGhlIGRlbGV0ZSBpbmRleFxuICBzaG93UG9wb3ZlciA9IHRydWU7XG4gIHN1bW1hcnlWYWx1ZXM6IHsgW2xhYmVsOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9OyAvLyBTS1MyME1BUjI1IE9iamVjdCB0byBzdG9yZSBzdW1tYXJ5IHJvdyB2YWx1ZXNcbiAgaXNTdW1tYXJ5Q29sdW1uOiBib29sZWFuID0gZmFsc2U7IC8vIFNLUzIwTUFSMjUgRmxhZyB0byBjaGVjayBpZiB0aGUgY29sdW1uIGlzIGluIHRoZSBkaXNwbHljb2x1bW5zIGFycmF5XG4gIGlzU3VtbWFyeVN0YXJ0Q29sdW1uOiBhbnlbXTtcbiAgaXNTdW1tYXJ5RW5kQ29sdW1uOiBhbnlbXTtcbiAgZmlsdGVyQm94RGF0YTogYW55O1xuICBmaWx0ZXJUYWJsZU5vczogYW55O1xuICBzZWxlY3RlZFZpZXc6IGFueSA9ICcnOyAgICAgICAgIC8vIFNlbGVjdGVkIGxpc3QgdmlldyBuYW1lXG4gIGlzRHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7IC8vIFRyYWNrcyBkcm9wZG93biB2aXNpYmlsaXR5XG4gIGN1cnJlbnRWaWV3RmlsdGVyOiBhbnlcbiAgaXNGdWxsVGFibGVTdW1tYXJ5Um93OiBib29sZWFuID0gZmFsc2U7IC8vIFNLUzEzSlVOMjUgRmxhZyB0byBjaGVjayBpZiB0aGUgdGFibGUgaGFzIGZ1bGwgc3VtbWFyeSByb3dcbiAgaXNJbWFnZUhvdmVyID0gZmFsc2U7XG4gIGlzSW1hZ2VFZGl0OiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkSW1hZ2VFbGVtZW50OiBhbnk7XG4gIHByaXZhdGUgcXVlc3Rpb25zQ2FjaGU6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG4gIGlzUmVzaXppbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjdXJyZW50Q29sdW1uOiBhbnkgPSBudWxsO1xuICBwcml2YXRlIHN0YXJ0WCA9IDA7XG4gIHByaXZhdGUgc3RhcnRXaWR0aCA9IDA7XG4gIHByaXZhdGUgcmVzaXplRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UscHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLCBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSwgcHJpdmF0ZSBjaGFuZ2VTZXJ2aWNlOiBDaGFuZ2VTZXJ2aWNlKSB7IH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEnXSB8fCBjaGFuZ2VzWydjb2x1bW5zJ10pIHtcbiAgICAgIHRoaXMucXVlc3Rpb25zQ2FjaGUuY2xlYXIoKTtcbiAgICB9XG4gICAgdGhpcy5kYXRhU291cmNlID0geyBkYXRhOiBbXSB9OyAvLyBvciB1c2UgYSBwcm9wZXIgZGF0YSBzdHJ1Y3R1cmVcbiAgICB0aGlzLmN1cnJlbnRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXG4gICAgaWYgKHRoaXMuZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJykge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5xdWVzdGlvbj8uaW5wdXQgPyB0aGlzLnF1ZXN0aW9uPy5pbnB1dCA6IHRoaXMuZGF0YSA/IHRoaXMuZGF0YSA6IFtdXG4gICAgICBsZXQgcGFyc2VkTWV0YSA9IHR5cGVvZiB0aGlzLnF1ZXN0aW9uPy5bJ2ZpZWxkc01ldGEnXSA9PT0gJ29iamVjdCcgPyB0aGlzLnF1ZXN0aW9uPy5bJ2ZpZWxkc01ldGEnXSA6IHRoaXMucXVlc3Rpb24/LlsnZmllbGRzTWV0YSddICA/IEpTT04ucGFyc2UodGhpcy5xdWVzdGlvbj8uWydmaWVsZHNNZXRhJ10pIDogW107XG4gICAgICBpZiAoIHBhcnNlZE1ldGEgPT09IG51bGwgfHwgIHBhcnNlZE1ldGEgPT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheShwYXJzZWRNZXRhKSB8fCBwYXJzZWRNZXRhPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKCdObyB2YWxpZCBtZXRhZGF0YSBwcm92aWRlZCcpOyBcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU0tTMjJKVUwyNSBUcmFuc2Zvcm0gdGhlIHBhcnNlZE1ldGFcbiAgICAgIGNvbnN0IHVwZGF0ZWRNZXRhID0gcGFyc2VkTWV0YS5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB7IC4uLml0ZW0gfTtcbiAgICAgICAgLy8gUmVuYW1lIGFwaU5hbWUgdG8gZmllbGROYW1lXG4gICAgICAgIGlmIChuZXdJdGVtLmFwaU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5ld0l0ZW0uZmllbGROYW1lID0gbmV3SXRlbS5hcGlOYW1lO1xuICAgICAgICAgIGRlbGV0ZSBuZXdJdGVtLmFwaU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU0tTMjJKVUwyNSBSZW5hbWUgZmxkVHlwZSB0byB0eXBlIGFuZCBsb3dlcmNhc2UgaXRcbiAgICAgICAgaWYgKG5ld0l0ZW0uZmxkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3SXRlbS50eXBlID0gbmV3SXRlbS5mbGRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgZGVsZXRlIG5ld0l0ZW0uZmxkVHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SXRlbTtcbiAgICAgIH0pO1xuICAgICAgcGFyc2VkTWV0YSA9IHVwZGF0ZWRNZXRhO1xuICAgICAgdGhpcy5jdXJyZW50Q29sdW1ucyA9IHVwZGF0ZWRNZXRhXG4gICAgICBpZiAodGhpcy50YWJsZUNvbmZpZykge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLnRhYmxlQ29uZmlnO1xuICAgICAgICB0aGlzLmlzTm9zSW5kaWNhdG9yID0gY29uZmlnPy5pc05vc0luZGljYXRvciAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRkSW5saW5lUmVjb3JkID0gY29uZmlnLmFkZElubGluZVJlY29yZCAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNQYWdpbmF0aW9uID0gY29uZmlnLmlzUGFnaW5hdGlvbiAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uID0gY29uZmlnLmFjdGlvbkJ1dHRvbiAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNEZWxldGVSb3cgPSBjb25maWcuaXNEZWxldGVSb3cgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRWRpdFJvdyA9IGNvbmZpZy5pc0VkaXRSb3cgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLnNlYXJjaEJhciA9IGNvbmZpZy5zZWFyY2hCYXIgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQnV0dG9ucyA9IGNvbmZpZy5pc0J1dHRvbnMgIT09IGZhbHNlOyAvL3N1bW1hcnlDb2x1bW5cbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IGNvbmZpZy5pdGVtc1BlclBhZ2UgfHwgNTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdW1tYXJ5Q29sdW1ucyA9IHBhcnNlZE1ldGFcbiAgICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnN1bW1hcnlDb2x1bW4gPT09IHRydWUpXG4gICAgICAgIC5tYXAoKHsgYXBpTmFtZSwgZmxkVHlwZSwgLi4ucmVzdCB9KSA9PiAoe1xuICAgICAgICAgIGZpZWxkTmFtZTogYXBpTmFtZSxcbiAgICAgICAgICB0eXBlOiBmbGRUeXBlLFxuICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgfSkpO1xuICAgICAgdGhpcy5zdW1tYXJ5Um93cyA9IHBhcnNlZE1ldGFcbiAgICAgICAgLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnN1bW1hcnlSb3cgPT09IHRydWUpXG4gICAgICAgIC5tYXAoKHsgYXBpTmFtZSwgZmxkVHlwZSwgLi4ucmVzdCB9KSA9PiAoe1xuICAgICAgICAgIGZpZWxkTmFtZTogYXBpTmFtZSxcbiAgICAgICAgICB0eXBlOiBmbGRUeXBlLFxuICAgICAgICAgIC4uLnJlc3RcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgYHRoaXMuZGF0YWAgaXMgYW4gYXJyYXlcbiAgICBpZiAoIXRoaXMuZGF0YSB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0RhdGEgaXMgbm90IGluaXRpYWxpemVkIG9yIGlzIG5vdCBhbiBhcnJheScpO1xuICAgICAgdGhpcy5kYXRhID0gW107ICAvLyBJbml0aWFsaXplIGFzIGFuIGVtcHR5IGFycmF5IGlmIGl0J3Mgbm90IHZhbGlkXG4gICAgfVxuICAgIC8vIEVuc3VyZSBgdGhpcy5kYXRhU291cmNlLmRhdGFgIGlzIGluaXRpYWxpemVkXG4gICAgLy9TS1MxNUZFQjI1IEluaXRpYWxpemUgdGhpcyBpbiB5b3VyIGRhdGEgZmV0Y2ggbWV0aG9kXG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEnXSkge1xuICAgICAgdGhpcy5vcmlnaW5hbERhdGEgPSB0aGlzLmRhdGEubWFwKHJvdyA9PiB0aGlzLmZsYXR0ZW5Sb3cocm93KSk7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhO1xuICAgICAgdGhpcy5jb21wdXRlU3VtbWFyeVZhbHVlcygnb25DaGFuZ2UnKTsgLy8gSWYgeW91IGhhdmUgc3VtbWFyeSByb3dzXG4gICAgfVxuICAgIHRoaXMub3JpZ2luYWxEYXRhID0gWy4uLnRoaXMuZGF0YV07XG4gICAgdGhpcy5zRmlsdGVyRGF0YSA9IFsuLi50aGlzLmRhdGFdO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5vcmlnaW5hbERhdGE7XG4gICAgdGhpcy5wYWdlU2l6ZSA9IHRoaXMucGFnaW5hdGlvbj8ucGFnZVNpemUgPyB0aGlzLnBhZ2luYXRpb25bJ3BhZ2VTaXplJ10gOiB0aGlzLnBhZ2VTaXplIHx8IDEwO1xuICAgIHRoaXMucGFnZUluZGV4ID0gdGhpcy5wYWdpbmF0aW9uPy5wYWdlSW5kZXggPyB0aGlzLnBhZ2luYXRpb25bJ3BhZ2VJbmRleCddIDogdGhpcy5wYWdlSW5kZXggfHwgMTtcbiAgICB0aGlzLnRvdGFsUmVjb3JkcyA9IHRoaXMucGFnaW5hdGlvbj8udG90YWxSZWNvcmRzID8gdGhpcy5wYWdpbmF0aW9uWyd0b3RhbFJlY29yZHMnXSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IHRoaXMucGFnaW5hdGlvbj8ucGFnZVNpemVPcHRpb25zID8gdGhpcy5wYWdpbmF0aW9uWydwYWdlU2l6ZU9wdGlvbnMnXSA6IFsnNScsICcxMCcsICcyNScsICc1MCcsICcxMDAnLCAnMjAwJ107XG4gICAgdGhpcy5jb25maWdQYWdpbmF0aW9uID0gISEodGhpcy5wYWdpbmF0aW9uICYmIE9iamVjdC5rZXlzKHRoaXMucGFnaW5hdGlvbikubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5pc1BhZ2luYXRpb24gPT09IHVuZGVmaW5lZCB8fCB0aGlzLmlzUGFnaW5hdGlvbiA9PT0gdHJ1ZSA/IHRoaXMuaXNQYWdpbmF0aW9uID0gdHJ1ZSA6IHRoaXMuaXNQYWdpbmF0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5pc05vc0luZGljYXRvciA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuaXNOb3NJbmRpY2F0b3IgPT09IHRydWUgPyB0aGlzLmlzTm9zSW5kaWNhdG9yID0gdHJ1ZSA6IHRoaXMuaXNOb3NJbmRpY2F0b3IgPSBmYWxzZTtcbiAgICB0aGlzLmlzRWRpdGFibGUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmlzRWRpdGFibGUgPT09IGZhbHNlID8gdGhpcy5pc0VkaXRhYmxlID0gZmFsc2UgOiB0aGlzLmlzRWRpdGFibGUgPSB0cnVlXG5cblxuICAgIC8vIFNLUzIwTUFSMjUgQ2hlY2sgaWYgdGhlIGRpc3BseWNvbHVtbidzIGhhdmUgYSBzdW1tYXJ5IGNvbHVtblxuICAgIGlmICh0aGlzLnN1bW1hcnlSb3dzICYmIHRoaXMuc3VtbWFyeVJvd3M/Lmxlbmd0aCA+IDAgJiYgdGhpcy5jdXJyZW50Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmlzRnVsbFRhYmxlU3VtbWFyeVJvdyA9IHRoaXMuc3VtbWFyeVJvd3NbMF0udHlwZSA9PT0gJ2Z1bGxSb3cnIHx8ICB0aGlzLnN1bW1hcnlSb3dzWzBdLnR5cGUgPT09ICdmdWxscm93JyA/IHRydWUgOiBmYWxzZTtcbiAgICAgIHRoaXMuaXNTdW1tYXJ5Q29sdW1uID0gdGhpcy5jdXJyZW50Q29sdW1ucy5zb21lKGVsZW1lbnQgPT4gZWxlbWVudCA9PT0gdGhpcy5zdW1tYXJ5Um93c1swXS5jb2x1bW4pO1xuICAgICAgaWYgKHRoaXMuaXNTdW1tYXJ5Q29sdW1uICYmICF0aGlzLmlzRnVsbFRhYmxlU3VtbWFyeVJvdykge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY3VycmVudENvbHVtbnMuaW5kZXhPZih0aGlzLnN1bW1hcnlSb3dzWzBdLmNvbHVtbik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLmlzU3VtbWFyeVN0YXJ0Q29sdW1uID0gdGhpcy5jdXJyZW50Q29sdW1ucy5zbGljZSgwLCBpbmRleCAtIDEpO1xuICAgICAgICAgIHRoaXMuaXNTdW1tYXJ5RW5kQ29sdW1uID0gdGhpcy5jdXJyZW50Q29sdW1ucy5zbGljZShpbmRleCArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRoaXMuaW5saW5lRWxlbWVudCA9IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmN1cnJlbnRDb2x1bW5zLm1hcChrZXkgPT4gW2tleSwgXCJcIl0pKTtcblxuICAgIHRoaXMuZHJvcGRvd25BY3Rpb25CdXR0b24gPSAodGhpcy5hY3Rpb25CdXR0b25BcnJheT8uYnV0dG9uQXJyYXkgJiYgdGhpcy5hY3Rpb25CdXR0b25BcnJheT8uYnV0dG9uQXJyYXk/Lmxlbmd0aCA+IDApID8gdGhpcy5hY3Rpb25CdXR0b25BcnJheT8uYnV0dG9uQXJyYXk/LnNsaWNlKHRoaXMuYWN0aW9uQnV0dG9uQXJyYXk/LnNpemUpIDogW107XG4gICAgXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgICB9LCAxMDApXG4gICAgdGhpcy50b3RhbENvdW50ID0gdGhpcy50b3RhbFJlY29yZHMgfHwgdGhpcy5kYXRhPy5sZW5ndGhcbiAgICB0aGlzLmZpbHRlclRhYmxlTm9zID0gdGhpcy50b3RhbFJlY29yZHMgfHwgdGhpcy5kYXRhPy5sZW5ndGhcbiAgICBpZiAodGhpcy5zdGlja3lDb2x1bW4gPT09IHRydWUgJiYgdGhpcy5jdXJyZW50Q29sdW1ucykge1xuICAgICAgdGhpcy5zdGlja3lDb25kaXRpb24gPSB0aGlzLmN1cnJlbnRDb2x1bW5zPy5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RpY2t5Q29uZGl0aW9uID0gdGhpcy5jdXJyZW50Q29sdW1ucz8ubGVuZ3RoICsgMTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VhcmNoQ29uZmlncz8uc2VhcmNoRmlsdGVyVmFsKSB7XG4gICAgICB0aGlzLnNlYXJjaEJveFZhbHVlID0gdGhpcy5zZWFyY2hDb25maWdzPy5zZWFyY2hGaWx0ZXJWYWw7IC8vIFNob3cgdmFsdWUgaW4gdGhlIHNlYXJjaCBib3hcbiAgICAgIHRoaXMucHJldlNlYXJjaCA9IHRoaXMuc2VhcmNoQ29uZmlncz8uc2VhcmNoRmlsdGVyVmFsO1xuICAgIH1cbiAgICBpZih0aGlzLmN1cnJlbnRWaWV3RmlsdGVyID09PSB1bmRlZmluZWQgfHwgdGhpcy5jdXJyZW50Vmlld0ZpbHRlciA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5jdXJyZW50Vmlld0ZpbHRlciA9IHRoaXMubGlzdFZpZXdzICYmIHRoaXMubGlzdFZpZXdzLmxlbmd0aCA+IDAgPyB0aGlzLmxpc3RWaWV3c1swXSA6IG51bGw7XG4gICAgfVxuICAgIGlmKHRoaXMuY3VycmVudFZpZXdGaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyICE9PSBudWxsKXtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gdGhpcy5jdXJyZW50Vmlld0ZpbHRlci5maWx0ZXJOYW1lO1xuICAgICAgaWYodGhpcy5jdXJyZW50Vmlld0ZpbHRlci5pc0RlZmF1bHQgfHwgdGhpcy5jdXJyZW50Vmlld0ZpbHRlci5maWx0ZXJOYW1lID09PSBcIkFsbCBEYXRhXCIpe1xuICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jdXJyZW50Vmlld0ZpbHRlcj8uY29sdW1ucyB8fCBbXTtcbiAgICAgICAgY29uc3QgdXBkYXRlQ29sdW1uID0gdGhpcy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSBjb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLm5hbWUgPT09IGNvbHVtbi5maWVsZE5hbWUpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5jb2x1bW4sXG4gICAgICAgICAgICBpc0hpZGU6ICFtYXRjaCxcbiAgICAgICAgICAgIGZpbHRlcjogISFtYXRjaD8uZmlsdGVyYWJsZSxcbiAgICAgICAgICAgIHNvcnQ6ICEhbWF0Y2g/LnNvcnRhYmxlXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY3VycmVudENvbHVtbnMgPSBbLi4udXBkYXRlQ29sdW1uXVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjdXJyZW50RmlsdGVyQ29sdW1ucyA9IHRoaXMuY3VycmVudENvbHVtbnM/LmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLmZpbHRlciA9PT0gdHJ1ZSkubWFwKGNvbHVtbiA9PiBjb2x1bW4uZmllbGROYW1lKVxuICAgIGlmIChjdXJyZW50RmlsdGVyQ29sdW1ucz8ubGVuZ3RoID4gMCAmJiB0aGlzLmNvbmZpZ1BhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm11bHRpcGxlRmlsdGVyQXJyYXkgPSB7fTtcbiAgICAgIGNvbnN0IGZpbHRPYmpzOiBhbnkgPSB7fTtcbiAgICAgIGN1cnJlbnRGaWx0ZXJDb2x1bW5zLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm11bHRpcGxlRmlsdGVyQXJyYXlbZWxlbWVudF0gPSBudWxsO1xuICAgICAgICBmaWx0T2Jqc1tlbGVtZW50XSA9IFtdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmRhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgY3VycmVudEZpbHRlckNvbHVtbnMuZm9yRWFjaCgoa2V5OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0T2JqVmFsdWUoZWxlbWVudCwga2V5KTsgIC8vIDwtIGdldCBuZXN0ZWQgdmFsdWVcbiAgICBcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZmlsdE9ianNba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheVtrZXldID0gbmV3IFNldChmaWx0T2Jqc1trZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm11bHRpcGxlRmlsdGVyQXJyYXkgPSB0aGlzLm11bHRpcGxlRmlsdGVyQXJyYXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheSA9IHRoaXMubXVsdGlwbGVGaWx0ZXI7XG4gICAgfVxuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWx0ZXJlZCBhcnJheSB0aGF0IGV4Y2x1ZGVzIGFueSBjb2x1bW4gd2l0aCAnWydcbiAgICBjb25zdCB0ZW1wRmlsdGVyQ29sdW1ucyA9IHRoaXMuY3VycmVudENvbHVtbnM/LmZpbHRlcihjb2wgPT4gIWNvbC5maWVsZE5hbWUuaW5jbHVkZXMoJ1snKSk7XG4gICAgXG4gICAgaWYgKHRlbXBGaWx0ZXJDb2x1bW5zPy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBmaWx0T2JqczogYW55ID0ge307XG4gICAgXG4gICAgICAvLyBTS1MyNk1BWTI1IEluaXRpYWxpemUgc2V0cyB0byBjb2xsZWN0IHVuaXF1ZSB2YWx1ZXMgZm9yIGVhY2ggY29sdW1uXG4gICAgICB0ZW1wRmlsdGVyQ29sdW1ucy5mb3JFYWNoKChjb2w6IGFueSkgPT4ge1xuICAgICAgICBmaWx0T2Jqc1tjb2wuZmllbGROYW1lXSA9IG5ldyBTZXQoKTtcbiAgICAgIH0pO1xuICAgIFxuICAgICAgLy8gU0tTMjZNQVkyNSBDb2xsZWN0IHVuaXF1ZSB2YWx1ZXMgZnJvbSB0YWJsZUZpbHRlckRhdGFcbiAgICAgIHRoaXMudGFibGVGaWx0ZXJEYXRhPy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgdGVtcEZpbHRlckNvbHVtbnMuZm9yRWFjaCgoY29sOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0T2JqVmFsdWUoZWxlbWVudCwgY29sLmZpZWxkTmFtZSk7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZpbHRPYmpzW2NvbC5maWVsZE5hbWVdLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIFxuICAgICAgLy8gU0tTMjZNQVkyNSBBcHBlbmQgXCJ2YWx1ZVwiIHByb3BlcnR5IHRvIGVhY2ggY29sdW1uIG9iamVjdCB3aXRoIHRoZSBhcnJheSBvZiB1bmlxdWUgdmFsdWVzXG4gICAgICB0aGlzLnRhYmxlRmlsdGVyQXJyYXkgPSBbLi4udGVtcEZpbHRlckNvbHVtbnMubWFwKChjb2w6IGFueSkgPT4gKHtcbiAgICAgICAgLi4uY29sLFxuICAgICAgICB2YWx1ZTogQXJyYXkuZnJvbShmaWx0T2Jqc1tjb2wuZmllbGROYW1lXSlcbiAgICAgIH0pKV07XG4gICAgfSAgICBcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRhYmxlQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHRhYmxlQm9keSA9IHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudGFibGUtYm9keScpO1xuICAgICAgICBpZiAodGFibGVCb2R5ICYmIHRoaXMuaXNQYWdpbmF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5pc1NoYWRvd0hpZGRlbiA9ICEodGFibGVCb2R5LnNjcm9sbEhlaWdodCA8IDQ1MClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDE1MDApOyAvLyBXYWl0cyAxMDBtcyBmb3IgcmVuZGVyaW5nXG4gICAgLy8gU0tTMjBNQVIyNSBJbml0aWFsaXplIHN1bW1hcnlWYWx1ZXMgZm9yIGlucHV0IHJvd3MgYW5kIGNvbXB1dGUgdmFsdWVzXG4gICAgaWYgKGNoYW5nZXNbJ3N1bW1hcnlSb3dzJ10gfHwgY2hhbmdlc1snc3VtbWFyeUNvbHVtbnMnXSB8fCBjaGFuZ2VzWydkYXRhJ10pIHtcbiAgICAgIHRoaXMuY29tcHV0ZVN1bW1hcnlDb2x1bW5zKCk7IC8vIENvbXB1dGUgcGVyLXJvdyBzdW1tYXJ5IGNvbHVtbnMgZmlyc3RcbiAgICAgIHRoaXMuc3VtbWFyeVJvd3M/LmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgaWYgKHJvdy50eXBlID09PSAnaW5wdXQnICYmIHRoaXMuc3VtbWFyeVZhbHVlc1tyb3cuZmllbGROYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5zdW1tYXJ5VmFsdWVzW3Jvdy5maWVsZE5hbWVdID0gMDsgLy8gRGVmYXVsdCB0byAwIGZvciBpbnB1dHNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbXB1dGVTdW1tYXJ5VmFsdWVzKCdvbkNoYW5nZScpO1xuICAgIH1cbiAgICB0aGlzLnNlYXJjaENvbmZpZ3MgJiYgdGhpcy5zZWFyY2hCb3hWYWx1ZSA/IHRoaXMuZW1wdHlTZWFyY2godGhpcy5zZWFyY2hCb3hWYWx1ZSkgOiB0aGlzLmFwcGx5RmlsdGVyKHRoaXMudGFibGVQYXJhbXM/LnRhYmxlU2VhcmNoLCdvbkNoYW5nZScpIC8vIFNLUzE3QVBSMjUgdXBkYXRlIHNlYXJjaCBib3ggdmFsdWVcbiAgICBpZiAoY2hhbmdlc1snbGFuZ3VhZ2VDb2RlJ10pIHtcbiAgICAgIGlmICh0aGlzLmxhbmd1YWdlQ29kZSkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS5zZXRMYW5ndWFnZSh0aGlzLmxhbmd1YWdlQ29kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPGFueT4odHJ1ZSwgW10pO1xuICAgIGlmICghdGhpcy50b3RhbFJlY29yZHMgJiYgdGhpcy5kYXRhICYmIHRoaXMuaXNQYWdpbmF0aW9uICYmICFjaGFuZ2VzWyd0YWJsZVBhcmFtcyddKSB7XG4gICAgICBjb25zdCBwYWdlSW5kZXggPSBOdW1iZXIodGhpcy5wYWdlSW5kZXgpIHx8IDA7XG4gICAgICBjb25zdCBwYWdlU2l6ZSA9IE51bWJlcih0aGlzLnBhZ2VTaXplKSB8fCAxMDtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gKHBhZ2VJbmRleCAtIDEpICogcGFnZVNpemU7XG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIHBhZ2VTaXplO1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLmRhdGE/LnNsaWNlKHN0YXJ0LCBlbmQpIHx8IFtdO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YVxuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IHsgZGF0YTogW10gfTsgLy8gb3IgdXNlIGEgcHJvcGVyIGRhdGEgc3RydWN0dXJlXG4gICAgdGhpcy5jdXJyZW50Q29sdW1ucyA9IHRoaXMuY29sdW1uc1xuICAgIC8vIFNLUzEzTUFSMjUgZ2V0IGRhdGEgZnJvbSBxdWVzdGlvbiBpZiBmcm9tIGZvcm1CdWlsZGVyXG4gICAgaWYgKHRoaXMuZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJykge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmNoYW5nZVNlcnZpY2UuY3VzdG9tQ2hhbmdlJC5zdWJzY3JpYmUoXG4gICAgICAgIChjaGFuZ2VWYWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChjaGFuZ2VWYWx1ZSA9PSAnZGF0YUJpbmQnKSB7XG4gICAgICAgICAgICB0aGlzLm5nT25DaGFuZ2VzKHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLnF1ZXN0aW9uPy5pbnB1dCA/IHRoaXMucXVlc3Rpb24/LmlucHV0IDogdGhpcy5kYXRhID8gdGhpcy5kYXRhIDogW11cbiAgICAgIGxldCBwYXJzZWRNZXRhID0gdHlwZW9mIHRoaXMucXVlc3Rpb24/LlsnZmllbGRzTWV0YSddID09PSAnb2JqZWN0JyA/IHRoaXMucXVlc3Rpb24/LlsnZmllbGRzTWV0YSddIDogdGhpcy5xdWVzdGlvbj8uWydmaWVsZHNNZXRhJ10gPyBKU09OLnBhcnNlKHRoaXMucXVlc3Rpb24/LlsnZmllbGRzTWV0YSddKSA6IFtdO1xuICAgICAgaWYgKCBwYXJzZWRNZXRhID09PSBudWxsIHx8ICBwYXJzZWRNZXRhID09PSB1bmRlZmluZWQgfHwgIUFycmF5LmlzQXJyYXkocGFyc2VkTWV0YSkgfHwgcGFyc2VkTWV0YT8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignTm8gdmFsaWQgbWV0YWRhdGEgcHJvdmlkZWQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU0tTMjJKVUwyNSBUcmFuc2Zvcm0gdGhlIHBhcnNlZE1ldGFcbiAgICAgIGNvbnN0IHVwZGF0ZWRNZXRhID0gcGFyc2VkTWV0YS5tYXAoaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB7IC4uLml0ZW0gfTtcbiAgICAgICAgLy8gUmVuYW1lIGFwaU5hbWUgdG8gZmllbGROYW1lXG4gICAgICAgIGlmIChuZXdJdGVtLmFwaU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5ld0l0ZW0uZmllbGROYW1lID0gbmV3SXRlbS5hcGlOYW1lO1xuICAgICAgICAgIGRlbGV0ZSBuZXdJdGVtLmFwaU5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU0tTMjJKVUwyNSBSZW5hbWUgZmxkVHlwZSB0byB0eXBlIGFuZCBsb3dlcmNhc2UgaXRcbiAgICAgICAgaWYgKG5ld0l0ZW0uZmxkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3SXRlbS50eXBlID0gbmV3SXRlbS5mbGRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgZGVsZXRlIG5ld0l0ZW0uZmxkVHlwZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SXRlbTtcbiAgICAgIH0pO1xuICAgICAgcGFyc2VkTWV0YSA9IHVwZGF0ZWRNZXRhO1xuICAgICAgdGhpcy5jdXJyZW50Q29sdW1ucyA9IHVwZGF0ZWRNZXRhXG4gICAgICBpZiAodGhpcy50YWJsZUNvbmZpZykge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLnRhYmxlQ29uZmlnO1xuICAgICAgICB0aGlzLmlzTm9zSW5kaWNhdG9yID0gY29uZmlnPy5pc05vc0luZGljYXRvciAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRkSW5saW5lUmVjb3JkID0gY29uZmlnLmFkZElubGluZVJlY29yZCAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNQYWdpbmF0aW9uID0gY29uZmlnLmlzUGFnaW5hdGlvbiAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uID0gY29uZmlnLmFjdGlvbkJ1dHRvbiAhPT0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNEZWxldGVSb3cgPSBjb25maWcuaXNEZWxldGVSb3cgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRWRpdFJvdyA9IGNvbmZpZy5pc0VkaXRSb3cgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLnNlYXJjaEJhciA9IGNvbmZpZy5zZWFyY2hCYXIgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQnV0dG9ucyA9IGNvbmZpZy5pc0J1dHRvbnMgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLnBhZ2VTaXplID0gY29uZmlnLml0ZW1zUGVyUGFnZSB8fCA1O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN1bW1hcnlDb2x1bW5zID0gcGFyc2VkTWV0YVxuICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uc3VtbWFyeUNvbHVtbiA9PT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeyBhcGlOYW1lLCBmbGRUeXBlLCAuLi5yZXN0IH0pID0+ICh7XG4gICAgICAgICAgZmllbGROYW1lOiBhcGlOYW1lLFxuICAgICAgICAgIHR5cGU6IGZsZFR5cGUsXG4gICAgICAgICAgLi4ucmVzdFxuICAgICAgICB9KSk7XG4gICAgICB0aGlzLnN1bW1hcnlSb3dzID0gcGFyc2VkTWV0YVxuICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uc3VtbWFyeVJvdyA9PT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeyBhcGlOYW1lLCBmbGRUeXBlLCAuLi5yZXN0IH0pID0+ICh7XG4gICAgICAgICAgZmllbGROYW1lOiBhcGlOYW1lLFxuICAgICAgICAgIHR5cGU6IGZsZFR5cGUsXG4gICAgICAgICAgLi4ucmVzdFxuICAgICAgICB9KSk7XG4gICAgICAgIGlmICh0aGlzLmFwaU1ldGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxldCBvcHRpb25zID0gW107XG4gICAgICAgICAgLy8gQVAtMjZNQVIyNSBFbnN1cmUgdGhhdCB0aGlzLmFwaU1ldGEgaXMgYWx3YXlzIGFuIG9iamVjdC4gIFxuICAgICAgICAgLy9BUC0yNk1BUjI1IElmIGl0J3MgYWxyZWFkeSBhbiBvYmplY3QsIGtlZXAgaXQgYXMgaXM7IG90aGVyd2lzZSwgcGFyc2UgaXQgZnJvbSBhIEpTT04gc3RyaW5nLlxuICAgICAgICAgIHRoaXMuYXBpTWV0YSA9IHR5cGVvZiB0aGlzLmFwaU1ldGEgPT09ICdvYmplY3QnID8gdGhpcy5hcGlNZXRhIDogSlNPTi5wYXJzZSh0aGlzLmFwaU1ldGEpO1xuICAgICAgICAgIGxldCBhcGlPYmo6IGFueSA9IHRoaXMuYXBpTWV0YTtcbiAgICAgICAgICBpZiAoYXBpT2JqICYmIGFwaU9iai5lbmRwb2ludCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5hcGlSZXNwb25zZShhcGlPYmouZW5kcG9pbnQpPy5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgIGxldCByZXNwb25zZXM7XG4gICAgICAgICAgICAgIGlmIChhcGlPYmoudmFyaWFibGUpIHtcbiAgICAgICAgICAgICAgICAvLyBWRCAyMk1heTI0IC0gaGFuZGxpbmcgbXVsdGlwbGUgY2hpbGQgb2JqZWN0c1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlcyA9IHRoaXMuZGF0YVNlcnZpY2UuZ2V0VmFsdWUoYXBpUmVzcG9uc2UsIGFwaU9iai52YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgICAgICAgICAvLyBIQSAxOUpBTjI0IFRvIGF2b2lkIHVuZGVmaW5lZCBlcnJvciBpbiBjb25zb2xlXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZXM/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgcmVzcCA9IHJlc3BvbnNlc1tpXTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXNwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHJlc3VsdHM7XG4gICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBWRCAxOUpBTjI0IC0gaWYgcmVzcG9uc2UgaGFzIHZhbHVlKHdoaWNoIGlzIGFycmF5KSBvbmx5XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gYXBpUmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgb3B0aW9ucyA9IHJlc3BvbnNlcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5tYXAoKG9iajogYW55KSA9PiAoeyAuLi5vYmosIGVkaXQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgICAgdGhpcy5kYXRhID0gb3B0aW9ucztcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVkQgTk9WMjMgLSBoYW5kbGUgdGhlIGRlcGVuZGVudCB1cGRhdGUgZm9yIGRyb3Bkb3duXG4gICAgICAgICAgbGV0IHNvdXJjZUlkID0gYXBpT2JqPy5zb3VyY2VRdWVzdGlvbklkO1xuICAgICAgICAgIGxldCBmaWVsZCA9IGFwaU9iaj8uZmllbGQ7ICAgICAgICAvLyBWRCAxM01BWTI0IC0gZHluYW1pYyBmaWVsZCBjaGFuZ2VzXG4gICAgICAgICAgaWYgKHNvdXJjZUlkKSB7XG4gICAgICAgICAgICAvLyAvLyBWRCAxME1heTI0IFN1YnNjcmliZSBmb3IgdGhlIGNoYW5nZXNcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jaGFuZ2VTZXJ2aWNlLmNoYW5nZUFubm91bmNlZCQuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAoY2hhbmdlVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlVmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlVmFsdWUudmFsdWVPYmogIT0gdW5kZWZpbmVkICYmIGNoYW5nZVZhbHVlLmZyb21RdWVzdGlvbklkICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlVmFsdWUuZnJvbVF1ZXN0aW9uSWQgIT09IG51bGwgJiYgY2hhbmdlVmFsdWUuZnJvbVF1ZXN0aW9uSWQgIT09ICcnICYmICBhcGlPYmouc291cmNlUXVlc3Rpb25JZCAhPT0gdW5kZWZpbmVkICYmIGFwaU9iai5zb3VyY2VRdWVzdGlvbklkICE9PSBudWxsICYmIGFwaU9iai5zb3VyY2VRdWVzdGlvbklkICE9PSAnJyAmJiBjaGFuZ2VWYWx1ZS5mcm9tUXVlc3Rpb25JZCA9PSBhcGlPYmouc291cmNlUXVlc3Rpb25JZCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5tYXAoKG9iajogYW55KSA9PiAoeyAuLi5vYmosIGVkaXQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBjaGFuZ2VWYWx1ZS52YWx1ZU9iajtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbGlkSXRlbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZEIDEzTUFZMjQgLSBiaW5kIGR5bmFtaWMgZmllbGRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBWRCAyNkp1bjI0IC0gdG8gaGFuZGxlIG11bHRpcGxlIG9iamVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iakVsZW1lbnRWYWx1ZSA9IHRoaXMuZGF0YVNlcnZpY2UuZ2V0VmFsdWUoZWxlbWVudCwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqSXRlbVZhbHVlID0gdGhpcy5kYXRhU2VydmljZS5nZXRWYWx1ZShpdGVtLCBmaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmpFbGVtZW50VmFsdWUgPT0gb2JqSXRlbVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkSXRlbSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vUlMgMTRGRUIyMDI1XG4gICAgICAgICAgICAgICAgICAgIC8vVXBkYXRlIFBhZ2luYXRpb24gYmVmb3JlIGVtaXRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gWy4uLnRoaXMuZGF0YSwgaXRlbV07XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbLi4udGhpcy5kYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IFsuLi50aGlzLmRhdGFdO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc0ZpbHRlckRhdGEgPSBbLi4udGhpcy5kYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlc3Rpb24uaW5wdXQgPSB0aGlzLm9yaWdpbmFsRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmVtaXRUYWJsZURhdGFWYWx1ZSh7ZGF0YTogdGhpcy5kYXRhLCBzdW1tYXJ5VmFsdWVzOiB0aGlzLnN1bW1hcnlWYWx1ZXN9KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTS1MyME1BUjI1IE1hbnVhbGx5IHRyaWdnZXIgbmdPbkNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nT25DaGFuZ2VzKHt9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVNlcnZpY2UuY29uZmlybUNoYW5nZShhcGlPYmo/LnNvdXJjZVF1ZXN0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zZWFyY2hCYXIgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnNlYXJjaEJhciA9PT0gdHJ1ZSA/IHRoaXMuc2VhcmNoQmFyID0gdHJ1ZSA6IHRoaXMuc2VhcmNoQmFyID0gZmFsc2U7XG4gICAgdGhpcy53aXRoQ2hlY2tCb3ggPT09IHVuZGVmaW5lZCB8fCB0aGlzLndpdGhDaGVja0JveCA9PT0gZmFsc2UgPyB0aGlzLndpdGhDaGVja0JveCA9IGZhbHNlIDogdGhpcy53aXRoQ2hlY2tCb3ggPSB0cnVlO1xuICAgIHRoaXMuaXNFZGl0Um93ID09PSB1bmRlZmluZWQgfHwgdGhpcy5pc0VkaXRSb3cgPT09IGZhbHNlID8gdGhpcy5pc0VkaXRSb3cgPSBmYWxzZSA6IHRoaXMuaXNFZGl0Um93ID0gdHJ1ZTtcbiAgICB0aGlzLmlzRGVsZXRlUm93ID09PSB1bmRlZmluZWQgfHwgdGhpcy5pc0RlbGV0ZVJvdyA9PT0gZmFsc2UgPyB0aGlzLmlzRGVsZXRlUm93ID0gZmFsc2UgOiB0aGlzLmlzRGVsZXRlUm93ID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGlvbkJ1dHRvbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuYWN0aW9uQnV0dG9uID09PSBmYWxzZSA/IHRoaXMuYWN0aW9uQnV0dG9uID0gZmFsc2UgOiB0aGlzLmFjdGlvbkJ1dHRvbiA9IHRydWU7XG4gICAgdGhpcy5pc0J1dHRvbnMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmlzQnV0dG9ucyA9PT0gZmFsc2UgPyB0aGlzLmlzQnV0dG9ucyA9IGZhbHNlIDogdGhpcy5pc0J1dHRvbnMgPSB0cnVlO1xuICAgIHRoaXMuYWRkSW5saW5lUmVjb3JkID09PSB1bmRlZmluZWQgfHwgdGhpcy5hZGRJbmxpbmVSZWNvcmQgPT09IGZhbHNlID8gdGhpcy5hZGRJbmxpbmVSZWNvcmQgPSBmYWxzZSA6IHRoaXMuYWRkSW5saW5lUmVjb3JkID0gdHJ1ZTtcbiAgICB0aGlzLmlzUGFnaW5hdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuaXNQYWdpbmF0aW9uID09PSB0cnVlID8gdGhpcy5pc1BhZ2luYXRpb24gPSB0cnVlIDogdGhpcy5pc1BhZ2luYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmlzTm9zSW5kaWNhdG9yID09PSB1bmRlZmluZWQgfHwgdGhpcy5pc05vc0luZGljYXRvciA9PT0gdHJ1ZSA/IHRoaXMuaXNOb3NJbmRpY2F0b3IgPSB0cnVlIDogdGhpcy5pc05vc0luZGljYXRvciA9IGZhbHNlO1xuICAgIHRoaXMuaXNFZGl0YWJsZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuaXNFZGl0YWJsZSA9PT0gZmFsc2UgPyB0aGlzLmlzRWRpdGFibGUgPSBmYWxzZSA6IHRoaXMuaXNFZGl0YWJsZSA9IHRydWVcblxuICAgIHRoaXMuaW5saW5lRWxlbWVudCA9IE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmN1cnJlbnRDb2x1bW5zLm1hcChrZXkgPT4gW2tleSwgXCJcIl0pKTtcblxuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnBhZ2luYXRpb24/LnBhZ2VTaXplID8gdGhpcy5wYWdpbmF0aW9uWydwYWdlU2l6ZSddIDogdGhpcy50YWJsZVBhcmFtcz8ucGFnaW5hdGlvbj8ucGFnZVNpemUgfHwxMDtcbiAgICB0aGlzLnBhZ2VJbmRleCA9IHRoaXMucGFnaW5hdGlvbj8ucGFnZUluZGV4ID8gdGhpcy5wYWdpbmF0aW9uWydwYWdlSW5kZXgnXSA6IHRoaXMudGFibGVQYXJhbXM/LnBhZ2luYXRpb24/LnBhZ2VJbmRleCB8fDE7XG4gICAgdGhpcy50b3RhbFJlY29yZHMgPSB0aGlzLnBhZ2luYXRpb24/LnRvdGFsUmVjb3JkcyA/IHRoaXMucGFnaW5hdGlvblsndG90YWxSZWNvcmRzJ10gOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnMgPSB0aGlzLnBhZ2luYXRpb24/LnBhZ2VTaXplT3B0aW9ucyA/IHRoaXMucGFnaW5hdGlvblsncGFnZVNpemVPcHRpb25zJ10gOiBbJzUnLCAnMTAnLCAnMjUnLCAnNTAnLCAnMTAwJywgJzIwMCddO1xuICAgIHRoaXMuY29uZmlnUGFnaW5hdGlvbiA9ICEhKHRoaXMucGFnaW5hdGlvbiAmJiBPYmplY3Qua2V5cyh0aGlzLnBhZ2luYXRpb24pLmxlbmd0aCA+IDApO1xuXG4gICAgdGhpcy5kcm9wZG93bkFjdGlvbkJ1dHRvbiA9IHRoaXMuYWN0aW9uQnV0dG9uQXJyYXk/LmJ1dHRvbkFycmF5Py5zbGljZSh0aGlzLmFjdGlvbkJ1dHRvbkFycmF5Py5zaXplKTtcblxuICAgIHRoaXMub3JpZ2luYWxEYXRhID0gWy4uLnRoaXMuZGF0YV07XG4gICAgdGhpcy5zRmlsdGVyRGF0YSA9IFsuLi50aGlzLmRhdGFdO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5vcmlnaW5hbERhdGE7XG5cbiAgICAvLyBTS1MyME1BUjI1IENoZWNrIGlmIHRoZSBkaXNwbHljb2x1bW4ncyBoYXZlIGEgc3VtbWFyeSBjb2x1bW5cbiAgICBpZiAodGhpcy5zdW1tYXJ5Um93cyAmJiB0aGlzLnN1bW1hcnlSb3dzPy5sZW5ndGggPiAwICYmIHRoaXMuY3VycmVudENvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pc0Z1bGxUYWJsZVN1bW1hcnlSb3cgPSB0aGlzLnN1bW1hcnlSb3dzWzBdLnR5cGUgPT09ICdmdWxsUm93JyB8fCAgdGhpcy5zdW1tYXJ5Um93c1swXS50eXBlID09PSAnZnVsbHJvdycgPyB0cnVlIDogZmFsc2U7XG4gICAgICB0aGlzLmlzU3VtbWFyeUNvbHVtbiA9IHRoaXMuY3VycmVudENvbHVtbnMuc29tZShlbGVtZW50ID0+IGVsZW1lbnQgPT09IHRoaXMuc3VtbWFyeVJvd3NbMF0uY29sdW1uKTtcbiAgICAgIGlmICh0aGlzLmlzU3VtbWFyeUNvbHVtbiAmJiAhdGhpcy5pc0Z1bGxUYWJsZVN1bW1hcnlSb3cpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmN1cnJlbnRDb2x1bW5zLmluZGV4T2YodGhpcy5zdW1tYXJ5Um93c1swXS5jb2x1bW4pO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5pc1N1bW1hcnlTdGFydENvbHVtbiA9IHRoaXMuY3VycmVudENvbHVtbnMuc2xpY2UoMCwgaW5kZXggLSAxKTtcbiAgICAgICAgICB0aGlzLmlzU3VtbWFyeUVuZENvbHVtbiA9IHRoaXMuY3VycmVudENvbHVtbnMuc2xpY2UoaW5kZXggKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmKHRoaXMuY3VycmVudFZpZXdGaWx0ZXIgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyID09PSBudWxsKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyID0gdGhpcy5saXN0Vmlld3MgJiYgdGhpcy5saXN0Vmlld3MubGVuZ3RoID4gMCA/IHRoaXMubGlzdFZpZXdzWzBdIDogbnVsbDtcbiAgICB9XG4gICAgaWYodGhpcy5jdXJyZW50Vmlld0ZpbHRlciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY3VycmVudFZpZXdGaWx0ZXIgIT09IG51bGwpe1xuICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyLmZpbHRlck5hbWU7XG4gICAgICBpZih0aGlzLmN1cnJlbnRWaWV3RmlsdGVyLmlzRGVmYXVsdCB8fCB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyLmZpbHRlck5hbWUgPT09IFwiQWxsIERhdGFcIil7XG4gICAgICAgIHRoaXMuY3VycmVudENvbHVtbnMgPSB0aGlzLmNvbHVtbnNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmN1cnJlbnRWaWV3RmlsdGVyPy5jb2x1bW5zIHx8IFtdO1xuICAgICAgICBjb25zdCB1cGRhdGVDb2x1bW4gPSB0aGlzLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gY29sdW1uLmZpZWxkTmFtZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmNvbHVtbixcbiAgICAgICAgICAgIGlzSGlkZTogIW1hdGNoLFxuICAgICAgICAgICAgZmlsdGVyOiAhIW1hdGNoPy5maWx0ZXJhYmxlLFxuICAgICAgICAgICAgc29ydDogISFtYXRjaD8uc29ydGFibGVcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1ucyA9IFsuLi51cGRhdGVDb2x1bW5dXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRGaWx0ZXJDb2x1bW5zID0gdGhpcy5jdXJyZW50Q29sdW1ucz8uZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZmlsdGVyID09PSB0cnVlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5maWVsZE5hbWUpXG4gICAgaWYgKGN1cnJlbnRGaWx0ZXJDb2x1bW5zPy5sZW5ndGggPiAwICYmIHRoaXMuY29uZmlnUGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheSA9IHt9O1xuICAgICAgY29uc3QgZmlsdE9ianM6IGFueSA9IHt9O1xuICAgICAgY3VycmVudEZpbHRlckNvbHVtbnMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheVtlbGVtZW50XSA9IG51bGw7XG4gICAgICAgIGZpbHRPYmpzW2VsZW1lbnRdID0gW107XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICBjdXJyZW50RmlsdGVyQ29sdW1ucy5mb3JFYWNoKChrZXk6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRPYmpWYWx1ZShlbGVtZW50LCBrZXkpOyAgLy8gPC0gZ2V0IG5lc3RlZCB2YWx1ZVxuICAgIFxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmaWx0T2Jqc1trZXldLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZUZpbHRlckFycmF5W2tleV0gPSBuZXcgU2V0KGZpbHRPYmpzW2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheSA9IHRoaXMubXVsdGlwbGVGaWx0ZXJBcnJheTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tdWx0aXBsZUZpbHRlckFycmF5ID0gdGhpcy5tdWx0aXBsZUZpbHRlcjtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbHRlcmVkIGFycmF5IHRoYXQgZXhjbHVkZXMgYW55IGNvbHVtbiB3aXRoICdbJ1xuICAgIGNvbnN0IHRlbXBGaWx0ZXJDb2x1bW5zID0gdGhpcy5jb2x1bW5zPy5maWx0ZXIoY29sID0+ICFjb2wuZmllbGROYW1lLmluY2x1ZGVzKCdbJykpO1xuICAgIFxuICAgIGlmICh0ZW1wRmlsdGVyQ29sdW1ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlsdE9ianM6IGFueSA9IHt9O1xuICAgIFxuICAgICAgLy8gU0tTMjZNQVkyNSBJbml0aWFsaXplIHNldHMgdG8gY29sbGVjdCB1bmlxdWUgdmFsdWVzIGZvciBlYWNoIGNvbHVtblxuICAgICAgdGVtcEZpbHRlckNvbHVtbnMuZm9yRWFjaCgoY29sOiBhbnkpID0+IHtcbiAgICAgICAgZmlsdE9ianNbY29sLmZpZWxkTmFtZV0gPSBuZXcgU2V0KCk7XG4gICAgICB9KTtcbiAgICBcbiAgICAgIC8vIFNLUzI2TUFZMjUgQ29sbGVjdCB1bmlxdWUgdmFsdWVzIGZyb20gdGFibGVGaWx0ZXJEYXRhXG4gICAgICB0aGlzLnRhYmxlRmlsdGVyRGF0YT8uZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICAgIHRlbXBGaWx0ZXJDb2x1bW5zLmZvckVhY2goKGNvbDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE9ialZhbHVlKGVsZW1lbnQsIGNvbC5maWVsZE5hbWUpO1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmaWx0T2Jqc1tjb2wuZmllbGROYW1lXS5hZGQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICBcbiAgICAgIC8vIFNLUzI2TUFZMjUgQXBwZW5kIFwidmFsdWVcIiBwcm9wZXJ0eSB0byBlYWNoIGNvbHVtbiBvYmplY3Qgd2l0aCB0aGUgYXJyYXkgb2YgdW5pcXVlIHZhbHVlc1xuICAgICAgdGhpcy50YWJsZUZpbHRlckFycmF5ID0gWy4uLnRlbXBGaWx0ZXJDb2x1bW5zLm1hcCgoY29sOiBhbnkpID0+ICh7XG4gICAgICAgIC4uLmNvbCxcbiAgICAgICAgdmFsdWU6IEFycmF5LmZyb20oZmlsdE9ianNbY29sLmZpZWxkTmFtZV0pXG4gICAgICB9KSldXG4gICAgfSAgICAgICAgICBcbiAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxhbnk+KHRydWUsIFtdKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICAgIH0sIDApXG4gICAgdGhpcy50b3RhbENvdW50ID0gdGhpcy50b3RhbFJlY29yZHMgfHwgdGhpcy5kYXRhPy5sZW5ndGhcbiAgICB0aGlzLmZpbHRlclRhYmxlTm9zID0gdGhpcy50b3RhbFJlY29yZHMgfHwgdGhpcy5kYXRhPy5sZW5ndGhcbiAgICBjb25zdCBOeHREYXRhVGFibGUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdOeHREYXRhVGFibGUnKSk7XG4gICAgdGhpcy5jdXJyZW50U29ydENvbHVtbiA9IE54dERhdGFUYWJsZT8uY3VycmVudFNvcnRDb2x1bW47XG4gICAgdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiA9IE54dERhdGFUYWJsZT8uY3VycmVudFNvcnREaXJlY3Rpb247XG4gICAgaWYgKE54dERhdGFUYWJsZT8uYWRkUmVjb3JkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnBhZ2VTaXplID0gTnh0RGF0YVRhYmxlPy5wYWdlU2l6ZVxuICAgICAgdGhpcy5wYWdlSW5kZXggPSBOeHREYXRhVGFibGU/LnBhZ2VJbmRleFxuICAgICAgdmFyIG9iajogYW55ID0ge307XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5pbmxpbmVFbGVtZW50KTtcbiAgICAgIGtleXMuZm9yRWFjaCgoZWxlbWVudEtleTogYW55KSA9PiB7XG4gICAgICAgIG9ialtlbGVtZW50S2V5XSA9ICcnO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmRhdGEucHVzaChvYmopO1xuICAgICAgY29uc3QgZGF0YTogYW55ID0gdGhpcy5kYXRhO1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBkYXRhO1xuXG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QodGhpcy5kYXRhW3RoaXMuZGF0YS5sZW5ndGggLSAxXSk7XG4gICAgICB0aGlzLmRhdGFbdGhpcy5kYXRhLmxlbmd0aCAtIDFdLmVkaXRSb3cgPSB0cnVlO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ054dERhdGFUYWJsZScsIEpTT04uc3RyaW5naWZ5KHsgYWRkUmVjb3JkOiBmYWxzZSwgcGFnZVNpemU6IDEwLCBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LCBjdXJyZW50U29ydENvbHVtbjogdGhpcy5jdXJyZW50U29ydENvbHVtbiwgY3VycmVudFNvcnREaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gfSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGlja3lDb2x1bW4gPT09IHRydWUgJiYgdGhpcy5jdXJyZW50Q29sdW1ucykge1xuICAgICAgdGhpcy5zdGlja3lDb25kaXRpb24gPSB0aGlzLmN1cnJlbnRDb2x1bW5zPy5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RpY2t5Q29uZGl0aW9uID0gdGhpcy5jdXJyZW50Q29sdW1ucz8ubGVuZ3RoICsgMTtcbiAgICB9XG5cbiAgICAvLyBTS1MxOU1BUjI1IGFkZCBmaXJzdCBsaW5lIGZvciBmb3JtYnVpbGRlciB0YWJsZVxuICAgIGlmICh0aGlzLmlzRWRpdGFibGUgJiYgdGhpcy5kYXRhLmxlbmd0aCA9PT0gMCkgeyB0aGlzLmFkZFRhYmxlUmVjb3JkKCB0aGlzLmlubGluZUVsZW1lbnQsIFwib25Jbml0XCIpIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudGFibGVDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgdGFibGVCb2R5ID0gdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy50YWJsZS1ib2R5Jyk7XG4gICAgICAgIGlmICh0YWJsZUJvZHkgJiYgdGhpcy5pc1BhZ2luYXRpb24pIHtcbiAgICAgICAgICB0aGlzLmlzU2hhZG93SGlkZGVuID0gISh0YWJsZUJvZHkuc2Nyb2xsSGVpZ2h0IDwgNDUwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMTUwMCk7IC8vIFdhaXRzIDEwMG1zIGZvciByZW5kZXJpbmdcbiAgICAvLyBTS1MxN0FQUjI1IHRhYmxlIHBhcmVtcyBkYXRhIHVwZGF0ZVxuICAgIGlmICh0aGlzLnNlYXJjaENvbmZpZ3M/LnNlYXJjaEZpbHRlclZhbCkge1xuICAgICAgdGhpcy5zZWFyY2hCb3hWYWx1ZSA9IHRoaXMuc2VhcmNoQ29uZmlncz8uc2VhcmNoRmlsdGVyVmFsOyAvLyBTaG93IHZhbHVlIGluIHRoZSBzZWFyY2ggYm94XG4gICAgICB0aGlzLnByZXZTZWFyY2ggPSB0aGlzLnNlYXJjaENvbmZpZ3M/LnNlYXJjaEZpbHRlclZhbDtcbiAgICB9IGVsc2UgaWYodGhpcy50YWJsZVBhcmFtcz8udGFibGVTZWFyY2gpe1xuICAgICAgdGhpcy5zZWFyY2hCb3hWYWx1ZSA9IHRoaXMudGFibGVQYXJhbXM/LnRhYmxlU2VhcmNoO1xuICAgIH1cbiAgICB0aGlzLnNlYXJjaENvbmZpZ3MgJiYgdGhpcy5zZWFyY2hCb3hWYWx1ZSA/IHRoaXMuZW1wdHlTZWFyY2godGhpcy5zZWFyY2hCb3hWYWx1ZSkgOiAnJ1xuICAgIHRoaXMuZmlsdGVyRGF0YUFycmF5ID0gdGhpcy50YWJsZVBhcmFtcz8uc2VhcmNoRmlsdGVyRGF0YSA/IHRoaXMudGFibGVQYXJhbXM/LnNlYXJjaEZpbHRlckRhdGEgOiB7fTtcbiAgICB0aGlzLnNvcnREYXRhKHRoaXMudGFibGVQYXJhbXM/LnNvcnQ/LmNvbHVtbiwgdGhpcy50YWJsZVBhcmFtcz8uc29ydD8uZGlyZWN0aW9uLHRydWUpXG4gICAgbGV0IGxhbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGFuZ3VhZ2UnKVxuICAgIGlmICh0aGlzLmxhbmd1YWdlQ29kZSkge1xuICAgICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2Uuc2V0TGFuZ3VhZ2UodGhpcy5sYW5ndWFnZUNvZGUpO1xuICAgIH0gZWxzZSBpZihsYW5nICYmIGxhbmcgIT09ICcnKSB7XG4gICAgICB0aGlzLmxhbmd1YWdlQ29kZSA9IGxhbmdcbiAgICB9XG4gICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRpb25zTG9hZGVkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7IC8vIEZvcmNlIHBpcGUgcmUtZXZhbHVhdGlvblxuICAgIH0pO1xuICAgIGlmICh0aGlzLmNvbmZpZ1BhZ2luYXRpb24gPT09IGZhbHNlICYmIHRoaXMuZGF0YSAmJiB0aGlzLmlzUGFnaW5hdGlvbikge1xuICAgICAgY29uc3QgcGFnZUluZGV4ID0gTnVtYmVyKHRoaXMucGFnZUluZGV4KSB8fCAwO1xuICAgICAgY29uc3QgcGFnZVNpemUgPSBOdW1iZXIodGhpcy5wYWdlU2l6ZSkgfHwgMTA7XG4gICAgICBjb25zdCBzdGFydCA9IChwYWdlSW5kZXggLSAxKSAqIHBhZ2VTaXplO1xuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBwYWdlU2l6ZTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5kYXRhPy5zbGljZShzdGFydCwgZW5kKSB8fCBbXTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzUGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLmRhdGFcbiAgICB9XG4gICAgdGhpcy5zdW1tYXJ5Um93cz8ubGVuZ3RoID4gMCA/IHRoaXMuY29tcHV0ZVN1bW1hcnlWYWx1ZXMoJ29uQ2hhbmdlJykgOicnOyAvLyBDb21wdXRlIHBlci1yb3cgc3VtbWFyeSBjb2x1bW5zIGZpcnN0XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbHVtblJlc2l6ZXJzKCk7XG4gIH1cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29sdW1uUmVzaXplcnMoKSB7XG4gICAgLy8gU0tTMjJKVUwyNSBXYWl0IGZvciB0aGUgdmlldyB0byBiZSBmdWxseSByZW5kZXJlZFxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzaXplSGFuZGxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXNpemUtaGFuZGxlJyk7XG4gICAgICBcbiAgICAgIHJlc2l6ZUhhbmRsZXMuZm9yRWFjaCgoaGFuZGxlOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICBoYW5kbGUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vblJlc2l6ZVN0YXJ0LmJpbmQodGhpcykpO1xuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cbiAgb25SZXNpemVTdGFydChldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIFxuICAgIHRoaXMuaXNSZXNpemluZyA9IHRydWU7XG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICBcbiAgICAvLyBTS1MyMkpVTDI1IEZpbmQgdGhlIGNvbHVtbiBoZWFkZXIgdGhhdCBjb250YWlucyB0aGlzIHJlc2l6ZSBoYW5kbGVcbiAgICBjb25zdCBjb2x1bW5IZWFkZXIgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCcudGFibGUtY2VsbCcpO1xuICAgIGlmIChjb2x1bW5IZWFkZXIgJiYgY29sdW1uSGVhZGVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgY29sdW1uSGVhZGVyLnBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMuc3RhcnRXaWR0aCA9IGNvbHVtbkhlYWRlci5vZmZzZXRXaWR0aDtcbiAgXG4gICAgICAvLyBTS1MyMkpVTDI1IEZpbmQgdGhlIGNvbHVtbiBpbmRleFxuICAgICAgY29uc3Qgc2libGluZ3MgPSBBcnJheS5mcm9tKGNvbHVtbkhlYWRlci5wYXJlbnROb2RlLmNoaWxkcmVuKTtcbiAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gc2libGluZ3MuaW5kZXhPZihjb2x1bW5IZWFkZXIpO1xuICAgICAgY29uc3QgYWRqdXN0ZWRJbmRleCA9IHRoaXMud2l0aENoZWNrQm94ID8gY29sdW1uSW5kZXggLSAxIDogY29sdW1uSW5kZXg7XG4gIFxuICAgICAgaWYgKGFkanVzdGVkSW5kZXggPj0gMCAmJiBhZGp1c3RlZEluZGV4IDwgdGhpcy5jdXJyZW50Q29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uID0gdGhpcy5jdXJyZW50Q29sdW1uc1thZGp1c3RlZEluZGV4XTtcbiAgICAgIH1cbiAgICB9XG4gIFxuICAgIC8vIFNLUzIySlVMMjUgQWRkIGN1cnNvciBzdHlsZSB0byBib2R5XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnY29sLXJlc2l6ZSc7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnO1xuICAgIHRoaXMuaXNSZXNpemluZyA9IHRydWU7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVFbmQpO1xuICB9XG4gIFxuICBwcml2YXRlIG9uUmVzaXplTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGlmICghdGhpcy5pc1Jlc2l6aW5nIHx8ICF0aGlzLmN1cnJlbnRDb2x1bW4pIHJldHVybjtcbiAgICBpZiAodGhpcy5yZXNpemVGcmFtZUlkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnJlc2l6ZUZyYW1lSWQpO1xuICAgIH1cblxuICAgIHRoaXMucmVzaXplRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBjb25zdCBkZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5zdGFydFg7XG4gICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWF4KDUwLCB0aGlzLnN0YXJ0V2lkdGggKyBkZWx0YVgpO1xuICAgIC8vIFNLUzIySlVMMjUgVXBkYXRlIHRoZSBjb2x1bW4gd2lkdGhcbiAgICAgIHRoaXMuY3VycmVudENvbHVtbi53aWR0aCA9IG5ld1dpZHRoICsgJ3B4JztcbiAgICAgIHRoaXMudXBkYXRlQ29sdW1uV2lkdGgodGhpcy5jdXJyZW50Q29sdW1uLCBuZXdXaWR0aCk7XG4gICAgfSk7XG4gIH07XG4gIHByaXZhdGUgb25SZXNpemVFbmQgPSAoX2V2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgaWYgKCF0aGlzLmlzUmVzaXppbmcpIHJldHVybjtcbiAgICBjb25zb2xlLmxvZyhcInRhYmVsIGNoYW5nZXNcIilcbiAgICB0aGlzLmlzUmVzaXppbmcgPSBmYWxzZTtcbiAgICB0aGlzLmN1cnJlbnRDb2x1bW4gPSBudWxsO1xuICAgIFxuICAgIC8vIFNLUzIySlVMMjUgUmVtb3ZlIGN1cnNvciBzdHlsZSBmcm9tIGJvZHlcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICcnO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9ICcnO1xuICBcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVFbmQpO1xuICB9O1xuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uV2lkdGgoY29sdW1uOiBhbnksIG5ld1dpZHRoOiBudW1iZXIpIHsgY29uc29sZS5sb2coXCJ0YWJlbCBjaGFuZ2VzXCIpXG4gICAgLy8gU0tTMjJKVUwyNSBVc2UgQW5ndWxhcidzIFJlbmRlcmVyMiBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uXG4gICAgY29uc3QgY29sdW1uSW5kZXggPSB0aGlzLmN1cnJlbnRDb2x1bW5zLmZpbmRJbmRleChjb2wgPT4gY29sLnVuaXF1ZUlkZW50aWZpZXIgPT09IGNvbHVtbi51bmlxdWVJZGVudGlmaWVyKTtcbiAgICBpZiAoY29sdW1uSW5kZXggPT09IC0xKSByZXR1cm47XG4gICAgXG4gICAgLy8gU0tTMjJKVUwyNSBBZGp1c3QgaW5kZXggaWYgY2hlY2tib3ggY29sdW1uIGV4aXN0c1xuICAgIGNvbnN0IGFkanVzdGVkSW5kZXggPSB0aGlzLndpdGhDaGVja0JveCA/IGNvbHVtbkluZGV4ICsgMSA6IGNvbHVtbkluZGV4O1xuICAgIFxuICAgIC8vIFVwZGF0ZSBoZWFkZXIgY2VsbFxuICAgIGNvbnN0IGhlYWRlckNlbGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGFibGUtaGVhZGVyIC50YWJsZS1yb3cgLnRhYmxlLWNlbGw6bnRoLWNoaWxkKCR7YWRqdXN0ZWRJbmRleCArIDF9KWApO1xuICAgIGlmIChoZWFkZXJDZWxsKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlckNlbGwsICd3aWR0aCcsIG5ld1dpZHRoICsgJ3B4Jyk7XG4gICAgfVxuXG4gICAgLy8gU0tTMjJKVUwyNSBVcGRhdGUgYWxsIGJvZHkgY2VsbHMgaW4gdGhpcyBjb2x1bW5cbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRhYmxlLWJvZHknKTtcbiAgICBpZiAoYm9keSkge1xuICAgICAgY29uc3Qgcm93cyA9IGJvZHkucXVlcnlTZWxlY3RvckFsbCgnLnRhYmxlLXJvdycpO1xuICAgICAgcm93cy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICAgIGNvbnN0IGNlbGwgPSByb3cuY2hpbGRyZW5bYWRqdXN0ZWRJbmRleF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmIChjZWxsKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShjZWxsLCAnd2lkdGgnLCBuZXdXaWR0aCArICdweCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhcInRhYmVsIGNoYW5nZXNcIilcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVFbmQpO1xuICB9XG4gIHByaXZhdGUgZmxhdHRlblJvdyhyb3c6IGFueSk6IGFueSB7XG4gICAgY29uc3QgZmxhdHRlbmVkID0gdGhpcy5jdXJyZW50Q29sdW1ucy5yZWR1Y2UoKGFjYywgY29sKSA9PiB7XG4gICAgICBhY2NbY29sLmZpZWxkTmFtZV0gPSB0aGlzLmdldE9ialZhbHVlKHJvdywgY29sLmZpZWxkTmFtZSkgPz8gJy0nOyAvLyBEZWZhdWx0IHRvICctJyBpZiBudWxsL3VuZGVmaW5lZFxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9KTtcbiAgICByZXR1cm4geyAuLi5yb3csIGZsYXR0ZW5lZCB9O1xuICB9XG4gIC8vIFNLUzIwTUFSMjUgc3VtbWFyeSBjb2x1bW5zIGNhbGNcbiAgY29tcHV0ZVN1bW1hcnlDb2x1bW5zKCkge1xuICAgIGlmICh0aGlzLnN1bW1hcnlDb2x1bW5zICYmIHRoaXMuc3VtbWFyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLm1hcChyb3cgPT4ge1xuICAgICAgICBjb25zdCBuZXdSb3cgPSB7IC4uLnJvdyB9O1xuICAgICAgICB0aGlzLnN1bW1hcnlDb2x1bW5zLmZvckVhY2goc3VtbWFyeUNvbCA9PiB7XG4gICAgICAgICAgaWYgKHN1bW1hcnlDb2wudHlwZSA9PT0gJ2NhbGN1bGF0aW9uJyAmJiBzdW1tYXJ5Q29sLm9wZXJhdGlvbiA9PT0gJ3N1bScgJiYgc3VtbWFyeUNvbC5vcGVyYW5kcykge1xuICAgICAgICAgICAgY29uc3Qgc3VtID0gc3VtbWFyeUNvbC5vcGVyYW5kcy5yZWR1Y2UoKGFjYywgb3BlcmFuZCkgPT4gYWNjICsgKE51bWJlcihuZXdSb3dbb3BlcmFuZF0pIHx8IDApLCAwKTtcbiAgICAgICAgICAgIG5ld1Jvd1tzdW1tYXJ5Q29sLmZpZWxkTmFtZV0gPSBzdW07XG4gICAgICAgICAgfSBlbHNlIGlmIChzdW1tYXJ5Q29sLnR5cGUgPT09ICdjYWxjdWxhdGlvbicgJiYgc3VtbWFyeUNvbC5vcGVyYXRpb24gPT09ICdzdWJ0cmFjdCcgJiYgc3VtbWFyeUNvbC5vcGVyYW5kcykge1xuICAgICAgICAgICAgY29uc3QgW2ZpcnN0T3BlcmFuZCwgLi4ucmVzdE9wZXJhbmRzXSA9IHN1bW1hcnlDb2wub3BlcmFuZHM7XG4gICAgICAgICAgICBsZXQgc3VtID0gTnVtYmVyKG5ld1Jvd1tmaXJzdE9wZXJhbmRdKSB8fCAwOyAvLyBTdGFydCB3aXRoIHRoZSBmaXJzdCBvcGVyYW5kXG4gICAgICAgICAgICBzdW0gPSByZXN0T3BlcmFuZHMucmVkdWNlKChhY2MsIG9wZXJhbmQpID0+IGFjYyAtIChOdW1iZXIobmV3Um93W29wZXJhbmRdKSB8fCAwKSwgc3VtKTtcbiAgICAgICAgICAgIG5ld1Jvd1tzdW1tYXJ5Q29sLmZpZWxkTmFtZV0gPSBzdW07XG4gICAgICAgICAgfSBlbHNlIGlmIChzdW1tYXJ5Q29sLnR5cGUgPT09ICdjYWxjdWxhdGlvbicgJiYgc3VtbWFyeUNvbC5vcGVyYXRpb24gPT09ICdtdWx0aXBseScgJiYgc3VtbWFyeUNvbC5vcGVyYW5kcykge1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjdCA9IHN1bW1hcnlDb2wub3BlcmFuZHMucmVkdWNlKChhY2MsIG9wZXJhbmQpID0+IGFjYyAqIChOdW1iZXIobmV3Um93W29wZXJhbmRdKSB8fCAwKSwgMSk7IC8vIFN0YXJ0IHdpdGggMVxuICAgICAgICAgICAgbmV3Um93W3N1bW1hcnlDb2wuZmllbGROYW1lXSA9IHByb2R1Y3Q7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ld1JvdztcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLmRhdGE7IC8vIFVwZGF0ZSBkYXRhU291cmNlXG4gICAgICBpZiAoIXRoaXMudG90YWxSZWNvcmRzICYmIHRoaXMuZGF0YSAmJiB0aGlzLmlzUGFnaW5hdGlvbikge1xuICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBOdW1iZXIodGhpcy5wYWdlSW5kZXgpIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhZ2VTaXplID0gTnVtYmVyKHRoaXMucGFnZVNpemUpIHx8IDEwO1xuICAgICAgICBjb25zdCBzdGFydCA9IChwYWdlSW5kZXggLSAxKSAqIHBhZ2VTaXplO1xuICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIHBhZ2VTaXplO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YT8uc2xpY2Uoc3RhcnQsIGVuZCkgfHwgW107XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzUGFnaW5hdGlvbikge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBTS1MyME1BUjI1IENvbXB1dGUgdmFsdWVzIGZvciBzdW1tYXJ5IHJvd3NcbiAgY29tcHV0ZVN1bW1hcnlWYWx1ZXMoZnJvbT8pIHtcbiAgICB0aGlzLnN1bW1hcnlSb3dzPy5mb3JFYWNoKHJvdyA9PiB7XG4gICAgICBpZiAocm93LnR5cGUgPT09ICdjYWxjdWxhdGlvbicpIHtcbiAgICAgICAgaWYgKHJvdy5vcGVyYXRpb24gPT09ICdzdW0nICYmIHJvdy5jb2x1bW4pIHtcbiAgICAgICAgICAvLyBDb3JyZWN0IHN1bSBvcGVyYXRpb25cbiAgICAgICAgICB0aGlzLnN1bW1hcnlWYWx1ZXNbcm93LmZpZWxkTmFtZV0gPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjLCBkYXRhUm93KSA9PiBhY2MgKyAoTnVtYmVyKGRhdGFSb3dbcm93LmNvbHVtbl0pIHx8IDApLFxuICAgICAgICAgICAgMFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAocm93Lm9wZXJhdGlvbiA9PT0gJ3N1YnRyYWN0JyAmJiByb3cuY29sdW1uKSB7XG4gICAgICAgICAgLy8gU3VidHJhY3Qgc2hvdWxkIHN0YXJ0IHdpdGggdGhlIGZpcnN0IHZhbHVlXG4gICAgICAgICAgdGhpcy5zdW1tYXJ5VmFsdWVzW3Jvdy5maWVsZE5hbWVdID0gdGhpcy5kYXRhU291cmNlLmRhdGEucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgZGF0YVJvdywgaW5kZXgpID0+IGluZGV4ID09PSAwID8gTnVtYmVyKGRhdGFSb3dbcm93LmNvbHVtbl0pIHx8IDAgOiBhY2MgLSAoTnVtYmVyKGRhdGFSb3dbcm93LmNvbHVtbl0pIHx8IDApLFxuICAgICAgICAgICAgMFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAocm93Lm9wZXJhdGlvbiA9PT0gJ211bHRpcGx5JyAmJiByb3cuY29sdW1uKSB7XG4gICAgICAgICAgLy8gTXVsdGlwbHkgc2hvdWxkIHN0YXJ0IHdpdGggMVxuICAgICAgICAgIHRoaXMuc3VtbWFyeVZhbHVlc1tyb3cuZmllbGROYW1lXSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGRhdGFSb3cpID0+IGFjYyAqIChOdW1iZXIoZGF0YVJvd1tyb3cuY29sdW1uXSkgfHwgMCksIC8vIFVzZSAxIGluc3RlYWQgb2YgMFxuICAgICAgICAgICAgMVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAocm93Lm9wZXJhdGlvbiA9PT0gJ3N1YnRyYWN0JyAmJiByb3cub3BlcmFuZHMpIHtcbiAgICAgICAgICAvLyBTdWJ0cmFjdCBiYXNlZCBvbiBvcGVyYW5kc1xuICAgICAgICAgIGNvbnN0IFtvcDEsIG9wMl0gPSByb3cub3BlcmFuZHM7XG4gICAgICAgICAgdGhpcy5zdW1tYXJ5VmFsdWVzW3Jvdy5maWVsZE5hbWVdID0gKHRoaXMuc3VtbWFyeVZhbHVlc1tvcDFdIHx8IDApIC0gKHRoaXMuc3VtbWFyeVZhbHVlc1tvcDJdIHx8IDApO1xuICAgICAgICB9IGVsc2UgaWYgKHJvdy5vcGVyYXRpb24gPT09ICdzdW0nICYmIHJvdy5vcGVyYW5kcykge1xuICAgICAgICAgIC8vIFN1bSBiYXNlZCBvbiBvcGVyYW5kc1xuICAgICAgICAgIGNvbnN0IFtvcDEsIG9wMl0gPSByb3cub3BlcmFuZHM7XG4gICAgICAgICAgdGhpcy5zdW1tYXJ5VmFsdWVzW3Jvdy5maWVsZE5hbWVdID0gKHRoaXMuc3VtbWFyeVZhbHVlc1tvcDFdIHx8IDApICsgKHRoaXMuc3VtbWFyeVZhbHVlc1tvcDJdIHx8IDApO1xuICAgICAgICB9IGVsc2UgaWYgKHJvdy5vcGVyYXRpb24gPT09ICdtdWx0aXBseScgJiYgcm93Lm9wZXJhbmRzKSB7XG4gICAgICAgICAgLy8gTXVsdGlwbHkgYmFzZWQgb24gb3BlcmFuZHNcbiAgICAgICAgICBjb25zdCBbb3AxLCBvcDJdID0gcm93Lm9wZXJhbmRzO1xuICAgICAgICAgIHRoaXMuc3VtbWFyeVZhbHVlc1tyb3cuZmllbGROYW1lXSA9ICh0aGlzLnN1bW1hcnlWYWx1ZXNbb3AxXSB8fCAwKSAqICh0aGlzLnN1bW1hcnlWYWx1ZXNbb3AyXSB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU0tTMTNKVU4yNSBTdW0gdGhlIHZhbHVlcyBieSBkZWZhdWx0LlxuICAgICAgaWYocm93LnR5cGUgPT09ICdmdWxsUm93JyB8fCByb3cudHlwZSA9PT0gJ2Z1bGxyb3cnKXtcbiAgICAgICAgcm93Py5jb2x1bW5zPy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIHRoaXMuc3VtbWFyeVZhbHVlc1tlbGVtZW50XSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhLnJlZHVjZShcbiAgICAgICAgICAgIChhY2MsIGRhdGFSb3cpID0+IGFjYyArIChOdW1iZXIoZGF0YVJvd1tlbGVtZW50XSkgfHwgMCksXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGZyb20gIT09ICdvbkNoYW5nZScgJiYgZnJvbSAhPT0gJ29uSW5pdCcgJiYgdGhpcy5mcm9tID09PSAnZm9ybUJ1aWxkZXInKSB7XG4gICAgICBpZih0aGlzLmZyb20gPT09ICdmb3JtQnVpbGRlcicpICB0aGlzLm9yaWdpbmFsRGF0YSA9IHRoaXMuZGF0YSAvL1NLUzdKVU4yNSBPbmx5IGFzc2lnbiBkYXRhIHRvIG9yaWdpbmFsRGF0YSBpZiBmcm9tIGZvcm1CdWlsZGVyXG4gICAgICB0aGlzLmVtaXRUYWJsZURhdGFWYWx1ZSh7ZGF0YTogdGhpcy5vcmlnaW5hbERhdGEsIHN1bW1hcnlWYWx1ZXM6IHRoaXMuc3VtbWFyeVZhbHVlc30pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzIwTUFSMjUgSGFuZGxlIG1hbnVhbCBpbnB1dCBjaGFuZ2VzIGluIHN1bW1hcnkgcm93cyBcbiAgb25TdW1tYXJ5SW5wdXRDaGFuZ2UoKSB7XG4gICAgdGhpcy5jb21wdXRlU3VtbWFyeVZhbHVlcygpO1xuICB9XG4gIC8vIFNLUzE1RkVCMjUgQ3VzdG9tIHNvcnQgZnVuY3Rpb25cbiAgc29ydERhdGEoY29sdW1uOiBzdHJpbmcsIHNvcnRpbmdTdGF0ZT86IGFueSB8IHVuZGVmaW5lZCwgY3VycmVudFN0YXRlPzphbnkgfHVuZGVmaW5lZCwgZnJvbT86YW55KSB7XG4gICAgLy8gRGVmaW5lIHNvcnRpbmcgc3RhdGVzXG4gICAgY29uc3Qgc29ydGluZ1N0YXRlcyA9IFsnYXNjJywgJ2Rlc2MnLCAnbm9uZSddO1xuICAgIGlmICh0aGlzLmNvbmZpZ1BhZ2luYXRpb24gPT09IGZhbHNlIHx8IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA9PT0gdGhpcy50b3RhbFJlY29yZHMpIHtcbiAgICAgIC8vIERldGVybWluZSB0aGUgY3VycmVudCBzb3J0aW5nIHN0YXRlXG4gICAgICBpZiAodGhpcy5jdXJyZW50U29ydENvbHVtbiA9PT0gY29sdW1uICYmICFzb3J0aW5nU3RhdGUpIHtcbiAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzb3J0aW5nIHN0YXRlXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHNvcnRpbmdTdGF0ZXMuaW5kZXhPZih0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uKTtcbiAgICAgICAgdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiA9IHNvcnRpbmdTdGF0ZXNbKGN1cnJlbnRJbmRleCArIDEpICUgc29ydGluZ1N0YXRlcy5sZW5ndGhdIGFzIFwiYXNjXCIgfCBcImRlc2NcIiB8IFwibm9uZVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgYSBuZXcgY29sdW1uIGlzIHNlbGVjdGVkLCBzdGFydCB3aXRoIGFzY2VuZGluZyBzb3J0XG4gICAgICAgIHRoaXMuY3VycmVudFNvcnRDb2x1bW4gPSBjb2x1bW47XG4gICAgICAgIHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gPSBzb3J0aW5nU3RhdGUgfHwgJ2FzYyc7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5maWx0ZXJCb3hEYXRhICYmIHRoaXMuZmlsdGVyQm94RGF0YS5sZW5ndGggPiAwID8gdGhpcy5maWx0ZXJCb3hEYXRhIDogdGhpcy5kYXRhU291cmNlLmRhdGE7XG4gICAgICAvLyBPbmx5IHNvcnQgaWYgdGhlIGRpcmVjdGlvbiBpcyAnYXNjJyBvciAnZGVzYydcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uID09PSAnYXNjJyB8fCB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uID09PSAnZGVzYycpIHtcbiAgICAgICAgZGF0YS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgbGV0IHZhbHVlQSA9IHRoaXMuZ2V0T2JqVmFsdWUoYSwgY29sdW1uKTtcbiAgICAgICAgICBsZXQgdmFsdWVCID0gdGhpcy5nZXRPYmpWYWx1ZShiLCBjb2x1bW4pO1xuICAgICAgICAgIC8vIEhhbmRsZSB1bmRlZmluZWQgb3IgbnVsbCB2YWx1ZXNcbiAgICAgICAgICBpZiAodmFsdWVBID09IG51bGwgJiYgdmFsdWVCID09IG51bGwpIHJldHVybiAwOyAvLyBCb3RoIGFyZSBudWxsL3VuZGVmaW5lZFxuICAgICAgICAgIGlmICh2YWx1ZUEgPT0gbnVsbCkgcmV0dXJuIHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xOyAvLyB2YWx1ZUEgaXMgbnVsbFxuICAgICAgICAgIGlmICh2YWx1ZUIgPT0gbnVsbCkgcmV0dXJuIHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gLTEgOiAxOyAvLyB2YWx1ZUIgaXMgbnVsbFxuICAgICAgICAgIC8vIEhhbmRsZSBkYXRlIHNvcnRpbmdcbiAgICAgICAgICBpZiAodGhpcy5jb2x1bW5zPy5zb21lKGNvbCA9PiBjb2wuZmllbGROYW1lID09PSBjb2x1bW4gJiYgY29sLnR5cGUgPT09ICdkYXRlJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVBID0gbmV3IERhdGUodmFsdWVBKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVCID0gbmV3IERhdGUodmFsdWVCKTtcbiAgICAgICAgICAgIHZhbHVlQSA9IGRhdGVBLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHZhbHVlQiA9IGRhdGVCLmdldFRpbWUoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZUEgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YWx1ZUIgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgbnVtYmVyIHNvcnRpbmdcbiAgICAgICAgICAgIHZhbHVlQSA9IE51bWJlcih2YWx1ZUEpO1xuICAgICAgICAgICAgdmFsdWVCID0gTnVtYmVyKHZhbHVlQik7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWVBID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWVCID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gSGFuZGxlIHN0cmluZyBjb21wYXJpc29uXG4gICAgICAgICAgICB2YWx1ZUEgPSB2YWx1ZUEudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHZhbHVlQiA9IHZhbHVlQi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDb21wYXJlIHZhbHVlc1xuICAgICAgICAgIGlmICh2YWx1ZUEgPCB2YWx1ZUIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uID09PSAnYXNjJyA/IC0xIDogMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlQSA+IHZhbHVlQikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB2YWx1ZXMgYXJlIHRoZSBzYW1lLCByZXR1cm4gMCB0byBtYWludGFpbiBvcmlnaW5hbCBvcmRlclxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBbLi4uZGF0YV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBOdW1iZXIodGhpcy5wYWdlSW5kZXgpIHx8IDA7XG4gICAgICAgIGNvbnN0IHBhZ2VTaXplID0gTnVtYmVyKHRoaXMucGFnZVNpemUpIHx8IDEwO1xuICAgICAgICBjb25zdCBzdGFydCA9IChwYWdlSW5kZXggLSAxKSAqIHBhZ2VTaXplO1xuICAgICAgICBjb25zdCBlbmQgPSBzdGFydCArIHBhZ2VTaXplO1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZmlsdGVyQm94RGF0YSA/IHRoaXMuZmlsdGVyQm94RGF0YT8uc2xpY2Uoc3RhcnQsIGVuZCkgfHwgW10gOiB0aGlzLmRhdGE/LnNsaWNlKHN0YXJ0LCBlbmQpIHx8IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgc29ydGluZyBzdGF0ZVxuICAgICAgaWYgKHRoaXMuY3VycmVudFNvcnRDb2x1bW4gPT09IGNvbHVtbikge1xuICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IHNvcnRpbmcgc3RhdGVcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc29ydGluZ1N0YXRlcy5pbmRleE9mKHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24pO1xuICAgICAgICB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uID0gc29ydGluZ1N0YXRlc1soY3VycmVudEluZGV4ICsgMSkgJSBzb3J0aW5nU3RhdGVzLmxlbmd0aF0gYXMgXCJhc2NcIiB8IFwiZGVzY1wiIHwgXCJub25lXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBhIG5ldyBjb2x1bW4gaXMgc2VsZWN0ZWQsIHN0YXJ0IHdpdGggYXNjZW5kaW5nIHNvcnRcbiAgICAgICAgdGhpcy5jdXJyZW50U29ydENvbHVtbiA9IGNvbHVtbjtcbiAgICAgICAgdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgICAgfVxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ054dERhdGFUYWJsZScsIEpTT04uc3RyaW5naWZ5KHsgYWRkUmVjb3JkOiBmYWxzZSwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsIGN1cnJlbnRTb3J0Q29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBjdXJyZW50U29ydERpcmVjdGlvbjogdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiB9KSk7XG4gICAgICAvLyBPbmx5IHNvcnQgaWYgdGhlIGRpcmVjdGlvbiBpcyAnYXNjJyBvciAnZGVzYydcbiAgICAgIGlmKGN1cnJlbnRTdGF0ZSAhPT0gdHJ1ZSAmJiBmcm9tICE9PSAnb25DaGFuZ2UnKXRoaXMuTnh0VGFibGVFbWl0LmVtaXQoeyBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLCBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4IH0sIHRhYmxlU2VhcmNoOiB7IGZpZWxkczogdGhpcy5jdXJyZW50Q29sdW1ucywgdmFsdWU6IHRoaXMuc2VhcmNoQm94VmFsdWUgfSwgc2VhcmNoRmlsdGVyRGF0YTogdGhpcy5maWx0ZXJEYXRhQXJyYXksIHNvcnQ6IHsgY29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBkaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24sbGlzdFZpZXc6IHRoaXMuc2VsZWN0ZWRWaWV3fSB9KVxuICAgIH1cbiAgICBpZihmcm9tICE9PSAnb25DaGFuZ2UnKXRoaXMuTnh0VGFibGVQYXJhbXNFbWl0LmVtaXQoeyBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLCBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4IH0sdGFibGVTZWFyY2g6IHRoaXMuc2VhcmNoQm94VmFsdWUsIHNlYXJjaEZpbHRlckRhdGE6IHRoaXMuZmlsdGVyRGF0YUFycmF5LCBzb3J0OiB7IGNvbHVtbjogdGhpcy5jdXJyZW50U29ydENvbHVtbiwgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uICxsaXN0VmlldzogdGhpcy5zZWxlY3RlZFZpZXd9fSlcbiAgICBpZihmcm9tID09PSAnb25DaGFuZ2UnKSB0aGlzLnBhZ2VQYXJhbXModGhpcy50YWJsZVBhcmFtcz8ucGFnaW5hdGlvbiwnb25DaGFuZ2UnKVxuICAgIHRoaXMub25TdW1tYXJ5SW5wdXRDaGFuZ2UoKVxuICB9XG5cbiAgb25TY3JvbGwodGFibGVDb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5pc1Njcm9sbGVkID0gdGFibGVDb250YWluZXIuc2Nyb2xsVG9wID4gMDtcbiAgICBjb25zdCB0YWJsZUJvZHlIZWlnaHQgPSB0YWJsZUNvbnRhaW5lci5zY3JvbGxIZWlnaHQ7XG4gICAgY29uc3QgaXNBdEJvdHRvbSA9IHRhYmxlQm9keUhlaWdodCAtIHRhYmxlQ29udGFpbmVyLnNjcm9sbFRvcCA8PSB0YWJsZUNvbnRhaW5lci5jbGllbnRIZWlnaHQgKyAxO1xuICAgIC8vU0tTMTVGRUIyNSBFbnN1cmUgc2hhZG93IGlzIGhpZGRlbiBvbmx5IGlmIHRhYmxlIGJvZHkgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiA0MDBweFxuICAgIGlmICh0aGlzLmlzUGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5pc1NoYWRvd0hpZGRlbiA9ICEoaXNBdEJvdHRvbSB8fCB0YWJsZUJvZHlIZWlnaHQgPCA0NTApO1xuICAgIH1cbiAgfVxuXG4gIC8vU0tTMTVGRUIyNSBsb3NpbmcgdGhlIGZpbHRlciBjb21wb25lbnQgd2hlbiB0aGUgbW91c2UgaXMgY2xpY2tlZCBvdXRzaWRlIHRhYmxlXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSkgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLnNlYXJjaEZpbHRlciA9IGZhbHNlO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBwcmV2ZW50cyBhbnkgb3RoZXIgZGVmYXVsdCBhY3Rpb25cbiAgfVxuXG4gIC8vU0tTMTVGRUIyNSBmaWx0ZXIgZGF0YSB0aGF0IHRvIGJlIGRpc3BsYXllZCBpbiBoZWFkZXIgZmlsdGVyIGljb24gaXMgcGFzc2VkIGluICdmaWx0ZXJBcnJheScgYXJyYXlcbiAgZmlsdGVyKGRhdGFzOiBhbnkpIHtcbiAgICB0aGlzLmZpbHRlckFycmF5ID0gW107XG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlciA9IGRhdGFzO1xuICAgIHRoaXMuZmlsdGVyQXJyYXkgPSBbLi4udGhpcy5tdWx0aXBsZUZpbHRlckFycmF5Py5bZGF0YXNdXTtcbiAgICB0aGlzLnNlYXJjaEZpbHRlciA9ICF0aGlzLnNlYXJjaEZpbHRlcjtcbiAgICB0aGlzLmlzUmVzaXplZCA9IHRoaXMuZmlsdGVyRGF0YUFycmF5W3RoaXMuc2VsZWN0ZWRGaWx0ZXJdPy5sZW5ndGggPiAwXG4gIH1cblxuICAvLyBTS1MxNUZFQjI1ICBlbWl0dGluZyBwYWdyIHNpemUgYW5kIGluZGV4IHRvIHBhcmVudCBvbiBwYWdpbmF0aW5nXG4gIHBhZ2VQYXJhbXMoZXZlbnQ6IGFueSwgZnJvbT86YW55KSB7XG4gICAgdGhpcy5wYWdlSW5kZXggPSBldmVudD8ucGFnZUluZGV4IHx8IHRoaXMucGFnZUluZGV4XG4gICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50Py5wYWdlU2l6ZSB8fCB0aGlzLnBhZ2VTaXplXG4gICAgdGhpcy5maWx0ZXJUYWJsZU5vcyA9IHRoaXMuZmlsdGVyQm94RGF0YT8ubGVuZ3RoXG4gICAgaWYodGhpcy5mcm9tID09PSAnZm9ybUJ1aWxkZXInKSB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZmlsdGVyQm94RGF0YSA9IHRoaXMuZGF0YVxuICAgIGlmICh0aGlzLmNvbmZpZ1BhZ2luYXRpb24gPT09IGZhbHNlIHx8IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA9PT0gdGhpcy50b3RhbFJlY29yZHMpIHtcbiAgICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5hcHBseUZpbHRlcih0aGlzLnNlYXJjaEJveFZhbHVlICwgJ3BhZ2VQYXJhbXMnKVxuICAgICAgY29uc3Qgc3RhcnQgPSAoTnVtYmVyKHRoaXMucGFnZUluZGV4KSAtIDEpICogTnVtYmVyKHRoaXMucGFnZVNpemUpO1xuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBOdW1iZXIodGhpcy5wYWdlU2l6ZSk7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZmlsdGVyQm94RGF0YT8uc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICB0aGlzLm9uU3VtbWFyeUlucHV0Q2hhbmdlKClcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZnJvbSAhPT0gJ29uQ2hhbmdlJyl0aGlzLk54dFRhYmxlRW1pdC5lbWl0KHsgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSwgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCB9LCB0YWJsZVNlYXJjaDogeyBmaWVsZHM6IHRoaXMuY3VycmVudENvbHVtbnMsIHZhbHVlOiB0aGlzLnNlYXJjaEJveFZhbHVlIH0sIHNlYXJjaEZpbHRlckRhdGE6IHRoaXMuZmlsdGVyRGF0YUFycmF5LCBzb3J0OiB7IGNvbHVtbjogdGhpcy5jdXJyZW50U29ydENvbHVtbiwgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uICxsaXN0VmlldzogdGhpcy5zZWxlY3RlZFZpZXd9IH0pXG4gICAgfVxuICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5OeHRUYWJsZVBhcmFtc0VtaXQuZW1pdCh7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXggfSx0YWJsZVNlYXJjaDogdGhpcy5zZWFyY2hCb3hWYWx1ZSwgc2VhcmNoRmlsdGVyRGF0YTogdGhpcy5maWx0ZXJEYXRhQXJyYXksIHNvcnQ6IHsgY29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBkaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gLGxpc3RWaWV3OiB0aGlzLnNlbGVjdGVkVmlld319KVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSBhcHBseSBzZWFyY2ggYmFyIGZpbHRlciB1c2luZyBtYXRcbiAgYXBwbHlGaWx0ZXIoZXZlbnQ6IGFueSwgZnJvbT86IGFueSkge1xuICAgIGxldCBmaWx0ZXJWYWx1ZSA9IGV2ZW50O1xuICAgIGZpbHRlclZhbHVlID8gZmlsdGVyVmFsdWUgPSBmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKSA6IGZpbHRlclZhbHVlID0gJyc7XG4gICAgdGhpcy5zZWFyY2hCb3hWYWx1ZSA9IGZpbHRlclZhbHVlXG4gICAgaWYgKCFmaWx0ZXJWYWx1ZSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLm9yaWdpbmFsRGF0YVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMub3JpZ2luYWxEYXRhLmZpbHRlcihpdGVtID0+XG4gICAgICAgIHRoaXMuY3VycmVudENvbHVtbnMuc29tZShjb2x1bW4gPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRPYmpWYWx1ZShpdGVtLGNvbHVtbi5maWVsZE5hbWUpPy50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKGZpbHRlclZhbHVlKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmKGZyb20gIT09ICdwYWdlUGFyYW1zJyAmJiBmcm9tICE9PSAnb25DaGFuZ2UnKSB0aGlzLnBhZ2VJbmRleCA9IDFcbiAgICB0aGlzLnNGaWx0ZXJEYXRhID0gdGhpcy5kYXRhU291cmNlLmRhdGFcbiAgICB0aGlzLmZpbHRlclRhYmxlTm9zID0gdGhpcy5zRmlsdGVyRGF0YT8ubGVuZ3RoXG4gICAgdGhpcy50b3RhbENvdW50ID0gdGhpcy5kYXRhLmxlbmd0aFxuICAgIGNvbnN0IHN0YXJ0ID0gKE51bWJlcih0aGlzLnBhZ2VJbmRleCkgLSAxKSAqIE51bWJlcih0aGlzLnBhZ2VTaXplKTtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIE51bWJlcih0aGlzLnBhZ2VTaXplKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhPy5zbGljZShzdGFydCwgZW5kKTtcbiAgICB0aGlzLmZpbHRlclJldGFpbihmcm9tID09PSAnb25DaGFuZ2UnID8gdGhpcy50YWJsZVBhcmFtcz8uc2VhcmNoRmlsdGVyRGF0YSB8fCB0aGlzLmZpbHRlckRhdGFBcnJheSA6IHRoaXMuZmlsdGVyRGF0YUFycmF5LGZyb20gKVxuICB9XG5cbiAgLyoqIFNLUzE1RkVCMjUgV2hldGhlciB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVsZW1lbnRzIG1hdGNoZXMgdGhlIHRvdGFsIG51bWJlciBvZiByb3dzLiAqL1xuICBpc0FsbFNlbGVjdGVkKCkge1xuICAgIC8vIGNoZWNrIGlmIGFsbCByb3dzIGFyZSBzZWxlY3RlZFxuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xuICB9XG5cbiAgLyoqIFNLUzE1RkVCMjUgU2VsZWN0cyBhbGwgcm93cyBpZiB0aGV5IGFyZSBub3QgYWxsIHNlbGVjdGVkOyBvdGhlcndpc2UgY2xlYXIgc2VsZWN0aW9uLiAqL1xuICBtYXN0ZXJUb2dnbGUoKSB7XG4gICAgLy8gaWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gdGhlbiBjbGVhciB0aGF0IHNlbGVjdGlvblxuICAgIC8vIGVtaXQgdGhlIHNlbGVjdGVkIHZhbHVlIG9ubHkgdG8gcGFyZW50XG4gICAgaWYgKHRoaXMuaXNTb21lU2VsZWN0ZWQoKSkge1xuICAgICAgLy8gICB0byByZW1vdmUgdGhlIGVkaXRSb3csIGlmIHRoZSBjaGVja2JveCBpcyB1bmNoZWNrZWRcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudD8uZWRpdFJvdykgZWxlbWVudC5lZGl0Um93ID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLmVtaXQodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIGVpdGhlciBzZWxlY3QgYWxsIGl0ZW1zIG9yIGNsZWFyIHRoZSBzZWxlY3Rpb25cbiAgICAgIC8vIGVtaXQgdGhlIHNlbGVjdGVkIHZhbHVlcyB0byBwYXJlbnRcbiAgICAgIHRoaXMuaXNBbGxTZWxlY3RlZCgpID8gdGhpcy5zZWxlY3Rpb24uY2xlYXIoKSA6IHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZvckVhY2goKHJvdzogYW55KSA9PiB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLmVtaXQodGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgQ2hlY2tzIHdoZXRoZXIgYW55IGl0ZW1zIGFyZSBjdXJyZW50bHkgc2VsZWN0ZWQgaW4gdGhlIHRhYmxlLlxuICBpc1NvbWVTZWxlY3RlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgZW1pdCB0aGUgY2hlY2sgYm94IHZhbHVlcywgdGhhdCBzZWxlY3RlZCBzZXBhcmF0ZWx5XG4gIHNlcGFyYXRlUm93U2VsZWN0KGRhdGE6IGFueSwgZWxlbWVudDogYW55KSB7XG4gICAgLy8gICB0byByZW1vdmUgdGhlIGVkaXRSb3cgaWQgY2hlY2sgYm94IGlzIHVuY2hlY2tlZCBvbiBzZXBhcmF0ZSByb3dcbiAgICBpZiAoZGF0YSAmJiBlbGVtZW50Py5lZGl0Um93KSB7XG4gICAgICBlbGVtZW50LmVkaXRSb3cgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMuZW1pdCh0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZClcbiAgICB9XG4gIH1cblxuICAvL1NLUzE1RkVCMjUgZGF0YSB0aGF0IHRvIGJlIHBhc3NlZCwgd2hlbiB0YWJsZSByb3cgaXMgY2xpY2tlZFxuICB0YWJsZUNsaWNrKGRhdGE6IGFueSkge1xuICAgIHRoaXMudGFibGVSb3dDbGljay5lbWl0KGRhdGEpO1xuICB9XG4gIGdldE5lc3RlZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghb2JqIHx8ICFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBcbiAgICByZXR1cm4gcGF0aFxuICAgICAgLnJlcGxhY2UoL1xcWyhcXGQrKVxcXS9nLCAnLiQxJykgLy8gdHVybnMgXCJtZW1iZXJzWzBdXCIgaW50byBcIm1lbWJlcnMuMFwiXG4gICAgICAuc3BsaXQoJy4nKVxuICAgICAgLnJlZHVjZSgoYWNjLCBwYXJ0KSA9PiAoYWNjICYmIGFjY1twYXJ0XSAhPT0gdW5kZWZpbmVkKSA/IGFjY1twYXJ0XSA6IHVuZGVmaW5lZCwgb2JqKTtcbiAgfVxuICBcbiAgLy9TS1MxNUZFQjI1IFJldGFpbiB0aGUgZmlsdGVyZGF0YVxuICBmaWx0ZXJSZXRhaW4oZmlsdGVya2V5OiBhbnksIGZyb20/OmFueSkge1xuICAgIGlmIChmaWx0ZXJrZXkgJiYgT2JqZWN0LmtleXMoZmlsdGVya2V5KS5sZW5ndGggPT0gMCkge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5zRmlsdGVyRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICBsZXQgaXNEYXRhQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGZpbHRlcmtleSkpIHtcbiAgICAgICAgaWYgKGZpbHRlcmtleVtrZXldICYmIGZpbHRlcmtleVtrZXldLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpc0RhdGFDaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFpc0RhdGFDaGVja2VkKSB7XG4gICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuc0ZpbHRlckRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBrZXkgb2YgT2JqZWN0LmtleXMoZmlsdGVya2V5KSkge1xuICAgICAgICAgIGlmIChmaWx0ZXJrZXlba2V5XSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuc0ZpbHRlckRhdGEuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldE5lc3RlZFZhbHVlKGl0ZW0sIGtleSk7XG4gICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJrZXlba2V5XS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IGRhdGExID0gWy4uLnRoaXMuZGF0YSwgLi4uZGF0YV07XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLnJlbW92ZUR1cGxpY2F0ZXMoZGF0YTEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZihmcm9tICE9PSAncGFnZVBhcmFtcycgJiYgZnJvbSAhPT0gJ29uQ2hhbmdlJykgdGhpcy5wYWdlSW5kZXggPSAxXG4gICAgY29uc3Qgc3RhcnQgPSAoTnVtYmVyKHRoaXMucGFnZUluZGV4KSAtIDEpICogTnVtYmVyKHRoaXMucGFnZVNpemUpO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgTnVtYmVyKHRoaXMucGFnZVNpemUpO1xuICAgIHRoaXMuZmlsdGVyQm94RGF0YSA9IHRoaXMuZGF0YVxuICAgIHRoaXMuZmlsdGVyVGFibGVOb3MgPSB0aGlzLmZpbHRlckJveERhdGE/Lmxlbmd0aFxuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5kYXRhPy5zbGljZShzdGFydCwgZW5kKTtcbiAgICB0aGlzLmRhdGEgPSB0aGlzLm9yaWdpbmFsRGF0YVxuICAgIHRoaXMuc29ydERhdGEodGhpcy5jdXJyZW50U29ydENvbHVtbiAsdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbix1bmRlZmluZWQsZnJvbSlcbiAgfVxuXG4vLyBTS1MxNUZFQjI1IHRvIHJlbW92ZSBkdXBsaWNhdGUgb2JqZWN0IGZyb20gdHdvIGFycmF5cyAoc2FmZSBzdHJpbmdpZnkpXG5yZW1vdmVEdXBsaWNhdGVzKG9iamVjdHM6IGFueSkge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHVuaXF1ZU9iamVjdHM6IGFueVtdID0gW107XG5cbiAgY29uc3Qgc2FmZVN0cmluZ2lmeSA9IChvYmo6IGFueSkgPT4ge1xuICAgIGNvbnN0IHNlZW5PYmpzID0gbmV3IFdlYWtTZXQoKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsOyAvLyByZXBsYWNlIHVuZGVmaW5lZCB0byBhdm9pZCBpc3N1ZXNcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHNlZW5PYmpzLmhhcyh2YWx1ZSkpIHJldHVybjsgLy8gc2tpcCBjaXJjdWxhclxuICAgICAgICBzZWVuT2Jqcy5hZGQodmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICB9O1xuXG4gIG9iamVjdHMuZm9yRWFjaCgob2JqOiBhbnkpID0+IHtcbiAgICBjb25zdCBrZXkgPSBzYWZlU3RyaW5naWZ5KG9iaik7XG4gICAgaWYgKCFzZWVuLmhhcyhrZXkpKSB7XG4gICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgdW5pcXVlT2JqZWN0cy5wdXNoKG9iaik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdW5pcXVlT2JqZWN0cztcbn1cblxuICAvLyBTS1MxNUZFQjI1ICBvbiBkZWxldGUgY2xpY2sgc2F2ZSB0aGUgZGF0YSBpbiB2YXJpYWJsZXNcbiAgZGVsZXRlUmVjb3JkKGRhdGE6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmZyb20gPT09ICdmb3JtQnVpbGRlcicpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gWy4uLnRoaXMuZGF0YVNvdXJjZS5kYXRhXTsgLy8gQ3JlYXRlIGEgbmV3IHJlZmVyZW5jZVxuICAgICAgdXBkYXRlZERhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdXBkYXRlZERhdGE7IC8vIFJlYXNzaWduIHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgdGhpcy5kYXRhID0gdXBkYXRlZERhdGE7IC8vIFN5bmMgdGhpcy5kYXRhXG4gICAgICB0aGlzLmNvbXB1dGVTdW1tYXJ5VmFsdWVzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVsZXRlRGF0YSA9IGRhdGE7XG4gICAgICB0aGlzLmRlbGV0ZUluZGV4ID0gaW5kZXg7XG4gICAgICB0aGlzLmRlbGV0ZU1vZGFsID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBTS1MxNUZFQjI1ICBhZnRlciBjbGlja2luZyB5ZXMgaW4gZGVsZXRlIGFsZXJ0IG1vZGFsLCBlbWl0IHRvIHBhcmVudFxuICBkZWxldGVSZWNvcmREYXRhKCkge1xuICAgIHRoaXMub25EZWxldGVEYXRhLmVtaXQoeyBkYXRhOiB0aGlzLmRlbGV0ZURhdGEsIGFsbERhdGE6IHRoaXMuZGF0YSB9KTtcbiAgICB0aGlzLmRlbGV0ZU1vZGFsID0gZmFsc2U7XG4gIH1cblxuICAvL1NLUzE1RkVCMjUgdG8gc2F2ZSB0aGUgZWRpdGVkIGRhdGEgaW4gdGFibGU7XG4gIHNhdmVCdXR0b24oKSB7XG4gICAgLy8gZW1pdHRpbmcgYWxsIGRhdGEgd2l0aCBzZWxlY3RlZCBkYXRhXG4gICAgdGhpcy5zYXZlQnV0dG9uRGF0YS5lbWl0KHsgc2VsZWN0ZWREYXRhOiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZCwgYWxsRGF0YTogdGhpcy5kYXRhIH0pO1xuICB9XG5cbiAgLy9TS1MxNUZFQjI1IHBhc3MgdGhlIHJlamVjdGVkIHJlYXNvblxuICBvbkVkaXQoZGF0YTogYW55KSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JykgZGF0YS5lZGl0Um93ID0gdHJ1ZTsgLy8gbWFkZSBlZGl0aW5nIHJvdyBhcyB0cnVlIC8vICBzb2x2ZSB1bmRlZmluZWQgZXJyb3Igb24gc3RyaW5nXG4gICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0KGRhdGEpO1xuICAgIHRoaXMub25FZGl0RGF0YS5lbWl0KHsgZGF0YTogZGF0YSwgYWxsRGF0YTogdGhpcy5kYXRhIH0pO1xuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSB0YWJsZSB0b3AgYnV0dG9ucyBlbWl0XG4gIGNvbW1vbkJ1dHRvbkNsaWNrKGJ1dHRvbjogYW55KSB7XG4gICAgdGhpcy5idXR0b25FbWl0LmVtaXQoYnV0dG9uKTtcbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIGRhdGEgZnJvbSBvYmplY3RzLiBcbiAgLy8gSW4gJ2VsZW1lbnQnIHdlIHdpbGwgcGFzcyBvYmplY3QgYW5kIGluICdjb2x1bW4nIHdlIHdpbGwgcGFzcyBwYXRoIGFzIHN0cmluZyBlZy5lbXBsb3llZS5maW5hbmNlSW5mb1swXS51YW4gdG8gcmV0aWV2ZSB1YW4gdmFsdWUgXG4gIGdldE9ialZhbHVlKGVsZW1lbnQ6IGFueSwgY29sdW1uOiBzdHJpbmcpIHtcbiAgICBpZiAoIWVsZW1lbnQgfHwgIWNvbHVtbikge1xuICAgICAgcmV0dXJuICcnOyAvLyBSZXR1cm4gZW1wdHkgc3RyaW5nIG9yIG51bGwgaWYgZWxlbWVudCBvciBjb2x1bW4gaXMgaW52YWxpZFxuICAgIH1cbiAgICBsZXQgZmxkcyA9IGNvbHVtbi5zcGxpdCgnLicpO1xuICAgIGxldCBjdXJyZW50ID0gZWxlbWVudDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBzcGxpdEZsZHMgPSBmbGRzW2ldLnNwbGl0KCdbJyk7XG4gICAgICBpZiAoc3BsaXRGbGRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjdXJyZW50ID0gY3VycmVudFtmbGRzW2ldXSA/PyAnJzsgLy8gVXNlIG51bGxpc2ggY29hbGVzY2luZyB0byBoYW5kbGUgdW5kZWZpbmVkL251bGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBpbmRleCA9IE51bWJlcihzcGxpdEZsZHNbMV0uc3BsaXQoJ10nKVswXSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3NwbGl0Rmxkc1swXV0/LltpbmRleF0gPz8gJyc7IC8vIFNhZmVseSBhY2Nlc3MgYXJyYXkgaW5kZXhcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cbiAgLy9TS1MxNUZFQjI1IGh5cGVybGlubCBjb2x1bW5zIG9ubHkgZW1pdHRlZFxuICBvbkNsaWNrSHlwZXJsaW5rKGNvbHVtbjogYW55LCBlbGVtZW50OiBhbnksIGlzSHlwZXJMaW5rOiBhbnkpIHtcbiAgICBpZiAoaXNIeXBlckxpbmspIHRoaXMuaHlwZXJMaW5rRW1pdC5lbWl0KHsgY29sdW1uOiBjb2x1bW4sIGVsZW1lbnQ6IGVsZW1lbnQgfSk7XG4gIH1cblxuICAvLyBTS1MxNUZFQjI1IG9uIGFkZCByZWNvcmQgaW4gdGFibGUsIHRoZSAnaW5saW5lRWxlbWVudCcgdmFsdWVzIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIHRhYmxlIGRhdGEgXG4gIGFkZFRhYmxlUmVjb3JkKGVsZW1lbnQ6IGFueSxmcm9tPzphbnkpIHtcbiAgICBpZiAodGhpcy5jb25maWdQYWdpbmF0aW9uID09PSBmYWxzZSB8fCB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IHRoaXMudG90YWxSZWNvcmRzKSB7XG4gICAgICB2YXIgb2JqOiBhbnkgPSB7fTtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50KTtcbiAgICAgIGtleXMuZm9yRWFjaCgoZWxlbWVudEtleTogYW55KSA9PiB7XG4gICAgICAgIG9ialtlbGVtZW50S2V5XSA9ICcnO1xuICAgICAgfSk7XG4gICAgICAvLyBTS1MyME1BUjI1IENvbXB1dGUgc3VtbWFyeSBjb2x1bW5zIGZvciB0aGUgbmV3IHJvd1xuICAgICAgaWYgKHRoaXMuc3VtbWFyeUNvbHVtbnMgJiYgdGhpcy5zdW1tYXJ5Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuc3VtbWFyeUNvbHVtbnMuZm9yRWFjaChzdW1tYXJ5Q29sID0+IHtcbiAgICAgICAgICBpZiAoc3VtbWFyeUNvbC50eXBlID09PSAnY2FsY3VsYXRpb24nICYmIHN1bW1hcnlDb2wub3BlcmF0aW9uID09PSAnc3VtJyAmJiBzdW1tYXJ5Q29sLm9wZXJhbmRzKSB7XG4gICAgICAgICAgICBjb25zdCBzdW0gPSBzdW1tYXJ5Q29sLm9wZXJhbmRzLnJlZHVjZSgoYWNjLCBvcGVyYW5kKSA9PiBhY2MgKyAoTnVtYmVyKG9ialtvcGVyYW5kXSkgfHwgMCksIDApO1xuICAgICAgICAgICAgb2JqW3N1bW1hcnlDb2wuZmllbGROYW1lXSA9IHN1bTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN1bW1hcnlDb2wudHlwZSA9PT0gJ2NhbGN1bGF0aW9uJyAmJiBzdW1tYXJ5Q29sLm9wZXJhdGlvbiA9PT0gJ3N1YnRyYWN0JyAmJiBzdW1tYXJ5Q29sLm9wZXJhbmRzKSB7XG4gICAgICAgICAgICBjb25zdCBzdW0gPSBzdW1tYXJ5Q29sLm9wZXJhbmRzLnJlZHVjZSgoYWNjLCBvcGVyYW5kKSA9PiBhY2MgLSAoTnVtYmVyKG9ialtvcGVyYW5kXSkgfHwgMCksIDApO1xuICAgICAgICAgICAgb2JqW3N1bW1hcnlDb2wuZmllbGROYW1lXSA9IHN1bTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHN1bW1hcnlDb2wudHlwZSA9PT0gJ2NhbGN1bGF0aW9uJyAmJiBzdW1tYXJ5Q29sLm9wZXJhdGlvbiA9PT0gJ211bHRpcGx5JyAmJiBzdW1tYXJ5Q29sLm9wZXJhbmRzKSB7XG4gICAgICAgICAgICBjb25zdCBzdW0gPSBzdW1tYXJ5Q29sLm9wZXJhbmRzLnJlZHVjZSgoYWNjLCBvcGVyYW5kKSA9PiBhY2MgKiAoTnVtYmVyKG9ialtvcGVyYW5kXSkgfHwgMCksIDApO1xuICAgICAgICAgICAgb2JqW3N1bW1hcnlDb2wuZmllbGROYW1lXSA9IHN1bTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoc3VtbWFyeUNvbC50eXBlID09PSAnY2FsY3VsYXRpb24nICYmIHN1bW1hcnlDb2wub3BlcmF0aW9uID09PSAnc3VidHJhY3QnICYmIHN1bW1hcnlDb2wub3BlcmFuZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1bSA9IHN1bW1hcnlDb2wub3BlcmFuZHMuc2xpY2UoMSkucmVkdWNlKFxuICAgICAgICAgICAgICAoYWNjLCBvcGVyYW5kKSA9PiBhY2MgLSAoTnVtYmVyKG9ialtvcGVyYW5kXSkgfHwgMCksXG4gICAgICAgICAgICAgIE51bWJlcihvYmpbc3VtbWFyeUNvbC5vcGVyYW5kc1swXV0pIHx8IDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvYmpbc3VtbWFyeUNvbC5maWVsZE5hbWVdID0gc3VtO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChzdW1tYXJ5Q29sLnR5cGUgPT09ICdjYWxjdWxhdGlvbicgJiYgc3VtbWFyeUNvbC5vcGVyYXRpb24gPT09ICdtdWx0aXBseScgJiYgc3VtbWFyeUNvbC5vcGVyYW5kcykge1xuICAgICAgICAgICAgY29uc3QgcHJvZHVjdCA9IHN1bW1hcnlDb2wub3BlcmFuZHMucmVkdWNlKFxuICAgICAgICAgICAgICAoYWNjLCBvcGVyYW5kKSA9PiBhY2MgKiAoTnVtYmVyKG9ialtvcGVyYW5kXSkgfHwgMCksXG4gICAgICAgICAgICAgIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvYmpbc3VtbWFyeUNvbC5maWVsZE5hbWVdID0gcHJvZHVjdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5kYXRhLnB1c2gob2JqKTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gIHRoaXMuZGF0YTtcbiAgICAgIHRoaXMub3JpZ2luYWxEYXRhID0gIHRoaXMuZGF0YTtcblxuICAgICAgaWYgKHRoaXMuc3RpY2t5Q29sdW1uID09PSB0cnVlICYmIHRoaXMuY3VycmVudENvbHVtbnMpIHtcbiAgICAgICAgdGhpcy5zdGlja3lDb25kaXRpb24gPSB0aGlzLmN1cnJlbnRDb2x1bW5zPy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0aWNreUNvbmRpdGlvbiA9IHRoaXMuY3VycmVudENvbHVtbnM/Lmxlbmd0aCArIDE7XG4gICAgICB9XG4gICAgICB0aGlzLnBhZ2VTaXplID0gMTBcbiAgICAgIHRoaXMudG90YWxDb3VudCA9IHRoaXMuZGF0YS5sZW5ndGhcbiAgICAgIHRoaXMuZmlsdGVyVGFibGVOb3MgKz0gMSBcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gTWF0aC5jZWlsKHRoaXMudG90YWxDb3VudCAvIHRoaXMucGFnZVNpemUpO1xuICAgICAgY29uc3Qgc3RhcnQgPSAoTnVtYmVyKHRoaXMucGFnZUluZGV4KSAtIDEpICogTnVtYmVyKHRoaXMucGFnZVNpemUpO1xuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBOdW1iZXIodGhpcy5wYWdlU2l6ZSk7XG4gICAgICBpZiAoIXRoaXMuaXNQYWdpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5kYXRhXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZGF0YT8uc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3QodGhpcy5kYXRhW3RoaXMuZGF0YS5sZW5ndGggLSAxXSk7XG4gICAgICB0aGlzLmRhdGFbdGhpcy5kYXRhLmxlbmd0aCAtIDFdLmVkaXRSb3cgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYWdlSW5kZXggPSBNYXRoLmNlaWwodGhpcy50b3RhbFJlY29yZHMgLyAxMCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnTnh0RGF0YVRhYmxlJywgSlNPTi5zdHJpbmdpZnkoeyBhZGRSZWNvcmQ6IHRydWUsIHBhZ2VTaXplOiAxMCwgcGFnZUluZGV4OiBwYWdlSW5kZXgsIGN1cnJlbnRTb3J0Q29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBjdXJyZW50U29ydERpcmVjdGlvbjogdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiB9KSk7XG4gICAgICBpZihmcm9tICE9PSAnb25DaGFuZ2UnKXRoaXMuTnh0VGFibGVFbWl0LmVtaXQoeyBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiAxMCwgcGFnZUluZGV4OiBwYWdlSW5kZXggfSwgdGFibGVTZWFyY2g6IHsgZmllbGRzOiB0aGlzLmN1cnJlbnRDb2x1bW5zLCB2YWx1ZTogdGhpcy5zZWFyY2hCb3hWYWx1ZSB9LCBzZWFyY2hGaWx0ZXJEYXRhOiB0aGlzLmZpbHRlckRhdGFBcnJheSwgc29ydDogeyBjb2x1bW46IHRoaXMuY3VycmVudFNvcnRDb2x1bW4sIGRpcmVjdGlvbjogdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiAsbGlzdFZpZXc6IHRoaXMuc2VsZWN0ZWRWaWV3fSB9KVxuICAgIH1cbiAgICB0aGlzLmNvbXB1dGVTdW1tYXJ5VmFsdWVzKGZyb20pO1xuICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5OeHRUYWJsZVBhcmFtc0VtaXQuZW1pdCh7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXggfSx0YWJsZVNlYXJjaDogdGhpcy5zZWFyY2hCb3hWYWx1ZSwgc2VhcmNoRmlsdGVyRGF0YTogdGhpcy5maWx0ZXJEYXRhQXJyYXksIHNvcnQ6IHsgY29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBkaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gLGxpc3RWaWV3OiB0aGlzLnNlbGVjdGVkVmlld319KVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSBBY3Rpb24gYnV0dG9uIGNvbmRpdGlvbmFsbHkgZGlzcGxheWVkIGZ1bmN0aW9uXG4gIGlzQ29uZGl0aW9uTWV0KGVsZW1lbnQ6IGFueSwgY29uZGl0aW9uczogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKGNvbmRpdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgeyBhbmRDb25kaXRpb25MaXN0LCBvckNvbmRpdGlvbkxpc3QgfSA9IGNvbmRpdGlvbnM7XG4gICAgICAvLyAgSWYgYW5kQ29uZGl0aW9uTGlzdCBleGlzdHMsIGNoZWNrIHRoYXQgYWxsIGNvbmRpdGlvbnMgYXJlIG1ldFxuICAgICAgY29uc3QgaXNBbmRDb25kaXRpb25NZXQgPSBhbmRDb25kaXRpb25MaXN0ID8gYW5kQ29uZGl0aW9uTGlzdC5ldmVyeSgoY29uZDogeyBjb25kaXRpb246IHN0cmluZyB8IGFueVtdOyBjb2x1bW46IHN0cmluZyB8IG51bWJlcjsgfSkgPT5cbiAgICAgICAgY29uZC5jb25kaXRpb24uaW5jbHVkZXMoZWxlbWVudFtjb25kLmNvbHVtbl0pXG4gICAgICApIDogdHJ1ZTsgLy8gIElmIG5vIGFuZENvbmRpdGlvbkxpc3QsIGNvbnNpZGVyIGl0IGFzIGFsd2F5cyBtZXRcbiAgICAgIC8vICBJZiBvckNvbmRpdGlvbkxpc3QgZXhpc3RzLCBjaGVjayBpZiBhdCBsZWFzdCBvbmUgY29uZGl0aW9uIGlzIG1ldFxuICAgICAgY29uc3QgaXNPckNvbmRpdGlvbk1ldCA9IG9yQ29uZGl0aW9uTGlzdCA/IG9yQ29uZGl0aW9uTGlzdC5zb21lKChjb25kOiB7IGNvbmRpdGlvbjogc3RyaW5nIHwgYW55W107IGNvbHVtbjogc3RyaW5nIHwgbnVtYmVyOyB9KSA9PlxuICAgICAgICBjb25kLmNvbmRpdGlvbi5pbmNsdWRlcyhlbGVtZW50W2NvbmQuY29sdW1uXSlcbiAgICAgICkgOiB0cnVlOyAvLyAgSWYgbm8gb3JDb25kaXRpb25MaXN0LCBjb25zaWRlciBpdCBhcyBhbHdheXMgbWV0XG4gICAgICAvLyAgUmV0dXJuIHRydWUgaWYgdGhlIEFORCBjb25kaXRpb24gaXMgbWV0IGFuZCB0aGUgT1IgY29uZGl0aW9uIGlzIG1ldFxuICAgICAgcmV0dXJuIGlzQW5kQ29uZGl0aW9uTWV0ICYmIGlzT3JDb25kaXRpb25NZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgY29uZmlnIHNlYXJjaCBmaWx0ZXIgYm94IGZ1bmN0aW9uXG4gIG9uU2VhcmNoKGV2ZW50OiBhbnksZnJvbT86YW55KSB7XG4gICAgdGhpcy5zZWFyY2hCb3hWYWx1ZSA9IGV2ZW50OyAvLyBVcGRhdGUgdGhlIGRpc3BsYXllZCB2YWx1ZSBpbiB0aGUgc2VhcmNoIGJveFxuICAgIGlmICh0aGlzLnNlYXJjaENvbmZpZ3MgfHwgdGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoID09PSB0aGlzLnRvdGFsUmVjb3Jkcykge1xuICAgICAgdGhpcy5wYWdlSW5kZXggPSAxXG4gICAgICB0aGlzLnBhZ2VTaXplID0gMTBcbiAgICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5OeHRUYWJsZUVtaXQuZW1pdCh7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogTnVtYmVyKHRoaXMucGFnZUluZGV4KSB9LCB0YWJsZVNlYXJjaDogeyBmaWVsZHM6IHRoaXMuY3VycmVudENvbHVtbnMsIHZhbHVlOiB0aGlzLnNlYXJjaEJveFZhbHVlIH0sIHNlYXJjaEZpbHRlckRhdGE6IHRoaXMuZmlsdGVyRGF0YUFycmF5LCBzb3J0OiB7IGNvbHVtbjogdGhpcy5jdXJyZW50U29ydENvbHVtbiwgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uICxsaXN0VmlldzogdGhpcy5zZWxlY3RlZFZpZXd9IH0pXG4gICAgfVxuICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5OeHRUYWJsZVBhcmFtc0VtaXQuZW1pdCh7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXggfSx0YWJsZVNlYXJjaDogdGhpcy5zZWFyY2hCb3hWYWx1ZSwgc2VhcmNoRmlsdGVyRGF0YTogdGhpcy5maWx0ZXJEYXRhQXJyYXksIHNvcnQ6IHsgY29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBkaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gLGxpc3RWaWV3OiB0aGlzLnNlbGVjdGVkVmlld319KVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSBJZiB0aGUgdmFsdWUgaW4gdGhlIHNlYXJjaCBib3ggaXMgZW1wdHksIGNhbGwgdGhlIG9uU2VhcmNoIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHlcbiAgZW1wdHlTZWFyY2goZXZlbnQ6IGFueSkge1xuICAgIGlmICghZXZlbnQudHJpbSgpICYmICh0aGlzLnByZXZTZWFyY2ggIT0gZXZlbnQudHJpbSgpKSkge1xuICAgICAgdGhpcy5vblNlYXJjaChldmVudClcbiAgICB9XG4gICAgdGhpcy5wcmV2U2VhcmNoID0gZXZlbnQudHJpbSgpXG4gIH1cblxuICAvLyBTS1MxNUZFQjI1IGluZm9TaWRlc2NyZWVuIGVtaXQgXG4gIG9uU2lkZU5hdkluZm9DbGljayhkYXRhOiBhbnksIGNvbDogYW55KSB7XG4gICAgdGhpcy5zaWRlTmF2RW1pdC5lbWl0KHtcbiAgICAgIGRhdGEsIGNvbCxcbiAgICAgIGNvbmZpZzogdW5kZWZpbmVkXG4gICAgfSlcbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgZm9yIGFjdGl2ZSBjb2x1bW4gc2VsZWN0XG4gIG9uQ29sdW1uQ2xpY2sodW5pcXVlSWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgdGhpcy5hY3RpdmVDb2x1bW4gPSB1bmlxdWVJZGVudGlmaWVyO1xuICAgIGlmICghdGhpcy5pc0VkaXRhYmxlKSB7XG4gICAgICAvLyBFeGlzdGluZyBzb3J0L2ZpbHRlciBsb2dpY1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29sdW1uID09PSB1bmlxdWVJZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1uID0gbnVsbDtcbiAgICAgIHRoaXMuY29sdW1uU2VsZWN0ZWQuZW1pdChudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbiA9IHVuaXF1ZUlkZW50aWZpZXI7XG4gICAgICBjb25zdCBjb2x1bW5EYXRhID0gdGhpcy5kYXRhU291cmNlLmRhdGEubWFwKHJvdyA9PiAoe1xuICAgICAgICB2YWx1ZTogcm93W3VuaXF1ZUlkZW50aWZpZXJdLFxuICAgICAgICBpZDogcm93LmlkIC8vIG9yIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAgICB9KSk7XG4gICAgICB0aGlzLmNvbHVtblNlbGVjdGVkLmVtaXQoeyB1bmlxdWVJZGVudGlmaWVyLCBkYXRhOiBjb2x1bW5EYXRhIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNLUzE1RkVCMjUgZm9yIGNsb3NlIHNlYXJjaCBmaWx0ZXIgYm94XG4gIGNsb3NlZmlsdGVyKGZyb20/OmFueSkge1xuICAgIHRoaXMucGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplIHx8IDEwXG4gICAgdGhpcy5wYWdlSW5kZXggPSAxXG4gICAgdGhpcy5maWx0ZXJEYXRhQXJyYXlbdGhpcy5zZWxlY3RlZEZpbHRlcl0gPSBbXVxuICAgIHRoaXMuaXNSZXNpemVkID0gZmFsc2VcbiAgICBpZiAodGhpcy5jb25maWdQYWdpbmF0aW9uID09PSBmYWxzZSB8fCB0aGlzLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPT09IHRoaXMudG90YWxSZWNvcmRzKSB7XG4gICAgICB0aGlzLmZpbHRlclJldGFpbih0aGlzLmZpbHRlckRhdGFBcnJheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZnJvbSAhPT0gJ29uQ2hhbmdlJyl0aGlzLk54dFRhYmxlRW1pdC5lbWl0KHsgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogMTAsIHBhZ2VJbmRleDogMSB9LCB0YWJsZVNlYXJjaDogeyBmaWVsZHM6IHRoaXMuY3VycmVudENvbHVtbnMsIHZhbHVlOiB0aGlzLnNlYXJjaEJveFZhbHVlIH0sIHNlYXJjaEZpbHRlckRhdGE6IHRoaXMuZmlsdGVyRGF0YUFycmF5LCBzb3J0OiB7IGNvbHVtbjogdGhpcy5jdXJyZW50U29ydENvbHVtbiwgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnRTb3J0RGlyZWN0aW9uICxsaXN0VmlldzogdGhpcy5zZWxlY3RlZFZpZXd9IH0pXG4gICAgfVxuICAgIGlmKGZyb20gIT09ICdvbkNoYW5nZScpdGhpcy5OeHRUYWJsZVBhcmFtc0VtaXQuZW1pdCh7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IHRoaXMucGFnZVNpemUsIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXggfSx0YWJsZVNlYXJjaDogdGhpcy5zZWFyY2hCb3hWYWx1ZSwgc2VhcmNoRmlsdGVyRGF0YTogdGhpcy5maWx0ZXJEYXRhQXJyYXksIHNvcnQ6IHsgY29sdW1uOiB0aGlzLmN1cnJlbnRTb3J0Q29sdW1uLCBkaXJlY3Rpb246IHRoaXMuY3VycmVudFNvcnREaXJlY3Rpb24gLGxpc3RWaWV3OiB0aGlzLnNlbGVjdGVkVmlld319KVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSBzZWFyY2ggZmlsdGVyIGJveCBjaGVja2JveCByZXRhaW5cbiAgaXNTZWxlY3RlZChldmVudDogYW55KSB7XG4gICAgaWYgKHRoaXMuZmlsdGVyRGF0YUFycmF5W3RoaXMuc2VsZWN0ZWRGaWx0ZXJdICYmIHRoaXMuZmlsdGVyRGF0YUFycmF5W3RoaXMuc2VsZWN0ZWRGaWx0ZXJdLmluY2x1ZGVzKGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSBzZWFyY2ggZmlsdGVyIGJveCBjaGVja2JveCBzZWxlY3RcbiAgY2hlY2tlZERhdGEoZXZlbnQ6IGFueSxmcm9tPzphbnkpIHtcbiAgICBsZXQgc2VsZWN0ZWRBcnJheSA9IFtdXG4gICAgc2VsZWN0ZWRBcnJheSA9IHRoaXMuZmlsdGVyRGF0YUFycmF5W3RoaXMuc2VsZWN0ZWRGaWx0ZXJdID8gdGhpcy5maWx0ZXJEYXRhQXJyYXlbdGhpcy5zZWxlY3RlZEZpbHRlcl0gOiBbXVxuICAgIGlmIChzZWxlY3RlZEFycmF5ICYmIHNlbGVjdGVkQXJyYXkuaW5jbHVkZXMoZXZlbnQpKSB7XG4gICAgICBzZWxlY3RlZEFycmF5ID0gc2VsZWN0ZWRBcnJheS5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbSAhPT0gZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RlZEFycmF5LnB1c2goZXZlbnQpO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlckRhdGFBcnJheVt0aGlzLnNlbGVjdGVkRmlsdGVyXSA9IHNlbGVjdGVkQXJyYXlcbiAgICB0aGlzLmlzUmVzaXplZCA9IHNlbGVjdGVkQXJyYXk/Lmxlbmd0aCA+IDBcbiAgICBpZiAodGhpcy5kYXRhU291cmNlLmRhdGEubGVuZ3RoICE9PSB0aGlzLnRvdGFsUmVjb3JkcyAmJiB0aGlzLmNvbmZpZ1BhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gMVxuICAgICAgdGhpcy5wYWdlU2l6ZSA9IDEwXG4gICAgICBpZihmcm9tICE9PSAnb25DaGFuZ2UnKXRoaXMuTnh0VGFibGVFbWl0LmVtaXQoeyBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLCBwYWdlSW5kZXg6IE51bWJlcih0aGlzLnBhZ2VJbmRleCkgfSwgdGFibGVTZWFyY2g6IHsgZmllbGRzOiB0aGlzLmN1cnJlbnRDb2x1bW5zLCB2YWx1ZTogdGhpcy5zZWFyY2hCb3hWYWx1ZSB9LCBzZWFyY2hGaWx0ZXJEYXRhOiB0aGlzLmZpbHRlckRhdGFBcnJheSwgc29ydDogeyBjb2x1bW46IHRoaXMuY3VycmVudFNvcnRDb2x1bW4sIGRpcmVjdGlvbjogdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiAsbGlzdFZpZXc6IHRoaXMuc2VsZWN0ZWRWaWV3fSB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbHRlclJldGFpbih0aGlzLmZpbHRlckRhdGFBcnJheSlcbiAgICB9XG4gICAgaWYoZnJvbSAhPT0gJ29uQ2hhbmdlJyl0aGlzLk54dFRhYmxlUGFyYW1zRW1pdC5lbWl0KHsgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSwgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCB9LHRhYmxlU2VhcmNoOiB0aGlzLnNlYXJjaEJveFZhbHVlLCBzZWFyY2hGaWx0ZXJEYXRhOiB0aGlzLmZpbHRlckRhdGFBcnJheSwgc29ydDogeyBjb2x1bW46IHRoaXMuY3VycmVudFNvcnRDb2x1bW4sIGRpcmVjdGlvbjogdGhpcy5jdXJyZW50U29ydERpcmVjdGlvbiAsbGlzdFZpZXc6IHRoaXMuc2VsZWN0ZWRWaWV3fX0pXG4gIH1cblxuICAvLyBTS1MxNUZFQjI1ICBhY3Rpb24gY29sdW1uIGRyb3Bkb3duIGJ1dHRvbnMgY2xvc2VcbiAgcHJpdmF0ZSBhZGRDbGlja091dHNpZGVMaXN0ZW5lcigpIHtcbiAgICBpZiAoIXRoaXMuY2xpY2tMaXN0ZW5lcikge1xuICAgICAgdGhpcy5jbGlja0xpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5kcm9wZG93bicpKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50T3BlbkluZGV4ID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnJlbW92ZUNsaWNrTGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy9TS1MxNUZFQjI1IGlmIGNsb3NlIHRoZSBkcm9wZG93biBtZW51IHN0b3AgdGhlIGNsaWNrIGxpc3RlbmVyXG4gIHByaXZhdGUgcmVtb3ZlQ2xpY2tMaXN0ZW5lcigpIHtcbiAgICBpZiAodGhpcy5jbGlja0xpc3RlbmVyKSB7XG4gICAgICB0aGlzLmNsaWNrTGlzdGVuZXIoKTtcbiAgICAgIHRoaXMuY2xpY2tMaXN0ZW5lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gU0tTMTVGRUIyNSAgYWN0aW9uIGNvbHVtbiBkcm9wZG93biBidXR0b25zIG9wZW4gLyBjbG9zZVxuICB0b2dnbGVEcm9wZG93bihpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50T3BlbkluZGV4ID0gdGhpcy5jdXJyZW50T3BlbkluZGV4ID09PSBpbmRleCA/IG51bGwgOiBpbmRleDtcbiAgICB0aGlzLmFkZENsaWNrT3V0c2lkZUxpc3RlbmVyKCk7XG4gIH1cblxuICAvL1NLUzE1RkVCMjUgYWN0aW9uIGJ1dHRvbiBldm50IGVtaXRcbiAgYWN0aW9uQnV0dG9uQ2xpY2tlZChldmVudDogYW55LCBkYXRhOiBhbnkpIHtcbiAgICB0aGlzLmFjdGlvbkJ1dHRvbkVtaXQuZW1pdCh7IGV2ZW50LCBkYXRhIH0pXG4gIH1cblxuICByZW1vdmVDb2wodW5pcXVlSWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbiA9IG51bGw7XG4gICAgLy8gRW1pdCBkZXNlbGVjdGlvblxuICAgIGlmICghdGhpcy5pc0VkaXRhYmxlKSB7XG4gICAgICAvLyBFeGlzdGluZyBzb3J0L2ZpbHRlciBsb2dpY1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbkRhdGEgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YS5tYXAocm93ID0+ICh7XG4gICAgICB2YWx1ZTogcm93W3VuaXF1ZUlkZW50aWZpZXJdLFxuICAgICAgaWQ6IHJvdy5pZCAvLyBvciB1bmlxdWUgaWRlbnRpZmllclxuICAgIH0pKTtcbiAgICB0aGlzLnJlbW92ZUNvbHVtbi5lbWl0KHsgdW5pcXVlSWRlbnRpZmllciwgZGF0YTogY29sdW1uRGF0YSB9KTtcblxuICB9XG4gIGVtaXRUYWJsZURhdGFWYWx1ZSh1cGRhdGVkVGFibGVEYXRhOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodXBkYXRlZFRhYmxlRGF0YSk7XG4gIH1cblxuICB1cGRhdGVFZGl0KGluZGV4OiBudW1iZXIsIHZhbHVlOiBhbnksIGVsZW1lbnQ6IGFueSwgY29sdW1uOiBhbnkpOiB2b2lkIHsgY29uc29sZS5sb2coXCJ0YWJlbCBjaGFuZ2VzXCIpXG4gICAgY29uc3QgdXBkYXRlZEVsZW1lbnQgPSB0aGlzLnVwZGF0ZVZhbHVlKGVsZW1lbnQsIGNvbHVtbiwgdmFsdWUpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhW2luZGV4XSA9IHVwZGF0ZWRFbGVtZW50O1xuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YVNvdXJjZS5kYXRhXG4gICAgLy8gU0tTMjJKVUwyNSBJbnZhbGlkYXRlIGNhY2hlIGZvciB0aGlzIHJvdyBhbmQgY29sdW1uXG4gICAgY29uc3Qgcm93SWQgPSBlbGVtZW50Py5pZCA/PyBpbmRleDtcbiAgICBjb25zdCBrZXkgPSBgJHtyb3dJZH0tJHtjb2x1bW4gPz8gJ3Vua25vd24nfWA7XG4gICAgdGhpcy5xdWVzdGlvbnNDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAvLyBTS1MyME1BUjI1IEVuc3VyZSB0aGlzLmRhdGEgaXMgdXBkYXRlZCBzaW5jZSBzdW1tYXJ5IHVzZXMgdGhlIGZ1bGwgZGF0YXNldFxuICAgIGNvbnN0IGRhdGFJbmRleCA9IHRoaXMuZGF0YS5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbSA9PT0gZWxlbWVudCk7XG4gICAgaWYgKGRhdGFJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuZGF0YVtkYXRhSW5kZXhdID0gdXBkYXRlZEVsZW1lbnQ7XG4gICAgfVxuICAgIC8vIFJlY29tcHV0ZSBzdW1tYXJ5IGNvbHVtbnMgZm9yIHRoZSB1cGRhdGVkIHJvd1xuICAgIGlmICh0aGlzLnN1bW1hcnlDb2x1bW5zICYmIHRoaXMuc3VtbWFyeUNvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zdW1tYXJ5Q29sdW1ucy5mb3JFYWNoKHN1bW1hcnlDb2wgPT4ge1xuICAgICAgICBpZiAoc3VtbWFyeUNvbC50eXBlID09PSAnY2FsY3VsYXRpb24nICYmIHN1bW1hcnlDb2wub3BlcmFuZHMgJiYgc3VtbWFyeUNvbC5vcGVyYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoc3VtbWFyeUNvbC5vcGVyYXRpb24gPT09ICdzdW0nKSB7XG4gICAgICAgICAgICB1cGRhdGVkRWxlbWVudFtzdW1tYXJ5Q29sLmZpZWxkTmFtZV0gPSBzdW1tYXJ5Q29sLm9wZXJhbmRzLnJlZHVjZShcbiAgICAgICAgICAgICAgKGFjYywgb3BlcmFuZCkgPT4gYWNjICsgKE51bWJlcih1cGRhdGVkRWxlbWVudFtvcGVyYW5kXSkgfHwgMCksXG4gICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzdW1tYXJ5Q29sLm9wZXJhdGlvbiA9PT0gJ211bHRpcGx5Jykge1xuICAgICAgICAgICAgdXBkYXRlZEVsZW1lbnRbc3VtbWFyeUNvbC5maWVsZE5hbWVdID0gc3VtbWFyeUNvbC5vcGVyYW5kcy5yZWR1Y2UoXG4gICAgICAgICAgICAgIChhY2MsIG9wZXJhbmQpID0+IGFjYyAqIChOdW1iZXIodXBkYXRlZEVsZW1lbnRbb3BlcmFuZF0pIHx8IDApLCAgLy8gU3RhcnQgd2l0aCAxIGluc3RlYWQgb2YgMFxuICAgICAgICAgICAgICAxXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3VtbWFyeUNvbC5vcGVyYXRpb24gPT09ICdzdWJ0cmFjdCcpIHtcbiAgICAgICAgICAgIHVwZGF0ZWRFbGVtZW50W3N1bW1hcnlDb2wuZmllbGROYW1lXSA9IHN1bW1hcnlDb2wub3BlcmFuZHMuc2xpY2UoMSkucmVkdWNlKFxuICAgICAgICAgICAgICAoYWNjLCBvcGVyYW5kKSA9PiBhY2MgLSAoTnVtYmVyKHVwZGF0ZWRFbGVtZW50W29wZXJhbmRdKSB8fCAwKSxcbiAgICAgICAgICAgICAgTnVtYmVyKHVwZGF0ZWRFbGVtZW50W3N1bW1hcnlDb2wub3BlcmFuZHNbMF1dKSB8fCAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YVtpbmRleF0gPSB1cGRhdGVkRWxlbWVudDtcbiAgICAgIGlmIChkYXRhSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMuZGF0YVtkYXRhSW5kZXhdID0gdXBkYXRlZEVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmZyb20gPT09ICdmb3JtQnVpbGRlcicpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhW2luZGV4XSA9IHRoaXMudXBkYXRlVmFsdWUoZWxlbWVudCwgY29sdW1uLCB2YWx1ZSk7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGFTb3VyY2UuZGF0YVxuICAgIH1cbiAgICB0aGlzLmNvbXB1dGVTdW1tYXJ5VmFsdWVzKCk7XG4gIH1cbiAgLy8gU0tTMThNQVIyNSB1cGRhdGUgZWxlbWVudFxuICB1cGRhdGVWYWx1ZShlbGVtZW50OiBhbnksIGNvbHVtbjogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgbGV0IGZsZHMgPSBjb2x1bW4/LnNwbGl0KCcuJyk7XG4gICAgbGV0IG9iaiA9IGVsZW1lbnQ7IC8vIEtlZXAgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBvYmplY3RcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxkcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGxldCBzcGxpdEZsZHMgPSBmbGRzW2ldLnNwbGl0KCdbJyk7XG4gICAgICBpZiAoc3BsaXRGbGRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBvYmogPSBvYmpbZmxkc1tpXV0gfHwgKG9ialtmbGRzW2ldXSA9IHt9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBpbmRleCA9IE51bWJlcihzcGxpdEZsZHNbMV0uc3BsaXQoJ10nKVswXSk7XG4gICAgICAgIG9iaiA9IG9ialtzcGxpdEZsZHNbMF1dIHx8IChvYmpbc3BsaXRGbGRzWzBdXSA9IFtdKTtcbiAgICAgICAgb2JqID0gb2JqW2luZGV4XSB8fCAob2JqW2luZGV4XSA9IHt9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGZpbmFsIHByb3BlcnR5XG4gICAgbGV0IGxhc3RLZXkgPSBmbGRzW2ZsZHMubGVuZ3RoIC0gMV07XG4gICAgbGV0IHNwbGl0TGFzdEtleSA9IGxhc3RLZXkuc3BsaXQoJ1snKTtcbiAgICBpZiAoc3BsaXRMYXN0S2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgb2JqW2xhc3RLZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpbmRleCA9IE51bWJlcihzcGxpdExhc3RLZXlbMV0uc3BsaXQoJ10nKVswXSk7XG4gICAgICBvYmpbc3BsaXRMYXN0S2V5WzBdXVtpbmRleF0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIGV4cGVuc2VBdHRhY2htZW50KGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZpbGVFbWl0LmVtaXQoZXZlbnQpXG4gIH1cbiAgbGlzdFZpZXdFbWl0KGV2ZW50KXtcbiAgICBpZihldmVudC5hY3Rpb24gPT09ICdmaWx0ZXJHZXQnKXtcbiAgICAgIGV2ZW50WydkYXRhJ109IHRoaXMuY29sdW1ucz8uZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZmlsdGVyID09PSB0cnVlKS5tYXAoY29sdW1uID0+IGNvbHVtbi5maWVsZE5hbWUpXG4gICAgICBpZighdGhpcy50YWJsZUZpbHRlckRhdGEgfHwgdGhpcy50YWJsZUZpbHRlckRhdGEubGVuZ3RoID09PSAwKXtcbiAgICAgICAgdGhpcy5OeHRUYWJsZUZpbHRlckVtaXQuZW1pdChldmVudClcbiAgICAgIH1cbiAgICB9IGVsc2V7IFxuICAgICAgaWYgKGV2ZW50LmFjdGlvbiA9PT0gJ3NlbGVjdCcgfHwgZXZlbnQuYWN0aW9uID09PSAnc2F2ZScpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXcgPSBldmVudC5kYXRhLmZpbHRlck5hbWU7XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXdGaWx0ZXIgPSBldmVudC5kYXRhO1xuICAgICAgICB0aGlzLm5nT25DaGFuZ2VzKHt9KVxuICAgICAgfVxuICAgICAgdGhpcy5OeHRUYWJsZUZpbHRlckVtaXQuZW1pdChldmVudClcbiAgICB9XG4gIH1cbiAgYXN5bmMgb25JbWFnZUVkaXQocXVlczogYW55KSB7XG4gICAgdGhpcy5pc0ltYWdlRWRpdCA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZEltYWdlRWxlbWVudCA9IHF1ZXM7XG4gIH1cbiAgYXN5bmMgb25JbWFnZURlbGV0ZShxdWVzOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgcXVlcy5pbWFnZURhdGEgPSAnJztcbiAgICAgIHF1ZXMub3JnSW1hZ2VEYXRhID0gJyc7XG4gICAgICAvLyBTS1MyMkpVTDI1IEluaXRpYWxpemUgbG9nbyBzaXplIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgaWYgKCFxdWVzLmltYWdlU2l6ZSkge1xuICAgICAgICBxdWVzLmltYWdlU2l6ZSA9IHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxNTAgfTtcbiAgICAgIH1cbiAgICAgIC8vIGF3YWl0IHRoaXMuY2hpbGRFdmVudENhcHR1cmUocXVlcy5pbWFnZURhdGEsIHF1ZXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVhZGluZyBmaWxlOlwiLCBlcnJvcik7XG4gICAgfVxuICB9XG4gICAvLyBTS1MyNU1BUjI1IGltYWdlIGFkZFxuICAgYXN5bmMgZmlsZUNoYW5nZUV2ZW50KHF1ZXM6IGFueSwgZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGltYWdlRGF0YSA9IGF3YWl0IHRoaXMucmVhZEZpbGVBc0RhdGFVUkwoZmlsZSk7XG4gICAgICAgIHF1ZXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgICAgICBxdWVzLm9yZ0ltYWdlRGF0YSA9IGltYWdlRGF0YTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBsb2dvIHNpemUgaWYgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmICghcXVlcy5pbWFnZVNpemUpIHtcbiAgICAgICAgICBxdWVzLmltYWdlU2l6ZSA9IHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxNTAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF3YWl0IHRoaXMuY2hpbGRFdmVudENhcHR1cmUoaW1hZ2VEYXRhLCBxdWVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIGZpbGU6XCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpO1xuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9KTtcbiAgfVxuICAvLyBTS1MyOE1BUjI1IGZvciBuZXN0ZWQgYm9vayByZWFkXG4gIHJlYWRRdWVzdGlvbnMocWJJZDogYW55LCBxdWVzOmFueSkge1xuICAgIGxldCBxdWVzdGlvbnMgPSBbXTtcbiAgICAvLyBTS1MyMkpVTDI1IEFkZGVkIHRlcm5hcnkgdG8gYXZvaWQgdW5kZWZpbmVkXG4gICAgZm9yICh2YXIgc3EgaW4gcXVlcy5ib29rUXVlc3Rpb25zTWFwW3FiSWRdLnN1YlF1ZXN0aW9ucykge1xuICAgICAgbGV0IHE6IGFueSA9IHF1ZXMuYm9va1F1ZXN0aW9uc01hcFtxYklkXS5zdWJRdWVzdGlvbnNbc3FdO1xuICAgICAgLy8gaWYgcXVlc3Rpb24gaXMgdGhlcmUgcHJvY2Vzc1xuICAgICAgaWYgKHEpIHtcbiAgICAgICAgICBxdWVzdGlvbnMucHVzaChxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXN0aW9ucztcbiAgfVxuICBnZXREcm9wRG93bihldmVudDogYW55KSB7XG4gICAgdGhpcy5oYWRsZURyb3BEb3duRGVwZW5kZW50LmVtaXQoZXZlbnQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFibGUtbGF5b3V0XCIgW2lkXT1cInRhYmxlSWRcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctdG9wJzogJzFweCcsICd3aWR0aCc6IHRhYmxlV2lkdGh9XCIgW2Rpcl09XCJkaXJlY3Rpb25cIj5cbiAgICA8ZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidGl0bGVcIiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHRhYmxlLXRpdGxlIGFsaWduLXRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICB7e3RpdGxlfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJpc05vc0luZGljYXRvciB8fCBzZWFyY2hCYXIgfHwgaXNCdXR0b25zXCIgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcbiAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1ib3R0b206IDIwcHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgIDwhLS0gU0tTMjZBUFIyNSBMaXN0IFZpZXcgRmlsdGVyIC0tPlxuICAgICAgICAgICAgICAgIDxhcHAtbGlzdC12aWV3LWZpbHRlciAqbmdJZj1cImxpc3RWaWV3cyAmJiBsaXN0Vmlld3MubGVuZ3RoID4gMFwiIFtsaXN0Vmlld3NdPVwibGlzdFZpZXdzXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkVmlld109XCJzZWxlY3RlZFZpZXdcIiBbZGlzcGxheWVkQ29sdW1uc109J2NvbHVtbnMnIFt0YWJsZUZpbHRlckFycmF5XT1cInRhYmxlRmlsdGVyQXJyYXlcIlxuICAgICAgICAgICAgICAgICAgICAobGlzdFZpZXdFbWl0KT1cImxpc3RWaWV3RW1pdCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9hcHAtbGlzdC12aWV3LWZpbHRlcj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKCFsaXN0Vmlld3MgfHwgbGlzdFZpZXdzLmxlbmd0aCA9PT0gMCkgJiYgaXNOb3NJbmRpY2F0b3JcIiBjbGFzcz1cIm5vT2ZSZWNcIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FQUC5OT1MnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ05vcyd9fSA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjogcmdiKDQzLCA4NywgMjQ5KTtcIj57e3RvdGFsUmVjb3JkcyB8fCB0b3RhbENvdW50fX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiIHN0eWxlPVwiYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VhcmNoQmFyXCIgY2xhc3M9XCJzZWFyY2hcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc2VhcmNoLWJhclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDIyXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS42NDEzIDE5LjI1QzE2LjYzMjIgMTkuMjUgMjAuNjc4MSAxNS4zNTExIDIwLjY3ODEgMTAuNTQxN0MyMC42NzgxIDUuNzMyMTggMTYuNjMyMiAxLjgzMzMzIDExLjY0MTMgMS44MzMzM0M2LjY1MDQgMS44MzMzMyAyLjYwNDQ5IDUuNzMyMTggMi42MDQ0OSAxMC41NDE3QzIuNjA0NDkgMTUuMzUxMSA2LjY1MDQgMTkuMjUgMTEuNjQxMyAxOS4yNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjNzg3NDg2XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIxLjYyOTUgMjAuMTY2N0wxOS43MjcxIDE4LjMzMzNcIiBzdHJva2U9XCIjNzg3NDg2XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJ7eyAnQVBQLlNFQVJDSCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnU2VhcmNoJyAgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJzZWFyY2hDb25maWdzID8gZW1wdHlTZWFyY2goJGV2ZW50LnRhcmdldC52YWx1ZSkgOiBhcHBseUZpbHRlcigkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlYXJjaEJveFZhbHVlIHx8ICcnXCIgI2lucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInNlYXJjaENvbmZpZ3MgJiYgc2VhcmNoQmFyXCIgY2xhc3M9XCJjb25maWdTZWFyY2hcIiAoY2xpY2spPVwib25TZWFyY2goaW5wdXQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMjRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCA1SDIwXCIgc3Ryb2tlPVwiI2ZmZmZmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNCA4SDE3XCIgc3Ryb2tlPVwiI2ZmZmZmZlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMSAxMS41QzIxIDE2Ljc1IDE2Ljc1IDIxIDExLjUgMjFDNi4yNSAyMSAyIDE2Ljc1IDIgMTEuNUMyIDYuMjUgNi4yNSAyIDExLjUgMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNmZmZmZmZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIgMjJMMjAgMjBcIiBzdHJva2U9XCIjZmZmZmZmXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCIgKm5nSWY9XCJpc0J1dHRvbnNcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogN3B4OyBnYXA6IDdweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIiAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGJ1dHRvbkFycmF5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bnh0LWJ1dHRvbiBjbGFzcz1cImRhdGEtdGFibGUtZnNidG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidXR0b25DbGlja0VtaXQpPVwiKGJ1dHRvbi50eXBlID09PSAnZ3JvdXAnIHx8IGJ1dHRvbi50eXBlID09PSAnZHJvcGRvd24nKSA/IGNvbW1vbkJ1dHRvbkNsaWNrKCRldmVudCkgOiBjb21tb25CdXR0b25DbGljayhidXR0b24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYnV0dG9uVHlwZV09XCJidXR0b24uY2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25WYWx1ZV09XCJidXR0b24ubGFiZWxQYXRoIHx8IGJ1dHRvbi5sYWJlbCB8fCBidXR0b24ubmFtZSB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IGJ1dHRvbi5sYWJlbCB8fCBidXR0b24ubmFtZSBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidXR0b25Db25maWddPVwiYnV0dG9uLmJ1dHRvbkNvbmZpZ1wiIFt0eXBlXT1cImJ1dHRvbi50eXBlXCIgY2xhc3M9XCJtcy0yIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidG5JY29uTGVmdFNyY109XCJidXR0b24uYnRuSWNvbkxlZnRTcmNcIiBbaXNJbWFnZVN2Z109XCJidXR0b24uaXNJbWFnZVN2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9ueHQtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtbWFyZ2luXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdyZXNpemluZyc6IGlzUmVzaXppbmcgfVwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBtYXhIZWlnaHQ6IGlzUGFnaW5hdGlvbiA/ICc0NTBweCcgOiAnYXV0bycsIG1pbkhlaWdodDogZGF0YVNvdXJjZS5kYXRhICYmIGRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCA9PT0gMCAmJiAhaXNMb2FkaW5nICYmIGZyb20gIT09ICdmb3JtQnVpbGRlcicgPyAnMHB4JyA6ICcxMDBweCcgfVwiXG4gICAgICAgICAgICAgICAgI3RhYmxlQ29udGFpbmVyIChzY3JvbGwpPVwib25TY3JvbGwodGFibGVDb250YWluZXIpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNLUzE1RkVCMjUgVGFibGUgSGVhZGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiIFtuZ0NsYXNzXT1cInsgJ3NoYWRvdyc6IGlzU2Nyb2xsZWQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNLUzE1RkVCMjUgQ2hlY2tib3ggQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwid2l0aENoZWNrQm94XCIgY2xhc3M9XCJ0YWJsZS1jZWxsIHN0aWNreS1jb2x1bW4gaGVhZC1jb2xvclwiIFtzdHlsZS53aWR0aF09XCInNTBweCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCIgKGNoYW5nZSk9XCJtYXN0ZXJUb2dnbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uPy5oYXNWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb24/Lmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBEYXRhIENvbHVtbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjdXJyZW50Q29sdW1uczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi5zdW1tYXJ5Q29sdW1uICE9PSB0cnVlICYmIGNvbHVtbi5zdW1tYXJ5Um93ICE9PSB0cnVlICYmIGNvbHVtbi5pc0hpZGUgIT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGFibGUtY2VsbCB0YWJsZUhlYWRlciBoZWFkLWNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc3RpY2t5LWNvbHVtbl09XCJpID09PSAoc3RpY2t5Q29uZGl0aW9uIC0gMSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmUtY29sdW1uXT1cImFjdGl2ZUNvbHVtbiA9PT0gY29sdW1uLnVuaXF1ZUlkZW50aWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZC1jb2x1bW5dPVwibW9kZSA9PT0gJ2VkaXQnICYmIGlzRWRpdGFibGUgJiYgc2VsZWN0ZWRDb2x1bW4gPT09IGNvbHVtbi51bmlxdWVJZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBvbkNvbHVtbkNsaWNrKGNvbHVtbi51bmlxdWVJZGVudGlmaWVyKTsgY29sdW1uLnNvcnQgPyBzb3J0RGF0YShjb2x1bW4uZmllbGROYW1lKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJob3ZlcmVkQ29sdW1uID0gY29sdW1uLmZpZWxkTmFtZVwiIChtb3VzZWxlYXZlKT1cImhvdmVyZWRDb2x1bW4gPSBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiY29sdW1uLndpZHRoIHx8ICcxMDBweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5mbGV4XT1cIicwIDAgJyArIChjb2x1bW4ud2lkdGggfHwgJzEwMHB4JylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGhdPVwiJzUwcHgnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbkRpdlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLWhlYWRlclwiIFtzdHlsZS53aWR0aF09XCJjb2x1bW4ud2lkdGggfHwgJzEwMHB4J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBZGQgY2xvc2UgYnV0dG9uIGZvciBzZWxlY3RlZCBjb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibW9kZSA9PT0gJ2VkaXQnICYmIGlzRWRpdGFibGUgJiYgc2VsZWN0ZWRDb2x1bW4gPT09IGNvbHVtbi51bmlxdWVJZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsb3NlLWNvbHVtbi1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHJlbW92ZUNvbChjb2x1bW4udW5pcXVlSWRlbnRpZmllcilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDinJVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVsbGlwc2lzXCIgc3R5bGU9XCJmbGV4OiAxO1wiIFt0aXRsZV09XCJjb2x1bW4ubGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBjb2x1bW4ubGFiZWxQYXRoIHx8IGNvbHVtbi5sYWJlbCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IGNvbHVtbi5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJjb2x1bW4uZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgZmlsdGVyKGNvbHVtbi5maWVsZE5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAycHg7XCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjExXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMiAxMVwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMC43NSAxLjI1SDAuNzVMNC43NSA1LjcxNzIyVjguODA1NTZMNi43NSA5Ljc1VjUuNzE3MjJMMTAuNzUgMS4yNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzI0MjUzM1wiIHN0cm9rZS13aWR0aD1cIjEuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBSZWQgZG90IGZvciBhY3RpdmUgZmlsdGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlckRhdGFBcnJheSAmJiBmaWx0ZXJEYXRhQXJyYXlbY29sdW1uLmZpZWxkTmFtZV0/Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3g9XCI5XCIgY3k9XCIyXCIgcj1cIjIuNVwiIGZpbGw9XCJyZWRcIj48L2NpcmNsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLnNvcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNvcnQtaW5kaWNhdG9yc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImN1cnJlbnRTb3J0Q29sdW1uID09PSBjb2x1bW4uZmllbGROYW1lXCIgY2xhc3M9XCJzb3J0LWRpcmVjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgY3VycmVudFNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gJ+KGkScgOiBjdXJyZW50U29ydERpcmVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09ICdkZXNjJyA/ICfihpMnIDogJycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJob3ZlcmVkQ29sdW1uID09PSBjb2x1bW4uZmllbGROYW1lICYmIGN1cnJlbnRTb3J0Q29sdW1uICE9PSBjb2x1bW4uZmllbGROYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic29ydC1kaXJlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKGkVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlYXJjaEZpbHRlciAmJiBjb2x1bW4uZmllbGROYW1lID09PSBzZWxlY3RlZEZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWNvbXBvbmVudCBwb3NpdGlvbi1hYnNvbHV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmc2VhcmNoXCIgW2NsYXNzLnJlc2l6ZWRdPVwiaXNSZXNpemVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnNlYXJjaC1iYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwic2VhcmNoU3ZnXCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyMlwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS42NDEzIDE5LjI1QzE2LjYzMjIgMTkuMjUgMjAuNjc4MSAxNS4zNTExIDIwLjY3ODEgMTAuNTQxN0MyMC42NzgxIDUuNzMyMTggMTYuNjMyMiAxLjgzMzMzIDExLjY0MTMgMS44MzMzM0M2LjY1MDQgMS44MzMzMyAyLjYwNDQ5IDUuNzMyMTggMi42MDQ0OSAxMC41NDE3QzIuNjA0NDkgMTUuMzUxMSA2LjY1MDQgMTkuMjUgMTEuNjQxMyAxOS4yNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzc4NzQ4NlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMS42Mjk1IDIwLjE2NjdMMTkuNzI3MSAxOC4zMzMzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiM3ODc0ODZcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwid2lkdGgtMTAwXCIgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdBUFAuU0VBUkNIJyB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdTZWFyY2gnICB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VhcmNoVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImlzUmVzaXplZFwiIChjbGljayk9XCJjbG9zZWZpbHRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xvc2UtaWNvblwiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk05LjE2OTk4IDE0LjgzTDE0LjgzIDkuMTcwMDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNC44MyAxNC44M0w5LjE2OTk4IDkuMTcwMDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTkgMjJIMTVDMjAgMjIgMjIgMjAgMjIgMTVWOUMyMiA0IDIwIDIgMTUgMkg5QzQgMiAyIDQgMiA5VjE1QzIgMjAgNCAyMiA5IDIyWlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItY29udGVudFwiIFtzdHlsZV09XCInb3ZlcmZsb3cteTogYXV0bydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZGF0YSBvZiBmaWx0ZXJBcnJheSB8IHNlYXJjaEZpbHRlciA6IHNlYXJjaFRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zIG1iLTMgY2hlY2tib3hkaXZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZ2FwOiA1cHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQoZGF0YSlcIiBbdmFsdWVdPVwiZGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJkYXRhXCIgKGNoYW5nZSk9XCJjaGVja2VkRGF0YShkYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtcy0yIGxhYmVsLWRhdGFcIj57e2RhdGF9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEVuaGFuY2VkIHJlc2l6ZSBoYW5kbGUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNpemUtaGFuZGxlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25SZXNpemVTdGFydCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJEcmFnIHRvIHJlc2l6ZSBjb2x1bW5cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBBY3Rpb24gQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aW9uQnV0dG9uIHx8IGlzRGVsZXRlUm93IHx8IGlzRWRpdFJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLWNlbGwgaGVhZC1jb2xvciBhY3Rpb25Db2wgc3RpY2t5LWNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiJzE1MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDEycHggIWltcG9ydGFudDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGFjdGlvbkNvbHVtSGVhZGVyIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FjdGlvbid9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBUYWJsZSBCb2R5IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHlcIiAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIGRhdGFTb3VyY2UuZGF0YTsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwidGFibGUtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRhYmxlQ2xpY2soZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNLUzE1RkVCMjUgQ2hlY2tib3ggQ2VsbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIndpdGhDaGVja0JveFwiIGNsYXNzPVwidGFibGUtY29sLWNlbGwgc3RpY2t5LWNvbHVtbiBib2R5LWNvbG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlcGFyYXRlUm93U2VsZWN0KHNlbGVjdGlvbi50b2dnbGUoZWxlbWVudCksIGVsZW1lbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaXNTZWxlY3RlZChlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIihlbGVtZW50LmlzUGF5UHJvY2Vzc2VkID09PSB0cnVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBEYXRhIENlbGxzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY3VycmVudENvbHVtbnM7IGxldCBsYXN0ID0gbGFzdDsgZWxsaXBzaXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2x1bW4uc3VtbWFyeUNvbHVtbiAhPT0gdHJ1ZSAmJiBjb2x1bW4uc3VtbWFyeVJvdyAhPT0gdHJ1ZSAmJiBjb2x1bW4uaXNIaWRlICE9PSB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlLWNvbC1jZWxsIGJvZHktY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZC1jZWxsXT1cIm1vZGUgPT09ICdlZGl0JyAmJiBpc0VkaXRhYmxlICYmIHNlbGVjdGVkQ29sdW1uID09PSBjb2x1bW4udW5pcXVlSWRlbnRpZmllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbHVtbi53aWR0aCB8fCAnMTAwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleF09XCInMCAwICcgKyAoY29sdW1uLndpZHRoIHx8ICcxMDBweCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoXT1cIic1MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aF09XCJjb2x1bW4ud2lkdGggfHwgJzEwMHB4J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjJKVUwyNSBjYWxlbmRhciAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdjYWxlbmRhcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxhcHAtY3VzdG9tLWNhbGVuZGFyIFtxdWVzdGlvbl09XCJjb2x1bW4gfCBxdWVzdGlvbkJ5Um93OmVsZW1lbnQ6aVwiIChldmVudFNlbGVjdGVkKT1cImdldENhbGVuZGFyRXZlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlU2VsZWN0ZWQpPVwiZ2V0Q3VycmVudENhbGVuZGFyKCRldmVudClcIiAob3Blbk1vZGFsKT1cIm9wZW5DYWxlbmRhck1vZGFsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VNb2RhbCk9XCJjbG9zZUNhbGVuZGFyTW9kYWwoJGV2ZW50KVwiPjwvYXBwLWN1c3RvbS1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS1tb2RlbCAqbmdJZj1cImlzQ2FsZW5kYXJNb2RhbE9wZW5cIiBbbW9kYWxUaXRsZV09XCJjYWxlbmRhck1vZGFsVGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNNb2RhbE9wZW5dPVwiaXNDYWxlbmRhck1vZGFsT3BlblwiIFttb2RhbFNpemVdPVwiY2FsZW5kYXJNb2RhbFNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2F2ZUJ1dHRvblZhbHVlXT1cImNhbGVuZGFyU2F2ZUJ1dHRvblZhbHVlXCIgW21vZGFsRm9vdGVyXT1cIm1vZGFsQ2FsZW5kYXJNb2RhbEZvb3RlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYXZlQnV0dG9uRW1pdCk9XCJvbkNhbGVuZGFyTW9kYWxTYXZlKClcIiAoY2FuY2VsQnV0dG9uRW1pdCk9XCJjbG9zZUNhbGVuZGFyTW9kYWwoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLXF1ZXN0aW9uYm9vayBbcWJJdGVtXT1cInFiUmVmcmVuY2VCb29rXCIgW3F1ZXN0aW9uc109XCJyZWZlcmVuY2VRdWVzdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhbmRsZVF1ZXN0aW9uKT1cImhhbmRsZVF1ZXN0aW9uRXZlbnQoJGV2ZW50KVwiPjwvbGliLXF1ZXN0aW9uYm9vaz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC1jdXN0b20tbW9kZWw+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjJKVUwyNSBmb3IgcGljayBsb2NhdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtcGljay1sb2NhdGlvbiAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2xvY2F0aW9uJ1wiIFthcGlLZXldPVwiY29sdW1uWydhcGlLZXknXVwiIFthZGRyZXNzXT1cInF1ZXN0aW9uLnNlbGVjdGVkVmFsdWVcIiBbcXVlc3Rpb25dPVwiY29sdW1uIHwgcXVlc3Rpb25CeVJvdzplbGVtZW50OmlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlXT1cImZyb20gPT09ICdmb3JtQnVpbGRlcicgJiYgZWxlbWVudC5lZGl0Um93ICYmICFjb2x1bW4ucXVlc3Rpb24/LmlzUmVhZE9ubHkgPyAnZWRpdCcgOiAndmlldydcIiBbZnJvbV09XCInbnh0VGFibGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9jYXRpb25TZWxlY3RlZCk9XCJ1cGRhdGVFZGl0KGksJGV2ZW50LGVsZW1lbnQsY29sdW1uLmZpZWxkTmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLXBpY2stbG9jYXRpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjJKVUwyNSBJbWFnZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2ltYWdlJ1wiIChtb3VzZWVudGVyKT1cImlzSW1hZ2VIb3ZlciA9IHRydWU7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJpc0ltYWdlSG92ZXIgPSBmYWxzZTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJpc0ltYWdlSG92ZXJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogZW5kO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seVwiIChjbGljayk9XCJvbkltYWdlRWRpdChjb2x1bW4ucXVlc3Rpb24pXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMS4xMDY3IDYuMDcxNzRMOS45MjgzMyA0Ljg5MzRMMi4xNjY2NyAxMi42NTUxVjEzLjgzMzRIMy4zNDVMMTEuMTA2NyA2LjA3MTc0Wk0xMi4yODUgNC44OTM0TDEzLjQ2MzMgMy43MTUwN0wxMi4yODUgMi41MzY3NEwxMS4xMDY3IDMuNzE1MDdMMTIuMjg1IDQuODkzNFpNNC4wMzUgMTUuNTAwMUgwLjVWMTEuOTY0MkwxMS42OTU4IDAuNzY4NDAzQzExLjg1MjEgMC42MTIxNzcgMTIuMDY0IDAuNTI0NDE0IDEyLjI4NSAwLjUyNDQxNEMxMi41MDYgMC41MjQ0MTQgMTIuNzE3OSAwLjYxMjE3NyAxMi44NzQyIDAuNzY4NDAzTDE1LjIzMTcgMy4xMjU5QzE1LjM4NzkgMy4yODIxOCAxNS40NzU3IDMuNDk0MSAxNS40NzU3IDMuNzE1MDdDMTUuNDc1NyAzLjkzNjA0IDE1LjM4NzkgNC4xNDc5NiAxNS4yMzE3IDQuMzA0MjRMNC4wMzU4MyAxNS41MDAxSDQuMDM1WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM2Qzc1N0RcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFjb2x1bW4ucXVlc3Rpb24/LmlzUmVhZE9ubHlcIiAoY2xpY2spPVwib25JbWFnZURlbGV0ZShjb2x1bW4ucXVlc3Rpb24pXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNCAzLjk4NzI2QzExLjc4IDMuNzY3MjYgOS41NDY2NyAzLjY1MzkzIDcuMzIgMy42NTM5M0M2IDMuNjUzOTMgNC42OCAzLjcyMDYgMy4zNiAzLjg1MzkzTDIgMy45ODcyNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI0ZGMkMxMFwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNS42NjY1IDMuMzEzNjJMNS44MTMxNyAyLjQ0MDI4QzUuOTE5ODQgMS44MDY5NSA1Ljk5OTg0IDEuMzMzNjIgNy4xMjY1IDEuMzMzNjJIOC44NzMxN0M5Ljk5OTg0IDEuMzMzNjIgMTAuMDg2NSAxLjgzMzYyIDEwLjE4NjUgMi40NDY5NUwxMC4zMzMyIDMuMzEzNjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyLjU2NjcgNi4wOTM3NUwxMi4xMzM0IDEyLjgwNzFDMTIuMDYgMTMuODUzNyAxMiAxNC42NjcxIDEwLjE0IDE0LjY2NzFINS44NjAwMkM0LjAwMDAyIDE0LjY2NzEgMy45NDAwMiAxMy44NTM3IDMuODY2NjggMTIuODA3MUwzLjQzMzM1IDYuMDkzNzVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02Ljg4NjQ3IDExLjAwMDRIOS4xMDY0N1wiIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuMzMzNSA4LjMzMzI1SDkuNjY2ODNcIiBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seVwiIFtzcmNdPVwiY29sdW1uLnF1ZXN0aW9uPy5pbWFnZURhdGFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIiFjb2x1bW4ucXVlc3Rpb24/LmlzUmVhZE9ubHlcIiBjbGFzcz1cImxvZ28tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ28gcHJldmlldyBhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dvLXByZXZpZXdcIiAqbmdJZj1cImNvbHVtbi5xdWVzdGlvbj8uaW5wdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjb2x1bW4ucXVlc3Rpb24/LmltYWdlRGF0YVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwbG9hZCBidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4ucXVlc3Rpb24/LmltYWdlRGF0YVwiIGNsYXNzPVwibG9nby11cGxvYWQtcGxhY2Vob2xkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJsb2dvLXVwbG9hZC17e2l9fVwiIGNsYXNzPVwibG9nby11cGxvYWQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi4uL2Fzc2V0cy9pY29ucy9JbWFnZS5zdmdcIiBhbHQ9XCJVcGxvYWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlVwbG9hZCBJbWFnZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImxvZ28tdXBsb2FkLXt7aX19XCIgYWNjZXB0PVwiaW1hZ2UvKlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlRXZlbnQoY29sdW1uLnF1ZXN0aW9uLCAkZXZlbnQpXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyMkpVTDI1IGljb24tc2VsZWN0b3IgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnh0LWljb24tc2VsZWN0b3IgW2FsbEljb25zXT1cImFsbEljb25zXCIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2ljb24nXCIgW3JlcXVpcmVkXT1cImNvbHVtbi5xdWVzdGlvbj8uaXNPcHRpb25hbFwiIFttb2RlXT1cIm1vZGVcIiBbcXVlc3Rpb25dPVwiY29sdW1uIHwgcXVlc3Rpb25CeVJvdzplbGVtZW50OmlcIiBbbGFiZWxGb250XT1cImNvbHVtbi5xdWVzdGlvbj8uZm9udFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5xdWVzdGlvbj8ucXVlc3Rpb25UZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxDb2xvcl09XCJjb2x1bW4ucXVlc3Rpb24/LmZvbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsU2l6ZV09XCJjb2x1bW4ucXVlc3Rpb24/LmZvbnRTaXplXCIgW2xhYmVsV2VpZ2h0XT1cImNvbHVtbi5xdWVzdGlvbj8uZm9udFdlaWdodFwiIFtzaG93TGFiZWxdPVwiY29sdW1uLnF1ZXN0aW9uPy5zdHlsZT8uc2hvd0xhYmVsXCIgKGljb25TZWxlY3RlZCk9XCJ1cGRhdGVFZGl0KGksJGV2ZW50LGVsZW1lbnQsY29sdW1uLmZpZWxkTmFtZSlcIj48L254dC1pY29uLXNlbGVjdG9yPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgbGluZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnbGluZSdcIiBjbGFzcz1cImN1c3RvbS1saW5lXCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgZGF0YSB0YWJsZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxueHQtZGF0YXRhYmxlICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICd0YWJsZSdcIiBpc0VkaXRSb3cgaXNEZWxldGVSb3cgYWN0aW9uQnV0dG9uIGlzQnV0dG9ucyBbcXVlc3Rpb25dPVwiY29sdW1uIHwgcXVlc3Rpb25CeVJvdzplbGVtZW50OmlcIiBmcm9tPVwiZm9ybUJ1aWxkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ1cGRhdGVFZGl0KGksJGV2ZW50LmRhdGEsZWxlbWVudCxjb2x1bW4uZmllbGROYW1lKVwiIFthcGlNZXRhXT1cImNvbHVtbi5xdWVzdGlvbj8uc3ViVGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJyAmJiBlbGVtZW50LmVkaXRSb3cgJiYgIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seSA/ICdlZGl0JyA6ICd2aWV3J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmxlQ29uZmlnXT1cImNvbHVtbi5xdWVzdGlvbj8udGFibGVDb25maWdcIiB0YWJsZUlkPVwiXCIgZGlyZWN0aW9uPVwibHRyXCIgdGFibGVXaWR0aD1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbnh0LWRhdGF0YWJsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjJKVUwyNSBsaXN0IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG54dC1zZWFyY2gtYm94ICAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnbGlzdCdcIiBbcXVlc3Rpb25dPVwiY29sdW1uIHwgcXVlc3Rpb25CeVJvdzplbGVtZW50OmlcIiBbcmVhZE9ubHldPVwiY29sdW1uLnF1ZXN0aW9uPy5pc1JlYWRPbmx5XCIgW2FwaU1ldGFdPVwiY29sdW1uLnF1ZXN0aW9uPy5zdWJUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY29sdW1uLnF1ZXN0aW9uPy5pZFwiIFtwbGFjZUhvbGRlclRleHRdPVwiY29sdW1uLnF1ZXN0aW9uPy5xdWVzdGlvbiB8fCAnJ1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2RlXT1cImZyb20gPT09ICdmb3JtQnVpbGRlcicgJiYgZWxlbWVudC5lZGl0Um93ICYmICFjb2x1bW4ucXVlc3Rpb24/LmlzUmVhZE9ubHkgPyAnZWRpdCcgOiAndmlldydcIiBbZnJvbV09XCInbnh0VGFibGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VhcmNoVmFsdWVDaGFuZ2UpPVwidXBkYXRlRWRpdChpLCRldmVudCxlbGVtZW50LGNvbHVtbi5maWVsZE5hbWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L254dC1zZWFyY2gtYm94PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgRHJvcGRvd24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWN1c3RvbS1kcm9wZG93biAqbmdJZj1cImNvbHVtbj8udHlwZSA9PT0gJ2Ryb3Bkb3duJyAmJiBjb2x1bW4ucXVlc3Rpb24/Lm9wdGlvbnNcIiBbb3B0aW9uc109XCJjb2x1bW4ucXVlc3Rpb24/Lm9wdGlvbnNcIiBbYXBpTWV0YV09XCJjb2x1bW4ucXVlc3Rpb24/LnN1YlRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJjb2x1bW4ucXVlc3Rpb24/LmlkXCIgW3NlbGVjdGVkVmFsdWVdPVwiY29sdW1uLmlzU2hlbmdlbCA/IGNvbHVtbi5xdWVzdGlvbj8uaW5wdXQgOiBjb2x1bW4ucXVlc3Rpb24/LnNlbGVjdGVkVmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXJyb3JNZXNzYWdlXT1cImNvbHVtbi5xdWVzdGlvbj8uZXJyb3JNZXNzYWdlXCIgW2Vycm9yXT1cImNvbHVtbi5xdWVzdGlvbj8uZXJyb3JcIiBbcmVmZXJlbmNlRmllbGRdPVwiY29sdW1uLnF1ZXN0aW9uPy5yZWZlcmVuY2VGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seVwiIFtxdWVzdGlvbl09XCJjb2x1bW4gfCBxdWVzdGlvbkJ5Um93OmVsZW1lbnQ6aVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJyAmJiBlbGVtZW50LmVkaXRSb3cgJiYgIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seSA/ICdlZGl0JyA6ICd2aWV3J1wiIFtmcm9tXT1cIidueHRUYWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ1cGRhdGVFZGl0KGksJGV2ZW50LGVsZW1lbnQsY29sdW1uLmZpZWxkTmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjJKVUwyNSBjdXN0b20tcmFkaW8gY29tcG9uZW50IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi50eXBlID09PSAncmFkaW8nICYmIGNvbHVtbi5xdWVzdGlvbj8ub3B0aW9uc1wiIGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1jdXN0b20tcmFkaW8gW29wdGlvbnNdPVwiY29sdW1uLnF1ZXN0aW9uPy5vcHRpb25zXCIgW3F1ZXN0aW9uXT1cImNvbHVtbiB8IHF1ZXN0aW9uQnlSb3c6ZWxlbWVudDppXCIgW2FwaU1ldGFdPVwiY29sdW1uLnF1ZXN0aW9uPy5zdWJUZXh0XCIgW2lkXT1cImNvbHVtbi5xdWVzdGlvbj8uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRWYWx1ZV09XCJjb2x1bW4ucXVlc3Rpb24/LnNlbGVjdGVkVmFsdWVcIiBbZXJyb3JNZXNzYWdlXT1cImNvbHVtbi5xdWVzdGlvbj8uZXJyb3JNZXNzYWdlXCIgW2Vycm9yXT1cImNvbHVtbi5xdWVzdGlvbj8uZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVmZXJlbmNlRmllbGRdPVwiY29sdW1uLnF1ZXN0aW9uPy5yZWZlcmVuY2VGaWVsZFwiIFtyZWFkT25seV09XCJjb2x1bW4ucXVlc3Rpb24/LmlzUmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZV09XCJmcm9tID09PSAnZm9ybUJ1aWxkZXInICYmIGVsZW1lbnQuZWRpdFJvdyAmJiAhY29sdW1uLnF1ZXN0aW9uPy5pc1JlYWRPbmx5ID8gJ2VkaXQnIDogJ3ZpZXcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cInVwZGF0ZUVkaXQoaSwkZXZlbnQsZWxlbWVudCxjb2x1bW4uZmllbGROYW1lKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWN1c3RvbS1yYWRpbz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgQXR0YWNobWVudCAvIEZpbGVzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1maWxlLXVwbG9hZCAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnZmlsZSdcIiBbbGltaXRGaWxlVXBsb2FkaW5nXT1cIjVcIiBbZXJyb3JdPVwiY29sdW1uLnF1ZXN0aW9uPy5lcnJvclwiIFtxdWVzdGlvbl09XCJjb2x1bW4gfCBxdWVzdGlvbkJ5Um93OmVsZW1lbnQ6aVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJyAmJiBlbGVtZW50LmVkaXRSb3cgJiYgIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seSA/ICdlZGl0JyA6ICd2aWV3J1wiIFtmcm9tXT1cIidueHRUYWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxGaWxlc109XCJjb2x1bW4ucXVlc3Rpb24/LmlucHV0XCIgKHNlbGVjdGVkRmlsZURhdGEpPVwidXBkYXRlRWRpdChpLCRldmVudC52YWx1ZSxlbGVtZW50LGNvbHVtbi5maWVsZE5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC1maWxlLXVwbG9hZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjJKVUwyNSBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnh0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdidXR0b24nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kZV09XCJmcm9tID09PSAnZm9ybUJ1aWxkZXInICYmIGVsZW1lbnQuZWRpdFJvdyAmJiAhY29sdW1uLnF1ZXN0aW9uPy5pc1JlYWRPbmx5ID8gJ2VkaXQnIDogJ3ZpZXcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYnRuSGVpZ2h0XT1cIic1MHB4J1wiIFtidG5XaWR0aF09XCInMTUwcHgnXCIgW2J1dHRvblZhbHVlXT1cImNvbHVtbi5xdWVzdGlvbj8ucXVlc3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidXR0b25DbGlja0VtaXQpPVwidXBkYXRlRWRpdChpLCRldmVudCxlbGVtZW50LGNvbHVtbi5maWVsZE5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L254dC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNLUzIySlVMMjUgYm9vayB0eXBlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bGliLXF1ZXN0aW9uYm9vayAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnYm9vaydcIiBbcWJJdGVtXT1cImNvbHVtbi5xdWVzdGlvbj8ucWJJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcXVlc3Rpb25zXT1cInJlYWRRdWVzdGlvbnMoY29sdW1uLnF1ZXN0aW9uPy5xYlJlZmVyZW5jZSwgY29sdW1uLnF1ZXN0aW9uPy5xYlJlZmVyZW5jZVF1ZXN0aW9ucylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYW5kbGVEcm9wRG93bik9XCJnZXREcm9wRG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpYi1xdWVzdGlvbmJvb2s+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyMkpVTDI1IFRleHQsIEVtYWlsLCBsYWJlbCwgbnVtYmVyLCBCb29sZWFuLCByaWNoIHRleHQgZWRpdG9yLCBEYXRlVGltZSwgRGF0ZSwgVGltZS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG54dC1pbnB1dCAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gdW5kZWZpbmVkIHx8IGNvbHVtbi50eXBlID09PSAndGV4dCcgfHwgY29sdW1uLnR5cGUgPT09ICdlbWFpbCcgfHwgY29sdW1uLnR5cGUgPT09ICdudW1iZXInIHx8IGNvbHVtbi50eXBlID09PSAnbGFiZWwnIHx8IGNvbHVtbi50eXBlID09PSAnYm9vbGVhbicgfHwgY29sdW1uLnR5cGUgPT09ICdyaWNodGV4dGFyZWEnIHx8IGNvbHVtbi50eXBlID09PSAnZGF0ZXRpbWUnIHx8IGNvbHVtbi50eXBlID09PSAnZGF0ZScgfHwgY29sdW1uLnR5cGUgPT09ICd0aW1lJyB8fCBjb2x1bW4udHlwZSA9PT0gJ3RleHRhcmVhJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiY29sdW1uLnR5cGUgPT09ICdib29sZWFuJyA/ICdjaGVja2JveCcgOiBjb2x1bW4udHlwZSA9PT0gJ3JpY2h0ZXh0YXJlYScgPyAncmljaHRleHQnIDogY29sdW1uLnR5cGUgPT09IHVuZGVmaW5lZCA/ICd0ZXh0JyA6IGNvbHVtbi50eXBlIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZGVdPVwiZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJyAmJiBlbGVtZW50LmVkaXRSb3cgJiYgIWNvbHVtbi5xdWVzdGlvbj8uaXNSZWFkT25seSA/ICdlZGl0JyA6ICd2aWV3J1wiIFtmcm9tXT1cIidueHRUYWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJlbGVtZW50IHwgZ2V0VmFsdWU6IGNvbHVtbi5maWVsZE5hbWUgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHlwZXJMaW5rXT1cImNvbHVtbi5oeXBlckxpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoeXBlcmxpbmtFbWl0KT1cIm9uQ2xpY2tIeXBlcmxpbmsoY29sdW1uLmZpZWxkTmFtZSxlbGVtZW50LCBjb2x1bW4uaHlwZXJMaW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3F1ZXN0aW9uXT1cImNvbHVtbiB8IHF1ZXN0aW9uQnlSb3c6ZWxlbWVudDppXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxGb250XT1cImNvbHVtbi5xdWVzdGlvbj8uZm9udFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5xdWVzdGlvbj8ucXVlc3Rpb25UZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxDb2xvcl09XCJjb2x1bW4ucXVlc3Rpb24/LmZvbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsU2l6ZV09XCJjb2x1bW4ucXVlc3Rpb24/LmZvbnRTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRWYWx1ZVNpemVdPVwiY29sdW1uLnF1ZXN0aW9uPy5mb250U2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsV2VpZ2h0XT1cImNvbHVtbi5xdWVzdGlvbj8uZm9udFdlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0V2VpZ2h0XT1cImNvbHVtbi5xdWVzdGlvbj8uZm9udFdlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dMYWJlbF09XCJjb2x1bW4ucXVlc3Rpb24/LnN0eWxlPy5zaG93TGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Qm9yZGVyPVwibm9uZVwiIHN2Z0hlaWdodD1cIjIwcHhcIiBzdmdXaWR0aD1cIjIwcHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb2x1bW4ucXVlc3Rpb24/LnF1ZXN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiY29sdW1uLnF1ZXN0aW9uPy5pc09wdGlvbmFsXCIgaW5wdXRCZ0NvbG9yPVwiI0ZBRkFGQVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0SWRdPVwiY29sdW1uLnF1ZXN0aW9uPy50cmFja2luZ0lkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXJyb3JNZXNzYWdlc109XCJ7IHJlcXVpcmVkOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0SWNvbkxlZnRTcmNdPVwiY29sdW1uLnF1ZXN0aW9uPy5pY29uTGVmdFNyY1wiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5EYXRlXT1cImNvbHVtbi5xdWVzdGlvbj8ubWluRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwiM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0VmFsdWUpPVwidXBkYXRlRWRpdChpLCRldmVudC52YWx1ZSxlbGVtZW50LGNvbHVtbi5maWVsZE5hbWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L254dC1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNLUzE1RkVCMjUgQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhY3Rpb25CdXR0b24gfHwgaXNEZWxldGVSb3cgfHwgaXNFZGl0Um93XCIgY2xhc3M9XCJ0YWJsZS1jb2wtY2VsbCBhY3Rpb25Db2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25CdXR0b25cIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBFZGl0IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNFZGl0Um93XCIgY2xhc3M9XCJlaWNvbi1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwie3sgJ0FQUC5FRElUX1JFQ09SRCcgfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnRWRpdCBSZWNvcmQnICB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogMnB4OyBib3JkZXI6IDFweCBzb2xpZCAjZGNkY2RjOyBib3JkZXItcmFkaXVzOiA1cHg7IG1hcmdpbi1sZWZ0OiAzcHg7IG1hcmdpbi1yaWdodDogM3B4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIGVkaXQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDJweCA0cHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKGNsaWNrKT1cIm9uRWRpdChlbGVtZW50KVwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTEuMTA2NyA2LjA3MTc0TDkuOTI4MzMgNC44OTM0TDIuMTY2NjcgMTIuNjU1MVYxMy44MzM0SDMuMzQ1TDExLjEwNjcgNi4wNzE3NFpNMTIuMjg1IDQuODkzNEwxMy40NjMzIDMuNzE1MDdMMTIuMjg1IDIuNTM2NzRMMTEuMTA2NyAzLjcxNTA3TDEyLjI4NSA0Ljg5MzRaTTQuMDM1IDE1LjUwMDFIMC41VjExLjk2NDJMMTEuNjk1OCAwLjc2ODQwM0MxMS44NTIxIDAuNjEyMTc3IDEyLjA2NCAwLjUyNDQxNCAxMi4yODUgMC41MjQ0MTRDMTIuNTA2IDAuNTI0NDE0IDEyLjcxNzkgMC42MTIxNzcgMTIuODc0MiAwLjc2ODQwM0wxNS4yMzE3IDMuMTI1OUMxNS4zODc5IDMuMjgyMTggMTUuNDc1NyAzLjQ5NDEgMTUuNDc1NyAzLjcxNTA3QzE1LjQ3NTcgMy45MzYwNCAxNS4zODc5IDQuMTQ3OTYgMTUuMjMxNyA0LjMwNDI0TDQuMDM1ODMgMTUuNTAwMUg0LjAzNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzZDNzU3RFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1TS1MxNUZFQjI1IERlbGV0ZSBCdXR0b24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzRGVsZXRlUm93XCIgY2xhc3M9XCJkaWNvbi1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInQVBQLkRFTEVURV9SRUNPUkQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0RlbGV0ZSBSZWNvcmQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiAycHg7IGJvcmRlcjogMXB4IHNvbGlkICNmZmI1YjU7IGJvcmRlci1yYWRpdXM6IDVweDsgbWFyZ2luLWxlZnQ6IDNweDsgbWFyZ2luLXJpZ2h0OiAzcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWxldGUtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDJweCA0cHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYmFja2dyb3VuZC1jb2xvcjogI2ZlZWVlZDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKGNsaWNrKT1cImRlbGV0ZVJlY29yZChlbGVtZW50LGkpXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNCAzLjk4NzI2QzExLjc4IDMuNzY3MjYgOS41NDY2NyAzLjY1MzkzIDcuMzIgMy42NTM5M0M2IDMuNjUzOTMgNC42OCAzLjcyMDYgMy4zNiAzLjg1MzkzTDIgMy45ODcyNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNGRjJDMTBcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNS42NjY1IDMuMzEzNjJMNS44MTMxNyAyLjQ0MDI4QzUuOTE5ODQgMS44MDY5NSA1Ljk5OTg0IDEuMzMzNjIgNy4xMjY1IDEuMzMzNjJIOC44NzMxN0M5Ljk5OTg0IDEuMzMzNjIgMTAuMDg2NSAxLjgzMzYyIDEwLjE4NjUgMi40NDY5NUwxMC4zMzMyIDMuMzEzNjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTEyLjU2NjcgNi4wOTM3NUwxMi4xMzM0IDEyLjgwNzFDMTIuMDYgMTMuODUzNyAxMiAxNC42NjcxIDEwLjE0IDE0LjY2NzFINS44NjAwMkM0LjAwMDAyIDE0LjY2NzEgMy45NDAwMiAxMy44NTM3IDMuODY2NjggMTIuODA3MUwzLjQzMzM1IDYuMDkzNzVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCIjRkYyQzEwXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTYuODg2NDcgMTEuMDAwNEg5LjEwNjQ3XCIgc3Ryb2tlPVwiI0ZGMkMxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjMzMzUgOC4zMzMyNUg5LjY2NjgzXCIgc3Ryb2tlPVwiI0ZGMkMxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBSZW5kZXIgaW5saW5lIGJ1dHRvbnMgdXAgdG8gU2l6ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBidXR0b24gb2YgYWN0aW9uQnV0dG9uQXJyYXk/LmJ1dHRvbkFycmF5OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpIDwgYWN0aW9uQnV0dG9uQXJyYXk/LnNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCIgbWFyZ2luLWxlZnQ6IDNweDsgbWFyZ2luLXJpZ2h0OiAzcHg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNDb25kaXRpb25NZXQoZWxlbWVudCwgYnV0dG9uLmNvbmRpdGlvbnMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJidXR0b24udG9vbHRpcFBhdGggfHwgYnV0dG9uLnRvb2x0aXAgfCBueHRDdXN0b21UcmFuc2xhdGUgOiBidXR0b24udG9vbHRpcCBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb25CdXR0b25DbGlja2VkKGJ1dHRvbixlbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiJGV2ZW50LnRhcmdldC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICcgKyBidXR0b24uaG92ZXJCb3JkZXJDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiJGV2ZW50LnRhcmdldC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICcgKyBidXR0b24uYm9yZGVyQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogMnB4OyBib3JkZXItcmFkaXVzOiB7e2J1dHRvbi5ib3JkZXJSYWRpdXN9fXB4OyAgYm9yZGVyOiAxcHggc29saWQge3tidXR0b24uYm9yZGVyQ29sb3J9fTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IChtb3VzZWVudGVyKT1cIiRldmVudC50YXJnZXQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYnV0dG9uLmhvdmVyQmFja2dyb3VuZENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiJGV2ZW50LnRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBidXR0b24uYmFja2dyb3VuZENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJwYWRkaW5nOiB7e2J1dHRvbi5wYWRkaW5nfX1weCB7e2J1dHRvbi5wYWRkaW5nICsgMn19cHg7IGJvcmRlci1yYWRpdXM6IHt7YnV0dG9uLmJvcmRlclJhZGl1c319cHg7IGJhY2tncm91bmQtY29sb3I6IHt7YnV0dG9uLmJhY2tncm91bmRDb2xvcn19O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiYnV0dG9uLmljb25TcmNcIiAjaW1nRWxlbWVudCBbc3JjXT1cImJ1dHRvbi5pY29uU3JjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImltZ0VsZW1lbnQuc3JjID0gYnV0dG9uLmhvdmVySWNvblNyYyB8fCBidXR0b24uaWNvblNyY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJpbWdFbGVtZW50LnNyYyA9IGJ1dHRvbi5pY29uU3JjXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRyb3Bkb3duQWN0aW9uQnV0dG9uICYmIGRyb3Bkb3duQWN0aW9uQnV0dG9uLmxlbmd0aCA+IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRyb3Bkb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGlja2FibGUtaW1nXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiIG1hcmdpbi1sZWZ0OiAzcHg7IG1hcmdpbi1yaWdodDogM3B4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsgcGFkZGluZzogMnB4IDRweDsgYm9yZGVyLXJhZGl1czogNXB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OyBib3JkZXItcmFkaXVzOiA1cHg7IGJvcmRlcjogMXB4IHNvbGlkICM2Yzc1N2Q7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCA0MCA0MFwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xOS45OTk5IDI1LjY2NjdDMjMuNjgxOCAyNS42NjY3IDI2LjY2NjYgMjIuNjgxOSAyNi42NjY2IDE5QzI2LjY2NjYgMTUuMzE4MSAyMy42ODE4IDEyLjMzMzQgMTkuOTk5OSAxMi4zMzM0QzE2LjMxOCAxMi4zMzM0IDEzLjMzMzMgMTUuMzE4MSAxMy4zMzMzIDE5QzEzLjMzMzMgMjIuNjgxOSAxNi4zMTggMjUuNjY2NyAxOS45OTk5IDI1LjY2NjdaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjMjkyRDMyXCIgc3Ryb2tlPVwiIzI5MkQzMlwiIHN0cm9rZS13aWR0aD1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbWl0ZXJsaW1pdD1cIjEwXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuNjQ2NyAxOC4xNkwyMC4wMDAxIDIwLjUwNjdMMjIuMzUzNCAxOC4xNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJ3aGl0ZVwiIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yaWdodF09XCIoKGFjdGlvbkJ1dHRvbkFycmF5Py5zaXplID8/IDApIC0gKGFjdGlvbkJ1dHRvbkFycmF5Py5idXR0b25BcnJheT8uc2l6ZSA/PyAwKSArIChpc0VkaXRSb3cgPyAxIDogMCkgKyAoaXNEZWxldGVSb3cgPyAxIDogMCkgKyAoZHJvcGRvd25BY3Rpb25CdXR0b24/Lmxlbmd0aCA+IDAgPyAxIDogMCkpICogMTAwICsgJyUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudE9wZW5JbmRleCA9PT0gaVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYnRuIG9mIGRyb3Bkb3duQWN0aW9uQnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzQ29uZGl0aW9uTWV0KGVsZW1lbnQsIGJ0bi5jb25kaXRpb25zKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtaWRdPVwiZWxlbWVudC5pZFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDtcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWljb24ge3tidG4uYnV0dG9uVHlwZX19IHRvb2x0aXAtY29udGFpbmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiYnRuLnRvb2x0aXBQYXRoIHx8IGJ0bi50b29sdGlwIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogYnRuLnRvb2x0aXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnRuLmJ1dHRvbkRpc2FibGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQnV0dG9uQ2xpY2tlZChidG4sZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImJ0bi5pY29uU3JjXCIgW3NyY109XCJidG4uaWNvblNyY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmMtYnRuLXRleHRcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMTBweDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YnRuLm5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMjBNQVIyNSBTdW1tYXJ5IFJvd3MgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzdW1tYXJ5Um93cyAmJiBzdW1tYXJ5Um93cy5sZW5ndGggPiAwICYmIGRhdGFTb3VyY2UuZGF0YSAmJiBkYXRhU291cmNlPy5kYXRhPy5sZW5ndGggPiAwICYmICFpc0xvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRnVsbFRhYmxlU3VtbWFyeVJvdyAmJiBpc1N1bW1hcnlDb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIHN1bW1hcnlSb3dzXCIgY2xhc3M9XCJ0YWJsZS1yb3cgc3VtbWFyeS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGFiZWwgaW4gdGhlIGZpcnN0IGNvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ3aXRoQ2hlY2tCb3hcIiBjbGFzcz1cIm5vbi1zdW1tYXJ5LXRhYmxlLWNlbGxcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW1wdHkgY2VsbHMgdG8gYWxpZ24gd2l0aCBkYXRhIGNvbHVtbnMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2wgb2YgaXNTdW1tYXJ5U3RhcnRDb2x1bW47IGxldCBsYXN0ID0gbGFzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJub24tc3VtbWFyeS10YWJsZS1jZWxsXCIgW2NsYXNzLmxhc3QtY2VsbF09XCJsYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gPCEtLSBWYWx1ZSBvciBpbnB1dCBpbiB0aGUgbGFzdCBjb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS10YWJsZS1jZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWQtY2VsbF09XCJtb2RlID09PSAnZWRpdCcgJiYgaXNFZGl0YWJsZSAmJiBzZWxlY3RlZENvbHVtbiA9PT0gcm93LnVuaXF1ZUlkZW50aWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IG9uQ29sdW1uQ2xpY2socm93LnVuaXF1ZUlkZW50aWZpZXIpXCI+e3sgcm93LmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXRhYmxlLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZC1jZWxsXT1cIm1vZGUgPT09ICdlZGl0JyAmJiBpc0VkaXRhYmxlICYmIHNlbGVjdGVkQ29sdW1uID09PSByb3cudW5pcXVlSWRlbnRpZmllclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cudHlwZSA9PT0gJ2NhbGN1bGF0aW9uJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEFkZCBjbG9zZSBidXR0b24gZm9yIHNlbGVjdGVkIGNvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm1vZGUgPT09ICdlZGl0JyAmJiBpc0VkaXRhYmxlICYmIHNlbGVjdGVkQ29sdW1uID09PSByb3cudW5pcXVlSWRlbnRpZmllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsb3NlLWNvbHVtbi1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgcmVtb3ZlQ29sKHJvdy51bmlxdWVJZGVudGlmaWVyKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pyVXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzdW1tYXJ5VmFsdWVzW3Jvdy5maWVsZE5hbWVdIHwgbnVtYmVyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdy50eXBlID09PSAnaW5wdXQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgWyhuZ01vZGVsKV09XCJzdW1tYXJ5VmFsdWVzW3Jvdy5maWVsZE5hbWVdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3VtbWFyeUlucHV0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJueHQtbG9wLWlucHV0IHRhYmxlLXdpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZm9udC1zaXplOiB7eyByb3dUZXh0U2l6ZSA/IHJvd1RleHRTaXplIDogJzEzcHgnIH19OyBjb2xvcjoge3tyb3dUZXh0Q29sb3IgPyByb3dUZXh0Q29sb3IgOiAnIzJjMzEzNyd9fTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTS1MyME1BUjI1IEVtcHR5IGNlbGxzIHRvIGFsaWduIHdpdGggZGF0YSBjb2x1bW5zIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sIG9mIGlzU3VtbWFyeUVuZENvbHVtbjsgbGV0IGxhc3QgPSBsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5vbi1zdW1tYXJ5LXRhYmxlLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGlvbkJ1dHRvbiB8fCBpc0RlbGV0ZVJvdyB8fCBpc0VkaXRSb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibm9uLXN1bW1hcnktdGFibGUtY2VsbCBhY3Rpb25Db2wgc3RpY2t5LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMTNKVU4yNSBmdWxsIHRhYmxlIHN1bW1hcnkgcm93IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Z1bGxUYWJsZVN1bW1hcnlSb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIHN1bW1hcnlSb3dzXCIgY2xhc3M9XCJ0YWJsZS1yb3cgc3VtbWFyeS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMTNKVU4yNSBDaGVja2JveCBjb2x1bW4gKGlmIGVuYWJsZWQpIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIndpdGhDaGVja0JveFwiIGNsYXNzPVwiaG9yaXpvbnRhbC1zdW1tYXJ5LXRhYmxlLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3cubGFiZWxQYXRoIHx8IHJvdy5sYWJlbCB8IG54dEN1c3RvbVRyYW5zbGF0ZSA6IHJvdy5sYWJlbCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU0tTMTNKVU4yNSBzdW1tYXJ5IGNlbGwgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2wgb2YgY3VycmVudENvbHVtbnM7IGxldCBsYXN0ID0gbGFzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJob3Jpem9udGFsLXN1bW1hcnktdGFibGUtY2VsbFwiIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdz8uY29sdW1ucz8uaW5jbHVkZXMoY29sLmZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBzdW1tYXJ5VmFsdWVzW2NvbC5maWVsZE5hbWVdIHwgbnVtYmVyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aW9uQnV0dG9uIHx8IGlzRGVsZXRlUm93IHx8IGlzRWRpdFJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJob3Jpem9udGFsLXN1bW1hcnktdGFibGUtY2VsbCBhY3Rpb25Db2wgc3RpY2t5LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMjhNQVIyNSBJbiB0aGUgTG9hZGluZyBzZWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWJvZHlcIiAqbmdJZj1cImlzTG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVwZWF0IGZvciA1IHNrZWxldG9uIHJvd3MgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgXyBvZiBbMSwyLDMsNCw1XVwiIGNsYXNzPVwidGFibGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ2hlY2tib3ggQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwid2l0aENoZWNrQm94XCIgY2xhc3M9XCJza2VsZXRvbi1jZWxsIHN0aWNreS1jb2x1bW5cIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERhdGEgQ29sdW1ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sIG9mIGN1cnJlbnRDb2x1bW5zXCIgY2xhc3M9XCJza2VsZXRvbi1jZWxsIFwiPjwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQWN0aW9uIENvbHVtbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGlvbkJ1dHRvbiB8fCBpc0RlbGV0ZVJvdyB8fCBpc0VkaXRSb3dcIiBjbGFzcz1cInNrZWxldG9uLWNlbGwgYWN0aW9uQ29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJkYXRhU291cmNlLmRhdGEgJiYgZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoID09PSAwICYmICFpc0xvYWRpbmcgJiYgZnJvbSA9PT0gJ2Zvcm1CdWlsZGVyJ1wiIGNsYXNzPVwiZm9ybS1idWlsZGVyLXRhYmxlLWJveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCAgLyBkcmFncyBmaWVsZHMgZnJvbSBlbGVtZW50cyBzZWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLVNLUzE1RkVCMjUgTm8gRGF0YSBSb3cgLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YVNvdXJjZS5kYXRhICYmIGRhdGFTb3VyY2U/LmRhdGE/Lmxlbmd0aCA9PT0gMCAmJiAhaXNMb2FkaW5nICYmIGZyb20gIT09ICdmb3JtQnVpbGRlcidcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibm8tZGF0YVwiPlxuICAgICAgICAgICAgICAgIHt7J0FQUC5OT19SRUNPUkRTX09SX0RBVEFfRk9VTkQnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ05vIHJlY29yZHMvZGF0YSBmb3VuZC4nfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLVNLUzE1RkVCMjUgUGFnaW5hdGlvbiAtLT5cbiAgICAgICAgICAgIDxkaXYgW2NsYXNzLnNoYWRvdy1oaWRkZW5dPVwiaXNTaGFkb3dIaWRkZW5cIj5cbiAgICAgICAgICAgICAgICA8IS0tIHRhYmxlIGlucHV0IHNhdmUgYnV0dG9uIGNoYW5nZXMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBpbmxpbmVBZGQganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhZGRJY29uQm9yIGN1cnNvci1wb2ludGVyXCIgKm5nSWY9XCJhZGRJbmxpbmVSZWNvcmQgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRUYWJsZVJlY29yZChpbmxpbmVFbGVtZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwie3sgJ0FQUC5BRERfUkVDT1JEJ3wgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0FkZCBSZWNvcmQnfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGRJY29uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cIm5hdi1pY29uXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00NDAtMjgwaDgwdi0xNjBoMTYwdi04MEg1MjB2LTE2MGgtODB2MTYwSDI4MHY4MGgxNjB2MTYwWm00MCAyMDBxLTgzIDAtMTU2LTMxLjVUMTk3LTE5N3EtNTQtNTQtODUuNS0xMjdUODAtNDgwcTAtODMgMzEuNS0xNTZUMTk3LTc2M3E1NC01NCAxMjctODUuNVQ0ODAtODgwcTgzIDAgMTU2IDMxLjVUNzYzLTc2M3E1NCA1NCA4NS41IDEyN1Q4ODAtNDgwcTAgODMtMzEuNSAxNTZUNzYzLTE5N3EtNTQgNTQtMTI3IDg1LjVUNDgwLTgwWm0wLTgwcTEzNCAwIDIyNy05M3Q5My0yMjdxMC0xMzQtOTMtMjI3dC0yMjctOTNxLTEzNCAwLTIyNyA5M3QtOTMgMjI3cTAgMTM0IDkzIDIyN3QyMjcgOTNabTAtMzIwWlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwhLS1TS1MxNUZFQjI1IHJlbW92ZWQgYnV0dG9uIGRpc2FibGUgbG9naWMsIGFkZGVkIGFub3RoZXIgY29uZGl0aW9uIGZvciBidXR0b24gc2hvd2luZy0tPlxuICAgICAgICAgICAgICAgICAgICA8IS0tU0tTMTVGRUIyNSBTUjA2SkFOMjAyNSBidXR0b24gZGlzYWJsZSBsb2dpYyBmb3Igbm90IHNlbGVjdCBhbnkgZW1wbG95ZWUtLT5cbiAgICAgICAgICAgICAgICAgICAgPG54dC1idXR0b24gKm5nSWY9XCJ0YWJsZVNhdmVCdXR0b24gJiYgZnJvbSAhPSAnZm9ybUJ1aWxkZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblR5cGU9XCJidG4gYnRuLXByaW1hcnlcIiBbYnV0dG9uRGlzYWJsZV09XCJzZWxlY3Rpb24/LnNlbGVjdGVkPy5sZW5ndGggPT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbkNsaWNrRW1pdCk9XCJzYXZlQnV0dG9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uVmFsdWU9XCJ7eyAnQVBQLlNBVkUnIHwgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ1NhdmUnICB9fVwiPjwvbnh0LWJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bnh0LXBhZ2luYXRpb24gKm5nSWY9XCJpc1BhZ2luYXRpb25cIiBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb2xsZWN0aW9uU2l6ZV09XCJjb25maWdQYWdpbmF0aW9uID8gdG90YWxSZWNvcmRzIHx8IHRvdGFsQ291bnQgOiBmaWx0ZXJUYWJsZU5vc1wiXG4gICAgICAgICAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiIFtjdXJyZW50UGFnZV09XCJwYWdlSW5kZXhcIiBbZmlyc3RMYXN0QnV0dG9uc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgKGV2ZW50KT1cInBhZ2VQYXJhbXMoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvbnh0LXBhZ2luYXRpb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLVNLUzE1RkVCMjUgYWxlcnQgb24gZGVsZXRpbmcgcmVjb3JkIC0tPlxuPGRpdiAqbmdJZj1cImRlbGV0ZU1vZGFsXCIgY2xhc3M9XCJtb2RhbCBtb2RhbC1iYWNrZHJvcCBzaG93ICBkLWJsb2NrXCIgaWQ9XCJkZWxldGVSZWNvcmRcIiB0YWJpbmRleD1cIi0xXCJcbiAgICBhcmlhLWxhYmVsbGVkYnk9XCJkZWxldGVSZWNvcmRMYWJlbFwiIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFkZWxldGVNb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8YiBjbGFzcz1cIm1vZGFsLXRpdGxlIGZzLTVcIiBpZD1cImRlbGV0ZVJlY29yZExhYmVsXCI+e3sgJ0FQUC5ERUxFVEVfUkVDT1JEJ3wgbnh0Q3VzdG9tVHJhbnNsYXRlIDogJ0RlbGV0ZSBSZWNvcmQnfX08L2I+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVNb2RhbCA9IGZhbHNlXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAge3sgJ0FQUC5BUkVfWU9VX1NVUkVfWU9VX1dBTlRfVE9fREVMRVRFX1RIRV9SRUMnfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgcmVjb3JkJ319ID9cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJkZWxldGVNb2RhbCA9IGZhbHNlXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ0FQUC5OTyd8IG54dEN1c3RvbVRyYW5zbGF0ZSA6ICdObyd9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUmVjb3JkRGF0YSgpXCI+e3sgJ0FQUC5ZRVMnfCBueHRDdXN0b21UcmFuc2xhdGUgOiAnWWVzJ319PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=