ca-components 1.0.78 → 1.0.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/esm2022/lib/ca-components.module.mjs +16 -4
  2. package/esm2022/lib/components/ca-activity-log-list/ca-activity-log-list.component.mjs +1 -1
  3. package/esm2022/lib/components/ca-app-tooltip-v2/ca-app-tooltip-v2.component.mjs +1 -1
  4. package/esm2022/lib/components/ca-filters/components/ca-dispatcher-filter/ca-dispatcher-filter.component.mjs +2 -2
  5. package/esm2022/lib/components/ca-filters/components/ca-money-filter/ca-money-filter.component.mjs +2 -2
  6. package/esm2022/lib/components/ca-filters/components/ca-state-filter/ca-state-filter.component.mjs +2 -2
  7. package/esm2022/lib/components/ca-filters/components/ca-trailer-type-filter/ca-trailer-type-filter.component.mjs +1 -1
  8. package/esm2022/lib/components/ca-filters/components/ca-truck-type-filter/ca-truck-type-filter.component.mjs +1 -1
  9. package/esm2022/lib/components/ca-filters/components/ca-user-filter/ca-user-filter.component.mjs +2 -2
  10. package/esm2022/lib/components/ca-input/base-classes/ca-input-base-helpres.mjs +237 -0
  11. package/esm2022/lib/components/ca-input/base-classes/ca-input-base.mjs +1020 -0
  12. package/esm2022/lib/components/ca-input/base-classes/ca-input-event-manager.mjs +24 -0
  13. package/esm2022/lib/components/ca-input/ca-input.component.mjs +53 -163
  14. package/esm2022/lib/components/ca-input/components/ca-input-clear/ca-input-clear.component.mjs +4 -4
  15. package/esm2022/lib/components/ca-input/components/ca-input-placeholder-icon/ca-input-placeholder-icon.component.mjs +11 -17
  16. package/esm2022/lib/components/ca-input/config/ca-input.config.mjs +1 -1
  17. package/esm2022/lib/components/ca-input/directives/caps-lock.directive.mjs +50 -0
  18. package/esm2022/lib/components/ca-input/directives/index.mjs +5 -1
  19. package/esm2022/lib/components/ca-input/directives/input-max-value.directive.mjs +53 -0
  20. package/esm2022/lib/components/ca-input/directives/min-max-value.directive.mjs +1 -1
  21. package/esm2022/lib/components/ca-input/directives/price_format.directive.mjs +41 -0
  22. package/esm2022/lib/components/ca-input/directives/restrict-input.directive.mjs +98 -0
  23. package/esm2022/lib/components/ca-input/enums/input-text-transform.enum.mjs +9 -0
  24. package/esm2022/lib/components/ca-input/input-test/input-test.component.mjs +175 -0
  25. package/esm2022/lib/components/ca-input/pipes/input-container-class.pipe.mjs +16 -16
  26. package/esm2022/lib/components/ca-input/pipes/input-datetime-picker-class.pipe.mjs +1 -1
  27. package/esm2022/lib/components/ca-input/pipes/input-error.pipe.mjs +18 -15
  28. package/esm2022/lib/components/ca-input/pipes/input-pattern.pipe.mjs +322 -0
  29. package/esm2022/lib/components/ca-input/services/index.mjs +1 -2
  30. package/esm2022/lib/components/ca-input/utils/constants/input-constants.mjs +102 -1
  31. package/esm2022/lib/components/ca-input-address-dropdown/ca-input-address-dropdown.component.mjs +2 -2
  32. package/esm2022/lib/components/ca-input-datetime-picker/ca-input-datetime-picker.component.mjs +809 -0
  33. package/esm2022/lib/components/ca-input-dropdown/ca-input-dropdown.component.mjs +18 -18
  34. package/esm2022/lib/components/ca-rating-review/ca-rating-review.component.mjs +2 -2
  35. package/esm2022/lib/components/ca-rating-review/components/ca-ratings-reviews-popup/ca-ratings-reviews-popup.component.mjs +1 -1
  36. package/esm2022/lib/components/ca-upload-files/components/ca-upload-file/ca-upload-file.component.mjs +1 -1
  37. package/esm2022/public-api.mjs +3 -1
  38. package/fesm2022/ca-components.mjs +7690 -7171
  39. package/fesm2022/ca-components.mjs.map +1 -1
  40. package/lib/ca-components.module.d.ts +32 -30
  41. package/lib/components/ca-filters/ca-filter.component.d.ts +2 -2
  42. package/lib/components/ca-input/base-classes/ca-input-base-helpres.d.ts +29 -0
  43. package/lib/components/ca-input/base-classes/ca-input-base.d.ts +82 -0
  44. package/lib/components/ca-input/base-classes/ca-input-event-manager.d.ts +16 -0
  45. package/lib/components/ca-input/ca-input.component.d.ts +30 -48
  46. package/lib/components/ca-input/components/ca-input-placeholder-icon/ca-input-placeholder-icon.component.d.ts +3 -7
  47. package/lib/components/ca-input/config/ca-input.config.d.ts +10 -1
  48. package/lib/components/ca-input/directives/caps-lock.directive.d.ts +14 -0
  49. package/lib/components/ca-input/directives/index.d.ts +4 -0
  50. package/lib/components/ca-input/directives/input-max-value.directive.d.ts +12 -0
  51. package/lib/components/ca-input/directives/price_format.directive.d.ts +11 -0
  52. package/lib/components/ca-input/directives/restrict-input.directive.d.ts +15 -0
  53. package/lib/components/ca-input/enums/input-text-transform.enum.d.ts +6 -0
  54. package/lib/components/ca-input/input-test/input-test.component.d.ts +47 -0
  55. package/lib/components/ca-input/pipes/input-container-class.pipe.d.ts +3 -3
  56. package/lib/components/ca-input/pipes/input-datetime-picker-class.pipe.d.ts +1 -1
  57. package/lib/components/ca-input/pipes/input-pattern.pipe.d.ts +25 -0
  58. package/lib/components/ca-input/services/index.d.ts +0 -1
  59. package/lib/components/ca-input/utils/constants/input-constants.d.ts +11 -0
  60. package/lib/components/ca-input-datetime-picker/ca-input-datetime-picker.component.d.ts +99 -0
  61. package/package.json +1 -1
  62. package/public-api.d.ts +2 -0
  63. package/esm2022/lib/components/ca-input/components/ca-input-datetime-picker/ca-input-datetime-picker.component.mjs +0 -100
  64. package/esm2022/lib/components/ca-input/services/ca-input-state.service.mjs +0 -2173
  65. package/lib/components/ca-input/components/ca-input-datetime-picker/ca-input-datetime-picker.component.d.ts +0 -48
  66. package/lib/components/ca-input/services/ca-input-state.service.d.ts +0 -196
@@ -1,2173 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, Subject, takeUntil, } from 'rxjs';
3
- import moment from 'moment';
4
- // helpers
5
- import { MethodsCalculationsHelper } from '../../../utils/helpers';
6
- // enums
7
- import { InputConfigNameStringEnum, InputCommandsType, InputCommandsAction, InputStringEnum, } from '../enums';
8
- // Svg routes
9
- import { InputSvgRoutes } from '../utils';
10
- // constants
11
- import { InputConstants } from '../utils/constants';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "../../ca-custom-datetime-pickers/services/calendar-datetime-picker.service";
14
- import * as i2 from "./ca-input-validation.service";
15
- import * as i3 from "../../../pipes/thousand-separator.pipe";
16
- export class InputStateService {
17
- constructor(calendarService, caInputValidationService,
18
- // Pipes
19
- thousandSeparatorPipe) {
20
- this.calendarService = calendarService;
21
- this.caInputValidationService = caInputValidationService;
22
- this.thousandSeparatorPipe = thousandSeparatorPipe;
23
- this.isFocusInputSubject = new BehaviorSubject(false);
24
- this.isFocusInput$ = this.isFocusInputSubject.asObservable();
25
- this.isTouchedInputSubject = new BehaviorSubject(false);
26
- this.isTouchedInput$ = this.isTouchedInputSubject.asObservable();
27
- this.isVisibleCommandsSubject = new BehaviorSubject(false);
28
- this.isVisibleCommands$ = this.isVisibleCommandsSubject.asObservable();
29
- this.isEditInputSubject = new BehaviorSubject(false);
30
- this.isEditInput$ = this.isEditInputSubject.asObservable();
31
- this.isDropdownTogglerSubject = new BehaviorSubject(false);
32
- this.isDropdownToggler$ = this.isDropdownTogglerSubject.asObservable();
33
- this.dateTimeInputDateSubject = new BehaviorSubject(new Date());
34
- this.dateTimeInputDate$ = this.dateTimeInputDateSubject.asObservable();
35
- this.showDateInputSubject = new BehaviorSubject(false);
36
- this.showDateInput$ = this.showDateInputSubject.asObservable();
37
- this.isCapsLockOnSubject = new BehaviorSubject(false);
38
- this.isCapsLockOn$ = this.isCapsLockOnSubject.asObservable();
39
- this.onChangeSubject = new Subject();
40
- this.onChange$ = this.onChangeSubject.asObservable();
41
- // Outputs
42
- this.commandEventSubject = new Subject();
43
- this.commandEvent$ = this.commandEventSubject.asObservable();
44
- this.clearInputEventSubject = new Subject();
45
- this.clearInputEvent$ = this.clearInputEventSubject.asObservable();
46
- this.incorrectInputSubject = new Subject();
47
- this.incorrectInput$ = this.incorrectInputSubject.asObservable();
48
- this.showHideDropdownSubject = new Subject();
49
- this.showHideDropdown$ = this.showHideDropdownSubject.asObservable();
50
- this.dropDownKeyNavigationSubject = new Subject();
51
- this.dropDownKeyNavigation$ = this.dropDownKeyNavigationSubject.asObservable();
52
- this.blurInputSubject = new Subject();
53
- this.blurInput$ = this.blurInputSubject.asObservable();
54
- this.changeInputSubject = new Subject();
55
- this.changeInput$ = this.changeInputSubject.asObservable();
56
- this.combinedVariables$ = combineLatest([
57
- this.isFocusInput$,
58
- this.isTouchedInput$,
59
- this.isVisibleCommands$,
60
- this.isEditInput$,
61
- this.isDropdownToggler$,
62
- this.dateTimeInputDate$,
63
- this.showDateInput$,
64
- this.isCapsLockOn$,
65
- ]);
66
- // Date
67
- this.newInputChanged = false;
68
- this.selectionInput = -1;
69
- // Input Selection
70
- this.inputSelection = false;
71
- this.hasDecimalIndex = -1;
72
- // Number of spaces
73
- this.numberOfConsecutivelySpaces = 0;
74
- this.oneSpaceOnlyCounter = 0;
75
- this.lastCursorSpacePosition = 0;
76
- // Number of points
77
- this.numberOfConsecutivelyPoints = 0;
78
- this.numberOfPoints = 0;
79
- this.destroy$ = new Subject();
80
- }
81
- setIsFocusInput(value) {
82
- this.isFocusInputSubject.next(value);
83
- }
84
- setIsTouchedInput(value) {
85
- this.isTouchedInputSubject.next(value);
86
- }
87
- setIsVisibleCommands(value) {
88
- this.isVisibleCommandsSubject.next(value);
89
- }
90
- setIsEditInput(value) {
91
- this.isEditInputSubject.next(value);
92
- }
93
- setIsDropdownToggler(value) {
94
- this.isDropdownTogglerSubject.next(value);
95
- }
96
- setDateTimeInputDate(value) {
97
- this.dateTimeInputDateSubject.next(value);
98
- }
99
- setShowDateInput(value) {
100
- this.showDateInputSubject.next(value);
101
- }
102
- setIsCapsLockOn(value) {
103
- this.isCapsLockOnSubject.next(value);
104
- }
105
- setInputElementRef(input, cdRef) {
106
- this.input = input;
107
- this.cdRef = cdRef;
108
- }
109
- setSuperControl(superControl) {
110
- this.superControl = superControl;
111
- }
112
- setInputConfig(config) {
113
- this.inputConfig = config;
114
- }
115
- setIncorrectValue(incorrectValue) {
116
- this.incorrectValue = incorrectValue;
117
- }
118
- setCommandEvent(value) {
119
- this.commandEventSubject.next(value);
120
- }
121
- setClearInputEvent(value) {
122
- this.clearInputEventSubject.next(value);
123
- }
124
- setIncorrectInput(value) {
125
- this.incorrectInputSubject.next(value);
126
- }
127
- setShowHideDropdown(value) {
128
- this.showHideDropdownSubject.next(value);
129
- }
130
- setDropDownKeyNavigation(value) {
131
- this.dropDownKeyNavigationSubject.next(value);
132
- }
133
- setBlurInput(value) {
134
- this.blurInputSubject.next(value);
135
- }
136
- setChangeInput(value) {
137
- this.changeInputSubject.next(value);
138
- }
139
- setOnChange(value) {
140
- this.onChangeSubject.next(value);
141
- }
142
- writeValue(obj) {
143
- this.setChangeInput(obj);
144
- setTimeout(() => {
145
- if (this.inputConfig.name ===
146
- InputConfigNameStringEnum.DATE_PICKER ||
147
- this.inputConfig.name ===
148
- InputConfigNameStringEnum.TIME_PICKER ||
149
- this.inputConfig.name ===
150
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) {
151
- if (obj) {
152
- this.timeoutCleaner = setTimeout(() => {
153
- this.setTimeDateInput(obj);
154
- }, 300);
155
- }
156
- else {
157
- this.input.nativeElement.value = obj;
158
- this.resetDateTimeInputs();
159
- }
160
- }
161
- else {
162
- if (!this.inputConfig.priceSeparator) {
163
- this.input.nativeElement.value = obj;
164
- }
165
- }
166
- });
167
- }
168
- clearInput(event) {
169
- event.preventDefault();
170
- event.stopPropagation();
171
- // Clear whole input
172
- if (this.inputConfig.removeInput) {
173
- this.setClearInputEvent(true);
174
- return;
175
- }
176
- // Incorrect Input
177
- if (this.inputConfig.incorrectInput) {
178
- this.incorrectValue = !this.incorrectValue;
179
- this.setIncorrectInput(this.incorrectValue);
180
- }
181
- // Native clear
182
- else {
183
- this.input.nativeElement.value = null;
184
- this.superControl.control?.setValue(null);
185
- this.numberOfConsecutivelySpaces = 0;
186
- this.numberOfConsecutivelyPoints = 0;
187
- this.numberOfPoints = 0;
188
- this.oneSpaceOnlyCounter = 0;
189
- this.inputConfig.dropdownImageInput = undefined;
190
- this.setIsTouchedInput(true);
191
- this.setIsFocusInput(false);
192
- if ([
193
- InputConfigNameStringEnum.DATE_PICKER,
194
- InputConfigNameStringEnum.TIME_PICKER,
195
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD,
196
- ].includes(this.inputConfig.name))
197
- this.resetDateTimeInputs();
198
- this.setClearInputEvent(true);
199
- }
200
- }
201
- transformText(event, isPaste) {
202
- const value = event.target.value;
203
- this.cursorInputPosition = this.input.nativeElement.selectionStart;
204
- // Handle paste operation
205
- if (isPaste) {
206
- this.handlePaste(value);
207
- }
208
- else if (value) {
209
- this.input.nativeElement.value = value;
210
- }
211
- this.applyTextTransformation();
212
- // Apply thousand and price separators if configured
213
- this.applyThousandSeparator();
214
- this.applyPriceSeparator();
215
- this.customValidation(value);
216
- this.sanitizeConsecutiveSpaces();
217
- this.removeLeadingZero();
218
- }
219
- handlePaste(value) {
220
- if (!this.inputSelection) {
221
- this.input.nativeElement.value += value;
222
- this.limitInputLength();
223
- }
224
- else {
225
- this.input.nativeElement.value = value;
226
- this.inputSelection = false;
227
- }
228
- // Delete spaces on begin and end
229
- this.input.nativeElement.value = this.input.nativeElement.value.trim();
230
- this.superControl.control?.patchValue(this.input.nativeElement.value);
231
- }
232
- limitInputLength() {
233
- if (this.input.nativeElement.value.length > this.inputConfig.maxLength) {
234
- this.input.nativeElement.value =
235
- this.input.nativeElement.value.substring(0, this.inputConfig.maxLength);
236
- }
237
- }
238
- applyTextTransformation() {
239
- const { value } = this.input.nativeElement;
240
- switch (this.inputConfig.textTransform) {
241
- case InputStringEnum.CAPITALIZE:
242
- this.input.nativeElement.value =
243
- value.charAt(0).toUpperCase() +
244
- value.substring(1).toLowerCase();
245
- break;
246
- case InputStringEnum.UPPERCASE:
247
- this.input.nativeElement.value =
248
- value.toLocaleUpperCase('en-US');
249
- break;
250
- case InputStringEnum.CAPITALIZED_CASE:
251
- const capitalizedCaseWords = value.replace(/(^\w{1})|(\s+\w{1})/g, (letter) => letter.toUpperCase());
252
- this.input.nativeElement.value = capitalizedCaseWords;
253
- break;
254
- default:
255
- break;
256
- }
257
- this.superControl.control?.patchValue(this.input.nativeElement.value);
258
- }
259
- applyThousandSeparator() {
260
- const controlValue = this.superControl.control?.value;
261
- if (this.inputConfig.thousandSeparator && controlValue) {
262
- if (this.isAllZeros(controlValue)) {
263
- this.superControl.control?.patchValue('0');
264
- return;
265
- }
266
- if (this.superControl.control?.value.toString()) {
267
- this.superControl.control?.patchValue(this.thousandSeparatorPipe.transform(controlValue));
268
- }
269
- }
270
- }
271
- applyPriceSeparator() {
272
- const controlValue = this.superControl.control?.value;
273
- if (this.inputConfig.priceSeparator && controlValue) {
274
- // 0. Don't allow 0 as first character
275
- if (this.isAllZeros(controlValue)) {
276
- this.superControl.control?.patchValue('0');
277
- return;
278
- }
279
- // 4. If user set dot
280
- if (controlValue.includes('.')) {
281
- this.formatWithDecimal();
282
- }
283
- else {
284
- // 5. If user doesn't set dot
285
- this.formatWithoutDecimal();
286
- }
287
- this.setInputCursorPosition();
288
- }
289
- }
290
- formatWithDecimal() {
291
- const controlValue = this.superControl.control?.value;
292
- // 4.1. Check for Dot position
293
- this.hasDecimalIndex = controlValue.indexOf('.');
294
- this.originPriceSeparatorLimit =
295
- this.inputConfig.priceSeparatorLimitation + 3;
296
- // 4.2. Divide number into decimal and integer parts
297
- let integerPart = this.thousandSeparatorPipe.transform(controlValue
298
- .slice(0, this.hasDecimalIndex)
299
- .slice(0, this.inputConfig.priceSeparatorLimitation));
300
- let decimalPart = controlValue.slice(this.hasDecimalIndex + 1);
301
- if (!integerPart) {
302
- integerPart = '0';
303
- }
304
- // 4.4. Get only two numbers of the decimal part
305
- decimalPart = decimalPart.slice(0, 2);
306
- if (decimalPart) {
307
- // 4.5. Set formatted number
308
- this.superControl.control?.patchValue(`${integerPart}.${decimalPart}`);
309
- this.hasDecimalIndex =
310
- this.superControl.control?.value.indexOf('.');
311
- }
312
- }
313
- formatWithoutDecimal() {
314
- const controlValue = this.superControl.control?.value;
315
- this.hasDecimalIndex = -1;
316
- if (controlValue.indexOf('.') === -1) {
317
- // Transform value with thousand separator
318
- this.superControl.control?.patchValue(this.thousandSeparatorPipe.transform(controlValue));
319
- // Limit validation
320
- this.originPriceSeparatorLimit =
321
- this.inputConfig.priceSeparatorLimitation;
322
- // Cut value
323
- if (controlValue) {
324
- this.superControl.control?.patchValue(controlValue.slice(0, this.inputConfig.priceSeparatorLimitation));
325
- }
326
- // Transform value again after cutting
327
- this.superControl.control?.patchValue(this.thousandSeparatorPipe.transform(controlValue));
328
- }
329
- }
330
- setInputCursorPosition() {
331
- if (this.superControl.control?.value) {
332
- this.timeoutCleaner = setTimeout(() => {
333
- this.input.nativeElement.setSelectionRange(this.cursorInputPosition +
334
- (this.superControl.control?.value.indexOf('.') === -1
335
- ? 1
336
- : 0), this.cursorInputPosition +
337
- (this.superControl.control?.value.indexOf('.') === -1
338
- ? 1
339
- : 0));
340
- }, 0);
341
- }
342
- else {
343
- // if we have ${n}00000 and we delete N then we got undefined instead of dot
344
- this.superControl.control?.patchValue(0);
345
- }
346
- }
347
- isAllZeros(value) {
348
- return value.split('').every((char) => char === '0');
349
- }
350
- customValidation(value) {
351
- const configName = this.inputConfig.name.toLowerCase();
352
- if (configName === InputStringEnum.YEAR &&
353
- parseInt(value) > parseInt(moment().add(1, 'year').format('YYYY'))) {
354
- this.superControl.control?.setErrors({ invalid: true });
355
- }
356
- if (configName === InputStringEnum.MONTHS) {
357
- if (parseInt(value) < 1 || parseInt(value) > 12) {
358
- this.superControl.control?.setErrors({ invalid: true });
359
- }
360
- else {
361
- this.superControl.control?.setErrors(null);
362
- }
363
- }
364
- if (configName === InputStringEnum.AXLES) {
365
- if (parseInt(value) < 1 || parseInt(value) > 17) {
366
- if (parseInt(value) < 1) {
367
- this.superControl.control?.setErrors({ min: 1 });
368
- }
369
- else if (parseInt(value) > 17) {
370
- this.superControl.control?.setErrors({ max: 17 });
371
- }
372
- }
373
- else {
374
- this.superControl.control?.setErrors(null);
375
- }
376
- }
377
- if (configName === InputStringEnum.FULL_NAME &&
378
- this.superControl.control?.value) {
379
- this.capitalizeWords();
380
- }
381
- }
382
- capitalizeWords() {
383
- const words = this.superControl.control?.value.split(' ');
384
- const capitalized = words.map((word) => {
385
- return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
386
- });
387
- this.input.nativeElement.value = capitalized.join(' ');
388
- }
389
- sanitizeConsecutiveSpaces() {
390
- const configNames = InputConstants.textTransformConfigNames;
391
- if (configNames.includes(this.inputConfig.name.toLowerCase())) {
392
- const sanitizedInput = this.input.nativeElement.value.replace(/\s{2,}/g, ' ');
393
- if (sanitizedInput !== this.input.nativeElement.value) {
394
- this.input.nativeElement.value = sanitizedInput;
395
- this.setCursorForSanitizedInput();
396
- }
397
- }
398
- }
399
- setCursorForSanitizedInput() {
400
- this.timeoutCleaner = setTimeout(() => {
401
- this.input.nativeElement.setSelectionRange(this.lastCursorSpacePosition - 1, this.lastCursorSpacePosition - 1);
402
- });
403
- }
404
- removeLeadingZero() {
405
- if (this.inputConfig.removeLeadingZero) {
406
- const currentValue = this.superControl.control?.value;
407
- if (!currentValue) {
408
- this.superControl.control?.patchValue('');
409
- this.superControl.control?.setErrors(null);
410
- return;
411
- }
412
- if (this.inputConfig.negativeLeadingZero) {
413
- const isNegative = currentValue.startsWith('-');
414
- if (isNegative) {
415
- // Get the part after the negative sign
416
- const numberPart = currentValue.slice(1);
417
- // Remove leading zeros
418
- const transformedNumber = numberPart.replace(/^0+(?=\d)/, '');
419
- this.superControl.control?.patchValue(`-${transformedNumber}`);
420
- }
421
- else {
422
- this.superControl.control?.patchValue(currentValue.replace(/^0+(?=\d)/, ''));
423
- }
424
- }
425
- else {
426
- this.superControl.control?.patchValue(currentValue.replace(/^0+(?!$)/, ''));
427
- }
428
- }
429
- }
430
- autoFocusFirstInput() {
431
- if (this.inputConfig.autoFocus && !this.superControl.control?.value) {
432
- this.timeoutCleaner = setTimeout(() => {
433
- this.input.nativeElement.focus();
434
- this.setIsFocusInput(true);
435
- this.inputConfig.autoFocus = false;
436
- }, 30);
437
- }
438
- }
439
- onKeypress(event) {
440
- // Disable first character to be space
441
- if (!this.input.nativeElement.value &&
442
- /^\s*$/.test(String.fromCharCode(event.charCode))) {
443
- event.preventDefault();
444
- return false;
445
- }
446
- if (this.inputConfig.priceSeparator) {
447
- if (this.caInputValidationService
448
- .getInputRegexPattern(InputStringEnum.PRICE_SEPARATOR)
449
- ?.test(String.fromCharCode(event.charCode))) {
450
- if (this.superControl.control?.value?.length ===
451
- this.originPriceSeparatorLimit &&
452
- event.keyCode !== 46) {
453
- event.preventDefault();
454
- return;
455
- }
456
- // Disable multiple dots
457
- this.disableMultiplePoints(event);
458
- // Find index of dot
459
- const valueToString = String(this.superControl.control?.value);
460
- this.hasDecimalIndex = valueToString?.indexOf('.');
461
- if (this.hasDecimalIndex >= 0) {
462
- // 1. Divide number on decimal and integer part
463
- let integerPart = this.superControl.control?.value.slice(0, this.hasDecimalIndex);
464
- if (!integerPart)
465
- integerPart = '0';
466
- let decimalPart = this.superControl.control?.value.slice(this.hasDecimalIndex + 1);
467
- // 2. Disable more than two decimals
468
- if (decimalPart.length > 2) {
469
- event.preventDefault();
470
- return;
471
- }
472
- // 3. Get only two numbers of decimal part
473
- decimalPart = decimalPart.slice(0, 2);
474
- const currentPosition = this.input.nativeElement.selectionStart;
475
- // 4. Set formatted number
476
- this.superControl.control?.patchValue(integerPart + '.' + decimalPart);
477
- this.timeoutCleaner = setTimeout(() => {
478
- if (event.keyCode === 51) {
479
- this.cursorInputPosition =
480
- this.input.nativeElement.selectionStart;
481
- this.input.nativeElement.setSelectionRange(currentPosition, currentPosition);
482
- }
483
- else {
484
- this.input.nativeElement.setSelectionRange(currentPosition, currentPosition);
485
- }
486
- }, 0);
487
- }
488
- return true;
489
- }
490
- event.preventDefault();
491
- return false;
492
- }
493
- if ([
494
- InputStringEnum.BUSINESS_NAME,
495
- InputStringEnum.SHOP_NAME,
496
- InputStringEnum.FUEL_STOP,
497
- InputStringEnum.PRODUCER_NAME,
498
- InputStringEnum.TERMINAL_NAME,
499
- ].includes(this.inputConfig.name.toLowerCase())) {
500
- if (this.caInputValidationService
501
- .getInputRegexPattern(InputStringEnum.BUSINESS_NAME)
502
- ?.test(String.fromCharCode(event.charCode))) {
503
- this.disableMultiplePoints(event);
504
- this.disableConsecutivelySpaces(event);
505
- return true;
506
- }
507
- event.preventDefault();
508
- return false;
509
- }
510
- if ([
511
- InputStringEnum.EIN,
512
- InputStringEnum.MC_FF,
513
- InputStringEnum.PHONE,
514
- InputStringEnum.PHONE_EXTENSION,
515
- InputStringEnum.ACCOUNT_BANK,
516
- InputStringEnum.ROUTING_BANK,
517
- InputStringEnum.SSN,
518
- InputStringEnum.FUEL_CARD,
519
- InputStringEnum.EMPTY_WEIGHT,
520
- InputStringEnum.CREDIT_LIMIT,
521
- InputStringEnum.PO_BOX,
522
- InputStringEnum.PRICE,
523
- InputStringEnum.TRAILER_VOLUME,
524
- InputStringEnum.REPAIR_ODOMETER,
525
- InputStringEnum.USDOT,
526
- InputStringEnum.IRP,
527
- InputStringEnum.STARTING,
528
- InputStringEnum.CUSTOMER_PAY_TERM,
529
- InputStringEnum.CUSTOMER_CREDIT,
530
- InputStringEnum.DEFAULT_BASE,
531
- InputStringEnum.EACH_OCCURRENCE,
532
- InputStringEnum.DAMAGE,
533
- InputStringEnum.PERSONAL_ADVER_INJ,
534
- InputStringEnum.MEDICAL_EXPENSES,
535
- InputStringEnum.BODILY_INJURY,
536
- InputStringEnum.GENERAL_AGGREGATE,
537
- InputStringEnum.PRODUCTS_COMP_OP_AGG,
538
- InputStringEnum.COMBINED_SINGLE_LIMIT,
539
- InputStringEnum.SINGLE_CONVEYANCE,
540
- InputStringEnum.DEDUCTABLE,
541
- InputStringEnum.COMPREH_COLLISION,
542
- InputStringEnum.TRAILER_VALUE_INSURANCE_POLICY,
543
- InputStringEnum.RENT,
544
- InputStringEnum.SALARY,
545
- InputStringEnum.MILEAGE,
546
- InputStringEnum.MONTHS,
547
- InputStringEnum.EMPTY_WEIGHT_SPACE,
548
- InputStringEnum.QTY,
549
- InputStringEnum.PURCHASE_PRICE,
550
- InputStringEnum.FUEL_TANK_SIZE,
551
- InputStringEnum.WEIGHT,
552
- InputStringEnum.FUEL_PER_MILES,
553
- InputStringEnum.FUEL_PRICE_MAP,
554
- InputStringEnum.AMOUNT,
555
- InputStringEnum.BOL_NO,
556
- InputStringEnum.SEAL_NO,
557
- InputStringEnum.PICKUP_NO,
558
- InputStringEnum.CODE,
559
- InputStringEnum.MULTI_FROM_FIRST_FROM,
560
- InputStringEnum.MULTI_FROM_FIRST_TO,
561
- InputStringEnum.MULTI_FORM_SECOND_FROM,
562
- InputStringEnum.MULTI_FORM_SECOND_TO,
563
- InputStringEnum.MULTI_FORM_THIRD_FROM,
564
- InputStringEnum.MULTI_FORM_THIRD_TO,
565
- ].includes(this.inputConfig.name.toLowerCase())) {
566
- // Only numbers
567
- if (this.caInputValidationService
568
- .getInputRegexPattern(InputStringEnum.QTY)
569
- ?.test(String.fromCharCode(event.charCode)))
570
- return true;
571
- event.preventDefault();
572
- return false;
573
- }
574
- if ([InputStringEnum.EMAIL].includes(this.inputConfig.name.toLowerCase())) {
575
- if (this.caInputValidationService
576
- .getInputRegexPattern(InputStringEnum.EMAIL)
577
- ?.test(String.fromCharCode(event.charCode))) {
578
- this.disableConsecutivelyPoints(event);
579
- return true;
580
- }
581
- event.preventDefault();
582
- return false;
583
- }
584
- if ([InputStringEnum.INVOICE].includes(this.inputConfig.name.toLowerCase())) {
585
- if (this.caInputValidationService
586
- .getInputRegexPattern(InputStringEnum.INVOICE)
587
- ?.test(String.fromCharCode(event.charCode)))
588
- return true;
589
- event.preventDefault();
590
- return false;
591
- }
592
- if ([InputStringEnum.ADDRESS].includes(this.inputConfig.name.toLowerCase())) {
593
- if (/^[A-Za-z0-9\s.&/,_-]*$/?.test(String.fromCharCode(event.charCode))) {
594
- this.disableConsecutivelySpaces(event);
595
- return true;
596
- }
597
- else {
598
- event.preventDefault();
599
- return false;
600
- }
601
- }
602
- if ([
603
- InputStringEnum.ADDRESS_UNIT,
604
- InputStringEnum.DEPARTMENT,
605
- InputStringEnum.VEHICLE_UNIT,
606
- ].includes(this.inputConfig.name.toLowerCase())) {
607
- if (this.caInputValidationService
608
- .getInputRegexPattern(InputStringEnum.ADDRESS_UNIT)
609
- ?.test(String.fromCharCode(event.charCode)))
610
- return true;
611
- event.preventDefault();
612
- return false;
613
- }
614
- if ([InputStringEnum.FIRST_NAME].includes(this.inputConfig.name.toLowerCase())) {
615
- if (this.caInputValidationService
616
- .getInputRegexPattern(InputStringEnum.FIRST_NAME)
617
- ?.test(String.fromCharCode(event.charCode))) {
618
- this.disableMultiplePoints(event);
619
- this.enableOneSpaceOnly(event);
620
- return true;
621
- }
622
- event.preventDefault();
623
- return false;
624
- }
625
- if ([InputStringEnum.LAST_NAME].includes(this.inputConfig.name.toLowerCase())) {
626
- if (this.caInputValidationService
627
- .getInputRegexPattern(InputStringEnum.LAST_NAME)
628
- ?.test(String.fromCharCode(event.charCode))) {
629
- this.enableOneSpaceOnly(event);
630
- return true;
631
- }
632
- event.preventDefault();
633
- return false;
634
- }
635
- if ([InputStringEnum.BANK_NAME].includes(this.inputConfig.name.toLowerCase())) {
636
- if (this.caInputValidationService
637
- .getInputRegexPattern(InputStringEnum.BANK_NAME)
638
- ?.test(String.fromCharCode(event.charCode))) {
639
- this.disableMultiplePoints(event);
640
- this.enableOneSpaceOnly(event);
641
- return true;
642
- }
643
- event.preventDefault();
644
- return false;
645
- }
646
- if ([
647
- InputStringEnum.VIN_NUMBER,
648
- InputStringEnum.INSURANCE_POLICY,
649
- InputStringEnum.IFTA,
650
- ].includes(this.inputConfig.name.toLowerCase())) {
651
- if (this.caInputValidationService
652
- .getInputRegexPattern(InputStringEnum.VIN_NUMBER)
653
- ?.test(String.fromCharCode(event.charCode)))
654
- return !/^[IiOQ]*$/?.test(String.fromCharCode(event.charCode));
655
- event.preventDefault();
656
- return false;
657
- }
658
- if ([InputStringEnum.TRUCK_TRAILER_MODEL].includes(this.inputConfig.name.toLowerCase())) {
659
- if (this.caInputValidationService
660
- .getInputRegexPattern(InputStringEnum.TRUCK_TRAILER_MODEL)
661
- ?.test(String.fromCharCode(event.charCode))) {
662
- this.enableOneSpaceOnly(event);
663
- return true;
664
- }
665
- event.preventDefault();
666
- return false;
667
- }
668
- if ([InputStringEnum.YEAR].includes(this.inputConfig.name.toLowerCase())) {
669
- if (/^0*$/.test(String.fromCharCode(event.charCode)) &&
670
- !this.input.nativeElement.value) {
671
- event.preventDefault();
672
- return false;
673
- }
674
- if (this.caInputValidationService
675
- .getInputRegexPattern(InputStringEnum.YEAR)
676
- ?.test(String.fromCharCode(event.charCode)))
677
- return true;
678
- event.preventDefault();
679
- return false;
680
- }
681
- if ([InputStringEnum.LICENSE_PLATE].includes(this.inputConfig.name.toLowerCase())) {
682
- if (this.caInputValidationService
683
- .getInputRegexPattern(InputStringEnum.LICENSE_PLATE)
684
- ?.test(String.fromCharCode(event.charCode))) {
685
- this.enableOneSpaceOnly(event);
686
- return true;
687
- }
688
- event.preventDefault();
689
- return false;
690
- }
691
- if ([InputStringEnum.DESCRIPTION].includes(this.inputConfig.name.toLowerCase())) {
692
- if (this.caInputValidationService
693
- .getInputRegexPattern(InputStringEnum.DESCRIPTION)
694
- ?.test(String.fromCharCode(event.charCode))) {
695
- this.disableConsecutivelySpaces(event);
696
- return true;
697
- }
698
- event.preventDefault();
699
- return false;
700
- }
701
- if ([InputStringEnum.ALLOW_ALL].includes(this.inputConfig.name.toLowerCase())) {
702
- if (/.*/?.test(String.fromCharCode(event.charCode)))
703
- return true;
704
- event.preventDefault();
705
- return false;
706
- }
707
- if ([InputStringEnum.DBA_NAME].includes(this.inputConfig.name.toLowerCase())) {
708
- if (this.caInputValidationService
709
- .getInputRegexPattern(InputStringEnum.DBA_NAME)
710
- ?.test(String.fromCharCode(event.charCode)))
711
- return true;
712
- event.preventDefault();
713
- return false;
714
- }
715
- if ([InputStringEnum.PER_MILE].includes(this.inputConfig.name.toLowerCase())) {
716
- if (this.caInputValidationService
717
- .getInputRegexPattern(InputStringEnum.PER_MILE)
718
- ?.test(String.fromCharCode(event.charCode))) {
719
- this.disableMultiplePoints(event);
720
- // Check for max length
721
- if (this.superControl.control?.value?.toString().includes('.'))
722
- this.inputConfig.maxLength = 4;
723
- else
724
- this.inputConfig.maxLength = 2;
725
- // Check for range
726
- if (this.superControl.control?.value > this.inputConfig.max ||
727
- this.superControl.control?.value < this.inputConfig.min) {
728
- this.superControl.control?.setErrors({ invalid: true });
729
- }
730
- return true;
731
- }
732
- else {
733
- event.preventDefault();
734
- return false;
735
- }
736
- }
737
- if ([
738
- InputStringEnum.PER_STOP,
739
- InputStringEnum.FLAT_RATE,
740
- InputStringEnum.PER_LOAD,
741
- ].includes(this.inputConfig.name.toLowerCase())) {
742
- if (this.caInputValidationService
743
- .getInputRegexPattern(InputStringEnum.PER_STOP)
744
- ?.test(String.fromCharCode(event.charCode))) {
745
- this.timeoutCleaner = setTimeout(() => {
746
- if (this.superControl.control?.value) {
747
- let perStopValue = this.superControl.control?.value.replace(/,/g, '');
748
- if (perStopValue > this.inputConfig.max ||
749
- perStopValue < this.inputConfig.min) {
750
- this.superControl.control?.setErrors({
751
- invalid: true,
752
- });
753
- return false;
754
- }
755
- return true;
756
- }
757
- return;
758
- }, 0);
759
- }
760
- else {
761
- event.preventDefault();
762
- return false;
763
- }
764
- }
765
- if ([InputStringEnum.RELATIONSHIP, InputStringEnum.SCAC].includes(this.inputConfig.name.toLowerCase())) {
766
- if (this.caInputValidationService
767
- .getInputRegexPattern(InputStringEnum.EMERGENCY_NAME)
768
- ?.test(String.fromCharCode(event.charCode)))
769
- return true;
770
- event.preventDefault();
771
- return false;
772
- }
773
- if ([InputStringEnum.EMERGENCY_NAME].includes(this.inputConfig.name.toLowerCase())) {
774
- if (this.caInputValidationService
775
- .getInputRegexPattern(InputStringEnum.EMERGENCY_NAME)
776
- ?.test(String.fromCharCode(event.charCode))) {
777
- this.disableConsecutivelySpaces(event);
778
- this.enableOneSpaceOnly(event);
779
- return true;
780
- }
781
- event.preventDefault();
782
- return false;
783
- }
784
- if ([InputStringEnum.FULL_CONTACT_NAME].includes(this.inputConfig.name.toLowerCase())) {
785
- if (this.caInputValidationService
786
- .getInputRegexPattern(InputStringEnum.FULL_CONTACT_NAME)
787
- ?.test(String.fromCharCode(event.charCode)))
788
- return true;
789
- event.preventDefault();
790
- return false;
791
- }
792
- if ([InputStringEnum.FUEL_STORE].includes(this.inputConfig.name.toLowerCase())) {
793
- if (this.caInputValidationService
794
- .getInputRegexPattern(InputStringEnum.FUEL_STORE)
795
- ?.test(String.fromCharCode(event.charCode)))
796
- return true;
797
- event.preventDefault();
798
- return false;
799
- }
800
- if ([InputStringEnum.HOS].includes(this.inputConfig.name.toLowerCase())) {
801
- if (!this.inputSelection &&
802
- this.caInputValidationService
803
- .getInputRegexPattern(InputStringEnum.HOS)
804
- ?.test(String.fromCharCode(event.charCode))) {
805
- return (this.superControl.control?.value * 10 +
806
- event.charCode -
807
- 48 <=
808
- this.inputConfig.max);
809
- }
810
- else {
811
- if (this.inputSelection) {
812
- this.superControl.control?.patchValue(String.fromCharCode(event.charCode));
813
- this.inputSelection = false;
814
- }
815
- event.preventDefault();
816
- return false;
817
- }
818
- }
819
- if ([
820
- InputStringEnum.FULL_PARKING_SLOT,
821
- InputStringEnum.PARKING_SLOT,
822
- ].includes(this.inputConfig.name.toLowerCase())) {
823
- if (this.caInputValidationService
824
- .getInputRegexPattern(InputStringEnum.FULL_PARKING_SLOT)
825
- ?.test(String.fromCharCode(event.charCode)))
826
- return true;
827
- else {
828
- event.preventDefault();
829
- return false;
830
- }
831
- }
832
- if ([InputStringEnum.CDL_NUMBER].includes(this.inputConfig.name.toLowerCase())) {
833
- if (this.caInputValidationService
834
- .getInputRegexPattern(InputStringEnum.CDL_NUMBER)
835
- ?.test(String.fromCharCode(event.charCode))) {
836
- this.enableOneSpaceOnly(event);
837
- this.disableConsecutivelySpaces(event);
838
- return true;
839
- }
840
- else {
841
- event.preventDefault();
842
- return false;
843
- }
844
- }
845
- // All Simbols
846
- if ([
847
- InputStringEnum.USERNAME,
848
- InputStringEnum.NICKNAME,
849
- InputStringEnum.PASSWORD,
850
- ].includes(this.inputConfig.name.toLowerCase())) {
851
- if (this.caInputValidationService
852
- .getInputRegexPattern(InputStringEnum.USERNAME)
853
- ?.test(String.fromCharCode(event.charCode)))
854
- return true;
855
- else {
856
- event.preventDefault();
857
- return false;
858
- }
859
- }
860
- if ([InputStringEnum.FULL_NAME].includes(this.inputConfig.name.toLowerCase())) {
861
- if (this.caInputValidationService
862
- .getInputRegexPattern(InputStringEnum.FULL_NAME)
863
- ?.test(String.fromCharCode(event.charCode))) {
864
- this.enableOneSpaceOnly(event);
865
- this.disableMultiplePoints(event);
866
- this.disableConsecutivelySpaces(event);
867
- return true;
868
- }
869
- else {
870
- event.preventDefault();
871
- return false;
872
- }
873
- }
874
- if ([InputStringEnum.TOLL_VALIDATION].includes(this.inputConfig.name.toLowerCase())) {
875
- if (this.caInputValidationService
876
- .getInputRegexPattern(InputStringEnum.TOLL_VALIDATION)
877
- ?.test(String.fromCharCode(event.charCode)))
878
- return true;
879
- else {
880
- event.preventDefault();
881
- return false;
882
- }
883
- }
884
- // Just characters and numbers
885
- if ([
886
- InputStringEnum.PREFIX,
887
- InputStringEnum.SUFFIX,
888
- InputStringEnum.PARKING_NAME,
889
- ].includes(this.inputConfig.name.toLowerCase())) {
890
- if (this.caInputValidationService
891
- .getInputRegexPattern(InputStringEnum.PREFIX)
892
- ?.test(String.fromCharCode(event.charCode)))
893
- return true;
894
- else {
895
- event.preventDefault();
896
- return false;
897
- }
898
- }
899
- if ([InputStringEnum.FULL_NAME].includes(this.inputConfig.name.toLowerCase())) {
900
- if (this.caInputValidationService
901
- .getInputRegexPattern(InputStringEnum.FULL_NAME)
902
- ?.test(String.fromCharCode(event.charCode))) {
903
- event.preventDefault();
904
- return false;
905
- }
906
- else {
907
- this.disableConsecutivelySpaces(event);
908
- return true;
909
- }
910
- }
911
- if ([
912
- InputStringEnum.INSURER_NAME,
913
- InputStringEnum.OFFICE_NAME,
914
- ].includes(this.inputConfig.name.toLowerCase())) {
915
- if (this.caInputValidationService
916
- .getInputRegexPattern(InputStringEnum.PRODUCER_NAME)
917
- ?.test(String.fromCharCode(event.charCode))) {
918
- this.disableMultiplePoints(event);
919
- return true;
920
- }
921
- else {
922
- event.preventDefault();
923
- return false;
924
- }
925
- }
926
- if ([InputStringEnum.INPUT_DROPDOWN_LABEL].includes(this.inputConfig.name.toLowerCase())) {
927
- this.disableConsecutivelySpaces(event);
928
- this.disableConsecutivelyPoints(event);
929
- }
930
- this.input.nativeElement.value.trim();
931
- }
932
- enableOneSpaceOnly(event) {
933
- if (/^\s*$/.test(String.fromCharCode(event.charCode)) ||
934
- this.superControl.control?.value?.includes(' ')) {
935
- this.oneSpaceOnlyCounter++;
936
- }
937
- if (this.oneSpaceOnlyCounter > 1 &&
938
- /^\s*$/.test(String.fromCharCode(event.charCode))) {
939
- event.preventDefault();
940
- return false;
941
- }
942
- return true;
943
- }
944
- disableConsecutivelySpaces(event) {
945
- const inputElement = this.input.nativeElement;
946
- // Get cursor position
947
- const cursorPosition = inputElement.selectionStart;
948
- // If the cursor is in the middle of a word, allow spaces
949
- if (cursorPosition > 0 &&
950
- !/\s/.test(inputElement.value[cursorPosition - 1]) &&
951
- !/\s/.test(inputElement.value[cursorPosition])) {
952
- return;
953
- }
954
- // If the user is typing a space and the previous character is a space, prevent the default behavior
955
- if (event.key === ' ' &&
956
- /\s/.test(inputElement.value[cursorPosition - 1])) {
957
- event.preventDefault();
958
- }
959
- // Save the cursor position for the next input event
960
- this.lastCursorSpacePosition = cursorPosition;
961
- }
962
- disableConsecutivelyPoints(event) {
963
- if (/^[.]*$/.test(String.fromCharCode(event.charCode))) {
964
- this.numberOfConsecutivelyPoints++;
965
- if (this.numberOfConsecutivelyPoints > 1) {
966
- event.preventDefault();
967
- return false;
968
- }
969
- }
970
- else {
971
- this.numberOfConsecutivelyPoints = 0;
972
- }
973
- }
974
- disableMultiplePoints(event) {
975
- if (/^[.]*$/.test(String.fromCharCode(event.charCode))) {
976
- if (!this.superControl.control?.value) {
977
- event.preventDefault();
978
- return false;
979
- }
980
- if (this.superControl.control?.value?.toString().includes('.')) {
981
- event.preventDefault();
982
- return false;
983
- }
984
- this.numberOfPoints++;
985
- if (this.numberOfPoints > 1) {
986
- event.preventDefault();
987
- return false;
988
- }
989
- }
990
- else {
991
- this.numberOfPoints = 0;
992
- }
993
- }
994
- // ------- end
995
- onCommands(event, type, action) {
996
- event.stopPropagation();
997
- event.preventDefault();
998
- switch (type) {
999
- case InputCommandsType.PM_INCREMENT_DECREMENT:
1000
- this.handlePmIncrementDecrement(action);
1001
- break;
1002
- case InputCommandsType.INCREMENT_DECREMENT:
1003
- this.handleIncrementDecrement(action);
1004
- break;
1005
- case InputCommandsType.CONFIRM_CANCEL:
1006
- this.handleConfirmCancel(action);
1007
- break;
1008
- case InputCommandsType.MONTHS:
1009
- this.handleMonths(action);
1010
- break;
1011
- default:
1012
- break;
1013
- }
1014
- }
1015
- handleIncrementDecrement(action) {
1016
- clearTimeout(this.inputCommandsTimeout);
1017
- switch (action) {
1018
- case InputCommandsAction.DECREMENT:
1019
- this.superControl.control?.patchValue((this.superControl.control?.value
1020
- ? parseInt(this.superControl.control?.value)
1021
- : 0) - 1);
1022
- break;
1023
- case InputCommandsAction.INCREMENT:
1024
- this.superControl.control?.patchValue((this.superControl.control?.value
1025
- ? parseInt(this.superControl.control?.value)
1026
- : 0) + 1);
1027
- break;
1028
- default:
1029
- break;
1030
- }
1031
- this.setInputCursorAtTheEnd(this.input.nativeElement);
1032
- }
1033
- handlePmIncrementDecrement(action) {
1034
- const value = MethodsCalculationsHelper.convertThousanSepInNumber(this.superControl.control?.value);
1035
- switch (action) {
1036
- case InputCommandsAction.DECREMENT:
1037
- this.decrementPmValue(value);
1038
- break;
1039
- case InputCommandsAction.INCREMENT:
1040
- this.incrementPmValue(value);
1041
- break;
1042
- case InputCommandsAction.RESET:
1043
- this.resetPmValue();
1044
- break;
1045
- default:
1046
- break;
1047
- }
1048
- this.setInputCursorAtTheEnd(this.input.nativeElement);
1049
- }
1050
- decrementPmValue(value) {
1051
- if (value >= 10000 && value < 20000) {
1052
- this.superControl.control?.patchValue(MethodsCalculationsHelper.convertNumberInThousandSep(value - 1000));
1053
- }
1054
- else if (value >= 20001 && value < 50000) {
1055
- this.superControl.control?.patchValue(MethodsCalculationsHelper.convertNumberInThousandSep(value - 3000));
1056
- }
1057
- else if (value >= 50001 && value < 100000) {
1058
- this.superControl.control?.patchValue(MethodsCalculationsHelper.convertNumberInThousandSep(value - 5000));
1059
- }
1060
- else if (value >= 10000) {
1061
- this.superControl.control?.patchValue(MethodsCalculationsHelper.convertNumberInThousandSep(value - 10000));
1062
- }
1063
- else if (value >= 1000) {
1064
- this.superControl.control?.patchValue(MethodsCalculationsHelper.convertNumberInThousandSep(value - 500));
1065
- }
1066
- }
1067
- incrementPmValue(value) {
1068
- if (value > 10000 && value < 20000) {
1069
- this.superControl.control?.patchValue(MethodsCalculationsHelper.convertNumberInThousandSep(value + 1000));
1070
- }
1071
- else if (value >= 20001 && value < 50000) {
1072
- this.superControl.control?.patchValue(MethodsCalculationsHelper.convertNumberInThousandSep(value + 3000));
1073
- }
1074
- else if (value >= 50001 && value < 100000) {
1075
- this.superControl.control?.patchValue(MethodsCalculationsHelper.convertNumberInThousandSep(value + 5000));
1076
- }
1077
- else if (value >= 10000) {
1078
- this.superControl.control?.patchValue(MethodsCalculationsHelper.convertNumberInThousandSep(value + 10000));
1079
- }
1080
- else {
1081
- this.superControl.control?.patchValue(MethodsCalculationsHelper.convertNumberInThousandSep(value + 500));
1082
- }
1083
- }
1084
- resetPmValue() {
1085
- if (this.inputConfig?.defaultValue) {
1086
- this.superControl.control?.patchValue(this.inputConfig?.defaultValue);
1087
- }
1088
- }
1089
- handleConfirmCancel(action) {
1090
- switch (action) {
1091
- case InputCommandsAction.CONFIRM:
1092
- this.confirmCommand();
1093
- break;
1094
- case InputCommandsAction.CANCEL:
1095
- this.cancelCommand();
1096
- break;
1097
- default:
1098
- break;
1099
- }
1100
- this.superControl.control?.setErrors(null);
1101
- this.inputConfig.dropdownLabelNew = false;
1102
- this.inputConfig.commands.active = false;
1103
- this.inputConfig.blackInput = false;
1104
- this.setIsEditInput(false);
1105
- this.setIsVisibleCommands(false);
1106
- this.setIsFocusInput(false);
1107
- }
1108
- confirmCommand() {
1109
- this.setCommandEvent({
1110
- data: this.superControl.control?.value,
1111
- action: InputCommandsAction.CONFIRM,
1112
- mode: !this.inputConfig.dropdownLabelNew &&
1113
- this.inputConfig.name !== 'Input Dropdown Bank Name'
1114
- ? 'edit'
1115
- : 'new',
1116
- });
1117
- }
1118
- cancelCommand() {
1119
- this.setCommandEvent({ action: InputCommandsAction.CANCEL });
1120
- }
1121
- handleMonths(action) {
1122
- clearTimeout(this.inputCommandsTimeout);
1123
- switch (action) {
1124
- case InputCommandsAction.MINUS:
1125
- this.decrementMonth();
1126
- break;
1127
- case InputCommandsAction.PLUS:
1128
- this.incrementMonth();
1129
- break;
1130
- default:
1131
- break;
1132
- }
1133
- if (parseInt(this.superControl.control?.value) < 1 ||
1134
- parseInt(this.superControl.control?.value) > 12) {
1135
- this.superControl.control?.setErrors({ invalid: true });
1136
- }
1137
- else {
1138
- this.superControl.control?.setErrors(null);
1139
- }
1140
- this.setInputCursorAtTheEnd(this.input.nativeElement);
1141
- }
1142
- decrementMonth() {
1143
- if (parseInt(this.superControl.control?.value) === 1 ||
1144
- !this.superControl.control?.value) {
1145
- this.blurOnCommands();
1146
- return;
1147
- }
1148
- this.superControl.control?.patchValue((this.superControl.control?.value
1149
- ? parseInt(this.superControl.control?.value)
1150
- : 0) - 1);
1151
- }
1152
- incrementMonth() {
1153
- if (parseInt(this.superControl.control?.value) === 12) {
1154
- this.blurOnCommands();
1155
- return;
1156
- }
1157
- this.superControl.control?.patchValue((this.superControl.control?.value
1158
- ? parseInt(this.superControl.control?.value)
1159
- : 0) + 1);
1160
- }
1161
- onFocus(event) {
1162
- // DropDown Label
1163
- if (this.inputConfig.dropdownLabel) {
1164
- this.inputConfig.placeholderIcon =
1165
- InputSvgRoutes.dynamicFocusLabelSvg;
1166
- }
1167
- // Datepicker
1168
- if (this.isDateTimePicker() && !this.inputConfig.isDisabled) {
1169
- clearTimeout(this.dateTimeMainTimer);
1170
- clearTimeout(this.focusBlur);
1171
- this.setShowDateInput(true);
1172
- if ((this.selectionInput === -1 &&
1173
- event?.target?.nodeName === 'INPUT') ||
1174
- event?.relatedTarget?.nodeName === 'INPUT' ||
1175
- event?.relatedTarget === null) {
1176
- this.preventBlur = true;
1177
- this.holder1.nativeElement.focus();
1178
- this.setSpanSelection(this.holder1.nativeElement);
1179
- this.selectionInput = -1;
1180
- }
1181
- this.t2.toggle();
1182
- }
1183
- // Dropdown
1184
- if (this.inputConfig.isDropdown) {
1185
- this.setIsDropdownToggler(true);
1186
- this.setShowHideDropdown(this.isDropdownTogglerSubject.value);
1187
- }
1188
- // Commands
1189
- if (this.inputConfig.commands && !this.inputConfig.isDisabled) {
1190
- if (this.inputConfig.commands.type === InputCommandsType.MONTHS) {
1191
- if (!this.inputConfig.blueInput)
1192
- this.inputConfig.blackInput = true;
1193
- this.inputConfig.commands.active = true;
1194
- this.setIsVisibleCommands(true);
1195
- }
1196
- if (this.inputConfig.commands.type ===
1197
- InputCommandsType.PM_INCREMENT_DECREMENT ||
1198
- this.inputConfig.commands.type ===
1199
- InputCommandsType.INCREMENT_DECREMENT) {
1200
- this.inputConfig.blackInput = false;
1201
- this.inputConfig.commands.active = true;
1202
- this.setIsVisibleCommands(true);
1203
- }
1204
- }
1205
- this.setIsFocusInput(true);
1206
- }
1207
- onBlur(event) {
1208
- // DropDown Label
1209
- if (this.inputConfig.dropdownLabel && !this.isEditInputSubject.value)
1210
- this.inputConfig.placeholderIcon = InputSvgRoutes.dynamicLabelSvg;
1211
- // Edit Input
1212
- if (this.isEditInputSubject.value) {
1213
- this.superControl.control?.setErrors({ invalid: true });
1214
- return;
1215
- }
1216
- // Datepicker;
1217
- if (this.preventBlur) {
1218
- this.preventBlur = false;
1219
- return;
1220
- }
1221
- // Bank
1222
- if (this.inputConfig.name ===
1223
- InputConfigNameStringEnum.INPUT_DROPDOWN_BANK_NAME)
1224
- this.inputConfig.blackInput = false;
1225
- // Price Separator - remove dot on focus out
1226
- if (this.inputConfig.priceSeparator &&
1227
- this.superControl.control?.value &&
1228
- this.superControl.control?.value?.toString().indexOf('.') >= 0) {
1229
- // 4.1. Check for Dot position
1230
- this.hasDecimalIndex = this.superControl.control?.value
1231
- .toString()
1232
- .indexOf('.');
1233
- let integerPart = this.thousandSeparatorPipe.transform(this.superControl.control?.value
1234
- .slice(0, this.hasDecimalIndex)
1235
- .slice(0, this.inputConfig.priceSeparatorLimitation));
1236
- let decimalPart = this.superControl.control?.value.slice(this.hasDecimalIndex + 1);
1237
- // 4.4. Get only two numbers of decimal part
1238
- decimalPart = decimalPart.slice(0, 2);
1239
- if (!decimalPart) {
1240
- this.hasDecimalIndex = -1;
1241
- this.superControl.control?.patchValue(integerPart);
1242
- this.numberOfPoints = 0;
1243
- }
1244
- }
1245
- // Dropdown
1246
- if (this.inputConfig.isDropdown || this.inputConfig.dropdownLabel) {
1247
- if ((this.inputConfig.name ===
1248
- InputConfigNameStringEnum.DATE_PICKER ||
1249
- this.inputConfig.name ===
1250
- InputConfigNameStringEnum.TIME_PICKER ||
1251
- this.inputConfig.name ===
1252
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) &&
1253
- !this.inputConfig.isDisabled) {
1254
- if (event?.target?.nodeName === 'INPUT') {
1255
- return;
1256
- }
1257
- // Datepicker
1258
- if (this.isDateTimePicker()) {
1259
- this.focusBlur = setTimeout(() => {
1260
- this.blurOnDateTime();
1261
- }, 100);
1262
- }
1263
- else {
1264
- this.setIsFocusInput(false);
1265
- }
1266
- }
1267
- else {
1268
- this.blurOnDropDownArrow();
1269
- }
1270
- }
1271
- // Normal, without dropdown
1272
- else {
1273
- let selection = window.getSelection();
1274
- selection?.removeAllRanges();
1275
- // Input Commands
1276
- if (this.inputConfig.commands)
1277
- this.blurOnCommands();
1278
- // Password
1279
- if (this.inputConfig.type === 'password')
1280
- this.blurOnPassword();
1281
- // Normal focus out
1282
- else
1283
- this.setIsFocusInput(false);
1284
- }
1285
- this.setBlurInput(true);
1286
- this.setIsTouchedInput(true);
1287
- }
1288
- blurOnCommands() {
1289
- this.inputCommandsTimeout = setTimeout(() => {
1290
- this.inputConfig.commands.active = false;
1291
- this.setIsVisibleCommands(false);
1292
- this.inputConfig.blackInput = false;
1293
- this.cdRef.detectChanges();
1294
- }, 200);
1295
- }
1296
- blurOnDropDownArrow() {
1297
- this.timeoutCleaner = setTimeout(() => {
1298
- this.setIsDropdownToggler(false);
1299
- this.setIsFocusInput(false);
1300
- this.setIsDropdownToggler(false);
1301
- this.setIsFocusInput(false);
1302
- this.setShowHideDropdown(this.isDropdownTogglerSubject.value);
1303
- }, 150);
1304
- }
1305
- blurOnPassword() {
1306
- this.passwordTimeout = setTimeout(() => {
1307
- this.setIsFocusInput(false);
1308
- this.input.nativeElement.blur();
1309
- this.cdRef.detectChanges();
1310
- }, 150);
1311
- }
1312
- setInputCursorAtTheEnd(input, time = 120) {
1313
- const selectionEnd = input.selectionEnd;
1314
- if (input.setSelectionRange) {
1315
- input.setSelectionRange(selectionEnd, selectionEnd);
1316
- }
1317
- setTimeout(() => {
1318
- input.focus();
1319
- }, time);
1320
- }
1321
- onEditInput(event) {
1322
- event.preventDefault();
1323
- event.stopPropagation();
1324
- this.setIsEditInput(true);
1325
- this.inputConfig.dropdownLabelNew = false;
1326
- if (!this.inputConfig.blueInput)
1327
- this.inputConfig.blackInput = true;
1328
- this.inputConfig.commands.active = true;
1329
- this.setIsVisibleCommands(true);
1330
- this.setIsFocusInput(true);
1331
- this.setInputCursorAtTheEnd(this.input.nativeElement);
1332
- this.superControl.control?.setErrors({ required: true });
1333
- this.setCommandEvent({
1334
- data: this.superControl.control?.value,
1335
- action: 'Edit Input',
1336
- });
1337
- }
1338
- setViewChilds(spanOne, spanTwo, spanThree, holder1) {
1339
- this.spanOne = spanOne;
1340
- this.spanTwo = spanTwo;
1341
- this.spanThree = spanThree;
1342
- this.holder1 = holder1;
1343
- }
1344
- setViewChildsPopover(t2, ngbMainPopover) {
1345
- this.t2 = t2;
1346
- this.ngbMainPopover = ngbMainPopover;
1347
- }
1348
- toggleDropdownOptions() {
1349
- if (this.inputConfig.isDisabled) {
1350
- return;
1351
- }
1352
- if (this.inputConfig.name === InputConfigNameStringEnum.DATE_PICKER ||
1353
- this.inputConfig.name === InputConfigNameStringEnum.TIME_PICKER ||
1354
- this.inputConfig.name ===
1355
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD)
1356
- if (this.t2) {
1357
- if (!this.t2.isOpen()) {
1358
- clearTimeout(this.dateTimeMainTimer);
1359
- clearTimeout(this.focusBlur);
1360
- this.holder1.nativeElement.focus();
1361
- this.selectionInput = -1;
1362
- this.setSpanSelection(this.holder1.nativeElement);
1363
- this.t2.open();
1364
- }
1365
- else {
1366
- this.holder1.nativeElement.blur();
1367
- this.setIsFocusInput(false);
1368
- let selection = window.getSelection();
1369
- selection?.removeAllRanges();
1370
- }
1371
- return;
1372
- }
1373
- this.setIsDropdownToggler(!this.isDropdownTogglerSubject.value);
1374
- this.setShowHideDropdown(this.isDropdownTogglerSubject.value);
1375
- if (this.isDropdownTogglerSubject.value) {
1376
- this.input.nativeElement.focus();
1377
- this.setIsFocusInput(true);
1378
- }
1379
- }
1380
- onPlaceholderIconEvent(event) {
1381
- event.preventDefault();
1382
- event.stopPropagation();
1383
- if (this.isEditInputSubject.value) {
1384
- this.setCommandEvent({
1385
- data: this.superControl.control?.value,
1386
- action: 'Toggle Dropdown',
1387
- });
1388
- }
1389
- else {
1390
- this.setCommandEvent({
1391
- data: this.superControl.control?.value,
1392
- action: 'Placeholder Icon Event',
1393
- });
1394
- }
1395
- }
1396
- onInputConfigChange() {
1397
- // Price Separator
1398
- if (this.inputConfig.priceSeparator) {
1399
- this.originPriceSeparatorLimit =
1400
- this.inputConfig.priceSeparatorLimitation;
1401
- }
1402
- // Custom Range
1403
- if (this.inputConfig.isUsingCustomPeriodRange) {
1404
- if (this.inputConfig.isDisplayingCustomPeriodRange)
1405
- this.setIsFocusInput(true);
1406
- else
1407
- this.setIsFocusInput(false);
1408
- }
1409
- // DatePicker
1410
- if (this.inputConfig.name === InputConfigNameStringEnum.DATE_PICKER ||
1411
- this.inputConfig.name === InputConfigNameStringEnum.TIME_PICKER ||
1412
- this.inputConfig.name ===
1413
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) {
1414
- this.setTimePickerTime();
1415
- this.calendarService.dateChanged
1416
- .pipe(takeUntil(this.destroy$))
1417
- .subscribe((date) => {
1418
- if (!this.inputConfig.isDisabled) {
1419
- this.setTimeDateInput(date);
1420
- this.t2.close();
1421
- }
1422
- });
1423
- }
1424
- // When add mode in dropdown
1425
- if (this.inputConfig.commands?.active && !this.inputConfig.isDisabled) {
1426
- if (this.inputConfig.commands.type === 'confirm-cancel') {
1427
- if (!this.inputConfig.blueInput)
1428
- this.inputConfig.blackInput = true;
1429
- this.setIsVisibleCommands(true);
1430
- this.setIsFocusInput(true);
1431
- this.input.nativeElement.focus();
1432
- }
1433
- }
1434
- }
1435
- onKeydown(event) {
1436
- if (event)
1437
- this.setIsCapsLockOn(event?.getModifierState?.('CapsLock'));
1438
- if (this.inputConfig.priceSeparator) {
1439
- const valueToString = String(this.superControl.control?.value);
1440
- this.isDotDeleted = valueToString?.includes('.');
1441
- }
1442
- // Disable for phone field first character to be 0
1443
- if (this.inputConfig.name.toLowerCase() === InputStringEnum.PHONE) {
1444
- if (event.target.selectionStart === 0 &&
1445
- event.key === '0') {
1446
- event.preventDefault();
1447
- }
1448
- }
1449
- if (event.keyCode === 9) {
1450
- this.setDropDownKeyNavigation({
1451
- keyCode: event.keyCode,
1452
- data: null,
1453
- });
1454
- }
1455
- }
1456
- onKeyup(event) {
1457
- if (event) {
1458
- this.setIsCapsLockOn(event?.getModifierState?.('CapsLock'));
1459
- }
1460
- // Reset function property for disabling multiple dots
1461
- const valueToString = String(this.superControl.control?.value);
1462
- if (this.isDotDeleted && !valueToString?.includes('.'))
1463
- this.numberOfPoints = 0;
1464
- if (event.keyCode == 8 &&
1465
- !(this.inputConfig.isDropdown || this.inputConfig.dropdownLabel)) {
1466
- // Reset Multiple Consecutively Spaces
1467
- this.numberOfConsecutivelySpaces = 0;
1468
- // Reset One Space Only
1469
- if (this.superControl.control?.value &&
1470
- !this.superControl.control?.value?.includes(' ')) {
1471
- this.oneSpaceOnlyCounter = 0;
1472
- }
1473
- }
1474
- if (this.inputConfig.isDropdown ||
1475
- this.inputConfig.dropdownLabel ||
1476
- this.inputConfig.name === InputConfigNameStringEnum.ADDRESS) {
1477
- if (event.keyCode === 40 || event.keyCode === 38) {
1478
- this.setDropDownKeyNavigation({
1479
- keyCode: event.keyCode,
1480
- data: null,
1481
- });
1482
- }
1483
- if (event.keyCode === 13) {
1484
- this.setDropDownKeyNavigation({
1485
- keyCode: event.keyCode,
1486
- data: this.inputConfig,
1487
- });
1488
- if (this.inputConfig.name === InputConfigNameStringEnum.ADDRESS) {
1489
- this.input.nativeElement.blur();
1490
- }
1491
- }
1492
- if (event.keyCode === 27) {
1493
- this.setIsVisibleCommands(false);
1494
- this.onBlur();
1495
- this.blurOnDropDownArrow();
1496
- this.input.nativeElement.blur();
1497
- this.setDropDownKeyNavigation({
1498
- keyCode: event.keyCode,
1499
- data: null,
1500
- });
1501
- }
1502
- if (event.keyCode === 9) {
1503
- this.onFocus();
1504
- this.input.nativeElement.focus();
1505
- this.setDropDownKeyNavigation({
1506
- keyCode: event.keyCode,
1507
- data: null,
1508
- });
1509
- }
1510
- }
1511
- }
1512
- //-------------------------------------- Date & Time Picker --------------------------------------
1513
- setTimePickerTime() {
1514
- if (this.inputConfig.name === InputConfigNameStringEnum.TIME_PICKER)
1515
- this.setDateTimeInputDate(new Date(moment().format('MM/DD/YYYY') +
1516
- (this.inputConfig?.isFromDate ? ' 12:15' : ' 12:00')));
1517
- }
1518
- setTimeDateInput(date) {
1519
- let text, dateFormat, timeFormat;
1520
- if (this.inputConfig.name === InputConfigNameStringEnum.DATE_PICKER) {
1521
- text = moment(new Date(date)).format('MM/DD/YY');
1522
- dateFormat = text.split('/');
1523
- }
1524
- else if (this.inputConfig.name ===
1525
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) {
1526
- text = moment(new Date(date)).format('MM/DD/YY');
1527
- dateFormat = text.split('/');
1528
- }
1529
- else {
1530
- date =
1531
- date instanceof Date
1532
- ? date
1533
- : new Date(moment().format('MM/DD/YYYY') + ' ' + date);
1534
- text = moment(new Date(date)).format('HH:mm');
1535
- timeFormat = moment(new Date(date)).format('hh/mm/A');
1536
- dateFormat = timeFormat.split('/');
1537
- }
1538
- this.input.nativeElement.value = text;
1539
- this.setOnChange(this.input.nativeElement.value);
1540
- this.setIsFocusInput(false);
1541
- if (this.spanOne)
1542
- this.spanOne.nativeElement.innerHTML = dateFormat[0];
1543
- if (this.spanTwo)
1544
- if (this.inputConfig.name !==
1545
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) {
1546
- this.spanTwo.nativeElement.innerHTML = dateFormat[1];
1547
- this.spanThree.nativeElement.innerHTML = dateFormat[2];
1548
- }
1549
- else {
1550
- this.spanTwo.nativeElement.innerHTML = dateFormat[2];
1551
- }
1552
- this.setDateTimeInputDate(new Date(date));
1553
- this.setShowDateInput(true);
1554
- }
1555
- resetDateTimeInputs() {
1556
- if (this.spanOne)
1557
- if (this.inputConfig.name === InputConfigNameStringEnum.DATE_PICKER) {
1558
- this.spanOne.nativeElement.innerHTML = 'mm';
1559
- this.spanTwo.nativeElement.innerHTML = 'dd';
1560
- this.spanThree.nativeElement.innerHTML = 'yy';
1561
- }
1562
- else if (this.inputConfig.name ===
1563
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) {
1564
- this.spanOne.nativeElement.innerHTML = 'mm';
1565
- this.spanTwo.nativeElement.innerHTML = 'yy';
1566
- }
1567
- else if (this.inputConfig.name === InputConfigNameStringEnum.TIME_PICKER) {
1568
- this.spanOne.nativeElement.innerHTML = 'HH';
1569
- this.spanTwo.nativeElement.innerHTML = 'MM';
1570
- this.spanThree.nativeElement.innerHTML = 'AM';
1571
- }
1572
- this.setTimePickerTime();
1573
- this.newInputChanged = true;
1574
- this.setIsFocusInput(false);
1575
- this.setShowDateInput(false);
1576
- }
1577
- selectionChange(event) {
1578
- if (event)
1579
- this.inputSelection = true;
1580
- }
1581
- onDatePaste(event) {
1582
- event.preventDefault();
1583
- const pasteText = event.clipboardData?.getData('text');
1584
- const pastedDate = new Date(pasteText);
1585
- if (!isNaN(pastedDate.getTime())) {
1586
- this.setTimeDateInput(pastedDate);
1587
- this.selectSpanByTabIndex(this.selectionInput);
1588
- }
1589
- }
1590
- setSelection(event) {
1591
- const element = event.target;
1592
- this.setIsFocusInput(true);
1593
- const selectionInput = parseInt(element.getAttribute('tabindex'));
1594
- const currentSelection = window.getSelection();
1595
- if (currentSelection && currentSelection.toString().length > 10) {
1596
- this.holder1.nativeElement.focus();
1597
- this.selectionInput = 0;
1598
- this.setSpanSelection(this.holder1.nativeElement);
1599
- clearTimeout(this.dateTimeMainTimer);
1600
- clearTimeout(this.focusBlur);
1601
- return;
1602
- }
1603
- clearTimeout(this.dateTimeMainTimer);
1604
- if (element.classList.contains('main')) {
1605
- this.selectionInput = selectionInput;
1606
- this.setSpanSelection(element);
1607
- }
1608
- else {
1609
- if (this.selectionInput === -1) {
1610
- this.spanOne.nativeElement.focus();
1611
- this.selectionInput = 0;
1612
- this.setSpanSelection(this.spanOne.nativeElement);
1613
- }
1614
- else {
1615
- event.preventDefault();
1616
- this.selectSpanByTabIndex(this.selectionInput);
1617
- }
1618
- }
1619
- }
1620
- setSpanSelection(element) {
1621
- let range;
1622
- let selection;
1623
- if (window.getSelection && document.createRange) {
1624
- selection = window.getSelection();
1625
- range = document.createRange();
1626
- range.selectNodeContents(element);
1627
- selection?.removeAllRanges();
1628
- selection?.addRange(range);
1629
- }
1630
- }
1631
- showDateTimePlaceholder() {
1632
- this.setShowDateInput(true);
1633
- this.setIsFocusInput(true);
1634
- this.selectionInput = -1;
1635
- this.holder1.nativeElement.focus();
1636
- this.setSpanSelection(this.holder1.nativeElement);
1637
- }
1638
- changeSelection(event, noPreventDefault = false) {
1639
- if (!noPreventDefault) {
1640
- event.preventDefault();
1641
- event.stopPropagation();
1642
- }
1643
- const isNavigationKey = this.isNavigationKey(event);
1644
- const isSpecialTimePickerKey = this.selectionInput === 3 &&
1645
- this.inputConfig.name === InputConfigNameStringEnum.TIME_PICKER;
1646
- if (isNavigationKey || isSpecialTimePickerKey) {
1647
- event.preventDefault();
1648
- this.handleNavigationKey(event);
1649
- }
1650
- else if (!this.isNumber(event)) {
1651
- if (!noPreventDefault)
1652
- event.preventDefault();
1653
- else {
1654
- if (!noPreventDefault)
1655
- event.preventDefault();
1656
- if (this.selectionInput === -1)
1657
- this.selectionInput = 0;
1658
- this.handleKeyboardInputs(event);
1659
- }
1660
- }
1661
- }
1662
- isNavigationKey(e) {
1663
- const navigationKeys = [37, 38, 39, 40, 8, 9, 46]; // Arrow keys, Backspace, Tab, Delete
1664
- return navigationKeys.includes(e.keyCode);
1665
- }
1666
- handleNavigationKey(event) {
1667
- switch (event.keyCode) {
1668
- case 37: // Left arrow
1669
- this.moveSelectionLeft();
1670
- break;
1671
- case 39: // Right arrow
1672
- case 9: // Tab
1673
- this.moveSelectionRightOrTab(event);
1674
- break;
1675
- case 38: // Up arrow
1676
- this.setDateTimeModel('up');
1677
- break;
1678
- case 40: // Down arrow
1679
- this.setDateTimeModel('down');
1680
- break;
1681
- case 8: // Backspace
1682
- case 46: // Delete
1683
- this.handleKeyboardInputs(event, true);
1684
- break;
1685
- }
1686
- }
1687
- moveSelectionLeft() {
1688
- if (this.selectionInput > 0) {
1689
- this.selectionInput -= 1;
1690
- this.selectSpanByTabIndex(this.selectionInput, true);
1691
- }
1692
- }
1693
- moveSelectionRightOrTab(e) {
1694
- const isDatepickerBankCard = this.inputConfig.name ===
1695
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD;
1696
- const maxIndex = isDatepickerBankCard ? 1 : 2;
1697
- if (this.selectionInput < maxIndex && !e.shiftKey) {
1698
- this.selectionInput += 1;
1699
- this.selectSpanByTabIndex(this.selectionInput, true);
1700
- }
1701
- else if (e.keyCode === 9 && !e.shiftKey) {
1702
- this.focusNextInput();
1703
- }
1704
- else if (e.shiftKey && e.keyCode === 9) {
1705
- this.focusPreviousInput();
1706
- }
1707
- }
1708
- focusNextInput() {
1709
- const allInputs = Array.from(document.querySelectorAll('input.input-control'));
1710
- const currentIndex = allInputs.findIndex((input) => input === this.input.nativeElement);
1711
- if (allInputs[currentIndex + 1])
1712
- allInputs[currentIndex + 1].focus();
1713
- else {
1714
- this.setIsFocusInput(false);
1715
- this.blurOnDateTime();
1716
- }
1717
- this.selectionInput = -1;
1718
- }
1719
- focusPreviousInput() {
1720
- const allInputs = Array.from(document.querySelectorAll('input.input-control'));
1721
- const currentIndex = allInputs.findIndex((input) => input === this.input.nativeElement);
1722
- if (currentIndex === -1)
1723
- this.selectionInput = 3;
1724
- else if (currentIndex === 0)
1725
- this.selectionInput = 0;
1726
- else {
1727
- this.selectionInput -= 1;
1728
- this.selectSpanByTabIndex(this.selectionInput);
1729
- }
1730
- if (currentIndex > 0)
1731
- allInputs[currentIndex - 1].focus();
1732
- this.selectionInput = -1;
1733
- }
1734
- handleKeyboardInputs(e, isRestart) {
1735
- const spanOneValue = isNaN(this.spanOne.nativeElement.innerHTML) || this.newInputChanged
1736
- ? undefined
1737
- : parseInt(this.spanOne.nativeElement.innerHTML);
1738
- const spanTwoValue = isNaN(this.spanTwo.nativeElement.innerHTML) || this.newInputChanged
1739
- ? undefined
1740
- : parseInt(this.spanTwo.nativeElement.innerHTML);
1741
- let spanThreeValue;
1742
- if (this.inputConfig.name !==
1743
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) {
1744
- spanThreeValue =
1745
- isNaN(this.spanThree.nativeElement.innerHTML) ||
1746
- this.newInputChanged
1747
- ? ''
1748
- : parseInt(this.spanThree.nativeElement.innerHTML);
1749
- }
1750
- this.newInputChanged = false;
1751
- if (this.inputConfig.name === InputConfigNameStringEnum.DATE_PICKER) {
1752
- if (this.selectionInput === 0) {
1753
- if (isRestart) {
1754
- this.spanOne.nativeElement.innerHTML = 'mm';
1755
- this.selectionInput = 0;
1756
- this.selectSpanByTabIndex(0);
1757
- }
1758
- else if (spanOneValue !== undefined) {
1759
- let final_value = parseInt(`${spanOneValue}${e.key}`);
1760
- if (final_value > 12) {
1761
- this.spanOne.nativeElement.innerHTML = ('0' + parseInt(e.key)).slice(-2);
1762
- this.selectionInput = 1;
1763
- this.selectSpanByTabIndex(1, true);
1764
- }
1765
- else {
1766
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setMonth(parseInt(this.spanOne.nativeElement.innerHTML +
1767
- parseInt(e.key)) - 1)));
1768
- if (!final_value)
1769
- this.spanOne.nativeElement.innerHTML = 'mm';
1770
- else
1771
- this.spanOne.nativeElement.innerHTML = (this.spanOne.nativeElement.innerHTML +
1772
- parseInt(e.key)).slice(-2);
1773
- this.selectionInput = 1;
1774
- this.selectSpanByTabIndex(1, true);
1775
- }
1776
- }
1777
- else {
1778
- if (parseInt(e.key))
1779
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setMonth(parseInt(e.key) - 1)));
1780
- const final_value = ('0' + parseInt(e.key)).slice(-2);
1781
- this.spanOne.nativeElement.innerHTML = final_value;
1782
- if (parseInt(`1${e.key}`) > 12) {
1783
- this.selectionInput = 1;
1784
- this.selectSpanByTabIndex(1, true);
1785
- }
1786
- else
1787
- this.selectSpanByTabIndex(0);
1788
- }
1789
- }
1790
- else if (this.selectionInput === 1) {
1791
- if (isRestart) {
1792
- this.spanTwo.nativeElement.innerHTML = 'dd';
1793
- this.selectionInput = 0;
1794
- this.selectSpanByTabIndex(0, true);
1795
- }
1796
- else if (spanTwoValue !== undefined) {
1797
- let final_value = parseInt(`${spanTwoValue}${e.key}`);
1798
- if (final_value > 31) {
1799
- this.spanTwo.nativeElement.innerHTML = ('0' + parseInt(e.key)).slice(-2);
1800
- this.selectionInput = 2;
1801
- this.selectSpanByTabIndex(2, true);
1802
- }
1803
- else {
1804
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setDate(parseInt(this.spanTwo.nativeElement.innerHTML +
1805
- parseInt(e.key)))));
1806
- if (!final_value) {
1807
- this.spanTwo.nativeElement.innerHTML = 'dd';
1808
- }
1809
- else {
1810
- this.spanTwo.nativeElement.innerHTML = (this.spanTwo.nativeElement.innerHTML +
1811
- parseInt(e.key)).slice(-2);
1812
- }
1813
- this.selectionInput = 2;
1814
- this.selectSpanByTabIndex(2, true);
1815
- }
1816
- }
1817
- else {
1818
- if (parseInt(e.key))
1819
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setDate(parseInt(e.key))));
1820
- this.spanTwo.nativeElement.innerHTML = ('0' + parseInt(e.key)).slice(-2);
1821
- if (parseInt(`1${e.key}`) > 31) {
1822
- this.selectionInput = 2;
1823
- this.selectSpanByTabIndex(2, true);
1824
- }
1825
- else {
1826
- this.selectSpanByTabIndex(1);
1827
- }
1828
- }
1829
- }
1830
- else {
1831
- if (isRestart) {
1832
- this.spanThree.nativeElement.innerHTML = 'yy';
1833
- this.selectionInput = 1;
1834
- this.selectSpanByTabIndex(1, true);
1835
- }
1836
- else if (!spanThreeValue ||
1837
- spanThreeValue.toString().length === 2) {
1838
- this.spanThree.nativeElement.innerHTML = ('0' + parseInt(e.key)).slice(-2);
1839
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setFullYear(parseInt(`200${parseInt(e.key)}`))));
1840
- this.selectSpanByTabIndex(2);
1841
- }
1842
- else {
1843
- const finalYear = parseInt(this.spanThree.nativeElement.innerHTML + parseInt(e.key));
1844
- const finalShowYear = finalYear > 31
1845
- ? parseInt(`19${finalYear}`)
1846
- : parseInt(`20${finalYear}`);
1847
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setFullYear(finalShowYear)));
1848
- this.spanThree.nativeElement.innerHTML = (this.spanThree.nativeElement.innerHTML + parseInt(e.key)).slice(-2);
1849
- this.selectSpanByTabIndex(2);
1850
- }
1851
- }
1852
- }
1853
- else if (this.inputConfig.name ===
1854
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) {
1855
- if (!this.selectionInput) {
1856
- if (isRestart) {
1857
- this.spanOne.nativeElement.innerHTML = 'mm';
1858
- this.selectionInput = 0;
1859
- this.selectSpanByTabIndex(0);
1860
- }
1861
- else if (spanOneValue) {
1862
- const final_value = parseInt(`${spanOneValue}${e.key}`);
1863
- if (final_value > 12) {
1864
- this.spanOne.nativeElement.innerHTML = ('0' + parseInt(e.key)).slice(-2);
1865
- this.selectionInput = 1;
1866
- this.selectSpanByTabIndex(1, true);
1867
- }
1868
- else {
1869
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setMonth(parseInt(this.spanOne.nativeElement.innerHTML +
1870
- parseInt(e.key)) - 1)));
1871
- if (!final_value) {
1872
- this.spanOne.nativeElement.innerHTML = 'mm';
1873
- }
1874
- else {
1875
- this.spanOne.nativeElement.innerHTML = (this.spanOne.nativeElement.innerHTML +
1876
- parseInt(e.key)).slice(-2);
1877
- }
1878
- this.selectionInput = 1;
1879
- this.selectSpanByTabIndex(1, true);
1880
- }
1881
- }
1882
- else {
1883
- if (parseInt(e.key))
1884
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setMonth(parseInt(e.key) - 1)));
1885
- const final_value = ('0' + parseInt(e.key)).slice(-2);
1886
- this.spanOne.nativeElement.innerHTML = final_value;
1887
- if (parseInt(`1${e.key}`) > 12) {
1888
- this.selectionInput = 1;
1889
- this.selectSpanByTabIndex(1, true);
1890
- }
1891
- else
1892
- this.selectSpanByTabIndex(0);
1893
- }
1894
- }
1895
- else {
1896
- if (isRestart) {
1897
- this.spanTwo.nativeElement.innerHTML = 'yy';
1898
- this.selectionInput = 2;
1899
- this.selectSpanByTabIndex(2, true);
1900
- }
1901
- else if (!spanTwoValue ||
1902
- spanTwoValue.toString().length === 2) {
1903
- this.spanTwo.nativeElement.innerHTML = ('0' + parseInt(e.key)).slice(-2);
1904
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setFullYear(parseInt(`200${parseInt(e.key)}`))));
1905
- this.selectSpanByTabIndex(1);
1906
- }
1907
- else {
1908
- const finalYear = parseInt(this.spanTwo.nativeElement.innerHTML + parseInt(e.key));
1909
- const finalShowYear = finalYear > 31
1910
- ? parseInt(`19${finalYear}`)
1911
- : parseInt(`20${finalYear}`);
1912
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setFullYear(finalShowYear)));
1913
- this.spanTwo.nativeElement.innerHTML = (this.spanTwo.nativeElement.innerHTML + parseInt(e.key)).slice(-2);
1914
- this.selectSpanByTabIndex(1);
1915
- }
1916
- }
1917
- }
1918
- }
1919
- selectSpanByTabIndex(indx, changeTab) {
1920
- switch (indx) {
1921
- case 0:
1922
- this.setSpanSelection(this.spanOne.nativeElement);
1923
- break;
1924
- case 1:
1925
- this.setSpanSelection(this.spanTwo.nativeElement);
1926
- break;
1927
- case 2:
1928
- this.setSpanSelection(this.spanThree.nativeElement);
1929
- break;
1930
- default:
1931
- this.setSpanSelection(this.holder1.nativeElement);
1932
- }
1933
- if (changeTab)
1934
- this.newInputChanged = true;
1935
- }
1936
- setDateTimeModel(direction) {
1937
- if (this.selectionInput === -1)
1938
- this.selectionInput = 0;
1939
- const isUp = direction === 'up';
1940
- const isDatePicker = this.inputConfig.name === InputConfigNameStringEnum.DATE_PICKER;
1941
- const isBankCardPicker = this.inputConfig.name ===
1942
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD;
1943
- if (isDatePicker || isBankCardPicker)
1944
- this.handleDatePickerInput(isUp, isDatePicker);
1945
- else
1946
- this.handleTimePickerInput(isUp);
1947
- }
1948
- handleDatePickerInput(isUp, isDatePicker) {
1949
- if (this.selectionInput === 0)
1950
- this.updateMonth(isUp);
1951
- else if (this.selectionInput === 1)
1952
- this.updateDate(isUp, isDatePicker);
1953
- else
1954
- this.updateYear(isUp, isDatePicker);
1955
- }
1956
- handleTimePickerInput(isUp) {
1957
- if (this.selectionInput === 0)
1958
- this.updateHours(isUp);
1959
- else if (this.selectionInput === 1)
1960
- this.updateMinutes(isUp);
1961
- else
1962
- this.toggleAMPM();
1963
- }
1964
- updateMonth(isUp) {
1965
- const monthDelta = isUp ? 1 : -1;
1966
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setMonth(this.dateTimeInputDateSubject.value.getMonth() + monthDelta)));
1967
- this.spanOne.nativeElement.innerHTML = this.padValue(this.dateTimeInputDateSubject.value.getMonth() + 1);
1968
- this.setSpanSelection(this.spanOne.nativeElement);
1969
- }
1970
- updateDate(isUp, isDatePicker) {
1971
- const dateDelta = isUp ? 1 : -1;
1972
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setDate(this.dateTimeInputDateSubject.value.getDate() + dateDelta)));
1973
- const spanElement = isDatePicker
1974
- ? this.spanTwo.nativeElement
1975
- : this.spanOne.nativeElement;
1976
- spanElement.innerHTML = this.padValue(this.dateTimeInputDateSubject.value.getDate());
1977
- this.setSpanSelection(spanElement);
1978
- }
1979
- updateYear(isUp, isDatePicker) {
1980
- const yearDelta = isUp ? 1 : -1;
1981
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setFullYear(this.dateTimeInputDateSubject.value.getFullYear() +
1982
- yearDelta)));
1983
- const spanElement = isDatePicker
1984
- ? this.spanThree.nativeElement
1985
- : this.spanTwo.nativeElement;
1986
- spanElement.innerHTML = this.dateTimeInputDateSubject.value
1987
- .getFullYear()
1988
- .toString()
1989
- .slice(-2);
1990
- this.setSpanSelection(spanElement);
1991
- }
1992
- updateHours(isUp) {
1993
- const hoursDelta = isUp ? 1 : -1;
1994
- let selectedHours = this.dateTimeInputDateSubject.value.getHours() + hoursDelta;
1995
- if (selectedHours === 0)
1996
- selectedHours = 24;
1997
- if (selectedHours === -1)
1998
- selectedHours = 23;
1999
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setHours(selectedHours)));
2000
- this.spanOne.nativeElement.innerHTML = this.padValue(selectedHours > 12 ? selectedHours - 12 : selectedHours);
2001
- this.setSpanSelection(this.spanOne.nativeElement);
2002
- this.spanThree.nativeElement.innerHTML =
2003
- selectedHours > 11 && selectedHours < 24 ? 'PM' : 'AM';
2004
- }
2005
- updateMinutes(isUp) {
2006
- const minutesDelta = isUp ? 1 : -1;
2007
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setMinutes(this.dateTimeInputDateSubject.value.getMinutes() +
2008
- minutesDelta)));
2009
- this.spanTwo.nativeElement.innerHTML = this.padValue(this.dateTimeInputDateSubject.value.getMinutes());
2010
- this.setSpanSelection(this.spanTwo.nativeElement);
2011
- }
2012
- toggleAMPM() {
2013
- this.spanThree.nativeElement.innerHTML =
2014
- this.spanThree.nativeElement.innerHTML === 'AM' ? 'PM' : 'AM';
2015
- const hoursToAdd = this.spanThree.nativeElement.innerHTML === 'AM' ? -12 : 12;
2016
- this.setDateTimeInputDate(new Date(this.dateTimeInputDateSubject.value.setHours(this.dateTimeInputDateSubject.value.getHours() + hoursToAdd)));
2017
- this.setSpanSelection(this.spanThree.nativeElement);
2018
- }
2019
- padValue(value) {
2020
- return ('0' + value).slice(-2);
2021
- }
2022
- isNumber(evt) {
2023
- evt = evt ? evt : window.event;
2024
- let charCode = evt.which ? evt.which : evt.keyCode;
2025
- return ((charCode >= 48 && charCode <= 57) ||
2026
- (charCode >= 96 && charCode <= 105));
2027
- }
2028
- onPopoverShown() {
2029
- if (!this.inputConfig.dropdownLabel) {
2030
- this.setIsFocusInput(true);
2031
- this.setShowDateInput(true);
2032
- }
2033
- }
2034
- onPopoverHidden() {
2035
- if (!this.inputConfig.dropdownLabel) {
2036
- this.setIsFocusInput(false);
2037
- this.blurOnDateTime();
2038
- }
2039
- }
2040
- blurOnDateTime() {
2041
- clearTimeout(this.dateTimeMainTimer);
2042
- this.dateTimeMainTimer = setTimeout(() => {
2043
- if (this.inputConfig.name === InputConfigNameStringEnum.DATE_PICKER) {
2044
- if (!isNaN(this.spanOne?.nativeElement.innerHTML) &&
2045
- !isNaN(this.spanTwo?.nativeElement.innerHTML) &&
2046
- !isNaN(this.spanThree?.nativeElement.innerHTML)) {
2047
- if (this.inputConfig.isFutureDateDisabled &&
2048
- moment(this.dateTimeInputDateSubject.value).isAfter(moment()))
2049
- this.superControl.control?.setErrors({ invalid: true }); // don't accept future dates
2050
- else {
2051
- if (this.inputConfig.expiredDateInvalid &&
2052
- moment(this.dateTimeInputDateSubject.value).isBefore(moment())) {
2053
- this.superControl.control?.setErrors({
2054
- invalid: true,
2055
- }); // don't accept expired dates
2056
- }
2057
- else {
2058
- this.calendarService.dateChanged.next(this.dateTimeInputDateSubject.value);
2059
- }
2060
- }
2061
- }
2062
- else {
2063
- this.spanOne.nativeElement.innerHTML = 'mm';
2064
- this.spanTwo.nativeElement.innerHTML = 'dd';
2065
- this.spanThree.nativeElement.innerHTML = 'yy';
2066
- this.setDateTimeInputDate(new Date());
2067
- this.setShowDateInput(false);
2068
- }
2069
- }
2070
- else if (this.inputConfig.name ===
2071
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) {
2072
- if (!isNaN(this.spanOne.nativeElement.innerHTML) &&
2073
- !isNaN(this.spanTwo.nativeElement.innerHTML)) {
2074
- if (this.inputConfig.expiredDateInvalid &&
2075
- moment(this.dateTimeInputDateSubject.value).isBefore(moment())) {
2076
- this.superControl.control?.setErrors({ invalid: true }); // don't accept expired dates
2077
- }
2078
- else {
2079
- this.calendarService.dateChanged.next(this.dateTimeInputDateSubject.value);
2080
- }
2081
- }
2082
- else {
2083
- this.spanOne.nativeElement.innerHTML = 'mm';
2084
- this.spanTwo.nativeElement.innerHTML = 'yy';
2085
- this.setDateTimeInputDate(new Date());
2086
- this.setShowDateInput(false);
2087
- }
2088
- }
2089
- else {
2090
- if (!isNaN(this.spanOne.nativeElement.innerHTML) &&
2091
- !isNaN(this.spanTwo.nativeElement.innerHTML)) {
2092
- // this.calendarService.dateChanged.next(
2093
- // this.dateTimeInputDate
2094
- // );
2095
- }
2096
- else {
2097
- this.spanOne.nativeElement.innerHTML = 'HH';
2098
- this.spanTwo.nativeElement.innerHTML = 'MM';
2099
- this.setTimePickerTime();
2100
- this.setShowDateInput(false);
2101
- }
2102
- }
2103
- clearTimeout(this.dateTimeMainTimer);
2104
- this.setIsFocusInput(false);
2105
- this.selectionInput = -1;
2106
- this.newInputChanged = true;
2107
- this.cdRef.detectChanges();
2108
- }, 100);
2109
- }
2110
- selectLastOneForSelection() {
2111
- // clearTimeout(this.wholeInputSelection);
2112
- let range, selection;
2113
- this.setShowDateInput(true);
2114
- this.selectionInput = -1;
2115
- this.setIsFocusInput(true);
2116
- if (window.getSelection && document.createRange) {
2117
- selection = window.getSelection();
2118
- range = document.createRange();
2119
- if (this.inputConfig.name !==
2120
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) {
2121
- range.setStart(this.spanThree.nativeElement, 1);
2122
- range.setEnd(this.spanThree.nativeElement, 1);
2123
- }
2124
- else {
2125
- range.setStart(this.spanTwo.nativeElement, 1);
2126
- range.setEnd(this.spanTwo.nativeElement, 1);
2127
- }
2128
- selection?.removeAllRanges();
2129
- selection?.addRange(range);
2130
- }
2131
- this.timeoutCleaner = setTimeout(() => {
2132
- clearTimeout(this.dateTimeMainTimer);
2133
- clearTimeout(this.focusBlur);
2134
- }, 90);
2135
- }
2136
- selectLastOneAfterMouseUp() {
2137
- if (this.inputConfig.name ===
2138
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD) {
2139
- this.selectionInput = 1;
2140
- this.spanTwo.nativeElement.focus();
2141
- this.setSpanSelection(this.spanTwo.nativeElement);
2142
- }
2143
- else {
2144
- this.selectionInput = 2;
2145
- this.spanThree.nativeElement.focus();
2146
- this.setSpanSelection(this.spanThree.nativeElement);
2147
- }
2148
- this.setShowDateInput(true);
2149
- this.timeoutCleaner = setTimeout(() => {
2150
- clearTimeout(this.dateTimeMainTimer);
2151
- clearTimeout(this.focusBlur);
2152
- }, 90);
2153
- }
2154
- isDateTimePicker() {
2155
- return (this.inputConfig.name === InputConfigNameStringEnum.DATE_PICKER ||
2156
- this.inputConfig.name === InputConfigNameStringEnum.TIME_PICKER ||
2157
- this.inputConfig.name ===
2158
- InputConfigNameStringEnum.DATE_PICKER_BANK_CARD);
2159
- }
2160
- onDestory() {
2161
- this.destroy$.next();
2162
- this.destroy$.complete();
2163
- }
2164
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputStateService, deps: [{ token: i1.CalendarDateTimePickerService }, { token: i2.CaInputValidationService }, { token: i3.ThousandSeparatorPipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
2165
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputStateService, providedIn: 'root' }); }
2166
- }
2167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InputStateService, decorators: [{
2168
- type: Injectable,
2169
- args: [{
2170
- providedIn: 'root',
2171
- }]
2172
- }], ctorParameters: () => [{ type: i1.CalendarDateTimePickerService }, { type: i2.CaInputValidationService }, { type: i3.ThousandSeparatorPipe }] });
2173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2EtaW5wdXQtc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NhLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2NhLWlucHV0L3NlcnZpY2VzL2NhLWlucHV0LXN0YXRlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQyxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUNILGVBQWUsRUFDZixhQUFhLEVBRWIsT0FBTyxFQUNQLFNBQVMsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQVM1QixVQUFVO0FBQ1YsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFbkUsUUFBUTtBQUNSLE9BQU8sRUFDSCx5QkFBeUIsRUFDekIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixlQUFlLEdBQ2xCLE1BQU0sVUFBVSxDQUFDO0FBTWxCLGFBQWE7QUFDYixPQUFPLEVBQW9CLGNBQWMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUs1RCxZQUFZO0FBQ1osT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7OztBQUtwRCxNQUFNLE9BQU8saUJBQWlCO0lBZ0kxQixZQUNZLGVBQThDLEVBQzlDLHdCQUFrRDtJQUUxRCxRQUFRO0lBQ0EscUJBQTRDO1FBSjVDLG9CQUFlLEdBQWYsZUFBZSxDQUErQjtRQUM5Qyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTBCO1FBR2xELDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFwSWhELHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzNELGtCQUFhLEdBQ2hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQywwQkFBcUIsR0FBRyxJQUFJ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UyxDQUFDLENBQUM7UUFDakMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixPQUFPLENBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUsseUJBQXlCLENBQUMsV0FBVztZQUMvRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyx5QkFBeUIsQ0FBQyxXQUFXO1lBQy9ELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtnQkFDakIseUJBQXlCLENBQUMscUJBQXFCLENBQ3RELENBQUM7SUFDTixDQUFDO0lBRU0sU0FBUztRQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDOytHQTU3RlEsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGZCxNQUFNOzs0RkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIEVsZW1lbnRSZWYsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQmVoYXZpb3JTdWJqZWN0LFxuICAgIGNvbWJpbmVMYXRlc3QsXG4gICAgT2JzZXJ2YWJsZSxcbiAgICBTdWJqZWN0LFxuICAgIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbi8vIG1vZGVsc1xuaW1wb3J0IHsgSUNhSW5wdXQgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgQ29tbWFuZHNFdmVudCB9IGZyb20gJy4uL21vZGVscyc7XG5cbi8vIGJvb3RzdHJhcFxuaW1wb3J0IHsgTmdiUG9wb3ZlciB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcblxuLy8gaGVscGVyc1xuaW1wb3J0IHsgTWV0aG9kc0NhbGN1bGF0aW9uc0hlbHBlciB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2hlbHBlcnMnO1xuXG4vLyBlbnVtc1xuaW1wb3J0IHtcbiAgICBJbnB1dENvbmZpZ05hbWVTdHJpbmdFbnVtLFxuICAgIElucHV0Q29tbWFuZHNUeXBlLFxuICAgIElucHV0Q29tbWFuZHNBY3Rpb24sXG4gICAgSW5wdXRTdHJpbmdFbnVtLFxufSBmcm9tICcuLi9lbnVtcyc7XG5cbi8vIHNlcnZpY2VzXG5pbXBvcnQgeyBDYWxlbmRhckRhdGVUaW1lUGlja2VyU2VydmljZSB9IGZyb20gJy4uLy4uL2NhLWN1c3RvbS1kYXRldGltZS1waWNrZXJzL3NlcnZpY2VzL2NhbGVuZGFyLWRhdGV0aW1lLXBpY2tlci5zZXJ2aWNlJztcbmltcG9ydCB7IENhSW5wdXRWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4vY2EtaW5wdXQtdmFsaWRhdGlvbi5zZXJ2aWNlJztcblxuLy8gU3ZnIHJvdXRlc1xuaW1wb3J0IHsgSW5wdXRDaGFuZ2VWYWx1ZSwgSW5wdXRTdmdSb3V0ZXMgfSBmcm9tICcuLi91dGlscyc7XG5cbi8vIHBpcGVzXG5pbXBvcnQgeyBUaG91c2FuZFNlcGFyYXRvclBpcGUgfSBmcm9tICcuLi8uLi8uLi9waXBlcy90aG91c2FuZC1zZXBhcmF0b3IucGlwZSc7XG5cbi8vIGNvbnN0YW50c1xuaW1wb3J0IHsgSW5wdXRDb25zdGFudHMgfSBmcm9tICcuLi91dGlscy9jb25zdGFudHMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBJbnB1dFN0YXRlU2VydmljZSB7XG4gICAgcHJpdmF0ZSBpc0ZvY3VzSW5wdXRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHVibGljIGlzRm9jdXNJbnB1dCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPVxuICAgICAgICB0aGlzLmlzRm9jdXNJbnB1dFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIGlzVG91Y2hlZElucHV0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHB1YmxpYyBpc1RvdWNoZWRJbnB1dCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPVxuICAgICAgICB0aGlzLmlzVG91Y2hlZElucHV0U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHByaXZhdGUgaXNWaXNpYmxlQ29tbWFuZHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHVibGljIGlzVmlzaWJsZUNvbW1hbmRzJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9XG4gICAgICAgIHRoaXMuaXNWaXNpYmxlQ29tbWFuZHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBpc0VkaXRJbnB1dFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgICBwdWJsaWMgaXNFZGl0SW5wdXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID1cbiAgICAgICAgdGhpcy5pc0VkaXRJbnB1dFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIGlzRHJvcGRvd25Ub2dnbGVyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHB1YmxpYyBpc0Ryb3Bkb3duVG9nZ2xlciQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPVxuICAgICAgICB0aGlzLmlzRHJvcGRvd25Ub2dnbGVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHByaXZhdGUgZGF0ZVRpbWVJbnB1dERhdGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRlPihuZXcgRGF0ZSgpKTtcbiAgICBwdWJsaWMgZGF0ZVRpbWVJbnB1dERhdGUkOiBPYnNlcnZhYmxlPERhdGU+ID1cbiAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIHNob3dEYXRlSW5wdXRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHVibGljIHNob3dEYXRlSW5wdXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID1cbiAgICAgICAgdGhpcy5zaG93RGF0ZUlucHV0U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHByaXZhdGUgaXNDYXBzTG9ja09uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHB1YmxpYyBpc0NhcHNMb2NrT24kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID1cbiAgICAgICAgdGhpcy5pc0NhcHNMb2NrT25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZVN1YmplY3QgPSBuZXcgU3ViamVjdDxJbnB1dENoYW5nZVZhbHVlPigpO1xuICAgIHB1YmxpYyBvbkNoYW5nZSQ6IE9ic2VydmFibGU8SW5wdXRDaGFuZ2VWYWx1ZT4gPVxuICAgICAgICB0aGlzLm9uQ2hhbmdlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIC8vIE91dHB1dHNcbiAgICBwcml2YXRlIGNvbW1hbmRFdmVudFN1YmplY3QgPSBuZXcgU3ViamVjdDxDb21tYW5kc0V2ZW50PigpO1xuICAgIHB1YmxpYyBjb21tYW5kRXZlbnQkOiBPYnNlcnZhYmxlPENvbW1hbmRzRXZlbnQ+ID1cbiAgICAgICAgdGhpcy5jb21tYW5kRXZlbnRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBjbGVhcklucHV0RXZlbnRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgICBwdWJsaWMgY2xlYXJJbnB1dEV2ZW50JDogT2JzZXJ2YWJsZTxib29sZWFuPiA9XG4gICAgICAgIHRoaXMuY2xlYXJJbnB1dEV2ZW50U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHByaXZhdGUgaW5jb3JyZWN0SW5wdXRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgICBwdWJsaWMgaW5jb3JyZWN0SW5wdXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID1cbiAgICAgICAgdGhpcy5pbmNvcnJlY3RJbnB1dFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIHNob3dIaWRlRHJvcGRvd25TdWJqZWN0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgICBwdWJsaWMgc2hvd0hpZGVEcm9wZG93biQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPVxuICAgICAgICB0aGlzLnNob3dIaWRlRHJvcGRvd25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBkcm9wRG93bktleU5hdmlnYXRpb25TdWJqZWN0ID0gbmV3IFN1YmplY3Q8e1xuICAgICAgICBrZXlDb2RlOiBudW1iZXI7XG4gICAgICAgIGRhdGE6IElDYUlucHV0IHwgbnVsbDtcbiAgICB9PigpO1xuICAgIHB1YmxpYyBkcm9wRG93bktleU5hdmlnYXRpb24kOiBPYnNlcnZhYmxlPHtcbiAgICAgICAga2V5Q29kZTogbnVtYmVyO1xuICAgICAgICBkYXRhOiBJQ2FJbnB1dCB8IG51bGw7XG4gICAgfT4gPSB0aGlzLmRyb3BEb3duS2V5TmF2aWdhdGlvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIGJsdXJJbnB1dFN1YmplY3QgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIHB1YmxpYyBibHVySW5wdXQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID1cbiAgICAgICAgdGhpcy5ibHVySW5wdXRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHJpdmF0ZSBjaGFuZ2VJbnB1dFN1YmplY3QgPSBuZXcgU3ViamVjdDxJbnB1dENoYW5nZVZhbHVlPigpO1xuICAgIHB1YmxpYyBjaGFuZ2VJbnB1dCQ6IE9ic2VydmFibGU8SW5wdXRDaGFuZ2VWYWx1ZT4gPVxuICAgICAgICB0aGlzLmNoYW5nZUlucHV0U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHB1YmxpYyBjb21iaW5lZFZhcmlhYmxlcyQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5pc0ZvY3VzSW5wdXQkLFxuICAgICAgICB0aGlzLmlzVG91Y2hlZElucHV0JCxcbiAgICAgICAgdGhpcy5pc1Zpc2libGVDb21tYW5kcyQsXG4gICAgICAgIHRoaXMuaXNFZGl0SW5wdXQkLFxuICAgICAgICB0aGlzLmlzRHJvcGRvd25Ub2dnbGVyJCxcbiAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZSQsXG4gICAgICAgIHRoaXMuc2hvd0RhdGVJbnB1dCQsXG4gICAgICAgIHRoaXMuaXNDYXBzTG9ja09uJCxcbiAgICBdKTtcblxuICAgIHByaXZhdGUgY2RSZWYhOiBDaGFuZ2VEZXRlY3RvclJlZjtcblxuICAgIHByaXZhdGUgaW5wdXRDb25maWchOiBJQ2FJbnB1dDtcbiAgICBwcml2YXRlIGluY29ycmVjdFZhbHVlITogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgaW5wdXQhOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgc3VwZXJDb250cm9sITogTmdDb250cm9sO1xuXG4gICAgLy8gRGF0ZVxuICAgIHB1YmxpYyBuZXdJbnB1dENoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgc2VsZWN0aW9uSW5wdXQ6IG51bWJlciA9IC0xO1xuICAgIHByaXZhdGUgcHJldmVudEJsdXIhOiBib29sZWFuO1xuXG4gICAgLy8gSW5wdXQgU2VsZWN0aW9uXG4gICAgcHVibGljIGlucHV0U2VsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgc3Bhbk9uZSE6IEVsZW1lbnRSZWY7XG4gICAgcHVibGljIHNwYW5Ud28hOiBFbGVtZW50UmVmO1xuICAgIHB1YmxpYyBzcGFuVGhyZWUhOiBFbGVtZW50UmVmO1xuICAgIHB1YmxpYyBob2xkZXIxITogRWxlbWVudFJlZjtcbiAgICBwdWJsaWMgdDIhOiBOZ2JQb3BvdmVyO1xuICAgIHB1YmxpYyBuZ2JNYWluUG9wb3ZlciE6IE5nYlBvcG92ZXI7XG5cbiAgICBwcml2YXRlIGlucHV0Q29tbWFuZHNUaW1lb3V0ITogTm9kZUpTLlRpbWVvdXQgfCBudW1iZXI7XG4gICAgcHJpdmF0ZSBmb2N1c0JsdXIhOiBOb2RlSlMuVGltZW91dCB8IG51bWJlcjtcbiAgICBwcml2YXRlIHRpbWVvdXRDbGVhbmVyITogTm9kZUpTLlRpbWVvdXQgfCBudW1iZXI7XG4gICAgcHJpdmF0ZSBkYXRlVGltZU1haW5UaW1lciE6IE5vZGVKUy5UaW1lb3V0IHwgbnVtYmVyO1xuICAgIHByaXZhdGUgcGFzc3dvcmRUaW1lb3V0ITogTm9kZUpTLlRpbWVvdXQgfCBudW1iZXI7XG5cbiAgICAvLyBQcmljZSBTZXBhcmF0b3JcbiAgICBwdWJsaWMgY3Vyc29ySW5wdXRQb3NpdGlvbiE6IG51bWJlcjtcbiAgICBwdWJsaWMgaGFzRGVjaW1hbEluZGV4OiBudW1iZXIgPSAtMTtcbiAgICBwdWJsaWMgb3JpZ2luUHJpY2VTZXBhcmF0b3JMaW1pdCE6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBwdWJsaWMgaXNEb3REZWxldGVkITogYm9vbGVhbjtcblxuICAgIC8vIE51bWJlciBvZiBzcGFjZXNcbiAgICBwdWJsaWMgbnVtYmVyT2ZDb25zZWN1dGl2ZWx5U3BhY2VzOiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBvbmVTcGFjZU9ubHlDb3VudGVyOiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBsYXN0Q3Vyc29yU3BhY2VQb3NpdGlvbjogbnVtYmVyID0gMDtcblxuICAgIC8vIE51bWJlciBvZiBwb2ludHNcbiAgICBwdWJsaWMgbnVtYmVyT2ZDb25zZWN1dGl2ZWx5UG9pbnRzOiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBudW1iZXJPZlBvaW50czogbnVtYmVyID0gMDtcblxuICAgIHByaXZhdGUgZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhckRhdGVUaW1lUGlja2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjYUlucHV0VmFsaWRhdGlvblNlcnZpY2U6IENhSW5wdXRWYWxpZGF0aW9uU2VydmljZSxcblxuICAgICAgICAvLyBQaXBlc1xuICAgICAgICBwcml2YXRlIHRob3VzYW5kU2VwYXJhdG9yUGlwZTogVGhvdXNhbmRTZXBhcmF0b3JQaXBlXG4gICAgKSB7fVxuXG4gICAgcHVibGljIHNldElzRm9jdXNJbnB1dCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRm9jdXNJbnB1dFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldElzVG91Y2hlZElucHV0KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNUb3VjaGVkSW5wdXRTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRJc1Zpc2libGVDb21tYW5kcyh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmlzVmlzaWJsZUNvbW1hbmRzU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SXNFZGl0SW5wdXQodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0VkaXRJbnB1dFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldElzRHJvcGRvd25Ub2dnbGVyKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNEcm9wZG93blRvZ2dsZXJTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREYXRlVGltZUlucHV0RGF0ZSh2YWx1ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmRhdGVUaW1lSW5wdXREYXRlU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0U2hvd0RhdGVJbnB1dCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dEYXRlSW5wdXRTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRJc0NhcHNMb2NrT24odmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0NhcHNMb2NrT25TdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRJbnB1dEVsZW1lbnRSZWYoXG4gICAgICAgIGlucHV0OiBFbGVtZW50UmVmLFxuICAgICAgICBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmNkUmVmID0gY2RSZWY7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFN1cGVyQ29udHJvbChzdXBlckNvbnRyb2w6IE5nQ29udHJvbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN1cGVyQ29udHJvbCA9IHN1cGVyQ29udHJvbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SW5wdXRDb25maWcoY29uZmlnOiBJQ2FJbnB1dCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0Q29uZmlnID0gY29uZmlnO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRJbmNvcnJlY3RWYWx1ZShpbmNvcnJlY3RWYWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmluY29ycmVjdFZhbHVlID0gaW5jb3JyZWN0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbW1hbmRFdmVudCh2YWx1ZTogQ29tbWFuZHNFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbW1hbmRFdmVudFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldENsZWFySW5wdXRFdmVudCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFySW5wdXRFdmVudFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEluY29ycmVjdElucHV0KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXRTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTaG93SGlkZURyb3Bkb3duKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd0hpZGVEcm9wZG93blN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERyb3BEb3duS2V5TmF2aWdhdGlvbih2YWx1ZToge1xuICAgICAgICBrZXlDb2RlOiBudW1iZXI7XG4gICAgICAgIGRhdGE6IElDYUlucHV0IHwgbnVsbDtcbiAgICB9KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZHJvcERvd25LZXlOYXZpZ2F0aW9uU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Qmx1cklucHV0KHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYmx1cklucHV0U3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q2hhbmdlSW5wdXQodmFsdWU6IElucHV0Q2hhbmdlVmFsdWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VJbnB1dFN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldE9uQ2hhbmdlKHZhbHVlOiBJbnB1dENoYW5nZVZhbHVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VTdWJqZWN0Lm5leHQodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKG9iajogSW5wdXRDaGFuZ2VWYWx1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldENoYW5nZUlucHV0KG9iaik7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PVxuICAgICAgICAgICAgICAgICAgICBJbnB1dENvbmZpZ05hbWVTdHJpbmdFbnVtLkRBVEVfUElDS0VSIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PVxuICAgICAgICAgICAgICAgICAgICBJbnB1dENvbmZpZ05hbWVTdHJpbmdFbnVtLlRJTUVfUElDS0VSIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PVxuICAgICAgICAgICAgICAgICAgICBJbnB1dENvbmZpZ05hbWVTdHJpbmdFbnVtLkRBVEVfUElDS0VSX0JBTktfQ0FSRFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9iaikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVvdXRDbGVhbmVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVEYXRlSW5wdXQob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBvYmo7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXREYXRlVGltZUlucHV0cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlucHV0Q29uZmlnLnByaWNlU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IG9iajtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcklucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgLy8gQ2xlYXIgd2hvbGUgaW5wdXRcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWcucmVtb3ZlSW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q2xlYXJJbnB1dEV2ZW50KHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluY29ycmVjdCBJbnB1dFxuICAgICAgICBpZiAodGhpcy5pbnB1dENvbmZpZy5pbmNvcnJlY3RJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5pbmNvcnJlY3RWYWx1ZSA9ICF0aGlzLmluY29ycmVjdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5zZXRJbmNvcnJlY3RJbnB1dCh0aGlzLmluY29ycmVjdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOYXRpdmUgY2xlYXJcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0VmFsdWUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mQ29uc2VjdXRpdmVseVNwYWNlcyA9IDA7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mQ29uc2VjdXRpdmVseVBvaW50cyA9IDA7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mUG9pbnRzID0gMDtcbiAgICAgICAgICAgIHRoaXMub25lU3BhY2VPbmx5Q291bnRlciA9IDA7XG4gICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLmRyb3Bkb3duSW1hZ2VJbnB1dCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc2V0SXNUb3VjaGVkSW5wdXQodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnNldElzRm9jdXNJbnB1dChmYWxzZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dENvbmZpZ05hbWVTdHJpbmdFbnVtLkRBVEVfUElDS0VSLFxuICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5USU1FX1BJQ0tFUixcbiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVJfQkFOS19DQVJELFxuICAgICAgICAgICAgICAgICAgICBdIGFzIHN0cmluZ1tdXG4gICAgICAgICAgICAgICAgKS5pbmNsdWRlcyh0aGlzLmlucHV0Q29uZmlnLm5hbWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldERhdGVUaW1lSW5wdXRzKCk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0Q2xlYXJJbnB1dEV2ZW50KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zZm9ybVRleHQoZXZlbnQ6IEV2ZW50LCBpc1Bhc3RlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIHRoaXMuY3Vyc29ySW5wdXRQb3NpdGlvbiA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydDtcblxuICAgICAgICAvLyBIYW5kbGUgcGFzdGUgb3BlcmF0aW9uXG4gICAgICAgIGlmIChpc1Bhc3RlKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVBhc3RlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybWF0aW9uKCk7XG5cbiAgICAgICAgLy8gQXBwbHkgdGhvdXNhbmQgYW5kIHByaWNlIHNlcGFyYXRvcnMgaWYgY29uZmlndXJlZFxuICAgICAgICB0aGlzLmFwcGx5VGhvdXNhbmRTZXBhcmF0b3IoKTtcbiAgICAgICAgdGhpcy5hcHBseVByaWNlU2VwYXJhdG9yKCk7XG5cbiAgICAgICAgdGhpcy5jdXN0b21WYWxpZGF0aW9uKHZhbHVlKTtcblxuICAgICAgICB0aGlzLnNhbml0aXplQ29uc2VjdXRpdmVTcGFjZXMoKTtcblxuICAgICAgICB0aGlzLnJlbW92ZUxlYWRpbmdaZXJvKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVQYXN0ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pbnB1dFNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlICs9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5saW1pdElucHV0TGVuZ3RoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlbGV0ZSBzcGFjZXMgb24gYmVnaW4gYW5kIGVuZFxuICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUudHJpbSgpO1xuICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsaW1pdElucHV0TGVuZ3RoKCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoID4gdGhpcy5pbnB1dENvbmZpZy5tYXhMZW5ndGghXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID1cbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLm1heExlbmd0aFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5VGV4dFRyYW5zZm9ybWF0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHN3aXRjaCAodGhpcy5pbnB1dENvbmZpZy50ZXh0VHJhbnNmb3JtKSB7XG4gICAgICAgICAgICBjYXNlIElucHV0U3RyaW5nRW51bS5DQVBJVEFMSVpFOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIElucHV0U3RyaW5nRW51bS5VUFBFUkNBU0U6XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUudG9Mb2NhbGVVcHBlckNhc2UoJ2VuLVVTJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIElucHV0U3RyaW5nRW51bS5DQVBJVEFMSVpFRF9DQVNFOlxuICAgICAgICAgICAgICAgIGNvbnN0IGNhcGl0YWxpemVkQ2FzZVdvcmRzID0gdmFsdWUucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgLyheXFx3ezF9KXwoXFxzK1xcd3sxfSkvZyxcbiAgICAgICAgICAgICAgICAgICAgKGxldHRlcjogc3RyaW5nKSA9PiBsZXR0ZXIudG9VcHBlckNhc2UoKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBjYXBpdGFsaXplZENhc2VXb3JkcztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZSh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlUaG91c2FuZFNlcGFyYXRvcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLnRob3VzYW5kU2VwYXJhdG9yICYmIGNvbnRyb2xWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNBbGxaZXJvcyhjb250cm9sVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZSgnMCcpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZS50b1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aG91c2FuZFNlcGFyYXRvclBpcGUudHJhbnNmb3JtKGNvbnRyb2xWYWx1ZSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhcHBseVByaWNlU2VwYXJhdG9yKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWcucHJpY2VTZXBhcmF0b3IgJiYgY29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgICAvLyAwLiBEb24ndCBhbGxvdyAwIGFzIGZpcnN0IGNoYXJhY3RlclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNBbGxaZXJvcyhjb250cm9sVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZSgnMCcpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gNC4gSWYgdXNlciBzZXQgZG90XG4gICAgICAgICAgICBpZiAoY29udHJvbFZhbHVlLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdFdpdGhEZWNpbWFsKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIDUuIElmIHVzZXIgZG9lc24ndCBzZXQgZG90XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRXaXRob3V0RGVjaW1hbCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldElucHV0Q3Vyc29yUG9zaXRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0V2l0aERlY2ltYWwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlO1xuICAgICAgICAvLyA0LjEuIENoZWNrIGZvciBEb3QgcG9zaXRpb25cbiAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggPSBjb250cm9sVmFsdWUuaW5kZXhPZignLicpO1xuXG4gICAgICAgIHRoaXMub3JpZ2luUHJpY2VTZXBhcmF0b3JMaW1pdCA9XG4gICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLnByaWNlU2VwYXJhdG9yTGltaXRhdGlvbiEgKyAzO1xuXG4gICAgICAgIC8vIDQuMi4gRGl2aWRlIG51bWJlciBpbnRvIGRlY2ltYWwgYW5kIGludGVnZXIgcGFydHNcbiAgICAgICAgbGV0IGludGVnZXJQYXJ0ID0gdGhpcy50aG91c2FuZFNlcGFyYXRvclBpcGUudHJhbnNmb3JtKFxuICAgICAgICAgICAgY29udHJvbFZhbHVlXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIHRoaXMuaGFzRGVjaW1hbEluZGV4KVxuICAgICAgICAgICAgICAgIC5zbGljZSgwLCB0aGlzLmlucHV0Q29uZmlnLnByaWNlU2VwYXJhdG9yTGltaXRhdGlvbilcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGRlY2ltYWxQYXJ0ID0gY29udHJvbFZhbHVlLnNsaWNlKHRoaXMuaGFzRGVjaW1hbEluZGV4ICsgMSk7XG5cbiAgICAgICAgaWYgKCFpbnRlZ2VyUGFydCkge1xuICAgICAgICAgICAgaW50ZWdlclBhcnQgPSAnMCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA0LjQuIEdldCBvbmx5IHR3byBudW1iZXJzIG9mIHRoZSBkZWNpbWFsIHBhcnRcbiAgICAgICAgZGVjaW1hbFBhcnQgPSBkZWNpbWFsUGFydC5zbGljZSgwLCAyKTtcblxuICAgICAgICBpZiAoZGVjaW1hbFBhcnQpIHtcbiAgICAgICAgICAgIC8vIDQuNS4gU2V0IGZvcm1hdHRlZCBudW1iZXJcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgYCR7aW50ZWdlclBhcnR9LiR7ZGVjaW1hbFBhcnR9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuaGFzRGVjaW1hbEluZGV4ID1cbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZS5pbmRleE9mKCcuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdFdpdGhvdXREZWNpbWFsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZTtcbiAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggPSAtMTtcblxuICAgICAgICBpZiAoY29udHJvbFZhbHVlLmluZGV4T2YoJy4nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB2YWx1ZSB3aXRoIHRob3VzYW5kIHNlcGFyYXRvclxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yUGlwZS50cmFuc2Zvcm0oY29udHJvbFZhbHVlKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gTGltaXQgdmFsaWRhdGlvblxuICAgICAgICAgICAgdGhpcy5vcmlnaW5QcmljZVNlcGFyYXRvckxpbWl0ID1cbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLnByaWNlU2VwYXJhdG9yTGltaXRhdGlvbjtcblxuICAgICAgICAgICAgLy8gQ3V0IHZhbHVlXG4gICAgICAgICAgICBpZiAoY29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbFZhbHVlLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcucHJpY2VTZXBhcmF0b3JMaW1pdGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdmFsdWUgYWdhaW4gYWZ0ZXIgY3V0dGluZ1xuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yUGlwZS50cmFuc2Zvcm0oY29udHJvbFZhbHVlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0SW5wdXRDdXJzb3JQb3NpdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXRDbGVhbmVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvcklucHV0UG9zaXRpb24gK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLmluZGV4T2YoJy4nKSA9PT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDApLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnNvcklucHV0UG9zaXRpb24gK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLmluZGV4T2YoJy4nKSA9PT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSAke259MDAwMDAgYW5kIHdlIGRlbGV0ZSBOIHRoZW4gd2UgZ290IHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGRvdFxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZSgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNBbGxaZXJvcyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnJykuZXZlcnkoKGNoYXIpID0+IGNoYXIgPT09ICcwJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjdXN0b21WYWxpZGF0aW9uKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29uZmlnTmFtZSA9IHRoaXMuaW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbmZpZ05hbWUgPT09IElucHV0U3RyaW5nRW51bS5ZRUFSICYmXG4gICAgICAgICAgICBwYXJzZUludCh2YWx1ZSkgPiBwYXJzZUludChtb21lbnQoKS5hZGQoMSwgJ3llYXInKS5mb3JtYXQoJ1lZWVknKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ05hbWUgPT09IElucHV0U3RyaW5nRW51bS5NT05USFMpIHtcbiAgICAgICAgICAgIGlmIChwYXJzZUludCh2YWx1ZSkgPCAxIHx8IHBhcnNlSW50KHZhbHVlKSA+IDEyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKHsgaW52YWxpZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ05hbWUgPT09IElucHV0U3RyaW5nRW51bS5BWExFUykge1xuICAgICAgICAgICAgaWYgKHBhcnNlSW50KHZhbHVlKSA8IDEgfHwgcGFyc2VJbnQodmFsdWUpID4gMTcpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQodmFsdWUpIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMoeyBtaW46IDEgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludCh2YWx1ZSkgPiAxNykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMoeyBtYXg6IDE3IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29uZmlnTmFtZSA9PT0gSW5wdXRTdHJpbmdFbnVtLkZVTExfTkFNRSAmJlxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNhcGl0YWxpemVXb3JkcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYXBpdGFsaXplV29yZHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHdvcmRzID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUuc3BsaXQoJyAnKTtcbiAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWQgPSB3b3Jkcy5tYXAoKHdvcmQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdvcmQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBjYXBpdGFsaXplZC5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYW5pdGl6ZUNvbnNlY3V0aXZlU3BhY2VzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb25maWdOYW1lcyA9IElucHV0Q29uc3RhbnRzLnRleHRUcmFuc2Zvcm1Db25maWdOYW1lcztcblxuICAgICAgICBpZiAoY29uZmlnTmFtZXMuaW5jbHVkZXModGhpcy5pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBjb25zdCBzYW5pdGl6ZWRJbnB1dCA9IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIC9cXHN7Mix9L2csXG4gICAgICAgICAgICAgICAgJyAnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNhbml0aXplZElucHV0ICE9PSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBzYW5pdGl6ZWRJbnB1dDtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnNvckZvclNhbml0aXplZElucHV0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEN1cnNvckZvclNhbml0aXplZElucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRpbWVvdXRDbGVhbmVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0Q3Vyc29yU3BhY2VQb3NpdGlvbiAtIDEsXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0Q3Vyc29yU3BhY2VQb3NpdGlvbiAtIDFcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlTGVhZGluZ1plcm8oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLnJlbW92ZUxlYWRpbmdaZXJvKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZTtcblxuICAgICAgICAgICAgaWYgKCFjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKCcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMobnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dENvbmZpZy5uZWdhdGl2ZUxlYWRpbmdaZXJvKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNOZWdhdGl2ZSA9IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCctJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNOZWdhdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcnQgYWZ0ZXIgdGhlIG5lZ2F0aXZlIHNpZ25cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyUGFydCA9IGN1cnJlbnRWYWx1ZS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxlYWRpbmcgemVyb3NcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWROdW1iZXIgPSBudW1iZXJQYXJ0LnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAvXjArKD89XFxkKS8sXG4gICAgICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgYC0ke3RyYW5zZm9ybWVkTnVtYmVyfWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlLnJlcGxhY2UoL14wKyg/PVxcZCkvLCAnJylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5yZXBsYWNlKC9eMCsoPyEkKS8sICcnKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXV0b0ZvY3VzRmlyc3RJbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWcuYXV0b0ZvY3VzICYmICF0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0Q2xlYW5lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcuYXV0b0ZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAzMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25LZXlwcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4gfCB2b2lkIHtcbiAgICAgICAgLy8gRGlzYWJsZSBmaXJzdCBjaGFyYWN0ZXIgdG8gYmUgc3BhY2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSAmJlxuICAgICAgICAgICAgL15cXHMqJC8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWcucHJpY2VTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLlBSSUNFX1NFUEFSQVRPUilcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZT8ubGVuZ3RoID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcmlnaW5QcmljZVNlcGFyYXRvckxpbWl0ICYmXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgIT09IDQ2XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gIERpc2FibGUgbXVsdGlwbGUgZG90c1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmQgaW5kZXggb2YgZG90XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVUb1N0cmluZyA9IFN0cmluZyh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxJbmRleCA9IHZhbHVlVG9TdHJpbmc/LmluZGV4T2YoJy4nKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0RlY2ltYWxJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDEuIERpdmlkZSBudW1iZXIgb24gZGVjaW1hbCBhbmQgaW50ZWdlciBwYXJ0XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnRlZ2VyUGFydCA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzRGVjaW1hbEluZGV4XG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlZ2VyUGFydCkgaW50ZWdlclBhcnQgPSAnMCc7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRlY2ltYWxQYXJ0ID0gdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUuc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxJbmRleCArIDFcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyAyLiBEaXNhYmxlIG1vcmUgdGhhbiB0d28gZGVjaW1hbHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2ltYWxQYXJ0Lmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyAzLiBHZXQgb25seSB0d28gbnVtYmVycyBvZiBkZWNpbWFsIHBhcnRcbiAgICAgICAgICAgICAgICAgICAgZGVjaW1hbFBhcnQgPSBkZWNpbWFsUGFydC5zbGljZSgwLCAyKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIDQuIFNldCBmb3JtYXR0ZWQgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyUGFydCArICcuJyArIGRlY2ltYWxQYXJ0XG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0Q2xlYW5lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDUxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJzb3JJbnB1dFBvc2l0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5CVVNJTkVTU19OQU1FLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5TSE9QX05BTUUsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkZVRUxfU1RPUCxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uUFJPRFVDRVJfTkFNRSxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uVEVSTUlOQUxfTkFNRSxcbiAgICAgICAgICAgIF0uaW5jbHVkZXMoPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jYUlucHV0VmFsaWRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldElucHV0UmVnZXhQYXR0ZXJuKElucHV0U3RyaW5nRW51bS5CVVNJTkVTU19OQU1FKVxuICAgICAgICAgICAgICAgICAgICA/LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNdWx0aXBsZVBvaW50cyhldmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkVJTixcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uTUNfRkYsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlBIT05FLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5QSE9ORV9FWFRFTlNJT04sXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkFDQ09VTlRfQkFOSyxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uUk9VVElOR19CQU5LLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5TU04sXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkZVRUxfQ0FSRCxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uRU1QVFlfV0VJR0hULFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5DUkVESVRfTElNSVQsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlBPX0JPWCxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uUFJJQ0UsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlRSQUlMRVJfVk9MVU1FLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5SRVBBSVJfT0RPTUVURVIsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlVTRE9ULFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5JUlAsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlNUQVJUSU5HLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5DVVNUT01FUl9QQVlfVEVSTSxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uQ1VTVE9NRVJfQ1JFRElULFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5ERUZBVUxUX0JBU0UsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkVBQ0hfT0NDVVJSRU5DRSxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uREFNQUdFLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5QRVJTT05BTF9BRFZFUl9JTkosXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLk1FRElDQUxfRVhQRU5TRVMsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkJPRElMWV9JTkpVUlksXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkdFTkVSQUxfQUdHUkVHQVRFLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5QUk9EVUNUU19DT01QX09QX0FHRyxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uQ09NQklORURfU0lOR0xFX0xJTUlULFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5TSU5HTEVfQ09OVkVZQU5DRSxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uREVEVUNUQUJMRSxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uQ09NUFJFSF9DT0xMSVNJT04sXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlRSQUlMRVJfVkFMVUVfSU5TVVJBTkNFX1BPTElDWSxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uUkVOVCxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uU0FMQVJZLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5NSUxFQUdFLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5NT05USFMsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkVNUFRZX1dFSUdIVF9TUEFDRSxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uUVRZLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5QVVJDSEFTRV9QUklDRSxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uRlVFTF9UQU5LX1NJWkUsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLldFSUdIVCxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uRlVFTF9QRVJfTUlMRVMsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkZVRUxfUFJJQ0VfTUFQLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5BTU9VTlQsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkJPTF9OTyxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uU0VBTF9OTyxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uUElDS1VQX05PLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5DT0RFLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5NVUxUSV9GUk9NX0ZJUlNUX0ZST00sXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLk1VTFRJX0ZST01fRklSU1RfVE8sXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLk1VTFRJX0ZPUk1fU0VDT05EX0ZST00sXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLk1VTFRJX0ZPUk1fU0VDT05EX1RPLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5NVUxUSV9GT1JNX1RISVJEX0ZST00sXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLk1VTFRJX0ZPUk1fVEhJUkRfVE8sXG4gICAgICAgICAgICBdLmluY2x1ZGVzKDxJbnB1dFN0cmluZ0VudW0+dGhpcy5pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gT25seSBudW1iZXJzXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jYUlucHV0VmFsaWRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldElucHV0UmVnZXhQYXR0ZXJuKElucHV0U3RyaW5nRW51bS5RVFkpXG4gICAgICAgICAgICAgICAgICAgID8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFtJbnB1dFN0cmluZ0VudW0uRU1BSUxdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgIDxJbnB1dFN0cmluZ0VudW0+dGhpcy5pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jYUlucHV0VmFsaWRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldElucHV0UmVnZXhQYXR0ZXJuKElucHV0U3RyaW5nRW51bS5FTUFJTClcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVBvaW50cyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW0lucHV0U3RyaW5nRW51bS5JTlZPSUNFXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICA8SW5wdXRTdHJpbmdFbnVtPnRoaXMuaW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFJlZ2V4UGF0dGVybihJbnB1dFN0cmluZ0VudW0uSU5WT0lDRSlcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW0lucHV0U3RyaW5nRW51bS5BRERSRVNTXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICA8SW5wdXRTdHJpbmdFbnVtPnRoaXMuaW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIC9eW0EtWmEtejAtOVxccy4mLyxfLV0qJC8/LnRlc3QoXG4gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5BRERSRVNTX1VOSVQsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkRFUEFSVE1FTlQsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlZFSElDTEVfVU5JVCxcbiAgICAgICAgICAgIF0uaW5jbHVkZXMoPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jYUlucHV0VmFsaWRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldElucHV0UmVnZXhQYXR0ZXJuKElucHV0U3RyaW5nRW51bS5BRERSRVNTX1VOSVQpXG4gICAgICAgICAgICAgICAgICAgID8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFtJbnB1dFN0cmluZ0VudW0uRklSU1RfTkFNRV0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLkZJUlNUX05BTUUpXG4gICAgICAgICAgICAgICAgICAgID8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU9uZVNwYWNlT25seShldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW0lucHV0U3RyaW5nRW51bS5MQVNUX05BTUVdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgIDxJbnB1dFN0cmluZ0VudW0+dGhpcy5pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jYUlucHV0VmFsaWRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldElucHV0UmVnZXhQYXR0ZXJuKElucHV0U3RyaW5nRW51bS5MQVNUX05BTUUpXG4gICAgICAgICAgICAgICAgICAgID8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLkJBTktfTkFNRV0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLkJBTktfTkFNRSlcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVQb2ludHMoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25lU3BhY2VPbmx5KGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlZJTl9OVU1CRVIsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLklOU1VSQU5DRV9QT0xJQ1ksXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLklGVEEsXG4gICAgICAgICAgICBdLmluY2x1ZGVzKDxJbnB1dFN0cmluZ0VudW0+dGhpcy5pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFJlZ2V4UGF0dGVybihJbnB1dFN0cmluZ0VudW0uVklOX05VTUJFUilcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiAhL15bSWlPUV0qJC8/LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSkpO1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW0lucHV0U3RyaW5nRW51bS5UUlVDS19UUkFJTEVSX01PREVMXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICA8SW5wdXRTdHJpbmdFbnVtPnRoaXMuaW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFJlZ2V4UGF0dGVybihJbnB1dFN0cmluZ0VudW0uVFJVQ0tfVFJBSUxFUl9NT0RFTClcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVPbmVTcGFjZU9ubHkoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFtJbnB1dFN0cmluZ0VudW0uWUVBUl0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAvXjAqJC8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSkgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFJlZ2V4UGF0dGVybihJbnB1dFN0cmluZ0VudW0uWUVBUilcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW0lucHV0U3RyaW5nRW51bS5MSUNFTlNFX1BMQVRFXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICA8SW5wdXRTdHJpbmdFbnVtPnRoaXMuaW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFJlZ2V4UGF0dGVybihJbnB1dFN0cmluZ0VudW0uTElDRU5TRV9QTEFURSlcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVPbmVTcGFjZU9ubHkoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFtJbnB1dFN0cmluZ0VudW0uREVTQ1JJUFRJT05dLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgIDxJbnB1dFN0cmluZ0VudW0+dGhpcy5pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jYUlucHV0VmFsaWRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldElucHV0UmVnZXhQYXR0ZXJuKElucHV0U3RyaW5nRW51bS5ERVNDUklQVElPTilcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW0lucHV0U3RyaW5nRW51bS5BTExPV19BTExdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgIDxJbnB1dFN0cmluZ0VudW0+dGhpcy5pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoLy4qLz8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSkpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW0lucHV0U3RyaW5nRW51bS5EQkFfTkFNRV0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLkRCQV9OQU1FKVxuICAgICAgICAgICAgICAgICAgICA/LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLlBFUl9NSUxFXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICA8SW5wdXRTdHJpbmdFbnVtPnRoaXMuaW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFJlZ2V4UGF0dGVybihJbnB1dFN0cmluZ0VudW0uUEVSX01JTEUpXG4gICAgICAgICAgICAgICAgICAgID8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBtYXggbGVuZ3RoXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlPy50b1N0cmluZygpLmluY2x1ZGVzKCcuJykpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubWF4TGVuZ3RoID0gNDtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuaW5wdXRDb25maWcubWF4TGVuZ3RoID0gMjtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciByYW5nZVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUgPiB0aGlzLmlucHV0Q29uZmlnLm1heCEgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUgPCB0aGlzLmlucHV0Q29uZmlnLm1pbiFcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKHsgaW52YWxpZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5QRVJfU1RPUCxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uRkxBVF9SQVRFLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5QRVJfTE9BRCxcbiAgICAgICAgICAgIF0uaW5jbHVkZXMoPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jYUlucHV0VmFsaWRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldElucHV0UmVnZXhQYXR0ZXJuKElucHV0U3RyaW5nRW51bS5QRVJfU1RPUClcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0Q2xlYW5lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwZXJTdG9wVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlLnJlcGxhY2UoLywvZywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlclN0b3BWYWx1ZSA+IHRoaXMuaW5wdXRDb25maWcubWF4ISB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlclN0b3BWYWx1ZSA8IHRoaXMuaW5wdXRDb25maWcubWluIVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLlJFTEFUSU9OU0hJUCwgSW5wdXRTdHJpbmdFbnVtLlNDQUNdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgIDxJbnB1dFN0cmluZ0VudW0+dGhpcy5pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jYUlucHV0VmFsaWRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldElucHV0UmVnZXhQYXR0ZXJuKElucHV0U3RyaW5nRW51bS5FTUVSR0VOQ1lfTkFNRSlcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW0lucHV0U3RyaW5nRW51bS5FTUVSR0VOQ1lfTkFNRV0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLkVNRVJHRU5DWV9OQU1FKVxuICAgICAgICAgICAgICAgICAgICA/LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5U3BhY2VzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU9uZVNwYWNlT25seShldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW0lucHV0U3RyaW5nRW51bS5GVUxMX0NPTlRBQ1RfTkFNRV0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLkZVTExfQ09OVEFDVF9OQU1FKVxuICAgICAgICAgICAgICAgICAgICA/LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLkZVRUxfU1RPUkVdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgIDxJbnB1dFN0cmluZ0VudW0+dGhpcy5pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jYUlucHV0VmFsaWRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldElucHV0UmVnZXhQYXR0ZXJuKElucHV0U3RyaW5nRW51bS5GVUVMX1NUT1JFKVxuICAgICAgICAgICAgICAgICAgICA/LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLkhPU10uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhdGhpcy5pbnB1dFNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFJlZ2V4UGF0dGVybihJbnB1dFN0cmluZ0VudW0uSE9TKVxuICAgICAgICAgICAgICAgICAgICA/LnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSAqIDEwICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmNoYXJDb2RlIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIDQ4IDw9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubWF4IVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlucHV0U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0U2VsZWN0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLkZVTExfUEFSS0lOR19TTE9ULFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5QQVJLSU5HX1NMT1QsXG4gICAgICAgICAgICBdLmluY2x1ZGVzKDxJbnB1dFN0cmluZ0VudW0+dGhpcy5pbnB1dENvbmZpZy5uYW1lLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFJlZ2V4UGF0dGVybihJbnB1dFN0cmluZ0VudW0uRlVMTF9QQVJLSU5HX1NMT1QpXG4gICAgICAgICAgICAgICAgICAgID8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW0lucHV0U3RyaW5nRW51bS5DRExfTlVNQkVSXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICA8SW5wdXRTdHJpbmdFbnVtPnRoaXMuaW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY2FJbnB1dFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFJlZ2V4UGF0dGVybihJbnB1dFN0cmluZ0VudW0uQ0RMX05VTUJFUilcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVPbmVTcGFjZU9ubHkoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnNlY3V0aXZlbHlTcGFjZXMoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFsbCBTaW1ib2xzXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uVVNFUk5BTUUsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLk5JQ0tOQU1FLFxuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5QQVNTV09SRCxcbiAgICAgICAgICAgIF0uaW5jbHVkZXMoPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5jYUlucHV0VmFsaWRhdGlvblNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldElucHV0UmVnZXhQYXR0ZXJuKElucHV0U3RyaW5nRW51bS5VU0VSTkFNRSlcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLkZVTExfTkFNRV0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLkZVTExfTkFNRSlcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVPbmVTcGFjZU9ubHkoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5U3BhY2VzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLlRPTExfVkFMSURBVElPTl0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLlRPTExfVkFMSURBVElPTilcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKdXN0IGNoYXJhY3RlcnMgYW5kIG51bWJlcnNcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5QUkVGSVgsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLlNVRkZJWCxcbiAgICAgICAgICAgICAgICBJbnB1dFN0cmluZ0VudW0uUEFSS0lOR19OQU1FLFxuICAgICAgICAgICAgXS5pbmNsdWRlcyg8SW5wdXRTdHJpbmdFbnVtPnRoaXMuaW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLlBSRUZJWClcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLkZVTExfTkFNRV0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgPElucHV0U3RyaW5nRW51bT50aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLkZVTExfTkFNRSlcbiAgICAgICAgICAgICAgICAgICAgPy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnNlY3V0aXZlbHlTcGFjZXMoZXZlbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIElucHV0U3RyaW5nRW51bS5JTlNVUkVSX05BTUUsXG4gICAgICAgICAgICAgICAgSW5wdXRTdHJpbmdFbnVtLk9GRklDRV9OQU1FLFxuICAgICAgICAgICAgXS5pbmNsdWRlcyg8SW5wdXRTdHJpbmdFbnVtPnRoaXMuaW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmNhSW5wdXRWYWxpZGF0aW9uU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRSZWdleFBhdHRlcm4oSW5wdXRTdHJpbmdFbnVtLlBST0RVQ0VSX05BTUUpXG4gICAgICAgICAgICAgICAgICAgID8udGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGV2ZW50LmNoYXJDb2RlKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU11bHRpcGxlUG9pbnRzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBbSW5wdXRTdHJpbmdFbnVtLklOUFVUX0RST1BET1dOX0xBQkVMXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICA8SW5wdXRTdHJpbmdFbnVtPnRoaXMuaW5wdXRDb25maWcubmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ29uc2VjdXRpdmVseVNwYWNlcyhldmVudCk7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVDb25zZWN1dGl2ZWx5UG9pbnRzKGV2ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZS50cmltKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVPbmVTcGFjZU9ubHkoZXZlbnQ6IGFueSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAvXlxccyokLy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKSB8fFxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWU/LmluY2x1ZGVzKCcgJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLm9uZVNwYWNlT25seUNvdW50ZXIrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMub25lU3BhY2VPbmx5Q291bnRlciA+IDEgJiZcbiAgICAgICAgICAgIC9eXFxzKiQvLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSkpXG4gICAgICAgICkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzYWJsZUNvbnNlY3V0aXZlbHlTcGFjZXMoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zdCBpbnB1dEVsZW1lbnQgPSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICAgICAgICAvLyBHZXQgY3Vyc29yIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IGN1cnNvclBvc2l0aW9uID0gaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcjtcblxuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGluIHRoZSBtaWRkbGUgb2YgYSB3b3JkLCBhbGxvdyBzcGFjZXNcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY3Vyc29yUG9zaXRpb24gPiAwICYmXG4gICAgICAgICAgICAhL1xccy8udGVzdChpbnB1dEVsZW1lbnQudmFsdWVbY3Vyc29yUG9zaXRpb24gLSAxXSkgJiZcbiAgICAgICAgICAgICEvXFxzLy50ZXN0KGlucHV0RWxlbWVudC52YWx1ZVtjdXJzb3JQb3NpdGlvbl0pXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgaXMgdHlwaW5nIGEgc3BhY2UgYW5kIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgaXMgYSBzcGFjZSwgcHJldmVudCB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBldmVudC5rZXkgPT09ICcgJyAmJlxuICAgICAgICAgICAgL1xccy8udGVzdChpbnB1dEVsZW1lbnQudmFsdWVbY3Vyc29yUG9zaXRpb24gLSAxXSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgY3Vyc29yIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBpbnB1dCBldmVudFxuICAgICAgICB0aGlzLmxhc3RDdXJzb3JTcGFjZVBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlQ29uc2VjdXRpdmVseVBvaW50cyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQgfCBib29sZWFuIHtcbiAgICAgICAgaWYgKC9eWy5dKiQvLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSkpKSB7XG4gICAgICAgICAgICB0aGlzLm51bWJlck9mQ29uc2VjdXRpdmVseVBvaW50cysrO1xuICAgICAgICAgICAgaWYgKHRoaXMubnVtYmVyT2ZDb25zZWN1dGl2ZWx5UG9pbnRzID4gMSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5udW1iZXJPZkNvbnNlY3V0aXZlbHlQb2ludHMgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlTXVsdGlwbGVQb2ludHMoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHwgYm9vbGVhbiB7XG4gICAgICAgIGlmICgvXlsuXSokLy50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWU/LnRvU3RyaW5nKCkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLm51bWJlck9mUG9pbnRzKys7XG4gICAgICAgICAgICBpZiAodGhpcy5udW1iZXJPZlBvaW50cyA+IDEpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubnVtYmVyT2ZQb2ludHMgPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIC0tLS0tLS0gZW5kXG5cbiAgICBwdWJsaWMgb25Db21tYW5kcyhldmVudDogRXZlbnQsIHR5cGU6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNUeXBlLlBNX0lOQ1JFTUVOVF9ERUNSRU1FTlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQbUluY3JlbWVudERlY3JlbWVudChhY3Rpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnB1dENvbW1hbmRzVHlwZS5JTkNSRU1FTlRfREVDUkVNRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSW5jcmVtZW50RGVjcmVtZW50KGFjdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNUeXBlLkNPTkZJUk1fQ0FOQ0VMOlxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29uZmlybUNhbmNlbChhY3Rpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBJbnB1dENvbW1hbmRzVHlwZS5NT05USFM6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVNb250aHMoYWN0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUluY3JlbWVudERlY3JlbWVudChhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pbnB1dENvbW1hbmRzVGltZW91dCk7XG4gICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNBY3Rpb24uREVDUkVNRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogMCkgLSAxXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5wdXRDb21tYW5kc0FjdGlvbi5JTkNSRU1FTlQ6XG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAwKSArIDFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0SW5wdXRDdXJzb3JBdFRoZUVuZCh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlUG1JbmNyZW1lbnREZWNyZW1lbnQoYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBNZXRob2RzQ2FsY3VsYXRpb25zSGVscGVyLmNvbnZlcnRUaG91c2FuU2VwSW5OdW1iZXIoXG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZVxuICAgICAgICApO1xuXG4gICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNBY3Rpb24uREVDUkVNRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50UG1WYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNBY3Rpb24uSU5DUkVNRU5UOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50UG1WYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNBY3Rpb24uUkVTRVQ6XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldFBtVmFsdWUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldElucHV0Q3Vyc29yQXRUaGVFbmQodGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlY3JlbWVudFBtVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgPj0gMTAwMDAgJiYgdmFsdWUgPCAyMDAwMCkge1xuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICBNZXRob2RzQ2FsY3VsYXRpb25zSGVscGVyLmNvbnZlcnROdW1iZXJJblRob3VzYW5kU2VwKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSAtIDEwMDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDIwMDAxICYmIHZhbHVlIDwgNTAwMDApIHtcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgTWV0aG9kc0NhbGN1bGF0aW9uc0hlbHBlci5jb252ZXJ0TnVtYmVySW5UaG91c2FuZFNlcChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgLSAzMDAwXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSA1MDAwMSAmJiB2YWx1ZSA8IDEwMDAwMCkge1xuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICBNZXRob2RzQ2FsY3VsYXRpb25zSGVscGVyLmNvbnZlcnROdW1iZXJJblRob3VzYW5kU2VwKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSAtIDUwMDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDEwMDAwKSB7XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgIE1ldGhvZHNDYWxjdWxhdGlvbnNIZWxwZXIuY29udmVydE51bWJlckluVGhvdXNhbmRTZXAoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlIC0gMTAwMDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDEwMDApIHtcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgTWV0aG9kc0NhbGN1bGF0aW9uc0hlbHBlci5jb252ZXJ0TnVtYmVySW5UaG91c2FuZFNlcChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgLSA1MDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNyZW1lbnRQbVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlID4gMTAwMDAgJiYgdmFsdWUgPCAyMDAwMCkge1xuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICBNZXRob2RzQ2FsY3VsYXRpb25zSGVscGVyLmNvbnZlcnROdW1iZXJJblRob3VzYW5kU2VwKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSArIDEwMDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDIwMDAxICYmIHZhbHVlIDwgNTAwMDApIHtcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnBhdGNoVmFsdWUoXG4gICAgICAgICAgICAgICAgTWV0aG9kc0NhbGN1bGF0aW9uc0hlbHBlci5jb252ZXJ0TnVtYmVySW5UaG91c2FuZFNlcChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgKyAzMDAwXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+PSA1MDAwMSAmJiB2YWx1ZSA8IDEwMDAwMCkge1xuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICBNZXRob2RzQ2FsY3VsYXRpb25zSGVscGVyLmNvbnZlcnROdW1iZXJJblRob3VzYW5kU2VwKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSArIDUwMDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IDEwMDAwKSB7XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgICAgIE1ldGhvZHNDYWxjdWxhdGlvbnNIZWxwZXIuY29udmVydE51bWJlckluVGhvdXNhbmRTZXAoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICsgMTAwMDBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICBNZXRob2RzQ2FsY3VsYXRpb25zSGVscGVyLmNvbnZlcnROdW1iZXJJblRob3VzYW5kU2VwKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSArIDUwMFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0UG1WYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWc/LmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8ucGF0Y2hWYWx1ZShcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnPy5kZWZhdWx0VmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUNvbmZpcm1DYW5jZWwoYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgSW5wdXRDb21tYW5kc0FjdGlvbi5DT05GSVJNOlxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlybUNvbW1hbmQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgSW5wdXRDb21tYW5kc0FjdGlvbi5DQU5DRUw6XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxDb21tYW5kKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICB0aGlzLmlucHV0Q29uZmlnLmRyb3Bkb3duTGFiZWxOZXcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5jb21tYW5kcyEuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaW5wdXRDb25maWcuYmxhY2tJbnB1dCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldElzRWRpdElucHV0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5zZXRJc1Zpc2libGVDb21tYW5kcyhmYWxzZSk7XG4gICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbmZpcm1Db21tYW5kKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldENvbW1hbmRFdmVudCh7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSxcbiAgICAgICAgICAgIGFjdGlvbjogSW5wdXRDb21tYW5kc0FjdGlvbi5DT05GSVJNLFxuICAgICAgICAgICAgbW9kZTpcbiAgICAgICAgICAgICAgICAhdGhpcy5pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsTmV3ICYmXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lICE9PSAnSW5wdXQgRHJvcGRvd24gQmFuayBOYW1lJ1xuICAgICAgICAgICAgICAgICAgICA/ICdlZGl0J1xuICAgICAgICAgICAgICAgICAgICA6ICduZXcnLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbmNlbENvbW1hbmQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0Q29tbWFuZEV2ZW50KHsgYWN0aW9uOiBJbnB1dENvbW1hbmRzQWN0aW9uLkNBTkNFTCB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZU1vbnRocyhhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5pbnB1dENvbW1hbmRzVGltZW91dCk7XG5cbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgSW5wdXRDb21tYW5kc0FjdGlvbi5NSU5VUzpcbiAgICAgICAgICAgICAgICB0aGlzLmRlY3JlbWVudE1vbnRoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIElucHV0Q29tbWFuZHNBY3Rpb24uUExVUzpcbiAgICAgICAgICAgICAgICB0aGlzLmluY3JlbWVudE1vbnRoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyc2VJbnQodGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUpIDwgMSB8fFxuICAgICAgICAgICAgcGFyc2VJbnQodGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUpID4gMTJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRJbnB1dEN1cnNvckF0VGhlRW5kKHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWNyZW1lbnRNb250aCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGFyc2VJbnQodGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUpID09PSAxIHx8XG4gICAgICAgICAgICAhdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJPbkNvbW1hbmRzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgKHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlXG4gICAgICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSlcbiAgICAgICAgICAgICAgICA6IDApIC0gMVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5jcmVtZW50TW9udGgoKTogdm9pZCB7XG4gICAgICAgIGlmIChwYXJzZUludCh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSkgPT09IDEyKSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJPbkNvbW1hbmRzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKFxuICAgICAgICAgICAgKHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlXG4gICAgICAgICAgICAgICAgPyBwYXJzZUludCh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSlcbiAgICAgICAgICAgICAgICA6IDApICsgMVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZvY3VzKGV2ZW50PzogRm9jdXNFdmVudCkge1xuICAgICAgICAvLyBEcm9wRG93biBMYWJlbFxuICAgICAgICBpZiAodGhpcy5pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLnBsYWNlaG9sZGVySWNvbiA9XG4gICAgICAgICAgICAgICAgSW5wdXRTdmdSb3V0ZXMuZHluYW1pY0ZvY3VzTGFiZWxTdmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEYXRlcGlja2VyXG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVRpbWVQaWNrZXIoKSAmJiAhdGhpcy5pbnB1dENvbmZpZy5pc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kYXRlVGltZU1haW5UaW1lcik7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5mb2N1c0JsdXIpO1xuICAgICAgICAgICAgdGhpcy5zZXRTaG93RGF0ZUlucHV0KHRydWUpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICh0aGlzLnNlbGVjdGlvbklucHV0ID09PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAoZXZlbnQ/LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/Lm5vZGVOYW1lID09PSAnSU5QVVQnKSB8fFxuICAgICAgICAgICAgICAgIChldmVudD8ucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCk/Lm5vZGVOYW1lID09PSAnSU5QVVQnIHx8XG4gICAgICAgICAgICAgICAgZXZlbnQ/LnJlbGF0ZWRUYXJnZXQgPT09IG51bGxcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmVudEJsdXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9sZGVyMS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTcGFuU2VsZWN0aW9uKHRoaXMuaG9sZGVyMS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gLTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudDIudG9nZ2xlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEcm9wZG93blxuICAgICAgICBpZiAodGhpcy5pbnB1dENvbmZpZy5pc0Ryb3Bkb3duKSB7XG4gICAgICAgICAgICB0aGlzLnNldElzRHJvcGRvd25Ub2dnbGVyKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5zZXRTaG93SGlkZURyb3Bkb3duKHRoaXMuaXNEcm9wZG93blRvZ2dsZXJTdWJqZWN0LnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbW1hbmRzXG4gICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLmNvbW1hbmRzICYmICF0aGlzLmlucHV0Q29uZmlnLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLmNvbW1hbmRzLnR5cGUgPT09IElucHV0Q29tbWFuZHNUeXBlLk1PTlRIUykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbnB1dENvbmZpZy5ibHVlSW5wdXQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcuYmxhY2tJbnB1dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5jb21tYW5kcy5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SXNWaXNpYmxlQ29tbWFuZHModHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLmNvbW1hbmRzLnR5cGUgPT09XG4gICAgICAgICAgICAgICAgICAgIElucHV0Q29tbWFuZHNUeXBlLlBNX0lOQ1JFTUVOVF9ERUNSRU1FTlQgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLmNvbW1hbmRzLnR5cGUgPT09XG4gICAgICAgICAgICAgICAgICAgIElucHV0Q29tbWFuZHNUeXBlLklOQ1JFTUVOVF9ERUNSRU1FTlRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcuYmxhY2tJbnB1dCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcuY29tbWFuZHMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldElzVmlzaWJsZUNvbW1hbmRzKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRJc0ZvY3VzSW5wdXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQmx1cihldmVudD86IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gRHJvcERvd24gTGFiZWxcblxuICAgICAgICBpZiAodGhpcy5pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsICYmICF0aGlzLmlzRWRpdElucHV0U3ViamVjdC52YWx1ZSlcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcucGxhY2Vob2xkZXJJY29uID0gSW5wdXRTdmdSb3V0ZXMuZHluYW1pY0xhYmVsU3ZnO1xuXG4gICAgICAgIC8vIEVkaXQgSW5wdXRcbiAgICAgICAgaWYgKHRoaXMuaXNFZGl0SW5wdXRTdWJqZWN0LnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMoeyBpbnZhbGlkOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGF0ZXBpY2tlcjtcbiAgICAgICAgaWYgKHRoaXMucHJldmVudEJsdXIpIHtcbiAgICAgICAgICAgIHRoaXMucHJldmVudEJsdXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhbmtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PVxuICAgICAgICAgICAgSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5JTlBVVF9EUk9QRE9XTl9CQU5LX05BTUVcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5ibGFja0lucHV0ID0gZmFsc2U7XG5cbiAgICAgICAgLy8gUHJpY2UgU2VwYXJhdG9yIC0gcmVtb3ZlIGRvdCBvbiBmb2N1cyBvdXRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvciAmJlxuICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUgJiZcbiAgICAgICAgICAgIHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlPy50b1N0cmluZygpLmluZGV4T2YoJy4nKSA+PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gNC4xLiBDaGVjayBmb3IgRG90IHBvc2l0aW9uXG4gICAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxJbmRleCA9IHRoaXMuc3VwZXJDb250cm9sLmNvbnRyb2w/LnZhbHVlXG4gICAgICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAuaW5kZXhPZignLicpO1xuXG4gICAgICAgICAgICBsZXQgaW50ZWdlclBhcnQgPSB0aGlzLnRob3VzYW5kU2VwYXJhdG9yUGlwZS50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIHRoaXMuaGFzRGVjaW1hbEluZGV4KVxuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgdGhpcy5pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvckxpbWl0YXRpb24pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsZXQgZGVjaW1hbFBhcnQgPSB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZS5zbGljZShcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0RlY2ltYWxJbmRleCArIDFcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIDQuNC4gR2V0IG9ubHkgdHdvIG51bWJlcnMgb2YgZGVjaW1hbCBwYXJ0XG4gICAgICAgICAgICBkZWNpbWFsUGFydCA9IGRlY2ltYWxQYXJ0LnNsaWNlKDAsIDIpO1xuXG4gICAgICAgICAgICBpZiAoIWRlY2ltYWxQYXJ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNEZWNpbWFsSW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5wYXRjaFZhbHVlKGludGVnZXJQYXJ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLm51bWJlck9mUG9pbnRzID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERyb3Bkb3duXG4gICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLmlzRHJvcGRvd24gfHwgdGhpcy5pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5EQVRFX1BJQ0tFUiB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLm5hbWUgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBJbnB1dENvbmZpZ05hbWVTdHJpbmdFbnVtLlRJTUVfUElDS0VSIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVJfQkFOS19DQVJEKSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmlucHV0Q29uZmlnLmlzRGlzYWJsZWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmICgoZXZlbnQ/LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/Lm5vZGVOYW1lID09PSAnSU5QVVQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRGF0ZXBpY2tlclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRGF0ZVRpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzQmx1ciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ibHVyT25EYXRlVGltZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYmx1ck9uRHJvcERvd25BcnJvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE5vcm1hbCwgd2l0aG91dCBkcm9wZG93blxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgICAgICAgICAvLyBJbnB1dCBDb21tYW5kc1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWcuY29tbWFuZHMpIHRoaXMuYmx1ck9uQ29tbWFuZHMoKTtcblxuICAgICAgICAgICAgLy8gUGFzc3dvcmRcbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLnR5cGUgPT09ICdwYXNzd29yZCcpIHRoaXMuYmx1ck9uUGFzc3dvcmQoKTtcbiAgICAgICAgICAgIC8vIE5vcm1hbCBmb2N1cyBvdXRcbiAgICAgICAgICAgIGVsc2UgdGhpcy5zZXRJc0ZvY3VzSW5wdXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRCbHVySW5wdXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0SXNUb3VjaGVkSW5wdXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBibHVyT25Db21tYW5kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dENvbW1hbmRzVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5jb21tYW5kcyEuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNldElzVmlzaWJsZUNvbW1hbmRzKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcuYmxhY2tJbnB1dCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0sIDIwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBibHVyT25Ecm9wRG93bkFycm93KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRpbWVvdXRDbGVhbmVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldElzRHJvcGRvd25Ub2dnbGVyKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KGZhbHNlKTtcblxuICAgICAgICAgICAgdGhpcy5zZXRJc0Ryb3Bkb3duVG9nZ2xlcihmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnNldElzRm9jdXNJbnB1dChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnNldFNob3dIaWRlRHJvcGRvd24odGhpcy5pc0Ryb3Bkb3duVG9nZ2xlclN1YmplY3QudmFsdWUpO1xuICAgICAgICB9LCAxNTApO1xuICAgIH1cblxuICAgIHB1YmxpYyBibHVyT25QYXNzd29yZCgpIHtcbiAgICAgICAgdGhpcy5wYXNzd29yZFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSwgMTUwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SW5wdXRDdXJzb3JBdFRoZUVuZChpbnB1dDogYW55LCB0aW1lOiBudW1iZXIgPSAxMjApOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kID0gaW5wdXQuc2VsZWN0aW9uRW5kO1xuICAgICAgICBpZiAoaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkVuZCwgc2VsZWN0aW9uRW5kKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgIH0sIHRpbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkVkaXRJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5zZXRJc0VkaXRJbnB1dCh0cnVlKTtcbiAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsTmV3ID0gZmFsc2U7XG4gICAgICAgIGlmICghdGhpcy5pbnB1dENvbmZpZy5ibHVlSW5wdXQpIHRoaXMuaW5wdXRDb25maWcuYmxhY2tJbnB1dCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5wdXRDb25maWcuY29tbWFuZHMhLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuc2V0SXNWaXNpYmxlQ29tbWFuZHModHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KHRydWUpO1xuXG4gICAgICAgIHRoaXMuc2V0SW5wdXRDdXJzb3JBdFRoZUVuZCh0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy5zZXRFcnJvcnMoeyByZXF1aXJlZDogdHJ1ZSB9KTtcblxuICAgICAgICB0aGlzLnNldENvbW1hbmRFdmVudCh7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSxcbiAgICAgICAgICAgIGFjdGlvbjogJ0VkaXQgSW5wdXQnLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Vmlld0NoaWxkcyhcbiAgICAgICAgc3Bhbk9uZTogRWxlbWVudFJlZixcbiAgICAgICAgc3BhblR3bzogRWxlbWVudFJlZixcbiAgICAgICAgc3BhblRocmVlOiBFbGVtZW50UmVmLFxuICAgICAgICBob2xkZXIxOiBFbGVtZW50UmVmXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Bhbk9uZSA9IHNwYW5PbmU7XG4gICAgICAgIHRoaXMuc3BhblR3byA9IHNwYW5Ud287XG4gICAgICAgIHRoaXMuc3BhblRocmVlID0gc3BhblRocmVlO1xuICAgICAgICB0aGlzLmhvbGRlcjEgPSBob2xkZXIxO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRWaWV3Q2hpbGRzUG9wb3ZlcihcbiAgICAgICAgdDI6IE5nYlBvcG92ZXIsXG4gICAgICAgIG5nYk1haW5Qb3BvdmVyOiBOZ2JQb3BvdmVyXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMudDIgPSB0MjtcbiAgICAgICAgdGhpcy5uZ2JNYWluUG9wb3ZlciA9IG5nYk1haW5Qb3BvdmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGVEcm9wZG93bk9wdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT0gSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5EQVRFX1BJQ0tFUiB8fFxuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PSBJbnB1dENvbmZpZ05hbWVTdHJpbmdFbnVtLlRJTUVfUElDS0VSIHx8XG4gICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLm5hbWUgPT09XG4gICAgICAgICAgICAgICAgSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5EQVRFX1BJQ0tFUl9CQU5LX0NBUkRcbiAgICAgICAgKVxuICAgICAgICAgICAgaWYgKHRoaXMudDIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudDIuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGF0ZVRpbWVNYWluVGltZXIpO1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5mb2N1c0JsdXIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhvbGRlcjEubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3BhblNlbGVjdGlvbih0aGlzLmhvbGRlcjEubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudDIub3BlbigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaG9sZGVyMS5uYXRpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRJc0ZvY3VzSW5wdXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24/LnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRJc0Ryb3Bkb3duVG9nZ2xlcighdGhpcy5pc0Ryb3Bkb3duVG9nZ2xlclN1YmplY3QudmFsdWUpO1xuXG4gICAgICAgIHRoaXMuc2V0U2hvd0hpZGVEcm9wZG93bih0aGlzLmlzRHJvcGRvd25Ub2dnbGVyU3ViamVjdC52YWx1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNEcm9wZG93blRvZ2dsZXJTdWJqZWN0LnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uUGxhY2Vob2xkZXJJY29uRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5pc0VkaXRJbnB1dFN1YmplY3QudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29tbWFuZEV2ZW50KHtcbiAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSxcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdUb2dnbGUgRHJvcGRvd24nLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbW1hbmRFdmVudCh7XG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnUGxhY2Vob2xkZXIgSWNvbiBFdmVudCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbklucHV0Q29uZmlnQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICAvLyBQcmljZSBTZXBhcmF0b3JcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWcucHJpY2VTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMub3JpZ2luUHJpY2VTZXBhcmF0b3JMaW1pdCA9XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvckxpbWl0YXRpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDdXN0b20gUmFuZ2VcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWcuaXNVc2luZ0N1c3RvbVBlcmlvZFJhbmdlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dENvbmZpZy5pc0Rpc3BsYXlpbmdDdXN0b21QZXJpb2RSYW5nZSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldElzRm9jdXNJbnB1dCh0cnVlKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5zZXRJc0ZvY3VzSW5wdXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGF0ZVBpY2tlclxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLm5hbWUgPT09IElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVIgfHxcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT0gSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5USU1FX1BJQ0tFUiB8fFxuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PVxuICAgICAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVJfQkFOS19DQVJEXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZXRUaW1lUGlja2VyVGltZSgpO1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2UuZGF0ZUNoYW5nZWRcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5wdXRDb25maWcuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaW1lRGF0ZUlucHV0KGRhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50Mi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXaGVuIGFkZCBtb2RlIGluIGRyb3Bkb3duXG4gICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLmNvbW1hbmRzPy5hY3RpdmUgJiYgIXRoaXMuaW5wdXRDb25maWcuaXNEaXNhYmxlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWcuY29tbWFuZHMudHlwZSA9PT0gJ2NvbmZpcm0tY2FuY2VsJykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbnB1dENvbmZpZy5ibHVlSW5wdXQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcuYmxhY2tJbnB1dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJc1Zpc2libGVDb21tYW5kcyh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldElzRm9jdXNJbnB1dCh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50KSB0aGlzLnNldElzQ2Fwc0xvY2tPbihldmVudD8uZ2V0TW9kaWZpZXJTdGF0ZT8uKCdDYXBzTG9jaycpKTtcblxuICAgICAgICBpZiAodGhpcy5pbnB1dENvbmZpZy5wcmljZVNlcGFyYXRvcikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUb1N0cmluZyA9IFN0cmluZyh0aGlzLnN1cGVyQ29udHJvbC5jb250cm9sPy52YWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuaXNEb3REZWxldGVkID0gdmFsdWVUb1N0cmluZz8uaW5jbHVkZXMoJy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgZm9yIHBob25lIGZpZWxkIGZpcnN0IGNoYXJhY3RlciB0byBiZSAwXG4gICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gSW5wdXRTdHJpbmdFbnVtLlBIT05FKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5zZWxlY3Rpb25TdGFydCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmtleSA9PT0gJzAnXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RHJvcERvd25LZXlOYXZpZ2F0aW9uKHtcbiAgICAgICAgICAgICAgICBrZXlDb2RlOiBldmVudC5rZXlDb2RlLFxuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbktleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgdGhpcy5zZXRJc0NhcHNMb2NrT24oZXZlbnQ/LmdldE1vZGlmaWVyU3RhdGU/LignQ2Fwc0xvY2snKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzZXQgZnVuY3Rpb24gcHJvcGVydHkgZm9yIGRpc2FibGluZyBtdWx0aXBsZSBkb3RzXG4gICAgICAgIGNvbnN0IHZhbHVlVG9TdHJpbmcgPSBTdHJpbmcodGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzRG90RGVsZXRlZCAmJiAhdmFsdWVUb1N0cmluZz8uaW5jbHVkZXMoJy4nKSlcbiAgICAgICAgICAgIHRoaXMubnVtYmVyT2ZQb2ludHMgPSAwO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgPT0gOCAmJlxuICAgICAgICAgICAgISh0aGlzLmlucHV0Q29uZmlnLmlzRHJvcGRvd24gfHwgdGhpcy5pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IE11bHRpcGxlIENvbnNlY3V0aXZlbHkgU3BhY2VzXG4gICAgICAgICAgICB0aGlzLm51bWJlck9mQ29uc2VjdXRpdmVseVNwYWNlcyA9IDA7XG5cbiAgICAgICAgICAgIC8vIFJlc2V0IE9uZSBTcGFjZSBPbmx5XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8udmFsdWU/LmluY2x1ZGVzKCcgJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMub25lU3BhY2VPbmx5Q291bnRlciA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLmlzRHJvcGRvd24gfHxcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcuZHJvcGRvd25MYWJlbCB8fFxuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PSBJbnB1dENvbmZpZ05hbWVTdHJpbmdFbnVtLkFERFJFU1NcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gNDAgfHwgZXZlbnQua2V5Q29kZSA9PT0gMzgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERyb3BEb3duS2V5TmF2aWdhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGtleUNvZGU6IGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERyb3BEb3duS2V5TmF2aWdhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGtleUNvZGU6IGV2ZW50LmtleUNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuaW5wdXRDb25maWcsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT0gSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5BRERSRVNTXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IDI3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJc1Zpc2libGVDb21tYW5kcyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkJsdXIoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJsdXJPbkRyb3BEb3duQXJyb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RHJvcERvd25LZXlOYXZpZ2F0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAga2V5Q29kZTogZXZlbnQua2V5Q29kZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSA5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREcm9wRG93bktleU5hdmlnYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBrZXlDb2RlOiBldmVudC5rZXlDb2RlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEYXRlICYgVGltZSBQaWNrZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHB1YmxpYyBzZXRUaW1lUGlja2VyVGltZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT0gSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5USU1FX1BJQ0tFUilcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVRpbWVJbnB1dERhdGUoXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgIG1vbWVudCgpLmZvcm1hdCgnTU0vREQvWVlZWScpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmlucHV0Q29uZmlnPy5pc0Zyb21EYXRlID8gJyAxMjoxNScgOiAnIDEyOjAwJylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUaW1lRGF0ZUlucHV0KGRhdGU6IElucHV0Q2hhbmdlVmFsdWUpOiB2b2lkIHtcbiAgICAgICAgbGV0IHRleHQsIGRhdGVGb3JtYXQsIHRpbWVGb3JtYXQ7XG4gICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLm5hbWUgPT09IElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVIpIHtcbiAgICAgICAgICAgIHRleHQgPSBtb21lbnQobmV3IERhdGUoZGF0ZSkpLmZvcm1hdCgnTU0vREQvWVknKTtcbiAgICAgICAgICAgIGRhdGVGb3JtYXQgPSB0ZXh0LnNwbGl0KCcvJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLm5hbWUgPT09XG4gICAgICAgICAgICBJbnB1dENvbmZpZ05hbWVTdHJpbmdFbnVtLkRBVEVfUElDS0VSX0JBTktfQ0FSRFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRleHQgPSBtb21lbnQobmV3IERhdGUoZGF0ZSkpLmZvcm1hdCgnTU0vREQvWVknKTtcbiAgICAgICAgICAgIGRhdGVGb3JtYXQgPSB0ZXh0LnNwbGl0KCcvJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID1cbiAgICAgICAgICAgICAgICBkYXRlIGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICAgICAgICAgICAgICA/IGRhdGVcbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgRGF0ZShtb21lbnQoKS5mb3JtYXQoJ01NL0REL1lZWVknKSArICcgJyArIGRhdGUpO1xuICAgICAgICAgICAgdGV4dCA9IG1vbWVudChuZXcgRGF0ZShkYXRlKSkuZm9ybWF0KCdISDptbScpO1xuXG4gICAgICAgICAgICB0aW1lRm9ybWF0ID0gbW9tZW50KG5ldyBEYXRlKGRhdGUpKS5mb3JtYXQoJ2hoL21tL0EnKTtcbiAgICAgICAgICAgIGRhdGVGb3JtYXQgPSB0aW1lRm9ybWF0LnNwbGl0KCcvJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0ZXh0O1xuICAgICAgICB0aGlzLnNldE9uQ2hhbmdlKHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSk7XG4gICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KGZhbHNlKTtcblxuICAgICAgICBpZiAodGhpcy5zcGFuT25lKSB0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSBkYXRlRm9ybWF0WzBdO1xuXG4gICAgICAgIGlmICh0aGlzLnNwYW5Ud28pXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lICE9PVxuICAgICAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVJfQkFOS19DQVJEXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSBkYXRlRm9ybWF0WzFdO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gZGF0ZUZvcm1hdFsyXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gZGF0ZUZvcm1hdFsyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKG5ldyBEYXRlKGRhdGUpKTtcbiAgICAgICAgdGhpcy5zZXRTaG93RGF0ZUlucHV0KHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldERhdGVUaW1lSW5wdXRzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zcGFuT25lKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT0gSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5EQVRFX1BJQ0tFUlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJ21tJztcbiAgICAgICAgICAgICAgICB0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnZGQnO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJ3l5JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PVxuICAgICAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVJfQkFOS19DQVJEXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnbW0nO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BhblR3by5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9ICd5eSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT0gSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5USU1FX1BJQ0tFUlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJ0hIJztcbiAgICAgICAgICAgICAgICB0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnTU0nO1xuICAgICAgICAgICAgICAgIHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJ0FNJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFRpbWVQaWNrZXJUaW1lKCk7XG4gICAgICAgIHRoaXMubmV3SW5wdXRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZXRJc0ZvY3VzSW5wdXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnNldFNob3dEYXRlSW5wdXQoZmFsc2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3Rpb25DaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudCkgdGhpcy5pbnB1dFNlbGVjdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGF0ZVBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIGNvbnN0IHBhc3RlVGV4dCA9IGV2ZW50LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQnKSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHBhc3RlZERhdGUgPSBuZXcgRGF0ZShwYXN0ZVRleHQpO1xuICAgICAgICBpZiAoIWlzTmFOKHBhc3RlZERhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRUaW1lRGF0ZUlucHV0KHBhc3RlZERhdGUpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RTcGFuQnlUYWJJbmRleCh0aGlzLnNlbGVjdGlvbklucHV0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTZWxlY3Rpb24oZXZlbnQ6IHtcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHZvaWQ7XG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4gdm9pZDtcbiAgICAgICAgdGFyZ2V0OiBhbnk7XG4gICAgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICB0aGlzLnNldElzRm9jdXNJbnB1dCh0cnVlKTtcblxuICAgICAgICBjb25zdCBzZWxlY3Rpb25JbnB1dCA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpKTtcblxuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmIChjdXJyZW50U2VsZWN0aW9uICYmIGN1cnJlbnRTZWxlY3Rpb24udG9TdHJpbmcoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgdGhpcy5ob2xkZXIxLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSW5wdXQgPSAwO1xuICAgICAgICAgICAgdGhpcy5zZXRTcGFuU2VsZWN0aW9uKHRoaXMuaG9sZGVyMS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRhdGVUaW1lTWFpblRpbWVyKTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZvY3VzQmx1cik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kYXRlVGltZU1haW5UaW1lcik7XG4gICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbWFpbicpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gc2VsZWN0aW9uSW5wdXQ7XG4gICAgICAgICAgICB0aGlzLnNldFNwYW5TZWxlY3Rpb24oZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25JbnB1dCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSW5wdXQgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3BhblNlbGVjdGlvbih0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RTcGFuQnlUYWJJbmRleCh0aGlzLnNlbGVjdGlvbklucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRTcGFuU2VsZWN0aW9uKGVsZW1lbnQ6IE5vZGUpOiB2b2lkIHtcbiAgICAgICAgbGV0IHJhbmdlOiBSYW5nZTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbjogU2VsZWN0aW9uIHwgbnVsbDtcblxuICAgICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbiAmJiBkb2N1bWVudC5jcmVhdGVSYW5nZSkge1xuICAgICAgICAgICAgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGVsZW1lbnQpO1xuICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGlvbj8uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNob3dEYXRlVGltZVBsYWNlaG9sZGVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFNob3dEYXRlSW5wdXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KHRydWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gLTE7XG5cbiAgICAgICAgdGhpcy5ob2xkZXIxLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5zZXRTcGFuU2VsZWN0aW9uKHRoaXMuaG9sZGVyMS5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlU2VsZWN0aW9uKFxuICAgICAgICBldmVudDogS2V5Ym9hcmRFdmVudCxcbiAgICAgICAgbm9QcmV2ZW50RGVmYXVsdCA9IGZhbHNlXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICghbm9QcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNOYXZpZ2F0aW9uS2V5ID0gdGhpcy5pc05hdmlnYXRpb25LZXkoZXZlbnQpO1xuICAgICAgICBjb25zdCBpc1NwZWNpYWxUaW1lUGlja2VyS2V5ID1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSW5wdXQgPT09IDMgJiZcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT0gSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5USU1FX1BJQ0tFUjtcblxuICAgICAgICBpZiAoaXNOYXZpZ2F0aW9uS2V5IHx8IGlzU3BlY2lhbFRpbWVQaWNrZXJLZXkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU5hdmlnYXRpb25LZXkoZXZlbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzTnVtYmVyKGV2ZW50KSkge1xuICAgICAgICAgICAgaWYgKCFub1ByZXZlbnREZWZhdWx0KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFub1ByZXZlbnREZWZhdWx0KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uSW5wdXQgPT09IC0xKSB0aGlzLnNlbGVjdGlvbklucHV0ID0gMDtcblxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlS2V5Ym9hcmRJbnB1dHMoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc05hdmlnYXRpb25LZXkoZTogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uS2V5cyA9IFszNywgMzgsIDM5LCA0MCwgOCwgOSwgNDZdOyAvLyBBcnJvdyBrZXlzLCBCYWNrc3BhY2UsIFRhYiwgRGVsZXRlXG4gICAgICAgIHJldHVybiBuYXZpZ2F0aW9uS2V5cy5pbmNsdWRlcyhlLmtleUNvZGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlTmF2aWdhdGlvbktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgMzc6IC8vIExlZnQgYXJyb3dcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVTZWxlY3Rpb25MZWZ0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM5OiAvLyBSaWdodCBhcnJvd1xuICAgICAgICAgICAgY2FzZSA5OiAvLyBUYWJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVTZWxlY3Rpb25SaWdodE9yVGFiKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzg6IC8vIFVwIGFycm93XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlVGltZU1vZGVsKCd1cCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA0MDogLy8gRG93biBhcnJvd1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVRpbWVNb2RlbCgnZG93bicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA4OiAvLyBCYWNrc3BhY2VcbiAgICAgICAgICAgIGNhc2UgNDY6IC8vIERlbGV0ZVxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlS2V5Ym9hcmRJbnB1dHMoZXZlbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtb3ZlU2VsZWN0aW9uTGVmdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uSW5wdXQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0IC09IDE7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFNwYW5CeVRhYkluZGV4KHRoaXMuc2VsZWN0aW9uSW5wdXQsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtb3ZlU2VsZWN0aW9uUmlnaHRPclRhYihlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlzRGF0ZXBpY2tlckJhbmtDYXJkID1cbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT1cbiAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVJfQkFOS19DQVJEO1xuICAgICAgICBjb25zdCBtYXhJbmRleCA9IGlzRGF0ZXBpY2tlckJhbmtDYXJkID8gMSA6IDI7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uSW5wdXQgPCBtYXhJbmRleCAmJiAhZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25JbnB1dCArPSAxO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RTcGFuQnlUYWJJbmRleCh0aGlzLnNlbGVjdGlvbklucHV0LCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDkgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNOZXh0SW5wdXQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlLnNoaWZ0S2V5ICYmIGUua2V5Q29kZSA9PT0gOSkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c1ByZXZpb3VzSW5wdXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNOZXh0SW5wdXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFsbElucHV0cyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dC5pbnB1dC1jb250cm9sJylcbiAgICAgICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbElucHV0cy5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaW5wdXQpID0+IGlucHV0ID09PSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYWxsSW5wdXRzW2N1cnJlbnRJbmRleCArIDFdKSBhbGxJbnB1dHNbY3VycmVudEluZGV4ICsgMV0uZm9jdXMoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldElzRm9jdXNJbnB1dChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmJsdXJPbkRhdGVUaW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gLTE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c1ByZXZpb3VzSW5wdXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFsbElucHV0cyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dC5pbnB1dC1jb250cm9sJylcbiAgICAgICAgKSBhcyBIVE1MSW5wdXRFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGFsbElucHV0cy5maW5kSW5kZXgoXG4gICAgICAgICAgICAoaW5wdXQpID0+IGlucHV0ID09PSB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09PSAtMSkgdGhpcy5zZWxlY3Rpb25JbnB1dCA9IDM7XG4gICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PT0gMCkgdGhpcy5zZWxlY3Rpb25JbnB1dCA9IDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25JbnB1dCAtPSAxO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RTcGFuQnlUYWJJbmRleCh0aGlzLnNlbGVjdGlvbklucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPiAwKSBhbGxJbnB1dHNbY3VycmVudEluZGV4IC0gMV0uZm9jdXMoKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gLTE7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUtleWJvYXJkSW5wdXRzKGU6IEtleWJvYXJkRXZlbnQsIGlzUmVzdGFydD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3Bhbk9uZVZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgPVxuICAgICAgICAgICAgaXNOYU4odGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MKSB8fCB0aGlzLm5ld0lucHV0Q2hhbmdlZFxuICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgOiBwYXJzZUludCh0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpO1xuICAgICAgICBjb25zdCBzcGFuVHdvVmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgICBpc05hTih0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpIHx8IHRoaXMubmV3SW5wdXRDaGFuZ2VkXG4gICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA6IHBhcnNlSW50KHRoaXMuc3BhblR3by5uYXRpdmVFbGVtZW50LmlubmVySFRNTCk7XG5cbiAgICAgICAgbGV0IHNwYW5UaHJlZVZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lICE9PVxuICAgICAgICAgICAgSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5EQVRFX1BJQ0tFUl9CQU5LX0NBUkRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzcGFuVGhyZWVWYWx1ZSA9XG4gICAgICAgICAgICAgICAgaXNOYU4odGhpcy5zcGFuVGhyZWUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5uZXdJbnB1dENoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICAgICAgICA6IHBhcnNlSW50KHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmV3SW5wdXRDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmlucHV0Q29uZmlnLm5hbWUgPT09IElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbklucHV0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVzdGFydCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnbW0nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RTcGFuQnlUYWJJbmRleCgwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNwYW5PbmVWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbF92YWx1ZSA9IHBhcnNlSW50KGAke3NwYW5PbmVWYWx1ZX0ke2Uua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxfdmFsdWUgPiAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwJyArIHBhcnNlSW50KGUua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgKS5zbGljZSgtMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3BhbkJ5VGFiSW5kZXgoMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lSW5wdXREYXRlU3ViamVjdC52YWx1ZS5zZXRNb250aChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Bhbk9uZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGUua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluYWxfdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJ21tJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Bhbk9uZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGUua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2xpY2UoLTIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3BhbkJ5VGFiSW5kZXgoMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQoZS5rZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlVGltZUlucHV0RGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuc2V0TW9udGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChlLmtleSkgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsX3ZhbHVlID0gKCcwJyArIHBhcnNlSW50KGUua2V5KSkuc2xpY2UoLTIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Bhbk9uZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGZpbmFsX3ZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUludChgMSR7ZS5rZXl9YCkgPiAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25JbnB1dCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFNwYW5CeVRhYkluZGV4KDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5zZWxlY3RTcGFuQnlUYWJJbmRleCgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uSW5wdXQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZXN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BhblR3by5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9ICdkZCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSW5wdXQgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFNwYW5CeVRhYkluZGV4KDAsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3BhblR3b1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsX3ZhbHVlID0gcGFyc2VJbnQoYCR7c3BhblR3b1ZhbHVlfSR7ZS5rZXl9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbF92YWx1ZSA+IDMxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAnICsgcGFyc2VJbnQoZS5rZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICApLnNsaWNlKC0yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSW5wdXQgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RTcGFuQnlUYWJJbmRleCgyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVRpbWVJbnB1dERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVJbnB1dERhdGVTdWJqZWN0LnZhbHVlLnNldERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChlLmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluYWxfdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnZGQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BhblR3by5uYXRpdmVFbGVtZW50LmlubmVySFRNTCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGUua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2xpY2UoLTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3BhbkJ5VGFiSW5kZXgoMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQoZS5rZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlVGltZUlucHV0RGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuc2V0RGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGUua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAnMCcgKyBwYXJzZUludChlLmtleSlcbiAgICAgICAgICAgICAgICAgICAgKS5zbGljZSgtMik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlSW50KGAxJHtlLmtleX1gKSA+IDMxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3BhbkJ5VGFiSW5kZXgoMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFNwYW5CeVRhYkluZGV4KDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZXN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJ3l5JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25JbnB1dCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3BhbkJ5VGFiSW5kZXgoMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXNwYW5UaHJlZVZhbHVlIHx8XG4gICAgICAgICAgICAgICAgICAgIHNwYW5UaHJlZVZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID09PSAyXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgJzAnICsgcGFyc2VJbnQoZS5rZXkpXG4gICAgICAgICAgICAgICAgICAgICkuc2xpY2UoLTIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuc2V0RnVsbFllYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGAyMDAke3BhcnNlSW50KGUua2V5KX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFNwYW5CeVRhYkluZGV4KDIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsWWVhciA9IHBhcnNlSW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuVGhyZWUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgKyBwYXJzZUludChlLmtleSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbFNob3dZZWFyID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsWWVhciA+IDMxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludChgMTkke2ZpbmFsWWVhcn1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcGFyc2VJbnQoYDIwJHtmaW5hbFllYXJ9YCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGF0ZVRpbWVJbnB1dERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lSW5wdXREYXRlU3ViamVjdC52YWx1ZS5zZXRGdWxsWWVhcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxTaG93WWVhclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5UaHJlZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MICsgcGFyc2VJbnQoZS5rZXkpXG4gICAgICAgICAgICAgICAgICAgICkuc2xpY2UoLTIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFNwYW5CeVRhYkluZGV4KDIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT1cbiAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVJfQkFOS19DQVJEXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbklucHV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVzdGFydCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnbW0nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RTcGFuQnlUYWJJbmRleCgwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNwYW5PbmVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbF92YWx1ZSA9IHBhcnNlSW50KGAke3NwYW5PbmVWYWx1ZX0ke2Uua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWxfdmFsdWUgPiAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwJyArIHBhcnNlSW50KGUua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgKS5zbGljZSgtMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3BhbkJ5VGFiSW5kZXgoMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lSW5wdXREYXRlU3ViamVjdC52YWx1ZS5zZXRNb250aChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Bhbk9uZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGUua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluYWxfdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnbW0nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Bhbk9uZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGUua2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2xpY2UoLTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3BhbkJ5VGFiSW5kZXgoMSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQoZS5rZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRlVGltZUlucHV0RGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuc2V0TW9udGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChlLmtleSkgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsX3ZhbHVlID0gKCcwJyArIHBhcnNlSW50KGUua2V5KSkuc2xpY2UoLTIpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Bhbk9uZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGZpbmFsX3ZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUludChgMSR7ZS5rZXl9YCkgPiAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25JbnB1dCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFNwYW5CeVRhYkluZGV4KDEsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgdGhpcy5zZWxlY3RTcGFuQnlUYWJJbmRleCgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpc1Jlc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJ3l5JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25JbnB1dCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0U3BhbkJ5VGFiSW5kZXgoMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXNwYW5Ud29WYWx1ZSB8fFxuICAgICAgICAgICAgICAgICAgICBzcGFuVHdvVmFsdWUudG9TdHJpbmcoKS5sZW5ndGggPT09IDJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgJzAnICsgcGFyc2VJbnQoZS5rZXkpXG4gICAgICAgICAgICAgICAgICAgICkuc2xpY2UoLTIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuc2V0RnVsbFllYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KGAyMDAke3BhcnNlSW50KGUua2V5KX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFNwYW5CeVRhYkluZGV4KDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsWWVhciA9IHBhcnNlSW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MICsgcGFyc2VJbnQoZS5rZXkpXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluYWxTaG93WWVhciA9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFllYXIgPiAzMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQoYDE5JHtmaW5hbFllYXJ9YClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBhcnNlSW50KGAyMCR7ZmluYWxZZWFyfWApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuc2V0RnVsbFllYXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsU2hvd1llYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MICsgcGFyc2VJbnQoZS5rZXkpXG4gICAgICAgICAgICAgICAgICAgICkuc2xpY2UoLTIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFNwYW5CeVRhYkluZGV4KDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdFNwYW5CeVRhYkluZGV4KGluZHg6IG51bWJlciwgY2hhbmdlVGFiPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBzd2l0Y2ggKGluZHgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNwYW5TZWxlY3Rpb24odGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3BhblNlbGVjdGlvbih0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTcGFuU2VsZWN0aW9uKHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNwYW5TZWxlY3Rpb24odGhpcy5ob2xkZXIxLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZVRhYikgdGhpcy5uZXdJbnB1dENoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGF0ZVRpbWVNb2RlbChkaXJlY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25JbnB1dCA9PT0gLTEpIHRoaXMuc2VsZWN0aW9uSW5wdXQgPSAwO1xuXG4gICAgICAgIGNvbnN0IGlzVXAgPSBkaXJlY3Rpb24gPT09ICd1cCc7XG4gICAgICAgIGNvbnN0IGlzRGF0ZVBpY2tlciA9XG4gICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLm5hbWUgPT09IElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVI7XG4gICAgICAgIGNvbnN0IGlzQmFua0NhcmRQaWNrZXIgPVxuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PVxuICAgICAgICAgICAgSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5EQVRFX1BJQ0tFUl9CQU5LX0NBUkQ7XG5cbiAgICAgICAgaWYgKGlzRGF0ZVBpY2tlciB8fCBpc0JhbmtDYXJkUGlja2VyKVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVEYXRlUGlja2VySW5wdXQoaXNVcCwgaXNEYXRlUGlja2VyKTtcbiAgICAgICAgZWxzZSB0aGlzLmhhbmRsZVRpbWVQaWNrZXJJbnB1dChpc1VwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZURhdGVQaWNrZXJJbnB1dChpc1VwOiBib29sZWFuLCBpc0RhdGVQaWNrZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uSW5wdXQgPT09IDApIHRoaXMudXBkYXRlTW9udGgoaXNVcCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uSW5wdXQgPT09IDEpIHRoaXMudXBkYXRlRGF0ZShpc1VwLCBpc0RhdGVQaWNrZXIpO1xuICAgICAgICBlbHNlIHRoaXMudXBkYXRlWWVhcihpc1VwLCBpc0RhdGVQaWNrZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlVGltZVBpY2tlcklucHV0KGlzVXA6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uSW5wdXQgPT09IDApIHRoaXMudXBkYXRlSG91cnMoaXNVcCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uSW5wdXQgPT09IDEpIHRoaXMudXBkYXRlTWludXRlcyhpc1VwKTtcbiAgICAgICAgZWxzZSB0aGlzLnRvZ2dsZUFNUE0oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU1vbnRoKGlzVXA6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbW9udGhEZWx0YSA9IGlzVXAgPyAxIDogLTE7XG4gICAgICAgIHRoaXMuc2V0RGF0ZVRpbWVJbnB1dERhdGUoXG4gICAgICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lSW5wdXREYXRlU3ViamVjdC52YWx1ZS5zZXRNb250aChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuZ2V0TW9udGgoKSArIG1vbnRoRGVsdGFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5wYWRWYWx1ZShcbiAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVJbnB1dERhdGVTdWJqZWN0LnZhbHVlLmdldE1vbnRoKCkgKyAxXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0U3BhblNlbGVjdGlvbih0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVEYXRlKGlzVXA6IGJvb2xlYW4sIGlzRGF0ZVBpY2tlcjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlRGVsdGEgPSBpc1VwID8gMSA6IC0xO1xuICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKFxuICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuc2V0RGF0ZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuZ2V0RGF0ZSgpICsgZGF0ZURlbHRhXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHNwYW5FbGVtZW50ID0gaXNEYXRlUGlja2VyXG4gICAgICAgICAgICA/IHRoaXMuc3BhblR3by5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICA6IHRoaXMuc3Bhbk9uZS5uYXRpdmVFbGVtZW50O1xuICAgICAgICBzcGFuRWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnBhZFZhbHVlKFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuZ2V0RGF0ZSgpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0U3BhblNlbGVjdGlvbihzcGFuRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVZZWFyKGlzVXA6IGJvb2xlYW4sIGlzRGF0ZVBpY2tlcjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCB5ZWFyRGVsdGEgPSBpc1VwID8gMSA6IC0xO1xuICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKFxuICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuc2V0RnVsbFllYXIoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVJbnB1dERhdGVTdWJqZWN0LnZhbHVlLmdldEZ1bGxZZWFyKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgeWVhckRlbHRhXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHNwYW5FbGVtZW50ID0gaXNEYXRlUGlja2VyXG4gICAgICAgICAgICA/IHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgIDogdGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIHNwYW5FbGVtZW50LmlubmVySFRNTCA9IHRoaXMuZGF0ZVRpbWVJbnB1dERhdGVTdWJqZWN0LnZhbHVlXG4gICAgICAgICAgICAuZ2V0RnVsbFllYXIoKVxuICAgICAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgICAgIC5zbGljZSgtMik7XG4gICAgICAgIHRoaXMuc2V0U3BhblNlbGVjdGlvbihzcGFuRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVIb3Vycyhpc1VwOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGhvdXJzRGVsdGEgPSBpc1VwID8gMSA6IC0xO1xuICAgICAgICBsZXQgc2VsZWN0ZWRIb3VycyA9XG4gICAgICAgICAgICB0aGlzLmRhdGVUaW1lSW5wdXREYXRlU3ViamVjdC52YWx1ZS5nZXRIb3VycygpICsgaG91cnNEZWx0YTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRIb3VycyA9PT0gMCkgc2VsZWN0ZWRIb3VycyA9IDI0O1xuICAgICAgICBpZiAoc2VsZWN0ZWRIb3VycyA9PT0gLTEpIHNlbGVjdGVkSG91cnMgPSAyMztcblxuICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKFxuICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuc2V0SG91cnMoc2VsZWN0ZWRIb3VycylcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnBhZFZhbHVlKFxuICAgICAgICAgICAgc2VsZWN0ZWRIb3VycyA+IDEyID8gc2VsZWN0ZWRIb3VycyAtIDEyIDogc2VsZWN0ZWRIb3Vyc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnNldFNwYW5TZWxlY3Rpb24odGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID1cbiAgICAgICAgICAgIHNlbGVjdGVkSG91cnMgPiAxMSAmJiBzZWxlY3RlZEhvdXJzIDwgMjQgPyAnUE0nIDogJ0FNJztcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU1pbnV0ZXMoaXNVcDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCBtaW51dGVzRGVsdGEgPSBpc1VwID8gMSA6IC0xO1xuICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKFxuICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuc2V0TWludXRlcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuZ2V0TWludXRlcygpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZXNEZWx0YVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSB0aGlzLnBhZFZhbHVlKFxuICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUuZ2V0TWludXRlcygpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2V0U3BhblNlbGVjdGlvbih0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVBTVBNKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNwYW5UaHJlZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9XG4gICAgICAgICAgICB0aGlzLnNwYW5UaHJlZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9PT0gJ0FNJyA/ICdQTScgOiAnQU0nO1xuXG4gICAgICAgIGNvbnN0IGhvdXJzVG9BZGQgPVxuICAgICAgICAgICAgdGhpcy5zcGFuVGhyZWUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPT09ICdBTScgPyAtMTIgOiAxMjtcbiAgICAgICAgdGhpcy5zZXREYXRlVGltZUlucHV0RGF0ZShcbiAgICAgICAgICAgIG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVJbnB1dERhdGVTdWJqZWN0LnZhbHVlLnNldEhvdXJzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lSW5wdXREYXRlU3ViamVjdC52YWx1ZS5nZXRIb3VycygpICsgaG91cnNUb0FkZFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnNldFNwYW5TZWxlY3Rpb24odGhpcy5zcGFuVGhyZWUubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYWRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICgnMCcgKyB2YWx1ZSkuc2xpY2UoLTIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNOdW1iZXIoZXZ0OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGV2dCA9IGV2dCA/IGV2dCA6ICh3aW5kb3cuZXZlbnQgYXMgS2V5Ym9hcmRFdmVudCk7XG4gICAgICAgIGxldCBjaGFyQ29kZSA9IGV2dC53aGljaCA/IGV2dC53aGljaCA6IGV2dC5rZXlDb2RlO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGNoYXJDb2RlID49IDQ4ICYmIGNoYXJDb2RlIDw9IDU3KSB8fFxuICAgICAgICAgICAgKGNoYXJDb2RlID49IDk2ICYmIGNoYXJDb2RlIDw9IDEwNSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25Qb3BvdmVyU2hvd24oKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLnNldElzRm9jdXNJbnB1dCh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2hvd0RhdGVJbnB1dCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvblBvcG92ZXJIaWRkZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pbnB1dENvbmZpZy5kcm9wZG93bkxhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLnNldElzRm9jdXNJbnB1dChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmJsdXJPbkRhdGVUaW1lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGJsdXJPbkRhdGVUaW1lKCk6IHZvaWQge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kYXRlVGltZU1haW5UaW1lcik7XG4gICAgICAgIHRoaXMuZGF0ZVRpbWVNYWluVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLm5hbWUgPT09IElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWlzTmFOKHRoaXMuc3Bhbk9uZT8ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpICYmXG4gICAgICAgICAgICAgICAgICAgICFpc05hTih0aGlzLnNwYW5Ud28/Lm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MKSAmJlxuICAgICAgICAgICAgICAgICAgICAhaXNOYU4odGhpcy5zcGFuVGhyZWU/Lm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLmlzRnV0dXJlRGF0ZURpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtb21lbnQodGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUpLmlzQWZ0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9tZW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKHsgaW52YWxpZDogdHJ1ZSB9KTsgLy8gZG9uJ3QgYWNjZXB0IGZ1dHVyZSBkYXRlc1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLmV4cGlyZWREYXRlSW52YWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbWVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmlzQmVmb3JlKG1vbWVudCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsgLy8gZG9uJ3QgYWNjZXB0IGV4cGlyZWQgZGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2UuZGF0ZUNoYW5nZWQubmV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJ21tJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJ2RkJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGFuVGhyZWUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAneXknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNob3dEYXRlSW5wdXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PVxuICAgICAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVJfQkFOS19DQVJEXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFpc05hTih0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpICYmXG4gICAgICAgICAgICAgICAgICAgICFpc05hTih0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcuZXhwaXJlZERhdGVJbnZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtb21lbnQodGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWUpLmlzQmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbWVudCgpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBlckNvbnRyb2wuY29udHJvbD8uc2V0RXJyb3JzKHsgaW52YWxpZDogdHJ1ZSB9KTsgLy8gZG9uJ3QgYWNjZXB0IGV4cGlyZWQgZGF0ZXNcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLmRhdGVDaGFuZ2VkLm5leHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVN1YmplY3QudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5PbmUubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAnbW0nO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudC5pbm5lckhUTUwgPSAneXknO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERhdGVUaW1lSW5wdXREYXRlKG5ldyBEYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNob3dEYXRlSW5wdXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhaXNOYU4odGhpcy5zcGFuT25lLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MKSAmJlxuICAgICAgICAgICAgICAgICAgICAhaXNOYU4odGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmNhbGVuZGFyU2VydmljZS5kYXRlQ2hhbmdlZC5uZXh0KFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5kYXRlVGltZUlucHV0RGF0ZVxuICAgICAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Bhbk9uZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9ICdISCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BhblR3by5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9ICdNTSc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VGltZVBpY2tlclRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTaG93RGF0ZUlucHV0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRhdGVUaW1lTWFpblRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uSW5wdXQgPSAtMTtcbiAgICAgICAgICAgIHRoaXMubmV3SW5wdXRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCAxMDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RMYXN0T25lRm9yU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICAvLyBjbGVhclRpbWVvdXQodGhpcy53aG9sZUlucHV0U2VsZWN0aW9uKTtcbiAgICAgICAgbGV0IHJhbmdlLCBzZWxlY3Rpb247XG5cbiAgICAgICAgdGhpcy5zZXRTaG93RGF0ZUlucHV0KHRydWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gLTE7XG4gICAgICAgIHRoaXMuc2V0SXNGb2N1c0lucHV0KHRydWUpO1xuXG4gICAgICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uICYmIGRvY3VtZW50LmNyZWF0ZVJhbmdlKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgICByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLm5hbWUgIT09XG4gICAgICAgICAgICAgICAgSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5EQVRFX1BJQ0tFUl9CQU5LX0NBUkRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0KHRoaXMuc3BhblRocmVlLm5hdGl2ZUVsZW1lbnQsIDEpO1xuICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZCh0aGlzLnNwYW5UaHJlZS5uYXRpdmVFbGVtZW50LCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmFuZ2Uuc2V0U3RhcnQodGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQsIDEpO1xuICAgICAgICAgICAgICAgIHJhbmdlLnNldEVuZCh0aGlzLnNwYW5Ud28ubmF0aXZlRWxlbWVudCwgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGVjdGlvbj8ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICBzZWxlY3Rpb24/LmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGltZW91dENsZWFuZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRhdGVUaW1lTWFpblRpbWVyKTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZvY3VzQmx1cik7XG4gICAgICAgIH0sIDkwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0TGFzdE9uZUFmdGVyTW91c2VVcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PVxuICAgICAgICAgICAgSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5EQVRFX1BJQ0tFUl9CQU5LX0NBUkRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbklucHV0ID0gMTtcbiAgICAgICAgICAgIHRoaXMuc3BhblR3by5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLnNldFNwYW5TZWxlY3Rpb24odGhpcy5zcGFuVHdvLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25JbnB1dCA9IDI7XG4gICAgICAgICAgICB0aGlzLnNwYW5UaHJlZS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLnNldFNwYW5TZWxlY3Rpb24odGhpcy5zcGFuVGhyZWUubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFNob3dEYXRlSW5wdXQodHJ1ZSk7XG4gICAgICAgIHRoaXMudGltZW91dENsZWFuZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRhdGVUaW1lTWFpblRpbWVyKTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZvY3VzQmx1cik7XG4gICAgICAgIH0sIDkwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzRGF0ZVRpbWVQaWNrZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmlucHV0Q29uZmlnLm5hbWUgPT09IElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVIgfHxcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb25maWcubmFtZSA9PT0gSW5wdXRDb25maWdOYW1lU3RyaW5nRW51bS5USU1FX1BJQ0tFUiB8fFxuICAgICAgICAgICAgdGhpcy5pbnB1dENvbmZpZy5uYW1lID09PVxuICAgICAgICAgICAgICAgIElucHV0Q29uZmlnTmFtZVN0cmluZ0VudW0uREFURV9QSUNLRVJfQkFOS19DQVJEXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGVzdG9yeSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iXX0=