ng-firebase-table-kxp 1.1.0 → 1.1.2

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,8 +1,9 @@
1
- import { Component, Input, ViewChild, } from '@angular/core';
1
+ import { TABLE_DEFAULTS, } from '../../types/Table';
2
+ import { Component, Input, ViewChild, ChangeDetectionStrategy, } from '@angular/core';
2
3
  import { MatPaginator } from '@angular/material/paginator';
3
4
  import { MatSort } from '@angular/material/sort';
4
5
  import { MatTableDataSource } from '@angular/material/table';
5
- import { debounceTime, firstValueFrom, Subject } from 'rxjs';
6
+ import { debounceTime, firstValueFrom, Subject, takeUntil, BehaviorSubject, } from 'rxjs';
6
7
  import { FormControl, FormArray, FormGroup } from '@angular/forms';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@angular/router";
@@ -22,22 +23,23 @@ import * as i14 from "@angular/material/progress-spinner";
22
23
  import * as i15 from "@angular/material/icon";
23
24
  export class TableComponent {
24
25
  // CONSTRUCTOR
25
- constructor(router, tableService, firestore, el) {
26
+ constructor(router, tableService, firestore, el, cdr) {
26
27
  this.router = router;
27
28
  this.tableService = tableService;
28
29
  this.firestore = firestore;
29
30
  this.el = el;
31
+ this.cdr = cdr;
30
32
  this.arrange = null;
31
33
  this.currentPageNumber = 1;
32
34
  this.currentClientPageIndex = 0;
35
+ this.isLoading$ = new BehaviorSubject(false);
33
36
  this.items = [];
34
37
  this.filteredItems = []; // Dados filtrados para modo não paginado (público para acesso externo)
35
- this.isLoading = false;
36
38
  this.lastDoc = null;
37
39
  this.firstDoc = null;
38
40
  this.sortBy = {
39
- field: 'createdAt',
40
- order: 'desc',
41
+ field: TABLE_DEFAULTS.SORT_FIELD,
42
+ order: TABLE_DEFAULTS.SORT_ORDER,
41
43
  };
42
44
  this.columnProperties = [];
43
45
  this.selectSort = new FormControl('');
@@ -45,19 +47,20 @@ export class TableComponent {
45
47
  this.hasNextPage = false;
46
48
  this.dropdownItems = [];
47
49
  this.sortableDropdownItems = [];
48
- this.pageSize = 25;
50
+ this.pageSize = TABLE_DEFAULTS.PAGE_SIZE;
49
51
  this.totalItems = 0;
50
52
  this.filterValue = null;
51
53
  this.hasFilterableColumn = false;
52
54
  this.hasSortableColumn = false;
53
55
  this.filterSubject = new Subject();
54
- this.debounceTimeMs = 500;
56
+ this.debounceTimeMs = TABLE_DEFAULTS.DEBOUNCE_TIME_MS;
55
57
  this.selectedTab = 0;
56
58
  // Propriedades para controle do tooltip
57
59
  this.hoveredCell = null;
58
60
  this.showTooltip = false;
59
61
  this.tooltipContent = '';
60
62
  this.tooltipPosition = { x: 0, y: 0 };
63
+ this.destroy$ = new Subject();
61
64
  this.filtersForm = new FormArray([this.createFilterGroup()]);
62
65
  }
63
66
  createFilterGroup() {
@@ -171,10 +174,14 @@ export class TableComponent {
171
174
  }
172
175
  async ngOnInit() {
173
176
  if (!this.data.color)
174
- this.data.color = { bg: '#1976d2', text: '#ffffff' };
177
+ this.data.color = {
178
+ bg: TABLE_DEFAULTS.DEFAULT_BG_COLOR,
179
+ text: TABLE_DEFAULTS.DEFAULT_TEXT_COLOR,
180
+ };
175
181
  this.columnProperties = this.data.displayedColumns.map((column) => {
176
182
  return column.property;
177
183
  });
184
+ this.cdr.markForCheck();
178
185
  if (this.data.actionButton && !this.data.actionButton.condition) {
179
186
  this.data.actionButton.condition = (_row) => true;
180
187
  }
@@ -218,6 +225,7 @@ export class TableComponent {
218
225
  // Sem paginação
219
226
  if (this.data.pagination === false) {
220
227
  await this.loadItems();
228
+ this.cdr.markForCheck();
221
229
  }
222
230
  // Com paginação
223
231
  if (this.data.pagination === true) {
@@ -227,11 +235,12 @@ export class TableComponent {
227
235
  order: this.data.sortBy.order,
228
236
  };
229
237
  this.filterSubject
230
- .pipe(debounceTime(this.debounceTimeMs))
238
+ .pipe(debounceTime(this.debounceTimeMs), takeUntil(this.destroy$))
231
239
  .subscribe(() => {
232
240
  this.loadItemsPaginated('reload', true);
233
241
  });
234
- this.isLoading = true;
242
+ this.isLoading$.next(true);
243
+ this.cdr.markForCheck();
235
244
  await this.loadItemsPaginated('reload', true);
236
245
  this.sort.active = 'createdAt';
237
246
  this.sort.direction = 'desc';
@@ -247,8 +256,16 @@ export class TableComponent {
247
256
  docData[totalRef.field]);
248
257
  }
249
258
  }
250
- this.isLoading = false;
259
+ this.isLoading$.next(false);
260
+ this.cdr.markForCheck();
261
+ }
262
+ }
263
+ ngOnDestroy() {
264
+ if (this.tooltipTimeout) {
265
+ clearTimeout(this.tooltipTimeout);
251
266
  }
267
+ this.destroy$.next();
268
+ this.destroy$.complete();
252
269
  }
253
270
  getDisplayValue(col, row, withinLimit = false) {
254
271
  let value;
@@ -271,10 +288,7 @@ export class TableComponent {
271
288
  else {
272
289
  value = String(value);
273
290
  }
274
- if (typeof value !== 'string') {
275
- value = '';
276
- }
277
- if (withinLimit || !col.charLimit) {
291
+ if (withinLimit || !col.charLimit || value.length <= col.charLimit) {
278
292
  return value;
279
293
  }
280
294
  return value.substring(0, col.charLimit) + '...';
@@ -312,13 +326,13 @@ export class TableComponent {
312
326
  this.arrange = {
313
327
  filters: [],
314
328
  sortBy: this.data.sortBy || {
315
- field: 'createdAt',
316
- order: 'desc',
329
+ field: TABLE_DEFAULTS.SORT_FIELD,
330
+ order: TABLE_DEFAULTS.SORT_ORDER,
317
331
  },
318
332
  };
319
333
  this.sortBy = this.data.sortBy || {
320
- field: 'createdAt',
321
- order: 'desc',
334
+ field: TABLE_DEFAULTS.SORT_FIELD,
335
+ order: TABLE_DEFAULTS.SORT_ORDER,
322
336
  };
323
337
  // Aplicar filtros client-side se existirem
324
338
  let itemsToDisplay = [...this.items];
@@ -364,6 +378,7 @@ export class TableComponent {
364
378
  });
365
379
  };
366
380
  this.filterPredicate = this.dataSource.filterPredicate;
381
+ this.cdr.markForCheck();
367
382
  }
368
383
  // Aplicar filtros client-side (filtros por data)
369
384
  applyClientSideFilters(items) {
@@ -487,6 +502,7 @@ export class TableComponent {
487
502
  this.arrange = this.buildArrangeFromFilters();
488
503
  // Aplicar filtros (ou remover se campos estiverem vazios)
489
504
  this.applyFiltersToDataSource();
505
+ this.cdr.markForCheck();
490
506
  }
491
507
  }
492
508
  // Aplicar máscara de data (DD/MM/AAAA) manualmente
@@ -521,6 +537,7 @@ export class TableComponent {
521
537
  // Atualizar filteredItems com os dados filtrados (será atualizado novamente no handleDownload com filteredData)
522
538
  this.filteredItems = filteredItems;
523
539
  this.totalItems = filteredItems.length;
540
+ this.cdr.markForCheck();
524
541
  }
525
542
  // Métodos com paginação
526
543
  async loadItemsPaginated(navigation = 'reload', reset = false) {
@@ -629,10 +646,11 @@ export class TableComponent {
629
646
  this.hasNextPage = result.hasNextPage;
630
647
  this.dataSource = new MatTableDataSource(this.items);
631
648
  this.filterPredicate = this.dataSource.filterPredicate;
649
+ this.cdr.markForCheck();
632
650
  }
633
651
  async onPageChange(event) {
634
652
  if (this.data.pagination === true && event) {
635
- this.isLoading = true;
653
+ this.isLoading$.next(true);
636
654
  const previousPageIndex = event.previousPageIndex ?? 0;
637
655
  const pageIndex = event.pageIndex;
638
656
  const currentComponentPageSize = this.pageSize;
@@ -652,7 +670,6 @@ export class TableComponent {
652
670
  this.currentPageNumber = Math.max(1, this.currentPageNumber - 1);
653
671
  }
654
672
  if (eventPageSize !== currentComponentPageSize) {
655
- console.log('Alterou a quantidade de elementos exibidos por página');
656
673
  this.pageSize = eventPageSize;
657
674
  navigationDirection = 'forward';
658
675
  resetDocs = true;
@@ -700,15 +717,14 @@ export class TableComponent {
700
717
  resetDocs = false;
701
718
  }
702
719
  else if (previousPageIndex === undefined && pageIndex === 0) {
703
- console.log('Evento inicial do paginador para pág 0. ngOnInit carregou.');
704
- this.isLoading = false;
720
+ this.isLoading$.next(false);
705
721
  if (event)
706
722
  this.pageEvent = event;
707
723
  return;
708
724
  }
709
725
  else {
710
726
  console.warn('INESPERADO! Condição de navegação não tratada:', event);
711
- this.isLoading = false;
727
+ this.isLoading$.next(false);
712
728
  if (event)
713
729
  this.pageEvent = event;
714
730
  return;
@@ -728,7 +744,8 @@ export class TableComponent {
728
744
  }
729
745
  if (event)
730
746
  this.pageEvent = event;
731
- this.isLoading = false;
747
+ this.isLoading$.next(false);
748
+ this.cdr.markForCheck();
732
749
  }
733
750
  }
734
751
  // Outros métodos
@@ -915,6 +932,7 @@ export class TableComponent {
915
932
  this.filtersForm.length > 0
916
933
  ? this.filtersForm.at(0).get('selectFilter')?.value?.arrange ?? ''
917
934
  : '';
935
+ this.cdr.markForCheck();
918
936
  }
919
937
  else {
920
938
  // Com paginação: comportamento original
@@ -924,6 +942,7 @@ export class TableComponent {
924
942
  ? this.filtersForm.at(0).get('selectFilter')?.value?.arrange ?? ''
925
943
  : '';
926
944
  this.paginator.firstPage();
945
+ this.cdr.markForCheck();
927
946
  }
928
947
  }
929
948
  async resetFilter() {
@@ -948,12 +967,14 @@ export class TableComponent {
948
967
  this.dataSource.data = [...this.items];
949
968
  this.totalItems = this.items.length;
950
969
  this.currentArrange = '';
970
+ this.cdr.markForCheck();
951
971
  }
952
972
  else {
953
973
  // Com paginação: comportamento original
954
974
  await this.loadItemsPaginated('reload', true);
955
975
  this.currentArrange = '';
956
976
  this.paginator.firstPage();
977
+ this.cdr.markForCheck();
957
978
  }
958
979
  }
959
980
  // Método público para recarregar a tabela
@@ -961,6 +982,7 @@ export class TableComponent {
961
982
  if (this.data.pagination) {
962
983
  await this.loadItemsPaginated('reload', true);
963
984
  this.paginator.firstPage();
985
+ this.cdr.markForCheck();
964
986
  }
965
987
  else {
966
988
  await this.loadItems();
@@ -1007,6 +1029,7 @@ export class TableComponent {
1007
1029
  Array.isArray(this.data.filterableOptions)) {
1008
1030
  this.data.filterableOptions.forEach((option) => this.dropdownItems.push({ ...option, arrange: 'equals' }));
1009
1031
  }
1032
+ this.cdr.markForCheck();
1010
1033
  }
1011
1034
  isString(value) {
1012
1035
  return typeof value === 'string';
@@ -1029,6 +1052,7 @@ export class TableComponent {
1029
1052
  x: event.clientX + 10,
1030
1053
  y: event.clientY - 10,
1031
1054
  };
1055
+ this.cdr.markForCheck();
1032
1056
  // Timeout para mostrar o tooltip
1033
1057
  this.tooltipTimeout = setTimeout(() => {
1034
1058
  if (this.hoveredCell &&
@@ -1053,6 +1077,7 @@ export class TableComponent {
1053
1077
  x: event.clientX + 10,
1054
1078
  y: event.clientY - 10,
1055
1079
  };
1080
+ this.cdr.markForCheck();
1056
1081
  }
1057
1082
  }
1058
1083
  // Métodos para inversão vertical dos tabs
@@ -1089,6 +1114,7 @@ export class TableComponent {
1089
1114
  if (tab) {
1090
1115
  this.data.tabs.method(tab, this.selectedTab);
1091
1116
  }
1117
+ this.cdr.markForCheck();
1092
1118
  }
1093
1119
  isTabSelected(originalIndex) {
1094
1120
  return this.selectedTab === originalIndex;
@@ -1129,13 +1155,16 @@ export class TableComponent {
1129
1155
  }
1130
1156
  }
1131
1157
  }
1158
+ trackByProperty(_index, col) {
1159
+ return col.property;
1160
+ }
1132
1161
  }
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"] }] });
1162
+ 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 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1163
+ 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 and Custom Action -->\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 </div>\n\n <!-- SORT FIELD (Integrated with filters) -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </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 <!-- 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 & Action Buttons -->\n <div\n class=\"-mb-2 flex flex-col items-start justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row sm:items-center\"\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 <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\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 </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 <div\n class=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full sm:flex-1\">\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 ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70 self-start sm:self-auto'\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 </div>\n\n <!-- SORT FIELD (for non-paginated tables) -->\n <div\n class=\"mb-4 rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"data.pagination === false && sortableDropdownItems.length > 0\"\n >\n <div\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </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 <!-- 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-start justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row sm:items-center\"\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 self-start sm:self-auto\">\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; trackBy: trackByProperty\"\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$ | async)\" 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$ | async\">\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$ | async) &&\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"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1135
1164
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, decorators: [{
1136
1165
  type: Component,
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: [{
1166
+ args: [{ selector: 'lib-table', changeDetection: ChangeDetectionStrategy.OnPush, 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 and Custom Action -->\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 </div>\n\n <!-- SORT FIELD (Integrated with filters) -->\n <div class=\"mb-4\" *ngIf=\"sortableDropdownItems.length > 0\">\n <div\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </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 <!-- 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 & Action Buttons -->\n <div\n class=\"-mb-2 flex flex-col items-start justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row sm:items-center\"\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 <!-- Right Side: Search, Reset, Export -->\n <div\n class=\"flex flex-wrap gap-3 self-start sm:self-auto\"\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 </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 <div\n class=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\"\n >\n <mat-form-field appearance=\"outline\" class=\"w-full sm:flex-1\">\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 ' flex items-center gap-2 rounded-lg px-4 py-2 text-sm font-medium text-white hover:opacity-70 self-start sm:self-auto'\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 </div>\n\n <!-- SORT FIELD (for non-paginated tables) -->\n <div\n class=\"mb-4 rounded-xl border border-gray-200 bg-white p-4 shadow-lg\"\n *ngIf=\"data.pagination === false && sortableDropdownItems.length > 0\"\n >\n <div\n class=\"flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 p-2\"\n >\n <div class=\"min-w-[200px] flex-1\">\n <mat-form-field appearance=\"outline\" class=\"w-full\">\n <mat-label class=\"flex items-center gap-2\">\n <i class=\"fa fa-sort-alpha-down text-cyan-600\"></i>\n <span>Ordenar por</span>\n </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 <!-- 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-start justify-between gap-4 border-t border-gray-200 pt-4 sm:flex-row sm:items-center\"\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 self-start sm:self-auto\">\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; trackBy: trackByProperty\"\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$ | async)\" 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$ | async\">\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$ | async) &&\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"] }]
1167
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.TableService }, { type: i3.AngularFirestore }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { data: [{
1139
1168
  type: Input
1140
1169
  }], downloadTable: [{
1141
1170
  type: Input
@@ -1146,4 +1175,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
1146
1175
  type: ViewChild,
1147
1176
  args: [MatSort]
1148
1177
  }] } });
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==
1178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZmlyZWJhc2UtdGFibGUta3hwL3NyYy9saWIvY29tcG9uZW50cy90YWJsZS90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1maXJlYmFzZS10YWJsZS1reHAvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFPTCxjQUFjLEdBQ2YsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxTQUFTLEVBS1QsdUJBQXVCLEdBRXhCLE1BQU0sZUFBZSxDQUFDO0FBS3ZCLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHN0QsT0FBTyxFQUNMLFlBQVksRUFDWixjQUFjLEVBQ2QsT0FBTyxFQUNQLFNBQVMsRUFDVCxlQUFlLEdBQ2hCLE1BQU0sTUFBTSxDQUFDO0FBS2QsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUW5FLE1BQU0sT0FBTyxjQUFjO0lBd0R6QixjQUFjO0lBQ2QsWUFDVSxNQUFjLEVBQ2QsWUFBMEIsRUFDMUIsU0FBMkIsRUFDM0IsRUFBYyxFQUNkLEdBQXNCO1FBSnRCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQ2QsUUFBRyxH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RkR2dkJhLGNBQWM7a0JBTjFCLFNBQVM7K0JBQ0UsV0FBVyxtQkFHSix1QkFBdUIsQ0FBQyxNQUFNO2dOQUl0QyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkF5Q21CLFNBQVM7c0JBQWpDLFNBQVM7dUJBQUMsWUFBWTtnQkFDSCxJQUFJO3NCQUF2QixTQUFTO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBcnJhbmdlLFxuICBDb25kaXRpb24sXG4gIFRhYixcbiAgVGFiRGF0YSxcbiAgVGFibGVEYXRhLFxuICBDb2x1bW4sXG4gIFRBQkxFX0RFRkFVTFRTLFxufSBmcm9tICcuLi8uLi90eXBlcy9UYWJsZSc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBFbGVtZW50UmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQW5ndWxhckZpcmVzdG9yZSxcbiAgUXVlcnlEb2N1bWVudFNuYXBzaG90LFxufSBmcm9tICdAYW5ndWxhci9maXJlL2NvbXBhdC9maXJlc3RvcmUnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBQYWdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgU3ViamVjdCxcbiAgdGFrZVVudGlsLFxuICBCZWhhdmlvclN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT3JkZXJCeURpcmVjdGlvbiB9IGZyb20gJ2ZpcmViYXNlL2ZpcmVzdG9yZSc7XG5pbXBvcnQgZmlyZWJhc2UgZnJvbSAnZmlyZWJhc2UvY29tcGF0JztcbmltcG9ydCBXaGVyZUZpbHRlck9wID0gZmlyZWJhc2UuZmlyZXN0b3JlLldoZXJlRmlsdGVyT3A7XG5pbXBvcnQgZmlyZXN0b3JlID0gZmlyZWJhc2UuZmlyZXN0b3JlO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIC8vIElOUFVUU1xuICBASW5wdXQoKSBkYXRhITogVGFibGVEYXRhO1xuICBASW5wdXQoKSBkb3dubG9hZFRhYmxlPzogKGFycmFuZ2U6IEFycmFuZ2UsIGNvbmRpdGlvbnM6IENvbmRpdGlvbltdKSA9PiB2b2lkO1xuICBhcnJhbmdlOiBBcnJhbmdlIHwgbnVsbCA9IG51bGw7XG4gIC8vIFZBUklBQkxFU1xuICBkYXRhU291cmNlITogTWF0VGFibGVEYXRhU291cmNlPGFueT47XG4gIGN1cnJlbnRQYWdlTnVtYmVyID0gMTtcbiAgY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG5cbiAgcHVibGljIGlzTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwdWJsaWMgaXRlbXM6IGFueVtdID0gW107XG4gIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBhbnlbXSA9IFtdOyAvLyBEYWRvcyBmaWx0cmFkb3MgcGFyYSBtb2RvIG7Do28gcGFnaW5hZG8gKHDDumJsaWNvIHBhcmEgYWNlc3NvIGV4dGVybm8pXG4gIHByaXZhdGUgbGFzdERvYzogUXVlcnlEb2N1bWVudFNuYXBzaG90PGFueT4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmaXJzdERvYzogUXVlcnlEb2N1bWVudFNuYXBzaG90PGFueT4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzb3J0Qnk6IHsgZmllbGQ6IHN0cmluZzsgb3JkZXI6IE9yZGVyQnlEaXJlY3Rpb24gfSA9IHtcbiAgICBmaWVsZDogVEFCTEVfREVGQVVMVFMuU09SVF9GSUVMRCxcbiAgICBvcmRlcjogVEFCTEVfREVGQVVMVFMuU09SVF9PUkRFUixcbiAgfTtcbiAgcHVibGljIGNvbHVtblByb3BlcnRpZXM6IHN0cmluZ1tdID0gW107XG5cbiAgZmlsdGVyc0Zvcm06IEZvcm1BcnJheTtcblxuICBzZWxlY3RTb3J0OiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIGN1cnJlbnRBcnJhbmdlID0gJyc7XG5cbiAgaGFzTmV4dFBhZ2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBkcm9wZG93bkl0ZW1zOiBhbnlbXSA9IFtdO1xuICBzb3J0YWJsZURyb3Bkb3duSXRlbXM6IGFueVtdID0gW107XG4gIHBhZ2VTaXplID0gVEFCTEVfREVGQVVMVFMuUEFHRV9TSVpFO1xuICB0b3RhbEl0ZW1zID0gMDtcbiAgcGFnZUV2ZW50PzogUGFnZUV2ZW50O1xuICBmaWx0ZXJWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgaGFzRmlsdGVyYWJsZUNvbHVtbjogYm9vbGVhbiA9IGZhbHNlO1xuICBoYXNTb3J0YWJsZUNvbHVtbjogYm9vbGVhbiA9IGZhbHNlO1xuICBmaWx0ZXJQcmVkaWNhdGU6ICgoZGF0YTogYW55LCBmaWx0ZXI6IHN0cmluZykgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmlsdGVyU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWJvdW5jZVRpbWVNcyA9IFRBQkxFX0RFRkFVTFRTLkRFQk9VTkNFX1RJTUVfTVM7XG5cbiAgc2VsZWN0ZWRUYWI6IG51bWJlciA9IDA7XG5cbiAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHBhZ2luYXRvciE6IE1hdFBhZ2luYXRvcjtcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0ITogTWF0U29ydDtcblxuICAvLyBQcm9wcmllZGFkZXMgcGFyYSBjb250cm9sZSBkbyB0b29sdGlwXG4gIGhvdmVyZWRDZWxsOiB7IHJvdzogYW55OyBjb2w6IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIHNob3dUb29sdGlwOiBib29sZWFuID0gZmFsc2U7XG4gIHRvb2x0aXBUaW1lb3V0OiBhbnk7XG4gIHRvb2x0aXBDb250ZW50OiBzdHJpbmcgPSAnJztcbiAgdG9vbHRpcFBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gPSB7IHg6IDAsIHk6IDAgfTtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBDT05TVFJVQ1RPUlxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgdGFibGVTZXJ2aWNlOiBUYWJsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaXJlc3RvcmU6IEFuZ3VsYXJGaXJlc3RvcmUsXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgdGhpcy5maWx0ZXJzRm9ybSA9IG5ldyBGb3JtQXJyYXkoW3RoaXMuY3JlYXRlRmlsdGVyR3JvdXAoKV0pO1xuICB9XG5cbiAgY3JlYXRlRmlsdGVyR3JvdXAoKTogRm9ybUdyb3VwIHtcbiAgICAvLyBDcmlhciB2YWxpZGFkb3IgZGlyZXRhbWVudGUgYXF1aSBwYXJhIGV2aXRhciBwcm9ibGVtYXMgZGUgY29udGV4dG8gZGUgaW5qZcOnw6NvXG4gICAgY29uc3QgZGF0ZVZhbGlkYXRvciA9IHRoaXMudGFibGVTZXJ2aWNlLmRhdGVGb3JtYXRWYWxpZGF0b3IoKTtcblxuICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKHtcbiAgICAgIHNlbGVjdEZpbHRlcjogbmV3IEZvcm1Db250cm9sKCcnKSxcbiAgICAgIHR5cGVGaWx0ZXI6IG5ldyBGb3JtQ29udHJvbCgnJyksXG4gICAgICBzZWxlY3RJdGVtOiBuZXcgRm9ybUNvbnRyb2woJycpLFxuICAgICAgaW5pdGlhbERhdGU6IG5ldyBGb3JtQ29udHJvbCgnJywgW2RhdGVWYWxpZGF0b3JdKSxcbiAgICAgIGZpbmFsRGF0ZTogbmV3IEZvcm1Db250cm9sKCcnLCBbZGF0ZVZhbGlkYXRvcl0pLFxuICAgIH0pO1xuICB9XG5cbiAgYWRkRmlsdGVyKGZpbHRlckRhdGE/OiB7XG4gICAgc2VsZWN0RmlsdGVyOiBhbnk7XG4gICAgdHlwZUZpbHRlcj86IHN0cmluZztcbiAgICBzZWxlY3RJdGVtPzogYW55W107XG4gICAgaW5pdGlhbERhdGU/OiBzdHJpbmc7XG4gICAgZmluYWxEYXRlPzogc3RyaW5nO1xuICB9KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWUgJiZcbiAgICAgIHRoaXMuaGFzQWN0aXZlRGF0ZUZpbHRlcigpICYmXG4gICAgICBmaWx0ZXJEYXRhPy5zZWxlY3RGaWx0ZXI/LmFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3RmlsdGVyR3JvdXAgPSB0aGlzLmNyZWF0ZUZpbHRlckdyb3VwKCk7XG5cbiAgICBpZiAoZmlsdGVyRGF0YSkge1xuICAgICAgaWYgKGZpbHRlckRhdGEuc2VsZWN0RmlsdGVyKSB7XG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnNldFZhbHVlKGZpbHRlckRhdGEuc2VsZWN0RmlsdGVyKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJEYXRhLnR5cGVGaWx0ZXIpIHtcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCd0eXBlRmlsdGVyJyk/LnNldFZhbHVlKGZpbHRlckRhdGEudHlwZUZpbHRlcik7XG4gICAgICB9XG4gICAgICBpZiAoZmlsdGVyRGF0YS5zZWxlY3RJdGVtKSB7XG4gICAgICAgIG5ld0ZpbHRlckdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLnNlbGVjdEl0ZW0pO1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlckRhdGEuaW5pdGlhbERhdGUpIHtcbiAgICAgICAgbmV3RmlsdGVyR3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLmluaXRpYWxEYXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWx0ZXJEYXRhLmZpbmFsRGF0ZSkge1xuICAgICAgICBuZXdGaWx0ZXJHcm91cC5nZXQoJ2ZpbmFsRGF0ZScpPy5zZXRWYWx1ZShmaWx0ZXJEYXRhLmZpbmFsRGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJzRm9ybS5wdXNoKG5ld0ZpbHRlckdyb3VwKTtcbiAgfVxuXG4gIGhhc0FjdGl2ZURhdGVGaWx0ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyc0Zvcm0uY29udHJvbHMuc29tZSgoY29udHJvbCkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gZ3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRGaWx0ZXI/LmFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0QXZhaWxhYmxlRmlsdGVyT3B0aW9ucygpOiBhbnlbXSB7XG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlICYmIHRoaXMuaGFzQWN0aXZlRGF0ZUZpbHRlcigpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wZG93bkl0ZW1zLmZpbHRlcihcbiAgICAgICAgKGl0ZW0pID0+IGl0ZW0uYXJyYW5nZSAhPT0gJ2ZpbHRlckJ5RGF0ZSdcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duSXRlbXM7XG4gIH1cblxuICBvblNlbGVjdEZpbHRlckNoYW5nZSgpIHtcbiAgICBjb25zdCBsYXN0SW5kZXggPSB0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCAtIDE7XG4gICAgY29uc3QgbGFzdEZpbHRlciA9IHRoaXMuZmlsdGVyc0Zvcm0uYXQobGFzdEluZGV4KTtcbiAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGxhc3RGaWx0ZXIuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG5cbiAgICBpZiAoc2VsZWN0ZWRGaWx0ZXIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZSA9PT0gJ2ZpbHRlckJ5RGF0ZScgJiZcbiAgICAgICAgdGhpcy5kYXRhLnBhZ2luYXRpb24gPT09IHRydWVcbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYWRkRmlsdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRmlsdGVyKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcnNGb3JtLnJlbW92ZUF0KGluZGV4KTtcbiAgICBpZiAodGhpcy5maWx0ZXJzRm9ybS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuYWRkRmlsdGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlQWxsRmlsdGVycygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcnNGb3JtLmNsZWFyKCk7XG4gICAgdGhpcy5hZGRGaWx0ZXIoKTtcbiAgICB0aGlzLnJlc2V0RmlsdGVyKCk7XG4gIH1cblxuICAvLyBNRVRIT0RTXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snZGF0YSddKSB7XG4gICAgICAvLyBBcGxpY2FyIGNvcmVzIHF1YW5kbyBvIGRhdGEgZm9yIGRlZmluaWRvIG91IG11ZGFyXG4gICAgICAvLyBVc2FyIHNldFRpbWVvdXQgcGFyYSBnYXJhbnRpciBxdWUgYSB2aWV3IGVzdGVqYSBwcm9udGFcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5hcHBseUN1c3RvbUNvbG9ycygpLCAwKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gR2FyYW50aXIgcXVlIGFzIGNvcmVzIHNlamFtIGFwbGljYWRhcyBhcMOzcyBhIHZpZXcgZXN0YXIgcHJvbnRhXG4gICAgdGhpcy5hcHBseUN1c3RvbUNvbG9ycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseUN1c3RvbUNvbG9ycygpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0RWxlbWVudCA9IHRoaXMuZWw/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFob3N0RWxlbWVudCB8fCAhdGhpcy5kYXRhKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5kYXRhLmNvbG9yPy5iZykge1xuICAgICAgaG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGFibGUtY29sb3InLCB0aGlzLmRhdGEuY29sb3IuYmcpO1xuICAgICAgaG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGFibGUtaGVhZGVyLWJnJywgdGhpcy5kYXRhLmNvbG9yLmJnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YS5jb2xvcj8udGV4dCkge1xuICAgICAgaG9zdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tdGFibGUtdGV4dC1jb2xvcicsIHRoaXMuZGF0YS5jb2xvci50ZXh0KTtcbiAgICAgIGhvc3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAnLS10YWJsZS1oZWFkZXItdGV4dCcsXG4gICAgICAgIHRoaXMuZGF0YS5jb2xvci50ZXh0XG4gICAgICApO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgaGVhZGVyQ2VsbHMgPSBob3N0RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAnLm1hdC1oZWFkZXItY2VsbCwgLm1hdC1tZGMtaGVhZGVyLWNlbGwsIHRoLm1hdC1oZWFkZXItY2VsbCwgdGgubWF0LW1kYy1oZWFkZXItY2VsbCdcbiAgICAgICk7XG4gICAgICBoZWFkZXJDZWxscy5mb3JFYWNoKChjZWxsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5jb2xvcj8uYmcpIHtcbiAgICAgICAgICBjZWxsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuZGF0YS5jb2xvci5iZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmNvbG9yPy50ZXh0KSB7XG4gICAgICAgICAgY2VsbC5zdHlsZS5jb2xvciA9IHRoaXMuZGF0YS5jb2xvci50ZXh0O1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5kYXRhLmNvbG9yKVxuICAgICAgdGhpcy5kYXRhLmNvbG9yID0ge1xuICAgICAgICBiZzogVEFCTEVfREVGQVVMVFMuREVGQVVMVF9CR19DT0xPUixcbiAgICAgICAgdGV4dDogVEFCTEVfREVGQVVMVFMuREVGQVVMVF9URVhUX0NPTE9SLFxuICAgICAgfTtcbiAgICB0aGlzLmNvbHVtblByb3BlcnRpZXMgPSB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgcmV0dXJuIGNvbHVtbi5wcm9wZXJ0eTtcbiAgICB9KTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgIGlmICh0aGlzLmRhdGEuYWN0aW9uQnV0dG9uICYmICF0aGlzLmRhdGEuYWN0aW9uQnV0dG9uLmNvbmRpdGlvbikge1xuICAgICAgdGhpcy5kYXRhLmFjdGlvbkJ1dHRvbi5jb25kaXRpb24gPSAoX3Jvdz86IGFueSkgPT4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEuZGlzcGxheWVkQ29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0ZpbHRlcmFibGVDb2x1bW4gPT09IGZhbHNlKSB0aGlzLmhhc0ZpbHRlcmFibGVDb2x1bW4gPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuZHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2ZpbHRlcicsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY29sLmlzU29ydGFibGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzU29ydGFibGVDb2x1bW4gPT09IGZhbHNlKSB0aGlzLmhhc1NvcnRhYmxlQ29sdW1uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zb3J0YWJsZURyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdhc2NlbmRpbmcnLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUgKyAnOiBjcmVzY2VudGUnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zb3J0YWJsZURyb3Bkb3duSXRlbXMucHVzaCh7XG4gICAgICAgICAgLi4uY29sLFxuICAgICAgICAgIGFycmFuZ2U6ICdkZXNjZW5kaW5nJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogZGVjcmVzY2VudGUnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2wuaXNGaWx0ZXJhYmxlQnlEYXRlKSB7XG4gICAgICAgIHRoaXMuZHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2ZpbHRlckJ5RGF0ZScsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGZpbHRybyBwb3IgZGF0YScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YS5maWx0ZXJhYmxlT3B0aW9ucyAmJlxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMpICYmXG4gICAgICB0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5kYXRhLmZpbHRlcmFibGVPcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT5cbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goeyAuLi5vcHRpb24sIGFycmFuZ2U6ICdlcXVhbHMnIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNlbSBwYWdpbmHDp8Ojb1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gICAgLy8gQ29tIHBhZ2luYcOnw6NvXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSB0cnVlKSB7XG4gICAgICBpZiAodGhpcy5kYXRhLnNvcnRCeSlcbiAgICAgICAgdGhpcy5zb3J0QnkgPSB7XG4gICAgICAgICAgZmllbGQ6IHRoaXMuZGF0YS5zb3J0QnkuZmllbGQsXG4gICAgICAgICAgb3JkZXI6IHRoaXMuZGF0YS5zb3J0Qnkub3JkZXIsXG4gICAgICAgIH07XG4gICAgICB0aGlzLmZpbHRlclN1YmplY3RcbiAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lTXMpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEl0ZW1zUGFnaW5hdGVkKCdyZWxvYWQnLCB0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuaXNMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRJdGVtc1BhZ2luYXRlZCgncmVsb2FkJywgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuc29ydC5hY3RpdmUgPSAnY3JlYXRlZEF0JztcbiAgICAgIHRoaXMuc29ydC5kaXJlY3Rpb24gPSAnZGVzYyc7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgICAgIHRoaXMudG90YWxJdGVtcyA9IDA7XG4gICAgICBpZiAodGhpcy5kYXRhLnRvdGFsUmVmKSB7XG4gICAgICAgIGZvciAoY29uc3QgdG90YWxSZWYgb2YgdGhpcy5kYXRhLnRvdGFsUmVmKSB7XG4gICAgICAgICAgY29uc3QgdG90YWxSZWZEb2MgPSBhd2FpdCB0b3RhbFJlZi5yZWYuZ2V0KCk7XG4gICAgICAgICAgY29uc3QgZG9jRGF0YSA9IHRvdGFsUmVmRG9jLmRhdGEoKSBhcyBhbnk7XG4gICAgICAgICAgaWYgKGRvY0RhdGEgJiYgZG9jRGF0YVt0b3RhbFJlZi5maWVsZF0pXG4gICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSAodGhpcy50b3RhbEl0ZW1zICtcbiAgICAgICAgICAgICAgZG9jRGF0YVt0b3RhbFJlZi5maWVsZF0pIGFzIG51bWJlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0RGlzcGxheVZhbHVlKGNvbDogYW55LCByb3c6IGFueSwgd2l0aGluTGltaXQ6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgbGV0IHZhbHVlOiBhbnk7XG5cbiAgICBpZiAoY29sLmNhbGN1bGF0ZVZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IGNvbC5jYWxjdWxhdGVWYWx1ZShyb3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IHRoaXMuZ2V0TmVzdGVkVmFsdWUocm93LCBjb2wucHJvcGVydHkpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBjb2wuYXJyYXlGaWVsZCkge1xuICAgICAgdmFsdWUgPSB0aGlzLmZvcm1hdEFycmF5VmFsdWUodmFsdWUsIGNvbC5hcnJheUZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoY29sLnF1ZXJ5TGVuZ3RoICYmIHJvd1tjb2wucHJvcGVydHldKSB7XG4gICAgICB2YWx1ZSA9IHJvd1tjb2wucHJvcGVydHldO1xuICAgIH1cblxuICAgIHZhbHVlID0gY29sLnBpcGUgPyBjb2wucGlwZS50cmFuc2Zvcm0odmFsdWUpIDogdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh3aXRoaW5MaW1pdCB8fCAhY29sLmNoYXJMaW1pdCB8fCB2YWx1ZS5sZW5ndGggPD0gY29sLmNoYXJMaW1pdCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGNvbC5jaGFyTGltaXQpICsgJy4uLic7XG4gIH1cblxuICBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICByZXR1cm4gcHJvcGVydGllcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBjdXJyZW50UGFydCkgPT4gYWNjICYmIGFjY1tjdXJyZW50UGFydF0sXG4gICAgICBvYmpcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRBcnJheVZhbHVlKGFycmF5OiBhbnlbXSwgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSB8fCBhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBhcnJheVxuICAgICAgLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmIGl0ZW0gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF0gfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0cmluZyhpdGVtKTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09ICcnICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpO1xuXG4gICAgcmV0dXJuIHZhbHVlcy5qb2luKCcsICcpO1xuICB9XG5cbiAgLy8gTcOpdG9kb3Mgc2VtIHBhZ2luYcOnw6NvXG4gIHByaXZhdGUgYXN5bmMgbG9hZEl0ZW1zKCkge1xuICAgIHRoaXMuaXRlbXMgPSBhd2FpdCB0aGlzLnRhYmxlU2VydmljZS5nZXRJdGVtcyh0aGlzLmRhdGEuY29sbGVjdGlvblJlZik7XG4gICAgaWYgKHRoaXMuZGF0YS5jb25kaXRpb25zKSB7XG4gICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubG9hZFJlbGF0aW9ucygpO1xuICAgIGF3YWl0IHRoaXMubG9hZFF1ZXJ5TGVuZ3RocygpO1xuICAgIHRoaXMudG90YWxJdGVtcyA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuXG4gICAgLy8gSW5pY2lhbGl6YXIgYXJyYW5nZSBwYXJhIHRhYmVsYXMgbsOjbyBwYWdpbmFkYXNcbiAgICB0aGlzLmFycmFuZ2UgPSB7XG4gICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgIHNvcnRCeTogdGhpcy5kYXRhLnNvcnRCeSB8fCB7XG4gICAgICAgIGZpZWxkOiBUQUJMRV9ERUZBVUxUUy5TT1JUX0ZJRUxELFxuICAgICAgICBvcmRlcjogVEFCTEVfREVGQVVMVFMuU09SVF9PUkRFUixcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLnNvcnRCeSA9IHRoaXMuZGF0YS5zb3J0QnkgfHwge1xuICAgICAgZmllbGQ6IFRBQkxFX0RFRkFVTFRTLlNPUlRfRklFTEQsXG4gICAgICBvcmRlcjogVEFCTEVfREVGQVVMVFMuU09SVF9PUkRFUixcbiAgICB9O1xuXG4gICAgLy8gQXBsaWNhciBmaWx0cm9zIGNsaWVudC1zaWRlIHNlIGV4aXN0aXJlbVxuICAgIGxldCBpdGVtc1RvRGlzcGxheSA9IFsuLi50aGlzLml0ZW1zXTtcbiAgICBpdGVtc1RvRGlzcGxheSA9IHRoaXMuYXBwbHlDbGllbnRTaWRlRmlsdGVycyhpdGVtc1RvRGlzcGxheSk7XG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gaXRlbXNUb0Rpc3BsYXk7IC8vIEFybWF6ZW5hciBkYWRvcyBmaWx0cmFkb3NcblxuICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoaXRlbXNUb0Rpc3BsYXkpO1xuICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjtcbiAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcbiAgICBpZiAodGhpcy5kYXRhLnNvcnRCeSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQuYWN0aXZlID0gdGhpcy5kYXRhLnNvcnRCeS5maWVsZDtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0LmRpcmVjdGlvbiA9IHRoaXMuZGF0YS5zb3J0Qnkub3JkZXI7XG4gICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydC5zb3J0Q2hhbmdlLmVtaXQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlID0gKGRhdGEsIGZpbHRlcjogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnMuc29tZSgoY29sKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmIChjb2wuZmlsdGVyUHJlZGljYXRlcykge1xuICAgICAgICAgIHJldHVybiBjb2wuZmlsdGVyUHJlZGljYXRlcy5zb21lKChwcmVkaWNhdGUpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBkYXRhW2NvbC5wcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAoIXByb3BlcnR5VmFsdWUgfHwgdHlwZW9mIHByb3BlcnR5VmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcHJlZGljYXRlVmFsdWUgPSBwcm9wZXJ0eVZhbHVlW3ByZWRpY2F0ZV07XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlVmFsdWUgPT09IG51bGwgfHwgcHJlZGljYXRlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcocHJlZGljYXRlVmFsdWUpXG4gICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgLmluY2x1ZGVzKGZpbHRlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sLnByb3BlcnR5ICYmIGNvbC5pc0ZpbHRlcmFibGUpIHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eVZhbHVlID0gZGF0YVtjb2wucHJvcGVydHldO1xuICAgICAgICAgIGlmIChwcm9wZXJ0eVZhbHVlID09PSBudWxsIHx8IHByb3BlcnR5VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBTdHJpbmcocHJvcGVydHlWYWx1ZSlcbiAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgICAuaW5jbHVkZXMoZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHRoaXMuZmlsdGVyUHJlZGljYXRlID0gdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8vIEFwbGljYXIgZmlsdHJvcyBjbGllbnQtc2lkZSAoZmlsdHJvcyBwb3IgZGF0YSlcbiAgcHJpdmF0ZSBhcHBseUNsaWVudFNpZGVGaWx0ZXJzKGl0ZW1zOiBhbnlbXSk6IGFueVtdIHtcbiAgICBsZXQgZmlsdGVyZWRJdGVtcyA9IFsuLi5pdGVtc107XG5cbiAgICAvLyBBZ3J1cGFyIGZpbHRyb3MgZGUgZGF0YSBwb3IgcHJvcHJpZWRhZGVcbiAgICBjb25zdCBkYXRlRmlsdGVyc0J5UHJvcGVydHk6IFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIEFycmF5PHsgaW5pdGlhbDogRGF0ZTsgZmluYWw6IERhdGUgfT5cbiAgICA+ID0ge307XG4gICAgY29uc3Qgb3RoZXJGaWx0ZXJzOiBBcnJheTx7XG4gICAgICBncm91cDogRm9ybUdyb3VwO1xuICAgICAgc2VsZWN0ZWRGaWx0ZXI6IGFueTtcbiAgICAgIGFycmFuZ2U6IHN0cmluZztcbiAgICB9PiA9IFtdO1xuXG4gICAgdGhpcy5maWx0ZXJzRm9ybS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRGaWx0ZXIgPSBncm91cC5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZTtcbiAgICAgIGlmICghc2VsZWN0ZWRGaWx0ZXIpIHJldHVybjtcblxuICAgICAgY29uc3QgYXJyYW5nZSA9IHNlbGVjdGVkRmlsdGVyLmFycmFuZ2U7XG5cbiAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJykge1xuICAgICAgICBjb25zdCBpbml0aWFsID0gZ3JvdXAuZ2V0KCdpbml0aWFsRGF0ZScpPy52YWx1ZTtcbiAgICAgICAgY29uc3QgZmluYWwgPSBncm91cC5nZXQoJ2ZpbmFsRGF0ZScpPy52YWx1ZTtcblxuICAgICAgICAvLyBTw7MgYXBsaWNhciBmaWx0cm8gc2UgYW1iYXMgYXMgZGF0YXMgZXN0aXZlcmVtIHByZWVuY2hpZGFzXG4gICAgICAgIGlmIChpbml0aWFsICYmIGZpbmFsICYmIGluaXRpYWwudHJpbSgpICYmIGZpbmFsLnRyaW0oKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBWYWxpZGFyIGZvcm1hdG8gZGEgZGF0YSAoREQvTU0vQUFBQSlcbiAgICAgICAgICAgIGNvbnN0IGRhdGVQYXR0ZXJuID0gL14oXFxkezEsMn0pXFwvKFxcZHsxLDJ9KVxcLyhcXGR7NH0pJC87XG4gICAgICAgICAgICBpZiAoIWRhdGVQYXR0ZXJuLnRlc3QoaW5pdGlhbCkgfHwgIWRhdGVQYXR0ZXJuLnRlc3QoZmluYWwpKSB7XG4gICAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JhciBzZSBmb3JtYXRvIGludsOhbGlkb1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbZGF5SSwgbW9udGhJLCB5ZWFySV0gPSBpbml0aWFsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoSX0vJHtkYXlJfS8ke3llYXJJfWApO1xuICAgICAgICAgICAgY29uc3QgW2RheUYsIG1vbnRoRiwgeWVhckZdID0gZmluYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbmFsRGF0ZSA9IG5ldyBEYXRlKGAke21vbnRoRn0vJHtkYXlGfS8ke3llYXJGfWApO1xuICAgICAgICAgICAgZmluYWxEYXRlLnNldEhvdXJzKDIzLCA1OSwgNTkpO1xuXG4gICAgICAgICAgICAvLyBWYWxpZGFyIHNlIGFzIGRhdGFzIHPDo28gdsOhbGlkYXNcbiAgICAgICAgICAgIGlmIChpc05hTihpbml0aWFsRGF0ZS5nZXRUaW1lKCkpIHx8IGlzTmFOKGZpbmFsRGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICAgIHJldHVybjsgLy8gSWdub3JhciBzZSBkYXRhcyBpbnbDoWxpZGFzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFVzYXIgbyBjYW1wbyBkYSBjb2x1bmEgb3UgbyBzb3J0QnkuZmllbGQgY29tbyBwYWRyw6NvXG4gICAgICAgICAgICBjb25zdCBkYXRlRmllbGQgPSBzZWxlY3RlZEZpbHRlci5wcm9wZXJ0eSB8fCB0aGlzLnNvcnRCeS5maWVsZDtcblxuICAgICAgICAgICAgaWYgKCFkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXSkge1xuICAgICAgICAgICAgICBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRlRmlsdGVyc0J5UHJvcGVydHlbZGF0ZUZpZWxkXS5wdXNoKHtcbiAgICAgICAgICAgICAgaW5pdGlhbDogaW5pdGlhbERhdGUsXG4gICAgICAgICAgICAgIGZpbmFsOiBmaW5hbERhdGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvIGFvIHByb2Nlc3NhciBkYXRhcyBkbyBmaWx0cm86JywgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3RoZXJGaWx0ZXJzLnB1c2goeyBncm91cCwgc2VsZWN0ZWRGaWx0ZXIsIGFycmFuZ2UgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBPYmplY3Qua2V5cyhkYXRlRmlsdGVyc0J5UHJvcGVydHkpLmZvckVhY2goKGRhdGVGaWVsZCkgPT4ge1xuICAgICAgY29uc3QgaW50ZXJ2YWxzID0gZGF0ZUZpbHRlcnNCeVByb3BlcnR5W2RhdGVGaWVsZF07XG5cbiAgICAgIGZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IGl0ZW1bZGF0ZUZpZWxkXTtcblxuICAgICAgICAgIGlmICghZmllbGRWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBpdGVtRGF0ZTogRGF0ZTtcbiAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUudG9EYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpdGVtRGF0ZSA9IGZpZWxkVmFsdWUudG9EYXRlKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgaXRlbURhdGUgPSBmaWVsZFZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpdGVtRGF0ZSA9IG5ldyBEYXRlKGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgaWYgKGlzTmFOKGl0ZW1EYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpdGVtRGF0ZSA9IG5ldyBEYXRlKGZpZWxkVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGludGVydmFscy5zb21lKFxuICAgICAgICAgICAgKGludGVydmFsKSA9PlxuICAgICAgICAgICAgICBpdGVtRGF0ZSA+PSBpbnRlcnZhbC5pbml0aWFsICYmIGl0ZW1EYXRlIDw9IGludGVydmFsLmZpbmFsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnRXJybyBhbyBwcm9jZXNzYXIgZmlsdHJvIGRlIGRhdGEgcGFyYSBvIGl0ZW06JyxcbiAgICAgICAgICAgIGl0ZW0uaWQsXG4gICAgICAgICAgICBlcnJvclxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIG90aGVyRmlsdGVycy5mb3JFYWNoKCh7IGdyb3VwLCBzZWxlY3RlZEZpbHRlciwgYXJyYW5nZSB9KSA9PiB7XG4gICAgICBpZiAoYXJyYW5nZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBncm91cC5nZXQoJ3R5cGVGaWx0ZXInKT8udmFsdWU7XG4gICAgICAgIGlmIChmaWx0ZXJWYWx1ZSAmJiBmaWx0ZXJWYWx1ZS50cmltKCkpIHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHNlbGVjdGVkRmlsdGVyLnByb3BlcnR5O1xuICAgICAgICAgIGZpbHRlcmVkSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhpdGVtW3Byb3BlcnR5XSB8fCAnJylcbiAgICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHNlbGVjdGVkRmlsdGVyLmhhc093blByb3BlcnR5KCdpdGVtcycpICYmXG4gICAgICAgIGFycmFuZ2UgPT09ICdlcXVhbHMnXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IGdyb3VwLmdldCgnc2VsZWN0SXRlbScpPy52YWx1ZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRJdGVtcykgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVzID0gc2VsZWN0ZWRJdGVtcy5tYXAoKGl0ZW06IGFueSkgPT4gaXRlbS52YWx1ZSk7XG4gICAgICAgICAgZmlsdGVyZWRJdGVtcyA9IGZpbHRlcmVkSXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZEl0ZW1zLnNvbWUoKHNlbGVjdGVkSXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1WYWx1ZSA9IGl0ZW1bc2VsZWN0ZWRJdGVtLnByb3BlcnR5XTtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1WYWx1ZSA9PT0gc2VsZWN0ZWRJdGVtLnZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmaWx0ZXJlZEl0ZW1zO1xuICB9XG5cbiAgLy8gSGFuZGxlciBwYXJhIG11ZGFuw6dhcyBkZSBkYXRhIG5vIGZpbHRyb1xuICBvbkRhdGVGaWx0ZXJDaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgLy8gQXR1YWxpemFyIGFycmFuZ2UgY29tIG9zIGZpbHRyb3MgYXRpdm9zXG4gICAgICB0aGlzLmFycmFuZ2UgPSB0aGlzLmJ1aWxkQXJyYW5nZUZyb21GaWx0ZXJzKCk7XG4gICAgICAvLyBBcGxpY2FyIGZpbHRyb3MgKG91IHJlbW92ZXIgc2UgY2FtcG9zIGVzdGl2ZXJlbSB2YXppb3MpXG4gICAgICB0aGlzLmFwcGx5RmlsdGVyc1RvRGF0YVNvdXJjZSgpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXBsaWNhciBtw6FzY2FyYSBkZSBkYXRhIChERC9NTS9BQUFBKSBtYW51YWxtZW50ZVxuICBvbkRhdGVJbnB1dChcbiAgICBldmVudDogYW55LFxuICAgIGNvbnRyb2xOYW1lOiAnaW5pdGlhbERhdGUnIHwgJ2ZpbmFsRGF0ZScsXG4gICAgZmlsdGVySW5kZXg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcbiAgICBsZXQgdmFsdWUgPSBpbnB1dC52YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpOyAvLyBSZW1vdmUgdHVkbyBxdWUgbsOjbyDDqSBkw61naXRvXG5cbiAgICAvLyBMaW1pdGFyIGEgOCBkw61naXRvcyAoRERNTUFBQUEpXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+IDgpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMCwgOCk7XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0YXI6IEREL01NL0FBQUFcbiAgICBpZiAodmFsdWUubGVuZ3RoIDw9IDIpIHtcbiAgICAgIHZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPD0gNCkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAyKSArICcvJyArIHZhbHVlLnNsaWNlKDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9XG4gICAgICAgIHZhbHVlLnNsaWNlKDAsIDIpICsgJy8nICsgdmFsdWUuc2xpY2UoMiwgNCkgKyAnLycgKyB2YWx1ZS5zbGljZSg0LCA4KTtcbiAgICB9XG5cbiAgICAvLyBBdHVhbGl6YXIgbyBGb3JtQ29udHJvbFxuICAgIGNvbnN0IGZpbHRlckdyb3VwID0gdGhpcy5maWx0ZXJzRm9ybS5hdChmaWx0ZXJJbmRleCkgYXMgRm9ybUdyb3VwO1xuICAgIGZpbHRlckdyb3VwLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gIH1cblxuICAvLyBBcGxpY2FyIGZpbHRyb3MgYW8gZGF0YVNvdXJjZSBxdWFuZG8gbsOjbyBow6EgcGFnaW5hw6fDo29cbiAgcHJpdmF0ZSBhcHBseUZpbHRlcnNUb0RhdGFTb3VyY2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHJldHVybjtcblxuICAgIGxldCBmaWx0ZXJlZEl0ZW1zID0gdGhpcy5hcHBseUNsaWVudFNpZGVGaWx0ZXJzKFsuLi50aGlzLml0ZW1zXSk7XG4gICAgdGhpcy5kYXRhU291cmNlLmRhdGEgPSBmaWx0ZXJlZEl0ZW1zO1xuICAgIC8vIEF0dWFsaXphciBmaWx0ZXJlZEl0ZW1zIGNvbSBvcyBkYWRvcyBmaWx0cmFkb3MgKHNlcsOhIGF0dWFsaXphZG8gbm92YW1lbnRlIG5vIGhhbmRsZURvd25sb2FkIGNvbSBmaWx0ZXJlZERhdGEpXG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gZmlsdGVyZWRJdGVtcztcbiAgICB0aGlzLnRvdGFsSXRlbXMgPSBmaWx0ZXJlZEl0ZW1zLmxlbmd0aDtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8gTcOpdG9kb3MgY29tIHBhZ2luYcOnw6NvXG4gIHByaXZhdGUgYXN5bmMgbG9hZEl0ZW1zUGFnaW5hdGVkKFxuICAgIG5hdmlnYXRpb246IHN0cmluZyA9ICdyZWxvYWQnLFxuICAgIHJlc2V0OiBib29sZWFuID0gZmFsc2VcbiAgKSB7XG4gICAgaWYgKHJlc2V0ICYmIFsnZm9yd2FyZCcsICdyZWxvYWQnXS5pbmNsdWRlcyhuYXZpZ2F0aW9uKSkge1xuICAgICAgdGhpcy5sYXN0RG9jID0gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG4gICAgfVxuICAgIGlmIChyZXNldCAmJiBbJ2JhY2t3YXJkJywgJ3JlbG9hZCddLmluY2x1ZGVzKG5hdmlnYXRpb24pKSB7XG4gICAgICB0aGlzLmZpcnN0RG9jID0gbnVsbDtcbiAgICAgIHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZlRmlsdGVycyA9IHRoaXMuZmlsdGVyc0Zvcm0uY29udHJvbHNcbiAgICAgIC5mbGF0TWFwKChjb250cm9sKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRmlsdGVyID0gZ3JvdXAuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU7XG4gICAgICAgIGlmICghc2VsZWN0ZWRGaWx0ZXIpIHJldHVybiBbXTtcblxuICAgICAgICBjb25zdCBhcnJhbmdlID0gc2VsZWN0ZWRGaWx0ZXIuYXJyYW5nZTtcblxuICAgICAgICBpZiAoYXJyYW5nZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGdyb3VwLmdldCgndHlwZUZpbHRlcicpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoIWZpbHRlclZhbHVlKSByZXR1cm4gW107XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFycmFuZ2UsXG4gICAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgICAgcHJvcGVydHk6IHNlbGVjdGVkRmlsdGVyLnByb3BlcnR5LFxuICAgICAgICAgICAgICBmaWx0ZXJpbmc6IGZpbHRlclZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXJCeURhdGUnKSB7XG4gICAgICAgICAgY29uc3QgaW5pdGlhbCA9IGdyb3VwLmdldCgnaW5pdGlhbERhdGUnKT8udmFsdWU7XG4gICAgICAgICAgY29uc3QgZmluYWwgPSBncm91cC5nZXQoJ2ZpbmFsRGF0ZScpPy52YWx1ZTtcbiAgICAgICAgICBpZiAoaW5pdGlhbCAmJiBmaW5hbCkge1xuICAgICAgICAgICAgY29uc3QgW2RheUksIG1vbnRoSSwgeWVhckldID0gaW5pdGlhbC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEl9LyR7ZGF5SX0vJHt5ZWFySX1gKTtcbiAgICAgICAgICAgIGNvbnN0IFtkYXlGLCBtb250aEYsIHllYXJGXSA9IGZpbmFsLnNwbGl0KCcvJyk7XG4gICAgICAgICAgICBjb25zdCBmaW5hbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEZ9LyR7ZGF5Rn0vJHt5ZWFyRn1gKTtcbiAgICAgICAgICAgIGZpbmFsRGF0ZS5zZXRIb3VycygyMywgNTksIDU5KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGFycmFuZ2UsXG4gICAgICAgICAgICAgIGZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBkYXRlRmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbDogaW5pdGlhbERhdGUsXG4gICAgICAgICAgICAgICAgZmluYWw6IGZpbmFsRGF0ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEZpbHRlci5oYXNPd25Qcm9wZXJ0eSgnaXRlbXMnKSAmJiBhcnJhbmdlID09PSAnZXF1YWxzJykge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBncm91cC5nZXQoJ3NlbGVjdEl0ZW0nKT8udmFsdWU7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRJdGVtcykgJiYgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRJdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgICAgIGFycmFuZ2UsXG4gICAgICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLnByb3BlcnR5LFxuICAgICAgICAgICAgICAgIGZpbHRlcmluZzogaXRlbS52YWx1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGF0ZUZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmICYmIChmLmZpbHRlcj8uZmlsdGVyaW5nICE9PSB1bmRlZmluZWQgfHwgZi5kYXRlRmlsdGVyKSk7XG5cbiAgICB0aGlzLmFycmFuZ2UgPSB7XG4gICAgICBmaWx0ZXJzOiBhY3RpdmVGaWx0ZXJzLFxuICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICB9O1xuXG4gICAgY29uc3QgcGFnaW5hdGVkOiBhbnkgPSB7XG4gICAgICBiYXRjaFNpemU6IHRoaXMucGFnZVNpemUsXG4gICAgICBjb2xsZWN0aW9uOiB0aGlzLmRhdGEuY29sbGVjdGlvbixcbiAgICAgIGRvYzogeyBsYXN0RG9jOiB0aGlzLmxhc3REb2MsIGZpcnN0RG9jOiB0aGlzLmZpcnN0RG9jIH0sXG4gICAgICBuYXZpZ2F0aW9uLFxuICAgICAgYXJyYW5nZTogdGhpcy5hcnJhbmdlLFxuICAgICAgY29uZGl0aW9uczogdGhpcy5kYXRhLmNvbmRpdGlvbnMsXG4gICAgICBzaXplOiB0aGlzLnRvdGFsSXRlbXMsXG4gICAgICBmaWx0ZXJGbjogdGhpcy5kYXRhLmZpbHRlckZuLFxuICAgICAgY2xpZW50UGFnZUluZGV4OiB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXgsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudGFibGVTZXJ2aWNlLmdldFBhZ2luYXRlZChwYWdpbmF0ZWQpO1xuICAgIHRoaXMuaXRlbXMgPSByZXN1bHQuaXRlbXM7XG4gICAgYXdhaXQgdGhpcy5sb2FkUmVsYXRpb25zKCk7XG4gICAgYXdhaXQgdGhpcy5sb2FkUXVlcnlMZW5ndGhzKCk7XG4gICAgdGhpcy5sYXN0RG9jID0gcmVzdWx0Lmxhc3REb2MgYXMgYW55O1xuICAgIHRoaXMuZmlyc3REb2MgPSByZXN1bHQuZmlyc3REb2MgYXMgYW55O1xuXG4gICAgLy8gQXR1YWxpemFyIGN1cnJlbnRDbGllbnRQYWdlSW5kZXggc2UgcmV0b3JuYWRvIHBlbG8gZmFsbGJhY2tcbiAgICBpZiAocmVzdWx0LmN1cnJlbnRDbGllbnRQYWdlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXJyZW50Q2xpZW50UGFnZUluZGV4ID0gcmVzdWx0LmN1cnJlbnRDbGllbnRQYWdlSW5kZXg7XG4gICAgfVxuXG4gICAgbGV0IHN1bSA9IDA7XG4gICAgaWYgKHRoaXMuZGF0YS50b3RhbFJlZikge1xuICAgICAgZm9yIChjb25zdCB0b3RhbFJlZiBvZiB0aGlzLmRhdGEudG90YWxSZWYpIHtcbiAgICAgICAgY29uc3QgdG90YWxSZWZEb2MgPSBhd2FpdCB0b3RhbFJlZi5yZWYuZ2V0KCk7XG4gICAgICAgIGNvbnN0IGRvY0RhdGEgPSB0b3RhbFJlZkRvYy5kYXRhKCkgYXMgYW55O1xuICAgICAgICBpZiAoZG9jRGF0YSB8fCByZXN1bHQuZmlsdGVyTGVuZ3RoKSB7XG4gICAgICAgICAgc3VtID1cbiAgICAgICAgICAgIHJlc3VsdC5maWx0ZXJMZW5ndGggPz9cbiAgICAgICAgICAgICgoc3VtICsgKGRvY0RhdGEgPyBkb2NEYXRhW3RvdGFsUmVmLmZpZWxkXSA6IDApKSBhcyBudW1iZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSBzdW07XG4gICAgfVxuXG4gICAgdGhpcy5oYXNOZXh0UGFnZSA9IHJlc3VsdC5oYXNOZXh0UGFnZTtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlKHRoaXMuaXRlbXMpO1xuICAgIHRoaXMuZmlsdGVyUHJlZGljYXRlID0gdGhpcy5kYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFzeW5jIG9uUGFnZUNoYW5nZShldmVudD86IFBhZ2VFdmVudCkge1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSAmJiBldmVudCkge1xuICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzUGFnZUluZGV4ID0gZXZlbnQucHJldmlvdXNQYWdlSW5kZXggPz8gMDtcbiAgICAgIGNvbnN0IHBhZ2VJbmRleCA9IGV2ZW50LnBhZ2VJbmRleDtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb21wb25lbnRQYWdlU2l6ZSA9IHRoaXMucGFnZVNpemU7XG4gICAgICBjb25zdCBldmVudFBhZ2VTaXplID0gZXZlbnQucGFnZVNpemU7XG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gdGhpcy50b3RhbEl0ZW1zO1xuXG4gICAgICBsZXQgbmF2aWdhdGlvbkRpcmVjdGlvbjogc3RyaW5nO1xuICAgICAgbGV0IHJlc2V0RG9jcyA9IGZhbHNlO1xuICAgICAgbGV0IG9yaWdpbmFsUGFnZVNpemU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgICBjb25zdCBsYXN0UGFnZUluZGV4ID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGguY2VpbCh0b3RhbEl0ZW1zIC8gZXZlbnRQYWdlU2l6ZSkgLSAxXG4gICAgICApO1xuXG4gICAgICAvLyBBdHVhbGl6YXIgY3VycmVudENsaWVudFBhZ2VJbmRleCBzZW1wcmUgcGFyYSBvIGZhbGxiYWNrXG4gICAgICB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXggPSBwYWdlSW5kZXg7XG5cbiAgICAgIGlmIChwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmIHBhZ2VJbmRleCA+IHByZXZpb3VzUGFnZUluZGV4KSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2VOdW1iZXIrKztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4IDwgcHJldmlvdXNQYWdlSW5kZXhcbiAgICAgICkge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlTnVtYmVyID0gTWF0aC5tYXgoMSwgdGhpcy5jdXJyZW50UGFnZU51bWJlciAtIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRQYWdlU2l6ZSAhPT0gY3VycmVudENvbXBvbmVudFBhZ2VTaXplKSB7XG4gICAgICAgIHRoaXMucGFnZVNpemUgPSBldmVudFBhZ2VTaXplO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuICAgICAgICByZXNldERvY3MgPSB0cnVlO1xuICAgICAgICB0aGlzLmN1cnJlbnRDbGllbnRQYWdlSW5kZXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgcGFnZUluZGV4ID09PSAwICYmXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4IDwgcHJldmlvdXNQYWdlSW5kZXhcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZygnUHVsb3UgcGFyYSBhIHByaW1laXJhIHDDoWdpbmEnKTtcbiAgICAgICAgbmF2aWdhdGlvbkRpcmVjdGlvbiA9ICdmb3J3YXJkJztcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZU51bWJlciA9IDE7XG4gICAgICAgIHRoaXMuY3VycmVudENsaWVudFBhZ2VJbmRleCA9IDA7XG4gICAgICAgIHJlc2V0RG9jcyA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwYWdlSW5kZXggPT09IGxhc3RQYWdlSW5kZXggJiZcbiAgICAgICAgcHJldmlvdXNQYWdlSW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBwYWdlSW5kZXggPiBwcmV2aW91c1BhZ2VJbmRleCAmJlxuICAgICAgICBwYWdlSW5kZXggLSBwcmV2aW91c1BhZ2VJbmRleCA+IDFcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZygnUHVsb3UgcGFyYSBhIHVsdGltYSBww6FnaW5hJyk7XG4gICAgICAgIG5hdmlnYXRpb25EaXJlY3Rpb24gPSAnYmFja3dhcmQnO1xuICAgICAgICByZXNldERvY3MgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zRXhwZWN0ZWRJbkxhc3RQYWdlID1cbiAgICAgICAgICB0b3RhbEl0ZW1zIC0gbGFzdFBhZ2VJbmRleCAqIGV2ZW50UGFnZVNpemU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGl0ZW1zRXhwZWN0ZWRJbkxhc3RQYWdlID4gMCAmJlxuICAgICAgICAgIGl0ZW1zRXhwZWN0ZWRJbkxhc3RQYWdlIDwgZXZlbnRQYWdlU2l6ZVxuICAgICAgICApIHtcbiAgICAgICAgICBvcmlnaW5hbFBhZ2VTaXplID0gdGhpcy5wYWdlU2l6ZTtcbiAgICAgICAgICB0aGlzLnBhZ2VTaXplID0gaXRlbXNFeHBlY3RlZEluTGFzdFBhZ2U7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4ID4gcHJldmlvdXNQYWdlSW5kZXhcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZygnUHJvY2VkZW5kbycpO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuICAgICAgICByZXNldERvY3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHByZXZpb3VzUGFnZUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFnZUluZGV4IDwgcHJldmlvdXNQYWdlSW5kZXhcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZygnUmV0cm9jZWRlbmRvLicpO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ2JhY2t3YXJkJztcbiAgICAgICAgcmVzZXREb2NzID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwcmV2aW91c1BhZ2VJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhZ2VJbmRleCA9PT0gcHJldmlvdXNQYWdlSW5kZXhcbiAgICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZygnUmVjYXJyZWdhbmRvLicpO1xuICAgICAgICBuYXZpZ2F0aW9uRGlyZWN0aW9uID0gJ3JlbG9hZCc7XG4gICAgICAgIHJlc2V0RG9jcyA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChwcmV2aW91c1BhZ2VJbmRleCA9PT0gdW5kZWZpbmVkICYmIHBhZ2VJbmRleCA9PT0gMCkge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIGlmIChldmVudCkgdGhpcy5wYWdlRXZlbnQgPSBldmVudDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdJTkVTUEVSQURPISBDb25kacOnw6NvIGRlIG5hdmVnYcOnw6NvIG7Do28gdHJhdGFkYTonLCBldmVudCk7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgaWYgKGV2ZW50KSB0aGlzLnBhZ2VFdmVudCA9IGV2ZW50O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChuYXZpZ2F0aW9uRGlyZWN0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXNQYWdpbmF0ZWQobmF2aWdhdGlvbkRpcmVjdGlvbiwgcmVzZXREb2NzKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvIGFvIGNhcnJlZ2FyIGl0ZW5zIHBhZ2luYWRvczonLCBlcnJvcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaWYgKG9yaWdpbmFsUGFnZVNpemUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBvcmlnaW5hbFBhZ2VTaXplO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQpIHRoaXMucGFnZUV2ZW50ID0gZXZlbnQ7XG4gICAgICB0aGlzLmlzTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyBPdXRyb3MgbcOpdG9kb3NcblxuICBhcHBseUZpbHRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgLy8gU2VtIHBhZ2luYcOnw6NvXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLmZpbHRlciA9IFN0cmluZyh2YWx1ZSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIC8vIENvbSBwYWdpbmHDp8Ojb1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5maWx0ZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5maWx0ZXJTdWJqZWN0Lm5leHQodGhpcy5maWx0ZXJWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ29Ub0RldGFpbHMocm93OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhLmlzTm90Q2xpY2thYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHVybFBhdGggPSB0aGlzLmRhdGEudXJsIHx8IHRoaXMuZGF0YS5uYW1lO1xuICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybChcbiAgICAgIHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW2AvJHt1cmxQYXRofWAsIHJvdy5pZF0pXG4gICAgKTtcbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgfVxuXG4gIGFzeW5jIGdldFJlbGF0aW9uKHBhcmFtczoge1xuICAgIGlkOiBhbnk7XG4gICAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAgIG5ld1Byb3BlcnR5OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgc25hcHNob3Q6IGZpcmVzdG9yZS5Eb2N1bWVudFNuYXBzaG90PHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBwYXJhbXMuaWQgIT09ICcnICYmXG4gICAgICAgIHBhcmFtcy5pZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHBhcmFtcy5jb2xsZWN0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgcGFyYW1zLmNvbGxlY3Rpb24gIT09ICcnXG4gICAgICApIHtcbiAgICAgICAgc25hcHNob3QgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLmZpcmVzdG9yZS5jb2xsZWN0aW9uKHBhcmFtcy5jb2xsZWN0aW9uKS5kb2MocGFyYW1zLmlkKS5nZXQoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNuYXBzaG90ICYmIHNuYXBzaG90LmV4aXN0cykge1xuICAgICAgICBjb25zdCBkYXRhID0gc25hcHNob3QuZGF0YSgpIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIGRhdGE/LltwYXJhbXMubmV3UHJvcGVydHldID8/ICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICcnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFJlbGF0aW9ucygpIHtcbiAgICBjb25zdCByZWxhdGlvblByb21pc2VzID0gdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLnJlbGF0aW9uKVxuICAgICAgLmZsYXRNYXAoKGNvbCkgPT5cbiAgICAgICAgdGhpcy5pdGVtcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoY29sLnJlbGF0aW9uKSB7XG4gICAgICAgICAgICBpdGVtW2NvbC5wcm9wZXJ0eV0gPSBhd2FpdCB0aGlzLmdldFJlbGF0aW9uKHtcbiAgICAgICAgICAgICAgaWQ6IGl0ZW1bY29sLnJlbGF0aW9uLnNvdXJjZVByb3BlcnR5XSxcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sLnJlbGF0aW9uLnRhcmdldGVkQ29sbGVjdGlvbixcbiAgICAgICAgICAgICAgbmV3UHJvcGVydHk6IGNvbC5yZWxhdGlvbi50YXJnZXRlZFByb3BlcnR5IHx8IGNvbC5wcm9wZXJ0eSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChyZWxhdGlvblByb21pc2VzKTtcbiAgfVxuXG4gIGFzeW5jIGdldFF1ZXJ5TGVuZ3RoKHBhcmFtczoge1xuICAgIGl0ZW06IGFueTtcbiAgICByZWxhdGlvbjoge1xuICAgICAgY29sbGVjdGlvbjogc3RyaW5nO1xuICAgICAgcHJvcGVydHk6IHN0cmluZztcbiAgICAgIG9wZXJhdG9yOiBXaGVyZUZpbHRlck9wO1xuICAgICAgdmFsdWU6IHN0cmluZztcbiAgICB9O1xuICB9KSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0aGlzLmZpcmVzdG9yZVxuICAgICAgLmNvbGxlY3Rpb24ocGFyYW1zLnJlbGF0aW9uLmNvbGxlY3Rpb24pXG4gICAgICAucmVmLndoZXJlKFxuICAgICAgICBwYXJhbXMucmVsYXRpb24ucHJvcGVydHksXG4gICAgICAgIHBhcmFtcy5yZWxhdGlvbi5vcGVyYXRvcixcbiAgICAgICAgcGFyYW1zLml0ZW1bcGFyYW1zLnJlbGF0aW9uLnZhbHVlXVxuICAgICAgKVxuICAgICAgLmdldCgpO1xuICAgIHJldHVybiBzbmFwc2hvdC5zaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUXVlcnlMZW5ndGhzKCkge1xuICAgIGNvbnN0IGxlbmd0aFByb21pc2VzID0gdGhpcy5kYXRhLmRpc3BsYXllZENvbHVtbnNcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gY29sLnF1ZXJ5TGVuZ3RoKVxuICAgICAgLmZsYXRNYXAoKGNvbCkgPT5cbiAgICAgICAgdGhpcy5pdGVtcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoY29sLnF1ZXJ5TGVuZ3RoKSB7XG4gICAgICAgICAgICBpdGVtW2NvbC5wcm9wZXJ0eV0gPSBhd2FpdCB0aGlzLmdldFF1ZXJ5TGVuZ3RoKHtcbiAgICAgICAgICAgICAgaXRlbTogaXRlbSxcbiAgICAgICAgICAgICAgcmVsYXRpb246IGNvbC5xdWVyeUxlbmd0aCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwobGVuZ3RoUHJvbWlzZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtcygpIHtcbiAgICBpZiAodGhpcy5kYXRhLmNvbmRpdGlvbnMpIHtcbiAgICAgIHRoaXMuZGF0YS5jb25kaXRpb25zLmZvckVhY2goKGNvbmQpID0+IHtcbiAgICAgICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3BlcmF0b3JGdW5jdGlvbiA9ICh0aGlzLnRhYmxlU2VydmljZS5vcGVyYXRvcnMgYXMgYW55KVtcbiAgICAgICAgICAgIGNvbmQub3BlcmF0b3JcbiAgICAgICAgICBdO1xuICAgICAgICAgIGlmIChvcGVyYXRvckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gb3BlcmF0b3JGdW5jdGlvbihcbiAgICAgICAgICAgICAgaXRlbVtjb25kLmZpcmVzdG9yZVByb3BlcnR5XSxcbiAgICAgICAgICAgICAgY29uZC5kYXNoUHJvcGVydHlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQXJyYW5nZUZyb21GaWx0ZXJzKCk6IEFycmFuZ2Uge1xuICAgIGNvbnN0IGFjdGl2ZUZpbHRlcnMgPSB0aGlzLmZpbHRlcnNGb3JtLmNvbnRyb2xzXG4gICAgICAuZmxhdE1hcCgoY29udHJvbCkgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IGNvbnRyb2wgYXMgRm9ybUdyb3VwO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEZpbHRlciA9IGdyb3VwLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlO1xuICAgICAgICBpZiAoIXNlbGVjdGVkRmlsdGVyKSByZXR1cm4gW107XG5cbiAgICAgICAgY29uc3QgYXJyYW5nZSA9IHNlbGVjdGVkRmlsdGVyLmFycmFuZ2U7XG5cbiAgICAgICAgaWYgKGFycmFuZ2UgPT09ICdmaWx0ZXInKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWUgPSBncm91cC5nZXQoJ3R5cGVGaWx0ZXInKT8udmFsdWU7XG4gICAgICAgICAgaWYgKCFmaWx0ZXJWYWx1ZSkgcmV0dXJuIFtdO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgIHByb3BlcnR5OiBzZWxlY3RlZEZpbHRlci5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgZmlsdGVyaW5nOiBmaWx0ZXJWYWx1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlRmlsdGVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcnJhbmdlID09PSAnZmlsdGVyQnlEYXRlJykge1xuICAgICAgICAgIGNvbnN0IGluaXRpYWwgPSBncm91cC5nZXQoJ2luaXRpYWxEYXRlJyk/LnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGZpbmFsID0gZ3JvdXAuZ2V0KCdmaW5hbERhdGUnKT8udmFsdWU7XG4gICAgICAgICAgaWYgKGluaXRpYWwgJiYgZmluYWwpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IFtkYXlJLCBtb250aEksIHllYXJJXSA9IGluaXRpYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgY29uc3QgaW5pdGlhbERhdGUgPSBuZXcgRGF0ZShgJHttb250aEl9LyR7ZGF5SX0vJHt5ZWFySX1gKTtcbiAgICAgICAgICAgICAgY29uc3QgW2RheUYsIG1vbnRoRiwgeWVhckZdID0gZmluYWwuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgY29uc3QgZmluYWxEYXRlID0gbmV3IERhdGUoYCR7bW9udGhGfS8ke2RheUZ9LyR7eWVhckZ9YCk7XG4gICAgICAgICAgICAgIGZpbmFsRGF0ZS5zZXRIb3VycygyMywgNTksIDU5KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICAgIGluaXRpYWw6IGluaXRpYWxEYXRlLFxuICAgICAgICAgICAgICAgICAgZmluYWw6IGZpbmFsRGF0ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWRGaWx0ZXIuaGFzT3duUHJvcGVydHkoJ2l0ZW1zJykgJiYgYXJyYW5nZSA9PT0gJ2VxdWFscycpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gZ3JvdXAuZ2V0KCdzZWxlY3RJdGVtJyk/LnZhbHVlO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGVkSXRlbXMpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgICBhcnJhbmdlLFxuICAgICAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6IGl0ZW0udmFsdWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGRhdGVGaWx0ZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZikgPT4gZiAmJiAoZi5maWx0ZXI/LmZpbHRlcmluZyAhPT0gdW5kZWZpbmVkIHx8IGYuZGF0ZUZpbHRlcikpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlcnM6IGFjdGl2ZUZpbHRlcnMsXG4gICAgICBzb3J0Qnk6IHRoaXMuc29ydEJ5LFxuICAgIH07XG4gIH1cblxuICAvLyBGaWx0cm8gZGUgZGF0YVxuICBhc3luYyBzZWFyY2goZXZlbnQ/OiBFdmVudCkge1xuICAgIC8vIFByZXZlbmlyIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBmb3JtdWzDoXJpbyBhbyBwcmVzc2lvbmFyIEVudGVyXG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0U29ydC52YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0U29ydC52YWx1ZS5hcnJhbmdlID09PSAnYXNjZW5kaW5nJykge1xuICAgICAgICB0aGlzLnNvcnRCeSA9IHtcbiAgICAgICAgICBmaWVsZDogdGhpcy5zZWxlY3RTb3J0LnZhbHVlLnByb3BlcnR5LFxuICAgICAgICAgIG9yZGVyOiAnYXNjJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNlbGVjdFNvcnQudmFsdWUuYXJyYW5nZSA9PT0gJ2Rlc2NlbmRpbmcnKSB7XG4gICAgICAgIHRoaXMuc29ydEJ5ID0ge1xuICAgICAgICAgIGZpZWxkOiB0aGlzLnNlbGVjdFNvcnQudmFsdWUucHJvcGVydHksXG4gICAgICAgICAgb3JkZXI6ICdkZXNjJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZW0gcGFnaW5hw6fDo286IGFwbGljYXIgZmlsdHJvcyBjbGllbnQtc2lkZVxuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIEF0dWFsaXphciBhcnJhbmdlIGNvbSBvcyBmaWx0cm9zIGF0aXZvc1xuICAgICAgdGhpcy5hcnJhbmdlID0gdGhpcy5idWlsZEFycmFuZ2VGcm9tRmlsdGVycygpO1xuICAgICAgdGhpcy5hcHBseUZpbHRlcnNUb0RhdGFTb3VyY2UoKTtcbiAgICAgIHRoaXMuY3VycmVudEFycmFuZ2UgPVxuICAgICAgICB0aGlzLmZpbHRlcnNGb3JtLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHRoaXMuZmlsdGVyc0Zvcm0uYXQoMCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPz8gJydcbiAgICAgICAgICA6ICcnO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbSBwYWdpbmHDp8OjbzogY29tcG9ydGFtZW50byBvcmlnaW5hbFxuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXNQYWdpbmF0ZWQoJ3JlbG9hZCcsIHRydWUpO1xuICAgICAgdGhpcy5jdXJyZW50QXJyYW5nZSA9XG4gICAgICAgIHRoaXMuZmlsdGVyc0Zvcm0ubGVuZ3RoID4gMFxuICAgICAgICAgID8gdGhpcy5maWx0ZXJzRm9ybS5hdCgwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZT8uYXJyYW5nZSA/PyAnJ1xuICAgICAgICAgIDogJyc7XG4gICAgICB0aGlzLnBhZ2luYXRvci5maXJzdFBhZ2UoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlc2V0RmlsdGVyKCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSAnJztcbiAgICBpZiAodGhpcy5maWx0ZXJQcmVkaWNhdGUpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSB0aGlzLmZpbHRlclByZWRpY2F0ZTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcnNGb3JtLmNsZWFyKCk7XG4gICAgdGhpcy5hZGRGaWx0ZXIoKTtcbiAgICB0aGlzLnNlbGVjdFNvcnQucGF0Y2hWYWx1ZSgnJyk7XG4gICAgdGhpcy5zb3J0QnkgPSB7XG4gICAgICBvcmRlcjogdGhpcy5kYXRhLnNvcnRCeSA/IHRoaXMuZGF0YS5zb3J0Qnkub3JkZXIgOiAnZGVzYycsXG4gICAgICBmaWVsZDogdGhpcy5kYXRhLnNvcnRCeSA/IHRoaXMuZGF0YS5zb3J0QnkuZmllbGQgOiAnY3JlYXRlZEF0JyxcbiAgICB9O1xuXG4gICAgLy8gU2VtIHBhZ2luYcOnw6NvOiByZWNhcnJlZ2FyIGl0ZW5zIG9yaWdpbmFpc1xuICAgIGlmICh0aGlzLmRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgIC8vIFJlc2V0YXIgYXJyYW5nZSBwYXJhIHZhbG9yZXMgcGFkcsOjb1xuICAgICAgdGhpcy5hcnJhbmdlID0ge1xuICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICAgIH07XG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IFsuLi50aGlzLml0ZW1zXTtcbiAgICAgIHRoaXMudG90YWxJdGVtcyA9IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgICAgdGhpcy5jdXJyZW50QXJyYW5nZSA9ICcnO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENvbSBwYWdpbmHDp8OjbzogY29tcG9ydGFtZW50byBvcmlnaW5hbFxuICAgICAgYXdhaXQgdGhpcy5sb2FkSXRlbXNQYWdpbmF0ZWQoJ3JlbG9hZCcsIHRydWUpO1xuICAgICAgdGhpcy5jdXJyZW50QXJyYW5nZSA9ICcnO1xuICAgICAgdGhpcy5wYWdpbmF0b3IuZmlyc3RQYWdlKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyBNw6l0b2RvIHDDumJsaWNvIHBhcmEgcmVjYXJyZWdhciBhIHRhYmVsYVxuICBhc3luYyByZWxvYWRUYWJsZSgpIHtcbiAgICBpZiAodGhpcy5kYXRhLnBhZ2luYXRpb24pIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zUGFnaW5hdGVkKCdyZWxvYWQnLCB0cnVlKTtcbiAgICAgIHRoaXMucGFnaW5hdG9yLmZpcnN0UGFnZSgpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZEl0ZW1zKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRGlzcGxheWVkQ29sdW1ucygpIHtcbiAgICBpZiAodGhpcy5kYXRhU291cmNlKSB7XG4gICAgICB0aGlzLmRhdGFTb3VyY2UgPSBuZXcgTWF0VGFibGVEYXRhU291cmNlPGFueT4oW10pO1xuICAgIH1cblxuICAgIHRoaXMuY29sdW1uUHJvcGVydGllcyA9IHRoaXMuZGF0YS5kaXNwbGF5ZWRDb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICByZXR1cm4gY29sdW1uLnByb3BlcnR5O1xuICAgIH0pO1xuXG4gICAgdGhpcy5kcm9wZG93bkl0ZW1zID0gW107XG4gICAgdGhpcy5zb3J0YWJsZURyb3Bkb3duSXRlbXMgPSBbXTtcblxuICAgIHRoaXMuZGF0YS5kaXNwbGF5ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgaWYgKGNvbC5pc0ZpbHRlcmFibGUpIHtcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnZmlsdGVyJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjb2wuaXNTb3J0YWJsZSkge1xuICAgICAgICB0aGlzLnNvcnRhYmxlRHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2FzY2VuZGluZycsXG4gICAgICAgICAgdGl0bGU6IGNvbC50aXRsZSArICc6IGNyZXNjZW50ZScsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNvcnRhYmxlRHJvcGRvd25JdGVtcy5wdXNoKHtcbiAgICAgICAgICAuLi5jb2wsXG4gICAgICAgICAgYXJyYW5nZTogJ2Rlc2NlbmRpbmcnLFxuICAgICAgICAgIHRpdGxlOiBjb2wudGl0bGUgKyAnOiBkZWNyZXNjZW50ZScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNvbC5pc0ZpbHRlcmFibGVCeURhdGUpIHtcbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goe1xuICAgICAgICAgIC4uLmNvbCxcbiAgICAgICAgICBhcnJhbmdlOiAnZmlsdGVyQnlEYXRlJyxcbiAgICAgICAgICB0aXRsZTogY29sLnRpdGxlICsgJzogZmlsdHJvIHBvciBkYXRhJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmRhdGEuZmlsdGVyYWJsZU9wdGlvbnMgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLmZpbHRlcmFibGVPcHRpb25zKVxuICAgICkge1xuICAgICAgdGhpcy5kYXRhLmZpbHRlcmFibGVPcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT5cbiAgICAgICAgdGhpcy5kcm9wZG93bkl0ZW1zLnB1c2goeyAuLi5vcHRpb24sIGFycmFuZ2U6ICdlcXVhbHMnIH0pXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGlzU3RyaW5nKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIC8vIE3DqXRvZG9zIHBhcmEgY29udHJvbGUgZG8gdG9vbHRpcFxuICBvbkNlbGxNb3VzZUVudGVyKGV2ZW50OiBNb3VzZUV2ZW50LCByb3c6IGFueSwgY29sOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBTw7MgbW9zdHJhciB0b29sdGlwIHNlIGEgY29sdW5hIHRpdmVyIGNoYXJMaW1pdCBkZWZpbmlkb1xuICAgIGlmICghY29sLmNoYXJMaW1pdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxWYWx1ZSA9IHRoaXMuZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93LCB0cnVlKTtcblxuICAgIC8vIFPDsyBtb3N0cmFyIHRvb2x0aXAgc2UgbyB2YWxvciBjb21wbGV0byBmb3IgbWFpb3IgcXVlIG8gbGltaXRlXG4gICAgaWYgKGZ1bGxWYWx1ZS5sZW5ndGggPD0gY29sLmNoYXJMaW1pdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaG92ZXJlZENlbGwgPSB7IHJvdywgY29sIH07XG4gICAgdGhpcy50b29sdGlwQ29udGVudCA9IGZ1bGxWYWx1ZTtcblxuICAgIC8vIERlZmluaXIgcG9zacOnw6NvIGRvIHRvb2x0aXBcbiAgICB0aGlzLnRvb2x0aXBQb3NpdGlvbiA9IHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFggKyAxMCxcbiAgICAgIHk6IGV2ZW50LmNsaWVudFkgLSAxMCxcbiAgICB9O1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAvLyBUaW1lb3V0IHBhcmEgbW9zdHJhciBvIHRvb2x0aXBcbiAgICB0aGlzLnRvb2x0aXBUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaG92ZXJlZENlbGwgJiZcbiAgICAgICAgdGhpcy5ob3ZlcmVkQ2VsbC5yb3cgPT09IHJvdyAmJlxuICAgICAgICB0aGlzLmhvdmVyZWRDZWxsLmNvbCA9PT0gY29sXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zaG93VG9vbHRpcCA9IHRydWU7XG4gICAgICB9XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIG9uQ2VsbE1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudG9vbHRpcFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KTtcbiAgICAgIHRoaXMudG9vbHRpcFRpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd1Rvb2x0aXAgPSBmYWxzZTtcbiAgICB0aGlzLmhvdmVyZWRDZWxsID0gbnVsbDtcbiAgICB0aGlzLnRvb2x0aXBDb250ZW50ID0gJyc7XG4gIH1cblxuICBvbkNlbGxNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG93VG9vbHRpcCkge1xuICAgICAgdGhpcy50b29sdGlwUG9zaXRpb24gPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggKyAxMCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIDEwLFxuICAgICAgfTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE3DqXRvZG9zIHBhcmEgaW52ZXJzw6NvIHZlcnRpY2FsIGRvcyB0YWJzXG4gIGdldFRhYkdyb3Vwcyh0YWJzOiBhbnlbXSk6IG51bWJlcltdIHtcbiAgICBpZiAoIXRhYnMgfHwgdGFicy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHRvdGFsR3JvdXBzID0gTWF0aC5jZWlsKHRhYnMubGVuZ3RoIC8gNik7XG4gICAgY29uc3QgZ3JvdXBzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8gQ3JpYXIgYXJyYXkgZGUgw61uZGljZXMgaW52ZXJ0aWRvcyAow7psdGltbyBncnVwbyBwcmltZWlybylcbiAgICBmb3IgKGxldCBpID0gdG90YWxHcm91cHMgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgZ3JvdXBzLnB1c2goaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3VwcztcbiAgfVxuXG4gIGdldFRhYkdyb3VwKHRhYnM6IGFueVtdLCBncm91cEluZGV4OiBudW1iZXIpOiBhbnlbXSB7XG4gICAgaWYgKCF0YWJzIHx8IHRhYnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBzdGFydEluZGV4ID0gZ3JvdXBJbmRleCAqIDY7XG4gICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4ICsgNiwgdGFicy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHRhYnMuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICB9XG5cbiAgZ2V0UmVhbFRhYkluZGV4KGdyb3VwSW5kZXg6IG51bWJlciwgdGFiSW5kZXhJbkdyb3VwOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5kYXRhLnRhYnM/LnRhYnNEYXRhKSByZXR1cm4gMDtcbiAgICBjb25zdCB0b3RhbEdyb3VwcyA9IE1hdGguY2VpbCh0aGlzLmRhdGEudGFicy50YWJzRGF0YS5sZW5ndGggLyA2KTtcbiAgICBjb25zdCByZWFsR3JvdXBJbmRleCA9IHRvdGFsR3JvdXBzIC0gMSAtIGdyb3VwSW5kZXg7XG4gICAgcmV0dXJuIHJlYWxHcm91cEluZGV4ICogNiArIHRhYkluZGV4SW5Hcm91cDtcbiAgfVxuXG4gIG9uVGFibGVTZWxlY3RlZChpOiBudW1iZXIsIGo6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5kYXRhLnRhYnM/LnRhYnNEYXRhIHx8ICF0aGlzLmRhdGEudGFicy5tZXRob2QpIHJldHVybjtcbiAgICB0aGlzLnNlbGVjdGVkVGFiID0gdGhpcy5nZXRSZWFsVGFiSW5kZXgoaSwgaik7XG4gICAgY29uc3QgdGFiID0gdGhpcy5kYXRhLnRhYnMudGFic0RhdGFbdGhpcy5zZWxlY3RlZFRhYl07XG4gICAgaWYgKHRhYikge1xuICAgICAgdGhpcy5kYXRhLnRhYnMubWV0aG9kKHRhYiwgdGhpcy5zZWxlY3RlZFRhYik7XG4gICAgfVxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgaXNUYWJTZWxlY3RlZChvcmlnaW5hbEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRhYiA9PT0gb3JpZ2luYWxJbmRleDtcbiAgfVxuXG4gIHNob3VsZFNob3dBY3Rpb25CdXR0b24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmRhdGE/LmFjdGlvbkJ1dHRvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5kYXRhLmFjdGlvbkJ1dHRvbi5jb25kaXRpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhLmFjdGlvbkJ1dHRvbi5jb25kaXRpb24obnVsbCkgPz8gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIE3DqXRvZG8gcGFyYSBsaWRhciBjb20gZG93bmxvYWQgKGRpZmVyZW50ZSBwYXJhIHBhZ2luYWRvIGUgbsOjbyBwYWdpbmFkbylcbiAgaGFuZGxlRG93bmxvYWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRvd25sb2FkVGFibGUpIHJldHVybjtcblxuICAgIC8vIFNlIG7Do28gaMOhIHBhZ2luYcOnw6NvLCB1c2FyIGRhZG9zIGZpbHRyYWRvcyBkbyBkYXRhU291cmNlXG4gICAgaWYgKHRoaXMuZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZSkge1xuICAgICAgLy8gQXR1YWxpemFyIGZpbHRlcmVkSXRlbXMgY29tIG9zIGRhZG9zIGZpbHRyYWRvcyBkbyBkYXRhU291cmNlXG4gICAgICAvLyAocXVlIGrDoSBpbmNsdWkgZmlsdHJvIGRlIHRleHRvIGFwbGljYWRvIHZpYSBmaWx0ZXJQcmVkaWNhdGUpXG4gICAgICBpZiAodGhpcy5kYXRhU291cmNlICYmIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGEpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gWy4uLnRoaXMuZGF0YVNvdXJjZS5maWx0ZXJlZERhdGFdO1xuICAgICAgfVxuXG4gICAgICAvLyBDb25zdHJ1aXIgYXJyYW5nZSBjb20gb3MgZmlsdHJvcyBhdGl2b3MgKHNlIGhvdXZlcilcbiAgICAgIGNvbnN0IGFycmFuZ2UgPSB0aGlzLmJ1aWxkQXJyYW5nZUZyb21GaWx0ZXJzKCk7XG4gICAgICB0aGlzLmRvd25sb2FkVGFibGUoYXJyYW5nZSwgdGhpcy5kYXRhLmNvbmRpdGlvbnMgfHwgW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNb2RvIHBhZ2luYWRvOiB1c2FyIGFycmFuZ2UgZXhpc3RlbnRlIChjb21wb3J0YW1lbnRvIG9yaWdpbmFsKVxuICAgICAgaWYgKHRoaXMuYXJyYW5nZSkge1xuICAgICAgICB0aGlzLmRvd25sb2FkVGFibGUodGhpcy5hcnJhbmdlLCB0aGlzLmRhdGEuY29uZGl0aW9ucyB8fCBbXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdHJhY2tCeVByb3BlcnR5KF9pbmRleDogbnVtYmVyLCBjb2w6IENvbHVtbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbC5wcm9wZXJ0eTtcbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImRhdGFcIiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTZcIj5cbiAgICA8IS0tIFVOSUZJRUQgQ09OVFJPTCBQQU5FTDogRklMVEVSUywgU09SVCAmIEFDVElPTlMgLS0+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyb3VuZGVkLXhsIGJvcmRlciBib3JkZXItZ3JheS0yMDAgYmctd2hpdGUgcC00IHNoYWRvdy1sZ1wiXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBkYXRhLnBhZ2luYXRpb24gPT09IHRydWUgJiZcbiAgICAgICAgKGRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHNvcnRhYmxlRHJvcGRvd25JdGVtcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgZGF0YS5hY3Rpb25CdXR0b24pXG4gICAgICBcIlxuICAgID5cbiAgICAgIDwhLS0gUEFORUwgSEVBREVSOiBUaXRsZSBhbmQgQ3VzdG9tIEFjdGlvbiAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJtYi00IGZsZXggZmxleC1jb2wgaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00IGJvcmRlci1iLTIgYm9yZGVyLWdyYXktMjAwIHBiLTQgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBMZWZ0IFNpZGU6IFRpdGxlICYgTWFpbiBBY3Rpb24gQnV0dG9uIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbHRlciB0ZXh0LXhsIHRleHQtYmx1ZS01MDBcIj48L2k+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGcgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktNzAwXCJcbiAgICAgICAgICAgICAgPkZpbHRyb3MgZSBBw6fDtWVzPC9zcGFuXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhLmFjdGlvbkJ1dHRvbiAmJiBkYXRhLmFjdGlvbkJ1dHRvbi5jb25kaXRpb25cIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiXG4gICAgICAgICAgICAgIChkYXRhLmFjdGlvbkJ1dHRvbi5jb2xvckNsYXNzIHx8ICdiZy1ibHVlLTUwMCcpICtcbiAgICAgICAgICAgICAgJyBmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgaG92ZXI6b3BhY2l0eS03MCdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCJkYXRhLmFjdGlvbkJ1dHRvbi5yb3V0ZXJMaW5rXCJcbiAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgZGF0YS5hY3Rpb25CdXR0b24ubWV0aG9kID8gZGF0YS5hY3Rpb25CdXR0b24ubWV0aG9kKCRldmVudCkgOiBudWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5hY3Rpb25CdXR0b24uaWNvblwiXG4gICAgICAgICAgICAgIFtjbGFzc109XCJkYXRhLmFjdGlvbkJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICB7eyBkYXRhLmFjdGlvbkJ1dHRvbi5sYWJlbCB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNPUlQgRklFTEQgKEludGVncmF0ZWQgd2l0aCBmaWx0ZXJzKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCIgKm5nSWY9XCJzb3J0YWJsZURyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTMgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHAtMlwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc29ydC1hbHBoYS1kb3duIHRleHQtY3lhbi02MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+T3JkZW5hciBwb3I8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZS4uLlwiIFtmb3JtQ29udHJvbF09XCJzZWxlY3RTb3J0XCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNvcnRhYmxlRHJvcGRvd25JdGVtc1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc29ydC1hbHBoYS1kb3duIHRleHQtY3lhbi02MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+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+XG5cbiAgICAgIDwhLS0gUEFORUwgRk9PVEVSOiBBZGQgRmlsdGVyICYgQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiLW1iLTIgZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwIHB0LTQgc206ZmxleC1yb3cgc206aXRlbXMtY2VudGVyXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBBZGQgRmlsdGVyIEJ1dHRvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJhZGRGaWx0ZXIoKVwiXG4gICAgICAgICAgICBjbGFzcz1cInRyYW5zZm9ybSByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLWJsdWUtMzAwIGJnLWJsdWUtNTAgcHgtNiBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ibHVlLTYwMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAgaG92ZXI6LXRyYW5zbGF0ZS15LTAuNSBob3Zlcjpib3JkZXItYmx1ZS00MDAgaG92ZXI6YmctYmx1ZS0xMDAgaG92ZXI6c2hhZG93LW1kXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZGljaW9uYXIgbm92byBmaWx0cm9cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1cyBtci0yXCI+PC9pPlxuICAgICAgICAgICAgQWRpY2lvbmFyIEZpbHRyb1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFJpZ2h0IFNpZGU6IFNlYXJjaCwgUmVzZXQsIEV4cG9ydCAtLT5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTMgc2VsZi1zdGFydCBzbTpzZWxmLWF1dG9cIlxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICB0aGlzLmhhc0ZpbHRlcmFibGVDb2x1bW4gPT09IHRydWUgfHwgdGhpcy5oYXNTb3J0YWJsZUNvbHVtbiA9PT0gdHJ1ZVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoKClcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgYmctZ3JlZW4tNjAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JlZW4tNzAwXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBcGxpY2FyIGZpbHRyb3NcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPlxuICAgICAgICAgICAgUGVzcXVpc2FyXG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwicmVzZXRGaWx0ZXIoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgYmctcmVkLTUwMCBweC01IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLXJlZC02MDBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkxpbXBhciBmaWx0cm9zXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1yZWRvLWFsdFwiPjwvaT5cbiAgICAgICAgICAgIFJlc2V0YXJcbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5kb3dubG9hZCAhPT0gZmFsc2UgJiYgZG93bmxvYWRUYWJsZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgYmctb3JhbmdlLTUwMCBweC01IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLW9yYW5nZS02MDBcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkV4cG9ydGFyIFRhYmVsYVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSAmJiB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyZWREYXRhLmxlbmd0aCA8PSAwXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAkYW55KGFycmFuZ2UpICYmIGRvd25sb2FkVGFibGUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gZG93bmxvYWRUYWJsZSgkYW55KGFycmFuZ2UpLCBkYXRhLmNvbmRpdGlvbnMgfHwgW10pXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZG93bmxvYWRcIj48L2k+XG4gICAgICAgICAgICBFeHBvcnRhclxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTSU1QTEUgU0VBUkNIIChmb3Igbm9uLXBhZ2luYXRlZCB0YWJsZXMpIC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGJnLXdoaXRlIHAtNCBzaGFkb3ctbGdcIlxuICAgICAgKm5nSWY9XCJkYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlICYmIGhhc0ZpbHRlcmFibGVDb2x1bW4gPT09IHRydWVcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlciBzbTpqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbCBzbTpmbGV4LTFcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoIHRleHQtYmx1ZS01MDBcIj48L2k+XG4gICAgICAgICAgICBCdXNjYXJcbiAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgKGtleXVwKT1cImFwcGx5RmlsdGVyKGZpbHRlcklucHV0LnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkRpZ2l0ZSBwYXJhIGZpbHRyYXIuLi5cIlxuICAgICAgICAgICAgI2ZpbHRlcklucHV0XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4IGNsYXNzPVwidGV4dC1ncmF5LTUwMFwiPnNlYXJjaDwvbWF0LWljb24+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAqbmdJZj1cImRhdGEuYWN0aW9uQnV0dG9uXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJcbiAgICAgICAgICAgIChkYXRhLmFjdGlvbkJ1dHRvbi5jb2xvckNsYXNzIHx8ICdiZy1ibHVlLTUwMCcpICtcbiAgICAgICAgICAgICcgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1sZyBweC00IHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIGhvdmVyOm9wYWNpdHktNzAgc2VsZi1zdGFydCBzbTpzZWxmLWF1dG8nXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbcm91dGVyTGlua109XCJkYXRhLmFjdGlvbkJ1dHRvbi5yb3V0ZXJMaW5rXCJcbiAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QgPyBkYXRhLmFjdGlvbkJ1dHRvbi5tZXRob2QoJGV2ZW50KSA6IG51bGxcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlcbiAgICAgICAgICAgICpuZ0lmPVwiZGF0YS5hY3Rpb25CdXR0b24uaWNvblwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiZGF0YS5hY3Rpb25CdXR0b24uaWNvblwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgICB7eyBkYXRhLmFjdGlvbkJ1dHRvbi5sYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTT1JUIEZJRUxEIChmb3Igbm9uLXBhZ2luYXRlZCB0YWJsZXMpIC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwibWItNCByb3VuZGVkLXhsIGJvcmRlciBib3JkZXItZ3JheS0yMDAgYmctd2hpdGUgcC00IHNoYWRvdy1sZ1wiXG4gICAgICAqbmdJZj1cImRhdGEucGFnaW5hdGlvbiA9PT0gZmFsc2UgJiYgc29ydGFibGVEcm9wZG93bkl0ZW1zLmxlbmd0aCA+IDBcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTMgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHAtMlwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtaW4tdy1bMjAwcHhdIGZsZXgtMVwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zb3J0LWFscGhhLWRvd24gdGV4dC1jeWFuLTYwMFwiPjwvaT5cbiAgICAgICAgICAgICAgPHNwYW4+T3JkZW5hciBwb3I8L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lLi4uXCIgW2Zvcm1Db250cm9sXT1cInNlbGVjdFNvcnRcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzb3J0YWJsZURyb3Bkb3duSXRlbXNcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1zb3J0LWFscGhhLWRvd24gdGV4dC1jeWFuLTYwMFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGSUxURVJTIFBBTkVMIChmb3Igbm9uLXBhZ2luYXRlZCB0YWJsZXMpIC0tPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWdyYXktMjAwIGJnLXdoaXRlIHAtNCBzaGFkb3ctbGdcIlxuICAgICAgKm5nSWY9XCJkYXRhLnBhZ2luYXRpb24gPT09IGZhbHNlICYmIGRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiXG4gICAgPlxuICAgICAgPCEtLSBGSUxURVJTIENPTlRFTlQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItNCBzcGFjZS15LTNcIiAqbmdJZj1cImZpbHRlcnNGb3JtLmNvbnRyb2xzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIFtmb3JtR3JvdXBdPVwiJGFueShmaWx0ZXJHcm91cClcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBmaWx0ZXJHcm91cCBvZiBmaWx0ZXJzRm9ybS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTMgcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHAtMlwiXG4gICAgICAgID5cbiAgICAgICAgICA8IS0tIEZJTFRFUiBUWVBFIFNFTEVDVE9SIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW4tdy1bMjAwcHhdIGZsZXgtMVwiICpuZ0lmPVwiZHJvcGRvd25JdGVtcy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlRpcG8gZGUgZmlsdHJvPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUgbyB0aXBvLi4uXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RGaWx0ZXJcIlxuICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3RGaWx0ZXJDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0QXZhaWxhYmxlRmlsdGVyT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaXRlbS5pY29uIHx8ICdmYSBmYS1maWx0ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtc20gdGV4dC1ibHVlLTUwMFwiXG4gICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGl0ZW0udGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFRFWFQgRklMVEVSIC0tPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibWluLXctWzIwMHB4XSBmbGV4LTFcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgJGFueShmaWx0ZXJHcm91cCkuZ2V0KCdzZWxlY3RGaWx0ZXInKT8udmFsdWU/LmFycmFuZ2UgPT09ICdmaWx0ZXInXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoIHRleHQtZ3JheS00MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3tcbiAgICAgICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldChcInNlbGVjdEZpbHRlclwiKT8udmFsdWU/LnRpdGxlIHx8XG4gICAgICAgICAgICAgICAgICAgIFwiRmlsdHJhclwiXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInR5cGVGaWx0ZXJcIlxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJEaWdpdGUgcGFyYSBmaWx0cmFyLi4uXCJcbiAgICAgICAgICAgICAgICAjaW5wdXRcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIERST1BET1dOIEZJTFRFUiAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm1pbi13LVsyMDBweF0gZmxleC0xXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlICYmXG4gICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApXG4gICAgICAgICAgICAgICAgLmdldCgnc2VsZWN0RmlsdGVyJylcbiAgICAgICAgICAgICAgICA/LnZhbHVlLmhhc093blByb3BlcnR5KCdpdGVtcycpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwidy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+e3tcbiAgICAgICAgICAgICAgICAkYW55KGZpbHRlckdyb3VwKS5nZXQoXCJzZWxlY3RGaWx0ZXJcIik/LnZhbHVlPy50aXRsZSB8fFxuICAgICAgICAgICAgICAgICAgXCJTZWxlY2lvbmVcIlxuICAgICAgICAgICAgICB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNpb25lLi4uXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3RJdGVtXCJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSBvZiAkYW55KGZpbHRlckdyb3VwKS5nZXQoJ3NlbGVjdEZpbHRlcicpPy52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgIC5pdGVtc1xuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBEQVRFIEZJTFRFUiAtLT5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm1pbi13LVszNDBweF0gZmxleC1hdXRvXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICRhbnkoZmlsdGVyR3JvdXApLmdldCgnc2VsZWN0RmlsdGVyJyk/LnZhbHVlPy5hcnJhbmdlID09PVxuICAgICAgICAgICAgICAnZmlsdGVyQnlEYXRlJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1zdHJldGNoIGdhcC0zIHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIHRleHQtZ3JheS00MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5EYXRhIEluaWNpYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uRGF0ZUlucHV0KCRldmVudCwgJ2luaXRpYWxEYXRlJywgaSlcIlxuICAgICAgICAgICAgICAgICAgKGJsdXIpPVwib25EYXRlRmlsdGVyQ2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW5pdGlhbERhdGVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJERC9NTS9BQUFBXCJcbiAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIHRleHQtZ3JheS00MDBcIj48L2k+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5EYXRhIEZpbmFsPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic2VhcmNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uRGF0ZUlucHV0KCRldmVudCwgJ2ZpbmFsRGF0ZScsIGkpXCJcbiAgICAgICAgICAgICAgICAgIChibHVyKT1cIm9uRGF0ZUZpbHRlckNoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaW5hbERhdGVcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJERC9NTS9BQUFBXCJcbiAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjEwXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFJFTU9WRSBGSUxURVIgQlVUVE9OIC0tPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJzRm9ybS5sZW5ndGggPiAxXCIgY2xhc3M9XCJtbC1hdXRvIGZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUZpbHRlcihpKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTEwIHctMTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCB0cmFuc2l0aW9uLWNvbG9ycyBkdXJhdGlvbi0zMDAgaG92ZXI6YmctcmVkLTEwMFwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJSZW1vdmVyIGZpbHRyb1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2ggdGV4dC1yZWQtNTAwIGhvdmVyOnRleHQtcmVkLTYwMFwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBBTkVMIEZPT1RFUjogQWRkIEZpbHRlciAmIEFjdGlvbnMgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiLW1iLTIgZmxleCBmbGV4LWNvbCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTQgYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwIHB0LTQgc206ZmxleC1yb3cgc206aXRlbXMtY2VudGVyXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBBZGQgRmlsdGVyIEJ1dHRvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImRyb3Bkb3duSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJhZGRGaWx0ZXIoKVwiXG4gICAgICAgICAgICBjbGFzcz1cInRyYW5zZm9ybSByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLWJsdWUtMzAwIGJnLWJsdWUtNTAgcHgtNiBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ibHVlLTYwMCB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0zMDAgaG92ZXI6LXRyYW5zbGF0ZS15LTAuNSBob3Zlcjpib3JkZXItYmx1ZS00MDAgaG92ZXI6YmctYmx1ZS0xMDAgaG92ZXI6c2hhZG93LW1kXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZGljaW9uYXIgbm92byBmaWx0cm9cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1cyBtci0yXCI+PC9pPlxuICAgICAgICAgICAgQWRpY2lvbmFyIEZpbHRyb1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTMgc2VsZi1zdGFydCBzbTpzZWxmLWF1dG9cIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoKClcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtbGcgYmctZ3JlZW4tNjAwIHB4LTUgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JlZW4tNzAwXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBcGxpY2FyIGZpbHRyb3NcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc2VhcmNoXCI+PC9pPlxuICAgICAgICAgICAgQXBsaWNhclxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKGNsaWNrKT1cInJlc2V0RmlsdGVyKClcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIGJnLXJlZC01MDAgcHgtNSBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1yZWQtNjAwXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJMaW1wYXIgZmlsdHJvc1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcmVkby1hbHRcIj48L2k+XG4gICAgICAgICAgICBSZXNldGFyXG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cImRhdGEuZG93bmxvYWQgIT09IGZhbHNlICYmIGRvd25sb2FkVGFibGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLWxnIGJnLW9yYW5nZS01MDAgcHgtNSBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1vcmFuZ2UtNjAwXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJFeHBvcnRhciBUYWJlbGFcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgJiYgdGhpcy5kYXRhU291cmNlLmZpbHRlcmVkRGF0YS5sZW5ndGggPD0gMFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVEb3dubG9hZCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRvd25sb2FkXCI+PC9pPlxuICAgICAgICAgICAgRXhwb3J0YXJcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibXgtYXV0byBmbGV4IGZsZXgtY29sXCJcbiAgICAgICAgKm5nSWY9XCJkYXRhLnRhYnMgJiYgZGF0YS50YWJzLnRhYnNEYXRhICYmIGRhdGEudGFicy50YWJzRGF0YS5sZW5ndGggPiAwXCJcbiAgICAgID5cbiAgICAgICAgPCEtLSBDYWxjdWxhciBxdWFudG9zIGdydXBvcyBkZSA2IHRhYnMgZXhpc3RlbSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cIlxuICAgICAgICAgICAgbGV0IGdyb3VwSW5kZXggb2YgZ2V0VGFiR3JvdXBzKGRhdGEudGFicy50YWJzRGF0YSk7XG4gICAgICAgICAgICBsZXQgaSA9IGluZGV4XG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC1hdXRvIGZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgbGV0IHRhYiBvZiBnZXRUYWJHcm91cChkYXRhLnRhYnMudGFic0RhdGEsIGdyb3VwSW5kZXgpO1xuICAgICAgICAgICAgICAgIGxldCBqID0gaW5kZXhcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyLTIgYm9yZGVyLWdyYXktMzAwIGJnLWdyYXktMjAwIHB4LTQgcHktMiBmb250LW1lZGl1bSB0cmFuc2l0aW9uIGhvdmVyOmJyaWdodG5lc3MtOTVcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgICAgICAgICAgICAgaXNUYWJTZWxlY3RlZChnZXRSZWFsVGFiSW5kZXgoaSwgaikpXG4gICAgICAgICAgICAgICAgICAgID8gJ2JvcmRlci1iLTAgYnJpZ2h0bmVzcy0xMTAnXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblRhYmxlU2VsZWN0ZWQoaSwgailcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgdGFiLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGFiLmNvdW50ZXIgIT09IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTIgdGV4dC14cyBmb250LWJvbGRcIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidGFiLmNvdW50ZXJDbGFzc1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgdGFiLmNvdW50ZXIgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OCB3LWZ1bGwgb3ZlcmZsb3cteC1hdXRvIHJvdW5kZWQteGwgdGFibGUtY29udGFpbmVyXCJcbiAgICAgID5cbiAgICAgICAgPHRhYmxlXG4gICAgICAgICAgbWF0LXRhYmxlXG4gICAgICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgICAgICAgbWF0U29ydFxuICAgICAgICAgICNzb3J0PVwibWF0U29ydFwiXG4gICAgICAgICAgbWF0U29ydEFjdGl2ZT1cImNyZWF0ZWRBdFwiXG4gICAgICAgICAgbWF0U29ydERpcmVjdGlvbj1cImRlc2NcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbCBvZiBkYXRhLmRpc3BsYXllZENvbHVtbnM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wZXJ0eVwiXG4gICAgICAgICAgICBtYXRDb2x1bW5EZWY9XCJ7eyBjb2wucHJvcGVydHkgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgIDwhLS0gSUYgVEhFIENPTFVNTiBJUyBOT1QgU09SVEFCTEUsIFRIRU4gRE9OJ1QgU0hPVyBUSEUgU09SVCBCVVRUT05TIC0tPlxuICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFjb2wuaXNTb3J0YWJsZSB8fCBkYXRhLnBhZ2luYXRpb24gPT09IHRydWVcIlxuICAgICAgICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgY29sLnRpdGxlIH19XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDwhLS0gSUYgVEhFIENPTFVNTiBJUyBTT1JUQUJMRSwgVEhFTiBTSE9XIFRIRSBTT1JUIEJVVFRPTlMgLS0+XG4gICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmlzU29ydGFibGUgJiYgZGF0YS5wYWdpbmF0aW9uID09PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgbWF0LWhlYWRlci1jZWxsXG4gICAgICAgICAgICAgICAgbWF0LXNvcnQtaGVhZGVyXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBjb2wudGl0bGUgfX1cbiAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjb2wubWV0aG9kID8gY29sLm1ldGhvZChyb3cpIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25DZWxsTW91c2VFbnRlcigkZXZlbnQsIHJvdywgY29sKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25DZWxsTW91c2VMZWF2ZSgpXCJcbiAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uQ2VsbE1vdXNlTW92ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwhLS0gQ0hFQ0sgSUYgVEhFIENPTFVNTiBNVVNUIEJFIERJU1BMQVlFRCAtLT5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFjb2wuaW1hZ2UgJiYgIWNvbC5pY29uQ2xhc3MgJiYgIWNvbC5tZXRob2RcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5jaGFyTGltaXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5wcm9wZXJ0eV0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93W2NvbC5wcm9wZXJ0eV0ubGVuZ3RoID4gY29sLmNoYXJMaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugd2l0aGluTGltaXRcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgPT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwicm93W2NvbC5wcm9wZXJ0eV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXREaXNwbGF5VmFsdWUoY29sLCByb3cpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbC5oYXNMaW5rICYmIGlzU3RyaW5nKGNvbC5oYXNMaW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJjb2wuaGFzTGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldERpc3BsYXlWYWx1ZShjb2wsIHJvdykgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgIT09IHRydWUgJiYgIWlzU3RyaW5nKGNvbC5oYXNMaW5rKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93KSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3dpdGhpbkxpbWl0PlxuICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sLmhhc0xpbmsgPT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cInJvd1tjb2wucHJvcGVydHldXCJcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93LCB0cnVlKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayAmJiBpc1N0cmluZyhjb2wuaGFzTGluaylcIlxuICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cImNvbC5oYXNMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RGlzcGxheVZhbHVlKGNvbCwgcm93LCB0cnVlKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2wuaGFzTGluayAhPT0gdHJ1ZSAmJiAhaXNTdHJpbmcoY29sLmhhc0xpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGdldERpc3BsYXlWYWx1ZShjb2wsIHJvdywgdHJ1ZSkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tIElNQUdFIC0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjb2wuaW1hZ2UgJiYgY29sLmltYWdlLnBhdGggJiYgIWNvbC5pY29uQ2xhc3MgJiYgIWNvbC5tZXRob2RcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cImNvbC5pbWFnZS5wYXRoICsgJy8nICsgcm93W2NvbC5wcm9wZXJ0eV1cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sLmltYWdlLmNsYXNzXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIkltYWdlbVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBjb2wuaW1hZ2UgJiYgY29sLmltYWdlLnVybCAmJiAhY29sLmljb25DbGFzcyAmJiAhY29sLm1ldGhvZFxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwicm93W2NvbC5wcm9wZXJ0eV1cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sLmltYWdlLmNsYXNzXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cIkltYWdlbVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLmljb25DbGFzc1wiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaWNvbkNsYXNzIG9mIGNvbC5pY29uQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzLmJ1dHRvbk1ldGhvZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBpY29uQ2xhc3MuYnV0dG9uTWV0aG9kKHJvdywgJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJpY29uQ2xhc3MuY2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3MuY29uZGl0aW9uID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChpY29uQ2xhc3MuY29uZGl0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGFueShpY29uQ2xhc3MuY29uZGl0aW9uKShyb3cpKVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPnt7IGljb25DbGFzcy50ZXh0IH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImNvbHVtblByb3BlcnRpZXNcIj48L3RyPlxuICAgICAgICAgIDx0clxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnZXhhbXBsZS1lbGVtZW50LXJvdyc6IGRhdGEuaXNOb3RDbGlja2FibGUgPT09IHRydWUsXG4gICAgICAgICAgICAgICdleGFtcGxlLWVsZW1lbnQtcm93IGN1cnNvci1wb2ludGVyJzogIWRhdGEuaXNOb3RDbGlja2FibGVcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgbWF0LXJvd1xuICAgICAgICAgICAgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGNvbHVtblByb3BlcnRpZXNcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9EZXRhaWxzKHJvdylcIlxuICAgICAgICAgID48L3RyPlxuXG4gICAgICAgICAgPCEtLSBST1cgU0hPV04gV0hFTiBUSEVSRSBJUyBOTyBNQVRDSElORyBEQVRBLiAtLT5cbiAgICAgICAgICA8dHIgY2xhc3M9XCJtYXQtcm93XCIgKm1hdE5vRGF0YVJvdz5cbiAgICAgICAgICAgIDx0ZCAqbmdJZj1cIiEoaXNMb2FkaW5nJCB8IGFzeW5jKVwiIGNsYXNzPVwibWF0LWNlbGwgcC00XCIgY29sc3Bhbj1cIjRcIj5cbiAgICAgICAgICAgICAgTmVuaHVtIHJlc3VsdGFkbyBlbmNvbnRyYWRvIHBhcmEgYSBidXNjYVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3RhYmxlPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyXCIgKm5nSWY9XCJpc0xvYWRpbmckIHwgYXN5bmNcIj5cbiAgICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhZ2luYXRvci1jb250YWluZXJcIj5cbiAgICAgICAgICA8bWF0LXBhZ2luYXRvclxuICAgICAgICAgICAgI3BhZ2luYXRvclxuICAgICAgICAgICAgW3BhZ2VTaXplT3B0aW9uc109XCJbMjUsIDUwLCAxMDBdXCJcbiAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXG4gICAgICAgICAgICBbbGVuZ3RoXT1cInRvdGFsSXRlbXNcIlxuICAgICAgICAgICAgc2hvd0ZpcnN0TGFzdEJ1dHRvbnNcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTZWxlY3QgcGFnZSBvZiBwZXJpb2RpYyBlbGVtZW50c1wiXG4gICAgICAgICAgICAocGFnZSk9XCJvblBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICdoaWRlLWxlbmd0aCc6XG4gICAgICAgICAgICAgICAgWydmaWx0ZXInLCAnZmlsdGVyQnlEYXRlJywgJ2VxdWFscyddLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QXJyYW5nZVxuICAgICAgICAgICAgICAgICkgfHwgdGhpcy5kYXRhLmZpbHRlckZuLFxuICAgICAgICAgICAgICAnaGlkZS1uZXh0LWJ1dHRvbic6ICFoYXNOZXh0UGFnZSAmJiBkYXRhLnBhZ2luYXRpb24gPT09IHRydWUsXG4gICAgICAgICAgICAgICdoaWRlLWxhc3QtYnV0dG9uJzpcbiAgICAgICAgICAgICAgICAoIWhhc05leHRQYWdlICYmIGRhdGEucGFnaW5hdGlvbiA9PT0gdHJ1ZSkgfHwgdGhpcy5kYXRhLmZpbHRlckZuXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICEoaXNMb2FkaW5nJCB8IGFzeW5jKSAmJlxuICAgICAgICAgICAgICBkYXRhU291cmNlPy5kYXRhICYmXG4gICAgICAgICAgICAgIGRhdGFTb3VyY2UuZGF0YS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIGRhdGE/LmZpbHRlckZuXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgY2xhc3M9XCJwYWdlLW51bWJlci1kaXNwbGF5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBjdXJyZW50UGFnZU51bWJlciB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFRPT0xUSVAgUEVSU09OQUxJWkFETyAtLT5cbiAgPGRpdlxuICAgICpuZ0lmPVwic2hvd1Rvb2x0aXBcIlxuICAgIGNsYXNzPVwiZml4ZWQgei01MCBtYXgtdy1tZCBicmVhay13b3JkcyByb3VuZGVkLWxnIGJnLWdyYXktODAwIHB4LTMgcHktMiB0ZXh0LXNtIHRleHQtd2hpdGUgc2hhZG93LWxnXCJcbiAgICBbc3R5bGUubGVmdC5weF09XCJ0b29sdGlwUG9zaXRpb24ueFwiXG4gICAgW3N0eWxlLnRvcC5weF09XCJ0b29sdGlwUG9zaXRpb24ueVwiXG4gICAgW3N0eWxlLnBvaW50ZXItZXZlbnRzXT1cIidub25lJ1wiXG4gID5cbiAgICB7eyB0b29sdGlwQ29udGVudCB9fVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19