valtech-components 2.0.392 → 2.0.394
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.
- package/esm2022/lib/components/molecules/multi-select-simple/multi-select-simple.component.mjs +90 -81
- package/esm2022/lib/components/molecules/select-search/select-search.component.mjs +83 -116
- package/esm2022/lib/components/organisms/form/form.component.mjs +27 -1
- package/fesm2022/valtech-components.mjs +196 -194
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/multi-select-simple/multi-select-simple.component.d.ts +9 -5
- package/lib/components/molecules/select-search/select-search.component.d.ts +9 -6
- package/lib/components/organisms/article/article.component.d.ts +1 -1
- package/lib/components/organisms/form/form.component.d.ts +1 -0
- package/package.json +1 -1
package/esm2022/lib/components/molecules/multi-select-simple/multi-select-simple.component.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component, forwardRef, inject, Input, ViewChild
|
|
2
|
+
import { ChangeDetectorRef, Component, forwardRef, inject, Input, ViewChild } from '@angular/core';
|
|
3
3
|
import { NG_VALUE_ACCESSOR, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
4
4
|
import { IonicModule } from '@ionic/angular';
|
|
5
5
|
import { LangService } from '../../../services/lang-provider/lang-provider.service';
|
|
@@ -15,45 +15,13 @@ export class MultiSelectSimpleComponent {
|
|
|
15
15
|
this.valueProperty = 'id';
|
|
16
16
|
this.placeholder = '';
|
|
17
17
|
this.langService = inject(LangService);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
this.
|
|
21
|
-
this.
|
|
22
|
-
|
|
23
|
-
this.displayValue =
|
|
24
|
-
|
|
25
|
-
if (selected.length === 0) {
|
|
26
|
-
return '';
|
|
27
|
-
}
|
|
28
|
-
if (selected.length === 1) {
|
|
29
|
-
const option = this.getOptionByValue(selected[0]);
|
|
30
|
-
return option ? option[this.labelProperty] : '';
|
|
31
|
-
}
|
|
32
|
-
return `${selected.length} elementos seleccionados`;
|
|
33
|
-
});
|
|
34
|
-
this.filteredOptions = computed(() => {
|
|
35
|
-
const options = this.props?.options || [];
|
|
36
|
-
const search = this.searchTerm().toLowerCase();
|
|
37
|
-
// Debug
|
|
38
|
-
console.log('[MultiSelectSimple] filteredOptions computed:', {
|
|
39
|
-
optionsCount: options.length,
|
|
40
|
-
searchTerm: search,
|
|
41
|
-
options: options.slice(0, 3) // Primeras 3 opciones
|
|
42
|
-
});
|
|
43
|
-
if (!search) {
|
|
44
|
-
return options;
|
|
45
|
-
}
|
|
46
|
-
return options.filter(option => {
|
|
47
|
-
const label = option[this.labelProperty]
|
|
48
|
-
? replaceSpecialChars(String(option[this.labelProperty]).toLowerCase())
|
|
49
|
-
: '';
|
|
50
|
-
const value = option[this.valueProperty]
|
|
51
|
-
? replaceSpecialChars(String(option[this.valueProperty]).toLowerCase())
|
|
52
|
-
: '';
|
|
53
|
-
const searchTerm = replaceSpecialChars(search);
|
|
54
|
-
return label.includes(searchTerm) || value.includes(searchTerm);
|
|
55
|
-
});
|
|
56
|
-
});
|
|
18
|
+
this.changeDetector = inject(ChangeDetectorRef);
|
|
19
|
+
// Classic Angular properties
|
|
20
|
+
this.isOpen = false;
|
|
21
|
+
this.searchTerm = '';
|
|
22
|
+
this.selectedValues = [];
|
|
23
|
+
this.displayValue = '';
|
|
24
|
+
this.filteredOptions = [];
|
|
57
25
|
this.searchPlaceholder = '';
|
|
58
26
|
// ControlValueAccessor
|
|
59
27
|
this.onChange = (_value) => { };
|
|
@@ -65,20 +33,26 @@ export class MultiSelectSimpleComponent {
|
|
|
65
33
|
}
|
|
66
34
|
ngOnInit() {
|
|
67
35
|
this.applyDefaultValue();
|
|
36
|
+
this.initializeOptions();
|
|
68
37
|
this.syncSelectedValues();
|
|
38
|
+
this.updateDisplayValue();
|
|
69
39
|
}
|
|
70
40
|
ngOnDestroy() {
|
|
71
41
|
document.removeEventListener('click', this.handleClickOutside.bind(this));
|
|
72
42
|
}
|
|
73
43
|
ngOnChanges(changes) {
|
|
74
44
|
if (changes['props'] && this.props) {
|
|
45
|
+
this.initializeOptions();
|
|
75
46
|
this.syncSelectedValues();
|
|
47
|
+
this.updateDisplayValue();
|
|
48
|
+
this.changeDetector.detectChanges();
|
|
76
49
|
}
|
|
77
50
|
}
|
|
78
51
|
// ControlValueAccessor implementation
|
|
79
52
|
writeValue(value) {
|
|
80
53
|
const valueArray = this.parseValue(value);
|
|
81
|
-
this.selectedValues
|
|
54
|
+
this.selectedValues = valueArray;
|
|
55
|
+
this.updateDisplayValue();
|
|
82
56
|
}
|
|
83
57
|
registerOnChange(fn) {
|
|
84
58
|
this.onChange = fn;
|
|
@@ -92,8 +66,8 @@ export class MultiSelectSimpleComponent {
|
|
|
92
66
|
// Component methods
|
|
93
67
|
toggleDropdown(event) {
|
|
94
68
|
event.stopPropagation();
|
|
95
|
-
this.isOpen
|
|
96
|
-
if (this.isOpen
|
|
69
|
+
this.isOpen = !this.isOpen;
|
|
70
|
+
if (this.isOpen) {
|
|
97
71
|
this.onTouched();
|
|
98
72
|
// Focus search bar when opening
|
|
99
73
|
setTimeout(() => {
|
|
@@ -105,45 +79,48 @@ export class MultiSelectSimpleComponent {
|
|
|
105
79
|
}
|
|
106
80
|
}
|
|
107
81
|
onSearch(event) {
|
|
108
|
-
this.searchTerm
|
|
82
|
+
this.searchTerm = event.detail.value || '';
|
|
83
|
+
this.filterOptions();
|
|
109
84
|
}
|
|
110
85
|
toggleOption(option) {
|
|
111
|
-
const value = String(option[this.valueProperty]);
|
|
112
|
-
const currentSelected = this.selectedValues();
|
|
86
|
+
const value = String(option[this.valueProperty]);
|
|
113
87
|
if (this.isSelected(option)) {
|
|
114
88
|
// Remove from selection
|
|
115
|
-
this.selectedValues.
|
|
89
|
+
this.selectedValues = this.selectedValues.filter(v => v !== value);
|
|
116
90
|
}
|
|
117
91
|
else {
|
|
118
92
|
// Add to selection
|
|
119
|
-
this.selectedValues
|
|
93
|
+
this.selectedValues = [...this.selectedValues, value];
|
|
120
94
|
}
|
|
95
|
+
this.updateDisplayValue();
|
|
121
96
|
this.emitValue();
|
|
122
97
|
}
|
|
123
98
|
selectAll() {
|
|
124
|
-
const allValues = this.filteredOptions
|
|
125
|
-
const currentSelected = this.selectedValues();
|
|
99
|
+
const allValues = this.filteredOptions.map(option => String(option[this.valueProperty]));
|
|
126
100
|
// Add only new values to avoid duplicates
|
|
127
|
-
const newValues = allValues.filter(value => !
|
|
128
|
-
this.selectedValues
|
|
101
|
+
const newValues = allValues.filter(value => !this.selectedValues.includes(value));
|
|
102
|
+
this.selectedValues = [...this.selectedValues, ...newValues];
|
|
103
|
+
this.updateDisplayValue();
|
|
129
104
|
this.emitValue();
|
|
130
105
|
}
|
|
131
106
|
clearAll() {
|
|
132
|
-
this.selectedValues
|
|
107
|
+
this.selectedValues = [];
|
|
108
|
+
this.updateDisplayValue();
|
|
133
109
|
this.emitValue();
|
|
134
110
|
}
|
|
135
111
|
isSelected(option) {
|
|
136
|
-
return this.selectedValues
|
|
112
|
+
return this.selectedValues.includes(String(option[this.valueProperty]));
|
|
137
113
|
}
|
|
138
114
|
trackByFn(_index, option) {
|
|
139
115
|
return option[this.valueProperty];
|
|
140
116
|
}
|
|
141
117
|
handleClickOutside(event) {
|
|
142
|
-
if (this.isOpen
|
|
118
|
+
if (this.isOpen &&
|
|
143
119
|
!this.mainInputRef?.nativeElement?.contains(event.target) &&
|
|
144
120
|
!this.dropdownRef?.nativeElement?.contains(event.target)) {
|
|
145
|
-
this.isOpen
|
|
146
|
-
this.searchTerm
|
|
121
|
+
this.isOpen = false;
|
|
122
|
+
this.searchTerm = '';
|
|
123
|
+
this.initializeOptions();
|
|
147
124
|
}
|
|
148
125
|
}
|
|
149
126
|
parseValue(value) {
|
|
@@ -157,7 +134,7 @@ export class MultiSelectSimpleComponent {
|
|
|
157
134
|
return [String(value)];
|
|
158
135
|
}
|
|
159
136
|
emitValue() {
|
|
160
|
-
const value = this.selectedValues
|
|
137
|
+
const value = this.selectedValues.join(',');
|
|
161
138
|
this.onChange(value);
|
|
162
139
|
if (this.props?.control) {
|
|
163
140
|
this.props.control.setValue(value);
|
|
@@ -166,17 +143,49 @@ export class MultiSelectSimpleComponent {
|
|
|
166
143
|
}
|
|
167
144
|
}
|
|
168
145
|
getOptionByValue(value) {
|
|
169
|
-
return this.
|
|
146
|
+
return this.filteredOptions.find(option => String(option[this.valueProperty]) === String(value));
|
|
170
147
|
}
|
|
171
148
|
applyDefaultValue() {
|
|
172
149
|
if (this.props) {
|
|
173
150
|
applyDefaultValueToControl(this.props);
|
|
174
151
|
}
|
|
175
152
|
}
|
|
153
|
+
initializeOptions() {
|
|
154
|
+
this.filteredOptions = this.props?.options || [];
|
|
155
|
+
}
|
|
156
|
+
filterOptions() {
|
|
157
|
+
if (!this.searchTerm) {
|
|
158
|
+
this.initializeOptions();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const search = replaceSpecialChars(this.searchTerm.toLowerCase());
|
|
162
|
+
this.filteredOptions = (this.props?.options || []).filter(option => {
|
|
163
|
+
const label = option[this.labelProperty]
|
|
164
|
+
? replaceSpecialChars(String(option[this.labelProperty]).toLowerCase())
|
|
165
|
+
: '';
|
|
166
|
+
const value = option[this.valueProperty]
|
|
167
|
+
? replaceSpecialChars(String(option[this.valueProperty]).toLowerCase())
|
|
168
|
+
: '';
|
|
169
|
+
return label.includes(search) || value.includes(search);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
updateDisplayValue() {
|
|
173
|
+
if (this.selectedValues.length === 0) {
|
|
174
|
+
this.displayValue = '';
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (this.selectedValues.length === 1) {
|
|
178
|
+
const option = this.getOptionByValue(this.selectedValues[0]);
|
|
179
|
+
this.displayValue = option ? option[this.labelProperty] : '';
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
this.displayValue = `${this.selectedValues.length} elementos seleccionados`;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
176
185
|
syncSelectedValues() {
|
|
177
186
|
if (this.props?.control?.value) {
|
|
178
187
|
const valueArray = this.parseValue(this.props.control.value);
|
|
179
|
-
this.selectedValues
|
|
188
|
+
this.selectedValues = valueArray;
|
|
180
189
|
}
|
|
181
190
|
}
|
|
182
191
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiSelectSimpleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
@@ -192,18 +201,18 @@ export class MultiSelectSimpleComponent {
|
|
|
192
201
|
<ion-input
|
|
193
202
|
#mainInput
|
|
194
203
|
type="text"
|
|
195
|
-
[value]="displayValue
|
|
204
|
+
[value]="displayValue"
|
|
196
205
|
[placeholder]="props?.placeholder || placeholder"
|
|
197
206
|
readonly
|
|
198
207
|
class="main-input"
|
|
199
|
-
[class.is-open]="isOpen
|
|
208
|
+
[class.is-open]="isOpen"
|
|
200
209
|
/>
|
|
201
210
|
|
|
202
211
|
<!-- Dropdown icon -->
|
|
203
212
|
<ion-icon
|
|
204
213
|
name="chevron-down-outline"
|
|
205
214
|
class="dropdown-icon"
|
|
206
|
-
[class.rotated]="isOpen
|
|
215
|
+
[class.rotated]="isOpen"
|
|
207
216
|
></ion-icon>
|
|
208
217
|
|
|
209
218
|
<!-- Hidden input for form control -->
|
|
@@ -217,7 +226,7 @@ export class MultiSelectSimpleComponent {
|
|
|
217
226
|
<!-- Dropdown overlay -->
|
|
218
227
|
<div
|
|
219
228
|
class="dropdown-overlay"
|
|
220
|
-
[class.visible]="isOpen
|
|
229
|
+
[class.visible]="isOpen"
|
|
221
230
|
#dropdown
|
|
222
231
|
>
|
|
223
232
|
<!-- Search bar -->
|
|
@@ -226,7 +235,7 @@ export class MultiSelectSimpleComponent {
|
|
|
226
235
|
#searchbar
|
|
227
236
|
[placeholder]="searchPlaceholder"
|
|
228
237
|
(ionInput)="onSearch($event)"
|
|
229
|
-
[value]="searchTerm
|
|
238
|
+
[value]="searchTerm"
|
|
230
239
|
show-clear-button="focus"
|
|
231
240
|
></ion-searchbar>
|
|
232
241
|
</div>
|
|
@@ -237,7 +246,7 @@ export class MultiSelectSimpleComponent {
|
|
|
237
246
|
fill="clear"
|
|
238
247
|
size="small"
|
|
239
248
|
(click)="selectAll()"
|
|
240
|
-
[disabled]="filteredOptions
|
|
249
|
+
[disabled]="filteredOptions.length === 0"
|
|
241
250
|
>
|
|
242
251
|
Seleccionar todos
|
|
243
252
|
</ion-button>
|
|
@@ -246,7 +255,7 @@ export class MultiSelectSimpleComponent {
|
|
|
246
255
|
size="small"
|
|
247
256
|
color="medium"
|
|
248
257
|
(click)="clearAll()"
|
|
249
|
-
[disabled]="selectedValues
|
|
258
|
+
[disabled]="selectedValues.length === 0"
|
|
250
259
|
>
|
|
251
260
|
Limpiar
|
|
252
261
|
</ion-button>
|
|
@@ -256,7 +265,7 @@ export class MultiSelectSimpleComponent {
|
|
|
256
265
|
<div class="options-container">
|
|
257
266
|
<ion-list class="options-list">
|
|
258
267
|
<ion-item
|
|
259
|
-
*ngFor="let option of filteredOptions
|
|
268
|
+
*ngFor="let option of filteredOptions; trackBy: trackByFn"
|
|
260
269
|
button
|
|
261
270
|
(click)="toggleOption(option)"
|
|
262
271
|
class="option-item"
|
|
@@ -269,9 +278,9 @@ export class MultiSelectSimpleComponent {
|
|
|
269
278
|
</ion-item>
|
|
270
279
|
|
|
271
280
|
<!-- No results message -->
|
|
272
|
-
<ion-item *ngIf="filteredOptions
|
|
281
|
+
<ion-item *ngIf="filteredOptions.length === 0" class="no-results">
|
|
273
282
|
<ion-label color="medium">
|
|
274
|
-
{{ searchTerm
|
|
283
|
+
{{ searchTerm ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
|
|
275
284
|
</ion-label>
|
|
276
285
|
</ion-item>
|
|
277
286
|
</ion-list>
|
|
@@ -293,18 +302,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
293
302
|
<ion-input
|
|
294
303
|
#mainInput
|
|
295
304
|
type="text"
|
|
296
|
-
[value]="displayValue
|
|
305
|
+
[value]="displayValue"
|
|
297
306
|
[placeholder]="props?.placeholder || placeholder"
|
|
298
307
|
readonly
|
|
299
308
|
class="main-input"
|
|
300
|
-
[class.is-open]="isOpen
|
|
309
|
+
[class.is-open]="isOpen"
|
|
301
310
|
/>
|
|
302
311
|
|
|
303
312
|
<!-- Dropdown icon -->
|
|
304
313
|
<ion-icon
|
|
305
314
|
name="chevron-down-outline"
|
|
306
315
|
class="dropdown-icon"
|
|
307
|
-
[class.rotated]="isOpen
|
|
316
|
+
[class.rotated]="isOpen"
|
|
308
317
|
></ion-icon>
|
|
309
318
|
|
|
310
319
|
<!-- Hidden input for form control -->
|
|
@@ -318,7 +327,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
318
327
|
<!-- Dropdown overlay -->
|
|
319
328
|
<div
|
|
320
329
|
class="dropdown-overlay"
|
|
321
|
-
[class.visible]="isOpen
|
|
330
|
+
[class.visible]="isOpen"
|
|
322
331
|
#dropdown
|
|
323
332
|
>
|
|
324
333
|
<!-- Search bar -->
|
|
@@ -327,7 +336,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
327
336
|
#searchbar
|
|
328
337
|
[placeholder]="searchPlaceholder"
|
|
329
338
|
(ionInput)="onSearch($event)"
|
|
330
|
-
[value]="searchTerm
|
|
339
|
+
[value]="searchTerm"
|
|
331
340
|
show-clear-button="focus"
|
|
332
341
|
></ion-searchbar>
|
|
333
342
|
</div>
|
|
@@ -338,7 +347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
338
347
|
fill="clear"
|
|
339
348
|
size="small"
|
|
340
349
|
(click)="selectAll()"
|
|
341
|
-
[disabled]="filteredOptions
|
|
350
|
+
[disabled]="filteredOptions.length === 0"
|
|
342
351
|
>
|
|
343
352
|
Seleccionar todos
|
|
344
353
|
</ion-button>
|
|
@@ -347,7 +356,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
347
356
|
size="small"
|
|
348
357
|
color="medium"
|
|
349
358
|
(click)="clearAll()"
|
|
350
|
-
[disabled]="selectedValues
|
|
359
|
+
[disabled]="selectedValues.length === 0"
|
|
351
360
|
>
|
|
352
361
|
Limpiar
|
|
353
362
|
</ion-button>
|
|
@@ -357,7 +366,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
357
366
|
<div class="options-container">
|
|
358
367
|
<ion-list class="options-list">
|
|
359
368
|
<ion-item
|
|
360
|
-
*ngFor="let option of filteredOptions
|
|
369
|
+
*ngFor="let option of filteredOptions; trackBy: trackByFn"
|
|
361
370
|
button
|
|
362
371
|
(click)="toggleOption(option)"
|
|
363
372
|
class="option-item"
|
|
@@ -370,9 +379,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
370
379
|
</ion-item>
|
|
371
380
|
|
|
372
381
|
<!-- No results message -->
|
|
373
|
-
<ion-item *ngIf="filteredOptions
|
|
382
|
+
<ion-item *ngIf="filteredOptions.length === 0" class="no-results">
|
|
374
383
|
<ion-label color="medium">
|
|
375
|
-
{{ searchTerm
|
|
384
|
+
{{ searchTerm ? 'No se encontraron resultados' : 'No hay opciones disponibles' }}
|
|
376
385
|
</ion-label>
|
|
377
386
|
</ion-item>
|
|
378
387
|
</ion-list>
|
|
@@ -394,4 +403,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
394
403
|
}], placeholder: [{
|
|
395
404
|
type: Input
|
|
396
405
|
}] } });
|
|
397
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LXNpbXBsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9tdWx0aS1zZWxlY3Qtc2ltcGxlL211bHRpLXNlbGVjdC1zaW1wbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUtMLFNBQVMsRUFDVCxNQUFNLEVBQ04sUUFBUSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0csT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUNwRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7QUE0R2pFLE1BQU0sT0FBTywwQkFBMEI7SUE4RHJDO1FBekRTLGtCQUFhLEdBQVcsTUFBTSxDQUFDO1FBQy9CLGtCQUFhLEdBQVcsSUFBSSxDQUFDO1FBQzdCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBRTFCLGdCQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTFDLHdDQUF3QztRQUN4QyxXQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLGVBQVUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsbUJBQWMsR0FBRyxNQUFN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O2tCQXpHdEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FDdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLENBQUMsYUFDM0Q7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMkJBQTJCLENBQUM7NEJBQ3pELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyRlQ7d0RBSXNCLFdBQVc7c0JBQWpDLFNBQVM7dUJBQUMsVUFBVTtnQkFDRyxZQUFZO3NCQUFuQyxTQUFTO3VCQUFDLFdBQVc7Z0JBRWIsS0FBSztzQkFBYixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbmljTW9kdWxlIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgTGFuZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL2xhbmctcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBhcHBseURlZmF1bHRWYWx1ZVRvQ29udHJvbCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC91dGlscy9mb3JtLWRlZmF1bHRzJztcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvdGV4dCc7XG5pbXBvcnQgeyBJbnB1dE1ldGFkYXRhLCBJbnB1dE9wdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLW11bHRpLXNlbGVjdC1zaW1wbGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25pY01vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpU2VsZWN0U2ltcGxlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1zZWxlY3QtY29udGFpbmVyXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCRldmVudClcIj5cbiAgICAgIDwhLS0gTWFpbiBpbnB1dCBkaXNwbGF5IC0tPlxuICAgICAgPGlvbi1pbnB1dFxuICAgICAgICAjbWFpbklucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW3ZhbHVlXT1cImRpc3BsYXlWYWx1ZSgpXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInByb3BzPy5wbGFjZWhvbGRlciB8fCBwbGFjZWhvbGRlclwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAgIGNsYXNzPVwibWFpbi1pbnB1dFwiXG4gICAgICAgIFtjbGFzcy5pcy1vcGVuXT1cImlzT3BlbigpXCJcbiAgICAgIC8+XG4gICAgICBcbiAgICAgIDwhLS0gRHJvcGRvd24gaWNvbiAtLT5cbiAgICAgIDxpb24taWNvbiBcbiAgICAgICAgbmFtZT1cImNoZXZyb24tZG93bi1vdXRsaW5lXCIgXG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24taWNvblwiIFxuICAgICAgICBbY2xhc3Mucm90YXRlZF09XCJpc09wZW4oKVwiXG4gICAgICA+PC9pb24taWNvbj5cbiAgICAgIFxuICAgICAgPCEtLSBIaWRkZW4gaW5wdXQgZm9yIGZvcm0gY29udHJvbCAtLT5cbiAgICAgIDxpb24taW5wdXQgXG4gICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBvcGFjaXR5OiAwOyBwb2ludGVyLWV2ZW50czogbm9uZTtcIiBcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cInByb3BzPy5jb250cm9sXCIgXG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRHJvcGRvd24gb3ZlcmxheSAtLT5cbiAgICA8ZGl2IFxuICAgICAgY2xhc3M9XCJkcm9wZG93bi1vdmVybGF5XCIgXG4gICAgICBbY2xhc3MudmlzaWJsZV09XCJpc09wZW4oKVwiXG4gICAgICAjZHJvcGRvd25cbiAgICA+XG4gICAgICA8IS0tIFNlYXJjaCBiYXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWNvbnRhaW5lclwiPlxuICAgICAgICA8aW9uLXNlYXJjaGJhclxuICAgICAgICAgICNzZWFyY2hiYXJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICAgIChpb25JbnB1dCk9XCJvblNlYXJjaCgkZXZlbnQpXCJcbiAgICAgICAgICBbdmFsdWVdPVwic2VhcmNoVGVybSgpXCJcbiAgICAgICAgICBzaG93LWNsZWFyLWJ1dHRvbj1cImZvY3VzXCJcbiAgICAgICAgPjwvaW9uLXNlYXJjaGJhcj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8IS0tIEFjdGlvbiBidXR0b25zIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxpb24tYnV0dG9uIFxuICAgICAgICAgIGZpbGw9XCJjbGVhclwiIFxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiIFxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBbGwoKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgID5cbiAgICAgICAgICBTZWxlY2Npb25hciB0b2Rvc1xuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uIFxuICAgICAgICAgIGZpbGw9XCJjbGVhclwiIFxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiIFxuICAgICAgICAgIGNvbG9yPVwibWVkaXVtXCIgXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyQWxsKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZFZhbHVlcygpLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgID5cbiAgICAgICAgICBMaW1waWFyXG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8IS0tIE9wdGlvbnMgbGlzdCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICA8aW9uLWxpc3QgY2xhc3M9XCJvcHRpb25zLWxpc3RcIj5cbiAgICAgICAgICA8aW9uLWl0ZW0gXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFja0J5OiB0cmFja0J5Rm5cIiBcbiAgICAgICAgICAgIGJ1dHRvbiBcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVPcHRpb24ob3B0aW9uKVwiXG4gICAgICAgICAgICBjbGFzcz1cIm9wdGlvbi1pdGVtXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW9uLWNoZWNrYm94XG4gICAgICAgICAgICAgIHNsb3Q9XCJzdGFydFwiXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICA+PC9pb24tY2hlY2tib3g+XG4gICAgICAgICAgICA8aW9uLWxhYmVsPnt7IG9wdGlvbltsYWJlbFByb3BlcnR5XSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICAgIDwvaW9uLWl0ZW0+XG4gICAgICAgICAgXG4gICAgICAgICAgPCEtLSBObyByZXN1bHRzIG1lc3NhZ2UgLS0+XG4gICAgICAgICAgPGlvbi1pdGVtICpuZ0lmPVwiZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJuby1yZXN1bHRzXCI+XG4gICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwibWVkaXVtXCI+XG4gICAgICAgICAgICAgIHt7IHNlYXJjaFRlcm0oKSA/ICdObyBzZSBlbmNvbnRyYXJvbiByZXN1bHRhZG9zJyA6ICdObyBoYXkgb3BjaW9uZXMgZGlzcG9uaWJsZXMnIH19XG4gICAgICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgICAgICA8L2lvbi1pdGVtPlxuICAgICAgICA8L2lvbi1saXN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL211bHRpLXNlbGVjdC1zaW1wbGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aVNlbGVjdFNpbXBsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQFZpZXdDaGlsZCgnZHJvcGRvd24nKSBkcm9wZG93blJlZiE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ21haW5JbnB1dCcpIG1haW5JbnB1dFJlZiE6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgcHJvcHMhOiBJbnB1dE1ldGFkYXRhO1xuICBASW5wdXQoKSBsYWJlbFByb3BlcnR5OiBzdHJpbmcgPSAnbmFtZSc7XG4gIEBJbnB1dCgpIHZhbHVlUHJvcGVydHk6IHN0cmluZyA9ICdpZCc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICBwcml2YXRlIGxhbmdTZXJ2aWNlID0gaW5qZWN0KExhbmdTZXJ2aWNlKTtcbiAgXG4gIC8vIFNpZ25hbHMgZm9yIHJlYWN0aXZlIHN0YXRlIG1hbmFnZW1lbnRcbiAgaXNPcGVuID0gc2lnbmFsKGZhbHNlKTtcbiAgc2VhcmNoVGVybSA9IHNpZ25hbCgnJyk7XG4gIHNlbGVjdGVkVmFsdWVzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG4gIFxuICAvLyBDb21wdXRlZCBzaWduYWxzXG4gIGRpc3BsYXlWYWx1ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZ2V0T3B0aW9uQnlWYWx1ZShzZWxlY3RlZFswXSk7XG4gICAgICByZXR1cm4gb3B0aW9uID8gb3B0aW9uW3RoaXMubGFiZWxQcm9wZXJ0eV0gOiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3NlbGVjdGVkLmxlbmd0aH0gZWxlbWVudG9zIHNlbGVjY2lvbmFkb3NgO1xuICB9KTtcblxuICBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMucHJvcHM/Lm9wdGlvbnMgfHwgW107XG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zZWFyY2hUZXJtKCkudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICAvLyBEZWJ1Z1xuICAgIGNvbnNvbGUubG9nKCdbTXVsdGlTZWxlY3RTaW1wbGVdIGZpbHRlcmVkT3B0aW9ucyBjb21wdXRlZDonLCB7XG4gICAgICBvcHRpb25zQ291bnQ6IG9wdGlvbnMubGVuZ3RoLFxuICAgICAgc2VhcmNoVGVybTogc2VhcmNoLFxuICAgICAgb3B0aW9uczogb3B0aW9ucy5zbGljZSgwLCAzKSAvLyBQcmltZXJhcyAzIG9wY2lvbmVzXG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gb3B0aW9ucy5maWx0ZXIob3B0aW9uID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gb3B0aW9uW3RoaXMubGFiZWxQcm9wZXJ0eV1cbiAgICAgICAgPyByZXBsYWNlU3BlY2lhbENoYXJzKFN0cmluZyhvcHRpb25bdGhpcy5sYWJlbFByb3BlcnR5XSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uW3RoaXMudmFsdWVQcm9wZXJ0eV1cbiAgICAgICAgPyByZXBsYWNlU3BlY2lhbENoYXJzKFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSByZXBsYWNlU3BlY2lhbENoYXJzKHNlYXJjaCk7XG4gICAgICByZXR1cm4gbGFiZWwuaW5jbHVkZXMoc2VhcmNoVGVybSkgfHwgdmFsdWUuaW5jbHVkZXMoc2VhcmNoVGVybSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvclxuICBwcml2YXRlIG9uQ2hhbmdlID0gKF92YWx1ZTogYW55KSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdfZ2xvYmFsJywgJ3NlbGVjdE9wdGlvbnMnLCAnU2VsZWNjaW9uZSBvcGNpb25lcycpO1xuICAgIHRoaXMuc2VhcmNoUGxhY2Vob2xkZXIgPSB0aGlzLmxhbmdTZXJ2aWNlLmdldFRleHQoJ19nbG9iYWwnLCAnc2VhcmNoJywgJ0J1c2NhcicpO1xuICAgIFxuICAgIC8vIENsb3NlIGRyb3Bkb3duIHdoZW4gY2xpY2tpbmcgb3V0c2lkZVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGlja091dHNpZGUuYmluZCh0aGlzKSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmFwcGx5RGVmYXVsdFZhbHVlKCk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVDbGlja091dHNpZGUuYmluZCh0aGlzKSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ3Byb3BzJ10gJiYgdGhpcy5wcm9wcykge1xuICAgICAgdGhpcy5zeW5jU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICB9XG4gIH1cblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRhdGlvblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZUFycmF5ID0gdGhpcy5wYXJzZVZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLnNldCh2YWx1ZUFycmF5KTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShfaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIC8vIEhhbmRsZSBkaXNhYmxlZCBzdGF0ZSBpZiBuZWVkZWRcbiAgfVxuXG4gIC8vIENvbXBvbmVudCBtZXRob2RzXG4gIHRvZ2dsZURyb3Bkb3duKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNPcGVuLnVwZGF0ZSh2YWx1ZSA9PiAhdmFsdWUpO1xuICAgIFxuICAgIGlmICh0aGlzLmlzT3BlbigpKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgLy8gRm9jdXMgc2VhcmNoIGJhciB3aGVuIG9wZW5pbmdcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWFyY2hiYXIgPSB0aGlzLmRyb3Bkb3duUmVmPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCdpb24tc2VhcmNoYmFyJyk7XG4gICAgICAgIGlmIChzZWFyY2hiYXIpIHtcbiAgICAgICAgICBzZWFyY2hiYXIuc2V0Rm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXJtLnNldChldmVudC5kZXRhaWwudmFsdWUgfHwgJycpO1xuICB9XG5cbiAgdG9nZ2xlT3B0aW9uKG9wdGlvbjogSW5wdXRPcHRpb24pOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSk7IC8vIENvbnZlcnRpciBhIHN0cmluZ1xuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICBcbiAgICBpZiAodGhpcy5pc1NlbGVjdGVkKG9wdGlvbikpIHtcbiAgICAgIC8vIFJlbW92ZSBmcm9tIHNlbGVjdGlvblxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5zZXQoY3VycmVudFNlbGVjdGVkLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCB0byBzZWxlY3Rpb25cbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMuc2V0KFsuLi5jdXJyZW50U2VsZWN0ZWQsIHZhbHVlXSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICBzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgY29uc3QgYWxsVmFsdWVzID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5tYXAob3B0aW9uID0+IFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSkpO1xuICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICBcbiAgICAvLyBBZGQgb25seSBuZXcgdmFsdWVzIHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICBjb25zdCBuZXdWYWx1ZXMgPSBhbGxWYWx1ZXMuZmlsdGVyKHZhbHVlID0+ICFjdXJyZW50U2VsZWN0ZWQuaW5jbHVkZXModmFsdWUpKTtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzLnNldChbLi4uY3VycmVudFNlbGVjdGVkLCAuLi5uZXdWYWx1ZXNdKTtcbiAgICBcbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICB9XG5cbiAgY2xlYXJBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlcy5zZXQoW10pO1xuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICBpc1NlbGVjdGVkKG9wdGlvbjogSW5wdXRPcHRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZhbHVlcygpLmluY2x1ZGVzKFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSkpO1xuICB9XG5cbiAgdHJhY2tCeUZuKF9pbmRleDogbnVtYmVyLCBvcHRpb246IElucHV0T3B0aW9uKTogYW55IHtcbiAgICByZXR1cm4gb3B0aW9uW3RoaXMudmFsdWVQcm9wZXJ0eV07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNsaWNrT3V0c2lkZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4oKSAmJiBcbiAgICAgICAgIXRoaXMubWFpbklucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAgICF0aGlzLmRyb3Bkb3duUmVmPy5uYXRpdmVFbGVtZW50Py5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5zZWFyY2hUZXJtLnNldCgnJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IFN0cmluZyh2KSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcCh2ID0+IHYudHJpbSgpKS5maWx0ZXIodiA9PiB2ICE9PSAnJyk7XG4gICAgfVxuICAgIHJldHVybiBbU3RyaW5nKHZhbHVlKV07XG4gIH1cblxuICBwcml2YXRlIGVtaXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMoKS5qb2luKCcsJyk7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgXG4gICAgaWYgKHRoaXMucHJvcHM/LmNvbnRyb2wpIHtcbiAgICAgIHRoaXMucHJvcHMuY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB0aGlzLnByb3BzLmNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgIHRoaXMucHJvcHMuY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcHRpb25CeVZhbHVlKHZhbHVlOiBzdHJpbmcpOiBJbnB1dE9wdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHM/Lm9wdGlvbnM/LmZpbmQob3B0aW9uID0+IFxuICAgICAgU3RyaW5nKG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldKSA9PT0gU3RyaW5nKHZhbHVlKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5RGVmYXVsdFZhbHVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzKSB7XG4gICAgICBhcHBseURlZmF1bHRWYWx1ZVRvQ29udHJvbCh0aGlzLnByb3BzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN5bmNTZWxlY3RlZFZhbHVlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcz8uY29udHJvbD8udmFsdWUpIHtcbiAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSB0aGlzLnBhcnNlVmFsdWUodGhpcy5wcm9wcy5jb250cm9sLnZhbHVlKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMuc2V0KHZhbHVlQXJyYXkpO1xuICAgIH1cbiAgfVxufSJdfQ==
|
|
406
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktc2VsZWN0LXNpbXBsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9tdWx0aS1zZWxlY3Qtc2ltcGxlL211bHRpLXNlbGVjdC1zaW1wbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFLTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ3BGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7OztBQTRHakUsTUFBTSxPQUFPLDBCQUEwQjtJQXdCckM7UUFuQlMsa0JBQWEsR0FBVyxNQUFNLENBQUM7UUFDL0Isa0JBQWEsR0FBVyxJQUFJLENBQUM7UUFDN0IsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFMUIsZ0JBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEMsbUJBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVuRCw2QkFBNkI7UUFDN0IsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsbUJBQWMsR0FBYSxFQUFFLENBQUM7UUFDOUIsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsb0JBQWUsR0FBa0IsRUFBRSxDQUFDO1FBQ3BDLHNCQUFpQixHQUFXLEVBQUUsQ0FBQztRQUUvQix1QkFBdUI7UUFDZixhQUFRLEdBQUcsQ0FBQyxNQUFXLEVBQUUsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUMvQixjQUFTLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBRzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWpGLHVDQUF1QztRQUN2QyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxXQUFXO1FBQ1QsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxDQUFDO0lBQ0gsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxVQUFVLENBQUMsS0FBVTtRQUNuQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxFQUFPO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxXQUFvQjtRQUNuQyxrQ0FBa0M7SUFDcEMsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixjQUFjLENBQUMsS0FBWTtRQUN6QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFM0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLGdDQUFnQztZQUNoQyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDbEYsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDZCxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFVO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQW1CO1FBQzlCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFFakQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDNUIsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7UUFDckUsQ0FBQzthQUFNLENBQUM7WUFDTixtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekYsMENBQTBDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBRTdELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsVUFBVSxDQUFDLE1BQW1CO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBYyxFQUFFLE1BQW1CO1FBQzNDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsS0FBWTtRQUNyQyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQ1gsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUN6RCxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFVO1FBQzNCLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDdEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFTyxTQUFTO1FBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsS0FBYTtRQUNwQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ3hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUNyRCxDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLDBCQUEwQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDakUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN2RSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN2RSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7WUFDdkIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sMEJBQTBCLENBQUM7UUFDOUUsQ0FBQztJQUNILENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQztZQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDOytHQXhOVSwwQkFBMEI7bUdBQTFCLDBCQUEwQiw4TEFyRzFCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztnQkFDekQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLG9QQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkZULCtnRkFuR1MsWUFBWSwrUEFBRSxXQUFXLGlvRUFBRSxXQUFXLHNJQUFFLG1CQUFtQjs7NEZBc0cxRCwwQkFBMEI7a0JBekd0QyxTQUFTOytCQUNFLHlCQUF5QixjQUN2QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxhQUMzRDt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwyQkFBMkIsQ0FBQzs0QkFDekQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0YsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJGVDt3REFJc0IsV0FBVztzQkFBakMsU0FBUzt1QkFBQyxVQUFVO2dCQUNHLFlBQVk7c0JBQW5DLFNBQVM7dUJBQUMsV0FBVztnQkFFYixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbmljTW9kdWxlIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgTGFuZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL2xhbmctcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBhcHBseURlZmF1bHRWYWx1ZVRvQ29udHJvbCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC91dGlscy9mb3JtLWRlZmF1bHRzJztcbmltcG9ydCB7IHJlcGxhY2VTcGVjaWFsQ2hhcnMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvdGV4dCc7XG5pbXBvcnQgeyBJbnB1dE1ldGFkYXRhLCBJbnB1dE9wdGlvbiB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLW11bHRpLXNlbGVjdC1zaW1wbGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25pY01vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE11bHRpU2VsZWN0U2ltcGxlQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1zZWxlY3QtY29udGFpbmVyXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKCRldmVudClcIj5cbiAgICAgIDwhLS0gTWFpbiBpbnB1dCBkaXNwbGF5IC0tPlxuICAgICAgPGlvbi1pbnB1dFxuICAgICAgICAjbWFpbklucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgW3ZhbHVlXT1cImRpc3BsYXlWYWx1ZVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wcz8ucGxhY2Vob2xkZXIgfHwgcGxhY2Vob2xkZXJcIlxuICAgICAgICByZWFkb25seVxuICAgICAgICBjbGFzcz1cIm1haW4taW5wdXRcIlxuICAgICAgICBbY2xhc3MuaXMtb3Blbl09XCJpc09wZW5cIlxuICAgICAgLz5cbiAgICAgIFxuICAgICAgPCEtLSBEcm9wZG93biBpY29uIC0tPlxuICAgICAgPGlvbi1pY29uIFxuICAgICAgICBuYW1lPVwiY2hldnJvbi1kb3duLW91dGxpbmVcIiBcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1pY29uXCIgXG4gICAgICAgIFtjbGFzcy5yb3RhdGVkXT1cImlzT3BlblwiXG4gICAgICA+PC9pb24taWNvbj5cbiAgICAgIFxuICAgICAgPCEtLSBIaWRkZW4gaW5wdXQgZm9yIGZvcm0gY29udHJvbCAtLT5cbiAgICAgIDxpb24taW5wdXQgXG4gICAgICAgIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBvcGFjaXR5OiAwOyBwb2ludGVyLWV2ZW50czogbm9uZTtcIiBcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cInByb3BzPy5jb250cm9sXCIgXG4gICAgICAgIHR5cGU9XCJoaWRkZW5cIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRHJvcGRvd24gb3ZlcmxheSAtLT5cbiAgICA8ZGl2IFxuICAgICAgY2xhc3M9XCJkcm9wZG93bi1vdmVybGF5XCIgXG4gICAgICBbY2xhc3MudmlzaWJsZV09XCJpc09wZW5cIlxuICAgICAgI2Ryb3Bkb3duXG4gICAgPlxuICAgICAgPCEtLSBTZWFyY2ggYmFyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1jb250YWluZXJcIj5cbiAgICAgICAgPGlvbi1zZWFyY2hiYXJcbiAgICAgICAgICAjc2VhcmNoYmFyXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAoaW9uSW5wdXQpPVwib25TZWFyY2goJGV2ZW50KVwiXG4gICAgICAgICAgW3ZhbHVlXT1cInNlYXJjaFRlcm1cIlxuICAgICAgICAgIHNob3ctY2xlYXItYnV0dG9uPVwiZm9jdXNcIlxuICAgICAgICA+PC9pb24tc2VhcmNoYmFyPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDwhLS0gQWN0aW9uIGJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgPGlvbi1idXR0b24gXG4gICAgICAgICAgZmlsbD1cImNsZWFyXCIgXG4gICAgICAgICAgc2l6ZT1cInNtYWxsXCIgXG4gICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEFsbCgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgID5cbiAgICAgICAgICBTZWxlY2Npb25hciB0b2Rvc1xuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uIFxuICAgICAgICAgIGZpbGw9XCJjbGVhclwiIFxuICAgICAgICAgIHNpemU9XCJzbWFsbFwiIFxuICAgICAgICAgIGNvbG9yPVwibWVkaXVtXCIgXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyQWxsKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJzZWxlY3RlZFZhbHVlcy5sZW5ndGggPT09IDBcIlxuICAgICAgICA+XG4gICAgICAgICAgTGltcGlhclxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPCEtLSBPcHRpb25zIGxpc3QgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwib3B0aW9ucy1jb250YWluZXJcIj5cbiAgICAgICAgPGlvbi1saXN0IGNsYXNzPVwib3B0aW9ucy1saXN0XCI+XG4gICAgICAgICAgPGlvbi1pdGVtIFxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnM7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFxuICAgICAgICAgICAgYnV0dG9uIFxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU9wdGlvbihvcHRpb24pXCJcbiAgICAgICAgICAgIGNsYXNzPVwib3B0aW9uLWl0ZW1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpb24tY2hlY2tib3hcbiAgICAgICAgICAgICAgc2xvdD1cInN0YXJ0XCJcbiAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNTZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgID48L2lvbi1jaGVja2JveD5cbiAgICAgICAgICAgIDxpb24tbGFiZWw+e3sgb3B0aW9uW2xhYmVsUHJvcGVydHldIH19PC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIE5vIHJlc3VsdHMgbWVzc2FnZSAtLT5cbiAgICAgICAgICA8aW9uLWl0ZW0gKm5nSWY9XCJmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJuby1yZXN1bHRzXCI+XG4gICAgICAgICAgICA8aW9uLWxhYmVsIGNvbG9yPVwibWVkaXVtXCI+XG4gICAgICAgICAgICAgIHt7IHNlYXJjaFRlcm0gPyAnTm8gc2UgZW5jb250cmFyb24gcmVzdWx0YWRvcycgOiAnTm8gaGF5IG9wY2lvbmVzIGRpc3BvbmlibGVzJyB9fVxuICAgICAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICAgICAgPC9pb24taXRlbT5cbiAgICAgICAgPC9pb24tbGlzdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aS1zZWxlY3Qtc2ltcGxlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlTZWxlY3RTaW1wbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duJykgZHJvcGRvd25SZWYhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdtYWluSW5wdXQnKSBtYWluSW5wdXRSZWYhOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIHByb3BzITogSW5wdXRNZXRhZGF0YTtcbiAgQElucHV0KCkgbGFiZWxQcm9wZXJ0eTogc3RyaW5nID0gJ25hbWUnO1xuICBASW5wdXQoKSB2YWx1ZVByb3BlcnR5OiBzdHJpbmcgPSAnaWQnO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBsYW5nU2VydmljZSA9IGluamVjdChMYW5nU2VydmljZSk7XG4gIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3IgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBcbiAgLy8gQ2xhc3NpYyBBbmd1bGFyIHByb3BlcnRpZXNcbiAgaXNPcGVuID0gZmFsc2U7XG4gIHNlYXJjaFRlcm0gPSAnJztcbiAgc2VsZWN0ZWRWYWx1ZXM6IHN0cmluZ1tdID0gW107XG4gIGRpc3BsYXlWYWx1ZSA9ICcnO1xuICBmaWx0ZXJlZE9wdGlvbnM6IElucHV0T3B0aW9uW10gPSBbXTtcbiAgc2VhcmNoUGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoX3ZhbHVlOiBhbnkpID0+IHt9O1xuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB0aGlzLmxhbmdTZXJ2aWNlLmdldFRleHQoJ19nbG9iYWwnLCAnc2VsZWN0T3B0aW9ucycsICdTZWxlY2Npb25lIG9wY2lvbmVzJyk7XG4gICAgdGhpcy5zZWFyY2hQbGFjZWhvbGRlciA9IHRoaXMubGFuZ1NlcnZpY2UuZ2V0VGV4dCgnX2dsb2JhbCcsICdzZWFyY2gnLCAnQnVzY2FyJyk7XG4gICAgXG4gICAgLy8gQ2xvc2UgZHJvcGRvd24gd2hlbiBjbGlja2luZyBvdXRzaWRlXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYXBwbHlEZWZhdWx0VmFsdWUoKTtcbiAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zKCk7XG4gICAgdGhpcy5zeW5jU2VsZWN0ZWRWYWx1ZXMoKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmhhbmRsZUNsaWNrT3V0c2lkZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1sncHJvcHMnXSAmJiB0aGlzLnByb3BzKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zKCk7XG4gICAgICB0aGlzLnN5bmNTZWxlY3RlZFZhbHVlcygpO1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlQXJyYXkgPSB0aGlzLnBhcnNlVmFsdWUodmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMgPSB2YWx1ZUFycmF5O1xuICAgIHRoaXMudXBkYXRlRGlzcGxheVZhbHVlKCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoX2lzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBIYW5kbGUgZGlzYWJsZWQgc3RhdGUgaWYgbmVlZGVkXG4gIH1cblxuICAvLyBDb21wb25lbnQgbWV0aG9kc1xuICB0b2dnbGVEcm9wZG93bihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmlzT3BlbiA9ICF0aGlzLmlzT3BlbjtcbiAgICBcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAvLyBGb2N1cyBzZWFyY2ggYmFyIHdoZW4gb3BlbmluZ1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaGJhciA9IHRoaXMuZHJvcGRvd25SZWY/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoJ2lvbi1zZWFyY2hiYXInKTtcbiAgICAgICAgaWYgKHNlYXJjaGJhcikge1xuICAgICAgICAgIHNlYXJjaGJhci5zZXRGb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSBldmVudC5kZXRhaWwudmFsdWUgfHwgJyc7XG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XG4gIH1cblxuICB0b2dnbGVPcHRpb24ob3B0aW9uOiBJbnB1dE9wdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gU3RyaW5nKG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldKTtcbiAgICBcbiAgICBpZiAodGhpcy5pc1NlbGVjdGVkKG9wdGlvbikpIHtcbiAgICAgIC8vIFJlbW92ZSBmcm9tIHNlbGVjdGlvblxuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcyA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgdG8gc2VsZWN0aW9uXG4gICAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gWy4uLnRoaXMuc2VsZWN0ZWRWYWx1ZXMsIHZhbHVlXTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICB9XG5cbiAgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIGNvbnN0IGFsbFZhbHVlcyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zLm1hcChvcHRpb24gPT4gU3RyaW5nKG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldKSk7XG4gICAgXG4gICAgLy8gQWRkIG9ubHkgbmV3IHZhbHVlcyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgY29uc3QgbmV3VmFsdWVzID0gYWxsVmFsdWVzLmZpbHRlcih2YWx1ZSA9PiAhdGhpcy5zZWxlY3RlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMgPSBbLi4udGhpcy5zZWxlY3RlZFZhbHVlcywgLi4ubmV3VmFsdWVzXTtcbiAgICBcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSgpO1xuICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gIH1cblxuICBjbGVhckFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkVmFsdWVzID0gW107XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5VmFsdWUoKTtcbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICB9XG5cbiAgaXNTZWxlY3RlZChvcHRpb246IElucHV0T3B0aW9uKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRWYWx1ZXMuaW5jbHVkZXMoU3RyaW5nKG9wdGlvblt0aGlzLnZhbHVlUHJvcGVydHldKSk7XG4gIH1cblxuICB0cmFja0J5Rm4oX2luZGV4OiBudW1iZXIsIG9wdGlvbjogSW5wdXRPcHRpb24pOiBhbnkge1xuICAgIHJldHVybiBvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2xpY2tPdXRzaWRlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT3BlbiAmJiBcbiAgICAgICAgIXRoaXMubWFpbklucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAgICF0aGlzLmRyb3Bkb3duUmVmPy5uYXRpdmVFbGVtZW50Py5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLm1hcCh2ID0+IFN0cmluZyh2KSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcCh2ID0+IHYudHJpbSgpKS5maWx0ZXIodiA9PiB2ICE9PSAnJyk7XG4gICAgfVxuICAgIHJldHVybiBbU3RyaW5nKHZhbHVlKV07XG4gIH1cblxuICBwcml2YXRlIGVtaXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMuam9pbignLCcpO1xuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgIFxuICAgIGlmICh0aGlzLnByb3BzPy5jb250cm9sKSB7XG4gICAgICB0aGlzLnByb3BzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgdGhpcy5wcm9wcy5jb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLnByb3BzLmNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3B0aW9uQnlWYWx1ZSh2YWx1ZTogc3RyaW5nKTogSW5wdXRPcHRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maW5kKG9wdGlvbiA9PiBcbiAgICAgIFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSkgPT09IFN0cmluZyh2YWx1ZSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9wcykge1xuICAgICAgYXBwbHlEZWZhdWx0VmFsdWVUb0NvbnRyb2wodGhpcy5wcm9wcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplT3B0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9IHRoaXMucHJvcHM/Lm9wdGlvbnMgfHwgW107XG4gIH1cbiAgXG4gIHByaXZhdGUgZmlsdGVyT3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoVGVybSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBzZWFyY2ggPSByZXBsYWNlU3BlY2lhbENoYXJzKHRoaXMuc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKTtcbiAgICB0aGlzLmZpbHRlcmVkT3B0aW9ucyA9ICh0aGlzLnByb3BzPy5vcHRpb25zIHx8IFtdKS5maWx0ZXIob3B0aW9uID0+IHtcbiAgICAgIGNvbnN0IGxhYmVsID0gb3B0aW9uW3RoaXMubGFiZWxQcm9wZXJ0eV1cbiAgICAgICAgPyByZXBsYWNlU3BlY2lhbENoYXJzKFN0cmluZyhvcHRpb25bdGhpcy5sYWJlbFByb3BlcnR5XSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uW3RoaXMudmFsdWVQcm9wZXJ0eV1cbiAgICAgICAgPyByZXBsYWNlU3BlY2lhbENoYXJzKFN0cmluZyhvcHRpb25bdGhpcy52YWx1ZVByb3BlcnR5XSkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgOiAnJztcbiAgICAgIHJldHVybiBsYWJlbC5pbmNsdWRlcyhzZWFyY2gpIHx8IHZhbHVlLmluY2x1ZGVzKHNlYXJjaCk7XG4gICAgfSk7XG4gIH1cbiAgXG4gIHByaXZhdGUgdXBkYXRlRGlzcGxheVZhbHVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuZ2V0T3B0aW9uQnlWYWx1ZSh0aGlzLnNlbGVjdGVkVmFsdWVzWzBdKTtcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlID0gb3B0aW9uID8gb3B0aW9uW3RoaXMubGFiZWxQcm9wZXJ0eV0gOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSBgJHt0aGlzLnNlbGVjdGVkVmFsdWVzLmxlbmd0aH0gZWxlbWVudG9zIHNlbGVjY2lvbmFkb3NgO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY1NlbGVjdGVkVmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnByb3BzPy5jb250cm9sPy52YWx1ZSkge1xuICAgICAgY29uc3QgdmFsdWVBcnJheSA9IHRoaXMucGFyc2VWYWx1ZSh0aGlzLnByb3BzLmNvbnRyb2wudmFsdWUpO1xuICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlcyA9IHZhbHVlQXJyYXk7XG4gICAgfVxuICB9XG59Il19
|