@dereekb/dbx-form 9.24.4 → 9.24.5
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/calendar/lib/calendar.schedule.selection.store.d.ts +14 -5
- package/esm2020/calendar/lib/calendar.schedule.selection.dialog.component.mjs +3 -3
- package/esm2020/calendar/lib/calendar.schedule.selection.store.mjs +68 -32
- package/fesm2015/dereekb-dbx-form-calendar.mjs +69 -33
- package/fesm2015/dereekb-dbx-form-calendar.mjs.map +1 -1
- package/fesm2020/dereekb-dbx-form-calendar.mjs +69 -33
- package/fesm2020/dereekb-dbx-form-calendar.mjs.map +1 -1
- package/mapbox/package.json +4 -4
- package/package.json +4 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
2
|
import { dateBlockDayOfWeekFactory, dateBlockTimingDateFactory, dateScheduleDateFilter, copyDateScheduleDateFilterConfig, DateScheduleDayCode, dateScheduleEncodedWeek, dateTimingRelativeIndexFactory, expandDateScheduleDayCodes, expandDateScheduleDayCodesToDayOfWeekSet, findMaxDate, findMinDate, isDateInDateRangeFunction, isDateWithinDateBlockRangeFunction, isSameDate, isSameDateDay, isSameDateRange, isSameDateScheduleRange, dateTimingRelativeIndexArrayFactory, isInfiniteDateRange, copyHoursAndMinutesFromDate, dateTimezoneUtcNormal, expandDateScheduleRange } from '@dereekb/date';
|
|
3
|
-
import { filterMaybe } from '@dereekb/rxjs';
|
|
4
|
-
import { iterableToArray, addToSet, toggleInSet, isIndexNumberInIndexRangeFunction, minAndMaxNumber, setsAreEquivalent, range, unique, mergeArrays } from '@dereekb/util';
|
|
3
|
+
import { distinctUntilHasDifferentValues, filterMaybe } from '@dereekb/rxjs';
|
|
4
|
+
import { iterableToArray, addToSet, toggleInSet, isIndexNumberInIndexRangeFunction, minAndMaxNumber, setsAreEquivalent, range, unique, mergeArrays, removeFromSet } from '@dereekb/util';
|
|
5
5
|
import { ComponentStore } from '@ngrx/component-store';
|
|
6
6
|
import { startOfDay, endOfDay, isBefore } from 'date-fns';
|
|
7
7
|
import { distinctUntilChanged, map, shareReplay, switchMap, tap, first, combineLatestWith } from 'rxjs';
|
|
@@ -16,7 +16,7 @@ export function initialCalendarScheduleSelectionState() {
|
|
|
16
16
|
return {
|
|
17
17
|
start,
|
|
18
18
|
indexFactory,
|
|
19
|
-
|
|
19
|
+
toggledIndexes: new Set(),
|
|
20
20
|
scheduleDays,
|
|
21
21
|
allowedDaysOfWeek,
|
|
22
22
|
indexDayOfWeek,
|
|
@@ -70,7 +70,7 @@ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
|
|
|
70
70
|
/**
|
|
71
71
|
* @deprecated This is not the same as the current selection value. This is the set of manually togged off dates. It will be removed in a future update.
|
|
72
72
|
*/
|
|
73
|
-
this.selectedDates$ = this.state$.pipe(map((x) => x.
|
|
73
|
+
this.selectedDates$ = this.state$.pipe(map((x) => x.toggledIndexes), distinctUntilChanged(), shareReplay(1));
|
|
74
74
|
this.isEnabledFilterDayFunction$ = this.state$.pipe(map((x) => x.isEnabledFilterDay), shareReplay(1));
|
|
75
75
|
this.isEnabledDayFunction$ = this.state$.pipe(map((x) => x.isEnabledDay), shareReplay(1));
|
|
76
76
|
this.currentDateRange$ = this.state$.pipe(map(computeCalendarScheduleSelectionRange), distinctUntilChanged((a, b) => isSameDateRange(a, b)), shareReplay(1));
|
|
@@ -84,6 +84,9 @@ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
|
|
|
84
84
|
this.effectiveTimezone$ = this.state$.pipe(map((x) => (!calendarScheduleStartBeingUsedFromFilter(x) && x.timezone ? x.timezone : undefined)), distinctUntilChanged(), shareReplay(1));
|
|
85
85
|
this.effectiveTimezoneNormal$ = this.state$.pipe(map((x) => (!calendarScheduleStartBeingUsedFromFilter(x) && x.timezoneNormal ? x.timezoneNormal : undefined)), distinctUntilChanged(), shareReplay(1));
|
|
86
86
|
this.currentSelectionValue$ = this.state$.pipe(map((x) => x.currentSelectionValue), shareReplay(1));
|
|
87
|
+
this.currentSelectionValueDateBlockDurationSpan$ = this.currentSelectionValue$.pipe(map((x) => (x ? expandDateScheduleRange(x) : [])), shareReplay(1));
|
|
88
|
+
this.selectionValueSelectedIndexes$ = this.currentSelectionValueDateBlockDurationSpan$.pipe(map((x) => new Set(x.map((y) => y.i))), distinctUntilHasDifferentValues(), shareReplay(1));
|
|
89
|
+
this.selectionValue$ = this.currentSelectionValue$.pipe(filterMaybe(), shareReplay(1));
|
|
87
90
|
this.currentSelectionValueWithTimezone$ = this.currentSelectionValue$.pipe(combineLatestWith(this.effectiveTimezoneNormal$), map(([x, timezoneNormal]) => {
|
|
88
91
|
if (x && timezoneNormal) {
|
|
89
92
|
x = {
|
|
@@ -96,6 +99,8 @@ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
|
|
|
96
99
|
}
|
|
97
100
|
return x;
|
|
98
101
|
}), distinctUntilChanged(), shareReplay(1));
|
|
102
|
+
this.selectionValueWithTimezone$ = this.currentSelectionValueWithTimezone$.pipe(filterMaybe(), shareReplay(1));
|
|
103
|
+
this.selectionValueWithTimezoneDateBlockDurationSpan$ = this.selectionValueWithTimezone$.pipe(map((x) => expandDateScheduleRange(x)), shareReplay(1));
|
|
99
104
|
this.nextToggleSelection$ = this.hasConfiguredMinMaxRange$.pipe(switchMap((hasConfiguredMinMaxRange) => {
|
|
100
105
|
let obs;
|
|
101
106
|
if (hasConfiguredMinMaxRange) {
|
|
@@ -106,13 +111,10 @@ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
|
|
|
106
111
|
}
|
|
107
112
|
return obs;
|
|
108
113
|
}), shareReplay(1));
|
|
109
|
-
this.selectionValue$ = this.currentSelectionValueWithTimezone$.pipe(filterMaybe(), shareReplay(1));
|
|
110
|
-
this.selectionValueDateBlockDurationSpan$ = this.selectionValue$.pipe(map((x) => expandDateScheduleRange(x)), shareReplay(1));
|
|
111
|
-
this.selectionValueSelectedIndexes$ = this.selectionValueDateBlockDurationSpan$.pipe(map((x) => new Set(x.map((y) => y.i))), shareReplay(1));
|
|
112
114
|
this.currentDateScheduleRangeValue$ = this.currentSelectionValueWithTimezone$.pipe(map((x) => x?.dateScheduleRange), distinctUntilChanged(isSameDateScheduleRange), shareReplay(1));
|
|
113
115
|
this.dateScheduleRangeValue$ = this.currentDateScheduleRangeValue$.pipe(filterMaybe(), shareReplay(1));
|
|
114
116
|
this.cellContentFactory$ = this.state$.pipe(map((x) => x.cellContentFactory), distinctUntilChanged(), shareReplay(1));
|
|
115
|
-
this.isCustomized$ = this.state$.pipe(map((x) => x.
|
|
117
|
+
this.isCustomized$ = this.state$.pipe(map((x) => x.toggledIndexes.size > 0), distinctUntilChanged(), shareReplay(1));
|
|
116
118
|
// MARK: State Changes
|
|
117
119
|
this.setMinMaxDateRange = this.updater(updateStateWithMinMaxDateRange);
|
|
118
120
|
this.setFilter = this.updater(updateStateWithFilter);
|
|
@@ -121,10 +123,13 @@ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
|
|
|
121
123
|
this.clearFilter = this.updater((state) => updateStateWithFilter(state, undefined));
|
|
122
124
|
this.setTimezone = this.updater(updateStateWithTimezoneValue);
|
|
123
125
|
this.setInputRange = this.updater(updateStateWithChangedRange);
|
|
126
|
+
// NOTE: Selected dates are NOT selected indexes. They are the internal selected dates that are excluded from the selection.
|
|
124
127
|
this.toggleSelectedDates = this.updater((state, toggle) => updateStateWithChangedDates(state, { toggle }));
|
|
125
128
|
this.addSelectedDates = this.updater((state, add) => updateStateWithChangedDates(state, { add }));
|
|
126
129
|
this.removeSelectedDates = this.updater((state, remove) => updateStateWithChangedDates(state, { remove }));
|
|
127
130
|
this.setSelectedDates = this.updater((state, set) => updateStateWithChangedDates(state, { set }));
|
|
131
|
+
// NOTE: Selected indexes are the typical/expected indexes that are selected or not.
|
|
132
|
+
this.setSelectedIndexes = this.updater((state, set) => updateStateWithChangedDates(state, { set, invertSetBehavior: true }));
|
|
128
133
|
this.selectAllDates = this.updater((state, selectAll = 'all') => updateStateWithChangedDates(state, { selectAll }));
|
|
129
134
|
this.setInitialSelectionState = this.updater(updateStateWithInitialSelectionState);
|
|
130
135
|
this.setScheduleDays = this.updater(updateStateWithChangedScheduleDays);
|
|
@@ -139,8 +144,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
|
|
|
139
144
|
type: Injectable
|
|
140
145
|
}], ctorParameters: function () { return []; } });
|
|
141
146
|
export function updateStateWithInitialSelectionState(state, initialSelectionState) {
|
|
142
|
-
const {
|
|
143
|
-
if (
|
|
147
|
+
const { toggledIndexes } = state;
|
|
148
|
+
if (toggledIndexes.size === 0 && initialSelectionState === 'all') {
|
|
144
149
|
state = updateStateWithChangedDates(state, { selectAll: initialSelectionState });
|
|
145
150
|
}
|
|
146
151
|
return { ...state, initialSelectionState };
|
|
@@ -270,7 +275,7 @@ export function updateStateWithDateScheduleRangeValue(state, change) {
|
|
|
270
275
|
}
|
|
271
276
|
else {
|
|
272
277
|
if (change != null) {
|
|
273
|
-
const nextState = { ...state, inputStart: change.start, inputEnd: change.end,
|
|
278
|
+
const nextState = { ...state, inputStart: change.start, inputEnd: change.end, toggledIndexes: new Set(change.ex) };
|
|
274
279
|
return updateStateWithChangedScheduleDays(finalizeNewCalendarScheduleSelectionState(nextState), expandDateScheduleDayCodes(change.w || '89'));
|
|
275
280
|
}
|
|
276
281
|
else {
|
|
@@ -291,12 +296,20 @@ export function updateStateWithChangedScheduleDays(state, change) {
|
|
|
291
296
|
}
|
|
292
297
|
}
|
|
293
298
|
export function updateStateWithChangedDates(state, change) {
|
|
294
|
-
const { indexFactory, allowedDaysOfWeek, indexDayOfWeek, inputStart: currentInputStart, inputEnd: currentInputEnd, minMaxDateRange } = state;
|
|
299
|
+
const { indexFactory, allowedDaysOfWeek, indexDayOfWeek, inputStart: currentInputStart, inputEnd: currentInputEnd, minMaxDateRange, filter } = state;
|
|
295
300
|
const { start: minDate, end: maxDate } = calendarScheduleMinAndMaxDateRange(state);
|
|
296
301
|
let inputStart = currentInputStart;
|
|
297
302
|
let inputEnd = currentInputEnd;
|
|
298
|
-
|
|
299
|
-
|
|
303
|
+
/**
|
|
304
|
+
* This is a set of indexes that are internally "selected" so that they are excluded from the inputStart/inputEnd date range.
|
|
305
|
+
*
|
|
306
|
+
* Do not confuse this with the actual indexes that are selected.
|
|
307
|
+
*/
|
|
308
|
+
let toggledIndexes;
|
|
309
|
+
function asIndexes(indexes) {
|
|
310
|
+
return iterableToArray(indexes).map(indexFactory);
|
|
311
|
+
}
|
|
312
|
+
if (change.reset || change.selectAll != null || change.set != null) {
|
|
300
313
|
let set = change.set ?? [];
|
|
301
314
|
const selectAll = change.reset === true ? state.initialSelectionState : change.selectAll;
|
|
302
315
|
switch (selectAll) {
|
|
@@ -313,29 +326,52 @@ export function updateStateWithChangedDates(state, change) {
|
|
|
313
326
|
set = [];
|
|
314
327
|
break;
|
|
315
328
|
}
|
|
316
|
-
|
|
329
|
+
toggledIndexes = new Set(asIndexes(set));
|
|
330
|
+
if (change.invertSetBehavior && minDate && maxDate && !selectAll) {
|
|
331
|
+
const minIndex = indexFactory(minDate);
|
|
332
|
+
const maxIndex = indexFactory(maxDate);
|
|
333
|
+
inputStart = minDate;
|
|
334
|
+
inputEnd = maxDate;
|
|
335
|
+
toggledIndexes = new Set(range(minIndex, maxIndex + 1).filter((x) => !toggledIndexes.has(x)));
|
|
336
|
+
}
|
|
317
337
|
}
|
|
318
338
|
else {
|
|
319
|
-
|
|
339
|
+
toggledIndexes = new Set(state.toggledIndexes);
|
|
320
340
|
if (change.toggle) {
|
|
321
|
-
const allowedToToggle =
|
|
322
|
-
|
|
323
|
-
.filter((i) => allowedDaysOfWeek.has(indexDayOfWeek(i)));
|
|
324
|
-
toggleInSet(selectedIndexes, allowedToToggle);
|
|
341
|
+
const allowedToToggle = asIndexes(change.toggle).filter((i) => allowedDaysOfWeek.has(indexDayOfWeek(i)));
|
|
342
|
+
toggleInSet(toggledIndexes, allowedToToggle);
|
|
325
343
|
}
|
|
344
|
+
let addToExclusion;
|
|
345
|
+
let removeFromExclusion;
|
|
326
346
|
if (change.add) {
|
|
327
|
-
|
|
347
|
+
if (change.invertSetBehavior) {
|
|
348
|
+
addToExclusion = change.add;
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
removeFromExclusion = change.add;
|
|
352
|
+
}
|
|
328
353
|
}
|
|
329
354
|
if (change.remove) {
|
|
330
|
-
|
|
355
|
+
if (change.invertSetBehavior) {
|
|
356
|
+
removeFromExclusion = change.remove;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
addToExclusion = change.remove;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (addToExclusion) {
|
|
363
|
+
removeFromSet(toggledIndexes, asIndexes(addToExclusion));
|
|
364
|
+
}
|
|
365
|
+
if (removeFromExclusion) {
|
|
366
|
+
addToSet(toggledIndexes, asIndexes(removeFromExclusion));
|
|
331
367
|
}
|
|
332
368
|
}
|
|
333
|
-
const nextState = { ...state, inputStart, inputEnd,
|
|
369
|
+
const nextState = { ...state, inputStart, inputEnd, toggledIndexes };
|
|
334
370
|
nextState.isEnabledDay = isEnabledDayInCalendarScheduleSelectionState(nextState);
|
|
335
371
|
// Recalculate the range and simplified to exclusions
|
|
336
372
|
const rangeAndExclusion = computeScheduleSelectionRangeAndExclusion(nextState);
|
|
337
373
|
if (rangeAndExclusion) {
|
|
338
|
-
return finalizeNewCalendarScheduleSelectionState({ ...nextState,
|
|
374
|
+
return finalizeNewCalendarScheduleSelectionState({ ...nextState, toggledIndexes: new Set(rangeAndExclusion.excluded), inputStart: rangeAndExclusion.start, inputEnd: rangeAndExclusion.end });
|
|
339
375
|
}
|
|
340
376
|
else {
|
|
341
377
|
// no selected days
|
|
@@ -343,7 +379,7 @@ export function updateStateWithChangedDates(state, change) {
|
|
|
343
379
|
}
|
|
344
380
|
}
|
|
345
381
|
export function noSelectionCalendarScheduleSelectionState(state) {
|
|
346
|
-
return finalizeNewCalendarScheduleSelectionState({ ...state,
|
|
382
|
+
return finalizeNewCalendarScheduleSelectionState({ ...state, toggledIndexes: new Set(), inputStart: null, inputEnd: null });
|
|
347
383
|
}
|
|
348
384
|
export function updateStateWithChangedRange(state, change) {
|
|
349
385
|
const { inputStart: currentInputStart, inputEnd: currentInputEnd, indexFactory, minMaxDateRange } = state;
|
|
@@ -357,11 +393,11 @@ export function updateStateWithChangedRange(state, change) {
|
|
|
357
393
|
// retain all indexes that are within the new range
|
|
358
394
|
const minIndex = indexFactory(inputStart);
|
|
359
395
|
const maxIndex = indexFactory(inputEnd) + 1;
|
|
360
|
-
const currentIndexes = Array.from(state.
|
|
396
|
+
const currentIndexes = Array.from(state.toggledIndexes);
|
|
361
397
|
const isInCurrentRange = isIndexNumberInIndexRangeFunction({ minIndex, maxIndex });
|
|
362
398
|
const excludedIndexesInNewRange = currentIndexes.filter(isInCurrentRange);
|
|
363
|
-
const
|
|
364
|
-
const nextState = { ...state,
|
|
399
|
+
const toggledIndexes = new Set(excludedIndexesInNewRange);
|
|
400
|
+
const nextState = { ...state, toggledIndexes, inputStart, inputEnd };
|
|
365
401
|
return finalizeNewCalendarScheduleSelectionState(nextState);
|
|
366
402
|
}
|
|
367
403
|
export function finalizeNewCalendarScheduleSelectionState(nextState) {
|
|
@@ -382,7 +418,7 @@ export function isEnabledDayInCalendarScheduleSelectionState(state) {
|
|
|
382
418
|
const index = indexFactory(input);
|
|
383
419
|
const dayOfWeek = indexDayOfWeek(index);
|
|
384
420
|
const isInSelectedRange = isInStartAndEndRange(input);
|
|
385
|
-
const isSelected = state.
|
|
421
|
+
const isSelected = state.toggledIndexes.has(index);
|
|
386
422
|
const isAllowedDayOfWeek = allowedDaysOfWeek.has(dayOfWeek);
|
|
387
423
|
const result = isAllowedDayOfWeek && ((isInSelectedRange && !isSelected) || (isSelected && !isInSelectedRange));
|
|
388
424
|
return result;
|
|
@@ -464,8 +500,8 @@ export function computeCalendarScheduleSelectionRange(state) {
|
|
|
464
500
|
}
|
|
465
501
|
export function computeCalendarScheduleSelectionDateBlockRange(state) {
|
|
466
502
|
const { indexFactory, inputStart, inputEnd, allowedDaysOfWeek, indexDayOfWeek, isEnabledDay, isEnabledFilterDay } = state;
|
|
467
|
-
const
|
|
468
|
-
const minAndMaxSelectedValues = minAndMaxNumber(
|
|
503
|
+
const enabledExclusionIndexes = Array.from(state.toggledIndexes).filter((i) => allowedDaysOfWeek.has(indexDayOfWeek(i)));
|
|
504
|
+
const minAndMaxSelectedValues = minAndMaxNumber(enabledExclusionIndexes);
|
|
469
505
|
let startRange;
|
|
470
506
|
let endRange;
|
|
471
507
|
if (minAndMaxSelectedValues) {
|
|
@@ -506,4 +542,4 @@ export function computeCalendarScheduleSelectionDateBlockRange(state) {
|
|
|
506
542
|
return undefined;
|
|
507
543
|
}
|
|
508
544
|
}
|
|
509
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwseUJBQXlCLEVBR3pCLDBCQUEwQixFQUcxQixzQkFBc0IsRUFDdEIsZ0NBQWdDLEVBRWhDLG1CQUFtQixFQUNuQix1QkFBdUIsRUFJdkIsOEJBQThCLEVBQzlCLDBCQUEwQixFQUMxQix3Q0FBd0MsRUFDeEMsV0FBVyxFQUNYLFdBQVcsRUFDWCx5QkFBeUIsRUFFekIsa0NBQWtDLEVBQ2xDLFVBQVUsRUFDVixhQUFhLEVBQ2IsZUFBZSxFQUNmLHVCQUF1QixFQUV2QixtQ0FBbUMsRUFDbkMsbUJBQW1CLEVBQ25CLDJCQUEyQixFQUMzQixxQkFBcUIsRUFFckIsdUJBQXVCLEVBR3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUE0RCxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBWSxlQUFlLEVBQUUsaUJBQWlCLEVBQWEsS0FBSyxFQUFzQixNQUFNLEVBQUUsV0FBVyxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUMzUixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFELE9BQU8sRUFBYyxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLGlCQUFp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QUFFO1lBQ3RELElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUM1QyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2dCQUNiLE1BQU07YUFDUDtTQUNGO0tBQ0Y7SUFFRCxJQUFJLFVBQVUsSUFBSSxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtRQUMxQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7S0FDeEM7U0FBTTtRQUNMLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIERhdGVCbG9ja0RheU9mV2Vla0ZhY3RvcnksXG4gIGRhdGVCbG9ja0RheU9mV2Vla0ZhY3RvcnksXG4gIERhdGVCbG9ja0luZGV4LFxuICBEYXRlQmxvY2tSYW5nZVdpdGhSYW5nZSxcbiAgZGF0ZUJsb2NrVGltaW5nRGF0ZUZhY3RvcnksXG4gIERhdGVPckRhdGVCbG9ja0luZGV4LFxuICBEYXRlUmFuZ2UsXG4gIGRhdGVTY2hlZHVsZURhdGVGaWx0ZXIsXG4gIGNvcHlEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnLFxuICBEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnLFxuICBEYXRlU2NoZWR1bGVEYXlDb2RlLFxuICBkYXRlU2NoZWR1bGVFbmNvZGVkV2VlayxcbiAgRGF0ZVNjaGVkdWxlRW5jb2RlZFdlZWssXG4gIERhdGVTY2hlZHVsZVJhbmdlLFxuICBEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnksXG4gIGRhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeSxcbiAgZXhwYW5kRGF0ZVNjaGVkdWxlRGF5Q29kZXMsXG4gIGV4cGFuZERhdGVTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQsXG4gIGZpbmRNYXhEYXRlLFxuICBmaW5kTWluRGF0ZSxcbiAgaXNEYXRlSW5EYXRlUmFuZ2VGdW5jdGlvbixcbiAgSXNEYXRlV2l0aGluRGF0ZUJsb2NrUmFuZ2VGdW5jdGlvbixcbiAgaXNEYXRlV2l0aGluRGF0ZUJsb2NrUmFuZ2VGdW5jdGlvbixcbiAgaXNTYW1lRGF0ZSxcbiAgaXNTYW1lRGF0ZURheSxcbiAgaXNTYW1lRGF0ZVJhbmdlLFxuICBpc1NhbWVEYXRlU2NoZWR1bGVSYW5nZSxcbiAgRGF0ZU9yRGF0ZVJhbmdlT3JEYXRlQmxvY2tJbmRleE9yRGF0ZUJsb2NrUmFuZ2UsXG4gIGRhdGVUaW1pbmdSZWxhdGl2ZUluZGV4QXJyYXlGYWN0b3J5LFxuICBpc0luZmluaXRlRGF0ZVJhbmdlLFxuICBjb3B5SG91cnNBbmRNaW51dGVzRnJvbURhdGUsXG4gIGRhdGVUaW1lem9uZVV0Y05vcm1hbCxcbiAgRGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2UsXG4gIGV4cGFuZERhdGVTY2hlZHVsZVJhbmdlLFxuICBEYXRlQmxvY2ssXG4gIERhdGVCbG9ja0R1cmF0aW9uU3BhblxufSBmcm9tICdAZGVyZWVrYi9kYXRlJztcbmltcG9ydCB7IGZpbHRlck1heWJlIH0gZnJvbSAnQGRlcmVla2Ivcnhqcyc7XG5pbXBvcnQgeyBNYXliZSwgVGltZXpvbmVTdHJpbmcsIERlY2lzaW9uRnVuY3Rpb24sIEl0ZXJhYmxlT3JWYWx1ZSwgaXRlcmFibGVUb0FycmF5LCBhZGRUb1NldCwgdG9nZ2xlSW5TZXQsIGlzSW5kZXhOdW1iZXJJbkluZGV4UmFuZ2VGdW5jdGlvbiwgTWF5YmVNYXAsIG1pbkFuZE1heE51bWJlciwgc2V0c0FyZUVxdWl2YWxlbnQsIERheU9mV2VlaywgcmFuZ2UsIEFsbE9yTm9uZVNlbGVjdGlvbiwgdW5pcXVlLCBtZXJnZUFycmF5cywgQXJyYXlPclZhbHVlIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBDb21wb25lbnRTdG9yZSB9IGZyb20gJ0BuZ3J4L2NvbXBvbmVudC1zdG9yZSc7XG5pbXBvcnQgeyBzdGFydE9mRGF5LCBlbmRPZkRheSwgaXNCZWZvcmUgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXAsIGZpcnN0LCBjb21iaW5lTGF0ZXN0V2l0aCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSwgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlLCBkZWZhdWx0Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSB9IGZyb20gJy4vY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2Uge1xuICAvKipcbiAgICogSW5wdXQgU3RhcnQgRGF0ZVxuICAgKi9cbiAgaW5wdXRTdGFydDogRGF0ZTtcbiAgLyoqXG4gICAqIElucHV0IEVuZCBEYXRlXG4gICAqL1xuICBpbnB1dEVuZDogRGF0ZTtcbn1cblxuZXhwb3J0IHR5cGUgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSA9IFBhcnRpYWw8TWF5YmVNYXA8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIGV4dGVuZHMgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSB7XG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRoZSBkYXlzIG9mIHRoZSBzY2hlZHVsZSB0byBvbmx5IGFsbG93IHNlbGVjdGluZyBkYXlzIGluIHRoZSBzY2hlZHVsZS5cbiAgICpcbiAgICogSWYgZmlsdGVyLnN0YXJ0IGlzIHByb3ZpZGVkLCB0aGVuIHRoZSB0aW1lem9uZSBpcyBpZ25vcmVkLCBpZiBvbmUgaXMgcHJlc2VudC5cbiAgICovXG4gIGZpbHRlcj86IE1heWJlPERhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc+O1xuICAvKipcbiAgICogQWRkaXRpb25hbCBleGNsdXNpb25zIHRoYXQgbWF5IG5vdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZmlsdGVyLlxuICAgKi9cbiAgaW5wdXRFeGNsdXNpb25zPzogTWF5YmU8QXJyYXlPclZhbHVlPERhdGVPckRhdGVSYW5nZU9yRGF0ZUJsb2NrSW5kZXhPckRhdGVCbG9ja1JhbmdlPj47XG4gIC8qKlxuICAgKiBUaGUgY29tcHV0ZWQgZXhjbHVzaW9ucyBnaXZlbiB0aGUgaW5wdXQgZXhjbHVzaW9ucy5cbiAgICovXG4gIGNvbXB1dGVkRXhjbHVzaW9ucz86IE1heWJlPERhdGVCbG9ja0luZGV4W10+O1xuICAvKipcbiAgICogVGhlIG1pbi9tYXggZGF0ZSByYW5nZS4gVXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIG1pbi9tYXggdmFsdWUuIFdvcmtzIHdpdGggdGhlIGZpbHRlci4gVGhlIGdyZWF0ZXIvbGVzc2VyIG9mIHRoZSBzdGFydC9lbmQgZGF0ZXMgYXJlIHVzZWQgaWYgYm90aCBhcmUgcHJvdmlkZWQuXG4gICAqL1xuICBtaW5NYXhEYXRlUmFuZ2U/OiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+O1xuICAvKipcbiAgICogU3RhcnQgZGF0ZS4gSXMgdXBkYXRlZCBhcyB0aGUgaW5wdXRTdGFydCBpcyBtb2RpZmllZCBvciBmaWx0ZXIgaXMgcHJvdmlkZWQgdGhhdCBwcm92aWRlcyB0aGUgc3RhcnQgZGF0ZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdG9kYXkgYW5kIHRoZSBjdXJyZW50IHRpbWV6b25lLlxuICAgKi9cbiAgc3RhcnQ6IERhdGU7XG4gIC8qKlxuICAgKiBUaW1lem9uZSB0byB1c2UuIE9ubHlJbmZsdWVuY2VzIHRoZSBvdXRwdXQgc3RhcnQgZGF0ZS5cbiAgICovXG4gIHRpbWV6b25lPzogTWF5YmU8VGltZXpvbmVTdHJpbmc+O1xuICAvKipcbiAgICogQ3VycmVudCB0aW1lem9uZSBub3JtYWwgd2l0aCB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIHRpbWV6b25lTm9ybWFsPzogTWF5YmU8RGF0ZVRpbWV6b25lVXRjTm9ybWFsSW5zdGFuY2U+O1xuICAvKipcbiAgICogRGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5XG4gICAqL1xuICBpbmRleEZhY3Rvcnk6IERhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeTtcbiAgLyoqXG4gICAqIEFycmF5IG9mIG1hbnVhbGx5IHNlbGVjdGVkIGRhdGVzIHdpdGhpbiB0aGUgcGlja2VkIHJhbmdlLiBUaGlzIGlzIG5vdCB0aGUgc2V0IG9mIGFsbCBlbmFibGVkIGluZGV4ZXMuXG4gICAqXG4gICAqIFZhbHVlcyB0aGF0IGV4aXN0IG91dHNpZGUgb2YgdGhlIFwiaW5wdXRcIiByYW5nZSBhcmUgY29uc2lkZXJlZCB0b2dnbGVkIG9uLCB3aGlsZSB0aG9zZVxuICAgKiB0aGF0IGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIHJhbmdlIGFyZSBjb25zaWRlcmVkIHRvZ2dsZWQgb2ZmLlxuICAgKlxuICAgKiBJZiBkYXRlcyBhcmUgc2VsZWN0ZWQsIGFuZCB0aGVuIGEgcmFuZ2UgaXMgc2VsZWN0ZWQsIHRoZW4gdGhvc2UgZGF0ZXMgd2l0aGluIHRoZSByYW5nZSB0aGF0IGZhbGxcbiAgICogd2l0aGluIHRoZSByYW5nZSBhcmUgY2xlYXJlZCBmcm9tIHNlbGVjdGlvbi5cbiAgICpcbiAgICogVGhlc2UgaW5kZXhlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGRhdGUuXG4gICAqL1xuICBzZWxlY3RlZEluZGV4ZXM6IFNldDxEYXRlQmxvY2tJbmRleD47XG4gIC8qKlxuICAgKiBEYXlzIG9mIHRoZSBzY2hlZHVsZSB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHBpY2tlZC5cbiAgICovXG4gIHNjaGVkdWxlRGF5czogU2V0PERhdGVTY2hlZHVsZURheUNvZGU+O1xuICAvKipcbiAgICogU2V0IG9mIHRoZSBkYXlzIG9mIHdlZWsgdGhhdCBhcmUgYWxsb3dlZC5cbiAgICovXG4gIGFsbG93ZWREYXlzT2ZXZWVrOiBTZXQ8RGF5T2ZXZWVrPjtcbiAgLyoqXG4gICAqXG4gICAqL1xuICBpbmRleERheU9mV2VlazogRGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeTtcbiAgLyoqXG4gICAqIERlY2lzaW9uIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgaXMgZW5hYmxlZCBnaXZlbiB0aGUgY3VycmVudCBmaWx0ZXIuXG4gICAqL1xuICBpc0VuYWJsZWRGaWx0ZXJEYXk6IERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICAvKipcbiAgICogRGVjaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgdGhlIGN1cnJlbnQgZmlsdGVyIGludG8gYWNjb3VudC5cbiAgICovXG4gIGlzRW5hYmxlZERheTogRGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD47XG4gIC8qKlxuICAgKiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5IGZvciB0aGUgdmlldy5cbiAgICovXG4gIGNlbGxDb250ZW50RmFjdG9yeTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeTtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc2VsZWN0aW9uIHZhbHVlLlxuICAgKi9cbiAgY3VycmVudFNlbGVjdGlvblZhbHVlPzogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgZmlsdGVyIGFzIHRoZSBzdGFydCBhbmQgZW5kIHJhbmdlIGluc3RlYWQgb2Ygb3B0aW1pemluZyBmb3IgdGhlIGN1cnJlbnQgaW5kZXguXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcj86IE1heWJlPGJvb2xlYW4+O1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgc2VsZWN0aW9uIHN0YXRlIHdoZW4gdGhlIGNhbGVuZGFyIGlzIHJlc2V0LlxuICAgKi9cbiAgaW5pdGlhbFNlbGVjdGlvblN0YXRlPzogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3Qgc2NoZWR1bGVEYXlzID0gbmV3IFNldChbRGF0ZVNjaGVkdWxlRGF5Q29kZS5XRUVLREFZLCBEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtFTkRdKTtcbiAgY29uc3QgYWxsb3dlZERheXNPZldlZWsgPSBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0KEFycmF5LmZyb20oc2NoZWR1bGVEYXlzKSk7XG4gIGNvbnN0IHN0YXJ0ID0gc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcbiAgY29uc3QgaW5kZXhGYWN0b3J5ID0gZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5KHsgc3RhcnQgfSk7XG4gIGNvbnN0IGluZGV4RGF5T2ZXZWVrID0gZGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeShzdGFydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydCxcbiAgICBpbmRleEZhY3RvcnksXG4gICAgc2VsZWN0ZWRJbmRleGVzOiBuZXcgU2V0KCksXG4gICAgc2NoZWR1bGVEYXlzLFxuICAgIGFsbG93ZWREYXlzT2ZXZWVrLFxuICAgIGluZGV4RGF5T2ZXZWVrLFxuICAgIGlzRW5hYmxlZEZpbHRlckRheTogKCkgPT4gdHJ1ZSxcbiAgICBpc0VuYWJsZWREYXk6ICgpID0+IGZhbHNlLFxuICAgIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyOiB0cnVlLFxuICAgIGNlbGxDb250ZW50RmFjdG9yeTogZGVmYXVsdENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnlcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGVuZGFyU2NoZWR1bGVNaW5EYXRlKHg6IFBpY2s8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCAnZmlsdGVyJyB8ICdtaW5NYXhEYXRlUmFuZ2UnPik6IE1heWJlPERhdGU+IHtcbiAgcmV0dXJuIGZpbmRNYXhEYXRlKFt4LmZpbHRlcj8uc3RhcnQsIHgubWluTWF4RGF0ZVJhbmdlPy5zdGFydF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZU1heERhdGUoeDogUGljazxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsICdmaWx0ZXInIHwgJ21pbk1heERhdGVSYW5nZSc+KTogTWF5YmU8RGF0ZT4ge1xuICByZXR1cm4gZmluZE1pbkRhdGUoW3guZmlsdGVyPy5lbmQsIHgubWluTWF4RGF0ZVJhbmdlPy5lbmRdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGVuZGFyU2NoZWR1bGVNaW5BbmRNYXhEYXRlUmFuZ2UoeDogUGljazxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsICdmaWx0ZXInIHwgJ21pbk1heERhdGVSYW5nZSc+KTogUGFydGlhbDxEYXRlUmFuZ2U+IHtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogY2FsZW5kYXJTY2hlZHVsZU1pbkRhdGUoeCkgfHwgdW5kZWZpbmVkLFxuICAgIGVuZDogY2FsZW5kYXJTY2hlZHVsZU1heERhdGUoeCkgfHwgdW5kZWZpbmVkXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlU3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyKHg6IFBpY2s8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCAnZmlsdGVyJyB8ICdjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcic+KSB7XG4gIHJldHVybiB4LmNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyICYmIHguZmlsdGVyPy5zdGFydCAhPSBudWxsO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlIGV4dGVuZHMgQ29tcG9uZW50U3RvcmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGluaXRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoKSk7XG4gIH1cblxuICAvLyBNQVJLOlxuICByZWFkb25seSB0b2dnbGVTZWxlY3Rpb24gPSB0aGlzLmVmZmVjdCgoaW5wdXQ6IE9ic2VydmFibGU8dm9pZD4pID0+IHtcbiAgICByZXR1cm4gaW5wdXQucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICB0aGlzLm5leHRUb2dnbGVTZWxlY3Rpb24kLnBpcGUoXG4gICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICBmaWx0ZXJNYXliZSgpLFxuICAgICAgICAgIHRhcCgoeCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxEYXRlcyh4KTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gTUFSSzogQWNjZXNzb3JzXG4gIHJlYWRvbmx5IGZpbHRlciQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5maWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBtaW5NYXhEYXRlUmFuZ2UkID0gdGhpcy5zdGF0ZSQucGlwZShtYXAoY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVSYW5nZSksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBtaW5EYXRlJCA9IHRoaXMubWluTWF4RGF0ZVJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uc3RhcnQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG4gIHJlYWRvbmx5IG1heERhdGUkID0gdGhpcy5taW5NYXhEYXRlUmFuZ2UkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5lbmQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaGFzQ29uZmlndXJlZE1pbk1heFJhbmdlJCA9IHRoaXMubWluTWF4RGF0ZVJhbmdlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geCAhPSBudWxsICYmIHguc3RhcnQgIT0gbnVsbCAmJiB4LmVuZCAhPSBudWxsKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRTdGFydCQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pbnB1dFN0YXJ0KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlucHV0RW5kJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlucHV0RW5kKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRJbnB1dFJhbmdlJDogT2JzZXJ2YWJsZTxNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0pID0+ICh7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0pKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gaXNTYW1lRGF0ZShhLmlucHV0U3RhcnQsIGIuaW5wdXRTdGFydCkgJiYgaXNTYW1lRGF0ZShhLmlucHV0RW5kLCBiLmlucHV0RW5kKSksXG4gICAgbWFwKCh4KSA9PiB7XG4gICAgICBpZiAoeC5pbnB1dFN0YXJ0ICYmIHguaW5wdXRFbmQpIHtcbiAgICAgICAgcmV0dXJuIHggYXMgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlucHV0UmFuZ2UkOiBPYnNlcnZhYmxlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZT4gPSB0aGlzLmN1cnJlbnRJbnB1dFJhbmdlJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHZhbHVlLiBUaGlzIGlzIHRoZSBzZXQgb2YgbWFudWFsbHkgdG9nZ2VkIG9mZiBkYXRlcy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHVwZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZXMkOiBPYnNlcnZhYmxlPFNldDxEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguc2VsZWN0ZWRJbmRleGVzKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkRmlsdGVyRGF5RnVuY3Rpb24kOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlzRW5hYmxlZEZpbHRlckRheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc0VuYWJsZWREYXlGdW5jdGlvbiQ6IE9ic2VydmFibGU8RGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaXNFbmFibGVkRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGlzU2FtZURhdGVSYW5nZShhLCBiKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciQ6IE9ic2VydmFibGU8TWF5YmU8Ym9vbGVhbj4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyJDogT2JzZXJ2YWJsZTxNYXliZTxib29sZWFuPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIC8vXG4gICAgbWFwKGNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPERhdGVSYW5nZT4gPSB0aGlzLmN1cnJlbnREYXRlUmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNjaGVkdWxlRGF5cyQ6IE9ic2VydmFibGU8U2V0PERhdGVTY2hlZHVsZURheUNvZGU+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnNjaGVkdWxlRGF5cyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoc2V0c0FyZUVxdWl2YWxlbnQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFRpbWV6b25lJDogT2JzZXJ2YWJsZTxNYXliZTxUaW1lem9uZVN0cmluZz4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHgudGltZXpvbmUpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBlZmZlY3RpdmVUaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoIWNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIoeCkgJiYgeC50aW1lem9uZSA/IHgudGltZXpvbmUgOiB1bmRlZmluZWQpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZWZmZWN0aXZlVGltZXpvbmVOb3JtYWwkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+ICghY2FsZW5kYXJTY2hlZHVsZVN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlcih4KSAmJiB4LnRpbWV6b25lTm9ybWFsID8geC50aW1lem9uZU5vcm1hbCA6IHVuZGVmaW5lZCkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY3VycmVudFNlbGVjdGlvblZhbHVlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZSQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSQucGlwZShcbiAgICBjb21iaW5lTGF0ZXN0V2l0aCh0aGlzLmVmZmVjdGl2ZVRpbWV6b25lTm9ybWFsJCksXG4gICAgbWFwKChbeCwgdGltZXpvbmVOb3JtYWxdKSA9PiB7XG4gICAgICBpZiAoeCAmJiB0aW1lem9uZU5vcm1hbCkge1xuICAgICAgICB4ID0ge1xuICAgICAgICAgIGRhdGVTY2hlZHVsZVJhbmdlOiB7XG4gICAgICAgICAgICAuLi54LmRhdGVTY2hlZHVsZVJhbmdlLFxuICAgICAgICAgICAgc3RhcnQ6IHRpbWV6b25lTm9ybWFsLnRhcmdldERhdGVUb1N5c3RlbURhdGUoeC5kYXRlU2NoZWR1bGVSYW5nZS5zdGFydCksXG4gICAgICAgICAgICBlbmQ6IHRpbWV6b25lTm9ybWFsLnRhcmdldERhdGVUb1N5c3RlbURhdGUoeC5kYXRlU2NoZWR1bGVSYW5nZS5lbmQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGFzIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHg7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG5leHRUb2dnbGVTZWxlY3Rpb24kOiBPYnNlcnZhYmxlPE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj4+ID0gdGhpcy5oYXNDb25maWd1cmVkTWluTWF4UmFuZ2UkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChoYXNDb25maWd1cmVkTWluTWF4UmFuZ2UpID0+IHtcbiAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8TWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPj47XG5cbiAgICAgIGlmIChoYXNDb25maWd1cmVkTWluTWF4UmFuZ2UpIHtcbiAgICAgICAgb2JzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUobWFwKCh4KSA9PiAoeCA/ICdub25lJyA6ICdhbGwnKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUobWFwKCh4KSA9PiAoeCA/ICdub25lJyA6IHVuZGVmaW5lZCkpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icztcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZURhdGVCbG9ja0R1cmF0aW9uU3BhbiQ6IE9ic2VydmFibGU8RGF0ZUJsb2NrRHVyYXRpb25TcGFuPERhdGVCbG9jaz5bXT4gPSB0aGlzLnNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gZXhwYW5kRGF0ZVNjaGVkdWxlUmFuZ2UoeCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWVTZWxlY3RlZEluZGV4ZXMkOiBPYnNlcnZhYmxlPFNldDxEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5zZWxlY3Rpb25WYWx1ZURhdGVCbG9ja0R1cmF0aW9uU3BhbiQucGlwZShcbiAgICBtYXAoKHgpID0+IG5ldyBTZXQoeC5tYXAoKHkpID0+IHkuaSkpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZGF0ZVNjaGVkdWxlUmFuZ2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVTY2hlZHVsZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVTY2hlZHVsZVJhbmdlVmFsdWUkID0gdGhpcy5jdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgY2VsbENvbnRlbnRGYWN0b3J5JCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmNlbGxDb250ZW50RmFjdG9yeSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlzQ3VzdG9taXplZCQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5zZWxlY3RlZEluZGV4ZXMuc2l6ZSA+IDApLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvLyBNQVJLOiBTdGF0ZSBDaGFuZ2VzXG4gIHJlYWRvbmx5IHNldE1pbk1heERhdGVSYW5nZSA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhNaW5NYXhEYXRlUmFuZ2UpO1xuICByZWFkb25seSBzZXRGaWx0ZXIgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoRmlsdGVyKTtcbiAgcmVhZG9ubHkgc2V0RXhjbHVzaW9ucyA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhFeGNsdXNpb25zKTtcbiAgcmVhZG9ubHkgc2V0Q29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoQ29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpO1xuICByZWFkb25seSBjbGVhckZpbHRlciA9IHRoaXMudXBkYXRlcigoc3RhdGUpID0+IHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZSwgdW5kZWZpbmVkKSk7XG5cbiAgcmVhZG9ubHkgc2V0VGltZXpvbmUgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoVGltZXpvbmVWYWx1ZSk7XG4gIHJlYWRvbmx5IHNldElucHV0UmFuZ2UgPSB0aGlzLnVwZGF0ZXIodXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFJhbmdlKTtcblxuICByZWFkb25seSB0b2dnbGVTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgdG9nZ2xlOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgdG9nZ2xlIH0pKTtcbiAgcmVhZG9ubHkgYWRkU2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGFkZDogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IGFkZCB9KSk7XG4gIHJlYWRvbmx5IHJlbW92ZVNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCByZW1vdmU6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyByZW1vdmUgfSkpO1xuICByZWFkb25seSBzZXRTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2V0OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2V0IH0pKTtcbiAgcmVhZG9ubHkgc2VsZWN0QWxsRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzZWxlY3RBbGw6IEFsbE9yTm9uZVNlbGVjdGlvbiA9ICdhbGwnKSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2VsZWN0QWxsIH0pKTtcbiAgcmVhZG9ubHkgc2V0SW5pdGlhbFNlbGVjdGlvblN0YXRlID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aEluaXRpYWxTZWxlY3Rpb25TdGF0ZSk7XG5cbiAgcmVhZG9ubHkgc2V0U2NoZWR1bGVEYXlzID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMpO1xuICByZWFkb25seSBzZXRBbGxvd0FsbFNjaGVkdWxlRGF5cyA9IHRoaXMudXBkYXRlcigoc3RhdGUpID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMoc3RhdGUsIG51bGwpKTtcblxuICByZWFkb25seSBzZXREYXRlU2NoZWR1bGVSYW5nZVZhbHVlID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgdmFsdWU6IE1heWJlPERhdGVTY2hlZHVsZVJhbmdlPikgPT4gdXBkYXRlU3RhdGVXaXRoRGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZShzdGF0ZSwgdmFsdWUpKTtcbiAgcmVhZG9ubHkgc2V0Q2VsbENvbnRlbnRGYWN0b3J5ID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgY2VsbENvbnRlbnRGYWN0b3J5OiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5KSA9PiAoeyAuLi5zdGF0ZSwgY2VsbENvbnRlbnRGYWN0b3J5IH0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aEluaXRpYWxTZWxlY3Rpb25TdGF0ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBpbml0aWFsU2VsZWN0aW9uU3RhdGU6IE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IHNlbGVjdGVkSW5kZXhlcyB9ID0gc3RhdGU7XG5cbiAgaWYgKHNlbGVjdGVkSW5kZXhlcy5zaXplID09PSAwICYmIGluaXRpYWxTZWxlY3Rpb25TdGF0ZSA9PT0gJ2FsbCcpIHtcbiAgICBzdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBzZWxlY3RBbGw6IGluaXRpYWxTZWxlY3Rpb25TdGF0ZSB9KTtcbiAgfVxuXG4gIHJldHVybiB7IC4uLnN0YXRlLCBpbml0aWFsU2VsZWN0aW9uU3RhdGUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKGN1cnJlbnRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcjogTWF5YmU8Ym9vbGVhbj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBsZXQgc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSA9IHsgLi4uY3VycmVudFN0YXRlLCBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciB9O1xuXG4gIGlmIChCb29sZWFuKGN1cnJlbnRTdGF0ZS5jb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcikgIT09IEJvb2xlYW4oY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHt9KTsgLy8gcmVjYWxjdWxhdGUgaWYgY2hhbmdlIG9jY3VycyBhcyBpdCB3aWxsIGFmZmVjdCB0aGUgb3V0cHV0IHZhbHVlXG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhFeGNsdXNpb25zKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGlucHV0RXhjbHVzaW9uczogTWF5YmU8QXJyYXlPclZhbHVlPERhdGVPckRhdGVSYW5nZU9yRGF0ZUJsb2NrSW5kZXhPckRhdGVCbG9ja1JhbmdlPj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBsZXQgY29tcHV0ZWRFeGNsdXNpb25zOiBNYXliZTxEYXRlQmxvY2tJbmRleFtdPjtcblxuICBpZiAoaW5wdXRFeGNsdXNpb25zKSB7XG4gICAgY29uc3QgeyBpbmRleEZhY3RvcnkgfSA9IHN0YXRlO1xuICAgIGNvbnN0IGluZGV4QXJyYXlGYWN0b3J5ID0gZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhBcnJheUZhY3RvcnkoaW5kZXhGYWN0b3J5KTtcbiAgICBjb21wdXRlZEV4Y2x1c2lvbnMgPSBpbmRleEFycmF5RmFjdG9yeShpbnB1dEV4Y2x1c2lvbnMpO1xuICB9XG5cbiAgc3RhdGUgPSB7IC4uLnN0YXRlLCBpbnB1dEV4Y2x1c2lvbnMsIGNvbXB1dGVkRXhjbHVzaW9ucyB9O1xuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCBzdGF0ZS5maWx0ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoTWluTWF4RGF0ZVJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIG1pbk1heERhdGVSYW5nZTogTWF5YmU8UGFydGlhbDxEYXRlUmFuZ2U+Pik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIHN0YXRlID0geyAuLi5zdGF0ZSB9O1xuXG4gIGlmIChtaW5NYXhEYXRlUmFuZ2UgIT0gbnVsbCAmJiAhaXNJbmZpbml0ZURhdGVSYW5nZShtaW5NYXhEYXRlUmFuZ2UpKSB7XG4gICAgc3RhdGUubWluTWF4RGF0ZVJhbmdlID0ge1xuICAgICAgc3RhcnQ6IG1pbk1heERhdGVSYW5nZS5zdGFydCAhPSBudWxsID8gc3RhcnRPZkRheShtaW5NYXhEYXRlUmFuZ2Uuc3RhcnQpIDogdW5kZWZpbmVkLFxuICAgICAgZW5kOiBtaW5NYXhEYXRlUmFuZ2UuZW5kICE9IG51bGwgPyBlbmRPZkRheShtaW5NYXhEYXRlUmFuZ2UuZW5kKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIHN0YXRlLm1pbk1heERhdGVSYW5nZTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGUsIHN0YXRlLmZpbHRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgaW5wdXRGaWx0ZXI6IE1heWJlPERhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBjb21wdXRlZEV4Y2x1c2lvbnM6IGV4Y2x1c2lvbnMsIG1pbk1heERhdGVSYW5nZSB9ID0gc3RhdGU7XG5cbiAgbGV0IGlzRW5hYmxlZEZpbHRlckRheTogTWF5YmU8RGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD4+ID0gKCkgPT4gdHJ1ZTtcbiAgbGV0IGZpbHRlcjogTWF5YmU8RGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz4gPSBudWxsO1xuXG4gIC8vIGNyZWF0ZSB0aGUgZmlsdGVyIHVzaW5nIGlucHV0RmlsdGVyLCBleGNsdXNpb25zLCBhbmQgbWluTWF4RGF0ZVJhbmdlXG4gIGlmIChpbnB1dEZpbHRlciB8fCBleGNsdXNpb25zPy5sZW5ndGggfHwgbWluTWF4RGF0ZVJhbmdlKSB7XG4gICAgbGV0IGVuYWJsZWRGaWx0ZXI6IERhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc7XG5cbiAgICBpZiAoaW5wdXRGaWx0ZXIpIHtcbiAgICAgIGZpbHRlciA9IGNvcHlEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnKGlucHV0RmlsdGVyKTsgLy8gY29weSBmaWx0ZXJcblxuICAgICAgaWYgKGV4Y2x1c2lvbnM/Lmxlbmd0aCkge1xuICAgICAgICBlbmFibGVkRmlsdGVyID0ge1xuICAgICAgICAgIC4uLmZpbHRlcixcbiAgICAgICAgICBleDogdW5pcXVlKG1lcmdlQXJyYXlzKFtmaWx0ZXIuZXgsIGV4Y2x1c2lvbnNdKSlcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuYWJsZWRGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVuYWJsZWRGaWx0ZXIgPSB7XG4gICAgICAgIHc6ICc4OScsXG4gICAgICAgIGV4OiBleGNsdXNpb25zIGFzIG51bWJlcltdXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtaW5NYXhEYXRlUmFuZ2UpIHtcbiAgICAgIGVuYWJsZWRGaWx0ZXIubWluTWF4RGF0ZVJhbmdlID0gbWluTWF4RGF0ZVJhbmdlO1xuICAgICAgZW5hYmxlZEZpbHRlci5zZXRTdGFydEFzTWluRGF0ZSA9IGZpbHRlcj8uc3RhcnQgPyB0cnVlIDogZmFsc2U7IC8vIElmIGEgc3RhcnQgZGF0ZSBpcyBzZXQsIHRoZW4gaXQgYmVjb21lcyB0aGUgZmxvb3IuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIGlucHV0IGZpbHRlciBoYXMgYSBzdGFydCBkYXRlLCB1c2UgdGhhdCBhcyB0aGUgcmVsYXRpdmUgc3RhcnQgdG8gZW5zdXJlIGluZGV4ZXMgYXJlIGNvbXBhcmVkIHRoZSBzYW1lLFxuICAgICAqIG90aGVyd2lzZSB1c2UgdGhlIHN0YXRlJ3Mgc3RhcnQuIFRoaXMgaXMgaW1wb3J0YW50IGZvciB0aGUgaW5kZXggY2FsY3VsYXRpb25zLlxuICAgICAqL1xuICAgIGVuYWJsZWRGaWx0ZXIuc3RhcnQgPSBpbnB1dEZpbHRlcj8uc3RhcnQgPz8gc3RhdGUuc3RhcnQ7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGZpbHRlclxuICAgIGlzRW5hYmxlZEZpbHRlckRheSA9IGRhdGVTY2hlZHVsZURhdGVGaWx0ZXIoZW5hYmxlZEZpbHRlcik7XG4gIH1cblxuICBzdGF0ZSA9IHsgLi4uc3RhdGUsIGZpbHRlciwgaXNFbmFibGVkRmlsdGVyRGF5IH07XG5cbiAgLy8gRm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBhYm92ZSwgdXNlIHRoZSBmaWx0ZXIncyBzdGFydCBkYXRlIGFzIHRoZSByZWxhdGl2ZSBzdGFydCBpZiBhcHBsaWNhYmxlLlxuICBpZiAoZmlsdGVyICYmIGZpbHRlci5zdGFydCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gZmlsdGVyLnN0YXJ0O1xuICAgIHN0YXRlLnN0YXJ0ID0gc3RhcnQ7XG4gICAgc3RhdGUuaW5kZXhGYWN0b3J5ID0gZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5KHsgc3RhcnQgfSk7XG4gICAgc3RhdGUuaW5kZXhEYXlPZldlZWsgPSBkYXRlQmxvY2tEYXlPZldlZWtGYWN0b3J5KHN0YXJ0KTtcbiAgfVxuXG4gIC8vIGF0dGVtcHQgdG8gcmUtYXBwbHkgdGhlIGluaXRpYWwgc2VsZWN0aW9uIHN0YXRlIG9uY2UgZmlsdGVyIGlzIGFwcGxpZWRcbiAgaWYgKHN0YXRlLmluaXRpYWxTZWxlY3Rpb25TdGF0ZSkge1xuICAgIHN0YXRlID0gdXBkYXRlU3RhdGVXaXRoSW5pdGlhbFNlbGVjdGlvblN0YXRlKHN0YXRlLCBzdGF0ZS5pbml0aWFsU2VsZWN0aW9uU3RhdGUpO1xuICB9XG5cbiAgLy8gcmUtY2FsY3VsYXRlIHRoZSBzZWxlY3Rpb24gZ2l2ZW4gdGhlIGZpbHRlclxuICBjb25zdCB7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0gPSBzdGF0ZTtcblxuICBpZiAoaW5wdXRTdGFydCAmJiBpbnB1dEVuZCkge1xuICAgIHN0YXRlID0gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFJhbmdlKHN0YXRlLCB7IGlucHV0U3RhcnQsIGlucHV0RW5kIH0pO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoVGltZXpvbmVWYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCB0aW1lem9uZTogTWF5YmU8VGltZXpvbmVTdHJpbmc+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBjdXJyZW50U2VsZWN0aW9uVmFsdWUgfSA9IHN0YXRlO1xuXG4gIGNvbnN0IHRpbWV6b25lTm9ybWFsID0gdGltZXpvbmUgPyBkYXRlVGltZXpvbmVVdGNOb3JtYWwoeyB0aW1lem9uZSB9KSA6IHVuZGVmaW5lZDtcblxuICBpZiAodGltZXpvbmVOb3JtYWwgJiYgY3VycmVudFNlbGVjdGlvblZhbHVlKSB7XG4gICAgLy8gdXBkYXRlIHRoZSBzZWxlY3Rpb24gdmFsdWUgdG8gcmVmbGVjdCB0aGUgdGltZXpvbmUgY2hhbmdlcy5cblxuICAgIGNvbnN0IHsgZGF0ZVNjaGVkdWxlUmFuZ2U6IGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZSB9ID0gY3VycmVudFNlbGVjdGlvblZhbHVlO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGltZXpvbmVOb3JtYWwudGFyZ2V0RGF0ZVRvU3lzdGVtRGF0ZShjdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2Uuc3RhcnQpO1xuICAgIGNvbnN0IGVuZCA9IHRpbWV6b25lTm9ybWFsLnRhcmdldERhdGVUb1N5c3RlbURhdGUoY3VycmVudERhdGVTY2hlZHVsZVJhbmdlLmVuZCk7XG5cbiAgICBjb25zdCBuZXdSYW5nZTogRGF0ZVNjaGVkdWxlUmFuZ2UgPSB7XG4gICAgICAuLi5jdXJyZW50U2VsZWN0aW9uVmFsdWUuZGF0ZVNjaGVkdWxlUmFuZ2UsXG4gICAgICBzdGFydCxcbiAgICAgIGVuZFxuICAgIH07XG5cbiAgICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoRGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSh7IC4uLnN0YXRlLCB0aW1lem9uZSwgdGltZXpvbmVOb3JtYWwgfSwgbmV3UmFuZ2UpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7IC4uLnN0YXRlLCB0aW1lem9uZSwgdGltZXpvbmVOb3JtYWwgfTsgLy8gbm8gY2hhbmdlIGluIHZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aERhdGVTY2hlZHVsZVJhbmdlVmFsdWUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBNYXliZTxEYXRlU2NoZWR1bGVSYW5nZT4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IHRpbWV6b25lTm9ybWFsLCBjdXJyZW50U2VsZWN0aW9uVmFsdWUgfSA9IHN0YXRlO1xuICBjb25zdCBjdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2UgPSBjdXJyZW50U2VsZWN0aW9uVmFsdWU/LmRhdGVTY2hlZHVsZVJhbmdlOyAvLyBjdXJyZW50IHJhbmdlIGlzIGFsd2F5cyBpbiBzeXN0ZW0gdGltZVxuXG4gIGlmICghY2FsZW5kYXJTY2hlZHVsZVN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlcihzdGF0ZSkgJiYgdGltZXpvbmVOb3JtYWwpIHtcbiAgICAvLyBXaGVuIHVzaW5nIHRpbWV6b25lcywgYWx3YXlzIHJldHVybiBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGF5LiBJbnB1dHMgYXJlIGNvbnZlcnRlZCB0byB0aGUgc3lzdGVtIHRpbWUgYW5kIHVzZWQgYXMgdGhlIHN0YXJ0IG9mIHRoZSBkYXkuXG4gICAgLy8gT3V0cHV0cyByZW1haW4gYWNjdXJhdGUuXG5cbiAgICBpZiAoY2hhbmdlKSB7XG4gICAgICBjaGFuZ2UgPSB7XG4gICAgICAgIC4uLmNoYW5nZSxcbiAgICAgICAgc3RhcnQ6IHN0YXJ0T2ZEYXkodGltZXpvbmVOb3JtYWwuc3lzdGVtRGF0ZVRvVGFyZ2V0RGF0ZShjaGFuZ2Uuc3RhcnQpKSxcbiAgICAgICAgZW5kOiBzdGFydE9mRGF5KHRpbWV6b25lTm9ybWFsLnN5c3RlbURhdGVUb1RhcmdldERhdGUoY2hhbmdlLmVuZCkpXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlzU2FtZVZhbHVlID0gaXNTYW1lRGF0ZVNjaGVkdWxlUmFuZ2UoY3VycmVudERhdGVTY2hlZHVsZVJhbmdlLCBjaGFuZ2UpO1xuXG4gIGlmIChpc1NhbWVWYWx1ZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoY2hhbmdlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG5leHRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRTdGFydDogY2hhbmdlLnN0YXJ0LCBpbnB1dEVuZDogY2hhbmdlLmVuZCwgc2VsZWN0ZWRJbmRleGVzOiBuZXcgU2V0KGNoYW5nZS5leCkgfTtcbiAgICAgIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSksIGV4cGFuZERhdGVTY2hlZHVsZURheUNvZGVzKGNoYW5nZS53IHx8ICc4OScpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vU2VsZWN0aW9uQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHN0YXRlKTsgLy8gY2xlYXIgc2VsZWN0aW9uLCByZXRhaW4gZGlzYWJsZWQgZGF5c1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IE1heWJlPEl0ZXJhYmxlPERhdGVTY2hlZHVsZURheUNvZGU+Pik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgc2NoZWR1bGVEYXlzOiBjdXJyZW50U2NoZWR1bGVEYXlzIH0gPSBzdGF0ZTtcbiAgY29uc3Qgc2NoZWR1bGVEYXlzID0gbmV3IFNldChjaGFuZ2UgfHwgW0RhdGVTY2hlZHVsZURheUNvZGUuV0VFS0RBWSwgRGF0ZVNjaGVkdWxlRGF5Q29kZS5XRUVLRU5EXSk7XG5cbiAgaWYgKHNldHNBcmVFcXVpdmFsZW50KGN1cnJlbnRTY2hlZHVsZURheXMsIHNjaGVkdWxlRGF5cykpIHtcbiAgICByZXR1cm4gc3RhdGU7IC8vIG5vIGNoYW5nZVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGFsbG93ZWREYXlzT2ZXZWVrID0gZXhwYW5kRGF0ZVNjaGVkdWxlRGF5Q29kZXNUb0RheU9mV2Vla1NldChBcnJheS5mcm9tKHNjaGVkdWxlRGF5cykpO1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHsgLi4uc3RhdGUsIHNjaGVkdWxlRGF5cywgYWxsb3dlZERheXNPZldlZWsgfTtcbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZURhdGVzQ2hhbmdlIHtcbiAgcmVzZXQ/OiB0cnVlO1xuICB0b2dnbGU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICBhZGQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICByZW1vdmU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICBzZXQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICBzZWxlY3RBbGw/OiBBbGxPck5vbmVTZWxlY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGVEYXRlc0NoYW5nZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhEYXlPZldlZWssIGlucHV0U3RhcnQ6IGN1cnJlbnRJbnB1dFN0YXJ0LCBpbnB1dEVuZDogY3VycmVudElucHV0RW5kLCBtaW5NYXhEYXRlUmFuZ2UgfSA9IHN0YXRlO1xuICBjb25zdCB7IHN0YXJ0OiBtaW5EYXRlLCBlbmQ6IG1heERhdGUgfSA9IGNhbGVuZGFyU2NoZWR1bGVNaW5BbmRNYXhEYXRlUmFuZ2Uoc3RhdGUpO1xuICBsZXQgaW5wdXRTdGFydCA9IGN1cnJlbnRJbnB1dFN0YXJ0O1xuICBsZXQgaW5wdXRFbmQgPSBjdXJyZW50SW5wdXRFbmQ7XG5cbiAgbGV0IHNlbGVjdGVkSW5kZXhlczogU2V0PERhdGVCbG9ja0luZGV4PjtcblxuICBpZiAoY2hhbmdlLnJlc2V0IHx8IGNoYW5nZS5zZWxlY3RBbGwgIT0gbnVsbCB8fCBjaGFuZ2Uuc2V0KSB7XG4gICAgbGV0IHNldDogTWF5YmU8SXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4Pj4gPSBjaGFuZ2Uuc2V0ID8/IFtdO1xuICAgIGNvbnN0IHNlbGVjdEFsbDogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPiA9IGNoYW5nZS5yZXNldCA9PT0gdHJ1ZSA/IHN0YXRlLmluaXRpYWxTZWxlY3Rpb25TdGF0ZSA6IGNoYW5nZS5zZWxlY3RBbGw7XG5cbiAgICBzd2l0Y2ggKHNlbGVjdEFsbCkge1xuICAgICAgY2FzZSAnYWxsJzpcbiAgICAgICAgaWYgKG1pbkRhdGUgIT0gbnVsbCAmJiBtYXhEYXRlICE9IG51bGwpIHtcbiAgICAgICAgICBpbnB1dFN0YXJ0ID0gbWluRGF0ZTtcbiAgICAgICAgICBpbnB1dEVuZCA9IG1heERhdGU7XG4gICAgICAgICAgc2V0ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgaW5wdXRTdGFydCA9IG51bGw7XG4gICAgICAgIGlucHV0RW5kID0gbnVsbDtcbiAgICAgICAgc2V0ID0gW107XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHNlbGVjdGVkSW5kZXhlcyA9IG5ldyBTZXQoaXRlcmFibGVUb0FycmF5KHNldCkubWFwKGluZGV4RmFjdG9yeSkpO1xuICB9IGVsc2Uge1xuICAgIHNlbGVjdGVkSW5kZXhlcyA9IG5ldyBTZXQoc3RhdGUuc2VsZWN0ZWRJbmRleGVzKTtcblxuICAgIGlmIChjaGFuZ2UudG9nZ2xlKSB7XG4gICAgICBjb25zdCBhbGxvd2VkVG9Ub2dnbGUgPSBpdGVyYWJsZVRvQXJyYXkoY2hhbmdlLnRvZ2dsZSlcbiAgICAgICAgLm1hcChpbmRleEZhY3RvcnkpXG4gICAgICAgIC5maWx0ZXIoKGkpID0+IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhpbmRleERheU9mV2VlayhpKSkpO1xuICAgICAgdG9nZ2xlSW5TZXQoc2VsZWN0ZWRJbmRleGVzLCBhbGxvd2VkVG9Ub2dnbGUpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2UuYWRkKSB7XG4gICAgICBhZGRUb1NldChzZWxlY3RlZEluZGV4ZXMsIGl0ZXJhYmxlVG9BcnJheShjaGFuZ2UuYWRkKS5tYXAoaW5kZXhGYWN0b3J5KSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZS5yZW1vdmUpIHtcbiAgICAgIGFkZFRvU2V0KHNlbGVjdGVkSW5kZXhlcywgaXRlcmFibGVUb0FycmF5KGNoYW5nZS5yZW1vdmUpLm1hcChpbmRleEZhY3RvcnkpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXh0U3RhdGUgPSB7IC4uLnN0YXRlLCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCwgc2VsZWN0ZWRJbmRleGVzIH07XG4gIG5leHRTdGF0ZS5pc0VuYWJsZWREYXkgPSBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuXG4gIC8vIFJlY2FsY3VsYXRlIHRoZSByYW5nZSBhbmQgc2ltcGxpZmllZCB0byBleGNsdXNpb25zXG4gIGNvbnN0IHJhbmdlQW5kRXhjbHVzaW9uID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24obmV4dFN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24pIHtcbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoeyAuLi5uZXh0U3RhdGUsIHNlbGVjdGVkSW5kZXhlczogbmV3IFNldChyYW5nZUFuZEV4Y2x1c2lvbi5leGNsdWRlZCksIGlucHV0U3RhcnQ6IHJhbmdlQW5kRXhjbHVzaW9uLnN0YXJ0LCBpbnB1dEVuZDogcmFuZ2VBbmRFeGNsdXNpb24uZW5kIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vIHNlbGVjdGVkIGRheXNcbiAgICByZXR1cm4gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSh7IC4uLnN0YXRlLCBzZWxlY3RlZEluZGV4ZXM6IG5ldyBTZXQoKSwgaW5wdXRTdGFydDogbnVsbCwgaW5wdXRFbmQ6IG51bGwgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2UpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGlucHV0U3RhcnQ6IGN1cnJlbnRJbnB1dFN0YXJ0LCBpbnB1dEVuZDogY3VycmVudElucHV0RW5kLCBpbmRleEZhY3RvcnksIG1pbk1heERhdGVSYW5nZSB9ID0gc3RhdGU7XG4gIGNvbnN0IHsgc3RhcnQ6IG1pbkRhdGUsIGVuZDogbWF4RGF0ZSB9OiBQYXJ0aWFsPERhdGVSYW5nZT4gPSBtaW5NYXhEYXRlUmFuZ2UgPz8ge307XG5cbiAgY29uc3QgaW5wdXRTdGFydDogRGF0ZSA9IHN0YXJ0T2ZEYXkoY2hhbmdlLmlucHV0U3RhcnQpO1xuICBjb25zdCBpbnB1dEVuZDogRGF0ZSA9IGVuZE9mRGF5KGNoYW5nZS5pbnB1dEVuZCk7XG5cbiAgY29uc3QgaXNWYWxpZFJhbmdlID0gbWluRGF0ZSAhPSBudWxsIHx8IG1heERhdGUgIT0gbnVsbCA/IGlzRGF0ZUluRGF0ZVJhbmdlRnVuY3Rpb24oeyBzdGFydDogbWluRGF0ZSA/PyB1bmRlZmluZWQsIGVuZDogbWF4RGF0ZSA/PyB1bmRlZmluZWQgfSkgOiAoKSA9PiB0cnVlO1xuXG4gIGlmICghaXNWYWxpZFJhbmdlKGlucHV0U3RhcnQpIHx8ICFpc1ZhbGlkUmFuZ2UoaW5wdXRFbmQpIHx8IChpc1NhbWVEYXRlRGF5KGlucHV0U3RhcnQsIGN1cnJlbnRJbnB1dFN0YXJ0KSAmJiBpc1NhbWVEYXRlRGF5KGlucHV0RW5kLCBjdXJyZW50SW5wdXRFbmQpKSkge1xuICAgIHJldHVybiBzdGF0ZTsgLy8gaWYgbm8gY2hhbmdlLCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gIH1cblxuICAvLyByZXRhaW4gYWxsIGluZGV4ZXMgdGhhdCBhcmUgd2l0aGluIHRoZSBuZXcgcmFuZ2VcbiAgY29uc3QgbWluSW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRTdGFydCk7XG4gIGNvbnN0IG1heEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0RW5kKSArIDE7XG5cbiAgY29uc3QgY3VycmVudEluZGV4ZXM6IERhdGVCbG9ja0luZGV4W10gPSBBcnJheS5mcm9tKHN0YXRlLnNlbGVjdGVkSW5kZXhlcyk7XG4gIGNvbnN0IGlzSW5DdXJyZW50UmFuZ2UgPSBpc0luZGV4TnVtYmVySW5JbmRleFJhbmdlRnVuY3Rpb24oeyBtaW5JbmRleCwgbWF4SW5kZXggfSk7XG4gIGNvbnN0IGV4Y2x1ZGVkSW5kZXhlc0luTmV3UmFuZ2UgPSBjdXJyZW50SW5kZXhlcy5maWx0ZXIoaXNJbkN1cnJlbnRSYW5nZSk7XG4gIGNvbnN0IHNlbGVjdGVkSW5kZXhlcyA9IG5ldyBTZXQoZXhjbHVkZWRJbmRleGVzSW5OZXdSYW5nZSk7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgc2VsZWN0ZWRJbmRleGVzLCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9O1xuICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbmV4dFN0YXRlLmlzRW5hYmxlZERheSA9IGlzRW5hYmxlZERheUluQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG4gIG5leHRTdGF0ZS5jdXJyZW50U2VsZWN0aW9uVmFsdWUgPSBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZShuZXh0U3RhdGUpO1xuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbmFibGVkRGF5SW5DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+IHtcbiAgY29uc3QgeyBpbmRleEZhY3RvcnksIGlucHV0U3RhcnQsIGlucHV0RW5kLCBpbmRleERheU9mV2VlaywgYWxsb3dlZERheXNPZldlZWsgfSA9IHN0YXRlO1xuXG4gIGxldCBpc0luU3RhcnRBbmRFbmRSYW5nZTogSXNEYXRlV2l0aGluRGF0ZUJsb2NrUmFuZ2VGdW5jdGlvbjtcblxuICBpZiAoaW5wdXRTdGFydCAmJiBpbnB1dEVuZCkge1xuICAgIGlzSW5TdGFydEFuZEVuZFJhbmdlID0gaXNEYXRlV2l0aGluRGF0ZUJsb2NrUmFuZ2VGdW5jdGlvbih7IHN0YXJ0OiBzdGF0ZS5zdGFydCwgcmFuZ2U6IHsgc3RhcnQ6IGlucHV0U3RhcnQsIGVuZDogaW5wdXRFbmQgfSB9KTtcbiAgfSBlbHNlIHtcbiAgICBpc0luU3RhcnRBbmRFbmRSYW5nZSA9ICgpID0+IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChpbnB1dDogRGF0ZU9yRGF0ZUJsb2NrSW5kZXgpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dCk7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gaW5kZXhEYXlPZldlZWsoaW5kZXgpO1xuXG4gICAgY29uc3QgaXNJblNlbGVjdGVkUmFuZ2UgPSBpc0luU3RhcnRBbmRFbmRSYW5nZShpbnB1dCk7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IHN0YXRlLnNlbGVjdGVkSW5kZXhlcy5oYXMoaW5kZXgpO1xuICAgIGNvbnN0IGlzQWxsb3dlZERheU9mV2VlayA9IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhkYXlPZldlZWspO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gaXNBbGxvd2VkRGF5T2ZXZWVrICYmICgoaXNJblNlbGVjdGVkUmFuZ2UgJiYgIWlzU2VsZWN0ZWQpIHx8IChpc1NlbGVjdGVkICYmICFpc0luU2VsZWN0ZWRSYW5nZSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlPiB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBzY2hlZHVsZURheXMsIGFsbG93ZWREYXlzT2ZXZWVrLCBpbmRleERheU9mV2VlaywgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIsIGZpbHRlciB9ID0gc3RhdGU7XG4gIGNvbnN0IHJhbmdlQW5kRXhjbHVzaW9uID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24oc3RhdGUpO1xuXG4gIGlmIChyYW5nZUFuZEV4Y2x1c2lvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IHN0YXJ0OiByYW5nZVN0YXJ0LCBlbmQ6IHJhbmdlRW5kLCBleGNsdWRlZDogYWxsRXhjbHVkZWQsIGRhdGVCbG9ja1JhbmdlIH0gPSByYW5nZUFuZEV4Y2x1c2lvbjtcbiAgbGV0IGZpbHRlck9mZnNldEV4Y2x1ZGVkUmFuZ2U6IERhdGVCbG9ja0luZGV4W10gPSBbXTtcbiAgbGV0IGluZGV4T2Zmc2V0ID0gZGF0ZUJsb2NrUmFuZ2UuaTtcblxuICBsZXQgc3RhcnQgPSByYW5nZVN0YXJ0O1xuICBsZXQgZW5kID0gcmFuZ2VFbmQ7XG5cbiAgLy8gSWYgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgaXMgdHJ1ZSwgdGhlbiB3ZSBuZWVkIHRvIG9mZnNldCB0aGUgdmFsdWVzIHRvIGJlIHJlbGF0aXZlIHRvIHRoYXQgc3RhcnQuXG4gIGlmIChjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciAmJiBmaWx0ZXI/LnN0YXJ0KSB7XG4gICAgc3RhcnQgPSBmaWx0ZXIuc3RhcnQ7XG5cbiAgICBpZiAoZmlsdGVyPy5lbmQpIHtcbiAgICAgIGVuZCA9IGNvcHlIb3Vyc0FuZE1pbnV0ZXNGcm9tRGF0ZShlbmQsIGZpbHRlci5lbmQpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlclN0YXJ0SW5kZXhPZmZzZXQgPSBpbmRleEZhY3RvcnkocmFuZ2VTdGFydCkgLSBpbmRleEZhY3Rvcnkoc3RhcnQpO1xuICAgIGZpbHRlck9mZnNldEV4Y2x1ZGVkUmFuZ2UgPSByYW5nZSgwLCBmaWx0ZXJTdGFydEluZGV4T2Zmc2V0KTtcbiAgICBpbmRleE9mZnNldCA9IGluZGV4T2Zmc2V0IC0gZmlsdGVyU3RhcnRJbmRleE9mZnNldDtcbiAgfVxuXG4gIGNvbnN0IGV4Y2x1ZGVkID0gY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXJcbiAgICA/IGFsbEV4Y2x1ZGVkLmZpbHRlcigoeCkgPT4ge1xuICAgICAgICBjb25zdCBpc0V4Y2x1ZGVkSW5kZXggPSBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoeCkpOyAvLyA/Pz9cbiAgICAgICAgcmV0dXJuIGlzRXhjbHVkZWRJbmRleDtcbiAgICAgIH0pXG4gICAgOiBhbGxFeGNsdWRlZDtcblxuICBjb25zdCBvZmZzZXRFeGNsdWRlZDogRGF0ZUJsb2NrSW5kZXhbXSA9IGV4Y2x1ZGVkLm1hcCgoeCkgPT4geCAtIGluZGV4T2Zmc2V0KTsgLy8gc2V0IHRvIHRoZSBwcm9wZXIgb2Zmc2V0XG5cbiAgY29uc3QgZXggPSBbLi4uZmlsdGVyT2Zmc2V0RXhjbHVkZWRSYW5nZSwgLi4ub2Zmc2V0RXhjbHVkZWRdO1xuXG4gIGNvbnN0IHc6IERhdGVTY2hlZHVsZUVuY29kZWRXZWVrID0gZGF0ZVNjaGVkdWxlRW5jb2RlZFdlZWsoc2NoZWR1bGVEYXlzKTtcbiAgY29uc3QgZDogRGF0ZUJsb2NrSW5kZXhbXSA9IFtdOyAvLyBcImluY2x1ZGVkXCIgYmxvY2tzIGFyZSBuZXZlciB1c2VkL2NhbGN1bGF0ZWQuXG5cbiAgLy8gQWx3YXlzIGVuc3VyZSB0aGUgZW5kIGlzIGFmdGVyIG9yIGVxdWFsIHRvIHRoZSBzdGFydC5cbiAgaWYgKGlzQmVmb3JlKGVuZCwgc3RhcnQpKSB7XG4gICAgZW5kID0gc3RhcnQ7IC8vIGVuZCBpcyBzdGFydFxuICB9XG5cbiAgY29uc3QgZGF0ZVNjaGVkdWxlUmFuZ2U6IERhdGVTY2hlZHVsZVJhbmdlID0ge1xuICAgIHN0YXJ0LFxuICAgIGVuZCxcbiAgICB3LFxuICAgIGQsXG4gICAgZXhcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGRhdGVTY2hlZHVsZVJhbmdlLFxuICAgIG1pbk1heFJhbmdlOiB7IHN0YXJ0LCBlbmQgfVxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbiBleHRlbmRzIERhdGVSYW5nZSB7XG4gIGRhdGVCbG9ja1JhbmdlOiBEYXRlQmxvY2tSYW5nZVdpdGhSYW5nZTtcbiAgZXhjbHVkZWQ6IERhdGVCbG9ja0luZGV4W107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbihzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uPiB7XG4gIGNvbnN0IHsgaXNFbmFibGVkRGF5LCBpc0VuYWJsZWRGaWx0ZXJEYXkgfSA9IHN0YXRlO1xuICBjb25zdCBkYXRlRmFjdG9yeSA9IGRhdGVCbG9ja1RpbWluZ0RhdGVGYWN0b3J5KHN0YXRlKTtcbiAgY29uc3QgZGF0ZUJsb2NrUmFuZ2UgPSBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVCbG9ja1JhbmdlKHN0YXRlKTtcblxuICBpZiAoZGF0ZUJsb2NrUmFuZ2UgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsOyAvLyByZXR1cm5zIG51bGwgaWYgbm8gaXRlbXMgYXJlIHNlbGVjdGVkLlxuICB9XG5cbiAgY29uc3Qgc3RhcnQgPSBkYXRlRmFjdG9yeShkYXRlQmxvY2tSYW5nZS5pKTtcbiAgY29uc3QgZW5kID0gZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UudG8pO1xuXG4gIGNvbnN0IGV4Y2x1ZGVkOiBEYXRlQmxvY2tJbmRleFtdID0gcmFuZ2UoZGF0ZUJsb2NrUmFuZ2UuaSwgZGF0ZUJsb2NrUmFuZ2UudG8gKyAxKS5maWx0ZXIoKHgpID0+IHtcbiAgICBjb25zdCBpc0V4Y2x1ZGVkSW5kZXggPSAhaXNFbmFibGVkRGF5KHgpIHx8ICFpc0VuYWJsZWRGaWx0ZXJEYXkoeCk7XG4gICAgcmV0dXJuIGlzRXhjbHVkZWRJbmRleDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0OiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24gPSB7XG4gICAgZGF0ZUJsb2NrUmFuZ2UsXG4gICAgc3RhcnQsXG4gICAgZW5kLFxuICAgIGV4Y2x1ZGVkXG4gIH07XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPERhdGVSYW5nZT4ge1xuICBjb25zdCBkYXRlRmFjdG9yeSA9IGRhdGVCbG9ja1RpbWluZ0RhdGVGYWN0b3J5KHN0YXRlKTtcbiAgY29uc3QgZGF0ZUJsb2NrUmFuZ2UgPSBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVCbG9ja1JhbmdlKHN0YXRlKTtcbiAgY29uc3QgZGF0ZVJhbmdlOiBNYXliZTxEYXRlUmFuZ2U+ID0gZGF0ZUJsb2NrUmFuZ2UgIT0gbnVsbCA/IHsgc3RhcnQ6IGRhdGVGYWN0b3J5KGRhdGVCbG9ja1JhbmdlLmkpLCBlbmQ6IGRhdGVGYWN0b3J5KGRhdGVCbG9ja1JhbmdlLnRvIGFzIG51bWJlcikgfSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGRhdGVSYW5nZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUJsb2NrUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlPiB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCwgYWxsb3dlZERheXNPZldlZWssIGluZGV4RGF5T2ZXZWVrLCBpc0VuYWJsZWREYXksIGlzRW5hYmxlZEZpbHRlckRheSB9ID0gc3RhdGU7XG4gIGNvbnN0IGVuYWJsZWRTZWxlY3RlZEluZGV4ZXMgPSBBcnJheS5mcm9tKHN0YXRlLnNlbGVjdGVkSW5kZXhlcykuZmlsdGVyKChpKSA9PiBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoaSkpKTtcbiAgY29uc3QgbWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMgPSBtaW5BbmRNYXhOdW1iZXIoZW5hYmxlZFNlbGVjdGVkSW5kZXhlcyk7XG5cbiAgbGV0IHN0YXJ0UmFuZ2U6IE1heWJlPERhdGVCbG9ja0luZGV4PjtcbiAgbGV0IGVuZFJhbmdlOiBNYXliZTxEYXRlQmxvY2tJbmRleD47XG5cbiAgaWYgKG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzKSB7XG4gICAgc3RhcnRSYW5nZSA9IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzLm1pbjtcbiAgICBlbmRSYW5nZSA9IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzLm1heDtcbiAgfVxuXG4gIGlmIChpbnB1dFN0YXJ0ICE9IG51bGwgJiYgaW5wdXRFbmQgIT0gbnVsbCkge1xuICAgIGNvbnN0IGlucHV0U3RhcnRJbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KTtcbiAgICBjb25zdCBpbnB1dEVuZEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0RW5kKTtcblxuICAgIHN0YXJ0UmFuZ2UgPSBzdGFydFJhbmdlICE9IG51bGwgPyBNYXRoLm1pbihpbnB1dFN0YXJ0SW5kZXgsIHN0YXJ0UmFuZ2UpIDogaW5wdXRTdGFydEluZGV4O1xuICAgIGVuZFJhbmdlID0gZW5kUmFuZ2UgIT0gbnVsbCA/IE1hdGgubWF4KGlucHV0RW5kSW5kZXgsIGVuZFJhbmdlKSA6IGlucHV0RW5kSW5kZXg7XG4gIH1cblxuICBpZiAoc3RhcnRSYW5nZSAhPSBudWxsICYmIGVuZFJhbmdlICE9IG51bGwpIHtcbiAgICBjb25zdCBzY2FuU3RhcnRJbmRleCA9IHN0YXJ0UmFuZ2U7XG4gICAgY29uc3Qgc2NhbkVuZEluZGV4ID0gZW5kUmFuZ2U7XG5cbiAgICAvLyBjbGVhciBzdGFydCBhbmQgZW5kXG4gICAgc3RhcnRSYW5nZSA9IHVuZGVmaW5lZDtcbiAgICBlbmRSYW5nZSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIGlmIHRoZSBtaW4gaXMgZXF1YWwgdG8gdGhlIHN0YXJ0IGluZGV4LCB0aGVuIHdlIGFyZSBpbiB0aGUgcmFuZ2UgYW5kIG5lZWQgdG8gaXRlcmF0ZSBkYXRlcyB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGlzIG5vdCBzZWxlY3RlZC9leGNsdWRlZC5cbiAgICBmb3IgKGxldCBpID0gc2NhblN0YXJ0SW5kZXg7IGkgPD0gc2NhbkVuZEluZGV4OyBpICs9IDEpIHtcbiAgICAgIGlmIChpc0VuYWJsZWRGaWx0ZXJEYXkoaSkgJiYgaXNFbmFibGVkRGF5KGkpKSB7XG4gICAgICAgIHN0YXJ0UmFuZ2UgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzYW1lIHdpdGggdGhlIG1heFxuICAgIGZvciAobGV0IGkgPSBzY2FuRW5kSW5kZXg7IGkgPj0gc2NhblN0YXJ0SW5kZXg7IGkgLT0gMSkge1xuICAgICAgaWYgKGlzRW5hYmxlZEZpbHRlckRheShpKSAmJiBpc0VuYWJsZWREYXkoaSkpIHtcbiAgICAgICAgZW5kUmFuZ2UgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnRSYW5nZSAhPSBudWxsICYmIGVuZFJhbmdlICE9IG51bGwpIHtcbiAgICByZXR1cm4geyBpOiBzdGFydFJhbmdlLCB0bzogZW5kUmFuZ2UgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|
|
545
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwseUJBQXlCLEVBR3pCLDBCQUEwQixFQUcxQixzQkFBc0IsRUFDdEIsZ0NBQWdDLEVBRWhDLG1CQUFtQixFQUNuQix1QkFBdUIsRUFJdkIsOEJBQThCLEVBQzlCLDBCQUEwQixFQUMxQix3Q0FBd0MsRUFDeEMsV0FBVyxFQUNYLFdBQVcsRUFDWCx5QkFBeUIsRUFFekIsa0NBQWtDLEVBQ2xDLFVBQVUsRUFDVixhQUFhLEVBQ2IsZUFBZSxFQUNmLHVCQUF1QixFQUV2QixtQ0FBbUMsRUFDbkMsbUJBQW1CLEVBQ25CLDJCQUEyQixFQUMzQixxQkFBcUIsRUFFckIsdUJBQXVCLEVBR3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUE0RCxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBWSxlQUFlLEVBQUUsaUJBQWlCLEVBQWEsS0FBSyxFQUFzQixNQUFNLEVBQUUsV0FBVyxFQUFnQixhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMVMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxRCxPQUFPLEVBQWMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FB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RTlCLHNCQUFzQjtRQUN0QixVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQ3ZCLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFFckIsOElBQThJO1FBQzlJLEtBQUssSUFBSSxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0RCxJQUFJLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDNUMsVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDZixNQUFNO2FBQ1A7U0FDRjtRQUVELG9CQUFvQjtRQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEQsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzVDLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQ2IsTUFBTTthQUNQO1NBQ0Y7S0FDRjtJQUVELElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1FBQzFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztLQUN4QztTQUFNO1FBQ0wsT0FBTyxTQUFTLENBQUM7S0FDbEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeSxcbiAgZGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeSxcbiAgRGF0ZUJsb2NrSW5kZXgsXG4gIERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlLFxuICBkYXRlQmxvY2tUaW1pbmdEYXRlRmFjdG9yeSxcbiAgRGF0ZU9yRGF0ZUJsb2NrSW5kZXgsXG4gIERhdGVSYW5nZSxcbiAgZGF0ZVNjaGVkdWxlRGF0ZUZpbHRlcixcbiAgY29weURhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWcsXG4gIERhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWcsXG4gIERhdGVTY2hlZHVsZURheUNvZGUsXG4gIGRhdGVTY2hlZHVsZUVuY29kZWRXZWVrLFxuICBEYXRlU2NoZWR1bGVFbmNvZGVkV2VlayxcbiAgRGF0ZVNjaGVkdWxlUmFuZ2UsXG4gIERhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeSxcbiAgZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5LFxuICBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2RlcyxcbiAgZXhwYW5kRGF0ZVNjaGVkdWxlRGF5Q29kZXNUb0RheU9mV2Vla1NldCxcbiAgZmluZE1heERhdGUsXG4gIGZpbmRNaW5EYXRlLFxuICBpc0RhdGVJbkRhdGVSYW5nZUZ1bmN0aW9uLFxuICBJc0RhdGVXaXRoaW5EYXRlQmxvY2tSYW5nZUZ1bmN0aW9uLFxuICBpc0RhdGVXaXRoaW5EYXRlQmxvY2tSYW5nZUZ1bmN0aW9uLFxuICBpc1NhbWVEYXRlLFxuICBpc1NhbWVEYXRlRGF5LFxuICBpc1NhbWVEYXRlUmFuZ2UsXG4gIGlzU2FtZURhdGVTY2hlZHVsZVJhbmdlLFxuICBEYXRlT3JEYXRlUmFuZ2VPckRhdGVCbG9ja0luZGV4T3JEYXRlQmxvY2tSYW5nZSxcbiAgZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhBcnJheUZhY3RvcnksXG4gIGlzSW5maW5pdGVEYXRlUmFuZ2UsXG4gIGNvcHlIb3Vyc0FuZE1pbnV0ZXNGcm9tRGF0ZSxcbiAgZGF0ZVRpbWV6b25lVXRjTm9ybWFsLFxuICBEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZSxcbiAgZXhwYW5kRGF0ZVNjaGVkdWxlUmFuZ2UsXG4gIERhdGVCbG9jayxcbiAgRGF0ZUJsb2NrRHVyYXRpb25TcGFuXG59IGZyb20gJ0BkZXJlZWtiL2RhdGUnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbEhhc0RpZmZlcmVudFZhbHVlcywgZmlsdGVyTWF5YmUgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IE1heWJlLCBUaW1lem9uZVN0cmluZywgRGVjaXNpb25GdW5jdGlvbiwgSXRlcmFibGVPclZhbHVlLCBpdGVyYWJsZVRvQXJyYXksIGFkZFRvU2V0LCB0b2dnbGVJblNldCwgaXNJbmRleE51bWJlckluSW5kZXhSYW5nZUZ1bmN0aW9uLCBNYXliZU1hcCwgbWluQW5kTWF4TnVtYmVyLCBzZXRzQXJlRXF1aXZhbGVudCwgRGF5T2ZXZWVrLCByYW5nZSwgQWxsT3JOb25lU2VsZWN0aW9uLCB1bmlxdWUsIG1lcmdlQXJyYXlzLCBBcnJheU9yVmFsdWUsIHJlbW92ZUZyb21TZXQgfSBmcm9tICdAZGVyZWVrYi91dGlsJztcbmltcG9ydCB7IENvbXBvbmVudFN0b3JlIH0gZnJvbSAnQG5ncngvY29tcG9uZW50LXN0b3JlJztcbmltcG9ydCB7IHN0YXJ0T2ZEYXksIGVuZE9mRGF5LCBpc0JlZm9yZSB9IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcCwgZmlyc3QsIGNvbWJpbmVMYXRlc3RXaXRoIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5LCBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uVmFsdWUsIGRlZmF1bHRDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5IH0gZnJvbSAnLi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSB7XG4gIC8qKlxuICAgKiBJbnB1dCBTdGFydCBEYXRlXG4gICAqL1xuICBpbnB1dFN0YXJ0OiBEYXRlO1xuICAvKipcbiAgICogSW5wdXQgRW5kIERhdGVcbiAgICovXG4gIGlucHV0RW5kOiBEYXRlO1xufVxuXG5leHBvcnQgdHlwZSBQYXJ0aWFsQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlID0gUGFydGlhbDxNYXliZU1hcDxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U+PjtcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUgZXh0ZW5kcyBQYXJ0aWFsQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlIHtcbiAgLyoqXG4gICAqIEZpbHRlcnMgdGhlIGRheXMgb2YgdGhlIHNjaGVkdWxlIHRvIG9ubHkgYWxsb3cgc2VsZWN0aW5nIGRheXMgaW4gdGhlIHNjaGVkdWxlLlxuICAgKlxuICAgKiBJZiBmaWx0ZXIuc3RhcnQgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIHRpbWV6b25lIGlzIGlnbm9yZWQsIGlmIG9uZSBpcyBwcmVzZW50LlxuICAgKi9cbiAgZmlsdGVyPzogTWF5YmU8RGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz47XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGV4Y2x1c2lvbnMgdGhhdCBtYXkgbm90IGJlIGRlZmluZWQgd2l0aGluIHRoZSBmaWx0ZXIuXG4gICAqL1xuICBpbnB1dEV4Y2x1c2lvbnM/OiBNYXliZTxBcnJheU9yVmFsdWU8RGF0ZU9yRGF0ZVJhbmdlT3JEYXRlQmxvY2tJbmRleE9yRGF0ZUJsb2NrUmFuZ2U+PjtcbiAgLyoqXG4gICAqIFRoZSBjb21wdXRlZCBleGNsdXNpb25zIGdpdmVuIHRoZSBpbnB1dCBleGNsdXNpb25zLlxuICAgKi9cbiAgY29tcHV0ZWRFeGNsdXNpb25zPzogTWF5YmU8RGF0ZUJsb2NrSW5kZXhbXT47XG4gIC8qKlxuICAgKiBUaGUgbWluL21heCBkYXRlIHJhbmdlLiBVc2VkIGZvciByZXN0cmljdGluZyB0aGUgbWluL21heCB2YWx1ZS4gV29ya3Mgd2l0aCB0aGUgZmlsdGVyLiBUaGUgZ3JlYXRlci9sZXNzZXIgb2YgdGhlIHN0YXJ0L2VuZCBkYXRlcyBhcmUgdXNlZCBpZiBib3RoIGFyZSBwcm92aWRlZC5cbiAgICovXG4gIG1pbk1heERhdGVSYW5nZT86IE1heWJlPFBhcnRpYWw8RGF0ZVJhbmdlPj47XG4gIC8qKlxuICAgKiBTdGFydCBkYXRlLiBJcyB1cGRhdGVkIGFzIHRoZSBpbnB1dFN0YXJ0IGlzIG1vZGlmaWVkIG9yIGZpbHRlciBpcyBwcm92aWRlZCB0aGF0IHByb3ZpZGVzIHRoZSBzdGFydCBkYXRlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0b2RheSBhbmQgdGhlIGN1cnJlbnQgdGltZXpvbmUuXG4gICAqL1xuICBzdGFydDogRGF0ZTtcbiAgLyoqXG4gICAqIFRpbWV6b25lIHRvIHVzZS4gT25seUluZmx1ZW5jZXMgdGhlIG91dHB1dCBzdGFydCBkYXRlLlxuICAgKi9cbiAgdGltZXpvbmU/OiBNYXliZTxUaW1lem9uZVN0cmluZz47XG4gIC8qKlxuICAgKiBDdXJyZW50IHRpbWV6b25lIG5vcm1hbCB3aXRoIHRoZSBjdXJyZW50IHRpbWV6b25lLlxuICAgKi9cbiAgdGltZXpvbmVOb3JtYWw/OiBNYXliZTxEYXRlVGltZXpvbmVVdGNOb3JtYWxJbnN0YW5jZT47XG4gIC8qKlxuICAgKiBEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlcbiAgICovXG4gIGluZGV4RmFjdG9yeTogRGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5O1xuICAvKipcbiAgICogQXJyYXkgb2YgbWFudWFsbHkgc2VsZWN0ZWQgZGF0ZXMgd2l0aGluIHRoZSBwaWNrZWQgcmFuZ2UuIFRoaXMgaXMgTk9UIHRoZSBzZXQgb2YgYWxsIHNlbGVjdGVkIGluZGV4ZXMgaW4gdGVybXMgb2Ygb3V0cHV0LlxuICAgKlxuICAgKiBWYWx1ZXMgdGhhdCBleGlzdCBvdXRzaWRlIG9mIHRoZSBcImlucHV0XCIgcmFuZ2UgYXJlIGNvbnNpZGVyZWQgdG9nZ2xlZCBvbiwgd2hpbGUgdGhvc2VcbiAgICogdGhhdCBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSByYW5nZSBhcmUgY29uc2lkZXJlZCB0b2dnbGVkIG9mZi5cbiAgICpcbiAgICogSWYgZGF0ZXMgYXJlIHNlbGVjdGVkLCBhbmQgdGhlbiBhIHJhbmdlIGlzIHNlbGVjdGVkLCB0aGVuIHRob3NlIGRhdGVzIHdpdGhpbiB0aGUgcmFuZ2UgdGhhdCBmYWxsXG4gICAqIHdpdGhpbiB0aGUgcmFuZ2UgYXJlIGNsZWFyZWQgZnJvbSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIFRoZXNlIGluZGV4ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBkYXRlLlxuICAgKi9cbiAgdG9nZ2xlZEluZGV4ZXM6IFNldDxEYXRlQmxvY2tJbmRleD47XG4gIC8qKlxuICAgKiBEYXlzIG9mIHRoZSBzY2hlZHVsZSB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHBpY2tlZC5cbiAgICovXG4gIHNjaGVkdWxlRGF5czogU2V0PERhdGVTY2hlZHVsZURheUNvZGU+O1xuICAvKipcbiAgICogU2V0IG9mIHRoZSBkYXlzIG9mIHdlZWsgdGhhdCBhcmUgYWxsb3dlZC5cbiAgICovXG4gIGFsbG93ZWREYXlzT2ZXZWVrOiBTZXQ8RGF5T2ZXZWVrPjtcbiAgLyoqXG4gICAqXG4gICAqL1xuICBpbmRleERheU9mV2VlazogRGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeTtcbiAgLyoqXG4gICAqIERlY2lzaW9uIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgaXMgZW5hYmxlZCBnaXZlbiB0aGUgY3VycmVudCBmaWx0ZXIuXG4gICAqL1xuICBpc0VuYWJsZWRGaWx0ZXJEYXk6IERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICAvKipcbiAgICogRGVjaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgdGhlIGN1cnJlbnQgZmlsdGVyIGludG8gYWNjb3VudC5cbiAgICovXG4gIGlzRW5hYmxlZERheTogRGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD47XG4gIC8qKlxuICAgKiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5IGZvciB0aGUgdmlldy5cbiAgICovXG4gIGNlbGxDb250ZW50RmFjdG9yeTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeTtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc2VsZWN0aW9uIHZhbHVlLlxuICAgKi9cbiAgY3VycmVudFNlbGVjdGlvblZhbHVlPzogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgZmlsdGVyIGFzIHRoZSBzdGFydCBhbmQgZW5kIHJhbmdlIGluc3RlYWQgb2Ygb3B0aW1pemluZyBmb3IgdGhlIGN1cnJlbnQgaW5kZXguXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcj86IE1heWJlPGJvb2xlYW4+O1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgc2VsZWN0aW9uIHN0YXRlIHdoZW4gdGhlIGNhbGVuZGFyIGlzIHJlc2V0LlxuICAgKi9cbiAgaW5pdGlhbFNlbGVjdGlvblN0YXRlPzogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3Qgc2NoZWR1bGVEYXlzID0gbmV3IFNldChbRGF0ZVNjaGVkdWxlRGF5Q29kZS5XRUVLREFZLCBEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtFTkRdKTtcbiAgY29uc3QgYWxsb3dlZERheXNPZldlZWsgPSBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0KEFycmF5LmZyb20oc2NoZWR1bGVEYXlzKSk7XG4gIGNvbnN0IHN0YXJ0ID0gc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcbiAgY29uc3QgaW5kZXhGYWN0b3J5ID0gZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5KHsgc3RhcnQgfSk7XG4gIGNvbnN0IGluZGV4RGF5T2ZXZWVrID0gZGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeShzdGFydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydCxcbiAgICBpbmRleEZhY3RvcnksXG4gICAgdG9nZ2xlZEluZGV4ZXM6IG5ldyBTZXQoKSxcbiAgICBzY2hlZHVsZURheXMsXG4gICAgYWxsb3dlZERheXNPZldlZWssXG4gICAgaW5kZXhEYXlPZldlZWssXG4gICAgaXNFbmFibGVkRmlsdGVyRGF5OiAoKSA9PiB0cnVlLFxuICAgIGlzRW5hYmxlZERheTogKCkgPT4gZmFsc2UsXG4gICAgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXI6IHRydWUsXG4gICAgY2VsbENvbnRlbnRGYWN0b3J5OiBkZWZhdWx0Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZU1pbkRhdGUoeDogUGljazxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsICdmaWx0ZXInIHwgJ21pbk1heERhdGVSYW5nZSc+KTogTWF5YmU8RGF0ZT4ge1xuICByZXR1cm4gZmluZE1heERhdGUoW3guZmlsdGVyPy5zdGFydCwgeC5taW5NYXhEYXRlUmFuZ2U/LnN0YXJ0XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWF4RGF0ZSh4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnbWluTWF4RGF0ZVJhbmdlJz4pOiBNYXliZTxEYXRlPiB7XG4gIHJldHVybiBmaW5kTWluRGF0ZShbeC5maWx0ZXI/LmVuZCwgeC5taW5NYXhEYXRlUmFuZ2U/LmVuZF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZU1pbkFuZE1heERhdGVSYW5nZSh4OiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ2ZpbHRlcicgfCAnbWluTWF4RGF0ZVJhbmdlJz4pOiBQYXJ0aWFsPERhdGVSYW5nZT4ge1xuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBjYWxlbmRhclNjaGVkdWxlTWluRGF0ZSh4KSB8fCB1bmRlZmluZWQsXG4gICAgZW5kOiBjYWxlbmRhclNjaGVkdWxlTWF4RGF0ZSh4KSB8fCB1bmRlZmluZWRcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIoeDogUGljazxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsICdmaWx0ZXInIHwgJ2NvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyJz4pIHtcbiAgcmV0dXJuIHguY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgJiYgeC5maWx0ZXI/LnN0YXJ0ICE9IG51bGw7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmUgZXh0ZW5kcyBDb21wb25lbnRTdG9yZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGU+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoaW5pdGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSgpKTtcbiAgfVxuXG4gIC8vIE1BUks6XG4gIHJlYWRvbmx5IHRvZ2dsZVNlbGVjdGlvbiA9IHRoaXMuZWZmZWN0KChpbnB1dDogT2JzZXJ2YWJsZTx2b2lkPikgPT4ge1xuICAgIHJldHVybiBpbnB1dC5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgIHRoaXMubmV4dFRvZ2dsZVNlbGVjdGlvbiQucGlwZShcbiAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgIGZpbHRlck1heWJlKCksXG4gICAgICAgICAgdGFwKCh4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEFsbERhdGVzKHgpO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICB9KTtcblxuICAvLyBNQVJLOiBBY2Nlc3NvcnNcbiAgcmVhZG9ubHkgZmlsdGVyJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmZpbHRlciksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG1pbk1heERhdGVSYW5nZSQgPSB0aGlzLnN0YXRlJC5waXBlKG1hcChjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZVJhbmdlKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZVJhbmdlKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IG1pbkRhdGUkID0gdGhpcy5taW5NYXhEYXRlUmFuZ2UkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4Py5zdGFydCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZURheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgcmVhZG9ubHkgbWF4RGF0ZSQgPSB0aGlzLm1pbk1heERhdGVSYW5nZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHg/LmVuZCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZURheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBoYXNDb25maWd1cmVkTWluTWF4UmFuZ2UkID0gdGhpcy5taW5NYXhEYXRlUmFuZ2UkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4ICE9IG51bGwgJiYgeC5zdGFydCAhPSBudWxsICYmIHguZW5kICE9IG51bGwpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dFN0YXJ0JCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlucHV0U3RhcnQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRFbmQkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaW5wdXRFbmQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudElucHV0UmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSkgPT4gKHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBpc1NhbWVEYXRlKGEuaW5wdXRTdGFydCwgYi5pbnB1dFN0YXJ0KSAmJiBpc1NhbWVEYXRlKGEuaW5wdXRFbmQsIGIuaW5wdXRFbmQpKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4LmlucHV0U3RhcnQgJiYgeC5pbnB1dEVuZCkge1xuICAgICAgICByZXR1cm4geCBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRSYW5nZSQ6IE9ic2VydmFibGU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPiA9IHRoaXMuY3VycmVudElucHV0UmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gdmFsdWUuIFRoaXMgaXMgdGhlIHNldCBvZiBtYW51YWxseSB0b2dnZWQgb2ZmIGRhdGVzLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdXBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VsZWN0ZWREYXRlcyQ6IE9ic2VydmFibGU8U2V0PERhdGVCbG9ja0luZGV4Pj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC50b2dnbGVkSW5kZXhlcyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlzRW5hYmxlZEZpbHRlckRheUZ1bmN0aW9uJDogT2JzZXJ2YWJsZTxEZWNpc2lvbkZ1bmN0aW9uPERhdGVPckRhdGVCbG9ja0luZGV4Pj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5pc0VuYWJsZWRGaWx0ZXJEYXkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkRGF5RnVuY3Rpb24kOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlzRW5hYmxlZERheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50RGF0ZVJhbmdlJDogT2JzZXJ2YWJsZTxNYXliZTxEYXRlUmFuZ2U+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBpc1NhbWVEYXRlUmFuZ2UoYSwgYikpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIkOiBPYnNlcnZhYmxlPE1heWJlPGJvb2xlYW4+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHN0YXJ0QmVpbmdVc2VkRnJvbUZpbHRlciQ6IE9ic2VydmFibGU8TWF5YmU8Ym9vbGVhbj4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICAvL1xuICAgIG1hcChjYWxlbmRhclNjaGVkdWxlU3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZGF0ZVJhbmdlJDogT2JzZXJ2YWJsZTxEYXRlUmFuZ2U+ID0gdGhpcy5jdXJyZW50RGF0ZVJhbmdlJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBzY2hlZHVsZURheXMkOiBPYnNlcnZhYmxlPFNldDxEYXRlU2NoZWR1bGVEYXlDb2RlPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5zY2hlZHVsZURheXMpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKHNldHNBcmVFcXVpdmFsZW50KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnRUaW1lem9uZSQ6IE9ic2VydmFibGU8TWF5YmU8VGltZXpvbmVTdHJpbmc+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnRpbWV6b25lKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgZWZmZWN0aXZlVGltZXpvbmUkOiBPYnNlcnZhYmxlPE1heWJlPFRpbWV6b25lU3RyaW5nPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gKCFjYWxlbmRhclNjaGVkdWxlU3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyKHgpICYmIHgudGltZXpvbmUgPyB4LnRpbWV6b25lIDogdW5kZWZpbmVkKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGVmZmVjdGl2ZVRpbWV6b25lTm9ybWFsJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoIWNhbGVuZGFyU2NoZWR1bGVTdGFydEJlaW5nVXNlZEZyb21GaWx0ZXIoeCkgJiYgeC50aW1lem9uZU5vcm1hbCA/IHgudGltZXpvbmVOb3JtYWwgOiB1bmRlZmluZWQpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWVEYXRlQmxvY2tEdXJhdGlvblNwYW4kOiBPYnNlcnZhYmxlPERhdGVCbG9ja0R1cmF0aW9uU3BhbjxEYXRlQmxvY2s+W10+ID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiAoeCA/IGV4cGFuZERhdGVTY2hlZHVsZVJhbmdlKHgpIDogW10pKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlU2VsZWN0ZWRJbmRleGVzJDogT2JzZXJ2YWJsZTxTZXQ8RGF0ZUJsb2NrSW5kZXg+PiA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlRGF0ZUJsb2NrRHVyYXRpb25TcGFuJC5waXBlKFxuICAgIG1hcCgoeCkgPT4gbmV3IFNldCh4Lm1hcCgoeSkgPT4geS5pKSkpLFxuICAgIGRpc3RpbmN0VW50aWxIYXNEaWZmZXJlbnRWYWx1ZXMoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGlvblZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKGZpbHRlck1heWJlKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBjdXJyZW50U2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmUkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoXG4gICAgY29tYmluZUxhdGVzdFdpdGgodGhpcy5lZmZlY3RpdmVUaW1lem9uZU5vcm1hbCQpLFxuICAgIG1hcCgoW3gsIHRpbWV6b25lTm9ybWFsXSkgPT4ge1xuICAgICAgaWYgKHggJiYgdGltZXpvbmVOb3JtYWwpIHtcbiAgICAgICAgeCA9IHtcbiAgICAgICAgICBkYXRlU2NoZWR1bGVSYW5nZToge1xuICAgICAgICAgICAgLi4ueC5kYXRlU2NoZWR1bGVSYW5nZSxcbiAgICAgICAgICAgIHN0YXJ0OiB0aW1lem9uZU5vcm1hbC50YXJnZXREYXRlVG9TeXN0ZW1EYXRlKHguZGF0ZVNjaGVkdWxlUmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgZW5kOiB0aW1lem9uZU5vcm1hbC50YXJnZXREYXRlVG9TeXN0ZW1EYXRlKHguZGF0ZVNjaGVkdWxlUmFuZ2UuZW5kKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB4O1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZSQgPSB0aGlzLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWVXaXRoVGltZXpvbmVEYXRlQmxvY2tEdXJhdGlvblNwYW4kOiBPYnNlcnZhYmxlPERhdGVCbG9ja0R1cmF0aW9uU3BhbjxEYXRlQmxvY2s+W10+ID0gdGhpcy5zZWxlY3Rpb25WYWx1ZVdpdGhUaW1lem9uZSQucGlwZShcbiAgICBtYXAoKHgpID0+IGV4cGFuZERhdGVTY2hlZHVsZVJhbmdlKHgpKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG5leHRUb2dnbGVTZWxlY3Rpb24kOiBPYnNlcnZhYmxlPE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj4+ID0gdGhpcy5oYXNDb25maWd1cmVkTWluTWF4UmFuZ2UkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChoYXNDb25maWd1cmVkTWluTWF4UmFuZ2UpID0+IHtcbiAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8TWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPj47XG5cbiAgICAgIGlmIChoYXNDb25maWd1cmVkTWluTWF4UmFuZ2UpIHtcbiAgICAgICAgb2JzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUobWFwKCh4KSA9PiAoeCA/ICdub25lJyA6ICdhbGwnKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JzID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUobWFwKCh4KSA9PiAoeCA/ICdub25lJyA6IHVuZGVmaW5lZCkpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9icztcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlV2l0aFRpbWV6b25lJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZGF0ZVNjaGVkdWxlUmFuZ2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVTY2hlZHVsZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVTY2hlZHVsZVJhbmdlVmFsdWUkID0gdGhpcy5jdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgY2VsbENvbnRlbnRGYWN0b3J5JCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmNlbGxDb250ZW50RmFjdG9yeSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlzQ3VzdG9taXplZCQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC50b2dnbGVkSW5kZXhlcy5zaXplID4gMCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8vIE1BUks6IFN0YXRlIENoYW5nZXNcbiAgcmVhZG9ubHkgc2V0TWluTWF4RGF0ZVJhbmdlID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aE1pbk1heERhdGVSYW5nZSk7XG4gIHJlYWRvbmx5IHNldEZpbHRlciA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIpO1xuICByZWFkb25seSBzZXRFeGNsdXNpb25zID0gdGhpcy51cGRhdGVyKHVwZGF0ZVN0YXRlV2l0aEV4Y2x1c2lvbnMpO1xuICByZWFkb25seSBzZXRDb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhDb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcik7XG4gIHJlYWRvbmx5IGNsZWFyRmlsdGVyID0gdGhpcy51cGRhdGVyKChzdGF0ZSkgPT4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCB1bmRlZmluZWQpKTtcblxuICByZWFkb25seSBzZXRUaW1lem9uZSA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhUaW1lem9uZVZhbHVlKTtcbiAgcmVhZG9ubHkgc2V0SW5wdXRSYW5nZSA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkUmFuZ2UpO1xuXG4gIC8vIE5PVEU6IFNlbGVjdGVkIGRhdGVzIGFyZSBOT1Qgc2VsZWN0ZWQgaW5kZXhlcy4gVGhleSBhcmUgdGhlIGludGVybmFsIHNlbGVjdGVkIGRhdGVzIHRoYXQgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHNlbGVjdGlvbi5cbiAgcmVhZG9ubHkgdG9nZ2xlU2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHRvZ2dsZTogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHRvZ2dsZSB9KSk7XG4gIHJlYWRvbmx5IGFkZFNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBhZGQ6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBhZGQgfSkpO1xuICByZWFkb25seSByZW1vdmVTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgcmVtb3ZlOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgcmVtb3ZlIH0pKTtcbiAgcmVhZG9ubHkgc2V0U2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHNldDogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNldCB9KSk7XG5cbiAgLy8gTk9URTogU2VsZWN0ZWQgaW5kZXhlcyBhcmUgdGhlIHR5cGljYWwvZXhwZWN0ZWQgaW5kZXhlcyB0aGF0IGFyZSBzZWxlY3RlZCBvciBub3QuXG4gIHJlYWRvbmx5IHNldFNlbGVjdGVkSW5kZXhlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHNldDogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNldCwgaW52ZXJ0U2V0QmVoYXZpb3I6IHRydWUgfSkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdEFsbERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2VsZWN0QWxsOiBBbGxPck5vbmVTZWxlY3Rpb24gPSAnYWxsJykgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNlbGVjdEFsbCB9KSk7XG4gIHJlYWRvbmx5IHNldEluaXRpYWxTZWxlY3Rpb25TdGF0ZSA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhJbml0aWFsU2VsZWN0aW9uU3RhdGUpO1xuXG4gIHJlYWRvbmx5IHNldFNjaGVkdWxlRGF5cyA9IHRoaXMudXBkYXRlcih1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKTtcbiAgcmVhZG9ubHkgc2V0QWxsb3dBbGxTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCBudWxsKSk7XG5cbiAgcmVhZG9ubHkgc2V0RGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHZhbHVlOiBNYXliZTxEYXRlU2NoZWR1bGVSYW5nZT4pID0+IHVwZGF0ZVN0YXRlV2l0aERhdGVTY2hlZHVsZVJhbmdlVmFsdWUoc3RhdGUsIHZhbHVlKSk7XG4gIHJlYWRvbmx5IHNldENlbGxDb250ZW50RmFjdG9yeSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGNlbGxDb250ZW50RmFjdG9yeTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSkgPT4gKHsgLi4uc3RhdGUsIGNlbGxDb250ZW50RmFjdG9yeSB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhJbml0aWFsU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgaW5pdGlhbFNlbGVjdGlvblN0YXRlOiBNYXliZTxBbGxPck5vbmVTZWxlY3Rpb24+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyB0b2dnbGVkSW5kZXhlcyB9ID0gc3RhdGU7XG5cbiAgaWYgKHRvZ2dsZWRJbmRleGVzLnNpemUgPT09IDAgJiYgaW5pdGlhbFNlbGVjdGlvblN0YXRlID09PSAnYWxsJykge1xuICAgIHN0YXRlID0gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNlbGVjdEFsbDogaW5pdGlhbFNlbGVjdGlvblN0YXRlIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgLi4uc3RhdGUsIGluaXRpYWxTZWxlY3Rpb25TdGF0ZSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIoY3VycmVudFN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyOiBNYXliZTxib29sZWFuPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGxldCBzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlID0geyAuLi5jdXJyZW50U3RhdGUsIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyIH07XG5cbiAgaWYgKEJvb2xlYW4oY3VycmVudFN0YXRlLmNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKSAhPT0gQm9vbGVhbihjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcikpIHtcbiAgICBzdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwge30pOyAvLyByZWNhbGN1bGF0ZSBpZiBjaGFuZ2Ugb2NjdXJzIGFzIGl0IHdpbGwgYWZmZWN0IHRoZSBvdXRwdXQgdmFsdWVcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aEV4Y2x1c2lvbnMoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgaW5wdXRFeGNsdXNpb25zOiBNYXliZTxBcnJheU9yVmFsdWU8RGF0ZU9yRGF0ZVJhbmdlT3JEYXRlQmxvY2tJbmRleE9yRGF0ZUJsb2NrUmFuZ2U+Pik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGxldCBjb21wdXRlZEV4Y2x1c2lvbnM6IE1heWJlPERhdGVCbG9ja0luZGV4W10+O1xuXG4gIGlmIChpbnB1dEV4Y2x1c2lvbnMpIHtcbiAgICBjb25zdCB7IGluZGV4RmFjdG9yeSB9ID0gc3RhdGU7XG4gICAgY29uc3QgaW5kZXhBcnJheUZhY3RvcnkgPSBkYXRlVGltaW5nUmVsYXRpdmVJbmRleEFycmF5RmFjdG9yeShpbmRleEZhY3RvcnkpO1xuICAgIGNvbXB1dGVkRXhjbHVzaW9ucyA9IGluZGV4QXJyYXlGYWN0b3J5KGlucHV0RXhjbHVzaW9ucyk7XG4gIH1cblxuICBzdGF0ZSA9IHsgLi4uc3RhdGUsIGlucHV0RXhjbHVzaW9ucywgY29tcHV0ZWRFeGNsdXNpb25zIH07XG4gIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGUsIHN0YXRlLmZpbHRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhNaW5NYXhEYXRlUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgbWluTWF4RGF0ZVJhbmdlOiBNYXliZTxQYXJ0aWFsPERhdGVSYW5nZT4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgc3RhdGUgPSB7IC4uLnN0YXRlIH07XG5cbiAgaWYgKG1pbk1heERhdGVSYW5nZSAhPSBudWxsICYmICFpc0luZmluaXRlRGF0ZVJhbmdlKG1pbk1heERhdGVSYW5nZSkpIHtcbiAgICBzdGF0ZS5taW5NYXhEYXRlUmFuZ2UgPSB7XG4gICAgICBzdGFydDogbWluTWF4RGF0ZVJhbmdlLnN0YXJ0ICE9IG51bGwgPyBzdGFydE9mRGF5KG1pbk1heERhdGVSYW5nZS5zdGFydCkgOiB1bmRlZmluZWQsXG4gICAgICBlbmQ6IG1pbk1heERhdGVSYW5nZS5lbmQgIT0gbnVsbCA/IGVuZE9mRGF5KG1pbk1heERhdGVSYW5nZS5lbmQpIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgc3RhdGUubWluTWF4RGF0ZVJhbmdlO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZSwgc3RhdGUuZmlsdGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBpbnB1dEZpbHRlcjogTWF5YmU8RGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGNvbXB1dGVkRXhjbHVzaW9uczogZXhjbHVzaW9ucywgbWluTWF4RGF0ZVJhbmdlIH0gPSBzdGF0ZTtcblxuICBsZXQgaXNFbmFibGVkRmlsdGVyRGF5OiBNYXliZTxEZWNpc2lvbkZ1bmN0aW9uPERhdGVPckRhdGVCbG9ja0luZGV4Pj4gPSAoKSA9PiB0cnVlO1xuICBsZXQgZmlsdGVyOiBNYXliZTxEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPiA9IG51bGw7XG5cbiAgLy8gY3JlYXRlIHRoZSBmaWx0ZXIgdXNpbmcgaW5wdXRGaWx0ZXIsIGV4Y2x1c2lvbnMsIGFuZCBtaW5NYXhEYXRlUmFuZ2VcbiAgaWYgKGlucHV0RmlsdGVyIHx8IGV4Y2x1c2lvbnM/Lmxlbmd0aCB8fCBtaW5NYXhEYXRlUmFuZ2UpIHtcbiAgICBsZXQgZW5hYmxlZEZpbHRlcjogRGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZztcblxuICAgIGlmIChpbnB1dEZpbHRlcikge1xuICAgICAgZmlsdGVyID0gY29weURhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWcoaW5wdXRGaWx0ZXIpOyAvLyBjb3B5IGZpbHRlclxuXG4gICAgICBpZiAoZXhjbHVzaW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGVuYWJsZWRGaWx0ZXIgPSB7XG4gICAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgICAgIGV4OiB1bmlxdWUobWVyZ2VBcnJheXMoW2ZpbHRlci5leCwgZXhjbHVzaW9uc10pKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5hYmxlZEZpbHRlciA9IGZpbHRlcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW5hYmxlZEZpbHRlciA9IHtcbiAgICAgICAgdzogJzg5JyxcbiAgICAgICAgZXg6IGV4Y2x1c2lvbnMgYXMgbnVtYmVyW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG1pbk1heERhdGVSYW5nZSkge1xuICAgICAgZW5hYmxlZEZpbHRlci5taW5NYXhEYXRlUmFuZ2UgPSBtaW5NYXhEYXRlUmFuZ2U7XG4gICAgICBlbmFibGVkRmlsdGVyLnNldFN0YXJ0QXNNaW5EYXRlID0gZmlsdGVyPy5zdGFydCA/IHRydWUgOiBmYWxzZTsgLy8gSWYgYSBzdGFydCBkYXRlIGlzIHNldCwgdGhlbiBpdCBiZWNvbWVzIHRoZSBmbG9vci5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgaW5wdXQgZmlsdGVyIGhhcyBhIHN0YXJ0IGRhdGUsIHVzZSB0aGF0IGFzIHRoZSByZWxhdGl2ZSBzdGFydCB0byBlbnN1cmUgaW5kZXhlcyBhcmUgY29tcGFyZWQgdGhlIHNhbWUsXG4gICAgICogb3RoZXJ3aXNlIHVzZSB0aGUgc3RhdGUncyBzdGFydC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHRoZSBpbmRleCBjYWxjdWxhdGlvbnMuXG4gICAgICovXG4gICAgZW5hYmxlZEZpbHRlci5zdGFydCA9IGlucHV0RmlsdGVyPy5zdGFydCA/PyBzdGF0ZS5zdGFydDtcblxuICAgIC8vIGNyZWF0ZSB0aGUgZmlsdGVyXG4gICAgaXNFbmFibGVkRmlsdGVyRGF5ID0gZGF0ZVNjaGVkdWxlRGF0ZUZpbHRlcihlbmFibGVkRmlsdGVyKTtcbiAgfVxuXG4gIHN0YXRlID0geyAuLi5zdGF0ZSwgZmlsdGVyLCBpc0VuYWJsZWRGaWx0ZXJEYXkgfTtcblxuICAvLyBGb3IgdGhlIHNhbWUgcmVhc29uIGFzIGFib3ZlLCB1c2UgdGhlIGZpbHRlcidzIHN0YXJ0IGRhdGUgYXMgdGhlIHJlbGF0aXZlIHN0YXJ0IGlmIGFwcGxpY2FibGUuXG4gIGlmIChmaWx0ZXIgJiYgZmlsdGVyLnN0YXJ0KSB7XG4gICAgY29uc3Qgc3RhcnQgPSBmaWx0ZXIuc3RhcnQ7XG4gICAgc3RhdGUuc3RhcnQgPSBzdGFydDtcbiAgICBzdGF0ZS5pbmRleEZhY3RvcnkgPSBkYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnkoeyBzdGFydCB9KTtcbiAgICBzdGF0ZS5pbmRleERheU9mV2VlayA9IGRhdGVCbG9ja0RheU9mV2Vla0ZhY3Rvcnkoc3RhcnQpO1xuICB9XG5cbiAgLy8gYXR0ZW1wdCB0byByZS1hcHBseSB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gc3RhdGUgb25jZSBmaWx0ZXIgaXMgYXBwbGllZFxuICBpZiAoc3RhdGUuaW5pdGlhbFNlbGVjdGlvblN0YXRlKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhJbml0aWFsU2VsZWN0aW9uU3RhdGUoc3RhdGUsIHN0YXRlLmluaXRpYWxTZWxlY3Rpb25TdGF0ZSk7XG4gIH1cblxuICAvLyByZS1jYWxjdWxhdGUgdGhlIHNlbGVjdGlvbiBnaXZlbiB0aGUgZmlsdGVyXG4gIGNvbnN0IHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSA9IHN0YXRlO1xuXG4gIGlmIChpbnB1dFN0YXJ0ICYmIGlucHV0RW5kKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkUmFuZ2Uoc3RhdGUsIHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhUaW1lem9uZVZhbHVlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIHRpbWV6b25lOiBNYXliZTxUaW1lem9uZVN0cmluZz4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZSB9ID0gc3RhdGU7XG5cbiAgY29uc3QgdGltZXpvbmVOb3JtYWwgPSB0aW1lem9uZSA/IGRhdGVUaW1lem9uZVV0Y05vcm1hbCh7IHRpbWV6b25lIH0pIDogdW5kZWZpbmVkO1xuXG4gIGlmICh0aW1lem9uZU5vcm1hbCAmJiBjdXJyZW50U2VsZWN0aW9uVmFsdWUpIHtcbiAgICAvLyB1cGRhdGUgdGhlIHNlbGVjdGlvbiB2YWx1ZSB0byByZWZsZWN0IHRoZSB0aW1lem9uZSBjaGFuZ2VzLlxuXG4gICAgY29uc3QgeyBkYXRlU2NoZWR1bGVSYW5nZTogY3VycmVudERhdGVTY2hlZHVsZVJhbmdlIH0gPSBjdXJyZW50U2VsZWN0aW9uVmFsdWU7XG4gICAgY29uc3Qgc3RhcnQgPSB0aW1lem9uZU5vcm1hbC50YXJnZXREYXRlVG9TeXN0ZW1EYXRlKGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZS5zdGFydCk7XG4gICAgY29uc3QgZW5kID0gdGltZXpvbmVOb3JtYWwudGFyZ2V0RGF0ZVRvU3lzdGVtRGF0ZShjdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2UuZW5kKTtcblxuICAgIGNvbnN0IG5ld1JhbmdlOiBEYXRlU2NoZWR1bGVSYW5nZSA9IHtcbiAgICAgIC4uLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZS5kYXRlU2NoZWR1bGVSYW5nZSxcbiAgICAgIHN0YXJ0LFxuICAgICAgZW5kXG4gICAgfTtcblxuICAgIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhEYXRlU2NoZWR1bGVSYW5nZVZhbHVlKHsgLi4uc3RhdGUsIHRpbWV6b25lLCB0aW1lem9uZU5vcm1hbCB9LCBuZXdSYW5nZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgLi4uc3RhdGUsIHRpbWV6b25lLCB0aW1lem9uZU5vcm1hbCB9OyAvLyBubyBjaGFuZ2UgaW4gdmFsdWVcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoRGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IE1heWJlPERhdGVTY2hlZHVsZVJhbmdlPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgdGltZXpvbmVOb3JtYWwsIGN1cnJlbnRTZWxlY3Rpb25WYWx1ZSB9ID0gc3RhdGU7XG4gIGNvbnN0IGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZSA9IGN1cnJlbnRTZWxlY3Rpb25WYWx1ZT8uZGF0ZVNjaGVkdWxlUmFuZ2U7IC8vIGN1cnJlbnQgcmFuZ2UgaXMgYWx3YXlzIGluIHN5c3RlbSB0aW1lXG5cbiAgaWYgKCFjYWxlbmRhclNjaGVkdWxlU3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyKHN0YXRlKSAmJiB0aW1lem9uZU5vcm1hbCkge1xuICAgIC8vIFdoZW4gdXNpbmcgdGltZXpvbmVzLCBhbHdheXMgcmV0dXJuIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkYXkuIElucHV0cyBhcmUgY29udmVydGVkIHRvIHRoZSBzeXN0ZW0gdGltZSBhbmQgdXNlZCBhcyB0aGUgc3RhcnQgb2YgdGhlIGRheS5cbiAgICAvLyBPdXRwdXRzIHJlbWFpbiBhY2N1cmF0ZS5cblxuICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgIGNoYW5nZSA9IHtcbiAgICAgICAgLi4uY2hhbmdlLFxuICAgICAgICBzdGFydDogc3RhcnRPZkRheSh0aW1lem9uZU5vcm1hbC5zeXN0ZW1EYXRlVG9UYXJnZXREYXRlKGNoYW5nZS5zdGFydCkpLFxuICAgICAgICBlbmQ6IHN0YXJ0T2ZEYXkodGltZXpvbmVOb3JtYWwuc3lzdGVtRGF0ZVRvVGFyZ2V0RGF0ZShjaGFuZ2UuZW5kKSlcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNTYW1lVmFsdWUgPSBpc1NhbWVEYXRlU2NoZWR1bGVSYW5nZShjdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2UsIGNoYW5nZSk7XG5cbiAgaWYgKGlzU2FtZVZhbHVlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9IGVsc2Uge1xuICAgIGlmIChjaGFuZ2UgIT0gbnVsbCkge1xuICAgICAgY29uc3QgbmV4dFN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUgPSB7IC4uLnN0YXRlLCBpbnB1dFN0YXJ0OiBjaGFuZ2Uuc3RhcnQsIGlucHV0RW5kOiBjaGFuZ2UuZW5kLCB0b2dnbGVkSW5kZXhlczogbmV3IFNldChjaGFuZ2UuZXgpIH07XG4gICAgICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpLCBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2RlcyhjaGFuZ2UudyB8fCAnODknKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBub1NlbGVjdGlvbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShzdGF0ZSk7IC8vIGNsZWFyIHNlbGVjdGlvbiwgcmV0YWluIGRpc2FibGVkIGRheXNcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBNYXliZTxJdGVyYWJsZTxEYXRlU2NoZWR1bGVEYXlDb2RlPj4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IHNjaGVkdWxlRGF5czogY3VycmVudFNjaGVkdWxlRGF5cyB9ID0gc3RhdGU7XG4gIGNvbnN0IHNjaGVkdWxlRGF5cyA9IG5ldyBTZXQoY2hhbmdlIHx8IFtEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtEQVksIERhdGVTY2hlZHVsZURheUNvZGUuV0VFS0VORF0pO1xuXG4gIGlmIChzZXRzQXJlRXF1aXZhbGVudChjdXJyZW50U2NoZWR1bGVEYXlzLCBzY2hlZHVsZURheXMpKSB7XG4gICAgcmV0dXJuIHN0YXRlOyAvLyBubyBjaGFuZ2VcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhbGxvd2VkRGF5c09mV2VlayA9IGV4cGFuZERhdGVTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQoQXJyYXkuZnJvbShzY2hlZHVsZURheXMpKTtcbiAgICBjb25zdCBuZXh0U3RhdGUgPSB7IC4uLnN0YXRlLCBzY2hlZHVsZURheXMsIGFsbG93ZWREYXlzT2ZXZWVrIH07XG4gICAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGVEYXRlc0NoYW5nZSB7XG4gIHJlc2V0PzogdHJ1ZTtcbiAgdG9nZ2xlPzogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PjtcbiAgYWRkPzogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PjtcbiAgcmVtb3ZlPzogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PjtcbiAgc2V0PzogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PjtcbiAgc2VsZWN0QWxsPzogQWxsT3JOb25lU2VsZWN0aW9uO1xuICAvKipcbiAgICogSW52ZXJ0cyB0aGUgc2V0IGRhdGUgY2hhbmdpbmcgYmVoYXZpb3Igc28gdGhhdCB0aGUgc2V0IGlucHV0IGlzIHRyZWF0ZWQgYXMgaXRlbXMgdGhhdCBzaG91bGQgYmUgcmV0YWluZWQgaW5zdGVhZCBvZiBleGNsdWRlZC5cbiAgICpcbiAgICogSWdub3JlZCB3aGVuIHNldCBpcyBub3QgdXNlZC4gSWdub3JlZCBmb3Igc2VsZWN0QWxsLlxuICAgKi9cbiAgaW52ZXJ0U2V0QmVoYXZpb3I/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlRGF0ZXNDaGFuZ2UpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGluZGV4RmFjdG9yeSwgYWxsb3dlZERheXNPZldlZWssIGluZGV4RGF5T2ZXZWVrLCBpbnB1dFN0YXJ0OiBjdXJyZW50SW5wdXRTdGFydCwgaW5wdXRFbmQ6IGN1cnJlbnRJbnB1dEVuZCwgbWluTWF4RGF0ZVJhbmdlLCBmaWx0ZXIgfSA9IHN0YXRlO1xuICBjb25zdCB7IHN0YXJ0OiBtaW5EYXRlLCBlbmQ6IG1heERhdGUgfSA9IGNhbGVuZGFyU2NoZWR1bGVNaW5BbmRNYXhEYXRlUmFuZ2Uoc3RhdGUpO1xuICBsZXQgaW5wdXRTdGFydCA9IGN1cnJlbnRJbnB1dFN0YXJ0O1xuICBsZXQgaW5wdXRFbmQgPSBjdXJyZW50SW5wdXRFbmQ7XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBzZXQgb2YgaW5kZXhlcyB0aGF0IGFyZSBpbnRlcm5hbGx5IFwic2VsZWN0ZWRcIiBzbyB0aGF0IHRoZXkgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGlucHV0U3RhcnQvaW5wdXRFbmQgZGF0ZSByYW5nZS5cbiAgICpcbiAgICogRG8gbm90IGNvbmZ1c2UgdGhpcyB3aXRoIHRoZSBhY3R1YWwgaW5kZXhlcyB0aGF0IGFyZSBzZWxlY3RlZC5cbiAgICovXG4gIGxldCB0b2dnbGVkSW5kZXhlczogU2V0PERhdGVCbG9ja0luZGV4PjtcblxuICBmdW5jdGlvbiBhc0luZGV4ZXMoaW5kZXhlczogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4Pik6IERhdGVCbG9ja0luZGV4W10ge1xuICAgIHJldHVybiBpdGVyYWJsZVRvQXJyYXkoaW5kZXhlcykubWFwKGluZGV4RmFjdG9yeSk7XG4gIH1cblxuICBpZiAoY2hhbmdlLnJlc2V0IHx8IGNoYW5nZS5zZWxlY3RBbGwgIT0gbnVsbCB8fCBjaGFuZ2Uuc2V0ICE9IG51bGwpIHtcbiAgICBsZXQgc2V0OiBNYXliZTxJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PiA9IGNoYW5nZS5zZXQgPz8gW107XG4gICAgY29uc3Qgc2VsZWN0QWxsOiBNYXliZTxBbGxPck5vbmVTZWxlY3Rpb24+ID0gY2hhbmdlLnJlc2V0ID09PSB0cnVlID8gc3RhdGUuaW5pdGlhbFNlbGVjdGlvblN0YXRlIDogY2hhbmdlLnNlbGVjdEFsbDtcblxuICAgIHN3aXRjaCAoc2VsZWN0QWxsKSB7XG4gICAgICBjYXNlICdhbGwnOlxuICAgICAgICBpZiAobWluRGF0ZSAhPSBudWxsICYmIG1heERhdGUgIT0gbnVsbCkge1xuICAgICAgICAgIGlucHV0U3RhcnQgPSBtaW5EYXRlO1xuICAgICAgICAgIGlucHV0RW5kID0gbWF4RGF0ZTtcbiAgICAgICAgICBzZXQgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICBpbnB1dFN0YXJ0ID0gbnVsbDtcbiAgICAgICAgaW5wdXRFbmQgPSBudWxsO1xuICAgICAgICBzZXQgPSBbXTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdG9nZ2xlZEluZGV4ZXMgPSBuZXcgU2V0KGFzSW5kZXhlcyhzZXQpKTtcblxuICAgIGlmIChjaGFuZ2UuaW52ZXJ0U2V0QmVoYXZpb3IgJiYgbWluRGF0ZSAmJiBtYXhEYXRlICYmICFzZWxlY3RBbGwpIHtcbiAgICAgIGNvbnN0IG1pbkluZGV4ID0gaW5kZXhGYWN0b3J5KG1pbkRhdGUpO1xuICAgICAgY29uc3QgbWF4SW5kZXggPSBpbmRleEZhY3RvcnkobWF4RGF0ZSk7XG5cbiAgICAgIGlucHV0U3RhcnQgPSBtaW5EYXRlO1xuICAgICAgaW5wdXRFbmQgPSBtYXhEYXRlO1xuICAgICAgdG9nZ2xlZEluZGV4ZXMgPSBuZXcgU2V0KHJhbmdlKG1pbkluZGV4LCBtYXhJbmRleCArIDEpLmZpbHRlcigoeCkgPT4gIXRvZ2dsZWRJbmRleGVzLmhhcyh4KSkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0b2dnbGVkSW5kZXhlcyA9IG5ldyBTZXQoc3RhdGUudG9nZ2xlZEluZGV4ZXMpO1xuXG4gICAgaWYgKGNoYW5nZS50b2dnbGUpIHtcbiAgICAgIGNvbnN0IGFsbG93ZWRUb1RvZ2dsZSA9IGFzSW5kZXhlcyhjaGFuZ2UudG9nZ2xlKS5maWx0ZXIoKGkpID0+IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhpbmRleERheU9mV2VlayhpKSkpO1xuICAgICAgdG9nZ2xlSW5TZXQodG9nZ2xlZEluZGV4ZXMsIGFsbG93ZWRUb1RvZ2dsZSk7XG4gICAgfVxuXG4gICAgbGV0IGFkZFRvRXhjbHVzaW9uOiBNYXliZTxJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PjtcbiAgICBsZXQgcmVtb3ZlRnJvbUV4Y2x1c2lvbjogTWF5YmU8SXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4Pj47XG5cbiAgICBpZiAoY2hhbmdlLmFkZCkge1xuICAgICAgaWYgKGNoYW5nZS5pbnZlcnRTZXRCZWhhdmlvcikge1xuICAgICAgICBhZGRUb0V4Y2x1c2lvbiA9IGNoYW5nZS5hZGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW1vdmVGcm9tRXhjbHVzaW9uID0gY2hhbmdlLmFkZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlLnJlbW92ZSkge1xuICAgICAgaWYgKGNoYW5nZS5pbnZlcnRTZXRCZWhhdmlvcikge1xuICAgICAgICByZW1vdmVGcm9tRXhjbHVzaW9uID0gY2hhbmdlLnJlbW92ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZFRvRXhjbHVzaW9uID0gY2hhbmdlLnJlbW92ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWRkVG9FeGNsdXNpb24pIHtcbiAgICAgIHJlbW92ZUZyb21TZXQodG9nZ2xlZEluZGV4ZXMsIGFzSW5kZXhlcyhhZGRUb0V4Y2x1c2lvbikpO1xuICAgIH1cblxuICAgIGlmIChyZW1vdmVGcm9tRXhjbHVzaW9uKSB7XG4gICAgICBhZGRUb1NldCh0b2dnbGVkSW5kZXhlcywgYXNJbmRleGVzKHJlbW92ZUZyb21FeGNsdXNpb24pKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXh0U3RhdGUgPSB7IC4uLnN0YXRlLCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCwgdG9nZ2xlZEluZGV4ZXMgfTtcbiAgbmV4dFN0YXRlLmlzRW5hYmxlZERheSA9IGlzRW5hYmxlZERheUluQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG5cbiAgLy8gUmVjYWxjdWxhdGUgdGhlIHJhbmdlIGFuZCBzaW1wbGlmaWVkIHRvIGV4Y2x1c2lvbnNcbiAgY29uc3QgcmFuZ2VBbmRFeGNsdXNpb24gPSBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbihuZXh0U3RhdGUpO1xuXG4gIGlmIChyYW5nZUFuZEV4Y2x1c2lvbikge1xuICAgIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSh7IC4uLm5leHRTdGF0ZSwgdG9nZ2xlZEluZGV4ZXM6IG5ldyBTZXQocmFuZ2VBbmRFeGNsdXNpb24uZXhjbHVkZWQpLCBpbnB1dFN0YXJ0OiByYW5nZUFuZEV4Y2x1c2lvbi5zdGFydCwgaW5wdXRFbmQ6IHJhbmdlQW5kRXhjbHVzaW9uLmVuZCB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBubyBzZWxlY3RlZCBkYXlzXG4gICAgcmV0dXJuIG5vU2VsZWN0aW9uQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vU2VsZWN0aW9uQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoeyAuLi5zdGF0ZSwgdG9nZ2xlZEluZGV4ZXM6IG5ldyBTZXQoKSwgaW5wdXRTdGFydDogbnVsbCwgaW5wdXRFbmQ6IG51bGwgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2UpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGlucHV0U3RhcnQ6IGN1cnJlbnRJbnB1dFN0YXJ0LCBpbnB1dEVuZDogY3VycmVudElucHV0RW5kLCBpbmRleEZhY3RvcnksIG1pbk1heERhdGVSYW5nZSB9ID0gc3RhdGU7XG4gIGNvbnN0IHsgc3RhcnQ6IG1pbkRhdGUsIGVuZDogbWF4RGF0ZSB9OiBQYXJ0aWFsPERhdGVSYW5nZT4gPSBtaW5NYXhEYXRlUmFuZ2UgPz8ge307XG5cbiAgY29uc3QgaW5wdXRTdGFydDogRGF0ZSA9IHN0YXJ0T2ZEYXkoY2hhbmdlLmlucHV0U3RhcnQpO1xuICBjb25zdCBpbnB1dEVuZDogRGF0ZSA9IGVuZE9mRGF5KGNoYW5nZS5pbnB1dEVuZCk7XG5cbiAgY29uc3QgaXNWYWxpZFJhbmdlID0gbWluRGF0ZSAhPSBudWxsIHx8IG1heERhdGUgIT0gbnVsbCA/IGlzRGF0ZUluRGF0ZVJhbmdlRnVuY3Rpb24oeyBzdGFydDogbWluRGF0ZSA/PyB1bmRlZmluZWQsIGVuZDogbWF4RGF0ZSA/PyB1bmRlZmluZWQgfSkgOiAoKSA9PiB0cnVlO1xuXG4gIGlmICghaXNWYWxpZFJhbmdlKGlucHV0U3RhcnQpIHx8ICFpc1ZhbGlkUmFuZ2UoaW5wdXRFbmQpIHx8IChpc1NhbWVEYXRlRGF5KGlucHV0U3RhcnQsIGN1cnJlbnRJbnB1dFN0YXJ0KSAmJiBpc1NhbWVEYXRlRGF5KGlucHV0RW5kLCBjdXJyZW50SW5wdXRFbmQpKSkge1xuICAgIHJldHVybiBzdGF0ZTsgLy8gaWYgbm8gY2hhbmdlLCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gIH1cblxuICAvLyByZXRhaW4gYWxsIGluZGV4ZXMgdGhhdCBhcmUgd2l0aGluIHRoZSBuZXcgcmFuZ2VcbiAgY29uc3QgbWluSW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRTdGFydCk7XG4gIGNvbnN0IG1heEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0RW5kKSArIDE7XG5cbiAgY29uc3QgY3VycmVudEluZGV4ZXM6IERhdGVCbG9ja0luZGV4W10gPSBBcnJheS5mcm9tKHN0YXRlLnRvZ2dsZWRJbmRleGVzKTtcbiAgY29uc3QgaXNJbkN1cnJlbnRSYW5nZSA9IGlzSW5kZXhOdW1iZXJJbkluZGV4UmFuZ2VGdW5jdGlvbih7IG1pbkluZGV4LCBtYXhJbmRleCB9KTtcbiAgY29uc3QgZXhjbHVkZWRJbmRleGVzSW5OZXdSYW5nZSA9IGN1cnJlbnRJbmRleGVzLmZpbHRlcihpc0luQ3VycmVudFJhbmdlKTtcbiAgY29uc3QgdG9nZ2xlZEluZGV4ZXMgPSBuZXcgU2V0KGV4Y2x1ZGVkSW5kZXhlc0luTmV3UmFuZ2UpO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHsgLi4uc3RhdGUsIHRvZ2dsZWRJbmRleGVzLCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9O1xuICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbmV4dFN0YXRlLmlzRW5hYmxlZERheSA9IGlzRW5hYmxlZERheUluQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG4gIG5leHRTdGF0ZS5jdXJyZW50U2VsZWN0aW9uVmFsdWUgPSBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZShuZXh0U3RhdGUpO1xuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbmFibGVkRGF5SW5DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+IHtcbiAgY29uc3QgeyBpbmRleEZhY3RvcnksIGlucHV0U3RhcnQsIGlucHV0RW5kLCBpbmRleERheU9mV2VlaywgYWxsb3dlZERheXNPZldlZWsgfSA9IHN0YXRlO1xuXG4gIGxldCBpc0luU3RhcnRBbmRFbmRSYW5nZTogSXNEYXRlV2l0aGluRGF0ZUJsb2NrUmFuZ2VGdW5jdGlvbjtcblxuICBpZiAoaW5wdXRTdGFydCAmJiBpbnB1dEVuZCkge1xuICAgIGlzSW5TdGFydEFuZEVuZFJhbmdlID0gaXNEYXRlV2l0aGluRGF0ZUJsb2NrUmFuZ2VGdW5jdGlvbih7IHN0YXJ0OiBzdGF0ZS5zdGFydCwgcmFuZ2U6IHsgc3RhcnQ6IGlucHV0U3RhcnQsIGVuZDogaW5wdXRFbmQgfSB9KTtcbiAgfSBlbHNlIHtcbiAgICBpc0luU3RhcnRBbmRFbmRSYW5nZSA9ICgpID0+IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChpbnB1dDogRGF0ZU9yRGF0ZUJsb2NrSW5kZXgpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dCk7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gaW5kZXhEYXlPZldlZWsoaW5kZXgpO1xuXG4gICAgY29uc3QgaXNJblNlbGVjdGVkUmFuZ2UgPSBpc0luU3RhcnRBbmRFbmRSYW5nZShpbnB1dCk7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IHN0YXRlLnRvZ2dsZWRJbmRleGVzLmhhcyhpbmRleCk7XG4gICAgY29uc3QgaXNBbGxvd2VkRGF5T2ZXZWVrID0gYWxsb3dlZERheXNPZldlZWsuaGFzKGRheU9mV2Vlayk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBpc0FsbG93ZWREYXlPZldlZWsgJiYgKChpc0luU2VsZWN0ZWRSYW5nZSAmJiAhaXNTZWxlY3RlZCkgfHwgKGlzU2VsZWN0ZWQgJiYgIWlzSW5TZWxlY3RlZFJhbmdlKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblZhbHVlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uVmFsdWU+IHtcbiAgY29uc3QgeyBpbmRleEZhY3RvcnksIHNjaGVkdWxlRGF5cywgYWxsb3dlZERheXNPZldlZWssIGluZGV4RGF5T2ZXZWVrLCBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciwgZmlsdGVyIH0gPSBzdGF0ZTtcbiAgY29uc3QgcmFuZ2VBbmRFeGNsdXNpb24gPSBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbihzdGF0ZSk7XG5cbiAgaWYgKHJhbmdlQW5kRXhjbHVzaW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgc3RhcnQ6IHJhbmdlU3RhcnQsIGVuZDogcmFuZ2VFbmQsIGV4Y2x1ZGVkOiBhbGxFeGNsdWRlZCwgZGF0ZUJsb2NrUmFuZ2UgfSA9IHJhbmdlQW5kRXhjbHVzaW9uO1xuICBsZXQgZmlsdGVyT2Zmc2V0RXhjbHVkZWRSYW5nZTogRGF0ZUJsb2NrSW5kZXhbXSA9IFtdO1xuICBsZXQgaW5kZXhPZmZzZXQgPSBkYXRlQmxvY2tSYW5nZS5pO1xuXG4gIGxldCBzdGFydCA9IHJhbmdlU3RhcnQ7XG4gIGxldCBlbmQgPSByYW5nZUVuZDtcblxuICAvLyBJZiBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciBpcyB0cnVlLCB0aGVuIHdlIG5lZWQgdG8gb2Zmc2V0IHRoZSB2YWx1ZXMgdG8gYmUgcmVsYXRpdmUgdG8gdGhhdCBzdGFydC5cbiAgaWYgKGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyICYmIGZpbHRlcj8uc3RhcnQpIHtcbiAgICBzdGFydCA9IGZpbHRlci5zdGFydDtcblxuICAgIGlmIChmaWx0ZXI/LmVuZCkge1xuICAgICAgZW5kID0gY29weUhvdXJzQW5kTWludXRlc0Zyb21EYXRlKGVuZCwgZmlsdGVyLmVuZCk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyU3RhcnRJbmRleE9mZnNldCA9IGluZGV4RmFjdG9yeShyYW5nZVN0YXJ0KSAtIGluZGV4RmFjdG9yeShzdGFydCk7XG4gICAgZmlsdGVyT2Zmc2V0RXhjbHVkZWRSYW5nZSA9IHJhbmdlKDAsIGZpbHRlclN0YXJ0SW5kZXhPZmZzZXQpO1xuICAgIGluZGV4T2Zmc2V0ID0gaW5kZXhPZmZzZXQgLSBmaWx0ZXJTdGFydEluZGV4T2Zmc2V0O1xuICB9XG5cbiAgY29uc3QgZXhjbHVkZWQgPSBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlclxuICAgID8gYWxsRXhjbHVkZWQuZmlsdGVyKCh4KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzRXhjbHVkZWRJbmRleCA9IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhpbmRleERheU9mV2Vlayh4KSk7IC8vID8/P1xuICAgICAgICByZXR1cm4gaXNFeGNsdWRlZEluZGV4O1xuICAgICAgfSlcbiAgICA6IGFsbEV4Y2x1ZGVkO1xuXG4gIGNvbnN0IG9mZnNldEV4Y2x1ZGVkOiBEYXRlQmxvY2tJbmRleFtdID0gZXhjbHVkZWQubWFwKCh4KSA9PiB4IC0gaW5kZXhPZmZzZXQpOyAvLyBzZXQgdG8gdGhlIHByb3BlciBvZmZzZXRcblxuICBjb25zdCBleCA9IFsuLi5maWx0ZXJPZmZzZXRFeGNsdWRlZFJhbmdlLCAuLi5vZmZzZXRFeGNsdWRlZF07XG5cbiAgY29uc3QgdzogRGF0ZVNjaGVkdWxlRW5jb2RlZFdlZWsgPSBkYXRlU2NoZWR1bGVFbmNvZGVkV2VlayhzY2hlZHVsZURheXMpO1xuICBjb25zdCBkOiBEYXRlQmxvY2tJbmRleFtdID0gW107IC8vIFwiaW5jbHVkZWRcIiBibG9ja3MgYXJlIG5ldmVyIHVzZWQvY2FsY3VsYXRlZC5cblxuICAvLyBBbHdheXMgZW5zdXJlIHRoZSBlbmQgaXMgYWZ0ZXIgb3IgZXF1YWwgdG8gdGhlIHN0YXJ0LlxuICBpZiAoaXNCZWZvcmUoZW5kLCBzdGFydCkpIHtcbiAgICBlbmQgPSBzdGFydDsgLy8gZW5kIGlzIHN0YXJ0XG4gIH1cblxuICBjb25zdCBkYXRlU2NoZWR1bGVSYW5nZTogRGF0ZVNjaGVkdWxlUmFuZ2UgPSB7XG4gICAgc3RhcnQsXG4gICAgZW5kLFxuICAgIHcsXG4gICAgZCxcbiAgICBleFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZGF0ZVNjaGVkdWxlUmFuZ2UsXG4gICAgbWluTWF4UmFuZ2U6IHsgc3RhcnQsIGVuZCB9XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uIGV4dGVuZHMgRGF0ZVJhbmdlIHtcbiAgZGF0ZUJsb2NrUmFuZ2U6IERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlO1xuICBleGNsdWRlZDogRGF0ZUJsb2NrSW5kZXhbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24+IHtcbiAgY29uc3QgeyBpc0VuYWJsZWREYXksIGlzRW5hYmxlZEZpbHRlckRheSB9ID0gc3RhdGU7XG4gIGNvbnN0IGRhdGVGYWN0b3J5ID0gZGF0ZUJsb2NrVGltaW5nRGF0ZUZhY3Rvcnkoc3RhdGUpO1xuICBjb25zdCBkYXRlQmxvY2tSYW5nZSA9IGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUJsb2NrUmFuZ2Uoc3RhdGUpO1xuXG4gIGlmIChkYXRlQmxvY2tSYW5nZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7IC8vIHJldHVybnMgbnVsbCBpZiBubyBpdGVtcyBhcmUgc2VsZWN0ZWQuXG4gIH1cblxuICBjb25zdCBzdGFydCA9IGRhdGVGYWN0b3J5KGRhdGVCbG9ja1JhbmdlLmkpO1xuICBjb25zdCBlbmQgPSBkYXRlRmFjdG9yeShkYXRlQmxvY2tSYW5nZS50byk7XG5cbiAgY29uc3QgZXhjbHVkZWQ6IERhdGVCbG9ja0luZGV4W10gPSByYW5nZShkYXRlQmxvY2tSYW5nZS5pLCBkYXRlQmxvY2tSYW5nZS50byArIDEpLmZpbHRlcigoeCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjbHVkZWRJbmRleCA9ICFpc0VuYWJsZWREYXkoeCkgfHwgIWlzRW5hYmxlZEZpbHRlckRheSh4KTtcbiAgICByZXR1cm4gaXNFeGNsdWRlZEluZGV4O1xuICB9KTtcblxuICBjb25zdCByZXN1bHQ6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbiA9IHtcbiAgICBkYXRlQmxvY2tSYW5nZSxcbiAgICBzdGFydCxcbiAgICBlbmQsXG4gICAgZXhjbHVkZWRcbiAgfTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8RGF0ZVJhbmdlPiB7XG4gIGNvbnN0IGRhdGVGYWN0b3J5ID0gZGF0ZUJsb2NrVGltaW5nRGF0ZUZhY3Rvcnkoc3RhdGUpO1xuICBjb25zdCBkYXRlQmxvY2tSYW5nZSA9IGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUJsb2NrUmFuZ2Uoc3RhdGUpO1xuICBjb25zdCBkYXRlUmFuZ2U6IE1heWJlPERhdGVSYW5nZT4gPSBkYXRlQmxvY2tSYW5nZSAhPSBudWxsID8geyBzdGFydDogZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UuaSksIGVuZDogZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UudG8gYXMgbnVtYmVyKSB9IDogdW5kZWZpbmVkO1xuICByZXR1cm4gZGF0ZVJhbmdlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXRlQmxvY2tSYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8RGF0ZUJsb2NrUmFuZ2VXaXRoUmFuZ2U+IHtcbiAgY29uc3QgeyBpbmRleEZhY3RvcnksIGlucHV0U3RhcnQsIGlucHV0RW5kLCBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhEYXlPZldlZWssIGlzRW5hYmxlZERheSwgaXNFbmFibGVkRmlsdGVyRGF5IH0gPSBzdGF0ZTtcbiAgY29uc3QgZW5hYmxlZEV4Y2x1c2lvbkluZGV4ZXMgPSBBcnJheS5mcm9tKHN0YXRlLnRvZ2dsZWRJbmRleGVzKS5maWx0ZXIoKGkpID0+IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhpbmRleERheU9mV2VlayhpKSkpO1xuICBjb25zdCBtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcyA9IG1pbkFuZE1heE51bWJlcihlbmFibGVkRXhjbHVzaW9uSW5kZXhlcyk7XG5cbiAgbGV0IHN0YXJ0UmFuZ2U6IE1heWJlPERhdGVCbG9ja0luZGV4PjtcbiAgbGV0IGVuZFJhbmdlOiBNYXliZTxEYXRlQmxvY2tJbmRleD47XG5cbiAgaWYgKG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzKSB7XG4gICAgc3RhcnRSYW5nZSA9IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzLm1pbjtcbiAgICBlbmRSYW5nZSA9IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzLm1heDtcbiAgfVxuXG4gIGlmIChpbnB1dFN0YXJ0ICE9IG51bGwgJiYgaW5wdXRFbmQgIT0gbnVsbCkge1xuICAgIGNvbnN0IGlucHV0U3RhcnRJbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KTtcbiAgICBjb25zdCBpbnB1dEVuZEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0RW5kKTtcblxuICAgIHN0YXJ0UmFuZ2UgPSBzdGFydFJhbmdlICE9IG51bGwgPyBNYXRoLm1pbihpbnB1dFN0YXJ0SW5kZXgsIHN0YXJ0UmFuZ2UpIDogaW5wdXRTdGFydEluZGV4O1xuICAgIGVuZFJhbmdlID0gZW5kUmFuZ2UgIT0gbnVsbCA/IE1hdGgubWF4KGlucHV0RW5kSW5kZXgsIGVuZFJhbmdlKSA6IGlucHV0RW5kSW5kZXg7XG4gIH1cblxuICBpZiAoc3RhcnRSYW5nZSAhPSBudWxsICYmIGVuZFJhbmdlICE9IG51bGwpIHtcbiAgICBjb25zdCBzY2FuU3RhcnRJbmRleCA9IHN0YXJ0UmFuZ2U7XG4gICAgY29uc3Qgc2NhbkVuZEluZGV4ID0gZW5kUmFuZ2U7XG5cbiAgICAvLyBjbGVhciBzdGFydCBhbmQgZW5kXG4gICAgc3RhcnRSYW5nZSA9IHVuZGVmaW5lZDtcbiAgICBlbmRSYW5nZSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIGlmIHRoZSBtaW4gaXMgZXF1YWwgdG8gdGhlIHN0YXJ0IGluZGV4LCB0aGVuIHdlIGFyZSBpbiB0aGUgcmFuZ2UgYW5kIG5lZWQgdG8gaXRlcmF0ZSBkYXRlcyB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGlzIG5vdCBzZWxlY3RlZC9leGNsdWRlZC5cbiAgICBmb3IgKGxldCBpID0gc2NhblN0YXJ0SW5kZXg7IGkgPD0gc2NhbkVuZEluZGV4OyBpICs9IDEpIHtcbiAgICAgIGlmIChpc0VuYWJsZWRGaWx0ZXJEYXkoaSkgJiYgaXNFbmFibGVkRGF5KGkpKSB7XG4gICAgICAgIHN0YXJ0UmFuZ2UgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzYW1lIHdpdGggdGhlIG1heFxuICAgIGZvciAobGV0IGkgPSBzY2FuRW5kSW5kZXg7IGkgPj0gc2NhblN0YXJ0SW5kZXg7IGkgLT0gMSkge1xuICAgICAgaWYgKGlzRW5hYmxlZEZpbHRlckRheShpKSAmJiBpc0VuYWJsZWREYXkoaSkpIHtcbiAgICAgICAgZW5kUmFuZ2UgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnRSYW5nZSAhPSBudWxsICYmIGVuZFJhbmdlICE9IG51bGwpIHtcbiAgICByZXR1cm4geyBpOiBzdGFydFJhbmdlLCB0bzogZW5kUmFuZ2UgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|