@dereekb/dbx-form 9.23.9 → 9.23.11

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.
@@ -1,9 +1,9 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { dateBlockDayOfWeekFactory, dateBlockTimingDateFactory, dateScheduleDateFilter, DateScheduleDayCode, dateScheduleDayCodes, dateScheduleEncodedWeek, dateTimingRelativeIndexFactory, expandDateScheduleDayCodesToDayOfWeekSet, findMaxDate, findMinDate, isDateInDateRangeFunction, isDateWithinDateBlockRangeFunction, isSameDate, isSameDateDay, isSameDateRange, isSameDateScheduleRange } from '@dereekb/date';
2
+ import { dateBlockDayOfWeekFactory, dateBlockTimingDateFactory, dateScheduleDateFilter, copyDateScheduleDateFilterConfig, DateScheduleDayCode, dateScheduleEncodedWeek, dateTimingRelativeIndexFactory, expandDateScheduleDayCodes, expandDateScheduleDayCodesToDayOfWeekSet, findMaxDate, findMinDate, isDateInDateRangeFunction, isDateWithinDateBlockRangeFunction, isSameDate, isSameDateDay, isSameDateRange, isSameDateScheduleRange, dateTimingRelativeIndexArrayFactory } from '@dereekb/date';
3
3
  import { filterMaybe } from '@dereekb/rxjs';
4
- import { iterableToArray, addToSet, toggleInSet, isIndexNumberInIndexRangeFunction, minAndMaxNumber, setsAreEquivalent, range } from '@dereekb/util';
4
+ import { iterableToArray, addToSet, toggleInSet, isIndexNumberInIndexRangeFunction, minAndMaxNumber, setsAreEquivalent, range, unique, mergeArrays } from '@dereekb/util';
5
5
  import { ComponentStore } from '@ngrx/component-store';
6
- import { addYears, startOfDay, startOfYear } from 'date-fns';
6
+ import { startOfDay } from 'date-fns';
7
7
  import { distinctUntilChanged, map, shareReplay } from 'rxjs';
8
8
  import { defaultCalendarScheduleSelectionCellContentFactory } from './calendar.schedule.selection';
9
9
  import * as i0 from "@angular/core";
@@ -22,11 +22,24 @@ export function initialCalendarScheduleSelectionState() {
22
22
  indexDayOfWeek,
23
23
  isEnabledFilterDay: () => true,
24
24
  isEnabledDay: () => false,
25
- minDate: new Date(0),
26
- maxDate: startOfYear(addYears(new Date(), 100)),
25
+ minDate: null,
26
+ maxDate: null,
27
+ computeSelectionResultRelativeToFilter: true,
27
28
  cellContentFactory: defaultCalendarScheduleSelectionCellContentFactory
28
29
  };
29
30
  }
31
+ export function calendarScheduleMinDate(x) {
32
+ return findMaxDate([x.filter?.start, x.minDate]);
33
+ }
34
+ export function calendarScheduleMaxDate(x) {
35
+ return findMinDate([x.filter?.end, x.maxDate]);
36
+ }
37
+ export function calendarScheduleMinAndMaxDate(x) {
38
+ return {
39
+ minDate: calendarScheduleMinDate(x),
40
+ maxDate: calendarScheduleMaxDate(x)
41
+ };
42
+ }
30
43
  export class DbxCalendarScheduleSelectionStore extends ComponentStore {
31
44
  constructor() {
32
45
  super(initialCalendarScheduleSelectionState());
@@ -47,18 +60,22 @@ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
47
60
  this.isEnabledFilterDayFunction$ = this.state$.pipe(map((x) => x.isEnabledFilterDay), shareReplay(1));
48
61
  this.isEnabledDayFunction$ = this.state$.pipe(map((x) => x.isEnabledDay), shareReplay(1));
49
62
  this.currentDateRange$ = this.state$.pipe(map(computeCalendarScheduleSelectionRange), distinctUntilChanged((a, b) => isSameDateRange(a, b)), shareReplay(1));
63
+ this.computeSelectionResultRelativeToFilter$ = this.state$.pipe(map((x) => x.computeSelectionResultRelativeToFilter), shareReplay(1));
64
+ this.startBeingUsedFromFilter$ = this.state$.pipe(map((x) => x.computeSelectionResultRelativeToFilter && x.filter?.start != null), shareReplay(1));
50
65
  this.dateRange$ = this.currentDateRange$.pipe(filterMaybe(), shareReplay(1));
51
66
  this.scheduleDays$ = this.state$.pipe(map((x) => x.scheduleDays), distinctUntilChanged(setsAreEquivalent), shareReplay(1));
52
67
  this.currentSelectionValue$ = this.state$.pipe(map((x) => x.currentSelectionValue), shareReplay(1));
53
68
  this.selectionValue$ = this.currentSelectionValue$.pipe(filterMaybe(), shareReplay(1));
54
69
  this.currentDateScheduleRangeValue$ = this.currentSelectionValue$.pipe(map((x) => x?.dateScheduleRange), distinctUntilChanged(isSameDateScheduleRange), shareReplay(1));
55
70
  this.dateScheduleRangeValue$ = this.currentDateScheduleRangeValue$.pipe(filterMaybe(), shareReplay(1));
56
- this.minDate$ = this.state$.pipe(map((x) => findMaxDate([x.filter?.start, x.minDate])), distinctUntilChanged(isSameDateDay), shareReplay(1));
57
- this.maxDate$ = this.state$.pipe(map((x) => findMinDate([x.filter?.end, x.maxDate])), distinctUntilChanged(isSameDateDay), shareReplay(1));
71
+ this.minDate$ = this.state$.pipe(map(calendarScheduleMinDate), distinctUntilChanged(isSameDateDay), shareReplay(1));
72
+ this.maxDate$ = this.state$.pipe(map(calendarScheduleMaxDate), distinctUntilChanged(isSameDateDay), shareReplay(1));
58
73
  this.cellContentFactory$ = this.state$.pipe(map((x) => x.cellContentFactory), distinctUntilChanged(), shareReplay(1));
59
74
  this.isCustomized$ = this.state$.pipe(map((x) => x.selectedIndexes.size > 0), distinctUntilChanged(), shareReplay(1));
60
75
  // MARK: State Changes
61
76
  this.setFilter = this.updater((state, filter) => updateStateWithFilter(state, filter));
77
+ this.setExclusions = this.updater((state, exclusions) => updateStateWithExclusions(state, exclusions));
78
+ this.setComputeSelectionResultRelativeToFilter = this.updater((state, computeSelectionResultRelativeToFilter) => updateStateWithComputeSelectionResultRelativeToFilter(state, computeSelectionResultRelativeToFilter));
62
79
  this.clearFilter = this.updater((state) => updateStateWithFilter(state, undefined));
63
80
  this.setTimezone = this.updater((state, timezone) => ({ ...state, timezone }));
64
81
  this.setInputRange = this.updater((state, range) => updateStateWithChangedRange(state, range));
@@ -66,6 +83,8 @@ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
66
83
  this.addSelectedDates = this.updater((state, add) => updateStateWithChangedDates(state, { add }));
67
84
  this.removeSelectedDates = this.updater((state, remove) => updateStateWithChangedDates(state, { remove }));
68
85
  this.setSelectedDates = this.updater((state, set) => updateStateWithChangedDates(state, { set }));
86
+ this.selectAllDates = this.updater((state, selectAll = 'all') => updateStateWithChangedDates(state, { selectAll }));
87
+ this.setInitialSelectionState = this.updater((state, initialSelectionState) => updateStateWithInitialSelectionState(state, initialSelectionState));
69
88
  this.setScheduleDays = this.updater((state, scheduleDays) => updateStateWithChangedScheduleDays(state, scheduleDays));
70
89
  this.setAllowAllScheduleDays = this.updater((state) => updateStateWithChangedScheduleDays(state, null));
71
90
  this.setDateScheduleRangeValue = this.updater((state, value) => updateStateWithDateScheduleRangeValue(state, value));
@@ -77,12 +96,67 @@ DbxCalendarScheduleSelectionStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersi
77
96
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxCalendarScheduleSelectionStore, decorators: [{
78
97
  type: Injectable
79
98
  }], ctorParameters: function () { return []; } });
80
- export function updateStateWithFilter(state, filter) {
99
+ export function updateStateWithInitialSelectionState(state, initialSelectionState) {
100
+ const { selectedIndexes } = state;
101
+ if (selectedIndexes.size === 0 && initialSelectionState === 'all') {
102
+ state = updateStateWithChangedDates(state, { selectAll: initialSelectionState });
103
+ }
104
+ return { ...state, initialSelectionState };
105
+ }
106
+ export function updateStateWithComputeSelectionResultRelativeToFilter(currentState, computeSelectionResultRelativeToFilter) {
107
+ let state = { ...currentState, computeSelectionResultRelativeToFilter };
108
+ if (Boolean(currentState.computeSelectionResultRelativeToFilter) !== Boolean(computeSelectionResultRelativeToFilter)) {
109
+ state = updateStateWithChangedDates(state, {}); // recalculate if change occurs as it will affect the output value
110
+ }
111
+ return state;
112
+ }
113
+ export function updateStateWithExclusions(state, inputExclusions) {
114
+ let computedExclusions;
115
+ if (inputExclusions) {
116
+ const { indexFactory } = state;
117
+ const indexArrayFactory = dateTimingRelativeIndexArrayFactory(indexFactory);
118
+ computedExclusions = indexArrayFactory(inputExclusions);
119
+ }
120
+ state = { ...state, inputExclusions, computedExclusions };
121
+ return updateStateWithFilter(state, state.filter);
122
+ }
123
+ export function updateStateWithFilter(state, inputFilter) {
124
+ const { computedExclusions: exclusions } = state;
81
125
  let isEnabledFilterDay = () => true;
82
- if (filter) {
83
- isEnabledFilterDay = dateScheduleDateFilter(filter);
126
+ let filter = null;
127
+ if (inputFilter || exclusions?.length) {
128
+ let enabledFilter;
129
+ if (inputFilter) {
130
+ filter = copyDateScheduleDateFilterConfig(inputFilter); // copy filter
131
+ if (exclusions?.length) {
132
+ enabledFilter = {
133
+ ...filter,
134
+ ex: unique(mergeArrays([filter.ex, exclusions]))
135
+ };
136
+ }
137
+ else {
138
+ enabledFilter = filter;
139
+ }
140
+ }
141
+ else {
142
+ enabledFilter = {
143
+ w: '89',
144
+ ex: exclusions
145
+ };
146
+ }
147
+ isEnabledFilterDay = dateScheduleDateFilter(enabledFilter);
84
148
  }
85
- return { ...state, filter, isEnabledFilterDay };
149
+ state = { ...state, filter, isEnabledFilterDay };
150
+ // attempt to re-apply the initial selection state once filter is applied
151
+ if (state.initialSelectionState) {
152
+ state = updateStateWithInitialSelectionState(state, state.initialSelectionState);
153
+ }
154
+ // re-calculate the selection given the filter
155
+ const { inputStart, inputEnd } = state;
156
+ if (inputStart && inputEnd) {
157
+ state = updateStateWithChangedRange(state, { inputStart, inputEnd });
158
+ }
159
+ return state;
86
160
  }
87
161
  export function updateStateWithDateScheduleRangeValue(state, change) {
88
162
  const isSameValue = isSameDateScheduleRange(state.currentSelectionValue?.dateScheduleRange, change);
@@ -92,7 +166,7 @@ export function updateStateWithDateScheduleRangeValue(state, change) {
92
166
  else {
93
167
  if (change != null) {
94
168
  const nextState = { ...state, inputStart: change.start, inputEnd: change.end, selectedIndexes: new Set(change.ex) };
95
- return updateStateWithChangedScheduleDays(finalizeNewCalendarScheduleSelectionState(nextState), dateScheduleDayCodes(change.w));
169
+ return updateStateWithChangedScheduleDays(finalizeNewCalendarScheduleSelectionState(nextState), expandDateScheduleDayCodes(change.w));
96
170
  }
97
171
  else {
98
172
  return noSelectionCalendarScheduleSelectionState(state); // clear selection, retain disabled days
@@ -113,9 +187,24 @@ export function updateStateWithChangedScheduleDays(state, change) {
113
187
  }
114
188
  export function updateStateWithChangedDates(state, change) {
115
189
  const { indexFactory, allowedDaysOfWeek, indexDayOfWeek } = state;
190
+ const { minDate, maxDate } = calendarScheduleMinAndMaxDate(state);
116
191
  let selectedIndexes;
117
- if (change.set) {
118
- selectedIndexes = new Set(iterableToArray(change.set).map(indexFactory));
192
+ if (change.reset || change.selectAll != null || change.set) {
193
+ let set = change.set ?? [];
194
+ let selectAll = change.reset === true ? state.initialSelectionState : change.selectAll;
195
+ switch (selectAll) {
196
+ case 'all':
197
+ if (minDate != null && maxDate != null) {
198
+ const minIndex = indexFactory(minDate);
199
+ const maxIndex = indexFactory(maxDate);
200
+ set = range(minIndex, maxIndex);
201
+ }
202
+ break;
203
+ case 'none':
204
+ set = [];
205
+ break;
206
+ }
207
+ selectedIndexes = new Set(iterableToArray(set).map(indexFactory));
119
208
  }
120
209
  else {
121
210
  selectedIndexes = new Set(state.selectedIndexes);
@@ -141,22 +230,22 @@ export function updateStateWithChangedDates(state, change) {
141
230
  }
142
231
  else {
143
232
  // no selected days
144
- return noSelectionCalendarScheduleSelectionState(state);
233
+ return noSelectionCalendarScheduleSelectionState(nextState);
145
234
  }
146
235
  }
147
236
  export function noSelectionCalendarScheduleSelectionState(state) {
148
237
  return finalizeNewCalendarScheduleSelectionState({ ...state, selectedIndexes: new Set(), inputStart: null, inputEnd: null });
149
238
  }
150
239
  export function updateStateWithChangedRange(state, change) {
151
- const { inputStart: currentInputStart, inputEnd: currentInputEnd, indexFactory, minDate, maxDate } = state;
152
- const inputStart = startOfDay(change.inputStart);
153
- const inputEnd = startOfDay(change.inputEnd);
240
+ const { inputStart: currentInputStart, inputEnd: currentInputEnd, indexFactory, minDate, maxDate, filter, computeSelectionResultRelativeToFilter } = state;
241
+ let inputStart = startOfDay(change.inputStart);
242
+ let inputEnd = startOfDay(change.inputEnd);
154
243
  const isValidRange = minDate != null || maxDate != null ? isDateInDateRangeFunction({ start: minDate ?? undefined, end: maxDate ?? undefined }) : () => true;
155
244
  if (!isValidRange(inputStart) || !isValidRange(inputEnd) || (isSameDateDay(inputStart, currentInputStart) && isSameDateDay(inputEnd, currentInputEnd))) {
156
245
  return state; // if no change, return the current state.
157
246
  }
158
247
  // retain all indexes that are within the new range
159
- const minIndex = indexFactory(inputStart);
248
+ const minIndex = computeSelectionResultRelativeToFilter && filter?.start ? indexFactory(filter?.start) : indexFactory(inputStart);
160
249
  const maxIndex = indexFactory(inputEnd) + 1;
161
250
  const currentIndexes = Array.from(state.selectedIndexes);
162
251
  const isInCurrentRange = isIndexNumberInIndexRangeFunction({ minIndex, maxIndex });
@@ -189,19 +278,30 @@ export function isEnabledDayInCalendarScheduleSelectionState(state) {
189
278
  };
190
279
  }
191
280
  export function computeScheduleSelectionValue(state) {
192
- const { scheduleDays, allowedDaysOfWeek, indexDayOfWeek } = state;
281
+ const { indexFactory, scheduleDays, allowedDaysOfWeek, indexDayOfWeek, computeSelectionResultRelativeToFilter, filter } = state;
193
282
  const rangeAndExclusion = computeScheduleSelectionRangeAndExclusion(state);
194
283
  if (rangeAndExclusion == null) {
195
284
  return null;
196
285
  }
197
- const { start, end, excluded, dateBlockRange } = rangeAndExclusion;
198
- const indexOffset = dateBlockRange.i;
199
- const ex = excluded
200
- .filter((x) => {
201
- const isExcludedIndex = allowedDaysOfWeek.has(indexDayOfWeek(x));
202
- return isExcludedIndex;
203
- })
204
- .map((x) => x - indexOffset); // set to the proper offset
286
+ const { start: rangeStart, end, excluded: allExcluded, dateBlockRange } = rangeAndExclusion;
287
+ let filterOffsetExcludedRange = [];
288
+ let indexOffset = dateBlockRange.i;
289
+ let start = rangeStart;
290
+ // If computeSelectionResultRelativeToFilter is true, then we need to offset the values to be relative to that start.
291
+ if (computeSelectionResultRelativeToFilter && filter?.start) {
292
+ start = filter.start;
293
+ const filterStartIndexOffset = indexFactory(rangeStart) - indexFactory(start);
294
+ filterOffsetExcludedRange = range(0, filterStartIndexOffset);
295
+ indexOffset = indexOffset - filterStartIndexOffset;
296
+ }
297
+ const excluded = computeSelectionResultRelativeToFilter
298
+ ? allExcluded.filter((x) => {
299
+ const isExcludedIndex = allowedDaysOfWeek.has(indexDayOfWeek(x)); // ???
300
+ return isExcludedIndex;
301
+ })
302
+ : allExcluded;
303
+ const offsetExcluded = excluded.map((x) => x - indexOffset); // set to the proper offset
304
+ const ex = [...filterOffsetExcludedRange, ...offsetExcluded];
205
305
  const w = dateScheduleEncodedWeek(scheduleDays);
206
306
  const d = []; // "included" blocks are never used/calculated.
207
307
  const dateScheduleRange = {
@@ -217,7 +317,7 @@ export function computeScheduleSelectionValue(state) {
217
317
  };
218
318
  }
219
319
  export function computeScheduleSelectionRangeAndExclusion(state) {
220
- const { isEnabledDay } = state;
320
+ const { isEnabledDay, isEnabledFilterDay } = state;
221
321
  const dateFactory = dateBlockTimingDateFactory(state);
222
322
  const dateBlockRange = computeCalendarScheduleSelectionDateBlockRange(state);
223
323
  if (dateBlockRange == null) {
@@ -226,7 +326,7 @@ export function computeScheduleSelectionRangeAndExclusion(state) {
226
326
  const start = dateFactory(dateBlockRange.i);
227
327
  const end = dateFactory(dateBlockRange.to);
228
328
  const excluded = range(dateBlockRange.i, dateBlockRange.to + 1).filter((x) => {
229
- const isExcludedIndex = !isEnabledDay(x);
329
+ const isExcludedIndex = !isEnabledDay(x) || !isEnabledFilterDay(x);
230
330
  return isExcludedIndex;
231
331
  });
232
332
  const result = {
@@ -240,12 +340,8 @@ export function computeScheduleSelectionRangeAndExclusion(state) {
240
340
  export function computeCalendarScheduleSelectionRange(state) {
241
341
  const dateFactory = dateBlockTimingDateFactory(state);
242
342
  const dateBlockRange = computeCalendarScheduleSelectionDateBlockRange(state);
243
- if (dateBlockRange != null) {
244
- return { start: dateFactory(dateBlockRange.i), end: dateFactory(dateBlockRange.to) };
245
- }
246
- else {
247
- return undefined;
248
- }
343
+ const dateRange = dateBlockRange != null ? { start: dateFactory(dateBlockRange.i), end: dateFactory(dateBlockRange.to) } : undefined;
344
+ return dateRange;
249
345
  }
250
346
  export function computeCalendarScheduleSelectionDateBlockRange(state) {
251
347
  const { indexFactory, inputStart, inputEnd, allowedDaysOfWeek, indexDayOfWeek, isEnabledDay, isEnabledFilterDay } = state;
@@ -291,4 +387,4 @@ export function computeCalendarScheduleSelectionDateBlockRange(state) {
291
387
  return undefined;
292
388
  }
293
389
  }
294
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwseUJBQXlCLEVBR3pCLDBCQUEwQixFQUcxQixzQkFBc0IsRUFFdEIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQix1QkFBdUIsRUFJdkIsOEJBQThCLEVBQzlCLHdDQUF3QyxFQUN4QyxXQUFXLEVBQ1gsV0FBVyxFQUNYLHlCQUF5QixFQUV6QixrQ0FBa0MsRUFDbEMsVUFBVSxFQUNWLGFBQWEsRUFDYixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUE0RCxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBWSxlQUFlLEVBQUUsaUJBQWlCLEVBQWEsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BPLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDN0QsT0FBTyxFQUFjLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUErRSxrREFBa0QsRUFBRSxNQUFNLCtCQUErQixDQUFDOztBQWtGaEwsTUFBTSxVQUFVLHFDQUFxQztJQUNuRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FB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RjtJQUVELElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1FBQzFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztLQUN4QztTQUFNO1FBQ0wsT0FBTyxTQUFTLENBQUM7S0FDbEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeSxcbiAgZGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeSxcbiAgRGF0ZUJsb2NrSW5kZXgsXG4gIERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlLFxuICBkYXRlQmxvY2tUaW1pbmdEYXRlRmFjdG9yeSxcbiAgRGF0ZU9yRGF0ZUJsb2NrSW5kZXgsXG4gIERhdGVSYW5nZSxcbiAgZGF0ZVNjaGVkdWxlRGF0ZUZpbHRlcixcbiAgRGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZyxcbiAgRGF0ZVNjaGVkdWxlRGF5Q29kZSxcbiAgZGF0ZVNjaGVkdWxlRGF5Q29kZXMsXG4gIGRhdGVTY2hlZHVsZUVuY29kZWRXZWVrLFxuICBEYXRlU2NoZWR1bGVFbmNvZGVkV2VlayxcbiAgRGF0ZVNjaGVkdWxlUmFuZ2UsXG4gIERhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeSxcbiAgZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5LFxuICBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0LFxuICBmaW5kTWF4RGF0ZSxcbiAgZmluZE1pbkRhdGUsXG4gIGlzRGF0ZUluRGF0ZVJhbmdlRnVuY3Rpb24sXG4gIElzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb24sXG4gIGlzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb24sXG4gIGlzU2FtZURhdGUsXG4gIGlzU2FtZURhdGVEYXksXG4gIGlzU2FtZURhdGVSYW5nZSxcbiAgaXNTYW1lRGF0ZVNjaGVkdWxlUmFuZ2Vcbn0gZnJvbSAnQGRlcmVla2IvZGF0ZSc7XG5pbXBvcnQgeyBmaWx0ZXJNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgTWF5YmUsIFRpbWV6b25lU3RyaW5nLCBEZWNpc2lvbkZ1bmN0aW9uLCBJdGVyYWJsZU9yVmFsdWUsIGl0ZXJhYmxlVG9BcnJheSwgYWRkVG9TZXQsIHRvZ2dsZUluU2V0LCBpc0luZGV4TnVtYmVySW5JbmRleFJhbmdlRnVuY3Rpb24sIE1heWJlTWFwLCBtaW5BbmRNYXhOdW1iZXIsIHNldHNBcmVFcXVpdmFsZW50LCBEYXlPZldlZWssIHJhbmdlIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBDb21wb25lbnRTdG9yZSB9IGZyb20gJ0BuZ3J4L2NvbXBvbmVudC1zdG9yZSc7XG5pbXBvcnQgeyBhZGRZZWFycywgc3RhcnRPZkRheSwgc3RhcnRPZlllYXIgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSwgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlLCBkZWZhdWx0Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSB9IGZyb20gJy4vY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2Uge1xuICAvKipcbiAgICogSW5wdXQgU3RhcnQgRGF0ZVxuICAgKi9cbiAgaW5wdXRTdGFydDogRGF0ZTtcbiAgLyoqXG4gICAqIElucHV0IEVuZCBEYXRlXG4gICAqL1xuICBpbnB1dEVuZDogRGF0ZTtcbn1cblxuZXhwb3J0IHR5cGUgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSA9IFBhcnRpYWw8TWF5YmVNYXA8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIGV4dGVuZHMgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSB7XG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRoZSBkYXlzIG9mIHRoZSBzY2hlZHVsZSB0byBvbmx5IGFsbG93IHNlbGVjdGluZyBkYXlzIGluIHRoZSBzY2hlZHVsZS5cbiAgICovXG4gIGZpbHRlcj86IE1heWJlPERhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc+O1xuICAvKipcbiAgICogTWluaW11bSBkYXRlIGFsbG93ZWQgaWYgbm8gZmlsdGVyIGlzIHNldC4gSWYgYSBmaWx0ZXIgaXMgc2V0LCB0aGUgZ3JlYXRlciBvZiB0aGUgdHdvIGRhdGVzIGlzIHVzZWQgYXMgdGhlIG1pbmltdW0uXG4gICAqL1xuICBtaW5EYXRlPzogTWF5YmU8RGF0ZT47XG4gIC8qKlxuICAgKiBNYXhpbXVtIGRhdGUgYWxsb3dlZCBpZiBubyBmaXRsZXIgaXMgc2V0LiBJZiBhIGZpbHRlciBpcyBzZXQsIHRoZSBsZXNzZXIgb2YgdGhlIHR3byBkYXRlcyBpcyB1c2VkIGFzIHRoZSBtYXhpbXVtLlxuICAgKi9cbiAgbWF4RGF0ZT86IE1heWJlPERhdGU+O1xuICAvKipcbiAgICogU3RhcnQgZGF0ZS4gSXMgdXBkYXRlZCBhcyB0aGUgaW5wdXRTdGFydCBpcyBtb2RpZmllZCBvciBmaWx0ZXIgaXMgcHJvdmlkZWQgdGhhdCBwcm92aWRlcyB0aGUgc3RhcnQgZGF0ZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdG9kYXkgYW5kIHRoZSBjdXJyZW50IHRpbWV6b25lLlxuICAgKi9cbiAgc3RhcnQ6IERhdGU7XG4gIC8qKlxuICAgKiBEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlcbiAgICovXG4gIGluZGV4RmFjdG9yeTogRGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5O1xuICAvKipcbiAgICogQXJyYXkgb2YgbWFudWFsbHkgc2VsZWN0ZWQgZGF0ZXMuXG4gICAqXG4gICAqIFZhbHVlcyB0aGF0IGV4aXN0IG91dHNpZGUgb2YgdGhlIFwiaW5wdXRcIiByYW5nZSBhcmUgY29uc2lkZXJlZCB0b2dnbGVkIG9uLCB3aGlsZSB0aG9zZVxuICAgKiB0aGF0IGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIHJhbmdlIGFyZSBjb25zaWRlcmVkIHRvZ2dsZWQgb2ZmLlxuICAgKlxuICAgKiBJZiBkYXRlcyBhcmUgc2VsZWN0ZWQsIGFuZCB0aGVuIGEgcmFuZ2UgaXMgc2VsZWN0ZWQsIHRoZW4gdGhvc2UgZGF0ZXMgd2l0aGluIHRoZSByYW5nZSB0aGF0IGZhbGxcbiAgICogd2l0aGluIHRoZSByYW5nZSBhcmUgY2xlYXJlZCBmcm9tIHNlbGVjdGlvbi5cbiAgICpcbiAgICogVGhlc2UgaW5kZXhlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGRhdGUuXG4gICAqL1xuICBzZWxlY3RlZEluZGV4ZXM6IFNldDxEYXRlQmxvY2tJbmRleD47XG4gIC8qKlxuICAgKiBEYXlzIG9mIHRoZSBzY2hlZHVsZSB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHBpY2tlZC5cbiAgICovXG4gIHNjaGVkdWxlRGF5czogU2V0PERhdGVTY2hlZHVsZURheUNvZGU+O1xuICAvKipcbiAgICogU2V0IG9mIHRoZSBkYXlzIG9mIHdlZWsgdGhhdCBhcmUgYWxsb3dlZC5cbiAgICovXG4gIGFsbG93ZWREYXlzT2ZXZWVrOiBTZXQ8RGF5T2ZXZWVrPjtcbiAgLyoqXG4gICAqXG4gICAqL1xuICBpbmRleERheU9mV2VlazogRGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeTtcbiAgLyoqXG4gICAqIERlY2lzaW9uIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgaXMgZW5hYmxlZCBnaXZlbiB0aGUgY3VycmVudCBmaWx0ZXIuXG4gICAqL1xuICBpc0VuYWJsZWRGaWx0ZXJEYXk6IERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICAvKipcbiAgICogRGVjaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgdGhlIGN1cnJlbnQgZmlsdGVyIGludG8gYWNjb3VudC5cbiAgICovXG4gIGlzRW5hYmxlZERheTogRGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD47XG4gIC8qKlxuICAgKiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5IGZvciB0aGUgdmlldy5cbiAgICovXG4gIGNlbGxDb250ZW50RmFjdG9yeTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeTtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc2VsZWN0aW9uIHZhbHVlLlxuICAgKi9cbiAgY3VycmVudFNlbGVjdGlvblZhbHVlPzogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3Qgc3RhcnQgPSBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xuICBjb25zdCBzY2hlZHVsZURheXMgPSBuZXcgU2V0KFtEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtEQVksIERhdGVTY2hlZHVsZURheUNvZGUuV0VFS0VORF0pO1xuICBjb25zdCBhbGxvd2VkRGF5c09mV2VlayA9IGV4cGFuZERhdGVTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQoQXJyYXkuZnJvbShzY2hlZHVsZURheXMpKTtcbiAgY29uc3QgaW5kZXhGYWN0b3J5ID0gZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5KHsgc3RhcnQgfSk7XG4gIGNvbnN0IGluZGV4RGF5T2ZXZWVrID0gZGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeShzdGFydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydCxcbiAgICBpbmRleEZhY3RvcnksXG4gICAgc2VsZWN0ZWRJbmRleGVzOiBuZXcgU2V0KCksXG4gICAgc2NoZWR1bGVEYXlzLFxuICAgIGFsbG93ZWREYXlzT2ZXZWVrLFxuICAgIGluZGV4RGF5T2ZXZWVrLFxuICAgIGlzRW5hYmxlZEZpbHRlckRheTogKCkgPT4gdHJ1ZSxcbiAgICBpc0VuYWJsZWREYXk6ICgpID0+IGZhbHNlLFxuICAgIG1pbkRhdGU6IG5ldyBEYXRlKDApLFxuICAgIG1heERhdGU6IHN0YXJ0T2ZZZWFyKGFkZFllYXJzKG5ldyBEYXRlKCksIDEwMCkpLFxuICAgIGNlbGxDb250ZW50RmFjdG9yeTogZGVmYXVsdENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnlcbiAgfTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZSBleHRlbmRzIENvbXBvbmVudFN0b3JlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihpbml0aWFsQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKCkpO1xuICB9XG5cbiAgLy8gTUFSSzogQWNjZXNzb3JzXG4gIHJlYWRvbmx5IGZpbHRlciQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5maWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dFN0YXJ0JCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlucHV0U3RhcnQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRFbmQkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaW5wdXRFbmQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudElucHV0UmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSkgPT4gKHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBpc1NhbWVEYXRlKGEuaW5wdXRTdGFydCwgYi5pbnB1dFN0YXJ0KSAmJiBpc1NhbWVEYXRlKGEuaW5wdXRFbmQsIGIuaW5wdXRFbmQpKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4LmlucHV0U3RhcnQgJiYgeC5pbnB1dEVuZCkge1xuICAgICAgICByZXR1cm4geCBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRSYW5nZSQ6IE9ic2VydmFibGU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPiA9IHRoaXMuY3VycmVudElucHV0UmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZXMkOiBPYnNlcnZhYmxlPFNldDxEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguc2VsZWN0ZWRJbmRleGVzKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkRmlsdGVyRGF5RnVuY3Rpb24kOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlzRW5hYmxlZEZpbHRlckRheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc0VuYWJsZWREYXlGdW5jdGlvbiQ6IE9ic2VydmFibGU8RGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaXNFbmFibGVkRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGlzU2FtZURhdGVSYW5nZShhLCBiKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPERhdGVSYW5nZT4gPSB0aGlzLmN1cnJlbnREYXRlUmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNjaGVkdWxlRGF5cyQ6IE9ic2VydmFibGU8U2V0PERhdGVTY2hlZHVsZURheUNvZGU+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnNjaGVkdWxlRGF5cyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoc2V0c0FyZUVxdWl2YWxlbnQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWUkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZGF0ZVNjaGVkdWxlUmFuZ2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVTY2hlZHVsZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICByZWFkb25seSBkYXRlU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudERhdGVTY2hlZHVsZVJhbmdlVmFsdWUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IG1pbkRhdGUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IGZpbmRNYXhEYXRlKFt4LmZpbHRlcj8uc3RhcnQsIHgubWluRGF0ZV0pKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG1heERhdGUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IGZpbmRNaW5EYXRlKFt4LmZpbHRlcj8uZW5kLCB4Lm1heERhdGVdKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZURheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjZWxsQ29udGVudEZhY3RvcnkkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY2VsbENvbnRlbnRGYWN0b3J5KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNDdXN0b21pemVkJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnNlbGVjdGVkSW5kZXhlcy5zaXplID4gMCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8vIE1BUks6IFN0YXRlIENoYW5nZXNcbiAgcmVhZG9ubHkgc2V0RmlsdGVyID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgZmlsdGVyOiBNYXliZTxEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPikgPT4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCBmaWx0ZXIpKTtcbiAgcmVhZG9ubHkgY2xlYXJGaWx0ZXIgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGUsIHVuZGVmaW5lZCkpO1xuXG4gIHJlYWRvbmx5IHNldFRpbWV6b25lID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgdGltZXpvbmU6IE1heWJlPFRpbWV6b25lU3RyaW5nPikgPT4gKHsgLi4uc3RhdGUsIHRpbWV6b25lIH0pKTtcbiAgcmVhZG9ubHkgc2V0SW5wdXRSYW5nZSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHJhbmdlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2UpID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZShzdGF0ZSwgcmFuZ2UpKTtcblxuICByZWFkb25seSB0b2dnbGVTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgdG9nZ2xlOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgdG9nZ2xlIH0pKTtcbiAgcmVhZG9ubHkgYWRkU2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGFkZDogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IGFkZCB9KSk7XG4gIHJlYWRvbmx5IHJlbW92ZVNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCByZW1vdmU6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyByZW1vdmUgfSkpO1xuICByZWFkb25seSBzZXRTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2V0OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2V0IH0pKTtcblxuICByZWFkb25seSBzZXRTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzY2hlZHVsZURheXM6IEl0ZXJhYmxlPERhdGVTY2hlZHVsZURheUNvZGU+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCBzY2hlZHVsZURheXMpKTtcbiAgcmVhZG9ubHkgc2V0QWxsb3dBbGxTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCBudWxsKSk7XG5cbiAgcmVhZG9ubHkgc2V0RGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHZhbHVlOiBNYXliZTxEYXRlU2NoZWR1bGVSYW5nZT4pID0+IHVwZGF0ZVN0YXRlV2l0aERhdGVTY2hlZHVsZVJhbmdlVmFsdWUoc3RhdGUsIHZhbHVlKSk7XG4gIHJlYWRvbmx5IHNldENlbGxDb250ZW50RmFjdG9yeSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGNlbGxDb250ZW50RmFjdG9yeTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSkgPT4gKHsgLi4uc3RhdGUsIGNlbGxDb250ZW50RmFjdG9yeSB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgZmlsdGVyOiBNYXliZTxEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGxldCBpc0VuYWJsZWRGaWx0ZXJEYXk6IE1heWJlPERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PiA9ICgpID0+IHRydWU7XG5cbiAgaWYgKGZpbHRlcikge1xuICAgIGlzRW5hYmxlZEZpbHRlckRheSA9IGRhdGVTY2hlZHVsZURhdGVGaWx0ZXIoZmlsdGVyKTtcbiAgfVxuXG4gIHJldHVybiB7IC4uLnN0YXRlLCBmaWx0ZXIsIGlzRW5hYmxlZEZpbHRlckRheSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoRGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IE1heWJlPERhdGVTY2hlZHVsZVJhbmdlPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IGlzU2FtZVZhbHVlID0gaXNTYW1lRGF0ZVNjaGVkdWxlUmFuZ2Uoc3RhdGUuY3VycmVudFNlbGVjdGlvblZhbHVlPy5kYXRlU2NoZWR1bGVSYW5nZSwgY2hhbmdlKTtcblxuICBpZiAoaXNTYW1lVmFsdWUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNoYW5nZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBuZXh0U3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSA9IHsgLi4uc3RhdGUsIGlucHV0U3RhcnQ6IGNoYW5nZS5zdGFydCwgaW5wdXRFbmQ6IGNoYW5nZS5lbmQsIHNlbGVjdGVkSW5kZXhlczogbmV3IFNldChjaGFuZ2UuZXgpIH07XG4gICAgICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpLCBkYXRlU2NoZWR1bGVEYXlDb2RlcyhjaGFuZ2UudykpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGUpOyAvLyBjbGVhciBzZWxlY3Rpb24sIHJldGFpbiBkaXNhYmxlZCBkYXlzXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogTWF5YmU8SXRlcmFibGU8RGF0ZVNjaGVkdWxlRGF5Q29kZT4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBzY2hlZHVsZURheXM6IGN1cnJlbnRTY2hlZHVsZURheXMgfSA9IHN0YXRlO1xuICBjb25zdCBzY2hlZHVsZURheXMgPSBuZXcgU2V0KGNoYW5nZSB8fCBbRGF0ZVNjaGVkdWxlRGF5Q29kZS5XRUVLREFZLCBEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtFTkRdKTtcblxuICBpZiAoc2V0c0FyZUVxdWl2YWxlbnQoY3VycmVudFNjaGVkdWxlRGF5cywgc2NoZWR1bGVEYXlzKSkge1xuICAgIHJldHVybiBzdGF0ZTsgLy8gbm8gY2hhbmdlXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWxsb3dlZERheXNPZldlZWsgPSBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0KEFycmF5LmZyb20oc2NoZWR1bGVEYXlzKSk7XG4gICAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgc2NoZWR1bGVEYXlzLCBhbGxvd2VkRGF5c09mV2VlayB9O1xuICAgIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlRGF0ZXNDaGFuZ2Uge1xuICB0b2dnbGU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICBhZGQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICByZW1vdmU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICBzZXQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlRGF0ZXNDaGFuZ2UpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGluZGV4RmFjdG9yeSwgYWxsb3dlZERheXNPZldlZWssIGluZGV4RGF5T2ZXZWVrIH0gPSBzdGF0ZTtcbiAgbGV0IHNlbGVjdGVkSW5kZXhlczogU2V0PERhdGVCbG9ja0luZGV4PjtcblxuICBpZiAoY2hhbmdlLnNldCkge1xuICAgIHNlbGVjdGVkSW5kZXhlcyA9IG5ldyBTZXQoaXRlcmFibGVUb0FycmF5KGNoYW5nZS5zZXQpLm1hcChpbmRleEZhY3RvcnkpKTtcbiAgfSBlbHNlIHtcbiAgICBzZWxlY3RlZEluZGV4ZXMgPSBuZXcgU2V0KHN0YXRlLnNlbGVjdGVkSW5kZXhlcyk7XG5cbiAgICBpZiAoY2hhbmdlLnRvZ2dsZSkge1xuICAgICAgY29uc3QgYWxsb3dlZFRvVG9nZ2xlID0gaXRlcmFibGVUb0FycmF5KGNoYW5nZS50b2dnbGUpXG4gICAgICAgIC5tYXAoaW5kZXhGYWN0b3J5KVxuICAgICAgICAuZmlsdGVyKChpKSA9PiBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoaSkpKTtcbiAgICAgIHRvZ2dsZUluU2V0KHNlbGVjdGVkSW5kZXhlcywgYWxsb3dlZFRvVG9nZ2xlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlLmFkZCkge1xuICAgICAgYWRkVG9TZXQoc2VsZWN0ZWRJbmRleGVzLCBpdGVyYWJsZVRvQXJyYXkoY2hhbmdlLmFkZCkubWFwKGluZGV4RmFjdG9yeSkpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2UucmVtb3ZlKSB7XG4gICAgICBhZGRUb1NldChzZWxlY3RlZEluZGV4ZXMsIGl0ZXJhYmxlVG9BcnJheShjaGFuZ2UucmVtb3ZlKS5tYXAoaW5kZXhGYWN0b3J5KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgc2VsZWN0ZWRJbmRleGVzIH07XG4gIG5leHRTdGF0ZS5pc0VuYWJsZWREYXkgPSBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuXG4gIC8vIFJlY2FsY3VsYXRlIHRoZSByYW5nZSBhbmQgc2ltcGxpZmllZCB0byBleGNsdXNpb25zXG4gIGNvbnN0IHJhbmdlQW5kRXhjbHVzaW9uID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24obmV4dFN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24pIHtcbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoeyAuLi5uZXh0U3RhdGUsIHNlbGVjdGVkSW5kZXhlczogbmV3IFNldChyYW5nZUFuZEV4Y2x1c2lvbi5leGNsdWRlZCksIGlucHV0U3RhcnQ6IHJhbmdlQW5kRXhjbHVzaW9uLnN0YXJ0LCBpbnB1dEVuZDogcmFuZ2VBbmRFeGNsdXNpb24uZW5kIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vIHNlbGVjdGVkIGRheXNcbiAgICByZXR1cm4gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub1NlbGVjdGlvbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHsgLi4uc3RhdGUsIHNlbGVjdGVkSW5kZXhlczogbmV3IFNldCgpLCBpbnB1dFN0YXJ0OiBudWxsLCBpbnB1dEVuZDogbnVsbCB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgaW5wdXRTdGFydDogY3VycmVudElucHV0U3RhcnQsIGlucHV0RW5kOiBjdXJyZW50SW5wdXRFbmQsIGluZGV4RmFjdG9yeSwgbWluRGF0ZSwgbWF4RGF0ZSB9ID0gc3RhdGU7XG5cbiAgY29uc3QgaW5wdXRTdGFydCA9IHN0YXJ0T2ZEYXkoY2hhbmdlLmlucHV0U3RhcnQpO1xuICBjb25zdCBpbnB1dEVuZCA9IHN0YXJ0T2ZEYXkoY2hhbmdlLmlucHV0RW5kKTtcblxuICBjb25zdCBpc1ZhbGlkUmFuZ2UgPSBtaW5EYXRlICE9IG51bGwgfHwgbWF4RGF0ZSAhPSBudWxsID8gaXNEYXRlSW5EYXRlUmFuZ2VGdW5jdGlvbih7IHN0YXJ0OiBtaW5EYXRlID8/IHVuZGVmaW5lZCwgZW5kOiBtYXhEYXRlID8/IHVuZGVmaW5lZCB9KSA6ICgpID0+IHRydWU7XG5cbiAgaWYgKCFpc1ZhbGlkUmFuZ2UoaW5wdXRTdGFydCkgfHwgIWlzVmFsaWRSYW5nZShpbnB1dEVuZCkgfHwgKGlzU2FtZURhdGVEYXkoaW5wdXRTdGFydCwgY3VycmVudElucHV0U3RhcnQpICYmIGlzU2FtZURhdGVEYXkoaW5wdXRFbmQsIGN1cnJlbnRJbnB1dEVuZCkpKSB7XG4gICAgcmV0dXJuIHN0YXRlOyAvLyBpZiBubyBjaGFuZ2UsIHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAgfVxuXG4gIC8vIHJldGFpbiBhbGwgaW5kZXhlcyB0aGF0IGFyZSB3aXRoaW4gdGhlIG5ldyByYW5nZVxuICBjb25zdCBtaW5JbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KTtcbiAgY29uc3QgbWF4SW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRFbmQpICsgMTtcblxuICBjb25zdCBjdXJyZW50SW5kZXhlczogRGF0ZUJsb2NrSW5kZXhbXSA9IEFycmF5LmZyb20oc3RhdGUuc2VsZWN0ZWRJbmRleGVzKTtcbiAgY29uc3QgaXNJbkN1cnJlbnRSYW5nZSA9IGlzSW5kZXhOdW1iZXJJbkluZGV4UmFuZ2VGdW5jdGlvbih7IG1pbkluZGV4LCBtYXhJbmRleCB9KTtcbiAgY29uc3QgZXhjbHVkZWRJbmRleGVzSW5OZXdSYW5nZSA9IGN1cnJlbnRJbmRleGVzLmZpbHRlcihpc0luQ3VycmVudFJhbmdlKTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSB7IC4uLnN0YXRlLCBleGNsdWRlZEluZGV4ZXNJbk5ld1JhbmdlLCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9O1xuICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbmV4dFN0YXRlLmlzRW5hYmxlZERheSA9IGlzRW5hYmxlZERheUluQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG4gIG5leHRTdGF0ZS5jdXJyZW50U2VsZWN0aW9uVmFsdWUgPSBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZShuZXh0U3RhdGUpO1xuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbmFibGVkRGF5SW5DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+IHtcbiAgY29uc3QgeyBpbmRleEZhY3RvcnksIGlucHV0U3RhcnQsIGlucHV0RW5kLCBpbmRleERheU9mV2VlaywgYWxsb3dlZERheXNPZldlZWsgfSA9IHN0YXRlO1xuXG4gIGxldCBpc0luU3RhcnRBbmRFbmRSYW5nZTogSXNEYXRlV2l0aGluRGF0ZUJsb2NrUmFuZ2VGdW5jdGlvbjtcblxuICBpZiAoaW5wdXRTdGFydCAmJiBpbnB1dEVuZCkge1xuICAgIGlzSW5TdGFydEFuZEVuZFJhbmdlID0gaXNEYXRlV2l0aGluRGF0ZUJsb2NrUmFuZ2VGdW5jdGlvbih7IHN0YXJ0OiBzdGF0ZS5zdGFydCwgcmFuZ2U6IHsgc3RhcnQ6IGlucHV0U3RhcnQsIGVuZDogaW5wdXRFbmQgfSB9KTtcbiAgfSBlbHNlIHtcbiAgICBpc0luU3RhcnRBbmRFbmRSYW5nZSA9ICgpID0+IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChpbnB1dDogRGF0ZU9yRGF0ZUJsb2NrSW5kZXgpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dCk7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gaW5kZXhEYXlPZldlZWsoaW5kZXgpO1xuXG4gICAgY29uc3QgaXNJblNlbGVjdGVkUmFuZ2UgPSBpc0luU3RhcnRBbmRFbmRSYW5nZShpbnB1dCk7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IHN0YXRlLnNlbGVjdGVkSW5kZXhlcy5oYXMoaW5kZXgpO1xuICAgIGNvbnN0IGlzQWxsb3dlZERheU9mV2VlayA9IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhkYXlPZldlZWspO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gaXNBbGxvd2VkRGF5T2ZXZWVrICYmICgoaXNJblNlbGVjdGVkUmFuZ2UgJiYgIWlzU2VsZWN0ZWQpIHx8IChpc1NlbGVjdGVkICYmICFpc0luU2VsZWN0ZWRSYW5nZSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlPiB7XG4gIGNvbnN0IHsgc2NoZWR1bGVEYXlzLCBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhEYXlPZldlZWsgfSA9IHN0YXRlO1xuICBjb25zdCByYW5nZUFuZEV4Y2x1c2lvbiA9IGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKHN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBzdGFydCwgZW5kLCBleGNsdWRlZCwgZGF0ZUJsb2NrUmFuZ2UgfSA9IHJhbmdlQW5kRXhjbHVzaW9uO1xuICBjb25zdCBpbmRleE9mZnNldCA9IGRhdGVCbG9ja1JhbmdlLmk7XG5cbiAgY29uc3QgZXg6IERhdGVCbG9ja0luZGV4W10gPSBleGNsdWRlZFxuICAgIC5maWx0ZXIoKHgpID0+IHtcbiAgICAgIGNvbnN0IGlzRXhjbHVkZWRJbmRleCA9IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhpbmRleERheU9mV2Vlayh4KSk7XG4gICAgICByZXR1cm4gaXNFeGNsdWRlZEluZGV4O1xuICAgIH0pXG4gICAgLm1hcCgoeCkgPT4geCAtIGluZGV4T2Zmc2V0KTsgLy8gc2V0IHRvIHRoZSBwcm9wZXIgb2Zmc2V0XG5cbiAgY29uc3QgdzogRGF0ZVNjaGVkdWxlRW5jb2RlZFdlZWsgPSBkYXRlU2NoZWR1bGVFbmNvZGVkV2VlayhzY2hlZHVsZURheXMpO1xuICBjb25zdCBkOiBEYXRlQmxvY2tJbmRleFtdID0gW107IC8vIFwiaW5jbHVkZWRcIiBibG9ja3MgYXJlIG5ldmVyIHVzZWQvY2FsY3VsYXRlZC5cblxuICBjb25zdCBkYXRlU2NoZWR1bGVSYW5nZTogRGF0ZVNjaGVkdWxlUmFuZ2UgPSB7XG4gICAgc3RhcnQsXG4gICAgZW5kLFxuICAgIHcsXG4gICAgZCxcbiAgICBleFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZGF0ZVNjaGVkdWxlUmFuZ2UsXG4gICAgbWluTWF4UmFuZ2U6IHsgc3RhcnQsIGVuZCB9XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uIGV4dGVuZHMgRGF0ZVJhbmdlIHtcbiAgZGF0ZUJsb2NrUmFuZ2U6IERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlO1xuICBleGNsdWRlZDogRGF0ZUJsb2NrSW5kZXhbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24+IHtcbiAgY29uc3QgeyBpc0VuYWJsZWREYXkgfSA9IHN0YXRlO1xuICBjb25zdCBkYXRlRmFjdG9yeSA9IGRhdGVCbG9ja1RpbWluZ0RhdGVGYWN0b3J5KHN0YXRlKTtcbiAgY29uc3QgZGF0ZUJsb2NrUmFuZ2UgPSBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVCbG9ja1JhbmdlKHN0YXRlKTtcblxuICBpZiAoZGF0ZUJsb2NrUmFuZ2UgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsOyAvLyByZXR1cm5zIG51bGwgaWYgbm8gaXRlbXMgYXJlIHNlbGVjdGVkLlxuICB9XG5cbiAgY29uc3Qgc3RhcnQgPSBkYXRlRmFjdG9yeShkYXRlQmxvY2tSYW5nZS5pKTtcbiAgY29uc3QgZW5kID0gZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UudG8pO1xuXG4gIGNvbnN0IGV4Y2x1ZGVkOiBEYXRlQmxvY2tJbmRleFtdID0gcmFuZ2UoZGF0ZUJsb2NrUmFuZ2UuaSwgZGF0ZUJsb2NrUmFuZ2UudG8gKyAxKS5maWx0ZXIoKHgpID0+IHtcbiAgICBjb25zdCBpc0V4Y2x1ZGVkSW5kZXggPSAhaXNFbmFibGVkRGF5KHgpO1xuICAgIHJldHVybiBpc0V4Y2x1ZGVkSW5kZXg7XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdDogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uID0ge1xuICAgIGRhdGVCbG9ja1JhbmdlLFxuICAgIHN0YXJ0LFxuICAgIGVuZCxcbiAgICBleGNsdWRlZFxuICB9O1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxEYXRlUmFuZ2U+IHtcbiAgY29uc3QgZGF0ZUZhY3RvcnkgPSBkYXRlQmxvY2tUaW1pbmdEYXRlRmFjdG9yeShzdGF0ZSk7XG4gIGNvbnN0IGRhdGVCbG9ja1JhbmdlID0gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXRlQmxvY2tSYW5nZShzdGF0ZSk7XG5cbiAgaWYgKGRhdGVCbG9ja1JhbmdlICE9IG51bGwpIHtcbiAgICByZXR1cm4geyBzdGFydDogZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UuaSksIGVuZDogZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UudG8gYXMgbnVtYmVyKSB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUJsb2NrUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlPiB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCwgYWxsb3dlZERheXNPZldlZWssIGluZGV4RGF5T2ZXZWVrLCBpc0VuYWJsZWREYXksIGlzRW5hYmxlZEZpbHRlckRheSB9ID0gc3RhdGU7XG4gIGNvbnN0IGVuYWJsZWRTZWxlY3RlZEluZGV4ZXMgPSBBcnJheS5mcm9tKHN0YXRlLnNlbGVjdGVkSW5kZXhlcykuZmlsdGVyKChpKSA9PiBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoaSkpKTtcbiAgY29uc3QgbWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMgPSBtaW5BbmRNYXhOdW1iZXIoZW5hYmxlZFNlbGVjdGVkSW5kZXhlcyk7XG5cbiAgbGV0IHN0YXJ0UmFuZ2U6IE1heWJlPERhdGVCbG9ja0luZGV4PjtcbiAgbGV0IGVuZFJhbmdlOiBNYXliZTxEYXRlQmxvY2tJbmRleD47XG5cbiAgaWYgKG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzKSB7XG4gICAgc3RhcnRSYW5nZSA9IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzLm1pbjtcbiAgICBlbmRSYW5nZSA9IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzLm1heDtcbiAgfVxuXG4gIGlmIChpbnB1dFN0YXJ0ICE9IG51bGwgJiYgaW5wdXRFbmQgIT0gbnVsbCkge1xuICAgIGNvbnN0IGlucHV0U3RhcnRJbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KTtcbiAgICBjb25zdCBpbnB1dEVuZEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0RW5kKTtcblxuICAgIHN0YXJ0UmFuZ2UgPSBzdGFydFJhbmdlICE9IG51bGwgPyBNYXRoLm1pbihpbnB1dFN0YXJ0SW5kZXgsIHN0YXJ0UmFuZ2UpIDogaW5wdXRTdGFydEluZGV4O1xuICAgIGVuZFJhbmdlID0gZW5kUmFuZ2UgIT0gbnVsbCA/IE1hdGgubWF4KGlucHV0RW5kSW5kZXgsIGVuZFJhbmdlKSA6IGlucHV0RW5kSW5kZXg7XG4gIH1cblxuICBpZiAoc3RhcnRSYW5nZSAhPSBudWxsICYmIGVuZFJhbmdlICE9IG51bGwpIHtcbiAgICBjb25zdCBzY2FuU3RhcnRJbmRleCA9IHN0YXJ0UmFuZ2U7XG4gICAgY29uc3Qgc2NhbkVuZEluZGV4ID0gZW5kUmFuZ2U7XG5cbiAgICAvLyBjbGVhciBzdGFydCBhbmQgZW5kXG4gICAgc3RhcnRSYW5nZSA9IHVuZGVmaW5lZDtcbiAgICBlbmRSYW5nZSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIGlmIHRoZSBtaW4gaXMgZXF1YWwgdG8gdGhlIHN0YXJ0IGluZGV4LCB0aGVuIHdlIGFyZSBpbiB0aGUgcmFuZ2UgYW5kIG5lZWQgdG8gaXRlcmF0ZSBkYXRlcyB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGlzIG5vdCBzZWxlY3RlZC9leGNsdWRlZC5cbiAgICBmb3IgKGxldCBpID0gc2NhblN0YXJ0SW5kZXg7IGkgPD0gc2NhbkVuZEluZGV4OyBpICs9IDEpIHtcbiAgICAgIGlmIChpc0VuYWJsZWRGaWx0ZXJEYXkoaSkgJiYgaXNFbmFibGVkRGF5KGkpKSB7XG4gICAgICAgIHN0YXJ0UmFuZ2UgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzYW1lIHdpdGggdGhlIG1heFxuICAgIGZvciAobGV0IGkgPSBzY2FuRW5kSW5kZXg7IGkgPj0gc2NhblN0YXJ0SW5kZXg7IGkgLT0gMSkge1xuICAgICAgaWYgKGlzRW5hYmxlZEZpbHRlckRheShpKSAmJiBpc0VuYWJsZWREYXkoaSkpIHtcbiAgICAgICAgZW5kUmFuZ2UgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnRSYW5nZSAhPSBudWxsICYmIGVuZFJhbmdlICE9IG51bGwpIHtcbiAgICByZXR1cm4geyBpOiBzdGFydFJhbmdlLCB0bzogZW5kUmFuZ2UgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
390
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwseUJBQXlCLEVBR3pCLDBCQUEwQixFQUcxQixzQkFBc0IsRUFDdEIsZ0NBQWdDLEVBRWhDLG1CQUFtQixFQUNuQix1QkFBdUIsRUFJdkIsOEJBQThCLEVBQzlCLDBCQUEwQixFQUMxQix3Q0FBd0MsRUFDeEMsV0FBVyxFQUNYLFdBQVcsRUFDWCx5QkFBeUIsRUFFekIsa0NBQWtDLEVBQ2xDLFVBQVUsRUFDVixhQUFhLEVBQ2IsZUFBZSxFQUNmLHVCQUF1QixFQUV2QixtQ0FBbUMsRUFDcEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQTRELGVBQWUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGlDQUFpQyxFQUFZLGVBQWUsRUFBRSxpQkFBaUIsRUFBYSxLQUFLLEVBQXNCLE1BQU0sRUFBRSxXQUFXLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQzNSLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQVksVUFBVSxFQUFlLE1BQU0sVUFBVSxDQUFDO0FBQzdELE9BQU8sRUFBYyxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFFLE9BQU8sRUFBK0Usa0RBQWtELEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7QUFvR2hMLE1BQU0sVUFBVSxxQ0FBcUM7SUFDbkQsTUFBTSxLQUFLLEdBQUcs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QUFTLENBQUM7UUFFckIsOElBQThJO1FBQzlJLEtBQUssSUFBSSxDQUFDLEdBQUcsY0FBYyxFQUFFLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0RCxJQUFJLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDNUMsVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDZixNQUFNO2FBQ1A7U0FDRjtRQUVELG9CQUFvQjtRQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEQsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQzVDLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQ2IsTUFBTTthQUNQO1NBQ0Y7S0FDRjtJQUVELElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1FBQzFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztLQUN4QztTQUFNO1FBQ0wsT0FBTyxTQUFTLENBQUM7S0FDbEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeSxcbiAgZGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeSxcbiAgRGF0ZUJsb2NrSW5kZXgsXG4gIERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlLFxuICBkYXRlQmxvY2tUaW1pbmdEYXRlRmFjdG9yeSxcbiAgRGF0ZU9yRGF0ZUJsb2NrSW5kZXgsXG4gIERhdGVSYW5nZSxcbiAgZGF0ZVNjaGVkdWxlRGF0ZUZpbHRlcixcbiAgY29weURhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWcsXG4gIERhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWcsXG4gIERhdGVTY2hlZHVsZURheUNvZGUsXG4gIGRhdGVTY2hlZHVsZUVuY29kZWRXZWVrLFxuICBEYXRlU2NoZWR1bGVFbmNvZGVkV2VlayxcbiAgRGF0ZVNjaGVkdWxlUmFuZ2UsXG4gIERhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeSxcbiAgZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5LFxuICBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2RlcyxcbiAgZXhwYW5kRGF0ZVNjaGVkdWxlRGF5Q29kZXNUb0RheU9mV2Vla1NldCxcbiAgZmluZE1heERhdGUsXG4gIGZpbmRNaW5EYXRlLFxuICBpc0RhdGVJbkRhdGVSYW5nZUZ1bmN0aW9uLFxuICBJc0RhdGVXaXRoaW5EYXRlQmxvY2tSYW5nZUZ1bmN0aW9uLFxuICBpc0RhdGVXaXRoaW5EYXRlQmxvY2tSYW5nZUZ1bmN0aW9uLFxuICBpc1NhbWVEYXRlLFxuICBpc1NhbWVEYXRlRGF5LFxuICBpc1NhbWVEYXRlUmFuZ2UsXG4gIGlzU2FtZURhdGVTY2hlZHVsZVJhbmdlLFxuICBEYXRlT3JEYXRlUmFuZ2VPckRhdGVCbG9ja0luZGV4T3JEYXRlQmxvY2tSYW5nZSxcbiAgZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhBcnJheUZhY3Rvcnlcbn0gZnJvbSAnQGRlcmVla2IvZGF0ZSc7XG5pbXBvcnQgeyBmaWx0ZXJNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgTWF5YmUsIFRpbWV6b25lU3RyaW5nLCBEZWNpc2lvbkZ1bmN0aW9uLCBJdGVyYWJsZU9yVmFsdWUsIGl0ZXJhYmxlVG9BcnJheSwgYWRkVG9TZXQsIHRvZ2dsZUluU2V0LCBpc0luZGV4TnVtYmVySW5JbmRleFJhbmdlRnVuY3Rpb24sIE1heWJlTWFwLCBtaW5BbmRNYXhOdW1iZXIsIHNldHNBcmVFcXVpdmFsZW50LCBEYXlPZldlZWssIHJhbmdlLCBBbGxPck5vbmVTZWxlY3Rpb24sIHVuaXF1ZSwgbWVyZ2VBcnJheXMsIEFycmF5T3JWYWx1ZSB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RvcmUgfSBmcm9tICdAbmdyeC9jb21wb25lbnQtc3RvcmUnO1xuaW1wb3J0IHsgYWRkWWVhcnMsIHN0YXJ0T2ZEYXksIHN0YXJ0T2ZZZWFyIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnksIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZSwgZGVmYXVsdENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnkgfSBmcm9tICcuL2NhbGVuZGFyLnNjaGVkdWxlLnNlbGVjdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlIHtcbiAgLyoqXG4gICAqIElucHV0IFN0YXJ0IERhdGVcbiAgICovXG4gIGlucHV0U3RhcnQ6IERhdGU7XG4gIC8qKlxuICAgKiBJbnB1dCBFbmQgRGF0ZVxuICAgKi9cbiAgaW5wdXRFbmQ6IERhdGU7XG59XG5cbmV4cG9ydCB0eXBlIFBhcnRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2UgPSBQYXJ0aWFsPE1heWJlTWFwPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZT4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSBleHRlbmRzIFBhcnRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2Uge1xuICAvKipcbiAgICogRmlsdGVycyB0aGUgZGF5cyBvZiB0aGUgc2NoZWR1bGUgdG8gb25seSBhbGxvdyBzZWxlY3RpbmcgZGF5cyBpbiB0aGUgc2NoZWR1bGUuXG4gICAqL1xuICBmaWx0ZXI/OiBNYXliZTxEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPjtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZXhjbHVzaW9ucyB0aGF0IG1heSBub3QgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGZpbHRlci5cbiAgICovXG4gIGlucHV0RXhjbHVzaW9ucz86IE1heWJlPEFycmF5T3JWYWx1ZTxEYXRlT3JEYXRlUmFuZ2VPckRhdGVCbG9ja0luZGV4T3JEYXRlQmxvY2tSYW5nZT4+O1xuICAvKipcbiAgICogVGhlIGNvbXB1dGVkIGV4Y2x1c2lvbnMgZ2l2ZW4gdGhlIGlucHV0IGV4Y2x1c2lvbnMuXG4gICAqL1xuICBjb21wdXRlZEV4Y2x1c2lvbnM/OiBNYXliZTxEYXRlQmxvY2tJbmRleFtdPjtcbiAgLyoqXG4gICAqIE1pbmltdW0gZGF0ZSBhbGxvd2VkIGlmIG5vIGZpbHRlciBpcyBzZXQuIElmIGEgZmlsdGVyIGlzIHNldCwgdGhlIGdyZWF0ZXIgb2YgdGhlIHR3byBkYXRlcyBpcyB1c2VkIGFzIHRoZSBtaW5pbXVtLlxuICAgKi9cbiAgbWluRGF0ZT86IE1heWJlPERhdGU+O1xuICAvKipcbiAgICogTWF4aW11bSBkYXRlIGFsbG93ZWQgaWYgbm8gZmlsdGVyIGlzIHNldC4gSWYgYSBmaWx0ZXIgaXMgc2V0LCB0aGUgbGVzc2VyIG9mIHRoZSB0d28gZGF0ZXMgaXMgdXNlZCBhcyB0aGUgbWF4aW11bS5cbiAgICovXG4gIG1heERhdGU/OiBNYXliZTxEYXRlPjtcbiAgLyoqXG4gICAqIFN0YXJ0IGRhdGUuIElzIHVwZGF0ZWQgYXMgdGhlIGlucHV0U3RhcnQgaXMgbW9kaWZpZWQgb3IgZmlsdGVyIGlzIHByb3ZpZGVkIHRoYXQgcHJvdmlkZXMgdGhlIHN0YXJ0IGRhdGUuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRvZGF5IGFuZCB0aGUgY3VycmVudCB0aW1lem9uZS5cbiAgICovXG4gIHN0YXJ0OiBEYXRlO1xuICAvKipcbiAgICogRGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5XG4gICAqL1xuICBpbmRleEZhY3Rvcnk6IERhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeTtcbiAgLyoqXG4gICAqIEFycmF5IG9mIG1hbnVhbGx5IHNlbGVjdGVkIGRhdGVzLlxuICAgKlxuICAgKiBWYWx1ZXMgdGhhdCBleGlzdCBvdXRzaWRlIG9mIHRoZSBcImlucHV0XCIgcmFuZ2UgYXJlIGNvbnNpZGVyZWQgdG9nZ2xlZCBvbiwgd2hpbGUgdGhvc2VcbiAgICogdGhhdCBhcmUgc2VsZWN0ZWQgd2l0aGluIHRoZSByYW5nZSBhcmUgY29uc2lkZXJlZCB0b2dnbGVkIG9mZi5cbiAgICpcbiAgICogSWYgZGF0ZXMgYXJlIHNlbGVjdGVkLCBhbmQgdGhlbiBhIHJhbmdlIGlzIHNlbGVjdGVkLCB0aGVuIHRob3NlIGRhdGVzIHdpdGhpbiB0aGUgcmFuZ2UgdGhhdCBmYWxsXG4gICAqIHdpdGhpbiB0aGUgcmFuZ2UgYXJlIGNsZWFyZWQgZnJvbSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIFRoZXNlIGluZGV4ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBkYXRlLlxuICAgKi9cbiAgc2VsZWN0ZWRJbmRleGVzOiBTZXQ8RGF0ZUJsb2NrSW5kZXg+O1xuICAvKipcbiAgICogRGF5cyBvZiB0aGUgc2NoZWR1bGUgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBwaWNrZWQuXG4gICAqL1xuICBzY2hlZHVsZURheXM6IFNldDxEYXRlU2NoZWR1bGVEYXlDb2RlPjtcbiAgLyoqXG4gICAqIFNldCBvZiB0aGUgZGF5cyBvZiB3ZWVrIHRoYXQgYXJlIGFsbG93ZWQuXG4gICAqL1xuICBhbGxvd2VkRGF5c09mV2VlazogU2V0PERheU9mV2Vlaz47XG4gIC8qKlxuICAgKlxuICAgKi9cbiAgaW5kZXhEYXlPZldlZWs6IERhdGVCbG9ja0RheU9mV2Vla0ZhY3Rvcnk7XG4gIC8qKlxuICAgKiBEZWNpc2lvbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIGlzIGVuYWJsZWQgZ2l2ZW4gdGhlIGN1cnJlbnQgZmlsdGVyLlxuICAgKi9cbiAgaXNFbmFibGVkRmlsdGVyRGF5OiBEZWNpc2lvbkZ1bmN0aW9uPERhdGVPckRhdGVCbG9ja0luZGV4PjtcbiAgLyoqXG4gICAqIERlY2lzaW9uIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlIHRoZSBjdXJyZW50IGZpbHRlciBpbnRvIGFjY291bnQuXG4gICAqL1xuICBpc0VuYWJsZWREYXk6IERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICAvKipcbiAgICogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSBmb3IgdGhlIHZpZXcuXG4gICAqL1xuICBjZWxsQ29udGVudEZhY3Rvcnk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3Rvcnk7XG4gIC8qKlxuICAgKiBDdXJyZW50IHNlbGVjdGlvbiB2YWx1ZS5cbiAgICovXG4gIGN1cnJlbnRTZWxlY3Rpb25WYWx1ZT86IE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZT47XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIGZpbHRlciBhcyB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZSBpbnN0ZWFkIG9mIG9wdGltaXppbmcgZm9yIHRoZSBjdXJyZW50IGluZGV4LlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXI/OiBNYXliZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHNlbGVjdGlvbiBzdGF0ZSB3aGVuIHRoZSBjYWxlbmRhciBpcyByZXNldC5cbiAgICovXG4gIGluaXRpYWxTZWxlY3Rpb25TdGF0ZT86IE1heWJlPEFsbE9yTm9uZVNlbGVjdGlvbj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKCk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHN0YXJ0ID0gc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcbiAgY29uc3Qgc2NoZWR1bGVEYXlzID0gbmV3IFNldChbRGF0ZVNjaGVkdWxlRGF5Q29kZS5XRUVLREFZLCBEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtFTkRdKTtcbiAgY29uc3QgYWxsb3dlZERheXNPZldlZWsgPSBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0KEFycmF5LmZyb20oc2NoZWR1bGVEYXlzKSk7XG4gIGNvbnN0IGluZGV4RmFjdG9yeSA9IGRhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeSh7IHN0YXJ0IH0pO1xuICBjb25zdCBpbmRleERheU9mV2VlayA9IGRhdGVCbG9ja0RheU9mV2Vla0ZhY3Rvcnkoc3RhcnQpO1xuXG4gIHJldHVybiB7XG4gICAgc3RhcnQsXG4gICAgaW5kZXhGYWN0b3J5LFxuICAgIHNlbGVjdGVkSW5kZXhlczogbmV3IFNldCgpLFxuICAgIHNjaGVkdWxlRGF5cyxcbiAgICBhbGxvd2VkRGF5c09mV2VlayxcbiAgICBpbmRleERheU9mV2VlayxcbiAgICBpc0VuYWJsZWRGaWx0ZXJEYXk6ICgpID0+IHRydWUsXG4gICAgaXNFbmFibGVkRGF5OiAoKSA9PiBmYWxzZSxcbiAgICBtaW5EYXRlOiBudWxsLFxuICAgIG1heERhdGU6IG51bGwsXG4gICAgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXI6IHRydWUsXG4gICAgY2VsbENvbnRlbnRGYWN0b3J5OiBkZWZhdWx0Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsZW5kYXJTY2hlZHVsZU1pbkRhdGUoeDogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8RGF0ZT4ge1xuICByZXR1cm4gZmluZE1heERhdGUoW3guZmlsdGVyPy5zdGFydCwgeC5taW5EYXRlXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWF4RGF0ZSh4OiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxEYXRlPiB7XG4gIHJldHVybiBmaW5kTWluRGF0ZShbeC5maWx0ZXI/LmVuZCwgeC5tYXhEYXRlXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxlbmRhclNjaGVkdWxlTWluQW5kTWF4RGF0ZSh4OiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBQaWNrPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgJ21pbkRhdGUnIHwgJ21heERhdGUnPiB7XG4gIHJldHVybiB7XG4gICAgbWluRGF0ZTogY2FsZW5kYXJTY2hlZHVsZU1pbkRhdGUoeCksXG4gICAgbWF4RGF0ZTogY2FsZW5kYXJTY2hlZHVsZU1heERhdGUoeClcbiAgfTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZSBleHRlbmRzIENvbXBvbmVudFN0b3JlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihpbml0aWFsQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKCkpO1xuICB9XG5cbiAgLy8gTUFSSzogQWNjZXNzb3JzXG4gIHJlYWRvbmx5IGZpbHRlciQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5maWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dFN0YXJ0JCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlucHV0U3RhcnQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRFbmQkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaW5wdXRFbmQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudElucHV0UmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSkgPT4gKHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBpc1NhbWVEYXRlKGEuaW5wdXRTdGFydCwgYi5pbnB1dFN0YXJ0KSAmJiBpc1NhbWVEYXRlKGEuaW5wdXRFbmQsIGIuaW5wdXRFbmQpKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4LmlucHV0U3RhcnQgJiYgeC5pbnB1dEVuZCkge1xuICAgICAgICByZXR1cm4geCBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRSYW5nZSQ6IE9ic2VydmFibGU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPiA9IHRoaXMuY3VycmVudElucHV0UmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZXMkOiBPYnNlcnZhYmxlPFNldDxEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguc2VsZWN0ZWRJbmRleGVzKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkRmlsdGVyRGF5RnVuY3Rpb24kOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlzRW5hYmxlZEZpbHRlckRheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc0VuYWJsZWREYXlGdW5jdGlvbiQ6IE9ic2VydmFibGU8RGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaXNFbmFibGVkRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGlzU2FtZURhdGVSYW5nZShhLCBiKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciQ6IE9ic2VydmFibGU8TWF5YmU8Ym9vbGVhbj4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgc3RhcnRCZWluZ1VzZWRGcm9tRmlsdGVyJDogT2JzZXJ2YWJsZTxNYXliZTxib29sZWFuPj4gPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5jb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciAmJiB4LmZpbHRlcj8uc3RhcnQgIT0gbnVsbCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPERhdGVSYW5nZT4gPSB0aGlzLmN1cnJlbnREYXRlUmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNjaGVkdWxlRGF5cyQ6IE9ic2VydmFibGU8U2V0PERhdGVTY2hlZHVsZURheUNvZGU+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnNjaGVkdWxlRGF5cyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoc2V0c0FyZUVxdWl2YWxlbnQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWUkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZGF0ZVNjaGVkdWxlUmFuZ2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVTY2hlZHVsZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRhdGVTY2hlZHVsZVJhbmdlVmFsdWUkID0gdGhpcy5jdXJyZW50RGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSQucGlwZShmaWx0ZXJNYXliZSgpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgbWluRGF0ZSQgPSB0aGlzLnN0YXRlJC5waXBlKG1hcChjYWxlbmRhclNjaGVkdWxlTWluRGF0ZSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXkpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgbWF4RGF0ZSQgPSB0aGlzLnN0YXRlJC5waXBlKG1hcChjYWxlbmRhclNjaGVkdWxlTWF4RGF0ZSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVEYXkpLCBzaGFyZVJlcGxheSgxKSk7XG5cbiAgcmVhZG9ubHkgY2VsbENvbnRlbnRGYWN0b3J5JCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmNlbGxDb250ZW50RmFjdG9yeSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGlzQ3VzdG9taXplZCQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5zZWxlY3RlZEluZGV4ZXMuc2l6ZSA+IDApLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvLyBNQVJLOiBTdGF0ZSBDaGFuZ2VzXG4gIHJlYWRvbmx5IHNldEZpbHRlciA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGZpbHRlcjogTWF5YmU8RGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz4pID0+IHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZSwgZmlsdGVyKSk7XG4gIHJlYWRvbmx5IHNldEV4Y2x1c2lvbnMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBleGNsdXNpb25zOiBNYXliZTxBcnJheU9yVmFsdWU8RGF0ZU9yRGF0ZVJhbmdlT3JEYXRlQmxvY2tJbmRleE9yRGF0ZUJsb2NrUmFuZ2U+PikgPT4gdXBkYXRlU3RhdGVXaXRoRXhjbHVzaW9ucyhzdGF0ZSwgZXhjbHVzaW9ucykpO1xuICByZWFkb25seSBzZXRDb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlciA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyOiBNYXliZTxib29sZWFuPikgPT4gdXBkYXRlU3RhdGVXaXRoQ29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIoc3RhdGUsIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKSk7XG4gIHJlYWRvbmx5IGNsZWFyRmlsdGVyID0gdGhpcy51cGRhdGVyKChzdGF0ZSkgPT4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCB1bmRlZmluZWQpKTtcblxuICByZWFkb25seSBzZXRUaW1lem9uZSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHRpbWV6b25lOiBNYXliZTxUaW1lem9uZVN0cmluZz4pID0+ICh7IC4uLnN0YXRlLCB0aW1lem9uZSB9KSk7XG4gIHJlYWRvbmx5IHNldElucHV0UmFuZ2UgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCByYW5nZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlKSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkUmFuZ2Uoc3RhdGUsIHJhbmdlKSk7XG5cbiAgcmVhZG9ubHkgdG9nZ2xlU2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHRvZ2dsZTogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHRvZ2dsZSB9KSk7XG4gIHJlYWRvbmx5IGFkZFNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBhZGQ6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyBhZGQgfSkpO1xuICByZWFkb25seSByZW1vdmVTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgcmVtb3ZlOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgcmVtb3ZlIH0pKTtcbiAgcmVhZG9ubHkgc2V0U2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHNldDogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNldCB9KSk7XG4gIHJlYWRvbmx5IHNlbGVjdEFsbERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2VsZWN0QWxsOiBBbGxPck5vbmVTZWxlY3Rpb24gPSAnYWxsJykgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IHNlbGVjdEFsbCB9KSk7XG4gIHJlYWRvbmx5IHNldEluaXRpYWxTZWxlY3Rpb25TdGF0ZSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGluaXRpYWxTZWxlY3Rpb25TdGF0ZTogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPikgPT4gdXBkYXRlU3RhdGVXaXRoSW5pdGlhbFNlbGVjdGlvblN0YXRlKHN0YXRlLCBpbml0aWFsU2VsZWN0aW9uU3RhdGUpKTtcblxuICByZWFkb25seSBzZXRTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzY2hlZHVsZURheXM6IEl0ZXJhYmxlPERhdGVTY2hlZHVsZURheUNvZGU+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCBzY2hlZHVsZURheXMpKTtcbiAgcmVhZG9ubHkgc2V0QWxsb3dBbGxTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCBudWxsKSk7XG5cbiAgcmVhZG9ubHkgc2V0RGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHZhbHVlOiBNYXliZTxEYXRlU2NoZWR1bGVSYW5nZT4pID0+IHVwZGF0ZVN0YXRlV2l0aERhdGVTY2hlZHVsZVJhbmdlVmFsdWUoc3RhdGUsIHZhbHVlKSk7XG4gIHJlYWRvbmx5IHNldENlbGxDb250ZW50RmFjdG9yeSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGNlbGxDb250ZW50RmFjdG9yeTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSkgPT4gKHsgLi4uc3RhdGUsIGNlbGxDb250ZW50RmFjdG9yeSB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhJbml0aWFsU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgaW5pdGlhbFNlbGVjdGlvblN0YXRlOiBNYXliZTxBbGxPck5vbmVTZWxlY3Rpb24+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBzZWxlY3RlZEluZGV4ZXMgfSA9IHN0YXRlO1xuXG4gIGlmIChzZWxlY3RlZEluZGV4ZXMuc2l6ZSA9PT0gMCAmJiBpbml0aWFsU2VsZWN0aW9uU3RhdGUgPT09ICdhbGwnKSB7XG4gICAgc3RhdGUgPSB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2VsZWN0QWxsOiBpbml0aWFsU2VsZWN0aW9uU3RhdGUgfSk7XG4gIH1cblxuICByZXR1cm4geyAuLi5zdGF0ZSwgaW5pdGlhbFNlbGVjdGlvblN0YXRlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlcihjdXJyZW50U3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXI6IE1heWJlPGJvb2xlYW4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbGV0IHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUgPSB7IC4uLmN1cnJlbnRTdGF0ZSwgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgfTtcblxuICBpZiAoQm9vbGVhbihjdXJyZW50U3RhdGUuY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIpICE9PSBCb29sZWFuKGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyKSkge1xuICAgIHN0YXRlID0gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7fSk7IC8vIHJlY2FsY3VsYXRlIGlmIGNoYW5nZSBvY2N1cnMgYXMgaXQgd2lsbCBhZmZlY3QgdGhlIG91dHB1dCB2YWx1ZVxuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoRXhjbHVzaW9ucyhzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBpbnB1dEV4Y2x1c2lvbnM6IE1heWJlPEFycmF5T3JWYWx1ZTxEYXRlT3JEYXRlUmFuZ2VPckRhdGVCbG9ja0luZGV4T3JEYXRlQmxvY2tSYW5nZT4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbGV0IGNvbXB1dGVkRXhjbHVzaW9uczogTWF5YmU8RGF0ZUJsb2NrSW5kZXhbXT47XG5cbiAgaWYgKGlucHV0RXhjbHVzaW9ucykge1xuICAgIGNvbnN0IHsgaW5kZXhGYWN0b3J5IH0gPSBzdGF0ZTtcbiAgICBjb25zdCBpbmRleEFycmF5RmFjdG9yeSA9IGRhdGVUaW1pbmdSZWxhdGl2ZUluZGV4QXJyYXlGYWN0b3J5KGluZGV4RmFjdG9yeSk7XG4gICAgY29tcHV0ZWRFeGNsdXNpb25zID0gaW5kZXhBcnJheUZhY3RvcnkoaW5wdXRFeGNsdXNpb25zKTtcbiAgfVxuXG4gIHN0YXRlID0geyAuLi5zdGF0ZSwgaW5wdXRFeGNsdXNpb25zLCBjb21wdXRlZEV4Y2x1c2lvbnMgfTtcbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZSwgc3RhdGUuZmlsdGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aEZpbHRlcihzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBpbnB1dEZpbHRlcjogTWF5YmU8RGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGNvbXB1dGVkRXhjbHVzaW9uczogZXhjbHVzaW9ucyB9ID0gc3RhdGU7XG5cbiAgbGV0IGlzRW5hYmxlZEZpbHRlckRheTogTWF5YmU8RGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD4+ID0gKCkgPT4gdHJ1ZTtcbiAgbGV0IGZpbHRlcjogTWF5YmU8RGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZz4gPSBudWxsO1xuXG4gIGlmIChpbnB1dEZpbHRlciB8fCBleGNsdXNpb25zPy5sZW5ndGgpIHtcbiAgICBsZXQgZW5hYmxlZEZpbHRlcjogRGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZztcblxuICAgIGlmIChpbnB1dEZpbHRlcikge1xuICAgICAgZmlsdGVyID0gY29weURhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWcoaW5wdXRGaWx0ZXIpOyAvLyBjb3B5IGZpbHRlclxuXG4gICAgICBpZiAoZXhjbHVzaW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgIGVuYWJsZWRGaWx0ZXIgPSB7XG4gICAgICAgICAgLi4uZmlsdGVyLFxuICAgICAgICAgIGV4OiB1bmlxdWUobWVyZ2VBcnJheXMoW2ZpbHRlci5leCwgZXhjbHVzaW9uc10pKVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5hYmxlZEZpbHRlciA9IGZpbHRlcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZW5hYmxlZEZpbHRlciA9IHtcbiAgICAgICAgdzogJzg5JyxcbiAgICAgICAgZXg6IGV4Y2x1c2lvbnMgYXMgbnVtYmVyW11cbiAgICAgIH07XG4gICAgfVxuXG4gICAgaXNFbmFibGVkRmlsdGVyRGF5ID0gZGF0ZVNjaGVkdWxlRGF0ZUZpbHRlcihlbmFibGVkRmlsdGVyKTtcbiAgfVxuXG4gIHN0YXRlID0geyAuLi5zdGF0ZSwgZmlsdGVyLCBpc0VuYWJsZWRGaWx0ZXJEYXkgfTtcblxuICAvLyBhdHRlbXB0IHRvIHJlLWFwcGx5IHRoZSBpbml0aWFsIHNlbGVjdGlvbiBzdGF0ZSBvbmNlIGZpbHRlciBpcyBhcHBsaWVkXG4gIGlmIChzdGF0ZS5pbml0aWFsU2VsZWN0aW9uU3RhdGUpIHtcbiAgICBzdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aEluaXRpYWxTZWxlY3Rpb25TdGF0ZShzdGF0ZSwgc3RhdGUuaW5pdGlhbFNlbGVjdGlvblN0YXRlKTtcbiAgfVxuXG4gIC8vIHJlLWNhbGN1bGF0ZSB0aGUgc2VsZWN0aW9uIGdpdmVuIHRoZSBmaWx0ZXJcbiAgY29uc3QgeyBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9ID0gc3RhdGU7XG5cbiAgaWYgKGlucHV0U3RhcnQgJiYgaW5wdXRFbmQpIHtcbiAgICBzdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZShzdGF0ZSwgeyBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9KTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aERhdGVTY2hlZHVsZVJhbmdlVmFsdWUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBNYXliZTxEYXRlU2NoZWR1bGVSYW5nZT4pOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCBpc1NhbWVWYWx1ZSA9IGlzU2FtZURhdGVTY2hlZHVsZVJhbmdlKHN0YXRlLmN1cnJlbnRTZWxlY3Rpb25WYWx1ZT8uZGF0ZVNjaGVkdWxlUmFuZ2UsIGNoYW5nZSk7XG5cbiAgaWYgKGlzU2FtZVZhbHVlKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9IGVsc2Uge1xuICAgIGlmIChjaGFuZ2UgIT0gbnVsbCkge1xuICAgICAgY29uc3QgbmV4dFN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUgPSB7IC4uLnN0YXRlLCBpbnB1dFN0YXJ0OiBjaGFuZ2Uuc3RhcnQsIGlucHV0RW5kOiBjaGFuZ2UuZW5kLCBzZWxlY3RlZEluZGV4ZXM6IG5ldyBTZXQoY2hhbmdlLmV4KSB9O1xuICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRTY2hlZHVsZURheXMoZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKSwgZXhwYW5kRGF0ZVNjaGVkdWxlRGF5Q29kZXMoY2hhbmdlLncpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vU2VsZWN0aW9uQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHN0YXRlKTsgLy8gY2xlYXIgc2VsZWN0aW9uLCByZXRhaW4gZGlzYWJsZWQgZGF5c1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IE1heWJlPEl0ZXJhYmxlPERhdGVTY2hlZHVsZURheUNvZGU+Pik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgc2NoZWR1bGVEYXlzOiBjdXJyZW50U2NoZWR1bGVEYXlzIH0gPSBzdGF0ZTtcbiAgY29uc3Qgc2NoZWR1bGVEYXlzID0gbmV3IFNldChjaGFuZ2UgfHwgW0RhdGVTY2hlZHVsZURheUNvZGUuV0VFS0RBWSwgRGF0ZVNjaGVkdWxlRGF5Q29kZS5XRUVLRU5EXSk7XG5cbiAgaWYgKHNldHNBcmVFcXVpdmFsZW50KGN1cnJlbnRTY2hlZHVsZURheXMsIHNjaGVkdWxlRGF5cykpIHtcbiAgICByZXR1cm4gc3RhdGU7IC8vIG5vIGNoYW5nZVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGFsbG93ZWREYXlzT2ZXZWVrID0gZXhwYW5kRGF0ZVNjaGVkdWxlRGF5Q29kZXNUb0RheU9mV2Vla1NldChBcnJheS5mcm9tKHNjaGVkdWxlRGF5cykpO1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHsgLi4uc3RhdGUsIHNjaGVkdWxlRGF5cywgYWxsb3dlZERheXNPZldlZWsgfTtcbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZURhdGVzQ2hhbmdlIHtcbiAgcmVzZXQ/OiB0cnVlO1xuICB0b2dnbGU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICBhZGQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICByZW1vdmU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICBzZXQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICBzZWxlY3RBbGw/OiBBbGxPck5vbmVTZWxlY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGVEYXRlc0NoYW5nZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhEYXlPZldlZWsgfSA9IHN0YXRlO1xuICBjb25zdCB7IG1pbkRhdGUsIG1heERhdGUgfSA9IGNhbGVuZGFyU2NoZWR1bGVNaW5BbmRNYXhEYXRlKHN0YXRlKTtcblxuICBsZXQgc2VsZWN0ZWRJbmRleGVzOiBTZXQ8RGF0ZUJsb2NrSW5kZXg+O1xuXG4gIGlmIChjaGFuZ2UucmVzZXQgfHwgY2hhbmdlLnNlbGVjdEFsbCAhPSBudWxsIHx8IGNoYW5nZS5zZXQpIHtcbiAgICBsZXQgc2V0OiBNYXliZTxJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PiA9IGNoYW5nZS5zZXQgPz8gW107XG4gICAgbGV0IHNlbGVjdEFsbDogTWF5YmU8QWxsT3JOb25lU2VsZWN0aW9uPiA9IGNoYW5nZS5yZXNldCA9PT0gdHJ1ZSA/IHN0YXRlLmluaXRpYWxTZWxlY3Rpb25TdGF0ZSA6IGNoYW5nZS5zZWxlY3RBbGw7XG5cbiAgICBzd2l0Y2ggKHNlbGVjdEFsbCkge1xuICAgICAgY2FzZSAnYWxsJzpcbiAgICAgICAgaWYgKG1pbkRhdGUgIT0gbnVsbCAmJiBtYXhEYXRlICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBtaW5JbmRleCA9IGluZGV4RmFjdG9yeShtaW5EYXRlKTtcbiAgICAgICAgICBjb25zdCBtYXhJbmRleCA9IGluZGV4RmFjdG9yeShtYXhEYXRlKTtcbiAgICAgICAgICBzZXQgPSByYW5nZShtaW5JbmRleCwgbWF4SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHNldCA9IFtdO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBzZWxlY3RlZEluZGV4ZXMgPSBuZXcgU2V0KGl0ZXJhYmxlVG9BcnJheShzZXQpLm1hcChpbmRleEZhY3RvcnkpKTtcbiAgfSBlbHNlIHtcbiAgICBzZWxlY3RlZEluZGV4ZXMgPSBuZXcgU2V0KHN0YXRlLnNlbGVjdGVkSW5kZXhlcyk7XG5cbiAgICBpZiAoY2hhbmdlLnRvZ2dsZSkge1xuICAgICAgY29uc3QgYWxsb3dlZFRvVG9nZ2xlID0gaXRlcmFibGVUb0FycmF5KGNoYW5nZS50b2dnbGUpXG4gICAgICAgIC5tYXAoaW5kZXhGYWN0b3J5KVxuICAgICAgICAuZmlsdGVyKChpKSA9PiBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoaSkpKTtcbiAgICAgIHRvZ2dsZUluU2V0KHNlbGVjdGVkSW5kZXhlcywgYWxsb3dlZFRvVG9nZ2xlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlLmFkZCkge1xuICAgICAgYWRkVG9TZXQoc2VsZWN0ZWRJbmRleGVzLCBpdGVyYWJsZVRvQXJyYXkoY2hhbmdlLmFkZCkubWFwKGluZGV4RmFjdG9yeSkpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2UucmVtb3ZlKSB7XG4gICAgICBhZGRUb1NldChzZWxlY3RlZEluZGV4ZXMsIGl0ZXJhYmxlVG9BcnJheShjaGFuZ2UucmVtb3ZlKS5tYXAoaW5kZXhGYWN0b3J5KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgc2VsZWN0ZWRJbmRleGVzIH07XG4gIG5leHRTdGF0ZS5pc0VuYWJsZWREYXkgPSBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuXG4gIC8vIFJlY2FsY3VsYXRlIHRoZSByYW5nZSBhbmQgc2ltcGxpZmllZCB0byBleGNsdXNpb25zXG4gIGNvbnN0IHJhbmdlQW5kRXhjbHVzaW9uID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24obmV4dFN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24pIHtcbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoeyAuLi5uZXh0U3RhdGUsIHNlbGVjdGVkSW5kZXhlczogbmV3IFNldChyYW5nZUFuZEV4Y2x1c2lvbi5leGNsdWRlZCksIGlucHV0U3RhcnQ6IHJhbmdlQW5kRXhjbHVzaW9uLnN0YXJ0LCBpbnB1dEVuZDogcmFuZ2VBbmRFeGNsdXNpb24uZW5kIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vIHNlbGVjdGVkIGRheXNcbiAgICByZXR1cm4gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSh7IC4uLnN0YXRlLCBzZWxlY3RlZEluZGV4ZXM6IG5ldyBTZXQoKSwgaW5wdXRTdGFydDogbnVsbCwgaW5wdXRFbmQ6IG51bGwgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgY2hhbmdlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2UpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGlucHV0U3RhcnQ6IGN1cnJlbnRJbnB1dFN0YXJ0LCBpbnB1dEVuZDogY3VycmVudElucHV0RW5kLCBpbmRleEZhY3RvcnksIG1pbkRhdGUsIG1heERhdGUsIGZpbHRlciwgY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgfSA9IHN0YXRlO1xuXG4gIGxldCBpbnB1dFN0YXJ0OiBEYXRlID0gc3RhcnRPZkRheShjaGFuZ2UuaW5wdXRTdGFydCk7XG4gIGxldCBpbnB1dEVuZDogRGF0ZSA9IHN0YXJ0T2ZEYXkoY2hhbmdlLmlucHV0RW5kKTtcblxuICBjb25zdCBpc1ZhbGlkUmFuZ2UgPSBtaW5EYXRlICE9IG51bGwgfHwgbWF4RGF0ZSAhPSBudWxsID8gaXNEYXRlSW5EYXRlUmFuZ2VGdW5jdGlvbih7IHN0YXJ0OiBtaW5EYXRlID8/IHVuZGVmaW5lZCwgZW5kOiBtYXhEYXRlID8/IHVuZGVmaW5lZCB9KSA6ICgpID0+IHRydWU7XG5cbiAgaWYgKCFpc1ZhbGlkUmFuZ2UoaW5wdXRTdGFydCkgfHwgIWlzVmFsaWRSYW5nZShpbnB1dEVuZCkgfHwgKGlzU2FtZURhdGVEYXkoaW5wdXRTdGFydCwgY3VycmVudElucHV0U3RhcnQpICYmIGlzU2FtZURhdGVEYXkoaW5wdXRFbmQsIGN1cnJlbnRJbnB1dEVuZCkpKSB7XG4gICAgcmV0dXJuIHN0YXRlOyAvLyBpZiBubyBjaGFuZ2UsIHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAgfVxuXG4gIC8vIHJldGFpbiBhbGwgaW5kZXhlcyB0aGF0IGFyZSB3aXRoaW4gdGhlIG5ldyByYW5nZVxuICBjb25zdCBtaW5JbmRleCA9IGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyICYmIGZpbHRlcj8uc3RhcnQgPyBpbmRleEZhY3RvcnkoZmlsdGVyPy5zdGFydCkgOiBpbmRleEZhY3RvcnkoaW5wdXRTdGFydCk7XG4gIGNvbnN0IG1heEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0RW5kKSArIDE7XG5cbiAgY29uc3QgY3VycmVudEluZGV4ZXM6IERhdGVCbG9ja0luZGV4W10gPSBBcnJheS5mcm9tKHN0YXRlLnNlbGVjdGVkSW5kZXhlcyk7XG4gIGNvbnN0IGlzSW5DdXJyZW50UmFuZ2UgPSBpc0luZGV4TnVtYmVySW5JbmRleFJhbmdlRnVuY3Rpb24oeyBtaW5JbmRleCwgbWF4SW5kZXggfSk7XG4gIGNvbnN0IGV4Y2x1ZGVkSW5kZXhlc0luTmV3UmFuZ2UgPSBjdXJyZW50SW5kZXhlcy5maWx0ZXIoaXNJbkN1cnJlbnRSYW5nZSk7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgZXhjbHVkZWRJbmRleGVzSW5OZXdSYW5nZSwgaW5wdXRTdGFydCwgaW5wdXRFbmQgfTtcbiAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIG5leHRTdGF0ZS5pc0VuYWJsZWREYXkgPSBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuICBuZXh0U3RhdGUuY3VycmVudFNlbGVjdGlvblZhbHVlID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uVmFsdWUobmV4dFN0YXRlKTtcbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW5hYmxlZERheUluQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBEZWNpc2lvbkZ1bmN0aW9uPERhdGVPckRhdGVCbG9ja0luZGV4PiB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCwgaW5kZXhEYXlPZldlZWssIGFsbG93ZWREYXlzT2ZXZWVrIH0gPSBzdGF0ZTtcblxuICBsZXQgaXNJblN0YXJ0QW5kRW5kUmFuZ2U6IElzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb247XG5cbiAgaWYgKGlucHV0U3RhcnQgJiYgaW5wdXRFbmQpIHtcbiAgICBpc0luU3RhcnRBbmRFbmRSYW5nZSA9IGlzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb24oeyBzdGFydDogc3RhdGUuc3RhcnQsIHJhbmdlOiB7IHN0YXJ0OiBpbnB1dFN0YXJ0LCBlbmQ6IGlucHV0RW5kIH0gfSk7XG4gIH0gZWxzZSB7XG4gICAgaXNJblN0YXJ0QW5kRW5kUmFuZ2UgPSAoKSA9PiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoaW5wdXQ6IERhdGVPckRhdGVCbG9ja0luZGV4KSA9PiB7XG4gICAgY29uc3QgaW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXQpO1xuICAgIGNvbnN0IGRheU9mV2VlayA9IGluZGV4RGF5T2ZXZWVrKGluZGV4KTtcblxuICAgIGNvbnN0IGlzSW5TZWxlY3RlZFJhbmdlID0gaXNJblN0YXJ0QW5kRW5kUmFuZ2UoaW5wdXQpO1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBzdGF0ZS5zZWxlY3RlZEluZGV4ZXMuaGFzKGluZGV4KTtcbiAgICBjb25zdCBpc0FsbG93ZWREYXlPZldlZWsgPSBhbGxvd2VkRGF5c09mV2Vlay5oYXMoZGF5T2ZXZWVrKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGlzQWxsb3dlZERheU9mV2VlayAmJiAoKGlzSW5TZWxlY3RlZFJhbmdlICYmICFpc1NlbGVjdGVkKSB8fCAoaXNTZWxlY3RlZCAmJiAhaXNJblNlbGVjdGVkUmFuZ2UpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uVmFsdWUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZT4ge1xuICBjb25zdCB7IGluZGV4RmFjdG9yeSwgc2NoZWR1bGVEYXlzLCBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhEYXlPZldlZWssIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyLCBmaWx0ZXIgfSA9IHN0YXRlO1xuICBjb25zdCByYW5nZUFuZEV4Y2x1c2lvbiA9IGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKHN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBzdGFydDogcmFuZ2VTdGFydCwgZW5kLCBleGNsdWRlZDogYWxsRXhjbHVkZWQsIGRhdGVCbG9ja1JhbmdlIH0gPSByYW5nZUFuZEV4Y2x1c2lvbjtcbiAgbGV0IGZpbHRlck9mZnNldEV4Y2x1ZGVkUmFuZ2U6IERhdGVCbG9ja0luZGV4W10gPSBbXTtcbiAgbGV0IGluZGV4T2Zmc2V0ID0gZGF0ZUJsb2NrUmFuZ2UuaTtcblxuICBsZXQgc3RhcnQgPSByYW5nZVN0YXJ0O1xuXG4gIC8vIElmIGNvbXB1dGVTZWxlY3Rpb25SZXN1bHRSZWxhdGl2ZVRvRmlsdGVyIGlzIHRydWUsIHRoZW4gd2UgbmVlZCB0byBvZmZzZXQgdGhlIHZhbHVlcyB0byBiZSByZWxhdGl2ZSB0byB0aGF0IHN0YXJ0LlxuICBpZiAoY29tcHV0ZVNlbGVjdGlvblJlc3VsdFJlbGF0aXZlVG9GaWx0ZXIgJiYgZmlsdGVyPy5zdGFydCkge1xuICAgIHN0YXJ0ID0gZmlsdGVyLnN0YXJ0O1xuXG4gICAgY29uc3QgZmlsdGVyU3RhcnRJbmRleE9mZnNldCA9IGluZGV4RmFjdG9yeShyYW5nZVN0YXJ0KSAtIGluZGV4RmFjdG9yeShzdGFydCk7XG4gICAgZmlsdGVyT2Zmc2V0RXhjbHVkZWRSYW5nZSA9IHJhbmdlKDAsIGZpbHRlclN0YXJ0SW5kZXhPZmZzZXQpO1xuICAgIGluZGV4T2Zmc2V0ID0gaW5kZXhPZmZzZXQgLSBmaWx0ZXJTdGFydEluZGV4T2Zmc2V0O1xuICB9XG5cbiAgY29uc3QgZXhjbHVkZWQgPSBjb21wdXRlU2VsZWN0aW9uUmVzdWx0UmVsYXRpdmVUb0ZpbHRlclxuICAgID8gYWxsRXhjbHVkZWQuZmlsdGVyKCh4KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzRXhjbHVkZWRJbmRleCA9IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhpbmRleERheU9mV2Vlayh4KSk7IC8vID8/P1xuICAgICAgICByZXR1cm4gaXNFeGNsdWRlZEluZGV4O1xuICAgICAgfSlcbiAgICA6IGFsbEV4Y2x1ZGVkO1xuXG4gIGNvbnN0IG9mZnNldEV4Y2x1ZGVkOiBEYXRlQmxvY2tJbmRleFtdID0gZXhjbHVkZWQubWFwKCh4KSA9PiB4IC0gaW5kZXhPZmZzZXQpOyAvLyBzZXQgdG8gdGhlIHByb3BlciBvZmZzZXRcblxuICBjb25zdCBleCA9IFsuLi5maWx0ZXJPZmZzZXRFeGNsdWRlZFJhbmdlLCAuLi5vZmZzZXRFeGNsdWRlZF07XG5cbiAgY29uc3QgdzogRGF0ZVNjaGVkdWxlRW5jb2RlZFdlZWsgPSBkYXRlU2NoZWR1bGVFbmNvZGVkV2VlayhzY2hlZHVsZURheXMpO1xuICBjb25zdCBkOiBEYXRlQmxvY2tJbmRleFtdID0gW107IC8vIFwiaW5jbHVkZWRcIiBibG9ja3MgYXJlIG5ldmVyIHVzZWQvY2FsY3VsYXRlZC5cblxuICBjb25zdCBkYXRlU2NoZWR1bGVSYW5nZTogRGF0ZVNjaGVkdWxlUmFuZ2UgPSB7XG4gICAgc3RhcnQsXG4gICAgZW5kLFxuICAgIHcsXG4gICAgZCxcbiAgICBleFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZGF0ZVNjaGVkdWxlUmFuZ2UsXG4gICAgbWluTWF4UmFuZ2U6IHsgc3RhcnQsIGVuZCB9XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uIGV4dGVuZHMgRGF0ZVJhbmdlIHtcbiAgZGF0ZUJsb2NrUmFuZ2U6IERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlO1xuICBleGNsdWRlZDogRGF0ZUJsb2NrSW5kZXhbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24+IHtcbiAgY29uc3QgeyBpc0VuYWJsZWREYXksIGlzRW5hYmxlZEZpbHRlckRheSB9ID0gc3RhdGU7XG4gIGNvbnN0IGRhdGVGYWN0b3J5ID0gZGF0ZUJsb2NrVGltaW5nRGF0ZUZhY3Rvcnkoc3RhdGUpO1xuICBjb25zdCBkYXRlQmxvY2tSYW5nZSA9IGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUJsb2NrUmFuZ2Uoc3RhdGUpO1xuXG4gIGlmIChkYXRlQmxvY2tSYW5nZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7IC8vIHJldHVybnMgbnVsbCBpZiBubyBpdGVtcyBhcmUgc2VsZWN0ZWQuXG4gIH1cblxuICBjb25zdCBzdGFydCA9IGRhdGVGYWN0b3J5KGRhdGVCbG9ja1JhbmdlLmkpO1xuICBjb25zdCBlbmQgPSBkYXRlRmFjdG9yeShkYXRlQmxvY2tSYW5nZS50byk7XG5cbiAgY29uc3QgZXhjbHVkZWQ6IERhdGVCbG9ja0luZGV4W10gPSByYW5nZShkYXRlQmxvY2tSYW5nZS5pLCBkYXRlQmxvY2tSYW5nZS50byArIDEpLmZpbHRlcigoeCkgPT4ge1xuICAgIGNvbnN0IGlzRXhjbHVkZWRJbmRleCA9ICFpc0VuYWJsZWREYXkoeCkgfHwgIWlzRW5hYmxlZEZpbHRlckRheSh4KTtcbiAgICByZXR1cm4gaXNFeGNsdWRlZEluZGV4O1xuICB9KTtcblxuICBjb25zdCByZXN1bHQ6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZUFuZEV4Y2x1c2lvbiA9IHtcbiAgICBkYXRlQmxvY2tSYW5nZSxcbiAgICBzdGFydCxcbiAgICBlbmQsXG4gICAgZXhjbHVkZWRcbiAgfTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8RGF0ZVJhbmdlPiB7XG4gIGNvbnN0IGRhdGVGYWN0b3J5ID0gZGF0ZUJsb2NrVGltaW5nRGF0ZUZhY3Rvcnkoc3RhdGUpO1xuICBjb25zdCBkYXRlQmxvY2tSYW5nZSA9IGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUJsb2NrUmFuZ2Uoc3RhdGUpO1xuXG4gIGNvbnN0IGRhdGVSYW5nZTogTWF5YmU8RGF0ZVJhbmdlPiA9IGRhdGVCbG9ja1JhbmdlICE9IG51bGwgPyB7IHN0YXJ0OiBkYXRlRmFjdG9yeShkYXRlQmxvY2tSYW5nZS5pKSwgZW5kOiBkYXRlRmFjdG9yeShkYXRlQmxvY2tSYW5nZS50byBhcyBudW1iZXIpIH0gOiB1bmRlZmluZWQ7XG4gIHJldHVybiBkYXRlUmFuZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVCbG9ja1JhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxEYXRlQmxvY2tSYW5nZVdpdGhSYW5nZT4ge1xuICBjb25zdCB7IGluZGV4RmFjdG9yeSwgaW5wdXRTdGFydCwgaW5wdXRFbmQsIGFsbG93ZWREYXlzT2ZXZWVrLCBpbmRleERheU9mV2VlaywgaXNFbmFibGVkRGF5LCBpc0VuYWJsZWRGaWx0ZXJEYXkgfSA9IHN0YXRlO1xuICBjb25zdCBlbmFibGVkU2VsZWN0ZWRJbmRleGVzID0gQXJyYXkuZnJvbShzdGF0ZS5zZWxlY3RlZEluZGV4ZXMpLmZpbHRlcigoaSkgPT4gYWxsb3dlZERheXNPZldlZWsuaGFzKGluZGV4RGF5T2ZXZWVrKGkpKSk7XG4gIGNvbnN0IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzID0gbWluQW5kTWF4TnVtYmVyKGVuYWJsZWRTZWxlY3RlZEluZGV4ZXMpO1xuXG4gIGxldCBzdGFydFJhbmdlOiBNYXliZTxEYXRlQmxvY2tJbmRleD47XG4gIGxldCBlbmRSYW5nZTogTWF5YmU8RGF0ZUJsb2NrSW5kZXg+O1xuXG4gIGlmIChtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcykge1xuICAgIHN0YXJ0UmFuZ2UgPSBtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcy5taW47XG4gICAgZW5kUmFuZ2UgPSBtaW5BbmRNYXhTZWxlY3RlZFZhbHVlcy5tYXg7XG4gIH1cblxuICBpZiAoaW5wdXRTdGFydCAhPSBudWxsICYmIGlucHV0RW5kICE9IG51bGwpIHtcbiAgICBjb25zdCBpbnB1dFN0YXJ0SW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRTdGFydCk7XG4gICAgY29uc3QgaW5wdXRFbmRJbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dEVuZCk7XG5cbiAgICBzdGFydFJhbmdlID0gc3RhcnRSYW5nZSAhPSBudWxsID8gTWF0aC5taW4oaW5wdXRTdGFydEluZGV4LCBzdGFydFJhbmdlKSA6IGlucHV0U3RhcnRJbmRleDtcbiAgICBlbmRSYW5nZSA9IGVuZFJhbmdlICE9IG51bGwgPyBNYXRoLm1heChpbnB1dEVuZEluZGV4LCBlbmRSYW5nZSkgOiBpbnB1dEVuZEluZGV4O1xuICB9XG5cbiAgaWYgKHN0YXJ0UmFuZ2UgIT0gbnVsbCAmJiBlbmRSYW5nZSAhPSBudWxsKSB7XG4gICAgY29uc3Qgc2NhblN0YXJ0SW5kZXggPSBzdGFydFJhbmdlO1xuICAgIGNvbnN0IHNjYW5FbmRJbmRleCA9IGVuZFJhbmdlO1xuXG4gICAgLy8gY2xlYXIgc3RhcnQgYW5kIGVuZFxuICAgIHN0YXJ0UmFuZ2UgPSB1bmRlZmluZWQ7XG4gICAgZW5kUmFuZ2UgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBpZiB0aGUgbWluIGlzIGVxdWFsIHRvIHRoZSBzdGFydCBpbmRleCwgdGhlbiB3ZSBhcmUgaW4gdGhlIHJhbmdlIGFuZCBuZWVkIHRvIGl0ZXJhdGUgZGF0ZXMgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBpcyBub3Qgc2VsZWN0ZWQvZXhjbHVkZWQuXG4gICAgZm9yIChsZXQgaSA9IHNjYW5TdGFydEluZGV4OyBpIDw9IHNjYW5FbmRJbmRleDsgaSArPSAxKSB7XG4gICAgICBpZiAoaXNFbmFibGVkRmlsdGVyRGF5KGkpICYmIGlzRW5hYmxlZERheShpKSkge1xuICAgICAgICBzdGFydFJhbmdlID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2FtZSB3aXRoIHRoZSBtYXhcbiAgICBmb3IgKGxldCBpID0gc2NhbkVuZEluZGV4OyBpID49IHNjYW5TdGFydEluZGV4OyBpIC09IDEpIHtcbiAgICAgIGlmIChpc0VuYWJsZWRGaWx0ZXJEYXkoaSkgJiYgaXNFbmFibGVkRGF5KGkpKSB7XG4gICAgICAgIGVuZFJhbmdlID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXJ0UmFuZ2UgIT0gbnVsbCAmJiBlbmRSYW5nZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHsgaTogc3RhcnRSYW5nZSwgdG86IGVuZFJhbmdlIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19