ca-components 1.0.78 → 1.0.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/ca-components.module.mjs +16 -4
- package/esm2022/lib/components/ca-activity-log-list/ca-activity-log-list.component.mjs +1 -1
- package/esm2022/lib/components/ca-app-tooltip-v2/ca-app-tooltip-v2.component.mjs +1 -1
- package/esm2022/lib/components/ca-filters/components/ca-dispatcher-filter/ca-dispatcher-filter.component.mjs +2 -2
- package/esm2022/lib/components/ca-filters/components/ca-money-filter/ca-money-filter.component.mjs +2 -2
- package/esm2022/lib/components/ca-filters/components/ca-state-filter/ca-state-filter.component.mjs +2 -2
- package/esm2022/lib/components/ca-filters/components/ca-trailer-type-filter/ca-trailer-type-filter.component.mjs +1 -1
- package/esm2022/lib/components/ca-filters/components/ca-truck-type-filter/ca-truck-type-filter.component.mjs +1 -1
- package/esm2022/lib/components/ca-filters/components/ca-user-filter/ca-user-filter.component.mjs +2 -2
- package/esm2022/lib/components/ca-input/base-classes/ca-input-base-helpres.mjs +237 -0
- package/esm2022/lib/components/ca-input/base-classes/ca-input-base.mjs +1020 -0
- package/esm2022/lib/components/ca-input/base-classes/ca-input-event-manager.mjs +24 -0
- package/esm2022/lib/components/ca-input/ca-input.component.mjs +53 -163
- package/esm2022/lib/components/ca-input/components/ca-input-clear/ca-input-clear.component.mjs +4 -4
- package/esm2022/lib/components/ca-input/components/ca-input-placeholder-icon/ca-input-placeholder-icon.component.mjs +11 -17
- package/esm2022/lib/components/ca-input/config/ca-input.config.mjs +1 -1
- package/esm2022/lib/components/ca-input/directives/caps-lock.directive.mjs +50 -0
- package/esm2022/lib/components/ca-input/directives/index.mjs +5 -1
- package/esm2022/lib/components/ca-input/directives/input-max-value.directive.mjs +53 -0
- package/esm2022/lib/components/ca-input/directives/min-max-value.directive.mjs +1 -1
- package/esm2022/lib/components/ca-input/directives/price_format.directive.mjs +41 -0
- package/esm2022/lib/components/ca-input/directives/restrict-input.directive.mjs +98 -0
- package/esm2022/lib/components/ca-input/enums/input-text-transform.enum.mjs +9 -0
- package/esm2022/lib/components/ca-input/input-test/input-test.component.mjs +178 -0
- package/esm2022/lib/components/ca-input/pipes/input-container-class.pipe.mjs +16 -16
- package/esm2022/lib/components/ca-input/pipes/input-datetime-picker-class.pipe.mjs +1 -1
- package/esm2022/lib/components/ca-input/pipes/input-error.pipe.mjs +18 -15
- package/esm2022/lib/components/ca-input/pipes/input-pattern.pipe.mjs +326 -0
- package/esm2022/lib/components/ca-input/services/index.mjs +1 -2
- package/esm2022/lib/components/ca-input/utils/constants/input-constants.mjs +102 -1
- package/esm2022/lib/components/ca-input-address-dropdown/ca-input-address-dropdown.component.mjs +2 -2
- package/esm2022/lib/components/ca-input-datetime-picker/ca-input-datetime-picker.component.mjs +809 -0
- package/esm2022/lib/components/ca-input-dropdown/ca-input-dropdown.component.mjs +18 -18
- package/esm2022/lib/components/ca-rating-review/ca-rating-review.component.mjs +2 -2
- package/esm2022/lib/components/ca-rating-review/components/ca-ratings-reviews-popup/ca-ratings-reviews-popup.component.mjs +1 -1
- package/esm2022/lib/components/ca-upload-files/components/ca-upload-file/ca-upload-file.component.mjs +1 -1
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/ca-components.mjs +7754 -7230
- package/fesm2022/ca-components.mjs.map +1 -1
- package/lib/ca-components.module.d.ts +32 -30
- package/lib/components/ca-filters/ca-filter.component.d.ts +2 -2
- package/lib/components/ca-input/base-classes/ca-input-base-helpres.d.ts +29 -0
- package/lib/components/ca-input/base-classes/ca-input-base.d.ts +82 -0
- package/lib/components/ca-input/base-classes/ca-input-event-manager.d.ts +16 -0
- package/lib/components/ca-input/ca-input.component.d.ts +30 -48
- package/lib/components/ca-input/components/ca-input-placeholder-icon/ca-input-placeholder-icon.component.d.ts +3 -7
- package/lib/components/ca-input/config/ca-input.config.d.ts +10 -1
- package/lib/components/ca-input/directives/caps-lock.directive.d.ts +14 -0
- package/lib/components/ca-input/directives/index.d.ts +4 -0
- package/lib/components/ca-input/directives/input-max-value.directive.d.ts +12 -0
- package/lib/components/ca-input/directives/price_format.directive.d.ts +11 -0
- package/lib/components/ca-input/directives/restrict-input.directive.d.ts +15 -0
- package/lib/components/ca-input/enums/input-text-transform.enum.d.ts +6 -0
- package/lib/components/ca-input/input-test/input-test.component.d.ts +47 -0
- package/lib/components/ca-input/pipes/input-container-class.pipe.d.ts +3 -3
- package/lib/components/ca-input/pipes/input-datetime-picker-class.pipe.d.ts +1 -1
- package/lib/components/ca-input/pipes/input-pattern.pipe.d.ts +31 -0
- package/lib/components/ca-input/services/index.d.ts +0 -1
- package/lib/components/ca-input/utils/constants/input-constants.d.ts +11 -0
- package/lib/components/ca-input-datetime-picker/ca-input-datetime-picker.component.d.ts +99 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/esm2022/lib/components/ca-input/components/ca-input-datetime-picker/ca-input-datetime-picker.component.mjs +0 -100
- package/esm2022/lib/components/ca-input/services/ca-input-state.service.mjs +0 -2173
- package/lib/components/ca-input/components/ca-input-datetime-picker/ca-input-datetime-picker.component.d.ts +0 -48
- 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=
|