ng-firebase-table-kxp 1.0.14 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { Component, Input, ViewChild } from '@angular/core';
1
+ import { Component, Input, ViewChild, } from '@angular/core';
2
2
  import { MatPaginator } from '@angular/material/paginator';
3
3
  import { MatSort } from '@angular/material/sort';
4
4
  import { MatTableDataSource } from '@angular/material/table';
@@ -20,13 +20,13 @@ import * as i12 from "@angular/material/core";
20
20
  import * as i13 from "@angular/material/tooltip";
21
21
  import * as i14 from "@angular/material/progress-spinner";
22
22
  import * as i15 from "@angular/material/icon";
23
- import * as i16 from "ngx-mask";
24
23
  export class TableComponent {
25
24
  // CONSTRUCTOR
26
- constructor(router, tableService, firestore) {
25
+ constructor(router, tableService, firestore, el) {
27
26
  this.router = router;
28
27
  this.tableService = tableService;
29
28
  this.firestore = firestore;
29
+ this.el = el;
30
30
  this.arrange = null;
31
31
  this.currentPageNumber = 1;
32
32
  this.currentClientPageIndex = 0;
@@ -58,24 +58,23 @@ export class TableComponent {
58
58
  this.showTooltip = false;
59
59
  this.tooltipContent = '';
60
60
  this.tooltipPosition = { x: 0, y: 0 };
61
- // Validador de data armazenado como propriedade para compatibilidade com ngx-mask
62
- this.dateValidator = this.tableService.dateFormatValidator();
63
61
  this.filtersForm = new FormArray([this.createFilterGroup()]);
64
62
  }
65
63
  createFilterGroup() {
64
+ // Criar validador diretamente aqui para evitar problemas de contexto de injeção
65
+ const dateValidator = this.tableService.dateFormatValidator();
66
66
  return new FormGroup({
67
67
  selectFilter: new FormControl(''),
68
68
  typeFilter: new FormControl(''),
69
69
  selectItem: new FormControl(''),
70
- initialDate: new FormControl('', [this.dateValidator]),
71
- finalDate: new FormControl('', [this.dateValidator]),
70
+ initialDate: new FormControl('', [dateValidator]),
71
+ finalDate: new FormControl('', [dateValidator]),
72
72
  });
73
73
  }
74
74
  addFilter(filterData) {
75
75
  if (this.data.pagination === true &&
76
76
  this.hasActiveDateFilter() &&
77
77
  filterData?.selectFilter?.arrange === 'filterByDate') {
78
- // Não permitir adicionar novo filtro de data quando já existe um ativo
79
78
  return;
80
79
  }
81
80
  const newFilterGroup = this.createFilterGroup();
@@ -135,9 +134,44 @@ export class TableComponent {
135
134
  this.resetFilter();
136
135
  }
137
136
  // METHODS
137
+ ngOnChanges(changes) {
138
+ if (changes['data']) {
139
+ // Aplicar cores quando o data for definido ou mudar
140
+ // Usar setTimeout para garantir que a view esteja pronta
141
+ setTimeout(() => this.applyCustomColors(), 0);
142
+ }
143
+ }
144
+ ngAfterViewInit() {
145
+ // Garantir que as cores sejam aplicadas após a view estar pronta
146
+ this.applyCustomColors();
147
+ }
148
+ applyCustomColors() {
149
+ const hostElement = this.el?.nativeElement;
150
+ if (!hostElement || !this.data)
151
+ return;
152
+ if (this.data.color?.bg) {
153
+ hostElement.style.setProperty('--table-color', this.data.color.bg);
154
+ hostElement.style.setProperty('--table-header-bg', this.data.color.bg);
155
+ }
156
+ if (this.data.color?.text) {
157
+ hostElement.style.setProperty('--table-text-color', this.data.color.text);
158
+ hostElement.style.setProperty('--table-header-text', this.data.color.text);
159
+ }
160
+ setTimeout(() => {
161
+ const headerCells = hostElement.querySelectorAll('.mat-header-cell, .mat-mdc-header-cell, th.mat-header-cell, th.mat-mdc-header-cell');
162
+ headerCells.forEach((cell) => {
163
+ if (this.data.color?.bg) {
164
+ cell.style.backgroundColor = this.data.color.bg;
165
+ }
166
+ if (this.data.color?.text) {
167
+ cell.style.color = this.data.color.text;
168
+ }
169
+ });
170
+ }, 100);
171
+ }
138
172
  async ngOnInit() {
139
173
  if (!this.data.color)
140
- this.data.color = { bg: 'bg-primary', text: 'text-black' };
174
+ this.data.color = { bg: '#1976d2', text: '#ffffff' };
141
175
  this.columnProperties = this.data.displayedColumns.map((column) => {
142
176
  return column.property;
143
177
  });
@@ -455,6 +489,29 @@ export class TableComponent {
455
489
  this.applyFiltersToDataSource();
456
490
  }
457
491
  }
492
+ // Aplicar máscara de data (DD/MM/AAAA) manualmente
493
+ onDateInput(event, controlName, filterIndex) {
494
+ const input = event.target;
495
+ let value = input.value.replace(/\D/g, ''); // Remove tudo que não é dígito
496
+ // Limitar a 8 dígitos (DDMMAAAA)
497
+ if (value.length > 8) {
498
+ value = value.slice(0, 8);
499
+ }
500
+ // Formatar: DD/MM/AAAA
501
+ if (value.length <= 2) {
502
+ value = value;
503
+ }
504
+ else if (value.length <= 4) {
505
+ value = value.slice(0, 2) + '/' + value.slice(2);
506
+ }
507
+ else {
508
+ value =
509
+ value.slice(0, 2) + '/' + value.slice(2, 4) + '/' + value.slice(4, 8);
510
+ }
511
+ // Atualizar o FormControl
512
+ const filterGroup = this.filtersForm.at(filterIndex);
513
+ filterGroup.get(controlName)?.setValue(value, { emitEvent: false });
514
+ }
458
515
  // Aplicar filtros ao dataSource quando não há paginação
459
516
  applyFiltersToDataSource() {
460
517
  if (!this.dataSource)
@@ -720,9 +777,9 @@ export class TableComponent {
720
777
  .flatMap((col) => this.items.map(async (item) => {
721
778
  if (col.relation) {
722
779
  item[col.property] = await this.getRelation({
723
- id: item[col.relation.property],
724
- collection: col.relation.collection,
725
- newProperty: col.relation.newProperty,
780
+ id: item[col.relation.sourceProperty],
781
+ collection: col.relation.targetedCollection,
782
+ newProperty: col.relation.targetedProperty || col.property,
726
783
  });
727
784
  }
728
785
  }));
@@ -1073,12 +1130,12 @@ export class TableComponent {
1073
1130
  }
1074
1131
  }
1075
1132
  }
1076
- TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, deps: [{ token: i1.Router }, { token: i2.TableService }, { token: i3.AngularFirestore }], target: i0.ɵɵFactoryTarget.Component });
1077
- TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableComponent, selector: "lib-table", inputs: { data: "data", downloadTable: "downloadTable" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0, template: "<div *ngIf=\"data\" class=\"card-body\">\n <div class=\"flex flex-col justify-between gap-6\">\n <!-- UNIFIED CONTROL PANEL: FILTERS, SORT & ACTIONS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === true &&\n (dropdownItems.length > 0 ||\n sortableDropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title, Custom Action, and Global Actions -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n\n <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3\"\n *ngIf=\"\n this.hasFilterableColumn === true || this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"\n $any(arrange) && downloadTable !== undefined\n ? downloadTable($any(arrange), data.conditions || [])\n : null\n \"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n\n <!-- FILTERS CONTENT (WITH REFINEMENTS) -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n formControlName=\"initialDate\"\n [dropSpecialCharacters]=\"false\"\n mask=\"d0/M0/0000\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n matInput\n formControlName=\"finalDate\"\n [dropSpecialCharacters]=\"false\"\n mask=\"d0/M0/0000\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Sort -->\n <div\n class=\"-mb-2 flex flex-col items-center justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Sort Dropdown -->\n <div\n class=\"w-full sm:w-auto sm:min-w-[250px]\"\n *ngIf=\"sortableDropdownItems.length > 0\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Ordenar por</mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- SIMPLE SEARCH (for non-paginated tables) -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"data.pagination === false && hasFilterableColumn === true\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-blue-500\"></i>\n Buscar\n </mat-label>\n <input\n matInput\n (keyup.enter)=\"search($event)\"\n (keyup)=\"applyFilter(filterInput.value)\"\n placeholder=\"Digite para filtrar...\"\n #filterInput\n />\n <mat-icon matSuffix class=\"text-gray-500\">search</mat-icon>\n </mat-form-field>\n <button\n *ngIf=\"data.actionButton\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' float-right flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i *ngIf=\"data.actionButton.icon\" [class]=\"data.actionButton.icon\"></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n\n <!-- FILTERS PANEL (for non-paginated tables) -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"data.pagination === false && dropdownItems.length > 0\"\n >\n <!-- FILTERS CONTENT -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (blur)=\"onDateFilterChange()\"\n formControlName=\"initialDate\"\n [dropSpecialCharacters]=\"false\"\n mask=\"d0/M0/0000\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (blur)=\"onDateFilterChange()\"\n matInput\n formControlName=\"finalDate\"\n [dropSpecialCharacters]=\"false\"\n mask=\"d0/M0/0000\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Actions -->\n <div\n class=\"-mb-2 flex flex-col items-center justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-wrap gap-3\">\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Aplicar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"handleDownload()\"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col\">\n <div\n class=\"mx-auto flex flex-col\"\n *ngIf=\"data.tabs && data.tabs.tabsData && data.tabs.tabsData.length > 0\"\n >\n <!-- Calcular quantos grupos de 6 tabs existem -->\n <ng-container\n *ngFor=\"\n let groupIndex of getTabGroups(data.tabs.tabsData);\n let i = index\n \"\n >\n <div class=\"mx-auto flex flex-row\">\n <ng-container\n *ngFor=\"\n let tab of getTabGroup(data.tabs.tabsData, groupIndex);\n let j = index\n \"\n >\n <button\n class=\"border-2 border-gray-300 bg-gray-200 px-4 py-2 font-medium transition hover:brightness-95\"\n [ngClass]=\"\n isTabSelected(getRealTabIndex(i, j))\n ? 'border-b-0 brightness-110'\n : ''\n \"\n (click)=\"onTableSelected(i, j)\"\n >\n {{ tab.label }}\n <span\n *ngIf=\"tab.counter !== undefined\"\n class=\"ml-2 text-xs font-bold\"\n [ngClass]=\"tab.counterClass\"\n >\n {{ tab.counter }}\n </span>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </div>\n <div class=\"mat-elevation-z8 w-full overflow-x-auto rounded-xl\">\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n #sort=\"matSort\"\n matSortActive=\"createdAt\"\n matSortDirection=\"desc\"\n >\n <ng-container\n *ngFor=\"let col of data.displayedColumns\"\n matColumnDef=\"{{ col.property }}\"\n >\n <ng-container *matHeaderCellDef>\n <!-- IF THE COLUMN IS NOT SORTABLE, THEN DON'T SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"!col.isSortable || data.pagination === true\"\n mat-header-cell\n [ngClass]=\"\n (data.color?.bg ? ' ' + $any(data.color).bg : '') +\n (data.color?.text ? ' ' + $any(data.color).text : '')\n \"\n >\n {{ col.title }}\n </th>\n <!-- IF THE COLUMN IS SORTABLE, THEN SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"col.isSortable && data.pagination === false\"\n mat-header-cell\n mat-sort-header\n [ngClass]=\"\n (data.color?.bg ? ' ' + $any(data.color).bg : '') +\n (data.color?.text ? ' ' + $any(data.color).text : '')\n \"\n >\n {{ col.title }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n (click)=\"col.method ? col.method(row) : null\"\n (mouseenter)=\"onCellMouseEnter($event, row, col)\"\n (mouseleave)=\"onCellMouseLeave()\"\n (mousemove)=\"onCellMouseMove($event)\"\n >\n <!-- CHECK IF THE COLUMN MUST BE DISPLAYED -->\n <span *ngIf=\"!col.image && !col.iconClass && !col.method\">\n <ng-container>\n <span\n *ngIf=\"\n col.charLimit &&\n row[col.property] &&\n row[col.property].length > col.charLimit;\n else withinLimit\n \"\n >\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row) }}\n </span>\n </span>\n </ng-container>\n <ng-template #withinLimit>\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row, true) }}\n </span>\n </ng-template>\n </span>\n <!------------------- IMAGE ------------------>\n <img\n *ngIf=\"\n col.image && col.image.path && !col.iconClass && !col.method\n \"\n [src]=\"col.image.path + '/' + row[col.property]\"\n [ngClass]=\"col.image.class\"\n alt=\"Imagem\"\n />\n <img\n *ngIf=\"\n col.image && col.image.url && !col.iconClass && !col.method\n \"\n [src]=\"row[col.property]\"\n [ngClass]=\"col.image.class\"\n alt=\"Imagem\"\n />\n <ng-container *ngIf=\"col.iconClass\">\n <button\n *ngFor=\"let iconClass of col.iconClass\"\n (click)=\"\n iconClass.buttonMethod\n ? iconClass.buttonMethod(row, $event)\n : $event.stopPropagation()\n \"\n >\n <span\n [ngClass]=\"iconClass.class\"\n *ngIf=\"\n iconClass.condition === undefined ||\n (iconClass.condition !== undefined &&\n $any(iconClass.condition)(row))\n \"\n >{{ iconClass.text }}</span\n >\n </button>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnProperties\"></tr>\n <tr\n [ngClass]=\"{\n 'example-element-row': data.isNotClickable === true,\n 'example-element-row cursor-pointer': !data.isNotClickable\n }\"\n mat-row\n *matRowDef=\"let row; columns: columnProperties\"\n (click)=\"goToDetails(row)\"\n ></tr>\n\n <!-- ROW SHOWN WHEN THERE IS NO MATCHING DATA. -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td *ngIf=\"!isLoading\" class=\"mat-cell p-4\" colspan=\"4\">\n Nenhum resultado encontrado para a busca\n </td>\n </tr>\n </table>\n\n <div class=\"flex justify-center\" *ngIf=\"isLoading\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div class=\"paginator-container\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[25, 50, 100]\"\n [pageSize]=\"pageSize\"\n [length]=\"totalItems\"\n showFirstLastButtons\n aria-label=\"Select page of periodic elements\"\n (page)=\"onPageChange($event)\"\n [ngClass]=\"{\n 'hide-length':\n ['filter', 'filterByDate', 'equals'].includes(\n this.currentArrange\n ) || this.data.filterFn,\n 'hide-next-button': !hasNextPage && data.pagination === true,\n 'hide-last-button':\n (!hasNextPage && data.pagination === true) || this.data.filterFn\n }\"\n >\n </mat-paginator>\n <div\n *ngIf=\"\n !isLoading &&\n dataSource?.data &&\n dataSource.data.length > 0 &&\n data?.filterFn\n \"\n class=\"page-number-display\"\n >\n {{ currentPageNumber }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOOLTIP PERSONALIZADO -->\n <div\n *ngIf=\"showTooltip\"\n class=\"fixed z-50 max-w-md break-words rounded-lg bg-gray-800 px-3 py-2 text-sm text-white shadow-lg\"\n [style.left.px]=\"tooltipPosition.x\"\n [style.top.px]=\"tooltipPosition.y\"\n [style.pointer-events]=\"'none'\"\n >\n {{ tooltipContent }}\n </div>\n</div>\n", styles: ["::ng-deep .hide-length .mat-mdc-paginator-range-label{display:none}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-next.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base{visibility:hidden}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-last.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base.ng-star-inserted{visibility:hidden}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field.ng-tns-c162-1.mdc-text-field--filled{width:25dvw}::ng-deep .custom-filter .mat-mdc-text-field-wrapper{width:20dvw;max-width:300px}\n"], dependencies: [{ 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: 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i6.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i16.NgxMaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers", "leadZeroDateTime", "leadZero", "triggerOnMaskChange", "apm", "inputTransformFn", "outputTransformFn", "keepCharacterPositions"], outputs: ["maskFilled"], exportAs: ["mask", "ngxMask"] }] });
1133
+ TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, deps: [{ token: i1.Router }, { token: i2.TableService }, { token: i3.AngularFirestore }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1134
+ TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableComponent, selector: "lib-table", inputs: { data: "data", downloadTable: "downloadTable" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"data\" class=\"card-body\">\n <div class=\"flex flex-col justify-between gap-6\">\n <!-- UNIFIED CONTROL PANEL: FILTERS, SORT & ACTIONS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === true &&\n (dropdownItems.length > 0 ||\n sortableDropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title, Custom Action, and Global Actions -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n\n <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3\"\n *ngIf=\"\n this.hasFilterableColumn === true || this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"\n $any(arrange) && downloadTable !== undefined\n ? downloadTable($any(arrange), data.conditions || [])\n : null\n \"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n\n <!-- FILTERS CONTENT (WITH REFINEMENTS) -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Sort -->\n <div\n class=\"-mb-2 flex flex-col items-center justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Sort Dropdown -->\n <div\n class=\"w-full sm:w-auto sm:min-w-[250px]\"\n *ngIf=\"sortableDropdownItems.length > 0\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Ordenar por</mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- SIMPLE SEARCH (for non-paginated tables) -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"data.pagination === false && hasFilterableColumn === true\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-blue-500\"></i>\n Buscar\n </mat-label>\n <input\n matInput\n (keyup.enter)=\"search($event)\"\n (keyup)=\"applyFilter(filterInput.value)\"\n placeholder=\"Digite para filtrar...\"\n #filterInput\n />\n <mat-icon matSuffix class=\"text-gray-500\">search</mat-icon>\n </mat-form-field>\n <button\n *ngIf=\"data.actionButton\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' float-right flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i *ngIf=\"data.actionButton.icon\" [class]=\"data.actionButton.icon\"></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n\n <!-- FILTERS PANEL (for non-paginated tables) -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"data.pagination === false && dropdownItems.length > 0\"\n >\n <!-- FILTERS CONTENT -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n (blur)=\"onDateFilterChange()\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n (blur)=\"onDateFilterChange()\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Actions -->\n <div\n class=\"-mb-2 flex flex-col items-center justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-wrap gap-3\">\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Aplicar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"handleDownload()\"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col\">\n <div\n class=\"mx-auto flex flex-col\"\n *ngIf=\"data.tabs && data.tabs.tabsData && data.tabs.tabsData.length > 0\"\n >\n <!-- Calcular quantos grupos de 6 tabs existem -->\n <ng-container\n *ngFor=\"\n let groupIndex of getTabGroups(data.tabs.tabsData);\n let i = index\n \"\n >\n <div class=\"mx-auto flex flex-row\">\n <ng-container\n *ngFor=\"\n let tab of getTabGroup(data.tabs.tabsData, groupIndex);\n let j = index\n \"\n >\n <button\n class=\"border-2 border-gray-300 bg-gray-200 px-4 py-2 font-medium transition hover:brightness-95\"\n [ngClass]=\"\n isTabSelected(getRealTabIndex(i, j))\n ? 'border-b-0 brightness-110'\n : ''\n \"\n (click)=\"onTableSelected(i, j)\"\n >\n {{ tab.label }}\n <span\n *ngIf=\"tab.counter !== undefined\"\n class=\"ml-2 text-xs font-bold\"\n [ngClass]=\"tab.counterClass\"\n >\n {{ tab.counter }}\n </span>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"mat-elevation-z8 w-full overflow-x-auto rounded-xl table-container\"\n >\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n #sort=\"matSort\"\n matSortActive=\"createdAt\"\n matSortDirection=\"desc\"\n >\n <ng-container\n *ngFor=\"let col of data.displayedColumns\"\n matColumnDef=\"{{ col.property }}\"\n >\n <ng-container *matHeaderCellDef>\n <!-- IF THE COLUMN IS NOT SORTABLE, THEN DON'T SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"!col.isSortable || data.pagination === true\"\n mat-header-cell\n >\n {{ col.title }}\n </th>\n <!-- IF THE COLUMN IS SORTABLE, THEN SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"col.isSortable && data.pagination === false\"\n mat-header-cell\n mat-sort-header\n >\n {{ col.title }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n (click)=\"col.method ? col.method(row) : null\"\n (mouseenter)=\"onCellMouseEnter($event, row, col)\"\n (mouseleave)=\"onCellMouseLeave()\"\n (mousemove)=\"onCellMouseMove($event)\"\n >\n <!-- CHECK IF THE COLUMN MUST BE DISPLAYED -->\n <span *ngIf=\"!col.image && !col.iconClass && !col.method\">\n <ng-container>\n <span\n *ngIf=\"\n col.charLimit &&\n row[col.property] &&\n row[col.property].length > col.charLimit;\n else withinLimit\n \"\n >\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row) }}\n </span>\n </span>\n </ng-container>\n <ng-template #withinLimit>\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row, true) }}\n </span>\n </ng-template>\n </span>\n <!------------------- IMAGE ------------------>\n <img\n *ngIf=\"\n col.image && col.image.path && !col.iconClass && !col.method\n \"\n [src]=\"col.image.path + '/' + row[col.property]\"\n [ngClass]=\"col.image.class\"\n alt=\"Imagem\"\n />\n <img\n *ngIf=\"\n col.image && col.image.url && !col.iconClass && !col.method\n \"\n [src]=\"row[col.property]\"\n [ngClass]=\"col.image.class\"\n alt=\"Imagem\"\n />\n <ng-container *ngIf=\"col.iconClass\">\n <button\n *ngFor=\"let iconClass of col.iconClass\"\n (click)=\"\n iconClass.buttonMethod\n ? iconClass.buttonMethod(row, $event)\n : $event.stopPropagation()\n \"\n >\n <span\n [ngClass]=\"iconClass.class\"\n *ngIf=\"\n iconClass.condition === undefined ||\n (iconClass.condition !== undefined &&\n $any(iconClass.condition)(row))\n \"\n >{{ iconClass.text }}</span\n >\n </button>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnProperties\"></tr>\n <tr\n [ngClass]=\"{\n 'example-element-row': data.isNotClickable === true,\n 'example-element-row cursor-pointer': !data.isNotClickable\n }\"\n mat-row\n *matRowDef=\"let row; columns: columnProperties\"\n (click)=\"goToDetails(row)\"\n ></tr>\n\n <!-- ROW SHOWN WHEN THERE IS NO MATCHING DATA. -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td *ngIf=\"!isLoading\" class=\"mat-cell p-4\" colspan=\"4\">\n Nenhum resultado encontrado para a busca\n </td>\n </tr>\n </table>\n\n <div class=\"flex justify-center\" *ngIf=\"isLoading\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div class=\"paginator-container\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[25, 50, 100]\"\n [pageSize]=\"pageSize\"\n [length]=\"totalItems\"\n showFirstLastButtons\n aria-label=\"Select page of periodic elements\"\n (page)=\"onPageChange($event)\"\n [ngClass]=\"{\n 'hide-length':\n ['filter', 'filterByDate', 'equals'].includes(\n this.currentArrange\n ) || this.data.filterFn,\n 'hide-next-button': !hasNextPage && data.pagination === true,\n 'hide-last-button':\n (!hasNextPage && data.pagination === true) || this.data.filterFn\n }\"\n >\n </mat-paginator>\n <div\n *ngIf=\"\n !isLoading &&\n dataSource?.data &&\n dataSource.data.length > 0 &&\n data?.filterFn\n \"\n class=\"page-number-display\"\n >\n {{ currentPageNumber }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOOLTIP PERSONALIZADO -->\n <div\n *ngIf=\"showTooltip\"\n class=\"fixed z-50 max-w-md break-words rounded-lg bg-gray-800 px-3 py-2 text-sm text-white shadow-lg\"\n [style.left.px]=\"tooltipPosition.x\"\n [style.top.px]=\"tooltipPosition.y\"\n [style.pointer-events]=\"'none'\"\n >\n {{ tooltipContent }}\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{--table-color: #1976d2;--table-text-color: white;--table-header-bg: #1976d2;--table-header-text: white;--table-scrollbar-bg: #f5f5f5;--table-scrollbar-thumb: var(--table-color)}.table-container::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.table-container::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.table-container::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}.overflow-x-auto::-webkit-scrollbar,.overflow-y-auto::-webkit-scrollbar,.overflow-auto::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.overflow-x-auto::-webkit-scrollbar-thumb,.overflow-y-auto::-webkit-scrollbar-thumb,.overflow-auto::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.overflow-x-auto::-webkit-scrollbar-thumb:hover,.overflow-y-auto::-webkit-scrollbar-thumb:hover,.overflow-auto::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}:host ::ng-deep .mat-table .mat-header-cell,:host ::ng-deep .mat-header-cell,:host ::ng-deep th.mat-header-cell,:host ::ng-deep .mat-mdc-table .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep th.mat-mdc-header-cell{background-color:var(--table-header-bg, #1976d2)!important;color:var(--table-header-text, white)!important;font-weight:600}::ng-deep .fa-filter,::ng-deep i.fa-filter{color:var(--table-color, #1976d2)!important}::ng-deep .rounded-xl.border{border-color:var(--table-color, #1976d2)!important}::ng-deep .border-gray-200.rounded-xl{border-color:var(--table-color, #1976d2)!important}::ng-deep .mdc-notched-outline__notch{border-right:none!important}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}.mat-mdc-text-field-wrapper.mdc-text-field--outlined.mdc-text-field--disabled{background:rgba(0,0,0,.15);background-size:1px 100%!important;background-repeat:repeat-x!important}.mdc-text-field--disabled .mdc-text-field__input{color:#525252}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)){transition:all .2s ease;cursor:pointer}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):hover:not(:disabled){opacity:.9;transform:scale(1.02)}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):disabled{opacity:.5;cursor:not-allowed;transform:none}::ng-deep .hide-length .mat-mdc-paginator-range-label{display:none}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-next.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base{visibility:hidden}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-last.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base.ng-star-inserted{visibility:hidden}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field.ng-tns-c162-1.mdc-text-field--filled{width:25dvw}::ng-deep .custom-filter .mat-mdc-text-field-wrapper{width:20dvw;max-width:300px}button[matTooltip=\"Adicionar novo filtro\"],button:has(i.fa-plus){display:inline-flex;align-items:center;gap:.5rem;border-radius:9999px;border:2px solid #93c5fd;background-color:#dbeafe;padding:.5rem 1.5rem;font-size:.875rem;font-weight:500;color:#2563eb;transition:all .3s;cursor:pointer;transform:translateY(0)}button[matTooltip=\"Adicionar novo filtro\"]:hover,button:has(i.fa-plus):hover{transform:translateY(-2px);border-color:#60a5fa;background-color:#bfdbfe;box-shadow:0 4px 6px #0000001a}button[matTooltip=\"Aplicar filtros\"],button:has(i.fa-search){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#16a34a;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Aplicar filtros\"]:hover,button:has(i.fa-search):hover{background-color:#15803d}button[matTooltip=\"Aplicar filtros\"]:disabled,button:has(i.fa-search):disabled{opacity:.5;cursor:not-allowed}button[matTooltip=\"Limpar filtros\"],button:has(i.fas.fa-redo-alt){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#ef4444;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Limpar filtros\"]:hover,button:has(i.fas.fa-redo-alt):hover{background-color:#dc2626}button[matTooltip=\"Exportar Tabela\"],button:has(i.fa-download){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#f97316;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Exportar Tabela\"]:hover:not(:disabled),button:has(i.fa-download):hover:not(:disabled){background-color:#ea580c}button[matTooltip=\"Exportar Tabela\"]:disabled,button:has(i.fa-download):disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ 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: 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i6.MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "component", type: i7.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "directive", type: i8.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i8.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i14.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
1078
1135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, decorators: [{
1079
1136
  type: Component,
1080
- args: [{ selector: 'lib-table', template: "<div *ngIf=\"data\" class=\"card-body\">\n <div class=\"flex flex-col justify-between gap-6\">\n <!-- UNIFIED CONTROL PANEL: FILTERS, SORT & ACTIONS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === true &&\n (dropdownItems.length > 0 ||\n sortableDropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title, Custom Action, and Global Actions -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n\n <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3\"\n *ngIf=\"\n this.hasFilterableColumn === true || this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"\n $any(arrange) && downloadTable !== undefined\n ? downloadTable($any(arrange), data.conditions || [])\n : null\n \"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n\n <!-- FILTERS CONTENT (WITH REFINEMENTS) -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n formControlName=\"initialDate\"\n [dropSpecialCharacters]=\"false\"\n mask=\"d0/M0/0000\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n matInput\n formControlName=\"finalDate\"\n [dropSpecialCharacters]=\"false\"\n mask=\"d0/M0/0000\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Sort -->\n <div\n class=\"-mb-2 flex flex-col items-center justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Sort Dropdown -->\n <div\n class=\"w-full sm:w-auto sm:min-w-[250px]\"\n *ngIf=\"sortableDropdownItems.length > 0\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Ordenar por</mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- SIMPLE SEARCH (for non-paginated tables) -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"data.pagination === false && hasFilterableColumn === true\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-blue-500\"></i>\n Buscar\n </mat-label>\n <input\n matInput\n (keyup.enter)=\"search($event)\"\n (keyup)=\"applyFilter(filterInput.value)\"\n placeholder=\"Digite para filtrar...\"\n #filterInput\n />\n <mat-icon matSuffix class=\"text-gray-500\">search</mat-icon>\n </mat-form-field>\n <button\n *ngIf=\"data.actionButton\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' float-right flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i *ngIf=\"data.actionButton.icon\" [class]=\"data.actionButton.icon\"></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n\n <!-- FILTERS PANEL (for non-paginated tables) -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"data.pagination === false && dropdownItems.length > 0\"\n >\n <!-- FILTERS CONTENT -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (blur)=\"onDateFilterChange()\"\n formControlName=\"initialDate\"\n [dropSpecialCharacters]=\"false\"\n mask=\"d0/M0/0000\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (blur)=\"onDateFilterChange()\"\n matInput\n formControlName=\"finalDate\"\n [dropSpecialCharacters]=\"false\"\n mask=\"d0/M0/0000\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Actions -->\n <div\n class=\"-mb-2 flex flex-col items-center justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-wrap gap-3\">\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Aplicar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"handleDownload()\"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col\">\n <div\n class=\"mx-auto flex flex-col\"\n *ngIf=\"data.tabs && data.tabs.tabsData && data.tabs.tabsData.length > 0\"\n >\n <!-- Calcular quantos grupos de 6 tabs existem -->\n <ng-container\n *ngFor=\"\n let groupIndex of getTabGroups(data.tabs.tabsData);\n let i = index\n \"\n >\n <div class=\"mx-auto flex flex-row\">\n <ng-container\n *ngFor=\"\n let tab of getTabGroup(data.tabs.tabsData, groupIndex);\n let j = index\n \"\n >\n <button\n class=\"border-2 border-gray-300 bg-gray-200 px-4 py-2 font-medium transition hover:brightness-95\"\n [ngClass]=\"\n isTabSelected(getRealTabIndex(i, j))\n ? 'border-b-0 brightness-110'\n : ''\n \"\n (click)=\"onTableSelected(i, j)\"\n >\n {{ tab.label }}\n <span\n *ngIf=\"tab.counter !== undefined\"\n class=\"ml-2 text-xs font-bold\"\n [ngClass]=\"tab.counterClass\"\n >\n {{ tab.counter }}\n </span>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </div>\n <div class=\"mat-elevation-z8 w-full overflow-x-auto rounded-xl\">\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n #sort=\"matSort\"\n matSortActive=\"createdAt\"\n matSortDirection=\"desc\"\n >\n <ng-container\n *ngFor=\"let col of data.displayedColumns\"\n matColumnDef=\"{{ col.property }}\"\n >\n <ng-container *matHeaderCellDef>\n <!-- IF THE COLUMN IS NOT SORTABLE, THEN DON'T SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"!col.isSortable || data.pagination === true\"\n mat-header-cell\n [ngClass]=\"\n (data.color?.bg ? ' ' + $any(data.color).bg : '') +\n (data.color?.text ? ' ' + $any(data.color).text : '')\n \"\n >\n {{ col.title }}\n </th>\n <!-- IF THE COLUMN IS SORTABLE, THEN SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"col.isSortable && data.pagination === false\"\n mat-header-cell\n mat-sort-header\n [ngClass]=\"\n (data.color?.bg ? ' ' + $any(data.color).bg : '') +\n (data.color?.text ? ' ' + $any(data.color).text : '')\n \"\n >\n {{ col.title }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n (click)=\"col.method ? col.method(row) : null\"\n (mouseenter)=\"onCellMouseEnter($event, row, col)\"\n (mouseleave)=\"onCellMouseLeave()\"\n (mousemove)=\"onCellMouseMove($event)\"\n >\n <!-- CHECK IF THE COLUMN MUST BE DISPLAYED -->\n <span *ngIf=\"!col.image && !col.iconClass && !col.method\">\n <ng-container>\n <span\n *ngIf=\"\n col.charLimit &&\n row[col.property] &&\n row[col.property].length > col.charLimit;\n else withinLimit\n \"\n >\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row) }}\n </span>\n </span>\n </ng-container>\n <ng-template #withinLimit>\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row, true) }}\n </span>\n </ng-template>\n </span>\n <!------------------- IMAGE ------------------>\n <img\n *ngIf=\"\n col.image && col.image.path && !col.iconClass && !col.method\n \"\n [src]=\"col.image.path + '/' + row[col.property]\"\n [ngClass]=\"col.image.class\"\n alt=\"Imagem\"\n />\n <img\n *ngIf=\"\n col.image && col.image.url && !col.iconClass && !col.method\n \"\n [src]=\"row[col.property]\"\n [ngClass]=\"col.image.class\"\n alt=\"Imagem\"\n />\n <ng-container *ngIf=\"col.iconClass\">\n <button\n *ngFor=\"let iconClass of col.iconClass\"\n (click)=\"\n iconClass.buttonMethod\n ? iconClass.buttonMethod(row, $event)\n : $event.stopPropagation()\n \"\n >\n <span\n [ngClass]=\"iconClass.class\"\n *ngIf=\"\n iconClass.condition === undefined ||\n (iconClass.condition !== undefined &&\n $any(iconClass.condition)(row))\n \"\n >{{ iconClass.text }}</span\n >\n </button>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnProperties\"></tr>\n <tr\n [ngClass]=\"{\n 'example-element-row': data.isNotClickable === true,\n 'example-element-row cursor-pointer': !data.isNotClickable\n }\"\n mat-row\n *matRowDef=\"let row; columns: columnProperties\"\n (click)=\"goToDetails(row)\"\n ></tr>\n\n <!-- ROW SHOWN WHEN THERE IS NO MATCHING DATA. -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td *ngIf=\"!isLoading\" class=\"mat-cell p-4\" colspan=\"4\">\n Nenhum resultado encontrado para a busca\n </td>\n </tr>\n </table>\n\n <div class=\"flex justify-center\" *ngIf=\"isLoading\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div class=\"paginator-container\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[25, 50, 100]\"\n [pageSize]=\"pageSize\"\n [length]=\"totalItems\"\n showFirstLastButtons\n aria-label=\"Select page of periodic elements\"\n (page)=\"onPageChange($event)\"\n [ngClass]=\"{\n 'hide-length':\n ['filter', 'filterByDate', 'equals'].includes(\n this.currentArrange\n ) || this.data.filterFn,\n 'hide-next-button': !hasNextPage && data.pagination === true,\n 'hide-last-button':\n (!hasNextPage && data.pagination === true) || this.data.filterFn\n }\"\n >\n </mat-paginator>\n <div\n *ngIf=\"\n !isLoading &&\n dataSource?.data &&\n dataSource.data.length > 0 &&\n data?.filterFn\n \"\n class=\"page-number-display\"\n >\n {{ currentPageNumber }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOOLTIP PERSONALIZADO -->\n <div\n *ngIf=\"showTooltip\"\n class=\"fixed z-50 max-w-md break-words rounded-lg bg-gray-800 px-3 py-2 text-sm text-white shadow-lg\"\n [style.left.px]=\"tooltipPosition.x\"\n [style.top.px]=\"tooltipPosition.y\"\n [style.pointer-events]=\"'none'\"\n >\n {{ tooltipContent }}\n </div>\n</div>\n", styles: ["::ng-deep .hide-length .mat-mdc-paginator-range-label{display:none}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-next.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base{visibility:hidden}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-last.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base.ng-star-inserted{visibility:hidden}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field.ng-tns-c162-1.mdc-text-field--filled{width:25dvw}::ng-deep .custom-filter .mat-mdc-text-field-wrapper{width:20dvw;max-width:300px}\n"] }]
1081
- }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.TableService }, { type: i3.AngularFirestore }]; }, propDecorators: { data: [{
1137
+ args: [{ selector: 'lib-table', template: "<div *ngIf=\"data\" class=\"card-body\">\n <div class=\"flex flex-col justify-between gap-6\">\n <!-- UNIFIED CONTROL PANEL: FILTERS, SORT & ACTIONS -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"\n data.pagination === true &&\n (dropdownItems.length > 0 ||\n sortableDropdownItems.length > 0 ||\n data.actionButton)\n \"\n >\n <!-- PANEL HEADER: Title, Custom Action, and Global Actions -->\n <div\n class=\"mb-4 flex flex-col items-start justify-between gap-4 border-b-2 border-gray-200 pb-4 md:flex-row md:items-center\"\n >\n <!-- Left Side: Title & Main Action Button -->\n <div class=\"flex flex-wrap items-center gap-4\">\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-filter text-xl text-blue-500\"></i>\n <span class=\"text-lg font-semibold text-gray-700\"\n >Filtros e A\u00E7\u00F5es</span\n >\n </div>\n <button\n *ngIf=\"data.actionButton && data.actionButton.condition\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i\n *ngIf=\"data.actionButton.icon\"\n [class]=\"data.actionButton.icon\"\n ></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n\n <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3\"\n *ngIf=\"\n this.hasFilterableColumn === true || this.hasSortableColumn === true\n \"\n >\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Pesquisar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"\n $any(arrange) && downloadTable !== undefined\n ? downloadTable($any(arrange), data.conditions || [])\n : null\n \"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n\n <!-- FILTERS CONTENT (WITH REFINEMENTS) -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Sort -->\n <div\n class=\"-mb-2 flex flex-col items-center justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Sort Dropdown -->\n <div\n class=\"w-full sm:w-auto sm:min-w-[250px]\"\n *ngIf=\"sortableDropdownItems.length > 0\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Ordenar por</mat-label>\n <mat-select placeholder=\"Selecione...\" [formControl]=\"selectSort\">\n <mat-option\n *ngFor=\"let item of sortableDropdownItems\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n\n <!-- SIMPLE SEARCH (for non-paginated tables) -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"data.pagination === false && hasFilterableColumn === true\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-blue-500\"></i>\n Buscar\n </mat-label>\n <input\n matInput\n (keyup.enter)=\"search($event)\"\n (keyup)=\"applyFilter(filterInput.value)\"\n placeholder=\"Digite para filtrar...\"\n #filterInput\n />\n <mat-icon matSuffix class=\"text-gray-500\">search</mat-icon>\n </mat-form-field>\n <button\n *ngIf=\"data.actionButton\"\n [ngClass]=\"\n (data.actionButton.colorClass || 'bg-blue-500') +\n ' float-right flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70'\n \"\n [routerLink]=\"data.actionButton.routerLink\"\n (click)=\"\n data.actionButton.method ? data.actionButton.method($event) : null\n \"\n >\n <i *ngIf=\"data.actionButton.icon\" [class]=\"data.actionButton.icon\"></i>\n {{ data.actionButton.label }}\n </button>\n </div>\n\n <!-- FILTERS PANEL (for non-paginated tables) -->\n <div\n class=\"rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"data.pagination === false && dropdownItems.length > 0\"\n >\n <!-- FILTERS CONTENT -->\n <div class=\"mb-4 space-y-3\" *ngIf=\"filtersForm.controls.length > 0\">\n <div\n [formGroup]=\"$any(filterGroup)\"\n *ngFor=\"let filterGroup of filtersForm.controls; let i = index\"\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <!-- FILTER TYPE SELECTOR -->\n <div class=\"min-w-[200px] flex-1\" *ngIf=\"dropdownItems.length > 0\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>Tipo de filtro</mat-label>\n <mat-select\n placeholder=\"Selecione o tipo...\"\n formControlName=\"selectFilter\"\n (selectionChange)=\"onSelectFilterChange()\"\n >\n <mat-option\n *ngFor=\"let item of getAvailableFilterOptions()\"\n [value]=\"item\"\n >\n <div class=\"flex items-center gap-2\">\n <i\n [class]=\"item.icon || 'fa fa-filter'\"\n class=\"text-sm text-blue-500\"\n ></i>\n <span>{{ item.title }}</span>\n </div>\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- TEXT FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange === 'filter'\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-search text-gray-400\"></i>\n <span>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Filtrar\"\n }}</span>\n </mat-label>\n <input\n (keyup.enter)=\"search($event)\"\n formControlName=\"typeFilter\"\n matInput\n placeholder=\"Digite para filtrar...\"\n #input\n />\n </mat-form-field>\n </div>\n\n <!-- DROPDOWN FILTER -->\n <div\n class=\"min-w-[200px] flex-1\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value &&\n $any(filterGroup)\n .get('selectFilter')\n ?.value.hasOwnProperty('items')\n \"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label>{{\n $any(filterGroup).get(\"selectFilter\")?.value?.title ||\n \"Selecione\"\n }}</mat-label>\n <mat-select\n placeholder=\"Selecione...\"\n formControlName=\"selectItem\"\n multiple\n >\n <mat-option\n *ngFor=\"\n let item of $any(filterGroup).get('selectFilter')?.value\n .items\n \"\n [value]=\"item\"\n >\n {{ item.label }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- DATE FILTER -->\n <div\n class=\"min-w-[340px] flex-auto\"\n *ngIf=\"\n $any(filterGroup).get('selectFilter')?.value?.arrange ===\n 'filterByDate'\n \"\n >\n <div\n class=\"flex flex-col items-stretch gap-3 sm:flex-row sm:items-center\"\n >\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Inicial</span>\n </mat-label>\n <input\n type=\"text\"\n matInput\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'initialDate', i)\"\n (blur)=\"onDateFilterChange()\"\n formControlName=\"initialDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n\n <mat-form-field appearance=\"outline\" class=\"flex-1\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-calendar text-gray-400\"></i>\n <span>Data Final</span>\n </mat-label>\n <input\n type=\"text\"\n (keydown.enter)=\"search($event)\"\n (input)=\"onDateInput($event, 'finalDate', i)\"\n (blur)=\"onDateFilterChange()\"\n matInput\n formControlName=\"finalDate\"\n placeholder=\"DD/MM/AAAA\"\n maxlength=\"10\"\n />\n </mat-form-field>\n </div>\n </div>\n\n <!-- REMOVE FILTER BUTTON -->\n <div *ngIf=\"filtersForm.length > 1\" class=\"ml-auto flex-shrink-0\">\n <button\n (click)=\"removeFilter(i)\"\n class=\"flex h-10 w-10 items-center justify-center rounded-full transition-colors duration-300 hover:bg-red-100\"\n matTooltip=\"Remover filtro\"\n >\n <i class=\"fa fa-trash text-red-500 hover:text-red-600\"></i>\n </button>\n </div>\n </div>\n </div>\n\n <!-- PANEL FOOTER: Add Filter & Actions -->\n <div\n class=\"-mb-2 flex flex-col items-center justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row\"\n >\n <!-- Add Filter Button -->\n <div *ngIf=\"dropdownItems.length > 0\">\n <button\n (click)=\"addFilter()\"\n class=\"transform rounded-full border-2 border-blue-300 bg-blue-50 px-6 py-2 text-sm font-medium text-blue-600 transition-all duration-300 hover:-translate-y-0.5 hover:border-blue-400 hover:bg-blue-100 hover:shadow-md\"\n matTooltip=\"Adicionar novo filtro\"\n >\n <i class=\"fa fa-plus mr-2\"></i>\n Adicionar Filtro\n </button>\n </div>\n\n <!-- Action Buttons -->\n <div class=\"flex flex-wrap gap-3\">\n <button\n (click)=\"search()\"\n type=\"button\"\n class=\"flex items-center gap-2 rounded-lg bg-green-600 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-green-700\"\n matTooltip=\"Aplicar filtros\"\n >\n <i class=\"fa fa-search\"></i>\n Aplicar\n </button>\n\n <button\n (click)=\"resetFilter()\"\n class=\"flex items-center gap-2 rounded-lg bg-red-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-red-600\"\n matTooltip=\"Limpar filtros\"\n >\n <i class=\"fas fa-redo-alt\"></i>\n Resetar\n </button>\n\n <button\n *ngIf=\"data.download !== false && downloadTable\"\n class=\"flex items-center gap-2 rounded-lg bg-orange-500 px-5 py-2 text-sm font-medium text-white transition-colors hover:bg-orange-600\"\n matTooltipPosition=\"above\"\n matTooltip=\"Exportar Tabela\"\n [disabled]=\"\n this.dataSource && this.dataSource.filteredData.length <= 0\n \"\n (click)=\"handleDownload()\"\n >\n <i class=\"fa fa-download\"></i>\n Exportar\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-col\">\n <div\n class=\"mx-auto flex flex-col\"\n *ngIf=\"data.tabs && data.tabs.tabsData && data.tabs.tabsData.length > 0\"\n >\n <!-- Calcular quantos grupos de 6 tabs existem -->\n <ng-container\n *ngFor=\"\n let groupIndex of getTabGroups(data.tabs.tabsData);\n let i = index\n \"\n >\n <div class=\"mx-auto flex flex-row\">\n <ng-container\n *ngFor=\"\n let tab of getTabGroup(data.tabs.tabsData, groupIndex);\n let j = index\n \"\n >\n <button\n class=\"border-2 border-gray-300 bg-gray-200 px-4 py-2 font-medium transition hover:brightness-95\"\n [ngClass]=\"\n isTabSelected(getRealTabIndex(i, j))\n ? 'border-b-0 brightness-110'\n : ''\n \"\n (click)=\"onTableSelected(i, j)\"\n >\n {{ tab.label }}\n <span\n *ngIf=\"tab.counter !== undefined\"\n class=\"ml-2 text-xs font-bold\"\n [ngClass]=\"tab.counterClass\"\n >\n {{ tab.counter }}\n </span>\n </button>\n </ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"mat-elevation-z8 w-full overflow-x-auto rounded-xl table-container\"\n >\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n #sort=\"matSort\"\n matSortActive=\"createdAt\"\n matSortDirection=\"desc\"\n >\n <ng-container\n *ngFor=\"let col of data.displayedColumns\"\n matColumnDef=\"{{ col.property }}\"\n >\n <ng-container *matHeaderCellDef>\n <!-- IF THE COLUMN IS NOT SORTABLE, THEN DON'T SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"!col.isSortable || data.pagination === true\"\n mat-header-cell\n >\n {{ col.title }}\n </th>\n <!-- IF THE COLUMN IS SORTABLE, THEN SHOW THE SORT BUTTONS -->\n <th\n *ngIf=\"col.isSortable && data.pagination === false\"\n mat-header-cell\n mat-sort-header\n >\n {{ col.title }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n (click)=\"col.method ? col.method(row) : null\"\n (mouseenter)=\"onCellMouseEnter($event, row, col)\"\n (mouseleave)=\"onCellMouseLeave()\"\n (mousemove)=\"onCellMouseMove($event)\"\n >\n <!-- CHECK IF THE COLUMN MUST BE DISPLAYED -->\n <span *ngIf=\"!col.image && !col.iconClass && !col.method\">\n <ng-container>\n <span\n *ngIf=\"\n col.charLimit &&\n row[col.property] &&\n row[col.property].length > col.charLimit;\n else withinLimit\n \"\n >\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row) }}\n </span>\n </span>\n </ng-container>\n <ng-template #withinLimit>\n <a\n *ngIf=\"col.hasLink === true\"\n [href]=\"row[col.property]\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <a\n *ngIf=\"col.hasLink && isString(col.hasLink)\"\n [href]=\"col.hasLink\"\n target=\"_blank\"\n >\n {{ getDisplayValue(col, row, true) }}\n </a>\n <span\n *ngIf=\"col.hasLink !== true && !isString(col.hasLink)\"\n >\n {{ getDisplayValue(col, row, true) }}\n </span>\n </ng-template>\n </span>\n <!------------------- IMAGE ------------------>\n <img\n *ngIf=\"\n col.image && col.image.path && !col.iconClass && !col.method\n \"\n [src]=\"col.image.path + '/' + row[col.property]\"\n [ngClass]=\"col.image.class\"\n alt=\"Imagem\"\n />\n <img\n *ngIf=\"\n col.image && col.image.url && !col.iconClass && !col.method\n \"\n [src]=\"row[col.property]\"\n [ngClass]=\"col.image.class\"\n alt=\"Imagem\"\n />\n <ng-container *ngIf=\"col.iconClass\">\n <button\n *ngFor=\"let iconClass of col.iconClass\"\n (click)=\"\n iconClass.buttonMethod\n ? iconClass.buttonMethod(row, $event)\n : $event.stopPropagation()\n \"\n >\n <span\n [ngClass]=\"iconClass.class\"\n *ngIf=\"\n iconClass.condition === undefined ||\n (iconClass.condition !== undefined &&\n $any(iconClass.condition)(row))\n \"\n >{{ iconClass.text }}</span\n >\n </button>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnProperties\"></tr>\n <tr\n [ngClass]=\"{\n 'example-element-row': data.isNotClickable === true,\n 'example-element-row cursor-pointer': !data.isNotClickable\n }\"\n mat-row\n *matRowDef=\"let row; columns: columnProperties\"\n (click)=\"goToDetails(row)\"\n ></tr>\n\n <!-- ROW SHOWN WHEN THERE IS NO MATCHING DATA. -->\n <tr class=\"mat-row\" *matNoDataRow>\n <td *ngIf=\"!isLoading\" class=\"mat-cell p-4\" colspan=\"4\">\n Nenhum resultado encontrado para a busca\n </td>\n </tr>\n </table>\n\n <div class=\"flex justify-center\" *ngIf=\"isLoading\">\n <mat-spinner></mat-spinner>\n </div>\n\n <div class=\"paginator-container\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[25, 50, 100]\"\n [pageSize]=\"pageSize\"\n [length]=\"totalItems\"\n showFirstLastButtons\n aria-label=\"Select page of periodic elements\"\n (page)=\"onPageChange($event)\"\n [ngClass]=\"{\n 'hide-length':\n ['filter', 'filterByDate', 'equals'].includes(\n this.currentArrange\n ) || this.data.filterFn,\n 'hide-next-button': !hasNextPage && data.pagination === true,\n 'hide-last-button':\n (!hasNextPage && data.pagination === true) || this.data.filterFn\n }\"\n >\n </mat-paginator>\n <div\n *ngIf=\"\n !isLoading &&\n dataSource?.data &&\n dataSource.data.length > 0 &&\n data?.filterFn\n \"\n class=\"page-number-display\"\n >\n {{ currentPageNumber }}\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- TOOLTIP PERSONALIZADO -->\n <div\n *ngIf=\"showTooltip\"\n class=\"fixed z-50 max-w-md break-words rounded-lg bg-gray-800 px-3 py-2 text-sm text-white shadow-lg\"\n [style.left.px]=\"tooltipPosition.x\"\n [style.top.px]=\"tooltipPosition.y\"\n [style.pointer-events]=\"'none'\"\n >\n {{ tooltipContent }}\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{--table-color: #1976d2;--table-text-color: white;--table-header-bg: #1976d2;--table-header-text: white;--table-scrollbar-bg: #f5f5f5;--table-scrollbar-thumb: var(--table-color)}.table-container::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.table-container::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.table-container::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}.overflow-x-auto::-webkit-scrollbar,.overflow-y-auto::-webkit-scrollbar,.overflow-auto::-webkit-scrollbar{width:10px;height:10px;background-color:var(--table-scrollbar-bg, #f5f5f5)}.overflow-x-auto::-webkit-scrollbar-thumb,.overflow-y-auto::-webkit-scrollbar-thumb,.overflow-auto::-webkit-scrollbar-thumb{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));border-radius:5px}.overflow-x-auto::-webkit-scrollbar-thumb:hover,.overflow-y-auto::-webkit-scrollbar-thumb:hover,.overflow-auto::-webkit-scrollbar-thumb:hover{background-color:var(--table-scrollbar-thumb, var(--table-color, #1976d2));opacity:.8}:host ::ng-deep .mat-table .mat-header-cell,:host ::ng-deep .mat-header-cell,:host ::ng-deep th.mat-header-cell,:host ::ng-deep .mat-mdc-table .mat-mdc-header-cell,:host ::ng-deep .mat-mdc-header-cell,:host ::ng-deep th.mat-mdc-header-cell{background-color:var(--table-header-bg, #1976d2)!important;color:var(--table-header-text, white)!important;font-weight:600}::ng-deep .fa-filter,::ng-deep i.fa-filter{color:var(--table-color, #1976d2)!important}::ng-deep .rounded-xl.border{border-color:var(--table-color, #1976d2)!important}::ng-deep .border-gray-200.rounded-xl{border-color:var(--table-color, #1976d2)!important}::ng-deep .mdc-notched-outline__notch{border-right:none!important}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-bottom:0}.mat-mdc-text-field-wrapper.mdc-text-field--outlined.mdc-text-field--disabled{background:rgba(0,0,0,.15);background-size:1px 100%!important;background-repeat:repeat-x!important}.mdc-text-field--disabled .mdc-text-field__input{color:#525252}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)){transition:all .2s ease;cursor:pointer}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):hover:not(:disabled){opacity:.9;transform:scale(1.02)}button:not([matTooltip=\"Adicionar novo filtro\"]):not([matTooltip=\"Aplicar filtros\"]):not([matTooltip=\"Limpar filtros\"]):not([matTooltip=\"Exportar Tabela\"]):not(:has(i.fa-plus)):not(:has(i.fa-search)):not(:has(i.fas.fa-redo-alt)):not(:has(i.fa-download)):disabled{opacity:.5;cursor:not-allowed;transform:none}::ng-deep .hide-length .mat-mdc-paginator-range-label{display:none}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-next.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base{visibility:hidden}::ng-deep .hide-next-button .mat-mdc-tooltip-trigger.mat-mdc-paginator-navigation-last.mdc-icon-button.mat-mdc-icon-button.mat-unthemed.mat-mdc-button-base.ng-star-inserted{visibility:hidden}::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field.ng-tns-c162-1.mdc-text-field--filled{width:25dvw}::ng-deep .custom-filter .mat-mdc-text-field-wrapper{width:20dvw;max-width:300px}button[matTooltip=\"Adicionar novo filtro\"],button:has(i.fa-plus){display:inline-flex;align-items:center;gap:.5rem;border-radius:9999px;border:2px solid #93c5fd;background-color:#dbeafe;padding:.5rem 1.5rem;font-size:.875rem;font-weight:500;color:#2563eb;transition:all .3s;cursor:pointer;transform:translateY(0)}button[matTooltip=\"Adicionar novo filtro\"]:hover,button:has(i.fa-plus):hover{transform:translateY(-2px);border-color:#60a5fa;background-color:#bfdbfe;box-shadow:0 4px 6px #0000001a}button[matTooltip=\"Aplicar filtros\"],button:has(i.fa-search){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#16a34a;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Aplicar filtros\"]:hover,button:has(i.fa-search):hover{background-color:#15803d}button[matTooltip=\"Aplicar filtros\"]:disabled,button:has(i.fa-search):disabled{opacity:.5;cursor:not-allowed}button[matTooltip=\"Limpar filtros\"],button:has(i.fas.fa-redo-alt){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#ef4444;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Limpar filtros\"]:hover,button:has(i.fas.fa-redo-alt):hover{background-color:#dc2626}button[matTooltip=\"Exportar Tabela\"],button:has(i.fa-download){display:inline-flex;align-items:center;gap:.5rem;border-radius:.5rem;background-color:#f97316;padding:.5rem 1.25rem;font-size:.875rem;font-weight:500;color:#fff;transition:background-color .2s;cursor:pointer;border:none}button[matTooltip=\"Exportar Tabela\"]:hover:not(:disabled),button:has(i.fa-download):hover:not(:disabled){background-color:#ea580c}button[matTooltip=\"Exportar Tabela\"]:disabled,button:has(i.fa-download):disabled{opacity:.5;cursor:not-allowed}\n"] }]
1138
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.TableService }, { type: i3.AngularFirestore }, { type: i0.ElementRef }]; }, propDecorators: { data: [{
1082
1139
  type: Input
1083
1140
  }], downloadTable: [{
1084
1141
  type: Input
@@ -1089,4 +1146,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1089
1146
  type: ViewChild,
1090
1147
  args: [MatSort]
1091
1148
  }] } });
1092
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZmlyZWJhc2UtdGFibGUta3hwL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1maXJlYmFzZS10YWJsZS1reHAvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUtwRSxPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUs3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT25FLE1BQU0sT0FBTyxjQUFjO0lBd0R6QixjQUFjO0lBQ2QsWUFDVSxNQUFjLEVBQ2QsWUFBMEIsRUFDMUIsU0FBMkI7UUFGM0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBeERyQyxZQUFPLEdBQW1CLElBQUksQ0FBQztRQUcvQixzQkFBaUIsR0FBRyxDQUFDLENBQUM7UUFDdEIsMkJBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLFVBQUssR0FBVSxFQUFFLENBQUM7UUFDbEIsa0JBQWEsR0FBVSxFQUFFLENB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LENBQUM7OzRHQWh2Q1UsY0FBYztnR0FBZCxjQUFjLHNKQTJDZCxZQUFZLHVFQUNaLE9BQU8sZ0RDbkVwQiwrbjZCQXV3QkE7NEZEaHZCYSxjQUFjO2tCQUwxQixTQUFTOytCQUNFLFdBQVc7dUpBTVosSUFBSTtzQkFBWixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBd0NtQixTQUFTO3NCQUFqQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ0gsSUFBSTtzQkFBdkIsU0FBUzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJyYW5nZSwgQ29uZGl0aW9uLCBUYWIsIFRhYkRhdGEsIFRhYmxlRGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzL1RhYmxlJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBbmd1bGFyRmlyZXN0b3JlLFxuICBRdWVyeURvY3VtZW50U25hcHNob3QsXG59IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvY29tcGF0L2ZpcmVzdG9yZSc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpcnN0VmFsdWVGcm9tLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPcmRlckJ5RGlyZWN0aW9uIH0gZnJvbSAnZmlyZWJhc2UvZmlyZXN0b3JlJztcbmltcG9ydCBmaXJlYmFzZSBmcm9tICdmaXJlYmFzZS9jb21wYXQnO1xuaW1wb3J0IFdoZXJlRmlsdGVyT3AgPSBmaXJlYmFzZS5maXJlc3RvcmUuV2hlcmVGaWx0ZXJPcDtcbmltcG9ydCBmaXJlc3RvcmUgPSBmaXJlYmFzZS5maXJlc3RvcmU7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUFycmF5LCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gSU5QVVRTXG4gIEBJbnB1dCgpIGRhdGEhOiBUYWJsZURhdGE7XG4gIEBJbnB1dCgpIGRvd25sb2FkVGFibGU/OiAoYXJyYW5nZTogQXJyYW5nZSwgY29uZGl0aW9uczogQ29uZGl0aW9uW10pID0+IHZvaWQ7XG4gIGFycmFuZ2U6IEFycmFuZ2UgfCBudWxsID0gbnVsbDtcbiAgLy8gVkFSSUFCTEVTXG4gIGRhdGFTb3VyY2UhOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcbiAgY3VycmVudFBhZ2VOdW1iZXIgPSAxO1xuICBjdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gMDtcblxuICBwdWJsaWMgaXRlbXM6IGFueVtdID0gW107XG4gIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBhbnlbXSA9IFtdOyAvLyBEYWRvcyBmaWx0cmFkb3MgcGFyYSBtb2RvIG7Do28gcGFnaW5hZG8gKHDDumJsaWNvIHBhcmEgYWNlc3NvIGV4dGVybm8pXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsYXN0RG9jOiBRdWVyeURvY3VtZW50U25hcHNob3Q8YW55PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGZpcnN0RG9jOiBRdWVyeURvY3VtZW50U25hcHNob3Q8YW55PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNvcnRCeTogeyBmaWVsZDogc3RyaW5nOyBvcmRlcjogT3JkZXJCeURpcmVjdGlvbiB9ID0ge1xuICAgIGZpZWxkOiAnY3JlYXRlZEF0JyxcbiAgICBvcmRlcjogJ2Rlc2MnLFxuICB9O1xuICBwdWJsaWMgY29sdW1uUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcblxuICBmaWx0ZXJzRm9ybTogRm9ybUFycmF5O1xuXG4gIHNlbGVjdFNvcnQ6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcbiAgY3VycmVudEFycmFuZ2UgPSAnJztcblxuICBoYXNOZXh0UGFnZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGRyb3Bkb3duSXRlbXM6IGFueVtdID0gW107XG4gIHNvcnRhYmxlRHJvcGRvd25JdGVtczogYW55W10gPSBbXTtcbiAgcGFnZVNpemUgPSAyNTtcbiAgdG90YWxJdGVtcyA9IDA7XG4gIHBhZ2VFdmVudD86IFBhZ2VFdmVudDtcbiAgZmlsdGVyVmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGhhc0ZpbHRlcmFibGVDb2x1bW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgaGFzU29ydGFibGVDb2x1bW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgZmlsdGVyUHJlZGljYXRlOiAoKGRhdGE6IGFueSwgZmlsdGVyOiBzdHJpbmcpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGZpbHRlclN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVib3VuY2VUaW1lTXMgPSA1MDA7XG5cbiAgc2VsZWN0ZWRUYWI6IG51bWJlciA9IDA7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvciE6IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0ITogTWF0U29ydDtcblxuICAvLyBQcm9wcmllZGFkZXMgcGFyYSBjb250cm9sZSBkbyB0b29sdGlwXG4gIGhvdmVyZWRDZWxsOiB7IHJvdzogYW55OyBjb2w6IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIHNob3dUb29sdGlwOiBib29sZWFuID0gZmFsc2U7XG4gIHRvb2x0aXBUaW1lb3V0OiBhbnk7XG4gIHRvb2x0aXBDb250ZW50OiBzdHJpbmcgPSAnJztcbiAgdG9vbHRpcFBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcblxuICAvLyBWYWxpZGFkb3IgZGUgZGF0YSBhcm1hemVuYWRvIGNvbW8gcHJvcHJpZWRhZGUgcGFyYSBjb21wYXRpYmlsaWRhZGUgY29tIG5neC1tYXNrXG4gIHByaXZhdGUgZGF0ZVZhbGlkYXRvciA9IHRoaXMudGFibGVTZXJ2aWNlLmRhdGVGb3JtYXRWYWxpZGF0b3IoKTtcblxuICAvLyBDT05TVFJVQ1RPUlxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgdGFibGVTZXJ2aWNlOiBUYWJsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaXJlc3RvcmU6IEFuZ3VsYXJGaXJlc3RvcmVcbiAgKSB7XG4gICAgdGhpcy5maWx0ZXJzRm9ybSA9IG5ldyBGb3JtQXJyYXkoW3RoaXMuY3JlYXRlRmlsdGVyR3JvdXAoKV0pO1xuICB9XG5cbiAgY3JlYXRlRmlsdGVyR3JvdXAoKTogRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gbmV3IEZvcm1Hcm91cCh7XG4gICAgICBzZWxlY3RGaWx0ZXI6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICB0eXBlRmlsdGVyOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgc2VsZWN0SXRlbTogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIGluaXRpYWxEYXRlOiBuZXcgRm9ybUNvbnRyb2woJycsIFt0aGlzLmRhdGVWYWxpZGF0b3JdKSxcbiAgICAgIGZpbmFsRGF0ZTogbmV3IEZvcm1Db250cm9sKCcnLCBbdGhpcy5kYXRlVmFsaWRhdG9yXSksXG4gICAgfSk7XG4gIH1cblxuICBhZGRGaWx0ZXIoZmlsdGVyRGF0YT86IHtcbiAgICBzZWxlY3RGaWx0ZXI6IGFueTtcbiAgICB0eXBlRmlsdGVyPzogc3RyaW5nO1xuICAgIHNlbGVjdEl0ZW0/OiBhbnlbXTtcbiAgICBpbml0aWFsRGF0ZT86IHN0cmluZztcbiAgICBmaW5hbERhdGU/OiBzdHJpbmc7XG4gIH0pOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSAmJlxuICAgICAgdGhpcy5oYXNBY3RpdmVEYXRlRmlsdGVyKCkgJiZcbiAgICAgIGZpbHRlckRhdGE/LnNlbGVjdEZpbHRlcj8uYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZSdcbiAgICApIHtcbiAgICAgIC8vIE7Do28gcGVybWl0aXIgYWRpY2lvbmFyIG5vdm8gZmlsdHJvIGRlIGRhdGEgcXVhbmRvIGrDoSBleGlzdGUgdW0gYXRpdm9cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdGaWx0ZXJHcm91cCA9IHRoaXMuY3JlYXRlRmlsdGVyR3JvdXAoKTtcblxuICAgIGlmIChmaWx0ZXJEYXRhKSB7XG4gICAgICBpZiAoZmlsdGVyRGF0YS5zZWxlY3RGaWx0ZXIpIHtcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8uc2V0VmFsdWUoZmlsdGVyRGF0YS5zZWxlY3RGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlckRhdGEudHlwZUZpbHRlcikge1xuICAgICAgICBuZXdGaWx0ZXJHcm91cC5nZXQoJ3R5cGVGaWx0ZXInKT8uc2V0VmFsdWUoZmlsdGVyRGF0YS50eXBlRmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJEYXRhLnNlbGVjdEl0ZW0pIHtcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCdzZWxlY3RJdGVtJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuc2VsZWN0SXRlbSk7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyRGF0YS5pbml0aWFsRGF0ZSkge1xuICAgICAgICBuZXdGaWx0ZXJHcm91cC5nZXQoJ2luaXRpYWxEYXRlJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuaW5pdGlhbERhdGUpO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlckRhdGEuZmluYWxEYXRlKSB7XG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnZmluYWxEYXRlJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuZmluYWxEYXRlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcnNGb3JtLnB1c2gobmV3RmlsdGVyR3JvdXApO1xuICB9XG5cbiAgaGFzQWN0aXZlRGF0ZUZpbHRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJzRm9ybS5jb250cm9scy5zb21lKChjb250cm9sKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXIgPSBncm91cC5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcbiAgICAgIHJldHVybiBzZWxlY3RlZEZpbHRlcj8uYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZSc7XG4gICAgfSk7XG4gIH1cblxuICBnZXRBdmFpbGFibGVGaWx0ZXJPcHRpb25zKCk6IGFueVtdIHtcbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWUgJiYgdGhpcy5oYXNBY3RpdmVEYXRlRmlsdGVyKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3Bkb3duSXRlbXMuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT4gaXRlbS5hcnJhbmdlICE9PSAnZmlsdGVyQnlEYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZHJvcGRvd25JdGVtcztcbiAgfVxuXG4gIG9uU2VsZWN0RmlsdGVyQ2hhbmdlKCkge1xuICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuZmlsdGVyc0Zvcm0ubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBsYXN0RmlsdGVyID0gdGhpcy5maWx0ZXJzRm9ybS5hdChsYXN0SW5kZXgpO1xuICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gbGFzdEZpbHRlci5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcblxuICAgIGlmIChzZWxlY3RlZEZpbHRlcikge1xuICAgICAgaWYgKFxuICAgICAgICBzZWxlY3RlZEZpbHRlci5hcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJyAmJlxuICAgICAgICB0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hZGRGaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVGaWx0ZXIoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyc0Zvcm0ucmVtb3ZlQXQoaW5kZXgpO1xuICAgIGlmICh0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5hZGRGaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVBbGxGaWx0ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyc0Zvcm0uY2xlYXIoKTtcbiAgICB0aGlzLmFkZEZpbHRlcigpO1xuICAgIHRoaXMucmVzZXRGaWx0ZXIoKTtcbiAgfVxuXG4gIC8vIE1FVEhPRFNcbiAgcHVibGljIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5kYXRhLmNvbG9yKVxuICAgICAgdGhpcy5kYXRhLmNvbG9yID0geyBiZzogJ2JnLXByaW1hcnknLCB0ZXh0OiAndGV4dC1ibGFjaycgfTtcbiAgICB0aGlzLmNvbHVtblByb3BlcnRpZXMgPSB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmRhdGEuYWN0aW9uQnV0dG9uICYmICF0aGlzLmRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvbikge1xuICAgICAgdGhpcy5kYXRhLmFjdGlvbkJ1dHRvbi5jb25kaXRpb24gPSAoX3Jvdz86IGFueSkgPT4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0ZpbHRlcmFibGVDb2x1bW4gPT09IGZhbHNlKSB0aGlzLmhhc0ZpbHRlcmFibGVDb2x1bW4gPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2ZpbHRlcicsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY29sLmlzU29ydGFibGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzU29ydGFibGVDb2x1bW4gPT09IGZhbHNlKSB0aGlzLmhhc1NvcnRhYmxlQ29sdW1uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zb3J0YWJsZURyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdhc2NlbmRpbmcnLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUgKyAnOiBjcmVzY2VudGUnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zb3J0YWJsZURyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdkZXNjZW5kaW5nJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogZGVjcmVzY2VudGUnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlQnlEYXRlKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2ZpbHRlckJ5RGF0ZScsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGZpbHRybyBwb3IgZGF0YScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucyAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMpICYmXG4gICAgICB0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5kYXRhLmZpbHRlcmFibGVPcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT5cbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goeyAuLi5vcHRpb24sIGFycmFuZ2U6ICdlcXVhbHMnIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNlbSBwYWdpbmHDp8Ojb1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zKCk7XG4gICAgfVxuICAgIC8vIENvbSBwYWdpbmHDp8Ojb1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHRoaXMuZGF0YS5zb3J0QnkpXG4gICAgICAgIHRoaXMuc29ydEJ5ID0ge1xuICAgICAgICAgIGZpZWxkOiB0aGlzLmRhdGEuc29ydEJ5LmZpZWxkLFxuICAgICAgICAgIG9yZGVyOiB0aGlzLmRhdGEuc29ydEJ5Lm9yZGVyLFxuICAgICAgICB9O1xuICAgICAgdGhpcy5maWx0ZXJTdWJqZWN0XG4gICAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZU1zKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkSXRlbXNQYWdpbmF0ZWQoJ3JlbG9hZCcsIHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXNQYWdpbmF0ZWQoJ3JlbG9hZCcsIHRydWUpO1xuXG4gICAgICB0aGlzLnNvcnQuYWN0aXZlID0gJ2NyZWF0ZWRBdCc7XG4gICAgICB0aGlzLnNvcnQuZGlyZWN0aW9uID0gJ2Rlc2MnO1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSAwO1xuICAgICAgaWYgKHRoaXMuZGF0YS50b3RhbFJlZikge1xuICAgICAgICBmb3IgKGNvbnN0IHRvdGFsUmVmIG9mIHRoaXMuZGF0YS50b3RhbFJlZikge1xuICAgICAgICAgIGNvbnN0IHRvdGFsUmVmRG9jID0gYXdhaXQgdG90YWxSZWYucmVmLmdldCgpO1xuICAgICAgICAgIGNvbnN0IGRvY0RhdGEgPSB0b3RhbFJlZkRvYy5kYXRhKCkgYXMgYW55O1xuICAgICAgICAgIGlmIChkb2NEYXRhICYmIGRvY0RhdGFbdG90YWxSZWYuZmllbGRdKVxuICAgICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gKHRoaXMudG90YWxJdGVtcyArXG4gICAgICAgICAgICAgIGRvY0RhdGFbdG90YWxSZWYuZmllbGRdKSBhcyBudW1iZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGlzcGxheVZhbHVlKGNvbDogYW55LCByb3c6IGFueSwgd2l0aGluTGltaXQ6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgbGV0IHZhbHVlOiBhbnk7XG5cbiAgICBpZiAoY29sLmNhbGN1bGF0ZVZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IGNvbC5jYWxjdWxhdGVWYWx1ZShyb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZ2V0TmVzdGVkVmFsdWUocm93LCBjb2wucHJvcGVydHkpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBjb2wuYXJyYXlGaWVsZCkge1xuICAgICAgdmFsdWUgPSB0aGlzLmZvcm1hdEFycmF5VmFsdWUodmFsdWUsIGNvbC5hcnJheUZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoY29sLnF1ZXJ5TGVuZ3RoICYmIHJvd1tjb2wucHJvcGVydHldKSB7XG4gICAgICB2YWx1ZSA9IHJvd1tjb2wucHJvcGVydHldO1xuICAgIH1cblxuICAgIHZhbHVlID0gY29sLnBpcGUgPyBjb2wucGlwZS50cmFuc2Zvcm0odmFsdWUpIDogdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGlmICh3aXRoaW5MaW1pdCB8fCAhY29sLmNoYXJMaW1pdCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMCwgY29sLmNoYXJMaW1pdCkgKyAnLi4uJztcbiAgfVxuXG4gIGdldE5lc3RlZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIHJldHVybiBwcm9wZXJ0aWVzLnJlZHVjZShcbiAgICAgIChhY2MsIGN1cnJlbnRQYXJ0KSA9PiBhY2MgJiYgYWNjW2N1cnJlbnRQYXJ0XSxcbiAgICAgIG9ialxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEFycmF5VmFsdWUoYXJyYXk6IGFueVtdLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXkpIHx8IGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlcyA9IGFycmF5XG4gICAgICAubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXSB8fCAnJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU3RyaW5nKGl0ZW0pO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiB2YWx1ZSAhPT0gJycgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCk7XG5cbiAgICByZXR1cm4gdmFsdWVzLmpvaW4oJywgJyk7XG4gIH1cblxuICAvLyBNw6l0b2RvcyBzZW0gcGFnaW5hw6fDo29cbiAgcHJpdmF0ZSBhc3luYyBsb2FkSXRlbXMoKSB7XG4gICAgdGhpcy5pdGVtcyA9IGF3YWl0IHRoaXMudGFibGVTZXJ2aWNlLmdldEl0ZW1zKHRoaXMuZGF0YS5jb2xsZWN0aW9uUmVmKTtcbiAgICBpZiAodGhpcy5kYXRhLmNvbmRpdGlvbnMpIHtcbiAgICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5sb2FkUmVsYXRpb25zKCk7XG4gICAgYXdhaXQgdGhpcy5sb2FkUXVlcnlMZW5ndGhzKCk7XG4gICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5pdGVtcy5sZW5ndGg7XG5cbiAgICAvLyBJbmljaWFsaXphciBhcnJhbmdlIHBhcmEgdGFiZWxhcyBuw6NvIHBhZ2luYWRhc1xuICAgIHRoaXMuYXJyYW5nZSA9IHtcbiAgICAgIGZpbHRlcnM6IFtdLFxuICAgICAgc29ydEJ5OiB0aGlzLmRhdGEuc29ydEJ5IHx8IHtcbiAgICAgICAgZmllbGQ6ICdjcmVhdGVkQXQnLFxuICAgICAgICBvcmRlcjogJ2Rlc2MnLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuc29ydEJ5ID0gdGhpcy5kYXRhLnNvcnRCeSB8fCB7XG4gICAgICBmaWVsZDogJ2NyZWF0ZWRBdCcsXG4gICAgICBvcmRlcjogJ2Rlc2MnLFxuICAgIH07XG5cbiAgICAvLyBBcGxpY2FyIGZpbHRyb3MgY2xpZW50LXNpZGUgc2UgZXhpc3RpcmVtXG4gICAgbGV0IGl0ZW1zVG9EaXNwbGF5ID0gWy4uLnRoaXMuaXRlbXNdO1xuICAgIGl0ZW1zVG9EaXNwbGF5ID0gdGhpcy5hcHBseUNsaWVudFNpZGVGaWx0ZXJzKGl0ZW1zVG9EaXNwbGF5KTtcbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBpdGVtc1RvRGlzcGxheTsgLy8gQXJtYXplbmFyIGRhZG9zIGZpbHRyYWRvc1xuXG4gICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShpdGVtc1RvRGlzcGxheSk7XG4gICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHRoaXMucGFnaW5hdG9yO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xuICAgIGlmICh0aGlzLmRhdGEuc29ydEJ5KSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydC5hY3RpdmUgPSB0aGlzLmRhdGEuc29ydEJ5LmZpZWxkO1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQuZGlyZWN0aW9uID0gdGhpcy5kYXRhLnNvcnRCeS5vcmRlcjtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0LnNvcnRDaGFuZ2UuZW1pdCgpO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSAoZGF0YSwgZmlsdGVyOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1ucy5zb21lKChjb2wpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKGNvbC5maWx0ZXJQcmVkaWNhdGVzKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbC5maWx0ZXJQcmVkaWNhdGVzLnNvbWUoKHByZWRpY2F0ZSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGRhdGFbY29sLnByb3BlcnR5XTtcbiAgICAgICAgICAgIGlmICghcHJvcGVydHlWYWx1ZSB8fCB0eXBlb2YgcHJvcGVydHlWYWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwcmVkaWNhdGVWYWx1ZSA9IHByb3BlcnR5VmFsdWVbcHJlZGljYXRlXTtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGVWYWx1ZSA9PT0gbnVsbCB8fCBwcmVkaWNhdGVWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhwcmVkaWNhdGVWYWx1ZSlcbiAgICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgICAuaW5jbHVkZXMoZmlsdGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2wucHJvcGVydHkgJiYgY29sLmlzRmlsdGVyYWJsZSkge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBkYXRhW2NvbC5wcm9wZXJ0eV07XG4gICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUgPT09IG51bGwgfHwgcHJvcGVydHlWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFN0cmluZyhwcm9wZXJ0eVZhbHVlKVxuICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgdGhpcy5maWx0ZXJQcmVkaWNhdGUgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlO1xuICB9XG5cbiAgLy8gQXBsaWNhciBmaWx0cm9zIGNsaWVudC1zaWRlIChmaWx0cm9zIHBvciBkYXRhKVxuICBwcml2YXRlIGFwcGx5Q2xpZW50U2lkZUZpbHRlcnMoaXRlbXM6IGFueVtdKTogYW55W10ge1xuICAgIGxldCBmaWx0ZXJlZEl0ZW1zID0gWy4uLml0ZW1zXTtcblxuICAgIC8vIEFncnVwYXIgZmlsdHJvcyBkZSBkYXRhIHBvciBwcm9wcmllZGFkZVxuICAgIGNvbnN0IGRhdGVGaWx0ZXJzQnlQcm9wZXJ0eTogUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgQXJyYXk8eyBpbml0aWFsOiBEYXRlOyBmaW5hbDogRGF0ZSB9PlxuICAgID4gPSB7fTtcbiAgICBjb25zdCBvdGhlckZpbHRlcnM6IEFycmF5PHtcbiAgICAgIGdyb3VwOiBGb3JtR3JvdXA7XG4gICAgICBzZWxlY3RlZEZpbHRlcjogYW55O1xuICAgICAgYXJyYW5nZTogc3RyaW5nO1xuICAgIH0+ID0gW107XG5cbiAgICB0aGlzLmZpbHRlcnNGb3JtLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XG4gICAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlO1xuICAgICAgaWYgKCFzZWxlY3RlZEZpbHRlcikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcnJhbmdlID0gc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZTtcblxuICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSBncm91cC5nZXQoJ2luaXRpYWxEYXRlJyk/LnZhbHVlO1xuICAgICAgICBjb25zdCBmaW5hbCA9IGdyb3VwLmdldCgnZmluYWxEYXRlJyk/LnZhbHVlO1xuXG4gICAgICAgIC8vIFPDsyBhcGxpY2FyIGZpbHRybyBzZSBhbWJhcyBhcyBkYXRhcyBlc3RpdmVyZW0gcHJlZW5jaGlkYXNcbiAgICAgICAgaWYgKGluaXRpYWwgJiYgZmluYWwgJiYgaW5pdGlhbC50cmltKCkgJiYgZmluYWwudHJpbSgpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFZhbGlkYXIgZm9ybWF0byBkYSBkYXRhIChERC9NTS9BQUFBKVxuICAgICAgICAgICAgY29uc3QgZGF0ZVBhdHRlcm4gPSAvXihcXGR7MSwyfSlcXC8oXFxkezEsMn0pXFwvKFxcZHs0fSkkLztcbiAgICAgICAgICAgIGlmICghZGF0ZVBhdHRlcm4udGVzdChpbml0aWFsKSB8fCAhZGF0ZVBhdHRlcm4udGVzdChmaW5hbCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmFyIHNlIGZvcm1hdG8gaW52w6FsaWRvXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtkYXlJLCBtb250aEksIHllYXJJXSA9IGluaXRpYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxEYXRlID0gbmV3IERhdGUoYCR7bW9udGhJfS8ke2RheUl9LyR7eWVhckl9YCk7XG4gICAgICAgICAgICBjb25zdCBbZGF5RiwgbW9udGhGLCB5ZWFyRl0gPSBmaW5hbC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgZmluYWxEYXRlID0gbmV3IERhdGUoYCR7bW9udGhGfS8ke2RheUZ9LyR7eWVhckZ9YCk7XG4gICAgICAgICAgICBmaW5hbERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSk7XG5cbiAgICAgICAgICAgIC8vIFZhbGlkYXIgc2UgYXMgZGF0YXMgc8OjbyB2w6FsaWRhc1xuICAgICAgICAgICAgaWYgKGlzTmFOKGluaXRpYWxEYXRlLmdldFRpbWUoKSkgfHwgaXNOYU4oZmluYWxEYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmFyIHNlIGRhdGFzIGludsOhbGlkYXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXNhciBvIGNhbXBvIGRhIGNvbHVuYSBvdSBvIHNvcnRCeS5maWVsZCBjb21vIHBhZHLDo29cbiAgICAgICAgICAgIGNvbnN0IGRhdGVGaWVsZCA9IHNlbGVjdGVkRmlsdGVyLnByb3BlcnR5IHx8IHRoaXMuc29ydEJ5LmZpZWxkO1xuXG4gICAgICAgICAgICBpZiAoIWRhdGVGaWx0ZXJzQnlQcm9wZXJ0eVtkYXRlRmllbGRdKSB7XG4gICAgICAgICAgICAgIGRhdGVGaWx0ZXJzQnlQcm9wZXJ0eVtkYXRlRmllbGRdID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGVGaWx0ZXJzQnlQcm9wZXJ0eVtkYXRlRmllbGRdLnB1c2goe1xuICAgICAgICAgICAgICBpbml0aWFsOiBpbml0aWFsRGF0ZSxcbiAgICAgICAgICAgICAgZmluYWw6IGZpbmFsRGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm8gYW8gcHJvY2Vzc2FyIGRhdGFzIGRvIGZpbHRybzonLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdGhlckZpbHRlcnMucHVzaCh7IGdyb3VwLCBzZWxlY3RlZEZpbHRlciwgYXJyYW5nZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5rZXlzKGRhdGVGaWx0ZXJzQnlQcm9wZXJ0eSkuZm9yRWFjaCgoZGF0ZUZpZWxkKSA9PiB7XG4gICAgICBjb25zdCBpbnRlcnZhbHMgPSBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXTtcblxuICAgICAgZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gaXRlbVtkYXRlRmllbGRdO1xuXG4gICAgICAgICAgaWYgKCFmaWVsZFZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IGl0ZW1EYXRlOiBEYXRlO1xuICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZS50b0RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGl0ZW1EYXRlID0gZmllbGRWYWx1ZS50b0RhdGUoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBpdGVtRGF0ZSA9IGZpZWxkVmFsdWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGl0ZW1EYXRlID0gbmV3IERhdGUoZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4oaXRlbURhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGl0ZW1EYXRlID0gbmV3IERhdGUoZmllbGRWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gaW50ZXJ2YWxzLnNvbWUoXG4gICAgICAgICAgICAoaW50ZXJ2YWwpID0+XG4gICAgICAgICAgICAgIGl0ZW1EYXRlID49IGludGVydmFsLmluaXRpYWwgJiYgaXRlbURhdGUgPD0gaW50ZXJ2YWwuZmluYWxcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdFcnJvIGFvIHByb2Nlc3NhciBmaWx0cm8gZGUgZGF0YSBwYXJhIG8gaXRlbTonLFxuICAgICAgICAgICAgaXRlbS5pZCxcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgb3RoZXJGaWx0ZXJzLmZvckVhY2goKHsgZ3JvdXAsIHNlbGVjdGVkRmlsdGVyLCBhcnJhbmdlIH0pID0+IHtcbiAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyJykge1xuICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGdyb3VwLmdldCgndHlwZUZpbHRlcicpPy52YWx1ZTtcbiAgICAgICAgaWYgKGZpbHRlclZhbHVlICYmIGZpbHRlclZhbHVlLnRyaW0oKSkge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gc2VsZWN0ZWRGaWx0ZXIucHJvcGVydHk7XG4gICAgICAgICAgZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKGl0ZW1bcHJvcGVydHldIHx8ICcnKVxuICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKGZpbHRlclZhbHVlLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgc2VsZWN0ZWRGaWx0ZXIuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJykgJiZcbiAgICAgICAgYXJyYW5nZSA9PT0gJ2VxdWFscydcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gZ3JvdXAuZ2V0KCdzZWxlY3RJdGVtJyk/LnZhbHVlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZEl0ZW1zKSAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBzZWxlY3RlZEl0ZW1zLm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLnZhbHVlKTtcbiAgICAgICAgICBmaWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbXMuc29tZSgoc2VsZWN0ZWRJdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXRlbVZhbHVlID0gaXRlbVtzZWxlY3RlZEl0ZW0ucHJvcGVydHldO1xuICAgICAgICAgICAgICByZXR1cm4gaXRlbVZhbHVlID09PSBzZWxlY3RlZEl0ZW0udmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkSXRlbXM7XG4gIH1cblxuICAvLyBIYW5kbGVyIHBhcmEgbXVkYW7Dp2FzIGRlIGRhdGEgbm8gZmlsdHJvXG4gIG9uRGF0ZUZpbHRlckNoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgICAvLyBBdHVhbGl6YXIgYXJyYW5nZSBjb20gb3MgZmlsdHJvcyBhdGl2b3NcbiAgICAgIHRoaXMuYXJyYW5nZSA9IHRoaXMuYnVpbGRBcnJhbmdlRnJvbUZpbHRlcnMoKTtcbiAgICAgIC8vIEFwbGljYXIgZmlsdHJvcyAob3UgcmVtb3ZlciBzZSBjYW1wb3MgZXN0aXZlcmVtIHZhemlvcylcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzVG9EYXRhU291cmNlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXBsaWNhciBmaWx0cm9zIGFvIGRhdGFTb3VyY2UgcXVhbmRvIG7Do28gaMOhIHBhZ2luYcOnw6NvXG4gIHByaXZhdGUgYXBwbHlGaWx0ZXJzVG9EYXRhU291cmNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kYXRhU291cmNlKSByZXR1cm47XG5cbiAgICBsZXQgZmlsdGVyZWRJdGVtcyA9IHRoaXMuYXBwbHlDbGllbnRTaWRlRmlsdGVycyhbLi4udGhpcy5pdGVtc10pO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gZmlsdGVyZWRJdGVtcztcbiAgICAvLyBBdHVhbGl6YXIgZmlsdGVyZWRJdGVtcyBjb20gb3MgZGFkb3MgZmlsdHJhZG9zIChzZXLDoSBhdHVhbGl6YWRvIG5vdmFtZW50ZSBubyBoYW5kbGVEb3dubG9hZCBjb20gZmlsdGVyZWREYXRhKVxuICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXM7XG4gICAgdGhpcy50b3RhbEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5sZW5ndGg7XG4gIH1cblxuICAvLyBNw6l0b2RvcyBjb20gcGFnaW5hw6fDo29cbiAgcHJpdmF0ZSBhc3luYyBsb2FkSXRlbXNQYWdpbmF0ZWQoXG4gICAgbmF2aWdhdGlvbjogc3RyaW5nID0gJ3JlbG9hZCcsXG4gICAgcmVzZXQ6IGJvb2xlYW4gPSBmYWxzZVxuICApIHtcbiAgICBpZiAocmVzZXQgJiYgWydmb3J3YXJkJywgJ3JlbG9hZCddLmluY2x1ZGVzKG5hdmlnYXRpb24pKSB7XG4gICAgICB0aGlzLmxhc3REb2MgPSBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gMDtcbiAgICB9XG4gICAgaWYgKHJlc2V0ICYmIFsnYmFja3dhcmQnLCAncmVsb2FkJ10uaW5jbHVkZXMobmF2aWdhdGlvbikpIHtcbiAgICAgIHRoaXMuZmlyc3REb2MgPSBudWxsO1xuICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gMDtcbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVGaWx0ZXJzID0gdGhpcy5maWx0ZXJzRm9ybS5jb250cm9sc1xuICAgICAgLmZsYXRNYXAoKGNvbnRyb2wpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXIgPSBncm91cC5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcbiAgICAgICAgaWYgKCFzZWxlY3RlZEZpbHRlcikgcmV0dXJuIFtdO1xuXG4gICAgICAgIGNvbnN0IGFycmFuZ2UgPSBzZWxlY3RlZEZpbHRlci5hcnJhbmdlO1xuXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyJykge1xuICAgICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gZ3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnZhbHVlO1xuICAgICAgICAgIGlmICghZmlsdGVyVmFsdWUpIHJldHVybiBbXTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYXJyYW5nZSxcbiAgICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgICBwcm9wZXJ0eTogc2VsZWN0ZWRGaWx0ZXIucHJvcGVydHksXG4gICAgICAgICAgICAgIGZpbHRlcmluZzogZmlsdGVyVmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZScpIHtcbiAgICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy52YWx1ZTtcbiAgICAgICAgICBjb25zdCBmaW5hbCA9IGdyb3VwLmdldCgnZmluYWxEYXRlJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChpbml0aWFsICYmIGZpbmFsKSB7XG4gICAgICAgICAgICBjb25zdCBbZGF5SSwgbW9udGhJLCB5ZWFySV0gPSBpbml0aWFsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoSX0vJHtkYXlJfS8ke3llYXJJfWApO1xuICAgICAgICAgICAgY29uc3QgW2RheUYsIG1vbnRoRiwgeWVhckZdID0gZmluYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoRn0vJHtkYXlGfS8ke3llYXJGfWApO1xuICAgICAgICAgICAgZmluYWxEYXRlLnNldEhvdXJzKDIzLCA1OSwgNTkpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYXJyYW5nZSxcbiAgICAgICAgICAgICAgZmlsdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICBpbml0aWFsOiBpbml0aWFsRGF0ZSxcbiAgICAgICAgICAgICAgICBmaW5hbDogZmluYWxEYXRlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkRmlsdGVyLmhhc093blByb3BlcnR5KCdpdGVtcycpICYmIGFycmFuZ2UgPT09ICdlcXVhbHMnKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RlZEl0ZW1zKSAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW1zLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgICAgYXJyYW5nZSxcbiAgICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0ucHJvcGVydHksXG4gICAgICAgICAgICAgICAgZmlsdGVyaW5nOiBpdGVtLnZhbHVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkYXRlRmlsdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgJiYgKGYuZmlsdGVyPy5maWx0ZXJpbmcgIT09IHVuZGVmaW5lZCB8fCBmLmRhdGVGaWx0ZXIpKTtcblxuICAgIHRoaXMuYXJyYW5nZSA9IHtcbiAgICAgIGZpbHRlcnM6IGFjdGl2ZUZpbHRlcnMsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgIH07XG5cbiAgICBjb25zdCBwYWdpbmF0ZWQ6IGFueSA9IHtcbiAgICAgIGJhdGNoU2l6ZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGNvbGxlY3Rpb246IHRoaXMuZGF0YS5jb2xsZWN0aW9uLFxuICAgICAgZG9jOiB7IGxhc3REb2M6IHRoaXMubGFzdERvYywgZmlyc3REb2M6IHRoaXMuZmlyc3REb2MgfSxcbiAgICAgIG5hdmlnYXRpb24sXG4gICAgICBhcnJhbmdlOiB0aGlzLmFycmFuZ2UsXG4gICAgICBjb25kaXRpb25zOiB0aGlzLmRhdGEuY29uZGl0aW9ucyxcbiAgICAgIHNpemU6IHRoaXMudG90YWxJdGVtcyxcbiAgICAgIGZpbHRlckZuOiB0aGlzLmRhdGEuZmlsdGVyRm4sXG4gICAgICBjbGllbnRQYWdlSW5kZXg6IHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50YWJsZVNlcnZpY2UuZ2V0UGFnaW5hdGVkKHBhZ2luYXRlZCk7XG4gICAgdGhpcy5pdGVtcyA9IHJlc3VsdC5pdGVtcztcbiAgICBhd2FpdCB0aGlzLmxvYWRSZWxhdGlvbnMoKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRRdWVyeUxlbmd0aHMoKTtcbiAgICB0aGlzLmxhc3REb2MgPSByZXN1bHQubGFzdERvYyBhcyBhbnk7XG4gICAgdGhpcy5maXJzdERvYyA9IHJlc3VsdC5maXJzdERvYyBhcyBhbnk7XG5cbiAgICAvLyBBdHVhbGl6YXIgY3VycmVudENsaWVudFBhZ2VJbmRleCBzZSByZXRvcm5hZG8gcGVsbyBmYWxsYmFja1xuICAgIGlmIChyZXN1bHQuY3VycmVudENsaWVudFBhZ2VJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXggPSByZXN1bHQuY3VycmVudENsaWVudFBhZ2VJbmRleDtcbiAgICB9XG5cbiAgICBsZXQgc3VtID0gMDtcbiAgICBpZiAodGhpcy5kYXRhLnRvdGFsUmVmKSB7XG4gICAgICBmb3IgKGNvbnN0IHRvdGFsUmVmIG9mIHRoaXMuZGF0YS50b3RhbFJlZikge1xuICAgICAgICBjb25zdCB0b3RhbFJlZkRvYyA9IGF3YWl0IHRvdGFsUmVmLnJlZi5nZXQoKTtcbiAgICAgICAgY29uc3QgZG9jRGF0YSA9IHRvdGFsUmVmRG9jLmRhdGEoKSBhcyBhbnk7XG4gICAgICAgIGlmIChkb2NEYXRhIHx8IHJlc3VsdC5maWx0ZXJMZW5ndGgpIHtcbiAgICAgICAgICBzdW0gPVxuICAgICAgICAgICAgcmVzdWx0LmZpbHRlckxlbmd0aCA/P1xuICAgICAgICAgICAgKChzdW0gKyAoZG9jRGF0YSA/IGRvY0RhdGFbdG90YWxSZWYuZmllbGRdIDogMCkpIGFzIG51bWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudG90YWxJdGVtcyA9IHN1bTtcbiAgICB9XG5cbiAgICB0aGlzLmhhc05leHRQYWdlID0gcmVzdWx0Lmhhc05leHRQYWdlO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodGhpcy5pdGVtcyk7XG4gICAgdGhpcy5maWx0ZXJQcmVkaWNhdGUgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlO1xuICB9XG5cbiAgYXN5bmMgb25QYWdlQ2hhbmdlKGV2ZW50PzogUGFnZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlICYmIGV2ZW50KSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzUGFnZUluZGV4ID0gZXZlbnQucHJldmlvdXNQYWdlSW5kZXggPz8gMDtcbiAgICAgIGNvbnN0IHBhZ2VJbmRleCA9IGV2ZW50LnBhZ2VJbmRleDtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRQYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG4gICAgICBjb25zdCBldmVudFBhZ2VTaXplID0gZXZlbnQucGFnZVNpemU7XG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdGhpcy50b3RhbEl0ZW1zO1xuXG4gICAgICBsZXQgbmF2aWdhdGlvbkRpcmVjdGlvbjogc3RyaW5nO1xuICAgICAgbGV0IHJlc2V0RG9jcyA9IGZhbHNlO1xuICAgICAgbGV0IG9yaWdpbmFsUGFnZVNpemU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgICBjb25zdCBsYXN0UGFnZUluZGV4ID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGguY2VpbCh0b3RhbEl0ZW1zIC8gZXZlbnRQYWdlU2l6ZSkgLSAxXG4gICAgICApO1xuXG4gICAgICAvLyBBdHVhbGl6YXIgY3VycmVudENsaWVudFBhZ2VJbmRleCBzZW1wcmUgcGFyYSBvIGZhbGxiYWNrXG4gICAgICB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXggPSBwYWdlSW5kZXg7XG5cbiAgICAgIGlmIChwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmIHBhZ2VJbmRleCA+IHByZXZpb3VzUGFnZUluZGV4KSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2VOdW1iZXIrKztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4IDwgcHJldmlvdXNQYWdlSW5kZXhcbiAgICAgICkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlTnVtYmVyID0gTWF0aC5tYXgoMSwgdGhpcy5jdXJyZW50UGFnZU51bWJlciAtIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRQYWdlU2l6ZSAhPT0gY3VycmVudENvbXBvbmVudFBhZ2VTaXplKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdBbHRlcm91IGEgcXVhbnRpZGFkZSBkZSBlbGVtZW50b3MgZXhpYmlkb3MgcG9yIHDDoWdpbmEnKTtcbiAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IGV2ZW50UGFnZVNpemU7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnZm9yd2FyZCc7XG4gICAgICAgIHJlc2V0RG9jcyA9IHRydWU7XG4gICAgICAgIHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwYWdlSW5kZXggPT09IDAgJiZcbiAgICAgICAgcHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYWdlSW5kZXggPCBwcmV2aW91c1BhZ2VJbmRleFxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdQdWxvdSBwYXJhIGEgcHJpbWVpcmEgcMOhZ2luYScpO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlTnVtYmVyID0gMTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gMDtcbiAgICAgICAgcmVzZXREb2NzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHBhZ2VJbmRleCA9PT0gbGFzdFBhZ2VJbmRleCAmJlxuICAgICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhZ2VJbmRleCA+IHByZXZpb3VzUGFnZUluZGV4ICYmXG4gICAgICAgIHBhZ2VJbmRleCAtIHByZXZpb3VzUGFnZUluZGV4ID4gMVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdQdWxvdSBwYXJhIGEgdWx0aW1hIHDDoWdpbmEnKTtcbiAgICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdiYWNrd2FyZCc7XG4gICAgICAgIHJlc2V0RG9jcyA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgaXRlbXNFeHBlY3RlZEluTGFzdFBhZ2UgPVxuICAgICAgICAgIHRvdGFsSXRlbXMgLSBsYXN0UGFnZUluZGV4ICogZXZlbnRQYWdlU2l6ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaXRlbXNFeHBlY3RlZEluTGFzdFBhZ2UgPiAwICYmXG4gICAgICAgICAgaXRlbXNFeHBlY3RlZEluTGFzdFBhZ2UgPCBldmVudFBhZ2VTaXplXG4gICAgICAgICkge1xuICAgICAgICAgIG9yaWdpbmFsUGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBpdGVtc0V4cGVjdGVkSW5MYXN0UGFnZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYWdlSW5kZXggPiBwcmV2aW91c1BhZ2VJbmRleFxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdQcm9jZWRlbmRvJyk7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnZm9yd2FyZCc7XG4gICAgICAgIHJlc2V0RG9jcyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYWdlSW5kZXggPCBwcmV2aW91c1BhZ2VJbmRleFxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZXRyb2NlZGVuZG8uJyk7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnYmFja3dhcmQnO1xuICAgICAgICByZXNldERvY3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4ID09PSBwcmV2aW91c1BhZ2VJbmRleFxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZWNhcnJlZ2FuZG8uJyk7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAncmVsb2FkJztcbiAgICAgICAgcmVzZXREb2NzID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHByZXZpb3VzUGFnZUluZGV4ID09PSB1bmRlZmluZWQgJiYgcGFnZUluZGV4ID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICdFdmVudG8gaW5pY2lhbCBkbyBwYWdpbmFkb3IgcGFyYSBww6FnIDAuIG5nT25Jbml0IGNhcnJlZ291LidcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKGV2ZW50KSB0aGlzLnBhZ2VFdmVudCA9IGV2ZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0lORVNQRVJBRE8hIENvbmRpw6fDo28gZGUgbmF2ZWdhw6fDo28gbsOjbyB0cmF0YWRhOicsIGV2ZW50KTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKGV2ZW50KSB0aGlzLnBhZ2VFdmVudCA9IGV2ZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChuYXZpZ2F0aW9uRGlyZWN0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXNQYWdpbmF0ZWQobmF2aWdhdGlvbkRpcmVjdGlvbiwgcmVzZXREb2NzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvIGFvIGNhcnJlZ2FyIGl0ZW5zIHBhZ2luYWRvczonLCBlcnJvcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKG9yaWdpbmFsUGFnZVNpemUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBvcmlnaW5hbFBhZ2VTaXplO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQpIHRoaXMucGFnZUV2ZW50ID0gZXZlbnQ7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIE91dHJvcyBtw6l0b2Rvc1xuXG4gIGFwcGx5RmlsdGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAvLyBTZW0gcGFnaW5hw6fDo29cbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gU3RyaW5nKHZhbHVlKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgLy8gQ29tIHBhZ2luYcOnw6NvXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmZpbHRlclZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLmZpbHRlclN1YmplY3QubmV4dCh0aGlzLmZpbHRlclZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnb1RvRGV0YWlscyhyb3c6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGEuaXNOb3RDbGlja2FibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdXJsUGF0aCA9IHRoaXMuZGF0YS51cmwgfHwgdGhpcy5kYXRhLm5hbWU7XG4gICAgY29uc3QgdXJsID0gdGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKFxuICAgICAgdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbYC8ke3VybFBhdGh9YCwgcm93LmlkXSlcbiAgICApO1xuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UmVsYXRpb24ocGFyYW1zOiB7XG4gICAgaWQ6IGFueTtcbiAgICBjb2xsZWN0aW9uOiBzdHJpbmc7XG4gICAgbmV3UHJvcGVydHk6IHN0cmluZztcbiAgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBzbmFwc2hvdDogZmlyZXN0b3JlLkRvY3VtZW50U25hcHNob3Q8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoXG4gICAgICAgIHBhcmFtcy5pZCAhPT0gJycgJiZcbiAgICAgICAgcGFyYW1zLmlkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFyYW1zLmNvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYXJhbXMuY29sbGVjdGlvbiAhPT0gJydcbiAgICAgICkge1xuICAgICAgICBzbmFwc2hvdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICAgIHRoaXMuZmlyZXN0b3JlLmNvbGxlY3Rpb24ocGFyYW1zLmNvbGxlY3Rpb24pLmRvYyhwYXJhbXMuaWQpLmdldCgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc25hcHNob3QgJiYgc25hcHNob3QuZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBzbmFwc2hvdC5kYXRhKCkgYXMgYW55O1xuICAgICAgICByZXR1cm4gZGF0YT8uW3BhcmFtcy5uZXdQcm9wZXJ0eV0gPz8gJyc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUmVsYXRpb25zKCkge1xuICAgIGNvbnN0IHJlbGF0aW9uUHJvbWlzZXMgPSB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1uc1xuICAgICAgLmZpbHRlcigoY29sKSA9PiBjb2wucmVsYXRpb24pXG4gICAgICAuZmxhdE1hcCgoY29sKSA9PlxuICAgICAgICB0aGlzLml0ZW1zLm1hcChhc3luYyAoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChjb2wucmVsYXRpb24pIHtcbiAgICAgICAgICAgIGl0ZW1bY29sLnByb3BlcnR5XSA9IGF3YWl0IHRoaXMuZ2V0UmVsYXRpb24oe1xuICAgICAgICAgICAgICBpZDogaXRlbVtjb2wucmVsYXRpb24ucHJvcGVydHldLFxuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2wucmVsYXRpb24uY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgbmV3UHJvcGVydHk6IGNvbC5yZWxhdGlvbi5uZXdQcm9wZXJ0eSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChyZWxhdGlvblByb21pc2VzKTtcbiAgfVxuXG4gIGFzeW5jIGdldFF1ZXJ5TGVuZ3RoKHBhcmFtczoge1xuICAgIGl0ZW06IGFueTtcbiAgICByZWxhdGlvbjoge1xuICAgICAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAgICAgcHJvcGVydHk6IHN0cmluZztcbiAgICAgIG9wZXJhdG9yOiBXaGVyZUZpbHRlck9wO1xuICAgICAgdmFsdWU6IHN0cmluZztcbiAgICB9O1xuICB9KSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0aGlzLmZpcmVzdG9yZVxuICAgICAgLmNvbGxlY3Rpb24ocGFyYW1zLnJlbGF0aW9uLmNvbGxlY3Rpb24pXG4gICAgICAucmVmLndoZXJlKFxuICAgICAgICBwYXJhbXMucmVsYXRpb24ucHJvcGVydHksXG4gICAgICAgIHBhcmFtcy5yZWxhdGlvbi5vcGVyYXRvcixcbiAgICAgICAgcGFyYW1zLml0ZW1bcGFyYW1zLnJlbGF0aW9uLnZhbHVlXVxuICAgICAgKVxuICAgICAgLmdldCgpO1xuICAgIHJldHVybiBzbmFwc2hvdC5zaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUXVlcnlMZW5ndGhzKCkge1xuICAgIGNvbnN0IGxlbmd0aFByb21pc2VzID0gdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLnF1ZXJ5TGVuZ3RoKVxuICAgICAgLmZsYXRNYXAoKGNvbCkgPT5cbiAgICAgICAgdGhpcy5pdGVtcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoY29sLnF1ZXJ5TGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVtW2NvbC5wcm9wZXJ0eV0gPSBhd2FpdCB0aGlzLmdldFF1ZXJ5TGVuZ3RoKHtcbiAgICAgICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICAgICAgcmVsYXRpb246IGNvbC5xdWVyeUxlbmd0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwobGVuZ3RoUHJvbWlzZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtcygpIHtcbiAgICBpZiAodGhpcy5kYXRhLmNvbmRpdGlvbnMpIHtcbiAgICAgIHRoaXMuZGF0YS5jb25kaXRpb25zLmZvckVhY2goKGNvbmQpID0+IHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3BlcmF0b3JGdW5jdGlvbiA9ICh0aGlzLnRhYmxlU2VydmljZS5vcGVyYXRvcnMgYXMgYW55KVtcbiAgICAgICAgICAgIGNvbmQub3BlcmF0b3JcbiAgICAgICAgICBdO1xuICAgICAgICAgIGlmIChvcGVyYXRvckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gb3BlcmF0b3JGdW5jdGlvbihcbiAgICAgICAgICAgICAgaXRlbVtjb25kLmZpcmVzdG9yZVByb3BlcnR5XSxcbiAgICAgICAgICAgICAgY29uZC5kYXNoUHJvcGVydHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQXJyYW5nZUZyb21GaWx0ZXJzKCk6IEFycmFuZ2Uge1xuICAgIGNvbnN0IGFjdGl2ZUZpbHRlcnMgPSB0aGlzLmZpbHRlcnNGb3JtLmNvbnRyb2xzXG4gICAgICAuZmxhdE1hcCgoY29udHJvbCkgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlO1xuICAgICAgICBpZiAoIXNlbGVjdGVkRmlsdGVyKSByZXR1cm4gW107XG5cbiAgICAgICAgY29uc3QgYXJyYW5nZSA9IHNlbGVjdGVkRmlsdGVyLmFycmFuZ2U7XG5cbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXInKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBncm91cC5nZXQoJ3R5cGVGaWx0ZXInKT8udmFsdWU7XG4gICAgICAgICAgaWYgKCFmaWx0ZXJWYWx1ZSkgcmV0dXJuIFtdO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgIHByb3BlcnR5OiBzZWxlY3RlZEZpbHRlci5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgZmlsdGVyaW5nOiBmaWx0ZXJWYWx1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlRmlsdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJykge1xuICAgICAgICAgIGNvbnN0IGluaXRpYWwgPSBncm91cC5nZXQoJ2luaXRpYWxEYXRlJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGZpbmFsID0gZ3JvdXAuZ2V0KCdmaW5hbERhdGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGluaXRpYWwgJiYgZmluYWwpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IFtkYXlJLCBtb250aEksIHllYXJJXSA9IGluaXRpYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEl9LyR7ZGF5SX0vJHt5ZWFySX1gKTtcbiAgICAgICAgICAgICAgY29uc3QgW2RheUYsIG1vbnRoRiwgeWVhckZdID0gZmluYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgY29uc3QgZmluYWxEYXRlID0gbmV3IERhdGUoYCR7bW9udGhGfS8ke2RheUZ9LyR7eWVhckZ9YCk7XG4gICAgICAgICAgICAgIGZpbmFsRGF0ZS5zZXRIb3VycygyMywgNTksIDU5KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICAgIGluaXRpYWw6IGluaXRpYWxEYXRlLFxuICAgICAgICAgICAgICAgICAgZmluYWw6IGZpbmFsRGF0ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWRGaWx0ZXIuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJykgJiYgYXJyYW5nZSA9PT0gJ2VxdWFscycpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gZ3JvdXAuZ2V0KCdzZWxlY3RJdGVtJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZikgPT4gZiAmJiAoZi5maWx0ZXI/LmZpbHRlcmluZyAhPT0gdW5kZWZpbmVkIHx8IGYuZGF0ZUZpbHRlcikpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlcnM6IGFjdGl2ZUZpbHRlcnMsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgIH07XG4gIH1cblxuICAvLyBGaWx0cm8gZGUgZGF0YVxuICBhc3luYyBzZWFyY2goZXZlbnQ/OiBFdmVudCkge1xuICAgIC8vIFByZXZlbmlyIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBmb3JtdWzDoXJpbyBhbyBwcmVzc2lvbmFyIEVudGVyXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0U29ydC52YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0U29ydC52YWx1ZS5hcnJhbmdlID09PSAnYXNjZW5kaW5nJykge1xuICAgICAgICB0aGlzLnNvcnRCeSA9IHtcbiAgICAgICAgICBmaWVsZDogdGhpcy5zZWxlY3RTb3J0LnZhbHVlLnByb3BlcnR5LFxuICAgICAgICAgIG9yZGVyOiAnYXNjJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdFNvcnQudmFsdWUuYXJyYW5nZSA9PT0gJ2Rlc2NlbmRpbmcnKSB7XG4gICAgICAgIHRoaXMuc29ydEJ5ID0ge1xuICAgICAgICAgIGZpZWxkOiB0aGlzLnNlbGVjdFNvcnQudmFsdWUucHJvcGVydHksXG4gICAgICAgICAgb3JkZXI6ICdkZXNjJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZW0gcGFnaW5hw6fDo286IGFwbGljYXIgZmlsdHJvcyBjbGllbnQtc2lkZVxuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEF0dWFsaXphciBhcnJhbmdlIGNvbSBvcyBmaWx0cm9zIGF0aXZvc1xuICAgICAgdGhpcy5hcnJhbmdlID0gdGhpcy5idWlsZEFycmFuZ2VGcm9tRmlsdGVycygpO1xuICAgICAgdGhpcy5hcHBseUZpbHRlcnNUb0RhdGFTb3VyY2UoKTtcbiAgICAgIHRoaXMuY3VycmVudEFycmFuZ2UgPVxuICAgICAgICB0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRoaXMuZmlsdGVyc0Zvcm0uYXQoMCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPz8gJydcbiAgICAgICAgICA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb20gcGFnaW5hw6fDo286IGNvbXBvcnRhbWVudG8gb3JpZ2luYWxcbiAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zUGFnaW5hdGVkKCdyZWxvYWQnLCB0cnVlKTtcbiAgICAgIHRoaXMuY3VycmVudEFycmFuZ2UgPVxuICAgICAgICB0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRoaXMuZmlsdGVyc0Zvcm0uYXQoMCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPz8gJydcbiAgICAgICAgICA6ICcnO1xuICAgICAgdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVzZXRGaWx0ZXIoKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlciA9ICcnO1xuICAgIGlmICh0aGlzLmZpbHRlclByZWRpY2F0ZSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9IHRoaXMuZmlsdGVyUHJlZGljYXRlO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyc0Zvcm0uY2xlYXIoKTtcbiAgICB0aGlzLmFkZEZpbHRlcigpO1xuICAgIHRoaXMuc2VsZWN0U29ydC5wYXRjaFZhbHVlKCcnKTtcbiAgICB0aGlzLnNvcnRCeSA9IHtcbiAgICAgIG9yZGVyOiB0aGlzLmRhdGEuc29ydEJ5ID8gdGhpcy5kYXRhLnNvcnRCeS5vcmRlciA6ICdkZXNjJyxcbiAgICAgIGZpZWxkOiB0aGlzLmRhdGEuc29ydEJ5ID8gdGhpcy5kYXRhLnNvcnRCeS5maWVsZCA6ICdjcmVhdGVkQXQnLFxuICAgIH07XG5cbiAgICAvLyBTZW0gcGFnaW5hw6fDo286IHJlY2FycmVnYXIgaXRlbnMgb3JpZ2luYWlzXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgLy8gUmVzZXRhciBhcnJhbmdlIHBhcmEgdmFsb3JlcyBwYWRyw6NvXG4gICAgICB0aGlzLmFycmFuZ2UgPSB7XG4gICAgICAgIGZpbHRlcnM6IFtdLFxuICAgICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgICAgfTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gWy4uLnRoaXMuaXRlbXNdO1xuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgICB0aGlzLmN1cnJlbnRBcnJhbmdlID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbSBwYWdpbmHDp8OjbzogY29tcG9ydGFtZW50byBvcmlnaW5hbFxuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXNQYWdpbmF0ZWQoJ3JlbG9hZCcsIHRydWUpO1xuICAgICAgdGhpcy5jdXJyZW50QXJyYW5nZSA9ICcnO1xuICAgICAgdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTcOpdG9kbyBww7pibGljbyBwYXJhIHJlY2FycmVnYXIgYSB0YWJlbGFcbiAgYXN5bmMgcmVsb2FkVGFibGUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRJdGVtc1BhZ2luYXRlZCgncmVsb2FkJywgdHJ1ZSk7XG4gICAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXMoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEaXNwbGF5ZWRDb2x1bW5zKCkge1xuICAgIGlmICh0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2x1bW5Qcm9wZXJ0aWVzID0gdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICAgIHJldHVybiBjb2x1bW4ucHJvcGVydHk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRyb3Bkb3duSXRlbXMgPSBbXTtcbiAgICB0aGlzLnNvcnRhYmxlRHJvcGRvd25JdGVtcyA9IFtdO1xuXG4gICAgdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLmlzRmlsdGVyYWJsZSkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdmaWx0ZXInLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbC5pc1NvcnRhYmxlKSB7XG4gICAgICAgIHRoaXMuc29ydGFibGVEcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnYXNjZW5kaW5nJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogY3Jlc2NlbnRlJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ydGFibGVEcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnZGVzY2VuZGluZycsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGRlY3Jlc2NlbnRlJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY29sLmlzRmlsdGVyYWJsZUJ5RGF0ZSkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdmaWx0ZXJCeURhdGUnLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUgKyAnOiBmaWx0cm8gcG9yIGRhdGEnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucyAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMpXG4gICAgKSB7XG4gICAgICB0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PlxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7IC4uLm9wdGlvbiwgYXJyYW5nZTogJ2VxdWFscycgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaXNTdHJpbmcodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgLy8gTcOpdG9kb3MgcGFyYSBjb250cm9sZSBkbyB0b29sdGlwXG4gIG9uQ2VsbE1vdXNlRW50ZXIoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55LCBjb2w6IGFueSk6IHZvaWQge1xuICAgIC8vIFPDsyBtb3N0cmFyIHRvb2x0aXAgc2UgYSBjb2x1bmEgdGl2ZXIgY2hhckxpbWl0IGRlZmluaWRvXG4gICAgaWYgKCFjb2wuY2hhckxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFZhbHVlID0gdGhpcy5nZXREaXNwbGF5VmFsdWUoY29sLCByb3csIHRydWUpO1xuXG4gICAgLy8gU8OzIG1vc3RyYXIgdG9vbHRpcCBzZSBvIHZhbG9yIGNvbXBsZXRvIGZvciBtYWlvciBxdWUgbyBsaW1pdGVcbiAgICBpZiAoZnVsbFZhbHVlLmxlbmd0aCA8PSBjb2wuY2hhckxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ob3ZlcmVkQ2VsbCA9IHsgcm93LCBjb2wgfTtcbiAgICB0aGlzLnRvb2x0aXBDb250ZW50ID0gZnVsbFZhbHVlO1xuXG4gICAgLy8gRGVmaW5pciBwb3Npw6fDo28gZG8gdG9vbHRpcFxuICAgIHRoaXMudG9vbHRpcFBvc2l0aW9uID0ge1xuICAgICAgeDogZXZlbnQuY2xpZW50WCArIDEwLFxuICAgICAgeTogZXZlbnQuY2xpZW50WSAtIDEwLFxuICAgIH07XG5cbiAgICAvLyBUaW1lb3V0IHBhcmEgbW9zdHJhciBvIHRvb2x0aXBcbiAgICB0aGlzLnRvb2x0aXBUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaG92ZXJlZENlbGwgJiZcbiAgICAgICAgdGhpcy5ob3ZlcmVkQ2VsbC5yb3cgPT09IHJvdyAmJlxuICAgICAgICB0aGlzLmhvdmVyZWRDZWxsLmNvbCA9PT0gY29sXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zaG93VG9vbHRpcCA9IHRydWU7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIG9uQ2VsbE1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICAgIHRoaXMudG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1Rvb2x0aXAgPSBmYWxzZTtcbiAgICB0aGlzLmhvdmVyZWRDZWxsID0gbnVsbDtcbiAgICB0aGlzLnRvb2x0aXBDb250ZW50ID0gJyc7XG4gIH1cblxuICBvbkNlbGxNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93VG9vbHRpcCkge1xuICAgICAgdGhpcy50b29sdGlwUG9zaXRpb24gPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggKyAxMCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIDEwLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBNw6l0b2RvcyBwYXJhIGludmVyc8OjbyB2ZXJ0aWNhbCBkb3MgdGFic1xuICBnZXRUYWJHcm91cHModGFiczogYW55W10pOiBudW1iZXJbXSB7XG4gICAgaWYgKCF0YWJzIHx8IHRhYnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCB0b3RhbEdyb3VwcyA9IE1hdGguY2VpbCh0YWJzLmxlbmd0aCAvIDYpO1xuICAgIGNvbnN0IGdyb3VwczogbnVtYmVyW10gPSBbXTtcblxuICAgIC8vIENyaWFyIGFycmF5IGRlIMOtbmRpY2VzIGludmVydGlkb3MgKMO6bHRpbW8gZ3J1cG8gcHJpbWVpcm8pXG4gICAgZm9yIChsZXQgaSA9IHRvdGFsR3JvdXBzIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGdyb3Vwcy5wdXNoKGkpO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICBnZXRUYWJHcm91cCh0YWJzOiBhbnlbXSwgZ3JvdXBJbmRleDogbnVtYmVyKTogYW55W10ge1xuICAgIGlmICghdGFicyB8fCB0YWJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGdyb3VwSW5kZXggKiA2O1xuICAgIGNvbnN0IGVuZEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCArIDYsIHRhYnMubGVuZ3RoKTtcblxuICAgIHJldHVybiB0YWJzLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgfVxuXG4gIGdldFJlYWxUYWJJbmRleChncm91cEluZGV4OiBudW1iZXIsIHRhYkluZGV4SW5Hcm91cDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuZGF0YS50YWJzPy50YWJzRGF0YSkgcmV0dXJuIDA7XG4gICAgY29uc3QgdG90YWxHcm91cHMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLnRhYnMudGFic0RhdGEubGVuZ3RoIC8gNik7XG4gICAgY29uc3QgcmVhbEdyb3VwSW5kZXggPSB0b3RhbEdyb3VwcyAtIDEgLSBncm91cEluZGV4O1xuICAgIHJldHVybiByZWFsR3JvdXBJbmRleCAqIDYgKyB0YWJJbmRleEluR3JvdXA7XG4gIH1cblxuICBvblRhYmxlU2VsZWN0ZWQoaTogbnVtYmVyLCBqOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuZGF0YS50YWJzPy50YWJzRGF0YSB8fCAhdGhpcy5kYXRhLnRhYnMubWV0aG9kKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3RlZFRhYiA9IHRoaXMuZ2V0UmVhbFRhYkluZGV4KGksIGopO1xuICAgIGNvbnN0IHRhYiA9IHRoaXMuZGF0YS50YWJzLnRhYnNEYXRhW3RoaXMuc2VsZWN0ZWRUYWJdO1xuICAgIGlmICh0YWIpIHtcbiAgICAgIHRoaXMuZGF0YS50YWJzLm1ldGhvZCh0YWIsIHRoaXMuc2VsZWN0ZWRUYWIpO1xuICAgIH1cbiAgfVxuXG4gIGlzVGFiU2VsZWN0ZWQob3JpZ2luYWxJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWIgPT09IG9yaWdpbmFsSW5kZXg7XG4gIH1cblxuICBzaG91bGRTaG93QWN0aW9uQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kYXRhPy5hY3Rpb25CdXR0b24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGF0YS5hY3Rpb25CdXR0b24uY29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YS5hY3Rpb25CdXR0b24uY29uZGl0aW9uKG51bGwpID8/IHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBNw6l0b2RvIHBhcmEgbGlkYXIgY29tIGRvd25sb2FkIChkaWZlcmVudGUgcGFyYSBwYWdpbmFkbyBlIG7Do28gcGFnaW5hZG8pXG4gIGhhbmRsZURvd25sb2FkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kb3dubG9hZFRhYmxlKSByZXR1cm47XG5cbiAgICAvLyBTZSBuw6NvIGjDoSBwYWdpbmHDp8OjbywgdXNhciBkYWRvcyBmaWx0cmFkb3MgZG8gZGF0YVNvdXJjZVxuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEF0dWFsaXphciBmaWx0ZXJlZEl0ZW1zIGNvbSBvcyBkYWRvcyBmaWx0cmFkb3MgZG8gZGF0YVNvdXJjZVxuICAgICAgLy8gKHF1ZSBqw6EgaW5jbHVpIGZpbHRybyBkZSB0ZXh0byBhcGxpY2FkbyB2aWEgZmlsdGVyUHJlZGljYXRlKVxuICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZSAmJiB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyZWREYXRhKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFsuLi50aGlzLmRhdGFTb3VyY2UuZmlsdGVyZWREYXRhXTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29uc3RydWlyIGFycmFuZ2UgY29tIG9zIGZpbHRyb3MgYXRpdm9zIChzZSBob3V2ZXIpXG4gICAgICBjb25zdCBhcnJhbmdlID0gdGhpcy5idWlsZEFycmFuZ2VGcm9tRmlsdGVycygpO1xuICAgICAgdGhpcy5kb3dubG9hZFRhYmxlKGFycmFuZ2UsIHRoaXMuZGF0YS5jb25kaXRpb25zIHx8IFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTW9kbyBwYWdpbmFkbzogdXNhciBhcnJhbmdlIGV4aXN0ZW50ZSAoY29tcG9ydGFtZW50byBvcmlnaW5hbClcbiAgICAgIGlmICh0aGlzLmFycmFuZ2UpIHtcbiAgICAgICAgdGhpcy5kb3dubG9hZFRhYmxlKHRoaXMuYXJyYW5nZSwgdGhpcy5kYXRhLmNvbmRpdGlvbnMgfHwgW10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImRhdGFcIiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTZcIj5cbiAgICA8IS0tIFVOSUZJRUQgQ09OVFJPTCBQQU5FTDogRklMVEVSUywgU09SVCAmIEFDVElPTlMgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyb3VuZGVkLXhsIGJvcmRlciBib3JkZXItZ3JheS0yMDAgYmctd2hpdGUgcC00IHNoYWRvdy1sZ1wiXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBkYXRhLnBhZ2luYXRpb24gPT09IHRydWUgJiZcbiAgICAgICAgKGRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHNvcnRhYmxlRHJvcGRvd25JdGVtcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgZGF0YS5hY3Rpb25CdXR0b24pXG4gICAgICBcIlxuICAgID5cbiAgICAgIDwhLS0gUEFORUwgSEVBREVSOiBUaXRsZSwgQ3VzdG9tIEFjdGlvbiwgYW5kIEdsb2JhbCBBY3Rpb25zIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm1iLTQgZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLWItMiBib3JkZXItZ3JheS0yMDAgcGItNCBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXJcIlxuICAgICAgPlxuICAgICAgICA8IS0tIExlZnQgU2lkZTogVGl0bGUgJiBNYWluIEFjdGlvbiBCdXR0b24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsdGVyIHRleHQteGwgdGV4dC1ibHVlLTUwMFwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtZ3JheS03MDBcIlxuICAgICAgICAgICAgICA+RmlsdHJvcyBlIEHDp8O1ZXM8L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImRhdGEuYWN0aW9uQnV0dG9uICYmIGRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvblwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgKGRhdGEuYWN0aW9uQnV0dG9uLmNvbG9yQ2xhc3MgfHwgJ2JnLWJsdWUtNTAwJykgK1xuICAgICAgICAgICAgICAnIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgcHgtNCBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSBob3ZlcjpvcGFjaXR5LTcwJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cImRhdGEuYWN0aW9uQnV0dG9uLnJvdXRlckxpbmtcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QgPyBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QoJGV2ZW50KSA6IG51bGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmFjdGlvbkJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImRhdGEuYWN0aW9uQnV0dG9uLmljb25cIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIHt7IGRhdGEuYWN0aW9uQnV0dG9uLmxhYmVsIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUmlnaHQgU2lkZTogU2VhcmNoLCBSZXNldCwgRXhwb3J0IC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIHRoaXMuaGFzRmlsdGVyYWJsZUNvbHVtbiA9PT0gdHJ1ZSB8fCB0aGlzLmhhc1NvcnRhYmxlQ29sdW1uID09PSB0cnVlXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2goKVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1ncmVlbi02MDAgcHgtNSBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmVlbi03MDBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFwbGljYXIgZmlsdHJvc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2hcIj48L2k+XG4gICAgICAgICAgICBQZXNxdWlzYXJcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcigpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1yZWQtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctcmVkLTYwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTGltcGFyIGZpbHRyb3NcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXJlZG8tYWx0XCI+PC9pPlxuICAgICAgICAgICAgUmVzZXRhclxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmRvd25sb2FkICE9PSBmYWxzZSAmJiBkb3dubG9hZFRhYmxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1vcmFuZ2UtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6Ymctb3JhbmdlLTYwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiRXhwb3J0YXIgVGFiZWxhXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlICYmIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGEubGVuZ3RoIDw9IDBcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICRhbnkoYXJyYW5nZSkgJiYgZG93bmxvYWRUYWJsZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBkb3dubG9hZFRhYmxlKCRhbnkoYXJyYW5nZSksIGRhdGEuY29uZGl0aW9ucyB8fCBbXSlcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgIEV4cG9ydGFyXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRklMVEVSUyBDT05URU5UIChXSVRIIFJFRklORU1FTlRTKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi00IHNwYWNlLXktM1wiICpuZ0lmPVwiZmlsdGVyc0Zvcm0uY29udHJvbHMubGVuZ3RoID4gMFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgW2Zvcm1Hcm91cF09XCIkYW55KGZpbHRlckdyb3VwKVwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGZpbHRlckdyb3VwIG9mIGZpbHRlcnNGb3JtLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtMyByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcC0yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gRklMVEVSIFRZUEUgU0VMRUNUT1IgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCIgKm5nSWY9XCJkcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+VGlwbyBkZSBmaWx0cm88L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZSBvIHRpcG8uLi5cIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdEZpbHRlclwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdEZpbHRlckNoYW5nZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRBdmFpbGFibGVGaWx0ZXJPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJpdGVtLmljb24gfHwgJ2ZhIGZhLWZpbHRlcidcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWJsdWUtNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVEVYVCBGSUxURVIgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy1bMjAwcHhdIGZsZXgtMVwiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZT8uYXJyYW5nZSA9PT0gJ2ZpbHRlcidcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2ggdGV4dC1ncmF5LTQwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KFwic2VsZWN0RmlsdGVyXCIpPy52YWx1ZT8udGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgICAgXCJGaWx0cmFyXCJcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZUZpbHRlclwiXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkRpZ2l0ZSBwYXJhIGZpbHRyYXIuLi5cIlxuICAgICAgICAgICAgICAgICNpbnB1dFxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRFJPUERPV04gRklMVEVSIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWUgJiZcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cClcbiAgICAgICAgICAgICAgICAuZ2V0KCdzZWxlY3RGaWx0ZXInKVxuICAgICAgICAgICAgICAgID8udmFsdWUuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJylcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e1xuICAgICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldChcInNlbGVjdEZpbHRlclwiKT8udmFsdWU/LnRpdGxlIHx8XG4gICAgICAgICAgICAgICAgICBcIlNlbGVjaW9uZVwiXG4gICAgICAgICAgICAgIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUuLi5cIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdEl0ZW1cIlxuICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtIG9mICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgLml0ZW1zXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIERBVEUgRklMVEVSIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibWluLXctWzM0MHB4XSBmbGV4LWF1dG9cIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPT09XG4gICAgICAgICAgICAgICdmaWx0ZXJCeURhdGUnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLXN0cmV0Y2ggZ2FwLTMgc206ZmxleC1yb3cgc206aXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgdGV4dC1ncmF5LTQwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkRhdGEgSW5pY2lhbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpbml0aWFsRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbZHJvcFNwZWNpYWxDaGFyYWN0ZXJzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIG1hc2s9XCJkMC9NMC8wMDAwXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiREQvTU0vQUFBQVwiXG4gICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciB0ZXh0LWdyYXktNDAwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RGF0YSBGaW5hbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaW5hbERhdGVcIlxuICAgICAgICAgICAgICAgICAgW2Ryb3BTcGVjaWFsQ2hhcmFjdGVyc109XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBtYXNrPVwiZDAvTTAvMDAwMFwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkREL01NL0FBQUFcIlxuICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gUkVNT1ZFIEZJTFRFUiBCVVRUT04gLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcnNGb3JtLmxlbmd0aCA+IDFcIiBjbGFzcz1cIm1sLWF1dG8gZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGkpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtMTAgdy0xMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1mdWxsIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTMwMCBob3ZlcjpiZy1yZWQtMTAwXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlJlbW92ZXIgZmlsdHJvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaCB0ZXh0LXJlZC01MDAgaG92ZXI6dGV4dC1yZWQtNjAwXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUEFORUwgRk9PVEVSOiBBZGQgRmlsdGVyICYgU29ydCAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCItbWItMiBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwIHB0LTQgc206ZmxleC1yb3dcIlxuICAgICAgPlxuICAgICAgICA8IS0tIEFkZCBGaWx0ZXIgQnV0dG9uIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcGRvd25JdGVtcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEZpbHRlcigpXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHJhbnNmb3JtIHJvdW5kZWQtZnVsbCBib3JkZXItMiBib3JkZXItYmx1ZS0zMDAgYmctYmx1ZS01MCBweC02IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWJsdWUtNjAwIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTMwMCBob3ZlcjotdHJhbnNsYXRlLXktMC41IGhvdmVyOmJvcmRlci1ibHVlLTQwMCBob3ZlcjpiZy1ibHVlLTEwMCBob3ZlcjpzaGFkb3ctbWRcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFkaWNpb25hciBub3ZvIGZpbHRyb1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzIG1yLTJcIj48L2k+XG4gICAgICAgICAgICBBZGljaW9uYXIgRmlsdHJvXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU29ydCBEcm9wZG93biAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidy1mdWxsIHNtOnctYXV0byBzbTptaW4tdy1bMjUwcHhdXCJcbiAgICAgICAgICAqbmdJZj1cInNvcnRhYmxlRHJvcGRvd25JdGVtcy5sZW5ndGggPiAwXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPk9yZGVuYXIgcG9yPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZS4uLlwiIFtmb3JtQ29udHJvbF09XCJzZWxlY3RTb3J0XCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc29ydGFibGVEcm9wZG93bkl0ZW1zXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc29ydC1hbHBoYS1kb3duIHRleHQtY3lhbi02MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU0lNUExFIFNFQVJDSCAoZm9yIG5vbi1wYWdpbmF0ZWQgdGFibGVzKSAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBiZy13aGl0ZSBwLTQgc2hhZG93LWxnXCJcbiAgICAgICpuZ0lmPVwiZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSAmJiBoYXNGaWx0ZXJhYmxlQ29sdW1uID09PSB0cnVlXCJcbiAgICA+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaCB0ZXh0LWJsdWUtNTAwXCI+PC9pPlxuICAgICAgICAgIEJ1c2NhclxuICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIChrZXl1cCk9XCJhcHBseUZpbHRlcihmaWx0ZXJJbnB1dC52YWx1ZSlcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGlnaXRlIHBhcmEgZmlsdHJhci4uLlwiXG4gICAgICAgICAgI2ZpbHRlcklucHV0XG4gICAgICAgIC8+XG4gICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggY2xhc3M9XCJ0ZXh0LWdyYXktNTAwXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZGF0YS5hY3Rpb25CdXR0b25cIlxuICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAoZGF0YS5hY3Rpb25CdXR0b24uY29sb3JDbGFzcyB8fCAnYmctYmx1ZS01MDAnKSArXG4gICAgICAgICAgJyBmbG9hdC1yaWdodCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgaG92ZXI6b3BhY2l0eS03MCdcbiAgICAgICAgXCJcbiAgICAgICAgW3JvdXRlckxpbmtdPVwiZGF0YS5hY3Rpb25CdXR0b24ucm91dGVyTGlua1wiXG4gICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QgPyBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QoJGV2ZW50KSA6IG51bGxcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGkgKm5nSWY9XCJkYXRhLmFjdGlvbkJ1dHRvbi5pY29uXCIgW2NsYXNzXT1cImRhdGEuYWN0aW9uQnV0dG9uLmljb25cIj48L2k+XG4gICAgICAgIHt7IGRhdGEuYWN0aW9uQnV0dG9uLmxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRklMVEVSUyBQQU5FTCAoZm9yIG5vbi1wYWdpbmF0ZWQgdGFibGVzKSAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBiZy13aGl0ZSBwLTQgc2hhZG93LWxnXCJcbiAgICAgICpuZ0lmPVwiZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSAmJiBkcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIlxuICAgID5cbiAgICAgIDwhLS0gRklMVEVSUyBDT05URU5UIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgc3BhY2UteS0zXCIgKm5nSWY9XCJmaWx0ZXJzRm9ybS5jb250cm9scy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbZm9ybUdyb3VwXT1cIiRhbnkoZmlsdGVyR3JvdXApXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZmlsdGVyR3JvdXAgb2YgZmlsdGVyc0Zvcm0uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC0zIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBwLTJcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBGSUxURVIgVFlQRSBTRUxFQ1RPUiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIiAqbmdJZj1cImRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5UaXBvIGRlIGZpbHRybzwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lIG8gdGlwby4uLlwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0RmlsdGVyXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0RmlsdGVyQ2hhbmdlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldEF2YWlsYWJsZUZpbHRlck9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIml0ZW0uaWNvbiB8fCAnZmEgZmEtZmlsdGVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtYmx1ZS01MDBcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBURVhUIEZJTFRFUiAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlPy5hcnJhbmdlID09PSAnZmlsdGVyJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaCB0ZXh0LWdyYXktNDAwXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoXCJzZWxlY3RGaWx0ZXJcIik/LnZhbHVlPy50aXRsZSB8fFxuICAgICAgICAgICAgICAgICAgICBcIkZpbHRyYXJcIlxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlRmlsdGVyXCJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGlnaXRlIHBhcmEgZmlsdHJhci4uLlwiXG4gICAgICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBEUk9QRE9XTiBGSUxURVIgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy1bMjAwcHhdIGZsZXgtMVwiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZSAmJlxuICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKVxuICAgICAgICAgICAgICAgIC5nZXQoJ3NlbGVjdEZpbHRlcicpXG4gICAgICAgICAgICAgICAgPy52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7XG4gICAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KFwic2VsZWN0RmlsdGVyXCIpPy52YWx1ZT8udGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgIFwiU2VsZWNpb25lXCJcbiAgICAgICAgICAgICAgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZS4uLlwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0SXRlbVwiXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gb2YgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAuaXRlbXNcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gREFURSBGSUxURVIgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy1bMzQwcHhdIGZsZXgtYXV0b1wiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZT8uYXJyYW5nZSA9PT1cbiAgICAgICAgICAgICAgJ2ZpbHRlckJ5RGF0ZSdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtc3RyZXRjaCBnYXAtMyBzbTpmbGV4LXJvdyBzbTppdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciB0ZXh0LWdyYXktNDAwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RGF0YSBJbmljaWFsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uRGF0ZUZpbHRlckNoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImluaXRpYWxEYXRlXCJcbiAgICAgICAgICAgICAgICAgIFtkcm9wU3BlY2lhbENoYXJhY3RlcnNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgbWFzaz1cImQwL00wLzAwMDBcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJERC9NTS9BQUFBXCJcbiAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIHRleHQtZ3JheS00MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5EYXRhIEZpbmFsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25EYXRlRmlsdGVyQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpbmFsRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBbZHJvcFNwZWNpYWxDaGFyYWN0ZXJzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIG1hc2s9XCJkMC9NMC8wMDAwXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiREQvTU0vQUFBQVwiXG4gICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSRU1PVkUgRklMVEVSIEJVVFRPTiAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyc0Zvcm0ubGVuZ3RoID4gMVwiIGNsYXNzPVwibWwtYXV0byBmbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoaSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC0xMCB3LTEwIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgdHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMzAwIGhvdmVyOmJnLXJlZC0xMDBcIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiUmVtb3ZlciBmaWx0cm9cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoIHRleHQtcmVkLTUwMCBob3Zlcjp0ZXh0LXJlZC02MDBcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQQU5FTCBGT09URVI6IEFkZCBGaWx0ZXIgJiBBY3Rpb25zIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIi1tYi0yIGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtNCBib3JkZXItdCBib3JkZXItZ3JheS0yMDAgcHQtNCBzbTpmbGV4LXJvd1wiXG4gICAgICA+XG4gICAgICAgIDwhLS0gQWRkIEZpbHRlciBCdXR0b24gLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJkcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkRmlsdGVyKClcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0cmFuc2Zvcm0gcm91bmRlZC1mdWxsIGJvcmRlci0yIGJvcmRlci1ibHVlLTMwMCBiZy1ibHVlLTUwIHB4LTYgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtYmx1ZS02MDAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMzAwIGhvdmVyOi10cmFuc2xhdGUteS0wLjUgaG92ZXI6Ym9yZGVyLWJsdWUtNDAwIGhvdmVyOmJnLWJsdWUtMTAwIGhvdmVyOnNoYWRvdy1tZFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiQWRpY2lvbmFyIG5vdm8gZmlsdHJvXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMgbXItMlwiPjwvaT5cbiAgICAgICAgICAgIEFkaWNpb25hciBGaWx0cm9cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaCgpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIGJnLWdyZWVuLTYwMCBweC01IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyZWVuLTcwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiQXBsaWNhciBmaWx0cm9zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaFwiPjwvaT5cbiAgICAgICAgICAgIEFwbGljYXJcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcigpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1yZWQtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctcmVkLTYwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTGltcGFyIGZpbHRyb3NcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXJlZG8tYWx0XCI+PC9pPlxuICAgICAgICAgICAgUmVzZXRhclxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmRvd25sb2FkICE9PSBmYWxzZSAmJiBkb3dubG9hZFRhYmxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1vcmFuZ2UtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6Ymctb3JhbmdlLTYwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiRXhwb3J0YXIgVGFiZWxhXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlICYmIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGEubGVuZ3RoIDw9IDBcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRG93bmxvYWQoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgIEV4cG9ydGFyXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm14LWF1dG8gZmxleCBmbGV4LWNvbFwiXG4gICAgICAgICpuZ0lmPVwiZGF0YS50YWJzICYmIGRhdGEudGFicy50YWJzRGF0YSAmJiBkYXRhLnRhYnMudGFic0RhdGEubGVuZ3RoID4gMFwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gQ2FsY3VsYXIgcXVhbnRvcyBncnVwb3MgZGUgNiB0YWJzIGV4aXN0ZW0gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCBncm91cEluZGV4IG9mIGdldFRhYkdyb3VwcyhkYXRhLnRhYnMudGFic0RhdGEpO1xuICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtYXV0byBmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgIGxldCB0YWIgb2YgZ2V0VGFiR3JvdXAoZGF0YS50YWJzLnRhYnNEYXRhLCBncm91cEluZGV4KTtcbiAgICAgICAgICAgICAgICBsZXQgaiA9IGluZGV4XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlci0yIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTIwMCBweC00IHB5LTIgZm9udC1tZWRpdW0gdHJhbnNpdGlvbiBob3ZlcjpicmlnaHRuZXNzLTk1XCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgIGlzVGFiU2VsZWN0ZWQoZ2V0UmVhbFRhYkluZGV4KGksIGopKVxuICAgICAgICAgICAgICAgICAgICA/ICdib3JkZXItYi0wIGJyaWdodG5lc3MtMTEwJ1xuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25UYWJsZVNlbGVjdGVkKGksIGopXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRhYi5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInRhYi5jb3VudGVyICE9PSB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtbC0yIHRleHQteHMgZm9udC1ib2xkXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInRhYi5jb3VudGVyQ2xhc3NcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IHRhYi5jb3VudGVyIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejggdy1mdWxsIG92ZXJmbG93LXgtYXV0byByb3VuZGVkLXhsXCI+XG4gICAgICAgIDx0YWJsZVxuICAgICAgICAgIG1hdC10YWJsZVxuICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgICAgICAgIG1hdFNvcnRcbiAgICAgICAgICAjc29ydD1cIm1hdFNvcnRcIlxuICAgICAgICAgIG1hdFNvcnRBY3RpdmU9XCJjcmVhdGVkQXRcIlxuICAgICAgICAgIG1hdFNvcnREaXJlY3Rpb249XCJkZXNjXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgZGF0YS5kaXNwbGF5ZWRDb2x1bW5zXCJcbiAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cInt7IGNvbC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgICAgPCEtLSBJRiBUSEUgQ09MVU1OIElTIE5PVCBTT1JUQUJMRSwgVEhFTiBET04nVCBTSE9XIFRIRSBTT1JUIEJVVFRPTlMgLS0+XG4gICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbC5pc1NvcnRhYmxlIHx8IGRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgICAgICAoZGF0YS5jb2xvcj8uYmcgPyAnICcgKyAkYW55KGRhdGEuY29sb3IpLmJnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChkYXRhLmNvbG9yPy50ZXh0ID8gJyAnICsgJGFueShkYXRhLmNvbG9yKS50ZXh0IDogJycpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGNvbC50aXRsZSB9fVxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8IS0tIElGIFRIRSBDT0xVTU4gSVMgU09SVEFCTEUsIFRIRU4gU0hPVyBUSEUgU09SVCBCVVRUT05TIC0tPlxuICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5pc1NvcnRhYmxlICYmIGRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgICAgIG1hdC1zb3J0LWhlYWRlclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgKGRhdGEuY29sb3I/LmJnID8gJyAnICsgJGFueShkYXRhLmNvbG9yKS5iZyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoZGF0YS5jb2xvcj8udGV4dCA/ICcgJyArICRhbnkoZGF0YS5jb2xvcikudGV4dCA6ICcnKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBjb2wudGl0bGUgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wubWV0aG9kID8gY29sLm1ldGhvZChyb3cpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25DZWxsTW91c2VFbnRlcigkZXZlbnQsIHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25DZWxsTW91c2VMZWF2ZSgpXCJcbiAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uQ2VsbE1vdXNlTW92ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgSUYgVEhFIENPTFVNTiBNVVNUIEJFIERJU1BMQVlFRCAtLT5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjb2wuaW1hZ2UgJiYgIWNvbC5pY29uQ2xhc3MgJiYgIWNvbC5tZXRob2RcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5jaGFyTGltaXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5wcm9wZXJ0eV0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5wcm9wZXJ0eV0ubGVuZ3RoID4gY29sLmNoYXJMaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugd2l0aGluTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgPT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwicm93W2NvbC5wcm9wZXJ0eV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoY29sLCByb3cpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5oYXNMaW5rICYmIGlzU3RyaW5nKGNvbC5oYXNMaW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJjb2wuaGFzTGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldERpc3BsYXlWYWx1ZShjb2wsIHJvdykgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgIT09IHRydWUgJiYgIWlzU3RyaW5nKGNvbC5oYXNMaW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3dpdGhpbkxpbWl0PlxuICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgPT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cInJvd1tjb2wucHJvcGVydHldXCJcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93LCB0cnVlKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayAmJiBpc1N0cmluZyhjb2wuaGFzTGluaylcIlxuICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cImNvbC5oYXNMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93LCB0cnVlKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayAhPT0gdHJ1ZSAmJiAhaXNTdHJpbmcoY29sLmhhc0xpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGdldERpc3BsYXlWYWx1ZShjb2wsIHJvdywgdHJ1ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tIElNQUdFIC0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjb2wuaW1hZ2UgJiYgY29sLmltYWdlLnBhdGggJiYgIWNvbC5pY29uQ2xhc3MgJiYgIWNvbC5tZXRob2RcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cImNvbC5pbWFnZS5wYXRoICsgJy8nICsgcm93W2NvbC5wcm9wZXJ0eV1cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sLmltYWdlLmNsYXNzXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIkltYWdlbVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjb2wuaW1hZ2UgJiYgY29sLmltYWdlLnVybCAmJiAhY29sLmljb25DbGFzcyAmJiAhY29sLm1ldGhvZFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwicm93W2NvbC5wcm9wZXJ0eV1cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sLmltYWdlLmNsYXNzXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIkltYWdlbVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmljb25DbGFzc1wiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaWNvbkNsYXNzIG9mIGNvbC5pY29uQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzLmJ1dHRvbk1ldGhvZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBpY29uQ2xhc3MuYnV0dG9uTWV0aG9kKHJvdywgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpY29uQ2xhc3MuY2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3MuY29uZGl0aW9uID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChpY29uQ2xhc3MuY29uZGl0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGFueShpY29uQ2xhc3MuY29uZGl0aW9uKShyb3cpKVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPnt7IGljb25DbGFzcy50ZXh0IH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtblByb3BlcnRpZXNcIj48L3RyPlxuICAgICAgICAgIDx0clxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnZXhhbXBsZS1lbGVtZW50LXJvdyc6IGRhdGEuaXNOb3RDbGlja2FibGUgPT09IHRydWUsXG4gICAgICAgICAgICAgICdleGFtcGxlLWVsZW1lbnQtcm93IGN1cnNvci1wb2ludGVyJzogIWRhdGEuaXNOb3RDbGlja2FibGVcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgbWF0LXJvd1xuICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtblByb3BlcnRpZXNcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9EZXRhaWxzKHJvdylcIlxuICAgICAgICAgID48L3RyPlxuXG4gICAgICAgICAgPCEtLSBST1cgU0hPV04gV0hFTiBUSEVSRSBJUyBOTyBNQVRDSElORyBEQVRBLiAtLT5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJtYXQtcm93XCIgKm1hdE5vRGF0YVJvdz5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiFpc0xvYWRpbmdcIiBjbGFzcz1cIm1hdC1jZWxsIHAtNFwiIGNvbHNwYW49XCI0XCI+XG4gICAgICAgICAgICAgIE5lbmh1bSByZXN1bHRhZG8gZW5jb250cmFkbyBwYXJhIGEgYnVzY2FcbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90YWJsZT5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlclwiICpuZ0lmPVwiaXNMb2FkaW5nXCI+XG4gICAgICAgICAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYWdpbmF0b3ItY29udGFpbmVyXCI+XG4gICAgICAgICAgPG1hdC1wYWdpbmF0b3JcbiAgICAgICAgICAgICNwYWdpbmF0b3JcbiAgICAgICAgICAgIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzI1LCA1MCwgMTAwXVwiXG4gICAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxuICAgICAgICAgICAgW2xlbmd0aF09XCJ0b3RhbEl0ZW1zXCJcbiAgICAgICAgICAgIHNob3dGaXJzdExhc3RCdXR0b25zXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VsZWN0IHBhZ2Ugb2YgcGVyaW9kaWMgZWxlbWVudHNcIlxuICAgICAgICAgICAgKHBhZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnaGlkZS1sZW5ndGgnOlxuICAgICAgICAgICAgICAgIFsnZmlsdGVyJywgJ2ZpbHRlckJ5RGF0ZScsICdlcXVhbHMnXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEFycmFuZ2VcbiAgICAgICAgICAgICAgICApIHx8IHRoaXMuZGF0YS5maWx0ZXJGbixcbiAgICAgICAgICAgICAgJ2hpZGUtbmV4dC1idXR0b24nOiAhaGFzTmV4dFBhZ2UgJiYgZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlLFxuICAgICAgICAgICAgICAnaGlkZS1sYXN0LWJ1dHRvbic6XG4gICAgICAgICAgICAgICAgKCFoYXNOZXh0UGFnZSAmJiBkYXRhLnBhZ2luYXRpb24gPT09IHRydWUpIHx8IHRoaXMuZGF0YS5maWx0ZXJGblxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvbWF0LXBhZ2luYXRvcj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAhaXNMb2FkaW5nICYmXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2U/LmRhdGEgJiZcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgZGF0YT8uZmlsdGVyRm5cbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2UtbnVtYmVyLWRpc3BsYXlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGN1cnJlbnRQYWdlTnVtYmVyIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gVE9PTFRJUCBQRVJTT05BTElaQURPIC0tPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJzaG93VG9vbHRpcFwiXG4gICAgY2xhc3M9XCJmaXhlZCB6LTUwIG1heC13LW1kIGJyZWFrLXdvcmRzIHJvdW5kZWQtbGcgYmctZ3JheS04MDAgcHgtMyBweS0yIHRleHQtc20gdGV4dC13aGl0ZSBzaGFkb3ctbGdcIlxuICAgIFtzdHlsZS5sZWZ0LnB4XT1cInRvb2x0aXBQb3NpdGlvbi54XCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInRvb2x0aXBQb3NpdGlvbi55XCJcbiAgICBbc3R5bGUucG9pbnRlci1ldmVudHNdPVwiJ25vbmUnXCJcbiAgPlxuICAgIHt7IHRvb2x0aXBDb250ZW50IH19XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
1149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZmlyZWJhc2UtdGFibGUta3hwL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1maXJlYmFzZS10YWJsZS1reHAvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLFNBQVMsR0FLVixNQUFNLGVBQWUsQ0FBQztBQUt2QixPQUFPLEVBQUUsWUFBWSxFQUFhLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzdELE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUs3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPbkUsTUFBTSxPQUFPLGNBQWM7SUFxRHpCLGNBQWM7SUFDZCxZQUNVLE1BQWMsRUFDZCxZQUEwQixFQUMxQixTQUEyQixFQUMzQixFQUFjO1FBSGQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLE9BQUUsR0FBRixFQUFFLENBQVk7UUF0RHhCLFlBQU8sR0FBbUIsSUFBSSxDQUFDO1FBRy9CLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUN0QiwyQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFFcEIsVUFBSyxHQUFV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O1lBQy9ELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRTtnQkFDbkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUN4RDtZQUVELHNEQUFzRDtZQUN0RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUN6RDthQUFNO1lBQ0wsaUVBQWlFO1lBQ2pFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQzlEO1NBQ0Y7SUFDSCxDQUFDOzs0R0F4ekNVLGNBQWM7Z0dBQWQsY0FBYyxzSkEyQ2QsWUFBWSx1RUFDWixPQUFPLHFFQzVFcEIsNHI1QkE2dkJBOzRGRDd0QmEsY0FBYztrQkFMMUIsU0FBUzsrQkFDRSxXQUFXO2dMQU1aLElBQUk7c0JBQVosS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQXdDbUIsU0FBUztzQkFBakMsU0FBUzt1QkFBQyxZQUFZO2dCQUNILElBQUk7c0JBQXZCLFNBQVM7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFycmFuZ2UsIENvbmRpdGlvbiwgVGFiLCBUYWJEYXRhLCBUYWJsZURhdGEgfSBmcm9tICcuLi8uLi90eXBlcy9UYWJsZSc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBFbGVtZW50UmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFuZ3VsYXJGaXJlc3RvcmUsXG4gIFF1ZXJ5RG9jdW1lbnRTbmFwc2hvdCxcbn0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9jb21wYXQvZmlyZXN0b3JlJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcbmltcG9ydCB7IE1hdFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlyc3RWYWx1ZUZyb20sIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9yZGVyQnlEaXJlY3Rpb24gfSBmcm9tICdmaXJlYmFzZS9maXJlc3RvcmUnO1xuaW1wb3J0IGZpcmViYXNlIGZyb20gJ2ZpcmViYXNlL2NvbXBhdCc7XG5pbXBvcnQgV2hlcmVGaWx0ZXJPcCA9IGZpcmViYXNlLmZpcmVzdG9yZS5XaGVyZUZpbHRlck9wO1xuaW1wb3J0IGZpcmVzdG9yZSA9IGZpcmViYXNlLmZpcmVzdG9yZTtcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIC8vIElOUFVUU1xuICBASW5wdXQoKSBkYXRhITogVGFibGVEYXRhO1xuICBASW5wdXQoKSBkb3dubG9hZFRhYmxlPzogKGFycmFuZ2U6IEFycmFuZ2UsIGNvbmRpdGlvbnM6IENvbmRpdGlvbltdKSA9PiB2b2lkO1xuICBhcnJhbmdlOiBBcnJhbmdlIHwgbnVsbCA9IG51bGw7XG4gIC8vIFZBUklBQkxFU1xuICBkYXRhU291cmNlITogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIGN1cnJlbnRQYWdlTnVtYmVyID0gMTtcbiAgY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG5cbiAgcHVibGljIGl0ZW1zOiBhbnlbXSA9IFtdO1xuICBwdWJsaWMgZmlsdGVyZWRJdGVtczogYW55W10gPSBbXTsgLy8gRGFkb3MgZmlsdHJhZG9zIHBhcmEgbW9kbyBuw6NvIHBhZ2luYWRvIChww7pibGljbyBwYXJhIGFjZXNzbyBleHRlcm5vKVxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdERvYzogUXVlcnlEb2N1bWVudFNuYXBzaG90PGFueT4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmaXJzdERvYzogUXVlcnlEb2N1bWVudFNuYXBzaG90PGFueT4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzb3J0Qnk6IHsgZmllbGQ6IHN0cmluZzsgb3JkZXI6IE9yZGVyQnlEaXJlY3Rpb24gfSA9IHtcbiAgICBmaWVsZDogJ2NyZWF0ZWRBdCcsXG4gICAgb3JkZXI6ICdkZXNjJyxcbiAgfTtcbiAgcHVibGljIGNvbHVtblByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgZmlsdGVyc0Zvcm06IEZvcm1BcnJheTtcblxuICBzZWxlY3RTb3J0OiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIGN1cnJlbnRBcnJhbmdlID0gJyc7XG5cbiAgaGFzTmV4dFBhZ2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBkcm9wZG93bkl0ZW1zOiBhbnlbXSA9IFtdO1xuICBzb3J0YWJsZURyb3Bkb3duSXRlbXM6IGFueVtdID0gW107XG4gIHBhZ2VTaXplID0gMjU7XG4gIHRvdGFsSXRlbXMgPSAwO1xuICBwYWdlRXZlbnQ/OiBQYWdlRXZlbnQ7XG4gIGZpbHRlclZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBoYXNGaWx0ZXJhYmxlQ29sdW1uOiBib29sZWFuID0gZmFsc2U7XG4gIGhhc1NvcnRhYmxlQ29sdW1uOiBib29sZWFuID0gZmFsc2U7XG4gIGZpbHRlclByZWRpY2F0ZTogKChkYXRhOiBhbnksIGZpbHRlcjogc3RyaW5nKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmaWx0ZXJTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYm91bmNlVGltZU1zID0gNTAwO1xuXG4gIHNlbGVjdGVkVGFiOiBudW1iZXIgPSAwO1xuXG4gIEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKSBwYWdpbmF0b3IhOiBNYXRQYWdpbmF0b3I7XG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydCE6IE1hdFNvcnQ7XG5cbiAgLy8gUHJvcHJpZWRhZGVzIHBhcmEgY29udHJvbGUgZG8gdG9vbHRpcFxuICBob3ZlcmVkQ2VsbDogeyByb3c6IGFueTsgY29sOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICBzaG93VG9vbHRpcDogYm9vbGVhbiA9IGZhbHNlO1xuICB0b29sdGlwVGltZW91dDogYW55O1xuICB0b29sdGlwQ29udGVudDogc3RyaW5nID0gJyc7XG4gIHRvb2x0aXBQb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0geyB4OiAwLCB5OiAwIH07XG5cbiAgLy8gQ09OU1RSVUNUT1JcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHRhYmxlU2VydmljZTogVGFibGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlyZXN0b3JlOiBBbmd1bGFyRmlyZXN0b3JlLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgdGhpcy5maWx0ZXJzRm9ybSA9IG5ldyBGb3JtQXJyYXkoW3RoaXMuY3JlYXRlRmlsdGVyR3JvdXAoKV0pO1xuICB9XG5cbiAgY3JlYXRlRmlsdGVyR3JvdXAoKTogRm9ybUdyb3VwIHtcbiAgICAvLyBDcmlhciB2YWxpZGFkb3IgZGlyZXRhbWVudGUgYXF1aSBwYXJhIGV2aXRhciBwcm9ibGVtYXMgZGUgY29udGV4dG8gZGUgaW5qZcOnw6NvXG4gICAgY29uc3QgZGF0ZVZhbGlkYXRvciA9IHRoaXMudGFibGVTZXJ2aWNlLmRhdGVGb3JtYXRWYWxpZGF0b3IoKTtcblxuICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIHNlbGVjdEZpbHRlcjogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIHR5cGVGaWx0ZXI6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBzZWxlY3RJdGVtOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgaW5pdGlhbERhdGU6IG5ldyBGb3JtQ29udHJvbCgnJywgW2RhdGVWYWxpZGF0b3JdKSxcbiAgICAgIGZpbmFsRGF0ZTogbmV3IEZvcm1Db250cm9sKCcnLCBbZGF0ZVZhbGlkYXRvcl0pLFxuICAgIH0pO1xuICB9XG5cbiAgYWRkRmlsdGVyKGZpbHRlckRhdGE/OiB7XG4gICAgc2VsZWN0RmlsdGVyOiBhbnk7XG4gICAgdHlwZUZpbHRlcj86IHN0cmluZztcbiAgICBzZWxlY3RJdGVtPzogYW55W107XG4gICAgaW5pdGlhbERhdGU/OiBzdHJpbmc7XG4gICAgZmluYWxEYXRlPzogc3RyaW5nO1xuICB9KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWUgJiZcbiAgICAgIHRoaXMuaGFzQWN0aXZlRGF0ZUZpbHRlcigpICYmXG4gICAgICBmaWx0ZXJEYXRhPy5zZWxlY3RGaWx0ZXI/LmFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3RmlsdGVyR3JvdXAgPSB0aGlzLmNyZWF0ZUZpbHRlckdyb3VwKCk7XG5cbiAgICBpZiAoZmlsdGVyRGF0YSkge1xuICAgICAgaWYgKGZpbHRlckRhdGEuc2VsZWN0RmlsdGVyKSB7XG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuc2VsZWN0RmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJEYXRhLnR5cGVGaWx0ZXIpIHtcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnNldFZhbHVlKGZpbHRlckRhdGEudHlwZUZpbHRlcik7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyRGF0YS5zZWxlY3RJdGVtKSB7XG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLnNlbGVjdEl0ZW0pO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlckRhdGEuaW5pdGlhbERhdGUpIHtcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLmluaXRpYWxEYXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJEYXRhLmZpbmFsRGF0ZSkge1xuICAgICAgICBuZXdGaWx0ZXJHcm91cC5nZXQoJ2ZpbmFsRGF0ZScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLmZpbmFsRGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJzRm9ybS5wdXNoKG5ld0ZpbHRlckdyb3VwKTtcbiAgfVxuXG4gIGhhc0FjdGl2ZURhdGVGaWx0ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyc0Zvcm0uY29udHJvbHMuc29tZSgoY29udHJvbCkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gZ3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRGaWx0ZXI/LmFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0QXZhaWxhYmxlRmlsdGVyT3B0aW9ucygpOiBhbnlbXSB7XG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlICYmIHRoaXMuaGFzQWN0aXZlRGF0ZUZpbHRlcigpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbHRlcihcbiAgICAgICAgKGl0ZW0pID0+IGl0ZW0uYXJyYW5nZSAhPT0gJ2ZpbHRlckJ5RGF0ZSdcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duSXRlbXM7XG4gIH1cblxuICBvblNlbGVjdEZpbHRlckNoYW5nZSgpIHtcbiAgICBjb25zdCBsYXN0SW5kZXggPSB0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgbGFzdEZpbHRlciA9IHRoaXMuZmlsdGVyc0Zvcm0uYXQobGFzdEluZGV4KTtcbiAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGxhc3RGaWx0ZXIuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG5cbiAgICBpZiAoc2VsZWN0ZWRGaWx0ZXIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZScgJiZcbiAgICAgICAgdGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWVcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkRmlsdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRmlsdGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcnNGb3JtLnJlbW92ZUF0KGluZGV4KTtcbiAgICBpZiAodGhpcy5maWx0ZXJzRm9ybS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuYWRkRmlsdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQWxsRmlsdGVycygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcnNGb3JtLmNsZWFyKCk7XG4gICAgdGhpcy5hZGRGaWx0ZXIoKTtcbiAgICB0aGlzLnJlc2V0RmlsdGVyKCk7XG4gIH1cblxuICAvLyBNRVRIT0RTXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddKSB7XG4gICAgICAvLyBBcGxpY2FyIGNvcmVzIHF1YW5kbyBvIGRhdGEgZm9yIGRlZmluaWRvIG91IG11ZGFyXG4gICAgICAvLyBVc2FyIHNldFRpbWVvdXQgcGFyYSBnYXJhbnRpciBxdWUgYSB2aWV3IGVzdGVqYSBwcm9udGFcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hcHBseUN1c3RvbUNvbG9ycygpLCAwKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gR2FyYW50aXIgcXVlIGFzIGNvcmVzIHNlamFtIGFwbGljYWRhcyBhcMOzcyBhIHZpZXcgZXN0YXIgcHJvbnRhXG4gICAgdGhpcy5hcHBseUN1c3RvbUNvbG9ycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUN1c3RvbUNvbG9ycygpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0RWxlbWVudCA9IHRoaXMuZWw/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFob3N0RWxlbWVudCB8fCAhdGhpcy5kYXRhKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5kYXRhLmNvbG9yPy5iZykge1xuICAgICAgaG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGFibGUtY29sb3InLCB0aGlzLmRhdGEuY29sb3IuYmcpO1xuICAgICAgaG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGFibGUtaGVhZGVyLWJnJywgdGhpcy5kYXRhLmNvbG9yLmJnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YS5jb2xvcj8udGV4dCkge1xuICAgICAgaG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGFibGUtdGV4dC1jb2xvcicsIHRoaXMuZGF0YS5jb2xvci50ZXh0KTtcbiAgICAgIGhvc3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAnLS10YWJsZS1oZWFkZXItdGV4dCcsXG4gICAgICAgIHRoaXMuZGF0YS5jb2xvci50ZXh0XG4gICAgICApO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyQ2VsbHMgPSBob3N0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAnLm1hdC1oZWFkZXItY2VsbCwgLm1hdC1tZGMtaGVhZGVyLWNlbGwsIHRoLm1hdC1oZWFkZXItY2VsbCwgdGgubWF0LW1kYy1oZWFkZXItY2VsbCdcbiAgICAgICk7XG4gICAgICBoZWFkZXJDZWxscy5mb3JFYWNoKChjZWxsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5jb2xvcj8uYmcpIHtcbiAgICAgICAgICBjZWxsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuZGF0YS5jb2xvci5iZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmNvbG9yPy50ZXh0KSB7XG4gICAgICAgICAgY2VsbC5zdHlsZS5jb2xvciA9IHRoaXMuZGF0YS5jb2xvci50ZXh0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5kYXRhLmNvbG9yKSB0aGlzLmRhdGEuY29sb3IgPSB7IGJnOiAnIzE5NzZkMicsIHRleHQ6ICcjZmZmZmZmJyB9O1xuICAgIHRoaXMuY29sdW1uUHJvcGVydGllcyA9IHRoaXMuZGF0YS5kaXNwbGF5ZWRDb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICByZXR1cm4gY29sdW1uLnByb3BlcnR5O1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZGF0YS5hY3Rpb25CdXR0b24gJiYgIXRoaXMuZGF0YS5hY3Rpb25CdXR0b24uY29uZGl0aW9uKSB7XG4gICAgICB0aGlzLmRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvbiA9IChfcm93PzogYW55KSA9PiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS5kaXNwbGF5ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5pc0ZpbHRlcmFibGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRmlsdGVyYWJsZUNvbHVtbiA9PT0gZmFsc2UpIHRoaXMuaGFzRmlsdGVyYWJsZUNvbHVtbiA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnZmlsdGVyJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2wuaXNTb3J0YWJsZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNTb3J0YWJsZUNvbHVtbiA9PT0gZmFsc2UpIHRoaXMuaGFzU29ydGFibGVDb2x1bW4gPSB0cnVlO1xuICAgICAgICB0aGlzLnNvcnRhYmxlRHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2FzY2VuZGluZycsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGNyZXNjZW50ZScsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvcnRhYmxlRHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2Rlc2NlbmRpbmcnLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUgKyAnOiBkZWNyZXNjZW50ZScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbC5pc0ZpbHRlcmFibGVCeURhdGUpIHtcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnZmlsdGVyQnlEYXRlJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogZmlsdHJvIHBvciBkYXRhJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhLmZpbHRlcmFibGVPcHRpb25zICYmXG4gICAgICBBcnJheS5pc0FycmF5KHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucykgJiZcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PlxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7IC4uLm9wdGlvbiwgYXJyYW5nZTogJ2VxdWFscycgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2VtIHBhZ2luYcOnw6NvXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXMoKTtcbiAgICB9XG4gICAgLy8gQ29tIHBhZ2luYcOnw6NvXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlKSB7XG4gICAgICBpZiAodGhpcy5kYXRhLnNvcnRCeSlcbiAgICAgICAgdGhpcy5zb3J0QnkgPSB7XG4gICAgICAgICAgZmllbGQ6IHRoaXMuZGF0YS5zb3J0QnkuZmllbGQsXG4gICAgICAgICAgb3JkZXI6IHRoaXMuZGF0YS5zb3J0Qnkub3JkZXIsXG4gICAgICAgIH07XG4gICAgICB0aGlzLmZpbHRlclN1YmplY3RcbiAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lTXMpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRJdGVtc1BhZ2luYXRlZCgncmVsb2FkJywgdHJ1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRJdGVtc1BhZ2luYXRlZCgncmVsb2FkJywgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuc29ydC5hY3RpdmUgPSAnY3JlYXRlZEF0JztcbiAgICAgIHRoaXMuc29ydC5kaXJlY3Rpb24gPSAnZGVzYyc7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgICAgIHRoaXMudG90YWxJdGVtcyA9IDA7XG4gICAgICBpZiAodGhpcy5kYXRhLnRvdGFsUmVmKSB7XG4gICAgICAgIGZvciAoY29uc3QgdG90YWxSZWYgb2YgdGhpcy5kYXRhLnRvdGFsUmVmKSB7XG4gICAgICAgICAgY29uc3QgdG90YWxSZWZEb2MgPSBhd2FpdCB0b3RhbFJlZi5yZWYuZ2V0KCk7XG4gICAgICAgICAgY29uc3QgZG9jRGF0YSA9IHRvdGFsUmVmRG9jLmRhdGEoKSBhcyBhbnk7XG4gICAgICAgICAgaWYgKGRvY0RhdGEgJiYgZG9jRGF0YVt0b3RhbFJlZi5maWVsZF0pXG4gICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAodGhpcy50b3RhbEl0ZW1zICtcbiAgICAgICAgICAgICAgZG9jRGF0YVt0b3RhbFJlZi5maWVsZF0pIGFzIG51bWJlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXREaXNwbGF5VmFsdWUoY29sOiBhbnksIHJvdzogYW55LCB3aXRoaW5MaW1pdDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBsZXQgdmFsdWU6IGFueTtcblxuICAgIGlmIChjb2wuY2FsY3VsYXRlVmFsdWUpIHtcbiAgICAgIHZhbHVlID0gY29sLmNhbGN1bGF0ZVZhbHVlKHJvdyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdGhpcy5nZXROZXN0ZWRWYWx1ZShyb3csIGNvbC5wcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIGNvbC5hcnJheUZpZWxkKSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZm9ybWF0QXJyYXlWYWx1ZSh2YWx1ZSwgY29sLmFycmF5RmllbGQpO1xuICAgIH1cblxuICAgIGlmIChjb2wucXVlcnlMZW5ndGggJiYgcm93W2NvbC5wcm9wZXJ0eV0pIHtcbiAgICAgIHZhbHVlID0gcm93W2NvbC5wcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgdmFsdWUgPSBjb2wucGlwZSA/IGNvbC5waXBlLnRyYW5zZm9ybSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWx1ZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHdpdGhpbkxpbWl0IHx8ICFjb2wuY2hhckxpbWl0KSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygwLCBjb2wuY2hhckxpbWl0KSArICcuLi4nO1xuICB9XG5cbiAgZ2V0TmVzdGVkVmFsdWUob2JqOiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHByb3BlcnRpZXMucmVkdWNlKFxuICAgICAgKGFjYywgY3VycmVudFBhcnQpID0+IGFjYyAmJiBhY2NbY3VycmVudFBhcnRdLFxuICAgICAgb2JqXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0QXJyYXlWYWx1ZShhcnJheTogYW55W10sIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzID0gYXJyYXlcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiBpdGVtICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdIHx8ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXRlbSk7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigodmFsdWUpID0+IHZhbHVlICE9PSAnJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKTtcblxuICAgIHJldHVybiB2YWx1ZXMuam9pbignLCAnKTtcbiAgfVxuXG4gIC8vIE3DqXRvZG9zIHNlbSBwYWdpbmHDp8Ojb1xuICBwcml2YXRlIGFzeW5jIGxvYWRJdGVtcygpIHtcbiAgICB0aGlzLml0ZW1zID0gYXdhaXQgdGhpcy50YWJsZVNlcnZpY2UuZ2V0SXRlbXModGhpcy5kYXRhLmNvbGxlY3Rpb25SZWYpO1xuICAgIGlmICh0aGlzLmRhdGEuY29uZGl0aW9ucykge1xuICAgICAgdGhpcy5maWx0ZXJJdGVtcygpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmxvYWRSZWxhdGlvbnMoKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRRdWVyeUxlbmd0aHMoKTtcbiAgICB0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLml0ZW1zLmxlbmd0aDtcblxuICAgIC8vIEluaWNpYWxpemFyIGFycmFuZ2UgcGFyYSB0YWJlbGFzIG7Do28gcGFnaW5hZGFzXG4gICAgdGhpcy5hcnJhbmdlID0ge1xuICAgICAgZmlsdGVyczogW10sXG4gICAgICBzb3J0Qnk6IHRoaXMuZGF0YS5zb3J0QnkgfHwge1xuICAgICAgICBmaWVsZDogJ2NyZWF0ZWRBdCcsXG4gICAgICAgIG9yZGVyOiAnZGVzYycsXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5zb3J0QnkgPSB0aGlzLmRhdGEuc29ydEJ5IHx8IHtcbiAgICAgIGZpZWxkOiAnY3JlYXRlZEF0JyxcbiAgICAgIG9yZGVyOiAnZGVzYycsXG4gICAgfTtcblxuICAgIC8vIEFwbGljYXIgZmlsdHJvcyBjbGllbnQtc2lkZSBzZSBleGlzdGlyZW1cbiAgICBsZXQgaXRlbXNUb0Rpc3BsYXkgPSBbLi4udGhpcy5pdGVtc107XG4gICAgaXRlbXNUb0Rpc3BsYXkgPSB0aGlzLmFwcGx5Q2xpZW50U2lkZUZpbHRlcnMoaXRlbXNUb0Rpc3BsYXkpO1xuICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IGl0ZW1zVG9EaXNwbGF5OyAvLyBBcm1hemVuYXIgZGFkb3MgZmlsdHJhZG9zXG5cbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKGl0ZW1zVG9EaXNwbGF5KTtcbiAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgdGhpcy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XG4gICAgaWYgKHRoaXMuZGF0YS5zb3J0QnkpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0LmFjdGl2ZSA9IHRoaXMuZGF0YS5zb3J0QnkuZmllbGQ7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydC5kaXJlY3Rpb24gPSB0aGlzLmRhdGEuc29ydEJ5Lm9yZGVyO1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQuc29ydENoYW5nZS5lbWl0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9IChkYXRhLCBmaWx0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YS5kaXNwbGF5ZWRDb2x1bW5zLnNvbWUoKGNvbCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBpZiAoY29sLmZpbHRlclByZWRpY2F0ZXMpIHtcbiAgICAgICAgICByZXR1cm4gY29sLmZpbHRlclByZWRpY2F0ZXMuc29tZSgocHJlZGljYXRlKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gZGF0YVtjb2wucHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVZhbHVlIHx8IHR5cGVvZiBwcm9wZXJ0eVZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByZWRpY2F0ZVZhbHVlID0gcHJvcGVydHlWYWx1ZVtwcmVkaWNhdGVdO1xuICAgICAgICAgICAgaWYgKHByZWRpY2F0ZVZhbHVlID09PSBudWxsIHx8IHByZWRpY2F0ZVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nKHByZWRpY2F0ZVZhbHVlKVxuICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgIC5pbmNsdWRlcyhmaWx0ZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbC5wcm9wZXJ0eSAmJiBjb2wuaXNGaWx0ZXJhYmxlKSB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGRhdGFbY29sLnByb3BlcnR5XTtcbiAgICAgICAgICBpZiAocHJvcGVydHlWYWx1ZSA9PT0gbnVsbCB8fCBwcm9wZXJ0eVZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gU3RyaW5nKHByb3BlcnR5VmFsdWUpXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB0aGlzLmZpbHRlclByZWRpY2F0ZSA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGU7XG4gIH1cblxuICAvLyBBcGxpY2FyIGZpbHRyb3MgY2xpZW50LXNpZGUgKGZpbHRyb3MgcG9yIGRhdGEpXG4gIHByaXZhdGUgYXBwbHlDbGllbnRTaWRlRmlsdGVycyhpdGVtczogYW55W10pOiBhbnlbXSB7XG4gICAgbGV0IGZpbHRlcmVkSXRlbXMgPSBbLi4uaXRlbXNdO1xuXG4gICAgLy8gQWdydXBhciBmaWx0cm9zIGRlIGRhdGEgcG9yIHByb3ByaWVkYWRlXG4gICAgY29uc3QgZGF0ZUZpbHRlcnNCeVByb3BlcnR5OiBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICBBcnJheTx7IGluaXRpYWw6IERhdGU7IGZpbmFsOiBEYXRlIH0+XG4gICAgPiA9IHt9O1xuICAgIGNvbnN0IG90aGVyRmlsdGVyczogQXJyYXk8e1xuICAgICAgZ3JvdXA6IEZvcm1Hcm91cDtcbiAgICAgIHNlbGVjdGVkRmlsdGVyOiBhbnk7XG4gICAgICBhcnJhbmdlOiBzdHJpbmc7XG4gICAgfT4gPSBbXTtcblxuICAgIHRoaXMuZmlsdGVyc0Zvcm0uY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gZ3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG4gICAgICBpZiAoIXNlbGVjdGVkRmlsdGVyKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGFycmFuZ2UgPSBzZWxlY3RlZEZpbHRlci5hcnJhbmdlO1xuXG4gICAgICBpZiAoYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZScpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IGdyb3VwLmdldCgnaW5pdGlhbERhdGUnKT8udmFsdWU7XG4gICAgICAgIGNvbnN0IGZpbmFsID0gZ3JvdXAuZ2V0KCdmaW5hbERhdGUnKT8udmFsdWU7XG5cbiAgICAgICAgLy8gU8OzIGFwbGljYXIgZmlsdHJvIHNlIGFtYmFzIGFzIGRhdGFzIGVzdGl2ZXJlbSBwcmVlbmNoaWRhc1xuICAgICAgICBpZiAoaW5pdGlhbCAmJiBmaW5hbCAmJiBpbml0aWFsLnRyaW0oKSAmJiBmaW5hbC50cmltKCkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVmFsaWRhciBmb3JtYXRvIGRhIGRhdGEgKEREL01NL0FBQUEpXG4gICAgICAgICAgICBjb25zdCBkYXRlUGF0dGVybiA9IC9eKFxcZHsxLDJ9KVxcLyhcXGR7MSwyfSlcXC8oXFxkezR9KSQvO1xuICAgICAgICAgICAgaWYgKCFkYXRlUGF0dGVybi50ZXN0KGluaXRpYWwpIHx8ICFkYXRlUGF0dGVybi50ZXN0KGZpbmFsKSkge1xuICAgICAgICAgICAgICByZXR1cm47IC8vIElnbm9yYXIgc2UgZm9ybWF0byBpbnbDoWxpZG9cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2RheUksIG1vbnRoSSwgeWVhckldID0gaW5pdGlhbC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEl9LyR7ZGF5SX0vJHt5ZWFySX1gKTtcbiAgICAgICAgICAgIGNvbnN0IFtkYXlGLCBtb250aEYsIHllYXJGXSA9IGZpbmFsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBjb25zdCBmaW5hbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEZ9LyR7ZGF5Rn0vJHt5ZWFyRn1gKTtcbiAgICAgICAgICAgIGZpbmFsRGF0ZS5zZXRIb3VycygyMywgNTksIDU5KTtcblxuICAgICAgICAgICAgLy8gVmFsaWRhciBzZSBhcyBkYXRhcyBzw6NvIHbDoWxpZGFzXG4gICAgICAgICAgICBpZiAoaXNOYU4oaW5pdGlhbERhdGUuZ2V0VGltZSgpKSB8fCBpc05hTihmaW5hbERhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgICByZXR1cm47IC8vIElnbm9yYXIgc2UgZGF0YXMgaW52w6FsaWRhc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBVc2FyIG8gY2FtcG8gZGEgY29sdW5hIG91IG8gc29ydEJ5LmZpZWxkIGNvbW8gcGFkcsOjb1xuICAgICAgICAgICAgY29uc3QgZGF0ZUZpZWxkID0gc2VsZWN0ZWRGaWx0ZXIucHJvcGVydHkgfHwgdGhpcy5zb3J0QnkuZmllbGQ7XG5cbiAgICAgICAgICAgIGlmICghZGF0ZUZpbHRlcnNCeVByb3BlcnR5W2RhdGVGaWVsZF0pIHtcbiAgICAgICAgICAgICAgZGF0ZUZpbHRlcnNCeVByb3BlcnR5W2RhdGVGaWVsZF0gPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZUZpbHRlcnNCeVByb3BlcnR5W2RhdGVGaWVsZF0ucHVzaCh7XG4gICAgICAgICAgICAgIGluaXRpYWw6IGluaXRpYWxEYXRlLFxuICAgICAgICAgICAgICBmaW5hbDogZmluYWxEYXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXJybyBhbyBwcm9jZXNzYXIgZGF0YXMgZG8gZmlsdHJvOicsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG90aGVyRmlsdGVycy5wdXNoKHsgZ3JvdXAsIHNlbGVjdGVkRmlsdGVyLCBhcnJhbmdlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmtleXMoZGF0ZUZpbHRlcnNCeVByb3BlcnR5KS5mb3JFYWNoKChkYXRlRmllbGQpID0+IHtcbiAgICAgIGNvbnN0IGludGVydmFscyA9IGRhdGVGaWx0ZXJzQnlQcm9wZXJ0eVtkYXRlRmllbGRdO1xuXG4gICAgICBmaWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBpdGVtW2RhdGVGaWVsZF07XG5cbiAgICAgICAgICBpZiAoIWZpZWxkVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgaXRlbURhdGU6IERhdGU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlLnRvRGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgaXRlbURhdGUgPSBmaWVsZFZhbHVlLnRvRGF0ZSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRWYWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGl0ZW1EYXRlID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaXRlbURhdGUgPSBuZXcgRGF0ZShmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpc05hTihpdGVtRGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgaXRlbURhdGUgPSBuZXcgRGF0ZShmaWVsZFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpbnRlcnZhbHMuc29tZShcbiAgICAgICAgICAgIChpbnRlcnZhbCkgPT5cbiAgICAgICAgICAgICAgaXRlbURhdGUgPj0gaW50ZXJ2YWwuaW5pdGlhbCAmJiBpdGVtRGF0ZSA8PSBpbnRlcnZhbC5maW5hbFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ0Vycm8gYW8gcHJvY2Vzc2FyIGZpbHRybyBkZSBkYXRhIHBhcmEgbyBpdGVtOicsXG4gICAgICAgICAgICBpdGVtLmlkLFxuICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBvdGhlckZpbHRlcnMuZm9yRWFjaCgoeyBncm91cCwgc2VsZWN0ZWRGaWx0ZXIsIGFycmFuZ2UgfSkgPT4ge1xuICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXInKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gZ3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnZhbHVlO1xuICAgICAgICBpZiAoZmlsdGVyVmFsdWUgJiYgZmlsdGVyVmFsdWUudHJpbSgpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBzZWxlY3RlZEZpbHRlci5wcm9wZXJ0eTtcbiAgICAgICAgICBmaWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoaXRlbVtwcm9wZXJ0eV0gfHwgJycpXG4gICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuaW5jbHVkZXMoZmlsdGVyVmFsdWUudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBzZWxlY3RlZEZpbHRlci5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJlxuICAgICAgICBhcnJhbmdlID09PSAnZXF1YWxzJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBncm91cC5nZXQoJ3NlbGVjdEl0ZW0nKT8udmFsdWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHNlbGVjdGVkSXRlbXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0udmFsdWUpO1xuICAgICAgICAgIGZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtcy5zb21lKChzZWxlY3RlZEl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpdGVtVmFsdWUgPSBpdGVtW3NlbGVjdGVkSXRlbS5wcm9wZXJ0eV07XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtVmFsdWUgPT09IHNlbGVjdGVkSXRlbS52YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWRJdGVtcztcbiAgfVxuXG4gIC8vIEhhbmRsZXIgcGFyYSBtdWRhbsOnYXMgZGUgZGF0YSBubyBmaWx0cm9cbiAgb25EYXRlRmlsdGVyQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEF0dWFsaXphciBhcnJhbmdlIGNvbSBvcyBmaWx0cm9zIGF0aXZvc1xuICAgICAgdGhpcy5hcnJhbmdlID0gdGhpcy5idWlsZEFycmFuZ2VGcm9tRmlsdGVycygpO1xuICAgICAgLy8gQXBsaWNhciBmaWx0cm9zIChvdSByZW1vdmVyIHNlIGNhbXBvcyBlc3RpdmVyZW0gdmF6aW9zKVxuICAgICAgdGhpcy5hcHBseUZpbHRlcnNUb0RhdGFTb3VyY2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBBcGxpY2FyIG3DoXNjYXJhIGRlIGRhdGEgKEREL01NL0FBQUEpIG1hbnVhbG1lbnRlXG4gIG9uRGF0ZUlucHV0KFxuICAgIGV2ZW50OiBhbnksXG4gICAgY29udHJvbE5hbWU6ICdpbml0aWFsRGF0ZScgfCAnZmluYWxEYXRlJyxcbiAgICBmaWx0ZXJJbmRleDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0O1xuICAgIGxldCB2YWx1ZSA9IGlucHV0LnZhbHVlLnJlcGxhY2UoL1xcRC9nLCAnJyk7IC8vIFJlbW92ZSB0dWRvIHF1ZSBuw6NvIMOpIGTDrWdpdG9cblxuICAgIC8vIExpbWl0YXIgYSA4IGTDrWdpdG9zIChERE1NQUFBQSlcbiAgICBpZiAodmFsdWUubGVuZ3RoID4gOCkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCA4KTtcbiAgICB9XG5cbiAgICAvLyBGb3JtYXRhcjogREQvTU0vQUFBQVxuICAgIGlmICh2YWx1ZS5sZW5ndGggPD0gMikge1xuICAgICAgdmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLmxlbmd0aCA8PSA0KSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIDIpICsgJy8nICsgdmFsdWUuc2xpY2UoMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID1cbiAgICAgICAgdmFsdWUuc2xpY2UoMCwgMikgKyAnLycgKyB2YWx1ZS5zbGljZSgyLCA0KSArICcvJyArIHZhbHVlLnNsaWNlKDQsIDgpO1xuICAgIH1cblxuICAgIC8vIEF0dWFsaXphciBvIEZvcm1Db250cm9sXG4gICAgY29uc3QgZmlsdGVyR3JvdXAgPSB0aGlzLmZpbHRlcnNGb3JtLmF0KGZpbHRlckluZGV4KSBhcyBGb3JtR3JvdXA7XG4gICAgZmlsdGVyR3JvdXAuZ2V0KGNvbnRyb2xOYW1lKT8uc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgfVxuXG4gIC8vIEFwbGljYXIgZmlsdHJvcyBhbyBkYXRhU291cmNlIHF1YW5kbyBuw6NvIGjDoSBwYWdpbmHDp8Ojb1xuICBwcml2YXRlIGFwcGx5RmlsdGVyc1RvRGF0YVNvdXJjZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkgcmV0dXJuO1xuXG4gICAgbGV0IGZpbHRlcmVkSXRlbXMgPSB0aGlzLmFwcGx5Q2xpZW50U2lkZUZpbHRlcnMoWy4uLnRoaXMuaXRlbXNdKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IGZpbHRlcmVkSXRlbXM7XG4gICAgLy8gQXR1YWxpemFyIGZpbHRlcmVkSXRlbXMgY29tIG9zIGRhZG9zIGZpbHRyYWRvcyAoc2Vyw6EgYXR1YWxpemFkbyBub3ZhbWVudGUgbm8gaGFuZGxlRG93bmxvYWQgY29tIGZpbHRlcmVkRGF0YSlcbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zO1xuICAgIHRoaXMudG90YWxJdGVtcyA9IGZpbHRlcmVkSXRlbXMubGVuZ3RoO1xuICB9XG5cbiAgLy8gTcOpdG9kb3MgY29tIHBhZ2luYcOnw6NvXG4gIHByaXZhdGUgYXN5bmMgbG9hZEl0ZW1zUGFnaW5hdGVkKFxuICAgIG5hdmlnYXRpb246IHN0cmluZyA9ICdyZWxvYWQnLFxuICAgIHJlc2V0OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKHJlc2V0ICYmIFsnZm9yd2FyZCcsICdyZWxvYWQnXS5pbmNsdWRlcyhuYXZpZ2F0aW9uKSkge1xuICAgICAgdGhpcy5sYXN0RG9jID0gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG4gICAgfVxuICAgIGlmIChyZXNldCAmJiBbJ2JhY2t3YXJkJywgJ3JlbG9hZCddLmluY2x1ZGVzKG5hdmlnYXRpb24pKSB7XG4gICAgICB0aGlzLmZpcnN0RG9jID0gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlRmlsdGVycyA9IHRoaXMuZmlsdGVyc0Zvcm0uY29udHJvbHNcbiAgICAgIC5mbGF0TWFwKChjb250cm9sKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gZ3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG4gICAgICAgIGlmICghc2VsZWN0ZWRGaWx0ZXIpIHJldHVybiBbXTtcblxuICAgICAgICBjb25zdCBhcnJhbmdlID0gc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZTtcblxuICAgICAgICBpZiAoYXJyYW5nZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGdyb3VwLmdldCgndHlwZUZpbHRlcicpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoIWZpbHRlclZhbHVlKSByZXR1cm4gW107XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFycmFuZ2UsXG4gICAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgICAgcHJvcGVydHk6IHNlbGVjdGVkRmlsdGVyLnByb3BlcnR5LFxuICAgICAgICAgICAgICBmaWx0ZXJpbmc6IGZpbHRlclZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnKSB7XG4gICAgICAgICAgY29uc3QgaW5pdGlhbCA9IGdyb3VwLmdldCgnaW5pdGlhbERhdGUnKT8udmFsdWU7XG4gICAgICAgICAgY29uc3QgZmluYWwgPSBncm91cC5nZXQoJ2ZpbmFsRGF0ZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoaW5pdGlhbCAmJiBmaW5hbCkge1xuICAgICAgICAgICAgY29uc3QgW2RheUksIG1vbnRoSSwgeWVhckldID0gaW5pdGlhbC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEl9LyR7ZGF5SX0vJHt5ZWFySX1gKTtcbiAgICAgICAgICAgIGNvbnN0IFtkYXlGLCBtb250aEYsIHllYXJGXSA9IGZpbmFsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBjb25zdCBmaW5hbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEZ9LyR7ZGF5Rn0vJHt5ZWFyRn1gKTtcbiAgICAgICAgICAgIGZpbmFsRGF0ZS5zZXRIb3VycygyMywgNTksIDU5KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGFycmFuZ2UsXG4gICAgICAgICAgICAgIGZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBkYXRlRmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbDogaW5pdGlhbERhdGUsXG4gICAgICAgICAgICAgICAgZmluYWw6IGZpbmFsRGF0ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJiBhcnJhbmdlID09PSAnZXF1YWxzJykge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBncm91cC5nZXQoJ3NlbGVjdEl0ZW0nKT8udmFsdWU7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRJdGVtcykgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICAgIGFycmFuZ2UsXG4gICAgICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLnByb3BlcnR5LFxuICAgICAgICAgICAgICAgIGZpbHRlcmluZzogaXRlbS52YWx1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmICYmIChmLmZpbHRlcj8uZmlsdGVyaW5nICE9PSB1bmRlZmluZWQgfHwgZi5kYXRlRmlsdGVyKSk7XG5cbiAgICB0aGlzLmFycmFuZ2UgPSB7XG4gICAgICBmaWx0ZXJzOiBhY3RpdmVGaWx0ZXJzLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICB9O1xuXG4gICAgY29uc3QgcGFnaW5hdGVkOiBhbnkgPSB7XG4gICAgICBiYXRjaFNpemU6IHRoaXMucGFnZVNpemUsXG4gICAgICBjb2xsZWN0aW9uOiB0aGlzLmRhdGEuY29sbGVjdGlvbixcbiAgICAgIGRvYzogeyBsYXN0RG9jOiB0aGlzLmxhc3REb2MsIGZpcnN0RG9jOiB0aGlzLmZpcnN0RG9jIH0sXG4gICAgICBuYXZpZ2F0aW9uLFxuICAgICAgYXJyYW5nZTogdGhpcy5hcnJhbmdlLFxuICAgICAgY29uZGl0aW9uczogdGhpcy5kYXRhLmNvbmRpdGlvbnMsXG4gICAgICBzaXplOiB0aGlzLnRvdGFsSXRlbXMsXG4gICAgICBmaWx0ZXJGbjogdGhpcy5kYXRhLmZpbHRlckZuLFxuICAgICAgY2xpZW50UGFnZUluZGV4OiB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXgsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudGFibGVTZXJ2aWNlLmdldFBhZ2luYXRlZChwYWdpbmF0ZWQpO1xuICAgIHRoaXMuaXRlbXMgPSByZXN1bHQuaXRlbXM7XG4gICAgYXdhaXQgdGhpcy5sb2FkUmVsYXRpb25zKCk7XG4gICAgYXdhaXQgdGhpcy5sb2FkUXVlcnlMZW5ndGhzKCk7XG4gICAgdGhpcy5sYXN0RG9jID0gcmVzdWx0Lmxhc3REb2MgYXMgYW55O1xuICAgIHRoaXMuZmlyc3REb2MgPSByZXN1bHQuZmlyc3REb2MgYXMgYW55O1xuXG4gICAgLy8gQXR1YWxpemFyIGN1cnJlbnRDbGllbnRQYWdlSW5kZXggc2UgcmV0b3JuYWRvIHBlbG8gZmFsbGJhY2tcbiAgICBpZiAocmVzdWx0LmN1cnJlbnRDbGllbnRQYWdlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gcmVzdWx0LmN1cnJlbnRDbGllbnRQYWdlSW5kZXg7XG4gICAgfVxuXG4gICAgbGV0IHN1bSA9IDA7XG4gICAgaWYgKHRoaXMuZGF0YS50b3RhbFJlZikge1xuICAgICAgZm9yIChjb25zdCB0b3RhbFJlZiBvZiB0aGlzLmRhdGEudG90YWxSZWYpIHtcbiAgICAgICAgY29uc3QgdG90YWxSZWZEb2MgPSBhd2FpdCB0b3RhbFJlZi5yZWYuZ2V0KCk7XG4gICAgICAgIGNvbnN0IGRvY0RhdGEgPSB0b3RhbFJlZkRvYy5kYXRhKCkgYXMgYW55O1xuICAgICAgICBpZiAoZG9jRGF0YSB8fCByZXN1bHQuZmlsdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgc3VtID1cbiAgICAgICAgICAgIHJlc3VsdC5maWx0ZXJMZW5ndGggPz9cbiAgICAgICAgICAgICgoc3VtICsgKGRvY0RhdGEgPyBkb2NEYXRhW3RvdGFsUmVmLmZpZWxkXSA6IDApKSBhcyBudW1iZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSBzdW07XG4gICAgfVxuXG4gICAgdGhpcy5oYXNOZXh0UGFnZSA9IHJlc3VsdC5oYXNOZXh0UGFnZTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMuaXRlbXMpO1xuICAgIHRoaXMuZmlsdGVyUHJlZGljYXRlID0gdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZTtcbiAgfVxuXG4gIGFzeW5jIG9uUGFnZUNoYW5nZShldmVudD86IFBhZ2VFdmVudCkge1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSAmJiBldmVudCkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICBjb25zdCBwcmV2aW91c1BhZ2VJbmRleCA9IGV2ZW50LnByZXZpb3VzUGFnZUluZGV4ID8/IDA7XG4gICAgICBjb25zdCBwYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XG4gICAgICBjb25zdCBjdXJyZW50Q29tcG9uZW50UGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplO1xuICAgICAgY29uc3QgZXZlbnRQYWdlU2l6ZSA9IGV2ZW50LnBhZ2VTaXplO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHRoaXMudG90YWxJdGVtcztcblxuICAgICAgbGV0IG5hdmlnYXRpb25EaXJlY3Rpb246IHN0cmluZztcbiAgICAgIGxldCByZXNldERvY3MgPSBmYWxzZTtcbiAgICAgIGxldCBvcmlnaW5hbFBhZ2VTaXplOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgICAgY29uc3QgbGFzdFBhZ2VJbmRleCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLmNlaWwodG90YWxJdGVtcyAvIGV2ZW50UGFnZVNpemUpIC0gMVxuICAgICAgKTtcblxuICAgICAgLy8gQXR1YWxpemFyIGN1cnJlbnRDbGllbnRQYWdlSW5kZXggc2VtcHJlIHBhcmEgbyBmYWxsYmFja1xuICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gcGFnZUluZGV4O1xuXG4gICAgICBpZiAocHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJiBwYWdlSW5kZXggPiBwcmV2aW91c1BhZ2VJbmRleCkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlTnVtYmVyKys7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhZ2VJbmRleCA8IHByZXZpb3VzUGFnZUluZGV4XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZU51bWJlciA9IE1hdGgubWF4KDEsIHRoaXMuY3VycmVudFBhZ2VOdW1iZXIgLSAxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50UGFnZVNpemUgIT09IGN1cnJlbnRDb21wb25lbnRQYWdlU2l6ZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnQWx0ZXJvdSBhIHF1YW50aWRhZGUgZGUgZWxlbWVudG9zIGV4aWJpZG9zIHBvciBww6FnaW5hJyk7XG4gICAgICAgIHRoaXMucGFnZVNpemUgPSBldmVudFBhZ2VTaXplO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuICAgICAgICByZXNldERvY3MgPSB0cnVlO1xuICAgICAgICB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcGFnZUluZGV4ID09PSAwICYmXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4IDwgcHJldmlvdXNQYWdlSW5kZXhcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZygnUHVsb3UgcGFyYSBhIHByaW1laXJhIHDDoWdpbmEnKTtcbiAgICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdmb3J3YXJkJztcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZU51bWJlciA9IDE7XG4gICAgICAgIHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG4gICAgICAgIHJlc2V0RG9jcyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwYWdlSW5kZXggPT09IGxhc3RQYWdlSW5kZXggJiZcbiAgICAgICAgcHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYWdlSW5kZXggPiBwcmV2aW91c1BhZ2VJbmRleCAmJlxuICAgICAgICBwYWdlSW5kZXggLSBwcmV2aW91c1BhZ2VJbmRleCA+IDFcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZygnUHVsb3UgcGFyYSBhIHVsdGltYSBww6FnaW5hJyk7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnYmFja3dhcmQnO1xuICAgICAgICByZXNldERvY3MgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zRXhwZWN0ZWRJbkxhc3RQYWdlID1cbiAgICAgICAgICB0b3RhbEl0ZW1zIC0gbGFzdFBhZ2VJbmRleCAqIGV2ZW50UGFnZVNpemU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGl0ZW1zRXhwZWN0ZWRJbkxhc3RQYWdlID4gMCAmJlxuICAgICAgICAgIGl0ZW1zRXhwZWN0ZWRJbkxhc3RQYWdlIDwgZXZlbnRQYWdlU2l6ZVxuICAgICAgICApIHtcbiAgICAgICAgICBvcmlnaW5hbFBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcbiAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gaXRlbXNFeHBlY3RlZEluTGFzdFBhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4ID4gcHJldmlvdXNQYWdlSW5kZXhcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZygnUHJvY2VkZW5kbycpO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuICAgICAgICByZXNldERvY3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4IDwgcHJldmlvdXNQYWdlSW5kZXhcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZygnUmV0cm9jZWRlbmRvLicpO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2JhY2t3YXJkJztcbiAgICAgICAgcmVzZXREb2NzID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhZ2VJbmRleCA9PT0gcHJldmlvdXNQYWdlSW5kZXhcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZygnUmVjYXJyZWdhbmRvLicpO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ3JlbG9hZCc7XG4gICAgICAgIHJlc2V0RG9jcyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChwcmV2aW91c1BhZ2VJbmRleCA9PT0gdW5kZWZpbmVkICYmIHBhZ2VJbmRleCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAnRXZlbnRvIGluaWNpYWwgZG8gcGFnaW5hZG9yIHBhcmEgcMOhZyAwLiBuZ09uSW5pdCBjYXJyZWdvdS4nXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChldmVudCkgdGhpcy5wYWdlRXZlbnQgPSBldmVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdJTkVTUEVSQURPISBDb25kacOnw6NvIGRlIG5hdmVnYcOnw6NvIG7Do28gdHJhdGFkYTonLCBldmVudCk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChldmVudCkgdGhpcy5wYWdlRXZlbnQgPSBldmVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobmF2aWdhdGlvbkRpcmVjdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zUGFnaW5hdGVkKG5hdmlnYXRpb25EaXJlY3Rpb24sIHJlc2V0RG9jcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJybyBhbyBjYXJyZWdhciBpdGVucyBwYWdpbmFkb3M6JywgZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGlmIChvcmlnaW5hbFBhZ2VTaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gb3JpZ2luYWxQYWdlU2l6ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50KSB0aGlzLnBhZ2VFdmVudCA9IGV2ZW50O1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyBPdXRyb3MgbcOpdG9kb3NcblxuICBhcHBseUZpbHRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgLy8gU2VtIHBhZ2luYcOnw6NvXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmZpbHRlciA9IFN0cmluZyh2YWx1ZSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIC8vIENvbSBwYWdpbmHDp8Ojb1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5maWx0ZXJTdWJqZWN0Lm5leHQodGhpcy5maWx0ZXJWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ29Ub0RldGFpbHMocm93OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhLmlzTm90Q2xpY2thYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHVybFBhdGggPSB0aGlzLmRhdGEudXJsIHx8IHRoaXMuZGF0YS5uYW1lO1xuICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybChcbiAgICAgIHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW2AvJHt1cmxQYXRofWAsIHJvdy5pZF0pXG4gICAgKTtcbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlbGF0aW9uKHBhcmFtczoge1xuICAgIGlkOiBhbnk7XG4gICAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAgIG5ld1Byb3BlcnR5OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgc25hcHNob3Q6IGZpcmVzdG9yZS5Eb2N1bWVudFNuYXBzaG90PHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBwYXJhbXMuaWQgIT09ICcnICYmXG4gICAgICAgIHBhcmFtcy5pZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhcmFtcy5jb2xsZWN0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFyYW1zLmNvbGxlY3Rpb24gIT09ICcnXG4gICAgICApIHtcbiAgICAgICAgc25hcHNob3QgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLmZpcmVzdG9yZS5jb2xsZWN0aW9uKHBhcmFtcy5jb2xsZWN0aW9uKS5kb2MocGFyYW1zLmlkKS5nZXQoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNuYXBzaG90ICYmIHNuYXBzaG90LmV4aXN0cykge1xuICAgICAgICBjb25zdCBkYXRhID0gc25hcHNob3QuZGF0YSgpIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIGRhdGE/LltwYXJhbXMubmV3UHJvcGVydHldID8/ICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICcnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFJlbGF0aW9ucygpIHtcbiAgICBjb25zdCByZWxhdGlvblByb21pc2VzID0gdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLnJlbGF0aW9uKVxuICAgICAgLmZsYXRNYXAoKGNvbCkgPT5cbiAgICAgICAgdGhpcy5pdGVtcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoY29sLnJlbGF0aW9uKSB7XG4gICAgICAgICAgICBpdGVtW2NvbC5wcm9wZXJ0eV0gPSBhd2FpdCB0aGlzLmdldFJlbGF0aW9uKHtcbiAgICAgICAgICAgICAgaWQ6IGl0ZW1bY29sLnJlbGF0aW9uLnNvdXJjZVByb3BlcnR5XSxcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sLnJlbGF0aW9uLnRhcmdldGVkQ29sbGVjdGlvbixcbiAgICAgICAgICAgICAgbmV3UHJvcGVydHk6IGNvbC5yZWxhdGlvbi50YXJnZXRlZFByb3BlcnR5IHx8IGNvbC5wcm9wZXJ0eSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChyZWxhdGlvblByb21pc2VzKTtcbiAgfVxuXG4gIGFzeW5jIGdldFF1ZXJ5TGVuZ3RoKHBhcmFtczoge1xuICAgIGl0ZW06IGFueTtcbiAgICByZWxhdGlvbjoge1xuICAgICAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAgICAgcHJvcGVydHk6IHN0cmluZztcbiAgICAgIG9wZXJhdG9yOiBXaGVyZUZpbHRlck9wO1xuICAgICAgdmFsdWU6IHN0cmluZztcbiAgICB9O1xuICB9KSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0aGlzLmZpcmVzdG9yZVxuICAgICAgLmNvbGxlY3Rpb24ocGFyYW1zLnJlbGF0aW9uLmNvbGxlY3Rpb24pXG4gICAgICAucmVmLndoZXJlKFxuICAgICAgICBwYXJhbXMucmVsYXRpb24ucHJvcGVydHksXG4gICAgICAgIHBhcmFtcy5yZWxhdGlvbi5vcGVyYXRvcixcbiAgICAgICAgcGFyYW1zLml0ZW1bcGFyYW1zLnJlbGF0aW9uLnZhbHVlXVxuICAgICAgKVxuICAgICAgLmdldCgpO1xuICAgIHJldHVybiBzbmFwc2hvdC5zaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUXVlcnlMZW5ndGhzKCkge1xuICAgIGNvbnN0IGxlbmd0aFByb21pc2VzID0gdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLnF1ZXJ5TGVuZ3RoKVxuICAgICAgLmZsYXRNYXAoKGNvbCkgPT5cbiAgICAgICAgdGhpcy5pdGVtcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoY29sLnF1ZXJ5TGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVtW2NvbC5wcm9wZXJ0eV0gPSBhd2FpdCB0aGlzLmdldFF1ZXJ5TGVuZ3RoKHtcbiAgICAgICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICAgICAgcmVsYXRpb246IGNvbC5xdWVyeUxlbmd0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwobGVuZ3RoUHJvbWlzZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtcygpIHtcbiAgICBpZiAodGhpcy5kYXRhLmNvbmRpdGlvbnMpIHtcbiAgICAgIHRoaXMuZGF0YS5jb25kaXRpb25zLmZvckVhY2goKGNvbmQpID0+IHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3BlcmF0b3JGdW5jdGlvbiA9ICh0aGlzLnRhYmxlU2VydmljZS5vcGVyYXRvcnMgYXMgYW55KVtcbiAgICAgICAgICAgIGNvbmQub3BlcmF0b3JcbiAgICAgICAgICBdO1xuICAgICAgICAgIGlmIChvcGVyYXRvckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gb3BlcmF0b3JGdW5jdGlvbihcbiAgICAgICAgICAgICAgaXRlbVtjb25kLmZpcmVzdG9yZVByb3BlcnR5XSxcbiAgICAgICAgICAgICAgY29uZC5kYXNoUHJvcGVydHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQXJyYW5nZUZyb21GaWx0ZXJzKCk6IEFycmFuZ2Uge1xuICAgIGNvbnN0IGFjdGl2ZUZpbHRlcnMgPSB0aGlzLmZpbHRlcnNGb3JtLmNvbnRyb2xzXG4gICAgICAuZmxhdE1hcCgoY29udHJvbCkgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlO1xuICAgICAgICBpZiAoIXNlbGVjdGVkRmlsdGVyKSByZXR1cm4gW107XG5cbiAgICAgICAgY29uc3QgYXJyYW5nZSA9IHNlbGVjdGVkRmlsdGVyLmFycmFuZ2U7XG5cbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXInKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBncm91cC5nZXQoJ3R5cGVGaWx0ZXInKT8udmFsdWU7XG4gICAgICAgICAgaWYgKCFmaWx0ZXJWYWx1ZSkgcmV0dXJuIFtdO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgIHByb3BlcnR5OiBzZWxlY3RlZEZpbHRlci5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgZmlsdGVyaW5nOiBmaWx0ZXJWYWx1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlRmlsdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJykge1xuICAgICAgICAgIGNvbnN0IGluaXRpYWwgPSBncm91cC5nZXQoJ2luaXRpYWxEYXRlJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGZpbmFsID0gZ3JvdXAuZ2V0KCdmaW5hbERhdGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGluaXRpYWwgJiYgZmluYWwpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IFtkYXlJLCBtb250aEksIHllYXJJXSA9IGluaXRpYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEl9LyR7ZGF5SX0vJHt5ZWFySX1gKTtcbiAgICAgICAgICAgICAgY29uc3QgW2RheUYsIG1vbnRoRiwgeWVhckZdID0gZmluYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgY29uc3QgZmluYWxEYXRlID0gbmV3IERhdGUoYCR7bW9udGhGfS8ke2RheUZ9LyR7eWVhckZ9YCk7XG4gICAgICAgICAgICAgIGZpbmFsRGF0ZS5zZXRIb3VycygyMywgNTksIDU5KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICAgIGluaXRpYWw6IGluaXRpYWxEYXRlLFxuICAgICAgICAgICAgICAgICAgZmluYWw6IGZpbmFsRGF0ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWRGaWx0ZXIuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJykgJiYgYXJyYW5nZSA9PT0gJ2VxdWFscycpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gZ3JvdXAuZ2V0KCdzZWxlY3RJdGVtJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZikgPT4gZiAmJiAoZi5maWx0ZXI/LmZpbHRlcmluZyAhPT0gdW5kZWZpbmVkIHx8IGYuZGF0ZUZpbHRlcikpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlcnM6IGFjdGl2ZUZpbHRlcnMsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgIH07XG4gIH1cblxuICAvLyBGaWx0cm8gZGUgZGF0YVxuICBhc3luYyBzZWFyY2goZXZlbnQ/OiBFdmVudCkge1xuICAgIC8vIFByZXZlbmlyIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBmb3JtdWzDoXJpbyBhbyBwcmVzc2lvbmFyIEVudGVyXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0U29ydC52YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0U29ydC52YWx1ZS5hcnJhbmdlID09PSAnYXNjZW5kaW5nJykge1xuICAgICAgICB0aGlzLnNvcnRCeSA9IHtcbiAgICAgICAgICBmaWVsZDogdGhpcy5zZWxlY3RTb3J0LnZhbHVlLnByb3BlcnR5LFxuICAgICAgICAgIG9yZGVyOiAnYXNjJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdFNvcnQudmFsdWUuYXJyYW5nZSA9PT0gJ2Rlc2NlbmRpbmcnKSB7XG4gICAgICAgIHRoaXMuc29ydEJ5ID0ge1xuICAgICAgICAgIGZpZWxkOiB0aGlzLnNlbGVjdFNvcnQudmFsdWUucHJvcGVydHksXG4gICAgICAgICAgb3JkZXI6ICdkZXNjJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZW0gcGFnaW5hw6fDo286IGFwbGljYXIgZmlsdHJvcyBjbGllbnQtc2lkZVxuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEF0dWFsaXphciBhcnJhbmdlIGNvbSBvcyBmaWx0cm9zIGF0aXZvc1xuICAgICAgdGhpcy5hcnJhbmdlID0gdGhpcy5idWlsZEFycmFuZ2VGcm9tRmlsdGVycygpO1xuICAgICAgdGhpcy5hcHBseUZpbHRlcnNUb0RhdGFTb3VyY2UoKTtcbiAgICAgIHRoaXMuY3VycmVudEFycmFuZ2UgPVxuICAgICAgICB0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRoaXMuZmlsdGVyc0Zvcm0uYXQoMCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPz8gJydcbiAgICAgICAgICA6ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb20gcGFnaW5hw6fDo286IGNvbXBvcnRhbWVudG8gb3JpZ2luYWxcbiAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zUGFnaW5hdGVkKCdyZWxvYWQnLCB0cnVlKTtcbiAgICAgIHRoaXMuY3VycmVudEFycmFuZ2UgPVxuICAgICAgICB0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRoaXMuZmlsdGVyc0Zvcm0uYXQoMCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPz8gJydcbiAgICAgICAgICA6ICcnO1xuICAgICAgdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVzZXRGaWx0ZXIoKSB7XG4gICAgdGhpcy5kYXRhU291cmNlLmZpbHRlciA9ICcnO1xuICAgIGlmICh0aGlzLmZpbHRlclByZWRpY2F0ZSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9IHRoaXMuZmlsdGVyUHJlZGljYXRlO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyc0Zvcm0uY2xlYXIoKTtcbiAgICB0aGlzLmFkZEZpbHRlcigpO1xuICAgIHRoaXMuc2VsZWN0U29ydC5wYXRjaFZhbHVlKCcnKTtcbiAgICB0aGlzLnNvcnRCeSA9IHtcbiAgICAgIG9yZGVyOiB0aGlzLmRhdGEuc29ydEJ5ID8gdGhpcy5kYXRhLnNvcnRCeS5vcmRlciA6ICdkZXNjJyxcbiAgICAgIGZpZWxkOiB0aGlzLmRhdGEuc29ydEJ5ID8gdGhpcy5kYXRhLnNvcnRCeS5maWVsZCA6ICdjcmVhdGVkQXQnLFxuICAgIH07XG5cbiAgICAvLyBTZW0gcGFnaW5hw6fDo286IHJlY2FycmVnYXIgaXRlbnMgb3JpZ2luYWlzXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgLy8gUmVzZXRhciBhcnJhbmdlIHBhcmEgdmFsb3JlcyBwYWRyw6NvXG4gICAgICB0aGlzLmFycmFuZ2UgPSB7XG4gICAgICAgIGZpbHRlcnM6IFtdLFxuICAgICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgICAgfTtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gWy4uLnRoaXMuaXRlbXNdO1xuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgICB0aGlzLmN1cnJlbnRBcnJhbmdlID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbSBwYWdpbmHDp8OjbzogY29tcG9ydGFtZW50byBvcmlnaW5hbFxuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXNQYWdpbmF0ZWQoJ3JlbG9hZCcsIHRydWUpO1xuICAgICAgdGhpcy5jdXJyZW50QXJyYW5nZSA9ICcnO1xuICAgICAgdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTcOpdG9kbyBww7pibGljbyBwYXJhIHJlY2FycmVnYXIgYSB0YWJlbGFcbiAgYXN5bmMgcmVsb2FkVGFibGUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRJdGVtc1BhZ2luYXRlZCgncmVsb2FkJywgdHJ1ZSk7XG4gICAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXMoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEaXNwbGF5ZWRDb2x1bW5zKCkge1xuICAgIGlmICh0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8YW55PihbXSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2x1bW5Qcm9wZXJ0aWVzID0gdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICAgIHJldHVybiBjb2x1bW4ucHJvcGVydHk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRyb3Bkb3duSXRlbXMgPSBbXTtcbiAgICB0aGlzLnNvcnRhYmxlRHJvcGRvd25JdGVtcyA9IFtdO1xuXG4gICAgdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLmlzRmlsdGVyYWJsZSkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdmaWx0ZXInLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbC5pc1NvcnRhYmxlKSB7XG4gICAgICAgIHRoaXMuc29ydGFibGVEcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnYXNjZW5kaW5nJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogY3Jlc2NlbnRlJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc29ydGFibGVEcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnZGVzY2VuZGluZycsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGRlY3Jlc2NlbnRlJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY29sLmlzRmlsdGVyYWJsZUJ5RGF0ZSkge1xuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdmaWx0ZXJCeURhdGUnLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUgKyAnOiBmaWx0cm8gcG9yIGRhdGEnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucyAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMpXG4gICAgKSB7XG4gICAgICB0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PlxuICAgICAgICB0aGlzLmRyb3Bkb3duSXRlbXMucHVzaCh7IC4uLm9wdGlvbiwgYXJyYW5nZTogJ2VxdWFscycgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaXNTdHJpbmcodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICB9XG5cbiAgLy8gTcOpdG9kb3MgcGFyYSBjb250cm9sZSBkbyB0b29sdGlwXG4gIG9uQ2VsbE1vdXNlRW50ZXIoZXZlbnQ6IE1vdXNlRXZlbnQsIHJvdzogYW55LCBjb2w6IGFueSk6IHZvaWQge1xuICAgIC8vIFPDsyBtb3N0cmFyIHRvb2x0aXAgc2UgYSBjb2x1bmEgdGl2ZXIgY2hhckxpbWl0IGRlZmluaWRvXG4gICAgaWYgKCFjb2wuY2hhckxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZnVsbFZhbHVlID0gdGhpcy5nZXREaXNwbGF5VmFsdWUoY29sLCByb3csIHRydWUpO1xuXG4gICAgLy8gU8OzIG1vc3RyYXIgdG9vbHRpcCBzZSBvIHZhbG9yIGNvbXBsZXRvIGZvciBtYWlvciBxdWUgbyBsaW1pdGVcbiAgICBpZiAoZnVsbFZhbHVlLmxlbmd0aCA8PSBjb2wuY2hhckxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ob3ZlcmVkQ2VsbCA9IHsgcm93LCBjb2wgfTtcbiAgICB0aGlzLnRvb2x0aXBDb250ZW50ID0gZnVsbFZhbHVlO1xuXG4gICAgLy8gRGVmaW5pciBwb3Npw6fDo28gZG8gdG9vbHRpcFxuICAgIHRoaXMudG9vbHRpcFBvc2l0aW9uID0ge1xuICAgICAgeDogZXZlbnQuY2xpZW50WCArIDEwLFxuICAgICAgeTogZXZlbnQuY2xpZW50WSAtIDEwLFxuICAgIH07XG5cbiAgICAvLyBUaW1lb3V0IHBhcmEgbW9zdHJhciBvIHRvb2x0aXBcbiAgICB0aGlzLnRvb2x0aXBUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaG92ZXJlZENlbGwgJiZcbiAgICAgICAgdGhpcy5ob3ZlcmVkQ2VsbC5yb3cgPT09IHJvdyAmJlxuICAgICAgICB0aGlzLmhvdmVyZWRDZWxsLmNvbCA9PT0gY29sXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zaG93VG9vbHRpcCA9IHRydWU7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIG9uQ2VsbE1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICAgIHRoaXMudG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1Rvb2x0aXAgPSBmYWxzZTtcbiAgICB0aGlzLmhvdmVyZWRDZWxsID0gbnVsbDtcbiAgICB0aGlzLnRvb2x0aXBDb250ZW50ID0gJyc7XG4gIH1cblxuICBvbkNlbGxNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93VG9vbHRpcCkge1xuICAgICAgdGhpcy50b29sdGlwUG9zaXRpb24gPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggKyAxMCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIDEwLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBNw6l0b2RvcyBwYXJhIGludmVyc8OjbyB2ZXJ0aWNhbCBkb3MgdGFic1xuICBnZXRUYWJHcm91cHModGFiczogYW55W10pOiBudW1iZXJbXSB7XG4gICAgaWYgKCF0YWJzIHx8IHRhYnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCB0b3RhbEdyb3VwcyA9IE1hdGguY2VpbCh0YWJzLmxlbmd0aCAvIDYpO1xuICAgIGNvbnN0IGdyb3VwczogbnVtYmVyW10gPSBbXTtcblxuICAgIC8vIENyaWFyIGFycmF5IGRlIMOtbmRpY2VzIGludmVydGlkb3MgKMO6bHRpbW8gZ3J1cG8gcHJpbWVpcm8pXG4gICAgZm9yIChsZXQgaSA9IHRvdGFsR3JvdXBzIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGdyb3Vwcy5wdXNoKGkpO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICBnZXRUYWJHcm91cCh0YWJzOiBhbnlbXSwgZ3JvdXBJbmRleDogbnVtYmVyKTogYW55W10ge1xuICAgIGlmICghdGFicyB8fCB0YWJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IGdyb3VwSW5kZXggKiA2O1xuICAgIGNvbnN0IGVuZEluZGV4ID0gTWF0aC5taW4oc3RhcnRJbmRleCArIDYsIHRhYnMubGVuZ3RoKTtcblxuICAgIHJldHVybiB0YWJzLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgfVxuXG4gIGdldFJlYWxUYWJJbmRleChncm91cEluZGV4OiBudW1iZXIsIHRhYkluZGV4SW5Hcm91cDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuZGF0YS50YWJzPy50YWJzRGF0YSkgcmV0dXJuIDA7XG4gICAgY29uc3QgdG90YWxHcm91cHMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLnRhYnMudGFic0RhdGEubGVuZ3RoIC8gNik7XG4gICAgY29uc3QgcmVhbEdyb3VwSW5kZXggPSB0b3RhbEdyb3VwcyAtIDEgLSBncm91cEluZGV4O1xuICAgIHJldHVybiByZWFsR3JvdXBJbmRleCAqIDYgKyB0YWJJbmRleEluR3JvdXA7XG4gIH1cblxuICBvblRhYmxlU2VsZWN0ZWQoaTogbnVtYmVyLCBqOiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuZGF0YS50YWJzPy50YWJzRGF0YSB8fCAhdGhpcy5kYXRhLnRhYnMubWV0aG9kKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3RlZFRhYiA9IHRoaXMuZ2V0UmVhbFRhYkluZGV4KGksIGopO1xuICAgIGNvbnN0IHRhYiA9IHRoaXMuZGF0YS50YWJzLnRhYnNEYXRhW3RoaXMuc2VsZWN0ZWRUYWJdO1xuICAgIGlmICh0YWIpIHtcbiAgICAgIHRoaXMuZGF0YS50YWJzLm1ldGhvZCh0YWIsIHRoaXMuc2VsZWN0ZWRUYWIpO1xuICAgIH1cbiAgfVxuXG4gIGlzVGFiU2VsZWN0ZWQob3JpZ2luYWxJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWIgPT09IG9yaWdpbmFsSW5kZXg7XG4gIH1cblxuICBzaG91bGRTaG93QWN0aW9uQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5kYXRhPy5hY3Rpb25CdXR0b24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGF0YS5hY3Rpb25CdXR0b24uY29uZGl0aW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YS5hY3Rpb25CdXR0b24uY29uZGl0aW9uKG51bGwpID8/IHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBNw6l0b2RvIHBhcmEgbGlkYXIgY29tIGRvd25sb2FkIChkaWZlcmVudGUgcGFyYSBwYWdpbmFkbyBlIG7Do28gcGFnaW5hZG8pXG4gIGhhbmRsZURvd25sb2FkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kb3dubG9hZFRhYmxlKSByZXR1cm47XG5cbiAgICAvLyBTZSBuw6NvIGjDoSBwYWdpbmHDp8OjbywgdXNhciBkYWRvcyBmaWx0cmFkb3MgZG8gZGF0YVNvdXJjZVxuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEF0dWFsaXphciBmaWx0ZXJlZEl0ZW1zIGNvbSBvcyBkYWRvcyBmaWx0cmFkb3MgZG8gZGF0YVNvdXJjZVxuICAgICAgLy8gKHF1ZSBqw6EgaW5jbHVpIGZpbHRybyBkZSB0ZXh0byBhcGxpY2FkbyB2aWEgZmlsdGVyUHJlZGljYXRlKVxuICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZSAmJiB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyZWREYXRhKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFsuLi50aGlzLmRhdGFTb3VyY2UuZmlsdGVyZWREYXRhXTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29uc3RydWlyIGFycmFuZ2UgY29tIG9zIGZpbHRyb3MgYXRpdm9zIChzZSBob3V2ZXIpXG4gICAgICBjb25zdCBhcnJhbmdlID0gdGhpcy5idWlsZEFycmFuZ2VGcm9tRmlsdGVycygpO1xuICAgICAgdGhpcy5kb3dubG9hZFRhYmxlKGFycmFuZ2UsIHRoaXMuZGF0YS5jb25kaXRpb25zIHx8IFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTW9kbyBwYWdpbmFkbzogdXNhciBhcnJhbmdlIGV4aXN0ZW50ZSAoY29tcG9ydGFtZW50byBvcmlnaW5hbClcbiAgICAgIGlmICh0aGlzLmFycmFuZ2UpIHtcbiAgICAgICAgdGhpcy5kb3dubG9hZFRhYmxlKHRoaXMuYXJyYW5nZSwgdGhpcy5kYXRhLmNvbmRpdGlvbnMgfHwgW10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImRhdGFcIiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTZcIj5cbiAgICA8IS0tIFVOSUZJRUQgQ09OVFJPTCBQQU5FTDogRklMVEVSUywgU09SVCAmIEFDVElPTlMgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyb3VuZGVkLXhsIGJvcmRlciBib3JkZXItZ3JheS0yMDAgYmctd2hpdGUgcC00IHNoYWRvdy1sZ1wiXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBkYXRhLnBhZ2luYXRpb24gPT09IHRydWUgJiZcbiAgICAgICAgKGRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHNvcnRhYmxlRHJvcGRvd25JdGVtcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgZGF0YS5hY3Rpb25CdXR0b24pXG4gICAgICBcIlxuICAgID5cbiAgICAgIDwhLS0gUEFORUwgSEVBREVSOiBUaXRsZSwgQ3VzdG9tIEFjdGlvbiwgYW5kIEdsb2JhbCBBY3Rpb25zIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm1iLTQgZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLWItMiBib3JkZXItZ3JheS0yMDAgcGItNCBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXJcIlxuICAgICAgPlxuICAgICAgICA8IS0tIExlZnQgU2lkZTogVGl0bGUgJiBNYWluIEFjdGlvbiBCdXR0b24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsdGVyIHRleHQteGwgdGV4dC1ibHVlLTUwMFwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sZyBmb250LXNlbWlib2xkIHRleHQtZ3JheS03MDBcIlxuICAgICAgICAgICAgICA+RmlsdHJvcyBlIEHDp8O1ZXM8L3NwYW5cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImRhdGEuYWN0aW9uQnV0dG9uICYmIGRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvblwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgKGRhdGEuYWN0aW9uQnV0dG9uLmNvbG9yQ2xhc3MgfHwgJ2JnLWJsdWUtNTAwJykgK1xuICAgICAgICAgICAgICAnIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgcHgtNCBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSBob3ZlcjpvcGFjaXR5LTcwJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cImRhdGEuYWN0aW9uQnV0dG9uLnJvdXRlckxpbmtcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QgPyBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QoJGV2ZW50KSA6IG51bGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmFjdGlvbkJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImRhdGEuYWN0aW9uQnV0dG9uLmljb25cIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIHt7IGRhdGEuYWN0aW9uQnV0dG9uLmxhYmVsIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUmlnaHQgU2lkZTogU2VhcmNoLCBSZXNldCwgRXhwb3J0IC0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIHRoaXMuaGFzRmlsdGVyYWJsZUNvbHVtbiA9PT0gdHJ1ZSB8fCB0aGlzLmhhc1NvcnRhYmxlQ29sdW1uID09PSB0cnVlXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2goKVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1ncmVlbi02MDAgcHgtNSBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmVlbi03MDBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFwbGljYXIgZmlsdHJvc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2hcIj48L2k+XG4gICAgICAgICAgICBQZXNxdWlzYXJcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcigpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1yZWQtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctcmVkLTYwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTGltcGFyIGZpbHRyb3NcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXJlZG8tYWx0XCI+PC9pPlxuICAgICAgICAgICAgUmVzZXRhclxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmRvd25sb2FkICE9PSBmYWxzZSAmJiBkb3dubG9hZFRhYmxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1vcmFuZ2UtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6Ymctb3JhbmdlLTYwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiRXhwb3J0YXIgVGFiZWxhXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlICYmIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGEubGVuZ3RoIDw9IDBcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICRhbnkoYXJyYW5nZSkgJiYgZG93bmxvYWRUYWJsZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBkb3dubG9hZFRhYmxlKCRhbnkoYXJyYW5nZSksIGRhdGEuY29uZGl0aW9ucyB8fCBbXSlcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgIEV4cG9ydGFyXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRklMVEVSUyBDT05URU5UIChXSVRIIFJFRklORU1FTlRTKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi00IHNwYWNlLXktM1wiICpuZ0lmPVwiZmlsdGVyc0Zvcm0uY29udHJvbHMubGVuZ3RoID4gMFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgW2Zvcm1Hcm91cF09XCIkYW55KGZpbHRlckdyb3VwKVwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGZpbHRlckdyb3VwIG9mIGZpbHRlcnNGb3JtLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAtMyByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItZ3JheS0yMDAgcC0yXCJcbiAgICAgICAgPlxuICAgICAgICAgIDwhLS0gRklMVEVSIFRZUEUgU0VMRUNUT1IgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCIgKm5nSWY9XCJkcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+VGlwbyBkZSBmaWx0cm88L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZSBvIHRpcG8uLi5cIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdEZpbHRlclwiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdEZpbHRlckNoYW5nZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRBdmFpbGFibGVGaWx0ZXJPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJpdGVtLmljb24gfHwgJ2ZhIGZhLWZpbHRlcidcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWJsdWUtNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVEVYVCBGSUxURVIgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy1bMjAwcHhdIGZsZXgtMVwiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZT8uYXJyYW5nZSA9PT0gJ2ZpbHRlcidcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zZWFyY2ggdGV4dC1ncmF5LTQwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57e1xuICAgICAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KFwic2VsZWN0RmlsdGVyXCIpPy52YWx1ZT8udGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgICAgXCJGaWx0cmFyXCJcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidHlwZUZpbHRlclwiXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkRpZ2l0ZSBwYXJhIGZpbHRyYXIuLi5cIlxuICAgICAgICAgICAgICAgICNpbnB1dFxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRFJPUERPV04gRklMVEVSIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWUgJiZcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cClcbiAgICAgICAgICAgICAgICAuZ2V0KCdzZWxlY3RGaWx0ZXInKVxuICAgICAgICAgICAgICAgID8udmFsdWUuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJylcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e1xuICAgICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldChcInNlbGVjdEZpbHRlclwiKT8udmFsdWU/LnRpdGxlIHx8XG4gICAgICAgICAgICAgICAgICBcIlNlbGVjaW9uZVwiXG4gICAgICAgICAgICAgIH19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUuLi5cIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdEl0ZW1cIlxuICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtIG9mICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgLml0ZW1zXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIERBVEUgRklMVEVSIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibWluLXctWzM0MHB4XSBmbGV4LWF1dG9cIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPT09XG4gICAgICAgICAgICAgICdmaWx0ZXJCeURhdGUnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLXN0cmV0Y2ggZ2FwLTMgc206ZmxleC1yb3cgc206aXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgdGV4dC1ncmF5LTQwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkRhdGEgSW5pY2lhbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25EYXRlSW5wdXQoJGV2ZW50LCAnaW5pdGlhbERhdGUnLCBpKVwiXG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJpbml0aWFsRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkREL01NL0FBQUFcIlxuICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgdGV4dC1ncmF5LTQwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkRhdGEgRmluYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJzZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25EYXRlSW5wdXQoJGV2ZW50LCAnZmluYWxEYXRlJywgaSlcIlxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpbmFsRGF0ZVwiXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkREL01NL0FBQUFcIlxuICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwiMTBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gUkVNT1ZFIEZJTFRFUiBCVVRUT04gLS0+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZpbHRlcnNGb3JtLmxlbmd0aCA+IDFcIiBjbGFzcz1cIm1sLWF1dG8gZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGkpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtMTAgdy0xMCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1mdWxsIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTMwMCBob3ZlcjpiZy1yZWQtMTAwXCJcbiAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlJlbW92ZXIgZmlsdHJvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaCB0ZXh0LXJlZC01MDAgaG92ZXI6dGV4dC1yZWQtNjAwXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUEFORUwgRk9PVEVSOiBBZGQgRmlsdGVyICYgU29ydCAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCItbWItMiBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwIHB0LTQgc206ZmxleC1yb3dcIlxuICAgICAgPlxuICAgICAgICA8IS0tIEFkZCBGaWx0ZXIgQnV0dG9uIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZHJvcGRvd25JdGVtcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cImFkZEZpbHRlcigpXCJcbiAgICAgICAgICAgIGNsYXNzPVwidHJhbnNmb3JtIHJvdW5kZWQtZnVsbCBib3JkZXItMiBib3JkZXItYmx1ZS0zMDAgYmctYmx1ZS01MCBweC02IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWJsdWUtNjAwIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTMwMCBob3ZlcjotdHJhbnNsYXRlLXktMC41IGhvdmVyOmJvcmRlci1ibHVlLTQwMCBob3ZlcjpiZy1ibHVlLTEwMCBob3ZlcjpzaGFkb3ctbWRcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFkaWNpb25hciBub3ZvIGZpbHRyb1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wbHVzIG1yLTJcIj48L2k+XG4gICAgICAgICAgICBBZGljaW9uYXIgRmlsdHJvXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU29ydCBEcm9wZG93biAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidy1mdWxsIHNtOnctYXV0byBzbTptaW4tdy1bMjUwcHhdXCJcbiAgICAgICAgICAqbmdJZj1cInNvcnRhYmxlRHJvcGRvd25JdGVtcy5sZW5ndGggPiAwXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPk9yZGVuYXIgcG9yPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZS4uLlwiIFtmb3JtQ29udHJvbF09XCJzZWxlY3RTb3J0XCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc29ydGFibGVEcm9wZG93bkl0ZW1zXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc29ydC1hbHBoYS1kb3duIHRleHQtY3lhbi02MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gU0lNUExFIFNFQVJDSCAoZm9yIG5vbi1wYWdpbmF0ZWQgdGFibGVzKSAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBiZy13aGl0ZSBwLTQgc2hhZG93LWxnXCJcbiAgICAgICpuZ0lmPVwiZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSAmJiBoYXNGaWx0ZXJhYmxlQ29sdW1uID09PSB0cnVlXCJcbiAgICA+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaCB0ZXh0LWJsdWUtNTAwXCI+PC9pPlxuICAgICAgICAgIEJ1c2NhclxuICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgIChrZXl1cCk9XCJhcHBseUZpbHRlcihmaWx0ZXJJbnB1dC52YWx1ZSlcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGlnaXRlIHBhcmEgZmlsdHJhci4uLlwiXG4gICAgICAgICAgI2ZpbHRlcklucHV0XG4gICAgICAgIC8+XG4gICAgICAgIDxtYXQtaWNvbiBtYXRTdWZmaXggY2xhc3M9XCJ0ZXh0LWdyYXktNTAwXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwiZGF0YS5hY3Rpb25CdXR0b25cIlxuICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAoZGF0YS5hY3Rpb25CdXR0b24uY29sb3JDbGFzcyB8fCAnYmctYmx1ZS01MDAnKSArXG4gICAgICAgICAgJyBmbG9hdC1yaWdodCBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgaG92ZXI6b3BhY2l0eS03MCdcbiAgICAgICAgXCJcbiAgICAgICAgW3JvdXRlckxpbmtdPVwiZGF0YS5hY3Rpb25CdXR0b24ucm91dGVyTGlua1wiXG4gICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QgPyBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QoJGV2ZW50KSA6IG51bGxcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPGkgKm5nSWY9XCJkYXRhLmFjdGlvbkJ1dHRvbi5pY29uXCIgW2NsYXNzXT1cImRhdGEuYWN0aW9uQnV0dG9uLmljb25cIj48L2k+XG4gICAgICAgIHt7IGRhdGEuYWN0aW9uQnV0dG9uLmxhYmVsIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRklMVEVSUyBQQU5FTCAoZm9yIG5vbi1wYWdpbmF0ZWQgdGFibGVzKSAtLT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJvdW5kZWQteGwgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBiZy13aGl0ZSBwLTQgc2hhZG93LWxnXCJcbiAgICAgICpuZ0lmPVwiZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSAmJiBkcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIlxuICAgID5cbiAgICAgIDwhLS0gRklMVEVSUyBDT05URU5UIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTQgc3BhY2UteS0zXCIgKm5nSWY9XCJmaWx0ZXJzRm9ybS5jb250cm9scy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbZm9ybUdyb3VwXT1cIiRhbnkoZmlsdGVyR3JvdXApXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgZmlsdGVyR3JvdXAgb2YgZmlsdGVyc0Zvcm0uY29udHJvbHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC0zIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBwLTJcIlxuICAgICAgICA+XG4gICAgICAgICAgPCEtLSBGSUxURVIgVFlQRSBTRUxFQ1RPUiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIiAqbmdJZj1cImRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5UaXBvIGRlIGZpbHRybzwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lIG8gdGlwby4uLlwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0RmlsdGVyXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uU2VsZWN0RmlsdGVyQ2hhbmdlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldEF2YWlsYWJsZUZpbHRlck9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cIml0ZW0uaWNvbiB8fCAnZmEgZmEtZmlsdGVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXNtIHRleHQtYmx1ZS01MDBcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBURVhUIEZJTFRFUiAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlPy5hcnJhbmdlID09PSAnZmlsdGVyJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaCB0ZXh0LWdyYXktNDAwXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7XG4gICAgICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoXCJzZWxlY3RGaWx0ZXJcIik/LnZhbHVlPy50aXRsZSB8fFxuICAgICAgICAgICAgICAgICAgICBcIkZpbHRyYXJcIlxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlRmlsdGVyXCJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRGlnaXRlIHBhcmEgZmlsdHJhci4uLlwiXG4gICAgICAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBEUk9QRE9XTiBGSUxURVIgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy1bMjAwcHhdIGZsZXgtMVwiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZSAmJlxuICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKVxuICAgICAgICAgICAgICAgIC5nZXQoJ3NlbGVjdEZpbHRlcicpXG4gICAgICAgICAgICAgICAgPy52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7XG4gICAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KFwic2VsZWN0RmlsdGVyXCIpPy52YWx1ZT8udGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgIFwiU2VsZWNpb25lXCJcbiAgICAgICAgICAgICAgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZS4uLlwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0SXRlbVwiXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gb2YgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAuaXRlbXNcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gREFURSBGSUxURVIgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy1bMzQwcHhdIGZsZXgtYXV0b1wiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZT8uYXJyYW5nZSA9PT1cbiAgICAgICAgICAgICAgJ2ZpbHRlckJ5RGF0ZSdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtc3RyZXRjaCBnYXAtMyBzbTpmbGV4LXJvdyBzbTppdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciB0ZXh0LWdyYXktNDAwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RGF0YSBJbmljaWFsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbkRhdGVJbnB1dCgkZXZlbnQsICdpbml0aWFsRGF0ZScsIGkpXCJcbiAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uRGF0ZUZpbHRlckNoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImluaXRpYWxEYXRlXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiREQvTU0vQUFBQVwiXG4gICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciB0ZXh0LWdyYXktNDAwXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+RGF0YSBGaW5hbDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbkRhdGVJbnB1dCgkZXZlbnQsICdmaW5hbERhdGUnLCBpKVwiXG4gICAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkRhdGVGaWx0ZXJDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZmluYWxEYXRlXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiREQvTU0vQUFBQVwiXG4gICAgICAgICAgICAgICAgICBtYXhsZW5ndGg9XCIxMFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBSRU1PVkUgRklMVEVSIEJVVFRPTiAtLT5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyc0Zvcm0ubGVuZ3RoID4gMVwiIGNsYXNzPVwibWwtYXV0byBmbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVGaWx0ZXIoaSlcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC0xMCB3LTEwIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgdHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMzAwIGhvdmVyOmJnLXJlZC0xMDBcIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiUmVtb3ZlciBmaWx0cm9cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoIHRleHQtcmVkLTUwMCBob3Zlcjp0ZXh0LXJlZC02MDBcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQQU5FTCBGT09URVI6IEFkZCBGaWx0ZXIgJiBBY3Rpb25zIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIi1tYi0yIGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtNCBib3JkZXItdCBib3JkZXItZ3JheS0yMDAgcHQtNCBzbTpmbGV4LXJvd1wiXG4gICAgICA+XG4gICAgICAgIDwhLS0gQWRkIEZpbHRlciBCdXR0b24gLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJkcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkRmlsdGVyKClcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0cmFuc2Zvcm0gcm91bmRlZC1mdWxsIGJvcmRlci0yIGJvcmRlci1ibHVlLTMwMCBiZy1ibHVlLTUwIHB4LTYgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtYmx1ZS02MDAgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMzAwIGhvdmVyOi10cmFuc2xhdGUteS0wLjUgaG92ZXI6Ym9yZGVyLWJsdWUtNDAwIGhvdmVyOmJnLWJsdWUtMTAwIGhvdmVyOnNoYWRvdy1tZFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiQWRpY2lvbmFyIG5vdm8gZmlsdHJvXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXMgbXItMlwiPjwvaT5cbiAgICAgICAgICAgIEFkaWNpb25hciBGaWx0cm9cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaCgpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIGJnLWdyZWVuLTYwMCBweC01IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyZWVuLTcwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiQXBsaWNhciBmaWx0cm9zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaFwiPjwvaT5cbiAgICAgICAgICAgIEFwbGljYXJcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJyZXNldEZpbHRlcigpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1yZWQtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctcmVkLTYwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTGltcGFyIGZpbHRyb3NcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXJlZG8tYWx0XCI+PC9pPlxuICAgICAgICAgICAgUmVzZXRhclxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmRvd25sb2FkICE9PSBmYWxzZSAmJiBkb3dubG9hZFRhYmxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBiZy1vcmFuZ2UtNTAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6Ymctb3JhbmdlLTYwMFwiXG4gICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiRXhwb3J0YXIgVGFiZWxhXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlICYmIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGEubGVuZ3RoIDw9IDBcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRG93bmxvYWQoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgIEV4cG9ydGFyXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm14LWF1dG8gZmxleCBmbGV4LWNvbFwiXG4gICAgICAgICpuZ0lmPVwiZGF0YS50YWJzICYmIGRhdGEudGFicy50YWJzRGF0YSAmJiBkYXRhLnRhYnMudGFic0RhdGEubGVuZ3RoID4gMFwiXG4gICAgICA+XG4gICAgICAgIDwhLS0gQ2FsY3VsYXIgcXVhbnRvcyBncnVwb3MgZGUgNiB0YWJzIGV4aXN0ZW0gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgIGxldCBncm91cEluZGV4IG9mIGdldFRhYkdyb3VwcyhkYXRhLnRhYnMudGFic0RhdGEpO1xuICAgICAgICAgICAgbGV0IGkgPSBpbmRleFxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtYXV0byBmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgIGxldCB0YWIgb2YgZ2V0VGFiR3JvdXAoZGF0YS50YWJzLnRhYnNEYXRhLCBncm91cEluZGV4KTtcbiAgICAgICAgICAgICAgICBsZXQgaiA9IGluZGV4XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlci0yIGJvcmRlci1ncmF5LTMwMCBiZy1ncmF5LTIwMCBweC00IHB5LTIgZm9udC1tZWRpdW0gdHJhbnNpdGlvbiBob3ZlcjpicmlnaHRuZXNzLTk1XCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgICAgICAgIGlzVGFiU2VsZWN0ZWQoZ2V0UmVhbFRhYkluZGV4KGksIGopKVxuICAgICAgICAgICAgICAgICAgICA/ICdib3JkZXItYi0wIGJyaWdodG5lc3MtMTEwJ1xuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25UYWJsZVNlbGVjdGVkKGksIGopXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IHRhYi5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInRhYi5jb3VudGVyICE9PSB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtbC0yIHRleHQteHMgZm9udC1ib2xkXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInRhYi5jb3VudGVyQ2xhc3NcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IHRhYi5jb3VudGVyIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejggdy1mdWxsIG92ZXJmbG93LXgtYXV0byByb3VuZGVkLXhsIHRhYmxlLWNvbnRhaW5lclwiXG4gICAgICA+XG4gICAgICAgIDx0YWJsZVxuICAgICAgICAgIG1hdC10YWJsZVxuICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgICAgICAgIG1hdFNvcnRcbiAgICAgICAgICAjc29ydD1cIm1hdFNvcnRcIlxuICAgICAgICAgIG1hdFNvcnRBY3RpdmU9XCJjcmVhdGVkQXRcIlxuICAgICAgICAgIG1hdFNvcnREaXJlY3Rpb249XCJkZXNjXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2wgb2YgZGF0YS5kaXNwbGF5ZWRDb2x1bW5zXCJcbiAgICAgICAgICAgIG1hdENvbHVtbkRlZj1cInt7IGNvbC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbWF0SGVhZGVyQ2VsbERlZj5cbiAgICAgICAgICAgICAgPCEtLSBJRiBUSEUgQ09MVU1OIElTIE5PVCBTT1JUQUJMRSwgVEhFTiBET04nVCBTSE9XIFRIRSBTT1JUIEJVVFRPTlMgLS0+XG4gICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWNvbC5pc1NvcnRhYmxlIHx8IGRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBjb2wudGl0bGUgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPCEtLSBJRiBUSEUgQ09MVU1OIElTIFNPUlRBQkxFLCBUSEVOIFNIT1cgVEhFIFNPUlQgQlVUVE9OUyAtLT5cbiAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaXNTb3J0YWJsZSAmJiBkYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBtYXQtaGVhZGVyLWNlbGxcbiAgICAgICAgICAgICAgICBtYXQtc29ydC1oZWFkZXJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGNvbC50aXRsZSB9fVxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBtYXQtY2VsbFxuICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IHJvd1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbC5tZXRob2QgPyBjb2wubWV0aG9kKHJvdykgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbkNlbGxNb3VzZUVudGVyKCRldmVudCwgcm93LCBjb2wpXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkNlbGxNb3VzZUxlYXZlKClcIlxuICAgICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25DZWxsTW91c2VNb3ZlKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBDSEVDSyBJRiBUSEUgQ09MVU1OIE1VU1QgQkUgRElTUExBWUVEIC0tPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWNvbC5pbWFnZSAmJiAhY29sLmljb25DbGFzcyAmJiAhY29sLm1ldGhvZFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNoYXJMaW1pdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sLnByb3BlcnR5XSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3dbY29sLnByb3BlcnR5XS5sZW5ndGggPiBjb2wuY2hhckxpbWl0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB3aXRoaW5MaW1pdFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJyb3dbY29sLnByb3BlcnR5XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldERpc3BsYXlWYWx1ZShjb2wsIHJvdykgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgJiYgaXNTdHJpbmcoY29sLmhhc0xpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cImNvbC5oYXNMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayAhPT0gdHJ1ZSAmJiAhaXNTdHJpbmcoY29sLmhhc0xpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoY29sLCByb3cpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjd2l0aGluTGltaXQ+XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayA9PT0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwicm93W2NvbC5wcm9wZXJ0eV1cIlxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoY29sLCByb3csIHRydWUpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5oYXNMaW5rICYmIGlzU3RyaW5nKGNvbC5oYXNMaW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwiY29sLmhhc0xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoY29sLCByb3csIHRydWUpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5oYXNMaW5rICE9PSB0cnVlICYmICFpc1N0cmluZyhjb2wuaGFzTGluaylcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93LCB0cnVlKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0gSU1BR0UgLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbC5pbWFnZSAmJiBjb2wuaW1hZ2UucGF0aCAmJiAhY29sLmljb25DbGFzcyAmJiAhY29sLm1ldGhvZFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY29sLmltYWdlLnBhdGggKyAnLycgKyByb3dbY29sLnByb3BlcnR5XVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2wuaW1hZ2UuY2xhc3NcIlxuICAgICAgICAgICAgICAgICAgYWx0PVwiSW1hZ2VtXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbC5pbWFnZSAmJiBjb2wuaW1hZ2UudXJsICYmICFjb2wuaWNvbkNsYXNzICYmICFjb2wubWV0aG9kXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW3NyY109XCJyb3dbY29sLnByb3BlcnR5XVwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2wuaW1hZ2UuY2xhc3NcIlxuICAgICAgICAgICAgICAgICAgYWx0PVwiSW1hZ2VtXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wuaWNvbkNsYXNzXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpY29uQ2xhc3Mgb2YgY29sLmljb25DbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3MuYnV0dG9uTWV0aG9kXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGljb25DbGFzcy5idXR0b25NZXRob2Qocm93LCAkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImljb25DbGFzcy5jbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzcy5jb25kaXRpb24gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGljb25DbGFzcy5jb25kaXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAkYW55KGljb25DbGFzcy5jb25kaXRpb24pKHJvdykpXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+e3sgaWNvbkNsYXNzLnRleHQgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29sdW1uUHJvcGVydGllc1wiPjwvdHI+XG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdleGFtcGxlLWVsZW1lbnQtcm93JzogZGF0YS5pc05vdENsaWNrYWJsZSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgJ2V4YW1wbGUtZWxlbWVudC1yb3cgY3Vyc29yLXBvaW50ZXInOiAhZGF0YS5pc05vdENsaWNrYWJsZVxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICBtYXQtcm93XG4gICAgICAgICAgICAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogY29sdW1uUHJvcGVydGllc1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiZ29Ub0RldGFpbHMocm93KVwiXG4gICAgICAgICAgPjwvdHI+XG5cbiAgICAgICAgICA8IS0tIFJPVyBTSE9XTiBXSEVOIFRIRVJFIElTIE5PIE1BVENISU5HIERBVEEuIC0tPlxuICAgICAgICAgIDx0ciBjbGFzcz1cIm1hdC1yb3dcIiAqbWF0Tm9EYXRhUm93PlxuICAgICAgICAgICAgPHRkICpuZ0lmPVwiIWlzTG9hZGluZ1wiIGNsYXNzPVwibWF0LWNlbGwgcC00XCIgY29sc3Bhbj1cIjRcIj5cbiAgICAgICAgICAgICAgTmVuaHVtIHJlc3VsdGFkbyBlbmNvbnRyYWRvIHBhcmEgYSBidXNjYVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cbiAgICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhZ2luYXRvci1jb250YWluZXJcIj5cbiAgICAgICAgICA8bWF0LXBhZ2luYXRvclxuICAgICAgICAgICAgI3BhZ2luYXRvclxuICAgICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJbMjUsIDUwLCAxMDBdXCJcbiAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICBbbGVuZ3RoXT1cInRvdGFsSXRlbXNcIlxuICAgICAgICAgICAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnNcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWxlY3QgcGFnZSBvZiBwZXJpb2RpYyBlbGVtZW50c1wiXG4gICAgICAgICAgICAocGFnZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdoaWRlLWxlbmd0aCc6XG4gICAgICAgICAgICAgICAgWydmaWx0ZXInLCAnZmlsdGVyQnlEYXRlJywgJ2VxdWFscyddLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QXJyYW5nZVxuICAgICAgICAgICAgICAgICkgfHwgdGhpcy5kYXRhLmZpbHRlckZuLFxuICAgICAgICAgICAgICAnaGlkZS1uZXh0LWJ1dHRvbic6ICFoYXNOZXh0UGFnZSAmJiBkYXRhLnBhZ2luYXRpb24gPT09IHRydWUsXG4gICAgICAgICAgICAgICdoaWRlLWxhc3QtYnV0dG9uJzpcbiAgICAgICAgICAgICAgICAoIWhhc05leHRQYWdlICYmIGRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSkgfHwgdGhpcy5kYXRhLmZpbHRlckZuXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICFpc0xvYWRpbmcgJiZcbiAgICAgICAgICAgICAgZGF0YVNvdXJjZT8uZGF0YSAmJlxuICAgICAgICAgICAgICBkYXRhU291cmNlLmRhdGEubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICBkYXRhPy5maWx0ZXJGblxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwicGFnZS1udW1iZXItZGlzcGxheVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgY3VycmVudFBhZ2VOdW1iZXIgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBUT09MVElQIFBFUlNPTkFMSVpBRE8gLS0+XG4gIDxkaXZcbiAgICAqbmdJZj1cInNob3dUb29sdGlwXCJcbiAgICBjbGFzcz1cImZpeGVkIHotNTAgbWF4LXctbWQgYnJlYWstd29yZHMgcm91bmRlZC1sZyBiZy1ncmF5LTgwMCBweC0zIHB5LTIgdGV4dC1zbSB0ZXh0LXdoaXRlIHNoYWRvdy1sZ1wiXG4gICAgW3N0eWxlLmxlZnQucHhdPVwidG9vbHRpcFBvc2l0aW9uLnhcIlxuICAgIFtzdHlsZS50b3AucHhdPVwidG9vbHRpcFBvc2l0aW9uLnlcIlxuICAgIFtzdHlsZS5wb2ludGVyLWV2ZW50c109XCInbm9uZSdcIlxuICA+XG4gICAge3sgdG9vbHRpcENvbnRlbnQgfX1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==