@wkly/datetime-picker 16.0.0 → 18.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.d.ts +74 -38
- package/esm2022/cdk-overlay/public-api.mjs +15 -14
- package/esm2022/cdk-overlay/wkly-datetime-picker-cdk-overlay.mjs +1 -1
- package/esm2022/config.mjs +118 -79
- package/esm2022/field.component.mjs +5 -5
- package/esm2022/picker.component.mjs +116 -105
- package/esm2022/presentation.mjs +73 -54
- package/esm2022/public-api.mjs +5 -5
- package/esm2022/wkly-datetime-picker.mjs +1 -1
- package/fesm2022/wkly-datetime-picker-cdk-overlay.mjs +14 -13
- package/fesm2022/wkly-datetime-picker-cdk-overlay.mjs.map +1 -1
- package/fesm2022/wkly-datetime-picker.mjs +309 -241
- package/fesm2022/wkly-datetime-picker.mjs.map +1 -1
- package/package.json +7 -7
- package/picker.component.d.ts +9 -5
- package/presentation.d.ts +12 -8
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { ChangeDetectorRef, Component, ElementRef, forwardRef, Inject, LOCALE_ID, PLATFORM_ID, ViewChild, } from "@angular/core";
|
|
1
|
+
import { ChangeDetectorRef, Component, ElementRef, effect, forwardRef, Inject, LOCALE_ID, PLATFORM_ID, signal, untracked, ViewChild, } from "@angular/core";
|
|
2
2
|
import { getLocaleFirstDayOfWeek, isPlatformBrowser } from "@angular/common";
|
|
3
3
|
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from "@angular/forms";
|
|
4
4
|
import { absoluteWeekOf, createWeekGenerator, firstEpochDayOf, integer, } from "@wkly/core";
|
|
5
|
+
import { draftDayDifference, setDraftDayDifference, calendarMonthBounds, resolveWklyTranslation, createWeekRows, validateDrafts, WklyPickerInputsPropertyKeys, WklyPickerOutputsPropertyKeys, } from "@wkly/presentation";
|
|
5
6
|
import { decodeIso, error, resolveWeekOffset, validateSelection, WklyGregorianCalendarAdapter, } from "@wkly/adapters";
|
|
6
|
-
import {
|
|
7
|
-
import { coerceBoolean, WKLY_CLOCK, WKLY_CONFIG, WKLY_LOCALIZATION, WKLY_TRANSLATIONS, WklyPickerInputs, WklyPickerInputsPropertyKeys, WklyPickerOutputsPropertyKeys, } from "./config";
|
|
7
|
+
import { WKLY_CLOCK, WKLY_CONFIG, WKLY_LOCALIZATION, WKLY_TRANSLATIONS, WklyPickerInputs, unwrapWklyPickerSignalInputs, } from "./config";
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
import * as i1 from "@angular/common";
|
|
10
10
|
import * as i2 from "./field.component";
|
|
@@ -60,6 +60,17 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
60
60
|
pendingValue = null;
|
|
61
61
|
emittedValue = null;
|
|
62
62
|
manualDateEndpoint = 0;
|
|
63
|
+
formValue = signal(undefined);
|
|
64
|
+
formDisabled = signal(false);
|
|
65
|
+
previousInputs;
|
|
66
|
+
currentValue() {
|
|
67
|
+
return this.formValue() === undefined
|
|
68
|
+
? this[WklyPickerInputsPropertyKeys.Value]()
|
|
69
|
+
: this.formValue();
|
|
70
|
+
}
|
|
71
|
+
isDisabled() {
|
|
72
|
+
return this[WklyPickerInputsPropertyKeys.Disabled]() || this.formDisabled();
|
|
73
|
+
}
|
|
63
74
|
constructor(defaultLocale, defaults, clock, strings, defaultTranslations, platform, host, changeDetector) {
|
|
64
75
|
super();
|
|
65
76
|
this.defaultLocale = defaultLocale;
|
|
@@ -70,41 +81,51 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
70
81
|
this.host = host;
|
|
71
82
|
this.changeDetector = changeDetector;
|
|
72
83
|
this.browser = isPlatformBrowser(platform);
|
|
84
|
+
effect(() => {
|
|
85
|
+
const inputs = unwrapWklyPickerSignalInputs(this);
|
|
86
|
+
const previous = this.previousInputs;
|
|
87
|
+
this.previousInputs = inputs;
|
|
88
|
+
if (!previous || !this.initialized)
|
|
89
|
+
return;
|
|
90
|
+
const changed = (key) => !Object.is(previous[key], inputs[key]);
|
|
91
|
+
if (!Object.keys(inputs).some((key) => changed(key)))
|
|
92
|
+
return;
|
|
93
|
+
untracked(() => {
|
|
94
|
+
if (changed(WklyPickerInputsPropertyKeys.Value))
|
|
95
|
+
this.formValue.set(undefined);
|
|
96
|
+
if (changed(WklyPickerInputsPropertyKeys.Value) &&
|
|
97
|
+
this.emittedValue === JSON.stringify(this.currentValue()) &&
|
|
98
|
+
Object.keys(inputs).every((key) => key === WklyPickerInputsPropertyKeys.Value ||
|
|
99
|
+
!changed(key))) {
|
|
100
|
+
this.emittedValue = null;
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const focus = this.focused;
|
|
104
|
+
this.configure();
|
|
105
|
+
if (changed(WklyPickerInputsPropertyKeys.Value) ||
|
|
106
|
+
changed(WklyPickerInputsPropertyKeys.Mode) ||
|
|
107
|
+
changed(WklyPickerInputsPropertyKeys.CalendarAdapter)) {
|
|
108
|
+
this.load(this.currentValue());
|
|
109
|
+
this.position(this.focused, true);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
this.check();
|
|
113
|
+
if (changed(WklyPickerInputsPropertyKeys.ViewportPreset))
|
|
114
|
+
this.position(focus, true);
|
|
115
|
+
else
|
|
116
|
+
this.scrollToEpochDay(focus);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
});
|
|
73
120
|
}
|
|
74
121
|
ngOnInit() {
|
|
75
122
|
this.initialize();
|
|
76
123
|
}
|
|
77
|
-
ngOnChanges(changes) {
|
|
78
|
-
if (this.initialized) {
|
|
79
|
-
if (Object.keys(changes).length === 1 &&
|
|
80
|
-
changes[WklyPickerInputsPropertyKeys.Value] &&
|
|
81
|
-
this.emittedValue ===
|
|
82
|
-
JSON.stringify(this[WklyPickerInputsPropertyKeys.Value])) {
|
|
83
|
-
this.emittedValue = null;
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
const focus = this.focused;
|
|
87
|
-
this.configure();
|
|
88
|
-
if (changes[WklyPickerInputsPropertyKeys.Value] ||
|
|
89
|
-
changes[WklyPickerInputsPropertyKeys.Mode] ||
|
|
90
|
-
changes[WklyPickerInputsPropertyKeys.CalendarAdapter]) {
|
|
91
|
-
this.load(this[WklyPickerInputsPropertyKeys.Value]);
|
|
92
|
-
this.position(this.focused, true);
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
this.check();
|
|
96
|
-
if (changes[WklyPickerInputsPropertyKeys.ViewportPreset])
|
|
97
|
-
this.position(focus, true);
|
|
98
|
-
else
|
|
99
|
-
this.scrollToEpochDay(focus);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
124
|
initialize() {
|
|
104
125
|
if (this.initialized)
|
|
105
126
|
return;
|
|
106
127
|
this.configure();
|
|
107
|
-
const initialEpochDay = this[WklyPickerInputsPropertyKeys.InitialEpochDay];
|
|
128
|
+
const initialEpochDay = this[WklyPickerInputsPropertyKeys.InitialEpochDay]();
|
|
108
129
|
this.today = this.browser
|
|
109
130
|
? Math.floor(this.clock.now().getTime() / 86400000)
|
|
110
131
|
: initialEpochDay === null
|
|
@@ -116,28 +137,21 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
116
137
|
? this.today
|
|
117
138
|
: this.defaults.initialEpochDay
|
|
118
139
|
: initialEpochDay;
|
|
119
|
-
this.load(this
|
|
140
|
+
this.load(this.currentValue());
|
|
120
141
|
this.initialized = true;
|
|
121
142
|
this.position(this.focused, true);
|
|
122
143
|
}
|
|
123
144
|
configure() {
|
|
124
145
|
this.configErrors = [];
|
|
125
|
-
[
|
|
126
|
-
WklyPickerInputsPropertyKeys.ShowSeconds,
|
|
127
|
-
WklyPickerInputsPropertyKeys.AllowRangeAcrossDisabled,
|
|
128
|
-
WklyPickerInputsPropertyKeys.Required,
|
|
129
|
-
WklyPickerInputsPropertyKeys.Disabled,
|
|
130
|
-
WklyPickerInputsPropertyKeys.CloseOnBackdrop,
|
|
131
|
-
].forEach((key) => (this[key] = coerceBoolean(this[key])));
|
|
132
146
|
this.effectiveLocale =
|
|
133
|
-
this[WklyPickerInputsPropertyKeys.Locale] ||
|
|
147
|
+
this[WklyPickerInputsPropertyKeys.Locale]() ||
|
|
134
148
|
this.defaults.locale ||
|
|
135
149
|
this.defaultLocale;
|
|
136
150
|
this.direction = /^(ar|he|fa|ur)(-|$)/.test(this.effectiveLocale)
|
|
137
151
|
? "rtl"
|
|
138
152
|
: "ltr";
|
|
139
153
|
this.adapter =
|
|
140
|
-
this[WklyPickerInputsPropertyKeys.CalendarAdapter] ||
|
|
154
|
+
this[WklyPickerInputsPropertyKeys.CalendarAdapter]() ||
|
|
141
155
|
new WklyGregorianCalendarAdapter(this.effectiveLocale);
|
|
142
156
|
try {
|
|
143
157
|
let firstDay;
|
|
@@ -145,12 +159,12 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
145
159
|
firstDay = getLocaleFirstDayOfWeek(this.effectiveLocale);
|
|
146
160
|
}
|
|
147
161
|
catch (_) { }
|
|
148
|
-
this.effectiveOffset = resolveWeekOffset(this.effectiveLocale, this[WklyPickerInputsPropertyKeys.WeekOffset], this.defaults.weekOffset, firstDay);
|
|
149
|
-
integer(this[WklyPickerInputsPropertyKeys.WeekCacheSize]);
|
|
150
|
-
integer(this[WklyPickerInputsPropertyKeys.OverscanWeeks]);
|
|
151
|
-
if (this[WklyPickerInputsPropertyKeys.WeekCacheSize] < 0 ||
|
|
152
|
-
this[WklyPickerInputsPropertyKeys.OverscanWeeks] < 0 ||
|
|
153
|
-
this[WklyPickerInputsPropertyKeys.OverscanWeeks] > 50)
|
|
162
|
+
this.effectiveOffset = resolveWeekOffset(this.effectiveLocale, this[WklyPickerInputsPropertyKeys.WeekOffset](), this.defaults.weekOffset, firstDay);
|
|
163
|
+
integer(this[WklyPickerInputsPropertyKeys.WeekCacheSize]());
|
|
164
|
+
integer(this[WklyPickerInputsPropertyKeys.OverscanWeeks]());
|
|
165
|
+
if (this[WklyPickerInputsPropertyKeys.WeekCacheSize]() < 0 ||
|
|
166
|
+
this[WklyPickerInputsPropertyKeys.OverscanWeeks]() < 0 ||
|
|
167
|
+
this[WklyPickerInputsPropertyKeys.OverscanWeeks]() > 50)
|
|
154
168
|
throw new RangeError();
|
|
155
169
|
if (![
|
|
156
170
|
"datetime",
|
|
@@ -159,9 +173,9 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
159
173
|
"datetime-range",
|
|
160
174
|
"date-range",
|
|
161
175
|
"time-range",
|
|
162
|
-
].includes(this[WklyPickerInputsPropertyKeys.Mode]))
|
|
176
|
+
].includes(this[WklyPickerInputsPropertyKeys.Mode]()))
|
|
163
177
|
throw new RangeError();
|
|
164
|
-
const preset = this[WklyPickerInputsPropertyKeys.ViewportPreset];
|
|
178
|
+
const preset = this[WklyPickerInputsPropertyKeys.ViewportPreset]();
|
|
165
179
|
if (preset.kind === "weeks") {
|
|
166
180
|
integer(preset.visibleWeekCount);
|
|
167
181
|
if (preset.visibleWeekCount < 1 || preset.visibleWeekCount > 52)
|
|
@@ -178,19 +192,19 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
178
192
|
}
|
|
179
193
|
this.generator = createWeekGenerator({
|
|
180
194
|
weekOffset: this.effectiveOffset,
|
|
181
|
-
cacheSize: this[WklyPickerInputsPropertyKeys.WeekCacheSize],
|
|
195
|
+
cacheSize: this[WklyPickerInputsPropertyKeys.WeekCacheSize](),
|
|
182
196
|
});
|
|
183
197
|
}
|
|
184
198
|
catch (_) {
|
|
185
|
-
this.configErrors.push(error("configuration-error", this[WklyPickerInputsPropertyKeys.WeekOffset]));
|
|
199
|
+
this.configErrors.push(error("configuration-error", this[WklyPickerInputsPropertyKeys.WeekOffset]()));
|
|
186
200
|
this.generator = createWeekGenerator();
|
|
187
201
|
this.effectiveOffset = 0;
|
|
188
202
|
}
|
|
189
203
|
this.setSupportedScrollRange();
|
|
190
204
|
this.effectiveHourCycle =
|
|
191
|
-
this[WklyPickerInputsPropertyKeys.HourCycle] === "h12"
|
|
205
|
+
this[WklyPickerInputsPropertyKeys.HourCycle]() === "h12"
|
|
192
206
|
? "h12"
|
|
193
|
-
: this[WklyPickerInputsPropertyKeys.HourCycle] === "locale"
|
|
207
|
+
: this[WklyPickerInputsPropertyKeys.HourCycle]() === "locale"
|
|
194
208
|
? new Intl.DateTimeFormat(this.effectiveLocale, {
|
|
195
209
|
hour: "numeric",
|
|
196
210
|
timeZone: "UTC",
|
|
@@ -270,22 +284,22 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
270
284
|
this.generator.clearCache();
|
|
271
285
|
}
|
|
272
286
|
t(key) {
|
|
273
|
-
return resolveWklyTranslation(key, this.effectiveLocale, this[WklyPickerInputsPropertyKeys.Translations] ||
|
|
287
|
+
return resolveWklyTranslation(key, this.effectiveLocale, this[WklyPickerInputsPropertyKeys.Translations]() ||
|
|
274
288
|
this.defaultTranslations, this.strings);
|
|
275
289
|
}
|
|
276
290
|
get isRange() {
|
|
277
|
-
return this[WklyPickerInputsPropertyKeys.Mode].endsWith("-range");
|
|
291
|
+
return this[WklyPickerInputsPropertyKeys.Mode]().endsWith("-range");
|
|
278
292
|
}
|
|
279
293
|
get hasDate() {
|
|
280
|
-
return !this[WklyPickerInputsPropertyKeys.Mode].startsWith("time");
|
|
294
|
+
return !this[WklyPickerInputsPropertyKeys.Mode]().startsWith("time");
|
|
281
295
|
}
|
|
282
296
|
get hasTime() {
|
|
283
|
-
return (this[WklyPickerInputsPropertyKeys.Mode] !== "date" &&
|
|
284
|
-
this[WklyPickerInputsPropertyKeys.Mode] !== "date-range");
|
|
297
|
+
return (this[WklyPickerInputsPropertyKeys.Mode]() !== "date" &&
|
|
298
|
+
this[WklyPickerInputsPropertyKeys.Mode]() !== "date-range");
|
|
285
299
|
}
|
|
286
300
|
get submitVisible() {
|
|
287
301
|
return (this.presentation === "transient" &&
|
|
288
|
-
(this[WklyPickerInputsPropertyKeys.Mode] !== "date" ||
|
|
302
|
+
(this[WklyPickerInputsPropertyKeys.Mode]() !== "date" ||
|
|
289
303
|
this.viewMode === "manual"));
|
|
290
304
|
}
|
|
291
305
|
get title() {
|
|
@@ -298,9 +312,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
298
312
|
}
|
|
299
313
|
}
|
|
300
314
|
get canSubmit() {
|
|
301
|
-
return (!this
|
|
302
|
-
!this.errors.length &&
|
|
303
|
-
this.pendingValue !== null);
|
|
315
|
+
return (!this.isDisabled() && !this.errors.length && this.pendingValue !== null);
|
|
304
316
|
}
|
|
305
317
|
blank(day) {
|
|
306
318
|
const safe = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
|
|
@@ -314,7 +326,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
314
326
|
}
|
|
315
327
|
load(value) {
|
|
316
328
|
this.drafts = [this.blank(this.focused), this.blank(this.focused)];
|
|
317
|
-
const validation = validateSelection(value, this, this.adapter);
|
|
329
|
+
const validation = validateSelection(value, unwrapWklyPickerSignalInputs(this), this.adapter);
|
|
318
330
|
if (value !== null && !validation.length) {
|
|
319
331
|
const values = typeof value === "string" ? [value] : value;
|
|
320
332
|
values.forEach((v, i) => {
|
|
@@ -340,7 +352,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
340
352
|
this.check();
|
|
341
353
|
}
|
|
342
354
|
writeValue(value) {
|
|
343
|
-
this
|
|
355
|
+
this.formValue.set(value);
|
|
344
356
|
if (this.initialized) {
|
|
345
357
|
this.load(value);
|
|
346
358
|
this.position(this.focused, true);
|
|
@@ -353,7 +365,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
353
365
|
this.onTouched = fn;
|
|
354
366
|
}
|
|
355
367
|
setDisabledState(disabled) {
|
|
356
|
-
this
|
|
368
|
+
this.formDisabled.set(disabled);
|
|
357
369
|
}
|
|
358
370
|
validate(_control) {
|
|
359
371
|
return this.errors.length ? { wkly: this.errors } : null;
|
|
@@ -377,13 +389,13 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
377
389
|
drafts: this.drafts,
|
|
378
390
|
configErrors: this.configErrors,
|
|
379
391
|
adapter: this.adapter,
|
|
380
|
-
selection: this,
|
|
381
|
-
mode: this[WklyPickerInputsPropertyKeys.Mode],
|
|
392
|
+
selection: unwrapWklyPickerSignalInputs(this),
|
|
393
|
+
mode: this[WklyPickerInputsPropertyKeys.Mode](),
|
|
382
394
|
isRange: this.isRange,
|
|
383
395
|
hasDate: this.hasDate,
|
|
384
396
|
hasTime: this.hasTime,
|
|
385
|
-
showSeconds: this[WklyPickerInputsPropertyKeys.ShowSeconds],
|
|
386
|
-
required: this[WklyPickerInputsPropertyKeys.Required],
|
|
397
|
+
showSeconds: this[WklyPickerInputsPropertyKeys.ShowSeconds](),
|
|
398
|
+
required: this[WklyPickerInputsPropertyKeys.Required](),
|
|
387
399
|
});
|
|
388
400
|
this.pendingValue = result.pendingValue;
|
|
389
401
|
this.report(result.errors);
|
|
@@ -411,7 +423,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
411
423
|
}
|
|
412
424
|
}
|
|
413
425
|
finish() {
|
|
414
|
-
if (this
|
|
426
|
+
if (this.isDisabled())
|
|
415
427
|
return;
|
|
416
428
|
this.orderDrafts();
|
|
417
429
|
if (this.viewMode === "manual" && this.hasDate)
|
|
@@ -424,9 +436,8 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
424
436
|
if (!this.canSubmit)
|
|
425
437
|
return;
|
|
426
438
|
const next = this.pendingValue;
|
|
427
|
-
if (JSON.stringify(next) !==
|
|
428
|
-
|
|
429
|
-
this[WklyPickerInputsPropertyKeys.Value] = next;
|
|
439
|
+
if (JSON.stringify(next) !== JSON.stringify(this.currentValue())) {
|
|
440
|
+
this.formValue.set(next);
|
|
430
441
|
this.emittedValue = JSON.stringify(next);
|
|
431
442
|
this.onChange(next);
|
|
432
443
|
this[WklyPickerOutputsPropertyKeys.ValueChange].emit(next);
|
|
@@ -442,14 +453,14 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
442
453
|
this[WklyPickerOutputsPropertyKeys.Closed].emit(reason);
|
|
443
454
|
}
|
|
444
455
|
cancel(reason = "close-button") {
|
|
445
|
-
if (this
|
|
456
|
+
if (this.isDisabled())
|
|
446
457
|
return;
|
|
447
|
-
this.load(this
|
|
458
|
+
this.load(this.currentValue());
|
|
448
459
|
this.onTouched();
|
|
449
460
|
this[WklyPickerOutputsPropertyKeys.Closed].emit(reason);
|
|
450
461
|
}
|
|
451
462
|
now() {
|
|
452
|
-
if (this
|
|
463
|
+
if (this.isDisabled())
|
|
453
464
|
return;
|
|
454
465
|
const n = this.clock.now();
|
|
455
466
|
const day = Math.floor(n.getTime() / 86400000);
|
|
@@ -471,9 +482,10 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
471
482
|
return {
|
|
472
483
|
...this.blank(day),
|
|
473
484
|
hour: now.getUTCHours(),
|
|
474
|
-
minute: Math.floor(now.getUTCMinutes() / this[WklyPickerInputsPropertyKeys.MinuteStep]) * this[WklyPickerInputsPropertyKeys.MinuteStep],
|
|
475
|
-
second: this[WklyPickerInputsPropertyKeys.ShowSeconds]
|
|
476
|
-
? Math.floor(now.getUTCSeconds() /
|
|
485
|
+
minute: Math.floor(now.getUTCMinutes() / this[WklyPickerInputsPropertyKeys.MinuteStep]()) * this[WklyPickerInputsPropertyKeys.MinuteStep](),
|
|
486
|
+
second: this[WklyPickerInputsPropertyKeys.ShowSeconds]()
|
|
487
|
+
? Math.floor(now.getUTCSeconds() /
|
|
488
|
+
this[WklyPickerInputsPropertyKeys.SecondStep]()) * this[WklyPickerInputsPropertyKeys.SecondStep]()
|
|
477
489
|
: 0,
|
|
478
490
|
};
|
|
479
491
|
}
|
|
@@ -484,10 +496,10 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
484
496
|
return;
|
|
485
497
|
let seed = this.drafts.find((draft) => draft.present);
|
|
486
498
|
if (!seed) {
|
|
487
|
-
if (this
|
|
499
|
+
if (this.currentValue() !== null)
|
|
488
500
|
return;
|
|
489
501
|
const now = this.clock.now();
|
|
490
|
-
const initialEpochDay = this[WklyPickerInputsPropertyKeys.InitialEpochDay];
|
|
502
|
+
const initialEpochDay = this[WklyPickerInputsPropertyKeys.InitialEpochDay]();
|
|
491
503
|
const day = initialEpochDay === null
|
|
492
504
|
? this.defaults.initialEpochDay === undefined
|
|
493
505
|
? Math.floor(now.getTime() / 86400000)
|
|
@@ -503,7 +515,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
503
515
|
this.changeDetector.markForCheck();
|
|
504
516
|
}
|
|
505
517
|
toggleView() {
|
|
506
|
-
if (this
|
|
518
|
+
if (this.isDisabled() || !this.hasDate)
|
|
507
519
|
return;
|
|
508
520
|
this.viewMode = this.viewMode === "calendar" ? "manual" : "calendar";
|
|
509
521
|
if (this.viewMode === "manual")
|
|
@@ -573,19 +585,19 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
573
585
|
}
|
|
574
586
|
}
|
|
575
587
|
toggleEndView(view) {
|
|
576
|
-
if (this
|
|
588
|
+
if (this.isDisabled())
|
|
577
589
|
return;
|
|
578
590
|
this.endView = view;
|
|
579
591
|
}
|
|
580
592
|
days(value) {
|
|
581
|
-
if (this
|
|
593
|
+
if (this.isDisabled())
|
|
582
594
|
return;
|
|
583
595
|
this.manualDateEndpoint = 1;
|
|
584
596
|
setDraftDayDifference(this.drafts, this.adapter, value);
|
|
585
597
|
this.check();
|
|
586
598
|
}
|
|
587
599
|
field(index, field, value) {
|
|
588
|
-
if (this
|
|
600
|
+
if (this.isDisabled())
|
|
589
601
|
return;
|
|
590
602
|
const draft = this.drafts[index];
|
|
591
603
|
draft.present = true;
|
|
@@ -633,7 +645,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
633
645
|
: draft.hour;
|
|
634
646
|
}
|
|
635
647
|
period(index, period) {
|
|
636
|
-
if (this
|
|
648
|
+
if (this.isDisabled())
|
|
637
649
|
return;
|
|
638
650
|
if (period === "24")
|
|
639
651
|
this.effectiveHourCycle = "h24";
|
|
@@ -671,10 +683,10 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
671
683
|
return true;
|
|
672
684
|
try {
|
|
673
685
|
const date = this.adapter.epochDayToDate(day);
|
|
674
|
-
const isDateDisabled = this[WklyPickerInputsPropertyKeys.IsDateDisabled];
|
|
686
|
+
const isDateDisabled = this[WklyPickerInputsPropertyKeys.IsDateDisabled]();
|
|
675
687
|
if (isDateDisabled &&
|
|
676
688
|
isDateDisabled(day, {
|
|
677
|
-
mode: this[WklyPickerInputsPropertyKeys.Mode],
|
|
689
|
+
mode: this[WklyPickerInputsPropertyKeys.Mode](),
|
|
678
690
|
endpoint: this.isRange
|
|
679
691
|
? this.drafts[0]?.present && !this.drafts[1]?.present
|
|
680
692
|
? "end"
|
|
@@ -683,8 +695,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
683
695
|
calendarDate: date,
|
|
684
696
|
}))
|
|
685
697
|
return true;
|
|
686
|
-
const min = this[WklyPickerInputsPropertyKeys.Min];
|
|
687
|
-
const max = this[WklyPickerInputsPropertyKeys.Max];
|
|
698
|
+
const min = this[WklyPickerInputsPropertyKeys.Min](), max = this[WklyPickerInputsPropertyKeys.Max]();
|
|
688
699
|
if (min && day < decodeIso(min).epochDay)
|
|
689
700
|
return true;
|
|
690
701
|
if (max && day > decodeIso(max).epochDay)
|
|
@@ -696,7 +707,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
696
707
|
}
|
|
697
708
|
}
|
|
698
709
|
select(day) {
|
|
699
|
-
if (this
|
|
710
|
+
if (this.isDisabled() || this.dayDisabled(day))
|
|
700
711
|
return;
|
|
701
712
|
this.focused = day;
|
|
702
713
|
const index = this.isRange && this.drafts[0].present && !this.drafts[1].present ? 1 : 0;
|
|
@@ -709,7 +720,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
709
720
|
this.renderRows();
|
|
710
721
|
this.finish();
|
|
711
722
|
if (this.presentation === "transient" &&
|
|
712
|
-
this[WklyPickerInputsPropertyKeys.Mode] === "date" &&
|
|
723
|
+
this[WklyPickerInputsPropertyKeys.Mode]() === "date" &&
|
|
713
724
|
this.viewMode === "calendar")
|
|
714
725
|
this.submit("auto-submit");
|
|
715
726
|
}
|
|
@@ -741,7 +752,7 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
741
752
|
position(day, preset = false, options = {}) {
|
|
742
753
|
day = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
|
|
743
754
|
this.anchorWeek = absoluteWeekOf(day, this.effectiveOffset);
|
|
744
|
-
const viewportPreset = this[WklyPickerInputsPropertyKeys.ViewportPreset];
|
|
755
|
+
const viewportPreset = this[WklyPickerInputsPropertyKeys.ViewportPreset]();
|
|
745
756
|
this.clipMonth = preset && viewportPreset.kind === "full-month";
|
|
746
757
|
if (preset && viewportPreset.kind !== "weeks") {
|
|
747
758
|
const d = this.adapter.epochDayToDate(day);
|
|
@@ -841,12 +852,12 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
841
852
|
return this.clampFirstWeek(this.firstWeek + delta) !== this.firstWeek;
|
|
842
853
|
}
|
|
843
854
|
moveWeek(delta) {
|
|
844
|
-
if (!this
|
|
855
|
+
if (!this.isDisabled())
|
|
845
856
|
this.showFirstWeek(this.firstWeek + delta);
|
|
846
857
|
}
|
|
847
858
|
renderRows() {
|
|
848
859
|
// Keep the virtual scroll offset here; row data is shared across Angular versions.
|
|
849
|
-
const overscan = Math.max(0, Math.min(50, this[WklyPickerInputsPropertyKeys.OverscanWeeks] || 0));
|
|
860
|
+
const overscan = Math.max(0, Math.min(50, this[WklyPickerInputsPropertyKeys.OverscanWeeks]() || 0));
|
|
850
861
|
const start = this.firstWeek - overscan;
|
|
851
862
|
this.paddingTop = (start - this.baseWeek) * this.rowHeight;
|
|
852
863
|
this.rows = createWeekRows({
|
|
@@ -859,8 +870,8 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
859
870
|
lastSupportedDay: this.lastSupportedDay,
|
|
860
871
|
clipMonth: this.clipMonth,
|
|
861
872
|
initialMonth: this.initialMonth,
|
|
862
|
-
weekLabelMode: this[WklyPickerInputsPropertyKeys.WeekLabelMode],
|
|
863
|
-
weekLabelFormatter: this[WklyPickerInputsPropertyKeys.WeekLabelFormatter] || null,
|
|
873
|
+
weekLabelMode: this[WklyPickerInputsPropertyKeys.WeekLabelMode](),
|
|
874
|
+
weekLabelFormatter: this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]() || null,
|
|
864
875
|
isDayDisabled: (day) => this.dayDisabled(day),
|
|
865
876
|
});
|
|
866
877
|
this[WklyPickerOutputsPropertyKeys.ViewportChange].emit({
|
|
@@ -914,8 +925,8 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
914
925
|
(day || fallback)?.focus({ preventScroll: true });
|
|
915
926
|
});
|
|
916
927
|
}
|
|
917
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
918
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
928
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WklyDateTimePickerComponent, deps: [{ token: LOCALE_ID }, { token: WKLY_CONFIG }, { token: WKLY_CLOCK }, { token: WKLY_LOCALIZATION }, { token: WKLY_TRANSLATIONS }, { token: PLATFORM_ID }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
929
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: WklyDateTimePickerComponent, selector: "wkly-datetime-picker", providers: [
|
|
919
930
|
{
|
|
920
931
|
provide: NG_VALUE_ACCESSOR,
|
|
921
932
|
useExisting: forwardRef(() => WklyDateTimePickerComponent),
|
|
@@ -926,11 +937,11 @@ export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
|
926
937
|
useExisting: forwardRef(() => WklyDateTimePickerComponent),
|
|
927
938
|
multi: true,
|
|
928
939
|
},
|
|
929
|
-
], viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section\n class=\"wkly\"\n [attr.dir]=\"direction\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel] || 'Date and time picker'\n \"\n [attr.aria-describedby]=\"this[WklyPickerInputsPropertyKeys.AriaDescribedBy]\"\n (focusout)=\"touched()\"\n>\n <header class=\"toolbar\">\n <button\n *ngIf=\"hasDate\"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"t(viewMode === 'calendar' ? 'manual' : 'calendar')\"\n (click)=\"toggleView()\"\n >\n {{ viewMode === \"calendar\" ? \"\u2637\" : \"\u25A6\" }}\n </button>\n <span *ngIf=\"hasDate\" class=\"year-control\">{{ title }}</span>\n <span class=\"spacer\"></span\n ><button\n type=\"button\"\n class=\"now\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n (click)=\"now()\"\n >\n {{ t(\"now\") }}\n </button>\n <button\n *ngIf=\"presentation === 'transient'\"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"t('close')\"\n (click)=\"cancel()\"\n >\n \u00D7\n </button>\n </header>\n <ng-container *ngIf=\"hasDate && viewMode === 'calendar'\">\n <div\n role=\"grid\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel] || 'Calendar'\n \"\n [attr.aria-multiselectable]=\"isRange\"\n >\n <div\n role=\"row\"\n class=\"week-head\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] === 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] !== 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n role=\"columnheader\"\n aria-label=\"Week\"\n ></span\n ><span *ngFor=\"let day of weekdays\" role=\"columnheader\">{{ day }}</span>\n </div>\n <div\n #scroller\n class=\"week-scroll\"\n [style.height.px]=\"visibleCount * rowHeight\"\n (scroll)=\"scroll($event)\"\n (scrollend)=\"snapWeek()\"\n >\n <div [style.height.px]=\"scrollHeight\" class=\"scroll-space\">\n <div class=\"rows\" [style.top.px]=\"paddingTop\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n role=\"row\"\n class=\"week-row\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] !==\n 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n role=\"rowheader\"\n class=\"week-number\"\n >{{ row.label }}</span\n >\n <div\n *ngFor=\"\n let cell of row.cells;\n let dayIndex = index;\n trackBy: trackCell\n \"\n role=\"gridcell\"\n [attr.data-weekday-index]=\"dayIndex\"\n [attr.aria-colindex]=\"\n dayIndex +\n (compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n ? 1\n : 2)\n \"\n [attr.aria-selected]=\"selected(cell.epochDay)\"\n [attr.aria-disabled]=\"\n cell.disabled || this[WklyPickerInputsPropertyKeys.Disabled]\n \"\n [class.range]=\"inRange(cell.epochDay)\"\n [class.hidden]=\"cell.hidden\"\n [class.odd-month]=\"cell.date && cell.date.month % 2 === 1\"\n >\n <span [class]=\"'annotation annotation--' + dayIndex\">{{\n cell.annotation\n }}</span>\n <button\n type=\"button\"\n class=\"day\"\n [attr.data-day]=\"cell.epochDay\"\n [attr.aria-label]=\"cell.accessible\"\n [attr.aria-current]=\"cell.epochDay === today ? 'date' : null\"\n [attr.aria-disabled]=\"\n cell.disabled || this[WklyPickerInputsPropertyKeys.Disabled]\n \"\n [attr.tabindex]=\"\n !cell.hidden && cell.epochDay === focused ? 0 : -1\n \"\n [class.selected]=\"selected(cell.epochDay)\"\n [class.today]=\"cell.epochDay === today\"\n (focus)=\"focused = cell.epochDay\"\n (click)=\"select(cell.epochDay)\"\n (keydown)=\"key($event, cell.epochDay)\"\n >\n {{ cell.label }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"week-navigation\">\n <button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] || !canMoveWeek(-1)\n \"\n [attr.aria-label]=\"t('previous')\"\n (click)=\"moveWeek(-1)\"\n >\n \u2191</button\n ><span>{{ title }}</span\n ><button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] || !canMoveWeek(1)\n \"\n [attr.aria-label]=\"t('next')\"\n (click)=\"moveWeek(1)\"\n >\n \u2193\n </button>\n </div>\n </ng-container>\n <ng-container\n *ngFor=\"let draft of drafts; let i = index; trackBy: trackDraft\"\n >\n <fieldset\n *ngIf=\"(i === 0 || isRange) && (hasTime || viewMode === 'manual')\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"isRange ? t(i === 0 ? 'start' : 'end') : null\"\n >\n <legend *ngIf=\"isRange\">\n <ng-container\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual';\n else endpointLabel\n \"\n >\n <span class=\"end-view-toggle\">\n <button\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"endView === 'date'\"\n (click)=\"toggleEndView('date')\"\n >\n {{ t(\"end\") }}\n </button>\n <button\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"endView === 'days'\"\n (click)=\"toggleEndView('days')\"\n >\n {{ inDaysLabel }}\n </button>\n </span>\n </ng-container>\n <ng-template #endpointLabel>{{\n t(i === 0 ? \"start\" : \"end\")\n }}</ng-template>\n </legend>\n <div\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual' && endView === 'days'\n \"\n class=\"date-fields in-days-fields\"\n >\n <span class=\"resulting-end-date\" [attr.aria-label]=\"t('endDate')\">{{\n resultingEndDate\n }}</span>\n <wkly-field\n [label]=\"t('days')\"\n [hideLabel]=\"true\"\n [previousLabel]=\"t('daysPrevious')\"\n [nextLabel]=\"t('daysNext')\"\n [locale]=\"effectiveLocale\"\n [value]=\"inDays\"\n [min]=\"-9999\"\n [max]=\"9999\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"days($event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"\n hasDate && viewMode === 'manual' && (i === 0 || endView === 'date')\n \"\n class=\"date-fields\"\n >\n <wkly-field\n [label]=\"t('day')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.day\"\n [min]=\"1\"\n [max]=\"31\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'day', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('month')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.month\"\n [min]=\"1\"\n [max]=\"monthCount(draft)\"\n [labels]=\"months(draft)\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'month', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('year')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.year\"\n [min]=\"adapter.supportedYearRange[0]\"\n [max]=\"adapter.supportedYearRange[1]\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'year', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"hasTime\"\n class=\"time-fields\"\n [class.seconds]=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]\"\n >\n <wkly-field\n [label]=\"t('hour')\"\n [locale]=\"effectiveLocale\"\n [value]=\"displayHour(draft)\"\n [min]=\"effectiveHourCycle === 'h12' ? 1 : 0\"\n [max]=\"effectiveHourCycle === 'h12' ? 12 : 23\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'hour', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('minute')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.minute\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.MinuteStep] > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.MinuteStep] === 0\n ? this[WklyPickerInputsPropertyKeys.MinuteStep]\n : 1\n \"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'minute', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n *ngIf=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]\"\n [label]=\"t('second')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.second\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.SecondStep] > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.SecondStep] === 0\n ? this[WklyPickerInputsPropertyKeys.SecondStep]\n : 1\n \"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'second', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <div class=\"period\">\n <button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle] === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) < 12\n \"\n (click)=\"period(i, 'am')\"\n >\n {{ t(\"am\") }}</button\n ><button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] ||\n this[WklyPickerInputsPropertyKeys.HourCycle] !== 'switchable'\n \"\n [attr.aria-pressed]=\"effectiveHourCycle === 'h24'\"\n (click)=\"period(i, '24')\"\n >\n 24</button\n ><button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle] === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) >= 12\n \"\n (click)=\"period(i, 'pm')\"\n >\n {{ t(\"pm\") }}\n </button>\n </div>\n </div>\n </fieldset>\n </ng-container>\n <div class=\"validation\" role=\"status\" aria-live=\"polite\">\n <p *ngFor=\"let err of errors\">! {{ t(err.messageKey) }}</p>\n </div>\n <footer *ngIf=\"submitVisible\">\n <button\n type=\"button\"\n class=\"confirm\"\n [disabled]=\"!canSubmit\"\n (click)=\"submit()\"\n >\n {{ t(\"confirm\") }}\n </button>\n </footer>\n</section>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;--wkly-background-color: #fff;--wkly-background-color-alternate: #fafafa;--wkly-text-color: #192c28;--wkly-muted-color: #52635e;--wkly-border-color: #dce5e1;--wkly-accent-color: #176c55;--wkly-accent-color-alternate: #6ea494;--wkly-accent-text-color: #fff;--wkly-range-color: #e5f1ee;--wkly-error-color: #b42318;--wkly-focus-color: #245bd6;--wkly-size-multiplier: 1;--wkly-size-unit: 3.5em;color:var(--wkly-text-color);font:14px/1.4 system-ui,sans-serif;container-type:inline-size}.wkly{background:var(--wkly-background-color);border:1px solid var(--wkly-border-color);border-radius:14px;overflow:hidden;min-width:0;font-size:calc(14px*clamp(1,var(--wkly-size-multiplier),1.5))}button{font:inherit;color:inherit;min-width:var(--wkly-size-unit);min-height:var(--wkly-size-unit);border:0;background:transparent;border-radius:8px;cursor:pointer}button:hover:not(:disabled):not([aria-disabled=true]){background:var(--wkly-accent-color-alternate)}button:disabled,button[aria-disabled=true]{opacity:.4;cursor:default}button:focus-visible{outline:2px solid var(--wkly-focus-color);outline-offset:-2px}.toolbar{display:flex;align-items:center;padding:8px;gap:3px;border-bottom:1px solid var(--wkly-border-color)}.spacer{flex:1}.year-control{padding:0 6px;font-weight:650;text-align:start;line-height:1.2}.now{color:var(--wkly-accent-color);font-weight:650}.week-head,.week-row{display:grid;grid-template-columns:28px repeat(7,minmax(0,1fr))}.week-head{font-size:.85em;color:var(--wkly-muted-color);height:34px;align-items:center;text-align:center}.week-row{height:calc(var(--wkly-size-unit) * clamp(1,var(--wkly-size-multiplier),1));align-items:end}.no-label{grid-template-columns:repeat(7,minmax(0,1fr))}.week-scroll{overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;overflow-anchor:none;scrollbar-width:thin;max-height:65vh;touch-action:pan-y}.scroll-space{position:relative}.rows{position:absolute;left:0;right:0}.week-number{font-size:.85em;text-align:center;align-self:end;line-height:var(--wkly-size-unit);color:var(--wkly-muted-color)}[role=gridcell]{position:relative;min-width:0;height:var(--wkly-size-unit);text-align:center}[role=gridcell].odd-month:not(.range):not(.today){background:var(--wkly-background-color-alternate)}.day{width:100%;min-width:0;height:var(--wkly-size-unit);padding:0;border-radius:8px}.annotation{position:absolute;bottom:.25em;white-space:nowrap;font-size:1.25em;font-weight:650;line-height:1;pointer-events:none;z-index:1;color:var(--wkly-muted-color);color:color-mix(in srgb,var(--wkly-muted-color) 50%,transparent);text-shadow:0 0 2px --wkly-background-color,0 0 4px --wkly-background-color}.odd-month .annotation{text-shadow:0 0 2px --wkly-background-color-alternate,0 0 4px --wkly-background-color-alternate}.annotation:empty{display:none}.annotation--0{inset-inline-start:10%;bottom:1.75em}.annotation--1{inset-inline-start:-5%}.annotation--2{inset-inline-start:-20%}.annotation--3{inset-inline-start:-50%;inset-inline-end:-50%}.annotation--4{inset-inline-end:-20%}.annotation--5{inset-inline-end:-5%}.annotation--6{inset-inline-end:10%}.range{background:var(--wkly-range-color)}.day.selected{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);font-weight:700}.today:after{content:\"\";display:block;width:5px;height:5px;background:currentColor;border-radius:50%;position:absolute;bottom:2px;left:calc(50% - 2px)}.today{font-weight:750;box-shadow:inset 0 0 0 1px var(--wkly-accent-color)}.hidden{visibility:hidden}.week-navigation{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--wkly-border-color);font-size:.85em;color:var(--wkly-muted-color)}fieldset{border:0;padding:0 12px;margin:0;min-width:0}legend{padding-top:.85em;font-weight:650;color:var(--wkly-accent-color)}.date-fields{display:grid;grid-template-columns:1fr 2fr 1.4fr;gap:7px;padding:12px 0}.end-view-toggle{display:inline-flex}.end-view-toggle button{min-height:0;min-width:0;padding:0 6px;border-radius:0;line-height:inherit}.end-view-toggle button:first-child{padding-inline-start:0}.end-view-toggle button+button{border-inline-start:1px solid var(--wkly-text-color)}.end-view-toggle button[aria-pressed=false]{color:var(--wkly-muted-color);font-weight:400}.in-days-fields{grid-template-columns:minmax(0,1fr);gap:0;text-align:center}.resulting-end-date{font-size:11px;color:var(--wkly-muted-color);height:1.4em;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time-fields{display:grid;grid-template-columns:1fr 1fr 52px;gap:8px;padding:14px 0;border-top:1px solid var(--wkly-border-color)}.time-fields.seconds{grid-template-columns:1fr 1fr 1fr 48px}.period{display:flex;flex-direction:column;justify-content:center;gap:2px;padding-top:1.25em}.period button{font-size:.85em}.period [aria-pressed=true]{background:var(--wkly-range-color);box-shadow:inset 0 0 0 1px var(--wkly-accent-color);font-weight:700}.validation{color:var(--wkly-error-color);font-size:.85em}.validation p{margin:.5em .85em}footer{padding:12px;border-top:1px solid var(--wkly-border-color)}.confirm{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);width:100%;font-weight:650}.confirm:hover:not(:disabled){background:var(--wkly-accent-color-alternate)}@media (forced-colors: active){.day.selected{outline:2px solid Highlight}.range{border-bottom:2px solid Highlight}.today{outline:1px dashed CanvasText}}@media (prefers-reduced-motion: reduce){*{scroll-behavior:auto!important;animation:none!important}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.WklyFieldComponent, selector: "wkly-field", inputs: ["value", "label", "hideLabel", "previousLabel", "nextLabel", "min", "max", "step", "locale", "disabled", "invalid", "labels"], outputs: ["valueChange", "complete"] }] });
|
|
940
|
+
], viewQueries: [{ propertyName: "scroller", first: true, predicate: ["scroller"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<section\n class=\"wkly\"\n [attr.dir]=\"direction\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel]() || 'Date and time picker'\n \"\n [attr.aria-describedby]=\"this[WklyPickerInputsPropertyKeys.AriaDescribedBy]()\"\n (focusout)=\"touched()\"\n>\n <header class=\"toolbar\">\n @if (hasDate) {\n <button\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"t(viewMode === 'calendar' ? 'manual' : 'calendar')\"\n (click)=\"toggleView()\"\n >\n {{ viewMode === \"calendar\" ? \"\u2637\" : \"\u25A6\" }}\n </button>\n }\n @if (hasDate) {\n <span class=\"year-control\">{{ title }}</span>\n }\n <span class=\"spacer\"></span\n ><button\n type=\"button\"\n class=\"now\"\n [disabled]=\"isDisabled()\"\n (click)=\"now()\"\n >\n {{ t(\"now\") }}\n </button>\n @if (presentation === \"transient\") {\n <button\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"t('close')\"\n (click)=\"cancel()\"\n >\n \u00D7\n </button>\n }\n </header>\n <ng-container *ngIf=\"hasDate && viewMode === 'calendar'\">\n <div\n role=\"grid\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel]() || 'Calendar'\n \"\n [attr.aria-multiselectable]=\"isRange\"\n >\n <div\n role=\"row\"\n class=\"week-head\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode]() === 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]())\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode]() !== 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]())\n \"\n role=\"columnheader\"\n aria-label=\"Week\"\n ></span>\n @for (day of weekdays; track $index) {\n <span role=\"columnheader\">{{ day }}</span>\n }\n </div>\n <div\n #scroller\n class=\"week-scroll\"\n [style.height.px]=\"visibleCount * rowHeight\"\n (scroll)=\"scroll($event)\"\n (scrollend)=\"snapWeek()\"\n >\n <div [style.height.px]=\"scrollHeight\" class=\"scroll-space\">\n <div class=\"rows\" [style.top.px]=\"paddingTop\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n role=\"row\"\n class=\"week-row\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode]() ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]())\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode]() !==\n 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]())\n \"\n role=\"rowheader\"\n class=\"week-number\"\n >{{ row.label }}</span\n >\n <div\n *ngFor=\"\n let cell of row.cells;\n let dayIndex = index;\n trackBy: trackCell\n \"\n role=\"gridcell\"\n [attr.data-weekday-index]=\"dayIndex\"\n [attr.aria-colindex]=\"\n dayIndex +\n (compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode]() ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]())\n ? 1\n : 2)\n \"\n [attr.aria-selected]=\"selected(cell.epochDay)\"\n [attr.aria-disabled]=\"cell.disabled || isDisabled()\"\n [class.range]=\"inRange(cell.epochDay)\"\n [class.hidden]=\"cell.hidden\"\n [class.odd-month]=\"cell.date && cell.date.month % 2 === 1\"\n >\n <span [class]=\"'annotation annotation--' + dayIndex\">{{\n cell.annotation\n }}</span>\n <button\n type=\"button\"\n class=\"day\"\n [attr.data-day]=\"cell.epochDay\"\n [attr.aria-label]=\"cell.accessible\"\n [attr.aria-current]=\"cell.epochDay === today ? 'date' : null\"\n [attr.aria-disabled]=\"cell.disabled || isDisabled()\"\n [attr.tabindex]=\"\n !cell.hidden && cell.epochDay === focused ? 0 : -1\n \"\n [class.selected]=\"selected(cell.epochDay)\"\n [class.today]=\"cell.epochDay === today\"\n (focus)=\"focused = cell.epochDay\"\n (click)=\"select(cell.epochDay)\"\n (keydown)=\"key($event, cell.epochDay)\"\n >\n {{ cell.label }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"week-navigation\">\n <button\n type=\"button\"\n [disabled]=\"isDisabled() || !canMoveWeek(-1)\"\n [attr.aria-label]=\"t('previous')\"\n (click)=\"moveWeek(-1)\"\n >\n \u2191</button\n ><span>{{ title }}</span\n ><button\n type=\"button\"\n [disabled]=\"isDisabled() || !canMoveWeek(1)\"\n [attr.aria-label]=\"t('next')\"\n (click)=\"moveWeek(1)\"\n >\n \u2193\n </button>\n </div>\n </ng-container>\n <ng-container\n *ngFor=\"let draft of drafts; let i = index; trackBy: trackDraft\"\n >\n <fieldset\n *ngIf=\"(i === 0 || isRange) && (hasTime || viewMode === 'manual')\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"isRange ? t(i === 0 ? 'start' : 'end') : null\"\n >\n <legend *ngIf=\"isRange\">\n <ng-container\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual';\n else endpointLabel\n \"\n >\n <span class=\"end-view-toggle\">\n <button\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-pressed]=\"endView === 'date'\"\n (click)=\"toggleEndView('date')\"\n >\n {{ t(\"end\") }}\n </button>\n <button\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-pressed]=\"endView === 'days'\"\n (click)=\"toggleEndView('days')\"\n >\n {{ inDaysLabel }}\n </button>\n </span>\n </ng-container>\n <ng-template #endpointLabel>{{\n t(i === 0 ? \"start\" : \"end\")\n }}</ng-template>\n </legend>\n <div\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual' && endView === 'days'\n \"\n class=\"date-fields in-days-fields\"\n >\n <span class=\"resulting-end-date\" [attr.aria-label]=\"t('endDate')\">{{\n resultingEndDate\n }}</span>\n <wkly-field\n [label]=\"t('days')\"\n [hideLabel]=\"true\"\n [previousLabel]=\"t('daysPrevious')\"\n [nextLabel]=\"t('daysNext')\"\n [locale]=\"effectiveLocale\"\n [value]=\"inDays\"\n [min]=\"-9999\"\n [max]=\"9999\"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"days($event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"\n hasDate && viewMode === 'manual' && (i === 0 || endView === 'date')\n \"\n class=\"date-fields\"\n >\n <wkly-field\n [label]=\"t('day')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.day\"\n [min]=\"1\"\n [max]=\"31\"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'day', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('month')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.month\"\n [min]=\"1\"\n [max]=\"monthCount(draft)\"\n [labels]=\"months(draft)\"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'month', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('year')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.year\"\n [min]=\"adapter.supportedYearRange[0]\"\n [max]=\"adapter.supportedYearRange[1]\"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'year', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"hasTime\"\n class=\"time-fields\"\n [class.seconds]=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]()\"\n >\n <wkly-field\n [label]=\"t('hour')\"\n [locale]=\"effectiveLocale\"\n [value]=\"displayHour(draft)\"\n [min]=\"effectiveHourCycle === 'h12' ? 1 : 0\"\n [max]=\"effectiveHourCycle === 'h12' ? 12 : 23\"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'hour', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('minute')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.minute\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.MinuteStep]() > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.MinuteStep]() === 0\n ? this[WklyPickerInputsPropertyKeys.MinuteStep]()\n : 1\n \"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'minute', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n *ngIf=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]()\"\n [label]=\"t('second')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.second\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.SecondStep]() > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.SecondStep]() === 0\n ? this[WklyPickerInputsPropertyKeys.SecondStep]()\n : 1\n \"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'second', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <div class=\"period\">\n <button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle]() === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) < 12\n \"\n (click)=\"period(i, 'am')\"\n >\n {{ t(\"am\") }}</button\n ><button\n type=\"button\"\n [disabled]=\"\n isDisabled() ||\n this[WklyPickerInputsPropertyKeys.HourCycle]() !== 'switchable'\n \"\n [attr.aria-pressed]=\"effectiveHourCycle === 'h24'\"\n (click)=\"period(i, '24')\"\n >\n 24</button\n ><button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle]() === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) >= 12\n \"\n (click)=\"period(i, 'pm')\"\n >\n {{ t(\"pm\") }}\n </button>\n </div>\n </div>\n </fieldset>\n </ng-container>\n <div class=\"validation\" role=\"status\" aria-live=\"polite\">\n <p *ngFor=\"let err of errors\">! {{ t(err.messageKey) }}</p>\n </div>\n <footer *ngIf=\"submitVisible\">\n <button\n type=\"button\"\n class=\"confirm\"\n [disabled]=\"!canSubmit\"\n (click)=\"submit()\"\n >\n {{ t(\"confirm\") }}\n </button>\n </footer>\n</section>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;--wkly-background-color: #fff;--wkly-background-color-alternate: #fafafa;--wkly-text-color: #192c28;--wkly-muted-color: #52635e;--wkly-border-color: #dce5e1;--wkly-accent-color: #176c55;--wkly-accent-color-alternate: #6ea494;--wkly-accent-text-color: #fff;--wkly-range-color: #e5f1ee;--wkly-error-color: #b42318;--wkly-focus-color: #245bd6;--wkly-size-multiplier: 1;--wkly-size-unit: 3.5em;color:var(--wkly-text-color);font:14px/1.4 system-ui,sans-serif;container-type:inline-size}.wkly{background:var(--wkly-background-color);border:1px solid var(--wkly-border-color);border-radius:14px;overflow:hidden;min-width:0;font-size:calc(14px*clamp(1,var(--wkly-size-multiplier),1.5))}button{font:inherit;color:inherit;min-width:var(--wkly-size-unit);min-height:var(--wkly-size-unit);border:0;background:transparent;border-radius:8px;cursor:pointer}button:hover:not(:disabled):not([aria-disabled=true]){background:var(--wkly-accent-color-alternate)}button:disabled,button[aria-disabled=true]{opacity:.4;cursor:default}button:focus-visible{outline:2px solid var(--wkly-focus-color);outline-offset:-2px}.toolbar{display:flex;align-items:center;padding:8px;gap:3px;border-bottom:1px solid var(--wkly-border-color)}.spacer{flex:1}.year-control{padding:0 6px;font-weight:650;text-align:start;line-height:1.2}.now{color:var(--wkly-accent-color);font-weight:650}.week-head,.week-row{display:grid;grid-template-columns:28px repeat(7,minmax(0,1fr))}.week-head{font-size:.85em;color:var(--wkly-muted-color);height:34px;align-items:center;text-align:center}.week-row{height:calc(var(--wkly-size-unit) * clamp(1,var(--wkly-size-multiplier),1));align-items:end}.no-label{grid-template-columns:repeat(7,minmax(0,1fr))}.week-scroll{overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;overflow-anchor:none;scrollbar-width:thin;max-height:65vh;touch-action:pan-y}.scroll-space{position:relative}.rows{position:absolute;left:0;right:0}.week-number{font-size:.85em;text-align:center;align-self:end;line-height:var(--wkly-size-unit);color:var(--wkly-muted-color)}[role=gridcell]{position:relative;min-width:0;height:var(--wkly-size-unit);text-align:center}[role=gridcell].odd-month:not(.range):not(.today){background:var(--wkly-background-color-alternate)}.day{width:100%;min-width:0;height:var(--wkly-size-unit);padding:0;border-radius:8px}.annotation{position:absolute;bottom:.25em;white-space:nowrap;font-size:1.25em;font-weight:650;line-height:1;pointer-events:none;z-index:1;color:var(--wkly-muted-color);color:color-mix(in srgb,var(--wkly-muted-color) 50%,transparent);text-shadow:0 0 2px --wkly-background-color,0 0 4px --wkly-background-color}.odd-month .annotation{text-shadow:0 0 2px --wkly-background-color-alternate,0 0 4px --wkly-background-color-alternate}.annotation:empty{display:none}.annotation--0{inset-inline-start:10%;bottom:1.75em}.annotation--1{inset-inline-start:-5%}.annotation--2{inset-inline-start:-20%}.annotation--3{inset-inline-start:-50%;inset-inline-end:-50%}.annotation--4{inset-inline-end:-20%}.annotation--5{inset-inline-end:-5%}.annotation--6{inset-inline-end:10%}.range{background:var(--wkly-range-color)}.day.selected{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);font-weight:700}.today:after{content:\"\";display:block;width:5px;height:5px;background:currentColor;border-radius:50%;position:absolute;bottom:2px;left:calc(50% - 2px)}.today{font-weight:750;box-shadow:inset 0 0 0 1px var(--wkly-accent-color)}.hidden{visibility:hidden}.week-navigation{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--wkly-border-color);font-size:.85em;color:var(--wkly-muted-color)}fieldset{border:0;padding:0 12px;margin:0;min-width:0}legend{padding-top:.85em;font-weight:650;color:var(--wkly-accent-color)}.date-fields{display:grid;grid-template-columns:1fr 2fr 1.4fr;gap:7px;padding:12px 0}.end-view-toggle{display:inline-flex}.end-view-toggle button{min-height:0;min-width:0;padding:0 6px;border-radius:0;line-height:inherit}.end-view-toggle button:first-child{padding-inline-start:0}.end-view-toggle button+button{border-inline-start:1px solid var(--wkly-text-color)}.end-view-toggle button[aria-pressed=false]{color:var(--wkly-muted-color);font-weight:400}.in-days-fields{grid-template-columns:minmax(0,1fr);gap:0;text-align:center}.resulting-end-date{font-size:11px;color:var(--wkly-muted-color);height:1.4em;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time-fields{display:grid;grid-template-columns:1fr 1fr 52px;gap:8px;padding:14px 0;border-top:1px solid var(--wkly-border-color)}.time-fields.seconds{grid-template-columns:1fr 1fr 1fr 48px}.period{display:flex;flex-direction:column;justify-content:center;gap:2px;padding-top:1.25em}.period button{font-size:.85em}.period [aria-pressed=true]{background:var(--wkly-range-color);box-shadow:inset 0 0 0 1px var(--wkly-accent-color);font-weight:700}.validation{color:var(--wkly-error-color);font-size:.85em}.validation p{margin:.5em .85em}footer{padding:12px;border-top:1px solid var(--wkly-border-color)}.confirm{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);width:100%;font-weight:650}.confirm:hover:not(:disabled){background:var(--wkly-accent-color-alternate)}@media (forced-colors: active){.day.selected{outline:2px solid Highlight}.range{border-bottom:2px solid Highlight}.today{outline:1px dashed CanvasText}}@media (prefers-reduced-motion: reduce){*{scroll-behavior:auto!important;animation:none!important}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.WklyFieldComponent, selector: "wkly-field", inputs: ["value", "label", "hideLabel", "previousLabel", "nextLabel", "min", "max", "step", "locale", "disabled", "invalid", "labels"], outputs: ["valueChange", "complete"] }] });
|
|
930
941
|
}
|
|
931
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
942
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WklyDateTimePickerComponent, decorators: [{
|
|
932
943
|
type: Component,
|
|
933
|
-
args: [{ selector: "wkly-datetime-picker", providers: [
|
|
944
|
+
args: [{ selector: "wkly-datetime-picker", standalone: false, providers: [
|
|
934
945
|
{
|
|
935
946
|
provide: NG_VALUE_ACCESSOR,
|
|
936
947
|
useExisting: forwardRef(() => WklyDateTimePickerComponent),
|
|
@@ -941,8 +952,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
941
952
|
useExisting: forwardRef(() => WklyDateTimePickerComponent),
|
|
942
953
|
multi: true,
|
|
943
954
|
},
|
|
944
|
-
], template: "<section\n class=\"wkly\"\n [attr.dir]=\"direction\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel] || 'Date and time picker'\n \"\n [attr.aria-describedby]=\"this[WklyPickerInputsPropertyKeys.AriaDescribedBy]\"\n (focusout)=\"touched()\"\n>\n <header class=\"toolbar\">\n <button\n *ngIf=\"hasDate\"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"t(viewMode === 'calendar' ? 'manual' : 'calendar')\"\n (click)=\"toggleView()\"\n >\n {{ viewMode === \"calendar\" ? \"\u2637\" : \"\u25A6\" }}\n </button>\n <span *ngIf=\"hasDate\" class=\"year-control\">{{ title }}</span>\n <span class=\"spacer\"></span\n ><button\n type=\"button\"\n class=\"now\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n (click)=\"now()\"\n >\n {{ t(\"now\") }}\n </button>\n <button\n *ngIf=\"presentation === 'transient'\"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"t('close')\"\n (click)=\"cancel()\"\n >\n \u00D7\n </button>\n </header>\n <ng-container *ngIf=\"hasDate && viewMode === 'calendar'\">\n <div\n role=\"grid\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel] || 'Calendar'\n \"\n [attr.aria-multiselectable]=\"isRange\"\n >\n <div\n role=\"row\"\n class=\"week-head\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] === 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] !== 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n role=\"columnheader\"\n aria-label=\"Week\"\n ></span\n ><span *ngFor=\"let day of weekdays\" role=\"columnheader\">{{ day }}</span>\n </div>\n <div\n #scroller\n class=\"week-scroll\"\n [style.height.px]=\"visibleCount * rowHeight\"\n (scroll)=\"scroll($event)\"\n (scrollend)=\"snapWeek()\"\n >\n <div [style.height.px]=\"scrollHeight\" class=\"scroll-space\">\n <div class=\"rows\" [style.top.px]=\"paddingTop\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n role=\"row\"\n class=\"week-row\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] !==\n 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n \"\n role=\"rowheader\"\n class=\"week-number\"\n >{{ row.label }}</span\n >\n <div\n *ngFor=\"\n let cell of row.cells;\n let dayIndex = index;\n trackBy: trackCell\n \"\n role=\"gridcell\"\n [attr.data-weekday-index]=\"dayIndex\"\n [attr.aria-colindex]=\"\n dayIndex +\n (compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode] ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter])\n ? 1\n : 2)\n \"\n [attr.aria-selected]=\"selected(cell.epochDay)\"\n [attr.aria-disabled]=\"\n cell.disabled || this[WklyPickerInputsPropertyKeys.Disabled]\n \"\n [class.range]=\"inRange(cell.epochDay)\"\n [class.hidden]=\"cell.hidden\"\n [class.odd-month]=\"cell.date && cell.date.month % 2 === 1\"\n >\n <span [class]=\"'annotation annotation--' + dayIndex\">{{\n cell.annotation\n }}</span>\n <button\n type=\"button\"\n class=\"day\"\n [attr.data-day]=\"cell.epochDay\"\n [attr.aria-label]=\"cell.accessible\"\n [attr.aria-current]=\"cell.epochDay === today ? 'date' : null\"\n [attr.aria-disabled]=\"\n cell.disabled || this[WklyPickerInputsPropertyKeys.Disabled]\n \"\n [attr.tabindex]=\"\n !cell.hidden && cell.epochDay === focused ? 0 : -1\n \"\n [class.selected]=\"selected(cell.epochDay)\"\n [class.today]=\"cell.epochDay === today\"\n (focus)=\"focused = cell.epochDay\"\n (click)=\"select(cell.epochDay)\"\n (keydown)=\"key($event, cell.epochDay)\"\n >\n {{ cell.label }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"week-navigation\">\n <button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] || !canMoveWeek(-1)\n \"\n [attr.aria-label]=\"t('previous')\"\n (click)=\"moveWeek(-1)\"\n >\n \u2191</button\n ><span>{{ title }}</span\n ><button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] || !canMoveWeek(1)\n \"\n [attr.aria-label]=\"t('next')\"\n (click)=\"moveWeek(1)\"\n >\n \u2193\n </button>\n </div>\n </ng-container>\n <ng-container\n *ngFor=\"let draft of drafts; let i = index; trackBy: trackDraft\"\n >\n <fieldset\n *ngIf=\"(i === 0 || isRange) && (hasTime || viewMode === 'manual')\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-label]=\"isRange ? t(i === 0 ? 'start' : 'end') : null\"\n >\n <legend *ngIf=\"isRange\">\n <ng-container\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual';\n else endpointLabel\n \"\n >\n <span class=\"end-view-toggle\">\n <button\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"endView === 'date'\"\n (click)=\"toggleEndView('date')\"\n >\n {{ t(\"end\") }}\n </button>\n <button\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"endView === 'days'\"\n (click)=\"toggleEndView('days')\"\n >\n {{ inDaysLabel }}\n </button>\n </span>\n </ng-container>\n <ng-template #endpointLabel>{{\n t(i === 0 ? \"start\" : \"end\")\n }}</ng-template>\n </legend>\n <div\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual' && endView === 'days'\n \"\n class=\"date-fields in-days-fields\"\n >\n <span class=\"resulting-end-date\" [attr.aria-label]=\"t('endDate')\">{{\n resultingEndDate\n }}</span>\n <wkly-field\n [label]=\"t('days')\"\n [hideLabel]=\"true\"\n [previousLabel]=\"t('daysPrevious')\"\n [nextLabel]=\"t('daysNext')\"\n [locale]=\"effectiveLocale\"\n [value]=\"inDays\"\n [min]=\"-9999\"\n [max]=\"9999\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"days($event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"\n hasDate && viewMode === 'manual' && (i === 0 || endView === 'date')\n \"\n class=\"date-fields\"\n >\n <wkly-field\n [label]=\"t('day')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.day\"\n [min]=\"1\"\n [max]=\"31\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'day', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('month')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.month\"\n [min]=\"1\"\n [max]=\"monthCount(draft)\"\n [labels]=\"months(draft)\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'month', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('year')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.year\"\n [min]=\"adapter.supportedYearRange[0]\"\n [max]=\"adapter.supportedYearRange[1]\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'year', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"hasTime\"\n class=\"time-fields\"\n [class.seconds]=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]\"\n >\n <wkly-field\n [label]=\"t('hour')\"\n [locale]=\"effectiveLocale\"\n [value]=\"displayHour(draft)\"\n [min]=\"effectiveHourCycle === 'h12' ? 1 : 0\"\n [max]=\"effectiveHourCycle === 'h12' ? 12 : 23\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'hour', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('minute')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.minute\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.MinuteStep] > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.MinuteStep] === 0\n ? this[WklyPickerInputsPropertyKeys.MinuteStep]\n : 1\n \"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'minute', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n *ngIf=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]\"\n [label]=\"t('second')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.second\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.SecondStep] > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.SecondStep] === 0\n ? this[WklyPickerInputsPropertyKeys.SecondStep]\n : 1\n \"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'second', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <div class=\"period\">\n <button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle] === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) < 12\n \"\n (click)=\"period(i, 'am')\"\n >\n {{ t(\"am\") }}</button\n ><button\n type=\"button\"\n [disabled]=\"\n this[WklyPickerInputsPropertyKeys.Disabled] ||\n this[WklyPickerInputsPropertyKeys.HourCycle] !== 'switchable'\n \"\n [attr.aria-pressed]=\"effectiveHourCycle === 'h24'\"\n (click)=\"period(i, '24')\"\n >\n 24</button\n ><button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle] === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"this[WklyPickerInputsPropertyKeys.Disabled]\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) >= 12\n \"\n (click)=\"period(i, 'pm')\"\n >\n {{ t(\"pm\") }}\n </button>\n </div>\n </div>\n </fieldset>\n </ng-container>\n <div class=\"validation\" role=\"status\" aria-live=\"polite\">\n <p *ngFor=\"let err of errors\">! {{ t(err.messageKey) }}</p>\n </div>\n <footer *ngIf=\"submitVisible\">\n <button\n type=\"button\"\n class=\"confirm\"\n [disabled]=\"!canSubmit\"\n (click)=\"submit()\"\n >\n {{ t(\"confirm\") }}\n </button>\n </footer>\n</section>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;--wkly-background-color: #fff;--wkly-background-color-alternate: #fafafa;--wkly-text-color: #192c28;--wkly-muted-color: #52635e;--wkly-border-color: #dce5e1;--wkly-accent-color: #176c55;--wkly-accent-color-alternate: #6ea494;--wkly-accent-text-color: #fff;--wkly-range-color: #e5f1ee;--wkly-error-color: #b42318;--wkly-focus-color: #245bd6;--wkly-size-multiplier: 1;--wkly-size-unit: 3.5em;color:var(--wkly-text-color);font:14px/1.4 system-ui,sans-serif;container-type:inline-size}.wkly{background:var(--wkly-background-color);border:1px solid var(--wkly-border-color);border-radius:14px;overflow:hidden;min-width:0;font-size:calc(14px*clamp(1,var(--wkly-size-multiplier),1.5))}button{font:inherit;color:inherit;min-width:var(--wkly-size-unit);min-height:var(--wkly-size-unit);border:0;background:transparent;border-radius:8px;cursor:pointer}button:hover:not(:disabled):not([aria-disabled=true]){background:var(--wkly-accent-color-alternate)}button:disabled,button[aria-disabled=true]{opacity:.4;cursor:default}button:focus-visible{outline:2px solid var(--wkly-focus-color);outline-offset:-2px}.toolbar{display:flex;align-items:center;padding:8px;gap:3px;border-bottom:1px solid var(--wkly-border-color)}.spacer{flex:1}.year-control{padding:0 6px;font-weight:650;text-align:start;line-height:1.2}.now{color:var(--wkly-accent-color);font-weight:650}.week-head,.week-row{display:grid;grid-template-columns:28px repeat(7,minmax(0,1fr))}.week-head{font-size:.85em;color:var(--wkly-muted-color);height:34px;align-items:center;text-align:center}.week-row{height:calc(var(--wkly-size-unit) * clamp(1,var(--wkly-size-multiplier),1));align-items:end}.no-label{grid-template-columns:repeat(7,minmax(0,1fr))}.week-scroll{overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;overflow-anchor:none;scrollbar-width:thin;max-height:65vh;touch-action:pan-y}.scroll-space{position:relative}.rows{position:absolute;left:0;right:0}.week-number{font-size:.85em;text-align:center;align-self:end;line-height:var(--wkly-size-unit);color:var(--wkly-muted-color)}[role=gridcell]{position:relative;min-width:0;height:var(--wkly-size-unit);text-align:center}[role=gridcell].odd-month:not(.range):not(.today){background:var(--wkly-background-color-alternate)}.day{width:100%;min-width:0;height:var(--wkly-size-unit);padding:0;border-radius:8px}.annotation{position:absolute;bottom:.25em;white-space:nowrap;font-size:1.25em;font-weight:650;line-height:1;pointer-events:none;z-index:1;color:var(--wkly-muted-color);color:color-mix(in srgb,var(--wkly-muted-color) 50%,transparent);text-shadow:0 0 2px --wkly-background-color,0 0 4px --wkly-background-color}.odd-month .annotation{text-shadow:0 0 2px --wkly-background-color-alternate,0 0 4px --wkly-background-color-alternate}.annotation:empty{display:none}.annotation--0{inset-inline-start:10%;bottom:1.75em}.annotation--1{inset-inline-start:-5%}.annotation--2{inset-inline-start:-20%}.annotation--3{inset-inline-start:-50%;inset-inline-end:-50%}.annotation--4{inset-inline-end:-20%}.annotation--5{inset-inline-end:-5%}.annotation--6{inset-inline-end:10%}.range{background:var(--wkly-range-color)}.day.selected{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);font-weight:700}.today:after{content:\"\";display:block;width:5px;height:5px;background:currentColor;border-radius:50%;position:absolute;bottom:2px;left:calc(50% - 2px)}.today{font-weight:750;box-shadow:inset 0 0 0 1px var(--wkly-accent-color)}.hidden{visibility:hidden}.week-navigation{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--wkly-border-color);font-size:.85em;color:var(--wkly-muted-color)}fieldset{border:0;padding:0 12px;margin:0;min-width:0}legend{padding-top:.85em;font-weight:650;color:var(--wkly-accent-color)}.date-fields{display:grid;grid-template-columns:1fr 2fr 1.4fr;gap:7px;padding:12px 0}.end-view-toggle{display:inline-flex}.end-view-toggle button{min-height:0;min-width:0;padding:0 6px;border-radius:0;line-height:inherit}.end-view-toggle button:first-child{padding-inline-start:0}.end-view-toggle button+button{border-inline-start:1px solid var(--wkly-text-color)}.end-view-toggle button[aria-pressed=false]{color:var(--wkly-muted-color);font-weight:400}.in-days-fields{grid-template-columns:minmax(0,1fr);gap:0;text-align:center}.resulting-end-date{font-size:11px;color:var(--wkly-muted-color);height:1.4em;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time-fields{display:grid;grid-template-columns:1fr 1fr 52px;gap:8px;padding:14px 0;border-top:1px solid var(--wkly-border-color)}.time-fields.seconds{grid-template-columns:1fr 1fr 1fr 48px}.period{display:flex;flex-direction:column;justify-content:center;gap:2px;padding-top:1.25em}.period button{font-size:.85em}.period [aria-pressed=true]{background:var(--wkly-range-color);box-shadow:inset 0 0 0 1px var(--wkly-accent-color);font-weight:700}.validation{color:var(--wkly-error-color);font-size:.85em}.validation p{margin:.5em .85em}footer{padding:12px;border-top:1px solid var(--wkly-border-color)}.confirm{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);width:100%;font-weight:650}.confirm:hover:not(:disabled){background:var(--wkly-accent-color-alternate)}@media (forced-colors: active){.day.selected{outline:2px solid Highlight}.range{border-bottom:2px solid Highlight}.today{outline:1px dashed CanvasText}}@media (prefers-reduced-motion: reduce){*{scroll-behavior:auto!important;animation:none!important}}\n"] }]
|
|
945
|
-
}], ctorParameters:
|
|
955
|
+
], template: "<section\n class=\"wkly\"\n [attr.dir]=\"direction\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel]() || 'Date and time picker'\n \"\n [attr.aria-describedby]=\"this[WklyPickerInputsPropertyKeys.AriaDescribedBy]()\"\n (focusout)=\"touched()\"\n>\n <header class=\"toolbar\">\n @if (hasDate) {\n <button\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"t(viewMode === 'calendar' ? 'manual' : 'calendar')\"\n (click)=\"toggleView()\"\n >\n {{ viewMode === \"calendar\" ? \"\u2637\" : \"\u25A6\" }}\n </button>\n }\n @if (hasDate) {\n <span class=\"year-control\">{{ title }}</span>\n }\n <span class=\"spacer\"></span\n ><button\n type=\"button\"\n class=\"now\"\n [disabled]=\"isDisabled()\"\n (click)=\"now()\"\n >\n {{ t(\"now\") }}\n </button>\n @if (presentation === \"transient\") {\n <button\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"t('close')\"\n (click)=\"cancel()\"\n >\n \u00D7\n </button>\n }\n </header>\n <ng-container *ngIf=\"hasDate && viewMode === 'calendar'\">\n <div\n role=\"grid\"\n [attr.aria-label]=\"\n this[WklyPickerInputsPropertyKeys.AriaLabel]() || 'Calendar'\n \"\n [attr.aria-multiselectable]=\"isRange\"\n >\n <div\n role=\"row\"\n class=\"week-head\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode]() === 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]())\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode]() !== 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]())\n \"\n role=\"columnheader\"\n aria-label=\"Week\"\n ></span>\n @for (day of weekdays; track $index) {\n <span role=\"columnheader\">{{ day }}</span>\n }\n </div>\n <div\n #scroller\n class=\"week-scroll\"\n [style.height.px]=\"visibleCount * rowHeight\"\n (scroll)=\"scroll($event)\"\n (scrollend)=\"snapWeek()\"\n >\n <div [style.height.px]=\"scrollHeight\" class=\"scroll-space\">\n <div class=\"rows\" [style.top.px]=\"paddingTop\">\n <div\n *ngFor=\"let row of rows; trackBy: trackRow\"\n role=\"row\"\n class=\"week-row\"\n [class.no-label]=\"\n compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode]() ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]())\n \"\n >\n <span\n *ngIf=\"\n !compact &&\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode]() !==\n 'hidden' ||\n this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]())\n \"\n role=\"rowheader\"\n class=\"week-number\"\n >{{ row.label }}</span\n >\n <div\n *ngFor=\"\n let cell of row.cells;\n let dayIndex = index;\n trackBy: trackCell\n \"\n role=\"gridcell\"\n [attr.data-weekday-index]=\"dayIndex\"\n [attr.aria-colindex]=\"\n dayIndex +\n (compact ||\n (this[WklyPickerInputsPropertyKeys.WeekLabelMode]() ===\n 'hidden' &&\n !this[WklyPickerInputsPropertyKeys.WeekLabelFormatter]())\n ? 1\n : 2)\n \"\n [attr.aria-selected]=\"selected(cell.epochDay)\"\n [attr.aria-disabled]=\"cell.disabled || isDisabled()\"\n [class.range]=\"inRange(cell.epochDay)\"\n [class.hidden]=\"cell.hidden\"\n [class.odd-month]=\"cell.date && cell.date.month % 2 === 1\"\n >\n <span [class]=\"'annotation annotation--' + dayIndex\">{{\n cell.annotation\n }}</span>\n <button\n type=\"button\"\n class=\"day\"\n [attr.data-day]=\"cell.epochDay\"\n [attr.aria-label]=\"cell.accessible\"\n [attr.aria-current]=\"cell.epochDay === today ? 'date' : null\"\n [attr.aria-disabled]=\"cell.disabled || isDisabled()\"\n [attr.tabindex]=\"\n !cell.hidden && cell.epochDay === focused ? 0 : -1\n \"\n [class.selected]=\"selected(cell.epochDay)\"\n [class.today]=\"cell.epochDay === today\"\n (focus)=\"focused = cell.epochDay\"\n (click)=\"select(cell.epochDay)\"\n (keydown)=\"key($event, cell.epochDay)\"\n >\n {{ cell.label }}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"week-navigation\">\n <button\n type=\"button\"\n [disabled]=\"isDisabled() || !canMoveWeek(-1)\"\n [attr.aria-label]=\"t('previous')\"\n (click)=\"moveWeek(-1)\"\n >\n \u2191</button\n ><span>{{ title }}</span\n ><button\n type=\"button\"\n [disabled]=\"isDisabled() || !canMoveWeek(1)\"\n [attr.aria-label]=\"t('next')\"\n (click)=\"moveWeek(1)\"\n >\n \u2193\n </button>\n </div>\n </ng-container>\n <ng-container\n *ngFor=\"let draft of drafts; let i = index; trackBy: trackDraft\"\n >\n <fieldset\n *ngIf=\"(i === 0 || isRange) && (hasTime || viewMode === 'manual')\"\n [disabled]=\"isDisabled()\"\n [attr.aria-label]=\"isRange ? t(i === 0 ? 'start' : 'end') : null\"\n >\n <legend *ngIf=\"isRange\">\n <ng-container\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual';\n else endpointLabel\n \"\n >\n <span class=\"end-view-toggle\">\n <button\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-pressed]=\"endView === 'date'\"\n (click)=\"toggleEndView('date')\"\n >\n {{ t(\"end\") }}\n </button>\n <button\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-pressed]=\"endView === 'days'\"\n (click)=\"toggleEndView('days')\"\n >\n {{ inDaysLabel }}\n </button>\n </span>\n </ng-container>\n <ng-template #endpointLabel>{{\n t(i === 0 ? \"start\" : \"end\")\n }}</ng-template>\n </legend>\n <div\n *ngIf=\"\n i === 1 && hasDate && viewMode === 'manual' && endView === 'days'\n \"\n class=\"date-fields in-days-fields\"\n >\n <span class=\"resulting-end-date\" [attr.aria-label]=\"t('endDate')\">{{\n resultingEndDate\n }}</span>\n <wkly-field\n [label]=\"t('days')\"\n [hideLabel]=\"true\"\n [previousLabel]=\"t('daysPrevious')\"\n [nextLabel]=\"t('daysNext')\"\n [locale]=\"effectiveLocale\"\n [value]=\"inDays\"\n [min]=\"-9999\"\n [max]=\"9999\"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"days($event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"\n hasDate && viewMode === 'manual' && (i === 0 || endView === 'date')\n \"\n class=\"date-fields\"\n >\n <wkly-field\n [label]=\"t('day')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.day\"\n [min]=\"1\"\n [max]=\"31\"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'day', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('month')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.month\"\n [min]=\"1\"\n [max]=\"monthCount(draft)\"\n [labels]=\"months(draft)\"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'month', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('year')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.date.year\"\n [min]=\"adapter.supportedYearRange[0]\"\n [max]=\"adapter.supportedYearRange[1]\"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'year', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n </div>\n <div\n *ngIf=\"hasTime\"\n class=\"time-fields\"\n [class.seconds]=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]()\"\n >\n <wkly-field\n [label]=\"t('hour')\"\n [locale]=\"effectiveLocale\"\n [value]=\"displayHour(draft)\"\n [min]=\"effectiveHourCycle === 'h12' ? 1 : 0\"\n [max]=\"effectiveHourCycle === 'h12' ? 12 : 23\"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'hour', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n [label]=\"t('minute')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.minute\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.MinuteStep]() > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.MinuteStep]() === 0\n ? this[WklyPickerInputsPropertyKeys.MinuteStep]()\n : 1\n \"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'minute', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <wkly-field\n *ngIf=\"this[WklyPickerInputsPropertyKeys.ShowSeconds]()\"\n [label]=\"t('second')\"\n [locale]=\"effectiveLocale\"\n [value]=\"draft.second\"\n [max]=\"59\"\n [step]=\"\n this[WklyPickerInputsPropertyKeys.SecondStep]() > 0 &&\n 60 % this[WklyPickerInputsPropertyKeys.SecondStep]() === 0\n ? this[WklyPickerInputsPropertyKeys.SecondStep]()\n : 1\n \"\n [disabled]=\"isDisabled()\"\n [invalid]=\"!!errors.length\"\n (valueChange)=\"field(i, 'second', $event)\"\n (complete)=\"finish()\"\n ></wkly-field>\n <div class=\"period\">\n <button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle]() === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) < 12\n \"\n (click)=\"period(i, 'am')\"\n >\n {{ t(\"am\") }}</button\n ><button\n type=\"button\"\n [disabled]=\"\n isDisabled() ||\n this[WklyPickerInputsPropertyKeys.HourCycle]() !== 'switchable'\n \"\n [attr.aria-pressed]=\"effectiveHourCycle === 'h24'\"\n (click)=\"period(i, '24')\"\n >\n 24</button\n ><button\n *ngIf=\"\n effectiveHourCycle === 'h12' ||\n this[WklyPickerInputsPropertyKeys.HourCycle]() === 'switchable'\n \"\n type=\"button\"\n [disabled]=\"isDisabled()\"\n [attr.aria-pressed]=\"\n effectiveHourCycle === 'h12' && (draft.hour || 0) >= 12\n \"\n (click)=\"period(i, 'pm')\"\n >\n {{ t(\"pm\") }}\n </button>\n </div>\n </div>\n </fieldset>\n </ng-container>\n <div class=\"validation\" role=\"status\" aria-live=\"polite\">\n <p *ngFor=\"let err of errors\">! {{ t(err.messageKey) }}</p>\n </div>\n <footer *ngIf=\"submitVisible\">\n <button\n type=\"button\"\n class=\"confirm\"\n [disabled]=\"!canSubmit\"\n (click)=\"submit()\"\n >\n {{ t(\"confirm\") }}\n </button>\n </footer>\n</section>\n", styles: [":host{display:block;width:100%;box-sizing:border-box;--wkly-background-color: #fff;--wkly-background-color-alternate: #fafafa;--wkly-text-color: #192c28;--wkly-muted-color: #52635e;--wkly-border-color: #dce5e1;--wkly-accent-color: #176c55;--wkly-accent-color-alternate: #6ea494;--wkly-accent-text-color: #fff;--wkly-range-color: #e5f1ee;--wkly-error-color: #b42318;--wkly-focus-color: #245bd6;--wkly-size-multiplier: 1;--wkly-size-unit: 3.5em;color:var(--wkly-text-color);font:14px/1.4 system-ui,sans-serif;container-type:inline-size}.wkly{background:var(--wkly-background-color);border:1px solid var(--wkly-border-color);border-radius:14px;overflow:hidden;min-width:0;font-size:calc(14px*clamp(1,var(--wkly-size-multiplier),1.5))}button{font:inherit;color:inherit;min-width:var(--wkly-size-unit);min-height:var(--wkly-size-unit);border:0;background:transparent;border-radius:8px;cursor:pointer}button:hover:not(:disabled):not([aria-disabled=true]){background:var(--wkly-accent-color-alternate)}button:disabled,button[aria-disabled=true]{opacity:.4;cursor:default}button:focus-visible{outline:2px solid var(--wkly-focus-color);outline-offset:-2px}.toolbar{display:flex;align-items:center;padding:8px;gap:3px;border-bottom:1px solid var(--wkly-border-color)}.spacer{flex:1}.year-control{padding:0 6px;font-weight:650;text-align:start;line-height:1.2}.now{color:var(--wkly-accent-color);font-weight:650}.week-head,.week-row{display:grid;grid-template-columns:28px repeat(7,minmax(0,1fr))}.week-head{font-size:.85em;color:var(--wkly-muted-color);height:34px;align-items:center;text-align:center}.week-row{height:calc(var(--wkly-size-unit) * clamp(1,var(--wkly-size-multiplier),1));align-items:end}.no-label{grid-template-columns:repeat(7,minmax(0,1fr))}.week-scroll{overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;overflow-anchor:none;scrollbar-width:thin;max-height:65vh;touch-action:pan-y}.scroll-space{position:relative}.rows{position:absolute;left:0;right:0}.week-number{font-size:.85em;text-align:center;align-self:end;line-height:var(--wkly-size-unit);color:var(--wkly-muted-color)}[role=gridcell]{position:relative;min-width:0;height:var(--wkly-size-unit);text-align:center}[role=gridcell].odd-month:not(.range):not(.today){background:var(--wkly-background-color-alternate)}.day{width:100%;min-width:0;height:var(--wkly-size-unit);padding:0;border-radius:8px}.annotation{position:absolute;bottom:.25em;white-space:nowrap;font-size:1.25em;font-weight:650;line-height:1;pointer-events:none;z-index:1;color:var(--wkly-muted-color);color:color-mix(in srgb,var(--wkly-muted-color) 50%,transparent);text-shadow:0 0 2px --wkly-background-color,0 0 4px --wkly-background-color}.odd-month .annotation{text-shadow:0 0 2px --wkly-background-color-alternate,0 0 4px --wkly-background-color-alternate}.annotation:empty{display:none}.annotation--0{inset-inline-start:10%;bottom:1.75em}.annotation--1{inset-inline-start:-5%}.annotation--2{inset-inline-start:-20%}.annotation--3{inset-inline-start:-50%;inset-inline-end:-50%}.annotation--4{inset-inline-end:-20%}.annotation--5{inset-inline-end:-5%}.annotation--6{inset-inline-end:10%}.range{background:var(--wkly-range-color)}.day.selected{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);font-weight:700}.today:after{content:\"\";display:block;width:5px;height:5px;background:currentColor;border-radius:50%;position:absolute;bottom:2px;left:calc(50% - 2px)}.today{font-weight:750;box-shadow:inset 0 0 0 1px var(--wkly-accent-color)}.hidden{visibility:hidden}.week-navigation{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--wkly-border-color);font-size:.85em;color:var(--wkly-muted-color)}fieldset{border:0;padding:0 12px;margin:0;min-width:0}legend{padding-top:.85em;font-weight:650;color:var(--wkly-accent-color)}.date-fields{display:grid;grid-template-columns:1fr 2fr 1.4fr;gap:7px;padding:12px 0}.end-view-toggle{display:inline-flex}.end-view-toggle button{min-height:0;min-width:0;padding:0 6px;border-radius:0;line-height:inherit}.end-view-toggle button:first-child{padding-inline-start:0}.end-view-toggle button+button{border-inline-start:1px solid var(--wkly-text-color)}.end-view-toggle button[aria-pressed=false]{color:var(--wkly-muted-color);font-weight:400}.in-days-fields{grid-template-columns:minmax(0,1fr);gap:0;text-align:center}.resulting-end-date{font-size:11px;color:var(--wkly-muted-color);height:1.4em;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time-fields{display:grid;grid-template-columns:1fr 1fr 52px;gap:8px;padding:14px 0;border-top:1px solid var(--wkly-border-color)}.time-fields.seconds{grid-template-columns:1fr 1fr 1fr 48px}.period{display:flex;flex-direction:column;justify-content:center;gap:2px;padding-top:1.25em}.period button{font-size:.85em}.period [aria-pressed=true]{background:var(--wkly-range-color);box-shadow:inset 0 0 0 1px var(--wkly-accent-color);font-weight:700}.validation{color:var(--wkly-error-color);font-size:.85em}.validation p{margin:.5em .85em}footer{padding:12px;border-top:1px solid var(--wkly-border-color)}.confirm{background:var(--wkly-accent-color);color:var(--wkly-accent-text-color);width:100%;font-weight:650}.confirm:hover:not(:disabled){background:var(--wkly-accent-color-alternate)}@media (forced-colors: active){.day.selected{outline:2px solid Highlight}.range{border-bottom:2px solid Highlight}.today{outline:1px dashed CanvasText}}@media (prefers-reduced-motion: reduce){*{scroll-behavior:auto!important;animation:none!important}}\n"] }]
|
|
956
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
946
957
|
type: Inject,
|
|
947
958
|
args: [LOCALE_ID]
|
|
948
959
|
}] }, { type: undefined, decorators: [{
|
|
@@ -960,8 +971,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
960
971
|
}] }, { type: Object, decorators: [{
|
|
961
972
|
type: Inject,
|
|
962
973
|
args: [PLATFORM_ID]
|
|
963
|
-
}] }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]
|
|
974
|
+
}] }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { scroller: [{
|
|
964
975
|
type: ViewChild,
|
|
965
976
|
args: ["scroller"]
|
|
966
977
|
}] } });
|
|
967
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3drbHktZGF0ZXRpbWUtcGlja2VyLjE2L3NyYy9waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vcHJvamVjdHMvd2tseS1kYXRldGltZS1waWNrZXIuMTYvc3JjL3BpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixTQUFTLEVBSVQsV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RSxPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixPQUFPLEdBR1IsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUlqQiw0QkFBNEIsR0FHN0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLGNBQWMsRUFDZCxjQUFjLEdBR2YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsYUFBYSxFQUNiLFVBQVUsRUFDVixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUtqQixnQkFBZ0IsRUFDaEIsNEJBQTRCLEVBQzVCLDZCQUE2QixHQUc5QixNQUFNLFVBQVUsQ0FBQzs7OztBQXVCbEIsTUFBTSxPQUFPLDJCQUNYLFNBQVEsZ0JBQWdCO0lBc0RLO0lB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YUFDVCxXQUFXLGFBQ1gsVUFBVSxhQUNWLGlCQUFpQixhQUNqQixpQkFBaUIsYUFDakIsV0FBVzs0RkE1RFYsMkJBQTJCLCtDQWIzQjtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLENBQUM7Z0JBQzFELEtBQUssRUFBRSxJQUFJO2FBQ1o7WUFDRDtnQkFDRSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztnQkFDMUQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDRLQ3pGSCw2MGFBK1hBOzs0RkRwU2EsMkJBQTJCO2tCQWpCdkMsU0FBUzsrQkFDRSxzQkFBc0IsYUFHckI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsNEJBQTRCLENBQUM7NEJBQzFELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSw0QkFBNEIsQ0FBQzs0QkFDMUQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7OzBCQXlERSxNQUFNOzJCQUFDLFNBQVM7OzBCQUNoQixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixNQUFNOzJCQUFDLFVBQVU7OzBCQUNqQixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxXQUFXO3FHQWxERSxRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIExPQ0FMRV9JRCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgUExBVEZPUk1fSUQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtcbiAgYWJzb2x1dGVXZWVrT2YsXG4gIGNyZWF0ZVdlZWtHZW5lcmF0b3IsXG4gIGZpcnN0RXBvY2hEYXlPZixcbiAgaW50ZWdlcixcbiAgV2tseVdlZWtHZW5lcmF0b3IsXG4gIFdrbHlXZWVrT2Zmc2V0LFxufSBmcm9tIFwiQHdrbHkvY29yZVwiO1xuaW1wb3J0IHtcbiAgZGVjb2RlSXNvLFxuICBlcnJvcixcbiAgcmVzb2x2ZVdlZWtPZmZzZXQsXG4gIHZhbGlkYXRlU2VsZWN0aW9uLFxuICBXa2x5Q2FsZW5kYXJBZGFwdGVyLFxuICBXa2x5Q2FsZW5kYXJEYXRlLFxuICBXa2x5RGF0ZVRpbWUsXG4gIFdrbHlHcmVnb3JpYW5DYWxlbmRhckFkYXB0ZXIsXG4gIFdrbHlQaWNrZXJWYWx1ZSxcbiAgV2tseVZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkB3a2x5L2FkYXB0ZXJzXCI7XG5pbXBvcnQge1xuICBkcmFmdERheURpZmZlcmVuY2UsXG4gIHNldERyYWZ0RGF5RGlmZmVyZW5jZSxcbiAgY2FsZW5kYXJNb250aEJvdW5kcyxcbiAgcmVzb2x2ZVdrbHlUcmFuc2xhdGlvbixcbiAgY3JlYXRlV2Vla1Jvd3MsXG4gIHZhbGlkYXRlRHJhZnRzLFxuICBXa2x5RHJhZnQgYXMgRHJhZnQsXG4gIFdrbHlXZWVrUm93IGFzIFJvdyxcbn0gZnJvbSBcIkB3a2x5L3ByZXNlbnRhdGlvblwiO1xuaW1wb3J0IHtcbiAgY29lcmNlQm9vbGVhbixcbiAgV0tMWV9DTE9DSyxcbiAgV0tMWV9DT05GSUcsXG4gIFdLTFlfTE9DQUxJWkFUSU9OLFxuICBXS0xZX1RSQU5TTEFUSU9OUyxcbiAgV2tseUNsb2NrLFxuICBXa2x5Q2xvc2VSZWFzb24sXG4gIFdrbHlDb25maWd1cmF0aW9uLFxuICBXa2x5SnVtcE9wdGlvbnMsXG4gIFdrbHlQaWNrZXJJbnB1dHMsXG4gIFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMsXG4gIFdrbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLFxuICBXa2x5U3RyaW5ncyxcbiAgV2tseVRyYW5zbGF0aW9ucyxcbn0gZnJvbSBcIi4vY29uZmlnXCI7XG5kZWNsYXJlIGNsYXNzIFJlc2l6ZU9ic2VydmVyIHtcbiAgY29uc3RydWN0b3IoY2FsbGJhY2s6ICgpID0+IHZvaWQpO1xuICBvYnNlcnZlKGVsZW1lbnQ6IEVsZW1lbnQpOiB2b2lkO1xuICBkaXNjb25uZWN0KCk6IHZvaWQ7XG59XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwid2tseS1kYXRldGltZS1waWNrZXJcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9waWNrZXIuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuLi8uLi93a2x5LWRhdGV0aW1lLXBpY2tlci9zcmMvcGlja2VyLmNvbXBvbmVudC5jc3NcIl0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gV2tseURhdGVUaW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFdrbHlEYXRlVGltZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBXa2x5RGF0ZVRpbWVQaWNrZXJDb21wb25lbnRcbiAgZXh0ZW5kcyBXa2x5UGlja2VySW5wdXRzXG4gIGltcGxlbWVudHNcbiAgICBPbkluaXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgT25EZXN0cm95LFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIFZhbGlkYXRvclxue1xuICBAVmlld0NoaWxkKFwic2Nyb2xsZXJcIikgc2Nyb2xsZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgcHJlc2VudGF0aW9uOiBcImlubGluZVwiIHwgXCJ0cmFuc2llbnRcIiA9IFwiaW5saW5lXCI7XG4gIHZpZXdNb2RlOiBcImNhbGVuZGFyXCIgfCBcIm1hbnVhbFwiID0gXCJjYWxlbmRhclwiO1xuICBlbmRWaWV3OiBcImRhdGVcIiB8IFwiZGF5c1wiID0gXCJkYXRlXCI7XG4gIGFkYXB0ZXIhOiBXa2x5Q2FsZW5kYXJBZGFwdGVyO1xuICBlZmZlY3RpdmVMb2NhbGUgPSBcImVuLVVTXCI7XG4gIGVmZmVjdGl2ZU9mZnNldDogV2tseVdlZWtPZmZzZXQgPSAwO1xuICBlZmZlY3RpdmVIb3VyQ3ljbGU6IFwiaDEyXCIgfCBcImgyNFwiID0gXCJoMjRcIjtcbiAgZGlyZWN0aW9uID0gXCJsdHJcIjtcbiAgcm93czogUm93W10gPSBbXTtcbiAgd2Vla2RheXM6IHN0cmluZ1tdID0gW107XG4gIGRyYWZ0czogRHJhZnRbXSA9IFtdO1xuICBlcnJvcnM6IHJlYWRvbmx5IFdrbHlWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xuICB0b2RheSA9IDA7XG4gIGZvY3VzZWQgPSAwO1xuICBhbmNob3JXZWVrID0gMDtcbiAgZmlyc3RXZWVrID0gMDtcbiAgdmlzaWJsZUNvdW50ID0gNjtcbiAgcm93SGVpZ2h0ID0gNzY7XG4gIHNjcm9sbEhlaWdodCA9IDE1MjA3NjtcbiAgcGFkZGluZ1RvcCA9IDA7XG4gIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIGNvbXBhY3QgPSBmYWxzZTtcbiAgcmVhZG9ubHkgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cyA9IFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXM7XG4gIHByaXZhdGUgYmFzZVdlZWsgPSAwO1xuICBwcml2YXRlIGZpcnN0U3VwcG9ydGVkRGF5ID0gMDtcbiAgcHJpdmF0ZSBsYXN0U3VwcG9ydGVkRGF5ID0gMDtcbiAgcHJpdmF0ZSBmaXJzdFN1cHBvcnRlZFdlZWsgPSAwO1xuICBwcml2YXRlIGxhc3RTdXBwb3J0ZWRXZWVrID0gMDtcbiAgcHJpdmF0ZSBnZW5lcmF0b3IhOiBXa2x5V2Vla0dlbmVyYXRvcjtcbiAgcHJpdmF0ZSBpbml0aWFsTW9udGggPSBcIlwiO1xuICBwcml2YXRlIGNsaXBNb250aCA9IGZhbHNlO1xuICBwcml2YXRlIGJyb3dzZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIHNjcm9sbEVuZFRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgc25hcFBlbmRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBXa2x5UGlja2VyVmFsdWUpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSB2YWxpZGF0b3JDaGFuZ2VkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgY29uZmlnRXJyb3JzOiBXa2x5VmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgcHJpdmF0ZSBwZW5kaW5nVmFsdWU6IFdrbHlQaWNrZXJWYWx1ZSA9IG51bGw7XG4gIHByaXZhdGUgZW1pdHRlZFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYW51YWxEYXRlRW5kcG9pbnQgPSAwO1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KExPQ0FMRV9JRCkgcHJpdmF0ZSBkZWZhdWx0TG9jYWxlOiBzdHJpbmcsXG4gICAgQEluamVjdChXS0xZX0NPTkZJRykgcHJpdmF0ZSBkZWZhdWx0czogV2tseUNvbmZpZ3VyYXRpb24sXG4gICAgQEluamVjdChXS0xZX0NMT0NLKSBwcml2YXRlIGNsb2NrOiBXa2x5Q2xvY2ssXG4gICAgQEluamVjdChXS0xZX0xPQ0FMSVpBVElPTikgcHJpdmF0ZSBzdHJpbmdzOiBXa2x5U3RyaW5ncyxcbiAgICBASW5qZWN0KFdLTFlfVFJBTlNMQVRJT05TKSBwcml2YXRlIGRlZmF1bHRUcmFuc2xhdGlvbnM6IFdrbHlUcmFuc2xhdGlvbnMsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm06IE9iamVjdCxcbiAgICBwcml2YXRlIGhvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtKTtcbiAgfVxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgaWYgKFxuICAgICAgICBPYmplY3Qua2V5cyhjaGFuZ2VzKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgY2hhbmdlc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSAmJlxuICAgICAgICB0aGlzLmVtaXR0ZWRWYWx1ZSA9PT1cbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlZFZhbHVlID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZm9jdXMgPSB0aGlzLmZvY3VzZWQ7XG4gICAgICB0aGlzLmNvbmZpZ3VyZSgpO1xuICAgICAgaWYgKFxuICAgICAgICBjaGFuZ2VzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdIHx8XG4gICAgICAgIGNoYW5nZXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSB8fFxuICAgICAgICBjaGFuZ2VzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuQ2FsZW5kYXJBZGFwdGVyXVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubG9hZCh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbih0aGlzLmZvY3VzZWQsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jaGVjaygpO1xuICAgICAgICBpZiAoY2hhbmdlc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZpZXdwb3J0UHJlc2V0XSlcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uKGZvY3VzLCB0cnVlKTtcbiAgICAgICAgZWxzZSB0aGlzLnNjcm9sbFRvRXBvY2hEYXkoZm9jdXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgdGhpcy5jb25maWd1cmUoKTtcbiAgICBjb25zdCBpbml0aWFsRXBvY2hEYXkgPSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuSW5pdGlhbEVwb2NoRGF5XTtcbiAgICB0aGlzLnRvZGF5ID0gdGhpcy5icm93c2VyXG4gICAgICA/IE1hdGguZmxvb3IodGhpcy5jbG9jay5ub3coKS5nZXRUaW1lKCkgLyA4NjQwMDAwMClcbiAgICAgIDogaW5pdGlhbEVwb2NoRGF5ID09PSBudWxsXG4gICAgICAgID8gMFxuICAgICAgICA6IGluaXRpYWxFcG9jaERheTtcbiAgICB0aGlzLmZvY3VzZWQgPVxuICAgICAgaW5pdGlhbEVwb2NoRGF5ID09PSBudWxsXG4gICAgICAgID8gdGhpcy5kZWZhdWx0cy5pbml0aWFsRXBvY2hEYXkgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdGhpcy50b2RheVxuICAgICAgICAgIDogdGhpcy5kZWZhdWx0cy5pbml0aWFsRXBvY2hEYXlcbiAgICAgICAgOiBpbml0aWFsRXBvY2hEYXk7XG4gICAgdGhpcy5sb2FkKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0pO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMucG9zaXRpb24odGhpcy5mb2N1c2VkLCB0cnVlKTtcbiAgfVxuICBjb25maWd1cmUoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWdFcnJvcnMgPSBbXTtcbiAgICBbXG4gICAgICBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzLFxuICAgICAgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5BbGxvd1JhbmdlQWNyb3NzRGlzYWJsZWQsXG4gICAgICBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlJlcXVpcmVkLFxuICAgICAgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZCxcbiAgICAgIFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuQ2xvc2VPbkJhY2tkcm9wLFxuICAgIF0uZm9yRWFjaChcbiAgICAgIChrZXkpID0+ICgodGhpcyBhcyBhbnkpW2tleV0gPSBjb2VyY2VCb29sZWFuKCh0aGlzIGFzIGFueSlba2V5XSkpLFxuICAgICk7XG4gICAgdGhpcy5lZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkxvY2FsZV0gfHxcbiAgICAgIHRoaXMuZGVmYXVsdHMubG9jYWxlIHx8XG4gICAgICB0aGlzLmRlZmF1bHRMb2NhbGU7XG4gICAgdGhpcy5kaXJlY3Rpb24gPSAvXihhcnxoZXxmYXx1cikoLXwkKS8udGVzdCh0aGlzLmVmZmVjdGl2ZUxvY2FsZSlcbiAgICAgID8gXCJydGxcIlxuICAgICAgOiBcImx0clwiO1xuICAgIHRoaXMuYWRhcHRlciA9XG4gICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuQ2FsZW5kYXJBZGFwdGVyXSB8fFxuICAgICAgbmV3IFdrbHlHcmVnb3JpYW5DYWxlbmRhckFkYXB0ZXIodGhpcy5lZmZlY3RpdmVMb2NhbGUpO1xuICAgIHRyeSB7XG4gICAgICBsZXQgZmlyc3REYXk6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZpcnN0RGF5ID0gZ2V0TG9jYWxlRmlyc3REYXlPZldlZWsodGhpcy5lZmZlY3RpdmVMb2NhbGUpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIHRoaXMuZWZmZWN0aXZlT2Zmc2V0ID0gcmVzb2x2ZVdlZWtPZmZzZXQoXG4gICAgICAgIHRoaXMuZWZmZWN0aXZlTG9jYWxlLFxuICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla09mZnNldF0sXG4gICAgICAgIHRoaXMuZGVmYXVsdHMud2Vla09mZnNldCxcbiAgICAgICAgZmlyc3REYXksXG4gICAgICApO1xuICAgICAgaW50ZWdlcih0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0NhY2hlU2l6ZV0pO1xuICAgICAgaW50ZWdlcih0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuT3ZlcnNjYW5XZWVrc10pO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0NhY2hlU2l6ZV0gPCAwIHx8XG4gICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5PdmVyc2NhbldlZWtzXSA8IDAgfHxcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk92ZXJzY2FuV2Vla3NdID4gNTBcbiAgICAgIClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoKTtcbiAgICAgIGlmIChcbiAgICAgICAgIVtcbiAgICAgICAgICBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgXCJkYXRlXCIsXG4gICAgICAgICAgXCJ0aW1lXCIsXG4gICAgICAgICAgXCJkYXRldGltZS1yYW5nZVwiLFxuICAgICAgICAgIFwiZGF0ZS1yYW5nZVwiLFxuICAgICAgICAgIFwidGltZS1yYW5nZVwiLFxuICAgICAgICBdLmluY2x1ZGVzKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSlcbiAgICAgIClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoKTtcbiAgICAgIGNvbnN0IHByZXNldCA9IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WaWV3cG9ydFByZXNldF07XG4gICAgICBpZiAocHJlc2V0LmtpbmQgPT09IFwid2Vla3NcIikge1xuICAgICAgICBpbnRlZ2VyKHByZXNldC52aXNpYmxlV2Vla0NvdW50KTtcbiAgICAgICAgaWYgKHByZXNldC52aXNpYmxlV2Vla0NvdW50IDwgMSB8fCBwcmVzZXQudmlzaWJsZVdlZWtDb3VudCA+IDUyKVxuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCk7XG4gICAgICB9XG4gICAgICBpZiAocHJlc2V0LmtpbmQgPT09IFwiZnVsbC1tb250aC1hbmQtYXJvdW5kXCIpXG4gICAgICAgIGZvciAoY29uc3QgbiBvZiBbXG4gICAgICAgICAgcHJlc2V0LmV4dHJhV2Vla3NCZWZvcmUgfHwgMCxcbiAgICAgICAgICBwcmVzZXQuZXh0cmFXZWVrc0FmdGVyIHx8IDAsXG4gICAgICAgIF0pIHtcbiAgICAgICAgICBpbnRlZ2VyKG4pO1xuICAgICAgICAgIGlmIChuIDwgMCB8fCBuID4gNTIpIHRocm93IG5ldyBSYW5nZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIHRoaXMuZ2VuZXJhdG9yID0gY3JlYXRlV2Vla0dlbmVyYXRvcih7XG4gICAgICAgIHdlZWtPZmZzZXQ6IHRoaXMuZWZmZWN0aXZlT2Zmc2V0LFxuICAgICAgICBjYWNoZVNpemU6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrQ2FjaGVTaXplXSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHRoaXMuY29uZmlnRXJyb3JzLnB1c2goXG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIFwiY29uZmlndXJhdGlvbi1lcnJvclwiLFxuICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrT2Zmc2V0XSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmdlbmVyYXRvciA9IGNyZWF0ZVdlZWtHZW5lcmF0b3IoKTtcbiAgICAgIHRoaXMuZWZmZWN0aXZlT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgdGhpcy5zZXRTdXBwb3J0ZWRTY3JvbGxSYW5nZSgpO1xuICAgIHRoaXMuZWZmZWN0aXZlSG91ckN5Y2xlID1cbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Ib3VyQ3ljbGVdID09PSBcImgxMlwiXG4gICAgICAgID8gXCJoMTJcIlxuICAgICAgICA6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Ib3VyQ3ljbGVdID09PSBcImxvY2FsZVwiXG4gICAgICAgICAgPyBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmVmZmVjdGl2ZUxvY2FsZSwge1xuICAgICAgICAgICAgICBob3VyOiBcIm51bWVyaWNcIixcbiAgICAgICAgICAgICAgdGltZVpvbmU6IFwiVVRDXCIsXG4gICAgICAgICAgICB9KS5yZXNvbHZlZE9wdGlvbnMoKS5ob3VyMTJcbiAgICAgICAgICAgID8gXCJoMTJcIlxuICAgICAgICAgICAgOiBcImgyNFwiXG4gICAgICAgICAgOiBcImgyNFwiO1xuICAgIHRoaXMud2Vla2RheXMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiA3IH0sIChfLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLmZvcm1hdFdlZWtkYXkodGhpcy5lZmZlY3RpdmVPZmZzZXQgKyBpLCBcInNob3J0XCIpLFxuICAgICk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRTdXBwb3J0ZWRTY3JvbGxSYW5nZSgpOiB2b2lkIHtcbiAgICBsZXQgW2ZpcnN0LCBsYXN0XSA9IHRoaXMuYWRhcHRlci5zdXBwb3J0ZWRFcG9jaERheVJhbmdlO1xuICAgIGNvbnN0IFtmaXJzdFllYXIsIGxhc3RZZWFyXSA9IHRoaXMuYWRhcHRlci5zdXBwb3J0ZWRZZWFyUmFuZ2U7XG4gICAgY29uc3QgeWVhck9mID0gKGRheTogbnVtYmVyKSA9PiB0aGlzLmFkYXB0ZXIuZXBvY2hEYXlUb0RhdGUoZGF5KS55ZWFyO1xuICAgIGlmICh5ZWFyT2YoZmlyc3QpIDwgZmlyc3RZZWFyKSB7XG4gICAgICBsZXQgbG93ID0gZmlyc3QsXG4gICAgICAgIGhpZ2ggPSBsYXN0O1xuICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgY29uc3QgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgaWYgKHllYXJPZihtaWQpIDwgZmlyc3RZZWFyKSBsb3cgPSBtaWQgKyAxO1xuICAgICAgICBlbHNlIGhpZ2ggPSBtaWQ7XG4gICAgICB9XG4gICAgICBmaXJzdCA9IGxvdztcbiAgICB9XG4gICAgaWYgKHllYXJPZihsYXN0KSA+IGxhc3RZZWFyKSB7XG4gICAgICBsZXQgbG93ID0gZmlyc3QsXG4gICAgICAgIGhpZ2ggPSBsYXN0O1xuICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgY29uc3QgbWlkID0gTWF0aC5jZWlsKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgICBpZiAoeWVhck9mKG1pZCkgPiBsYXN0WWVhcikgaGlnaCA9IG1pZCAtIDE7XG4gICAgICAgIGVsc2UgbG93ID0gbWlkO1xuICAgICAgfVxuICAgICAgbGFzdCA9IGxvdztcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZmlyc3QgPiBsYXN0IHx8XG4gICAgICB5ZWFyT2YoZmlyc3QpIDwgZmlyc3RZZWFyIHx8XG4gICAgICB5ZWFyT2YoZmlyc3QpID4gbGFzdFllYXIgfHxcbiAgICAgIHllYXJPZihsYXN0KSA8IGZpcnN0WWVhciB8fFxuICAgICAgeWVhck9mKGxhc3QpID4gbGFzdFllYXJcbiAgICApXG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk5vIHN1cHBvcnRlZCBkYXlzIHdpdGhpbiB0aGUgY2FsZW5kYXIgeWVhciByYW5nZVwiKTtcbiAgICB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5ID0gZmlyc3Q7XG4gICAgdGhpcy5sYXN0U3VwcG9ydGVkRGF5ID0gbGFzdDtcbiAgICB0aGlzLmZpcnN0U3VwcG9ydGVkV2VlayA9IGFic29sdXRlV2Vla09mKGZpcnN0LCB0aGlzLmVmZmVjdGl2ZU9mZnNldCk7XG4gICAgdGhpcy5sYXN0U3VwcG9ydGVkV2VlayA9IGFic29sdXRlV2Vla09mKGxhc3QsIHRoaXMuZWZmZWN0aXZlT2Zmc2V0KTtcbiAgfVxuICBwcml2YXRlIGNsYW1wRmlyc3RXZWVrKHdlZWs6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gS2VlcCBzdXBwb3J0ZWQgd2Vla3MgaW5zaWRlIHRoZSB2aWV3cG9ydDsgcmVuZGVyUm93cyBhZGRzIHRoZSBidWZmZXIgcm93cy5cbiAgICBjb25zdCBsYXN0ID0gTWF0aC5tYXgoXG4gICAgICB0aGlzLmZpcnN0U3VwcG9ydGVkV2VlayxcbiAgICAgIHRoaXMubGFzdFN1cHBvcnRlZFdlZWsgLSB0aGlzLnZpc2libGVDb3VudCArIDEsXG4gICAgKTtcbiAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5maXJzdFN1cHBvcnRlZFdlZWssIE1hdGgubWluKGxhc3QsIHdlZWspKTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICAgIGlmICh0aGlzLmJyb3dzZXIgJiYgdHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aGlzLm9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb21wYWN0ID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggPCAzMzg7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgXCIud2Vlay1yb3dcIixcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy8gQ1NTIGhlaWdodHMgYW5kIHNjcm9sbFRvcCB1c2UgbGF5b3V0IHBpeGVsczsgY2xpZW50IHJlY3RhbmdsZXMgaW5jbHVkZSB6b29tLlxuICAgICAgICBjb25zdCBoZWlnaHQgPSByb3cgPyBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUocm93KS5oZWlnaHQpIDogMDtcbiAgICAgICAgaWYgKGhlaWdodCAmJiBoZWlnaHQgIT09IHRoaXMucm93SGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5yb3dIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgdGhpcy5zY3JvbGxIZWlnaHQgPSB0aGlzLnJvd0hlaWdodCAqIDIwMDE7XG4gICAgICAgICAgdGhpcy5yZW5kZXJSb3dzKCk7XG4gICAgICAgICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmhvc3QubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5vYnNlcnZlcikgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRW5kVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVyKTtcbiAgICBpZiAodGhpcy5nZW5lcmF0b3IpIHRoaXMuZ2VuZXJhdG9yLmNsZWFyQ2FjaGUoKTtcbiAgfVxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVdrbHlUcmFuc2xhdGlvbihcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuZWZmZWN0aXZlTG9jYWxlLFxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlRyYW5zbGF0aW9uc10gfHxcbiAgICAgICAgdGhpcy5kZWZhdWx0VHJhbnNsYXRpb25zLFxuICAgICAgdGhpcy5zdHJpbmdzLFxuICAgICk7XG4gIH1cbiAgZ2V0IGlzUmFuZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXS5lbmRzV2l0aChcIi1yYW5nZVwiKTtcbiAgfVxuICBnZXQgaGFzRGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXS5zdGFydHNXaXRoKFwidGltZVwiKTtcbiAgfVxuICBnZXQgaGFzVGltZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdICE9PSBcImRhdGVcIiAmJlxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdICE9PSBcImRhdGUtcmFuZ2VcIlxuICAgICk7XG4gIH1cbiAgZ2V0IHN1Ym1pdFZpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucHJlc2VudGF0aW9uID09PSBcInRyYW5zaWVudFwiICYmXG4gICAgICAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdICE9PSBcImRhdGVcIiB8fFxuICAgICAgICB0aGlzLnZpZXdNb2RlID09PSBcIm1hbnVhbFwiKVxuICAgICk7XG4gIH1cbiAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGQgPSB0aGlzLmFkYXB0ZXIuZXBvY2hEYXlUb0RhdGUoXG4gICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgIHRoaXMuZmlyc3RTdXBwb3J0ZWREYXksXG4gICAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgICB0aGlzLmxhc3RTdXBwb3J0ZWREYXksXG4gICAgICAgICAgICBmaXJzdEVwb2NoRGF5T2YodGhpcy5hbmNob3JXZWVrLCB0aGlzLmVmZmVjdGl2ZU9mZnNldCksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmZvcm1hdE1vbnRoKGQpICsgXCIgXCIgKyB0aGlzLmFkYXB0ZXIuZm9ybWF0WWVhcihkKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cbiAgZ2V0IGNhblN1Ym1pdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0gJiZcbiAgICAgICF0aGlzLmVycm9ycy5sZW5ndGggJiZcbiAgICAgIHRoaXMucGVuZGluZ1ZhbHVlICE9PSBudWxsXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGJsYW5rKGRheTogbnVtYmVyKTogRHJhZnQge1xuICAgIGNvbnN0IHNhZmUgPSBNYXRoLm1heChcbiAgICAgIHRoaXMuZmlyc3RTdXBwb3J0ZWREYXksXG4gICAgICBNYXRoLm1pbih0aGlzLmxhc3RTdXBwb3J0ZWREYXksIGRheSksXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0ZTogdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKHNhZmUpLFxuICAgICAgaG91cjogMCxcbiAgICAgIG1pbnV0ZTogMCxcbiAgICAgIHNlY29uZDogMCxcbiAgICAgIHByZXNlbnQ6IGZhbHNlLFxuICAgIH07XG4gIH1cbiAgbG9hZCh2YWx1ZTogV2tseVBpY2tlclZhbHVlKTogdm9pZCB7XG4gICAgdGhpcy5kcmFmdHMgPSBbdGhpcy5ibGFuayh0aGlzLmZvY3VzZWQpLCB0aGlzLmJsYW5rKHRoaXMuZm9jdXNlZCldO1xuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZVNlbGVjdGlvbih2YWx1ZSwgdGhpcywgdGhpcy5hZGFwdGVyKTtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgIXZhbGlkYXRpb24ubGVuZ3RoKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBbdmFsdWVdIDogdmFsdWU7XG4gICAgICB2YWx1ZXMuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgICAgICBjb25zdCBkID0gZGVjb2RlSXNvKHYpO1xuICAgICAgICB0aGlzLmRyYWZ0c1tpXSA9IHtcbiAgICAgICAgICBkYXRlOiB0aGlzLmhhc0RhdGVcbiAgICAgICAgICAgID8gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGQuZXBvY2hEYXkpXG4gICAgICAgICAgICA6IHRoaXMuYmxhbmsodGhpcy50b2RheSkuZGF0ZSxcbiAgICAgICAgICBob3VyOiBkLmhvdXIsXG4gICAgICAgICAgbWludXRlOiBkLm1pbnV0ZSxcbiAgICAgICAgICBzZWNvbmQ6IGQuc2Vjb25kLFxuICAgICAgICAgIHByZXNlbnQ6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpID09PSAwICYmIHRoaXMuaGFzRGF0ZSkgdGhpcy5mb2N1c2VkID0gZC5lcG9jaERheTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodmFsaWRhdGlvbi5sZW5ndGgpIHtcbiAgICAgIHRoaXMucGVuZGluZ1ZhbHVlID0gbnVsbDtcbiAgICAgIHRoaXMucmVwb3J0KHZhbGlkYXRpb24pO1xuICAgIH0gZWxzZSB0aGlzLmNoZWNrKCk7XG4gIH1cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogV2tseVBpY2tlclZhbHVlKTogdm9pZCB7XG4gICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLmxvYWQodmFsdWUpO1xuICAgICAgdGhpcy5wb3NpdGlvbih0aGlzLmZvY3VzZWQsIHRydWUpO1xuICAgIH1cbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IFdrbHlQaWNrZXJWYWx1ZSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0gPSBkaXNhYmxlZDtcbiAgfVxuICB2YWxpZGF0ZShfY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGggPyB7IHdrbHk6IHRoaXMuZXJyb3JzIH0gOiBudWxsO1xuICB9XG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRvckNoYW5nZWQgPSBmbjtcbiAgfVxuICB0b3VjaGVkKCk6IHZvaWQge1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5vblRvdWNoZWQoKSk7XG4gIH1cbiAgcHJpdmF0ZSByZXBvcnQoZXJyb3JzOiByZWFkb25seSBXa2x5VmFsaWRhdGlvbkVycm9yW10pOiB2b2lkIHtcbiAgICBjb25zdCBjaGFuZ2VkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5lcnJvcnMpICE9PSBKU09OLnN0cmluZ2lmeShlcnJvcnMpO1xuICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzW1drbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLlZhbGlkYXRpb25DaGFuZ2VdLmVtaXQoZXJyb3JzKTtcbiAgICAgIHRoaXMudmFsaWRhdG9yQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBjaGVjaygpOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZURyYWZ0cyh7XG4gICAgICBkcmFmdHM6IHRoaXMuZHJhZnRzLFxuICAgICAgY29uZmlnRXJyb3JzOiB0aGlzLmNvbmZpZ0Vycm9ycyxcbiAgICAgIGFkYXB0ZXI6IHRoaXMuYWRhcHRlcixcbiAgICAgIHNlbGVjdGlvbjogdGhpcyxcbiAgICAgIG1vZGU6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSxcbiAgICAgIGlzUmFuZ2U6IHRoaXMuaXNSYW5nZSxcbiAgICAgIGhhc0RhdGU6IHRoaXMuaGFzRGF0ZSxcbiAgICAgIGhhc1RpbWU6IHRoaXMuaGFzVGltZSxcbiAgICAgIHNob3dTZWNvbmRzOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuU2hvd1NlY29uZHNdLFxuICAgICAgcmVxdWlyZWQ6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5SZXF1aXJlZF0sXG4gICAgfSk7XG4gICAgdGhpcy5wZW5kaW5nVmFsdWUgPSByZXN1bHQucGVuZGluZ1ZhbHVlO1xuICAgIHRoaXMucmVwb3J0KHJlc3VsdC5lcnJvcnMpO1xuICB9XG4gIHRyYWNrRHJhZnQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gRW5kcG9pbnQgY29udHJvbHMga2VlcCB0aGVpciBpZGVudGl0eSBhbmQgZm9jdXMgd2hlbiBkcmFmdCBvYmplY3RzIHN3YXAuXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG4gIHByaXZhdGUgb3JkZXJEcmFmdHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUmFuZ2UgfHwgIXRoaXMuZHJhZnRzLmV2ZXJ5KChkcmFmdCkgPT4gZHJhZnQucHJlc2VudCkpIHJldHVybjtcbiAgICBpZiAodGhpcy5kcmFmdHMuc29tZSgoZHJhZnQpID0+IGRyYWZ0LnVuc3VwcG9ydGVkRXBvY2hEYXkgIT09IHVuZGVmaW5lZCkpXG4gICAgICByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmRyYWZ0c1swXSxcbiAgICAgICAgYiA9IHRoaXMuZHJhZnRzWzFdO1xuICAgICAgY29uc3Qga2V5ID0gKGQ6IERyYWZ0KSA9PlxuICAgICAgICB0aGlzLmFkYXB0ZXIuZGF0ZVRvRXBvY2hEYXkoZC5kYXRlKSAqIDg2NDAwICtcbiAgICAgICAgKGQuaG91ciB8fCAwKSAqIDM2MDAgK1xuICAgICAgICAoZC5taW51dGUgfHwgMCkgKiA2MCArXG4gICAgICAgIChkLnNlY29uZCB8fCAwKTtcbiAgICAgIGlmIChrZXkoYSkgPiBrZXkoYikpIHRoaXMuZHJhZnRzID0gW2IsIGFdO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIC8vIEltcG9zc2libGUgb3IgaW5jb21wbGV0ZSBkYXRlcyByZW1haW4gZWRpdGFibGUgdW50aWwgY29ycmVjdGVkLlxuICAgIH1cbiAgfVxuICBmaW5pc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0pIHJldHVybjtcbiAgICB0aGlzLm9yZGVyRHJhZnRzKCk7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwibWFudWFsXCIgJiYgdGhpcy5oYXNEYXRlKSB0aGlzLnBvc2l0aW9uT25NYW51YWxEYXRlKCk7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIGlmICh0aGlzLnByZXNlbnRhdGlvbiA9PT0gXCJpbmxpbmVcIiAmJiB0aGlzLmNhblN1Ym1pdCkgdGhpcy5jb21taXQoKTtcbiAgfVxuICBwcml2YXRlIGNvbW1pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU3VibWl0KSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IHRoaXMucGVuZGluZ1ZhbHVlO1xuICAgIGlmIChcbiAgICAgIEpTT04uc3RyaW5naWZ5KG5leHQpICE9PVxuICAgICAgSlNPTi5zdHJpbmdpZnkodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSlcbiAgICApIHtcbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0gPSBuZXh0O1xuICAgICAgdGhpcy5lbWl0dGVkVmFsdWUgPSBKU09OLnN0cmluZ2lmeShuZXh0KTtcbiAgICAgIHRoaXMub25DaGFuZ2UobmV4dCk7XG4gICAgICB0aGlzW1drbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLlZhbHVlQ2hhbmdlXS5lbWl0KG5leHQpO1xuICAgIH1cbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG4gIHN1Ym1pdChyZWFzb246IFdrbHlDbG9zZVJlYXNvbiA9IFwic3VibWl0XCIpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrKCk7XG4gICAgaWYgKCF0aGlzLmNhblN1Ym1pdCkgcmV0dXJuO1xuICAgIHRoaXMuY29tbWl0KCk7XG4gICAgaWYgKHRoaXMucHJlc2VudGF0aW9uID09PSBcInRyYW5zaWVudFwiKVxuICAgICAgdGhpc1tXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cy5DbG9zZWRdLmVtaXQocmVhc29uKTtcbiAgfVxuICBjYW5jZWwocmVhc29uOiBXa2x5Q2xvc2VSZWFzb24gPSBcImNsb3NlLWJ1dHRvblwiKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0pIHJldHVybjtcbiAgICB0aGlzLmxvYWQodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzW1drbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLkNsb3NlZF0uZW1pdChyZWFzb24pO1xuICB9XG4gIG5vdygpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSkgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSB0aGlzLmNsb2NrLm5vdygpO1xuICAgIGNvbnN0IGRheSA9IE1hdGguZmxvb3Iobi5nZXRUaW1lKCkgLyA4NjQwMDAwMCk7XG4gICAgdGhpcy5kcmFmdHMgPSBbMCwgMV0ubWFwKChpbmRleCkgPT4gKHtcbiAgICAgIC4uLnRoaXMuY2xvY2tEcmFmdChkYXksIG4pLFxuICAgICAgcHJlc2VudDogaW5kZXggPT09IDAgfHwgdGhpcy5pc1JhbmdlLFxuICAgIH0pKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmhhc0RhdGUgJiZcbiAgICAgIChkYXkgPCB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5IHx8IGRheSA+IHRoaXMubGFzdFN1cHBvcnRlZERheSlcbiAgICApIHtcbiAgICAgIHRoaXMucmVwb3J0KFtlcnJvcihcInVuc3VwcG9ydGVkLWFkYXB0ZXItZGF0ZVwiLCBkYXkpXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZm9jdXNlZCA9IGRheTtcbiAgICB0aGlzLnBvc2l0aW9uKGRheSwgdHJ1ZSk7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIHRoaXMuc3VibWl0KFwibm93XCIpO1xuICB9XG4gIHByaXZhdGUgY2xvY2tEcmFmdChkYXk6IG51bWJlciwgbm93OiBEYXRlKTogRHJhZnQge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmJsYW5rKGRheSksXG4gICAgICBob3VyOiBub3cuZ2V0VVRDSG91cnMoKSxcbiAgICAgIG1pbnV0ZTpcbiAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICBub3cuZ2V0VVRDTWludXRlcygpIC8gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1pbnV0ZVN0ZXBdLFxuICAgICAgICApICogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1pbnV0ZVN0ZXBdLFxuICAgICAgc2Vjb25kOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuU2hvd1NlY29uZHNdXG4gICAgICAgID8gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIG5vdy5nZXRVVENTZWNvbmRzKCkgLyB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuU2Vjb25kU3RlcF0sXG4gICAgICAgICAgKSAqIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TZWNvbmRTdGVwXVxuICAgICAgICA6IDAsXG4gICAgfTtcbiAgfVxuICBwcml2YXRlIGluaXRpYWxpemVNYW51YWxSYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pc1JhbmdlIHx8XG4gICAgICAhdGhpcy5oYXNEYXRlIHx8XG4gICAgICB0aGlzLmRyYWZ0cy5ldmVyeSgoZHJhZnQpID0+IGRyYWZ0LnByZXNlbnQpXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGxldCBzZWVkID0gdGhpcy5kcmFmdHMuZmluZCgoZHJhZnQpID0+IGRyYWZ0LnByZXNlbnQpO1xuICAgIGlmICghc2VlZCkge1xuICAgICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0gIT09IG51bGwpIHJldHVybjtcbiAgICAgIGNvbnN0IG5vdyA9IHRoaXMuY2xvY2subm93KCk7XG4gICAgICBjb25zdCBpbml0aWFsRXBvY2hEYXkgPVxuICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuSW5pdGlhbEVwb2NoRGF5XTtcbiAgICAgIGNvbnN0IGRheSA9XG4gICAgICAgIGluaXRpYWxFcG9jaERheSA9PT0gbnVsbFxuICAgICAgICAgID8gdGhpcy5kZWZhdWx0cy5pbml0aWFsRXBvY2hEYXkgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBNYXRoLmZsb29yKG5vdy5nZXRUaW1lKCkgLyA4NjQwMDAwMClcbiAgICAgICAgICAgIDogdGhpcy5kZWZhdWx0cy5pbml0aWFsRXBvY2hEYXlcbiAgICAgICAgICA6IGluaXRpYWxFcG9jaERheTtcbiAgICAgIHNlZWQgPSB7IC4uLnRoaXMuY2xvY2tEcmFmdChkYXksIG5vdyksIHByZXNlbnQ6IHRydWUgfTtcbiAgICB9XG4gICAgLy8gQ29tcGxldGUgbWlzc2luZyBlbmRwb2ludHMgd2l0aG91dCByZXBsYWNpbmcgc2VsZWN0ZWQgb3IgaW52YWxpZCBkcmFmdHMuXG4gICAgY29uc3QgaW5pdGlhbCA9IHNlZWQ7XG4gICAgdGhpcy5kcmFmdHMgPSB0aGlzLmRyYWZ0cy5tYXAoKGRyYWZ0KSA9PlxuICAgICAgZHJhZnQucHJlc2VudCA/IGRyYWZ0IDogeyAuLi5pbml0aWFsLCBkYXRlOiB7IC4uLmluaXRpYWwuZGF0ZSB9IH0sXG4gICAgKTtcbiAgICB0aGlzLmZpbmlzaCgpO1xuICAgIC8vIFBvc2l0aW9uaW5nIHJlbmRlcnMgYmVmb3JlIHZhbGlkYXRpb247IHJlZnJlc2ggY29tcGxldGlvbiBjb250cm9scyBhZnRlcndhcmQuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICB0b2dnbGVWaWV3KCk6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdIHx8ICF0aGlzLmhhc0RhdGUpIHJldHVybjtcbiAgICB0aGlzLnZpZXdNb2RlID0gdGhpcy52aWV3TW9kZSA9PT0gXCJjYWxlbmRhclwiID8gXCJtYW51YWxcIiA6IFwiY2FsZW5kYXJcIjtcbiAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gXCJtYW51YWxcIikgdGhpcy5pbml0aWFsaXplTWFudWFsUmFuZ2UoKTtcbiAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gXCJjYWxlbmRhclwiKSB0aGlzLnBvc2l0aW9uT25NYW51YWxEYXRlKCk7XG4gICAgdGhpc1tXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cy5WaWV3TW9kZUNoYW5nZV0uZW1pdCh0aGlzLnZpZXdNb2RlKTtcbiAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gXCJjYWxlbmRhclwiKSBzZXRUaW1lb3V0KCgpID0+IHRoaXMucmVzZXRTY3JvbGwoKSk7XG4gIH1cbiAgcHJpdmF0ZSBwb3NpdGlvbk9uTWFudWFsRGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBkcmFmdCA9IHRoaXMuZHJhZnRzW3RoaXMubWFudWFsRGF0ZUVuZHBvaW50XTtcbiAgICBpZiAoIWRyYWZ0IHx8ICFkcmFmdC5wcmVzZW50KSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIC8vIEEgdmFsaWQgZGF5IGZvbGxvd3MgdGhlIHNlbGVjdGlvbi4gQW4gaW1wb3NzaWJsZSBkYXkga2VlcHMgaXRzIGRyYWZ0XG4gICAgICAvLyBmaWVsZHMgYnV0IHN0aWxsIHNob3dzIHRoZSBjaG9zZW4gbW9udGggaW4gdGhlIGNhbGVuZGFyLlxuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KGRyYWZ0LmRhdGUpO1xuICAgICAgdGhpcy5mb2N1c2VkID0gdGFyZ2V0O1xuICAgICAgdGhpcy5wb3NpdGlvbih0YXJnZXQsIHRydWUpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KHsgLi4uZHJhZnQuZGF0ZSwgZGF5OiAxIH0pO1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmaXJzdDtcbiAgICAgICAgdGhpcy5wb3NpdGlvbihmaXJzdCwgdHJ1ZSk7XG4gICAgICB9IGNhdGNoIChfKSB7fVxuICAgIH1cbiAgfVxuICBtb250aHMoZHJhZnQ6IERyYWZ0KTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmdldE1vbnRocyhkcmFmdC5kYXRlLnllYXIpLm1hcCgobSkgPT4gbS5sYWJlbCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICBtb250aENvdW50KGRyYWZ0OiBEcmFmdCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubW9udGhzKGRyYWZ0KS5sZW5ndGggfHwgMTI7XG4gIH1cbiAgZ2V0IGluRGF5cygpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gZHJhZnREYXlEaWZmZXJlbmNlKHRoaXMuZHJhZnRzLCB0aGlzLmFkYXB0ZXIpO1xuICB9XG4gIGdldCBpbkRheXNMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRheXMgPSB0aGlzLmluRGF5cztcbiAgICByZXR1cm4gdGhpcy50KFwiaW5EYXlzXCIpLnJlcGxhY2UoXG4gICAgICAve3tcXHMqZGF5c1xccyp9fS9nLFxuICAgICAgZGF5cyA9PT0gbnVsbFxuICAgICAgICA/IHRoaXMudChcImRheXNVbmF2YWlsYWJsZVwiKVxuICAgICAgICA6IG5ldyBJbnRsLk51bWJlckZvcm1hdCh0aGlzLmVmZmVjdGl2ZUxvY2FsZSwge1xuICAgICAgICAgICAgdXNlR3JvdXBpbmc6IGZhbHNlLFxuICAgICAgICAgIH0pLmZvcm1hdChkYXlzKSxcbiAgICApO1xuICB9XG4gIGdldCByZXN1bHRpbmdFbmREYXRlKCk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRyYWZ0ID0gdGhpcy5kcmFmdHNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIGRyYWZ0LnVuc3VwcG9ydGVkRXBvY2hEYXkgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICB0aGlzLmFkYXB0ZXIudmFsaWRhdGVEYXRlKGRyYWZ0LmRhdGUpLmxlbmd0aFxuICAgICAgKVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHRoaXMuYWRhcHRlci5mb3JtYXREYXkoZHJhZnQuZGF0ZSksXG4gICAgICAgIHRoaXMuYWRhcHRlci5mb3JtYXRNb250aChkcmFmdC5kYXRlKSxcbiAgICAgICAgdGhpcy5hZGFwdGVyLmZvcm1hdFllYXIoZHJhZnQuZGF0ZSksXG4gICAgICBdLmpvaW4oXCIgXCIpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgfVxuICB0b2dnbGVFbmRWaWV3KHZpZXc6IFwiZGF0ZVwiIHwgXCJkYXlzXCIpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSkgcmV0dXJuO1xuICAgIHRoaXMuZW5kVmlldyA9IHZpZXc7XG4gIH1cbiAgZGF5cyh2YWx1ZTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgdGhpcy5tYW51YWxEYXRlRW5kcG9pbnQgPSAxO1xuICAgIHNldERyYWZ0RGF5RGlmZmVyZW5jZSh0aGlzLmRyYWZ0cywgdGhpcy5hZGFwdGVyLCB2YWx1ZSk7XG4gICAgdGhpcy5jaGVjaygpO1xuICB9XG4gIGZpZWxkKGluZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0pIHJldHVybjtcbiAgICBjb25zdCBkcmFmdCA9IHRoaXMuZHJhZnRzW2luZGV4XTtcbiAgICBkcmFmdC5wcmVzZW50ID0gdHJ1ZTtcbiAgICBpZiAoZmllbGQgPT09IFwiZGF5XCIgfHwgZmllbGQgPT09IFwieWVhclwiIHx8IGZpZWxkID09PSBcIm1vbnRoXCIpIHtcbiAgICAgIHRoaXMubWFudWFsRGF0ZUVuZHBvaW50ID0gaW5kZXg7XG4gICAgICBkZWxldGUgZHJhZnQudW5zdXBwb3J0ZWRFcG9jaERheTtcbiAgICAgIGxldCBkYXRlID0geyAuLi5kcmFmdC5kYXRlLCBbZmllbGRdOiB2YWx1ZSB9IGFzIFdrbHlDYWxlbmRhckRhdGU7XG4gICAgICBpZiAoZmllbGQgPT09IFwibW9udGhcIikge1xuICAgICAgICBsZXQgbW9udGg7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbW9udGggPSB0aGlzLmFkYXB0ZXJcbiAgICAgICAgICAgIC5nZXRNb250aHMoZGF0ZS55ZWFyKVxuICAgICAgICAgICAgLmZpbmQoKG0pID0+IG0ubW9udGggPT09IHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgZGF0ZSA9IHsgLi4uZGF0ZSwgbW9udGhDb2RlOiBtb250aCA/IG1vbnRoLm1vbnRoQ29kZSA6IFwiXCIgfTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZCA9PT0gXCJ5ZWFyXCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtb250aHMgPSB0aGlzLmFkYXB0ZXIuZ2V0TW9udGhzKHZhbHVlKTtcbiAgICAgICAgICBjb25zdCBtb250aCA9IG1vbnRocy5maW5kKChtKSA9PiBtLm1vbnRoQ29kZSA9PT0gZGF0ZS5tb250aENvZGUpO1xuICAgICAgICAgIGlmIChtb250aCkgZGF0ZSA9IHsgLi4uZGF0ZSwgbW9udGg6IG1vbnRoLm1vbnRoIH07XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB9XG4gICAgICBkcmFmdC5kYXRlID0gZGF0ZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkID09PSBcImhvdXJcIiAmJiB0aGlzLmVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gXCJoMTJcIilcbiAgICAgIGRyYWZ0LmhvdXIgPVxuICAgICAgICB2YWx1ZSA9PT0gbnVsbFxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogdmFsdWUgPj0gMSAmJiB2YWx1ZSA8PSAxMlxuICAgICAgICAgICAgPyAodmFsdWUgJSAxMikgKyAoKGRyYWZ0LmhvdXIgfHwgMCkgPj0gMTIgPyAxMiA6IDApXG4gICAgICAgICAgICA6IDI0ICsgdmFsdWU7XG4gICAgZWxzZSAoZHJhZnQgYXMgYW55KVtmaWVsZF0gPSB2YWx1ZTtcbiAgICB0aGlzLmNoZWNrKCk7XG4gIH1cbiAgZGlzcGxheUhvdXIoZHJhZnQ6IERyYWZ0KTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIGRyYWZ0LmhvdXIgPT09IG51bGxcbiAgICAgID8gbnVsbFxuICAgICAgOiB0aGlzLmVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gXCJoMTJcIlxuICAgICAgICA/IGRyYWZ0LmhvdXIgJSAxMiB8fCAxMlxuICAgICAgICA6IGRyYWZ0LmhvdXI7XG4gIH1cbiAgcGVyaW9kKGluZGV4OiBudW1iZXIsIHBlcmlvZDogXCJhbVwiIHwgXCJwbVwiIHwgXCIyNFwiKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0pIHJldHVybjtcbiAgICBpZiAocGVyaW9kID09PSBcIjI0XCIpIHRoaXMuZWZmZWN0aXZlSG91ckN5Y2xlID0gXCJoMjRcIjtcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZWZmZWN0aXZlSG91ckN5Y2xlID0gXCJoMTJcIjtcbiAgICAgIHRoaXMuZHJhZnRzW2luZGV4XS5ob3VyID1cbiAgICAgICAgKCh0aGlzLmRyYWZ0c1tpbmRleF0uaG91ciB8fCAwKSAlIDEyKSArIChwZXJpb2QgPT09IFwicG1cIiA/IDEyIDogMCk7XG4gICAgICB0aGlzLmRyYWZ0c1tpbmRleF0ucHJlc2VudCA9IHRydWU7XG4gICAgICB0aGlzLmZpbmlzaCgpO1xuICAgIH1cbiAgfVxuICBzZWxlY3RlZChkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRyYWZ0cy5zb21lKChkKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZC5wcmVzZW50ICYmIHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheShkLmRhdGUpID09PSBkYXk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBpblJhbmdlKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzUmFuZ2UgfHwgIXRoaXMuZHJhZnRzLmV2ZXJ5KChkKSA9PiBkLnByZXNlbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmFkYXB0ZXIuZGF0ZVRvRXBvY2hEYXkodGhpcy5kcmFmdHNbMF0uZGF0ZSksXG4gICAgICAgIGIgPSB0aGlzLmFkYXB0ZXIuZGF0ZVRvRXBvY2hEYXkodGhpcy5kcmFmdHNbMV0uZGF0ZSk7XG4gICAgICByZXR1cm4gZGF5ID4gTWF0aC5taW4oYSwgYikgJiYgZGF5IDwgTWF0aC5tYXgoYSwgYik7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBkYXlEaXNhYmxlZChkYXk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmIChkYXkgPCB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5IHx8IGRheSA+IHRoaXMubGFzdFN1cHBvcnRlZERheSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRlID0gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGRheSk7XG4gICAgICBjb25zdCBpc0RhdGVEaXNhYmxlZCA9IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Jc0RhdGVEaXNhYmxlZF07XG4gICAgICBpZiAoXG4gICAgICAgIGlzRGF0ZURpc2FibGVkICYmXG4gICAgICAgIGlzRGF0ZURpc2FibGVkKGRheSwge1xuICAgICAgICAgIG1vZGU6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSxcbiAgICAgICAgICBlbmRwb2ludDogdGhpcy5pc1JhbmdlXG4gICAgICAgICAgICA/IHRoaXMuZHJhZnRzWzBdPy5wcmVzZW50ICYmICF0aGlzLmRyYWZ0c1sxXT8ucHJlc2VudFxuICAgICAgICAgICAgICA/IFwiZW5kXCJcbiAgICAgICAgICAgICAgOiBcInN0YXJ0XCJcbiAgICAgICAgICAgIDogXCJzaW5nbGVcIixcbiAgICAgICAgICBjYWxlbmRhckRhdGU6IGRhdGUsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgbWluID0gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1pbl07XG4gICAgICBjb25zdCBtYXggPSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTWF4XTtcbiAgICAgIGlmIChtaW4gJiYgZGF5IDwgZGVjb2RlSXNvKG1pbikuZXBvY2hEYXkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKG1heCAmJiBkYXkgPiBkZWNvZGVJc28obWF4KS5lcG9jaERheSkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHNlbGVjdChkYXk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdIHx8IHRoaXMuZGF5RGlzYWJsZWQoZGF5KSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmZvY3VzZWQgPSBkYXk7XG4gICAgY29uc3QgaW5kZXggPVxuICAgICAgdGhpcy5pc1JhbmdlICYmIHRoaXMuZHJhZnRzWzBdLnByZXNlbnQgJiYgIXRoaXMuZHJhZnRzWzFdLnByZXNlbnQgPyAxIDogMDtcbiAgICBpZiAodGhpcy5pc1JhbmdlICYmIGluZGV4ID09PSAwKSB0aGlzLmRyYWZ0c1sxXS5wcmVzZW50ID0gZmFsc2U7XG4gICAgZGVsZXRlIHRoaXMuZHJhZnRzW2luZGV4XS51bnN1cHBvcnRlZEVwb2NoRGF5O1xuICAgIHRoaXMuZHJhZnRzW2luZGV4XS5kYXRlID0gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGRheSk7XG4gICAgdGhpcy5kcmFmdHNbaW5kZXhdLnByZXNlbnQgPSB0cnVlO1xuICAgIHRoaXMub3JkZXJEcmFmdHMoKTtcbiAgICB0aGlzLnJlbmRlclJvd3MoKTtcbiAgICB0aGlzLmZpbmlzaCgpO1xuICAgIGlmIChcbiAgICAgIHRoaXMucHJlc2VudGF0aW9uID09PSBcInRyYW5zaWVudFwiICYmXG4gICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0gPT09IFwiZGF0ZVwiICYmXG4gICAgICB0aGlzLnZpZXdNb2RlID09PSBcImNhbGVuZGFyXCJcbiAgICApXG4gICAgICB0aGlzLnN1Ym1pdChcImF1dG8tc3VibWl0XCIpO1xuICB9XG4gIGtleShldmVudDogS2V5Ym9hcmRFdmVudCwgZGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgZGVsdGEgPSAwO1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpIGRlbHRhID0gLTE7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpIGRlbHRhID0gMTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93VXBcIikgZGVsdGEgPSAtNztcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93RG93blwiKSBkZWx0YSA9IDc7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJQYWdlVXBcIilcbiAgICAgIGRlbHRhID0gLTcgKiAoZXZlbnQuc2hpZnRLZXkgPyB0aGlzLnZpc2libGVDb3VudCA6IDEpO1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiUGFnZURvd25cIilcbiAgICAgIGRlbHRhID0gNyAqIChldmVudC5zaGlmdEtleSA/IHRoaXMudmlzaWJsZUNvdW50IDogMSk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJIb21lXCIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNjcm9sbFRvRXBvY2hEYXkodGhpcy50b2RheSwgeyBmb2N1czogdHJ1ZSB9KTtcbiAgICB9XG4gICAgaWYgKGRlbHRhKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZGF5ICsgZGVsdGE7XG4gICAgICBpZiAodGFyZ2V0ID49IHRoaXMuZmlyc3RTdXBwb3J0ZWREYXkgJiYgdGFyZ2V0IDw9IHRoaXMubGFzdFN1cHBvcnRlZERheSlcbiAgICAgICAgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KHRhcmdldCwgeyBmb2N1czogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBwb3NpdGlvbihcbiAgICBkYXk6IG51bWJlcixcbiAgICBwcmVzZXQgPSBmYWxzZSxcbiAgICBvcHRpb25zOiBXa2x5SnVtcE9wdGlvbnMgPSB7fSxcbiAgKTogdm9pZCB7XG4gICAgZGF5ID0gTWF0aC5tYXgoXG4gICAgICB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5LFxuICAgICAgTWF0aC5taW4odGhpcy5sYXN0U3VwcG9ydGVkRGF5LCBkYXkpLFxuICAgICk7XG4gICAgdGhpcy5hbmNob3JXZWVrID0gYWJzb2x1dGVXZWVrT2YoZGF5LCB0aGlzLmVmZmVjdGl2ZU9mZnNldCk7XG4gICAgY29uc3Qgdmlld3BvcnRQcmVzZXQgPSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmlld3BvcnRQcmVzZXRdO1xuICAgIHRoaXMuY2xpcE1vbnRoID0gcHJlc2V0ICYmIHZpZXdwb3J0UHJlc2V0LmtpbmQgPT09IFwiZnVsbC1tb250aFwiO1xuICAgIGlmIChwcmVzZXQgJiYgdmlld3BvcnRQcmVzZXQua2luZCAhPT0gXCJ3ZWVrc1wiKSB7XG4gICAgICBjb25zdCBkID0gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGRheSk7XG4gICAgICB0aGlzLmluaXRpYWxNb250aCA9IGQueWVhciArIFwiL1wiICsgZC5tb250aENvZGU7XG4gICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBjYWxlbmRhck1vbnRoQm91bmRzKHRoaXMuYWRhcHRlciwgZGF5KTtcbiAgICAgIHRoaXMuZmlyc3RXZWVrID0gYWJzb2x1dGVXZWVrT2Yoc3RhcnQsIHRoaXMuZWZmZWN0aXZlT2Zmc2V0KTtcbiAgICAgIHRoaXMudmlzaWJsZUNvdW50ID1cbiAgICAgICAgYWJzb2x1dGVXZWVrT2YoZW5kLCB0aGlzLmVmZmVjdGl2ZU9mZnNldCkgLSB0aGlzLmZpcnN0V2VlayArIDE7XG4gICAgICBpZiAoXG4gICAgICAgIHZpZXdwb3J0UHJlc2V0LmtpbmQgPT09IFwiZnVsbC1tb250aC1hbmQtYXJvdW5kXCIgJiZcbiAgICAgICAgIXRoaXMuY29uZmlnRXJyb3JzLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IHZpZXdwb3J0UHJlc2V0LmV4dHJhV2Vla3NCZWZvcmUgfHwgMCxcbiAgICAgICAgICBhZnRlciA9IHZpZXdwb3J0UHJlc2V0LmV4dHJhV2Vla3NBZnRlciB8fCAwO1xuICAgICAgICB0aGlzLmZpcnN0V2VlayAtPSBiZWZvcmU7XG4gICAgICAgIHRoaXMudmlzaWJsZUNvdW50ICs9IGJlZm9yZSArIGFmdGVyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmlld3BvcnRQcmVzZXQua2luZCA9PT0gXCJ3ZWVrc1wiKVxuICAgICAgICB0aGlzLnZpc2libGVDb3VudCA9IHRoaXMuY29uZmlnRXJyb3JzLmxlbmd0aFxuICAgICAgICAgID8gNlxuICAgICAgICAgIDogdmlld3BvcnRQcmVzZXQudmlzaWJsZVdlZWtDb3VudDtcbiAgICAgIHRoaXMuZmlyc3RXZWVrID1cbiAgICAgICAgdGhpcy5hbmNob3JXZWVrIC1cbiAgICAgICAgKG9wdGlvbnMuYWxpZ24gPT09IFwic3RhcnRcIlxuICAgICAgICAgID8gMFxuICAgICAgICAgIDogb3B0aW9ucy5hbGlnbiA9PT0gXCJlbmRcIlxuICAgICAgICAgICAgPyB0aGlzLnZpc2libGVDb3VudCAtIDFcbiAgICAgICAgICAgIDogTWF0aC5mbG9vcih0aGlzLnZpc2libGVDb3VudCAvIDIpKTtcbiAgICB9XG4gICAgdGhpcy5maXJzdFdlZWsgPSB0aGlzLmNsYW1wRmlyc3RXZWVrKHRoaXMuZmlyc3RXZWVrKTtcbiAgICB0aGlzLmJhc2VXZWVrID0gdGhpcy5maXJzdFdlZWsgLSAxMDAwO1xuICAgIHRoaXMucmVuZGVyUm93cygpO1xuICAgIC8vIEFwcGx5IHRoZSBuZXcgcnVud2F5IGJlZm9yZSB3cml0aW5nIHNjcm9sbFRvcCBvciBsb2NhdGluZyBhIGZvY3VzIHRhcmdldC5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnJlc2V0U2Nyb2xsKCk7XG4gIH1cbiAgcHJpdmF0ZSByZXNldFNjcm9sbCgpOiB2b2lkIHtcbiAgICAvLyBSb3VuZCB3ZWVrIGJvdW5kYXJpZXMgdG8gYXZvaWQgc2Nyb2xsVG9wIHRydW5jYXRpb24gdW5kZXIgQ1NTIHpvb20uXG4gICAgaWYgKHRoaXMuc2Nyb2xsZXIpXG4gICAgICB0aGlzLnNjcm9sbGVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gTWF0aC5yb3VuZCgxMDAwICogdGhpcy5yb3dIZWlnaHQpO1xuICB9XG4gIHNjcm9sbChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMuc25hcFBlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMuc2NoZWR1bGVTbmFwKCk7XG4gICAgLy8gUXVhbnRpemUgZGlzcGxhY2VtZW50IGFyb3VuZCB0aGUgcmVzZXQgcG9pbnQsIGVxdWFsbHkgaW4gYm90aCBkaXJlY3Rpb25zLlxuICAgIGNvbnN0IHJlbGF0aXZlUm93cyA9IGVsZW1lbnQuc2Nyb2xsVG9wIC8gdGhpcy5yb3dIZWlnaHQgLSAxMDAwO1xuICAgIGNvbnN0IGluZGV4ID1cbiAgICAgIDEwMDAgKyBNYXRoLnNpZ24ocmVsYXRpdmVSb3dzKSAqIE1hdGgucm91bmQoTWF0aC5hYnMocmVsYXRpdmVSb3dzKSk7XG4gICAgY29uc3QgcmVxdWVzdGVkRmlyc3QgPSB0aGlzLmJhc2VXZWVrICsgaW5kZXg7XG4gICAgY29uc3QgZmlyc3QgPSB0aGlzLmNsYW1wRmlyc3RXZWVrKHJlcXVlc3RlZEZpcnN0KTtcbiAgICBpZiAocmVxdWVzdGVkRmlyc3QgIT09IGZpcnN0KSB7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IE1hdGgucm91bmQoKGZpcnN0IC0gdGhpcy5iYXNlV2VlaykgKiB0aGlzLnJvd0hlaWdodCk7XG4gICAgfVxuICAgIGlmIChmaXJzdCA9PT0gdGhpcy5maXJzdFdlZWspIHJldHVybjtcbiAgICB0aGlzLmNsaXBNb250aCA9IGZhbHNlO1xuICAgIHRoaXMuZmlyc3RXZWVrID0gZmlyc3Q7XG4gICAgdGhpcy5hbmNob3JXZWVrID0gZmlyc3QgKyBNYXRoLmZsb29yKHRoaXMudmlzaWJsZUNvdW50IC8gMik7XG4gICAgaWYgKGluZGV4IDwgMTAwIHx8IGluZGV4ID4gMTkwMCkge1xuICAgICAgLy8gUHJlc2VydmUgc2lnbmVkIGRpc3BsYWNlbWVudCBmcm9tIHRoaXMgd2VlazsgbW9kdWxvIHR1cm5zIGZyYWN0aW9uYWxcbiAgICAgIC8vIHJvdW5kaW5nIGp1c3QgYmVsb3cgYSBib3VuZGFyeSBpbnRvIGFsbW9zdCBhIGZ1bGwgcm93IGFmdGVyIHJlYmFzaW5nLlxuICAgICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgICAgZWxlbWVudC5zY3JvbGxUb3AgLSAoZmlyc3QgLSB0aGlzLmJhc2VXZWVrKSAqIHRoaXMucm93SGVpZ2h0O1xuICAgICAgdGhpcy5iYXNlV2VlayA9IGZpcnN0IC0gMTAwMDtcbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gTWF0aC5yb3VuZCgxMDAwICogdGhpcy5yb3dIZWlnaHQgKyBvZmZzZXQpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlclJvd3MoKTtcbiAgfVxuICBwcml2YXRlIHNjaGVkdWxlU25hcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zY3JvbGxFbmRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsRW5kVGltZXIpO1xuICAgIHRoaXMuc2Nyb2xsRW5kVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc25hcFdlZWsoKSwgMjAwKTtcbiAgfVxuICBzbmFwV2VlaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zY3JvbGxFbmRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsRW5kVGltZXIpO1xuICAgIHRoaXMuc2Nyb2xsRW5kVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCF0aGlzLnNuYXBQZW5kaW5nIHx8ICF0aGlzLnNjcm9sbGVyKSByZXR1cm47XG4gICAgdGhpcy5zbmFwUGVuZGluZyA9IGZhbHNlO1xuICAgIC8vIEFsaWduIHRoZSBjdXJyZW50IHZpcnR1YWwgd2VlayB3aXRob3V0IHJlYnVpbGRpbmcgb3IgcmViYXNpbmcgaXRzIHJvd3MuXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuc2Nyb2xsZXIubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB0YXJnZXQgPSBNYXRoLnJvdW5kKFxuICAgICAgKHRoaXMuZmlyc3RXZWVrIC0gdGhpcy5iYXNlV2VlaykgKiB0aGlzLnJvd0hlaWdodCxcbiAgICApO1xuICAgIGlmIChlbGVtZW50LnNjcm9sbFRvcCAhPT0gdGFyZ2V0KSBlbGVtZW50LnNjcm9sbFRvcCA9IHRhcmdldDtcbiAgfVxuICBwcml2YXRlIHNob3dGaXJzdFdlZWsod2VlazogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmlyc3QgPSB0aGlzLmNsYW1wRmlyc3RXZWVrKHdlZWspO1xuICAgIGlmIChmaXJzdCA9PT0gdGhpcy5maXJzdFdlZWspIHJldHVybjtcbiAgICB0aGlzLmNsaXBNb250aCA9IGZhbHNlO1xuICAgIHRoaXMuZmlyc3RXZWVrID0gZmlyc3Q7XG4gICAgdGhpcy5hbmNob3JXZWVrID0gZmlyc3QgKyBNYXRoLmZsb29yKHRoaXMudmlzaWJsZUNvdW50IC8gMik7XG4gICAgdGhpcy5iYXNlV2VlayA9IGZpcnN0IC0gMTAwMDtcbiAgICB0aGlzLnJlbmRlclJvd3MoKTtcbiAgICB0aGlzLnJlc2V0U2Nyb2xsKCk7XG4gIH1cbiAgY2FuTW92ZVdlZWsoZGVsdGE6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsYW1wRmlyc3RXZWVrKHRoaXMuZmlyc3RXZWVrICsgZGVsdGEpICE9PSB0aGlzLmZpcnN0V2VlaztcbiAgfVxuICBtb3ZlV2VlayhkZWx0YTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKVxuICAgICAgdGhpcy5zaG93Rmlyc3RXZWVrKHRoaXMuZmlyc3RXZWVrICsgZGVsdGEpO1xuICB9XG4gIHByaXZhdGUgcmVuZGVyUm93cygpOiB2b2lkIHtcbiAgICAvLyBLZWVwIHRoZSB2aXJ0dWFsIHNjcm9sbCBvZmZzZXQgaGVyZTsgcm93IGRhdGEgaXMgc2hhcmVkIGFjcm9zcyBBbmd1bGFyIHZlcnNpb25zLlxuICAgIGNvbnN0IG92ZXJzY2FuID0gTWF0aC5tYXgoXG4gICAgICAwLFxuICAgICAgTWF0aC5taW4oNTAsIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5PdmVyc2NhbldlZWtzXSB8fCAwKSxcbiAgICApO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5maXJzdFdlZWsgLSBvdmVyc2NhbjtcbiAgICB0aGlzLnBhZGRpbmdUb3AgPSAoc3RhcnQgLSB0aGlzLmJhc2VXZWVrKSAqIHRoaXMucm93SGVpZ2h0O1xuICAgIHRoaXMucm93cyA9IGNyZWF0ZVdlZWtSb3dzKHtcbiAgICAgIGdlbmVyYXRvcjogdGhpcy5nZW5lcmF0b3IsXG4gICAgICBhZGFwdGVyOiB0aGlzLmFkYXB0ZXIsXG4gICAgICBzdGFydFdlZWs6IHN0YXJ0LFxuICAgICAgY291bnQ6IHRoaXMudmlzaWJsZUNvdW50ICsgMiAqIG92ZXJzY2FuLFxuICAgICAgZmlyc3RWaXNpYmxlV2VlazogdGhpcy5maXJzdFdlZWssXG4gICAgICBmaXJzdFN1cHBvcnRlZERheTogdGhpcy5maXJzdFN1cHBvcnRlZERheSxcbiAgICAgIGxhc3RTdXBwb3J0ZWREYXk6IHRoaXMubGFzdFN1cHBvcnRlZERheSxcbiAgICAgIGNsaXBNb250aDogdGhpcy5jbGlwTW9udGgsXG4gICAgICBpbml0aWFsTW9udGg6IHRoaXMuaW5pdGlhbE1vbnRoLFxuICAgICAgd2Vla0xhYmVsTW9kZTogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbE1vZGVdLFxuICAgICAgd2Vla0xhYmVsRm9ybWF0dGVyOlxuICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsRm9ybWF0dGVyXSB8fCBudWxsLFxuICAgICAgaXNEYXlEaXNhYmxlZDogKGRheSkgPT4gdGhpcy5kYXlEaXNhYmxlZChkYXkpLFxuICAgIH0pO1xuICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuVmlld3BvcnRDaGFuZ2VdLmVtaXQoe1xuICAgICAgZmlyc3RWaXNpYmxlQWJzb2x1dGVXZWVrOiB0aGlzLmZpcnN0V2VlayxcbiAgICAgIGxhc3RWaXNpYmxlQWJzb2x1dGVXZWVrOiB0aGlzLmZpcnN0V2VlayArIHRoaXMudmlzaWJsZUNvdW50IC0gMSxcbiAgICAgIGFuY2hvckFic29sdXRlV2VlazogdGhpcy5hbmNob3JXZWVrLFxuICAgIH0pO1xuICB9XG4gIC8vIFJldGFpbiBkYXkgRE9NIG5vZGVzIGFuZCBrZXlib2FyZCBmb2N1cyB3aGVuIHJvdyBtZXRhZGF0YSBpcyByZWdlbmVyYXRlZC5cbiAgdHJhY2tDZWxsKF9pOiBudW1iZXIsIGNlbGw6IHsgZXBvY2hEYXk6IG51bWJlciB9KTogbnVtYmVyIHtcbiAgICByZXR1cm4gY2VsbC5lcG9jaERheTtcbiAgfVxuICB0cmFja1JvdyhfaTogbnVtYmVyLCByb3c6IFJvdyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHJvdy53ZWVrLmFic29sdXRlV2VlaztcbiAgfVxuICBzY3JvbGxUb0Vwb2NoRGF5KGRheTogbnVtYmVyLCBvcHRpb25zOiBXa2x5SnVtcE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIGludGVnZXIoZGF5KTtcbiAgICB0aGlzLmFkYXB0ZXIuZXBvY2hEYXlUb0RhdGUoZGF5KTtcbiAgICBkYXkgPSBNYXRoLm1heChcbiAgICAgIHRoaXMuZmlyc3RTdXBwb3J0ZWREYXksXG4gICAgICBNYXRoLm1pbih0aGlzLmxhc3RTdXBwb3J0ZWREYXksIGRheSksXG4gICAgKTtcbiAgICAvLyBwb3NpdGlvbiByZW5kZXJzIHN5bmNocm9ub3VzbHk7IHB1Ymxpc2ggdGhlIHRhYiBzdG9wIGJlZm9yZSB0aGF0IHJlbmRlci5cbiAgICBpZiAob3B0aW9ucy5mb2N1cykgdGhpcy5mb2N1c2VkID0gZGF5O1xuICAgIHRoaXMucG9zaXRpb24oZGF5LCBmYWxzZSwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuc2VsZWN0KSB0aGlzLnNlbGVjdChkYXkpO1xuICAgIGlmIChvcHRpb25zLmZvY3VzKSB0aGlzLmZvY3VzRGF5KCk7XG4gIH1cbiAgc2Nyb2xsVG9BYnNvbHV0ZVdlZWsod2VlazogbnVtYmVyLCBvcHRpb25zOiBXa2x5SnVtcE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIC8vIEEgYm91bmRhcnkgd2VlayBjYW4gc3RhcnQgYmVmb3JlIHRoZSBhZGFwdGVyJ3MgZmlyc3Qgc3VwcG9ydGVkIGRheS5cbiAgICBjb25zdCBmaXJzdCA9IGZpcnN0RXBvY2hEYXlPZih3ZWVrLCB0aGlzLmVmZmVjdGl2ZU9mZnNldCk7XG4gICAgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KFxuICAgICAgd2VlayA9PT0gdGhpcy5maXJzdFN1cHBvcnRlZFdlZWtcbiAgICAgICAgPyBNYXRoLm1heChmaXJzdCwgdGhpcy5maXJzdFN1cHBvcnRlZERheSlcbiAgICAgICAgOiBmaXJzdCxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfVxuICBzY3JvbGxUb0NhbGVuZGFyRGF0ZShcbiAgICBkYXRlOiBXa2x5Q2FsZW5kYXJEYXRlLFxuICAgIG9wdGlvbnM6IFdrbHlKdW1wT3B0aW9ucyA9IHt9LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbFRvRXBvY2hEYXkodGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KGRhdGUpLCBvcHRpb25zKTtcbiAgfVxuICBzY3JvbGxUb1ZhbHVlKHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM6IFdrbHlKdW1wT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KGRlY29kZUlzbyh2YWx1ZSkuZXBvY2hEYXksIG9wdGlvbnMpO1xuICB9XG4gIGZvY3VzRGF5KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5icm93c2VyKSByZXR1cm47XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHJldHVybjtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgY29uc3QgZGF5ID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJ1tkYXRhLWRheT1cIicgKyB0aGlzLmZvY3VzZWQgKyAnXCJdJyxcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCBmYWxsYmFjayA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgIFwiYnV0dG9uOm5vdCg6ZGlzYWJsZWQpLGlucHV0Om5vdCg6ZGlzYWJsZWQpXCIsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgKGRheSB8fCBmYWxsYmFjayk/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPHNlY3Rpb25cbiAgY2xhc3M9XCJ3a2x5XCJcbiAgW2F0dHIuZGlyXT1cImRpcmVjdGlvblwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkFyaWFMYWJlbF0gfHwgJ0RhdGUgYW5kIHRpbWUgcGlja2VyJ1xuICBcIlxuICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5BcmlhRGVzY3JpYmVkQnldXCJcbiAgKGZvY3Vzb3V0KT1cInRvdWNoZWQoKVwiXG4+XG4gIDxoZWFkZXIgY2xhc3M9XCJ0b29sYmFyXCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJoYXNEYXRlXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KHZpZXdNb2RlID09PSAnY2FsZW5kYXInID8gJ21hbnVhbCcgOiAnY2FsZW5kYXInKVwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlVmlldygpXCJcbiAgICA+XG4gICAgICB7eyB2aWV3TW9kZSA9PT0gXCJjYWxlbmRhclwiID8gXCLimLdcIiA6IFwi4pamXCIgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8c3BhbiAqbmdJZj1cImhhc0RhdGVcIiBjbGFzcz1cInllYXItY29udHJvbFwiPnt7IHRpdGxlIH19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwic3BhY2VyXCI+PC9zcGFuXG4gICAgPjxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJub3dcIlxuICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgKGNsaWNrKT1cIm5vdygpXCJcbiAgICA+XG4gICAgICB7eyB0KFwibm93XCIpIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJwcmVzZW50YXRpb24gPT09ICd0cmFuc2llbnQnXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdjbG9zZScpXCJcbiAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXG4gICAgPlxuICAgICAgw5dcbiAgICA8L2J1dHRvbj5cbiAgPC9oZWFkZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEYXRlICYmIHZpZXdNb2RlID09PSAnY2FsZW5kYXInXCI+XG4gICAgPGRpdlxuICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkFyaWFMYWJlbF0gfHwgJ0NhbGVuZGFyJ1xuICAgICAgXCJcbiAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cImlzUmFuZ2VcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgIGNsYXNzPVwid2Vlay1oZWFkXCJcbiAgICAgICAgW2NsYXNzLm5vLWxhYmVsXT1cIlxuICAgICAgICAgIGNvbXBhY3QgfHxcbiAgICAgICAgICAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbE1vZGVdID09PSAnaGlkZGVuJyAmJlxuICAgICAgICAgICAgIXRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxGb3JtYXR0ZXJdKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAhY29tcGFjdCAmJlxuICAgICAgICAgICAgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxNb2RlXSAhPT0gJ2hpZGRlbicgfHxcbiAgICAgICAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbEZvcm1hdHRlcl0pXG4gICAgICAgICAgXCJcbiAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICBhcmlhLWxhYmVsPVwiV2Vla1wiXG4gICAgICAgID48L3NwYW5cbiAgICAgICAgPjxzcGFuICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla2RheXNcIiByb2xlPVwiY29sdW1uaGVhZGVyXCI+e3sgZGF5IH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICNzY3JvbGxlclxuICAgICAgICBjbGFzcz1cIndlZWstc2Nyb2xsXCJcbiAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJ2aXNpYmxlQ291bnQgKiByb3dIZWlnaHRcIlxuICAgICAgICAoc2Nyb2xsKT1cInNjcm9sbCgkZXZlbnQpXCJcbiAgICAgICAgKHNjcm9sbGVuZCk9XCJzbmFwV2VlaygpXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBbc3R5bGUuaGVpZ2h0LnB4XT1cInNjcm9sbEhlaWdodFwiIGNsYXNzPVwic2Nyb2xsLXNwYWNlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd3NcIiBbc3R5bGUudG9wLnB4XT1cInBhZGRpbmdUb3BcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyB0cmFja0J5OiB0cmFja1Jvd1wiXG4gICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICBjbGFzcz1cIndlZWstcm93XCJcbiAgICAgICAgICAgICAgW2NsYXNzLm5vLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgIGNvbXBhY3QgfHxcbiAgICAgICAgICAgICAgICAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbE1vZGVdID09PVxuICAgICAgICAgICAgICAgICAgJ2hpZGRlbicgJiZcbiAgICAgICAgICAgICAgICAgICF0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsRm9ybWF0dGVyXSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgIWNvbXBhY3QgJiZcbiAgICAgICAgICAgICAgICAgICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsTW9kZV0gIT09XG4gICAgICAgICAgICAgICAgICAgICdoaWRkZW4nIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxGb3JtYXR0ZXJdKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgcm9sZT1cInJvd2hlYWRlclwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3ZWVrLW51bWJlclwiXG4gICAgICAgICAgICAgICAgPnt7IHJvdy5sYWJlbCB9fTwvc3BhblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgIGxldCBjZWxsIG9mIHJvdy5jZWxscztcbiAgICAgICAgICAgICAgICAgIGxldCBkYXlJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tDZWxsXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtd2Vla2RheS1pbmRleF09XCJkYXlJbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb2xpbmRleF09XCJcbiAgICAgICAgICAgICAgICAgIGRheUluZGV4ICtcbiAgICAgICAgICAgICAgICAgIChjb21wYWN0IHx8XG4gICAgICAgICAgICAgICAgICAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbE1vZGVdID09PVxuICAgICAgICAgICAgICAgICAgICAnaGlkZGVuJyAmJlxuICAgICAgICAgICAgICAgICAgICAhdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbEZvcm1hdHRlcl0pXG4gICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICA6IDIpXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInNlbGVjdGVkKGNlbGwuZXBvY2hEYXkpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgY2VsbC5kaXNhYmxlZCB8fCB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MucmFuZ2VdPVwiaW5SYW5nZShjZWxsLmVwb2NoRGF5KVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJjZWxsLmhpZGRlblwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm9kZC1tb250aF09XCJjZWxsLmRhdGUgJiYgY2VsbC5kYXRlLm1vbnRoICUgMiA9PT0gMVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiJ2Fubm90YXRpb24gYW5ub3RhdGlvbi0tJyArIGRheUluZGV4XCI+e3tcbiAgICAgICAgICAgICAgICAgIGNlbGwuYW5ub3RhdGlvblxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkYXlcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kYXldPVwiY2VsbC5lcG9jaERheVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNlbGwuYWNjZXNzaWJsZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwiY2VsbC5lcG9jaERheSA9PT0gdG9kYXkgPyAnZGF0ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgIGNlbGwuZGlzYWJsZWQgfHwgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIlxuICAgICAgICAgICAgICAgICAgICAhY2VsbC5oaWRkZW4gJiYgY2VsbC5lcG9jaERheSA9PT0gZm9jdXNlZCA/IDAgOiAtMVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZChjZWxsLmVwb2NoRGF5KVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MudG9kYXldPVwiY2VsbC5lcG9jaERheSA9PT0gdG9kYXlcIlxuICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cImZvY3VzZWQgPSBjZWxsLmVwb2NoRGF5XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3QoY2VsbC5lcG9jaERheSlcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5KCRldmVudCwgY2VsbC5lcG9jaERheSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGNlbGwubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwid2Vlay1uYXZpZ2F0aW9uXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSB8fCAhY2FuTW92ZVdlZWsoLTEpXG4gICAgICAgIFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidCgncHJldmlvdXMnKVwiXG4gICAgICAgIChjbGljayk9XCJtb3ZlV2VlaygtMSlcIlxuICAgICAgPlxuICAgICAgICDihpE8L2J1dHRvblxuICAgICAgPjxzcGFuPnt7IHRpdGxlIH19PC9zcGFuXG4gICAgICA+PGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0gfHwgIWNhbk1vdmVXZWVrKDEpXG4gICAgICAgIFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnbmV4dCcpXCJcbiAgICAgICAgKGNsaWNrKT1cIm1vdmVXZWVrKDEpXCJcbiAgICAgID5cbiAgICAgICAg4oaTXG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXJcbiAgICAqbmdGb3I9XCJsZXQgZHJhZnQgb2YgZHJhZnRzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0RyYWZ0XCJcbiAgPlxuICAgIDxmaWVsZHNldFxuICAgICAgKm5nSWY9XCIoaSA9PT0gMCB8fCBpc1JhbmdlKSAmJiAoaGFzVGltZSB8fCB2aWV3TW9kZSA9PT0gJ21hbnVhbCcpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaXNSYW5nZSA/IHQoaSA9PT0gMCA/ICdzdGFydCcgOiAnZW5kJykgOiBudWxsXCJcbiAgICA+XG4gICAgICA8bGVnZW5kICpuZ0lmPVwiaXNSYW5nZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIGkgPT09IDEgJiYgaGFzRGF0ZSAmJiB2aWV3TW9kZSA9PT0gJ21hbnVhbCc7XG4gICAgICAgICAgICBlbHNlIGVuZHBvaW50TGFiZWxcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbmQtdmlldy10b2dnbGVcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImVuZFZpZXcgPT09ICdkYXRlJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFbmRWaWV3KCdkYXRlJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB0KFwiZW5kXCIpIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImVuZFZpZXcgPT09ICdkYXlzJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFbmRWaWV3KCdkYXlzJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBpbkRheXNMYWJlbCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbmRwb2ludExhYmVsPnt7XG4gICAgICAgICAgdChpID09PSAwID8gXCJzdGFydFwiIDogXCJlbmRcIilcbiAgICAgICAgfX08L25nLXRlbXBsYXRlPlxuICAgICAgPC9sZWdlbmQ+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgaSA9PT0gMSAmJiBoYXNEYXRlICYmIHZpZXdNb2RlID09PSAnbWFudWFsJyAmJiBlbmRWaWV3ID09PSAnZGF5cydcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJkYXRlLWZpZWxkcyBpbi1kYXlzLWZpZWxkc1wiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVzdWx0aW5nLWVuZC1kYXRlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdlbmREYXRlJylcIj57e1xuICAgICAgICAgIHJlc3VsdGluZ0VuZERhdGVcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDx3a2x5LWZpZWxkXG4gICAgICAgICAgW2xhYmVsXT1cInQoJ2RheXMnKVwiXG4gICAgICAgICAgW2hpZGVMYWJlbF09XCJ0cnVlXCJcbiAgICAgICAgICBbcHJldmlvdXNMYWJlbF09XCJ0KCdkYXlzUHJldmlvdXMnKVwiXG4gICAgICAgICAgW25leHRMYWJlbF09XCJ0KCdkYXlzTmV4dCcpXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImVmZmVjdGl2ZUxvY2FsZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImluRGF5c1wiXG4gICAgICAgICAgW21pbl09XCItOTk5OVwiXG4gICAgICAgICAgW21heF09XCI5OTk5XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXVwiXG4gICAgICAgICAgW2ludmFsaWRdPVwiISFlcnJvcnMubGVuZ3RoXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZGF5cygkZXZlbnQpXCJcbiAgICAgICAgICAoY29tcGxldGUpPVwiZmluaXNoKClcIlxuICAgICAgICA+PC93a2x5LWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgaGFzRGF0ZSAmJiB2aWV3TW9kZSA9PT0gJ21hbnVhbCcgJiYgKGkgPT09IDAgfHwgZW5kVmlldyA9PT0gJ2RhdGUnKVxuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cImRhdGUtZmllbGRzXCJcbiAgICAgID5cbiAgICAgICAgPHdrbHktZmllbGRcbiAgICAgICAgICBbbGFiZWxdPVwidCgnZGF5JylcIlxuICAgICAgICAgIFtsb2NhbGVdPVwiZWZmZWN0aXZlTG9jYWxlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZHJhZnQuZGF0ZS5kYXlcIlxuICAgICAgICAgIFttaW5dPVwiMVwiXG4gICAgICAgICAgW21heF09XCIzMVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgICAgIFtpbnZhbGlkXT1cIiEhZXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZpZWxkKGksICdkYXknLCAkZXZlbnQpXCJcbiAgICAgICAgICAoY29tcGxldGUpPVwiZmluaXNoKClcIlxuICAgICAgICA+PC93a2x5LWZpZWxkPlxuICAgICAgICA8d2tseS1maWVsZFxuICAgICAgICAgIFtsYWJlbF09XCJ0KCdtb250aCcpXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImVmZmVjdGl2ZUxvY2FsZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRyYWZ0LmRhdGUubW9udGhcIlxuICAgICAgICAgIFttaW5dPVwiMVwiXG4gICAgICAgICAgW21heF09XCJtb250aENvdW50KGRyYWZ0KVwiXG4gICAgICAgICAgW2xhYmVsc109XCJtb250aHMoZHJhZnQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXVwiXG4gICAgICAgICAgW2ludmFsaWRdPVwiISFlcnJvcnMubGVuZ3RoXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZmllbGQoaSwgJ21vbnRoJywgJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbXBsZXRlKT1cImZpbmlzaCgpXCJcbiAgICAgICAgPjwvd2tseS1maWVsZD5cbiAgICAgICAgPHdrbHktZmllbGRcbiAgICAgICAgICBbbGFiZWxdPVwidCgneWVhcicpXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImVmZmVjdGl2ZUxvY2FsZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRyYWZ0LmRhdGUueWVhclwiXG4gICAgICAgICAgW21pbl09XCJhZGFwdGVyLnN1cHBvcnRlZFllYXJSYW5nZVswXVwiXG4gICAgICAgICAgW21heF09XCJhZGFwdGVyLnN1cHBvcnRlZFllYXJSYW5nZVsxXVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgICAgIFtpbnZhbGlkXT1cIiEhZXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZpZWxkKGksICd5ZWFyJywgJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbXBsZXRlKT1cImZpbmlzaCgpXCJcbiAgICAgICAgPjwvd2tseS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cImhhc1RpbWVcIlxuICAgICAgICBjbGFzcz1cInRpbWUtZmllbGRzXCJcbiAgICAgICAgW2NsYXNzLnNlY29uZHNdPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzXVwiXG4gICAgICA+XG4gICAgICAgIDx3a2x5LWZpZWxkXG4gICAgICAgICAgW2xhYmVsXT1cInQoJ2hvdXInKVwiXG4gICAgICAgICAgW2xvY2FsZV09XCJlZmZlY3RpdmVMb2NhbGVcIlxuICAgICAgICAgIFt2YWx1ZV09XCJkaXNwbGF5SG91cihkcmFmdClcIlxuICAgICAgICAgIFttaW5dPVwiZWZmZWN0aXZlSG91ckN5Y2xlID09PSAnaDEyJyA/IDEgOiAwXCJcbiAgICAgICAgICBbbWF4XT1cImVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gJ2gxMicgPyAxMiA6IDIzXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXVwiXG4gICAgICAgICAgW2ludmFsaWRdPVwiISFlcnJvcnMubGVuZ3RoXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZmllbGQoaSwgJ2hvdXInLCAkZXZlbnQpXCJcbiAgICAgICAgICAoY29tcGxldGUpPVwiZmluaXNoKClcIlxuICAgICAgICA+PC93a2x5LWZpZWxkPlxuICAgICAgICA8d2tseS1maWVsZFxuICAgICAgICAgIFtsYWJlbF09XCJ0KCdtaW51dGUnKVwiXG4gICAgICAgICAgW2xvY2FsZV09XCJlZmZlY3RpdmVMb2NhbGVcIlxuICAgICAgICAgIFt2YWx1ZV09XCJkcmFmdC5taW51dGVcIlxuICAgICAgICAgIFttYXhdPVwiNTlcIlxuICAgICAgICAgIFtzdGVwXT1cIlxuICAgICAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1pbnV0ZVN0ZXBdID4gMCAmJlxuICAgICAgICAgICAgNjAgJSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTWludXRlU3RlcF0gPT09IDBcbiAgICAgICAgICAgICAgPyB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTWludXRlU3RlcF1cbiAgICAgICAgICAgICAgOiAxXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXVwiXG4gICAgICAgICAgW2ludmFsaWRdPVwiISFlcnJvcnMubGVuZ3RoXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZmllbGQoaSwgJ21pbnV0ZScsICRldmVudClcIlxuICAgICAgICAgIChjb21wbGV0ZSk9XCJmaW5pc2goKVwiXG4gICAgICAgID48L3drbHktZmllbGQ+XG4gICAgICAgIDx3a2x5LWZpZWxkXG4gICAgICAgICAgKm5nSWY9XCJ0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuU2hvd1NlY29uZHNdXCJcbiAgICAgICAgICBbbGFiZWxdPVwidCgnc2Vjb25kJylcIlxuICAgICAgICAgIFtsb2NhbGVdPVwiZWZmZWN0aXZlTG9jYWxlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZHJhZnQuc2Vjb25kXCJcbiAgICAgICAgICBbbWF4XT1cIjU5XCJcbiAgICAgICAgICBbc3RlcF09XCJcbiAgICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TZWNvbmRTdGVwXSA+IDAgJiZcbiAgICAgICAgICAgIDYwICUgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNlY29uZFN0ZXBdID09PSAwXG4gICAgICAgICAgICAgID8gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNlY29uZFN0ZXBdXG4gICAgICAgICAgICAgIDogMVxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgICAgIFtpbnZhbGlkXT1cIiEhZXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZpZWxkKGksICdzZWNvbmQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAoY29tcGxldGUpPVwiZmluaXNoKClcIlxuICAgICAgICA+PC93a2x5LWZpZWxkPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgZWZmZWN0aXZlSG91ckN5Y2xlID09PSAnaDEyJyB8fFxuICAgICAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuSG91ckN5Y2xlXSA9PT0gJ3N3aXRjaGFibGUnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gJ2gxMicgJiYgKGRyYWZ0LmhvdXIgfHwgMCkgPCAxMlxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChjbGljayk9XCJwZXJpb2QoaSwgJ2FtJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQoXCJhbVwiKSB9fTwvYnV0dG9uXG4gICAgICAgICAgPjxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdIHx8XG4gICAgICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Ib3VyQ3ljbGVdICE9PSAnc3dpdGNoYWJsZSdcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiZWZmZWN0aXZlSG91ckN5Y2xlID09PSAnaDI0J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwicGVyaW9kKGksICcyNCcpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAyNDwvYnV0dG9uXG4gICAgICAgICAgPjxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gJ2gxMicgfHxcbiAgICAgICAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkhvdXJDeWNsZV0gPT09ICdzd2l0Y2hhYmxlJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF1cIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cIlxuICAgICAgICAgICAgICBlZmZlY3RpdmVIb3VyQ3ljbGUgPT09ICdoMTInICYmIChkcmFmdC5ob3VyIHx8IDApID49IDEyXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInBlcmlvZChpLCAncG0nKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdChcInBtXCIpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9maWVsZHNldD5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxkaXYgY2xhc3M9XCJ2YWxpZGF0aW9uXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgIDxwICpuZ0Zvcj1cImxldCBlcnIgb2YgZXJyb3JzXCI+ISB7eyB0KGVyci5tZXNzYWdlS2V5KSB9fTwvcD5cbiAgPC9kaXY+XG4gIDxmb290ZXIgKm5nSWY9XCJzdWJtaXRWaXNpYmxlXCI+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImNvbmZpcm1cIlxuICAgICAgW2Rpc2FibGVkXT1cIiFjYW5TdWJtaXRcIlxuICAgICAgKGNsaWNrKT1cInN1Ym1pdCgpXCJcbiAgICA+XG4gICAgICB7eyB0KFwiY29uZmlybVwiKSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Zvb3Rlcj5cbjwvc2VjdGlvbj5cbiJdfQ==
|
|
978
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3drbHktZGF0ZXRpbWUtcGlja2VyLjE4L3NyYy9waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vcHJvamVjdHMvd2tseS1kYXRldGltZS1waWNrZXIuMTgvc3JjL3BpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLFVBQVUsRUFDVixNQUFNLEVBQ04sU0FBUyxFQUdULFdBQVcsRUFDWCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RSxPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixHQUdsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZixPQUFPLEdBR1IsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixjQUFjLEVBQ2QsY0FBYyxFQUlkLDRCQUE0QixFQUM1Qiw2QkFBNkIsR0FDOUIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBSWpCLDRCQUE0QixHQUc3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixpQkFBaUIsRUFLakIsZ0JBQWdCLEVBQ2hCLDRCQUE0QixHQUc3QixNQUFNLFVBQVUsQ0FBQzs7OztBQXdCbEIsTUFB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MUQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDRCQUE0QixDQUFDOzRCQUMxRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjs7MEJBOERFLE1BQU07MkJBQUMsU0FBUzs7MEJBQ2hCLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLE1BQU07MkJBQUMsVUFBVTs7MEJBQ2pCLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUN4QixNQUFNOzJCQUFDLFdBQVc7a0dBN0RFLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGVmZmVjdCxcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBMT0NBTEVfSUQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBQTEFURk9STV9JRCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHtcbiAgYWJzb2x1dGVXZWVrT2YsXG4gIGNyZWF0ZVdlZWtHZW5lcmF0b3IsXG4gIGZpcnN0RXBvY2hEYXlPZixcbiAgaW50ZWdlcixcbiAgV2tseVdlZWtHZW5lcmF0b3IsXG4gIFdrbHlXZWVrT2Zmc2V0LFxufSBmcm9tIFwiQHdrbHkvY29yZVwiO1xuaW1wb3J0IHtcbiAgZHJhZnREYXlEaWZmZXJlbmNlLFxuICBzZXREcmFmdERheURpZmZlcmVuY2UsXG4gIGNhbGVuZGFyTW9udGhCb3VuZHMsXG4gIHJlc29sdmVXa2x5VHJhbnNsYXRpb24sXG4gIGNyZWF0ZVdlZWtSb3dzLFxuICB2YWxpZGF0ZURyYWZ0cyxcbiAgV2tseURyYWZ0IGFzIERyYWZ0LFxuICBXa2x5V2Vla1JvdyBhcyBSb3csXG4gIFdrbHlQaWNrZXJJbnB1dHMgYXMgV2tseVBpY2tlcklucHV0c0NvbnRyYWN0LFxuICBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLFxuICBXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cyxcbn0gZnJvbSBcIkB3a2x5L3ByZXNlbnRhdGlvblwiO1xuaW1wb3J0IHtcbiAgZGVjb2RlSXNvLFxuICBlcnJvcixcbiAgcmVzb2x2ZVdlZWtPZmZzZXQsXG4gIHZhbGlkYXRlU2VsZWN0aW9uLFxuICBXa2x5Q2FsZW5kYXJBZGFwdGVyLFxuICBXa2x5Q2FsZW5kYXJEYXRlLFxuICBXa2x5RGF0ZVRpbWUsXG4gIFdrbHlHcmVnb3JpYW5DYWxlbmRhckFkYXB0ZXIsXG4gIFdrbHlQaWNrZXJWYWx1ZSxcbiAgV2tseVZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkB3a2x5L2FkYXB0ZXJzXCI7XG5pbXBvcnQge1xuICBXS0xZX0NMT0NLLFxuICBXS0xZX0NPTkZJRyxcbiAgV0tMWV9MT0NBTElaQVRJT04sXG4gIFdLTFlfVFJBTlNMQVRJT05TLFxuICBXa2x5Q2xvY2ssXG4gIFdrbHlDbG9zZVJlYXNvbixcbiAgV2tseUNvbmZpZ3VyYXRpb24sXG4gIFdrbHlKdW1wT3B0aW9ucyxcbiAgV2tseVBpY2tlcklucHV0cyxcbiAgdW53cmFwV2tseVBpY2tlclNpZ25hbElucHV0cyxcbiAgV2tseVN0cmluZ3MsXG4gIFdrbHlUcmFuc2xhdGlvbnMsXG59IGZyb20gXCIuL2NvbmZpZ1wiO1xuZGVjbGFyZSBjbGFzcyBSZXNpemVPYnNlcnZlciB7XG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiAoKSA9PiB2b2lkKTtcbiAgb2JzZXJ2ZShlbGVtZW50OiBFbGVtZW50KTogdm9pZDtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xufVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIndrbHktZGF0ZXRpbWUtcGlja2VyXCIsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICB0ZW1wbGF0ZVVybDogXCIuL3BpY2tlci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4uLy4uL3drbHktZGF0ZXRpbWUtcGlja2VyL3NyYy9waWNrZXIuY29tcG9uZW50LmNzc1wiXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBXa2x5RGF0ZVRpbWVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gV2tseURhdGVUaW1lUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFdrbHlEYXRlVGltZVBpY2tlckNvbXBvbmVudFxuICBleHRlbmRzIFdrbHlQaWNrZXJJbnB1dHNcbiAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvclxue1xuICBAVmlld0NoaWxkKFwic2Nyb2xsZXJcIikgc2Nyb2xsZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgcHJlc2VudGF0aW9uOiBcImlubGluZVwiIHwgXCJ0cmFuc2llbnRcIiA9IFwiaW5saW5lXCI7XG4gIHZpZXdNb2RlOiBcImNhbGVuZGFyXCIgfCBcIm1hbnVhbFwiID0gXCJjYWxlbmRhclwiO1xuICBlbmRWaWV3OiBcImRhdGVcIiB8IFwiZGF5c1wiID0gXCJkYXRlXCI7XG4gIGFkYXB0ZXIhOiBXa2x5Q2FsZW5kYXJBZGFwdGVyO1xuICBlZmZlY3RpdmVMb2NhbGUgPSBcImVuLVVTXCI7XG4gIGVmZmVjdGl2ZU9mZnNldDogV2tseVdlZWtPZmZzZXQgPSAwO1xuICBlZmZlY3RpdmVIb3VyQ3ljbGU6IFwiaDEyXCIgfCBcImgyNFwiID0gXCJoMjRcIjtcbiAgZGlyZWN0aW9uID0gXCJsdHJcIjtcbiAgcm93czogUm93W10gPSBbXTtcbiAgd2Vla2RheXM6IHN0cmluZ1tdID0gW107XG4gIGRyYWZ0czogRHJhZnRbXSA9IFtdO1xuICBlcnJvcnM6IHJlYWRvbmx5IFdrbHlWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xuICB0b2RheSA9IDA7XG4gIGZvY3VzZWQgPSAwO1xuICBhbmNob3JXZWVrID0gMDtcbiAgZmlyc3RXZWVrID0gMDtcbiAgdmlzaWJsZUNvdW50ID0gNjtcbiAgcm93SGVpZ2h0ID0gNzY7XG4gIHNjcm9sbEhlaWdodCA9IDE1MjA3NjtcbiAgcGFkZGluZ1RvcCA9IDA7XG4gIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIGNvbXBhY3QgPSBmYWxzZTtcbiAgcmVhZG9ubHkgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cyA9IFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXM7XG4gIHByaXZhdGUgYmFzZVdlZWsgPSAwO1xuICBwcml2YXRlIGZpcnN0U3VwcG9ydGVkRGF5ID0gMDtcbiAgcHJpdmF0ZSBsYXN0U3VwcG9ydGVkRGF5ID0gMDtcbiAgcHJpdmF0ZSBmaXJzdFN1cHBvcnRlZFdlZWsgPSAwO1xuICBwcml2YXRlIGxhc3RTdXBwb3J0ZWRXZWVrID0gMDtcbiAgcHJpdmF0ZSBnZW5lcmF0b3IhOiBXa2x5V2Vla0dlbmVyYXRvcjtcbiAgcHJpdmF0ZSBpbml0aWFsTW9udGggPSBcIlwiO1xuICBwcml2YXRlIGNsaXBNb250aCA9IGZhbHNlO1xuICBwcml2YXRlIGJyb3dzZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIHNjcm9sbEVuZFRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIHByaXZhdGUgc25hcFBlbmRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBXa2x5UGlja2VyVmFsdWUpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJpdmF0ZSB2YWxpZGF0b3JDaGFuZ2VkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgY29uZmlnRXJyb3JzOiBXa2x5VmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgcHJpdmF0ZSBwZW5kaW5nVmFsdWU6IFdrbHlQaWNrZXJWYWx1ZSA9IG51bGw7XG4gIHByaXZhdGUgZW1pdHRlZFZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtYW51YWxEYXRlRW5kcG9pbnQgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1WYWx1ZSA9IHNpZ25hbDxXa2x5UGlja2VyVmFsdWUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybURpc2FibGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSBwcmV2aW91c0lucHV0cz86IFdrbHlQaWNrZXJJbnB1dHNDb250cmFjdDtcbiAgY3VycmVudFZhbHVlKCk6IFdrbHlQaWNrZXJWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVZhbHVlKCkgPT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdKClcbiAgICAgIDogdGhpcy5mb3JtVmFsdWUoKSE7XG4gIH1cbiAgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSgpIHx8IHRoaXMuZm9ybURpc2FibGVkKCk7XG4gIH1cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgZGVmYXVsdExvY2FsZTogc3RyaW5nLFxuICAgIEBJbmplY3QoV0tMWV9DT05GSUcpIHByaXZhdGUgZGVmYXVsdHM6IFdrbHlDb25maWd1cmF0aW9uLFxuICAgIEBJbmplY3QoV0tMWV9DTE9DSykgcHJpdmF0ZSBjbG9jazogV2tseUNsb2NrLFxuICAgIEBJbmplY3QoV0tMWV9MT0NBTElaQVRJT04pIHByaXZhdGUgc3RyaW5nczogV2tseVN0cmluZ3MsXG4gICAgQEluamVjdChXS0xZX1RSQU5TTEFUSU9OUykgcHJpdmF0ZSBkZWZhdWx0VHJhbnNsYXRpb25zOiBXa2x5VHJhbnNsYXRpb25zLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtOiBPYmplY3QsXG4gICAgcHJpdmF0ZSBob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybSk7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0cyA9XG4gICAgICAgIHVud3JhcFdrbHlQaWNrZXJTaWduYWxJbnB1dHM8V2tseVBpY2tlcklucHV0c0NvbnRyYWN0Pih0aGlzKTtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5wcmV2aW91c0lucHV0cztcbiAgICAgIHRoaXMucHJldmlvdXNJbnB1dHMgPSBpbnB1dHM7XG4gICAgICBpZiAoIXByZXZpb3VzIHx8ICF0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgICBjb25zdCBjaGFuZ2VkID0gKGtleToga2V5b2YgdHlwZW9mIGlucHV0cykgPT5cbiAgICAgICAgIU9iamVjdC5pcyhwcmV2aW91c1trZXldLCBpbnB1dHNba2V5XSk7XG4gICAgICBpZiAoXG4gICAgICAgICFPYmplY3Qua2V5cyhpbnB1dHMpLnNvbWUoKGtleSkgPT4gY2hhbmdlZChrZXkgYXMga2V5b2YgdHlwZW9mIGlucHV0cykpXG4gICAgICApXG4gICAgICAgIHJldHVybjtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmIChjaGFuZ2VkKFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWUpKVxuICAgICAgICAgIHRoaXMuZm9ybVZhbHVlLnNldCh1bmRlZmluZWQpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hhbmdlZChXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlKSAmJlxuICAgICAgICAgIHRoaXMuZW1pdHRlZFZhbHVlID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLmN1cnJlbnRWYWx1ZSgpKSAmJlxuICAgICAgICAgIE9iamVjdC5rZXlzKGlucHV0cykuZXZlcnkoXG4gICAgICAgICAgICAoa2V5KSA9PlxuICAgICAgICAgICAgICBrZXkgPT09IFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWUgfHxcbiAgICAgICAgICAgICAgIWNoYW5nZWQoa2V5IGFzIGtleW9mIHR5cGVvZiBpbnB1dHMpLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5lbWl0dGVkVmFsdWUgPSBudWxsO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb2N1cyA9IHRoaXMuZm9jdXNlZDtcbiAgICAgICAgdGhpcy5jb25maWd1cmUoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoYW5nZWQoV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZSkgfHxcbiAgICAgICAgICBjaGFuZ2VkKFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZSkgfHxcbiAgICAgICAgICBjaGFuZ2VkKFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuQ2FsZW5kYXJBZGFwdGVyKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLmxvYWQodGhpcy5jdXJyZW50VmFsdWUoKSk7XG4gICAgICAgICAgdGhpcy5wb3NpdGlvbih0aGlzLmZvY3VzZWQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hlY2soKTtcbiAgICAgICAgICBpZiAoY2hhbmdlZChXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZpZXdwb3J0UHJlc2V0KSlcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb24oZm9jdXMsIHRydWUpO1xuICAgICAgICAgIGVsc2UgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KGZvY3VzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cbiAgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuY29uZmlndXJlKCk7XG4gICAgY29uc3QgaW5pdGlhbEVwb2NoRGF5ID1cbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Jbml0aWFsRXBvY2hEYXldKCk7XG4gICAgdGhpcy50b2RheSA9IHRoaXMuYnJvd3NlclxuICAgICAgPyBNYXRoLmZsb29yKHRoaXMuY2xvY2subm93KCkuZ2V0VGltZSgpIC8gODY0MDAwMDApXG4gICAgICA6IGluaXRpYWxFcG9jaERheSA9PT0gbnVsbFxuICAgICAgICA/IDBcbiAgICAgICAgOiBpbml0aWFsRXBvY2hEYXk7XG4gICAgdGhpcy5mb2N1c2VkID1cbiAgICAgIGluaXRpYWxFcG9jaERheSA9PT0gbnVsbFxuICAgICAgICA/IHRoaXMuZGVmYXVsdHMuaW5pdGlhbEVwb2NoRGF5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHRoaXMudG9kYXlcbiAgICAgICAgICA6IHRoaXMuZGVmYXVsdHMuaW5pdGlhbEVwb2NoRGF5XG4gICAgICAgIDogaW5pdGlhbEVwb2NoRGF5O1xuICAgIHRoaXMubG9hZCh0aGlzLmN1cnJlbnRWYWx1ZSgpKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnBvc2l0aW9uKHRoaXMuZm9jdXNlZCwgdHJ1ZSk7XG4gIH1cbiAgY29uZmlndXJlKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnRXJyb3JzID0gW107XG4gICAgdGhpcy5lZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkxvY2FsZV0oKSB8fFxuICAgICAgdGhpcy5kZWZhdWx0cy5sb2NhbGUgfHxcbiAgICAgIHRoaXMuZGVmYXVsdExvY2FsZTtcbiAgICB0aGlzLmRpcmVjdGlvbiA9IC9eKGFyfGhlfGZhfHVyKSgtfCQpLy50ZXN0KHRoaXMuZWZmZWN0aXZlTG9jYWxlKVxuICAgICAgPyBcInJ0bFwiXG4gICAgICA6IFwibHRyXCI7XG4gICAgdGhpcy5hZGFwdGVyID1cbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5DYWxlbmRhckFkYXB0ZXJdKCkgfHxcbiAgICAgIG5ldyBXa2x5R3JlZ29yaWFuQ2FsZW5kYXJBZGFwdGVyKHRoaXMuZWZmZWN0aXZlTG9jYWxlKTtcbiAgICB0cnkge1xuICAgICAgbGV0IGZpcnN0RGF5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBmaXJzdERheSA9IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrKHRoaXMuZWZmZWN0aXZlTG9jYWxlKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB0aGlzLmVmZmVjdGl2ZU9mZnNldCA9IHJlc29sdmVXZWVrT2Zmc2V0KFxuICAgICAgICB0aGlzLmVmZmVjdGl2ZUxvY2FsZSxcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtPZmZzZXRdKCksXG4gICAgICAgIHRoaXMuZGVmYXVsdHMud2Vla09mZnNldCxcbiAgICAgICAgZmlyc3REYXksXG4gICAgICApO1xuICAgICAgaW50ZWdlcih0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0NhY2hlU2l6ZV0oKSk7XG4gICAgICBpbnRlZ2VyKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5PdmVyc2NhbldlZWtzXSgpKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtDYWNoZVNpemVdKCkgPCAwIHx8XG4gICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5PdmVyc2NhbldlZWtzXSgpIDwgMCB8fFxuICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuT3ZlcnNjYW5XZWVrc10oKSA+IDUwXG4gICAgICApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCk7XG4gICAgICBpZiAoXG4gICAgICAgICFbXG4gICAgICAgICAgXCJkYXRldGltZVwiLFxuICAgICAgICAgIFwiZGF0ZVwiLFxuICAgICAgICAgIFwidGltZVwiLFxuICAgICAgICAgIFwiZGF0ZXRpbWUtcmFuZ2VcIixcbiAgICAgICAgICBcImRhdGUtcmFuZ2VcIixcbiAgICAgICAgICBcInRpbWUtcmFuZ2VcIixcbiAgICAgICAgXS5pbmNsdWRlcyh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0oKSlcbiAgICAgIClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoKTtcbiAgICAgIGNvbnN0IHByZXNldCA9IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WaWV3cG9ydFByZXNldF0oKTtcbiAgICAgIGlmIChwcmVzZXQua2luZCA9PT0gXCJ3ZWVrc1wiKSB7XG4gICAgICAgIGludGVnZXIocHJlc2V0LnZpc2libGVXZWVrQ291bnQpO1xuICAgICAgICBpZiAocHJlc2V0LnZpc2libGVXZWVrQ291bnQgPCAxIHx8IHByZXNldC52aXNpYmxlV2Vla0NvdW50ID4gNTIpXG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmVzZXQua2luZCA9PT0gXCJmdWxsLW1vbnRoLWFuZC1hcm91bmRcIilcbiAgICAgICAgZm9yIChjb25zdCBuIG9mIFtcbiAgICAgICAgICBwcmVzZXQuZXh0cmFXZWVrc0JlZm9yZSB8fCAwLFxuICAgICAgICAgIHByZXNldC5leHRyYVdlZWtzQWZ0ZXIgfHwgMCxcbiAgICAgICAgXSkge1xuICAgICAgICAgIGludGVnZXIobik7XG4gICAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiA1MikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgdGhpcy5nZW5lcmF0b3IgPSBjcmVhdGVXZWVrR2VuZXJhdG9yKHtcbiAgICAgICAgd2Vla09mZnNldDogdGhpcy5lZmZlY3RpdmVPZmZzZXQsXG4gICAgICAgIGNhY2hlU2l6ZTogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtDYWNoZVNpemVdKCksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0aGlzLmNvbmZpZ0Vycm9ycy5wdXNoKFxuICAgICAgICBlcnJvcihcbiAgICAgICAgICBcImNvbmZpZ3VyYXRpb24tZXJyb3JcIixcbiAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla09mZnNldF0oKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmdlbmVyYXRvciA9IGNyZWF0ZVdlZWtHZW5lcmF0b3IoKTtcbiAgICAgIHRoaXMuZWZmZWN0aXZlT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgdGhpcy5zZXRTdXBwb3J0ZWRTY3JvbGxSYW5nZSgpO1xuICAgIHRoaXMuZWZmZWN0aXZlSG91ckN5Y2xlID1cbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Ib3VyQ3ljbGVdKCkgPT09IFwiaDEyXCJcbiAgICAgICAgPyBcImgxMlwiXG4gICAgICAgIDogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkhvdXJDeWNsZV0oKSA9PT0gXCJsb2NhbGVcIlxuICAgICAgICAgID8gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5lZmZlY3RpdmVMb2NhbGUsIHtcbiAgICAgICAgICAgICAgaG91cjogXCJudW1lcmljXCIsXG4gICAgICAgICAgICAgIHRpbWVab25lOiBcIlVUQ1wiLFxuICAgICAgICAgICAgfSkucmVzb2x2ZWRPcHRpb25zKCkuaG91cjEyXG4gICAgICAgICAgICA/IFwiaDEyXCJcbiAgICAgICAgICAgIDogXCJoMjRcIlxuICAgICAgICAgIDogXCJoMjRcIjtcbiAgICB0aGlzLndlZWtkYXlzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogNyB9LCAoXywgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5mb3JtYXRXZWVrZGF5KHRoaXMuZWZmZWN0aXZlT2Zmc2V0ICsgaSwgXCJzaG9ydFwiKSxcbiAgICApO1xuICB9XG4gIHByaXZhdGUgc2V0U3VwcG9ydGVkU2Nyb2xsUmFuZ2UoKTogdm9pZCB7XG4gICAgbGV0IFtmaXJzdCwgbGFzdF0gPSB0aGlzLmFkYXB0ZXIuc3VwcG9ydGVkRXBvY2hEYXlSYW5nZTtcbiAgICBjb25zdCBbZmlyc3RZZWFyLCBsYXN0WWVhcl0gPSB0aGlzLmFkYXB0ZXIuc3VwcG9ydGVkWWVhclJhbmdlO1xuICAgIGNvbnN0IHllYXJPZiA9IChkYXk6IG51bWJlcikgPT4gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGRheSkueWVhcjtcbiAgICBpZiAoeWVhck9mKGZpcnN0KSA8IGZpcnN0WWVhcikge1xuICAgICAgbGV0IGxvdyA9IGZpcnN0LFxuICAgICAgICBoaWdoID0gbGFzdDtcbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICAgIGlmICh5ZWFyT2YobWlkKSA8IGZpcnN0WWVhcikgbG93ID0gbWlkICsgMTtcbiAgICAgICAgZWxzZSBoaWdoID0gbWlkO1xuICAgICAgfVxuICAgICAgZmlyc3QgPSBsb3c7XG4gICAgfVxuICAgIGlmICh5ZWFyT2YobGFzdCkgPiBsYXN0WWVhcikge1xuICAgICAgbGV0IGxvdyA9IGZpcnN0LFxuICAgICAgICBoaWdoID0gbGFzdDtcbiAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgIGNvbnN0IG1pZCA9IE1hdGguY2VpbCgobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgaWYgKHllYXJPZihtaWQpID4gbGFzdFllYXIpIGhpZ2ggPSBtaWQgLSAxO1xuICAgICAgICBlbHNlIGxvdyA9IG1pZDtcbiAgICAgIH1cbiAgICAgIGxhc3QgPSBsb3c7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGZpcnN0ID4gbGFzdCB8fFxuICAgICAgeWVhck9mKGZpcnN0KSA8IGZpcnN0WWVhciB8fFxuICAgICAgeWVhck9mKGZpcnN0KSA+IGxhc3RZZWFyIHx8XG4gICAgICB5ZWFyT2YobGFzdCkgPCBmaXJzdFllYXIgfHxcbiAgICAgIHllYXJPZihsYXN0KSA+IGxhc3RZZWFyXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJObyBzdXBwb3J0ZWQgZGF5cyB3aXRoaW4gdGhlIGNhbGVuZGFyIHllYXIgcmFuZ2VcIik7XG4gICAgdGhpcy5maXJzdFN1cHBvcnRlZERheSA9IGZpcnN0O1xuICAgIHRoaXMubGFzdFN1cHBvcnRlZERheSA9IGxhc3Q7XG4gICAgdGhpcy5maXJzdFN1cHBvcnRlZFdlZWsgPSBhYnNvbHV0ZVdlZWtPZihmaXJzdCwgdGhpcy5lZmZlY3RpdmVPZmZzZXQpO1xuICAgIHRoaXMubGFzdFN1cHBvcnRlZFdlZWsgPSBhYnNvbHV0ZVdlZWtPZihsYXN0LCB0aGlzLmVmZmVjdGl2ZU9mZnNldCk7XG4gIH1cbiAgcHJpdmF0ZSBjbGFtcEZpcnN0V2Vlayh3ZWVrOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIEtlZXAgc3VwcG9ydGVkIHdlZWtzIGluc2lkZSB0aGUgdmlld3BvcnQ7IHJlbmRlclJvd3MgYWRkcyB0aGUgYnVmZmVyIHJvd3MuXG4gICAgY29uc3QgbGFzdCA9IE1hdGgubWF4KFxuICAgICAgdGhpcy5maXJzdFN1cHBvcnRlZFdlZWssXG4gICAgICB0aGlzLmxhc3RTdXBwb3J0ZWRXZWVrIC0gdGhpcy52aXNpYmxlQ291bnQgKyAxLFxuICAgICk7XG4gICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuZmlyc3RTdXBwb3J0ZWRXZWVrLCBNYXRoLm1pbihsYXN0LCB3ZWVrKSk7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgICBpZiAodGhpcy5icm93c2VyICYmIHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcGFjdCA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIDwgMzM4O1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwiLndlZWstcm93XCIsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vIENTUyBoZWlnaHRzIGFuZCBzY3JvbGxUb3AgdXNlIGxheW91dCBwaXhlbHM7IGNsaWVudCByZWN0YW5nbGVzIGluY2x1ZGUgem9vbS5cbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcm93ID8gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHJvdykuaGVpZ2h0KSA6IDA7XG4gICAgICAgIGlmIChoZWlnaHQgJiYgaGVpZ2h0ICE9PSB0aGlzLnJvd0hlaWdodCkge1xuICAgICAgICAgIHRoaXMucm93SGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gdGhpcy5yb3dIZWlnaHQgKiAyMDAxO1xuICAgICAgICAgIHRoaXMucmVuZGVyUm93cygpO1xuICAgICAgICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgfVxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXIpIHRoaXMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxFbmRUaW1lcik7XG4gICAgaWYgKHRoaXMuZ2VuZXJhdG9yKSB0aGlzLmdlbmVyYXRvci5jbGVhckNhY2hlKCk7XG4gIH1cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmVXa2x5VHJhbnNsYXRpb24oXG4gICAgICBrZXksXG4gICAgICB0aGlzLmVmZmVjdGl2ZUxvY2FsZSxcbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5UcmFuc2xhdGlvbnNdKCkgfHxcbiAgICAgICAgdGhpcy5kZWZhdWx0VHJhbnNsYXRpb25zLFxuICAgICAgdGhpcy5zdHJpbmdzLFxuICAgICk7XG4gIH1cbiAgZ2V0IGlzUmFuZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSgpLmVuZHNXaXRoKFwiLXJhbmdlXCIpO1xuICB9XG4gIGdldCBoYXNEYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdKCkuc3RhcnRzV2l0aChcInRpbWVcIik7XG4gIH1cbiAgZ2V0IGhhc1RpbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSgpICE9PSBcImRhdGVcIiAmJlxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdKCkgIT09IFwiZGF0ZS1yYW5nZVwiXG4gICAgKTtcbiAgfVxuICBnZXQgc3VibWl0VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcmVzZW50YXRpb24gPT09IFwidHJhbnNpZW50XCIgJiZcbiAgICAgICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0oKSAhPT0gXCJkYXRlXCIgfHxcbiAgICAgICAgdGhpcy52aWV3TW9kZSA9PT0gXCJtYW51YWxcIilcbiAgICApO1xuICB9XG4gIGdldCB0aXRsZSgpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKFxuICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5LFxuICAgICAgICAgIE1hdGgubWluKFxuICAgICAgICAgICAgdGhpcy5sYXN0U3VwcG9ydGVkRGF5LFxuICAgICAgICAgICAgZmlyc3RFcG9jaERheU9mKHRoaXMuYW5jaG9yV2VlaywgdGhpcy5lZmZlY3RpdmVPZmZzZXQpLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5mb3JtYXRNb250aChkKSArIFwiIFwiICsgdGhpcy5hZGFwdGVyLmZvcm1hdFllYXIoZCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9XG4gIGdldCBjYW5TdWJtaXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICF0aGlzLmlzRGlzYWJsZWQoKSAmJiAhdGhpcy5lcnJvcnMubGVuZ3RoICYmIHRoaXMucGVuZGluZ1ZhbHVlICE9PSBudWxsXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGJsYW5rKGRheTogbnVtYmVyKTogRHJhZnQge1xuICAgIGNvbnN0IHNhZmUgPSBNYXRoLm1heChcbiAgICAgIHRoaXMuZmlyc3RTdXBwb3J0ZWREYXksXG4gICAgICBNYXRoLm1pbih0aGlzLmxhc3RTdXBwb3J0ZWREYXksIGRheSksXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGF0ZTogdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKHNhZmUpLFxuICAgICAgaG91cjogMCxcbiAgICAgIG1pbnV0ZTogMCxcbiAgICAgIHNlY29uZDogMCxcbiAgICAgIHByZXNlbnQ6IGZhbHNlLFxuICAgIH07XG4gIH1cbiAgbG9hZCh2YWx1ZTogV2tseVBpY2tlclZhbHVlKTogdm9pZCB7XG4gICAgdGhpcy5kcmFmdHMgPSBbdGhpcy5ibGFuayh0aGlzLmZvY3VzZWQpLCB0aGlzLmJsYW5rKHRoaXMuZm9jdXNlZCldO1xuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZVNlbGVjdGlvbihcbiAgICAgIHZhbHVlLFxuICAgICAgdW53cmFwV2tseVBpY2tlclNpZ25hbElucHV0czxXa2x5UGlja2VySW5wdXRzQ29udHJhY3Q+KHRoaXMpLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICk7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmICF2YWxpZGF0aW9uLmxlbmd0aCkge1xuICAgICAgY29uc3QgdmFsdWVzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gW3ZhbHVlXSA6IHZhbHVlO1xuICAgICAgdmFsdWVzLmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgY29uc3QgZCA9IGRlY29kZUlzbyh2KTtcbiAgICAgICAgdGhpcy5kcmFmdHNbaV0gPSB7XG4gICAgICAgICAgZGF0ZTogdGhpcy5oYXNEYXRlXG4gICAgICAgICAgICA/IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkLmVwb2NoRGF5KVxuICAgICAgICAgICAgOiB0aGlzLmJsYW5rKHRoaXMudG9kYXkpLmRhdGUsXG4gICAgICAgICAgaG91cjogZC5ob3VyLFxuICAgICAgICAgIG1pbnV0ZTogZC5taW51dGUsXG4gICAgICAgICAgc2Vjb25kOiBkLnNlY29uZCxcbiAgICAgICAgICBwcmVzZW50OiB0cnVlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoaSA9PT0gMCAmJiB0aGlzLmhhc0RhdGUpIHRoaXMuZm9jdXNlZCA9IGQuZXBvY2hEYXk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHZhbGlkYXRpb24ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnBlbmRpbmdWYWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLnJlcG9ydCh2YWxpZGF0aW9uKTtcbiAgICB9IGVsc2UgdGhpcy5jaGVjaygpO1xuICB9XG4gIHdyaXRlVmFsdWUodmFsdWU6IFdrbHlQaWNrZXJWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuZm9ybVZhbHVlLnNldCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMubG9hZCh2YWx1ZSk7XG4gICAgICB0aGlzLnBvc2l0aW9uKHRoaXMuZm9jdXNlZCwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogV2tseVBpY2tlclZhbHVlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtRGlzYWJsZWQuc2V0KGRpc2FibGVkKTtcbiAgfVxuICB2YWxpZGF0ZShfY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmVycm9ycy5sZW5ndGggPyB7IHdrbHk6IHRoaXMuZXJyb3JzIH0gOiBudWxsO1xuICB9XG4gIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRvckNoYW5nZWQgPSBmbjtcbiAgfVxuICB0b3VjaGVkKCk6IHZvaWQge1xuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5vblRvdWNoZWQoKSk7XG4gIH1cbiAgcHJpdmF0ZSByZXBvcnQoZXJyb3JzOiByZWFkb25seSBXa2x5VmFsaWRhdGlvbkVycm9yW10pOiB2b2lkIHtcbiAgICBjb25zdCBjaGFuZ2VkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5lcnJvcnMpICE9PSBKU09OLnN0cmluZ2lmeShlcnJvcnMpO1xuICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzO1xuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzW1drbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLlZhbGlkYXRpb25DaGFuZ2VdLmVtaXQoZXJyb3JzKTtcbiAgICAgIHRoaXMudmFsaWRhdG9yQ2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuICBjaGVjaygpOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZURyYWZ0cyh7XG4gICAgICBkcmFmdHM6IHRoaXMuZHJhZnRzLFxuICAgICAgY29uZmlnRXJyb3JzOiB0aGlzLmNvbmZpZ0Vycm9ycyxcbiAgICAgIGFkYXB0ZXI6IHRoaXMuYWRhcHRlcixcbiAgICAgIHNlbGVjdGlvbjogdW53cmFwV2tseVBpY2tlclNpZ25hbElucHV0czxXa2x5UGlja2VySW5wdXRzQ29udHJhY3Q+KHRoaXMpLFxuICAgICAgbW9kZTogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdKCksXG4gICAgICBpc1JhbmdlOiB0aGlzLmlzUmFuZ2UsXG4gICAgICBoYXNEYXRlOiB0aGlzLmhhc0RhdGUsXG4gICAgICBoYXNUaW1lOiB0aGlzLmhhc1RpbWUsXG4gICAgICBzaG93U2Vjb25kczogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzXSgpLFxuICAgICAgcmVxdWlyZWQ6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5SZXF1aXJlZF0oKSxcbiAgICB9KTtcbiAgICB0aGlzLnBlbmRpbmdWYWx1ZSA9IHJlc3VsdC5wZW5kaW5nVmFsdWU7XG4gICAgdGhpcy5yZXBvcnQocmVzdWx0LmVycm9ycyk7XG4gIH1cbiAgdHJhY2tEcmFmdChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBFbmRwb2ludCBjb250cm9scyBrZWVwIHRoZWlyIGlkZW50aXR5IGFuZCBmb2N1cyB3aGVuIGRyYWZ0IG9iamVjdHMgc3dhcC5cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbiAgcHJpdmF0ZSBvcmRlckRyYWZ0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNSYW5nZSB8fCAhdGhpcy5kcmFmdHMuZXZlcnkoKGRyYWZ0KSA9PiBkcmFmdC5wcmVzZW50KSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmRyYWZ0cy5zb21lKChkcmFmdCkgPT4gZHJhZnQudW5zdXBwb3J0ZWRFcG9jaERheSAhPT0gdW5kZWZpbmVkKSlcbiAgICAgIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYSA9IHRoaXMuZHJhZnRzWzBdLFxuICAgICAgICBiID0gdGhpcy5kcmFmdHNbMV07XG4gICAgICBjb25zdCBrZXkgPSAoZDogRHJhZnQpID0+XG4gICAgICAgIHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheShkLmRhdGUpICogODY0MDAgK1xuICAgICAgICAoZC5ob3VyIHx8IDApICogMzYwMCArXG4gICAgICAgIChkLm1pbnV0ZSB8fCAwKSAqIDYwICtcbiAgICAgICAgKGQuc2Vjb25kIHx8IDApO1xuICAgICAgaWYgKGtleShhKSA+IGtleShiKSkgdGhpcy5kcmFmdHMgPSBbYiwgYV07XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLy8gSW1wb3NzaWJsZSBvciBpbmNvbXBsZXRlIGRhdGVzIHJlbWFpbiBlZGl0YWJsZSB1bnRpbCBjb3JyZWN0ZWQuXG4gICAgfVxuICB9XG4gIGZpbmlzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKCkpIHJldHVybjtcbiAgICB0aGlzLm9yZGVyRHJhZnRzKCk7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwibWFudWFsXCIgJiYgdGhpcy5oYXNEYXRlKSB0aGlzLnBvc2l0aW9uT25NYW51YWxEYXRlKCk7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIGlmICh0aGlzLnByZXNlbnRhdGlvbiA9PT0gXCJpbmxpbmVcIiAmJiB0aGlzLmNhblN1Ym1pdCkgdGhpcy5jb21taXQoKTtcbiAgfVxuICBwcml2YXRlIGNvbW1pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuU3VibWl0KSByZXR1cm47XG4gICAgY29uc3QgbmV4dCA9IHRoaXMucGVuZGluZ1ZhbHVlO1xuICAgIGlmIChKU09OLnN0cmluZ2lmeShuZXh0KSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5jdXJyZW50VmFsdWUoKSkpIHtcbiAgICAgIHRoaXMuZm9ybVZhbHVlLnNldChuZXh0KTtcbiAgICAgIHRoaXMuZW1pdHRlZFZhbHVlID0gSlNPTi5zdHJpbmdpZnkobmV4dCk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKG5leHQpO1xuICAgICAgdGhpc1tXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cy5WYWx1ZUNoYW5nZV0uZW1pdChuZXh0KTtcbiAgICB9XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuICBzdWJtaXQocmVhc29uOiBXa2x5Q2xvc2VSZWFzb24gPSBcInN1Ym1pdFwiKTogdm9pZCB7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIGlmICghdGhpcy5jYW5TdWJtaXQpIHJldHVybjtcbiAgICB0aGlzLmNvbW1pdCgpO1xuICAgIGlmICh0aGlzLnByZXNlbnRhdGlvbiA9PT0gXCJ0cmFuc2llbnRcIilcbiAgICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuQ2xvc2VkXS5lbWl0KHJlYXNvbik7XG4gIH1cbiAgY2FuY2VsKHJlYXNvbjogV2tseUNsb3NlUmVhc29uID0gXCJjbG9zZS1idXR0b25cIik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgIHRoaXMubG9hZCh0aGlzLmN1cnJlbnRWYWx1ZSgpKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuQ2xvc2VkXS5lbWl0KHJlYXNvbik7XG4gIH1cbiAgbm93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSB0aGlzLmNsb2NrLm5vdygpO1xuICAgIGNvbnN0IGRheSA9IE1hdGguZmxvb3Iobi5nZXRUaW1lKCkgLyA4NjQwMDAwMCk7XG4gICAgdGhpcy5kcmFmdHMgPSBbMCwgMV0ubWFwKChpbmRleCkgPT4gKHtcbiAgICAgIC4uLnRoaXMuY2xvY2tEcmFmdChkYXksIG4pLFxuICAgICAgcHJlc2VudDogaW5kZXggPT09IDAgfHwgdGhpcy5pc1JhbmdlLFxuICAgIH0pKTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmhhc0RhdGUgJiZcbiAgICAgIChkYXkgPCB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5IHx8IGRheSA+IHRoaXMubGFzdFN1cHBvcnRlZERheSlcbiAgICApIHtcbiAgICAgIHRoaXMucmVwb3J0KFtlcnJvcihcInVuc3VwcG9ydGVkLWFkYXB0ZXItZGF0ZVwiLCBkYXkpXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZm9jdXNlZCA9IGRheTtcbiAgICB0aGlzLnBvc2l0aW9uKGRheSwgdHJ1ZSk7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIHRoaXMuc3VibWl0KFwibm93XCIpO1xuICB9XG4gIHByaXZhdGUgY2xvY2tEcmFmdChkYXk6IG51bWJlciwgbm93OiBEYXRlKTogRHJhZnQge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmJsYW5rKGRheSksXG4gICAgICBob3VyOiBub3cuZ2V0VVRDSG91cnMoKSxcbiAgICAgIG1pbnV0ZTpcbiAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICBub3cuZ2V0VVRDTWludXRlcygpIC8gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1pbnV0ZVN0ZXBdKCksXG4gICAgICAgICkgKiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTWludXRlU3RlcF0oKSxcbiAgICAgIHNlY29uZDogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzXSgpXG4gICAgICAgID8gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIG5vdy5nZXRVVENTZWNvbmRzKCkgL1xuICAgICAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuU2Vjb25kU3RlcF0oKSxcbiAgICAgICAgICApICogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNlY29uZFN0ZXBdKClcbiAgICAgICAgOiAwLFxuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBpbml0aWFsaXplTWFudWFsUmFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuaXNSYW5nZSB8fFxuICAgICAgIXRoaXMuaGFzRGF0ZSB8fFxuICAgICAgdGhpcy5kcmFmdHMuZXZlcnkoKGRyYWZ0KSA9PiBkcmFmdC5wcmVzZW50KVxuICAgIClcbiAgICAgIHJldHVybjtcbiAgICBsZXQgc2VlZCA9IHRoaXMuZHJhZnRzLmZpbmQoKGRyYWZ0KSA9PiBkcmFmdC5wcmVzZW50KTtcbiAgICBpZiAoIXNlZWQpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRWYWx1ZSgpICE9PSBudWxsKSByZXR1cm47XG4gICAgICBjb25zdCBub3cgPSB0aGlzLmNsb2NrLm5vdygpO1xuICAgICAgY29uc3QgaW5pdGlhbEVwb2NoRGF5ID1cbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkluaXRpYWxFcG9jaERheV0oKTtcbiAgICAgIGNvbnN0IGRheSA9XG4gICAgICAgIGluaXRpYWxFcG9jaERheSA9PT0gbnVsbFxuICAgICAgICAgID8gdGhpcy5kZWZhdWx0cy5pbml0aWFsRXBvY2hEYXkgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBNYXRoLmZsb29yKG5vdy5nZXRUaW1lKCkgLyA4NjQwMDAwMClcbiAgICAgICAgICAgIDogdGhpcy5kZWZhdWx0cy5pbml0aWFsRXBvY2hEYXlcbiAgICAgICAgICA6IGluaXRpYWxFcG9jaERheTtcbiAgICAgIHNlZWQgPSB7IC4uLnRoaXMuY2xvY2tEcmFmdChkYXksIG5vdyksIHByZXNlbnQ6IHRydWUgfTtcbiAgICB9XG4gICAgLy8gQ29tcGxldGUgbWlzc2luZyBlbmRwb2ludHMgd2l0aG91dCByZXBsYWNpbmcgc2VsZWN0ZWQgb3IgaW52YWxpZCBkcmFmdHMuXG4gICAgY29uc3QgaW5pdGlhbCA9IHNlZWQ7XG4gICAgdGhpcy5kcmFmdHMgPSB0aGlzLmRyYWZ0cy5tYXAoKGRyYWZ0KSA9PlxuICAgICAgZHJhZnQucHJlc2VudCA/IGRyYWZ0IDogeyAuLi5pbml0aWFsLCBkYXRlOiB7IC4uLmluaXRpYWwuZGF0ZSB9IH0sXG4gICAgKTtcbiAgICB0aGlzLmZpbmlzaCgpO1xuICAgIC8vIFBvc2l0aW9uaW5nIHJlbmRlcnMgYmVmb3JlIHZhbGlkYXRpb247IHJlZnJlc2ggY29tcGxldGlvbiBjb250cm9scyBhZnRlcndhcmQuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICB0b2dnbGVWaWV3KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSB8fCAhdGhpcy5oYXNEYXRlKSByZXR1cm47XG4gICAgdGhpcy52aWV3TW9kZSA9IHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIiA/IFwibWFudWFsXCIgOiBcImNhbGVuZGFyXCI7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwibWFudWFsXCIpIHRoaXMuaW5pdGlhbGl6ZU1hbnVhbFJhbmdlKCk7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIikgdGhpcy5wb3NpdGlvbk9uTWFudWFsRGF0ZSgpO1xuICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuVmlld01vZGVDaGFuZ2VdLmVtaXQodGhpcy52aWV3TW9kZSk7XG4gICAgaWYgKHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIikgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlc2V0U2Nyb2xsKCkpO1xuICB9XG4gIHByaXZhdGUgcG9zaXRpb25Pbk1hbnVhbERhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgZHJhZnQgPSB0aGlzLmRyYWZ0c1t0aGlzLm1hbnVhbERhdGVFbmRwb2ludF07XG4gICAgaWYgKCFkcmFmdCB8fCAhZHJhZnQucHJlc2VudCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICAvLyBBIHZhbGlkIGRheSBmb2xsb3dzIHRoZSBzZWxlY3Rpb24uIEFuIGltcG9zc2libGUgZGF5IGtlZXBzIGl0cyBkcmFmdFxuICAgICAgLy8gZmllbGRzIGJ1dCBzdGlsbCBzaG93cyB0aGUgY2hvc2VuIG1vbnRoIGluIHRoZSBjYWxlbmRhci5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheShkcmFmdC5kYXRlKTtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRhcmdldDtcbiAgICAgIHRoaXMucG9zaXRpb24odGFyZ2V0LCB0cnVlKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaXJzdCA9IHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheSh7IC4uLmRyYWZ0LmRhdGUsIGRheTogMSB9KTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmlyc3Q7XG4gICAgICAgIHRoaXMucG9zaXRpb24oZmlyc3QsIHRydWUpO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICB9XG4gIH1cbiAgbW9udGhzKGRyYWZ0OiBEcmFmdCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRNb250aHMoZHJhZnQuZGF0ZS55ZWFyKS5tYXAoKG0pID0+IG0ubGFiZWwpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgbW9udGhDb3VudChkcmFmdDogRHJhZnQpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm1vbnRocyhkcmFmdCkubGVuZ3RoIHx8IDEyO1xuICB9XG4gIGdldCBpbkRheXMoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIGRyYWZ0RGF5RGlmZmVyZW5jZSh0aGlzLmRyYWZ0cywgdGhpcy5hZGFwdGVyKTtcbiAgfVxuICBnZXQgaW5EYXlzTGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXlzID0gdGhpcy5pbkRheXM7XG4gICAgcmV0dXJuIHRoaXMudChcImluRGF5c1wiKS5yZXBsYWNlKFxuICAgICAgL3t7XFxzKmRheXNcXHMqfX0vZyxcbiAgICAgIGRheXMgPT09IG51bGxcbiAgICAgICAgPyB0aGlzLnQoXCJkYXlzVW5hdmFpbGFibGVcIilcbiAgICAgICAgOiBuZXcgSW50bC5OdW1iZXJGb3JtYXQodGhpcy5lZmZlY3RpdmVMb2NhbGUsIHtcbiAgICAgICAgICAgIHVzZUdyb3VwaW5nOiBmYWxzZSxcbiAgICAgICAgICB9KS5mb3JtYXQoZGF5cyksXG4gICAgKTtcbiAgfVxuICBnZXQgcmVzdWx0aW5nRW5kRGF0ZSgpOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkcmFmdCA9IHRoaXMuZHJhZnRzWzFdO1xuICAgICAgaWYgKFxuICAgICAgICBkcmFmdC51bnN1cHBvcnRlZEVwb2NoRGF5ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgdGhpcy5hZGFwdGVyLnZhbGlkYXRlRGF0ZShkcmFmdC5kYXRlKS5sZW5ndGhcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmFkYXB0ZXIuZm9ybWF0RGF5KGRyYWZ0LmRhdGUpLFxuICAgICAgICB0aGlzLmFkYXB0ZXIuZm9ybWF0TW9udGgoZHJhZnQuZGF0ZSksXG4gICAgICAgIHRoaXMuYWRhcHRlci5mb3JtYXRZZWFyKGRyYWZ0LmRhdGUpLFxuICAgICAgXS5qb2luKFwiIFwiKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cbiAgdG9nZ2xlRW5kVmlldyh2aWV3OiBcImRhdGVcIiB8IFwiZGF5c1wiKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSByZXR1cm47XG4gICAgdGhpcy5lbmRWaWV3ID0gdmlldztcbiAgfVxuICBkYXlzKHZhbHVlOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSByZXR1cm47XG4gICAgdGhpcy5tYW51YWxEYXRlRW5kcG9pbnQgPSAxO1xuICAgIHNldERyYWZ0RGF5RGlmZmVyZW5jZSh0aGlzLmRyYWZ0cywgdGhpcy5hZGFwdGVyLCB2YWx1ZSk7XG4gICAgdGhpcy5jaGVjaygpO1xuICB9XG4gIGZpZWxkKGluZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpKSByZXR1cm47XG4gICAgY29uc3QgZHJhZnQgPSB0aGlzLmRyYWZ0c1tpbmRleF07XG4gICAgZHJhZnQucHJlc2VudCA9IHRydWU7XG4gICAgaWYgKGZpZWxkID09PSBcImRheVwiIHx8IGZpZWxkID09PSBcInllYXJcIiB8fCBmaWVsZCA9PT0gXCJtb250aFwiKSB7XG4gICAgICB0aGlzLm1hbnVhbERhdGVFbmRwb2ludCA9IGluZGV4O1xuICAgICAgZGVsZXRlIGRyYWZ0LnVuc3VwcG9ydGVkRXBvY2hEYXk7XG4gICAgICBsZXQgZGF0ZSA9IHsgLi4uZHJhZnQuZGF0ZSwgW2ZpZWxkXTogdmFsdWUgfSBhcyBXa2x5Q2FsZW5kYXJEYXRlO1xuICAgICAgaWYgKGZpZWxkID09PSBcIm1vbnRoXCIpIHtcbiAgICAgICAgbGV0IG1vbnRoO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vbnRoID0gdGhpcy5hZGFwdGVyXG4gICAgICAgICAgICAuZ2V0TW9udGhzKGRhdGUueWVhcilcbiAgICAgICAgICAgIC5maW5kKChtKSA9PiBtLm1vbnRoID09PSB2YWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIGRhdGUgPSB7IC4uLmRhdGUsIG1vbnRoQ29kZTogbW9udGggPyBtb250aC5tb250aENvZGUgOiBcIlwiIH07XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IFwieWVhclwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbW9udGhzID0gdGhpcy5hZGFwdGVyLmdldE1vbnRocyh2YWx1ZSk7XG4gICAgICAgICAgY29uc3QgbW9udGggPSBtb250aHMuZmluZCgobSkgPT4gbS5tb250aENvZGUgPT09IGRhdGUubW9udGhDb2RlKTtcbiAgICAgICAgICBpZiAobW9udGgpIGRhdGUgPSB7IC4uLmRhdGUsIG1vbnRoOiBtb250aC5tb250aCB9O1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgfVxuICAgICAgZHJhZnQuZGF0ZSA9IGRhdGU7XG4gICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gXCJob3VyXCIgJiYgdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPT09IFwiaDEyXCIpXG4gICAgICBkcmFmdC5ob3VyID1cbiAgICAgICAgdmFsdWUgPT09IG51bGxcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHZhbHVlID49IDEgJiYgdmFsdWUgPD0gMTJcbiAgICAgICAgICAgID8gKHZhbHVlICUgMTIpICsgKChkcmFmdC5ob3VyIHx8IDApID49IDEyID8gMTIgOiAwKVxuICAgICAgICAgICAgOiAyNCArIHZhbHVlO1xuICAgIGVsc2UgKGRyYWZ0IGFzIGFueSlbZmllbGRdID0gdmFsdWU7XG4gICAgdGhpcy5jaGVjaygpO1xuICB9XG4gIGRpc3BsYXlIb3VyKGRyYWZ0OiBEcmFmdCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiBkcmFmdC5ob3VyID09PSBudWxsXG4gICAgICA/IG51bGxcbiAgICAgIDogdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPT09IFwiaDEyXCJcbiAgICAgICAgPyBkcmFmdC5ob3VyICUgMTIgfHwgMTJcbiAgICAgICAgOiBkcmFmdC5ob3VyO1xuICB9XG4gIHBlcmlvZChpbmRleDogbnVtYmVyLCBwZXJpb2Q6IFwiYW1cIiB8IFwicG1cIiB8IFwiMjRcIik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgIGlmIChwZXJpb2QgPT09IFwiMjRcIikgdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPSBcImgyNFwiO1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPSBcImgxMlwiO1xuICAgICAgdGhpcy5kcmFmdHNbaW5kZXhdLmhvdXIgPVxuICAgICAgICAoKHRoaXMuZHJhZnRzW2luZGV4XS5ob3VyIHx8IDApICUgMTIpICsgKHBlcmlvZCA9PT0gXCJwbVwiID8gMTIgOiAwKTtcbiAgICAgIHRoaXMuZHJhZnRzW2luZGV4XS5wcmVzZW50ID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmluaXNoKCk7XG4gICAgfVxuICB9XG4gIHNlbGVjdGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZnRzLnNvbWUoKGQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkLnByZXNlbnQgJiYgdGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KGQuZGF0ZSkgPT09IGRheTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGluUmFuZ2UoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNSYW5nZSB8fCAhdGhpcy5kcmFmdHMuZXZlcnkoKGQpID0+IGQucHJlc2VudCkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYSA9IHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheSh0aGlzLmRyYWZ0c1swXS5kYXRlKSxcbiAgICAgICAgYiA9IHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheSh0aGlzLmRyYWZ0c1sxXS5kYXRlKTtcbiAgICAgIHJldHVybiBkYXkgPiBNYXRoLm1pbihhLCBiKSAmJiBkYXkgPCBNYXRoLm1heChhLCBiKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGRheURpc2FibGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKGRheSA8IHRoaXMuZmlyc3RTdXBwb3J0ZWREYXkgfHwgZGF5ID4gdGhpcy5sYXN0U3VwcG9ydGVkRGF5KVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmFkYXB0ZXIuZXBvY2hEYXlUb0RhdGUoZGF5KTtcbiAgICAgIGNvbnN0IGlzRGF0ZURpc2FibGVkID1cbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLklzRGF0ZURpc2FibGVkXSgpO1xuICAgICAgaWYgKFxuICAgICAgICBpc0RhdGVEaXNhYmxlZCAmJlxuICAgICAgICBpc0RhdGVEaXNhYmxlZChkYXksIHtcbiAgICAgICAgICBtb2RlOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0oKSxcbiAgICAgICAgICBlbmRwb2ludDogdGhpcy5pc1JhbmdlXG4gICAgICAgICAgICA/IHRoaXMuZHJhZnRzWzBdPy5wcmVzZW50ICYmICF0aGlzLmRyYWZ0c1sxXT8ucHJlc2VudFxuICAgICAgICAgICAgICA/IFwiZW5kXCJcbiAgICAgICAgICAgICAgOiBcInN0YXJ0XCJcbiAgICAgICAgICAgIDogXCJzaW5nbGVcIixcbiAgICAgICAgICBjYWxlbmRhckRhdGU6IGRhdGUsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgbWluID0gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1pbl0oKSxcbiAgICAgICAgbWF4ID0gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1heF0oKTtcbiAgICAgIGlmIChtaW4gJiYgZGF5IDwgZGVjb2RlSXNvKG1pbikuZXBvY2hEYXkpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKG1heCAmJiBkYXkgPiBkZWNvZGVJc28obWF4KS5lcG9jaERheSkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHNlbGVjdChkYXk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSB8fCB0aGlzLmRheURpc2FibGVkKGRheSkpIHJldHVybjtcbiAgICB0aGlzLmZvY3VzZWQgPSBkYXk7XG4gICAgY29uc3QgaW5kZXggPVxuICAgICAgdGhpcy5pc1JhbmdlICYmIHRoaXMuZHJhZnRzWzBdLnByZXNlbnQgJiYgIXRoaXMuZHJhZnRzWzFdLnByZXNlbnQgPyAxIDogMDtcbiAgICBpZiAodGhpcy5pc1JhbmdlICYmIGluZGV4ID09PSAwKSB0aGlzLmRyYWZ0c1sxXS5wcmVzZW50ID0gZmFsc2U7XG4gICAgZGVsZXRlIHRoaXMuZHJhZnRzW2luZGV4XS51bnN1cHBvcnRlZEVwb2NoRGF5O1xuICAgIHRoaXMuZHJhZnRzW2luZGV4XS5kYXRlID0gdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGRheSk7XG4gICAgdGhpcy5kcmFmdHNbaW5kZXhdLnByZXNlbnQgPSB0cnVlO1xuICAgIHRoaXMub3JkZXJEcmFmdHMoKTtcbiAgICB0aGlzLnJlbmRlclJvd3MoKTtcbiAgICB0aGlzLmZpbmlzaCgpO1xuICAgIGlmIChcbiAgICAgIHRoaXMucHJlc2VudGF0aW9uID09PSBcInRyYW5zaWVudFwiICYmXG4gICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0oKSA9PT0gXCJkYXRlXCIgJiZcbiAgICAgIHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIlxuICAgIClcbiAgICAgIHRoaXMuc3VibWl0KFwiYXV0by1zdWJtaXRcIik7XG4gIH1cbiAga2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXk6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBkZWx0YSA9IDA7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd0xlZnRcIikgZGVsdGEgPSAtMTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93UmlnaHRcIikgZGVsdGEgPSAxO1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dVcFwiKSBkZWx0YSA9IC03O1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dEb3duXCIpIGRlbHRhID0gNztcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIlBhZ2VVcFwiKVxuICAgICAgZGVsdGEgPSAtNyAqIChldmVudC5zaGlmdEtleSA/IHRoaXMudmlzaWJsZUNvdW50IDogMSk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJQYWdlRG93blwiKVxuICAgICAgZGVsdGEgPSA3ICogKGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy52aXNpYmxlQ291bnQgOiAxKTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkhvbWVcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheSh0aGlzLnRvZGF5LCB7IGZvY3VzOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAoZGVsdGEpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBkYXkgKyBkZWx0YTtcbiAgICAgIGlmICh0YXJnZXQgPj0gdGhpcy5maXJzdFN1cHBvcnRlZERheSAmJiB0YXJnZXQgPD0gdGhpcy5sYXN0U3VwcG9ydGVkRGF5KVxuICAgICAgICB0aGlzLnNjcm9sbFRvRXBvY2hEYXkodGFyZ2V0LCB7IGZvY3VzOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHBvc2l0aW9uKFxuICAgIGRheTogbnVtYmVyLFxuICAgIHByZXNldCA9IGZhbHNlLFxuICAgIG9wdGlvbnM6IFdrbHlKdW1wT3B0aW9ucyA9IHt9LFxuICApOiB2b2lkIHtcbiAgICBkYXkgPSBNYXRoLm1heChcbiAgICAgIHRoaXMuZmlyc3RTdXBwb3J0ZWREYXksXG4gICAgICBNYXRoLm1pbih0aGlzLmxhc3RTdXBwb3J0ZWREYXksIGRheSksXG4gICAgKTtcbiAgICB0aGlzLmFuY2hvcldlZWsgPSBhYnNvbHV0ZVdlZWtPZihkYXksIHRoaXMuZWZmZWN0aXZlT2Zmc2V0KTtcbiAgICBjb25zdCB2aWV3cG9ydFByZXNldCA9IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WaWV3cG9ydFByZXNldF0oKTtcbiAgICB0aGlzLmNsaXBNb250aCA9IHByZXNldCAmJiB2aWV3cG9ydFByZXNldC5raW5kID09PSBcImZ1bGwtbW9udGhcIjtcbiAgICBpZiAocHJlc2V0ICYmIHZpZXdwb3J0UHJlc2V0LmtpbmQgIT09IFwid2Vla3NcIikge1xuICAgICAgY29uc3QgZCA9IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkYXkpO1xuICAgICAgdGhpcy5pbml0aWFsTW9udGggPSBkLnllYXIgKyBcIi9cIiArIGQubW9udGhDb2RlO1xuICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gY2FsZW5kYXJNb250aEJvdW5kcyh0aGlzLmFkYXB0ZXIsIGRheSk7XG4gICAgICB0aGlzLmZpcnN0V2VlayA9IGFic29sdXRlV2Vla09mKHN0YXJ0LCB0aGlzLmVmZmVjdGl2ZU9mZnNldCk7XG4gICAgICB0aGlzLnZpc2libGVDb3VudCA9XG4gICAgICAgIGFic29sdXRlV2Vla09mKGVuZCwgdGhpcy5lZmZlY3RpdmVPZmZzZXQpIC0gdGhpcy5maXJzdFdlZWsgKyAxO1xuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydFByZXNldC5raW5kID09PSBcImZ1bGwtbW9udGgtYW5kLWFyb3VuZFwiICYmXG4gICAgICAgICF0aGlzLmNvbmZpZ0Vycm9ycy5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICBjb25zdCBiZWZvcmUgPSB2aWV3cG9ydFByZXNldC5leHRyYVdlZWtzQmVmb3JlIHx8IDAsXG4gICAgICAgICAgYWZ0ZXIgPSB2aWV3cG9ydFByZXNldC5leHRyYVdlZWtzQWZ0ZXIgfHwgMDtcbiAgICAgICAgdGhpcy5maXJzdFdlZWsgLT0gYmVmb3JlO1xuICAgICAgICB0aGlzLnZpc2libGVDb3VudCArPSBiZWZvcmUgKyBhZnRlcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZpZXdwb3J0UHJlc2V0LmtpbmQgPT09IFwid2Vla3NcIilcbiAgICAgICAgdGhpcy52aXNpYmxlQ291bnQgPSB0aGlzLmNvbmZpZ0Vycm9ycy5sZW5ndGhcbiAgICAgICAgICA/IDZcbiAgICAgICAgICA6IHZpZXdwb3J0UHJlc2V0LnZpc2libGVXZWVrQ291bnQ7XG4gICAgICB0aGlzLmZpcnN0V2VlayA9XG4gICAgICAgIHRoaXMuYW5jaG9yV2VlayAtXG4gICAgICAgIChvcHRpb25zLmFsaWduID09PSBcInN0YXJ0XCJcbiAgICAgICAgICA/IDBcbiAgICAgICAgICA6IG9wdGlvbnMuYWxpZ24gPT09IFwiZW5kXCJcbiAgICAgICAgICAgID8gdGhpcy52aXNpYmxlQ291bnQgLSAxXG4gICAgICAgICAgICA6IE1hdGguZmxvb3IodGhpcy52aXNpYmxlQ291bnQgLyAyKSk7XG4gICAgfVxuICAgIHRoaXMuZmlyc3RXZWVrID0gdGhpcy5jbGFtcEZpcnN0V2Vlayh0aGlzLmZpcnN0V2Vlayk7XG4gICAgdGhpcy5iYXNlV2VlayA9IHRoaXMuZmlyc3RXZWVrIC0gMTAwMDtcbiAgICB0aGlzLnJlbmRlclJvd3MoKTtcbiAgICAvLyBBcHBseSB0aGUgbmV3IHJ1bndheSBiZWZvcmUgd3JpdGluZyBzY3JvbGxUb3Agb3IgbG9jYXRpbmcgYSBmb2N1cyB0YXJnZXQuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICB9XG4gIHByaXZhdGUgcmVzZXRTY3JvbGwoKTogdm9pZCB7XG4gICAgLy8gUm91bmQgd2VlayBib3VuZGFyaWVzIHRvIGF2b2lkIHNjcm9sbFRvcCB0cnVuY2F0aW9uIHVuZGVyIENTUyB6b29tLlxuICAgIGlmICh0aGlzLnNjcm9sbGVyKVxuICAgICAgdGhpcy5zY3JvbGxlci5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IE1hdGgucm91bmQoMTAwMCAqIHRoaXMucm93SGVpZ2h0KTtcbiAgfVxuICBzY3JvbGwoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLnNuYXBQZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNjaGVkdWxlU25hcCgpO1xuICAgIC8vIFF1YW50aXplIGRpc3BsYWNlbWVudCBhcm91bmQgdGhlIHJlc2V0IHBvaW50LCBlcXVhbGx5IGluIGJvdGggZGlyZWN0aW9ucy5cbiAgICBjb25zdCByZWxhdGl2ZVJvd3MgPSBlbGVtZW50LnNjcm9sbFRvcCAvIHRoaXMucm93SGVpZ2h0IC0gMTAwMDtcbiAgICBjb25zdCBpbmRleCA9XG4gICAgICAxMDAwICsgTWF0aC5zaWduKHJlbGF0aXZlUm93cykgKiBNYXRoLnJvdW5kKE1hdGguYWJzKHJlbGF0aXZlUm93cykpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEZpcnN0ID0gdGhpcy5iYXNlV2VlayArIGluZGV4O1xuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5jbGFtcEZpcnN0V2VlayhyZXF1ZXN0ZWRGaXJzdCk7XG4gICAgaWYgKHJlcXVlc3RlZEZpcnN0ICE9PSBmaXJzdCkge1xuICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBNYXRoLnJvdW5kKChmaXJzdCAtIHRoaXMuYmFzZVdlZWspICogdGhpcy5yb3dIZWlnaHQpO1xuICAgIH1cbiAgICBpZiAoZmlyc3QgPT09IHRoaXMuZmlyc3RXZWVrKSByZXR1cm47XG4gICAgdGhpcy5jbGlwTW9udGggPSBmYWxzZTtcbiAgICB0aGlzLmZpcnN0V2VlayA9IGZpcnN0O1xuICAgIHRoaXMuYW5jaG9yV2VlayA9IGZpcnN0ICsgTWF0aC5mbG9vcih0aGlzLnZpc2libGVDb3VudCAvIDIpO1xuICAgIGlmIChpbmRleCA8IDEwMCB8fCBpbmRleCA+IDE5MDApIHtcbiAgICAgIC8vIFByZXNlcnZlIHNpZ25lZCBkaXNwbGFjZW1lbnQgZnJvbSB0aGlzIHdlZWs7IG1vZHVsbyB0dXJucyBmcmFjdGlvbmFsXG4gICAgICAvLyByb3VuZGluZyBqdXN0IGJlbG93IGEgYm91bmRhcnkgaW50byBhbG1vc3QgYSBmdWxsIHJvdyBhZnRlciByZWJhc2luZy5cbiAgICAgIGNvbnN0IG9mZnNldCA9XG4gICAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wIC0gKGZpcnN0IC0gdGhpcy5iYXNlV2VlaykgKiB0aGlzLnJvd0hlaWdodDtcbiAgICAgIHRoaXMuYmFzZVdlZWsgPSBmaXJzdCAtIDEwMDA7XG4gICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IE1hdGgucm91bmQoMTAwMCAqIHRoaXMucm93SGVpZ2h0ICsgb2Zmc2V0KTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJSb3dzKCk7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZVNuYXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRW5kVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVyKTtcbiAgICB0aGlzLnNjcm9sbEVuZFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnNuYXBXZWVrKCksIDIwMCk7XG4gIH1cbiAgc25hcFdlZWsoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsRW5kVGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbEVuZFRpbWVyKTtcbiAgICB0aGlzLnNjcm9sbEVuZFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIGlmICghdGhpcy5zbmFwUGVuZGluZyB8fCAhdGhpcy5zY3JvbGxlcikgcmV0dXJuO1xuICAgIHRoaXMuc25hcFBlbmRpbmcgPSBmYWxzZTtcbiAgICAvLyBBbGlnbiB0aGUgY3VycmVudCB2aXJ0dWFsIHdlZWsgd2l0aG91dCByZWJ1aWxkaW5nIG9yIHJlYmFzaW5nIGl0cyByb3dzLlxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnNjcm9sbGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgdGFyZ2V0ID0gTWF0aC5yb3VuZChcbiAgICAgICh0aGlzLmZpcnN0V2VlayAtIHRoaXMuYmFzZVdlZWspICogdGhpcy5yb3dIZWlnaHQsXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudC5zY3JvbGxUb3AgIT09IHRhcmdldCkgZWxlbWVudC5zY3JvbGxUb3AgPSB0YXJnZXQ7XG4gIH1cbiAgcHJpdmF0ZSBzaG93Rmlyc3RXZWVrKHdlZWs6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5jbGFtcEZpcnN0V2Vlayh3ZWVrKTtcbiAgICBpZiAoZmlyc3QgPT09IHRoaXMuZmlyc3RXZWVrKSByZXR1cm47XG4gICAgdGhpcy5jbGlwTW9udGggPSBmYWxzZTtcbiAgICB0aGlzLmZpcnN0V2VlayA9IGZpcnN0O1xuICAgIHRoaXMuYW5jaG9yV2VlayA9IGZpcnN0ICsgTWF0aC5mbG9vcih0aGlzLnZpc2libGVDb3VudCAvIDIpO1xuICAgIHRoaXMuYmFzZVdlZWsgPSBmaXJzdCAtIDEwMDA7XG4gICAgdGhpcy5yZW5kZXJSb3dzKCk7XG4gICAgdGhpcy5yZXNldFNjcm9sbCgpO1xuICB9XG4gIGNhbk1vdmVXZWVrKGRlbHRhOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbGFtcEZpcnN0V2Vlayh0aGlzLmZpcnN0V2VlayArIGRlbHRhKSAhPT0gdGhpcy5maXJzdFdlZWs7XG4gIH1cbiAgbW92ZVdlZWsoZGVsdGE6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKCkpIHRoaXMuc2hvd0ZpcnN0V2Vlayh0aGlzLmZpcnN0V2VlayArIGRlbHRhKTtcbiAgfVxuICBwcml2YXRlIHJlbmRlclJvd3MoKTogdm9pZCB7XG4gICAgLy8gS2VlcCB0aGUgdmlydHVhbCBzY3JvbGwgb2Zmc2V0IGhlcmU7IHJvdyBkYXRhIGlzIHNoYXJlZCBhY3Jvc3MgQW5ndWxhciB2ZXJzaW9ucy5cbiAgICBjb25zdCBvdmVyc2NhbiA9IE1hdGgubWF4KFxuICAgICAgMCxcbiAgICAgIE1hdGgubWluKDUwLCB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuT3ZlcnNjYW5XZWVrc10oKSB8fCAwKSxcbiAgICApO1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5maXJzdFdlZWsgLSBvdmVyc2NhbjtcbiAgICB0aGlzLnBhZGRpbmdUb3AgPSAoc3RhcnQgLSB0aGlzLmJhc2VXZWVrKSAqIHRoaXMucm93SGVpZ2h0O1xuICAgIHRoaXMucm93cyA9IGNyZWF0ZVdlZWtSb3dzKHtcbiAgICAgIGdlbmVyYXRvcjogdGhpcy5nZW5lcmF0b3IsXG4gICAgICBhZGFwdGVyOiB0aGlzLmFkYXB0ZXIsXG4gICAgICBzdGFydFdlZWs6IHN0YXJ0LFxuICAgICAgY291bnQ6IHRoaXMudmlzaWJsZUNvdW50ICsgMiAqIG92ZXJzY2FuLFxuICAgICAgZmlyc3RWaXNpYmxlV2VlazogdGhpcy5maXJzdFdlZWssXG4gICAgICBmaXJzdFN1cHBvcnRlZERheTogdGhpcy5maXJzdFN1cHBvcnRlZERheSxcbiAgICAgIGxhc3RTdXBwb3J0ZWREYXk6IHRoaXMubGFzdFN1cHBvcnRlZERheSxcbiAgICAgIGNsaXBNb250aDogdGhpcy5jbGlwTW9udGgsXG4gICAgICBpbml0aWFsTW9udGg6IHRoaXMuaW5pdGlhbE1vbnRoLFxuICAgICAgd2Vla0xhYmVsTW9kZTogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbE1vZGVdKCksXG4gICAgICB3ZWVrTGFiZWxGb3JtYXR0ZXI6XG4gICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxGb3JtYXR0ZXJdKCkgfHwgbnVsbCxcbiAgICAgIGlzRGF5RGlzYWJsZWQ6IChkYXkpID0+IHRoaXMuZGF5RGlzYWJsZWQoZGF5KSxcbiAgICB9KTtcbiAgICB0aGlzW1drbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLlZpZXdwb3J0Q2hhbmdlXS5lbWl0KHtcbiAgICAgIGZpcnN0VmlzaWJsZUFic29sdXRlV2VlazogdGhpcy5maXJzdFdlZWssXG4gICAgICBsYXN0VmlzaWJsZUFic29sdXRlV2VlazogdGhpcy5maXJzdFdlZWsgKyB0aGlzLnZpc2libGVDb3VudCAtIDEsXG4gICAgICBhbmNob3JBYnNvbHV0ZVdlZWs6IHRoaXMuYW5jaG9yV2VlayxcbiAgICB9KTtcbiAgfVxuICAvLyBSZXRhaW4gZGF5IERPTSBub2RlcyBhbmQga2V5Ym9hcmQgZm9jdXMgd2hlbiByb3cgbWV0YWRhdGEgaXMgcmVnZW5lcmF0ZWQuXG4gIHRyYWNrQ2VsbChfaTogbnVtYmVyLCBjZWxsOiB7IGVwb2NoRGF5OiBudW1iZXIgfSk6IG51bWJlciB7XG4gICAgcmV0dXJuIGNlbGwuZXBvY2hEYXk7XG4gIH1cbiAgdHJhY2tSb3coX2k6IG51bWJlciwgcm93OiBSb3cpOiBudW1iZXIge1xuICAgIHJldHVybiByb3cud2Vlay5hYnNvbHV0ZVdlZWs7XG4gIH1cbiAgc2Nyb2xsVG9FcG9jaERheShkYXk6IG51bWJlciwgb3B0aW9uczogV2tseUp1bXBPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBpbnRlZ2VyKGRheSk7XG4gICAgdGhpcy5hZGFwdGVyLmVwb2NoRGF5VG9EYXRlKGRheSk7XG4gICAgZGF5ID0gTWF0aC5tYXgoXG4gICAgICB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5LFxuICAgICAgTWF0aC5taW4odGhpcy5sYXN0U3VwcG9ydGVkRGF5LCBkYXkpLFxuICAgICk7XG4gICAgLy8gcG9zaXRpb24gcmVuZGVycyBzeW5jaHJvbm91c2x5OyBwdWJsaXNoIHRoZSB0YWIgc3RvcCBiZWZvcmUgdGhhdCByZW5kZXIuXG4gICAgaWYgKG9wdGlvbnMuZm9jdXMpIHRoaXMuZm9jdXNlZCA9IGRheTtcbiAgICB0aGlzLnBvc2l0aW9uKGRheSwgZmFsc2UsIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zLnNlbGVjdCkgdGhpcy5zZWxlY3QoZGF5KTtcbiAgICBpZiAob3B0aW9ucy5mb2N1cykgdGhpcy5mb2N1c0RheSgpO1xuICB9XG4gIHNjcm9sbFRvQWJzb2x1dGVXZWVrKHdlZWs6IG51bWJlciwgb3B0aW9uczogV2tseUp1bXBPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICAvLyBBIGJvdW5kYXJ5IHdlZWsgY2FuIHN0YXJ0IGJlZm9yZSB0aGUgYWRhcHRlcidzIGZpcnN0IHN1cHBvcnRlZCBkYXkuXG4gICAgY29uc3QgZmlyc3QgPSBmaXJzdEVwb2NoRGF5T2Yod2VlaywgdGhpcy5lZmZlY3RpdmVPZmZzZXQpO1xuICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheShcbiAgICAgIHdlZWsgPT09IHRoaXMuZmlyc3RTdXBwb3J0ZWRXZWVrXG4gICAgICAgID8gTWF0aC5tYXgoZmlyc3QsIHRoaXMuZmlyc3RTdXBwb3J0ZWREYXkpXG4gICAgICAgIDogZmlyc3QsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH1cbiAgc2Nyb2xsVG9DYWxlbmRhckRhdGUoXG4gICAgZGF0ZTogV2tseUNhbGVuZGFyRGF0ZSxcbiAgICBvcHRpb25zOiBXa2x5SnVtcE9wdGlvbnMgPSB7fSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheShkYXRlKSwgb3B0aW9ucyk7XG4gIH1cbiAgc2Nyb2xsVG9WYWx1ZSh2YWx1ZTogc3RyaW5nLCBvcHRpb25zOiBXa2x5SnVtcE9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheShkZWNvZGVJc28odmFsdWUpLmVwb2NoRGF5LCBvcHRpb25zKTtcbiAgfVxuICBmb2N1c0RheSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYnJvd3NlcikgcmV0dXJuO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGVzdHJveWVkKSByZXR1cm47XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIGNvbnN0IGRheSA9IHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICdbZGF0YS1kYXk9XCInICsgdGhpcy5mb2N1c2VkICsgJ1wiXScsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcImJ1dHRvbjpub3QoOmRpc2FibGVkKSxpbnB1dDpub3QoOmRpc2FibGVkKVwiLFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIChkYXkgfHwgZmFsbGJhY2spPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxzZWN0aW9uXG4gIGNsYXNzPVwid2tseVwiXG4gIFthdHRyLmRpcl09XCJkaXJlY3Rpb25cIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5BcmlhTGFiZWxdKCkgfHwgJ0RhdGUgYW5kIHRpbWUgcGlja2VyJ1xuICBcIlxuICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5BcmlhRGVzY3JpYmVkQnldKClcIlxuICAoZm9jdXNvdXQpPVwidG91Y2hlZCgpXCJcbj5cbiAgPGhlYWRlciBjbGFzcz1cInRvb2xiYXJcIj5cbiAgICBAaWYgKGhhc0RhdGUpIHtcbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQodmlld01vZGUgPT09ICdjYWxlbmRhcicgPyAnbWFudWFsJyA6ICdjYWxlbmRhcicpXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVZpZXcoKVwiXG4gICAgICA+XG4gICAgICAgIHt7IHZpZXdNb2RlID09PSBcImNhbGVuZGFyXCIgPyBcIuKYt1wiIDogXCLilqZcIiB9fVxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICAgIEBpZiAoaGFzRGF0ZSkge1xuICAgICAgPHNwYW4gY2xhc3M9XCJ5ZWFyLWNvbnRyb2xcIj57eyB0aXRsZSB9fTwvc3Bhbj5cbiAgICB9XG4gICAgPHNwYW4gY2xhc3M9XCJzcGFjZXJcIj48L3NwYW5cbiAgICA+PGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cIm5vd1wiXG4gICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcbiAgICAgIChjbGljayk9XCJub3coKVwiXG4gICAgPlxuICAgICAge3sgdChcIm5vd1wiKSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIEBpZiAocHJlc2VudGF0aW9uID09PSBcInRyYW5zaWVudFwiKSB7XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdjbG9zZScpXCJcbiAgICAgICAgKGNsaWNrKT1cImNhbmNlbCgpXCJcbiAgICAgID5cbiAgICAgICAgw5dcbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9oZWFkZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNEYXRlICYmIHZpZXdNb2RlID09PSAnY2FsZW5kYXInXCI+XG4gICAgPGRpdlxuICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkFyaWFMYWJlbF0oKSB8fCAnQ2FsZW5kYXInXG4gICAgICBcIlxuICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPVwiaXNSYW5nZVwiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgY2xhc3M9XCJ3ZWVrLWhlYWRcIlxuICAgICAgICBbY2xhc3Mubm8tbGFiZWxdPVwiXG4gICAgICAgICAgY29tcGFjdCB8fFxuICAgICAgICAgICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsTW9kZV0oKSA9PT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgICF0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsRm9ybWF0dGVyXSgpKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAhY29tcGFjdCAmJlxuICAgICAgICAgICAgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxNb2RlXSgpICE9PSAnaGlkZGVuJyB8fFxuICAgICAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsRm9ybWF0dGVyXSgpKVxuICAgICAgICAgIFwiXG4gICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgYXJpYS1sYWJlbD1cIldlZWtcIlxuICAgICAgICA+PC9zcGFuPlxuICAgICAgICBAZm9yIChkYXkgb2Ygd2Vla2RheXM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgIDxzcGFuIHJvbGU9XCJjb2x1bW5oZWFkZXJcIj57eyBkYXkgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAjc2Nyb2xsZXJcbiAgICAgICAgY2xhc3M9XCJ3ZWVrLXNjcm9sbFwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwidmlzaWJsZUNvdW50ICogcm93SGVpZ2h0XCJcbiAgICAgICAgKHNjcm9sbCk9XCJzY3JvbGwoJGV2ZW50KVwiXG4gICAgICAgIChzY3JvbGxlbmQpPVwic25hcFdlZWsoKVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgW3N0eWxlLmhlaWdodC5weF09XCJzY3JvbGxIZWlnaHRcIiBjbGFzcz1cInNjcm9sbC1zcGFjZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dzXCIgW3N0eWxlLnRvcC5weF09XCJwYWRkaW5nVG9wXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgdHJhY2tCeTogdHJhY2tSb3dcIlxuICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ3ZWVrLXJvd1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5uby1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICBjb21wYWN0IHx8XG4gICAgICAgICAgICAgICAgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxNb2RlXSgpID09PVxuICAgICAgICAgICAgICAgICAgJ2hpZGRlbicgJiZcbiAgICAgICAgICAgICAgICAgICF0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsRm9ybWF0dGVyXSgpKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAhY29tcGFjdCAmJlxuICAgICAgICAgICAgICAgICAgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxNb2RlXSgpICE9PVxuICAgICAgICAgICAgICAgICAgICAnaGlkZGVuJyB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsRm9ybWF0dGVyXSgpKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgcm9sZT1cInJvd2hlYWRlclwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3ZWVrLW51bWJlclwiXG4gICAgICAgICAgICAgICAgPnt7IHJvdy5sYWJlbCB9fTwvc3BhblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgIGxldCBjZWxsIG9mIHJvdy5jZWxscztcbiAgICAgICAgICAgICAgICAgIGxldCBkYXlJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tDZWxsXG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtd2Vla2RheS1pbmRleF09XCJkYXlJbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb2xpbmRleF09XCJcbiAgICAgICAgICAgICAgICAgIGRheUluZGV4ICtcbiAgICAgICAgICAgICAgICAgIChjb21wYWN0IHx8XG4gICAgICAgICAgICAgICAgICAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtMYWJlbE1vZGVdKCkgPT09XG4gICAgICAgICAgICAgICAgICAgICdoaWRkZW4nICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsRm9ybWF0dGVyXSgpKVxuICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgOiAyKVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJzZWxlY3RlZChjZWxsLmVwb2NoRGF5KVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJjZWxsLmRpc2FibGVkIHx8IGlzRGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnJhbmdlXT1cImluUmFuZ2UoY2VsbC5lcG9jaERheSlcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiY2VsbC5oaWRkZW5cIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vZGQtbW9udGhdPVwiY2VsbC5kYXRlICYmIGNlbGwuZGF0ZS5tb250aCAlIDIgPT09IDFcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cIidhbm5vdGF0aW9uIGFubm90YXRpb24tLScgKyBkYXlJbmRleFwiPnt7XG4gICAgICAgICAgICAgICAgICBjZWxsLmFubm90YXRpb25cbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGF5XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGF5XT1cImNlbGwuZXBvY2hEYXlcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjZWxsLmFjY2Vzc2libGVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImNlbGwuZXBvY2hEYXkgPT09IHRvZGF5ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImNlbGwuZGlzYWJsZWQgfHwgaXNEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIlxuICAgICAgICAgICAgICAgICAgICAhY2VsbC5oaWRkZW4gJiYgY2VsbC5lcG9jaERheSA9PT0gZm9jdXNlZCA/IDAgOiAtMVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJzZWxlY3RlZChjZWxsLmVwb2NoRGF5KVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MudG9kYXldPVwiY2VsbC5lcG9jaERheSA9PT0gdG9kYXlcIlxuICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cImZvY3VzZWQgPSBjZWxsLmVwb2NoRGF5XCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3QoY2VsbC5lcG9jaERheSlcIlxuICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5KCRldmVudCwgY2VsbC5lcG9jaERheSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHt7IGNlbGwubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwid2Vlay1uYXZpZ2F0aW9uXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpIHx8ICFjYW5Nb3ZlV2VlaygtMSlcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ3ByZXZpb3VzJylcIlxuICAgICAgICAoY2xpY2spPVwibW92ZVdlZWsoLTEpXCJcbiAgICAgID5cbiAgICAgICAg4oaRPC9idXR0b25cbiAgICAgID48c3Bhbj57eyB0aXRsZSB9fTwvc3BhblxuICAgICAgPjxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKCkgfHwgIWNhbk1vdmVXZWVrKDEpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCduZXh0JylcIlxuICAgICAgICAoY2xpY2spPVwibW92ZVdlZWsoMSlcIlxuICAgICAgPlxuICAgICAgICDihpNcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLWNvbnRhaW5lclxuICAgICpuZ0Zvcj1cImxldCBkcmFmdCBvZiBkcmFmdHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrRHJhZnRcIlxuICA+XG4gICAgPGZpZWxkc2V0XG4gICAgICAqbmdJZj1cIihpID09PSAwIHx8IGlzUmFuZ2UpICYmIChoYXNUaW1lIHx8IHZpZXdNb2RlID09PSAnbWFudWFsJylcIlxuICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImlzUmFuZ2UgPyB0KGkgPT09IDAgPyAnc3RhcnQnIDogJ2VuZCcpIDogbnVsbFwiXG4gICAgPlxuICAgICAgPGxlZ2VuZCAqbmdJZj1cImlzUmFuZ2VcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICBpID09PSAxICYmIGhhc0RhdGUgJiYgdmlld01vZGUgPT09ICdtYW51YWwnO1xuICAgICAgICAgICAgZWxzZSBlbmRwb2ludExhYmVsXG4gICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW5kLXZpZXctdG9nZ2xlXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImVuZFZpZXcgPT09ICdkYXRlJ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVFbmRWaWV3KCdkYXRlJylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB0KFwiZW5kXCIpIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiZW5kVmlldyA9PT0gJ2RheXMnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVuZFZpZXcoJ2RheXMnKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGluRGF5c0xhYmVsIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2VuZHBvaW50TGFiZWw+e3tcbiAgICAgICAgICB0KGkgPT09IDAgPyBcInN0YXJ0XCIgOiBcImVuZFwiKVxuICAgICAgICB9fTwvbmctdGVtcGxhdGU+XG4gICAgICA8L2xlZ2VuZD5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICBpID09PSAxICYmIGhhc0RhdGUgJiYgdmlld01vZGUgPT09ICdtYW51YWwnICYmIGVuZFZpZXcgPT09ICdkYXlzJ1xuICAgICAgICBcIlxuICAgICAgICBjbGFzcz1cImRhdGUtZmllbGRzIGluLWRheXMtZmllbGRzXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXN1bHRpbmctZW5kLWRhdGVcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2VuZERhdGUnKVwiPnt7XG4gICAgICAgICAgcmVzdWx0aW5nRW5kRGF0ZVxuICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPHdrbHktZmllbGRcbiAgICAgICAgICBbbGFiZWxdPVwidCgnZGF5cycpXCJcbiAgICAgICAgICBbaGlkZUxhYmVsXT1cInRydWVcIlxuICAgICAgICAgIFtwcmV2aW91c0xhYmVsXT1cInQoJ2RheXNQcmV2aW91cycpXCJcbiAgICAgICAgICBbbmV4dExhYmVsXT1cInQoJ2RheXNOZXh0JylcIlxuICAgICAgICAgIFtsb2NhbGVdPVwiZWZmZWN0aXZlTG9jYWxlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiaW5EYXlzXCJcbiAgICAgICAgICBbbWluXT1cIi05OTk5XCJcbiAgICAgICAgICBbbWF4XT1cIjk5OTlcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIlxuICAgICAgICAgIFtpbnZhbGlkXT1cIiEhZXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImRheXMoJGV2ZW50KVwiXG4gICAgICAgICAgKGNvbXBsZXRlKT1cImZpbmlzaCgpXCJcbiAgICAgICAgPjwvd2tseS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIGhhc0RhdGUgJiYgdmlld01vZGUgPT09ICdtYW51YWwnICYmIChpID09PSAwIHx8IGVuZFZpZXcgPT09ICdkYXRlJylcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJkYXRlLWZpZWxkc1wiXG4gICAgICA+XG4gICAgICAgIDx3a2x5LWZpZWxkXG4gICAgICAgICAgW2xhYmVsXT1cInQoJ2RheScpXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImVmZmVjdGl2ZUxvY2FsZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRyYWZ0LmRhdGUuZGF5XCJcbiAgICAgICAgICBbbWluXT1cIjFcIlxuICAgICAgICAgIFttYXhdPVwiMzFcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIlxuICAgICAgICAgIFtpbnZhbGlkXT1cIiEhZXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZpZWxkKGksICdkYXknLCAkZXZlbnQpXCJcbiAgICAgICAgICAoY29tcGxldGUpPVwiZmluaXNoKClcIlxuICAgICAgICA+PC93a2x5LWZpZWxkPlxuICAgICAgICA8d2tseS1maWVsZFxuICAgICAgICAgIFtsYWJlbF09XCJ0KCdtb250aCcpXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImVmZmVjdGl2ZUxvY2FsZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRyYWZ0LmRhdGUubW9udGhcIlxuICAgICAgICAgIFttaW5dPVwiMVwiXG4gICAgICAgICAgW21heF09XCJtb250aENvdW50KGRyYWZ0KVwiXG4gICAgICAgICAgW2xhYmVsc109XCJtb250aHMoZHJhZnQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcbiAgICAgICAgICBbaW52YWxpZF09XCIhIWVycm9ycy5sZW5ndGhcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmaWVsZChpLCAnbW9udGgnLCAkZXZlbnQpXCJcbiAgICAgICAgICAoY29tcGxldGUpPVwiZmluaXNoKClcIlxuICAgICAgICA+PC93a2x5LWZpZWxkPlxuICAgICAgICA8d2tseS1maWVsZFxuICAgICAgICAgIFtsYWJlbF09XCJ0KCd5ZWFyJylcIlxuICAgICAgICAgIFtsb2NhbGVdPVwiZWZmZWN0aXZlTG9jYWxlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZHJhZnQuZGF0ZS55ZWFyXCJcbiAgICAgICAgICBbbWluXT1cImFkYXB0ZXIuc3VwcG9ydGVkWWVhclJhbmdlWzBdXCJcbiAgICAgICAgICBbbWF4XT1cImFkYXB0ZXIuc3VwcG9ydGVkWWVhclJhbmdlWzFdXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcbiAgICAgICAgICBbaW52YWxpZF09XCIhIWVycm9ycy5sZW5ndGhcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmaWVsZChpLCAneWVhcicsICRldmVudClcIlxuICAgICAgICAgIChjb21wbGV0ZSk9XCJmaW5pc2goKVwiXG4gICAgICAgID48L3drbHktZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJoYXNUaW1lXCJcbiAgICAgICAgY2xhc3M9XCJ0aW1lLWZpZWxkc1wiXG4gICAgICAgIFtjbGFzcy5zZWNvbmRzXT1cInRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TaG93U2Vjb25kc10oKVwiXG4gICAgICA+XG4gICAgICAgIDx3a2x5LWZpZWxkXG4gICAgICAgICAgW2xhYmVsXT1cInQoJ2hvdXInKVwiXG4gICAgICAgICAgW2xvY2FsZV09XCJlZmZlY3RpdmVMb2NhbGVcIlxuICAgICAgICAgIFt2YWx1ZV09XCJkaXNwbGF5SG91cihkcmFmdClcIlxuICAgICAgICAgIFttaW5dPVwiZWZmZWN0aXZlSG91ckN5Y2xlID09PSAnaDEyJyA/IDEgOiAwXCJcbiAgICAgICAgICBbbWF4XT1cImVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gJ2gxMicgPyAxMiA6IDIzXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCgpXCJcbiAgICAgICAgICBbaW52YWxpZF09XCIhIWVycm9ycy5sZW5ndGhcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJmaWVsZChpLCAnaG91cicsICRldmVudClcIlxuICAgICAgICAgIChjb21wbGV0ZSk9XCJmaW5pc2goKVwiXG4gICAgICAgID48L3drbHktZmllbGQ+XG4gICAgICAgIDx3a2x5LWZpZWxkXG4gICAgICAgICAgW2xhYmVsXT1cInQoJ21pbnV0ZScpXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImVmZmVjdGl2ZUxvY2FsZVwiXG4gICAgICAgICAgW3ZhbHVlXT1cImRyYWZ0Lm1pbnV0ZVwiXG4gICAgICAgICAgW21heF09XCI1OVwiXG4gICAgICAgICAgW3N0ZXBdPVwiXG4gICAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTWludXRlU3RlcF0oKSA+IDAgJiZcbiAgICAgICAgICAgIDYwICUgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1pbnV0ZVN0ZXBdKCkgPT09IDBcbiAgICAgICAgICAgICAgPyB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTWludXRlU3RlcF0oKVxuICAgICAgICAgICAgICA6IDFcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIlxuICAgICAgICAgIFtpbnZhbGlkXT1cIiEhZXJyb3JzLmxlbmd0aFwiXG4gICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImZpZWxkKGksICdtaW51dGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAoY29tcGxldGUpPVwiZmluaXNoKClcIlxuICAgICAgICA+PC93a2x5LWZpZWxkPlxuICAgICAgICA8d2tseS1maWVsZFxuICAgICAgICAgICpuZ0lmPVwidGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNob3dTZWNvbmRzXSgpXCJcbiAgICAgICAgICBbbGFiZWxdPVwidCgnc2Vjb25kJylcIlxuICAgICAgICAgIFtsb2NhbGVdPVwiZWZmZWN0aXZlTG9jYWxlXCJcbiAgICAgICAgICBbdmFsdWVdPVwiZHJhZnQuc2Vjb25kXCJcbiAgICAgICAgICBbbWF4XT1cIjU5XCJcbiAgICAgICAgICBbc3RlcF09XCJcbiAgICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TZWNvbmRTdGVwXSgpID4gMCAmJlxuICAgICAgICAgICAgNjAgJSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuU2Vjb25kU3RlcF0oKSA9PT0gMFxuICAgICAgICAgICAgICA/IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TZWNvbmRTdGVwXSgpXG4gICAgICAgICAgICAgIDogMVxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiXG4gICAgICAgICAgW2ludmFsaWRdPVwiISFlcnJvcnMubGVuZ3RoXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiZmllbGQoaSwgJ3NlY29uZCcsICRldmVudClcIlxuICAgICAgICAgIChjb21wbGV0ZSk9XCJmaW5pc2goKVwiXG4gICAgICAgID48L3drbHktZmllbGQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwZXJpb2RcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBlZmZlY3RpdmVIb3VyQ3ljbGUgPT09ICdoMTInIHx8XG4gICAgICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Ib3VyQ3ljbGVdKCkgPT09ICdzd2l0Y2hhYmxlJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gJ2gxMicgJiYgKGRyYWZ0LmhvdXIgfHwgMCkgPCAxMlxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChjbGljayk9XCJwZXJpb2QoaSwgJ2FtJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHQoXCJhbVwiKSB9fTwvYnV0dG9uXG4gICAgICAgICAgPjxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICBpc0Rpc2FibGVkKCkgfHxcbiAgICAgICAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkhvdXJDeWNsZV0oKSAhPT0gJ3N3aXRjaGFibGUnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gJ2gyNCdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInBlcmlvZChpLCAnMjQnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgMjQ8L2J1dHRvblxuICAgICAgICAgID48YnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBlZmZlY3RpdmVIb3VyQ3ljbGUgPT09ICdoMTInIHx8XG4gICAgICAgICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Ib3VyQ3ljbGVdKCkgPT09ICdzd2l0Y2hhYmxlJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUhvdXJDeWNsZSA9PT0gJ2gxMicgJiYgKGRyYWZ0LmhvdXIgfHwgMCkgPj0gMTJcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwicGVyaW9kKGksICdwbScpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0KFwicG1cIikgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2ZpZWxkc2V0PlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cInZhbGlkYXRpb25cIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgPHAgKm5nRm9yPVwibGV0IGVyciBvZiBlcnJvcnNcIj4hIHt7IHQoZXJyLm1lc3NhZ2VLZXkpIH19PC9wPlxuICA8L2Rpdj5cbiAgPGZvb3RlciAqbmdJZj1cInN1Ym1pdFZpc2libGVcIj5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiY29uZmlybVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNhblN1Ym1pdFwiXG4gICAgICAoY2xpY2spPVwic3VibWl0KClcIlxuICAgID5cbiAgICAgIHt7IHQoXCJjb25maXJtXCIpIH19XG4gICAgPC9idXR0b24+XG4gIDwvZm9vdGVyPlxuPC9zZWN0aW9uPlxuIl19
|