@huntsman-cancer-institute/input 16.0.1 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/date/date-base.d.ts +65 -65
- package/date/date-date-range.component.d.ts +32 -32
- package/date/date-date.component.d.ts +53 -53
- package/date/date-validator.d.ts +17 -17
- package/date/date.module.d.ts +16 -16
- package/dropdown/dropdown-index.d.ts +6 -6
- package/dropdown/dropdown-select-result.component.d.ts +23 -23
- package/dropdown/dropdown-select.component.d.ts +76 -76
- package/dropdown/dropdown.component.d.ts +40 -40
- package/dropdown/dropdown.module.d.ts +13 -13
- package/dropdown/dropdown.service.d.ts +51 -51
- package/dropdown/messages.d.ts +11 -11
- package/dropdown/select-item.d.ts +16 -16
- package/dropdown/template-dropdown.directive.d.ts +12 -12
- package/esm2022/date/date-base.mjs +114 -114
- package/esm2022/date/date-date-range.component.mjs +92 -92
- package/esm2022/date/date-date.component.mjs +189 -189
- package/esm2022/date/date-validator.mjs +40 -40
- package/esm2022/date/date.module.mjs +60 -60
- package/esm2022/dropdown/dropdown-index.mjs +5 -5
- package/esm2022/dropdown/dropdown-select-result.component.mjs +85 -85
- package/esm2022/dropdown/dropdown-select.component.mjs +360 -360
- package/esm2022/dropdown/dropdown.component.mjs +170 -170
- package/esm2022/dropdown/dropdown.module.mjs +50 -50
- package/esm2022/dropdown/dropdown.service.mjs +133 -133
- package/esm2022/dropdown/messages.mjs +9 -9
- package/esm2022/dropdown/select-item.mjs +11 -11
- package/esm2022/dropdown/template-dropdown.directive.mjs +26 -26
- package/esm2022/huntsman-cancer-institute-input.mjs +4 -4
- package/esm2022/index.mjs +19 -19
- package/esm2022/inline/inline.component.mjs +179 -179
- package/esm2022/inline/inline.module.mjs +28 -28
- package/esm2022/search/search.component.mjs +157 -157
- package/esm2022/search/search.module.mjs +32 -32
- package/esm2022/select/custom-combobox.component.mjs +531 -531
- package/esm2022/select/custom-multi-combobox.component.mjs +232 -232
- package/esm2022/select/md-multi-select.component.mjs +127 -127
- package/esm2022/select/md-select.component.mjs +107 -107
- package/esm2022/select/native-select.component.mjs +188 -188
- package/esm2022/select/select.module.mjs +83 -83
- package/fesm2022/huntsman-cancer-institute-input.mjs +2797 -2797
- package/fesm2022/huntsman-cancer-institute-input.mjs.map +1 -1
- package/index.d.ts +20 -20
- package/inline/inline.component.d.ts +66 -66
- package/inline/inline.module.d.ts +9 -9
- package/package.json +15 -7
- package/search/search.component.d.ts +42 -42
- package/search/search.module.d.ts +10 -10
- package/select/custom-combobox.component.d.ts +98 -98
- package/select/custom-multi-combobox.component.d.ts +50 -50
- package/select/md-multi-select.component.d.ts +32 -32
- package/select/md-select.component.d.ts +30 -30
- package/select/native-select.component.d.ts +37 -37
- package/select/select.module.d.ts +21 -21
|
@@ -1,460 +1,460 @@
|
|
|
1
|
-
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostBinding, Injector, Input, Output, ViewChild, ViewEncapsulation } from "@angular/core";
|
|
2
|
-
import { UntypedFormControl, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
|
|
3
|
-
import { combineLatest, Subscription } from "rxjs";
|
|
4
|
-
import { debounceTime } from "rxjs/operators";
|
|
5
|
-
import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling";
|
|
6
|
-
import { MatLegacyAutocompleteTrigger as MatAutocompleteTrigger } from "@angular/material/legacy-autocomplete";
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/common";
|
|
9
|
-
import * as i2 from "@angular/forms";
|
|
10
|
-
import * as i3 from "@angular/material/legacy-form-field";
|
|
11
|
-
import * as i4 from "@angular/material/legacy-core";
|
|
12
|
-
import * as i5 from "@angular/cdk/scrolling";
|
|
13
|
-
import * as i6 from "@angular/material/legacy-autocomplete";
|
|
14
|
-
import * as i7 from "@angular/material/legacy-input";
|
|
15
|
-
import * as i8 from "@angular/material/legacy-tooltip";
|
|
16
|
-
import * as i9 from "@angular/material/legacy-progress-spinner";
|
|
17
|
-
export class CustomComboBoxComponent {
|
|
18
|
-
set customFieldClasses(value) {
|
|
19
|
-
this._customFieldClasses = value ? value : "";
|
|
20
|
-
}
|
|
21
|
-
get customFieldClasses() {
|
|
22
|
-
return !!this._customFieldClasses ? this._customFieldClasses : "mat-form-field-should-float";
|
|
23
|
-
}
|
|
24
|
-
set customOptionClasses(value) {
|
|
25
|
-
this._customOptionClasses = value ? value : "";
|
|
26
|
-
}
|
|
27
|
-
get customOptionClasses() {
|
|
28
|
-
return !!this._customOptionClasses ? this._customOptionClasses : "";
|
|
29
|
-
}
|
|
30
|
-
constructor(cdr, injector) {
|
|
31
|
-
this.cdr = cdr;
|
|
32
|
-
this.injector = injector;
|
|
33
|
-
this.optionSizePx = 25;
|
|
34
|
-
this.numOptionsToShow = 10;
|
|
35
|
-
this.maxOptionsToShow = 10;
|
|
36
|
-
this.customViewportClass = "";
|
|
37
|
-
this.placeholder = "";
|
|
38
|
-
// Removes the placeholder after a selection is made
|
|
39
|
-
this.temporaryPlaceholder = false;
|
|
40
|
-
this.tooltip = "";
|
|
41
|
-
this.allowNone = true;
|
|
42
|
-
this.selectTextOnOpen = true;
|
|
43
|
-
// tell mat-dialog to pass initial focus to the inner input
|
|
44
|
-
this._cdkFocusInitial = null;
|
|
45
|
-
this.cdkFocusInitial = undefined;
|
|
46
|
-
// on tab, skip the host element and focus the input
|
|
47
|
-
this._tabindex = null;
|
|
48
|
-
this.tabindex = 0;
|
|
49
|
-
this.forceShowNone = false;
|
|
50
|
-
this.options = [];
|
|
51
|
-
this.allowLoader = false;
|
|
52
|
-
this.isOpen = false;
|
|
53
|
-
this.loadedOptions = [];
|
|
54
|
-
this.forceEmitObject = false;
|
|
55
|
-
this.appearance = "";
|
|
56
|
-
// Set to empty to not show errors
|
|
57
|
-
this.defineErrors = { required: "This is a required field" };
|
|
58
|
-
this._showLoader = false;
|
|
59
|
-
this._customFieldClasses = "";
|
|
60
|
-
this._customOptionClasses = "";
|
|
61
|
-
this.outerControl = new UntypedFormControl();
|
|
62
|
-
this.innerControl = new UntypedFormControl(null);
|
|
63
|
-
this.ignoreInnerControlChanges = false;
|
|
64
|
-
this.subs = new Subscription();
|
|
65
|
-
this.noNgControl = false;
|
|
66
|
-
this.viewportVisibleRange = {
|
|
67
|
-
start: 0,
|
|
68
|
-
end: this.numOptionsToShow - 1
|
|
69
|
-
};
|
|
70
|
-
this.clickInProgress = false;
|
|
71
|
-
this.optionSelected = new EventEmitter();
|
|
72
|
-
this.optionChanged = new EventEmitter();
|
|
73
|
-
this.optionsLoaded = new EventEmitter();
|
|
74
|
-
this.onChangeFn = () => { };
|
|
75
|
-
this.onTouchedFn = () => { };
|
|
76
|
-
this.displayFn = (opt) => {
|
|
77
|
-
return opt ? (this.displayField ? opt[this.displayField] : opt) : undefined;
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
ngOnInit() {
|
|
81
|
-
this._showLoader = this.allowLoader && (!this.options || this.options.length === 0);
|
|
82
|
-
}
|
|
83
|
-
ngAfterViewInit() {
|
|
84
|
-
let ngControl = this.injector.get(NgControl, null);
|
|
85
|
-
if (ngControl && ngControl.control) {
|
|
86
|
-
this.outerControl = ngControl.control;
|
|
87
|
-
this.innerControl.setValidators(this.outerControl.validator);
|
|
88
|
-
this.innerControl.setAsyncValidators(this.outerControl.asyncValidator);
|
|
89
|
-
this.innerControl.updateValueAndValidity();
|
|
90
|
-
this.cdr.detectChanges();
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
this.noNgControl = true;
|
|
94
|
-
}
|
|
95
|
-
this.subs.add(this.innerControl.valueChanges.pipe(debounceTime(300)).subscribe((_value) => {
|
|
96
|
-
if (this.isOpen && !this.ignoreInnerControlChanges) {
|
|
97
|
-
this.filterOptions();
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
this.ignoreInnerControlChanges = false;
|
|
101
|
-
}
|
|
102
|
-
}));
|
|
103
|
-
// work around for validators not always propagating
|
|
104
|
-
this.subs.add(this.outerControl.statusChanges.subscribe((_event) => {
|
|
105
|
-
this.innerControl.setValidators(this.outerControl.validator);
|
|
106
|
-
this.innerControl.setAsyncValidators(this.outerControl.asyncValidator);
|
|
107
|
-
this.innerControl.updateValueAndValidity();
|
|
108
|
-
this.innerControl.setErrors(this.outerControl.errors);
|
|
109
|
-
if (this.outerControl.touched) {
|
|
110
|
-
this.innerControl.markAsTouched();
|
|
111
|
-
}
|
|
112
|
-
}));
|
|
113
|
-
// this object is used to control the active state when keying up and down
|
|
114
|
-
this.keyManager = this.autoCompleteTrigger.autocomplete._keyManager;
|
|
115
|
-
this.keyManager.withWrap(false);
|
|
116
|
-
this.subs.add(combineLatest([
|
|
117
|
-
this.viewport.renderedRangeStream,
|
|
118
|
-
this.viewport.scrolledIndexChange
|
|
119
|
-
]).subscribe(([renderedRange, scrolledIndex]) => {
|
|
120
|
-
// Instead of loading the whole item list at once, the virtual scroll viewport buffers
|
|
121
|
-
// a range of entries, only a portion of which are within the visible fold
|
|
122
|
-
this.viewportRenderRange = renderedRange;
|
|
123
|
-
// we have to figure out the visible range ourselves
|
|
124
|
-
let len = Math.min(this.loadedOptions.length + (this.allowNone ? 1 : 0), this.numOptionsToShow - 1);
|
|
125
|
-
this.viewportVisibleRange = {
|
|
126
|
-
start: scrolledIndex,
|
|
127
|
-
end: scrolledIndex + len
|
|
128
|
-
};
|
|
129
|
-
}));
|
|
130
|
-
}
|
|
131
|
-
ngOnChanges(changes) {
|
|
132
|
-
if (changes.options) {
|
|
133
|
-
let optionsChange = changes.options;
|
|
134
|
-
if (!optionsChange.currentValue || optionsChange.currentValue.length < 1) {
|
|
135
|
-
this.options = [];
|
|
136
|
-
if (this.innerControl.value != null) {
|
|
137
|
-
//Reset the innerControl value of the dropdown list to an empty array in case of no results are present to be displayed.
|
|
138
|
-
//This flushes out the stale value from the list if there are no results to be displayed.
|
|
139
|
-
this.innerControl.setValue([]);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
let currentOpts = optionsChange.currentValue;
|
|
143
|
-
if (currentOpts && "length" in currentOpts && currentOpts !== optionsChange.previousValue) {
|
|
144
|
-
this._showLoader = false;
|
|
145
|
-
this.optionsLoaded.emit();
|
|
146
|
-
// If number of options is less than our max, reduce size of overlay
|
|
147
|
-
this.numOptionsToShow = Math.min(currentOpts.length + (this.allowNone ? 1 : 0), this.maxOptionsToShow);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
this._showLoader = true;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
setTimeout(() => {
|
|
154
|
-
// The autocomplete will automatically pop open once it has options filtered into it,
|
|
155
|
-
// but we don't want it to on initial page load or when tabbing though
|
|
156
|
-
if (this.isOpen) {
|
|
157
|
-
this.filterOptions();
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
this.loadOnlyCurrentValue(this.outerControl.value);
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
writeValue(obj) {
|
|
165
|
-
this.loadOnlyCurrentValue(obj);
|
|
166
|
-
}
|
|
167
|
-
registerOnChange(fn) {
|
|
168
|
-
this.onChangeFn = fn;
|
|
169
|
-
}
|
|
170
|
-
registerOnTouched(fn) {
|
|
171
|
-
this.onTouchedFn = fn;
|
|
172
|
-
}
|
|
173
|
-
setDisabledState(isDisabled) {
|
|
174
|
-
if (isDisabled) {
|
|
175
|
-
this.innerControl.disable();
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
this.innerControl.enable();
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
getError() {
|
|
182
|
-
for (const error in this.outerControl.errors) {
|
|
183
|
-
if (this.defineErrors && error in this.defineErrors) {
|
|
184
|
-
return this.defineErrors[error];
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
loadOnlyCurrentValue(cntrlVal) {
|
|
189
|
-
if (!this.options || this.options.length < 1) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
let newValue = null;
|
|
193
|
-
if (cntrlVal !== null && cntrlVal !== undefined) {
|
|
194
|
-
let currentlySelected = this.options.find((opt) => {
|
|
195
|
-
let optValue = this.valueField ? opt[this.valueField] : opt;
|
|
196
|
-
if (this.forceEmitObject) {
|
|
197
|
-
let outerValue = cntrlVal ? (this.valueField ? cntrlVal[this.valueField] : cntrlVal) : null;
|
|
198
|
-
if (optValue === outerValue) {
|
|
199
|
-
return true;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
return optValue === cntrlVal;
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
if (currentlySelected) {
|
|
207
|
-
newValue = currentlySelected;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
// prefer to check id if it has one vs straight against it's object identity
|
|
211
|
-
if (this.innerControl.value && newValue != null && this.valueField) {
|
|
212
|
-
if (this.innerControl.value[this.valueField] !== newValue[this.valueField]) {
|
|
213
|
-
this.ignoreInnerControlChanges = true;
|
|
214
|
-
this.innerControl.setValue(newValue);
|
|
215
|
-
this.optionSelected.emit(newValue[this.valueField]);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
else if (this.innerControl.value !== newValue) {
|
|
219
|
-
this.ignoreInnerControlChanges = true;
|
|
220
|
-
this.innerControl.setValue(newValue);
|
|
221
|
-
let nv = newValue ? ((this.valueField && !this.forceEmitObject) ? newValue[this.valueField] : newValue) : null;
|
|
222
|
-
this.optionSelected.emit(nv);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
filterOptions(showAll = false) {
|
|
226
|
-
this.forceShowNone = showAll;
|
|
227
|
-
this.isOpen = true;
|
|
228
|
-
if (!this.options || this.options.length < 1) {
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
if (showAll || !this.innerControl.value) {
|
|
232
|
-
this.loadedOptions = [...this.options];
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
let searchValue = "";
|
|
236
|
-
if (typeof this.innerControl.value === "string") {
|
|
237
|
-
searchValue = this.innerControl.value.toLowerCase();
|
|
238
|
-
}
|
|
239
|
-
else if (this.displayField) {
|
|
240
|
-
searchValue = this.innerControl.value[this.displayField].toLowerCase();
|
|
241
|
-
}
|
|
242
|
-
this.loadedOptions = this.options.filter((opt) => {
|
|
243
|
-
let optDisplay = (this.displayField ? opt[this.displayField] : opt).toLowerCase();
|
|
244
|
-
return optDisplay.includes(searchValue);
|
|
245
|
-
});
|
|
246
|
-
this.forceShowNone = this.loadedOptions.length === 0;
|
|
247
|
-
}
|
|
248
|
-
this.selectedIndex = this.getOptIndex(this.outerControl.value);
|
|
249
|
-
}
|
|
250
|
-
showLoader() {
|
|
251
|
-
return this.allowLoader && this._showLoader;
|
|
252
|
-
}
|
|
253
|
-
open() {
|
|
254
|
-
if (this.innerControl.disabled) {
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
// The autocomplete will only open when options are loaded
|
|
258
|
-
this.filterOptions(true);
|
|
259
|
-
this.autoCompleteTrigger.openPanel();
|
|
260
|
-
}
|
|
261
|
-
close() {
|
|
262
|
-
this.autoCompleteTrigger.closePanel();
|
|
263
|
-
}
|
|
264
|
-
onOpened() {
|
|
265
|
-
this.forceShowNone = true;
|
|
266
|
-
if (this.isOpen) {
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
this.isOpen = true;
|
|
270
|
-
if (this.selectTextOnOpen) {
|
|
271
|
-
this.inputElement.nativeElement.select(); // Highlights text
|
|
272
|
-
}
|
|
273
|
-
if (this.selectedIndex > 0) {
|
|
274
|
-
// make the selected option also the active option
|
|
275
|
-
this.activeValue = this.getOptVal(this.loadedOptions[this.selectedIndex]);
|
|
276
|
-
setTimeout(() => {
|
|
277
|
-
this.scrollToSelectedOption();
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
onClosed() {
|
|
282
|
-
if (!this.isOpen) {
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
285
|
-
this.isOpen = false;
|
|
286
|
-
if (!this.innerControl.value && this.outerControl.value) {
|
|
287
|
-
this.selectOption(null);
|
|
288
|
-
}
|
|
289
|
-
this.loadOnlyCurrentValue(this.outerControl.value);
|
|
290
|
-
// reset the options so the autocomplete won't automatically open on the next tab through
|
|
291
|
-
this.loadedOptions = [];
|
|
292
|
-
}
|
|
293
|
-
startClick() {
|
|
294
|
-
// clicking on certain parts of the mat-field will "flicker" the focus, triggering
|
|
295
|
-
// error validation early. This tracks those internal clicks so they can be ignored
|
|
296
|
-
this.clickInProgress = true;
|
|
297
|
-
}
|
|
298
|
-
endClick() {
|
|
299
|
-
this.clickInProgress = false;
|
|
300
|
-
}
|
|
301
|
-
onClick(event) {
|
|
302
|
-
event.stopPropagation();
|
|
303
|
-
if (!this.isOpen) {
|
|
304
|
-
this.open();
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
toggleOpen(event) {
|
|
308
|
-
event.stopPropagation();
|
|
309
|
-
if (this.isOpen) {
|
|
310
|
-
this.close();
|
|
311
|
-
}
|
|
312
|
-
else {
|
|
313
|
-
this.open();
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
onKey(event) {
|
|
317
|
-
if (event.key === "Tab" || event.key === "Enter") {
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
else {
|
|
321
|
-
if (!this.isOpen) {
|
|
322
|
-
this.open();
|
|
323
|
-
}
|
|
324
|
-
// There is a bug where the cdk a11y KeyManager implementation is not compatible with
|
|
325
|
-
// the MatAutocompleteTrigger, which causes the Drop-down not scroll with keyboard
|
|
326
|
-
// on long option lists.
|
|
327
|
-
//
|
|
328
|
-
// https://github.com/angular/components/issues/16598
|
|
329
|
-
//
|
|
330
|
-
// This work around takes control of the keyboard and manually scrolls and activates
|
|
331
|
-
// the options
|
|
332
|
-
//
|
|
333
|
-
// References:
|
|
334
|
-
// https://github.com/angular/components/blob/master/src/material/autocomplete/autocomplete-trigger.ts
|
|
335
|
-
// https://github.com/angular/components/blob/master/src/cdk/a11y/key-manager/list-key-manager.ts
|
|
336
|
-
// https://github.com/angular/components/blob/master/src/cdk/a11y/key-manager/activedescendant-key-manager.ts
|
|
337
|
-
if (event.key === "ArrowUp" || event.key === "ArrowDown") {
|
|
338
|
-
event.stopPropagation();
|
|
339
|
-
this.initActiveItem();
|
|
340
|
-
this.shiftActiveItem(event.key);
|
|
341
|
-
this.checkActiveBoundaries();
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
// before our keypress binding even triggers, angular has already moved the active selection
|
|
346
|
-
// unsyncing it with our display. this code re-initializes the active option
|
|
347
|
-
initActiveItem() {
|
|
348
|
-
if (this.activeValue === undefined || this.activeValue === null) {
|
|
349
|
-
this.keyManager.setFirstItemActive();
|
|
350
|
-
}
|
|
351
|
-
else {
|
|
352
|
-
let activeIndex = this.getActiveIndex();
|
|
353
|
-
// this does the conversion from an index within all options down to a position within the
|
|
354
|
-
// displayed range, which is all the keymanager is aware of
|
|
355
|
-
let position = activeIndex - this.viewportRenderRange.start;
|
|
356
|
-
this.keyManager.setActiveItem(position);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
shiftActiveItem(key) {
|
|
360
|
-
if (key === "ArrowUp") {
|
|
361
|
-
this.keyManager.setPreviousItemActive();
|
|
362
|
-
}
|
|
363
|
-
else if (key === "ArrowDown") {
|
|
364
|
-
this.keyManager.setNextItemActive();
|
|
365
|
-
}
|
|
366
|
-
if (this.keyManager.activeItem) {
|
|
367
|
-
this.activeValue = this.getOptVal(this.keyManager.activeItem.value);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
// check if the active option index is within the displayed viewport window
|
|
371
|
-
// if not, scroll it into view
|
|
372
|
-
checkActiveBoundaries() {
|
|
373
|
-
let activeIndex = this.getActiveIndex();
|
|
374
|
-
if (activeIndex < this.viewportVisibleRange.start) {
|
|
375
|
-
setTimeout(() => {
|
|
376
|
-
this.viewport.scrollToOffset(activeIndex * this.optionSizePx);
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
else if (activeIndex > this.viewportVisibleRange.end) {
|
|
380
|
-
setTimeout(() => {
|
|
381
|
-
this.viewport.scrollToOffset((activeIndex - (this.numOptionsToShow - 1)) * this.optionSizePx);
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
getActiveIndex() {
|
|
386
|
-
let activeIndex = 0;
|
|
387
|
-
if (this.activeValue !== undefined && this.activeValue !== null) {
|
|
388
|
-
// if we added a none option the returned index would be off by one
|
|
389
|
-
let valIndex = this.getOptIndex(this.activeValue) + (this.allowNone && (this.forceShowNone || !this.innerControl.value) ? 1 : 0);
|
|
390
|
-
// the index should be within the range of our entire buffer, or just allow it to reset
|
|
391
|
-
if (valIndex >= this.viewportRenderRange.start
|
|
392
|
-
&& (!this.viewportRenderRange.end || valIndex <= this.viewportRenderRange.end)) {
|
|
393
|
-
activeIndex = valIndex;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
return activeIndex;
|
|
397
|
-
}
|
|
398
|
-
onFocus() {
|
|
399
|
-
if (!this.isOpen) {
|
|
400
|
-
// Highlights text
|
|
401
|
-
if (this.selectTextOnOpen) {
|
|
402
|
-
this.inputElement.nativeElement.select();
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
onFocusOut() {
|
|
407
|
-
// mark control touched and trigger error validation
|
|
408
|
-
if (!this.clickInProgress) {
|
|
409
|
-
this.close();
|
|
410
|
-
this.onTouchedFn();
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
selectOption(opt) {
|
|
414
|
-
let newVal = this.getOptVal(opt, this.forceEmitObject);
|
|
415
|
-
if (this.noNgControl) {
|
|
416
|
-
this.outerControl.setValue(newVal);
|
|
417
|
-
}
|
|
418
|
-
this.onChangeFn(newVal);
|
|
419
|
-
this.optionSelected.emit(newVal);
|
|
420
|
-
this.optionChanged.emit(newVal);
|
|
421
|
-
}
|
|
422
|
-
scrollToSelectedOption() {
|
|
423
|
-
// scroll to the currently selected option when we open the dropdown
|
|
424
|
-
if (this.selectedIndex > 0) {
|
|
425
|
-
let offsetIndex = this.selectedIndex + (this.allowNone ? 1 : 0); // adjust for None entry
|
|
426
|
-
offsetIndex -= (this.numOptionsToShow / 2) - 1; // calculate middle of viewport
|
|
427
|
-
this.viewport.scrollToOffset(offsetIndex * this.optionSizePx);
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
getOptVal(opt, forceObject = false) {
|
|
431
|
-
if (this.valueField && !forceObject) {
|
|
432
|
-
if (opt !== null && opt !== undefined && typeof opt === "object" && this.valueField in opt) {
|
|
433
|
-
return opt[this.valueField];
|
|
434
|
-
}
|
|
435
|
-
else {
|
|
436
|
-
return undefined;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
return opt;
|
|
440
|
-
}
|
|
441
|
-
getOptIndex(optValue) {
|
|
442
|
-
// find the index for the currently selected option
|
|
443
|
-
if (optValue !== null && optValue !== undefined) {
|
|
444
|
-
return this.loadedOptions.findIndex((option) => {
|
|
445
|
-
return this.getOptVal(option) === optValue;
|
|
446
|
-
});
|
|
447
|
-
}
|
|
448
|
-
return undefined;
|
|
449
|
-
}
|
|
450
|
-
ngOnDestroy() {
|
|
451
|
-
this.subs.unsubscribe();
|
|
452
|
-
}
|
|
453
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
454
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
455
|
-
provide: NG_VALUE_ACCESSOR,
|
|
456
|
-
useExisting: forwardRef(() => CustomComboBoxComponent),
|
|
457
|
-
multi: true,
|
|
1
|
+
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostBinding, Injector, Input, Output, ViewChild, ViewEncapsulation } from "@angular/core";
|
|
2
|
+
import { UntypedFormControl, NG_VALUE_ACCESSOR, NgControl } from "@angular/forms";
|
|
3
|
+
import { combineLatest, Subscription } from "rxjs";
|
|
4
|
+
import { debounceTime } from "rxjs/operators";
|
|
5
|
+
import { CdkVirtualScrollViewport } from "@angular/cdk/scrolling";
|
|
6
|
+
import { MatLegacyAutocompleteTrigger as MatAutocompleteTrigger } from "@angular/material/legacy-autocomplete";
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/common";
|
|
9
|
+
import * as i2 from "@angular/forms";
|
|
10
|
+
import * as i3 from "@angular/material/legacy-form-field";
|
|
11
|
+
import * as i4 from "@angular/material/legacy-core";
|
|
12
|
+
import * as i5 from "@angular/cdk/scrolling";
|
|
13
|
+
import * as i6 from "@angular/material/legacy-autocomplete";
|
|
14
|
+
import * as i7 from "@angular/material/legacy-input";
|
|
15
|
+
import * as i8 from "@angular/material/legacy-tooltip";
|
|
16
|
+
import * as i9 from "@angular/material/legacy-progress-spinner";
|
|
17
|
+
export class CustomComboBoxComponent {
|
|
18
|
+
set customFieldClasses(value) {
|
|
19
|
+
this._customFieldClasses = value ? value : "";
|
|
20
|
+
}
|
|
21
|
+
get customFieldClasses() {
|
|
22
|
+
return !!this._customFieldClasses ? this._customFieldClasses : "mat-form-field-should-float";
|
|
23
|
+
}
|
|
24
|
+
set customOptionClasses(value) {
|
|
25
|
+
this._customOptionClasses = value ? value : "";
|
|
26
|
+
}
|
|
27
|
+
get customOptionClasses() {
|
|
28
|
+
return !!this._customOptionClasses ? this._customOptionClasses : "";
|
|
29
|
+
}
|
|
30
|
+
constructor(cdr, injector) {
|
|
31
|
+
this.cdr = cdr;
|
|
32
|
+
this.injector = injector;
|
|
33
|
+
this.optionSizePx = 25;
|
|
34
|
+
this.numOptionsToShow = 10;
|
|
35
|
+
this.maxOptionsToShow = 10;
|
|
36
|
+
this.customViewportClass = "";
|
|
37
|
+
this.placeholder = "";
|
|
38
|
+
// Removes the placeholder after a selection is made
|
|
39
|
+
this.temporaryPlaceholder = false;
|
|
40
|
+
this.tooltip = "";
|
|
41
|
+
this.allowNone = true;
|
|
42
|
+
this.selectTextOnOpen = true;
|
|
43
|
+
// tell mat-dialog to pass initial focus to the inner input
|
|
44
|
+
this._cdkFocusInitial = null;
|
|
45
|
+
this.cdkFocusInitial = undefined;
|
|
46
|
+
// on tab, skip the host element and focus the input
|
|
47
|
+
this._tabindex = null;
|
|
48
|
+
this.tabindex = 0;
|
|
49
|
+
this.forceShowNone = false;
|
|
50
|
+
this.options = [];
|
|
51
|
+
this.allowLoader = false;
|
|
52
|
+
this.isOpen = false;
|
|
53
|
+
this.loadedOptions = [];
|
|
54
|
+
this.forceEmitObject = false;
|
|
55
|
+
this.appearance = "";
|
|
56
|
+
// Set to empty to not show errors
|
|
57
|
+
this.defineErrors = { required: "This is a required field" };
|
|
58
|
+
this._showLoader = false;
|
|
59
|
+
this._customFieldClasses = "";
|
|
60
|
+
this._customOptionClasses = "";
|
|
61
|
+
this.outerControl = new UntypedFormControl();
|
|
62
|
+
this.innerControl = new UntypedFormControl(null);
|
|
63
|
+
this.ignoreInnerControlChanges = false;
|
|
64
|
+
this.subs = new Subscription();
|
|
65
|
+
this.noNgControl = false;
|
|
66
|
+
this.viewportVisibleRange = {
|
|
67
|
+
start: 0,
|
|
68
|
+
end: this.numOptionsToShow - 1
|
|
69
|
+
};
|
|
70
|
+
this.clickInProgress = false;
|
|
71
|
+
this.optionSelected = new EventEmitter();
|
|
72
|
+
this.optionChanged = new EventEmitter();
|
|
73
|
+
this.optionsLoaded = new EventEmitter();
|
|
74
|
+
this.onChangeFn = () => { };
|
|
75
|
+
this.onTouchedFn = () => { };
|
|
76
|
+
this.displayFn = (opt) => {
|
|
77
|
+
return opt ? (this.displayField ? opt[this.displayField] : opt) : undefined;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
ngOnInit() {
|
|
81
|
+
this._showLoader = this.allowLoader && (!this.options || this.options.length === 0);
|
|
82
|
+
}
|
|
83
|
+
ngAfterViewInit() {
|
|
84
|
+
let ngControl = this.injector.get(NgControl, null);
|
|
85
|
+
if (ngControl && ngControl.control) {
|
|
86
|
+
this.outerControl = ngControl.control;
|
|
87
|
+
this.innerControl.setValidators(this.outerControl.validator);
|
|
88
|
+
this.innerControl.setAsyncValidators(this.outerControl.asyncValidator);
|
|
89
|
+
this.innerControl.updateValueAndValidity();
|
|
90
|
+
this.cdr.detectChanges();
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.noNgControl = true;
|
|
94
|
+
}
|
|
95
|
+
this.subs.add(this.innerControl.valueChanges.pipe(debounceTime(300)).subscribe((_value) => {
|
|
96
|
+
if (this.isOpen && !this.ignoreInnerControlChanges) {
|
|
97
|
+
this.filterOptions();
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
this.ignoreInnerControlChanges = false;
|
|
101
|
+
}
|
|
102
|
+
}));
|
|
103
|
+
// work around for validators not always propagating
|
|
104
|
+
this.subs.add(this.outerControl.statusChanges.subscribe((_event) => {
|
|
105
|
+
this.innerControl.setValidators(this.outerControl.validator);
|
|
106
|
+
this.innerControl.setAsyncValidators(this.outerControl.asyncValidator);
|
|
107
|
+
this.innerControl.updateValueAndValidity();
|
|
108
|
+
this.innerControl.setErrors(this.outerControl.errors);
|
|
109
|
+
if (this.outerControl.touched) {
|
|
110
|
+
this.innerControl.markAsTouched();
|
|
111
|
+
}
|
|
112
|
+
}));
|
|
113
|
+
// this object is used to control the active state when keying up and down
|
|
114
|
+
this.keyManager = this.autoCompleteTrigger.autocomplete._keyManager;
|
|
115
|
+
this.keyManager.withWrap(false);
|
|
116
|
+
this.subs.add(combineLatest([
|
|
117
|
+
this.viewport.renderedRangeStream,
|
|
118
|
+
this.viewport.scrolledIndexChange
|
|
119
|
+
]).subscribe(([renderedRange, scrolledIndex]) => {
|
|
120
|
+
// Instead of loading the whole item list at once, the virtual scroll viewport buffers
|
|
121
|
+
// a range of entries, only a portion of which are within the visible fold
|
|
122
|
+
this.viewportRenderRange = renderedRange;
|
|
123
|
+
// we have to figure out the visible range ourselves
|
|
124
|
+
let len = Math.min(this.loadedOptions.length + (this.allowNone ? 1 : 0), this.numOptionsToShow - 1);
|
|
125
|
+
this.viewportVisibleRange = {
|
|
126
|
+
start: scrolledIndex,
|
|
127
|
+
end: scrolledIndex + len
|
|
128
|
+
};
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
ngOnChanges(changes) {
|
|
132
|
+
if (changes.options) {
|
|
133
|
+
let optionsChange = changes.options;
|
|
134
|
+
if (!optionsChange.currentValue || optionsChange.currentValue.length < 1) {
|
|
135
|
+
this.options = [];
|
|
136
|
+
if (this.innerControl.value != null) {
|
|
137
|
+
//Reset the innerControl value of the dropdown list to an empty array in case of no results are present to be displayed.
|
|
138
|
+
//This flushes out the stale value from the list if there are no results to be displayed.
|
|
139
|
+
this.innerControl.setValue([]);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
let currentOpts = optionsChange.currentValue;
|
|
143
|
+
if (currentOpts && "length" in currentOpts && currentOpts !== optionsChange.previousValue) {
|
|
144
|
+
this._showLoader = false;
|
|
145
|
+
this.optionsLoaded.emit();
|
|
146
|
+
// If number of options is less than our max, reduce size of overlay
|
|
147
|
+
this.numOptionsToShow = Math.min(currentOpts.length + (this.allowNone ? 1 : 0), this.maxOptionsToShow);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
this._showLoader = true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
setTimeout(() => {
|
|
154
|
+
// The autocomplete will automatically pop open once it has options filtered into it,
|
|
155
|
+
// but we don't want it to on initial page load or when tabbing though
|
|
156
|
+
if (this.isOpen) {
|
|
157
|
+
this.filterOptions();
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
this.loadOnlyCurrentValue(this.outerControl.value);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
writeValue(obj) {
|
|
165
|
+
this.loadOnlyCurrentValue(obj);
|
|
166
|
+
}
|
|
167
|
+
registerOnChange(fn) {
|
|
168
|
+
this.onChangeFn = fn;
|
|
169
|
+
}
|
|
170
|
+
registerOnTouched(fn) {
|
|
171
|
+
this.onTouchedFn = fn;
|
|
172
|
+
}
|
|
173
|
+
setDisabledState(isDisabled) {
|
|
174
|
+
if (isDisabled) {
|
|
175
|
+
this.innerControl.disable();
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
this.innerControl.enable();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
getError() {
|
|
182
|
+
for (const error in this.outerControl.errors) {
|
|
183
|
+
if (this.defineErrors && error in this.defineErrors) {
|
|
184
|
+
return this.defineErrors[error];
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
loadOnlyCurrentValue(cntrlVal) {
|
|
189
|
+
if (!this.options || this.options.length < 1) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
let newValue = null;
|
|
193
|
+
if (cntrlVal !== null && cntrlVal !== undefined) {
|
|
194
|
+
let currentlySelected = this.options.find((opt) => {
|
|
195
|
+
let optValue = this.valueField ? opt[this.valueField] : opt;
|
|
196
|
+
if (this.forceEmitObject) {
|
|
197
|
+
let outerValue = cntrlVal ? (this.valueField ? cntrlVal[this.valueField] : cntrlVal) : null;
|
|
198
|
+
if (optValue === outerValue) {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
return optValue === cntrlVal;
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
if (currentlySelected) {
|
|
207
|
+
newValue = currentlySelected;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// prefer to check id if it has one vs straight against it's object identity
|
|
211
|
+
if (this.innerControl.value && newValue != null && this.valueField) {
|
|
212
|
+
if (this.innerControl.value[this.valueField] !== newValue[this.valueField]) {
|
|
213
|
+
this.ignoreInnerControlChanges = true;
|
|
214
|
+
this.innerControl.setValue(newValue);
|
|
215
|
+
this.optionSelected.emit(newValue[this.valueField]);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
else if (this.innerControl.value !== newValue) {
|
|
219
|
+
this.ignoreInnerControlChanges = true;
|
|
220
|
+
this.innerControl.setValue(newValue);
|
|
221
|
+
let nv = newValue ? ((this.valueField && !this.forceEmitObject) ? newValue[this.valueField] : newValue) : null;
|
|
222
|
+
this.optionSelected.emit(nv);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
filterOptions(showAll = false) {
|
|
226
|
+
this.forceShowNone = showAll;
|
|
227
|
+
this.isOpen = true;
|
|
228
|
+
if (!this.options || this.options.length < 1) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (showAll || !this.innerControl.value) {
|
|
232
|
+
this.loadedOptions = [...this.options];
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
let searchValue = "";
|
|
236
|
+
if (typeof this.innerControl.value === "string") {
|
|
237
|
+
searchValue = this.innerControl.value.toLowerCase();
|
|
238
|
+
}
|
|
239
|
+
else if (this.displayField) {
|
|
240
|
+
searchValue = this.innerControl.value[this.displayField].toLowerCase();
|
|
241
|
+
}
|
|
242
|
+
this.loadedOptions = this.options.filter((opt) => {
|
|
243
|
+
let optDisplay = (this.displayField ? opt[this.displayField] : opt).toLowerCase();
|
|
244
|
+
return optDisplay.includes(searchValue);
|
|
245
|
+
});
|
|
246
|
+
this.forceShowNone = this.loadedOptions.length === 0;
|
|
247
|
+
}
|
|
248
|
+
this.selectedIndex = this.getOptIndex(this.outerControl.value);
|
|
249
|
+
}
|
|
250
|
+
showLoader() {
|
|
251
|
+
return this.allowLoader && this._showLoader;
|
|
252
|
+
}
|
|
253
|
+
open() {
|
|
254
|
+
if (this.innerControl.disabled) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
// The autocomplete will only open when options are loaded
|
|
258
|
+
this.filterOptions(true);
|
|
259
|
+
this.autoCompleteTrigger.openPanel();
|
|
260
|
+
}
|
|
261
|
+
close() {
|
|
262
|
+
this.autoCompleteTrigger.closePanel();
|
|
263
|
+
}
|
|
264
|
+
onOpened() {
|
|
265
|
+
this.forceShowNone = true;
|
|
266
|
+
if (this.isOpen) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
this.isOpen = true;
|
|
270
|
+
if (this.selectTextOnOpen) {
|
|
271
|
+
this.inputElement.nativeElement.select(); // Highlights text
|
|
272
|
+
}
|
|
273
|
+
if (this.selectedIndex > 0) {
|
|
274
|
+
// make the selected option also the active option
|
|
275
|
+
this.activeValue = this.getOptVal(this.loadedOptions[this.selectedIndex]);
|
|
276
|
+
setTimeout(() => {
|
|
277
|
+
this.scrollToSelectedOption();
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
onClosed() {
|
|
282
|
+
if (!this.isOpen) {
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
this.isOpen = false;
|
|
286
|
+
if (!this.innerControl.value && this.outerControl.value) {
|
|
287
|
+
this.selectOption(null);
|
|
288
|
+
}
|
|
289
|
+
this.loadOnlyCurrentValue(this.outerControl.value);
|
|
290
|
+
// reset the options so the autocomplete won't automatically open on the next tab through
|
|
291
|
+
this.loadedOptions = [];
|
|
292
|
+
}
|
|
293
|
+
startClick() {
|
|
294
|
+
// clicking on certain parts of the mat-field will "flicker" the focus, triggering
|
|
295
|
+
// error validation early. This tracks those internal clicks so they can be ignored
|
|
296
|
+
this.clickInProgress = true;
|
|
297
|
+
}
|
|
298
|
+
endClick() {
|
|
299
|
+
this.clickInProgress = false;
|
|
300
|
+
}
|
|
301
|
+
onClick(event) {
|
|
302
|
+
event.stopPropagation();
|
|
303
|
+
if (!this.isOpen) {
|
|
304
|
+
this.open();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
toggleOpen(event) {
|
|
308
|
+
event.stopPropagation();
|
|
309
|
+
if (this.isOpen) {
|
|
310
|
+
this.close();
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
this.open();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
onKey(event) {
|
|
317
|
+
if (event.key === "Tab" || event.key === "Enter") {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
if (!this.isOpen) {
|
|
322
|
+
this.open();
|
|
323
|
+
}
|
|
324
|
+
// There is a bug where the cdk a11y KeyManager implementation is not compatible with
|
|
325
|
+
// the MatAutocompleteTrigger, which causes the Drop-down not scroll with keyboard
|
|
326
|
+
// on long option lists.
|
|
327
|
+
//
|
|
328
|
+
// https://github.com/angular/components/issues/16598
|
|
329
|
+
//
|
|
330
|
+
// This work around takes control of the keyboard and manually scrolls and activates
|
|
331
|
+
// the options
|
|
332
|
+
//
|
|
333
|
+
// References:
|
|
334
|
+
// https://github.com/angular/components/blob/master/src/material/autocomplete/autocomplete-trigger.ts
|
|
335
|
+
// https://github.com/angular/components/blob/master/src/cdk/a11y/key-manager/list-key-manager.ts
|
|
336
|
+
// https://github.com/angular/components/blob/master/src/cdk/a11y/key-manager/activedescendant-key-manager.ts
|
|
337
|
+
if (event.key === "ArrowUp" || event.key === "ArrowDown") {
|
|
338
|
+
event.stopPropagation();
|
|
339
|
+
this.initActiveItem();
|
|
340
|
+
this.shiftActiveItem(event.key);
|
|
341
|
+
this.checkActiveBoundaries();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// before our keypress binding even triggers, angular has already moved the active selection
|
|
346
|
+
// unsyncing it with our display. this code re-initializes the active option
|
|
347
|
+
initActiveItem() {
|
|
348
|
+
if (this.activeValue === undefined || this.activeValue === null) {
|
|
349
|
+
this.keyManager.setFirstItemActive();
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
let activeIndex = this.getActiveIndex();
|
|
353
|
+
// this does the conversion from an index within all options down to a position within the
|
|
354
|
+
// displayed range, which is all the keymanager is aware of
|
|
355
|
+
let position = activeIndex - this.viewportRenderRange.start;
|
|
356
|
+
this.keyManager.setActiveItem(position);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
shiftActiveItem(key) {
|
|
360
|
+
if (key === "ArrowUp") {
|
|
361
|
+
this.keyManager.setPreviousItemActive();
|
|
362
|
+
}
|
|
363
|
+
else if (key === "ArrowDown") {
|
|
364
|
+
this.keyManager.setNextItemActive();
|
|
365
|
+
}
|
|
366
|
+
if (this.keyManager.activeItem) {
|
|
367
|
+
this.activeValue = this.getOptVal(this.keyManager.activeItem.value);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// check if the active option index is within the displayed viewport window
|
|
371
|
+
// if not, scroll it into view
|
|
372
|
+
checkActiveBoundaries() {
|
|
373
|
+
let activeIndex = this.getActiveIndex();
|
|
374
|
+
if (activeIndex < this.viewportVisibleRange.start) {
|
|
375
|
+
setTimeout(() => {
|
|
376
|
+
this.viewport.scrollToOffset(activeIndex * this.optionSizePx);
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
else if (activeIndex > this.viewportVisibleRange.end) {
|
|
380
|
+
setTimeout(() => {
|
|
381
|
+
this.viewport.scrollToOffset((activeIndex - (this.numOptionsToShow - 1)) * this.optionSizePx);
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
getActiveIndex() {
|
|
386
|
+
let activeIndex = 0;
|
|
387
|
+
if (this.activeValue !== undefined && this.activeValue !== null) {
|
|
388
|
+
// if we added a none option the returned index would be off by one
|
|
389
|
+
let valIndex = this.getOptIndex(this.activeValue) + (this.allowNone && (this.forceShowNone || !this.innerControl.value) ? 1 : 0);
|
|
390
|
+
// the index should be within the range of our entire buffer, or just allow it to reset
|
|
391
|
+
if (valIndex >= this.viewportRenderRange.start
|
|
392
|
+
&& (!this.viewportRenderRange.end || valIndex <= this.viewportRenderRange.end)) {
|
|
393
|
+
activeIndex = valIndex;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return activeIndex;
|
|
397
|
+
}
|
|
398
|
+
onFocus() {
|
|
399
|
+
if (!this.isOpen) {
|
|
400
|
+
// Highlights text
|
|
401
|
+
if (this.selectTextOnOpen) {
|
|
402
|
+
this.inputElement.nativeElement.select();
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
onFocusOut() {
|
|
407
|
+
// mark control touched and trigger error validation
|
|
408
|
+
if (!this.clickInProgress) {
|
|
409
|
+
this.close();
|
|
410
|
+
this.onTouchedFn();
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
selectOption(opt) {
|
|
414
|
+
let newVal = this.getOptVal(opt, this.forceEmitObject);
|
|
415
|
+
if (this.noNgControl) {
|
|
416
|
+
this.outerControl.setValue(newVal);
|
|
417
|
+
}
|
|
418
|
+
this.onChangeFn(newVal);
|
|
419
|
+
this.optionSelected.emit(newVal);
|
|
420
|
+
this.optionChanged.emit(newVal);
|
|
421
|
+
}
|
|
422
|
+
scrollToSelectedOption() {
|
|
423
|
+
// scroll to the currently selected option when we open the dropdown
|
|
424
|
+
if (this.selectedIndex > 0) {
|
|
425
|
+
let offsetIndex = this.selectedIndex + (this.allowNone ? 1 : 0); // adjust for None entry
|
|
426
|
+
offsetIndex -= (this.numOptionsToShow / 2) - 1; // calculate middle of viewport
|
|
427
|
+
this.viewport.scrollToOffset(offsetIndex * this.optionSizePx);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
getOptVal(opt, forceObject = false) {
|
|
431
|
+
if (this.valueField && !forceObject) {
|
|
432
|
+
if (opt !== null && opt !== undefined && typeof opt === "object" && this.valueField in opt) {
|
|
433
|
+
return opt[this.valueField];
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
return undefined;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return opt;
|
|
440
|
+
}
|
|
441
|
+
getOptIndex(optValue) {
|
|
442
|
+
// find the index for the currently selected option
|
|
443
|
+
if (optValue !== null && optValue !== undefined) {
|
|
444
|
+
return this.loadedOptions.findIndex((option) => {
|
|
445
|
+
return this.getOptVal(option) === optValue;
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
return undefined;
|
|
449
|
+
}
|
|
450
|
+
ngOnDestroy() {
|
|
451
|
+
this.subs.unsubscribe();
|
|
452
|
+
}
|
|
453
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomComboBoxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
454
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: CustomComboBoxComponent, selector: "hci-combobox", inputs: { maxOptionsToShow: "maxOptionsToShow", customViewportClass: "customViewportClass", customFieldClasses: "customFieldClasses", customOptionClasses: "customOptionClasses", label: "label", placeholder: "placeholder", temporaryPlaceholder: "temporaryPlaceholder", tooltip: "tooltip", allowNone: "allowNone", selectTextOnOpen: "selectTextOnOpen", cdkFocusInitial: "cdkFocusInitial", tabindex: "tabindex", options: "options", allowLoader: "allowLoader", valueField: "valueField", forceEmitObject: "forceEmitObject", displayField: "displayField", appearance: "appearance", floatLabel: "floatLabel", defineErrors: "defineErrors" }, outputs: { optionSelected: "optionSelected", optionChanged: "optionChanged", optionsLoaded: "optionsLoaded" }, host: { properties: { "attr.cdkFocusInitial": "this._cdkFocusInitial", "attr.tabindex": "this._tabindex" }, classAttribute: "hci-combobox-container" }, providers: [{
|
|
455
|
+
provide: NG_VALUE_ACCESSOR,
|
|
456
|
+
useExisting: forwardRef(() => CustomComboBoxComponent),
|
|
457
|
+
multi: true,
|
|
458
458
|
}], viewQueries: [{ propertyName: "viewport", first: true, predicate: ["viewport"], descendants: true, static: true }, { propertyName: "inputElement", first: true, predicate: ["input"], descendants: true, static: true }, { propertyName: "autoCompleteTrigger", first: true, predicate: ["input"], descendants: true, read: MatAutocompleteTrigger }], usesOnChanges: true, ngImport: i0, template: `
|
|
459
459
|
<mat-form-field (click)="onClick($event)"
|
|
460
460
|
(mousedown)="startClick()"
|
|
@@ -529,10 +529,10 @@ export class CustomComboBoxComponent {
|
|
|
529
529
|
</mat-error>
|
|
530
530
|
<ng-content></ng-content>
|
|
531
531
|
</mat-form-field>
|
|
532
|
-
`, isInline: true, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i3.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "component", type: i4.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i8.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
533
|
-
}
|
|
534
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
535
|
-
type: Component,
|
|
532
|
+
`, isInline: true, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.MatLegacyError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i3.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatLegacySuffix, selector: "[matSuffix]" }, { kind: "component", type: i4.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i5.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i5.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i5.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: i6.MatLegacyAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i6.MatLegacyAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i7.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i8.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
533
|
+
}
|
|
534
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CustomComboBoxComponent, decorators: [{
|
|
535
|
+
type: Component,
|
|
536
536
|
args: [{ selector: "hci-combobox", template: `
|
|
537
537
|
<mat-form-field (click)="onClick($event)"
|
|
538
538
|
(mousedown)="startClick()"
|
|
@@ -607,73 +607,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
607
607
|
</mat-error>
|
|
608
608
|
<ng-content></ng-content>
|
|
609
609
|
</mat-form-field>
|
|
610
|
-
`, providers: [{
|
|
611
|
-
provide: NG_VALUE_ACCESSOR,
|
|
612
|
-
useExisting: forwardRef(() => CustomComboBoxComponent),
|
|
613
|
-
multi: true,
|
|
614
|
-
}], host: {
|
|
615
|
-
class: "hci-combobox-container"
|
|
616
|
-
}, encapsulation: ViewEncapsulation.None, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"] }]
|
|
617
|
-
}], ctorParameters:
|
|
618
|
-
type: Input
|
|
619
|
-
}], customViewportClass: [{
|
|
620
|
-
type: Input
|
|
621
|
-
}], customFieldClasses: [{
|
|
622
|
-
type: Input
|
|
623
|
-
}], customOptionClasses: [{
|
|
624
|
-
type: Input
|
|
625
|
-
}], label: [{
|
|
626
|
-
type: Input
|
|
627
|
-
}], placeholder: [{
|
|
628
|
-
type: Input
|
|
629
|
-
}], temporaryPlaceholder: [{
|
|
630
|
-
type: Input
|
|
631
|
-
}], tooltip: [{
|
|
632
|
-
type: Input
|
|
633
|
-
}], allowNone: [{
|
|
634
|
-
type: Input
|
|
635
|
-
}], selectTextOnOpen: [{
|
|
636
|
-
type: Input
|
|
637
|
-
}], _cdkFocusInitial: [{
|
|
638
|
-
type: HostBinding,
|
|
639
|
-
args: ["attr.cdkFocusInitial"]
|
|
640
|
-
}], cdkFocusInitial: [{
|
|
641
|
-
type: Input
|
|
642
|
-
}], _tabindex: [{
|
|
643
|
-
type: HostBinding,
|
|
644
|
-
args: ["attr.tabindex"]
|
|
645
|
-
}], tabindex: [{
|
|
646
|
-
type: Input
|
|
647
|
-
}], options: [{
|
|
648
|
-
type: Input
|
|
649
|
-
}], allowLoader: [{
|
|
650
|
-
type: Input
|
|
651
|
-
}], valueField: [{
|
|
652
|
-
type: Input
|
|
653
|
-
}], forceEmitObject: [{
|
|
654
|
-
type: Input
|
|
655
|
-
}], displayField: [{
|
|
656
|
-
type: Input
|
|
657
|
-
}], appearance: [{
|
|
658
|
-
type: Input
|
|
659
|
-
}], floatLabel: [{
|
|
660
|
-
type: Input
|
|
661
|
-
}], defineErrors: [{
|
|
662
|
-
type: Input
|
|
663
|
-
}], optionSelected: [{
|
|
664
|
-
type: Output
|
|
665
|
-
}], optionChanged: [{
|
|
666
|
-
type: Output
|
|
667
|
-
}], optionsLoaded: [{
|
|
668
|
-
type: Output
|
|
669
|
-
}], viewport: [{
|
|
670
|
-
type: ViewChild,
|
|
671
|
-
args: ["viewport", { static: true }]
|
|
672
|
-
}], inputElement: [{
|
|
673
|
-
type: ViewChild,
|
|
674
|
-
args: ["input", { static: true }]
|
|
675
|
-
}], autoCompleteTrigger: [{
|
|
676
|
-
type: ViewChild,
|
|
677
|
-
args: ["input", { read: MatAutocompleteTrigger, static: false }]
|
|
678
|
-
}] } });
|
|
679
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9zZWxlY3QvY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZILE9BQU8sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsNEJBQTRCLElBQUksc0JBQXNCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7Ozs7Ozs7QUF5STdHLE1BQU0sT0FBTyx1QkFBdUI7SUFVbEMsSUFDVyxrQkFBa0IsQ0FBQyxLQUFhO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUM7SUFDL0YsQ0FBQztJQUVELElBQ1csbUJBQW1CLENBQUMsS0FBYTtRQUMxQyxJQUFJLENBQUMs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QixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBeUJJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUdQLFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUlyQyxZQUFZO3NCQURYLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFJbEMsbUJBQW1CO3NCQURsQixTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEluamVjdG9yLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZSxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3RW5jYXBzdWxhdGlvblxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVW50eXBlZEZvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUiwgTmdDb250cm9sfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7ZGVib3VuY2VUaW1lfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHtDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnR9IGZyb20gXCJAYW5ndWxhci9jZGsvc2Nyb2xsaW5nXCI7XHJcbmltcG9ydCB7TWF0TGVnYWN5QXV0b2NvbXBsZXRlVHJpZ2dlciBhcyBNYXRBdXRvY29tcGxldGVUcmlnZ2VyfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWF1dG9jb21wbGV0ZVwiO1xyXG5pbXBvcnQge0xpc3RSYW5nZX0gZnJvbSBcIkBhbmd1bGFyL2Nkay9jb2xsZWN0aW9uc1wiO1xyXG5pbXBvcnQge0xpc3RLZXlNYW5hZ2VyLCBIaWdobGlnaHRhYmxlfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XHJcbmltcG9ydCB7TWF0TGVnYWN5T3B0aW9uIGFzIE1hdE9wdGlvbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1jb3JlXCI7XHJcbmltcG9ydCB7TGVnYWN5RmxvYXRMYWJlbFR5cGUgYXMgRmxvYXRMYWJlbFR5cGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZm9ybS1maWVsZFwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiaGNpLWNvbWJvYm94XCIsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxtYXQtZm9ybS1maWVsZCAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0Q2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNldXApPVwiZW5kQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwidGhpcy50b29sdGlwXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjdXN0b21GaWVsZENsYXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgPG1hdC1sYWJlbCAqbmdJZj1cImxhYmVsICE9PSB1bmRlZmluZWRcIj57eyBsYWJlbCB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LWxhYmVsICpuZ0lmPVwibGFiZWwgPT09IHVuZGVmaW5lZFwiPlxyXG4gICAgICAgIHt7IHRlbXBvcmFyeVBsYWNlaG9sZGVyID8gKGlubmVyQ29udHJvbC52YWx1ZSA/ICcnIDogcGxhY2Vob2xkZXIpIDogcGxhY2Vob2xkZXIgfX1cclxuICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCAjaW5wdXRcclxuICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICBuYW1lPVwiY3VzdG9tQ29tYm9Cb3hGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInRlbXBvcmFyeVBsYWNlaG9sZGVyID8gKGlubmVyQ29udHJvbC52YWx1ZSA/ICcnIDogcGxhY2Vob2xkZXIpIDogcGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcclxuICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiaW5uZXJDb250cm9sXCJcclxuICAgICAgICAgICAgIFthdHRyLmNka0ZvY3VzSW5pdGlhbF09XCJjZGtGb2N1c0luaXRpYWwgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjZGtGb2N1c0luaXRpYWxcIlxyXG4gICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcclxuICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5KCRldmVudClcIlxyXG4gICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgpXCJcclxuICAgICAgICAgICAgID5cclxuICAgICAgPGRpdiBtYXRTdWZmaXhcclxuICAgICAgICAgICBjbGFzcz1cImhjaS1jb21ib2JveC1hcnJvdy13cmFwcGVyXCJcclxuICAgICAgICAgICAoY2xpY2spID0gXCJ0b2dnbGVPcGVuKCRldmVudClcIlxyXG4gICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRDbGljaygpXCJcclxuICAgICAgICAgICAobW91c2V1cCk9XCJlbmRDbGljaygpXCJcclxuICAgICAgICAgICA+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhjaS1jb21ib2JveC1hcnJvd1wiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPG1hdC1zcGlubmVyIG1hdFN1ZmZpeCAqbmdJZj1cInNob3dMb2FkZXIoKVwiIFtkaWFtZXRlcl09XCIzMFwiIHN0eWxlPVwiZmxvYXQ6IHJpZ2h0OyBtYXJnaW4tbGVmdDogOHB4XCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvQWN0aXZlRmlyc3RPcHRpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvblNlbGVjdGVkKT1cInRoaXMuc2VsZWN0T3B0aW9uKCRldmVudC5vcHRpb24udmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW5lZCk9XCJ0aGlzLm9uT3BlbmVkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VkKT1cInRoaXMub25DbG9zZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNwbGF5V2l0aF09XCJ0aGlzLmRpc3BsYXlGblwiPlxyXG4gICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgI3ZpZXdwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZGlzcGxheV09XCJpc09wZW4gPyBudWxsIDogJ25vbmUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGNpLWNvbWJvYm94LXZpZXdwb3J0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT0gXCJjdXN0b21WaWV3cG9ydENsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJvcHRpb25TaXplUHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJudW1PcHRpb25zVG9TaG93ICogb3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5CdWZmZXJQeF09XCJudW1PcHRpb25zVG9TaG93ICogb3B0aW9uU2l6ZVB4ICogMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4QnVmZmVyUHhdPVwibnVtT3B0aW9uc1RvU2hvdyAqIG9wdGlvblNpemVQeCAqIDNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNldXApPVwiZW5kQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cImFsbG93Tm9uZSAmJiBpc09wZW4gJiYgKHRoaXMuZm9yY2VTaG93Tm9uZSB8fCAhdGhpcy5pbm5lckNvbnRyb2wudmFsdWUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImN1c3RvbU9wdGlvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJvcHRpb25TaXplUHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICBOb25lXHJcbiAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8bWF0LW9wdGlvbiAqY2RrVmlydHVhbEZvcj1cImxldCBvcHQgb2YgdGhpcy5sb2FkZWRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY3VzdG9tT3B0aW9uQ2xhc3Nlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGNpLWNvbWJvYm94LXNlbGVjdGVkXT1cIih2YWx1ZUZpZWxkID8gb3B0W3ZhbHVlRmllbGRdIDogb3B0KSA9PT0gb3V0ZXJDb250cm9sLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5tYXQtc2VsZWN0ZWRdPVwiKHZhbHVlRmllbGQgPyBvcHRbdmFsdWVGaWVsZF0gOiBvcHQpID09PSBvdXRlckNvbnRyb2wudmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJvcHRpb25TaXplUHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBkaXNwbGF5RmllbGQgPyBvcHRbZGlzcGxheUZpZWxkXSA6IG9wdCB9fVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxyXG4gICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgIDxtYXQtZXJyb3I+XHJcbiAgICAgICAge3sgZ2V0RXJyb3IoKSB9fVxyXG4gICAgICA8L21hdC1lcnJvcj5cclxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICBgLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3VzdG9tQ29tYm9Cb3hDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWUsXHJcbiAgfV0sXHJcbiAgaG9zdDoge1xyXG4gICAgY2xhc3M6IFwiaGNpLWNvbWJvYm94LWNvbnRhaW5lclwiXHJcbiAgfSxcclxuICBzdHlsZXM6IFtgXHJcbiAgICAuaGNpLWNvbWJvYm94LWNvbnRhaW5lciB7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LWFycm93IHtcclxuICAgICAgd2lkdGg6IDA7XHJcbiAgICAgIGhlaWdodDogMDtcclxuICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCB0cmFuc3BhcmVudDtcclxuICAgICAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgIGJvcmRlci10b3A6IDVweCBzb2xpZDtcclxuICAgICAgbWFyZ2luOiAwIDRweDtcclxuICAgICAgY29sb3I6IHJnYmEoMCwwLDAsLjU0KTtcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LWFycm93LXdyYXBwZXIge1xyXG4gICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xyXG4gICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgbWF0LW9wdGlvbiB7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IDAgLjJyZW07XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC12aWV3cG9ydCBtYXQtb3B0aW9uIC5tYXQtb3B0aW9uLXRleHQge1xyXG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgLmhjaS1jb21ib2JveC1zZWxlY3RlZCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkZGRkZGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC12aWV3cG9ydCAubWF0LWFjdGl2ZSB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmM2YzZjM7XHJcbiAgICB9XHJcblxyXG4gICAgLyogZml4IGppdHRlcnkgc2Nyb2xsIGJ1ZyBpbiBjaHJvbWUgKi9cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQge1xyXG4gICAgICBvdmVyZmxvdy1hbmNob3I6IG5vbmU7XHJcbiAgICB9XHJcbiAgYF0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEN1c3RvbUNvbWJvQm94Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBwdWJsaWMgb3B0aW9uU2l6ZVB4OiBudW1iZXIgPSAyNTtcclxuICBwdWJsaWMgbnVtT3B0aW9uc1RvU2hvdzogbnVtYmVyID0gMTA7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIG1heE9wdGlvbnNUb1Nob3c6IG51bWJlciA9IDEwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjdXN0b21WaWV3cG9ydENsYXNzOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgY3VzdG9tRmllbGRDbGFzc2VzKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2N1c3RvbUZpZWxkQ2xhc3NlcyA9IHZhbHVlID8gdmFsdWUgOiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXN0b21GaWVsZENsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAhIXRoaXMuX2N1c3RvbUZpZWxkQ2xhc3NlcyA/IHRoaXMuX2N1c3RvbUZpZWxkQ2xhc3NlcyA6IFwibWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0XCI7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgY3VzdG9tT3B0aW9uQ2xhc3Nlcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jdXN0b21PcHRpb25DbGFzc2VzID0gdmFsdWUgPyB2YWx1ZSA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1c3RvbU9wdGlvbkNsYXNzZXMoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAhIXRoaXMuX2N1c3RvbU9wdGlvbkNsYXNzZXMgPyB0aGlzLl9jdXN0b21PcHRpb25DbGFzc2VzIDogXCJcIjtcclxuICB9XHJcblxyXG4gIC8vIElmIGEgbGFiZWwgaXMgbm90IHNwZWNpZmllZCB0aGUgcGxhY2Vob2xkZXIgaXMgcHJvbW90ZWQgdG8gYSBsYWJlbC5cclxuICAvLyBUbyBjcmVhdGUgYSBmb3JtIGZpZWxkIHdpdGggb25seSBhIHBsYWNlaG9sZGVyLCBzcGVjaWZ5IGFuIGVtcHR5XHJcbiAgLy8gbGFiZWwgdG8gcHJldmVudCB0aGUgcGxhY2Vob2xkZXIgZnJvbSBiZWluZyBwcm9tb3RlZC5cclxuICBASW5wdXQoKSBwdWJsaWMgbGFiZWw6IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIC8vIFJlbW92ZXMgdGhlIHBsYWNlaG9sZGVyIGFmdGVyIGEgc2VsZWN0aW9uIGlzIG1hZGVcclxuICBASW5wdXQoKSBwdWJsaWMgdGVtcG9yYXJ5UGxhY2Vob2xkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIHRvb2x0aXA6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgcHVibGljIGFsbG93Tm9uZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RUZXh0T25PcGVuID0gdHJ1ZTtcclxuXHJcbiAgLy8gdGVsbCBtYXQtZGlhbG9nIHRvIHBhc3MgaW5pdGlhbCBmb2N1cyB0byB0aGUgaW5uZXIgaW5wdXRcclxuICBASG9zdEJpbmRpbmcoXCJhdHRyLmNka0ZvY3VzSW5pdGlhbFwiKSBfY2RrRm9jdXNJbml0aWFsID0gbnVsbDtcclxuICBASW5wdXQoKSBwdWJsaWMgY2RrRm9jdXNJbml0aWFsOiBzdHJpbmcgPSB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIG9uIHRhYiwgc2tpcCB0aGUgaG9zdCBlbGVtZW50IGFuZCBmb2N1cyB0aGUgaW5wdXRcclxuICBASG9zdEJpbmRpbmcoXCJhdHRyLnRhYmluZGV4XCIpIF90YWJpbmRleCA9IG51bGw7XHJcbiAgQElucHV0KCkgcHVibGljIHRhYmluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICBwdWJsaWMgZm9yY2VTaG93Tm9uZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogYW55W10gPSBbXTtcclxuICBASW5wdXQoKSBhbGxvd0xvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGxvYWRlZE9wdGlvbnM6IGFueVtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyB2YWx1ZUZpZWxkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHJpdmF0ZSBmb3JjZUVtaXRPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZGlzcGxheUZpZWxkOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIGFwcGVhcmFuY2U6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KCkgcHVibGljIGZsb2F0TGFiZWw6IEZsb2F0TGFiZWxUeXBlO1xyXG5cclxuICAvLyBTZXQgdG8gZW1wdHkgdG8gbm90IHNob3cgZXJyb3JzXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZGVmaW5lRXJyb3JzOiBhbnkgPSB7cmVxdWlyZWQ6IFwiVGhpcyBpcyBhIHJlcXVpcmVkIGZpZWxkXCJ9O1xyXG5cclxuICBwcml2YXRlIF9zaG93TG9hZGVyID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfY3VzdG9tRmllbGRDbGFzc2VzOiBzdHJpbmcgPSBcIlwiO1xyXG4gIHByaXZhdGUgX2N1c3RvbU9wdGlvbkNsYXNzZXM6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIHB1YmxpYyBvdXRlckNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICBwdWJsaWMgaW5uZXJDb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwpO1xyXG4gIHByaXZhdGUgaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3ViczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIHByaXZhdGUgbm9OZ0NvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2VsZWN0ZWRJbmRleDogbnVtYmVyO1xyXG5cclxuICBrZXlNYW5hZ2VyOiBMaXN0S2V5TWFuYWdlcjxIaWdobGlnaHRhYmxlPjtcclxuICB2aWV3cG9ydFJlbmRlclJhbmdlOiBMaXN0UmFuZ2U7XHJcbiAgdmlld3BvcnRWaXNpYmxlUmFuZ2U6IExpc3RSYW5nZSA9IHtcclxuICAgIHN0YXJ0OiAwLFxyXG4gICAgZW5kOiB0aGlzLm51bU9wdGlvbnNUb1Nob3cgLSAxXHJcbiAgfTtcclxuXHJcbiAgYWN0aXZlVmFsdWU6IGFueTtcclxuXHJcbiAgcHVibGljIGNsaWNrSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgb3B0aW9uU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9wdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9wdGlvbnNMb2FkZWQ6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG5cclxuICBAVmlld0NoaWxkKFwidmlld3BvcnRcIiwge3N0YXRpYzogdHJ1ZX0pXHJcbiAgdmlld3BvcnQ6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcclxuXHJcbiAgQFZpZXdDaGlsZChcImlucHV0XCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gIGlucHV0RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgQFZpZXdDaGlsZChcImlucHV0XCIsIHtyZWFkOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyLCBzdGF0aWM6IGZhbHNlfSlcclxuICBhdXRvQ29tcGxldGVUcmlnZ2VyOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyO1xyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlRm46ICh2YWw6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkRm46ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgcHVibGljIGRpc3BsYXlGbjogKG9wdD86IGFueSkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkID0gKG9wdD86IGFueSkgPT4ge1xyXG4gICAgcmV0dXJuIG9wdCA/ICh0aGlzLmRpc3BsYXlGaWVsZCA/IG9wdFt0aGlzLmRpc3BsYXlGaWVsZF0gOiBvcHQpIDogdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zaG93TG9hZGVyID0gdGhpcy5hbGxvd0xvYWRlciAmJiAoISB0aGlzLm9wdGlvbnMgfHwgdGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgbmdDb250cm9sOiBOZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xyXG4gICAgaWYgKG5nQ29udHJvbCAmJiBuZ0NvbnRyb2wuY29udHJvbCkge1xyXG4gICAgICB0aGlzLm91dGVyQ29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMub3V0ZXJDb250cm9sLnZhbGlkYXRvcik7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLm91dGVyQ29udHJvbC5hc3luY1ZhbGlkYXRvcik7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5ub05nQ29udHJvbCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdWJzLmFkZCh0aGlzLmlubmVyQ29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSkuc3Vic2NyaWJlKChfdmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5pc09wZW4gJiYgIXRoaXMuaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlcykge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlcyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcblxyXG4gICAgLy8gd29yayBhcm91bmQgZm9yIHZhbGlkYXRvcnMgbm90IGFsd2F5cyBwcm9wYWdhdGluZ1xyXG4gICAgdGhpcy5zdWJzLmFkZCh0aGlzLm91dGVyQ29udHJvbC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoX2V2ZW50OiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLm91dGVyQ29udHJvbC52YWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5vdXRlckNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldEVycm9ycyh0aGlzLm91dGVyQ29udHJvbC5lcnJvcnMpO1xyXG5cclxuICAgICAgaWYgKHRoaXMub3V0ZXJDb250cm9sLnRvdWNoZWQpIHtcclxuICAgICAgICB0aGlzLmlubmVyQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuXHJcbiAgICAvLyB0aGlzIG9iamVjdCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIGFjdGl2ZSBzdGF0ZSB3aGVuIGtleWluZyB1cCBhbmQgZG93blxyXG4gICAgdGhpcy5rZXlNYW5hZ2VyID0gdGhpcy5hdXRvQ29tcGxldGVUcmlnZ2VyLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlcjtcclxuICAgIHRoaXMua2V5TWFuYWdlci53aXRoV3JhcChmYWxzZSk7XHJcblxyXG4gICAgdGhpcy5zdWJzLmFkZChjb21iaW5lTGF0ZXN0KFtcclxuICAgICAgdGhpcy52aWV3cG9ydC5yZW5kZXJlZFJhbmdlU3RyZWFtLFxyXG4gICAgICB0aGlzLnZpZXdwb3J0LnNjcm9sbGVkSW5kZXhDaGFuZ2VcclxuICAgIF0pLnN1YnNjcmliZSgoW3JlbmRlcmVkUmFuZ2UsIHNjcm9sbGVkSW5kZXhdOiBbTGlzdFJhbmdlLCBudW1iZXJdKSA9PiB7XHJcblxyXG4gICAgICAvLyBJbnN0ZWFkIG9mIGxvYWRpbmcgdGhlIHdob2xlIGl0ZW0gbGlzdCBhdCBvbmNlLCB0aGUgdmlydHVhbCBzY3JvbGwgdmlld3BvcnQgYnVmZmVyc1xyXG4gICAgICAvLyBhIHJhbmdlIG9mIGVudHJpZXMsIG9ubHkgYSBwb3J0aW9uIG9mIHdoaWNoIGFyZSB3aXRoaW4gdGhlIHZpc2libGUgZm9sZFxyXG4gICAgICB0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2UgPSByZW5kZXJlZFJhbmdlO1xyXG5cclxuICAgICAgLy8gd2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSB2aXNpYmxlIHJhbmdlIG91cnNlbHZlc1xyXG4gICAgICBsZXQgbGVuOiBudW1iZXIgPSBNYXRoLm1pbih0aGlzLmxvYWRlZE9wdGlvbnMubGVuZ3RoICsgKHRoaXMuYWxsb3dOb25lID8gMSA6IDApLCB0aGlzLm51bU9wdGlvbnNUb1Nob3cgLSAxKTtcclxuXHJcbiAgICAgIHRoaXMudmlld3BvcnRWaXNpYmxlUmFuZ2UgPSB7XHJcbiAgICAgICAgc3RhcnQ6IHNjcm9sbGVkSW5kZXgsXHJcbiAgICAgICAgZW5kOiBzY3JvbGxlZEluZGV4ICsgbGVuXHJcbiAgICAgIH07XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5vcHRpb25zKSB7XHJcbiAgICAgIGxldCBvcHRpb25zQ2hhbmdlOiBTaW1wbGVDaGFuZ2UgPSBjaGFuZ2VzLm9wdGlvbnM7XHJcbiAgICAgIGlmICghb3B0aW9uc0NoYW5nZS5jdXJyZW50VmFsdWUgfHwgb3B0aW9uc0NoYW5nZS5jdXJyZW50VmFsdWUubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIGlmKHRoaXMuaW5uZXJDb250cm9sLnZhbHVlICE9IG51bGwpe1xyXG4gICAgICAgICAgLy9SZXNldCB0aGUgaW5uZXJDb250cm9sIHZhbHVlIG9mIHRoZSBkcm9wZG93biBsaXN0IHRvIGFuIGVtcHR5IGFycmF5IGluIGNhc2Ugb2Ygbm8gcmVzdWx0cyBhcmUgcHJlc2VudCB0byBiZSBkaXNwbGF5ZWQuXHJcbiAgICAgICAgICAvL1RoaXMgZmx1c2hlcyBvdXQgdGhlIHN0YWxlIHZhbHVlIGZyb20gdGhlIGxpc3QgaWYgdGhlcmUgYXJlIG5vIHJlc3VsdHMgdG8gYmUgZGlzcGxheWVkLlxyXG4gICAgICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsdWUoW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGN1cnJlbnRPcHRzOiBhbnlbXSA9IDxhbnlbXT5vcHRpb25zQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgaWYgKGN1cnJlbnRPcHRzICYmIFwibGVuZ3RoXCIgaW4gY3VycmVudE9wdHMgJiYgY3VycmVudE9wdHMgIT09IG9wdGlvbnNDaGFuZ2UucHJldmlvdXNWYWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3Nob3dMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm9wdGlvbnNMb2FkZWQuZW1pdCgpO1xyXG5cclxuICAgICAgICAvLyBJZiBudW1iZXIgb2Ygb3B0aW9ucyBpcyBsZXNzIHRoYW4gb3VyIG1heCwgcmVkdWNlIHNpemUgb2Ygb3ZlcmxheVxyXG4gICAgICAgIHRoaXMubnVtT3B0aW9uc1RvU2hvdyA9IE1hdGgubWluKGN1cnJlbnRPcHRzLmxlbmd0aCArICh0aGlzLmFsbG93Tm9uZSA/IDEgOiAwKSwgdGhpcy5tYXhPcHRpb25zVG9TaG93KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zaG93TG9hZGVyID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyBUaGUgYXV0b2NvbXBsZXRlIHdpbGwgYXV0b21hdGljYWxseSBwb3Agb3BlbiBvbmNlIGl0IGhhcyBvcHRpb25zIGZpbHRlcmVkIGludG8gaXQsXHJcbiAgICAgIC8vIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvIG9uIGluaXRpYWwgcGFnZSBsb2FkIG9yIHdoZW4gdGFiYmluZyB0aG91Z2hcclxuICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJPcHRpb25zKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sb2FkT25seUN1cnJlbnRWYWx1ZSh0aGlzLm91dGVyQ29udHJvbC52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkT25seUN1cnJlbnRWYWx1ZShvYmopO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkRm4gPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKGlzRGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuZW5hYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvcigpOiBzdHJpbmcge1xyXG4gICAgZm9yIChjb25zdCBlcnJvciBpbiB0aGlzLm91dGVyQ29udHJvbC5lcnJvcnMpIHtcclxuICAgICAgaWYgKHRoaXMuZGVmaW5lRXJyb3JzICYmIGVycm9yIGluIHRoaXMuZGVmaW5lRXJyb3JzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmaW5lRXJyb3JzW2Vycm9yXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkT25seUN1cnJlbnRWYWx1ZShjbnRybFZhbDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG5ld1ZhbHVlOiBhbnkgPSBudWxsO1xyXG4gICAgaWYgKGNudHJsVmFsICE9PSBudWxsICYmIGNudHJsVmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IGN1cnJlbnRseVNlbGVjdGVkOiBhbnkgPSB0aGlzLm9wdGlvbnMuZmluZCgob3B0OiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgb3B0VmFsdWU6IGFueSA9IHRoaXMudmFsdWVGaWVsZCA/IG9wdFt0aGlzLnZhbHVlRmllbGRdIDogb3B0O1xyXG4gICAgICAgIGlmICh0aGlzLmZvcmNlRW1pdE9iamVjdCkge1xyXG4gICAgICAgICAgbGV0IG91dGVyVmFsdWU6IGFueSA9IGNudHJsVmFsID8gKHRoaXMudmFsdWVGaWVsZCA/IGNudHJsVmFsW3RoaXMudmFsdWVGaWVsZF0gOiBjbnRybFZhbCkgOiBudWxsO1xyXG4gICAgICAgICAgaWYgKG9wdFZhbHVlID09PSBvdXRlclZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gb3B0VmFsdWUgPT09IGNudHJsVmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChjdXJyZW50bHlTZWxlY3RlZCkge1xyXG4gICAgICAgIG5ld1ZhbHVlID0gY3VycmVudGx5U2VsZWN0ZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBwcmVmZXIgdG8gY2hlY2sgaWQgaWYgaXQgaGFzIG9uZSAgdnMgc3RyYWlnaHQgYWdhaW5zdCBpdCdzIG9iamVjdCBpZGVudGl0eVxyXG4gICAgaWYgKHRoaXMuaW5uZXJDb250cm9sLnZhbHVlICYmIG5ld1ZhbHVlICE9IG51bGwgJiYgdGhpcy52YWx1ZUZpZWxkKSB7XHJcbiAgICAgIGlmICh0aGlzLmlubmVyQ29udHJvbC52YWx1ZVt0aGlzLnZhbHVlRmllbGRdICE9PSBuZXdWYWx1ZVt0aGlzLnZhbHVlRmllbGRdKSB7XHJcbiAgICAgICAgdGhpcy5pZ25vcmVJbm5lckNvbnRyb2xDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25TZWxlY3RlZC5lbWl0KG5ld1ZhbHVlW3RoaXMudmFsdWVGaWVsZF0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5uZXJDb250cm9sLnZhbHVlICE9PSBuZXdWYWx1ZSkge1xyXG4gICAgICB0aGlzLmlnbm9yZUlubmVyQ29udHJvbENoYW5nZXMgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZSk7XHJcbiAgICAgIGxldCBudiA9IG5ld1ZhbHVlID8gKCh0aGlzLnZhbHVlRmllbGQgJiYgIXRoaXMuZm9yY2VFbWl0T2JqZWN0KSA/IG5ld1ZhbHVlW3RoaXMudmFsdWVGaWVsZF0gOiBuZXdWYWx1ZSkgOiBudWxsO1xyXG4gICAgICB0aGlzLm9wdGlvblNlbGVjdGVkLmVtaXQobnYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJPcHRpb25zKHNob3dBbGw6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JjZVNob3dOb25lID0gc2hvd0FsbDtcclxuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcclxuICAgIGlmICghdGhpcy5vcHRpb25zIHx8IHRoaXMub3B0aW9ucy5sZW5ndGggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2hvd0FsbCB8fCAhdGhpcy5pbm5lckNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5sb2FkZWRPcHRpb25zID0gWy4uLnRoaXMub3B0aW9uc107XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgc2VhcmNoVmFsdWU6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5pbm5lckNvbnRyb2wudmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICBzZWFyY2hWYWx1ZSA9IHRoaXMuaW5uZXJDb250cm9sLnZhbHVlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaXNwbGF5RmllbGQpIHtcclxuICAgICAgICBzZWFyY2hWYWx1ZSA9IHRoaXMuaW5uZXJDb250cm9sLnZhbHVlW3RoaXMuZGlzcGxheUZpZWxkXS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubG9hZGVkT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdDogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IG9wdERpc3BsYXk6IHN0cmluZyA9ICh0aGlzLmRpc3BsYXlGaWVsZCA/IG9wdFt0aGlzLmRpc3BsYXlGaWVsZF0gOiBvcHQpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIG9wdERpc3BsYXkuaW5jbHVkZXMoc2VhcmNoVmFsdWUpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5mb3JjZVNob3dOb25lID0gdGhpcy5sb2FkZWRPcHRpb25zLmxlbmd0aCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLmdldE9wdEluZGV4KHRoaXMub3V0ZXJDb250cm9sLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93TG9hZGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsb3dMb2FkZXIgJiYgdGhpcy5fc2hvd0xvYWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuKCkge1xyXG4gICAgaWYgKHRoaXMuaW5uZXJDb250cm9sLmRpc2FibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgYXV0b2NvbXBsZXRlIHdpbGwgb25seSBvcGVuIHdoZW4gb3B0aW9ucyBhcmUgbG9hZGVkXHJcbiAgICB0aGlzLmZpbHRlck9wdGlvbnModHJ1ZSk7XHJcbiAgICB0aGlzLmF1dG9Db21wbGV0ZVRyaWdnZXIub3BlblBhbmVsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKSB7XHJcbiAgICB0aGlzLmF1dG9Db21wbGV0ZVRyaWdnZXIuY2xvc2VQYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uT3BlbmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JjZVNob3dOb25lID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcblxyXG4gICAgaWYodGhpcy5zZWxlY3RUZXh0T25PcGVuKXtcclxuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZWxlY3QoKTsgLy8gSGlnaGxpZ2h0cyB0ZXh0XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCA+IDApIHtcclxuICAgICAgLy8gbWFrZSB0aGUgc2VsZWN0ZWQgb3B0aW9uIGFsc28gdGhlIGFjdGl2ZSBvcHRpb25cclxuICAgICAgdGhpcy5hY3RpdmVWYWx1ZSA9IHRoaXMuZ2V0T3B0VmFsKHRoaXMubG9hZGVkT3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdKTtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZE9wdGlvbigpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNsb3NlZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc09wZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAmJiB0aGlzLm91dGVyQ29udHJvbC52YWx1ZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdE9wdGlvbihudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvYWRPbmx5Q3VycmVudFZhbHVlKHRoaXMub3V0ZXJDb250cm9sLnZhbHVlKTtcclxuXHJcbiAgICAvLyByZXNldCB0aGUgb3B0aW9ucyBzbyB0aGUgYXV0b2NvbXBsZXRlIHdvbid0IGF1dG9tYXRpY2FsbHkgb3BlbiBvbiB0aGUgbmV4dCB0YWIgdGhyb3VnaFxyXG4gICAgdGhpcy5sb2FkZWRPcHRpb25zID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRDbGljaygpIHtcclxuICAgIC8vIGNsaWNraW5nIG9uIGNlcnRhaW4gcGFydHMgb2YgdGhlIG1hdC1maWVsZCB3aWxsIFwiZmxpY2tlclwiIHRoZSBmb2N1cywgdHJpZ2dlcmluZ1xyXG4gICAgLy8gZXJyb3IgdmFsaWRhdGlvbiBlYXJseS4gVGhpcyB0cmFja3MgdGhvc2UgaW50ZXJuYWwgY2xpY2tzIHNvIHRoZXkgY2FuIGJlIGlnbm9yZWRcclxuICAgIHRoaXMuY2xpY2tJblByb2dyZXNzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlbmRDbGljaygpIHtcclxuICAgIHRoaXMuY2xpY2tJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZU9wZW4oZXZlbnQ6IE1vdXNlRXZlbnQpOnZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiIHx8IGV2ZW50LmtleSA9PT0gXCJFbnRlclwiKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcclxuICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gVGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIGNkayBhMTF5IEtleU1hbmFnZXIgaW1wbGVtZW50YXRpb24gaXMgbm90IGNvbXBhdGlibGUgd2l0aFxyXG4gICAgICAvLyB0aGUgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciwgd2hpY2ggY2F1c2VzIHRoZSBEcm9wLWRvd24gbm90IHNjcm9sbCB3aXRoIGtleWJvYXJkXHJcbiAgICAgIC8vIG9uIGxvbmcgb3B0aW9uIGxpc3RzLlxyXG4gICAgICAvL1xyXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xNjU5OFxyXG4gICAgICAvL1xyXG4gICAgICAvLyBUaGlzIHdvcmsgYXJvdW5kIHRha2VzIGNvbnRyb2wgb2YgdGhlIGtleWJvYXJkIGFuZCBtYW51YWxseSBzY3JvbGxzIGFuZCBhY3RpdmF0ZXNcclxuICAgICAgLy8gdGhlIG9wdGlvbnNcclxuICAgICAgLy9cclxuICAgICAgLy8gUmVmZXJlbmNlczpcclxuICAgICAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFzdGVyL3NyYy9tYXRlcmlhbC9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLXRyaWdnZXIudHNcclxuICAgICAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2Jsb2IvbWFzdGVyL3NyYy9jZGsvYTExeS9rZXktbWFuYWdlci9saXN0LWtleS1tYW5hZ2VyLnRzXHJcbiAgICAgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21hc3Rlci9zcmMvY2RrL2ExMXkva2V5LW1hbmFnZXIvYWN0aXZlZGVzY2VuZGFudC1rZXktbWFuYWdlci50c1xyXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93VXBcIiB8fCBldmVudC5rZXkgPT09IFwiQXJyb3dEb3duXCIpIHtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0QWN0aXZlSXRlbSgpO1xyXG4gICAgICAgIHRoaXMuc2hpZnRBY3RpdmVJdGVtKGV2ZW50LmtleSk7XHJcbiAgICAgICAgdGhpcy5jaGVja0FjdGl2ZUJvdW5kYXJpZXMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gYmVmb3JlIG91ciBrZXlwcmVzcyBiaW5kaW5nIGV2ZW4gdHJpZ2dlcnMsIGFuZ3VsYXIgaGFzIGFscmVhZHkgbW92ZWQgdGhlIGFjdGl2ZSBzZWxlY3Rpb25cclxuICAvLyB1bnN5bmNpbmcgaXQgd2l0aCBvdXIgZGlzcGxheS4gdGhpcyBjb2RlIHJlLWluaXRpYWxpemVzIHRoZSBhY3RpdmUgb3B0aW9uXHJcbiAgaW5pdEFjdGl2ZUl0ZW0oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuYWN0aXZlVmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSB0aGlzLmdldEFjdGl2ZUluZGV4KCk7XHJcblxyXG4gICAgICAvLyB0aGlzIGRvZXMgdGhlIGNvbnZlcnNpb24gZnJvbSBhbiBpbmRleCB3aXRoaW4gYWxsIG9wdGlvbnMgZG93biB0byBhIHBvc2l0aW9uIHdpdGhpbiB0aGVcclxuICAgICAgLy8gZGlzcGxheWVkIHJhbmdlLCB3aGljaCBpcyBhbGwgdGhlIGtleW1hbmFnZXIgaXMgYXdhcmUgb2ZcclxuICAgICAgbGV0IHBvc2l0aW9uID0gYWN0aXZlSW5kZXggLSB0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2Uuc3RhcnQ7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHBvc2l0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNoaWZ0QWN0aXZlSXRlbShrZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKGtleSA9PT0gXCJBcnJvd1VwXCIpIHtcclxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpO1xyXG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiQXJyb3dEb3duXCIpIHtcclxuICAgICAgdGhpcy5rZXlNYW5hZ2VyLnNldE5leHRJdGVtQWN0aXZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMua2V5TWFuYWdlci5hY3RpdmVJdGVtKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlVmFsdWUgPSB0aGlzLmdldE9wdFZhbCgoPE1hdE9wdGlvbj50aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbSkudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gY2hlY2sgaWYgdGhlIGFjdGl2ZSBvcHRpb24gaW5kZXggaXMgd2l0aGluIHRoZSBkaXNwbGF5ZWQgdmlld3BvcnQgd2luZG93XHJcbiAgLy8gaWYgbm90LCBzY3JvbGwgaXQgaW50byB2aWV3XHJcbiAgY2hlY2tBY3RpdmVCb3VuZGFyaWVzKCk6IHZvaWQge1xyXG4gICAgbGV0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSB0aGlzLmdldEFjdGl2ZUluZGV4KCk7XHJcblxyXG4gICAgaWYgKGFjdGl2ZUluZGV4IDwgdGhpcy52aWV3cG9ydFZpc2libGVSYW5nZS5zdGFydCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnZpZXdwb3J0LnNjcm9sbFRvT2Zmc2V0KGFjdGl2ZUluZGV4ICogdGhpcy5vcHRpb25TaXplUHgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2UgaWYgKGFjdGl2ZUluZGV4ID4gdGhpcy52aWV3cG9ydFZpc2libGVSYW5nZS5lbmQpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldCgoYWN0aXZlSW5kZXggLSAodGhpcy5udW1PcHRpb25zVG9TaG93IC0gMSkpICogdGhpcy5vcHRpb25TaXplUHgpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFjdGl2ZUluZGV4KCkge1xyXG4gICAgbGV0IGFjdGl2ZUluZGV4OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIGlmICh0aGlzLmFjdGl2ZVZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5hY3RpdmVWYWx1ZSAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgLy8gaWYgd2UgYWRkZWQgYSBub25lIG9wdGlvbiB0aGUgcmV0dXJuZWQgaW5kZXggd291bGQgYmUgb2ZmIGJ5IG9uZVxyXG4gICAgICBsZXQgdmFsSW5kZXggPSB0aGlzLmdldE9wdEluZGV4KHRoaXMuYWN0aXZlVmFsdWUpICsgKHRoaXMuYWxsb3dOb25lICYmICh0aGlzLmZvcmNlU2hvd05vbmUgfHwgIXRoaXMuaW5uZXJDb250cm9sLnZhbHVlKSA/IDEgOiAwKTtcclxuXHJcbiAgICAgIC8vIHRoZSBpbmRleCBzaG91bGQgYmUgd2l0aGluIHRoZSByYW5nZSBvZiBvdXIgZW50aXJlIGJ1ZmZlciwgb3IganVzdCBhbGxvdyBpdCB0byByZXNldFxyXG4gICAgICBpZiAodmFsSW5kZXggPj0gdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlLnN0YXJ0XHJcbiAgICAgICAgJiYgKCF0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2UuZW5kIHx8IHZhbEluZGV4IDw9IHRoaXMudmlld3BvcnRSZW5kZXJSYW5nZS5lbmQpXHJcbiAgICAgICkge1xyXG4gICAgICAgIGFjdGl2ZUluZGV4ID0gdmFsSW5kZXg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWN0aXZlSW5kZXg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1cygpIHtcclxuICAgIGlmICghdGhpcy5pc09wZW4pIHtcclxuICAgICAgLy8gSGlnaGxpZ2h0cyB0ZXh0XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdFRleHRPbk9wZW4pIHtcclxuICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNlbGVjdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1c091dCgpIHtcclxuICAgIC8vIG1hcmsgY29udHJvbCB0b3VjaGVkIGFuZCB0cmlnZ2VyIGVycm9yIHZhbGlkYXRpb25cclxuICAgIGlmICghdGhpcy5jbGlja0luUHJvZ3Jlc3MpIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICB0aGlzLm9uVG91Y2hlZEZuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0T3B0aW9uKG9wdDogYW55KTogdm9pZCB7XHJcbiAgICBsZXQgbmV3VmFsID0gdGhpcy5nZXRPcHRWYWwob3B0LCB0aGlzLmZvcmNlRW1pdE9iamVjdCk7XHJcblxyXG4gICAgaWYgKHRoaXMubm9OZ0NvbnRyb2wpIHtcclxuICAgICAgdGhpcy5vdXRlckNvbnRyb2wuc2V0VmFsdWUobmV3VmFsKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uQ2hhbmdlRm4obmV3VmFsKTtcclxuICAgIHRoaXMub3B0aW9uU2VsZWN0ZWQuZW1pdChuZXdWYWwpO1xyXG4gICAgdGhpcy5vcHRpb25DaGFuZ2VkLmVtaXQobmV3VmFsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb1NlbGVjdGVkT3B0aW9uKCk6IHZvaWQge1xyXG4gICAgLy8gc2Nyb2xsIHRvIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uIHdoZW4gd2Ugb3BlbiB0aGUgZHJvcGRvd25cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPiAwKSB7XHJcbiAgICAgIGxldCBvZmZzZXRJbmRleDogbnVtYmVyID0gdGhpcy5zZWxlY3RlZEluZGV4ICsgKHRoaXMuYWxsb3dOb25lID8gMSA6IDApOyAvLyBhZGp1c3QgZm9yIE5vbmUgZW50cnlcclxuICAgICAgb2Zmc2V0SW5kZXggLT0gKHRoaXMubnVtT3B0aW9uc1RvU2hvdyAvIDIpIC0gMTsgLy8gY2FsY3VsYXRlIG1pZGRsZSBvZiB2aWV3cG9ydFxyXG4gICAgICB0aGlzLnZpZXdwb3J0LnNjcm9sbFRvT2Zmc2V0KG9mZnNldEluZGV4ICogdGhpcy5vcHRpb25TaXplUHgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0T3B0VmFsKG9wdDogYW55LCBmb3JjZU9iamVjdDogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcclxuICAgIGlmICh0aGlzLnZhbHVlRmllbGQgJiYgIWZvcmNlT2JqZWN0KSB7XHJcbiAgICAgIGlmIChvcHQgIT09IG51bGwgJiYgb3B0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdCA9PT0gXCJvYmplY3RcIiAmJiB0aGlzLnZhbHVlRmllbGQgaW4gb3B0KSB7XHJcbiAgICAgICAgcmV0dXJuIG9wdFt0aGlzLnZhbHVlRmllbGRdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvcHQ7XHJcbiAgfVxyXG5cclxuICBnZXRPcHRJbmRleChvcHRWYWx1ZTogYW55KTogbnVtYmVyIHtcclxuICAgIC8vIGZpbmQgdGhlIGluZGV4IGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvblxyXG4gICAgaWYgKG9wdFZhbHVlICE9PSBudWxsICYmIG9wdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubG9hZGVkT3B0aW9ucy5maW5kSW5kZXgoKG9wdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0VmFsKG9wdGlvbikgPT09IG9wdFZhbHVlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3Vicy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
610
|
+
`, providers: [{
|
|
611
|
+
provide: NG_VALUE_ACCESSOR,
|
|
612
|
+
useExisting: forwardRef(() => CustomComboBoxComponent),
|
|
613
|
+
multi: true,
|
|
614
|
+
}], host: {
|
|
615
|
+
class: "hci-combobox-container"
|
|
616
|
+
}, encapsulation: ViewEncapsulation.None, styles: [".hci-combobox-container{display:inline-block}.hci-combobox-arrow{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid;margin:0 4px;color:#0000008a}.hci-combobox-arrow-wrapper{display:table-cell;vertical-align:middle}.hci-combobox-viewport mat-option{display:flex;align-items:center;padding:0 .2rem}.hci-combobox-viewport mat-option .mat-option-text{white-space:nowrap}.hci-combobox-viewport .hci-combobox-selected{background-color:#ddd}.hci-combobox-viewport .mat-active{background-color:#f3f3f3}.hci-combobox-viewport{overflow-anchor:none}\n"] }]
|
|
617
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.Injector }], propDecorators: { maxOptionsToShow: [{
|
|
618
|
+
type: Input
|
|
619
|
+
}], customViewportClass: [{
|
|
620
|
+
type: Input
|
|
621
|
+
}], customFieldClasses: [{
|
|
622
|
+
type: Input
|
|
623
|
+
}], customOptionClasses: [{
|
|
624
|
+
type: Input
|
|
625
|
+
}], label: [{
|
|
626
|
+
type: Input
|
|
627
|
+
}], placeholder: [{
|
|
628
|
+
type: Input
|
|
629
|
+
}], temporaryPlaceholder: [{
|
|
630
|
+
type: Input
|
|
631
|
+
}], tooltip: [{
|
|
632
|
+
type: Input
|
|
633
|
+
}], allowNone: [{
|
|
634
|
+
type: Input
|
|
635
|
+
}], selectTextOnOpen: [{
|
|
636
|
+
type: Input
|
|
637
|
+
}], _cdkFocusInitial: [{
|
|
638
|
+
type: HostBinding,
|
|
639
|
+
args: ["attr.cdkFocusInitial"]
|
|
640
|
+
}], cdkFocusInitial: [{
|
|
641
|
+
type: Input
|
|
642
|
+
}], _tabindex: [{
|
|
643
|
+
type: HostBinding,
|
|
644
|
+
args: ["attr.tabindex"]
|
|
645
|
+
}], tabindex: [{
|
|
646
|
+
type: Input
|
|
647
|
+
}], options: [{
|
|
648
|
+
type: Input
|
|
649
|
+
}], allowLoader: [{
|
|
650
|
+
type: Input
|
|
651
|
+
}], valueField: [{
|
|
652
|
+
type: Input
|
|
653
|
+
}], forceEmitObject: [{
|
|
654
|
+
type: Input
|
|
655
|
+
}], displayField: [{
|
|
656
|
+
type: Input
|
|
657
|
+
}], appearance: [{
|
|
658
|
+
type: Input
|
|
659
|
+
}], floatLabel: [{
|
|
660
|
+
type: Input
|
|
661
|
+
}], defineErrors: [{
|
|
662
|
+
type: Input
|
|
663
|
+
}], optionSelected: [{
|
|
664
|
+
type: Output
|
|
665
|
+
}], optionChanged: [{
|
|
666
|
+
type: Output
|
|
667
|
+
}], optionsLoaded: [{
|
|
668
|
+
type: Output
|
|
669
|
+
}], viewport: [{
|
|
670
|
+
type: ViewChild,
|
|
671
|
+
args: ["viewport", { static: true }]
|
|
672
|
+
}], inputElement: [{
|
|
673
|
+
type: ViewChild,
|
|
674
|
+
args: ["input", { static: true }]
|
|
675
|
+
}], autoCompleteTrigger: [{
|
|
676
|
+
type: ViewChild,
|
|
677
|
+
args: ["input", { read: MatAutocompleteTrigger, static: false }]
|
|
678
|
+
}] } });
|
|
679
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9zZWxlY3QvY3VzdG9tLWNvbWJvYm94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZILE9BQU8sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUMsNEJBQTRCLElBQUksc0JBQXNCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQzs7Ozs7Ozs7Ozs7QUF5STdHLE1BQU0sT0FBTyx1QkFBdUI7SUFVbEMsSUFDVyxrQkFBa0IsQ0FBQyxLQUFhO1FBQ3pDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLGtCQUFrQjtRQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUM7SUFDL0YsQ0FBQztJQUVELElBQ1csbUJBQW1CLENBQUMsS0FBYTtRQUMxQyxJQUFJLENBQUMs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QUFJLEVBQUM7Z0JBSWxDLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgZm9yd2FyZFJlZixcclxuICBIb3N0QmluZGluZyxcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2UsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFVudHlwZWRGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IsIE5nQ29udHJvbH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge2RlYm91bmNlVGltZX0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7Q2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0fSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3Njcm9sbGluZ1wiO1xyXG5pbXBvcnQge01hdExlZ2FjeUF1dG9jb21wbGV0ZVRyaWdnZXIgYXMgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1hdXRvY29tcGxldGVcIjtcclxuaW1wb3J0IHtMaXN0UmFuZ2V9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuaW1wb3J0IHtMaXN0S2V5TWFuYWdlciwgSGlnaGxpZ2h0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xyXG5pbXBvcnQge01hdExlZ2FjeU9wdGlvbiBhcyBNYXRPcHRpb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktY29yZVwiO1xyXG5pbXBvcnQge0xlZ2FjeUZsb2F0TGFiZWxUeXBlIGFzIEZsb2F0TGFiZWxUeXBlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWZvcm0tZmllbGRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImhjaS1jb21ib2JveFwiLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cImVuZENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cImFwcGVhcmFuY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInRoaXMudG9vbHRpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY3VzdG9tRmllbGRDbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJsYWJlbCAhPT0gdW5kZWZpbmVkXCI+e3sgbGFiZWwgfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1sYWJlbCAqbmdJZj1cImxhYmVsID09PSB1bmRlZmluZWRcIj5cclxuICAgICAgICB7eyB0ZW1wb3JhcnlQbGFjZWhvbGRlciA/IChpbm5lckNvbnRyb2wudmFsdWUgPyAnJyA6IHBsYWNlaG9sZGVyKSA6IHBsYWNlaG9sZGVyIH19XHJcbiAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgI2lucHV0XHJcbiAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgbmFtZT1cImN1c3RvbUNvbWJvQm94RmlsdGVyXCJcclxuICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ0ZW1wb3JhcnlQbGFjZWhvbGRlciA/IChpbm5lckNvbnRyb2wudmFsdWUgPyAnJyA6IHBsYWNlaG9sZGVyKSA6IHBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXHJcbiAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxyXG4gICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImlubmVyQ29udHJvbFwiXHJcbiAgICAgICAgICAgICBbYXR0ci5jZGtGb2N1c0luaXRpYWxdPVwiY2RrRm9jdXNJbml0aWFsID09PSB1bmRlZmluZWQgPyBudWxsIDogY2RrRm9jdXNJbml0aWFsXCJcclxuICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleFwiXHJcbiAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKClcIlxyXG4gICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoKVwiXHJcbiAgICAgICAgICAgICA+XHJcbiAgICAgIDxkaXYgbWF0U3VmZml4XHJcbiAgICAgICAgICAgY2xhc3M9XCJoY2ktY29tYm9ib3gtYXJyb3ctd3JhcHBlclwiXHJcbiAgICAgICAgICAgKGNsaWNrKSA9IFwidG9nZ2xlT3BlbigkZXZlbnQpXCJcclxuICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0Q2xpY2soKVwiXHJcbiAgICAgICAgICAgKG1vdXNldXApPVwiZW5kQ2xpY2soKVwiXHJcbiAgICAgICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoY2ktY29tYm9ib3gtYXJyb3dcIj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxtYXQtc3Bpbm5lciBtYXRTdWZmaXggKm5nSWY9XCJzaG93TG9hZGVyKClcIiBbZGlhbWV0ZXJdPVwiMzBcIiBzdHlsZT1cImZsb2F0OiByaWdodDsgbWFyZ2luLWxlZnQ6IDhweFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0FjdGl2ZUZpcnN0T3B0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25TZWxlY3RlZCk9XCJ0aGlzLnNlbGVjdE9wdGlvbigkZXZlbnQub3B0aW9uLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuZWQpPVwidGhpcy5vbk9wZW5lZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsb3NlZCk9XCJ0aGlzLm9uQ2xvc2VkKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzcGxheVdpdGhdPVwidGhpcy5kaXNwbGF5Rm5cIj5cclxuICAgICAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0ICN2aWV3cG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiaXNPcGVuID8gbnVsbCA6ICdub25lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhjaS1jb21ib2JveC12aWV3cG9ydFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109IFwiY3VzdG9tVmlld3BvcnRDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwibnVtT3B0aW9uc1RvU2hvdyAqIG9wdGlvblNpemVQeFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluQnVmZmVyUHhdPVwibnVtT3B0aW9uc1RvU2hvdyAqIG9wdGlvblNpemVQeCAqIDJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEJ1ZmZlclB4XT1cIm51bU9wdGlvbnNUb1Nob3cgKiBvcHRpb25TaXplUHggKiAzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRDbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZXVwKT1cImVuZENsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKm5nSWY9XCJhbGxvd05vbmUgJiYgaXNPcGVuICYmICh0aGlzLmZvcmNlU2hvd05vbmUgfHwgIXRoaXMuaW5uZXJDb250cm9sLnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjdXN0b21PcHRpb25DbGFzc2VzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgTm9uZVxyXG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPG1hdC1vcHRpb24gKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0IG9mIHRoaXMubG9hZGVkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwib3B0XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImN1c3RvbU9wdGlvbkNsYXNzZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhjaS1jb21ib2JveC1zZWxlY3RlZF09XCIodmFsdWVGaWVsZCA/IG9wdFt2YWx1ZUZpZWxkXSA6IG9wdCkgPT09IG91dGVyQ29udHJvbC52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWF0LXNlbGVjdGVkXT1cIih2YWx1ZUZpZWxkID8gb3B0W3ZhbHVlRmllbGRdIDogb3B0KSA9PT0gb3V0ZXJDb250cm9sLnZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwib3B0aW9uU2l6ZVB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZGlzcGxheUZpZWxkID8gb3B0W2Rpc3BsYXlGaWVsZF0gOiBvcHQgfX1cclxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cclxuICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPlxyXG4gICAgICA8bWF0LWVycm9yPlxyXG4gICAgICAgIHt7IGdldEVycm9yKCkgfX1cclxuICAgICAgPC9tYXQtZXJyb3I+XHJcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgYCxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEN1c3RvbUNvbWJvQm94Q29tcG9uZW50KSxcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gIH1dLFxyXG4gIGhvc3Q6IHtcclxuICAgIGNsYXNzOiBcImhjaS1jb21ib2JveC1jb250YWluZXJcIlxyXG4gIH0sXHJcbiAgc3R5bGVzOiBbYFxyXG4gICAgLmhjaS1jb21ib2JveC1jb250YWluZXIge1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC1hcnJvdyB7XHJcbiAgICAgIHdpZHRoOiAwO1xyXG4gICAgICBoZWlnaHQ6IDA7XHJcbiAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgdHJhbnNwYXJlbnQ7XHJcbiAgICAgIGJvcmRlci1yaWdodDogNXB4IHNvbGlkIHRyYW5zcGFyZW50O1xyXG4gICAgICBib3JkZXItdG9wOiA1cHggc29saWQ7XHJcbiAgICAgIG1hcmdpbjogMCA0cHg7XHJcbiAgICAgIGNvbG9yOiByZ2JhKDAsMCwwLC41NCk7XHJcbiAgICB9XHJcblxyXG4gICAgLmhjaS1jb21ib2JveC1hcnJvdy13cmFwcGVyIHtcclxuICAgICAgZGlzcGxheTogdGFibGUtY2VsbDtcclxuICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LXZpZXdwb3J0IG1hdC1vcHRpb24ge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBwYWRkaW5nOiAwIC4ycmVtO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgbWF0LW9wdGlvbiAubWF0LW9wdGlvbi10ZXh0IHtcclxuICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIH1cclxuXHJcbiAgICAuaGNpLWNvbWJvYm94LXZpZXdwb3J0IC5oY2ktY29tYm9ib3gtc2VsZWN0ZWQge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkO1xyXG4gICAgfVxyXG5cclxuICAgIC5oY2ktY29tYm9ib3gtdmlld3BvcnQgLm1hdC1hY3RpdmUge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIGZpeCBqaXR0ZXJ5IHNjcm9sbCBidWcgaW4gY2hyb21lICovXHJcbiAgICAuaGNpLWNvbWJvYm94LXZpZXdwb3J0IHtcclxuICAgICAgb3ZlcmZsb3ctYW5jaG9yOiBub25lO1xyXG4gICAgfVxyXG4gIGBdLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21Db21ib0JveENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgcHVibGljIG9wdGlvblNpemVQeDogbnVtYmVyID0gMjU7XHJcbiAgcHVibGljIG51bU9wdGlvbnNUb1Nob3c6IG51bWJlciA9IDEwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBtYXhPcHRpb25zVG9TaG93OiBudW1iZXIgPSAxMDtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY3VzdG9tVmlld3BvcnRDbGFzczogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGN1c3RvbUZpZWxkQ2xhc3Nlcyh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jdXN0b21GaWVsZENsYXNzZXMgPSB2YWx1ZSA/IHZhbHVlIDogXCJcIjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VzdG9tRmllbGRDbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gISF0aGlzLl9jdXN0b21GaWVsZENsYXNzZXMgPyB0aGlzLl9jdXN0b21GaWVsZENsYXNzZXMgOiBcIm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFwiO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGN1c3RvbU9wdGlvbkNsYXNzZXModmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fY3VzdG9tT3B0aW9uQ2xhc3NlcyA9IHZhbHVlID8gdmFsdWUgOiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXN0b21PcHRpb25DbGFzc2VzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gISF0aGlzLl9jdXN0b21PcHRpb25DbGFzc2VzID8gdGhpcy5fY3VzdG9tT3B0aW9uQ2xhc3NlcyA6IFwiXCI7XHJcbiAgfVxyXG5cclxuICAvLyBJZiBhIGxhYmVsIGlzIG5vdCBzcGVjaWZpZWQgdGhlIHBsYWNlaG9sZGVyIGlzIHByb21vdGVkIHRvIGEgbGFiZWwuXHJcbiAgLy8gVG8gY3JlYXRlIGEgZm9ybSBmaWVsZCB3aXRoIG9ubHkgYSBwbGFjZWhvbGRlciwgc3BlY2lmeSBhbiBlbXB0eVxyXG4gIC8vIGxhYmVsIHRvIHByZXZlbnQgdGhlIHBsYWNlaG9sZGVyIGZyb20gYmVpbmcgcHJvbW90ZWQuXHJcbiAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICAvLyBSZW1vdmVzIHRoZSBwbGFjZWhvbGRlciBhZnRlciBhIHNlbGVjdGlvbiBpcyBtYWRlXHJcbiAgQElucHV0KCkgcHVibGljIHRlbXBvcmFyeVBsYWNlaG9sZGVyOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyB0b29sdGlwOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhbGxvd05vbmU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0VGV4dE9uT3BlbiA9IHRydWU7XHJcblxyXG4gIC8vIHRlbGwgbWF0LWRpYWxvZyB0byBwYXNzIGluaXRpYWwgZm9jdXMgdG8gdGhlIGlubmVyIGlucHV0XHJcbiAgQEhvc3RCaW5kaW5nKFwiYXR0ci5jZGtGb2N1c0luaXRpYWxcIikgX2Nka0ZvY3VzSW5pdGlhbCA9IG51bGw7XHJcbiAgQElucHV0KCkgcHVibGljIGNka0ZvY3VzSW5pdGlhbDogc3RyaW5nID0gdW5kZWZpbmVkO1xyXG5cclxuICAvLyBvbiB0YWIsIHNraXAgdGhlIGhvc3QgZWxlbWVudCBhbmQgZm9jdXMgdGhlIGlucHV0XHJcbiAgQEhvc3RCaW5kaW5nKFwiYXR0ci50YWJpbmRleFwiKSBfdGFiaW5kZXggPSBudWxsO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0YWJpbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgcHVibGljIGZvcmNlU2hvd05vbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIG9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgYWxsb3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGlzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBsb2FkZWRPcHRpb25zOiBhbnlbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgdmFsdWVGaWVsZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHByaXZhdGUgZm9yY2VFbWl0T2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHVibGljIGRpc3BsYXlGaWVsZDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBhcHBlYXJhbmNlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmbG9hdExhYmVsOiBGbG9hdExhYmVsVHlwZTtcclxuXHJcbiAgLy8gU2V0IHRvIGVtcHR5IHRvIG5vdCBzaG93IGVycm9yc1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGRlZmluZUVycm9yczogYW55ID0ge3JlcXVpcmVkOiBcIlRoaXMgaXMgYSByZXF1aXJlZCBmaWVsZFwifTtcclxuXHJcbiAgcHJpdmF0ZSBfc2hvd0xvYWRlciA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2N1c3RvbUZpZWxkQ2xhc3Nlczogc3RyaW5nID0gXCJcIjtcclxuICBwcml2YXRlIF9jdXN0b21PcHRpb25DbGFzc2VzOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuICBwdWJsaWMgb3V0ZXJDb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCk7XHJcbiAgcHVibGljIGlubmVyQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbChudWxsKTtcclxuICBwcml2YXRlIGlnbm9yZUlubmVyQ29udHJvbENoYW5nZXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHN1YnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBwcml2YXRlIG5vTmdDb250cm9sOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNlbGVjdGVkSW5kZXg6IG51bWJlcjtcclxuXHJcbiAga2V5TWFuYWdlcjogTGlzdEtleU1hbmFnZXI8SGlnaGxpZ2h0YWJsZT47XHJcbiAgdmlld3BvcnRSZW5kZXJSYW5nZTogTGlzdFJhbmdlO1xyXG4gIHZpZXdwb3J0VmlzaWJsZVJhbmdlOiBMaXN0UmFuZ2UgPSB7XHJcbiAgICBzdGFydDogMCxcclxuICAgIGVuZDogdGhpcy5udW1PcHRpb25zVG9TaG93IC0gMVxyXG4gIH07XHJcblxyXG4gIGFjdGl2ZVZhbHVlOiBhbnk7XHJcblxyXG4gIHB1YmxpYyBjbGlja0luUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIG9wdGlvblNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvcHRpb25DaGFuZ2VkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvcHRpb25zTG9hZGVkOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZChcInZpZXdwb3J0XCIsIHtzdGF0aWM6IHRydWV9KVxyXG4gIHZpZXdwb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJpbnB1dFwiLCB7c3RhdGljOiB0cnVlfSlcclxuICBpbnB1dEVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJpbnB1dFwiLCB7cmVhZDogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciwgc3RhdGljOiBmYWxzZX0pXHJcbiAgYXV0b0NvbXBsZXRlVHJpZ2dlcjogTWF0QXV0b2NvbXBsZXRlVHJpZ2dlcjtcclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICBwcml2YXRlIG9uVG91Y2hlZEZuOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIHB1YmxpYyBkaXNwbGF5Rm46IChvcHQ/OiBhbnkpID0+IHN0cmluZyB8IHVuZGVmaW5lZCA9IChvcHQ/OiBhbnkpID0+IHtcclxuICAgIHJldHVybiBvcHQgPyAodGhpcy5kaXNwbGF5RmllbGQgPyBvcHRbdGhpcy5kaXNwbGF5RmllbGRdIDogb3B0KSA6IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2hvd0xvYWRlciA9IHRoaXMuYWxsb3dMb2FkZXIgJiYgKCEgdGhpcy5vcHRpb25zIHx8IHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDApO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IG5nQ29udHJvbDogTmdDb250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsKTtcclxuICAgIGlmIChuZ0NvbnRyb2wgJiYgbmdDb250cm9sLmNvbnRyb2wpIHtcclxuICAgICAgdGhpcy5vdXRlckNvbnRyb2wgPSBuZ0NvbnRyb2wuY29udHJvbDtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLm91dGVyQ29udHJvbC52YWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnModGhpcy5vdXRlckNvbnRyb2wuYXN5bmNWYWxpZGF0b3IpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubm9OZ0NvbnRyb2wgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3Vicy5hZGQodGhpcy5pbm5lckNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpLnN1YnNjcmliZSgoX3ZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHRoaXMuaXNPcGVuICYmICF0aGlzLmlnbm9yZUlubmVyQ29udHJvbENoYW5nZXMpIHtcclxuICAgICAgICB0aGlzLmZpbHRlck9wdGlvbnMoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlnbm9yZUlubmVyQ29udHJvbENoYW5nZXMgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSkpO1xyXG5cclxuICAgIC8vIHdvcmsgYXJvdW5kIGZvciB2YWxpZGF0b3JzIG5vdCBhbHdheXMgcHJvcGFnYXRpbmdcclxuICAgIHRoaXMuc3Vicy5hZGQodGhpcy5vdXRlckNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKF9ldmVudDogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldFZhbGlkYXRvcnModGhpcy5vdXRlckNvbnRyb2wudmFsaWRhdG9yKTtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKHRoaXMub3V0ZXJDb250cm9sLmFzeW5jVmFsaWRhdG9yKTtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB0aGlzLmlubmVyQ29udHJvbC5zZXRFcnJvcnModGhpcy5vdXRlckNvbnRyb2wuZXJyb3JzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm91dGVyQ29udHJvbC50b3VjaGVkKSB7XHJcbiAgICAgICAgdGhpcy5pbm5lckNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcblxyXG4gICAgLy8gdGhpcyBvYmplY3QgaXMgdXNlZCB0byBjb250cm9sIHRoZSBhY3RpdmUgc3RhdGUgd2hlbiBrZXlpbmcgdXAgYW5kIGRvd25cclxuICAgIHRoaXMua2V5TWFuYWdlciA9IHRoaXMuYXV0b0NvbXBsZXRlVHJpZ2dlci5hdXRvY29tcGxldGUuX2tleU1hbmFnZXI7XHJcbiAgICB0aGlzLmtleU1hbmFnZXIud2l0aFdyYXAoZmFsc2UpO1xyXG5cclxuICAgIHRoaXMuc3Vicy5hZGQoY29tYmluZUxhdGVzdChbXHJcbiAgICAgIHRoaXMudmlld3BvcnQucmVuZGVyZWRSYW5nZVN0cmVhbSxcclxuICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxlZEluZGV4Q2hhbmdlXHJcbiAgICBdKS5zdWJzY3JpYmUoKFtyZW5kZXJlZFJhbmdlLCBzY3JvbGxlZEluZGV4XTogW0xpc3RSYW5nZSwgbnVtYmVyXSkgPT4ge1xyXG5cclxuICAgICAgLy8gSW5zdGVhZCBvZiBsb2FkaW5nIHRoZSB3aG9sZSBpdGVtIGxpc3QgYXQgb25jZSwgdGhlIHZpcnR1YWwgc2Nyb2xsIHZpZXdwb3J0IGJ1ZmZlcnNcclxuICAgICAgLy8gYSByYW5nZSBvZiBlbnRyaWVzLCBvbmx5IGEgcG9ydGlvbiBvZiB3aGljaCBhcmUgd2l0aGluIHRoZSB2aXNpYmxlIGZvbGRcclxuICAgICAgdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlID0gcmVuZGVyZWRSYW5nZTtcclxuXHJcbiAgICAgIC8vIHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUgdmlzaWJsZSByYW5nZSBvdXJzZWx2ZXNcclxuICAgICAgbGV0IGxlbjogbnVtYmVyID0gTWF0aC5taW4odGhpcy5sb2FkZWRPcHRpb25zLmxlbmd0aCArICh0aGlzLmFsbG93Tm9uZSA/IDEgOiAwKSwgdGhpcy5udW1PcHRpb25zVG9TaG93IC0gMSk7XHJcblxyXG4gICAgICB0aGlzLnZpZXdwb3J0VmlzaWJsZVJhbmdlID0ge1xyXG4gICAgICAgIHN0YXJ0OiBzY3JvbGxlZEluZGV4LFxyXG4gICAgICAgIGVuZDogc2Nyb2xsZWRJbmRleCArIGxlblxyXG4gICAgICB9O1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMub3B0aW9ucykge1xyXG4gICAgICBsZXQgb3B0aW9uc0NoYW5nZTogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5vcHRpb25zO1xyXG4gICAgICBpZiAoIW9wdGlvbnNDaGFuZ2UuY3VycmVudFZhbHVlIHx8IG9wdGlvbnNDaGFuZ2UuY3VycmVudFZhbHVlLmxlbmd0aCA8IDEpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcclxuICAgICAgICBpZih0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAhPSBudWxsKXtcclxuICAgICAgICAgIC8vUmVzZXQgdGhlIGlubmVyQ29udHJvbCB2YWx1ZSBvZiB0aGUgZHJvcGRvd24gbGlzdCB0byBhbiBlbXB0eSBhcnJheSBpbiBjYXNlIG9mIG5vIHJlc3VsdHMgYXJlIHByZXNlbnQgdG8gYmUgZGlzcGxheWVkLlxyXG4gICAgICAgICAgLy9UaGlzIGZsdXNoZXMgb3V0IHRoZSBzdGFsZSB2YWx1ZSBmcm9tIHRoZSBsaXN0IGlmIHRoZXJlIGFyZSBubyByZXN1bHRzIHRvIGJlIGRpc3BsYXllZC5cclxuICAgICAgICAgIHRoaXMuaW5uZXJDb250cm9sLnNldFZhbHVlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjdXJyZW50T3B0czogYW55W10gPSA8YW55W10+b3B0aW9uc0NoYW5nZS5jdXJyZW50VmFsdWU7XHJcbiAgICAgIGlmIChjdXJyZW50T3B0cyAmJiBcImxlbmd0aFwiIGluIGN1cnJlbnRPcHRzICYmIGN1cnJlbnRPcHRzICE9PSBvcHRpb25zQ2hhbmdlLnByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9zaG93TG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zTG9hZGVkLmVtaXQoKTtcclxuXHJcbiAgICAgICAgLy8gSWYgbnVtYmVyIG9mIG9wdGlvbnMgaXMgbGVzcyB0aGFuIG91ciBtYXgsIHJlZHVjZSBzaXplIG9mIG92ZXJsYXlcclxuICAgICAgICB0aGlzLm51bU9wdGlvbnNUb1Nob3cgPSBNYXRoLm1pbihjdXJyZW50T3B0cy5sZW5ndGggKyAodGhpcy5hbGxvd05vbmUgPyAxIDogMCksIHRoaXMubWF4T3B0aW9uc1RvU2hvdyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc2hvd0xvYWRlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gVGhlIGF1dG9jb21wbGV0ZSB3aWxsIGF1dG9tYXRpY2FsbHkgcG9wIG9wZW4gb25jZSBpdCBoYXMgb3B0aW9ucyBmaWx0ZXJlZCBpbnRvIGl0LFxyXG4gICAgICAvLyBidXQgd2UgZG9uJ3Qgd2FudCBpdCB0byBvbiBpbml0aWFsIHBhZ2UgbG9hZCBvciB3aGVuIHRhYmJpbmcgdGhvdWdoXHJcbiAgICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyT3B0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMubG9hZE9ubHlDdXJyZW50VmFsdWUodGhpcy5vdXRlckNvbnRyb2wudmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZE9ubHlDdXJyZW50VmFsdWUob2JqKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZUZuID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZEZuID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChpc0Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLmRpc2FibGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW5uZXJDb250cm9sLmVuYWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3IoKTogc3RyaW5nIHtcclxuICAgIGZvciAoY29uc3QgZXJyb3IgaW4gdGhpcy5vdXRlckNvbnRyb2wuZXJyb3JzKSB7XHJcbiAgICAgIGlmICh0aGlzLmRlZmluZUVycm9ycyAmJiBlcnJvciBpbiB0aGlzLmRlZmluZUVycm9ycykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmluZUVycm9yc1tlcnJvcl07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZE9ubHlDdXJyZW50VmFsdWUoY250cmxWYWw6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMgfHwgdGhpcy5vcHRpb25zLmxlbmd0aCA8IDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBuZXdWYWx1ZTogYW55ID0gbnVsbDtcclxuICAgIGlmIChjbnRybFZhbCAhPT0gbnVsbCAmJiBjbnRybFZhbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCBjdXJyZW50bHlTZWxlY3RlZDogYW55ID0gdGhpcy5vcHRpb25zLmZpbmQoKG9wdDogYW55KSA9PiB7XHJcbiAgICAgICAgbGV0IG9wdFZhbHVlOiBhbnkgPSB0aGlzLnZhbHVlRmllbGQgPyBvcHRbdGhpcy52YWx1ZUZpZWxkXSA6IG9wdDtcclxuICAgICAgICBpZiAodGhpcy5mb3JjZUVtaXRPYmplY3QpIHtcclxuICAgICAgICAgIGxldCBvdXRlclZhbHVlOiBhbnkgPSBjbnRybFZhbCA/ICh0aGlzLnZhbHVlRmllbGQgPyBjbnRybFZhbFt0aGlzLnZhbHVlRmllbGRdIDogY250cmxWYWwpIDogbnVsbDtcclxuICAgICAgICAgIGlmIChvcHRWYWx1ZSA9PT0gb3V0ZXJWYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIG9wdFZhbHVlID09PSBjbnRybFZhbDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoY3VycmVudGx5U2VsZWN0ZWQpIHtcclxuICAgICAgICBuZXdWYWx1ZSA9IGN1cnJlbnRseVNlbGVjdGVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJlZmVyIHRvIGNoZWNrIGlkIGlmIGl0IGhhcyBvbmUgIHZzIHN0cmFpZ2h0IGFnYWluc3QgaXQncyBvYmplY3QgaWRlbnRpdHlcclxuICAgIGlmICh0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAmJiBuZXdWYWx1ZSAhPSBudWxsICYmIHRoaXMudmFsdWVGaWVsZCkge1xyXG4gICAgICBpZiAodGhpcy5pbm5lckNvbnRyb2wudmFsdWVbdGhpcy52YWx1ZUZpZWxkXSAhPT0gbmV3VmFsdWVbdGhpcy52YWx1ZUZpZWxkXSkge1xyXG4gICAgICAgIHRoaXMuaWdub3JlSW5uZXJDb250cm9sQ2hhbmdlcyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsdWUobmV3VmFsdWUpO1xyXG4gICAgICAgIHRoaXMub3B0aW9uU2VsZWN0ZWQuZW1pdChuZXdWYWx1ZVt0aGlzLnZhbHVlRmllbGRdKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmlubmVyQ29udHJvbC52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcclxuICAgICAgdGhpcy5pZ25vcmVJbm5lckNvbnRyb2xDaGFuZ2VzID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pbm5lckNvbnRyb2wuc2V0VmFsdWUobmV3VmFsdWUpO1xyXG4gICAgICBsZXQgbnYgPSBuZXdWYWx1ZSA/ICgodGhpcy52YWx1ZUZpZWxkICYmICF0aGlzLmZvcmNlRW1pdE9iamVjdCkgPyBuZXdWYWx1ZVt0aGlzLnZhbHVlRmllbGRdIDogbmV3VmFsdWUpIDogbnVsbDtcclxuICAgICAgdGhpcy5vcHRpb25TZWxlY3RlZC5lbWl0KG52KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVyT3B0aW9ucyhzaG93QWxsOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9yY2VTaG93Tm9uZSA9IHNob3dBbGw7XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMubGVuZ3RoIDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNob3dBbGwgfHwgIXRoaXMuaW5uZXJDb250cm9sLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMubG9hZGVkT3B0aW9ucyA9IFsuLi50aGlzLm9wdGlvbnNdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IHNlYXJjaFZhbHVlOiBzdHJpbmcgPSBcIlwiO1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuaW5uZXJDb250cm9sLnZhbHVlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgc2VhcmNoVmFsdWUgPSB0aGlzLmlubmVyQ29udHJvbC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGlzcGxheUZpZWxkKSB7XHJcbiAgICAgICAgc2VhcmNoVmFsdWUgPSB0aGlzLmlubmVyQ29udHJvbC52YWx1ZVt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxvYWRlZE9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGxldCBvcHREaXNwbGF5OiBzdHJpbmcgPSAodGhpcy5kaXNwbGF5RmllbGQgPyBvcHRbdGhpcy5kaXNwbGF5RmllbGRdIDogb3B0KS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHJldHVybiBvcHREaXNwbGF5LmluY2x1ZGVzKHNlYXJjaFZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZm9yY2VTaG93Tm9uZSA9IHRoaXMubG9hZGVkT3B0aW9ucy5sZW5ndGggPT09IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5nZXRPcHRJbmRleCh0aGlzLm91dGVyQ29udHJvbC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd0xvYWRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFsbG93TG9hZGVyICYmIHRoaXMuX3Nob3dMb2FkZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BlbigpIHtcclxuICAgIGlmICh0aGlzLmlubmVyQ29udHJvbC5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVGhlIGF1dG9jb21wbGV0ZSB3aWxsIG9ubHkgb3BlbiB3aGVuIG9wdGlvbnMgYXJlIGxvYWRlZFxyXG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKHRydWUpO1xyXG4gICAgdGhpcy5hdXRvQ29tcGxldGVUcmlnZ2VyLm9wZW5QYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlKCkge1xyXG4gICAgdGhpcy5hdXRvQ29tcGxldGVUcmlnZ2VyLmNsb3NlUGFuZWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbk9wZW5lZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9yY2VTaG93Tm9uZSA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG5cclxuICAgIGlmKHRoaXMuc2VsZWN0VGV4dE9uT3Blbil7XHJcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0KCk7IC8vIEhpZ2hsaWdodHMgdGV4dFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggPiAwKSB7XHJcbiAgICAgIC8vIG1ha2UgdGhlIHNlbGVjdGVkIG9wdGlvbiBhbHNvIHRoZSBhY3RpdmUgb3B0aW9uXHJcbiAgICAgIHRoaXMuYWN0aXZlVmFsdWUgPSB0aGlzLmdldE9wdFZhbCh0aGlzLmxvYWRlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XSk7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWRPcHRpb24oKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25DbG9zZWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghdGhpcy5pbm5lckNvbnRyb2wudmFsdWUgJiYgdGhpcy5vdXRlckNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RPcHRpb24obnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkT25seUN1cnJlbnRWYWx1ZSh0aGlzLm91dGVyQ29udHJvbC52YWx1ZSk7XHJcblxyXG4gICAgLy8gcmVzZXQgdGhlIG9wdGlvbnMgc28gdGhlIGF1dG9jb21wbGV0ZSB3b24ndCBhdXRvbWF0aWNhbGx5IG9wZW4gb24gdGhlIG5leHQgdGFiIHRocm91Z2hcclxuICAgIHRoaXMubG9hZGVkT3B0aW9ucyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0Q2xpY2soKSB7XHJcbiAgICAvLyBjbGlja2luZyBvbiBjZXJ0YWluIHBhcnRzIG9mIHRoZSBtYXQtZmllbGQgd2lsbCBcImZsaWNrZXJcIiB0aGUgZm9jdXMsIHRyaWdnZXJpbmdcclxuICAgIC8vIGVycm9yIHZhbGlkYXRpb24gZWFybHkuIFRoaXMgdHJhY2tzIHRob3NlIGludGVybmFsIGNsaWNrcyBzbyB0aGV5IGNhbiBiZSBpZ25vcmVkXHJcbiAgICB0aGlzLmNsaWNrSW5Qcm9ncmVzcyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW5kQ2xpY2soKSB7XHJcbiAgICB0aGlzLmNsaWNrSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKCF0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVPcGVuKGV2ZW50OiBNb3VzZUV2ZW50KTp2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJUYWJcIiB8fCBldmVudC5rZXkgPT09IFwiRW50ZXJcIikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRoZXJlIGlzIGEgYnVnIHdoZXJlIHRoZSBjZGsgYTExeSBLZXlNYW5hZ2VyIGltcGxlbWVudGF0aW9uIGlzIG5vdCBjb21wYXRpYmxlIHdpdGhcclxuICAgICAgLy8gdGhlIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIsIHdoaWNoIGNhdXNlcyB0aGUgRHJvcC1kb3duIG5vdCBzY3JvbGwgd2l0aCBrZXlib2FyZFxyXG4gICAgICAvLyBvbiBsb25nIG9wdGlvbiBsaXN0cy5cclxuICAgICAgLy9cclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTY1OThcclxuICAgICAgLy9cclxuICAgICAgLy8gVGhpcyB3b3JrIGFyb3VuZCB0YWtlcyBjb250cm9sIG9mIHRoZSBrZXlib2FyZCBhbmQgbWFudWFsbHkgc2Nyb2xscyBhbmQgYWN0aXZhdGVzXHJcbiAgICAgIC8vIHRoZSBvcHRpb25zXHJcbiAgICAgIC8vXHJcbiAgICAgIC8vIFJlZmVyZW5jZXM6XHJcbiAgICAgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21hc3Rlci9zcmMvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS10cmlnZ2VyLnRzXHJcbiAgICAgIC8vICAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9ibG9iL21hc3Rlci9zcmMvY2RrL2ExMXkva2V5LW1hbmFnZXIvbGlzdC1rZXktbWFuYWdlci50c1xyXG4gICAgICAvLyAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYXN0ZXIvc3JjL2Nkay9hMTF5L2tleS1tYW5hZ2VyL2FjdGl2ZWRlc2NlbmRhbnQta2V5LW1hbmFnZXIudHNcclxuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd1VwXCIgfHwgZXZlbnQua2V5ID09PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdEFjdGl2ZUl0ZW0oKTtcclxuICAgICAgICB0aGlzLnNoaWZ0QWN0aXZlSXRlbShldmVudC5rZXkpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tBY3RpdmVCb3VuZGFyaWVzKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGJlZm9yZSBvdXIga2V5cHJlc3MgYmluZGluZyBldmVuIHRyaWdnZXJzLCBhbmd1bGFyIGhhcyBhbHJlYWR5IG1vdmVkIHRoZSBhY3RpdmUgc2VsZWN0aW9uXHJcbiAgLy8gdW5zeW5jaW5nIGl0IHdpdGggb3VyIGRpc3BsYXkuIHRoaXMgY29kZSByZS1pbml0aWFsaXplcyB0aGUgYWN0aXZlIG9wdGlvblxyXG4gIGluaXRBY3RpdmVJdGVtKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlVmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmFjdGl2ZVZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBhY3RpdmVJbmRleDogbnVtYmVyID0gdGhpcy5nZXRBY3RpdmVJbmRleCgpO1xyXG5cclxuICAgICAgLy8gdGhpcyBkb2VzIHRoZSBjb252ZXJzaW9uIGZyb20gYW4gaW5kZXggd2l0aGluIGFsbCBvcHRpb25zIGRvd24gdG8gYSBwb3NpdGlvbiB3aXRoaW4gdGhlXHJcbiAgICAgIC8vIGRpc3BsYXllZCByYW5nZSwgd2hpY2ggaXMgYWxsIHRoZSBrZXltYW5hZ2VyIGlzIGF3YXJlIG9mXHJcbiAgICAgIGxldCBwb3NpdGlvbiA9IGFjdGl2ZUluZGV4IC0gdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlLnN0YXJ0O1xyXG4gICAgICB0aGlzLmtleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShwb3NpdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaGlmdEFjdGl2ZUl0ZW0oa2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmIChrZXkgPT09IFwiQXJyb3dVcFwiKSB7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXRQcmV2aW91c0l0ZW1BY3RpdmUoKTtcclxuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcIkFycm93RG93blwiKSB7XHJcbiAgICAgIHRoaXMua2V5TWFuYWdlci5zZXROZXh0SXRlbUFjdGl2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmtleU1hbmFnZXIuYWN0aXZlSXRlbSkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVZhbHVlID0gdGhpcy5nZXRPcHRWYWwoKDxNYXRPcHRpb24+dGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pLnZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGNoZWNrIGlmIHRoZSBhY3RpdmUgb3B0aW9uIGluZGV4IGlzIHdpdGhpbiB0aGUgZGlzcGxheWVkIHZpZXdwb3J0IHdpbmRvd1xyXG4gIC8vIGlmIG5vdCwgc2Nyb2xsIGl0IGludG8gdmlld1xyXG4gIGNoZWNrQWN0aXZlQm91bmRhcmllcygpOiB2b2lkIHtcclxuICAgIGxldCBhY3RpdmVJbmRleDogbnVtYmVyID0gdGhpcy5nZXRBY3RpdmVJbmRleCgpO1xyXG5cclxuICAgIGlmIChhY3RpdmVJbmRleCA8IHRoaXMudmlld3BvcnRWaXNpYmxlUmFuZ2Uuc3RhcnQpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldChhY3RpdmVJbmRleCAqIHRoaXMub3B0aW9uU2l6ZVB4KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSBlbHNlIGlmIChhY3RpdmVJbmRleCA+IHRoaXMudmlld3BvcnRWaXNpYmxlUmFuZ2UuZW5kKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudmlld3BvcnQuc2Nyb2xsVG9PZmZzZXQoKGFjdGl2ZUluZGV4IC0gKHRoaXMubnVtT3B0aW9uc1RvU2hvdyAtIDEpKSAqIHRoaXMub3B0aW9uU2l6ZVB4KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRBY3RpdmVJbmRleCgpIHtcclxuICAgIGxldCBhY3RpdmVJbmRleDogbnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5hY3RpdmVWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYWN0aXZlVmFsdWUgIT09IG51bGwpIHtcclxuXHJcbiAgICAgIC8vIGlmIHdlIGFkZGVkIGEgbm9uZSBvcHRpb24gdGhlIHJldHVybmVkIGluZGV4IHdvdWxkIGJlIG9mZiBieSBvbmVcclxuICAgICAgbGV0IHZhbEluZGV4ID0gdGhpcy5nZXRPcHRJbmRleCh0aGlzLmFjdGl2ZVZhbHVlKSArICh0aGlzLmFsbG93Tm9uZSAmJiAodGhpcy5mb3JjZVNob3dOb25lIHx8ICF0aGlzLmlubmVyQ29udHJvbC52YWx1ZSkgPyAxIDogMCk7XHJcblxyXG4gICAgICAvLyB0aGUgaW5kZXggc2hvdWxkIGJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2Ygb3VyIGVudGlyZSBidWZmZXIsIG9yIGp1c3QgYWxsb3cgaXQgdG8gcmVzZXRcclxuICAgICAgaWYgKHZhbEluZGV4ID49IHRoaXMudmlld3BvcnRSZW5kZXJSYW5nZS5zdGFydFxyXG4gICAgICAgICYmICghdGhpcy52aWV3cG9ydFJlbmRlclJhbmdlLmVuZCB8fCB2YWxJbmRleCA8PSB0aGlzLnZpZXdwb3J0UmVuZGVyUmFuZ2UuZW5kKVxyXG4gICAgICApIHtcclxuICAgICAgICBhY3RpdmVJbmRleCA9IHZhbEluZGV4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFjdGl2ZUluZGV4O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIC8vIEhpZ2hsaWdodHMgdGV4dFxyXG4gICAgICBpZiAodGhpcy5zZWxlY3RUZXh0T25PcGVuKSB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZWxlY3QoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRm9jdXNPdXQoKSB7XHJcbiAgICAvLyBtYXJrIGNvbnRyb2wgdG91Y2hlZCBhbmQgdHJpZ2dlciBlcnJvciB2YWxpZGF0aW9uXHJcbiAgICBpZiAoIXRoaXMuY2xpY2tJblByb2dyZXNzKSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgdGhpcy5vblRvdWNoZWRGbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdE9wdGlvbihvcHQ6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IG5ld1ZhbCA9IHRoaXMuZ2V0T3B0VmFsKG9wdCwgdGhpcy5mb3JjZUVtaXRPYmplY3QpO1xyXG5cclxuICAgIGlmICh0aGlzLm5vTmdDb250cm9sKSB7XHJcbiAgICAgIHRoaXMub3V0ZXJDb250cm9sLnNldFZhbHVlKG5ld1ZhbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vbkNoYW5nZUZuKG5ld1ZhbCk7XHJcbiAgICB0aGlzLm9wdGlvblNlbGVjdGVkLmVtaXQobmV3VmFsKTtcclxuICAgIHRoaXMub3B0aW9uQ2hhbmdlZC5lbWl0KG5ld1ZhbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9TZWxlY3RlZE9wdGlvbigpOiB2b2lkIHtcclxuICAgIC8vIHNjcm9sbCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbiB3aGVuIHdlIG9wZW4gdGhlIGRyb3Bkb3duXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEluZGV4ID4gMCkge1xyXG4gICAgICBsZXQgb2Zmc2V0SW5kZXg6IG51bWJlciA9IHRoaXMuc2VsZWN0ZWRJbmRleCArICh0aGlzLmFsbG93Tm9uZSA/IDEgOiAwKTsgLy8gYWRqdXN0IGZvciBOb25lIGVudHJ5XHJcbiAgICAgIG9mZnNldEluZGV4IC09ICh0aGlzLm51bU9wdGlvbnNUb1Nob3cgLyAyKSAtIDE7IC8vIGNhbGN1bGF0ZSBtaWRkbGUgb2Ygdmlld3BvcnRcclxuICAgICAgdGhpcy52aWV3cG9ydC5zY3JvbGxUb09mZnNldChvZmZzZXRJbmRleCAqIHRoaXMub3B0aW9uU2l6ZVB4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE9wdFZhbChvcHQ6IGFueSwgZm9yY2VPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XHJcbiAgICBpZiAodGhpcy52YWx1ZUZpZWxkICYmICFmb3JjZU9iamVjdCkge1xyXG4gICAgICBpZiAob3B0ICE9PSBudWxsICYmIG9wdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHQgPT09IFwib2JqZWN0XCIgJiYgdGhpcy52YWx1ZUZpZWxkIGluIG9wdCkge1xyXG4gICAgICAgIHJldHVybiBvcHRbdGhpcy52YWx1ZUZpZWxkXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3B0O1xyXG4gIH1cclxuXHJcbiAgZ2V0T3B0SW5kZXgob3B0VmFsdWU6IGFueSk6IG51bWJlciB7XHJcbiAgICAvLyBmaW5kIHRoZSBpbmRleCBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb25cclxuICAgIGlmIChvcHRWYWx1ZSAhPT0gbnVsbCAmJiBvcHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvYWRlZE9wdGlvbnMuZmluZEluZGV4KChvcHRpb246IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldE9wdFZhbChvcHRpb24pID09PSBvcHRWYWx1ZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnMudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuIl19
|