lib-portal-angular 0.0.87 → 0.0.88

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/esm2022/lib/components/components.module.mjs +65 -40
  2. package/esm2022/lib/components/csv-importer/csv-importer.component.mjs +92 -0
  3. package/esm2022/lib/components/data-excel-exporter/IExcelExportConfig.mjs +2 -0
  4. package/esm2022/lib/components/data-excel-exporter/data-excel-exporter.component.mjs +126 -0
  5. package/esm2022/lib/components/data-excel-import/data-excel-importer.component.mjs +198 -0
  6. package/esm2022/lib/components/multi-select/multi-select.component.mjs +162 -114
  7. package/esm2022/lib/components/pdf-data-handler/argenta-pdf-data-handler.component.mjs +147 -0
  8. package/esm2022/lib/components/pdf-data-handler/function/formatToBrazilianNumber.mjs +7 -0
  9. package/esm2022/lib/components/pdf-data-handler/function/parseBrazilianNumber.mjs +9 -0
  10. package/esm2022/lib/components/pdf-data-handler/interface/DataRow.mjs +2 -0
  11. package/esm2022/lib/components/pdf-data-handler/interface/PdfExportConfig.mjs +2 -0
  12. package/esm2022/lib/components/pdf-data-handler/interface/PdfTableStyles.mjs +2 -0
  13. package/esm2022/lib/components/pdf-data-handler/interface/RowCalculation.mjs +2 -0
  14. package/esm2022/lib/components/pdf-data-handler/interface/TotalizerConfig.mjs +2 -0
  15. package/esm2022/lib/components/pdf-download/argenta-pdf-download.component.mjs +51 -0
  16. package/esm2022/public-api.mjs +36 -5
  17. package/fesm2022/lib-portal-angular.mjs +1093 -422
  18. package/fesm2022/lib-portal-angular.mjs.map +1 -1
  19. package/lib/components/components.module.d.ts +10 -5
  20. package/lib/components/csv-importer/csv-importer.component.d.ts +19 -0
  21. package/lib/components/data-excel-exporter/IExcelExportConfig.d.ts +21 -0
  22. package/lib/components/data-excel-exporter/data-excel-exporter.component.d.ts +9 -0
  23. package/lib/components/data-excel-import/data-excel-importer.component.d.ts +44 -0
  24. package/lib/components/multi-select/multi-select.component.d.ts +20 -9
  25. package/lib/components/pdf-data-handler/argenta-pdf-data-handler.component.d.ts +15 -0
  26. package/lib/components/pdf-data-handler/function/formatToBrazilianNumber.d.ts +1 -0
  27. package/lib/components/pdf-data-handler/function/parseBrazilianNumber.d.ts +1 -0
  28. package/lib/components/pdf-data-handler/interface/DataRow.d.ts +3 -0
  29. package/lib/components/pdf-data-handler/interface/PdfExportConfig.d.ts +12 -0
  30. package/lib/components/pdf-data-handler/interface/PdfTableStyles.d.ts +28 -0
  31. package/lib/components/pdf-data-handler/interface/RowCalculation.d.ts +4 -0
  32. package/lib/components/pdf-data-handler/interface/TotalizerConfig.d.ts +8 -0
  33. package/lib/components/pdf-download/argenta-pdf-download.component.d.ts +13 -0
  34. package/package.json +1 -1
  35. package/public-api.d.ts +34 -3
@@ -1,89 +1,129 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Output } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { of, Subject } from 'rxjs';
4
- import { catchError, debounceTime, map, startWith, switchMap } from 'rxjs/operators';
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, HostListener, Input, Output, ViewEncapsulation, } from "@angular/core";
2
+ import { NG_VALUE_ACCESSOR } from "@angular/forms";
3
+ import { of, Subject } from "rxjs";
4
+ import { catchError, debounceTime, distinctUntilChanged, map, switchMap, tap, } from "rxjs/operators";
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "../../service/auth-service.service";
7
7
  import * as i2 from "@angular/common/http";
8
8
  import * as i3 from "@angular/common";
9
- import * as i4 from "@angular/forms";
10
- import * as i5 from "@ng-select/ng-select";
9
+ import * as i4 from "lucide-angular";
11
10
  export class MultiSelectComponent {
12
- constructor(authService, http) {
11
+ onClickOutside(event) {
12
+ const target = event.target;
13
+ if (!target.closest(".custom-select-container")) {
14
+ this.closeDropdown();
15
+ }
16
+ }
17
+ constructor(authService, http, cdr) {
13
18
  this.authService = authService;
14
19
  this.http = http;
15
- this.label = 'Multi Select';
16
- this.data = []; // Accepts an array of generic objects
17
- this.placeholder = 'Select items';
18
- this.id = 'multiSelectId';
19
- this.bindLabel = ''; // Generic dynamic label
20
- this.bindValue = ''; // Generic dynamic value
21
- this.closeOnSelect = false; // New property to control dropdown close behavior
22
- this.searchUrl = ''; // URL for backend search
23
- this.multiple = true; // New property to control single or multiple selection
24
- this.searchParams = {}; // Parâmetros de busca dinâmicos
20
+ this.cdr = cdr;
21
+ this.label = "Multi Select";
22
+ this.data = [];
23
+ this.placeholder = "";
24
+ this.id = "multiSelectId";
25
+ this.bindLabel = "";
26
+ this.bindValue = "";
27
+ this.closeOnSelect = false;
28
+ this.searchUrl = "";
29
+ this.multiple = true;
30
+ this.searchParams = {};
25
31
  this.keyupEvent = new EventEmitter();
26
- this.backupData = []; // Backup of the initial data
27
- this.allItems = []; // Store the combined list
28
- this.items = of([]); // Initialization of the property
29
- this.filteredItems = of([]); // Filtered items
30
- this.searchTerms = new Subject(); // For search debounce
32
+ this.lastSearchTerm = "";
33
+ this.backupData = [];
34
+ this.allItems = [];
35
+ this.items = of([]);
36
+ this.filteredItems = of([]);
37
+ this.searchTerms = new Subject();
38
+ this.isOpen = false;
31
39
  this.onChangeCallback = () => { };
32
40
  this.onTouchedCallback = () => { };
33
41
  this.isCourseEntered = false;
34
42
  this.compareFn = (item1, item2) => {
35
- return item1 && item2 ? item1[this.bindValue] === item2[this.bindValue] : item1 === item2;
43
+ return item1 && item2
44
+ ? item1[this.bindValue] === item2[this.bindValue]
45
+ : item1 === item2;
36
46
  };
37
47
  }
38
48
  ngOnInit() {
39
- this.backupData = [...this.data]; // Backup initial data
40
- this.allItems = [...this.data]; // Initialize allItems with the initial data
41
- this.items = of(this.allItems);
42
- this.fetchInitialData().subscribe(data => {
49
+ this.filteredItems = this.searchTerms.pipe(debounceTime(700), // Reduz chamadas repetitivas
50
+ distinctUntilChanged(), // Ignora termos repetidos consecutivos
51
+ switchMap((term) => {
52
+ // Sempre busca no back-end
53
+ return this.search(term).pipe(tap((fetchedItems) => {
54
+ this.updateData(fetchedItems);
55
+ }), map((fetchedItems) => this.filterOutSelected(fetchedItems)));
56
+ }));
57
+ this.filteredItems.subscribe({
58
+ next: (items) => { },
59
+ error: (err) => console.error("Erro ao buscar no back-end:", err),
60
+ });
61
+ this.fetchInitialData().subscribe((data) => {
43
62
  this.updateData(data);
44
- this.filteredItems = this.searchTerms.pipe(debounceTime(700), startWith(''), // Start with an empty search to load the original list
45
- switchMap(term => this.search(term)));
46
- // Adicionar itens selecionados à lista após buscar dados iniciais
47
- this.addSelectedItemsToData();
48
63
  });
49
64
  }
50
- ngOnChanges(changes) {
51
- if (changes['selected'] && !changes['selected'].isFirstChange()) {
52
- this.addSelectedItemsToData();
65
+ onInputChange(event) {
66
+ const input = event.target.value.trim();
67
+ this.searchTerms.next(input);
68
+ if (input === "") {
69
+ this.fetchInitialData().subscribe((data) => {
70
+ this.allItems = data;
71
+ this.filteredItems = of(this.filterOutSelected(this.allItems));
72
+ });
53
73
  }
54
74
  }
75
+ search(term) {
76
+ return this.http.get(`${this.searchUrl}`, { params: { term } }).pipe(map((response) => {
77
+ const transformedItems = response.map((item) => ({
78
+ [this.bindValue]: item[this.bindValue],
79
+ [this.bindLabel]: item[this.bindLabel],
80
+ }));
81
+ this.allItems = transformedItems;
82
+ this.filteredItems = of(this.filterOutSelected(this.allItems));
83
+ this.cdr.markForCheck(); // Notifica o Angular sobre a alteração
84
+ return transformedItems;
85
+ }), catchError((error) => {
86
+ console.error("Erro ao buscar no back-end:", error);
87
+ this.filteredItems = of([]);
88
+ return of([]);
89
+ }));
90
+ }
55
91
  fetchInitialData() {
56
92
  return this.http.get(this.searchUrl).pipe(map((response) => {
57
- if (response && response.length > 0) {
58
- return response.map((item) => ({
59
- [this.bindValue]: item[this.bindValue],
60
- [this.bindLabel]: item[this.bindLabel]
61
- }));
62
- }
63
- return [];
93
+ const transformedItems = response.map((item) => ({
94
+ [this.bindValue]: item[this.bindValue],
95
+ [this.bindLabel]: item[this.bindLabel],
96
+ }));
97
+ this.allItems = transformedItems;
98
+ return this.allItems;
64
99
  }), catchError((error) => {
65
- console.error('Error fetching initial data from backend:', error);
100
+ console.error("Erro ao carregar dados iniciais:", error);
66
101
  return of([]);
67
102
  }));
68
103
  }
104
+ ngOnChanges(changes) {
105
+ if (changes["selected"] && !changes["selected"].isFirstChange()) {
106
+ this.addSelectedItemsToData();
107
+ }
108
+ }
69
109
  updateData(newData) {
70
110
  newData.forEach((item) => {
71
- const existsInList = this.allItems.some(listItem => this.compareFn(listItem, item));
111
+ const existsInList = this.allItems.some((listItem) => this.compareFn(listItem, item));
72
112
  if (!existsInList) {
73
113
  this.allItems.push(item);
74
114
  }
75
115
  });
76
- this.items = of(this.allItems);
116
+ this.filteredItems = of(this.allItems);
77
117
  }
78
118
  addSelectedItemsToData() {
79
119
  if (this.selected) {
80
120
  const selectedItems = this.multiple ? this.selected : [this.selected];
81
121
  selectedItems.forEach((item) => {
82
- const existsInList = this.allItems.some(listItem => this.compareFn(listItem, item));
122
+ const existsInList = this.allItems.some((listItem) => this.compareFn(listItem, item));
83
123
  if (!existsInList) {
84
124
  const newItem = {
85
125
  [this.bindValue]: item[this.bindValue] || item,
86
- [this.bindLabel]: item[this.bindLabel] || item
126
+ [this.bindLabel]: item[this.bindLabel] || item,
87
127
  };
88
128
  this.data.push(newItem);
89
129
  this.allItems.push(newItem);
@@ -110,60 +150,15 @@ export class MultiSelectComponent {
110
150
  this.selected = event ? event : null;
111
151
  }
112
152
  this.onChangeCallback(this.selected);
113
- // Verificar se um item foi removido
114
- if (previousSelected && Array.isArray(previousSelected) && previousSelected.length > event.length) {
115
- const removedItems = previousSelected.filter(item => !event.includes(item));
116
- removedItems.forEach(item => {
117
- const existsInData = this.data.some(dataItem => this.compareFn(dataItem, item));
118
- if (!existsInData) {
119
- this.data.push(item);
120
- this.allItems.push(item); // Adicionar de volta aos itens disponíveis
153
+ if (previousSelected && Array.isArray(previousSelected)) {
154
+ const removedItems = previousSelected.filter((item) => !event.includes(item));
155
+ removedItems.forEach((item) => {
156
+ const existsInAllItems = this.allItems.some((listItem) => this.compareFn(listItem, item));
157
+ if (!existsInAllItems) {
158
+ this.allItems.push(item);
121
159
  }
122
160
  });
123
- }
124
- }
125
- onInputChange(event) {
126
- const input = event.target.value;
127
- this.searchTerms.next(input);
128
- }
129
- search(term) {
130
- if (!term.trim()) {
131
- // Se o termo de busca estiver vazio, retorna a lista completa
132
- return of(this.allItems);
133
- }
134
- // Filtra os itens localmente
135
- const filtered = this.allItems.filter((item) => item[this.bindLabel].toLowerCase().includes(term.toLowerCase()));
136
- if (filtered.length > 0) {
137
- console.log('Items filtered locally.');
138
- return of(filtered);
139
- }
140
- else if (this.searchUrl) {
141
- // Construir os parâmetros de busca dinamicamente
142
- const params = new URLSearchParams(this.searchParams);
143
- params.append('term', term);
144
- return this.http.get(`${this.searchUrl}?${params.toString()}`).pipe(map((response) => {
145
- if (response && response.length > 0) {
146
- // Transforma os itens do backend para o formato esperado pelo componente
147
- const transformedItems = response.map((item) => ({
148
- [this.bindValue]: item[this.bindValue],
149
- [this.bindLabel]: item[this.bindLabel]
150
- }));
151
- // Atualiza os dados com os novos itens buscados
152
- this.updateData(transformedItems);
153
- return this.allItems;
154
- }
155
- else {
156
- console.log('No items found in the backend search.');
157
- return this.allItems;
158
- }
159
- }), catchError((error) => {
160
- console.error('Error fetching from backend:', error);
161
- return of(this.allItems);
162
- }));
163
- }
164
- else {
165
- console.log('No search URL provided and no items found locally.');
166
- return of(this.allItems);
161
+ this.items = of(this.allItems);
167
162
  }
168
163
  }
169
164
  writeValue(value) {
@@ -181,9 +176,7 @@ export class MultiSelectComponent {
181
176
  registerOnTouched(fn) {
182
177
  this.onTouchedCallback = fn;
183
178
  }
184
- setDisabledState(isDisabled) {
185
- // No implementation needed for this example
186
- }
179
+ setDisabledState(isDisabled) { }
187
180
  hasPermission() {
188
181
  if (!this.permissions || this.permissions.length === 0) {
189
182
  return true;
@@ -193,33 +186,88 @@ export class MultiSelectComponent {
193
186
  }
194
187
  catch (error) {
195
188
  if (error instanceof Error) {
196
- console.error('Permission error:', error.message);
189
+ console.error("Permission error:", error.message);
197
190
  }
198
191
  else {
199
- console.error('Unknown error occurred during permission check');
192
+ console.error("Unknown error occurred during permission check");
200
193
  }
201
194
  return true;
202
195
  }
203
196
  }
204
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i1.AuthService }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
205
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultiSelectComponent, selector: "argenta-custom-multi-select", inputs: { label: "label", data: "data", placeholder: "placeholder", selected: "selected", id: "id", bindLabel: "bindLabel", bindValue: "bindValue", permissions: "permissions", closeOnSelect: "closeOnSelect", searchUrl: "searchUrl", multiple: "multiple", searchParams: "searchParams" }, outputs: { keyupEvent: "keyupEvent" }, providers: [
197
+ toggleDropdown() {
198
+ this.isOpen = !this.isOpen;
199
+ }
200
+ closeDropdown() {
201
+ this.isOpen = false;
202
+ }
203
+ isSelected(item) {
204
+ if (this.multiple) {
205
+ return this.selected?.some((selectedItem) => this.compareFn(selectedItem, item));
206
+ }
207
+ else {
208
+ return this.compareFn(this.selected, item);
209
+ }
210
+ }
211
+ selectItem(item, event) {
212
+ event.stopPropagation();
213
+ if (!this.isSelected(item)) {
214
+ if (this.multiple) {
215
+ this.selected.push(item);
216
+ }
217
+ else {
218
+ this.selected = [item];
219
+ }
220
+ }
221
+ if (this.multiple) {
222
+ this.allItems = this.allItems.filter((listItem) => !this.compareFn(listItem, item));
223
+ }
224
+ this.filteredItems = of(this.filterOutSelected(this.allItems));
225
+ this.onSelectedChange(this.selected);
226
+ if (this.closeOnSelect) {
227
+ this.closeDropdown();
228
+ }
229
+ }
230
+ filterByTerm(term) {
231
+ return this.allItems.filter((item) => item[this.bindLabel]?.toLowerCase().includes(term.toLowerCase()));
232
+ }
233
+ filterOutSelected(items) {
234
+ if (!this.multiple) {
235
+ return items;
236
+ }
237
+ return items.filter((item) => !this.selected.some((selectedItem) => this.compareFn(selectedItem, item)));
238
+ }
239
+ removeSelectedItem(item, event) {
240
+ event.stopPropagation();
241
+ this.selected = this.selected.filter((selectedItem) => !this.compareFn(selectedItem, item));
242
+ const existsInAllItems = this.allItems.some((listItem) => this.compareFn(listItem, item));
243
+ if (!existsInAllItems) {
244
+ this.allItems.push(item);
245
+ }
246
+ this.filteredItems = of(this.filterByTerm(this.lastSearchTerm || ""));
247
+ this.onSelectedChange(this.selected);
248
+ }
249
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, deps: [{ token: i1.AuthService }, { token: i2.HttpClient }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
250
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MultiSelectComponent, selector: "argenta-custom-multi-select", inputs: { label: "label", data: "data", placeholder: "placeholder", selected: "selected", id: "id", bindLabel: "bindLabel", bindValue: "bindValue", permissions: "permissions", closeOnSelect: "closeOnSelect", searchUrl: "searchUrl", multiple: "multiple", searchParams: "searchParams" }, outputs: { keyupEvent: "keyupEvent" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, providers: [
206
251
  {
207
252
  provide: NG_VALUE_ACCESSOR,
208
253
  useExisting: forwardRef(() => MultiSelectComponent),
209
- multi: true
210
- }
211
- ], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"hasPermission()\" class=\"form-group\">\n <label [for]=\"id\" class=\"form-label\" style=\"margin-top: 1rem;\">{{ label }}</label>\n <ng-select\n [class.course-entry]=\"isCourseEntered\"\n class=\"ng-select custom-ng-select\"\n [items]=\"filteredItems | async\"\n [multiple]=\"multiple\"\n [closeOnSelect]=\"closeOnSelect\"\n [hideSelected]=\"true\"\n [bindLabel]=\"bindLabel\"\n [bindValue]=\"bindValue\"\n [(ngModel)]=\"selected\"\n [compareWith]=\"compareFn\"\n (change)=\"onSelectedChange($event)\"\n (keyup)=\"onKeyUp($event)\"\n (input)=\"onInputChange($event)\"\n [id]=\"id\"\n [placeholder]=\"selected && (multiple ? selected.length === 0 : !selected) ? placeholder : ''\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\">\n <ng-template ng-option-tmp let-item=\"item\">\n {{ item[bindLabel] }}\n </ng-template>\n </ng-select>\n</div>\n", styles: ["@charset \"UTF-8\";.form-group{font-family:var(--font-family);font-size:1rem}.form-check-input{font-family:var(--font-family);color:#333;font-size:.9rem}.form-check-label{width:623px;height:19px;top:1608px;left:133px;gap:0px;opacity:0px;font-family:var(--font-family);font-size:16px;line-height:19.36px;text-align:left}.custom-select{font-family:var(--font-family);color:#333;font-size:.9rem;font-weight:400;border:1px solid #ccc;border-radius:4px;appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:2rem;background-image:none;background-repeat:no-repeat;background-position:right .5rem center;height:46px}.custom-input{font-family:var(--font-family);color:#333;font-size:.9rem;height:46px}.custom-input::placeholder{font-size:14px;color:#d3d3d3}.form-label{font-family:var(--font-family);color:#333;font-size:1rem}.label-styles{font-weight:400;font-family:var(--font-family);font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.2rem}.select-container{position:relative;display:inline-block;width:100%}.select-container lucide-icon{position:absolute;right:.75rem;top:50%;transform:translateY(-50%);pointer-events:none;color:#5e6366}.ng-select{display:block;width:100%;font-family:var(--font-family);color:#333;font-size:1rem}.ng-select .ng-select-container{display:flex;align-items:center;border:1px solid #ccc;border-radius:4px;padding:.5rem;background-color:#fff;color:#333}.ng-select .ng-select-container .ng-value-container{display:flex;align-items:center;flex-grow:1}.ng-select .ng-select-container .ng-clear{display:none}.ng-select .ng-select-container .ng-input{flex-grow:1;border:none;outline:none}.custom-ng-select.ng-select .ng-select-container .ng-input>input{box-sizing:border-box;background:none transparent;border:0 none;box-shadow:none;outline:none;padding:.5rem!important;cursor:default;width:100%}.ng-select .ng-dropdown-panel{border:1px solid #ccc;border-radius:4px;background-color:#fff;color:#333;box-shadow:0 2px 4px #0000001a}.ng-select .ng-dropdown-panel .ng-option{padding:8px;cursor:pointer}.ng-select .ng-dropdown-panel .ng-option:hover{background-color:#f1f1f1}.ng-select .ng-dropdown-panel .ng-option.selected{background-color:#007bff;color:#fff}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i5.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
254
+ multi: true,
255
+ },
256
+ ], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"hasPermission()\" class=\"form-group\">\n <label [for]=\"id\" class=\"form-label\" style=\"margin-top: 1rem\">\n {{ label }}\n </label>\n <div class=\"custom-select-container\" tabindex=\"0\">\n <!-- Input com itens selecionados -->\n <div class=\"custom-input\">\n <span class=\"selected-item\" *ngFor=\"let item of selected\">\n {{ item[bindLabel] }}\n <button\n class=\"remove-item-btn\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n \u00D7\n </button>\n </span>\n <input\n type=\"text\"\n class=\"input-field\"\n [id]=\"id\"\n [placeholder]=\"placeholder\"\n (focus)=\"toggleDropdown()\"\n (keyup)=\"onKeyUp($event)\"\n (input)=\"onInputChange($event)\"\n />\n <!-- \u00CDcone flutuante -->\n <lucide-icon\n [name]=\"isOpen ? 'align-justify' : 'chevron-down'\"\n class=\"dropdown-icon\"\n ></lucide-icon>\n </div>\n\n <!-- Dropdown suspenso -->\n <div *ngIf=\"isOpen\" class=\"dropdown\">\n <div\n *ngFor=\"let item of filteredItems | async\"\n class=\"dropdown-item\"\n [class.selected]=\"isSelected(item)\"\n (click)=\"selectItem(item, $event)\"\n >\n {{ item[bindLabel] }}\n </div>\n <div *ngIf=\"(filteredItems | async)?.length === 0\" class=\"empty-dropdown\">\n Nenhum item dispon\u00EDvel\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.custom-select-container{position:relative;display:flex;flex-direction:column;border:1px solid #ccc;border-radius:4px;padding:.5rem;background-color:#fff;color:#333;font-family:var(--font-family)}.custom-select-container .custom-input{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;width:100%;min-height:20px;cursor:text;background:none;border:none;outline:none;position:relative}.custom-select-container .custom-input .selected-item{display:flex;align-items:center;background-color:#f8f8f8;color:#333;border:1px solid #e0e0e0;border-radius:4px;padding:.15rem .4rem;font-size:.85rem}.custom-select-container .custom-input .selected-item .remove-item-btn{display:flex;align-items:center;justify-content:center;background-color:#c7c7c7;border:none;color:#4b4b4b;font-weight:700;cursor:pointer;font-size:.6rem;line-height:1;border-radius:50%;width:14px;height:14px;margin-left:.3rem;padding:0;position:relative}.custom-select-container .custom-input .selected-item .remove-item-btn span{transition:transform .2s ease,color .2s ease}.custom-select-container .custom-input .selected-item .remove-item-btn:hover{background-color:#8f8a8b;color:#fff}.custom-select-container .custom-input .selected-item .remove-item-btn:hover span{transform:scale(1.2);color:#fff}.custom-select-container .custom-input .selected-item .remove-item-btn:active{background-color:#767072}.custom-select-container .custom-input .input-field{flex:1;border:none;outline:none;font-size:.85rem;padding:.1rem 3rem .1rem .2rem;background:transparent;min-width:80px}.custom-select-container .custom-input .dropdown-icon{position:absolute;right:.1rem;top:50%;transform:translateY(-50%);font-size:1.2rem;color:#888;pointer-events:none}.dropdown{position:absolute;top:100%;left:0;right:0;max-height:200px;overflow-y:auto;background-color:#fff;border:1px solid #ccc;border-radius:4px;z-index:1000}.dropdown::-webkit-scrollbar{width:8px}.dropdown::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:4px}.dropdown::-webkit-scrollbar-thumb:hover{background-color:#aaa}.dropdown::-webkit-scrollbar-track{background-color:#f1f1f1;border-radius:4px}.dropdown .dropdown-item{padding:.5rem;cursor:pointer}.dropdown .dropdown-item:hover{background-color:#f1f1f1}.dropdown .dropdown-item.selected{font-weight:700;background-color:#e9e9e9}.empty-dropdown{padding:1rem;text-align:center;color:#999;font-size:.9rem}@media (max-width: 768px){.custom-input .input-field{padding-right:4rem}.custom-input .dropdown-icon{right:.75rem}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
212
257
  }
213
258
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MultiSelectComponent, decorators: [{
214
259
  type: Component,
215
- args: [{ selector: 'argenta-custom-multi-select', providers: [
260
+ args: [{ selector: "argenta-custom-multi-select", encapsulation: ViewEncapsulation.None, providers: [
216
261
  {
217
262
  provide: NG_VALUE_ACCESSOR,
218
263
  useExisting: forwardRef(() => MultiSelectComponent),
219
- multi: true
220
- }
221
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"hasPermission()\" class=\"form-group\">\n <label [for]=\"id\" class=\"form-label\" style=\"margin-top: 1rem;\">{{ label }}</label>\n <ng-select\n [class.course-entry]=\"isCourseEntered\"\n class=\"ng-select custom-ng-select\"\n [items]=\"filteredItems | async\"\n [multiple]=\"multiple\"\n [closeOnSelect]=\"closeOnSelect\"\n [hideSelected]=\"true\"\n [bindLabel]=\"bindLabel\"\n [bindValue]=\"bindValue\"\n [(ngModel)]=\"selected\"\n [compareWith]=\"compareFn\"\n (change)=\"onSelectedChange($event)\"\n (keyup)=\"onKeyUp($event)\"\n (input)=\"onInputChange($event)\"\n [id]=\"id\"\n [placeholder]=\"selected && (multiple ? selected.length === 0 : !selected) ? placeholder : ''\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\">\n <ng-template ng-option-tmp let-item=\"item\">\n {{ item[bindLabel] }}\n </ng-template>\n </ng-select>\n</div>\n", styles: ["@charset \"UTF-8\";.form-group{font-family:var(--font-family);font-size:1rem}.form-check-input{font-family:var(--font-family);color:#333;font-size:.9rem}.form-check-label{width:623px;height:19px;top:1608px;left:133px;gap:0px;opacity:0px;font-family:var(--font-family);font-size:16px;line-height:19.36px;text-align:left}.custom-select{font-family:var(--font-family);color:#333;font-size:.9rem;font-weight:400;border:1px solid #ccc;border-radius:4px;appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:2rem;background-image:none;background-repeat:no-repeat;background-position:right .5rem center;height:46px}.custom-input{font-family:var(--font-family);color:#333;font-size:.9rem;height:46px}.custom-input::placeholder{font-size:14px;color:#d3d3d3}.form-label{font-family:var(--font-family);color:#333;font-size:1rem}.label-styles{font-weight:400;font-family:var(--font-family);font-size:16px;line-height:19.36px;text-align:left;margin-top:1rem;margin-bottom:.2rem}.select-container{position:relative;display:inline-block;width:100%}.select-container lucide-icon{position:absolute;right:.75rem;top:50%;transform:translateY(-50%);pointer-events:none;color:#5e6366}.ng-select{display:block;width:100%;font-family:var(--font-family);color:#333;font-size:1rem}.ng-select .ng-select-container{display:flex;align-items:center;border:1px solid #ccc;border-radius:4px;padding:.5rem;background-color:#fff;color:#333}.ng-select .ng-select-container .ng-value-container{display:flex;align-items:center;flex-grow:1}.ng-select .ng-select-container .ng-clear{display:none}.ng-select .ng-select-container .ng-input{flex-grow:1;border:none;outline:none}.custom-ng-select.ng-select .ng-select-container .ng-input>input{box-sizing:border-box;background:none transparent;border:0 none;box-shadow:none;outline:none;padding:.5rem!important;cursor:default;width:100%}.ng-select .ng-dropdown-panel{border:1px solid #ccc;border-radius:4px;background-color:#fff;color:#333;box-shadow:0 2px 4px #0000001a}.ng-select .ng-dropdown-panel .ng-option{padding:8px;cursor:pointer}.ng-select .ng-dropdown-panel .ng-option:hover{background-color:#f1f1f1}.ng-select .ng-dropdown-panel .ng-option.selected{background-color:#007bff;color:#fff}\n"] }]
222
- }], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.HttpClient }]; }, propDecorators: { label: [{
264
+ multi: true,
265
+ },
266
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"hasPermission()\" class=\"form-group\">\n <label [for]=\"id\" class=\"form-label\" style=\"margin-top: 1rem\">\n {{ label }}\n </label>\n <div class=\"custom-select-container\" tabindex=\"0\">\n <!-- Input com itens selecionados -->\n <div class=\"custom-input\">\n <span class=\"selected-item\" *ngFor=\"let item of selected\">\n {{ item[bindLabel] }}\n <button\n class=\"remove-item-btn\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n \u00D7\n </button>\n </span>\n <input\n type=\"text\"\n class=\"input-field\"\n [id]=\"id\"\n [placeholder]=\"placeholder\"\n (focus)=\"toggleDropdown()\"\n (keyup)=\"onKeyUp($event)\"\n (input)=\"onInputChange($event)\"\n />\n <!-- \u00CDcone flutuante -->\n <lucide-icon\n [name]=\"isOpen ? 'align-justify' : 'chevron-down'\"\n class=\"dropdown-icon\"\n ></lucide-icon>\n </div>\n\n <!-- Dropdown suspenso -->\n <div *ngIf=\"isOpen\" class=\"dropdown\">\n <div\n *ngFor=\"let item of filteredItems | async\"\n class=\"dropdown-item\"\n [class.selected]=\"isSelected(item)\"\n (click)=\"selectItem(item, $event)\"\n >\n {{ item[bindLabel] }}\n </div>\n <div *ngIf=\"(filteredItems | async)?.length === 0\" class=\"empty-dropdown\">\n Nenhum item dispon\u00EDvel\n </div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.custom-select-container{position:relative;display:flex;flex-direction:column;border:1px solid #ccc;border-radius:4px;padding:.5rem;background-color:#fff;color:#333;font-family:var(--font-family)}.custom-select-container .custom-input{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;width:100%;min-height:20px;cursor:text;background:none;border:none;outline:none;position:relative}.custom-select-container .custom-input .selected-item{display:flex;align-items:center;background-color:#f8f8f8;color:#333;border:1px solid #e0e0e0;border-radius:4px;padding:.15rem .4rem;font-size:.85rem}.custom-select-container .custom-input .selected-item .remove-item-btn{display:flex;align-items:center;justify-content:center;background-color:#c7c7c7;border:none;color:#4b4b4b;font-weight:700;cursor:pointer;font-size:.6rem;line-height:1;border-radius:50%;width:14px;height:14px;margin-left:.3rem;padding:0;position:relative}.custom-select-container .custom-input .selected-item .remove-item-btn span{transition:transform .2s ease,color .2s ease}.custom-select-container .custom-input .selected-item .remove-item-btn:hover{background-color:#8f8a8b;color:#fff}.custom-select-container .custom-input .selected-item .remove-item-btn:hover span{transform:scale(1.2);color:#fff}.custom-select-container .custom-input .selected-item .remove-item-btn:active{background-color:#767072}.custom-select-container .custom-input .input-field{flex:1;border:none;outline:none;font-size:.85rem;padding:.1rem 3rem .1rem .2rem;background:transparent;min-width:80px}.custom-select-container .custom-input .dropdown-icon{position:absolute;right:.1rem;top:50%;transform:translateY(-50%);font-size:1.2rem;color:#888;pointer-events:none}.dropdown{position:absolute;top:100%;left:0;right:0;max-height:200px;overflow-y:auto;background-color:#fff;border:1px solid #ccc;border-radius:4px;z-index:1000}.dropdown::-webkit-scrollbar{width:8px}.dropdown::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:4px}.dropdown::-webkit-scrollbar-thumb:hover{background-color:#aaa}.dropdown::-webkit-scrollbar-track{background-color:#f1f1f1;border-radius:4px}.dropdown .dropdown-item{padding:.5rem;cursor:pointer}.dropdown .dropdown-item:hover{background-color:#f1f1f1}.dropdown .dropdown-item.selected{font-weight:700;background-color:#e9e9e9}.empty-dropdown{padding:1rem;text-align:center;color:#999;font-size:.9rem}@media (max-width: 768px){.custom-input .input-field{padding-right:4rem}.custom-input .dropdown-icon{right:.75rem}}\n"] }]
267
+ }], ctorParameters: function () { return [{ type: i1.AuthService }, { type: i2.HttpClient }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { onClickOutside: [{
268
+ type: HostListener,
269
+ args: ["document:click", ["$event"]]
270
+ }], label: [{
223
271
  type: Input
224
272
  }], data: [{
225
273
  type: Input
@@ -246,4 +294,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
246
294
  }], keyupEvent: [{
247
295
  type: Output
248
296
  }] } });
249
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1wb3J0YWwtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWItcG9ydGFsLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL211bHRpLXNlbGVjdC9tdWx0aS1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM5SSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQWdCckYsTUFBTSxPQUFPLG9CQUFvQjtJQXNCL0IsWUFBb0IsV0FBd0IsRUFBVSxJQUFnQjtRQUFsRCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLFNBQUksR0FBSixJQUFJLENBQVk7UUFyQjdELFVBQUssR0FBVyxjQUFjLENBQUM7UUFDL0IsU0FBSSxHQUFVLEVBQUUsQ0FBQyxDQUFDLHNDQUFzQztRQUN4RCxnQkFBVyxHQUFXLGNBQWMsQ0FBQztRQUVyQyxPQUFFLEdBQVcsZUFBZSxDQUFDO1FBQzdCLGNBQVMsR0FBVyxFQUFFLENBQUMsQ0FBQyx3QkFBd0I7UUFDaEQsY0FBUyxHQUFXLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtRQUVoRCxrQkFBYSxHQUFZLEtBQUssQ0FBQyxDQUFDLGtEQUFrRDtRQUNsRixjQUFTLEdBQVcsRUFBRSxDQUFDLENBQUMseUJBQXlCO1FBQ2pELGFBQVEsR0FBWSxJQUFJLENBQUMsQ0FBQyx1REFBdUQ7UUFDakYsaUJBQVksR0FBOEIsRUFBRSxDQUFDLENBQUMsZ0NBQWdDO1FBRTdFLGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUUxRCxlQUFVLEdBQVUsRUFBRSxDQUFDLENBQUMsNkJBQTZCO1FBQ3JELGFBQVEsR0FBVSxFQUFFLENBQUMsQ0FBQywwQkFBMEI7UUFDeEQsVUFBSyxHQUFzQixFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7UUFDcEUsa0JBQWEsR0FBc0IsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO1FBQ3BELGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQyxDQUFDLHNCQUFzQjtRQTJFM0QscUJBQWdCLEdBQXFCLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxzQkFBaUIsR0FBZSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFbEQsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFpSHhCLGNBQVMsR0FBRyxDQUFDLEtBQVUsRUFBRSxLQUFVLEVBQVcsRUFBRTtZQUM5QyxPQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQztRQUM1RixDQUFDLENBQUM7SUEvTHdFLENBQUM7SUFFM0UsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtRQUN4RCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyw0Q0FBNEM7UUFDNUUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ3hDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLHVEQUF1RDtZQUN0RSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3JDLENBQUM7WUFFRixrRUFBa0U7WUFDbEUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQy9ELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQzVDLEdBQUcsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ3BCLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNuQyxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ2xDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUN0QyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztpQkFDdkMsQ0FBQyxDQUFDLENBQUM7YUFDTDtZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDeEIsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLFVBQVUsQ0FBQyxPQUFjO1FBQy9CLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM1QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDcEYsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0RSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7Z0JBQ2xDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDcEYsSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDakIsTUFBTSxPQUFPLEdBQUc7d0JBQ2QsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJO3dCQUM5QyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUk7cUJBQy9DLENBQUM7b0JBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUM3QjtZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hDO0lBQ0gsQ0FBQztJQU9ELE9BQU87UUFDTCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBb0I7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQVU7UUFDekIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRXZDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN2QjthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ3RDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVyQyxvQ0FBb0M7UUFDcEMsSUFBSSxnQkFBZ0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDakcsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNoRixJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7aUJBQ3RFO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsS0FBVTtRQUN0QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVk7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoQiw4REFBOEQ7WUFDOUQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzFCO1FBRUQsNkJBQTZCO1FBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQ2hFLENBQUM7UUFFRixJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUN2QyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNyQjthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUN6QixpREFBaUQ7WUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTVCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN4RSxHQUFHLENBQUMsQ0FBQyxRQUFlLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ25DLHlFQUF5RTtvQkFDekUsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNwRCxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDdEMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7cUJBQ3ZDLENBQUMsQ0FBQyxDQUFDO29CQUVKLGdEQUFnRDtvQkFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUVsQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7aUJBQ3RCO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLENBQUMsQ0FBQztvQkFDckQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO2lCQUN0QjtZQUNILENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNyRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztTQUNIO2FBQU07WUFDTCxPQUFPLENBQUMsR0FBRyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7WUFDbEUsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7U0FDN0I7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQztTQUMvQjtRQUVELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQU87UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0JBQWdCLENBQUUsVUFBbUI7UUFDbkMsNENBQTRDO0lBQzlDLENBQUM7SUFNRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3RELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxJQUFJO1lBQ0YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDekQ7UUFBQyxPQUFPLEtBQWMsRUFBRTtZQUN2QixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7Z0JBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ25EO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQzthQUNqRTtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDOytHQXRPVSxvQkFBb0I7bUdBQXBCLG9CQUFvQiwyWEFUcEI7WUFDVDtnQkFDRSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2dCQUNuRCxLQUFLLEVBQUUsSUFBSTthQUNaO1NBQ0YsK0NDakJILHk1QkF5QkE7OzRGRExhLG9CQUFvQjtrQkFiaEMsU0FBUzsrQkFDRSw2QkFBNkIsYUFHNUI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUM7NEJBQ25ELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNOzJIQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIG1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvYXV0aC1zZXJ2aWNlLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcmdlbnRhLWN1c3RvbS1tdWx0aS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbXVsdGktc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlTZWxlY3RDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE11bHRpU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICdNdWx0aSBTZWxlY3QnO1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdOyAvLyBBY2NlcHRzIGFuIGFycmF5IG9mIGdlbmVyaWMgb2JqZWN0c1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlbGVjdCBpdGVtcyc7XG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBhbnk7IC8vIFRoZSBzZWxlY3RlZCB2YXJpYWJsZSBjYW4gYmUgYSBzaW5nbGUgdmFsdWUgb3IgYW4gYXJyYXlcbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICdtdWx0aVNlbGVjdElkJztcbiAgQElucHV0KCkgYmluZExhYmVsOiBzdHJpbmcgPSAnJzsgLy8gR2VuZXJpYyBkeW5hbWljIGxhYmVsXG4gIEBJbnB1dCgpIGJpbmRWYWx1ZTogc3RyaW5nID0gJyc7IC8vIEdlbmVyaWMgZHluYW1pYyB2YWx1ZVxuICBASW5wdXQoKSBwZXJtaXNzaW9uczogc3RyaW5nW10gfCB1bmRlZmluZWQ7IC8vIEFkZGluZyBwZXJtaXNzaW9ucyBhcyBpbnB1dFxuICBASW5wdXQoKSBjbG9zZU9uU2VsZWN0OiBib29sZWFuID0gZmFsc2U7IC8vIE5ldyBwcm9wZXJ0eSB0byBjb250cm9sIGRyb3Bkb3duIGNsb3NlIGJlaGF2aW9yXG4gIEBJbnB1dCgpIHNlYXJjaFVybDogc3RyaW5nID0gJyc7IC8vIFVSTCBmb3IgYmFja2VuZCBzZWFyY2hcbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlOyAvLyBOZXcgcHJvcGVydHkgdG8gY29udHJvbCBzaW5nbGUgb3IgbXVsdGlwbGUgc2VsZWN0aW9uXG4gIEBJbnB1dCgpIHNlYXJjaFBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9OyAvLyBQYXLDom1ldHJvcyBkZSBidXNjYSBkaW7Dom1pY29zXG5cbiAgQE91dHB1dCgpIGtleXVwRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgcHJpdmF0ZSBiYWNrdXBEYXRhOiBhbnlbXSA9IFtdOyAvLyBCYWNrdXAgb2YgdGhlIGluaXRpYWwgZGF0YVxuICBwcml2YXRlIGFsbEl0ZW1zOiBhbnlbXSA9IFtdOyAvLyBTdG9yZSB0aGUgY29tYmluZWQgbGlzdFxuICBpdGVtczogT2JzZXJ2YWJsZTxhbnlbXT4gPSBvZihbXSk7IC8vIEluaXRpYWxpemF0aW9uIG9mIHRoZSBwcm9wZXJ0eVxuICBmaWx0ZXJlZEl0ZW1zOiBPYnNlcnZhYmxlPGFueVtdPiA9IG9mKFtdKTsgLy8gRmlsdGVyZWQgaXRlbXNcbiAgcHJpdmF0ZSBzZWFyY2hUZXJtcyA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTsgLy8gRm9yIHNlYXJjaCBkZWJvdW5jZVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYmFja3VwRGF0YSA9IFsuLi50aGlzLmRhdGFdOyAvLyBCYWNrdXAgaW5pdGlhbCBkYXRhXG4gICAgdGhpcy5hbGxJdGVtcyA9IFsuLi50aGlzLmRhdGFdOyAvLyBJbml0aWFsaXplIGFsbEl0ZW1zIHdpdGggdGhlIGluaXRpYWwgZGF0YVxuICAgIHRoaXMuaXRlbXMgPSBvZih0aGlzLmFsbEl0ZW1zKTtcblxuICAgIHRoaXMuZmV0Y2hJbml0aWFsRGF0YSgpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMudXBkYXRlRGF0YShkYXRhKTtcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHRoaXMuc2VhcmNoVGVybXMucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDcwMCksXG4gICAgICAgIHN0YXJ0V2l0aCgnJyksIC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VhcmNoIHRvIGxvYWQgdGhlIG9yaWdpbmFsIGxpc3RcbiAgICAgICAgc3dpdGNoTWFwKHRlcm0gPT4gdGhpcy5zZWFyY2godGVybSkpXG4gICAgICApO1xuXG4gICAgICAvLyBBZGljaW9uYXIgaXRlbnMgc2VsZWNpb25hZG9zIMOgIGxpc3RhIGFww7NzIGJ1c2NhciBkYWRvcyBpbmljaWFpc1xuICAgICAgdGhpcy5hZGRTZWxlY3RlZEl0ZW1zVG9EYXRhKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkJ10gJiYgIWNoYW5nZXNbJ3NlbGVjdGVkJ10uaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICB0aGlzLmFkZFNlbGVjdGVkSXRlbXNUb0RhdGEoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZldGNoSW5pdGlhbERhdGEoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4odGhpcy5zZWFyY2hVcmwpLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBbdGhpcy5iaW5kVmFsdWVdOiBpdGVtW3RoaXMuYmluZFZhbHVlXSxcbiAgICAgICAgICAgIFt0aGlzLmJpbmRMYWJlbF06IGl0ZW1bdGhpcy5iaW5kTGFiZWxdXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBpbml0aWFsIGRhdGEgZnJvbSBiYWNrZW5kOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0YShuZXdEYXRhOiBhbnlbXSk6IHZvaWQge1xuICAgIG5ld0RhdGEuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICBjb25zdCBleGlzdHNJbkxpc3QgPSB0aGlzLmFsbEl0ZW1zLnNvbWUobGlzdEl0ZW0gPT4gdGhpcy5jb21wYXJlRm4obGlzdEl0ZW0sIGl0ZW0pKTtcbiAgICAgIGlmICghZXhpc3RzSW5MaXN0KSB7XG4gICAgICAgIHRoaXMuYWxsSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLml0ZW1zID0gb2YodGhpcy5hbGxJdGVtcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZFNlbGVjdGVkSXRlbXNUb0RhdGEoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLm11bHRpcGxlID8gdGhpcy5zZWxlY3RlZCA6IFt0aGlzLnNlbGVjdGVkXTtcbiAgICAgIHNlbGVjdGVkSXRlbXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0c0luTGlzdCA9IHRoaXMuYWxsSXRlbXMuc29tZShsaXN0SXRlbSA9PiB0aGlzLmNvbXBhcmVGbihsaXN0SXRlbSwgaXRlbSkpO1xuICAgICAgICBpZiAoIWV4aXN0c0luTGlzdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0l0ZW0gPSB7XG4gICAgICAgICAgICBbdGhpcy5iaW5kVmFsdWVdOiBpdGVtW3RoaXMuYmluZFZhbHVlXSB8fCBpdGVtLFxuICAgICAgICAgICAgW3RoaXMuYmluZExhYmVsXTogaXRlbVt0aGlzLmJpbmRMYWJlbF0gfHwgaXRlbVxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5kYXRhLnB1c2gobmV3SXRlbSk7XG4gICAgICAgICAgdGhpcy5hbGxJdGVtcy5wdXNoKG5ld0l0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pdGVtcyA9IG9mKHRoaXMuYWxsSXRlbXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICBpc0NvdXJzZUVudGVyZWQgPSBmYWxzZTtcblxuICBvbkZvY3VzKCkge1xuICAgIHRoaXMuaXNDb3Vyc2VFbnRlcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIG9uQmx1cigpIHtcbiAgICB0aGlzLmlzQ291cnNlRW50ZXJlZCA9IGZhbHNlO1xuICB9XG5cbiAgb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMua2V5dXBFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWRDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBldmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IGV2ZW50ID8gZXZlbnQgOiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh0aGlzLnNlbGVjdGVkKTtcblxuICAgIC8vIFZlcmlmaWNhciBzZSB1bSBpdGVtIGZvaSByZW1vdmlkb1xuICAgIGlmIChwcmV2aW91c1NlbGVjdGVkICYmIEFycmF5LmlzQXJyYXkocHJldmlvdXNTZWxlY3RlZCkgJiYgcHJldmlvdXNTZWxlY3RlZC5sZW5ndGggPiBldmVudC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHJlbW92ZWRJdGVtcyA9IHByZXZpb3VzU2VsZWN0ZWQuZmlsdGVyKGl0ZW0gPT4gIWV2ZW50LmluY2x1ZGVzKGl0ZW0pKTtcbiAgICAgIHJlbW92ZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBleGlzdHNJbkRhdGEgPSB0aGlzLmRhdGEuc29tZShkYXRhSXRlbSA9PiB0aGlzLmNvbXBhcmVGbihkYXRhSXRlbSwgaXRlbSkpO1xuICAgICAgICBpZiAoIWV4aXN0c0luRGF0YSkge1xuICAgICAgICAgIHRoaXMuZGF0YS5wdXNoKGl0ZW0pO1xuICAgICAgICAgIHRoaXMuYWxsSXRlbXMucHVzaChpdGVtKTsgLy8gQWRpY2lvbmFyIGRlIHZvbHRhIGFvcyBpdGVucyBkaXNwb27DrXZlaXNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25JbnB1dENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtcy5uZXh0KGlucHV0KTtcbiAgfVxuXG4gIHNlYXJjaCh0ZXJtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueVtdPiB7XG4gICAgaWYgKCF0ZXJtLnRyaW0oKSkge1xuICAgICAgLy8gU2UgbyB0ZXJtbyBkZSBidXNjYSBlc3RpdmVyIHZhemlvLCByZXRvcm5hIGEgbGlzdGEgY29tcGxldGFcbiAgICAgIHJldHVybiBvZih0aGlzLmFsbEl0ZW1zKTtcbiAgICB9XG5cbiAgICAvLyBGaWx0cmEgb3MgaXRlbnMgbG9jYWxtZW50ZVxuICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5hbGxJdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT5cbiAgICAgIGl0ZW1bdGhpcy5iaW5kTGFiZWxdLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG5cbiAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5sb2coJ0l0ZW1zIGZpbHRlcmVkIGxvY2FsbHkuJyk7XG4gICAgICByZXR1cm4gb2YoZmlsdGVyZWQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hVcmwpIHtcbiAgICAgIC8vIENvbnN0cnVpciBvcyBwYXLDom1ldHJvcyBkZSBidXNjYSBkaW5hbWljYW1lbnRlXG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMuc2VhcmNoUGFyYW1zKTtcbiAgICAgIHBhcmFtcy5hcHBlbmQoJ3Rlcm0nLCB0ZXJtKTtcblxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55W10+KGAke3RoaXMuc2VhcmNoVXJsfT8ke3BhcmFtcy50b1N0cmluZygpfWApLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2U6IGFueVtdKSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybWEgb3MgaXRlbnMgZG8gYmFja2VuZCBwYXJhIG8gZm9ybWF0byBlc3BlcmFkbyBwZWxvIGNvbXBvbmVudGVcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbXMgPSByZXNwb25zZS5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgW3RoaXMuYmluZFZhbHVlXTogaXRlbVt0aGlzLmJpbmRWYWx1ZV0sXG4gICAgICAgICAgICAgIFt0aGlzLmJpbmRMYWJlbF06IGl0ZW1bdGhpcy5iaW5kTGFiZWxdXG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgIC8vIEF0dWFsaXphIG9zIGRhZG9zIGNvbSBvcyBub3ZvcyBpdGVucyBidXNjYWRvc1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhKHRyYW5zZm9ybWVkSXRlbXMpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGxJdGVtcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIGl0ZW1zIGZvdW5kIGluIHRoZSBiYWNrZW5kIHNlYXJjaC4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFsbEl0ZW1zO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBmcm9tIGJhY2tlbmQ6JywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBvZih0aGlzLmFsbEl0ZW1zKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdObyBzZWFyY2ggVVJMIHByb3ZpZGVkIGFuZCBubyBpdGVtcyBmb3VuZCBsb2NhbGx5LicpO1xuICAgICAgcmV0dXJuIG9mKHRoaXMuYWxsSXRlbXMpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWUgfHwgW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB2YWx1ZSB8fCBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuYWRkU2VsZWN0ZWRJdGVtc1RvRGF0YSgpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIE5vIGltcGxlbWVudGF0aW9uIG5lZWRlZCBmb3IgdGhpcyBleGFtcGxlXG4gIH1cblxuICBjb21wYXJlRm4gPSAoaXRlbTE6IGFueSwgaXRlbTI6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBpdGVtMSAmJiBpdGVtMiA/IGl0ZW0xW3RoaXMuYmluZFZhbHVlXSA9PT0gaXRlbTJbdGhpcy5iaW5kVmFsdWVdIDogaXRlbTEgPT09IGl0ZW0yO1xuICB9O1xuXG4gIGhhc1Blcm1pc3Npb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnBlcm1pc3Npb25zIHx8IHRoaXMucGVybWlzc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb25zKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignUGVybWlzc2lvbiBlcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vua25vd24gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBlcm1pc3Npb24gY2hlY2snKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAqbmdJZj1cImhhc1Blcm1pc3Npb24oKVwiIGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICA8bGFiZWwgW2Zvcl09XCJpZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiIHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj57eyBsYWJlbCB9fTwvbGFiZWw+XG4gIDxuZy1zZWxlY3RcbiAgICBbY2xhc3MuY291cnNlLWVudHJ5XT1cImlzQ291cnNlRW50ZXJlZFwiXG4gICAgY2xhc3M9XCJuZy1zZWxlY3QgY3VzdG9tLW5nLXNlbGVjdFwiXG4gICAgW2l0ZW1zXT1cImZpbHRlcmVkSXRlbXMgfCBhc3luY1wiXG4gICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICBbY2xvc2VPblNlbGVjdF09XCJjbG9zZU9uU2VsZWN0XCJcbiAgICBbaGlkZVNlbGVjdGVkXT1cInRydWVcIlxuICAgIFtiaW5kTGFiZWxdPVwiYmluZExhYmVsXCJcbiAgICBbYmluZFZhbHVlXT1cImJpbmRWYWx1ZVwiXG4gICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFwiXG4gICAgW2NvbXBhcmVXaXRoXT1cImNvbXBhcmVGblwiXG4gICAgKGNoYW5nZSk9XCJvblNlbGVjdGVkQ2hhbmdlKCRldmVudClcIlxuICAgIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIlxuICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudClcIlxuICAgIFtpZF09XCJpZFwiXG4gICAgW3BsYWNlaG9sZGVyXT1cInNlbGVjdGVkICYmIChtdWx0aXBsZSA/IHNlbGVjdGVkLmxlbmd0aCA9PT0gMCA6ICFzZWxlY3RlZCkgPyBwbGFjZWhvbGRlciA6ICcnXCJcbiAgICAoZm9jdXMpPVwib25Gb2N1cygpXCJcbiAgICAoYmx1cik9XCJvbkJsdXIoKVwiPlxuICAgIDxuZy10ZW1wbGF0ZSBuZy1vcHRpb24tdG1wIGxldC1pdGVtPVwiaXRlbVwiPlxuICAgICAge3sgaXRlbVtiaW5kTGFiZWxdIH19XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1zZWxlY3Q+XG48L2Rpdj5cbiJdfQ==
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpYi1wb3J0YWwtYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvbXVsdGktc2VsZWN0L211bHRpLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saWItcG9ydGFsLWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL211bHRpLXNlbGVjdC9tdWx0aS1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixHQUFHLEVBRUgsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFpQnhCLE1BQU0sT0FBTyxvQkFBb0I7SUFJL0IsY0FBYyxDQUFDLEtBQVk7UUFDekIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsRUFBRTtZQUMvQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBeUJELFlBQ1UsV0FBd0IsRUFDeEIsSUFBZ0IsRUFDaEIsR0FBc0I7UUFGdEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsU0FBSSxHQUFKLElB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QUFFLENBQUMsUUFBUSxDQUFDO2dCQVFqQyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlYm91bmNlVGltZSxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlL2F1dGgtc2VydmljZS5zZXJ2aWNlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJhcmdlbnRhLWN1c3RvbS1tdWx0aS1zZWxlY3RcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9tdWx0aS1zZWxlY3QuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL211bHRpLXNlbGVjdC5jb21wb25lbnQuc2Nzc1wiXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNdWx0aVNlbGVjdENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlTZWxlY3RDb21wb25lbnRcbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkNoYW5nZXNcbntcbiAgQEhvc3RMaXN0ZW5lcihcImRvY3VtZW50OmNsaWNrXCIsIFtcIiRldmVudFwiXSlcbiAgb25DbGlja091dHNpZGUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghdGFyZ2V0LmNsb3Nlc3QoXCIuY3VzdG9tLXNlbGVjdC1jb250YWluZXJcIikpIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSBcIk11bHRpIFNlbGVjdFwiO1xuICBASW5wdXQoKSBkYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgc2VsZWN0ZWQ6IGFueTtcbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9IFwibXVsdGlTZWxlY3RJZFwiO1xuICBASW5wdXQoKSBiaW5kTGFiZWw6IHN0cmluZyA9IFwiXCI7XG4gIEBJbnB1dCgpIGJpbmRWYWx1ZTogc3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgcGVybWlzc2lvbnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjbG9zZU9uU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlYXJjaFVybDogc3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzZWFyY2hQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcblxuICBAT3V0cHV0KCkga2V5dXBFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwcml2YXRlIGxhc3RTZWFyY2hUZXJtOiBzdHJpbmcgPSBcIlwiO1xuICBwcml2YXRlIGJhY2t1cERhdGE6IGFueVtdID0gW107XG4gIHByaXZhdGUgYWxsSXRlbXM6IGFueVtdID0gW107XG4gIGl0ZW1zOiBPYnNlcnZhYmxlPGFueVtdPiA9IG9mKFtdKTtcbiAgZmlsdGVyZWRJdGVtczogT2JzZXJ2YWJsZTxhbnlbXT4gPSBvZihbXSk7XG4gIHByaXZhdGUgc2VhcmNoVGVybXMgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gIGlzT3BlbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHRoaXMuc2VhcmNoVGVybXMucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSg3MDApLCAvLyBSZWR1eiBjaGFtYWRhcyByZXBldGl0aXZhc1xuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgLy8gSWdub3JhIHRlcm1vcyByZXBldGlkb3MgY29uc2VjdXRpdm9zXG4gICAgICBzd2l0Y2hNYXAoKHRlcm0pID0+IHtcbiAgICAgICAgLy8gU2VtcHJlIGJ1c2NhIG5vIGJhY2stZW5kXG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaCh0ZXJtKS5waXBlKFxuICAgICAgICAgIHRhcCgoZmV0Y2hlZEl0ZW1zKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZURhdGEoZmV0Y2hlZEl0ZW1zKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXAoKGZldGNoZWRJdGVtcykgPT4gdGhpcy5maWx0ZXJPdXRTZWxlY3RlZChmZXRjaGVkSXRlbXMpKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoaXRlbXM6IGFueSkgPT4ge30sXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5lcnJvcihcIkVycm8gYW8gYnVzY2FyIG5vIGJhY2stZW5kOlwiLCBlcnIpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mZXRjaEluaXRpYWxEYXRhKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZURhdGEoZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICBvbklucHV0Q2hhbmdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldC52YWx1ZS50cmltKCk7XG5cbiAgICB0aGlzLnNlYXJjaFRlcm1zLm5leHQoaW5wdXQpO1xuXG4gICAgaWYgKGlucHV0ID09PSBcIlwiKSB7XG4gICAgICB0aGlzLmZldGNoSW5pdGlhbERhdGEoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5hbGxJdGVtcyA9IGRhdGE7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IG9mKHRoaXMuZmlsdGVyT3V0U2VsZWN0ZWQodGhpcy5hbGxJdGVtcykpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2VhcmNoKHRlcm06IHN0cmluZyk6IE9ic2VydmFibGU8YW55W10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnlbXT4oYCR7dGhpcy5zZWFyY2hVcmx9YCwgeyBwYXJhbXM6IHsgdGVybSB9IH0pLnBpcGUoXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZEl0ZW1zID0gcmVzcG9uc2UubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgW3RoaXMuYmluZFZhbHVlXTogaXRlbVt0aGlzLmJpbmRWYWx1ZV0sXG4gICAgICAgICAgW3RoaXMuYmluZExhYmVsXTogaXRlbVt0aGlzLmJpbmRMYWJlbF0sXG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLmFsbEl0ZW1zID0gdHJhbnNmb3JtZWRJdGVtcztcblxuICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBvZih0aGlzLmZpbHRlck91dFNlbGVjdGVkKHRoaXMuYWxsSXRlbXMpKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7IC8vIE5vdGlmaWNhIG8gQW5ndWxhciBzb2JyZSBhIGFsdGVyYcOnw6NvXG5cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkSXRlbXM7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvIGFvIGJ1c2NhciBubyBiYWNrLWVuZDpcIiwgZXJyb3IpO1xuICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBvZihbXSk7XG4gICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoSW5pdGlhbERhdGEoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueVtdPih0aGlzLnNlYXJjaFVybCkucGlwZShcbiAgICAgIG1hcCgocmVzcG9uc2U6IGFueVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSXRlbXMgPSByZXNwb25zZS5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICBbdGhpcy5iaW5kVmFsdWVdOiBpdGVtW3RoaXMuYmluZFZhbHVlXSxcbiAgICAgICAgICBbdGhpcy5iaW5kTGFiZWxdOiBpdGVtW3RoaXMuYmluZExhYmVsXSxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHRoaXMuYWxsSXRlbXMgPSB0cmFuc2Zvcm1lZEl0ZW1zO1xuICAgICAgICByZXR1cm4gdGhpcy5hbGxJdGVtcztcbiAgICAgIH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJybyBhbyBjYXJyZWdhciBkYWRvcyBpbmljaWFpczpcIiwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzW1wic2VsZWN0ZWRcIl0gJiYgIWNoYW5nZXNbXCJzZWxlY3RlZFwiXS5pc0ZpcnN0Q2hhbmdlKCkpIHtcbiAgICAgIHRoaXMuYWRkU2VsZWN0ZWRJdGVtc1RvRGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0YShuZXdEYXRhOiBhbnlbXSk6IHZvaWQge1xuICAgIG5ld0RhdGEuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICBjb25zdCBleGlzdHNJbkxpc3QgPSB0aGlzLmFsbEl0ZW1zLnNvbWUoKGxpc3RJdGVtKSA9PlxuICAgICAgICB0aGlzLmNvbXBhcmVGbihsaXN0SXRlbSwgaXRlbSlcbiAgICAgICk7XG4gICAgICBpZiAoIWV4aXN0c0luTGlzdCkge1xuICAgICAgICB0aGlzLmFsbEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBvZih0aGlzLmFsbEl0ZW1zKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkU2VsZWN0ZWRJdGVtc1RvRGF0YSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IHRoaXMubXVsdGlwbGUgPyB0aGlzLnNlbGVjdGVkIDogW3RoaXMuc2VsZWN0ZWRdO1xuICAgICAgc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RzSW5MaXN0ID0gdGhpcy5hbGxJdGVtcy5zb21lKChsaXN0SXRlbSkgPT5cbiAgICAgICAgICB0aGlzLmNvbXBhcmVGbihsaXN0SXRlbSwgaXRlbSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFleGlzdHNJbkxpc3QpIHtcbiAgICAgICAgICBjb25zdCBuZXdJdGVtID0ge1xuICAgICAgICAgICAgW3RoaXMuYmluZFZhbHVlXTogaXRlbVt0aGlzLmJpbmRWYWx1ZV0gfHwgaXRlbSxcbiAgICAgICAgICAgIFt0aGlzLmJpbmRMYWJlbF06IGl0ZW1bdGhpcy5iaW5kTGFiZWxdIHx8IGl0ZW0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmRhdGEucHVzaChuZXdJdGVtKTtcbiAgICAgICAgICB0aGlzLmFsbEl0ZW1zLnB1c2gobmV3SXRlbSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLml0ZW1zID0gb2YodGhpcy5hbGxJdGVtcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBpc0NvdXJzZUVudGVyZWQgPSBmYWxzZTtcblxuICBvbkZvY3VzKCkge1xuICAgIHRoaXMuaXNDb3Vyc2VFbnRlcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIG9uQmx1cigpIHtcbiAgICB0aGlzLmlzQ291cnNlRW50ZXJlZCA9IGZhbHNlO1xuICB9XG5cbiAgb25LZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMua2V5dXBFdmVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWRDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkO1xuXG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBldmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IGV2ZW50ID8gZXZlbnQgOiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh0aGlzLnNlbGVjdGVkKTtcblxuICAgIGlmIChwcmV2aW91c1NlbGVjdGVkICYmIEFycmF5LmlzQXJyYXkocHJldmlvdXNTZWxlY3RlZCkpIHtcbiAgICAgIGNvbnN0IHJlbW92ZWRJdGVtcyA9IHByZXZpb3VzU2VsZWN0ZWQuZmlsdGVyKFxuICAgICAgICAoaXRlbSkgPT4gIWV2ZW50LmluY2x1ZGVzKGl0ZW0pXG4gICAgICApO1xuXG4gICAgICByZW1vdmVkSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCBleGlzdHNJbkFsbEl0ZW1zID0gdGhpcy5hbGxJdGVtcy5zb21lKChsaXN0SXRlbSkgPT5cbiAgICAgICAgICB0aGlzLmNvbXBhcmVGbihsaXN0SXRlbSwgaXRlbSlcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFleGlzdHNJbkFsbEl0ZW1zKSB7XG4gICAgICAgICAgdGhpcy5hbGxJdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaXRlbXMgPSBvZih0aGlzLmFsbEl0ZW1zKTtcbiAgICB9XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IHZhbHVlIHx8IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWUgfHwgbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZFNlbGVjdGVkSXRlbXNUb0RhdGEoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHt9XG5cbiAgY29tcGFyZUZuID0gKGl0ZW0xOiBhbnksIGl0ZW0yOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICByZXR1cm4gaXRlbTEgJiYgaXRlbTJcbiAgICAgID8gaXRlbTFbdGhpcy5iaW5kVmFsdWVdID09PSBpdGVtMlt0aGlzLmJpbmRWYWx1ZV1cbiAgICAgIDogaXRlbTEgPT09IGl0ZW0yO1xuICB9O1xuXG4gIGhhc1Blcm1pc3Npb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnBlcm1pc3Npb25zIHx8IHRoaXMucGVybWlzc2lvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaGFzUGVybWlzc2lvbih0aGlzLnBlcm1pc3Npb25zKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlBlcm1pc3Npb24gZXJyb3I6XCIsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlVua25vd24gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBlcm1pc3Npb24gY2hlY2tcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVEcm9wZG93bigpIHtcbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcbiAgfVxuXG4gIGNsb3NlRHJvcGRvd24oKSB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQoaXRlbTogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkPy5zb21lKChzZWxlY3RlZEl0ZW06IGFueSkgPT5cbiAgICAgICAgdGhpcy5jb21wYXJlRm4oc2VsZWN0ZWRJdGVtLCBpdGVtKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZUZuKHRoaXMuc2VsZWN0ZWQsIGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEl0ZW0oaXRlbTogYW55LCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmICghdGhpcy5pc1NlbGVjdGVkKGl0ZW0pKSB7XG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnB1c2goaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gW2l0ZW1dO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLmFsbEl0ZW1zID0gdGhpcy5hbGxJdGVtcy5maWx0ZXIoXG4gICAgICAgIChsaXN0SXRlbSkgPT4gIXRoaXMuY29tcGFyZUZuKGxpc3RJdGVtLCBpdGVtKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpbHRlcmVkSXRlbXMgPSBvZih0aGlzLmZpbHRlck91dFNlbGVjdGVkKHRoaXMuYWxsSXRlbXMpKTtcbiAgICB0aGlzLm9uU2VsZWN0ZWRDaGFuZ2UodGhpcy5zZWxlY3RlZCk7XG5cbiAgICBpZiAodGhpcy5jbG9zZU9uU2VsZWN0KSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbHRlckJ5VGVybSh0ZXJtOiBzdHJpbmcpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuYWxsSXRlbXMuZmlsdGVyKChpdGVtKSA9PlxuICAgICAgaXRlbVt0aGlzLmJpbmRMYWJlbF0/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZpbHRlck91dFNlbGVjdGVkKGl0ZW1zOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXMuZmlsdGVyKFxuICAgICAgKGl0ZW0pID0+XG4gICAgICAgICF0aGlzLnNlbGVjdGVkLnNvbWUoKHNlbGVjdGVkSXRlbTogYW55KSA9PlxuICAgICAgICAgIHRoaXMuY29tcGFyZUZuKHNlbGVjdGVkSXRlbSwgaXRlbSlcbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuICByZW1vdmVTZWxlY3RlZEl0ZW0oaXRlbTogYW55LCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkLmZpbHRlcihcbiAgICAgIChzZWxlY3RlZEl0ZW06IGFueSkgPT4gIXRoaXMuY29tcGFyZUZuKHNlbGVjdGVkSXRlbSwgaXRlbSlcbiAgICApO1xuXG4gICAgY29uc3QgZXhpc3RzSW5BbGxJdGVtcyA9IHRoaXMuYWxsSXRlbXMuc29tZSgobGlzdEl0ZW0pID0+XG4gICAgICB0aGlzLmNvbXBhcmVGbihsaXN0SXRlbSwgaXRlbSlcbiAgICApO1xuXG4gICAgaWYgKCFleGlzdHNJbkFsbEl0ZW1zKSB7XG4gICAgICB0aGlzLmFsbEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gb2YodGhpcy5maWx0ZXJCeVRlcm0odGhpcy5sYXN0U2VhcmNoVGVybSB8fCBcIlwiKSk7XG4gICAgdGhpcy5vblNlbGVjdGVkQ2hhbmdlKHRoaXMuc2VsZWN0ZWQpO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiaGFzUGVybWlzc2lvbigpXCIgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gIDxsYWJlbCBbZm9yXT1cImlkXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtXCI+XG4gICAge3sgbGFiZWwgfX1cbiAgPC9sYWJlbD5cbiAgPGRpdiBjbGFzcz1cImN1c3RvbS1zZWxlY3QtY29udGFpbmVyXCIgdGFiaW5kZXg9XCIwXCI+XG4gICAgPCEtLSBJbnB1dCBjb20gaXRlbnMgc2VsZWNpb25hZG9zIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjdXN0b20taW5wdXRcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0ZWQtaXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkXCI+XG4gICAgICAgIHt7IGl0ZW1bYmluZExhYmVsXSB9fVxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJyZW1vdmUtaXRlbS1idG5cIlxuICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTZWxlY3RlZEl0ZW0oaXRlbSwgJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICDDl1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIGNsYXNzPVwiaW5wdXQtZmllbGRcIlxuICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAoZm9jdXMpPVwidG9nZ2xlRHJvcGRvd24oKVwiXG4gICAgICAgIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIlxuICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgIC8+XG4gICAgICA8IS0tIMONY29uZSBmbHV0dWFudGUgLS0+XG4gICAgICA8bHVjaWRlLWljb25cbiAgICAgICAgW25hbWVdPVwiaXNPcGVuID8gJ2FsaWduLWp1c3RpZnknIDogJ2NoZXZyb24tZG93bidcIlxuICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWljb25cIlxuICAgICAgPjwvbHVjaWRlLWljb24+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIERyb3Bkb3duIHN1c3BlbnNvIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJpc09wZW5cIiBjbGFzcz1cImRyb3Bkb3duXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkSXRlbXMgfCBhc3luY1wiXG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiXG4gICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc1NlbGVjdGVkKGl0ZW0pXCJcbiAgICAgICAgKGNsaWNrKT1cInNlbGVjdEl0ZW0oaXRlbSwgJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIHt7IGl0ZW1bYmluZExhYmVsXSB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiKGZpbHRlcmVkSXRlbXMgfCBhc3luYyk/Lmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZW1wdHktZHJvcGRvd25cIj5cbiAgICAgICAgTmVuaHVtIGl0ZW0gZGlzcG9uw612ZWxcbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19