ng-wsl-library 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/wsl-datetime-picker/wsl-datetime-picker.component.mjs +89 -108
- package/esm2022/lib/directives/wsl-tooltip.directive.mjs +3 -4
- package/fesm2022/ng-wsl-library.mjs +90 -110
- package/fesm2022/ng-wsl-library.mjs.map +1 -1
- package/lib/components/wsl-datetime-picker/wsl-datetime-picker.component.d.ts +13 -5
- package/package.json +1 -1
- package/src/lib/components/wsl-datetime-picker/wsl-datetime-picker.component.scss +11 -1
|
@@ -59,6 +59,7 @@ export class WslDatetimePickerComponent {
|
|
|
59
59
|
this.disabled = false;
|
|
60
60
|
this.disableCalendar = false;
|
|
61
61
|
this.calendarPosition = 'dynamic';
|
|
62
|
+
this.useFixedPosition = true;
|
|
62
63
|
this.placeholder = null;
|
|
63
64
|
this._allowedDates = [];
|
|
64
65
|
this.internalFormat = INPUT_DATE_FORMATS.DATE_ONLY;
|
|
@@ -80,6 +81,7 @@ export class WslDatetimePickerComponent {
|
|
|
80
81
|
this.calendarDays = [];
|
|
81
82
|
this.weekdayLabels = [];
|
|
82
83
|
this.calendarPositionClass = '';
|
|
84
|
+
this.calStyle = { position: 'absolute', top: null, left: null, right: null, bottom: null, maxWidth: null };
|
|
83
85
|
this.months = [];
|
|
84
86
|
this.years = [];
|
|
85
87
|
this.defaultYearRange = { start: 2000, end: 2050 };
|
|
@@ -168,19 +170,23 @@ export class WslDatetimePickerComponent {
|
|
|
168
170
|
if (changes['allowedDates']) {
|
|
169
171
|
this.generateCalendar();
|
|
170
172
|
}
|
|
173
|
+
if (changes['placeholder']) {
|
|
174
|
+
this.setPlaceholder();
|
|
175
|
+
this.cdr.markForCheck();
|
|
176
|
+
}
|
|
171
177
|
}
|
|
172
178
|
ngOnDestroy() {
|
|
173
179
|
if (this.languageSubscription) {
|
|
174
180
|
this.languageSubscription.unsubscribe();
|
|
175
181
|
}
|
|
182
|
+
this.resetCalStyles();
|
|
176
183
|
}
|
|
177
184
|
toggleCalendar(event) {
|
|
178
185
|
event.stopPropagation();
|
|
179
186
|
if (!this.disabled && !this.disableCalendar) {
|
|
180
187
|
this.showCalendar = !this.showCalendar;
|
|
181
188
|
if (this.showCalendar) {
|
|
182
|
-
if (!this.hasValidDate()
|
|
183
|
-
this.isCurrentDateDisabled()) {
|
|
189
|
+
if (!this.hasValidDate()) {
|
|
184
190
|
const last = this.getLastAvailableMonthYear();
|
|
185
191
|
if (last) {
|
|
186
192
|
this.currentYear = last.year;
|
|
@@ -191,8 +197,6 @@ export class WslDatetimePickerComponent {
|
|
|
191
197
|
this.generateCalendar();
|
|
192
198
|
if (this.calendarPosition === 'dynamic') {
|
|
193
199
|
this.calculateDynamicPosition();
|
|
194
|
-
// Update transforms for show state
|
|
195
|
-
setTimeout(() => this.updateCalendarTransforms(true), 10);
|
|
196
200
|
}
|
|
197
201
|
else {
|
|
198
202
|
this.calendarPositionClass = '';
|
|
@@ -214,6 +218,8 @@ export class WslDatetimePickerComponent {
|
|
|
214
218
|
}
|
|
215
219
|
calculateDynamicPosition() {
|
|
216
220
|
setTimeout(() => {
|
|
221
|
+
if (!this.showCalendar)
|
|
222
|
+
return;
|
|
217
223
|
const containerElement = this.elRef.nativeElement;
|
|
218
224
|
const calendarElement = containerElement?.querySelector('.calendar-popover');
|
|
219
225
|
if (!containerElement || !calendarElement)
|
|
@@ -228,114 +234,78 @@ export class WslDatetimePickerComponent {
|
|
|
228
234
|
const viewportWidth = window.innerWidth;
|
|
229
235
|
const viewportHeight = window.innerHeight;
|
|
230
236
|
const isMobile = viewportWidth <= 576;
|
|
231
|
-
const calendarWidth = isMobile
|
|
232
|
-
? Math.min(calendarElement.offsetWidth || 350, viewportWidth - 32)
|
|
233
|
-
: calendarElement.offsetWidth || 350;
|
|
234
|
-
const calendarHeight = calendarElement.offsetHeight || 400;
|
|
235
237
|
if (isMobile) {
|
|
236
|
-
|
|
238
|
+
const calendarWidth = Math.min(calendarElement.offsetWidth || 350, viewportWidth - 32);
|
|
239
|
+
const calendarHeight = calendarElement.offsetHeight || 400;
|
|
240
|
+
this.applyMobileStyles(iconRect, positioningRect, viewportWidth, calendarWidth);
|
|
237
241
|
const verticalClass = this.getVerticalPositionClass(containerRect, viewportHeight, calendarHeight);
|
|
238
242
|
this.calendarPositionClass = verticalClass;
|
|
239
243
|
}
|
|
244
|
+
else if (this.useFixedPosition) {
|
|
245
|
+
const calendarWidth = calendarElement.offsetWidth || 300;
|
|
246
|
+
const padding = 4;
|
|
247
|
+
const top = iconRect.bottom + padding;
|
|
248
|
+
let left = iconRect.right - calendarWidth;
|
|
249
|
+
const maxLeft = viewportWidth - calendarWidth - padding;
|
|
250
|
+
left = Math.max(padding, Math.min(left, maxLeft));
|
|
251
|
+
this.calStyle = {
|
|
252
|
+
position: 'fixed',
|
|
253
|
+
top: `${top}px`,
|
|
254
|
+
left: `${left}px`,
|
|
255
|
+
right: 'auto',
|
|
256
|
+
bottom: 'auto',
|
|
257
|
+
maxWidth: null,
|
|
258
|
+
};
|
|
259
|
+
this.calendarPositionClass = 'calendar-fixed';
|
|
260
|
+
}
|
|
240
261
|
else {
|
|
241
|
-
this.
|
|
242
|
-
|
|
243
|
-
const verticalClass = this.getVerticalPositionClass(containerRect, viewportHeight, calendarHeight);
|
|
244
|
-
this.calendarPositionClass =
|
|
245
|
-
`${horizontalClass} ${verticalClass}`.trim();
|
|
262
|
+
this.resetCalStyles();
|
|
263
|
+
this.calendarPositionClass = '';
|
|
246
264
|
}
|
|
247
265
|
this.cdr.markForCheck();
|
|
248
266
|
}, 0);
|
|
249
267
|
}
|
|
250
|
-
|
|
268
|
+
applyMobileStyles(iconRect, containerRect, viewportWidth, calendarWidth) {
|
|
251
269
|
const padding = 16;
|
|
252
270
|
const wouldOverflowRight = iconRect.right + calendarWidth + padding > viewportWidth;
|
|
253
271
|
const wouldOverflowLeft = iconRect.left - calendarWidth - padding < 0;
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
element.style.transform = '';
|
|
272
|
+
let left;
|
|
273
|
+
let right;
|
|
257
274
|
if (wouldOverflowRight && wouldOverflowLeft) {
|
|
258
275
|
const centeredLeft = (viewportWidth - calendarWidth) / 2;
|
|
259
276
|
const parentRelativeLeft = centeredLeft - containerRect.left;
|
|
260
277
|
const minRelativeLeft = 16 - containerRect.left;
|
|
261
|
-
|
|
262
|
-
|
|
278
|
+
left = `${Math.max(minRelativeLeft, parentRelativeLeft)}px`;
|
|
279
|
+
right = 'auto';
|
|
263
280
|
}
|
|
264
281
|
else if (wouldOverflowRight) {
|
|
265
282
|
const rightOffset = containerRect.right - (viewportWidth - padding);
|
|
266
|
-
|
|
267
|
-
|
|
283
|
+
left = 'unset';
|
|
284
|
+
right = `${Math.max(0, rightOffset)}px`;
|
|
268
285
|
}
|
|
269
286
|
else if (wouldOverflowLeft) {
|
|
270
287
|
const parentRelativeLeft = 16 - containerRect.left;
|
|
271
|
-
|
|
272
|
-
|
|
288
|
+
left = `${parentRelativeLeft}px`;
|
|
289
|
+
right = 'unset';
|
|
273
290
|
}
|
|
274
291
|
else {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
}
|
|
287
|
-
updateCalendarTransforms(isShow) {
|
|
288
|
-
const containerElement = this.elRef.nativeElement;
|
|
289
|
-
if (!containerElement)
|
|
290
|
-
return;
|
|
291
|
-
const calendarElement = containerElement.querySelector('.calendar-popover');
|
|
292
|
-
if (!calendarElement)
|
|
293
|
-
return;
|
|
294
|
-
const isMobile = window.innerWidth <= 576;
|
|
295
|
-
const isTopPosition = this.calendarPositionClass.includes('calendar-position-top');
|
|
296
|
-
if (isMobile &&
|
|
297
|
-
this.calendarPositionClass.includes('calendar-mobile-center')) {
|
|
298
|
-
// Dynamic mobile centering with proper transforms
|
|
299
|
-
if (isShow) {
|
|
300
|
-
calendarElement.style.transform = isTopPosition
|
|
301
|
-
? 'translateY(0)'
|
|
302
|
-
: 'translateY(0)';
|
|
303
|
-
}
|
|
304
|
-
else {
|
|
305
|
-
calendarElement.style.transform = isTopPosition
|
|
306
|
-
? 'translateY(10px)'
|
|
307
|
-
: 'translateY(-10px)';
|
|
308
|
-
}
|
|
309
|
-
}
|
|
292
|
+
left = 'unset';
|
|
293
|
+
right = '0';
|
|
294
|
+
}
|
|
295
|
+
this.calStyle = {
|
|
296
|
+
position: null,
|
|
297
|
+
top: null,
|
|
298
|
+
left,
|
|
299
|
+
right,
|
|
300
|
+
bottom: null,
|
|
301
|
+
maxWidth: `${calendarWidth}px`,
|
|
302
|
+
};
|
|
310
303
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
// Check if calendar would overflow when growing left from left edge
|
|
317
|
-
const wouldOverflowLeft = containerRect.left - calendarWidth - mobilePadding < 0;
|
|
318
|
-
if (wouldOverflowRight && wouldOverflowLeft) {
|
|
319
|
-
// No space on either side - center it
|
|
320
|
-
return 'calendar-mobile-center';
|
|
321
|
-
}
|
|
322
|
-
if (!wouldOverflowRight) {
|
|
323
|
-
// Fits growing right from icon - but still use right alignment to ensure padding
|
|
324
|
-
return 'calendar-align-right';
|
|
325
|
-
}
|
|
326
|
-
// Would overflow right but fits on left - align to left edge
|
|
327
|
-
return 'calendar-align-left';
|
|
328
|
-
}
|
|
329
|
-
// Desktop logic
|
|
330
|
-
const wouldOverflowRight = containerRect.right + calendarWidth > viewportWidth;
|
|
331
|
-
if (!wouldOverflowRight) {
|
|
332
|
-
return ''; // Default positioning (grows right from icon)
|
|
333
|
-
}
|
|
334
|
-
const spaceLeft = containerRect.left;
|
|
335
|
-
if (spaceLeft >= calendarWidth) {
|
|
336
|
-
return 'calendar-align-left'; // Grow right from left edge
|
|
337
|
-
}
|
|
338
|
-
return ''; // Use default as fallback
|
|
304
|
+
resetCalStyles() {
|
|
305
|
+
this.calStyle = {
|
|
306
|
+
position: 'absolute', top: null, left: null,
|
|
307
|
+
right: null, bottom: null, maxWidth: null,
|
|
308
|
+
};
|
|
339
309
|
}
|
|
340
310
|
getVerticalPositionClass(containerRect, viewportHeight, calendarHeight) {
|
|
341
311
|
const spaceBelow = viewportHeight - containerRect.bottom;
|
|
@@ -449,22 +419,26 @@ export class WslDatetimePickerComponent {
|
|
|
449
419
|
return this.isDateDisabled(today);
|
|
450
420
|
}
|
|
451
421
|
getLastAvailableMonthYear() {
|
|
452
|
-
|
|
453
|
-
this.allowedDates.length
|
|
454
|
-
(this.allowedDates.length === 1 && this.allowedDates[0].day === -1)
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
422
|
+
const hasRestrictedAllowedDates = this.allowedDates &&
|
|
423
|
+
this.allowedDates.length > 0 &&
|
|
424
|
+
!(this.allowedDates.length === 1 && this.allowedDates[0].day === -1);
|
|
425
|
+
if (hasRestrictedAllowedDates) {
|
|
426
|
+
let lastYear = 0;
|
|
427
|
+
let lastMonth = 0;
|
|
428
|
+
for (const d of this.allowedDates) {
|
|
429
|
+
const ym = d.year * 12 + d.month;
|
|
430
|
+
const lastYm = lastYear * 12 + lastMonth;
|
|
431
|
+
if (ym > lastYm) {
|
|
432
|
+
lastYear = d.year;
|
|
433
|
+
lastMonth = d.month;
|
|
434
|
+
}
|
|
465
435
|
}
|
|
436
|
+
return lastYear && lastMonth ? { year: lastYear, month: lastMonth } : null;
|
|
466
437
|
}
|
|
467
|
-
|
|
438
|
+
if (this.maxDate?.year && this.maxDate?.month) {
|
|
439
|
+
return { year: this.maxDate.year, month: this.maxDate.month };
|
|
440
|
+
}
|
|
441
|
+
return null;
|
|
468
442
|
}
|
|
469
443
|
isSameDate(date1, date2) {
|
|
470
444
|
return (date1.getFullYear() === date2.getFullYear() &&
|
|
@@ -589,12 +563,11 @@ export class WslDatetimePickerComponent {
|
|
|
589
563
|
}
|
|
590
564
|
setPlaceholder() {
|
|
591
565
|
if (this.placeholder && this.placeholder !== '') {
|
|
592
|
-
this._placeholder = this.placeholder
|
|
566
|
+
this._placeholder = this.placeholder;
|
|
593
567
|
}
|
|
594
568
|
else {
|
|
595
569
|
this._placeholder =
|
|
596
|
-
this.dateConfig?.placeholder
|
|
597
|
-
INPUT_DATE_FORMATS.DATE_ONLY.toLowerCase();
|
|
570
|
+
this.dateConfig?.placeholder || INPUT_DATE_FORMATS.DATE_ONLY;
|
|
598
571
|
}
|
|
599
572
|
if (this.showTimeControls) {
|
|
600
573
|
if (this._placeholder?.includes('hh:mm')) {
|
|
@@ -860,6 +833,12 @@ export class WslDatetimePickerComponent {
|
|
|
860
833
|
this.setDateStringModel();
|
|
861
834
|
this.cdr.markForCheck();
|
|
862
835
|
}
|
|
836
|
+
getDisplayPlaceholder() {
|
|
837
|
+
if (this.placeholder != null && this.placeholder !== '') {
|
|
838
|
+
return this.placeholder;
|
|
839
|
+
}
|
|
840
|
+
return this._placeholder;
|
|
841
|
+
}
|
|
863
842
|
hasValidDate() {
|
|
864
843
|
return !!(this.datetime &&
|
|
865
844
|
typeof this.datetime.year === 'number' &&
|
|
@@ -901,13 +880,13 @@ export class WslDatetimePickerComponent {
|
|
|
901
880
|
}
|
|
902
881
|
}
|
|
903
882
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WslDatetimePickerComponent, deps: [{ token: i0.Injector }, { token: i1.WslConfigService, optional: true }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
904
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: WslDatetimePickerComponent, selector: "wsl-datetime-picker", inputs: { dateString: "dateString", inputDatetimeFormat: "inputDatetimeFormat", hoursStep: "hoursStep", minutesStep: "minutesStep", secondsStep: "secondsStep", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", disableCalendar: "disableCalendar", calendarPosition: "calendarPosition", placeholder: "placeholder", allowedDates: "allowedDates", standardFormat: "standardFormat", seconds: "seconds" }, outputs: { monthChanged: "monthChanged", calendarStateChange: "calendarStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "window:resize": "onWindowResize($event)", "window:scroll": "onWindowScroll($event)" } }, providers: [
|
|
883
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: WslDatetimePickerComponent, selector: "wsl-datetime-picker", inputs: { dateString: "dateString", inputDatetimeFormat: "inputDatetimeFormat", hoursStep: "hoursStep", minutesStep: "minutesStep", secondsStep: "secondsStep", disabled: "disabled", maxDate: "maxDate", minDate: "minDate", disableCalendar: "disableCalendar", calendarPosition: "calendarPosition", useFixedPosition: "useFixedPosition", placeholder: "placeholder", allowedDates: "allowedDates", standardFormat: "standardFormat", seconds: "seconds" }, outputs: { monthChanged: "monthChanged", calendarStateChange: "calendarStateChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "window:resize": "onWindowResize($event)", "window:scroll": "onWindowScroll($event)" } }, providers: [
|
|
905
884
|
{
|
|
906
885
|
provide: NG_VALUE_ACCESSOR,
|
|
907
886
|
useExisting: forwardRef(() => WslDatetimePickerComponent),
|
|
908
887
|
multi: true,
|
|
909
888
|
},
|
|
910
|
-
], usesOnChanges: true, ngImport: i0, template: "<div class=\"datetime-picker-container\">\r\n <div class=\"input-container\">\r\n <input #dateInput [ngClass]=\"{\r\n 'ng-valid': ngControl?.valid === true,\r\n 'ng-invalid': ngControl?.invalid === true,\r\n 'ng-disabled': disabled\r\n }\" class=\"datetime-input\" (blur)=\"inputBlur()\" [placeholder]=\"_placeholder\" [ngModel]=\"getDisplayValue()\"\r\n (change)=\"onInputChange($event)\" [disabled]=\"disabled\" wslTooltip [tooltipIconOverlap]=\"12\"\r\n tooltipPlacement=\"top\" />\r\n </div>\r\n\r\n <button type=\"button\" class=\"calendar-icon\" [disabled]=\"disabled || disableCalendar\"\r\n [ngClass]=\"{ 'disabled-btn': disabled || disableCalendar }\" (click)=\"toggleCalendar($event)\">\r\n <i class=\"fa fa-calendar fa-lg\"></i>\r\n </button>\r\n\r\n <!-- Custom Calendar Popover -->\r\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\"\r\n [ngClass]=\"calendarPositionClass\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"popover-content\">\r\n <div *ngIf=\"!showTimePickerToggle\">\r\n <!-- Custom Date Picker -->\r\n <div class=\"custom-datepicker\">\r\n <div class=\"datepicker-header\">\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\r\n <i class=\"fa fa-chevron-left\"></i>\r\n </button>\r\n <div class=\"month-year-selects\">\r\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">\r\n {{ month }}\r\n </option>\r\n </select>\r\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let year of years\" [value]=\"year\">\r\n {{ year }}\r\n </option>\r\n </select>\r\n </div>\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\r\n <i class=\"fa fa-chevron-right\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"datepicker-calendar\">\r\n <div class=\"weekdays\">\r\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"days\">\r\n <div class=\"day-cell\" *ngFor=\"let day of calendarDays\" [class.other-month]=\"day.otherMonth\"\r\n [class.selected]=\"day.selected\" [class.disabled]=\"day.disabled\" [class.today]=\"day.today\"\r\n (click)=\"selectDate(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-time-btn\" type=\"button\"\r\n [disabled]=\"!hasValidDate() || disabled\" (click)=\"toggleDateTimeState($event)\">\r\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"showTimePickerToggle\">\r\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-calendar-btn\" type=\"button\"\r\n (click)=\"toggleDateTimeState($event)\">\r\n <i class=\"fa fa-calendar fa-lg\"></i>\r\n </button>\r\n\r\n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\r\n <!-- Custom Time Picker -->\r\n <div class=\"custom-timepicker\">\r\n <div class=\"time-controls\">\r\n <div class=\"time-field\">\r\n <label>{{ dateConfig?.tokens?.hours || \"HH\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.hours || 0\"\r\n (change)=\"onTimeFieldChange('hours', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"23\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator\">:</div>\r\n\r\n <div class=\"time-field\">\r\n <label>{{ dateConfig?.tokens?.minutes || \"mm\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.minutes || 0\"\r\n (change)=\"onTimeFieldChange('minutes', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"59\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\r\n\r\n <div class=\"time-field\" *ngIf=\"seconds\">\r\n <label>{{ dateConfig?.tokens?.seconds || \"ss\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.seconds || 0\"\r\n (change)=\"onTimeFieldChange('seconds', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"59\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Backdrop for closing popover -->\r\n<div class=\"calendar-backdrop\" [class.show]=\"showCalendar\" (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:stretch;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+.input-container>.datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-popover.calendar-position-top{top:auto;bottom:calc(100% + 2px);transform:translateY(10px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-bottom{top:calc(100% + 2px);bottom:auto}.calendar-popover.calendar-align-left{left:0;right:auto}.calendar-popover.calendar-align-right{left:auto;right:0}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.calendar-popover,.calendar-popover.calendar-mobile-center{max-width:calc(100vw - 32px)}.calendar-popover:not(.calendar-align-left):not(.calendar-align-right):not(.calendar-mobile-center){max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-left{left:16px;right:auto;max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-right{left:auto;right:16px;max-width:calc(100vw - 32px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-top.calendar-mobile-center.show{transform:translate(-50%)}.calendar-popover.calendar-position-top.calendar-mobile-center.hidden{transform:translate(-50%,10px)}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.WslTooltipDirective, selector: "[wslTooltip]", inputs: ["tooltipPlacement", "tooltipOffset", "tooltipIconOverlap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
889
|
+
], usesOnChanges: true, ngImport: i0, template: "<div class=\"datetime-picker-container\">\r\n <div class=\"input-container\">\r\n <input #dateInput [ngClass]=\"{\r\n 'ng-valid': ngControl?.valid === true,\r\n 'ng-invalid': ngControl?.invalid === true,\r\n 'ng-disabled': disabled\r\n }\" class=\"datetime-input\" (blur)=\"inputBlur()\" [placeholder]=\"getDisplayPlaceholder()\" [ngModel]=\"getDisplayValue()\"\r\n (change)=\"onInputChange($event)\" [disabled]=\"disabled\" wslTooltip [tooltipIconOverlap]=\"12\"\r\n tooltipPlacement=\"top\" />\r\n </div>\r\n\r\n <button type=\"button\" class=\"calendar-icon\" [disabled]=\"disabled || disableCalendar\"\r\n [ngClass]=\"{ 'disabled-btn': disabled || disableCalendar }\" (click)=\"toggleCalendar($event)\">\r\n <i class=\"fa fa-calendar fa-lg\"></i>\r\n </button>\r\n\r\n <!-- Custom Calendar Popover -->\r\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\"\r\n [ngClass]=\"calendarPositionClass\"\r\n [style.position]=\"calStyle.position\"\r\n [style.top]=\"calStyle.top\"\r\n [style.left]=\"calStyle.left\"\r\n [style.right]=\"calStyle.right\"\r\n [style.bottom]=\"calStyle.bottom\"\r\n [style.max-width]=\"calStyle.maxWidth\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"popover-content\">\r\n <div *ngIf=\"!showTimePickerToggle\">\r\n <!-- Custom Date Picker -->\r\n <div class=\"custom-datepicker\">\r\n <div class=\"datepicker-header\">\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\r\n <i class=\"fa fa-chevron-left\"></i>\r\n </button>\r\n <div class=\"month-year-selects\">\r\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">\r\n {{ month }}\r\n </option>\r\n </select>\r\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let year of years\" [value]=\"year\">\r\n {{ year }}\r\n </option>\r\n </select>\r\n </div>\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\r\n <i class=\"fa fa-chevron-right\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"datepicker-calendar\">\r\n <div class=\"weekdays\">\r\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"days\">\r\n <div class=\"day-cell\" *ngFor=\"let day of calendarDays\" [class.other-month]=\"day.otherMonth\"\r\n [class.selected]=\"day.selected\" [class.disabled]=\"day.disabled\" [class.today]=\"day.today\"\r\n (click)=\"selectDate(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-time-btn\" type=\"button\"\r\n [disabled]=\"!hasValidDate() || disabled\" (click)=\"toggleDateTimeState($event)\">\r\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"showTimePickerToggle\">\r\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-calendar-btn\" type=\"button\"\r\n (click)=\"toggleDateTimeState($event)\">\r\n <i class=\"fa fa-calendar fa-lg\"></i>\r\n </button>\r\n\r\n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\r\n <!-- Custom Time Picker -->\r\n <div class=\"custom-timepicker\">\r\n <div class=\"time-controls\">\r\n <div class=\"time-field\">\r\n <label>{{ dateConfig?.tokens?.hours || \"HH\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.hours || 0\"\r\n (change)=\"onTimeFieldChange('hours', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"23\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator\">:</div>\r\n\r\n <div class=\"time-field\">\r\n <label>{{ dateConfig?.tokens?.minutes || \"mm\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.minutes || 0\"\r\n (change)=\"onTimeFieldChange('minutes', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"59\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\r\n\r\n <div class=\"time-field\" *ngIf=\"seconds\">\r\n <label>{{ dateConfig?.tokens?.seconds || \"ss\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.seconds || 0\"\r\n (change)=\"onTimeFieldChange('seconds', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"59\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Backdrop for closing popover -->\r\n<div class=\"calendar-backdrop\" [class.show]=\"showCalendar\" (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:stretch;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1;text-transform:none}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+.input-container>.datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-popover.calendar-opens-above{transform:translateY(10px)}.calendar-popover.calendar-opens-above.show{transform:translateY(0)}.calendar-popover.calendar-position-top{top:auto;bottom:calc(100% + 2px);transform:translateY(10px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-bottom{top:calc(100% + 2px);bottom:auto}.calendar-popover.calendar-align-left{left:0;right:auto}.calendar-popover.calendar-align-right{left:auto;right:0}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.calendar-popover,.calendar-popover.calendar-mobile-center{max-width:calc(100vw - 32px)}.calendar-popover:not(.calendar-align-left):not(.calendar-align-right):not(.calendar-mobile-center){max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-left{left:16px;right:auto;max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-right{left:auto;right:16px;max-width:calc(100vw - 32px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-top.calendar-mobile-center.show{transform:translate(-50%)}.calendar-popover.calendar-position-top.calendar-mobile-center.hidden{transform:translate(-50%,10px)}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.WslTooltipDirective, selector: "[wslTooltip]", inputs: ["tooltipPlacement", "tooltipOffset", "tooltipIconOverlap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
911
890
|
}
|
|
912
891
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WslDatetimePickerComponent, decorators: [{
|
|
913
892
|
type: Component,
|
|
@@ -917,7 +896,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
917
896
|
useExisting: forwardRef(() => WslDatetimePickerComponent),
|
|
918
897
|
multi: true,
|
|
919
898
|
},
|
|
920
|
-
], template: "<div class=\"datetime-picker-container\">\r\n <div class=\"input-container\">\r\n <input #dateInput [ngClass]=\"{\r\n 'ng-valid': ngControl?.valid === true,\r\n 'ng-invalid': ngControl?.invalid === true,\r\n 'ng-disabled': disabled\r\n }\" class=\"datetime-input\" (blur)=\"inputBlur()\" [placeholder]=\"_placeholder\" [ngModel]=\"getDisplayValue()\"\r\n (change)=\"onInputChange($event)\" [disabled]=\"disabled\" wslTooltip [tooltipIconOverlap]=\"12\"\r\n tooltipPlacement=\"top\" />\r\n </div>\r\n\r\n <button type=\"button\" class=\"calendar-icon\" [disabled]=\"disabled || disableCalendar\"\r\n [ngClass]=\"{ 'disabled-btn': disabled || disableCalendar }\" (click)=\"toggleCalendar($event)\">\r\n <i class=\"fa fa-calendar fa-lg\"></i>\r\n </button>\r\n\r\n <!-- Custom Calendar Popover -->\r\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\"\r\n [ngClass]=\"calendarPositionClass\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"popover-content\">\r\n <div *ngIf=\"!showTimePickerToggle\">\r\n <!-- Custom Date Picker -->\r\n <div class=\"custom-datepicker\">\r\n <div class=\"datepicker-header\">\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\r\n <i class=\"fa fa-chevron-left\"></i>\r\n </button>\r\n <div class=\"month-year-selects\">\r\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">\r\n {{ month }}\r\n </option>\r\n </select>\r\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let year of years\" [value]=\"year\">\r\n {{ year }}\r\n </option>\r\n </select>\r\n </div>\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\r\n <i class=\"fa fa-chevron-right\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"datepicker-calendar\">\r\n <div class=\"weekdays\">\r\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"days\">\r\n <div class=\"day-cell\" *ngFor=\"let day of calendarDays\" [class.other-month]=\"day.otherMonth\"\r\n [class.selected]=\"day.selected\" [class.disabled]=\"day.disabled\" [class.today]=\"day.today\"\r\n (click)=\"selectDate(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-time-btn\" type=\"button\"\r\n [disabled]=\"!hasValidDate() || disabled\" (click)=\"toggleDateTimeState($event)\">\r\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"showTimePickerToggle\">\r\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-calendar-btn\" type=\"button\"\r\n (click)=\"toggleDateTimeState($event)\">\r\n <i class=\"fa fa-calendar fa-lg\"></i>\r\n </button>\r\n\r\n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\r\n <!-- Custom Time Picker -->\r\n <div class=\"custom-timepicker\">\r\n <div class=\"time-controls\">\r\n <div class=\"time-field\">\r\n <label>{{ dateConfig?.tokens?.hours || \"HH\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.hours || 0\"\r\n (change)=\"onTimeFieldChange('hours', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"23\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator\">:</div>\r\n\r\n <div class=\"time-field\">\r\n <label>{{ dateConfig?.tokens?.minutes || \"mm\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.minutes || 0\"\r\n (change)=\"onTimeFieldChange('minutes', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"59\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\r\n\r\n <div class=\"time-field\" *ngIf=\"seconds\">\r\n <label>{{ dateConfig?.tokens?.seconds || \"ss\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.seconds || 0\"\r\n (change)=\"onTimeFieldChange('seconds', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"59\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Backdrop for closing popover -->\r\n<div class=\"calendar-backdrop\" [class.show]=\"showCalendar\" (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:stretch;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+.input-container>.datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-popover.calendar-position-top{top:auto;bottom:calc(100% + 2px);transform:translateY(10px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-bottom{top:calc(100% + 2px);bottom:auto}.calendar-popover.calendar-align-left{left:0;right:auto}.calendar-popover.calendar-align-right{left:auto;right:0}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.calendar-popover,.calendar-popover.calendar-mobile-center{max-width:calc(100vw - 32px)}.calendar-popover:not(.calendar-align-left):not(.calendar-align-right):not(.calendar-mobile-center){max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-left{left:16px;right:auto;max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-right{left:auto;right:16px;max-width:calc(100vw - 32px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-top.calendar-mobile-center.show{transform:translate(-50%)}.calendar-popover.calendar-position-top.calendar-mobile-center.hidden{transform:translate(-50%,10px)}}\n"] }]
|
|
899
|
+
], template: "<div class=\"datetime-picker-container\">\r\n <div class=\"input-container\">\r\n <input #dateInput [ngClass]=\"{\r\n 'ng-valid': ngControl?.valid === true,\r\n 'ng-invalid': ngControl?.invalid === true,\r\n 'ng-disabled': disabled\r\n }\" class=\"datetime-input\" (blur)=\"inputBlur()\" [placeholder]=\"getDisplayPlaceholder()\" [ngModel]=\"getDisplayValue()\"\r\n (change)=\"onInputChange($event)\" [disabled]=\"disabled\" wslTooltip [tooltipIconOverlap]=\"12\"\r\n tooltipPlacement=\"top\" />\r\n </div>\r\n\r\n <button type=\"button\" class=\"calendar-icon\" [disabled]=\"disabled || disableCalendar\"\r\n [ngClass]=\"{ 'disabled-btn': disabled || disableCalendar }\" (click)=\"toggleCalendar($event)\">\r\n <i class=\"fa fa-calendar fa-lg\"></i>\r\n </button>\r\n\r\n <!-- Custom Calendar Popover -->\r\n <div class=\"calendar-popover\" [class.show]=\"showCalendar\" [class.hidden]=\"!showCalendar\"\r\n [ngClass]=\"calendarPositionClass\"\r\n [style.position]=\"calStyle.position\"\r\n [style.top]=\"calStyle.top\"\r\n [style.left]=\"calStyle.left\"\r\n [style.right]=\"calStyle.right\"\r\n [style.bottom]=\"calStyle.bottom\"\r\n [style.max-width]=\"calStyle.maxWidth\"\r\n (click)=\"$event.stopPropagation()\">\r\n <div class=\"popover-content\">\r\n <div *ngIf=\"!showTimePickerToggle\">\r\n <!-- Custom Date Picker -->\r\n <div class=\"custom-datepicker\">\r\n <div class=\"datepicker-header\">\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(-1)\" [disabled]=\"disabled\">\r\n <i class=\"fa fa-chevron-left\"></i>\r\n </button>\r\n <div class=\"month-year-selects\">\r\n <select class=\"month-select\" [(ngModel)]=\"currentMonth\" (change)=\"onMonthSelect($event)\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let month of months; let i = index\" [value]=\"i + 1\">\r\n {{ month }}\r\n </option>\r\n </select>\r\n <select class=\"year-select\" [(ngModel)]=\"currentYear\" (change)=\"onYearSelect($event)\"\r\n [disabled]=\"disabled\">\r\n <option *ngFor=\"let year of years\" [value]=\"year\">\r\n {{ year }}\r\n </option>\r\n </select>\r\n </div>\r\n <button type=\"button\" class=\"nav-btn\" (click)=\"navigateMonth(1)\" [disabled]=\"disabled\">\r\n <i class=\"fa fa-chevron-right\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"datepicker-calendar\">\r\n <div class=\"weekdays\">\r\n <div class=\"weekday\" *ngFor=\"let day of weekdayLabels\">\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"days\">\r\n <div class=\"day-cell\" *ngFor=\"let day of calendarDays\" [class.other-month]=\"day.otherMonth\"\r\n [class.selected]=\"day.selected\" [class.disabled]=\"day.disabled\" [class.today]=\"day.today\"\r\n (click)=\"selectDate(day)\">\r\n {{ day.day }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-time-btn\" type=\"button\"\r\n [disabled]=\"!hasValidDate() || disabled\" (click)=\"toggleDateTimeState($event)\">\r\n <i class=\"fa fa-clock fa-clock-o fa-lg\"></i>\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"showTimePickerToggle\">\r\n <button *ngIf=\"showTimeControls && !isDateOnly\" class=\"toggle-calendar-btn\" type=\"button\"\r\n (click)=\"toggleDateTimeState($event)\">\r\n <i class=\"fa fa-calendar fa-lg\"></i>\r\n </button>\r\n\r\n <div class=\"time-picker-container\" *ngIf=\"showTimeControls && !isDateOnly\">\r\n <!-- Custom Time Picker -->\r\n <div class=\"custom-timepicker\">\r\n <div class=\"time-controls\">\r\n <div class=\"time-field\">\r\n <label>{{ dateConfig?.tokens?.hours || \"HH\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', hoursStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.hours || 0\"\r\n (change)=\"onTimeFieldChange('hours', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"23\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('hours', -(hoursStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator\">:</div>\r\n\r\n <div class=\"time-field\">\r\n <label>{{ dateConfig?.tokens?.minutes || \"mm\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', minutesStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.minutes || 0\"\r\n (change)=\"onTimeFieldChange('minutes', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"59\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('minutes', -(minutesStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"time-separator\" *ngIf=\"seconds\">:</div>\r\n\r\n <div class=\"time-field\" *ngIf=\"seconds\">\r\n <label>{{ dateConfig?.tokens?.seconds || \"ss\" }}</label>\r\n <div class=\"time-input-group\">\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', secondsStep || 1)\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-up\"></i>\r\n </button>\r\n <input type=\"number\" class=\"time-input\" [value]=\"datetime?.seconds || 0\"\r\n (change)=\"onTimeFieldChange('seconds', $event)\" [disabled]=\"!hasValidDate() || disabled\" min=\"0\"\r\n max=\"59\" />\r\n <button type=\"button\" class=\"time-btn\" (click)=\"adjustTime('seconds', -(secondsStep || 1))\"\r\n [disabled]=\"!hasValidDate() || disabled\">\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Backdrop for closing popover -->\r\n<div class=\"calendar-backdrop\" [class.show]=\"showCalendar\" (click)=\"closeCalendar()\"></div>", styles: [".datetime-picker-container{display:flex;position:relative;width:auto;max-width:300px}.input-container{flex:1;position:relative}.datetime-input{display:block;width:100%;height:stretch;padding:.375rem 4px .375rem .75rem;font-size:1rem;font-weight:400;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem 0 0 .25rem;border-right:none;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;text-transform:none!important}.datetime-input::placeholder{color:#6c757d;opacity:1;text-transform:none}.datetime-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 4px #0d6efd}.datetime-input:disabled{background-color:#e9ecef;opacity:1}.datetime-input.ng-invalid{border-color:#dc3545}.datetime-input.ng-invalid:focus{box-shadow:0 0 4px #dc3545}.input-container:has(.datetime-input:focus)+.calendar-icon{border-top-color:#86b7fe;border-right-color:#86b7fe;border-bottom-color:#86b7fe;box-shadow:1px 0 4px #0d6efd}.input-container:has(.datetime-input:disabled)+.calendar-icon{border-top-color:#ced4da;border-right-color:#ced4da;border-bottom-color:#ced4da;background-color:#e9ecef}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon{border-top-color:#dc3545;border-right-color:#dc3545;border-bottom-color:#dc3545}.input-container:has(.datetime-input.ng-invalid)+.calendar-icon:has(+.input-container>.datetime-input:focus){box-shadow:1px 0 4px #dc3545}.calendar-icon{display:flex;align-items:center;justify-content:center;height:38px;width:auto;min-width:38px;padding:0 10px;background-color:#fff;border:1px solid #ced4da;border-radius:0 .25rem .25rem 0;z-index:1;cursor:pointer;position:relative;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.calendar-icon.disabled-btn{color:#6c757d;background-color:#e9ecef;cursor:not-allowed}.calendar-icon:hover:not(.disabled-btn){background-color:#f8f9fa}.fa-calendar,.fa-clock-o,.fa-clock{font-size:1em;line-height:1;vertical-align:middle}.calendar-popover{position:absolute;top:calc(100% + 2px);right:0;z-index:1060;display:block;min-width:300px;max-width:350px;font-family:inherit;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .5rem 1rem #00000026;opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .3s ease,visibility .3s ease,transform .3s ease}.calendar-popover.show{opacity:1;visibility:visible;transform:translateY(0)}.calendar-popover.hidden{opacity:0;visibility:hidden;transform:translateY(-10px)}.calendar-popover.calendar-opens-above{transform:translateY(10px)}.calendar-popover.calendar-opens-above.show{transform:translateY(0)}.calendar-popover.calendar-position-top{top:auto;bottom:calc(100% + 2px);transform:translateY(10px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-bottom{top:calc(100% + 2px);bottom:auto}.calendar-popover.calendar-align-left{left:0;right:auto}.calendar-popover.calendar-align-right{left:auto;right:0}.calendar-backdrop{position:fixed;top:0;left:0;width:100%;height:100%;z-index:1050;background-color:transparent;opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.calendar-backdrop.show{opacity:1;visibility:visible}.popover-content{padding:1rem}.custom-datepicker .datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.custom-datepicker .datepicker-header .nav-btn{background:none;border:none;padding:.25rem .5rem;cursor:pointer;border-radius:.25rem;color:#6c757d}.custom-datepicker .datepicker-header .nav-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-datepicker .datepicker-header .nav-btn:disabled{opacity:.5;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year{font-weight:600;color:#495057;min-width:120px;text-align:center}.custom-datepicker .datepicker-header .month-year-selects{display:flex;gap:8px;align-items:center;min-width:180px;justify-content:center}.custom-datepicker .datepicker-header .month-year-selects select{appearance:none;background-color:#fff;border:1px solid #ced4da;border-radius:4px;padding:4px 24px 4px 8px;font-size:14px;font-weight:500;color:#495057;cursor:pointer;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%23495057' d='M0 2l4 4 4-4z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;background-size:8px}.custom-datepicker .datepicker-header .month-year-selects select:hover:not(:disabled){border-color:#86b7fe}.custom-datepicker .datepicker-header .month-year-selects select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.custom-datepicker .datepicker-header .month-year-selects select:disabled{background-color:#e9ecef;cursor:not-allowed}.custom-datepicker .datepicker-header .month-year-selects .month-select{min-width:100px}.custom-datepicker .datepicker-header .month-year-selects .year-select{min-width:70px}.custom-datepicker .datepicker-calendar .weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.custom-datepicker .datepicker-calendar .weekdays .weekday{text-align:center;font-size:.75rem;font-weight:600;color:#6c757d;padding:.25rem}.custom-datepicker .datepicker-calendar .days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.custom-datepicker .datepicker-calendar .days .day-cell{width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:.25rem;font-size:.875rem;transition:all .15s ease-in-out}.custom-datepicker .datepicker-calendar .days .day-cell:hover:not(.disabled){background-color:#e9ecef}.custom-datepicker .datepicker-calendar .days .day-cell.other-month{color:#adb5bd}.custom-datepicker .datepicker-calendar .days .day-cell.selected{background-color:#007bff;color:#fff}.custom-datepicker .datepicker-calendar .days .day-cell.selected:hover{background-color:#0056b3}.custom-datepicker .datepicker-calendar .days .day-cell.today{background-color:#f8f9fa;border:1px solid #007bff;font-weight:600}.custom-datepicker .datepicker-calendar .days .day-cell.today.selected{background-color:#007bff;color:#fff;border-color:#007bff}.custom-datepicker .datepicker-calendar .days .day-cell.disabled{color:#adb5bd;cursor:not-allowed;background-color:transparent}.custom-datepicker .datepicker-calendar .days .day-cell.disabled:hover{background-color:transparent}.custom-timepicker .time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem 0}.custom-timepicker .time-controls .time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.custom-timepicker .time-controls .time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.custom-timepicker .time-controls .time-field .time-input-group{display:flex;flex-direction:column;align-items:center}.custom-timepicker .time-controls .time-field .time-input-group .time-btn{background:none;border:1px solid #dee2e6;width:24px;height:20px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:#6c757d;font-size:.75rem}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:first-child{border-radius:.25rem .25rem 0 0;border-bottom:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:last-child{border-radius:0 0 .25rem .25rem;border-top:none}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:hover:not(:disabled){background-color:#f8f9fa;color:#495057}.custom-timepicker .time-controls .time-field .time-input-group .time-btn:disabled{opacity:.5;cursor:not-allowed}.custom-timepicker .time-controls .time-field .time-input-group .time-input{width:50px;height:32px;text-align:center;border:1px solid #dee2e6;border-top:none;border-bottom:none;outline:none;font-size:.875rem}.custom-timepicker .time-controls .time-field .time-input-group .time-input:focus{border-color:#007bff;box-shadow:0 0 0 .2rem #007bff40}.custom-timepicker .time-controls .time-field .time-input-group .time-input:disabled{background-color:#e9ecef;opacity:1}.custom-timepicker .time-controls .time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:1rem .25rem 0;align-self:center}.custom-datepicker{width:100%}.datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 0}.nav-btn{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;font-size:.875rem;line-height:1;color:#495057;background-color:transparent;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.nav-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.nav-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.nav-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.month-year{font-weight:600;font-size:1rem;color:#212529}.datepicker-calendar{width:100%}.weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:.5rem}.weekday{padding:.5rem .25rem;text-align:center;font-weight:600;font-size:.75rem;color:#6c757d;background-color:#f8f9fa;border-radius:.25rem}.days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.day-cell{display:flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;padding:0;font-size:.875rem;line-height:1;color:#212529;background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.day-cell:hover:not(.disabled){background-color:#e9ecef;border-color:#adb5bd}.day-cell.selected{color:#fff;background-color:#007bff;border-color:#007bff}.day-cell.today{font-weight:600;color:#007bff;border-color:#007bff}.day-cell.other-month{color:#6c757d;opacity:.5}.day-cell.disabled{color:#6c757d;background-color:transparent;cursor:not-allowed;opacity:.5}.toggle-time-btn,.toggle-calendar-btn{display:block;width:100%;padding:.375rem .75rem;margin-top:1rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#6c757d;text-align:center;background-color:transparent;border:1px solid #6c757d;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.toggle-time-btn:hover:not(:disabled),.toggle-calendar-btn:hover:not(:disabled){color:#495057;background-color:#6c757d;border-color:#6c757d}.toggle-time-btn:focus,.toggle-calendar-btn:focus{outline:0;box-shadow:0 0 0 .2rem #6c757d40}.toggle-time-btn:disabled,.toggle-calendar-btn:disabled{color:#6c757d;background-color:transparent;border-color:#6c757d;cursor:not-allowed;opacity:.65}.toggle-time-btn .fa-clock .fa-clock-o,.toggle-time-btn .fa-calendar,.toggle-calendar-btn .fa-clock .fa-clock-o,.toggle-calendar-btn .fa-calendar{margin-right:.5rem}.time-picker-container{margin-top:auto;padding-top:1rem}.custom-timepicker{width:100%}.time-controls{display:flex;align-items:center;justify-content:center;gap:.5rem}.time-field{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-field label{font-size:.75rem;font-weight:600;color:#6c757d;margin:0}.time-input-group{display:flex;flex-direction:column;align-items:center;gap:.25rem}.time-btn{display:flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;font-size:.75rem;line-height:1;color:#495057;background-color:#f8f9fa;border:1px solid #ced4da;border-radius:.25rem;cursor:pointer;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}.time-btn:hover:not(:disabled){color:#212529;background-color:#e9ecef;border-color:#adb5bd}.time-btn:focus{outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-btn:disabled{color:#6c757d;background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.65}.time-input{width:3rem;padding:.25rem .5rem;font-size:.875rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:none;border:1px solid #ced4da;border-radius:.25rem;text-align:center;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.time-input:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .2rem #007bff40}.time-input:disabled{background-color:#e9ecef;opacity:1}.time-input::-webkit-outer-spin-button,.time-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.time-input[type=number]{-moz-appearance:textfield}.time-separator{font-size:1.25rem;font-weight:600;color:#495057;margin:0 .25rem 1.75rem;align-self:flex-end}.icon-calendar,.icon-clock,.icon-chevron-left,.icon-chevron-right,.icon-chevron-up,.icon-chevron-down{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.icon-calendar,.icon-clock{font-size:1.25rem}.icon-chevron-left,.icon-chevron-right{font-size:1.5rem;font-weight:700}.icon-chevron-up,.icon-chevron-down{font-size:.75rem}@media screen and (max-width: 576px){.calendar-popover,.calendar-popover.calendar-mobile-center{max-width:calc(100vw - 32px)}.calendar-popover:not(.calendar-align-left):not(.calendar-align-right):not(.calendar-mobile-center){max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-left{left:16px;right:auto;max-width:calc(100vw - 32px)}.calendar-popover.calendar-align-right{left:auto;right:16px;max-width:calc(100vw - 32px)}.calendar-popover.calendar-position-top.show{transform:translateY(0)}.calendar-popover.calendar-position-top.hidden{transform:translateY(10px)}.calendar-popover.calendar-position-top.calendar-mobile-center.show{transform:translate(-50%)}.calendar-popover.calendar-position-top.calendar-mobile-center.hidden{transform:translate(-50%,10px)}}\n"] }]
|
|
921
900
|
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.WslConfigService, decorators: [{
|
|
922
901
|
type: Optional
|
|
923
902
|
}] }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { dateString: [{
|
|
@@ -940,6 +919,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
940
919
|
type: Input
|
|
941
920
|
}], calendarPosition: [{
|
|
942
921
|
type: Input
|
|
922
|
+
}], useFixedPosition: [{
|
|
923
|
+
type: Input
|
|
943
924
|
}], placeholder: [{
|
|
944
925
|
type: Input
|
|
945
926
|
}], allowedDates: [{
|
|
@@ -962,4 +943,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
962
943
|
type: HostListener,
|
|
963
944
|
args: ['window:scroll', ['$event']]
|
|
964
945
|
}] } });
|
|
965
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy13c2wtbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvd3NsLWRhdGV0aW1lLXBpY2tlci93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXdzbC1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy93c2wtZGF0ZXRpbWUtcGlja2VyL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQ0wsYUFBYSxHQUlkLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFHWixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUlwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUNMLFVBQVUsRUFDVixrQkFBa0IsR0FDbkIsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7O0FBK0JuRCxNQUFNLE9BQU8sMEJBQTBCO0lBUXJDLElBQ0ksbUJBQW1CLENBQUMsS0FBeUI7UUFDL0MsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssS0FBSztZQUFFLE9BQU87UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNsQyxJQUFJLENBQUMsY0FB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V0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0YsWUFBWTtzQkFEZixLQUFLO2dCQXNCSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFzQkgsY0FBYztzQkFEakIsS0FBSztnQkFZRixPQUFPO3NCQURWLEtBQUs7Z0JBMkNOLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFtQjFDLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUXpDLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub29wIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7XHJcbiAgRGF0ZVRpbWVNb2RlbCxcclxuICBXc2xEYXRlU3RydWN0LFxyXG4gIFdzbERhdGVUaW1lU3RydWN0LFxyXG4gIFdzbFRpbWVTdHJ1Y3QsXHJcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3dzbC1kYXRlLXRpbWUubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxyXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gIE5nQ29udHJvbCxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdE9wdGlvbnMsXHJcbiAgSW5qZWN0b3IsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGdldERhdGVGb3JtYXRDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvd3NsLWRhdGUtZm9ybWF0cyc7XHJcbmltcG9ydCB7IERhdGVGb3JtYXRDb25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RhdGUtZm9ybWF0LmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFdzbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcvd3NsLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGdldEN1cnJlbnREYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZS10aW1lJztcclxuaW1wb3J0IHtcclxuICBUSU1FX1NURVBTLFxyXG4gIElOUFVUX0RBVEVfRk9STUFUUyxcclxufSBmcm9tICcuLi8uLi9jb25zdGFudHMvZGF0ZXRpbWUtcGlja2VyLmNvbnN0YW50cyc7XHJcblxyXG4vLyBXU0wgaW50ZXJmYWNlcyBmb3IgY29tcG9uZW50LXNwZWNpZmljIHR5cGVzXHJcbmV4cG9ydCBpbnRlcmZhY2UgV3NsRGF0ZXBpY2tlck5hdmlnYXRlRXZlbnQge1xyXG4gIGN1cnJlbnQ6IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH07XHJcbiAgbmV4dDogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhckRheSB7XHJcbiAgZGF5OiBudW1iZXI7XHJcbiAgbW9udGg6IG51bWJlcjtcclxuICB5ZWFyOiBudW1iZXI7XHJcbiAgb3RoZXJNb250aDogYm9vbGVhbjtcclxuICBzZWxlY3RlZDogYm9vbGVhbjtcclxuICBkaXNhYmxlZDogYm9vbGVhbjtcclxuICB0b2RheTogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd3c2wtZGF0ZXRpbWUtcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vd3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vd3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gV3NsRGF0ZXRpbWVQaWNrZXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFdzbERhdGV0aW1lUGlja2VyQ29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xyXG57XHJcbiAgQElucHV0KCkgZGF0ZVN0cmluZyE6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBfaW5wdXREYXRldGltZUZvcm1hdD86IHN0cmluZztcclxuICBwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGlucHV0RGF0ZXRpbWVGb3JtYXQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQgPT09IHZhbHVlKSByZXR1cm47XHJcbiAgICB0aGlzLl9pbnB1dERhdGV0aW1lRm9ybWF0ID0gdmFsdWU7XHJcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5wdXREYXRldGltZUZvcm1hdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBob3Vyc1N0ZXA6IG51bWJlciA9IFRJTUVfU1RFUFMuSE9VUlM7XHJcbiAgQElucHV0KCkgbWludXRlc1N0ZXA6IG51bWJlciA9IFRJTUVfU1RFUFMuTUlOVVRFUztcclxuICBASW5wdXQoKSBzZWNvbmRzU3RlcDogbnVtYmVyID0gVElNRV9TVEVQUy5TRUNPTkRTO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogV3NsRGF0ZVN0cnVjdDtcclxuICBASW5wdXQoKSBtaW5EYXRlOiBXc2xEYXRlU3RydWN0O1xyXG4gIEBJbnB1dCgpIGRpc2FibGVDYWxlbmRhciA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNhbGVuZGFyUG9zaXRpb246ICdzdGF0aWMnIHwgJ2R5bmFtaWMnID0gJ2R5bmFtaWMnO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfYWxsb3dlZERhdGVzOiBXc2xEYXRlU3RydWN0W10gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYWxsb3dlZERhdGVzKHZhbHVlOiBXc2xEYXRlU3RydWN0W10pIHtcclxuICAgIHRoaXMuX2FsbG93ZWREYXRlcyA9IHZhbHVlID8/IFtdO1xyXG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsb3dlZERhdGVzKCk6IFdzbERhdGVTdHJ1Y3RbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZERhdGVzO1xyXG4gIH1cclxuXHJcbiAgaW50ZXJuYWxGb3JtYXQ6IHN0cmluZyA9IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFk7XHJcbiAgcHJpdmF0ZSBfc3RhbmRhcmRGb3JtYXQ6IHN0cmluZyA9IElOUFVUX0RBVEVfRk9STUFUUy5FVV9EQVRFX0RBU0g7XHJcblxyXG4gIF9wbGFjZWhvbGRlciA9ICcnO1xyXG4gIHN0YXJ0RGF0ZTogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfSA9IHsgeWVhcjogMCwgbW9udGg6IDAgfTtcclxuICBzaG93VGltZVBpY2tlclRvZ2dsZSA9IGZhbHNlO1xyXG4gIGRhdGV0aW1lOiBEYXRlVGltZU1vZGVsID0gbmV3IERhdGVUaW1lTW9kZWwoKTtcclxuICBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xyXG4gIGRhdGVDb25maWchOiBEYXRlRm9ybWF0Q29uZmlnO1xyXG5cclxuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpIGNhbGVuZGFyU3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSBub29wO1xyXG4gIHByaXZhdGUgb25DaGFuZ2U6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xyXG4gIHByaXZhdGUgbGFuZ3VhZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBzaG93VGltZUNvbnRyb2xzID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfc2Vjb25kcyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcclxuXHJcbiAgc2hvd0NhbGVuZGFyID0gZmFsc2U7XHJcbiAgY3VycmVudFllYXI6IG51bWJlcjtcclxuICBjdXJyZW50TW9udGg6IG51bWJlcjtcclxuICBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcclxuICB3ZWVrZGF5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBjYWxlbmRhclBvc2l0aW9uQ2xhc3MgPSAnJztcclxuXHJcbiAgbW9udGhzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHllYXJzOiBudW1iZXJbXSA9IFtdO1xyXG4gIGRlZmF1bHRZZWFyUmFuZ2UgPSB7IHN0YXJ0OiAyMDAwLCBlbmQ6IDIwNTAgfTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc3RhbmRhcmRGb3JtYXQodmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuX3N0YW5kYXJkRm9ybWF0ID09PSB2YWx1ZSkgcmV0dXJuO1xyXG4gICAgdGhpcy5fc3RhbmRhcmRGb3JtYXQgPSB2YWx1ZTtcclxuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcclxuICB9XHJcblxyXG4gIGdldCBzdGFuZGFyZEZvcm1hdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YW5kYXJkRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc2Vjb25kcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuX3NlY29uZHMgPT09IHZhbHVlKSByZXR1cm47XHJcbiAgICB0aGlzLl9zZWNvbmRzID0gdmFsdWU7XHJcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2Vjb25kcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWNvbmRzO1xyXG4gIH1cclxuXHJcbiAgaXNEYXRlT25seSA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaW5qOiBJbmplY3RvcixcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29uZmlnU2VydmljZTogV3NsQ29uZmlnU2VydmljZSB8IG51bGwsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGdldEN1cnJlbnREYXRlKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRZZWFyID0gY3VycmVudERhdGUueWVhcjtcclxuICAgIHRoaXMuY3VycmVudE1vbnRoID0gY3VycmVudERhdGUubW9udGg7XHJcblxyXG4gICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKTtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlKSB7XHJcbiAgICAgIHRoaXMubGFuZ3VhZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmNvbmZpZ1NlcnZpY2VcclxuICAgICAgICAud2F0Y2hMYW5ndWFnZSgpXHJcbiAgICAgICAgLnN1YnNjcmliZSgobGFuZ3VhZ2UpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcobGFuZ3VhZ2UgfHwgJ2VuJyk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2Vla2RheUxhYmVscygpO1xyXG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdlZWtkYXlMYWJlbHMoKTtcclxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNob3dDYWxlbmRhcikge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IGNhbGVuZGFyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci1wb3BvdmVyJyk7XHJcbiAgICAgIGNvbnN0IGJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2FsZW5kYXItaWNvbicpO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNhbGVuZGFyRWxlbWVudCAmJlxyXG4gICAgICAgIGJ1dHRvbkVsZW1lbnQgJiZcclxuICAgICAgICAhY2FsZW5kYXJFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiZcclxuICAgICAgICAhYnV0dG9uRWxlbWVudC5jb250YWlucyh0YXJnZXQpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuY2xvc2VDYWxlbmRhcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvbldpbmRvd1Jlc2l6ZShfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIgJiYgdGhpcy5jYWxlbmRhclBvc2l0aW9uID09PSAnZHluYW1pYycpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVEeW5hbWljUG9zaXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxyXG4gIG9uV2luZG93U2Nyb2xsKF9ldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNob3dDYWxlbmRhciAmJiB0aGlzLmNhbGVuZGFyUG9zaXRpb24gPT09ICdkeW5hbWljJykge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZUR5bmFtaWNQb3NpdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm5nQ29udHJvbCA9XHJcbiAgICAgICAgdGhpcy5pbmouZ2V0KE5nQ29udHJvbCwgbnVsbCwgeyBvcHRpb25hbDogdHJ1ZSB9IGFzIEluamVjdE9wdGlvbnMpID8/IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVMYW5ndWFnZUNvbmZpZ3VyYXRpb24oKTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplTW9udGhzQW5kWWVhcnMoKTtcclxuICAgICAgdGhpcy51cGRhdGVXZWVrZGF5TGFiZWxzKCk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHRoaXMubmdDb250cm9sID0gbnVsbDtcclxuICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJyk7XHJcbiAgICAgIHRoaXMudXBkYXRlV2Vla2RheUxhYmVscygpO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVNb250aHNBbmRZZWFycygpO1xyXG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVMYW5ndWFnZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2UgPSB0aGlzLmNvbmZpZ1NlcnZpY2U/Lmxhbmd1YWdlO1xyXG4gICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKGN1cnJlbnRMYW5ndWFnZSB8fCAnZW4nKTtcclxuICAgICAgdGhpcy51cGRhdGVDb25maWd1cmF0aW9uKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpO1xyXG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydtaW5EYXRlJ10gfHwgY2hhbmdlc1snbWF4RGF0ZSddKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydhbGxvd2VkRGF0ZXMnXSkge1xyXG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubGFuZ3VhZ2VTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5sYW5ndWFnZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQ2FsZW5kYXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5kaXNhYmxlQ2FsZW5kYXIpIHtcclxuICAgICAgdGhpcy5zaG93Q2FsZW5kYXIgPSAhdGhpcy5zaG93Q2FsZW5kYXI7XHJcbiAgICAgIGlmICh0aGlzLnNob3dDYWxlbmRhcikge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICF0aGlzLmhhc1ZhbGlkRGF0ZSgpICYmXHJcbiAgICAgICAgICB0aGlzLmlzQ3VycmVudERhdGVEaXNhYmxlZCgpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBjb25zdCBsYXN0ID0gdGhpcy5nZXRMYXN0QXZhaWxhYmxlTW9udGhZZWFyKCk7XHJcbiAgICAgICAgICBpZiAobGFzdCkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRZZWFyID0gbGFzdC55ZWFyO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRNb250aCA9IGxhc3QubW9udGg7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0geyB5ZWFyOiBsYXN0LnllYXIsIG1vbnRoOiBsYXN0Lm1vbnRoIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gICAgICAgIGlmICh0aGlzLmNhbGVuZGFyUG9zaXRpb24gPT09ICdkeW5hbWljJykge1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVEeW5hbWljUG9zaXRpb24oKTtcclxuICAgICAgICAgIC8vIFVwZGF0ZSB0cmFuc2Zvcm1zIGZvciBzaG93IHN0YXRlXHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlQ2FsZW5kYXJUcmFuc2Zvcm1zKHRydWUpLCAxMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY2FsZW5kYXJQb3NpdGlvbkNsYXNzID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclN0YXRlQ2hhbmdlLmVtaXQodGhpcy5zaG93Q2FsZW5kYXIpO1xyXG4gICAgICB9LCAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlQ2FsZW5kYXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93VGltZVBpY2tlclRvZ2dsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2FsZW5kYXJTdGF0ZUNoYW5nZS5lbWl0KGZhbHNlKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYWxjdWxhdGVEeW5hbWljUG9zaXRpb24oKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgY29uc3QgY2FsZW5kYXJFbGVtZW50ID0gY29udGFpbmVyRWxlbWVudD8ucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAnLmNhbGVuZGFyLXBvcG92ZXInXHJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICBpZiAoIWNvbnRhaW5lckVsZW1lbnQgfHwgIWNhbGVuZGFyRWxlbWVudCkgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lckVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uaW5nQ29udGFpbmVyID0gY29udGFpbmVyRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICcuZGF0ZXRpbWUtcGlja2VyLWNvbnRhaW5lcidcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgcG9zaXRpb25pbmdSZWN0ID0gcG9zaXRpb25pbmdDb250YWluZXJcclxuICAgICAgICA/IHBvc2l0aW9uaW5nQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcbiAgICAgICAgOiBjb250YWluZXJSZWN0O1xyXG5cclxuICAgICAgY29uc3QgY2FsZW5kYXJJY29uRWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAnLmNhbGVuZGFyLWljb24nXHJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IGljb25SZWN0ID1cclxuICAgICAgICBjYWxlbmRhckljb25FbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB8fCBjb250YWluZXJSZWN0O1xyXG4gICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xyXG4gICAgICBjb25zdCBpc01vYmlsZSA9IHZpZXdwb3J0V2lkdGggPD0gNTc2O1xyXG5cclxuICAgICAgY29uc3QgY2FsZW5kYXJXaWR0aCA9IGlzTW9iaWxlXHJcbiAgICAgICAgPyBNYXRoLm1pbihjYWxlbmRhckVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMzUwLCB2aWV3cG9ydFdpZHRoIC0gMzIpXHJcbiAgICAgICAgOiBjYWxlbmRhckVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMzUwO1xyXG4gICAgICBjb25zdCBjYWxlbmRhckhlaWdodCA9IGNhbGVuZGFyRWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgNDAwO1xyXG5cclxuICAgICAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseU1vYmlsZVBvc2l0aW9uaW5nKFxyXG4gICAgICAgICAgY2FsZW5kYXJFbGVtZW50LFxyXG4gICAgICAgICAgaWNvblJlY3QsXHJcbiAgICAgICAgICBwb3NpdGlvbmluZ1JlY3QsXHJcbiAgICAgICAgICB2aWV3cG9ydFdpZHRoLFxyXG4gICAgICAgICAgY2FsZW5kYXJXaWR0aFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgdmVydGljYWxDbGFzcyA9IHRoaXMuZ2V0VmVydGljYWxQb3NpdGlvbkNsYXNzKFxyXG4gICAgICAgICAgY29udGFpbmVyUmVjdCxcclxuICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0LFxyXG4gICAgICAgICAgY2FsZW5kYXJIZWlnaHRcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJQb3NpdGlvbkNsYXNzID0gdmVydGljYWxDbGFzcztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNsZWFySW5saW5lU3R5bGVzKGNhbGVuZGFyRWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbENsYXNzID0gdGhpcy5nZXRIb3Jpem9udGFsUG9zaXRpb25DbGFzcyhcclxuICAgICAgICAgIGNvbnRhaW5lclJlY3QsXHJcbiAgICAgICAgICB2aWV3cG9ydFdpZHRoLFxyXG4gICAgICAgICAgY2FsZW5kYXJXaWR0aCxcclxuICAgICAgICAgIGlzTW9iaWxlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCB2ZXJ0aWNhbENsYXNzID0gdGhpcy5nZXRWZXJ0aWNhbFBvc2l0aW9uQ2xhc3MoXHJcbiAgICAgICAgICBjb250YWluZXJSZWN0LFxyXG4gICAgICAgICAgdmlld3BvcnRIZWlnaHQsXHJcbiAgICAgICAgICBjYWxlbmRhckhlaWdodFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclBvc2l0aW9uQ2xhc3MgPVxyXG4gICAgICAgICAgYCR7aG9yaXpvbnRhbENsYXNzfSAke3ZlcnRpY2FsQ2xhc3N9YC50cmltKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlNb2JpbGVQb3NpdGlvbmluZyhcclxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgaWNvblJlY3Q6IERPTVJlY3QsXHJcbiAgICBjb250YWluZXJSZWN0OiBET01SZWN0LFxyXG4gICAgdmlld3BvcnRXaWR0aDogbnVtYmVyLFxyXG4gICAgY2FsZW5kYXJXaWR0aDogbnVtYmVyXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBwYWRkaW5nID0gMTY7XHJcbiAgICBjb25zdCB3b3VsZE92ZXJmbG93UmlnaHQgPVxyXG4gICAgICBpY29uUmVjdC5yaWdodCArIGNhbGVuZGFyV2lkdGggKyBwYWRkaW5nID4gdmlld3BvcnRXaWR0aDtcclxuICAgIGNvbnN0IHdvdWxkT3ZlcmZsb3dMZWZ0ID0gaWNvblJlY3QubGVmdCAtIGNhbGVuZGFyV2lkdGggLSBwYWRkaW5nIDwgMDtcclxuICAgIGNvbnN0IG1pbkNhbGVuZGFyV2lkdGggPSAyODA7XHJcblxyXG4gICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xyXG5cclxuICAgIGlmICh3b3VsZE92ZXJmbG93UmlnaHQgJiYgd291bGRPdmVyZmxvd0xlZnQpIHtcclxuICAgICAgY29uc3QgY2VudGVyZWRMZWZ0ID0gKHZpZXdwb3J0V2lkdGggLSBjYWxlbmRhcldpZHRoKSAvIDI7XHJcbiAgICAgIGNvbnN0IHBhcmVudFJlbGF0aXZlTGVmdCA9IGNlbnRlcmVkTGVmdCAtIGNvbnRhaW5lclJlY3QubGVmdDtcclxuICAgICAgY29uc3QgbWluUmVsYXRpdmVMZWZ0ID0gMTYgLSBjb250YWluZXJSZWN0LmxlZnQ7XHJcblxyXG4gICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtNYXRoLm1heChtaW5SZWxhdGl2ZUxlZnQsIHBhcmVudFJlbGF0aXZlTGVmdCl9cHhgO1xyXG4gICAgICBlbGVtZW50LnN0eWxlLnJpZ2h0ID0gJ2F1dG8nO1xyXG4gICAgfSBlbHNlIGlmICh3b3VsZE92ZXJmbG93UmlnaHQpIHtcclxuICAgICAgY29uc3QgcmlnaHRPZmZzZXQgPSBjb250YWluZXJSZWN0LnJpZ2h0IC0gKHZpZXdwb3J0V2lkdGggLSBwYWRkaW5nKTtcclxuICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gJ3Vuc2V0JztcclxuICAgICAgZWxlbWVudC5zdHlsZS5yaWdodCA9IGAke01hdGgubWF4KDAsIHJpZ2h0T2Zmc2V0KX1weGA7XHJcbiAgICB9IGVsc2UgaWYgKHdvdWxkT3ZlcmZsb3dMZWZ0KSB7XHJcbiAgICAgIGNvbnN0IHBhcmVudFJlbGF0aXZlTGVmdCA9IDE2IC0gY29udGFpbmVyUmVjdC5sZWZ0O1xyXG4gICAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtwYXJlbnRSZWxhdGl2ZUxlZnR9cHhgO1xyXG4gICAgICBlbGVtZW50LnN0eWxlLnJpZ2h0ID0gJ3Vuc2V0JztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9ICd1bnNldCc7XHJcbiAgICAgIGVsZW1lbnQuc3R5bGUucmlnaHQgPSAnMCc7XHJcbiAgICB9XHJcblxyXG4gICAgZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9IGAke2NhbGVuZGFyV2lkdGh9cHhgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhcklubGluZVN0eWxlcyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gJyc7XHJcbiAgICBlbGVtZW50LnN0eWxlLnJpZ2h0ID0gJyc7XHJcbiAgICBlbGVtZW50LnN0eWxlLm1heFdpZHRoID0gJyc7XHJcbiAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xyXG4gICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDYWxlbmRhclRyYW5zZm9ybXMoaXNTaG93OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFjb250YWluZXJFbGVtZW50KSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY2FsZW5kYXJFbGVtZW50ID0gY29udGFpbmVyRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAnLmNhbGVuZGFyLXBvcG92ZXInXHJcbiAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCFjYWxlbmRhckVsZW1lbnQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDU3NjtcclxuICAgIGNvbnN0IGlzVG9wUG9zaXRpb24gPSB0aGlzLmNhbGVuZGFyUG9zaXRpb25DbGFzcy5pbmNsdWRlcyhcclxuICAgICAgJ2NhbGVuZGFyLXBvc2l0aW9uLXRvcCdcclxuICAgICk7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBpc01vYmlsZSAmJlxyXG4gICAgICB0aGlzLmNhbGVuZGFyUG9zaXRpb25DbGFzcy5pbmNsdWRlcygnY2FsZW5kYXItbW9iaWxlLWNlbnRlcicpXHJcbiAgICApIHtcclxuICAgICAgLy8gRHluYW1pYyBtb2JpbGUgY2VudGVyaW5nIHdpdGggcHJvcGVyIHRyYW5zZm9ybXNcclxuICAgICAgaWYgKGlzU2hvdykge1xyXG4gICAgICAgIGNhbGVuZGFyRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBpc1RvcFBvc2l0aW9uXHJcbiAgICAgICAgICA/ICd0cmFuc2xhdGVZKDApJ1xyXG4gICAgICAgICAgOiAndHJhbnNsYXRlWSgwKSc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2FsZW5kYXJFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGlzVG9wUG9zaXRpb25cclxuICAgICAgICAgID8gJ3RyYW5zbGF0ZVkoMTBweCknXHJcbiAgICAgICAgICA6ICd0cmFuc2xhdGVZKC0xMHB4KSc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SG9yaXpvbnRhbFBvc2l0aW9uQ2xhc3MoXHJcbiAgICBjb250YWluZXJSZWN0OiBET01SZWN0LFxyXG4gICAgdmlld3BvcnRXaWR0aDogbnVtYmVyLFxyXG4gICAgY2FsZW5kYXJXaWR0aDogbnVtYmVyLFxyXG4gICAgaXNNb2JpbGU6IGJvb2xlYW5cclxuICApOiBzdHJpbmcge1xyXG4gICAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICAgIGNvbnN0IG1vYmlsZVBhZGRpbmcgPSAxNjtcclxuXHJcbiAgICAgIC8vIENoZWNrIGlmIGNhbGVuZGFyIHdvdWxkIG92ZXJmbG93IHdoZW4gZ3Jvd2luZyByaWdodCBmcm9tIGljb24gKGRlZmF1bHQpXHJcbiAgICAgIGNvbnN0IHdvdWxkT3ZlcmZsb3dSaWdodCA9XHJcbiAgICAgICAgY29udGFpbmVyUmVjdC5yaWdodCArIGNhbGVuZGFyV2lkdGggKyBtb2JpbGVQYWRkaW5nID4gdmlld3BvcnRXaWR0aDtcclxuXHJcbiAgICAgIC8vIENoZWNrIGlmIGNhbGVuZGFyIHdvdWxkIG92ZXJmbG93IHdoZW4gZ3Jvd2luZyBsZWZ0IGZyb20gbGVmdCBlZGdlXHJcbiAgICAgIGNvbnN0IHdvdWxkT3ZlcmZsb3dMZWZ0ID1cclxuICAgICAgICBjb250YWluZXJSZWN0LmxlZnQgLSBjYWxlbmRhcldpZHRoIC0gbW9iaWxlUGFkZGluZyA8IDA7XHJcblxyXG4gICAgICBpZiAod291bGRPdmVyZmxvd1JpZ2h0ICYmIHdvdWxkT3ZlcmZsb3dMZWZ0KSB7XHJcbiAgICAgICAgLy8gTm8gc3BhY2Ugb24gZWl0aGVyIHNpZGUgLSBjZW50ZXIgaXRcclxuICAgICAgICByZXR1cm4gJ2NhbGVuZGFyLW1vYmlsZS1jZW50ZXInO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXdvdWxkT3ZlcmZsb3dSaWdodCkge1xyXG4gICAgICAgIC8vIEZpdHMgZ3Jvd2luZyByaWdodCBmcm9tIGljb24gLSBidXQgc3RpbGwgdXNlIHJpZ2h0IGFsaWdubWVudCB0byBlbnN1cmUgcGFkZGluZ1xyXG4gICAgICAgIHJldHVybiAnY2FsZW5kYXItYWxpZ24tcmlnaHQnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBXb3VsZCBvdmVyZmxvdyByaWdodCBidXQgZml0cyBvbiBsZWZ0IC0gYWxpZ24gdG8gbGVmdCBlZGdlXHJcbiAgICAgIHJldHVybiAnY2FsZW5kYXItYWxpZ24tbGVmdCc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGVza3RvcCBsb2dpY1xyXG4gICAgY29uc3Qgd291bGRPdmVyZmxvd1JpZ2h0ID1cclxuICAgICAgY29udGFpbmVyUmVjdC5yaWdodCArIGNhbGVuZGFyV2lkdGggPiB2aWV3cG9ydFdpZHRoO1xyXG5cclxuICAgIGlmICghd291bGRPdmVyZmxvd1JpZ2h0KSB7XHJcbiAgICAgIHJldHVybiAnJzsgLy8gRGVmYXVsdCBwb3NpdGlvbmluZyAoZ3Jvd3MgcmlnaHQgZnJvbSBpY29uKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNwYWNlTGVmdCA9IGNvbnRhaW5lclJlY3QubGVmdDtcclxuICAgIGlmIChzcGFjZUxlZnQgPj0gY2FsZW5kYXJXaWR0aCkge1xyXG4gICAgICByZXR1cm4gJ2NhbGVuZGFyLWFsaWduLWxlZnQnOyAvLyBHcm93IHJpZ2h0IGZyb20gbGVmdCBlZGdlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICcnOyAvLyBVc2UgZGVmYXVsdCBhcyBmYWxsYmFja1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRWZXJ0aWNhbFBvc2l0aW9uQ2xhc3MoXHJcbiAgICBjb250YWluZXJSZWN0OiBET01SZWN0LFxyXG4gICAgdmlld3BvcnRIZWlnaHQ6IG51bWJlcixcclxuICAgIGNhbGVuZGFySGVpZ2h0OiBudW1iZXJcclxuICApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc3BhY2VCZWxvdyA9IHZpZXdwb3J0SGVpZ2h0IC0gY29udGFpbmVyUmVjdC5ib3R0b207XHJcbiAgICBjb25zdCBzcGFjZUFib3ZlID0gY29udGFpbmVyUmVjdC50b3A7XHJcblxyXG4gICAgaWYgKHNwYWNlQmVsb3cgPj0gY2FsZW5kYXJIZWlnaHQpIHJldHVybiAnY2FsZW5kYXItcG9zaXRpb24tYm90dG9tJztcclxuICAgIGlmIChzcGFjZUFib3ZlID49IGNhbGVuZGFySGVpZ2h0KSByZXR1cm4gJ2NhbGVuZGFyLXBvc2l0aW9uLXRvcCc7XHJcbiAgICByZXR1cm4gc3BhY2VCZWxvdyA+PSBzcGFjZUFib3ZlXHJcbiAgICAgID8gJ2NhbGVuZGFyLXBvc2l0aW9uLWJvdHRvbSdcclxuICAgICAgOiAnY2FsZW5kYXItcG9zaXRpb24tdG9wJztcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlTW9udGgoZGlyZWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudE1vbnRoICs9IGRpcmVjdGlvbjtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA+IDEyKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gMTtcclxuICAgICAgdGhpcy5jdXJyZW50WWVhcisrO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRNb250aCA8IDEpIHtcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxMjtcclxuICAgICAgdGhpcy5jdXJyZW50WWVhci0tO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gICAgdGhpcy5tb250aENoYW5nZWQuZW1pdCh0aGlzLmN1cnJlbnRNb250aCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdERhdGUoZGF5OiBDYWxlbmRhckRheSk6IHZvaWQge1xyXG4gICAgaWYgKGRheS5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkRGF0ZTogV3NsRGF0ZVN0cnVjdCA9IHtcclxuICAgICAgeWVhcjogZGF5LnllYXIsXHJcbiAgICAgIG1vbnRoOiBkYXkubW9udGgsXHJcbiAgICAgIGRheTogZGF5LmRheSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5vbkRhdGVDaGFuZ2Uoc2VsZWN0ZWREYXRlKTtcclxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZUNhbGVuZGFyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlyc3REYXkgPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCAtIDEsIDEpO1xyXG4gICAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoZmlyc3REYXkpO1xyXG4gICAgY29uc3Qgd2Vla1N0YXJ0ID0gKHRoaXMuZGF0ZUNvbmZpZz8ud2Vla1N0YXJ0ID8/IDEpICUgNztcclxuICAgIGNvbnN0IGRheU9mV2VlayA9IChmaXJzdERheS5nZXREYXkoKSArIDcgLSB3ZWVrU3RhcnQpICUgNztcclxuICAgIHN0YXJ0RGF0ZS5zZXREYXRlKHN0YXJ0RGF0ZS5nZXREYXRlKCkgLSBkYXlPZldlZWspO1xyXG5cclxuICAgIHRoaXMuY2FsZW5kYXJEYXlzID0gW107XHJcbiAgICBjb25zdCB0b2RheURhdGUgPSBnZXRDdXJyZW50RGF0ZSgpO1xyXG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSh0b2RheURhdGUueWVhciwgdG9kYXlEYXRlLm1vbnRoIC0gMSwgdG9kYXlEYXRlLmRheSk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcclxuICAgICAgY3VycmVudERhdGUuc2V0RGF0ZShzdGFydERhdGUuZ2V0RGF0ZSgpICsgaSk7XHJcblxyXG4gICAgICBjb25zdCBkYXlTdHJ1Y3Q6IFdzbERhdGVTdHJ1Y3QgPSB7XHJcbiAgICAgICAgeWVhcjogY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgICBtb250aDogY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEsXHJcbiAgICAgICAgZGF5OiBjdXJyZW50RGF0ZS5nZXREYXRlKCksXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCBjYWxlbmRhckRheTogQ2FsZW5kYXJEYXkgPSB7XHJcbiAgICAgICAgZGF5OiBjdXJyZW50RGF0ZS5nZXREYXRlKCksXHJcbiAgICAgICAgbW9udGg6IGN1cnJlbnREYXRlLmdldE1vbnRoKCkgKyAxLFxyXG4gICAgICAgIHllYXI6IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgICAgb3RoZXJNb250aDogY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEgIT09IHRoaXMuY3VycmVudE1vbnRoLFxyXG4gICAgICAgIHNlbGVjdGVkOiB0aGlzLmlzRGF0ZVNlbGVjdGVkKGRheVN0cnVjdCksXHJcbiAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF5U3RydWN0KSxcclxuICAgICAgICB0b2RheTogdGhpcy5pc1NhbWVEYXRlKGN1cnJlbnREYXRlLCB0b2RheSksXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLmNhbGVuZGFyRGF5cy5wdXNoKGNhbGVuZGFyRGF5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNEYXRlU2VsZWN0ZWQoZGF0ZTogV3NsRGF0ZVN0cnVjdCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhKFxyXG4gICAgICB0aGlzLmRhdGV0aW1lICYmXHJcbiAgICAgIHRoaXMuZGF0ZXRpbWUueWVhciA9PT0gZGF0ZS55ZWFyICYmXHJcbiAgICAgIHRoaXMuZGF0ZXRpbWUubW9udGggPT09IGRhdGUubW9udGggJiZcclxuICAgICAgdGhpcy5kYXRldGltZS5kYXkgPT09IGRhdGUuZGF5XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0RhdGVEaXNhYmxlZChkYXRlOiBXc2xEYXRlU3RydWN0KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBzZWxlY3RlZERhdGUgPSBuZXcgRGF0ZShkYXRlLnllYXIsIGRhdGUubW9udGggLSAxLCBkYXRlLmRheSk7XHJcbiAgICBjb25zdCB0b2RheURhdGUgPSBnZXRDdXJyZW50RGF0ZSgpO1xyXG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSh0b2RheURhdGUueWVhciwgdG9kYXlEYXRlLm1vbnRoIC0gMSwgdG9kYXlEYXRlLmRheSk7XHJcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuXHJcbiAgICBpZiAodGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgIGNvbnN0IG1heERhdGUgPSBuZXcgRGF0ZShcclxuICAgICAgICB0aGlzLm1heERhdGUueWVhcixcclxuICAgICAgICB0aGlzLm1heERhdGUubW9udGggLSAxLFxyXG4gICAgICAgIHRoaXMubWF4RGF0ZS5kYXlcclxuICAgICAgKTtcclxuICAgICAgaWYgKHNlbGVjdGVkRGF0ZSA+IG1heERhdGUpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm1pbkRhdGUpIHtcclxuICAgICAgY29uc3QgbWluRGF0ZSA9IG5ldyBEYXRlKFxyXG4gICAgICAgIHRoaXMubWluRGF0ZS55ZWFyLFxyXG4gICAgICAgIHRoaXMubWluRGF0ZS5tb250aCAtIDEsXHJcbiAgICAgICAgdGhpcy5taW5EYXRlLmRheVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoc2VsZWN0ZWREYXRlIDwgbWluRGF0ZSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmFsbG93ZWREYXRlcyAmJlxyXG4gICAgICB0aGlzLmFsbG93ZWREYXRlcy5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXNbMF0uZGF5ID09PSAtMVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBzZWxlY3RlZERhdGUgPiB0b2RheTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuYWxsb3dlZERhdGVzIHx8IHRoaXMuYWxsb3dlZERhdGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc0FsbG93ZWQgPSB0aGlzLmFsbG93ZWREYXRlcy5maW5kKFxyXG4gICAgICAoZGF5QWxsb3dlZCkgPT5cclxuICAgICAgICBkYXlBbGxvd2VkLnllYXIgPT09IGRhdGUueWVhciAmJlxyXG4gICAgICAgIGRheUFsbG93ZWQubW9udGggPT09IGRhdGUubW9udGggJiZcclxuICAgICAgICBkYXlBbGxvd2VkLmRheSA9PT0gZGF0ZS5kYXlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuICFpc0FsbG93ZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzQ3VycmVudERhdGVEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMuYWxsb3dlZERhdGVzIHx8XHJcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzLmxlbmd0aCA9PT0gMCB8fFxyXG4gICAgICAodGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID09PSAxICYmIHRoaXMuYWxsb3dlZERhdGVzWzBdLmRheSA9PT0gLTEpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdG9kYXkgPSBnZXRDdXJyZW50RGF0ZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuaXNEYXRlRGlzYWJsZWQodG9kYXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMYXN0QXZhaWxhYmxlTW9udGhZZWFyKCk6IHtcclxuICAgIHllYXI6IG51bWJlcjtcclxuICAgIG1vbnRoOiBudW1iZXI7XHJcbiAgfSB8IG51bGwge1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5hbGxvd2VkRGF0ZXMgfHxcclxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID09PSAwIHx8XHJcbiAgICAgICh0aGlzLmFsbG93ZWREYXRlcy5sZW5ndGggPT09IDEgJiYgdGhpcy5hbGxvd2VkRGF0ZXNbMF0uZGF5ID09PSAtMSlcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGxldCBsYXN0WWVhciA9IDA7XHJcbiAgICBsZXQgbGFzdE1vbnRoID0gMDtcclxuICAgIGZvciAoY29uc3QgZCBvZiB0aGlzLmFsbG93ZWREYXRlcykge1xyXG4gICAgICBjb25zdCB5bSA9IGQueWVhciAqIDEyICsgZC5tb250aDtcclxuICAgICAgY29uc3QgbGFzdFltID0gbGFzdFllYXIgKiAxMiArIGxhc3RNb250aDtcclxuICAgICAgaWYgKHltID4gbGFzdFltKSB7XHJcbiAgICAgICAgbGFzdFllYXIgPSBkLnllYXI7XHJcbiAgICAgICAgbGFzdE1vbnRoID0gZC5tb250aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxhc3RZZWFyICYmIGxhc3RNb250aCA/IHsgeWVhcjogbGFzdFllYXIsIG1vbnRoOiBsYXN0TW9udGggfSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzU2FtZURhdGUoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBkYXRlMS5nZXRGdWxsWWVhcigpID09PSBkYXRlMi5nZXRGdWxsWWVhcigpICYmXHJcbiAgICAgIGRhdGUxLmdldE1vbnRoKCkgPT09IGRhdGUyLmdldE1vbnRoKCkgJiZcclxuICAgICAgZGF0ZTEuZ2V0RGF0ZSgpID09PSBkYXRlMi5nZXREYXRlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRNb250aE5hbWUobW9udGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtb250aEluZGV4ID0gbW9udGggLSAxO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5kYXRlQ29uZmlnPy5tb250aE5hbWVzPy5bbW9udGhJbmRleF0gfHxcclxuICAgICAgZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKS5tb250aE5hbWVzW21vbnRoSW5kZXhdXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVXZWVrZGF5TGFiZWxzKCk6IHZvaWQge1xyXG4gICAgdGhpcy53ZWVrZGF5TGFiZWxzID1cclxuICAgICAgdGhpcy5kYXRlQ29uZmlnPy53ZWVrZGF5TGFiZWxzIHx8IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJykud2Vla2RheUxhYmVscztcclxuICB9XHJcblxyXG4gIGFkanVzdFRpbWUoZmllbGQ6ICdob3VycycgfCAnbWludXRlcycgfCAnc2Vjb25kcycsIHN0ZXA6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLmRhdGV0aW1lW2ZpZWxkXSB8fCAwO1xyXG4gICAgbGV0IG5ld1ZhbHVlOiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHN0ZXAgPiAwKSB7XHJcbiAgICAgIG5ld1ZhbHVlID0gY3VycmVudFZhbHVlICsgc3RlcDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHN0ZXBTaXplID0gTWF0aC5hYnMoc3RlcCk7XHJcbiAgICAgIG5ld1ZhbHVlID0gY3VycmVudFZhbHVlIC0gc3RlcFNpemU7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChmaWVsZCkge1xyXG4gICAgICBjYXNlICdob3Vycyc6XHJcbiAgICAgICAgaWYgKG5ld1ZhbHVlIDwgMCkge1xyXG4gICAgICAgICAgbmV3VmFsdWUgPSAyNCArIChuZXdWYWx1ZSAlIDI0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID4gMjMpIHtcclxuICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUgJSAyNDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxyXG4gICAgICBjYXNlICdzZWNvbmRzJzpcclxuICAgICAgICBpZiAobmV3VmFsdWUgPCAwKSB7XHJcbiAgICAgICAgICBuZXdWYWx1ZSA9IDYwICsgKG5ld1ZhbHVlICUgNjApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUgPiA1OSkge1xyXG4gICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZSAlIDYwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGV0aW1lW2ZpZWxkXSA9IG5ld1ZhbHVlO1xyXG4gICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgb25UaW1lRmllbGRDaGFuZ2UoXHJcbiAgICBmaWVsZDogJ2hvdXJzJyB8ICdtaW51dGVzJyB8ICdzZWNvbmRzJyxcclxuICAgIGV2ZW50OiBFdmVudFxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGxldCB2YWx1ZSA9IHBhcnNlSW50KGlucHV0LnZhbHVlLCAxMCk7XHJcblxyXG4gICAgaWYgKGlzTmFOKHZhbHVlKSkge1xyXG4gICAgICB2YWx1ZSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChmaWVsZCkge1xyXG4gICAgICBjYXNlICdob3Vycyc6XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAwO1xyXG4gICAgICAgIGlmICh2YWx1ZSA+IDIzKSB2YWx1ZSA9IDIzO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdtaW51dGVzJzpcclxuICAgICAgY2FzZSAnc2Vjb25kcyc6XHJcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAwO1xyXG4gICAgICAgIGlmICh2YWx1ZSA+IDU5KSB2YWx1ZSA9IDU5O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0LnZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG5cclxuICAgIHRoaXMuZGF0ZXRpbWVbZmllbGRdID0gdmFsdWU7XHJcbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzY2hlZHVsZVVwZGF0ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCB8fCB0aGlzLl91cGRhdGVQZW5kaW5nKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5fdXBkYXRlUGVuZGluZyA9IHRydWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5fdXBkYXRlUGVuZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDb25maWd1cmF0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXRlY3RUaW1lQ29tcG9uZW50cygpO1xyXG4gICAgdGhpcy5zZXRTdGFuZGFyZEZvcm1hdCgpO1xyXG4gICAgdGhpcy5zZXRQbGFjZWhvbGRlcigpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRldGVjdFRpbWVDb21wb25lbnRzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaW5wdXREYXRldGltZUZvcm1hdCkge1xyXG4gICAgICBjb25zdCBoYXNUaW1lRm9ybWF0ID0gdGhpcy5oYXNUaW1lSW5Gb3JtYXQodGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0KTtcclxuXHJcbiAgICAgIGlmICghaGFzVGltZUZvcm1hdCkge1xyXG4gICAgICAgIHRoaXMuc2hvd1RpbWVDb250cm9scyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NlY29uZHMgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzRGF0ZU9ubHkgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5zaG93VGltZUNvbnRyb2xzID0gdHJ1ZTtcclxuICAgICAgdGhpcy5pc0RhdGVPbmx5ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX3NlY29uZHMgPSB0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQuaW5jbHVkZXMoJzpzcycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zaG93VGltZUNvbnRyb2xzID0gdGhpcy5fc2Vjb25kcztcclxuICAgICAgdGhpcy5pc0RhdGVPbmx5ID0gIXRoaXMuX3NlY29uZHM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc1RpbWVJbkZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCdISDonKSB8fFxyXG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJ2hoOicpIHx8XHJcbiAgICAgIGZvcm1hdC5pbmNsdWRlcygnOm1tJykgfHxcclxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCc6c3MnKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U3RhbmRhcmRGb3JtYXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmludGVybmFsRm9ybWF0ID1cclxuICAgICAgdGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0IHx8IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFk7XHJcbiAgICB0aGlzLl9zdGFuZGFyZEZvcm1hdCA9IHRoaXMuaW50ZXJuYWxGb3JtYXQ7XHJcblxyXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5oYXNUaW1lSW5Gb3JtYXQodGhpcy5fc3RhbmRhcmRGb3JtYXQpKSB7XHJcbiAgICAgIHRoaXMuX3N0YW5kYXJkRm9ybWF0ICs9IHRoaXMuX3NlY29uZHMgPyAnIEhIOm1tOnNzJyA6ICcgSEg6bW0nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRQbGFjZWhvbGRlcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyICYmIHRoaXMucGxhY2Vob2xkZXIgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPVxyXG4gICAgICAgIHRoaXMuZGF0ZUNvbmZpZz8ucGxhY2Vob2xkZXI/LnRvTG93ZXJDYXNlKCkgfHxcclxuICAgICAgICBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scykge1xyXG4gICAgICBpZiAodGhpcy5fcGxhY2Vob2xkZXI/LmluY2x1ZGVzKCdoaDptbScpKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9wbGFjZWhvbGRlciArPSB0aGlzLl9zZWNvbmRzID8gJyBoaDptbTpzcycgOiAnIGhoOm1tJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUobmV3TW9kZWw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKG5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZE1vZGVsID0gRGF0ZVRpbWVNb2RlbC5mcm9tTG9jYWxTdHJpbmcobmV3TW9kZWwsIGZhbHNlKTtcclxuXHJcbiAgICAgIGlmIChwYXJzZWRNb2RlbCAmJiB0eXBlb2YgcGFyc2VkTW9kZWwueWVhciA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICB0aGlzLmRhdGV0aW1lID0gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgIHRoaXMuZGF0ZXRpbWUgfHwgbmV3IERhdGVUaW1lTW9kZWwoKSxcclxuICAgICAgICAgIHBhcnNlZE1vZGVsXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRZZWFyID0gcGFyc2VkTW9kZWwueWVhcjtcclxuICAgICAgICB0aGlzLmN1cnJlbnRNb250aCA9IHBhcnNlZE1vZGVsLm1vbnRoO1xyXG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0ge1xyXG4gICAgICAgICAgeWVhcjogcGFyc2VkTW9kZWwueWVhcixcclxuICAgICAgICAgIG1vbnRoOiBwYXJzZWRNb2RlbC5tb250aCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZGF0ZVN0cmluZyA9IG5ld01vZGVsO1xyXG4gICAgICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBuZXcgRGF0ZVRpbWVNb2RlbCgpO1xyXG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSAnJztcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuYXZpZ2F0ZShldmVudDogV3NsRGF0ZXBpY2tlck5hdmlnYXRlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudD8uY3VycmVudCAmJiBldmVudD8uY3VycmVudC5tb250aCAhPT0gZXZlbnQ/Lm5leHQubW9udGgpIHtcclxuICAgICAgdGhpcy5tb250aENoYW5nZWQuZW1pdChldmVudD8ubmV4dC5tb250aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGVkKFxyXG4gICAgZGF0ZXM6IFdzbERhdGVTdHJ1Y3RbXVxyXG4gICk6IChcclxuICAgIGRhdGU6IFdzbERhdGVTdHJ1Y3QsXHJcbiAgICBjdXJyZW50PzogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfVxyXG4gICkgPT4gYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHBpY2tlckRhdGU6IFdzbERhdGVTdHJ1Y3QpID0+IHtcclxuICAgICAgY29uc3Qgb3JpZ2luYWxBbGxvd2VkRGF0ZXMgPSB0aGlzLmFsbG93ZWREYXRlcztcclxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMgPSBkYXRlcztcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5pc0RhdGVEaXNhYmxlZChwaWNrZXJEYXRlKTtcclxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMgPSBvcmlnaW5hbEFsbG93ZWREYXRlcztcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHRvZ2dsZURhdGVUaW1lU3RhdGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5oYXNWYWxpZERhdGUoKSkge1xyXG4gICAgICB0aGlzLnNob3dUaW1lUGlja2VyVG9nZ2xlID0gIXRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGU7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGVsaW1pdGVyKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5kYXRlQ29uZmlnPy5mb3JtYXQpIHtcclxuICAgICAgY29uc3QgbWF0Y2ggPSB0aGlzLmRhdGVDb25maWcuZm9ybWF0Lm1hdGNoKC9bXmEtekEtWjAtOV0vKTtcclxuICAgICAgaWYgKG1hdGNoICYmIG1hdGNoWzBdKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hdGNoWzBdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRlQ29uZmlnPy5kYXRlU2VwYXJhdG9yIHx8ICctJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VEYXRlKHZhbHVlOiBzdHJpbmcpOiBXc2xEYXRlU3RydWN0IHwgbnVsbCB7XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGRlbGltaXRlciA9IHRoaXMuZ2V0RGVsaW1pdGVyKCk7XHJcbiAgICBjb25zdCBkYXRlID0gdmFsdWUuc3BsaXQoZGVsaW1pdGVyKTtcclxuXHJcbiAgICBpZiAoZGF0ZS5sZW5ndGggPCAzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmRheUZpcnN0KSB7XHJcbiAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQoZGF0ZVswXSwgMTApO1xyXG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZGF0ZVsxXSwgMTApO1xyXG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkYXRlWzJdLCAxMCk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGlzTmFOKGRheSkgfHxcclxuICAgICAgICAgIGlzTmFOKG1vbnRoKSB8fFxyXG4gICAgICAgICAgaXNOYU4oeWVhcikgfHxcclxuICAgICAgICAgIGRheSA8IDEgfHxcclxuICAgICAgICAgIGRheSA+IDMxIHx8XHJcbiAgICAgICAgICBtb250aCA8IDEgfHxcclxuICAgICAgICAgIG1vbnRoID4gMTJcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgZGF5LCBtb250aCwgeWVhciB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEZvcm1hdDogSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWSAoeXl5eS1NTS1kZClcclxuICAgICAgICBjb25zdCB5ZWFyID0gcGFyc2VJbnQoZGF0ZVswXSwgMTApO1xyXG4gICAgICAgIGNvbnN0IG1vbnRoID0gcGFyc2VJbnQoZGF0ZVsxXSwgMTApO1xyXG4gICAgICAgIGNvbnN0IGRheSA9IHBhcnNlSW50KGRhdGVbMl0sIDEwKTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgaXNOYU4oZGF5KSB8fFxyXG4gICAgICAgICAgaXNOYU4obW9udGgpIHx8XHJcbiAgICAgICAgICBpc05hTih5ZWFyKSB8fFxyXG4gICAgICAgICAgZGF5IDwgMSB8fFxyXG4gICAgICAgICAgZGF5ID4gMzEgfHxcclxuICAgICAgICAgIG1vbnRoIDwgMSB8fFxyXG4gICAgICAgICAgbW9udGggPiAxMlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyB5ZWFyLCBtb250aCwgZGF5IH07XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IFdzbERhdGVUaW1lU3RydWN0IHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWRhdGUpIHJldHVybiAnJztcclxuXHJcbiAgICBjb25zdCBkYXlGb3JtYXR0ZWQgPSBkYXRlLmRheSA8IDEwID8gJzAnICsgZGF0ZS5kYXkgOiBkYXRlLmRheS50b1N0cmluZygpO1xyXG4gICAgY29uc3QgbW9udGhGb3JtYXR0ZWQgPVxyXG4gICAgICBkYXRlLm1vbnRoIDwgMTAgPyAnMCcgKyBkYXRlLm1vbnRoIDogZGF0ZS5tb250aC50b1N0cmluZygpO1xyXG4gICAgY29uc3QgeWVhckZvcm1hdHRlZCA9IGRhdGUueWVhci50b1N0cmluZygpO1xyXG5cclxuICAgIGNvbnN0IGhvdXJGb3JtYXR0ZWQgPVxyXG4gICAgICBkYXRlLmhvdXJzICE9IG51bGxcclxuICAgICAgICA/IGRhdGUuaG91cnMgPCAxMFxyXG4gICAgICAgICAgPyAnMCcgKyBkYXRlLmhvdXJzXHJcbiAgICAgICAgICA6IGRhdGUuaG91cnMudG9TdHJpbmcoKVxyXG4gICAgICAgIDogJzAwJztcclxuICAgIGNvbnN0IG1pbnV0ZUZvcm1hdHRlZCA9XHJcbiAgICAgIGRhdGUubWludXRlcyAhPSBudWxsXHJcbiAgICAgICAgPyBkYXRlLm1pbnV0ZXMgPCAxMFxyXG4gICAgICAgICAgPyAnMCcgKyBkYXRlLm1pbnV0ZXNcclxuICAgICAgICAgIDogZGF0ZS5taW51dGVzLnRvU3RyaW5nKClcclxuICAgICAgICA6ICcwMCc7XHJcbiAgICBjb25zdCBzZWNvbmRGb3JtYXR0ZWQgPVxyXG4gICAgICBkYXRlLnNlY29uZHMgIT0gbnVsbFxyXG4gICAgICAgID8gZGF0ZS5zZWNvbmRzIDwgMTBcclxuICAgICAgICAgID8gJzAnICsgZGF0ZS5zZWNvbmRzXHJcbiAgICAgICAgICA6IGRhdGUuc2Vjb25kcy50b1N0cmluZygpXHJcbiAgICAgICAgOiAnMDAnO1xyXG5cclxuICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuaW5wdXREYXRldGltZUZvcm1hdDtcclxuXHJcbiAgICBjb25zdCB0b2tlbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XHJcbiAgICAgIHl5eXk6IHllYXJGb3JtYXR0ZWQsXHJcbiAgICAgIE1NOiBtb250aEZvcm1hdHRlZCxcclxuICAgICAgZGQ6IGRheUZvcm1hdHRlZCxcclxuICAgICAgSEg6IGhvdXJGb3JtYXR0ZWQsXHJcbiAgICAgIG1tOiBtaW51dGVGb3JtYXR0ZWQsXHJcbiAgICAgIHNzOiBzZWNvbmRGb3JtYXR0ZWQsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChmb3JtYXQpIHtcclxuICAgICAgY29uc3Qgc29ydGVkVG9rZW5zID0gT2JqZWN0LmtleXModG9rZW5zKS5zb3J0KFxyXG4gICAgICAgIChhLCBiKSA9PiBiLmxlbmd0aCAtIGEubGVuZ3RoXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBsZXQgcmVzdWx0ID0gZm9ybWF0O1xyXG4gICAgICBmb3IgKGNvbnN0IHQgb2Ygc29ydGVkVG9rZW5zKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UobmV3IFJlZ0V4cCh0LCAnZycpLCB0b2tlbnNbdF0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBmb3JtYXR0ZWREYXRlID0gYCR7eWVhckZvcm1hdHRlZH0tJHttb250aEZvcm1hdHRlZH0tJHtkYXlGb3JtYXR0ZWR9YDtcclxuICAgIGlmIChkYXRlLmhvdXJzICE9IG51bGwpIHtcclxuICAgICAgZm9ybWF0dGVkRGF0ZSArPSBgICR7aG91ckZvcm1hdHRlZH06JHttaW51dGVGb3JtYXR0ZWR9YDtcclxuICAgIH1cclxuICAgIGlmIChkYXRlLnNlY29uZHMgIT0gbnVsbCkge1xyXG4gICAgICBmb3JtYXR0ZWREYXRlICs9IGA6JHtzZWNvbmRGb3JtYXR0ZWR9YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ybWF0dGVkRGF0ZTtcclxuICB9XHJcblxyXG4gIG9uSW5wdXRDaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XHJcblxyXG4gICAgaWYgKHZhbHVlLnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKCk7XHJcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0ZVN0cmluZyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXJzZWREYXRlID0gdGhpcy5wYXJzZURhdGUodmFsdWUpO1xyXG4gICAgaWYgKHBhcnNlZERhdGUpIHtcclxuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKHtcclxuICAgICAgICB5ZWFyOiBwYXJzZWREYXRlLnllYXIsXHJcbiAgICAgICAgbW9udGg6IHBhcnNlZERhdGUubW9udGgsXHJcbiAgICAgICAgZGF5OiBwYXJzZWREYXRlLmRheSxcclxuICAgICAgICBob3VyczogdGhpcy5kYXRldGltZT8uaG91cnMgfHwgMCxcclxuICAgICAgICBtaW51dGVzOiB0aGlzLmRhdGV0aW1lPy5taW51dGVzIHx8IDAsXHJcbiAgICAgICAgc2Vjb25kczogdGhpcy5kYXRldGltZT8uc2Vjb25kcyB8fCAwLFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcclxuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkdCA9IERhdGVUaW1lTW9kZWwuZnJvbUxvY2FsU3RyaW5nKHZhbHVlKTtcclxuICAgIGlmIChkdCAmJiBkdC55ZWFyKSB7XHJcbiAgICAgIHRoaXMuZGF0ZXRpbWUgPSBkdDtcclxuICAgICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcclxuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRGF0ZUNoYW5nZShldmVudDogc3RyaW5nIHwgV3NsRGF0ZVN0cnVjdCk6IHZvaWQge1xyXG4gICAgbGV0IGRhdGU6IERhdGVUaW1lTW9kZWw7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgZGF0ZSA9IG5ldyBEYXRlVGltZU1vZGVsKHRoaXMucGFyc2VEYXRlKGV2ZW50KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkYXRlID0gbmV3IERhdGVUaW1lTW9kZWwoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZGF0ZSB8fCAhZGF0ZS55ZWFyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZGF0ZXRpbWUpIHtcclxuICAgICAgdGhpcy5kYXRldGltZSA9IGRhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXRldGltZS55ZWFyID0gZGF0ZS55ZWFyO1xyXG4gICAgdGhpcy5kYXRldGltZS5tb250aCA9IGRhdGUubW9udGg7XHJcbiAgICB0aGlzLmRhdGV0aW1lLmRheSA9IGRhdGUuZGF5O1xyXG5cclxuICAgIHRoaXMuY3VycmVudFllYXIgPSBkYXRlLnllYXI7XHJcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IGRhdGUubW9udGg7XHJcblxyXG4gICAgdGhpcy5zdGFydERhdGUgPSB7XHJcbiAgICAgIHllYXI6IGRhdGUueWVhcixcclxuICAgICAgbW9udGg6IGRhdGUubW9udGgsXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XHJcbiAgfVxyXG5cclxuICBzZXREYXRlU3RyaW5nTW9kZWwoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kYXRldGltZSAmJiB0eXBlb2YgdGhpcy5kYXRldGltZS55ZWFyID09PSAnbnVtYmVyJykge1xyXG4gICAgICB0aGlzLmRhdGVTdHJpbmcgPSB0aGlzLmRhdGV0aW1lLnRvU3RyaW5nKCk7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5kYXRlU3RyaW5nKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuZGF0ZVN0cmluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBnZXREaXNwbGF5VmFsdWUoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRhdGV0aW1lICYmIHRoaXMuZGF0ZXRpbWUueWVhcikge1xyXG4gICAgICBjb25zdCBkYXRlU3RydWN0OiBXc2xEYXRlVGltZVN0cnVjdCA9IHtcclxuICAgICAgICB5ZWFyOiB0aGlzLmRhdGV0aW1lLnllYXIsXHJcbiAgICAgICAgbW9udGg6IHRoaXMuZGF0ZXRpbWUubW9udGgsXHJcbiAgICAgICAgZGF5OiB0aGlzLmRhdGV0aW1lLmRheSxcclxuICAgICAgICBob3VyczogdGhpcy5kYXRldGltZS5ob3VycyxcclxuICAgICAgICBtaW51dGVzOiB0aGlzLmRhdGV0aW1lLm1pbnV0ZXMsXHJcbiAgICAgICAgc2Vjb25kczogdGhpcy5kYXRldGltZS5zZWNvbmRzLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF0ZShkYXRlU3RydWN0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBpbnB1dEJsdXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RWZmZWN0aXZlRm9ybWF0KCk6IHN0cmluZyB7XHJcbiAgICBsZXQgZm9ybWF0ID0gdGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0IHx8IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2hvd1RpbWVDb250cm9scyAmJiAhdGhpcy5oYXNUaW1lSW5Gb3JtYXQoZm9ybWF0KSkge1xyXG4gICAgICBmb3JtYXQgKz0gdGhpcy5fc2Vjb25kcyA/ICcgSEg6bW06c3MnIDogJyBISDptbSc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcm1hdDtcclxuICB9XHJcblxyXG4gIG9uVGltZUNoYW5nZShldmVudDogV3NsVGltZVN0cnVjdCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmRhdGV0aW1lID0gbmV3IERhdGVUaW1lTW9kZWwoe1xyXG4gICAgICAuLi50aGlzLmRhdGV0aW1lLFxyXG4gICAgICBob3VyczogZXZlbnQuaG91cnMsXHJcbiAgICAgIG1pbnV0ZXM6IGV2ZW50Lm1pbnV0ZXMsXHJcbiAgICAgIHNlY29uZHM6IGV2ZW50LnNlY29uZHMsXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBoYXNWYWxpZERhdGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEoXHJcbiAgICAgIHRoaXMuZGF0ZXRpbWUgJiZcclxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUueWVhciA9PT0gJ251bWJlcicgJiZcclxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUubW9udGggPT09ICdudW1iZXInICYmXHJcbiAgICAgIHR5cGVvZiB0aGlzLmRhdGV0aW1lLmRheSA9PT0gJ251bWJlcidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVNb250aHNBbmRZZWFycygpOiB2b2lkIHtcclxuICAgIHRoaXMubW9udGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+XHJcbiAgICAgIHRoaXMuZ2V0TW9udGhOYW1lKGkgKyAxKVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3Qgc3RhcnRZZWFyID0gdGhpcy5taW5EYXRlPy55ZWFyIHx8IGN1cnJlbnRZZWFyIC0gNTA7XHJcbiAgICBjb25zdCBlbmRZZWFyID0gdGhpcy5tYXhEYXRlPy55ZWFyIHx8IGN1cnJlbnRZZWFyICsgNTA7XHJcblxyXG4gICAgdGhpcy55ZWFycyA9IEFycmF5LmZyb20oXHJcbiAgICAgIHsgbGVuZ3RoOiBlbmRZZWFyIC0gc3RhcnRZZWFyICsgMSB9LFxyXG4gICAgICAoXywgaSkgPT4gZW5kWWVhciAtIGlcclxuICAgICkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xyXG4gIH1cclxuXHJcbiAgb25Nb250aFNlbGVjdChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcclxuICAgIGNvbnN0IG5ld01vbnRoID0gcGFyc2VJbnQoc2VsZWN0LnZhbHVlLCAxMCk7XHJcbiAgICBpZiAobmV3TW9udGggIT09IHRoaXMuY3VycmVudE1vbnRoKSB7XHJcbiAgICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5jdXJyZW50TW9udGg7XHJcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gbmV3TW9udGg7XHJcbiAgICAgIHRoaXMubW9udGhDaGFuZ2VkLmVtaXQobmV3TW9udGgpO1xyXG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZSh7XHJcbiAgICAgICAgY3VycmVudDogeyB5ZWFyOiB0aGlzLmN1cnJlbnRZZWFyLCBtb250aDogb2xkTW9udGggfSxcclxuICAgICAgICBuZXh0OiB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBuZXdNb250aCB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uWWVhclNlbGVjdChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudDtcclxuICAgIGNvbnN0IG5ld1llYXIgPSBwYXJzZUludChzZWxlY3QudmFsdWUsIDEwKTtcclxuICAgIGlmIChuZXdZZWFyICE9PSB0aGlzLmN1cnJlbnRZZWFyKSB7XHJcbiAgICAgIGNvbnN0IG9sZFllYXIgPSB0aGlzLmN1cnJlbnRZZWFyO1xyXG4gICAgICB0aGlzLmN1cnJlbnRZZWFyID0gbmV3WWVhcjtcclxuICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICAgIHRoaXMubmF2aWdhdGUoe1xyXG4gICAgICAgIGN1cnJlbnQ6IHsgeWVhcjogb2xkWWVhciwgbW9udGg6IHRoaXMuY3VycmVudE1vbnRoIH0sXHJcbiAgICAgICAgbmV4dDogeyB5ZWFyOiBuZXdZZWFyLCBtb250aDogdGhpcy5jdXJyZW50TW9udGggfSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJkYXRldGltZS1waWNrZXItY29udGFpbmVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImlucHV0LWNvbnRhaW5lclwiPlxyXG4gICAgPGlucHV0ICNkYXRlSW5wdXQgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICduZy12YWxpZCc6IG5nQ29udHJvbD8udmFsaWQgPT09IHRydWUsXHJcbiAgICAgICAgJ25nLWludmFsaWQnOiBuZ0NvbnRyb2w/LmludmFsaWQgPT09IHRydWUsXHJcbiAgICAgICAgJ25nLWRpc2FibGVkJzogZGlzYWJsZWRcclxuICAgICAgfVwiIGNsYXNzPVwiZGF0ZXRpbWUtaW5wdXRcIiAoYmx1cik9XCJpbnB1dEJsdXIoKVwiIFtwbGFjZWhvbGRlcl09XCJfcGxhY2Vob2xkZXJcIiBbbmdNb2RlbF09XCJnZXREaXNwbGF5VmFsdWUoKVwiXHJcbiAgICAgIChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgd3NsVG9vbHRpcCBbdG9vbHRpcEljb25PdmVybGFwXT1cIjEyXCJcclxuICAgICAgdG9vbHRpcFBsYWNlbWVudD1cInRvcFwiIC8+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2FsZW5kYXItaWNvblwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBkaXNhYmxlQ2FsZW5kYXJcIlxyXG4gICAgW25nQ2xhc3NdPVwieyAnZGlzYWJsZWQtYnRuJzogZGlzYWJsZWQgfHwgZGlzYWJsZUNhbGVuZGFyIH1cIiAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoJGV2ZW50KVwiPlxyXG4gICAgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhciBmYS1sZ1wiPjwvaT5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPCEtLSBDdXN0b20gQ2FsZW5kYXIgUG9wb3ZlciAtLT5cclxuICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItcG9wb3ZlclwiIFtjbGFzcy5zaG93XT1cInNob3dDYWxlbmRhclwiIFtjbGFzcy5oaWRkZW5dPVwiIXNob3dDYWxlbmRhclwiXHJcbiAgICBbbmdDbGFzc109XCJjYWxlbmRhclBvc2l0aW9uQ2xhc3NcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd1RpbWVQaWNrZXJUb2dnbGVcIj5cclxuICAgICAgICA8IS0tIEN1c3RvbSBEYXRlIFBpY2tlciAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLWRhdGVwaWNrZXJcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWhlYWRlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmF2aWdhdGVNb250aCgtMSlcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC15ZWFyLXNlbGVjdHNcIj5cclxuICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwibW9udGgtc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJjdXJyZW50TW9udGhcIiAoY2hhbmdlKT1cIm9uTW9udGhTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG1vbnRoIG9mIG1vbnRoczsgbGV0IGkgPSBpbmRleFwiIFt2YWx1ZV09XCJpICsgMVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBtb250aCB9fVxyXG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cInllYXItc2VsZWN0XCIgWyhuZ01vZGVsKV09XCJjdXJyZW50WWVhclwiIChjaGFuZ2UpPVwib25ZZWFyU2VsZWN0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJzXCIgW3ZhbHVlXT1cInllYXJcIj5cclxuICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxyXG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5hdi1idG5cIiAoY2xpY2spPVwibmF2aWdhdGVNb250aCgxKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1yaWdodFwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1jYWxlbmRhclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Vla2RheXNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2Vla2RheVwiICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla2RheUxhYmVsc1wiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF5IH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheXNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5LWNlbGxcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIGNhbGVuZGFyRGF5c1wiIFtjbGFzcy5vdGhlci1tb250aF09XCJkYXkub3RoZXJNb250aFwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZGF5LnNlbGVjdGVkXCIgW2NsYXNzLmRpc2FibGVkXT1cImRheS5kaXNhYmxlZFwiIFtjbGFzcy50b2RheV09XCJkYXkudG9kYXlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF5KVwiPlxyXG4gICAgICAgICAgICAgICAge3sgZGF5LmRheSB9fVxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2hvd1RpbWVDb250cm9scyAmJiAhaXNEYXRlT25seVwiIGNsYXNzPVwidG9nZ2xlLXRpbWUtYnRuXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCIgKGNsaWNrKT1cInRvZ2dsZURhdGVUaW1lU3RhdGUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jbG9jayBmYS1jbG9jay1vIGZhLWxnXCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93VGltZVBpY2tlclRvZ2dsZVwiPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCIgY2xhc3M9XCJ0b2dnbGUtY2FsZW5kYXItYnRuXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRGF0ZVRpbWVTdGF0ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNhbGVuZGFyIGZhLWxnXCI+PC9pPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1waWNrZXItY29udGFpbmVyXCIgKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCI+XHJcbiAgICAgICAgICA8IS0tIEN1c3RvbSBUaW1lIFBpY2tlciAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tdGltZXBpY2tlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1jb250cm9sc1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+e3sgZGF0ZUNvbmZpZz8udG9rZW5zPy5ob3VycyB8fCBcIkhIXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0aW1lLWJ0blwiIChjbGljayk9XCJhZGp1c3RUaW1lKCdob3VycycsIGhvdXJzU3RlcCB8fCAxKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi11cFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJ0aW1lLWlucHV0XCIgW3ZhbHVlXT1cImRhdGV0aW1lPy5ob3VycyB8fCAwXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdob3VycycsICRldmVudClcIiBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCIgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4PVwiMjNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ2hvdXJzJywgLShob3Vyc1N0ZXAgfHwgMSkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiPjo8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/Lm1pbnV0ZXMgfHwgXCJtbVwiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnbWludXRlcycsIG1pbnV0ZXNTdGVwIHx8IDEpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInRpbWUtaW5wdXRcIiBbdmFsdWVdPVwiZGF0ZXRpbWU/Lm1pbnV0ZXMgfHwgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRpbWVGaWVsZENoYW5nZSgnbWludXRlcycsICRldmVudClcIiBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCIgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4PVwiNTlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ21pbnV0ZXMnLCAtKG1pbnV0ZXNTdGVwIHx8IDEpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1zZXBhcmF0b3JcIiAqbmdJZj1cInNlY29uZHNcIj46PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWZpZWxkXCIgKm5nSWY9XCJzZWNvbmRzXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+e3sgZGF0ZUNvbmZpZz8udG9rZW5zPy5zZWNvbmRzIHx8IFwic3NcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ3NlY29uZHMnLCBzZWNvbmRzU3RlcCB8fCAxKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi11cFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJ0aW1lLWlucHV0XCIgW3ZhbHVlXT1cImRhdGV0aW1lPy5zZWNvbmRzIHx8IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25UaW1lRmllbGRDaGFuZ2UoJ3NlY29uZHMnLCAkZXZlbnQpXCIgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiIG1pbj1cIjBcIlxyXG4gICAgICAgICAgICAgICAgICAgIG1heD1cIjU5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0aW1lLWJ0blwiIChjbGljayk9XCJhZGp1c3RUaW1lKCdzZWNvbmRzJywgLShzZWNvbmRzU3RlcCB8fCAxKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tZG93blwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48IS0tIEJhY2tkcm9wIGZvciBjbG9zaW5nIHBvcG92ZXIgLS0+XHJcbjxkaXYgY2xhc3M9XCJjYWxlbmRhci1iYWNrZHJvcFwiIFtjbGFzcy5zaG93XT1cInNob3dDYWxlbmRhclwiIChjbGljayk9XCJjbG9zZUNhbGVuZGFyKClcIj48L2Rpdj4iXX0=
|
|
946
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy13c2wtbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvd3NsLWRhdGV0aW1lLXBpY2tlci93c2wtZGF0ZXRpbWUtcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXdzbC1saWJyYXJ5L3NyYy9saWIvY29tcG9uZW50cy93c2wtZGF0ZXRpbWUtcGlja2VyL3dzbC1kYXRldGltZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1QixPQUFPLEVBQ0wsYUFBYSxHQUlkLE1BQU0sa0NBQWtDLENBQUM7QUFDMUMsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFHWixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUlwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUNMLFVBQVUsRUFDVixrQkFBa0IsR0FDbkIsTUFBTSwyQ0FBMkMsQ0FBQzs7Ozs7O0FBK0JuRCxNQUFNLE9BQU8sMEJBQTBCO0lBUXJDLElBQ0ksbUJBQW1CLENBQUMsS0FBeUI7UUFDL0MsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssS0FBSztZQUFFLE9BQU87UUFDaEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNsQyxJQUFJLENBQUMsY0FB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Q0Y7OzBCQWlIRSxRQUFRO2tHQTVHRixVQUFVO3NCQUFsQixLQUFLO2dCQU1GLG1CQUFtQjtzQkFEdEIsS0FBSztnQkFXRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0YsWUFBWTtzQkFEZixLQUFLO2dCQXNCSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkErQkgsY0FBYztzQkFEakIsS0FBSztnQkFZRixPQUFPO3NCQURWLEtBQUs7Z0JBMkNOLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFtQjFDLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUXpDLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub29wIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7XHJcbiAgRGF0ZVRpbWVNb2RlbCxcclxuICBXc2xEYXRlU3RydWN0LFxyXG4gIFdzbERhdGVUaW1lU3RydWN0LFxyXG4gIFdzbFRpbWVTdHJ1Y3QsXHJcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3dzbC1kYXRlLXRpbWUubW9kZWwnO1xyXG5pbXBvcnQge1xyXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxyXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gIE5nQ29udHJvbCxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdE9wdGlvbnMsXHJcbiAgSW5qZWN0b3IsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGdldERhdGVGb3JtYXRDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvd3NsLWRhdGUtZm9ybWF0cyc7XHJcbmltcG9ydCB7IERhdGVGb3JtYXRDb25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RhdGUtZm9ybWF0LmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFdzbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcvd3NsLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGdldEN1cnJlbnREYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvZGF0ZS10aW1lJztcclxuaW1wb3J0IHtcclxuICBUSU1FX1NURVBTLFxyXG4gIElOUFVUX0RBVEVfRk9STUFUUyxcclxufSBmcm9tICcuLi8uLi9jb25zdGFudHMvZGF0ZXRpbWUtcGlja2VyLmNvbnN0YW50cyc7XHJcblxyXG4vLyBXU0wgaW50ZXJmYWNlcyBmb3IgY29tcG9uZW50LXNwZWNpZmljIHR5cGVzXHJcbmV4cG9ydCBpbnRlcmZhY2UgV3NsRGF0ZXBpY2tlck5hdmlnYXRlRXZlbnQge1xyXG4gIGN1cnJlbnQ6IHsgeWVhcjogbnVtYmVyOyBtb250aDogbnVtYmVyIH07XHJcbiAgbmV4dDogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhckRheSB7XHJcbiAgZGF5OiBudW1iZXI7XHJcbiAgbW9udGg6IG51bWJlcjtcclxuICB5ZWFyOiBudW1iZXI7XHJcbiAgb3RoZXJNb250aDogYm9vbGVhbjtcclxuICBzZWxlY3RlZDogYm9vbGVhbjtcclxuICBkaXNhYmxlZDogYm9vbGVhbjtcclxuICB0b2RheTogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd3c2wtZGF0ZXRpbWUtcGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vd3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vd3NsLWRhdGV0aW1lLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gV3NsRGF0ZXRpbWVQaWNrZXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFdzbERhdGV0aW1lUGlja2VyQ29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlc1xyXG57XHJcbiAgQElucHV0KCkgZGF0ZVN0cmluZyE6IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBfaW5wdXREYXRldGltZUZvcm1hdD86IHN0cmluZztcclxuICBwcml2YXRlIF9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGlucHV0RGF0ZXRpbWVGb3JtYXQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQgPT09IHZhbHVlKSByZXR1cm47XHJcbiAgICB0aGlzLl9pbnB1dERhdGV0aW1lRm9ybWF0ID0gdmFsdWU7XHJcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5wdXREYXRldGltZUZvcm1hdCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lucHV0RGF0ZXRpbWVGb3JtYXQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBob3Vyc1N0ZXA6IG51bWJlciA9IFRJTUVfU1RFUFMuSE9VUlM7XHJcbiAgQElucHV0KCkgbWludXRlc1N0ZXA6IG51bWJlciA9IFRJTUVfU1RFUFMuTUlOVVRFUztcclxuICBASW5wdXQoKSBzZWNvbmRzU3RlcDogbnVtYmVyID0gVElNRV9TVEVQUy5TRUNPTkRTO1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogV3NsRGF0ZVN0cnVjdDtcclxuICBASW5wdXQoKSBtaW5EYXRlOiBXc2xEYXRlU3RydWN0O1xyXG4gIEBJbnB1dCgpIGRpc2FibGVDYWxlbmRhciA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNhbGVuZGFyUG9zaXRpb246ICdzdGF0aWMnIHwgJ2R5bmFtaWMnID0gJ2R5bmFtaWMnO1xyXG4gIEBJbnB1dCgpIHVzZUZpeGVkUG9zaXRpb24gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfYWxsb3dlZERhdGVzOiBXc2xEYXRlU3RydWN0W10gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYWxsb3dlZERhdGVzKHZhbHVlOiBXc2xEYXRlU3RydWN0W10pIHtcclxuICAgIHRoaXMuX2FsbG93ZWREYXRlcyA9IHZhbHVlID8/IFtdO1xyXG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsb3dlZERhdGVzKCk6IFdzbERhdGVTdHJ1Y3RbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWxsb3dlZERhdGVzO1xyXG4gIH1cclxuXHJcbiAgaW50ZXJuYWxGb3JtYXQ6IHN0cmluZyA9IElOUFVUX0RBVEVfRk9STUFUUy5EQVRFX09OTFk7XHJcbiAgcHJpdmF0ZSBfc3RhbmRhcmRGb3JtYXQ6IHN0cmluZyA9IElOUFVUX0RBVEVfRk9STUFUUy5FVV9EQVRFX0RBU0g7XHJcblxyXG4gIF9wbGFjZWhvbGRlciA9ICcnO1xyXG4gIHN0YXJ0RGF0ZTogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXIgfSA9IHsgeWVhcjogMCwgbW9udGg6IDAgfTtcclxuICBzaG93VGltZVBpY2tlclRvZ2dsZSA9IGZhbHNlO1xyXG4gIGRhdGV0aW1lOiBEYXRlVGltZU1vZGVsID0gbmV3IERhdGVUaW1lTW9kZWwoKTtcclxuICBuZ0NvbnRyb2w6IE5nQ29udHJvbCB8IG51bGwgPSBudWxsO1xyXG4gIGRhdGVDb25maWchOiBEYXRlRm9ybWF0Q29uZmlnO1xyXG5cclxuICBAT3V0cHV0KCkgbW9udGhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpIGNhbGVuZGFyU3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSBub29wO1xyXG4gIHByaXZhdGUgb25DaGFuZ2U6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xyXG4gIHByaXZhdGUgbGFuZ3VhZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBzaG93VGltZUNvbnRyb2xzID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfc2Vjb25kcyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3VwZGF0ZVBlbmRpbmcgPSBmYWxzZTtcclxuXHJcbiAgc2hvd0NhbGVuZGFyID0gZmFsc2U7XHJcbiAgY3VycmVudFllYXI6IG51bWJlcjtcclxuICBjdXJyZW50TW9udGg6IG51bWJlcjtcclxuICBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcclxuICB3ZWVrZGF5TGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBjYWxlbmRhclBvc2l0aW9uQ2xhc3MgPSAnJztcclxuXHJcbiAgY2FsU3R5bGU6IHtcclxuICAgIHBvc2l0aW9uOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgdG9wOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgbGVmdDogc3RyaW5nIHwgbnVsbDtcclxuICAgIHJpZ2h0OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgYm90dG9tOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgbWF4V2lkdGg6IHN0cmluZyB8IG51bGw7XHJcbiAgfSA9IHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogbnVsbCwgbGVmdDogbnVsbCwgcmlnaHQ6IG51bGwsIGJvdHRvbTogbnVsbCwgbWF4V2lkdGg6IG51bGwgfTtcclxuXHJcbiAgbW9udGhzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHllYXJzOiBudW1iZXJbXSA9IFtdO1xyXG4gIGRlZmF1bHRZZWFyUmFuZ2UgPSB7IHN0YXJ0OiAyMDAwLCBlbmQ6IDIwNTAgfTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc3RhbmRhcmRGb3JtYXQodmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuX3N0YW5kYXJkRm9ybWF0ID09PSB2YWx1ZSkgcmV0dXJuO1xyXG4gICAgdGhpcy5fc3RhbmRhcmRGb3JtYXQgPSB2YWx1ZTtcclxuICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUoKTtcclxuICB9XHJcblxyXG4gIGdldCBzdGFuZGFyZEZvcm1hdCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YW5kYXJkRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgc2Vjb25kcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuX3NlY29uZHMgPT09IHZhbHVlKSByZXR1cm47XHJcbiAgICB0aGlzLl9zZWNvbmRzID0gdmFsdWU7XHJcbiAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2Vjb25kcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWNvbmRzO1xyXG4gIH1cclxuXHJcbiAgaXNEYXRlT25seSA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaW5qOiBJbmplY3RvcixcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29uZmlnU2VydmljZTogV3NsQ29uZmlnU2VydmljZSB8IG51bGwsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmXHJcbiAgKSB7XHJcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IGdldEN1cnJlbnREYXRlKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRZZWFyID0gY3VycmVudERhdGUueWVhcjtcclxuICAgIHRoaXMuY3VycmVudE1vbnRoID0gY3VycmVudERhdGUubW9udGg7XHJcblxyXG4gICAgdGhpcy5kYXRlQ29uZmlnID0gZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKTtcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlKSB7XHJcbiAgICAgIHRoaXMubGFuZ3VhZ2VTdWJzY3JpcHRpb24gPSB0aGlzLmNvbmZpZ1NlcnZpY2VcclxuICAgICAgICAud2F0Y2hMYW5ndWFnZSgpXHJcbiAgICAgICAgLnN1YnNjcmliZSgobGFuZ3VhZ2UpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcobGFuZ3VhZ2UgfHwgJ2VuJyk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlV2Vla2RheUxhYmVscygpO1xyXG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlVXBkYXRlKCk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVdlZWtkYXlMYWJlbHMoKTtcclxuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZVVwZGF0ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNob3dDYWxlbmRhcikge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IGNhbGVuZGFyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci1wb3BvdmVyJyk7XHJcbiAgICAgIGNvbnN0IGJ1dHRvbkVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2FsZW5kYXItaWNvbicpO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIGNhbGVuZGFyRWxlbWVudCAmJlxyXG4gICAgICAgIGJ1dHRvbkVsZW1lbnQgJiZcclxuICAgICAgICAhY2FsZW5kYXJFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiZcclxuICAgICAgICAhYnV0dG9uRWxlbWVudC5jb250YWlucyh0YXJnZXQpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuY2xvc2VDYWxlbmRhcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvbldpbmRvd1Jlc2l6ZShfZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIgJiYgdGhpcy5jYWxlbmRhclBvc2l0aW9uID09PSAnZHluYW1pYycpIHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVEeW5hbWljUG9zaXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxyXG4gIG9uV2luZG93U2Nyb2xsKF9ldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNob3dDYWxlbmRhciAmJiB0aGlzLmNhbGVuZGFyUG9zaXRpb24gPT09ICdkeW5hbWljJykge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZUR5bmFtaWNQb3NpdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm5nQ29udHJvbCA9XHJcbiAgICAgICAgdGhpcy5pbmouZ2V0KE5nQ29udHJvbCwgbnVsbCwgeyBvcHRpb25hbDogdHJ1ZSB9IGFzIEluamVjdE9wdGlvbnMpID8/IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVMYW5ndWFnZUNvbmZpZ3VyYXRpb24oKTtcclxuICAgICAgdGhpcy5pbml0aWFsaXplTW9udGhzQW5kWWVhcnMoKTtcclxuICAgICAgdGhpcy51cGRhdGVXZWVrZGF5TGFiZWxzKCk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHRoaXMubmdDb250cm9sID0gbnVsbDtcclxuICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuZGF0ZUNvbmZpZyA9IGdldERhdGVGb3JtYXRDb25maWcoJ2VuJyk7XHJcbiAgICAgIHRoaXMudXBkYXRlV2Vla2RheUxhYmVscygpO1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVNb250aHNBbmRZZWFycygpO1xyXG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVMYW5ndWFnZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2UgPSB0aGlzLmNvbmZpZ1NlcnZpY2U/Lmxhbmd1YWdlO1xyXG4gICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKGN1cnJlbnRMYW5ndWFnZSB8fCAnZW4nKTtcclxuICAgICAgdGhpcy51cGRhdGVDb25maWd1cmF0aW9uKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmRhdGVDb25maWcgPSBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpO1xyXG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZ3VyYXRpb24oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydtaW5EYXRlJ10gfHwgY2hhbmdlc1snbWF4RGF0ZSddKSB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydhbGxvd2VkRGF0ZXMnXSkge1xyXG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydwbGFjZWhvbGRlciddKSB7XHJcbiAgICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIoKTtcclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmxhbmd1YWdlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMubGFuZ3VhZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIHRoaXMucmVzZXRDYWxTdHlsZXMoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUNhbGVuZGFyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuZGlzYWJsZUNhbGVuZGFyKSB7XHJcbiAgICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gIXRoaXMuc2hvd0NhbGVuZGFyO1xyXG4gICAgICBpZiAodGhpcy5zaG93Q2FsZW5kYXIpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzVmFsaWREYXRlKCkpIHtcclxuICAgICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmdldExhc3RBdmFpbGFibGVNb250aFllYXIoKTtcclxuICAgICAgICAgIGlmIChsYXN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFllYXIgPSBsYXN0LnllYXI7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gbGFzdC5tb250aDtcclxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUgPSB7IHllYXI6IGxhc3QueWVhciwgbW9udGg6IGxhc3QubW9udGggfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FsZW5kYXJQb3NpdGlvbiA9PT0gJ2R5bmFtaWMnKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUR5bmFtaWNQb3NpdGlvbigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGVuZGFyUG9zaXRpb25DbGFzcyA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTdGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2hvd0NhbGVuZGFyKTtcclxuICAgICAgfSwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZUNhbGVuZGFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93Q2FsZW5kYXIgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGUgPSBmYWxzZTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyU3RhdGVDaGFuZ2UuZW1pdChmYWxzZSk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlRHluYW1pY1Bvc2l0aW9uKCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5zaG93Q2FsZW5kYXIpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IGNhbGVuZGFyRWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgJy5jYWxlbmRhci1wb3BvdmVyJ1xyXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgaWYgKCFjb250YWluZXJFbGVtZW50IHx8ICFjYWxlbmRhckVsZW1lbnQpIHJldHVybjtcclxuXHJcbiAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICBjb25zdCBwb3NpdGlvbmluZ0NvbnRhaW5lciA9IGNvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAnLmRhdGV0aW1lLXBpY2tlci1jb250YWluZXInXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uaW5nUmVjdCA9IHBvc2l0aW9uaW5nQ29udGFpbmVyXHJcbiAgICAgICAgPyBwb3NpdGlvbmluZ0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG4gICAgICAgIDogY29udGFpbmVyUmVjdDtcclxuXHJcbiAgICAgIGNvbnN0IGNhbGVuZGFySWNvbkVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgJy5jYWxlbmRhci1pY29uJ1xyXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBjb25zdCBpY29uUmVjdCA9XHJcbiAgICAgICAgY2FsZW5kYXJJY29uRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgfHwgY29udGFpbmVyUmVjdDtcclxuICAgICAgY29uc3Qgdmlld3BvcnRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcclxuICAgICAgY29uc3QgaXNNb2JpbGUgPSB2aWV3cG9ydFdpZHRoIDw9IDU3NjtcclxuXHJcbiAgICAgIGlmIChpc01vYmlsZSkge1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyV2lkdGggPSBNYXRoLm1pbihcclxuICAgICAgICAgIGNhbGVuZGFyRWxlbWVudC5vZmZzZXRXaWR0aCB8fCAzNTAsXHJcbiAgICAgICAgICB2aWV3cG9ydFdpZHRoIC0gMzJcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFySGVpZ2h0ID0gY2FsZW5kYXJFbGVtZW50Lm9mZnNldEhlaWdodCB8fCA0MDA7XHJcblxyXG4gICAgICAgIHRoaXMuYXBwbHlNb2JpbGVTdHlsZXMoXHJcbiAgICAgICAgICBpY29uUmVjdCxcclxuICAgICAgICAgIHBvc2l0aW9uaW5nUmVjdCxcclxuICAgICAgICAgIHZpZXdwb3J0V2lkdGgsXHJcbiAgICAgICAgICBjYWxlbmRhcldpZHRoXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCB2ZXJ0aWNhbENsYXNzID0gdGhpcy5nZXRWZXJ0aWNhbFBvc2l0aW9uQ2xhc3MoXHJcbiAgICAgICAgICBjb250YWluZXJSZWN0LFxyXG4gICAgICAgICAgdmlld3BvcnRIZWlnaHQsXHJcbiAgICAgICAgICBjYWxlbmRhckhlaWdodFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclBvc2l0aW9uQ2xhc3MgPSB2ZXJ0aWNhbENsYXNzO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMudXNlRml4ZWRQb3NpdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGNhbGVuZGFyV2lkdGggPSBjYWxlbmRhckVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMzAwO1xyXG5cclxuICAgICAgICBjb25zdCBwYWRkaW5nID0gNDtcclxuICAgICAgICBjb25zdCB0b3AgPSBpY29uUmVjdC5ib3R0b20gKyBwYWRkaW5nO1xyXG4gICAgICAgIGxldCBsZWZ0ID0gaWNvblJlY3QucmlnaHQgLSBjYWxlbmRhcldpZHRoO1xyXG5cclxuICAgICAgICBjb25zdCBtYXhMZWZ0ID0gdmlld3BvcnRXaWR0aCAtIGNhbGVuZGFyV2lkdGggLSBwYWRkaW5nO1xyXG4gICAgICAgIGxlZnQgPSBNYXRoLm1heChwYWRkaW5nLCBNYXRoLm1pbihsZWZ0LCBtYXhMZWZ0KSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FsU3R5bGUgPSB7XHJcbiAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcclxuICAgICAgICAgIHRvcDogYCR7dG9wfXB4YCxcclxuICAgICAgICAgIGxlZnQ6IGAke2xlZnR9cHhgLFxyXG4gICAgICAgICAgcmlnaHQ6ICdhdXRvJyxcclxuICAgICAgICAgIGJvdHRvbTogJ2F1dG8nLFxyXG4gICAgICAgICAgbWF4V2lkdGg6IG51bGwsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmNhbGVuZGFyUG9zaXRpb25DbGFzcyA9ICdjYWxlbmRhci1maXhlZCc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZXNldENhbFN0eWxlcygpO1xyXG4gICAgICAgIHRoaXMuY2FsZW5kYXJQb3NpdGlvbkNsYXNzID0gJyc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlNb2JpbGVTdHlsZXMoXHJcbiAgICBpY29uUmVjdDogRE9NUmVjdCxcclxuICAgIGNvbnRhaW5lclJlY3Q6IERPTVJlY3QsXHJcbiAgICB2aWV3cG9ydFdpZHRoOiBudW1iZXIsXHJcbiAgICBjYWxlbmRhcldpZHRoOiBudW1iZXJcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhZGRpbmcgPSAxNjtcclxuICAgIGNvbnN0IHdvdWxkT3ZlcmZsb3dSaWdodCA9XHJcbiAgICAgIGljb25SZWN0LnJpZ2h0ICsgY2FsZW5kYXJXaWR0aCArIHBhZGRpbmcgPiB2aWV3cG9ydFdpZHRoO1xyXG4gICAgY29uc3Qgd291bGRPdmVyZmxvd0xlZnQgPSBpY29uUmVjdC5sZWZ0IC0gY2FsZW5kYXJXaWR0aCAtIHBhZGRpbmcgPCAwO1xyXG5cclxuICAgIGxldCBsZWZ0OiBzdHJpbmc7XHJcbiAgICBsZXQgcmlnaHQ6IHN0cmluZztcclxuXHJcbiAgICBpZiAod291bGRPdmVyZmxvd1JpZ2h0ICYmIHdvdWxkT3ZlcmZsb3dMZWZ0KSB7XHJcbiAgICAgIGNvbnN0IGNlbnRlcmVkTGVmdCA9ICh2aWV3cG9ydFdpZHRoIC0gY2FsZW5kYXJXaWR0aCkgLyAyO1xyXG4gICAgICBjb25zdCBwYXJlbnRSZWxhdGl2ZUxlZnQgPSBjZW50ZXJlZExlZnQgLSBjb250YWluZXJSZWN0LmxlZnQ7XHJcbiAgICAgIGNvbnN0IG1pblJlbGF0aXZlTGVmdCA9IDE2IC0gY29udGFpbmVyUmVjdC5sZWZ0O1xyXG5cclxuICAgICAgbGVmdCA9IGAke01hdGgubWF4KG1pblJlbGF0aXZlTGVmdCwgcGFyZW50UmVsYXRpdmVMZWZ0KX1weGA7XHJcbiAgICAgIHJpZ2h0ID0gJ2F1dG8nO1xyXG4gICAgfSBlbHNlIGlmICh3b3VsZE92ZXJmbG93UmlnaHQpIHtcclxuICAgICAgY29uc3QgcmlnaHRPZmZzZXQgPSBjb250YWluZXJSZWN0LnJpZ2h0IC0gKHZpZXdwb3J0V2lkdGggLSBwYWRkaW5nKTtcclxuICAgICAgbGVmdCA9ICd1bnNldCc7XHJcbiAgICAgIHJpZ2h0ID0gYCR7TWF0aC5tYXgoMCwgcmlnaHRPZmZzZXQpfXB4YDtcclxuICAgIH0gZWxzZSBpZiAod291bGRPdmVyZmxvd0xlZnQpIHtcclxuICAgICAgY29uc3QgcGFyZW50UmVsYXRpdmVMZWZ0ID0gMTYgLSBjb250YWluZXJSZWN0LmxlZnQ7XHJcbiAgICAgIGxlZnQgPSBgJHtwYXJlbnRSZWxhdGl2ZUxlZnR9cHhgO1xyXG4gICAgICByaWdodCA9ICd1bnNldCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZWZ0ID0gJ3Vuc2V0JztcclxuICAgICAgcmlnaHQgPSAnMCc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYWxTdHlsZSA9IHtcclxuICAgICAgcG9zaXRpb246IG51bGwsXHJcbiAgICAgIHRvcDogbnVsbCxcclxuICAgICAgbGVmdCxcclxuICAgICAgcmlnaHQsXHJcbiAgICAgIGJvdHRvbTogbnVsbCxcclxuICAgICAgbWF4V2lkdGg6IGAke2NhbGVuZGFyV2lkdGh9cHhgLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXRDYWxTdHlsZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNhbFN0eWxlID0ge1xyXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiBudWxsLCBsZWZ0OiBudWxsLFxyXG4gICAgICByaWdodDogbnVsbCwgYm90dG9tOiBudWxsLCBtYXhXaWR0aDogbnVsbCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFZlcnRpY2FsUG9zaXRpb25DbGFzcyhcclxuICAgIGNvbnRhaW5lclJlY3Q6IERPTVJlY3QsXHJcbiAgICB2aWV3cG9ydEhlaWdodDogbnVtYmVyLFxyXG4gICAgY2FsZW5kYXJIZWlnaHQ6IG51bWJlclxyXG4gICk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzcGFjZUJlbG93ID0gdmlld3BvcnRIZWlnaHQgLSBjb250YWluZXJSZWN0LmJvdHRvbTtcclxuICAgIGNvbnN0IHNwYWNlQWJvdmUgPSBjb250YWluZXJSZWN0LnRvcDtcclxuXHJcbiAgICBpZiAoc3BhY2VCZWxvdyA+PSBjYWxlbmRhckhlaWdodCkgcmV0dXJuICdjYWxlbmRhci1wb3NpdGlvbi1ib3R0b20nO1xyXG4gICAgaWYgKHNwYWNlQWJvdmUgPj0gY2FsZW5kYXJIZWlnaHQpIHJldHVybiAnY2FsZW5kYXItcG9zaXRpb24tdG9wJztcclxuICAgIHJldHVybiBzcGFjZUJlbG93ID49IHNwYWNlQWJvdmVcclxuICAgICAgPyAnY2FsZW5kYXItcG9zaXRpb24tYm90dG9tJ1xyXG4gICAgICA6ICdjYWxlbmRhci1wb3NpdGlvbi10b3AnO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVNb250aChkaXJlY3Rpb246IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50TW9udGggKz0gZGlyZWN0aW9uO1xyXG4gICAgaWYgKHRoaXMuY3VycmVudE1vbnRoID4gMTIpIHtcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxO1xyXG4gICAgICB0aGlzLmN1cnJlbnRZZWFyKys7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudE1vbnRoIDwgMSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IDEyO1xyXG4gICAgICB0aGlzLmN1cnJlbnRZZWFyLS07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICB0aGlzLm1vbnRoQ2hhbmdlZC5lbWl0KHRoaXMuY3VycmVudE1vbnRoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5KTogdm9pZCB7XHJcbiAgICBpZiAoZGF5LmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3Qgc2VsZWN0ZWREYXRlOiBXc2xEYXRlU3RydWN0ID0ge1xyXG4gICAgICB5ZWFyOiBkYXkueWVhcixcclxuICAgICAgbW9udGg6IGRheS5tb250aCxcclxuICAgICAgZGF5OiBkYXkuZGF5LFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLm9uRGF0ZUNoYW5nZShzZWxlY3RlZERhdGUpO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlQ2FsZW5kYXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCBmaXJzdERheSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoIC0gMSwgMSk7XHJcbiAgICBjb25zdCBzdGFydERhdGUgPSBuZXcgRGF0ZShmaXJzdERheSk7XHJcbiAgICBjb25zdCB3ZWVrU3RhcnQgPSAodGhpcy5kYXRlQ29uZmlnPy53ZWVrU3RhcnQgPz8gMSkgJSA3O1xyXG4gICAgY29uc3QgZGF5T2ZXZWVrID0gKGZpcnN0RGF5LmdldERheSgpICsgNyAtIHdlZWtTdGFydCkgJSA3O1xyXG4gICAgc3RhcnREYXRlLnNldERhdGUoc3RhcnREYXRlLmdldERhdGUoKSAtIGRheU9mV2Vlayk7XHJcblxyXG4gICAgdGhpcy5jYWxlbmRhckRheXMgPSBbXTtcclxuICAgIGNvbnN0IHRvZGF5RGF0ZSA9IGdldEN1cnJlbnREYXRlKCk7XHJcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKHRvZGF5RGF0ZS55ZWFyLCB0b2RheURhdGUubW9udGggLSAxLCB0b2RheURhdGUuZGF5KTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQyOyBpKyspIHtcclxuICAgICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xyXG4gICAgICBjdXJyZW50RGF0ZS5zZXREYXRlKHN0YXJ0RGF0ZS5nZXREYXRlKCkgKyBpKTtcclxuXHJcbiAgICAgIGNvbnN0IGRheVN0cnVjdDogV3NsRGF0ZVN0cnVjdCA9IHtcclxuICAgICAgICB5ZWFyOiBjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgIG1vbnRoOiBjdXJyZW50RGF0ZS5nZXRNb250aCgpICsgMSxcclxuICAgICAgICBkYXk6IGN1cnJlbnREYXRlLmdldERhdGUoKSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IGNhbGVuZGFyRGF5OiBDYWxlbmRhckRheSA9IHtcclxuICAgICAgICBkYXk6IGN1cnJlbnREYXRlLmdldERhdGUoKSxcclxuICAgICAgICBtb250aDogY3VycmVudERhdGUuZ2V0TW9udGgoKSArIDEsXHJcbiAgICAgICAgeWVhcjogY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgICBvdGhlck1vbnRoOiBjdXJyZW50RGF0ZS5nZXRNb250aCgpICsgMSAhPT0gdGhpcy5jdXJyZW50TW9udGgsXHJcbiAgICAgICAgc2VsZWN0ZWQ6IHRoaXMuaXNEYXRlU2VsZWN0ZWQoZGF5U3RydWN0KSxcclxuICAgICAgICBkaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXlTdHJ1Y3QpLFxyXG4gICAgICAgIHRvZGF5OiB0aGlzLmlzU2FtZURhdGUoY3VycmVudERhdGUsIHRvZGF5KSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuY2FsZW5kYXJEYXlzLnB1c2goY2FsZW5kYXJEYXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0RhdGVTZWxlY3RlZChkYXRlOiBXc2xEYXRlU3RydWN0KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISEoXHJcbiAgICAgIHRoaXMuZGF0ZXRpbWUgJiZcclxuICAgICAgdGhpcy5kYXRldGltZS55ZWFyID09PSBkYXRlLnllYXIgJiZcclxuICAgICAgdGhpcy5kYXRldGltZS5tb250aCA9PT0gZGF0ZS5tb250aCAmJlxyXG4gICAgICB0aGlzLmRhdGV0aW1lLmRheSA9PT0gZGF0ZS5kYXlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRGF0ZURpc2FibGVkKGRhdGU6IFdzbERhdGVTdHJ1Y3QpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHNlbGVjdGVkRGF0ZSA9IG5ldyBEYXRlKGRhdGUueWVhciwgZGF0ZS5tb250aCAtIDEsIGRhdGUuZGF5KTtcclxuICAgIGNvbnN0IHRvZGF5RGF0ZSA9IGdldEN1cnJlbnREYXRlKCk7XHJcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKHRvZGF5RGF0ZS55ZWFyLCB0b2RheURhdGUubW9udGggLSAxLCB0b2RheURhdGUuZGF5KTtcclxuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG5cclxuICAgIGlmICh0aGlzLm1heERhdGUpIHtcclxuICAgICAgY29uc3QgbWF4RGF0ZSA9IG5ldyBEYXRlKFxyXG4gICAgICAgIHRoaXMubWF4RGF0ZS55ZWFyLFxyXG4gICAgICAgIHRoaXMubWF4RGF0ZS5tb250aCAtIDEsXHJcbiAgICAgICAgdGhpcy5tYXhEYXRlLmRheVxyXG4gICAgICApO1xyXG4gICAgICBpZiAoc2VsZWN0ZWREYXRlID4gbWF4RGF0ZSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubWluRGF0ZSkge1xyXG4gICAgICBjb25zdCBtaW5EYXRlID0gbmV3IERhdGUoXHJcbiAgICAgICAgdGhpcy5taW5EYXRlLnllYXIsXHJcbiAgICAgICAgdGhpcy5taW5EYXRlLm1vbnRoIC0gMSxcclxuICAgICAgICB0aGlzLm1pbkRhdGUuZGF5XHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChzZWxlY3RlZERhdGUgPCBtaW5EYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzICYmXHJcbiAgICAgIHRoaXMuYWxsb3dlZERhdGVzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLmFsbG93ZWREYXRlc1swXS5kYXkgPT09IC0xXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0ZSA+IHRvZGF5O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5hbGxvd2VkRGF0ZXMgfHwgdGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlzQWxsb3dlZCA9IHRoaXMuYWxsb3dlZERhdGVzLmZpbmQoXHJcbiAgICAgIChkYXlBbGxvd2VkKSA9PlxyXG4gICAgICAgIGRheUFsbG93ZWQueWVhciA9PT0gZGF0ZS55ZWFyICYmXHJcbiAgICAgICAgZGF5QWxsb3dlZC5tb250aCA9PT0gZGF0ZS5tb250aCAmJlxyXG4gICAgICAgIGRheUFsbG93ZWQuZGF5ID09PSBkYXRlLmRheVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gIWlzQWxsb3dlZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNDdXJyZW50RGF0ZURpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5hbGxvd2VkRGF0ZXMgfHxcclxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID09PSAwIHx8XHJcbiAgICAgICh0aGlzLmFsbG93ZWREYXRlcy5sZW5ndGggPT09IDEgJiYgdGhpcy5hbGxvd2VkRGF0ZXNbMF0uZGF5ID09PSAtMSlcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0b2RheSA9IGdldEN1cnJlbnREYXRlKCk7XHJcbiAgICByZXR1cm4gdGhpcy5pc0RhdGVEaXNhYmxlZCh0b2RheSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExhc3RBdmFpbGFibGVNb250aFllYXIoKToge1xyXG4gICAgeWVhcjogbnVtYmVyO1xyXG4gICAgbW9udGg6IG51bWJlcjtcclxuICB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBoYXNSZXN0cmljdGVkQWxsb3dlZERhdGVzID1cclxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMgJiZcclxuICAgICAgdGhpcy5hbGxvd2VkRGF0ZXMubGVuZ3RoID4gMCAmJlxyXG4gICAgICAhKHRoaXMuYWxsb3dlZERhdGVzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmFsbG93ZWREYXRlc1swXS5kYXkgPT09IC0xKTtcclxuXHJcbiAgICBpZiAoaGFzUmVzdHJpY3RlZEFsbG93ZWREYXRlcykge1xyXG4gICAgICBsZXQgbGFzdFllYXIgPSAwO1xyXG4gICAgICBsZXQgbGFzdE1vbnRoID0gMDtcclxuICAgICAgZm9yIChjb25zdCBkIG9mIHRoaXMuYWxsb3dlZERhdGVzKSB7XHJcbiAgICAgICAgY29uc3QgeW0gPSBkLnllYXIgKiAxMiArIGQubW9udGg7XHJcbiAgICAgICAgY29uc3QgbGFzdFltID0gbGFzdFllYXIgKiAxMiArIGxhc3RNb250aDtcclxuICAgICAgICBpZiAoeW0gPiBsYXN0WW0pIHtcclxuICAgICAgICAgIGxhc3RZZWFyID0gZC55ZWFyO1xyXG4gICAgICAgICAgbGFzdE1vbnRoID0gZC5tb250aDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGxhc3RZZWFyICYmIGxhc3RNb250aCA/IHsgeWVhcjogbGFzdFllYXIsIG1vbnRoOiBsYXN0TW9udGggfSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubWF4RGF0ZT8ueWVhciAmJiB0aGlzLm1heERhdGU/Lm1vbnRoKSB7XHJcbiAgICAgIHJldHVybiB7IHllYXI6IHRoaXMubWF4RGF0ZS55ZWFyLCBtb250aDogdGhpcy5tYXhEYXRlLm1vbnRoIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTYW1lRGF0ZShkYXRlMTogRGF0ZSwgZGF0ZTI6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGRhdGUxLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUyLmdldEZ1bGxZZWFyKCkgJiZcclxuICAgICAgZGF0ZTEuZ2V0TW9udGgoKSA9PT0gZGF0ZTIuZ2V0TW9udGgoKSAmJlxyXG4gICAgICBkYXRlMS5nZXREYXRlKCkgPT09IGRhdGUyLmdldERhdGUoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldE1vbnRoTmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1vbnRoSW5kZXggPSBtb250aCAtIDE7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICB0aGlzLmRhdGVDb25maWc/Lm1vbnRoTmFtZXM/Llttb250aEluZGV4XSB8fFxyXG4gICAgICBnZXREYXRlRm9ybWF0Q29uZmlnKCdlbicpLm1vbnRoTmFtZXNbbW9udGhJbmRleF1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVdlZWtkYXlMYWJlbHMoKTogdm9pZCB7XHJcbiAgICB0aGlzLndlZWtkYXlMYWJlbHMgPVxyXG4gICAgICB0aGlzLmRhdGVDb25maWc/LndlZWtkYXlMYWJlbHMgfHwgZ2V0RGF0ZUZvcm1hdENvbmZpZygnZW4nKS53ZWVrZGF5TGFiZWxzO1xyXG4gIH1cclxuXHJcbiAgYWRqdXN0VGltZShmaWVsZDogJ2hvdXJzJyB8ICdtaW51dGVzJyB8ICdzZWNvbmRzJywgc3RlcDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZGF0ZXRpbWVbZmllbGRdIHx8IDA7XHJcbiAgICBsZXQgbmV3VmFsdWU6IG51bWJlcjtcclxuXHJcbiAgICBpZiAoc3RlcCA+IDApIHtcclxuICAgICAgbmV3VmFsdWUgPSBjdXJyZW50VmFsdWUgKyBzdGVwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3Qgc3RlcFNpemUgPSBNYXRoLmFicyhzdGVwKTtcclxuICAgICAgbmV3VmFsdWUgPSBjdXJyZW50VmFsdWUgLSBzdGVwU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XHJcbiAgICAgIGNhc2UgJ2hvdXJzJzpcclxuICAgICAgICBpZiAobmV3VmFsdWUgPCAwKSB7XHJcbiAgICAgICAgICBuZXdWYWx1ZSA9IDI0ICsgKG5ld1ZhbHVlICUgMjQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmV3VmFsdWUgPiAyMykge1xyXG4gICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZSAlIDI0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbWludXRlcyc6XHJcbiAgICAgIGNhc2UgJ3NlY29uZHMnOlxyXG4gICAgICAgIGlmIChuZXdWYWx1ZSA8IDApIHtcclxuICAgICAgICAgIG5ld1ZhbHVlID0gNjAgKyAobmV3VmFsdWUgJSA2MCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChuZXdWYWx1ZSA+IDU5KSB7XHJcbiAgICAgICAgICBuZXdWYWx1ZSA9IG5ld1ZhbHVlICUgNjA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZGF0ZXRpbWVbZmllbGRdID0gbmV3VmFsdWU7XHJcbiAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBvblRpbWVGaWVsZENoYW5nZShcclxuICAgIGZpZWxkOiAnaG91cnMnIHwgJ21pbnV0ZXMnIHwgJ3NlY29uZHMnLFxyXG4gICAgZXZlbnQ6IEV2ZW50XHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgbGV0IHZhbHVlID0gcGFyc2VJbnQoaW5wdXQudmFsdWUsIDEwKTtcclxuXHJcbiAgICBpZiAoaXNOYU4odmFsdWUpKSB7XHJcbiAgICAgIHZhbHVlID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKGZpZWxkKSB7XHJcbiAgICAgIGNhc2UgJ2hvdXJzJzpcclxuICAgICAgICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDA7XHJcbiAgICAgICAgaWYgKHZhbHVlID4gMjMpIHZhbHVlID0gMjM7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxyXG4gICAgICBjYXNlICdzZWNvbmRzJzpcclxuICAgICAgICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDA7XHJcbiAgICAgICAgaWYgKHZhbHVlID4gNTkpIHZhbHVlID0gNTk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcblxyXG4gICAgdGhpcy5kYXRldGltZVtmaWVsZF0gPSB2YWx1ZTtcclxuICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNjaGVkdWxlVXBkYXRlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8IHRoaXMuX3VwZGF0ZVBlbmRpbmcpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLl91cGRhdGVQZW5kaW5nID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLl91cGRhdGVQZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlndXJhdGlvbigpO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmRldGVjdFRpbWVDb21wb25lbnRzKCk7XHJcbiAgICB0aGlzLnNldFN0YW5kYXJkRm9ybWF0KCk7XHJcbiAgICB0aGlzLnNldFBsYWNlaG9sZGVyKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGV0ZWN0VGltZUNvbXBvbmVudHMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0KSB7XHJcbiAgICAgIGNvbnN0IGhhc1RpbWVGb3JtYXQgPSB0aGlzLmhhc1RpbWVJbkZvcm1hdCh0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQpO1xyXG5cclxuICAgICAgaWYgKCFoYXNUaW1lRm9ybWF0KSB7XHJcbiAgICAgICAgdGhpcy5zaG93VGltZUNvbnRyb2xzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2Vjb25kcyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNEYXRlT25seSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNob3dUaW1lQ29udHJvbHMgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlzRGF0ZU9ubHkgPSBmYWxzZTtcclxuICAgICAgdGhpcy5fc2Vjb25kcyA9IHRoaXMuaW5wdXREYXRldGltZUZvcm1hdC5pbmNsdWRlcygnOnNzJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNob3dUaW1lQ29udHJvbHMgPSB0aGlzLl9zZWNvbmRzO1xyXG4gICAgICB0aGlzLmlzRGF0ZU9ubHkgPSAhdGhpcy5fc2Vjb25kcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFzVGltZUluRm9ybWF0KGZvcm1hdDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJ0hIOicpIHx8XHJcbiAgICAgIGZvcm1hdC5pbmNsdWRlcygnaGg6JykgfHxcclxuICAgICAgZm9ybWF0LmluY2x1ZGVzKCc6bW0nKSB8fFxyXG4gICAgICBmb3JtYXQuaW5jbHVkZXMoJzpzcycpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRTdGFuZGFyZEZvcm1hdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW50ZXJuYWxGb3JtYXQgPVxyXG4gICAgICB0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQgfHwgSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWTtcclxuICAgIHRoaXMuX3N0YW5kYXJkRm9ybWF0ID0gdGhpcy5pbnRlcm5hbEZvcm1hdDtcclxuXHJcbiAgICBpZiAodGhpcy5zaG93VGltZUNvbnRyb2xzICYmICF0aGlzLmhhc1RpbWVJbkZvcm1hdCh0aGlzLl9zdGFuZGFyZEZvcm1hdCkpIHtcclxuICAgICAgdGhpcy5fc3RhbmRhcmRGb3JtYXQgKz0gdGhpcy5fc2Vjb25kcyA/ICcgSEg6bW06c3MnIDogJyBISDptbSc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFBsYWNlaG9sZGVyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucGxhY2Vob2xkZXIgJiYgdGhpcy5wbGFjZWhvbGRlciAhPT0gJycpIHtcclxuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPVxyXG4gICAgICAgIHRoaXMuZGF0ZUNvbmZpZz8ucGxhY2Vob2xkZXIgfHwgSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zaG93VGltZUNvbnRyb2xzKSB7XHJcbiAgICAgIGlmICh0aGlzLl9wbGFjZWhvbGRlcj8uaW5jbHVkZXMoJ2hoOm1tJykpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX3BsYWNlaG9sZGVyICs9IHRoaXMuX3NlY29uZHMgPyAnIGhoOm1tOnNzJyA6ICcgaGg6bW0nO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZShuZXdNb2RlbDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAobmV3TW9kZWwpIHtcclxuICAgICAgY29uc3QgcGFyc2VkTW9kZWwgPSBEYXRlVGltZU1vZGVsLmZyb21Mb2NhbFN0cmluZyhuZXdNb2RlbCwgZmFsc2UpO1xyXG5cclxuICAgICAgaWYgKHBhcnNlZE1vZGVsICYmIHR5cGVvZiBwYXJzZWRNb2RlbC55ZWFyID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHRoaXMuZGF0ZXRpbWUgPSBPYmplY3QuYXNzaWduKFxyXG4gICAgICAgICAgdGhpcy5kYXRldGltZSB8fCBuZXcgRGF0ZVRpbWVNb2RlbCgpLFxyXG4gICAgICAgICAgcGFyc2VkTW9kZWxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFllYXIgPSBwYXJzZWRNb2RlbC55ZWFyO1xyXG4gICAgICAgIHRoaXMuY3VycmVudE1vbnRoID0gcGFyc2VkTW9kZWwubW9udGg7XHJcbiAgICAgICAgdGhpcy5zdGFydERhdGUgPSB7XHJcbiAgICAgICAgICB5ZWFyOiBwYXJzZWRNb2RlbC55ZWFyLFxyXG4gICAgICAgICAgbW9udGg6IHBhcnNlZE1vZGVsLm1vbnRoLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5kYXRlU3RyaW5nID0gbmV3TW9kZWw7XHJcbiAgICAgICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRldGltZSA9IG5ldyBEYXRlVGltZU1vZGVsKCk7XHJcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9ICcnO1xyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5hdmlnYXRlKGV2ZW50OiBXc2xEYXRlcGlja2VyTmF2aWdhdGVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50Py5jdXJyZW50ICYmIGV2ZW50Py5jdXJyZW50Lm1vbnRoICE9PSBldmVudD8ubmV4dC5tb250aCkge1xyXG4gICAgICB0aGlzLm1vbnRoQ2hhbmdlZC5lbWl0KGV2ZW50Py5uZXh0Lm1vbnRoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzRGlzYWJsZWQoXHJcbiAgICBkYXRlczogV3NsRGF0ZVN0cnVjdFtdXHJcbiAgKTogKFxyXG4gICAgZGF0ZTogV3NsRGF0ZVN0cnVjdCxcclxuICAgIGN1cnJlbnQ/OiB7IHllYXI6IG51bWJlcjsgbW9udGg6IG51bWJlciB9XHJcbiAgKSA9PiBib29sZWFuIHtcclxuICAgIHJldHVybiAocGlja2VyRGF0ZTogV3NsRGF0ZVN0cnVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBvcmlnaW5hbEFsbG93ZWREYXRlcyA9IHRoaXMuYWxsb3dlZERhdGVzO1xyXG4gICAgICB0aGlzLmFsbG93ZWREYXRlcyA9IGRhdGVzO1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmlzRGF0ZURpc2FibGVkKHBpY2tlckRhdGUpO1xyXG4gICAgICB0aGlzLmFsbG93ZWREYXRlcyA9IG9yaWdpbmFsQWxsb3dlZERhdGVzO1xyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRGF0ZVRpbWVTdGF0ZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmhhc1ZhbGlkRGF0ZSgpKSB7XHJcbiAgICAgIHRoaXMuc2hvd1RpbWVQaWNrZXJUb2dnbGUgPSAhdGhpcy5zaG93VGltZVBpY2tlclRvZ2dsZTtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREZWxpbWl0ZXIoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmRhdGVDb25maWc/LmZvcm1hdCkge1xyXG4gICAgICBjb25zdCBtYXRjaCA9IHRoaXMuZGF0ZUNvbmZpZy5mb3JtYXQubWF0Y2goL1teYS16QS1aMC05XS8pO1xyXG4gICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMF0pIHtcclxuICAgICAgICByZXR1cm4gbWF0Y2hbMF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmRhdGVDb25maWc/LmRhdGVTZXBhcmF0b3IgfHwgJy0nO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZURhdGUodmFsdWU6IHN0cmluZyk6IFdzbERhdGVTdHJ1Y3QgfCBudWxsIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGVsaW1pdGVyID0gdGhpcy5nZXREZWxpbWl0ZXIoKTtcclxuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZS5zcGxpdChkZWxpbWl0ZXIpO1xyXG5cclxuICAgIGlmIChkYXRlLmxlbmd0aCA8IDMpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuZGF0ZUNvbmZpZz8uZGF5Rmlyc3QpIHtcclxuICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChkYXRlWzBdLCAxMCk7XHJcbiAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChkYXRlWzFdLCAxMCk7XHJcbiAgICAgICAgY29uc3QgeWVhciA9IHBhcnNlSW50KGRhdGVbMl0sIDEwKTtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgaXNOYU4oZGF5KSB8fFxyXG4gICAgICAgICAgaXNOYU4obW9udGgpIHx8XHJcbiAgICAgICAgICBpc05hTih5ZWFyKSB8fFxyXG4gICAgICAgICAgZGF5IDwgMSB8fFxyXG4gICAgICAgICAgZGF5ID4gMzEgfHxcclxuICAgICAgICAgIG1vbnRoIDwgMSB8fFxyXG4gICAgICAgICAgbW9udGggPiAxMlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBkYXksIG1vbnRoLCB5ZWFyIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gRm9ybWF0OiBJTlBVVF9EQVRFX0ZPUk1BVFMuREFURV9PTkxZICh5eXl5LU1NLWRkKVxyXG4gICAgICAgIGNvbnN0IHllYXIgPSBwYXJzZUludChkYXRlWzBdLCAxMCk7XHJcbiAgICAgICAgY29uc3QgbW9udGggPSBwYXJzZUludChkYXRlWzFdLCAxMCk7XHJcbiAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQoZGF0ZVsyXSwgMTApO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBpc05hTihkYXkpIHx8XHJcbiAgICAgICAgICBpc05hTihtb250aCkgfHxcclxuICAgICAgICAgIGlzTmFOKHllYXIpIHx8XHJcbiAgICAgICAgICBkYXkgPCAxIHx8XHJcbiAgICAgICAgICBkYXkgPiAzMSB8fFxyXG4gICAgICAgICAgbW9udGggPCAxIHx8XHJcbiAgICAgICAgICBtb250aCA+IDEyXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IHllYXIsIG1vbnRoLCBkYXkgfTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdERhdGUoZGF0ZTogV3NsRGF0ZVRpbWVTdHJ1Y3QgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIGlmICghZGF0ZSkgcmV0dXJuICcnO1xyXG5cclxuICAgIGNvbnN0IGRheUZvcm1hdHRlZCA9IGRhdGUuZGF5IDwgMTAgPyAnMCcgKyBkYXRlLmRheSA6IGRhdGUuZGF5LnRvU3RyaW5nKCk7XHJcbiAgICBjb25zdCBtb250aEZvcm1hdHRlZCA9XHJcbiAgICAgIGRhdGUubW9udGggPCAxMCA/ICcwJyArIGRhdGUubW9udGggOiBkYXRlLm1vbnRoLnRvU3RyaW5nKCk7XHJcbiAgICBjb25zdCB5ZWFyRm9ybWF0dGVkID0gZGF0ZS55ZWFyLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgY29uc3QgaG91ckZvcm1hdHRlZCA9XHJcbiAgICAgIGRhdGUuaG91cnMgIT0gbnVsbFxyXG4gICAgICAgID8gZGF0ZS5ob3VycyA8IDEwXHJcbiAgICAgICAgICA/ICcwJyArIGRhdGUuaG91cnNcclxuICAgICAgICAgIDogZGF0ZS5ob3Vycy50b1N0cmluZygpXHJcbiAgICAgICAgOiAnMDAnO1xyXG4gICAgY29uc3QgbWludXRlRm9ybWF0dGVkID1cclxuICAgICAgZGF0ZS5taW51dGVzICE9IG51bGxcclxuICAgICAgICA/IGRhdGUubWludXRlcyA8IDEwXHJcbiAgICAgICAgICA/ICcwJyArIGRhdGUubWludXRlc1xyXG4gICAgICAgICAgOiBkYXRlLm1pbnV0ZXMudG9TdHJpbmcoKVxyXG4gICAgICAgIDogJzAwJztcclxuICAgIGNvbnN0IHNlY29uZEZvcm1hdHRlZCA9XHJcbiAgICAgIGRhdGUuc2Vjb25kcyAhPSBudWxsXHJcbiAgICAgICAgPyBkYXRlLnNlY29uZHMgPCAxMFxyXG4gICAgICAgICAgPyAnMCcgKyBkYXRlLnNlY29uZHNcclxuICAgICAgICAgIDogZGF0ZS5zZWNvbmRzLnRvU3RyaW5nKClcclxuICAgICAgICA6ICcwMCc7XHJcblxyXG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5pbnB1dERhdGV0aW1lRm9ybWF0O1xyXG5cclxuICAgIGNvbnN0IHRva2VuczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcclxuICAgICAgeXl5eTogeWVhckZvcm1hdHRlZCxcclxuICAgICAgTU06IG1vbnRoRm9ybWF0dGVkLFxyXG4gICAgICBkZDogZGF5Rm9ybWF0dGVkLFxyXG4gICAgICBISDogaG91ckZvcm1hdHRlZCxcclxuICAgICAgbW06IG1pbnV0ZUZvcm1hdHRlZCxcclxuICAgICAgc3M6IHNlY29uZEZvcm1hdHRlZCxcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGZvcm1hdCkge1xyXG4gICAgICBjb25zdCBzb3J0ZWRUb2tlbnMgPSBPYmplY3Qua2V5cyh0b2tlbnMpLnNvcnQoXHJcbiAgICAgICAgKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGhcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGxldCByZXN1bHQgPSBmb3JtYXQ7XHJcbiAgICAgIGZvciAoY29uc3QgdCBvZiBzb3J0ZWRUb2tlbnMpIHtcclxuICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShuZXcgUmVnRXhwKHQsICdnJyksIHRva2Vuc1t0XSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZvcm1hdHRlZERhdGUgPSBgJHt5ZWFyRm9ybWF0dGVkfS0ke21vbnRoRm9ybWF0dGVkfS0ke2RheUZvcm1hdHRlZH1gO1xyXG4gICAgaWYgKGRhdGUuaG91cnMgIT0gbnVsbCkge1xyXG4gICAgICBmb3JtYXR0ZWREYXRlICs9IGAgJHtob3VyRm9ybWF0dGVkfToke21pbnV0ZUZvcm1hdHRlZH1gO1xyXG4gICAgfVxyXG4gICAgaWYgKGRhdGUuc2Vjb25kcyAhPSBudWxsKSB7XHJcbiAgICAgIGZvcm1hdHRlZERhdGUgKz0gYDoke3NlY29uZEZvcm1hdHRlZH1gO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JtYXR0ZWREYXRlO1xyXG4gIH1cclxuXHJcbiAgb25JbnB1dENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcclxuXHJcbiAgICBpZiAodmFsdWUudHJpbSgpID09PSAnJykge1xyXG4gICAgICB0aGlzLmRhdGV0aW1lID0gbmV3IERhdGVUaW1lTW9kZWwoKTtcclxuICAgICAgdGhpcy5kYXRlU3RyaW5nID0gJyc7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5kYXRlU3RyaW5nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhcnNlZERhdGUgPSB0aGlzLnBhcnNlRGF0ZSh2YWx1ZSk7XHJcbiAgICBpZiAocGFyc2VkRGF0ZSkge1xyXG4gICAgICB0aGlzLmRhdGV0aW1lID0gbmV3IERhdGVUaW1lTW9kZWwoe1xyXG4gICAgICAgIHllYXI6IHBhcnNlZERhdGUueWVhcixcclxuICAgICAgICBtb250aDogcGFyc2VkRGF0ZS5tb250aCxcclxuICAgICAgICBkYXk6IHBhcnNlZERhdGUuZGF5LFxyXG4gICAgICAgIGhvdXJzOiB0aGlzLmRhdGV0aW1lPy5ob3VycyB8fCAwLFxyXG4gICAgICAgIG1pbnV0ZXM6IHRoaXMuZGF0ZXRpbWU/Lm1pbnV0ZXMgfHwgMCxcclxuICAgICAgICBzZWNvbmRzOiB0aGlzLmRhdGV0aW1lPy5zZWNvbmRzIHx8IDAsXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xyXG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGR0ID0gRGF0ZVRpbWVNb2RlbC5mcm9tTG9jYWxTdHJpbmcodmFsdWUpO1xyXG4gICAgaWYgKGR0ICYmIGR0LnllYXIpIHtcclxuICAgICAgdGhpcy5kYXRldGltZSA9IGR0O1xyXG4gICAgICB0aGlzLnNldERhdGVTdHJpbmdNb2RlbCgpO1xyXG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25EYXRlQ2hhbmdlKGV2ZW50OiBzdHJpbmcgfCBXc2xEYXRlU3RydWN0KTogdm9pZCB7XHJcbiAgICBsZXQgZGF0ZTogRGF0ZVRpbWVNb2RlbDtcclxuXHJcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xyXG4gICAgICBkYXRlID0gbmV3IERhdGVUaW1lTW9kZWwodGhpcy5wYXJzZURhdGUoZXZlbnQpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZVRpbWVNb2RlbChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFkYXRlIHx8ICFkYXRlLnllYXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5kYXRldGltZSkge1xyXG4gICAgICB0aGlzLmRhdGV0aW1lID0gZGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGV0aW1lLnllYXIgPSBkYXRlLnllYXI7XHJcbiAgICB0aGlzLmRhdGV0aW1lLm1vbnRoID0gZGF0ZS5tb250aDtcclxuICAgIHRoaXMuZGF0ZXRpbWUuZGF5ID0gZGF0ZS5kYXk7XHJcblxyXG4gICAgdGhpcy5jdXJyZW50WWVhciA9IGRhdGUueWVhcjtcclxuICAgIHRoaXMuY3VycmVudE1vbnRoID0gZGF0ZS5tb250aDtcclxuXHJcbiAgICB0aGlzLnN0YXJ0RGF0ZSA9IHtcclxuICAgICAgeWVhcjogZGF0ZS55ZWFyLFxyXG4gICAgICBtb250aDogZGF0ZS5tb250aCxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5zZXREYXRlU3RyaW5nTW9kZWwoKTtcclxuICB9XHJcblxyXG4gIHNldERhdGVTdHJpbmdNb2RlbCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRhdGV0aW1lICYmIHR5cGVvZiB0aGlzLmRhdGV0aW1lLnllYXIgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHRoaXMuZGF0ZVN0cmluZyA9IHRoaXMuZGF0ZXRpbWUudG9TdHJpbmcoKTtcclxuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGVTdHJpbmcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRlU3RyaW5nID0gJyc7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5kYXRlU3RyaW5nKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGdldERpc3BsYXlWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZGF0ZXRpbWUgJiYgdGhpcy5kYXRldGltZS55ZWFyKSB7XHJcbiAgICAgIGNvbnN0IGRhdGVTdHJ1Y3Q6IFdzbERhdGVUaW1lU3RydWN0ID0ge1xyXG4gICAgICAgIHllYXI6IHRoaXMuZGF0ZXRpbWUueWVhcixcclxuICAgICAgICBtb250aDogdGhpcy5kYXRldGltZS5tb250aCxcclxuICAgICAgICBkYXk6IHRoaXMuZGF0ZXRpbWUuZGF5LFxyXG4gICAgICAgIGhvdXJzOiB0aGlzLmRhdGV0aW1lLmhvdXJzLFxyXG4gICAgICAgIG1pbnV0ZXM6IHRoaXMuZGF0ZXRpbWUubWludXRlcyxcclxuICAgICAgICBzZWNvbmRzOiB0aGlzLmRhdGV0aW1lLnNlY29uZHMsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKGRhdGVTdHJ1Y3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIGlucHV0Qmx1cigpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBnZXRFZmZlY3RpdmVGb3JtYXQoKTogc3RyaW5nIHtcclxuICAgIGxldCBmb3JtYXQgPSB0aGlzLmlucHV0RGF0ZXRpbWVGb3JtYXQgfHwgSU5QVVRfREFURV9GT1JNQVRTLkRBVEVfT05MWTtcclxuXHJcbiAgICBpZiAodGhpcy5zaG93VGltZUNvbnRyb2xzICYmICF0aGlzLmhhc1RpbWVJbkZvcm1hdChmb3JtYXQpKSB7XHJcbiAgICAgIGZvcm1hdCArPSB0aGlzLl9zZWNvbmRzID8gJyBISDptbTpzcycgOiAnIEhIOm1tJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgb25UaW1lQ2hhbmdlKGV2ZW50OiBXc2xUaW1lU3RydWN0KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuZGF0ZXRpbWUgPSBuZXcgRGF0ZVRpbWVNb2RlbCh7XHJcbiAgICAgIC4uLnRoaXMuZGF0ZXRpbWUsXHJcbiAgICAgIGhvdXJzOiBldmVudC5ob3VycyxcclxuICAgICAgbWludXRlczogZXZlbnQubWludXRlcyxcclxuICAgICAgc2Vjb25kczogZXZlbnQuc2Vjb25kcyxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0RGF0ZVN0cmluZ01vZGVsKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIGdldERpc3BsYXlQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMucGxhY2Vob2xkZXIgIT0gbnVsbCAmJiB0aGlzLnBsYWNlaG9sZGVyICE9PSAnJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlcjtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjtcclxuICB9XHJcblxyXG4gIGhhc1ZhbGlkRGF0ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIShcclxuICAgICAgdGhpcy5kYXRldGltZSAmJlxyXG4gICAgICB0eXBlb2YgdGhpcy5kYXRldGltZS55ZWFyID09PSAnbnVtYmVyJyAmJlxyXG4gICAgICB0eXBlb2YgdGhpcy5kYXRldGltZS5tb250aCA9PT0gJ251bWJlcicgJiZcclxuICAgICAgdHlwZW9mIHRoaXMuZGF0ZXRpbWUuZGF5ID09PSAnbnVtYmVyJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZU1vbnRoc0FuZFllYXJzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5tb250aHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAxMiB9LCAoXywgaSkgPT5cclxuICAgICAgdGhpcy5nZXRNb250aE5hbWUoaSArIDEpXHJcbiAgICApO1xyXG4gICAgY29uc3QgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLm1pbkRhdGU/LnllYXIgfHwgY3VycmVudFllYXIgLSA1MDtcclxuICAgIGNvbnN0IGVuZFllYXIgPSB0aGlzLm1heERhdGU/LnllYXIgfHwgY3VycmVudFllYXIgKyA1MDtcclxuXHJcbiAgICB0aGlzLnllYXJzID0gQXJyYXkuZnJvbShcclxuICAgICAgeyBsZW5ndGg6IGVuZFllYXIgLSBzdGFydFllYXIgKyAxIH0sXHJcbiAgICAgIChfLCBpKSA9PiBlbmRZZWFyIC0gaVxyXG4gICAgKS5zb3J0KChhLCBiKSA9PiBiIC0gYSk7XHJcbiAgfVxyXG5cclxuICBvbk1vbnRoU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xyXG4gICAgY29uc3QgbmV3TW9udGggPSBwYXJzZUludChzZWxlY3QudmFsdWUsIDEwKTtcclxuICAgIGlmIChuZXdNb250aCAhPT0gdGhpcy5jdXJyZW50TW9udGgpIHtcclxuICAgICAgY29uc3Qgb2xkTW9udGggPSB0aGlzLmN1cnJlbnRNb250aDtcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXdNb250aDtcclxuICAgICAgdGhpcy5tb250aENoYW5nZWQuZW1pdChuZXdNb250aCk7XHJcbiAgICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gICAgICB0aGlzLm5hdmlnYXRlKHtcclxuICAgICAgICBjdXJyZW50OiB7IHllYXI6IHRoaXMuY3VycmVudFllYXIsIG1vbnRoOiBvbGRNb250aCB9LFxyXG4gICAgICAgIG5leHQ6IHsgeWVhcjogdGhpcy5jdXJyZW50WWVhciwgbW9udGg6IG5ld01vbnRoIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25ZZWFyU2VsZWN0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VsZWN0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50O1xyXG4gICAgY29uc3QgbmV3WWVhciA9IHBhcnNlSW50KHNlbGVjdC52YWx1ZSwgMTApO1xyXG4gICAgaWYgKG5ld1llYXIgIT09IHRoaXMuY3VycmVudFllYXIpIHtcclxuICAgICAgY29uc3Qgb2xkWWVhciA9IHRoaXMuY3VycmVudFllYXI7XHJcbiAgICAgIHRoaXMuY3VycmVudFllYXIgPSBuZXdZZWFyO1xyXG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZSh7XHJcbiAgICAgICAgY3VycmVudDogeyB5ZWFyOiBvbGRZZWFyLCBtb250aDogdGhpcy5jdXJyZW50TW9udGggfSxcclxuICAgICAgICBuZXh0OiB7IHllYXI6IG5ld1llYXIsIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRhdGV0aW1lLXBpY2tlci1jb250YWluZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtY29udGFpbmVyXCI+XHJcbiAgICA8aW5wdXQgI2RhdGVJbnB1dCBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgJ25nLXZhbGlkJzogbmdDb250cm9sPy52YWxpZCA9PT0gdHJ1ZSxcclxuICAgICAgICAnbmctaW52YWxpZCc6IG5nQ29udHJvbD8uaW52YWxpZCA9PT0gdHJ1ZSxcclxuICAgICAgICAnbmctZGlzYWJsZWQnOiBkaXNhYmxlZFxyXG4gICAgICB9XCIgY2xhc3M9XCJkYXRldGltZS1pbnB1dFwiIChibHVyKT1cImlucHV0Qmx1cigpXCIgW3BsYWNlaG9sZGVyXT1cImdldERpc3BsYXlQbGFjZWhvbGRlcigpXCIgW25nTW9kZWxdPVwiZ2V0RGlzcGxheVZhbHVlKClcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoJGV2ZW50KVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIHdzbFRvb2x0aXAgW3Rvb2x0aXBJY29uT3ZlcmxhcF09XCIxMlwiXHJcbiAgICAgIHRvb2x0aXBQbGFjZW1lbnQ9XCJ0b3BcIiAvPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNhbGVuZGFyLWljb25cIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgZGlzYWJsZUNhbGVuZGFyXCJcclxuICAgIFtuZ0NsYXNzXT1cInsgJ2Rpc2FibGVkLWJ0bic6IGRpc2FibGVkIHx8IGRpc2FibGVDYWxlbmRhciB9XCIgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKCRldmVudClcIj5cclxuICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgZmEtbGdcIj48L2k+XHJcbiAgPC9idXR0b24+XHJcblxyXG4gIDwhLS0gQ3VzdG9tIENhbGVuZGFyIFBvcG92ZXIgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLXBvcG92ZXJcIiBbY2xhc3Muc2hvd109XCJzaG93Q2FsZW5kYXJcIiBbY2xhc3MuaGlkZGVuXT1cIiFzaG93Q2FsZW5kYXJcIlxyXG4gICAgW25nQ2xhc3NdPVwiY2FsZW5kYXJQb3NpdGlvbkNsYXNzXCJcclxuICAgIFtzdHlsZS5wb3NpdGlvbl09XCJjYWxTdHlsZS5wb3NpdGlvblwiXHJcbiAgICBbc3R5bGUudG9wXT1cImNhbFN0eWxlLnRvcFwiXHJcbiAgICBbc3R5bGUubGVmdF09XCJjYWxTdHlsZS5sZWZ0XCJcclxuICAgIFtzdHlsZS5yaWdodF09XCJjYWxTdHlsZS5yaWdodFwiXHJcbiAgICBbc3R5bGUuYm90dG9tXT1cImNhbFN0eWxlLmJvdHRvbVwiXHJcbiAgICBbc3R5bGUubWF4LXdpZHRoXT1cImNhbFN0eWxlLm1heFdpZHRoXCJcclxuICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwb3BvdmVyLWNvbnRlbnRcIj5cclxuICAgICAgPGRpdiAqbmdJZj1cIiFzaG93VGltZVBpY2tlclRvZ2dsZVwiPlxyXG4gICAgICAgIDwhLS0gQ3VzdG9tIERhdGUgUGlja2VyIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tZGF0ZXBpY2tlclwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJuYXZpZ2F0ZU1vbnRoKC0xKVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1sZWZ0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vbnRoLXllYXItc2VsZWN0c1wiPlxyXG4gICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJtb250aC1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImN1cnJlbnRNb250aFwiIChjaGFuZ2UpPVwib25Nb250aFNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhzOyBsZXQgaSA9IGluZGV4XCIgW3ZhbHVlXT1cImkgKyAxXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IG1vbnRoIH19XHJcbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwieWVhci1zZWxlY3RcIiBbKG5nTW9kZWwpXT1cImN1cnJlbnRZZWFyXCIgKGNoYW5nZSk9XCJvblllYXJTZWxlY3QoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHllYXIgb2YgeWVhcnNcIiBbdmFsdWVdPVwieWVhclwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XHJcbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibmF2LWJ0blwiIChjbGljayk9XCJuYXZpZ2F0ZU1vbnRoKDEpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXJpZ2h0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLWNhbGVuZGFyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrZGF5c1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWVrZGF5XCIgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrZGF5TGFiZWxzXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXkgfX1cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF5c1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXktY2VsbFwiICpuZ0Zvcj1cImxldCBkYXkgb2YgY2FsZW5kYXJEYXlzXCIgW2NsYXNzLm90aGVyLW1vbnRoXT1cImRheS5vdGhlck1vbnRoXCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJkYXkuc2VsZWN0ZWRcIiBbY2xhc3MuZGlzYWJsZWRdPVwiZGF5LmRpc2FibGVkXCIgW2NsYXNzLnRvZGF5XT1cImRheS50b2RheVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXkpXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBkYXkuZGF5IH19XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJzaG93VGltZUNvbnRyb2xzICYmICFpc0RhdGVPbmx5XCIgY2xhc3M9XCJ0b2dnbGUtdGltZS1idG5cIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIiAoY2xpY2spPVwidG9nZ2xlRGF0ZVRpbWVTdGF0ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNsb2NrIGZhLWNsb2NrLW8gZmEtbGdcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cInNob3dUaW1lUGlja2VyVG9nZ2xlXCI+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInNob3dUaW1lQ29udHJvbHMgJiYgIWlzRGF0ZU9ubHlcIiBjbGFzcz1cInRvZ2dsZS1jYWxlbmRhci1idG5cIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVEYXRlVGltZVN0YXRlKCRldmVudClcIj5cclxuICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2FsZW5kYXIgZmEtbGdcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXBpY2tlci1jb250YWluZXJcIiAqbmdJZj1cInNob3dUaW1lQ29udHJvbHMgJiYgIWlzRGF0ZU9ubHlcIj5cclxuICAgICAgICAgIDwhLS0gQ3VzdG9tIFRpbWUgUGlja2VyIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS10aW1lcGlja2VyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWNvbnRyb2xzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtZmllbGRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/LmhvdXJzIHx8IFwiSEhcIiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1pbnB1dC1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ2hvdXJzJywgaG91cnNTdGVwIHx8IDEpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInRpbWUtaW5wdXRcIiBbdmFsdWVdPVwiZGF0ZXRpbWU/LmhvdXJzIHx8IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25UaW1lRmllbGRDaGFuZ2UoJ2hvdXJzJywgJGV2ZW50KVwiIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIiBtaW49XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICBtYXg9XCIyM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnaG91cnMnLCAtKGhvdXJzU3RlcCB8fCAxKSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tZG93blwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtc2VwYXJhdG9yXCI+OjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1maWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPnt7IGRhdGVDb25maWc/LnRva2Vucz8ubWludXRlcyB8fCBcIm1tXCIgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtaW5wdXQtZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0aW1lLWJ0blwiIChjbGljayk9XCJhZGp1c3RUaW1lKCdtaW51dGVzJywgbWludXRlc1N0ZXAgfHwgMSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNoZXZyb24tdXBcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwidGltZS1pbnB1dFwiIFt2YWx1ZV09XCJkYXRldGltZT8ubWludXRlcyB8fCAwXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVGltZUZpZWxkQ2hhbmdlKCdtaW51dGVzJywgJGV2ZW50KVwiIFtkaXNhYmxlZF09XCIhaGFzVmFsaWREYXRlKCkgfHwgZGlzYWJsZWRcIiBtaW49XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICBtYXg9XCI1OVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnbWludXRlcycsIC0obWludXRlc1N0ZXAgfHwgMSkpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWRvd25cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXNlcGFyYXRvclwiICpuZ0lmPVwic2Vjb25kc1wiPjo8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtZmllbGRcIiAqbmdJZj1cInNlY29uZHNcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD57eyBkYXRlQ29uZmlnPy50b2tlbnM/LnNlY29uZHMgfHwgXCJzc1wiIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLWlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidGltZS1idG5cIiAoY2xpY2spPVwiYWRqdXN0VGltZSgnc2Vjb25kcycsIHNlY29uZHNTdGVwIHx8IDEpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jaGV2cm9uLXVwXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cInRpbWUtaW5wdXRcIiBbdmFsdWVdPVwiZGF0ZXRpbWU/LnNlY29uZHMgfHwgMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRpbWVGaWVsZENoYW5nZSgnc2Vjb25kcycsICRldmVudClcIiBbZGlzYWJsZWRdPVwiIWhhc1ZhbGlkRGF0ZSgpIHx8IGRpc2FibGVkXCIgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4PVwiNTlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInRpbWUtYnRuXCIgKGNsaWNrKT1cImFkanVzdFRpbWUoJ3NlY29uZHMnLCAtKHNlY29uZHNTdGVwIHx8IDEpKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFoYXNWYWxpZERhdGUoKSB8fCBkaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gQmFja2Ryb3AgZm9yIGNsb3NpbmcgcG9wb3ZlciAtLT5cclxuPGRpdiBjbGFzcz1cImNhbGVuZGFyLWJhY2tkcm9wXCIgW2NsYXNzLnNob3ddPVwic2hvd0NhbGVuZGFyXCIgKGNsaWNrKT1cImNsb3NlQ2FsZW5kYXIoKVwiPjwvZGl2PiJdfQ==
|