@wkly/datetime-picker 12.1.0 → 13.1.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/cdk-overlay/package.json +5 -6
- package/cdk-overlay/public-api.d.ts +10 -0
- package/cdk-overlay/wkly-datetime-picker-cdk-overlay.d.ts +1 -0
- package/config.d.ts +3 -0
- package/esm2020/cdk-overlay/public-api.mjs +137 -0
- package/{esm2015/cdk-overlay/wkly-datetime-picker-cdk-overlay.js → esm2020/cdk-overlay/wkly-datetime-picker-cdk-overlay.mjs} +1 -1
- package/esm2020/config.mjs +100 -0
- package/esm2020/field.component.mjs +253 -0
- package/esm2020/picker.component.mjs +960 -0
- package/esm2020/presentation.mjs +303 -0
- package/esm2020/public-api.mjs +31 -0
- package/{esm2015/wkly-datetime-picker.js → esm2020/wkly-datetime-picker.mjs} +1 -1
- package/fesm2015/wkly-datetime-picker-cdk-overlay.mjs +143 -0
- package/fesm2015/wkly-datetime-picker-cdk-overlay.mjs.map +1 -0
- package/fesm2015/wkly-datetime-picker.mjs +1629 -0
- package/fesm2015/wkly-datetime-picker.mjs.map +1 -0
- package/fesm2020/wkly-datetime-picker-cdk-overlay.mjs +143 -0
- package/fesm2020/wkly-datetime-picker-cdk-overlay.mjs.map +1 -0
- package/fesm2020/wkly-datetime-picker.mjs +1627 -0
- package/fesm2020/wkly-datetime-picker.mjs.map +1 -0
- package/field.component.d.ts +3 -0
- package/package.json +34 -14
- package/picker.component.d.ts +3 -0
- package/presentation.d.ts +7 -0
- package/public-api.d.ts +8 -0
- package/wkly-datetime-picker.d.ts +1 -1
- package/bundles/wkly-datetime-picker-cdk-overlay.umd.js +0 -675
- package/bundles/wkly-datetime-picker-cdk-overlay.umd.js.map +0 -1
- package/bundles/wkly-datetime-picker.umd.js +0 -2378
- package/bundles/wkly-datetime-picker.umd.js.map +0 -1
- package/cdk-overlay/public-api.ngfactory.d.ts +0 -3
- package/cdk-overlay/wkly-datetime-picker-cdk-overlay.metadata.json +0 -1
- package/esm2015/cdk-overlay/public-api.js +0 -127
- package/esm2015/cdk-overlay/public-api.ngfactory.js +0 -19
- package/esm2015/cdk-overlay/public-api.ngsummary.json +0 -1
- package/esm2015/cdk-overlay/wkly-datetime-picker-cdk-overlay.ngsummary.json +0 -1
- package/esm2015/config.js +0 -241
- package/esm2015/config.ngsummary.json +0 -1
- package/esm2015/field.component.css.shim.ngstyle.js +0 -9
- package/esm2015/field.component.js +0 -240
- package/esm2015/field.component.ngfactory.js +0 -52
- package/esm2015/field.component.ngsummary.json +0 -1
- package/esm2015/picker.component.js +0 -934
- package/esm2015/picker.component.ngfactory.js +0 -137
- package/esm2015/picker.component.ngsummary.json +0 -1
- package/esm2015/presentation.js +0 -295
- package/esm2015/presentation.ngsummary.json +0 -1
- package/esm2015/public-api.js +0 -24
- package/esm2015/public-api.ngfactory.js +0 -13
- package/esm2015/public-api.ngsummary.json +0 -1
- package/esm2015/wkly-datetime-picker.ngsummary.json +0 -1
- package/fesm2015/wkly-datetime-picker-cdk-overlay.js +0 -134
- package/fesm2015/wkly-datetime-picker-cdk-overlay.js.map +0 -1
- package/fesm2015/wkly-datetime-picker.js +0 -1720
- package/fesm2015/wkly-datetime-picker.js.map +0 -1
- package/field.component.css.shim.ngstyle.d.ts +0 -1
- package/field.component.ngfactory.d.ts +0 -1
- package/picker.component.ngfactory.d.ts +0 -1
- package/public-api.ngfactory.d.ts +0 -3
- package/wkly-datetime-picker.metadata.json +0 -1
|
@@ -1,934 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectorRef, Component, ElementRef, forwardRef, Inject, LOCALE_ID, PLATFORM_ID, ViewChild, } from "@angular/core";
|
|
2
|
-
import { getLocaleFirstDayOfWeek, isPlatformBrowser } from "@angular/common";
|
|
3
|
-
import { NG_VALIDATORS, NG_VALUE_ACCESSOR, } from "@angular/forms";
|
|
4
|
-
import { absoluteWeekOf, createWeekGenerator, firstEpochDayOf, integer, } from "@wkly/core";
|
|
5
|
-
import { decodeIso, error, resolveWeekOffset, validateSelection, WklyGregorianCalendarAdapter, } from "@wkly/adapters";
|
|
6
|
-
import { draftDayDifference, setDraftDayDifference, calendarMonthBounds, resolveWklyTranslation, createWeekRows, validateDrafts, } from "@wkly/presentation";
|
|
7
|
-
import { coerceBoolean, WKLY_CLOCK, WKLY_CONFIG, WKLY_LOCALIZATION, WKLY_TRANSLATIONS, WklyPickerInputs, WklyPickerInputsPropertyKeys, WklyPickerOutputsPropertyKeys, } from "./config";
|
|
8
|
-
export class WklyDateTimePickerComponent extends WklyPickerInputs {
|
|
9
|
-
constructor(defaultLocale, defaults, clock, strings, defaultTranslations, platform, host, changeDetector) {
|
|
10
|
-
super();
|
|
11
|
-
this.defaultLocale = defaultLocale;
|
|
12
|
-
this.defaults = defaults;
|
|
13
|
-
this.clock = clock;
|
|
14
|
-
this.strings = strings;
|
|
15
|
-
this.defaultTranslations = defaultTranslations;
|
|
16
|
-
this.host = host;
|
|
17
|
-
this.changeDetector = changeDetector;
|
|
18
|
-
this.presentation = "inline";
|
|
19
|
-
this.viewMode = "calendar";
|
|
20
|
-
this.endView = "date";
|
|
21
|
-
this.effectiveLocale = "en-US";
|
|
22
|
-
this.effectiveOffset = 0;
|
|
23
|
-
this.effectiveHourCycle = "h24";
|
|
24
|
-
this.direction = "ltr";
|
|
25
|
-
this.rows = [];
|
|
26
|
-
this.weekdays = [];
|
|
27
|
-
this.drafts = [];
|
|
28
|
-
this.errors = [];
|
|
29
|
-
this.today = 0;
|
|
30
|
-
this.focused = 0;
|
|
31
|
-
this.anchorWeek = 0;
|
|
32
|
-
this.firstWeek = 0;
|
|
33
|
-
this.visibleCount = 6;
|
|
34
|
-
this.rowHeight = 76;
|
|
35
|
-
this.scrollHeight = 152076;
|
|
36
|
-
this.paddingTop = 0;
|
|
37
|
-
this.initialized = false;
|
|
38
|
-
this.compact = false;
|
|
39
|
-
this.WklyPickerInputsPropertyKeys = WklyPickerInputsPropertyKeys;
|
|
40
|
-
this.baseWeek = 0;
|
|
41
|
-
this.firstSupportedDay = 0;
|
|
42
|
-
this.lastSupportedDay = 0;
|
|
43
|
-
this.firstSupportedWeek = 0;
|
|
44
|
-
this.lastSupportedWeek = 0;
|
|
45
|
-
this.initialMonth = "";
|
|
46
|
-
this.clipMonth = false;
|
|
47
|
-
this.browser = false;
|
|
48
|
-
this.destroyed = false;
|
|
49
|
-
this.snapPending = false;
|
|
50
|
-
this.onChange = () => { };
|
|
51
|
-
this.onTouched = () => { };
|
|
52
|
-
this.validatorChanged = () => { };
|
|
53
|
-
this.configErrors = [];
|
|
54
|
-
this.pendingValue = null;
|
|
55
|
-
this.emittedValue = null;
|
|
56
|
-
this.manualDateEndpoint = 0;
|
|
57
|
-
this.browser = isPlatformBrowser(platform);
|
|
58
|
-
}
|
|
59
|
-
ngOnInit() {
|
|
60
|
-
this.initialize();
|
|
61
|
-
}
|
|
62
|
-
ngOnChanges(changes) {
|
|
63
|
-
if (this.initialized) {
|
|
64
|
-
if (Object.keys(changes).length === 1 &&
|
|
65
|
-
changes[WklyPickerInputsPropertyKeys.Value] &&
|
|
66
|
-
this.emittedValue ===
|
|
67
|
-
JSON.stringify(this[WklyPickerInputsPropertyKeys.Value])) {
|
|
68
|
-
this.emittedValue = null;
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const focus = this.focused;
|
|
72
|
-
this.configure();
|
|
73
|
-
if (changes[WklyPickerInputsPropertyKeys.Value] ||
|
|
74
|
-
changes[WklyPickerInputsPropertyKeys.Mode] ||
|
|
75
|
-
changes[WklyPickerInputsPropertyKeys.CalendarAdapter]) {
|
|
76
|
-
this.load(this[WklyPickerInputsPropertyKeys.Value]);
|
|
77
|
-
this.position(this.focused, true);
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
this.check();
|
|
81
|
-
if (changes[WklyPickerInputsPropertyKeys.ViewportPreset])
|
|
82
|
-
this.position(focus, true);
|
|
83
|
-
else
|
|
84
|
-
this.scrollToEpochDay(focus);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
initialize() {
|
|
89
|
-
if (this.initialized)
|
|
90
|
-
return;
|
|
91
|
-
this.configure();
|
|
92
|
-
const initialEpochDay = this[WklyPickerInputsPropertyKeys.InitialEpochDay];
|
|
93
|
-
this.today = this.browser
|
|
94
|
-
? Math.floor(this.clock.now().getTime() / 86400000)
|
|
95
|
-
: initialEpochDay === null
|
|
96
|
-
? 0
|
|
97
|
-
: initialEpochDay;
|
|
98
|
-
this.focused =
|
|
99
|
-
initialEpochDay === null
|
|
100
|
-
? this.defaults.initialEpochDay === undefined
|
|
101
|
-
? this.today
|
|
102
|
-
: this.defaults.initialEpochDay
|
|
103
|
-
: initialEpochDay;
|
|
104
|
-
this.load(this[WklyPickerInputsPropertyKeys.Value]);
|
|
105
|
-
this.initialized = true;
|
|
106
|
-
this.position(this.focused, true);
|
|
107
|
-
}
|
|
108
|
-
configure() {
|
|
109
|
-
this.configErrors = [];
|
|
110
|
-
[
|
|
111
|
-
WklyPickerInputsPropertyKeys.ShowSeconds,
|
|
112
|
-
WklyPickerInputsPropertyKeys.AllowRangeAcrossDisabled,
|
|
113
|
-
WklyPickerInputsPropertyKeys.Required,
|
|
114
|
-
WklyPickerInputsPropertyKeys.Disabled,
|
|
115
|
-
WklyPickerInputsPropertyKeys.CloseOnBackdrop,
|
|
116
|
-
].forEach((key) => (this[key] = coerceBoolean(this[key])));
|
|
117
|
-
this.effectiveLocale =
|
|
118
|
-
this[WklyPickerInputsPropertyKeys.Locale] ||
|
|
119
|
-
this.defaults.locale ||
|
|
120
|
-
this.defaultLocale;
|
|
121
|
-
this.direction = /^(ar|he|fa|ur)(-|$)/.test(this.effectiveLocale)
|
|
122
|
-
? "rtl"
|
|
123
|
-
: "ltr";
|
|
124
|
-
this.adapter =
|
|
125
|
-
this[WklyPickerInputsPropertyKeys.CalendarAdapter] ||
|
|
126
|
-
new WklyGregorianCalendarAdapter(this.effectiveLocale);
|
|
127
|
-
try {
|
|
128
|
-
let firstDay;
|
|
129
|
-
try {
|
|
130
|
-
firstDay = getLocaleFirstDayOfWeek(this.effectiveLocale);
|
|
131
|
-
}
|
|
132
|
-
catch (_) { }
|
|
133
|
-
this.effectiveOffset = resolveWeekOffset(this.effectiveLocale, this[WklyPickerInputsPropertyKeys.WeekOffset], this.defaults.weekOffset, firstDay);
|
|
134
|
-
integer(this[WklyPickerInputsPropertyKeys.WeekCacheSize]);
|
|
135
|
-
integer(this[WklyPickerInputsPropertyKeys.OverscanWeeks]);
|
|
136
|
-
if (this[WklyPickerInputsPropertyKeys.WeekCacheSize] < 0 ||
|
|
137
|
-
this[WklyPickerInputsPropertyKeys.OverscanWeeks] < 0 ||
|
|
138
|
-
this[WklyPickerInputsPropertyKeys.OverscanWeeks] > 50)
|
|
139
|
-
throw new RangeError();
|
|
140
|
-
if (![
|
|
141
|
-
"datetime",
|
|
142
|
-
"date",
|
|
143
|
-
"time",
|
|
144
|
-
"datetime-range",
|
|
145
|
-
"date-range",
|
|
146
|
-
"time-range",
|
|
147
|
-
].includes(this[WklyPickerInputsPropertyKeys.Mode]))
|
|
148
|
-
throw new RangeError();
|
|
149
|
-
const preset = this[WklyPickerInputsPropertyKeys.ViewportPreset];
|
|
150
|
-
if (preset.kind === "weeks") {
|
|
151
|
-
integer(preset.visibleWeekCount);
|
|
152
|
-
if (preset.visibleWeekCount < 1 || preset.visibleWeekCount > 52)
|
|
153
|
-
throw new RangeError();
|
|
154
|
-
}
|
|
155
|
-
if (preset.kind === "full-month-and-around")
|
|
156
|
-
for (const n of [
|
|
157
|
-
preset.extraWeeksBefore || 0,
|
|
158
|
-
preset.extraWeeksAfter || 0,
|
|
159
|
-
]) {
|
|
160
|
-
integer(n);
|
|
161
|
-
if (n < 0 || n > 52)
|
|
162
|
-
throw new RangeError();
|
|
163
|
-
}
|
|
164
|
-
this.generator = createWeekGenerator({
|
|
165
|
-
weekOffset: this.effectiveOffset,
|
|
166
|
-
cacheSize: this[WklyPickerInputsPropertyKeys.WeekCacheSize],
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
catch (_) {
|
|
170
|
-
this.configErrors.push(error("configuration-error", this[WklyPickerInputsPropertyKeys.WeekOffset]));
|
|
171
|
-
this.generator = createWeekGenerator();
|
|
172
|
-
this.effectiveOffset = 0;
|
|
173
|
-
}
|
|
174
|
-
this.setSupportedScrollRange();
|
|
175
|
-
const hourCycle = this[WklyPickerInputsPropertyKeys.HourCycle];
|
|
176
|
-
// Host value/configuration feedback must retain the user's switchable format.
|
|
177
|
-
if (hourCycle !== "switchable" || this.configuredHourCycle !== hourCycle) {
|
|
178
|
-
this.effectiveHourCycle =
|
|
179
|
-
hourCycle === "h12"
|
|
180
|
-
? "h12"
|
|
181
|
-
: hourCycle === "locale"
|
|
182
|
-
? new Intl.DateTimeFormat(this.effectiveLocale, {
|
|
183
|
-
hour: "numeric",
|
|
184
|
-
timeZone: "UTC",
|
|
185
|
-
}).resolvedOptions().hour12
|
|
186
|
-
? "h12"
|
|
187
|
-
: "h24"
|
|
188
|
-
: "h24";
|
|
189
|
-
}
|
|
190
|
-
this.configuredHourCycle = hourCycle;
|
|
191
|
-
this.weekdays = Array.from({ length: 7 }, (_, i) => this.adapter.formatWeekday(this.effectiveOffset + i, "short"));
|
|
192
|
-
}
|
|
193
|
-
setSupportedScrollRange() {
|
|
194
|
-
let [first, last] = this.adapter.supportedEpochDayRange;
|
|
195
|
-
const [firstYear, lastYear] = this.adapter.supportedYearRange;
|
|
196
|
-
const yearOf = (day) => this.adapter.epochDayToDate(day).year;
|
|
197
|
-
if (yearOf(first) < firstYear) {
|
|
198
|
-
let low = first, high = last;
|
|
199
|
-
while (low < high) {
|
|
200
|
-
const mid = Math.floor((low + high) / 2);
|
|
201
|
-
if (yearOf(mid) < firstYear)
|
|
202
|
-
low = mid + 1;
|
|
203
|
-
else
|
|
204
|
-
high = mid;
|
|
205
|
-
}
|
|
206
|
-
first = low;
|
|
207
|
-
}
|
|
208
|
-
if (yearOf(last) > lastYear) {
|
|
209
|
-
let low = first, high = last;
|
|
210
|
-
while (low < high) {
|
|
211
|
-
const mid = Math.ceil((low + high) / 2);
|
|
212
|
-
if (yearOf(mid) > lastYear)
|
|
213
|
-
high = mid - 1;
|
|
214
|
-
else
|
|
215
|
-
low = mid;
|
|
216
|
-
}
|
|
217
|
-
last = low;
|
|
218
|
-
}
|
|
219
|
-
if (first > last ||
|
|
220
|
-
yearOf(first) < firstYear ||
|
|
221
|
-
yearOf(first) > lastYear ||
|
|
222
|
-
yearOf(last) < firstYear ||
|
|
223
|
-
yearOf(last) > lastYear)
|
|
224
|
-
throw new RangeError("No supported days within the calendar year range");
|
|
225
|
-
this.firstSupportedDay = first;
|
|
226
|
-
this.lastSupportedDay = last;
|
|
227
|
-
this.firstSupportedWeek = absoluteWeekOf(first, this.effectiveOffset);
|
|
228
|
-
this.lastSupportedWeek = absoluteWeekOf(last, this.effectiveOffset);
|
|
229
|
-
}
|
|
230
|
-
clampFirstWeek(week) {
|
|
231
|
-
// Keep supported weeks inside the viewport; renderRows adds the buffer rows.
|
|
232
|
-
const last = Math.max(this.firstSupportedWeek, this.lastSupportedWeek - this.visibleCount + 1);
|
|
233
|
-
return Math.max(this.firstSupportedWeek, Math.min(last, week));
|
|
234
|
-
}
|
|
235
|
-
ngAfterViewInit() {
|
|
236
|
-
this.resetScroll();
|
|
237
|
-
if (this.browser && typeof ResizeObserver !== "undefined") {
|
|
238
|
-
this.observer = new ResizeObserver(() => {
|
|
239
|
-
this.compact = this.host.nativeElement.clientWidth < 338;
|
|
240
|
-
const row = this.host.nativeElement.querySelector(".week-row");
|
|
241
|
-
// CSS heights and scrollTop use layout pixels; client rectangles include zoom.
|
|
242
|
-
const height = row ? parseFloat(getComputedStyle(row).height) : 0;
|
|
243
|
-
if (height && height !== this.rowHeight) {
|
|
244
|
-
this.rowHeight = height;
|
|
245
|
-
this.scrollHeight = this.rowHeight * 2001;
|
|
246
|
-
this.renderRows();
|
|
247
|
-
this.resetScroll();
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
this.observer.observe(this.host.nativeElement);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
ngOnDestroy() {
|
|
254
|
-
this.destroyed = true;
|
|
255
|
-
if (this.observer)
|
|
256
|
-
this.observer.disconnect();
|
|
257
|
-
if (this.scrollEndTimer)
|
|
258
|
-
clearTimeout(this.scrollEndTimer);
|
|
259
|
-
if (this.generator)
|
|
260
|
-
this.generator.clearCache();
|
|
261
|
-
}
|
|
262
|
-
t(key) {
|
|
263
|
-
return resolveWklyTranslation(key, this.effectiveLocale, this[WklyPickerInputsPropertyKeys.Translations] ||
|
|
264
|
-
this.defaultTranslations, this.strings);
|
|
265
|
-
}
|
|
266
|
-
get isRange() {
|
|
267
|
-
return this[WklyPickerInputsPropertyKeys.Mode].endsWith("-range");
|
|
268
|
-
}
|
|
269
|
-
get hasDate() {
|
|
270
|
-
return !this[WklyPickerInputsPropertyKeys.Mode].startsWith("time");
|
|
271
|
-
}
|
|
272
|
-
get hasTime() {
|
|
273
|
-
return (this[WklyPickerInputsPropertyKeys.Mode] !== "date" &&
|
|
274
|
-
this[WklyPickerInputsPropertyKeys.Mode] !== "date-range");
|
|
275
|
-
}
|
|
276
|
-
get submitVisible() {
|
|
277
|
-
return (this.presentation === "transient" &&
|
|
278
|
-
(this[WklyPickerInputsPropertyKeys.Mode] !== "date" ||
|
|
279
|
-
this.viewMode === "manual"));
|
|
280
|
-
}
|
|
281
|
-
get title() {
|
|
282
|
-
try {
|
|
283
|
-
const d = this.adapter.epochDayToDate(Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, firstEpochDayOf(this.anchorWeek, this.effectiveOffset))));
|
|
284
|
-
return this.adapter.formatMonth(d) + " " + this.adapter.formatYear(d);
|
|
285
|
-
}
|
|
286
|
-
catch (_) {
|
|
287
|
-
return "";
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
get canSubmit() {
|
|
291
|
-
return (!this[WklyPickerInputsPropertyKeys.Disabled] &&
|
|
292
|
-
!this.errors.length &&
|
|
293
|
-
this.pendingValue !== null);
|
|
294
|
-
}
|
|
295
|
-
blank(day) {
|
|
296
|
-
const safe = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
|
|
297
|
-
return {
|
|
298
|
-
date: this.adapter.epochDayToDate(safe),
|
|
299
|
-
hour: 0,
|
|
300
|
-
minute: 0,
|
|
301
|
-
second: 0,
|
|
302
|
-
present: false,
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
load(value) {
|
|
306
|
-
this.drafts = [this.blank(this.focused), this.blank(this.focused)];
|
|
307
|
-
const validation = validateSelection(value, this, this.adapter);
|
|
308
|
-
if (value !== null && !validation.length) {
|
|
309
|
-
const values = typeof value === "string" ? [value] : value;
|
|
310
|
-
values.forEach((v, i) => {
|
|
311
|
-
const d = decodeIso(v);
|
|
312
|
-
this.drafts[i] = {
|
|
313
|
-
date: this.hasDate
|
|
314
|
-
? this.adapter.epochDayToDate(d.epochDay)
|
|
315
|
-
: this.blank(this.today).date,
|
|
316
|
-
hour: d.hour,
|
|
317
|
-
minute: d.minute,
|
|
318
|
-
second: d.second,
|
|
319
|
-
present: true,
|
|
320
|
-
};
|
|
321
|
-
if (i === 0 && this.hasDate)
|
|
322
|
-
this.focused = d.epochDay;
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
if (validation.length) {
|
|
326
|
-
this.pendingValue = null;
|
|
327
|
-
this.report(validation);
|
|
328
|
-
}
|
|
329
|
-
else
|
|
330
|
-
this.check();
|
|
331
|
-
}
|
|
332
|
-
writeValue(value) {
|
|
333
|
-
this[WklyPickerInputsPropertyKeys.Value] = value;
|
|
334
|
-
if (this.initialized) {
|
|
335
|
-
this.load(value);
|
|
336
|
-
this.position(this.focused, true);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
registerOnChange(fn) {
|
|
340
|
-
this.onChange = fn;
|
|
341
|
-
}
|
|
342
|
-
registerOnTouched(fn) {
|
|
343
|
-
this.onTouched = fn;
|
|
344
|
-
}
|
|
345
|
-
setDisabledState(disabled) {
|
|
346
|
-
this[WklyPickerInputsPropertyKeys.Disabled] = disabled;
|
|
347
|
-
}
|
|
348
|
-
validate(_control) {
|
|
349
|
-
return this.errors.length ? { wkly: this.errors } : null;
|
|
350
|
-
}
|
|
351
|
-
registerOnValidatorChange(fn) {
|
|
352
|
-
this.validatorChanged = fn;
|
|
353
|
-
}
|
|
354
|
-
touched() {
|
|
355
|
-
Promise.resolve().then(() => this.onTouched());
|
|
356
|
-
}
|
|
357
|
-
report(errors) {
|
|
358
|
-
const changed = JSON.stringify(this.errors) !== JSON.stringify(errors);
|
|
359
|
-
this.errors = errors;
|
|
360
|
-
if (changed) {
|
|
361
|
-
this[WklyPickerOutputsPropertyKeys.ValidationChange].emit(errors);
|
|
362
|
-
this.validatorChanged();
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
check() {
|
|
366
|
-
const result = validateDrafts({
|
|
367
|
-
drafts: this.drafts,
|
|
368
|
-
configErrors: this.configErrors,
|
|
369
|
-
adapter: this.adapter,
|
|
370
|
-
selection: this,
|
|
371
|
-
mode: this[WklyPickerInputsPropertyKeys.Mode],
|
|
372
|
-
isRange: this.isRange,
|
|
373
|
-
hasDate: this.hasDate,
|
|
374
|
-
hasTime: this.hasTime,
|
|
375
|
-
showSeconds: this[WklyPickerInputsPropertyKeys.ShowSeconds],
|
|
376
|
-
required: this[WklyPickerInputsPropertyKeys.Required],
|
|
377
|
-
});
|
|
378
|
-
this.pendingValue = result.pendingValue;
|
|
379
|
-
this.report(result.errors);
|
|
380
|
-
}
|
|
381
|
-
trackDraft(index) {
|
|
382
|
-
// Endpoint controls keep their identity and focus when draft objects swap.
|
|
383
|
-
return index;
|
|
384
|
-
}
|
|
385
|
-
orderDrafts() {
|
|
386
|
-
if (!this.isRange || !this.drafts.every((draft) => draft.present))
|
|
387
|
-
return;
|
|
388
|
-
if (this.drafts.some((draft) => draft.unsupportedEpochDay !== undefined))
|
|
389
|
-
return;
|
|
390
|
-
try {
|
|
391
|
-
const a = this.drafts[0], b = this.drafts[1];
|
|
392
|
-
const key = (d) => this.adapter.dateToEpochDay(d.date) * 86400 +
|
|
393
|
-
(d.hour || 0) * 3600 +
|
|
394
|
-
(d.minute || 0) * 60 +
|
|
395
|
-
(d.second || 0);
|
|
396
|
-
if (key(a) > key(b))
|
|
397
|
-
this.drafts = [b, a];
|
|
398
|
-
}
|
|
399
|
-
catch (_) {
|
|
400
|
-
// Impossible or incomplete dates remain editable until corrected.
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
finish() {
|
|
404
|
-
if (this[WklyPickerInputsPropertyKeys.Disabled])
|
|
405
|
-
return;
|
|
406
|
-
this.orderDrafts();
|
|
407
|
-
if (this.viewMode === "manual" && this.hasDate)
|
|
408
|
-
this.positionOnManualDate();
|
|
409
|
-
this.check();
|
|
410
|
-
if (this.presentation === "inline" && this.canSubmit)
|
|
411
|
-
this.commit();
|
|
412
|
-
}
|
|
413
|
-
commit() {
|
|
414
|
-
if (!this.canSubmit)
|
|
415
|
-
return;
|
|
416
|
-
const next = this.pendingValue;
|
|
417
|
-
if (JSON.stringify(next) !==
|
|
418
|
-
JSON.stringify(this[WklyPickerInputsPropertyKeys.Value])) {
|
|
419
|
-
this[WklyPickerInputsPropertyKeys.Value] = next;
|
|
420
|
-
this.emittedValue = JSON.stringify(next);
|
|
421
|
-
this.onChange(next);
|
|
422
|
-
this[WklyPickerOutputsPropertyKeys.ValueChange].emit(next);
|
|
423
|
-
}
|
|
424
|
-
this.onTouched();
|
|
425
|
-
}
|
|
426
|
-
submit(reason = "submit") {
|
|
427
|
-
this.check();
|
|
428
|
-
if (!this.canSubmit)
|
|
429
|
-
return;
|
|
430
|
-
this.commit();
|
|
431
|
-
if (this.presentation === "transient")
|
|
432
|
-
this[WklyPickerOutputsPropertyKeys.Closed].emit(reason);
|
|
433
|
-
}
|
|
434
|
-
cancel(reason = "close-button") {
|
|
435
|
-
if (this[WklyPickerInputsPropertyKeys.Disabled])
|
|
436
|
-
return;
|
|
437
|
-
this.load(this[WklyPickerInputsPropertyKeys.Value]);
|
|
438
|
-
this.onTouched();
|
|
439
|
-
this[WklyPickerOutputsPropertyKeys.Closed].emit(reason);
|
|
440
|
-
}
|
|
441
|
-
now() {
|
|
442
|
-
if (this[WklyPickerInputsPropertyKeys.Disabled])
|
|
443
|
-
return;
|
|
444
|
-
const n = this.clock.now();
|
|
445
|
-
const day = Math.floor(n.getTime() / 86400000);
|
|
446
|
-
this.drafts = [0, 1].map((index) => (Object.assign(Object.assign({}, this.clockDraft(day, n)), { present: index === 0 || this.isRange })));
|
|
447
|
-
if (this.hasDate &&
|
|
448
|
-
(day < this.firstSupportedDay || day > this.lastSupportedDay)) {
|
|
449
|
-
this.report([error("unsupported-adapter-date", day)]);
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
this.focused = day;
|
|
453
|
-
this.position(day, true);
|
|
454
|
-
this.check();
|
|
455
|
-
this.submit("now");
|
|
456
|
-
}
|
|
457
|
-
clockDraft(day, now) {
|
|
458
|
-
return Object.assign(Object.assign({}, this.blank(day)), { hour: now.getUTCHours(), minute: Math.floor(now.getUTCMinutes() / this[WklyPickerInputsPropertyKeys.MinuteStep]) * this[WklyPickerInputsPropertyKeys.MinuteStep], second: this[WklyPickerInputsPropertyKeys.ShowSeconds]
|
|
459
|
-
? Math.floor(now.getUTCSeconds() / this[WklyPickerInputsPropertyKeys.SecondStep]) * this[WklyPickerInputsPropertyKeys.SecondStep]
|
|
460
|
-
: 0 });
|
|
461
|
-
}
|
|
462
|
-
initializeManualRange() {
|
|
463
|
-
if (!this.isRange ||
|
|
464
|
-
!this.hasDate ||
|
|
465
|
-
this.drafts.every((draft) => draft.present))
|
|
466
|
-
return;
|
|
467
|
-
let seed = this.drafts.find((draft) => draft.present);
|
|
468
|
-
if (!seed) {
|
|
469
|
-
if (this[WklyPickerInputsPropertyKeys.Value] !== null)
|
|
470
|
-
return;
|
|
471
|
-
const now = this.clock.now();
|
|
472
|
-
const initialEpochDay = this[WklyPickerInputsPropertyKeys.InitialEpochDay];
|
|
473
|
-
const day = initialEpochDay === null
|
|
474
|
-
? this.defaults.initialEpochDay === undefined
|
|
475
|
-
? Math.floor(now.getTime() / 86400000)
|
|
476
|
-
: this.defaults.initialEpochDay
|
|
477
|
-
: initialEpochDay;
|
|
478
|
-
seed = Object.assign(Object.assign({}, this.clockDraft(day, now)), { present: true });
|
|
479
|
-
}
|
|
480
|
-
// Complete missing endpoints without replacing selected or invalid drafts.
|
|
481
|
-
const initial = seed;
|
|
482
|
-
this.drafts = this.drafts.map((draft) => draft.present ? draft : Object.assign(Object.assign({}, initial), { date: Object.assign({}, initial.date) }));
|
|
483
|
-
this.finish();
|
|
484
|
-
// Positioning renders before validation; refresh completion controls afterward.
|
|
485
|
-
this.changeDetector.markForCheck();
|
|
486
|
-
}
|
|
487
|
-
toggleView() {
|
|
488
|
-
if (this[WklyPickerInputsPropertyKeys.Disabled] || !this.hasDate)
|
|
489
|
-
return;
|
|
490
|
-
this.viewMode = this.viewMode === "calendar" ? "manual" : "calendar";
|
|
491
|
-
if (this.viewMode === "manual")
|
|
492
|
-
this.initializeManualRange();
|
|
493
|
-
if (this.viewMode === "calendar")
|
|
494
|
-
this.positionOnManualDate();
|
|
495
|
-
this[WklyPickerOutputsPropertyKeys.ViewModeChange].emit(this.viewMode);
|
|
496
|
-
if (this.viewMode === "calendar")
|
|
497
|
-
setTimeout(() => this.resetScroll());
|
|
498
|
-
}
|
|
499
|
-
positionOnManualDate() {
|
|
500
|
-
const draft = this.drafts[this.manualDateEndpoint];
|
|
501
|
-
if (!draft || !draft.present)
|
|
502
|
-
return;
|
|
503
|
-
try {
|
|
504
|
-
// A valid day follows the selection. An impossible day keeps its draft
|
|
505
|
-
// fields but still shows the chosen month in the calendar.
|
|
506
|
-
const target = this.adapter.dateToEpochDay(draft.date);
|
|
507
|
-
this.focused = target;
|
|
508
|
-
this.position(target, true);
|
|
509
|
-
}
|
|
510
|
-
catch (_) {
|
|
511
|
-
try {
|
|
512
|
-
const first = this.adapter.dateToEpochDay(Object.assign(Object.assign({}, draft.date), { day: 1 }));
|
|
513
|
-
this.focused = first;
|
|
514
|
-
this.position(first, true);
|
|
515
|
-
}
|
|
516
|
-
catch (_) { }
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
months(draft) {
|
|
520
|
-
try {
|
|
521
|
-
return this.adapter.getMonths(draft.date.year).map((m) => m.label);
|
|
522
|
-
}
|
|
523
|
-
catch (_) {
|
|
524
|
-
return [];
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
monthCount(draft) {
|
|
528
|
-
return this.months(draft).length || 12;
|
|
529
|
-
}
|
|
530
|
-
get inDays() {
|
|
531
|
-
return draftDayDifference(this.drafts, this.adapter);
|
|
532
|
-
}
|
|
533
|
-
get inDaysLabel() {
|
|
534
|
-
const days = this.inDays;
|
|
535
|
-
return this.t("inDays").replace(/{{\s*days\s*}}/g, days === null
|
|
536
|
-
? this.t("daysUnavailable")
|
|
537
|
-
: new Intl.NumberFormat(this.effectiveLocale, {
|
|
538
|
-
useGrouping: false,
|
|
539
|
-
}).format(days));
|
|
540
|
-
}
|
|
541
|
-
get resultingEndDate() {
|
|
542
|
-
try {
|
|
543
|
-
const draft = this.drafts[1];
|
|
544
|
-
if (draft.unsupportedEpochDay !== undefined ||
|
|
545
|
-
this.adapter.validateDate(draft.date).length)
|
|
546
|
-
return "";
|
|
547
|
-
return [
|
|
548
|
-
this.adapter.formatDay(draft.date),
|
|
549
|
-
this.adapter.formatMonth(draft.date),
|
|
550
|
-
this.adapter.formatYear(draft.date),
|
|
551
|
-
].join(" ");
|
|
552
|
-
}
|
|
553
|
-
catch (_) {
|
|
554
|
-
return "";
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
toggleEndView(view) {
|
|
558
|
-
if (this[WklyPickerInputsPropertyKeys.Disabled])
|
|
559
|
-
return;
|
|
560
|
-
this.endView = view;
|
|
561
|
-
}
|
|
562
|
-
days(value) {
|
|
563
|
-
if (this[WklyPickerInputsPropertyKeys.Disabled])
|
|
564
|
-
return;
|
|
565
|
-
this.manualDateEndpoint = 1;
|
|
566
|
-
setDraftDayDifference(this.drafts, this.adapter, value);
|
|
567
|
-
this.check();
|
|
568
|
-
}
|
|
569
|
-
field(index, field, value) {
|
|
570
|
-
if (this[WklyPickerInputsPropertyKeys.Disabled])
|
|
571
|
-
return;
|
|
572
|
-
const draft = this.drafts[index];
|
|
573
|
-
draft.present = true;
|
|
574
|
-
if (field === "day" || field === "year" || field === "month") {
|
|
575
|
-
this.manualDateEndpoint = index;
|
|
576
|
-
delete draft.unsupportedEpochDay;
|
|
577
|
-
let date = Object.assign(Object.assign({}, draft.date), { [field]: value });
|
|
578
|
-
if (field === "month") {
|
|
579
|
-
let month;
|
|
580
|
-
try {
|
|
581
|
-
month = this.adapter
|
|
582
|
-
.getMonths(date.year)
|
|
583
|
-
.find((m) => m.month === value);
|
|
584
|
-
}
|
|
585
|
-
catch (_) { }
|
|
586
|
-
date = Object.assign(Object.assign({}, date), { monthCode: month ? month.monthCode : "" });
|
|
587
|
-
}
|
|
588
|
-
if (field === "year" && value !== null) {
|
|
589
|
-
try {
|
|
590
|
-
const months = this.adapter.getMonths(value);
|
|
591
|
-
const month = months.find((m) => m.monthCode === date.monthCode);
|
|
592
|
-
if (month)
|
|
593
|
-
date = Object.assign(Object.assign({}, date), { month: month.month });
|
|
594
|
-
}
|
|
595
|
-
catch (_) { }
|
|
596
|
-
}
|
|
597
|
-
draft.date = date;
|
|
598
|
-
}
|
|
599
|
-
else if (field === "hour" && this.effectiveHourCycle === "h12")
|
|
600
|
-
draft.hour =
|
|
601
|
-
value === null
|
|
602
|
-
? null
|
|
603
|
-
: value >= 1 && value <= 12
|
|
604
|
-
? (value % 12) + ((draft.hour || 0) >= 12 ? 12 : 0)
|
|
605
|
-
: 24 + value;
|
|
606
|
-
else
|
|
607
|
-
draft[field] = value;
|
|
608
|
-
this.check();
|
|
609
|
-
}
|
|
610
|
-
displayHour(draft) {
|
|
611
|
-
return draft.hour === null
|
|
612
|
-
? null
|
|
613
|
-
: this.effectiveHourCycle === "h12"
|
|
614
|
-
? draft.hour % 12 || 12
|
|
615
|
-
: draft.hour;
|
|
616
|
-
}
|
|
617
|
-
period(index, period) {
|
|
618
|
-
if (this[WklyPickerInputsPropertyKeys.Disabled])
|
|
619
|
-
return;
|
|
620
|
-
if (period === "24")
|
|
621
|
-
this.effectiveHourCycle = "h24";
|
|
622
|
-
else {
|
|
623
|
-
this.effectiveHourCycle = "h12";
|
|
624
|
-
this.drafts[index].hour =
|
|
625
|
-
((this.drafts[index].hour || 0) % 12) + (period === "pm" ? 12 : 0);
|
|
626
|
-
this.drafts[index].present = true;
|
|
627
|
-
this.finish();
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
selected(day) {
|
|
631
|
-
return this.drafts.some((d) => {
|
|
632
|
-
try {
|
|
633
|
-
return d.present && this.adapter.dateToEpochDay(d.date) === day;
|
|
634
|
-
}
|
|
635
|
-
catch (_) {
|
|
636
|
-
return false;
|
|
637
|
-
}
|
|
638
|
-
});
|
|
639
|
-
}
|
|
640
|
-
inRange(day) {
|
|
641
|
-
if (!this.isRange || !this.drafts.every((d) => d.present))
|
|
642
|
-
return false;
|
|
643
|
-
try {
|
|
644
|
-
const a = this.adapter.dateToEpochDay(this.drafts[0].date), b = this.adapter.dateToEpochDay(this.drafts[1].date);
|
|
645
|
-
return day > Math.min(a, b) && day < Math.max(a, b);
|
|
646
|
-
}
|
|
647
|
-
catch (_) {
|
|
648
|
-
return false;
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
dayDisabled(day) {
|
|
652
|
-
var _a, _b;
|
|
653
|
-
if (day < this.firstSupportedDay || day > this.lastSupportedDay)
|
|
654
|
-
return true;
|
|
655
|
-
try {
|
|
656
|
-
const date = this.adapter.epochDayToDate(day);
|
|
657
|
-
const isDateDisabled = this[WklyPickerInputsPropertyKeys.IsDateDisabled];
|
|
658
|
-
if (isDateDisabled &&
|
|
659
|
-
isDateDisabled(day, {
|
|
660
|
-
mode: this[WklyPickerInputsPropertyKeys.Mode],
|
|
661
|
-
endpoint: this.isRange
|
|
662
|
-
? ((_a = this.drafts[0]) === null || _a === void 0 ? void 0 : _a.present) && !((_b = this.drafts[1]) === null || _b === void 0 ? void 0 : _b.present)
|
|
663
|
-
? "end"
|
|
664
|
-
: "start"
|
|
665
|
-
: "single",
|
|
666
|
-
calendarDate: date,
|
|
667
|
-
}))
|
|
668
|
-
return true;
|
|
669
|
-
const min = this[WklyPickerInputsPropertyKeys.Min];
|
|
670
|
-
const max = this[WklyPickerInputsPropertyKeys.Max];
|
|
671
|
-
if (min && day < decodeIso(min).epochDay)
|
|
672
|
-
return true;
|
|
673
|
-
if (max && day > decodeIso(max).epochDay)
|
|
674
|
-
return true;
|
|
675
|
-
return false;
|
|
676
|
-
}
|
|
677
|
-
catch (_) {
|
|
678
|
-
return true;
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
select(day) {
|
|
682
|
-
if (this[WklyPickerInputsPropertyKeys.Disabled] || this.dayDisabled(day))
|
|
683
|
-
return;
|
|
684
|
-
this.focused = day;
|
|
685
|
-
const index = this.isRange && this.drafts[0].present && !this.drafts[1].present ? 1 : 0;
|
|
686
|
-
if (this.isRange && index === 0)
|
|
687
|
-
this.drafts[1].present = false;
|
|
688
|
-
delete this.drafts[index].unsupportedEpochDay;
|
|
689
|
-
this.drafts[index].date = this.adapter.epochDayToDate(day);
|
|
690
|
-
this.drafts[index].present = true;
|
|
691
|
-
this.orderDrafts();
|
|
692
|
-
this.renderRows();
|
|
693
|
-
this.finish();
|
|
694
|
-
if (this.presentation === "transient" &&
|
|
695
|
-
this[WklyPickerInputsPropertyKeys.Mode] === "date" &&
|
|
696
|
-
this.viewMode === "calendar")
|
|
697
|
-
this.submit("auto-submit");
|
|
698
|
-
}
|
|
699
|
-
key(event, day) {
|
|
700
|
-
let delta = 0;
|
|
701
|
-
if (event.key === "ArrowLeft")
|
|
702
|
-
delta = -1;
|
|
703
|
-
if (event.key === "ArrowRight")
|
|
704
|
-
delta = 1;
|
|
705
|
-
if (event.key === "ArrowUp")
|
|
706
|
-
delta = -7;
|
|
707
|
-
if (event.key === "ArrowDown")
|
|
708
|
-
delta = 7;
|
|
709
|
-
if (event.key === "PageUp")
|
|
710
|
-
delta = -7 * (event.shiftKey ? this.visibleCount : 1);
|
|
711
|
-
if (event.key === "PageDown")
|
|
712
|
-
delta = 7 * (event.shiftKey ? this.visibleCount : 1);
|
|
713
|
-
if (event.key === "Home") {
|
|
714
|
-
event.preventDefault();
|
|
715
|
-
this.scrollToEpochDay(this.today, { focus: true });
|
|
716
|
-
}
|
|
717
|
-
if (delta) {
|
|
718
|
-
event.preventDefault();
|
|
719
|
-
const target = day + delta;
|
|
720
|
-
if (target >= this.firstSupportedDay && target <= this.lastSupportedDay)
|
|
721
|
-
this.scrollToEpochDay(target, { focus: true });
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
position(day, preset = false, options = {}) {
|
|
725
|
-
day = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
|
|
726
|
-
this.anchorWeek = absoluteWeekOf(day, this.effectiveOffset);
|
|
727
|
-
const viewportPreset = this[WklyPickerInputsPropertyKeys.ViewportPreset];
|
|
728
|
-
this.clipMonth = preset && viewportPreset.kind === "full-month";
|
|
729
|
-
if (preset && viewportPreset.kind !== "weeks") {
|
|
730
|
-
const d = this.adapter.epochDayToDate(day);
|
|
731
|
-
this.initialMonth = d.year + "/" + d.monthCode;
|
|
732
|
-
const [start, end] = calendarMonthBounds(this.adapter, day);
|
|
733
|
-
this.firstWeek = absoluteWeekOf(start, this.effectiveOffset);
|
|
734
|
-
this.visibleCount =
|
|
735
|
-
absoluteWeekOf(end, this.effectiveOffset) - this.firstWeek + 1;
|
|
736
|
-
if (viewportPreset.kind === "full-month-and-around" &&
|
|
737
|
-
!this.configErrors.length) {
|
|
738
|
-
const before = viewportPreset.extraWeeksBefore || 0, after = viewportPreset.extraWeeksAfter || 0;
|
|
739
|
-
this.firstWeek -= before;
|
|
740
|
-
this.visibleCount += before + after;
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
else {
|
|
744
|
-
if (viewportPreset.kind === "weeks")
|
|
745
|
-
this.visibleCount = this.configErrors.length
|
|
746
|
-
? 6
|
|
747
|
-
: viewportPreset.visibleWeekCount;
|
|
748
|
-
this.firstWeek =
|
|
749
|
-
this.anchorWeek -
|
|
750
|
-
(options.align === "start"
|
|
751
|
-
? 0
|
|
752
|
-
: options.align === "end"
|
|
753
|
-
? this.visibleCount - 1
|
|
754
|
-
: Math.floor(this.visibleCount / 2));
|
|
755
|
-
}
|
|
756
|
-
this.firstWeek = this.clampFirstWeek(this.firstWeek);
|
|
757
|
-
this.baseWeek = this.firstWeek - 1000;
|
|
758
|
-
this.renderRows();
|
|
759
|
-
// Apply the new runway before writing scrollTop or locating a focus target.
|
|
760
|
-
this.changeDetector.detectChanges();
|
|
761
|
-
this.resetScroll();
|
|
762
|
-
}
|
|
763
|
-
resetScroll() {
|
|
764
|
-
// Round week boundaries to avoid scrollTop truncation under CSS zoom.
|
|
765
|
-
if (this.scroller)
|
|
766
|
-
this.scroller.nativeElement.scrollTop = Math.round(1000 * this.rowHeight);
|
|
767
|
-
}
|
|
768
|
-
scroll(event) {
|
|
769
|
-
const element = event.target;
|
|
770
|
-
this.snapPending = true;
|
|
771
|
-
this.scheduleSnap();
|
|
772
|
-
// Quantize displacement around the reset point, equally in both directions.
|
|
773
|
-
const relativeRows = element.scrollTop / this.rowHeight - 1000;
|
|
774
|
-
const index = 1000 + Math.sign(relativeRows) * Math.round(Math.abs(relativeRows));
|
|
775
|
-
const requestedFirst = this.baseWeek + index;
|
|
776
|
-
const first = this.clampFirstWeek(requestedFirst);
|
|
777
|
-
if (requestedFirst !== first) {
|
|
778
|
-
element.scrollTop = Math.round((first - this.baseWeek) * this.rowHeight);
|
|
779
|
-
}
|
|
780
|
-
if (first === this.firstWeek)
|
|
781
|
-
return;
|
|
782
|
-
this.clipMonth = false;
|
|
783
|
-
this.firstWeek = first;
|
|
784
|
-
this.anchorWeek = first + Math.floor(this.visibleCount / 2);
|
|
785
|
-
if (index < 100 || index > 1900) {
|
|
786
|
-
// Preserve signed displacement from this week; modulo turns fractional
|
|
787
|
-
// rounding just below a boundary into almost a full row after rebasing.
|
|
788
|
-
const offset = element.scrollTop - (first - this.baseWeek) * this.rowHeight;
|
|
789
|
-
this.baseWeek = first - 1000;
|
|
790
|
-
element.scrollTop = Math.round(1000 * this.rowHeight + offset);
|
|
791
|
-
}
|
|
792
|
-
this.renderRows();
|
|
793
|
-
}
|
|
794
|
-
scheduleSnap() {
|
|
795
|
-
if (this.scrollEndTimer)
|
|
796
|
-
clearTimeout(this.scrollEndTimer);
|
|
797
|
-
this.scrollEndTimer = setTimeout(() => this.snapWeek(), 200);
|
|
798
|
-
}
|
|
799
|
-
snapWeek() {
|
|
800
|
-
if (this.scrollEndTimer)
|
|
801
|
-
clearTimeout(this.scrollEndTimer);
|
|
802
|
-
this.scrollEndTimer = undefined;
|
|
803
|
-
if (!this.snapPending || !this.scroller)
|
|
804
|
-
return;
|
|
805
|
-
this.snapPending = false;
|
|
806
|
-
// Align the current virtual week without rebuilding or rebasing its rows.
|
|
807
|
-
const element = this.scroller.nativeElement;
|
|
808
|
-
const target = Math.round((this.firstWeek - this.baseWeek) * this.rowHeight);
|
|
809
|
-
if (element.scrollTop !== target)
|
|
810
|
-
element.scrollTop = target;
|
|
811
|
-
}
|
|
812
|
-
showFirstWeek(week) {
|
|
813
|
-
const first = this.clampFirstWeek(week);
|
|
814
|
-
if (first === this.firstWeek)
|
|
815
|
-
return;
|
|
816
|
-
this.clipMonth = false;
|
|
817
|
-
this.firstWeek = first;
|
|
818
|
-
this.anchorWeek = first + Math.floor(this.visibleCount / 2);
|
|
819
|
-
this.baseWeek = first - 1000;
|
|
820
|
-
this.renderRows();
|
|
821
|
-
this.resetScroll();
|
|
822
|
-
}
|
|
823
|
-
canMoveWeek(delta) {
|
|
824
|
-
return this.clampFirstWeek(this.firstWeek + delta) !== this.firstWeek;
|
|
825
|
-
}
|
|
826
|
-
moveWeek(delta) {
|
|
827
|
-
if (!this[WklyPickerInputsPropertyKeys.Disabled])
|
|
828
|
-
this.showFirstWeek(this.firstWeek + delta);
|
|
829
|
-
}
|
|
830
|
-
renderRows() {
|
|
831
|
-
// Keep the virtual scroll offset here; row data is shared across Angular versions.
|
|
832
|
-
const overscan = Math.max(0, Math.min(50, this[WklyPickerInputsPropertyKeys.OverscanWeeks] || 0));
|
|
833
|
-
const start = this.firstWeek - overscan;
|
|
834
|
-
this.paddingTop = (start - this.baseWeek) * this.rowHeight;
|
|
835
|
-
this.rows = createWeekRows({
|
|
836
|
-
generator: this.generator,
|
|
837
|
-
adapter: this.adapter,
|
|
838
|
-
startWeek: start,
|
|
839
|
-
count: this.visibleCount + 2 * overscan,
|
|
840
|
-
firstVisibleWeek: this.firstWeek,
|
|
841
|
-
firstSupportedDay: this.firstSupportedDay,
|
|
842
|
-
lastSupportedDay: this.lastSupportedDay,
|
|
843
|
-
clipMonth: this.clipMonth,
|
|
844
|
-
initialMonth: this.initialMonth,
|
|
845
|
-
weekLabelMode: this[WklyPickerInputsPropertyKeys.WeekLabelMode],
|
|
846
|
-
weekLabelFormatter: this[WklyPickerInputsPropertyKeys.WeekLabelFormatter] || null,
|
|
847
|
-
isDayDisabled: (day) => this.dayDisabled(day),
|
|
848
|
-
});
|
|
849
|
-
this[WklyPickerOutputsPropertyKeys.ViewportChange].emit({
|
|
850
|
-
firstVisibleAbsoluteWeek: this.firstWeek,
|
|
851
|
-
lastVisibleAbsoluteWeek: this.firstWeek + this.visibleCount - 1,
|
|
852
|
-
anchorAbsoluteWeek: this.anchorWeek,
|
|
853
|
-
});
|
|
854
|
-
}
|
|
855
|
-
// Retain day DOM nodes and keyboard focus when row metadata is regenerated.
|
|
856
|
-
trackCell(_i, cell) {
|
|
857
|
-
return cell.epochDay;
|
|
858
|
-
}
|
|
859
|
-
trackRow(_i, row) {
|
|
860
|
-
return row.week.absoluteWeek;
|
|
861
|
-
}
|
|
862
|
-
scrollToEpochDay(day, options = {}) {
|
|
863
|
-
integer(day);
|
|
864
|
-
this.adapter.epochDayToDate(day);
|
|
865
|
-
day = Math.max(this.firstSupportedDay, Math.min(this.lastSupportedDay, day));
|
|
866
|
-
// position renders synchronously; publish the tab stop before that render.
|
|
867
|
-
if (options.focus)
|
|
868
|
-
this.focused = day;
|
|
869
|
-
this.position(day, false, options);
|
|
870
|
-
if (options.select)
|
|
871
|
-
this.select(day);
|
|
872
|
-
if (options.focus)
|
|
873
|
-
this.focusDay();
|
|
874
|
-
}
|
|
875
|
-
scrollToAbsoluteWeek(week, options = {}) {
|
|
876
|
-
// A boundary week can start before the adapter's first supported day.
|
|
877
|
-
const first = firstEpochDayOf(week, this.effectiveOffset);
|
|
878
|
-
this.scrollToEpochDay(week === this.firstSupportedWeek
|
|
879
|
-
? Math.max(first, this.firstSupportedDay)
|
|
880
|
-
: first, options);
|
|
881
|
-
}
|
|
882
|
-
scrollToCalendarDate(date, options = {}) {
|
|
883
|
-
this.scrollToEpochDay(this.adapter.dateToEpochDay(date), options);
|
|
884
|
-
}
|
|
885
|
-
scrollToValue(value, options = {}) {
|
|
886
|
-
this.scrollToEpochDay(decodeIso(value).epochDay, options);
|
|
887
|
-
}
|
|
888
|
-
focusDay() {
|
|
889
|
-
if (!this.browser)
|
|
890
|
-
return;
|
|
891
|
-
setTimeout(() => {
|
|
892
|
-
var _a;
|
|
893
|
-
if (this.destroyed)
|
|
894
|
-
return;
|
|
895
|
-
this.changeDetector.detectChanges();
|
|
896
|
-
const day = this.host.nativeElement.querySelector('[data-day="' + this.focused + '"]');
|
|
897
|
-
const fallback = this.host.nativeElement.querySelector("button:not(:disabled),input:not(:disabled)");
|
|
898
|
-
(_a = (day || fallback)) === null || _a === void 0 ? void 0 : _a.focus({ preventScroll: true });
|
|
899
|
-
});
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
WklyDateTimePickerComponent.decorators = [
|
|
903
|
-
{ type: Component, args: [{
|
|
904
|
-
selector: "wkly-datetime-picker",
|
|
905
|
-
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",
|
|
906
|
-
providers: [
|
|
907
|
-
{
|
|
908
|
-
provide: NG_VALUE_ACCESSOR,
|
|
909
|
-
useExisting: forwardRef(() => WklyDateTimePickerComponent),
|
|
910
|
-
multi: true,
|
|
911
|
-
},
|
|
912
|
-
{
|
|
913
|
-
provide: NG_VALIDATORS,
|
|
914
|
-
useExisting: forwardRef(() => WklyDateTimePickerComponent),
|
|
915
|
-
multi: true,
|
|
916
|
-
},
|
|
917
|
-
],
|
|
918
|
-
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}@media (hover: hover) and (pointer: fine){button:hover:not(:disabled):not([aria-disabled=\"true\"]):not(.selected){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;grid-gap:3px;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;grid-gap:7px;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);grid-gap:0;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;grid-gap:8px;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;grid-gap:2px;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}@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"]
|
|
919
|
-
},] }
|
|
920
|
-
];
|
|
921
|
-
WklyDateTimePickerComponent.ctorParameters = () => [
|
|
922
|
-
{ type: String, decorators: [{ type: Inject, args: [LOCALE_ID,] }] },
|
|
923
|
-
{ type: undefined, decorators: [{ type: Inject, args: [WKLY_CONFIG,] }] },
|
|
924
|
-
{ type: undefined, decorators: [{ type: Inject, args: [WKLY_CLOCK,] }] },
|
|
925
|
-
{ type: undefined, decorators: [{ type: Inject, args: [WKLY_LOCALIZATION,] }] },
|
|
926
|
-
{ type: undefined, decorators: [{ type: Inject, args: [WKLY_TRANSLATIONS,] }] },
|
|
927
|
-
{ type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
|
|
928
|
-
{ type: ElementRef },
|
|
929
|
-
{ type: ChangeDetectorRef }
|
|
930
|
-
];
|
|
931
|
-
WklyDateTimePickerComponent.propDecorators = {
|
|
932
|
-
scroller: [{ type: ViewChild, args: ["scroller",] }]
|
|
933
|
-
};
|
|
934
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3drbHktZGF0ZXRpbWUtcGlja2VyLjEyL3NyYy9waWNrZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsTUFBTSxFQUNOLFNBQVMsRUFJVCxXQUFXLEVBQ1gsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdFLE9BQU8sRUFHTCxhQUFhLEVBQ2IsaUJBQWlCLEdBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLE9BQU8sR0FHUixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBSWpCLDRCQUE0QixHQUc3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsY0FBYyxFQUNkLGNBQWMsR0FHZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxhQUFhLEVBQ2IsVUFBVSxFQUNWLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBS2pCLGdCQUFnQixFQUNoQiw0QkFBNEIsRUFDNUIsNkJBQTZCLEdBRzlCLE1BQU0sVUFBVSxDQUFDO0FBdUJsQixNQUFNLE9BQU8sMkJBQ1gsU0FBUSxnQkFBZ0I7SUFzRHhCLFlBQzZCLGFBQXFCLEVBQ25CLFFBQTJCLEVBQzVCLEtBQWdCLEVBQ1QsT0FBb0IsRUFDcEIsbUJBQXFDLEVBQ25ELFFBQWdCLEVB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LEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBWTtRQUNqQixNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBcUIsQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsNEVBQTRFO1FBQzVFLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDL0QsTUFBTSxLQUFLLEdBQ1QsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDdEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsRCxJQUFJLGNBQWMsS0FBSyxLQUFLLEVBQUU7WUFDNUIsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDMUU7UUFDRCxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxLQUFLLEdBQUcsSUFBSSxFQUFFO1lBQy9C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QUEyQixDQUFDO3dCQUMxRCxLQUFLLEVBQUUsSUFBSTtxQkFDWjtvQkFDRDt3QkFDRSxPQUFPLEVBQUUsYUFBYTt3QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQzt3QkFDMUQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7O2FBQ0Y7Ozt5Q0F5REksTUFBTSxTQUFDLFNBQVM7NENBQ2hCLE1BQU0sU0FBQyxXQUFXOzRDQUNsQixNQUFNLFNBQUMsVUFBVTs0Q0FDakIsTUFBTSxTQUFDLGlCQUFpQjs0Q0FDeEIsTUFBTSxTQUFDLGlCQUFpQjtZQUNNLE1BQU0sdUJBQXBDLE1BQU0sU0FBQyxXQUFXO1lBcEpyQixVQUFVO1lBRlYsaUJBQWlCOzs7dUJBbUdoQixTQUFTLFNBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgV2tseUhvdXJDeWNsZSB9IGZyb20gXCJAd2tseS9hZGFwdGVyc1wiO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBMT0NBTEVfSUQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFBMQVRGT1JNX0lELFxuICBWaWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBnZXRMb2NhbGVGaXJzdERheU9mV2VlaywgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxufSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIGFic29sdXRlV2Vla09mLFxuICBjcmVhdGVXZWVrR2VuZXJhdG9yLFxuICBmaXJzdEVwb2NoRGF5T2YsXG4gIGludGVnZXIsXG4gIFdrbHlXZWVrR2VuZXJhdG9yLFxuICBXa2x5V2Vla09mZnNldCxcbn0gZnJvbSBcIkB3a2x5L2NvcmVcIjtcbmltcG9ydCB7XG4gIGRlY29kZUlzbyxcbiAgZXJyb3IsXG4gIHJlc29sdmVXZWVrT2Zmc2V0LFxuICB2YWxpZGF0ZVNlbGVjdGlvbixcbiAgV2tseUNhbGVuZGFyQWRhcHRlcixcbiAgV2tseUNhbGVuZGFyRGF0ZSxcbiAgV2tseURhdGVUaW1lLFxuICBXa2x5R3JlZ29yaWFuQ2FsZW5kYXJBZGFwdGVyLFxuICBXa2x5UGlja2VyVmFsdWUsXG4gIFdrbHlWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAd2tseS9hZGFwdGVyc1wiO1xuaW1wb3J0IHtcbiAgZHJhZnREYXlEaWZmZXJlbmNlLFxuICBzZXREcmFmdERheURpZmZlcmVuY2UsXG4gIGNhbGVuZGFyTW9udGhCb3VuZHMsXG4gIHJlc29sdmVXa2x5VHJhbnNsYXRpb24sXG4gIGNyZWF0ZVdlZWtSb3dzLFxuICB2YWxpZGF0ZURyYWZ0cyxcbiAgV2tseURyYWZ0IGFzIERyYWZ0LFxuICBXa2x5V2Vla1JvdyBhcyBSb3csXG59IGZyb20gXCJAd2tseS9wcmVzZW50YXRpb25cIjtcbmltcG9ydCB7XG4gIGNvZXJjZUJvb2xlYW4sXG4gIFdLTFlfQ0xPQ0ssXG4gIFdLTFlfQ09ORklHLFxuICBXS0xZX0xPQ0FMSVpBVElPTixcbiAgV0tMWV9UUkFOU0xBVElPTlMsXG4gIFdrbHlDbG9jayxcbiAgV2tseUNsb3NlUmVhc29uLFxuICBXa2x5Q29uZmlndXJhdGlvbixcbiAgV2tseUp1bXBPcHRpb25zLFxuICBXa2x5UGlja2VySW5wdXRzLFxuICBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLFxuICBXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cyxcbiAgV2tseVN0cmluZ3MsXG4gIFdrbHlUcmFuc2xhdGlvbnMsXG59IGZyb20gXCIuL2NvbmZpZ1wiO1xuZGVjbGFyZSBjbGFzcyBSZXNpemVPYnNlcnZlciB7XG4gIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiAoKSA9PiB2b2lkKTtcbiAgb2JzZXJ2ZShlbGVtZW50OiBFbGVtZW50KTogdm9pZDtcbiAgZGlzY29ubmVjdCgpOiB2b2lkO1xufVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIndrbHktZGF0ZXRpbWUtcGlja2VyXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vcGlja2VyLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi4vLi4vd2tseS1kYXRldGltZS1waWNrZXIvc3JjL3BpY2tlci5jb21wb25lbnQuY3NzXCJdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFdrbHlEYXRlVGltZVBpY2tlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBXa2x5RGF0ZVRpbWVQaWNrZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgV2tseURhdGVUaW1lUGlja2VyQ29tcG9uZW50XG4gIGV4dGVuZHMgV2tseVBpY2tlcklucHV0c1xuICBpbXBsZW1lbnRzXG4gICAgT25Jbml0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIE9uRGVzdHJveSxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBWYWxpZGF0b3JcbntcbiAgQFZpZXdDaGlsZChcInNjcm9sbGVyXCIpIHNjcm9sbGVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHByZXNlbnRhdGlvbjogXCJpbmxpbmVcIiB8IFwidHJhbnNpZW50XCIgPSBcImlubGluZVwiO1xuICB2aWV3TW9kZTogXCJjYWxlbmRhclwiIHwgXCJtYW51YWxcIiA9IFwiY2FsZW5kYXJcIjtcbiAgZW5kVmlldzogXCJkYXRlXCIgfCBcImRheXNcIiA9IFwiZGF0ZVwiO1xuICBhZGFwdGVyITogV2tseUNhbGVuZGFyQWRhcHRlcjtcbiAgZWZmZWN0aXZlTG9jYWxlID0gXCJlbi1VU1wiO1xuICBlZmZlY3RpdmVPZmZzZXQ6IFdrbHlXZWVrT2Zmc2V0ID0gMDtcbiAgZWZmZWN0aXZlSG91ckN5Y2xlOiBcImgxMlwiIHwgXCJoMjRcIiA9IFwiaDI0XCI7XG4gIHByaXZhdGUgY29uZmlndXJlZEhvdXJDeWNsZT86IFdrbHlIb3VyQ3ljbGU7XG4gIGRpcmVjdGlvbiA9IFwibHRyXCI7XG4gIHJvd3M6IFJvd1tdID0gW107XG4gIHdlZWtkYXlzOiBzdHJpbmdbXSA9IFtdO1xuICBkcmFmdHM6IERyYWZ0W10gPSBbXTtcbiAgZXJyb3JzOiByZWFkb25seSBXa2x5VmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgdG9kYXkgPSAwO1xuICBmb2N1c2VkID0gMDtcbiAgYW5jaG9yV2VlayA9IDA7XG4gIGZpcnN0V2VlayA9IDA7XG4gIHZpc2libGVDb3VudCA9IDY7XG4gIHJvd0hlaWdodCA9IDc2O1xuICBzY3JvbGxIZWlnaHQgPSAxNTIwNzY7XG4gIHBhZGRpbmdUb3AgPSAwO1xuICBpbml0aWFsaXplZCA9IGZhbHNlO1xuICBjb21wYWN0ID0gZmFsc2U7XG4gIHJlYWRvbmx5IFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMgPSBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzO1xuICBwcml2YXRlIGJhc2VXZWVrID0gMDtcbiAgcHJpdmF0ZSBmaXJzdFN1cHBvcnRlZERheSA9IDA7XG4gIHByaXZhdGUgbGFzdFN1cHBvcnRlZERheSA9IDA7XG4gIHByaXZhdGUgZmlyc3RTdXBwb3J0ZWRXZWVrID0gMDtcbiAgcHJpdmF0ZSBsYXN0U3VwcG9ydGVkV2VlayA9IDA7XG4gIHByaXZhdGUgZ2VuZXJhdG9yITogV2tseVdlZWtHZW5lcmF0b3I7XG4gIHByaXZhdGUgaW5pdGlhbE1vbnRoID0gXCJcIjtcbiAgcHJpdmF0ZSBjbGlwTW9udGggPSBmYWxzZTtcbiAgcHJpdmF0ZSBicm93c2VyID0gZmFsc2U7XG4gIHByaXZhdGUgb2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY3JvbGxFbmRUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBwcml2YXRlIHNuYXBQZW5kaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogV2tseVBpY2tlclZhbHVlKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIHByaXZhdGUgdmFsaWRhdG9yQ2hhbmdlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIGNvbmZpZ0Vycm9yczogV2tseVZhbGlkYXRpb25FcnJvcltdID0gW107XG4gIHByaXZhdGUgcGVuZGluZ1ZhbHVlOiBXa2x5UGlja2VyVmFsdWUgPSBudWxsO1xuICBwcml2YXRlIGVtaXR0ZWRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbWFudWFsRGF0ZUVuZHBvaW50ID0gMDtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgZGVmYXVsdExvY2FsZTogc3RyaW5nLFxuICAgIEBJbmplY3QoV0tMWV9DT05GSUcpIHByaXZhdGUgZGVmYXVsdHM6IFdrbHlDb25maWd1cmF0aW9uLFxuICAgIEBJbmplY3QoV0tMWV9DTE9DSykgcHJpdmF0ZSBjbG9jazogV2tseUNsb2NrLFxuICAgIEBJbmplY3QoV0tMWV9MT0NBTElaQVRJT04pIHByaXZhdGUgc3RyaW5nczogV2tseVN0cmluZ3MsXG4gICAgQEluamVjdChXS0xZX1RSQU5TTEFUSU9OUykgcHJpdmF0ZSBkZWZhdWx0VHJhbnNsYXRpb25zOiBXa2x5VHJhbnNsYXRpb25zLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtOiBPYmplY3QsXG4gICAgcHJpdmF0ZSBob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybSk7XG4gIH1cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlcykubGVuZ3RoID09PSAxICYmXG4gICAgICAgIGNoYW5nZXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WYWx1ZV0gJiZcbiAgICAgICAgdGhpcy5lbWl0dGVkVmFsdWUgPT09XG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLmVtaXR0ZWRWYWx1ZSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZvY3VzID0gdGhpcy5mb2N1c2VkO1xuICAgICAgdGhpcy5jb25maWd1cmUoKTtcbiAgICAgIGlmIChcbiAgICAgICAgY2hhbmdlc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSB8fFxuICAgICAgICBjaGFuZ2VzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0gfHxcbiAgICAgICAgY2hhbmdlc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkNhbGVuZGFyQWRhcHRlcl1cbiAgICAgICkge1xuICAgICAgICB0aGlzLmxvYWQodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSk7XG4gICAgICAgIHRoaXMucG9zaXRpb24odGhpcy5mb2N1c2VkLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2hlY2soKTtcbiAgICAgICAgaWYgKGNoYW5nZXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WaWV3cG9ydFByZXNldF0pXG4gICAgICAgICAgdGhpcy5wb3NpdGlvbihmb2N1cywgdHJ1ZSk7XG4gICAgICAgIGVsc2UgdGhpcy5zY3JvbGxUb0Vwb2NoRGF5KGZvY3VzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuY29uZmlndXJlKCk7XG4gICAgY29uc3QgaW5pdGlhbEVwb2NoRGF5ID0gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkluaXRpYWxFcG9jaERheV07XG4gICAgdGhpcy50b2RheSA9IHRoaXMuYnJvd3NlclxuICAgICAgPyBNYXRoLmZsb29yKHRoaXMuY2xvY2subm93KCkuZ2V0VGltZSgpIC8gODY0MDAwMDApXG4gICAgICA6IGluaXRpYWxFcG9jaERheSA9PT0gbnVsbFxuICAgICAgICA/IDBcbiAgICAgICAgOiBpbml0aWFsRXBvY2hEYXk7XG4gICAgdGhpcy5mb2N1c2VkID1cbiAgICAgIGluaXRpYWxFcG9jaERheSA9PT0gbnVsbFxuICAgICAgICA/IHRoaXMuZGVmYXVsdHMuaW5pdGlhbEVwb2NoRGF5ID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHRoaXMudG9kYXlcbiAgICAgICAgICA6IHRoaXMuZGVmYXVsdHMuaW5pdGlhbEVwb2NoRGF5XG4gICAgICAgIDogaW5pdGlhbEVwb2NoRGF5O1xuICAgIHRoaXMubG9hZCh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdKTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnBvc2l0aW9uKHRoaXMuZm9jdXNlZCwgdHJ1ZSk7XG4gIH1cbiAgY29uZmlndXJlKCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnRXJyb3JzID0gW107XG4gICAgW1xuICAgICAgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TaG93U2Vjb25kcyxcbiAgICAgIFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuQWxsb3dSYW5nZUFjcm9zc0Rpc2FibGVkLFxuICAgICAgV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5SZXF1aXJlZCxcbiAgICAgIFdrbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWQsXG4gICAgICBXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkNsb3NlT25CYWNrZHJvcCxcbiAgICBdLmZvckVhY2goXG4gICAgICAoa2V5KSA9PiAoKHRoaXMgYXMgYW55KVtrZXldID0gY29lcmNlQm9vbGVhbigodGhpcyBhcyBhbnkpW2tleV0pKSxcbiAgICApO1xuICAgIHRoaXMuZWZmZWN0aXZlTG9jYWxlID1cbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Mb2NhbGVdIHx8XG4gICAgICB0aGlzLmRlZmF1bHRzLmxvY2FsZSB8fFxuICAgICAgdGhpcy5kZWZhdWx0TG9jYWxlO1xuICAgIHRoaXMuZGlyZWN0aW9uID0gL14oYXJ8aGV8ZmF8dXIpKC18JCkvLnRlc3QodGhpcy5lZmZlY3RpdmVMb2NhbGUpXG4gICAgICA/IFwicnRsXCJcbiAgICAgIDogXCJsdHJcIjtcbiAgICB0aGlzLmFkYXB0ZXIgPVxuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkNhbGVuZGFyQWRhcHRlcl0gfHxcbiAgICAgIG5ldyBXa2x5R3JlZ29yaWFuQ2FsZW5kYXJBZGFwdGVyKHRoaXMuZWZmZWN0aXZlTG9jYWxlKTtcbiAgICB0cnkge1xuICAgICAgbGV0IGZpcnN0RGF5OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBmaXJzdERheSA9IGdldExvY2FsZUZpcnN0RGF5T2ZXZWVrKHRoaXMuZWZmZWN0aXZlTG9jYWxlKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICB0aGlzLmVmZmVjdGl2ZU9mZnNldCA9IHJlc29sdmVXZWVrT2Zmc2V0KFxuICAgICAgICB0aGlzLmVmZmVjdGl2ZUxvY2FsZSxcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtPZmZzZXRdLFxuICAgICAgICB0aGlzLmRlZmF1bHRzLndlZWtPZmZzZXQsXG4gICAgICAgIGZpcnN0RGF5LFxuICAgICAgKTtcbiAgICAgIGludGVnZXIodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtDYWNoZVNpemVdKTtcbiAgICAgIGludGVnZXIodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk92ZXJzY2FuV2Vla3NdKTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLldlZWtDYWNoZVNpemVdIDwgMCB8fFxuICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuT3ZlcnNjYW5XZWVrc10gPCAwIHx8XG4gICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5PdmVyc2NhbldlZWtzXSA+IDUwXG4gICAgICApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCk7XG4gICAgICBpZiAoXG4gICAgICAgICFbXG4gICAgICAgICAgXCJkYXRldGltZVwiLFxuICAgICAgICAgIFwiZGF0ZVwiLFxuICAgICAgICAgIFwidGltZVwiLFxuICAgICAgICAgIFwiZGF0ZXRpbWUtcmFuZ2VcIixcbiAgICAgICAgICBcImRhdGUtcmFuZ2VcIixcbiAgICAgICAgICBcInRpbWUtcmFuZ2VcIixcbiAgICAgICAgXS5pbmNsdWRlcyh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0pXG4gICAgICApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCk7XG4gICAgICBjb25zdCBwcmVzZXQgPSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmlld3BvcnRQcmVzZXRdO1xuICAgICAgaWYgKHByZXNldC5raW5kID09PSBcIndlZWtzXCIpIHtcbiAgICAgICAgaW50ZWdlcihwcmVzZXQudmlzaWJsZVdlZWtDb3VudCk7XG4gICAgICAgIGlmIChwcmVzZXQudmlzaWJsZVdlZWtDb3VudCA8IDEgfHwgcHJlc2V0LnZpc2libGVXZWVrQ291bnQgPiA1MilcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigpO1xuICAgICAgfVxuICAgICAgaWYgKHByZXNldC5raW5kID09PSBcImZ1bGwtbW9udGgtYW5kLWFyb3VuZFwiKVxuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgW1xuICAgICAgICAgIHByZXNldC5leHRyYVdlZWtzQmVmb3JlIHx8IDAsXG4gICAgICAgICAgcHJlc2V0LmV4dHJhV2Vla3NBZnRlciB8fCAwLFxuICAgICAgICBdKSB7XG4gICAgICAgICAgaW50ZWdlcihuKTtcbiAgICAgICAgICBpZiAobiA8IDAgfHwgbiA+IDUyKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB0aGlzLmdlbmVyYXRvciA9IGNyZWF0ZVdlZWtHZW5lcmF0b3Ioe1xuICAgICAgICB3ZWVrT2Zmc2V0OiB0aGlzLmVmZmVjdGl2ZU9mZnNldCxcbiAgICAgICAgY2FjaGVTaXplOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0NhY2hlU2l6ZV0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0aGlzLmNvbmZpZ0Vycm9ycy5wdXNoKFxuICAgICAgICBlcnJvcihcbiAgICAgICAgICBcImNvbmZpZ3VyYXRpb24tZXJyb3JcIixcbiAgICAgICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla09mZnNldF0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgdGhpcy5nZW5lcmF0b3IgPSBjcmVhdGVXZWVrR2VuZXJhdG9yKCk7XG4gICAgICB0aGlzLmVmZmVjdGl2ZU9mZnNldCA9IDA7XG4gICAgfVxuICAgIHRoaXMuc2V0U3VwcG9ydGVkU2Nyb2xsUmFuZ2UoKTtcbiAgICBjb25zdCBob3VyQ3ljbGUgPSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuSG91ckN5Y2xlXTtcbiAgICAvLyBIb3N0IHZhbHVlL2NvbmZpZ3VyYXRpb24gZmVlZGJhY2sgbXVzdCByZXRhaW4gdGhlIHVzZXIncyBzd2l0Y2hhYmxlIGZvcm1hdC5cbiAgICBpZiAoaG91ckN5Y2xlICE9PSBcInN3aXRjaGFibGVcIiB8fCB0aGlzLmNvbmZpZ3VyZWRIb3VyQ3ljbGUgIT09IGhvdXJDeWNsZSkge1xuICAgICAgdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPVxuICAgICAgICBob3VyQ3ljbGUgPT09IFwiaDEyXCJcbiAgICAgICAgICA/IFwiaDEyXCJcbiAgICAgICAgICA6IGhvdXJDeWNsZSA9PT0gXCJsb2NhbGVcIlxuICAgICAgICAgICAgPyBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmVmZmVjdGl2ZUxvY2FsZSwge1xuICAgICAgICAgICAgICAgIGhvdXI6IFwibnVtZXJpY1wiLFxuICAgICAgICAgICAgICAgIHRpbWVab25lOiBcIlVUQ1wiLFxuICAgICAgICAgICAgICB9KS5yZXNvbHZlZE9wdGlvbnMoKS5ob3VyMTJcbiAgICAgICAgICAgICAgPyBcImgxMlwiXG4gICAgICAgICAgICAgIDogXCJoMjRcIlxuICAgICAgICAgICAgOiBcImgyNFwiO1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZ3VyZWRIb3VyQ3ljbGUgPSBob3VyQ3ljbGU7XG4gICAgdGhpcy53ZWVrZGF5cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDcgfSwgKF8sIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIuZm9ybWF0V2Vla2RheSh0aGlzLmVmZmVjdGl2ZU9mZnNldCArIGksIFwic2hvcnRcIiksXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIHNldFN1cHBvcnRlZFNjcm9sbFJhbmdlKCk6IHZvaWQge1xuICAgIGxldCBbZmlyc3QsIGxhc3RdID0gdGhpcy5hZGFwdGVyLnN1cHBvcnRlZEVwb2NoRGF5UmFuZ2U7XG4gICAgY29uc3QgW2ZpcnN0WWVhciwgbGFzdFllYXJdID0gdGhpcy5hZGFwdGVyLnN1cHBvcnRlZFllYXJSYW5nZTtcbiAgICBjb25zdCB5ZWFyT2YgPSAoZGF5OiBudW1iZXIpID0+IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkYXkpLnllYXI7XG4gICAgaWYgKHllYXJPZihmaXJzdCkgPCBmaXJzdFllYXIpIHtcbiAgICAgIGxldCBsb3cgPSBmaXJzdCxcbiAgICAgICAgaGlnaCA9IGxhc3Q7XG4gICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgICBpZiAoeWVhck9mKG1pZCkgPCBmaXJzdFllYXIpIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIGVsc2UgaGlnaCA9IG1pZDtcbiAgICAgIH1cbiAgICAgIGZpcnN0ID0gbG93O1xuICAgIH1cbiAgICBpZiAoeWVhck9mKGxhc3QpID4gbGFzdFllYXIpIHtcbiAgICAgIGxldCBsb3cgPSBmaXJzdCxcbiAgICAgICAgaGlnaCA9IGxhc3Q7XG4gICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWQgPSBNYXRoLmNlaWwoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICAgIGlmICh5ZWFyT2YobWlkKSA+IGxhc3RZZWFyKSBoaWdoID0gbWlkIC0gMTtcbiAgICAgICAgZWxzZSBsb3cgPSBtaWQ7XG4gICAgICB9XG4gICAgICBsYXN0ID0gbG93O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBmaXJzdCA+IGxhc3QgfHxcbiAgICAgIHllYXJPZihmaXJzdCkgPCBmaXJzdFllYXIgfHxcbiAgICAgIHllYXJPZihmaXJzdCkgPiBsYXN0WWVhciB8fFxuICAgICAgeWVhck9mKGxhc3QpIDwgZmlyc3RZZWFyIHx8XG4gICAgICB5ZWFyT2YobGFzdCkgPiBsYXN0WWVhclxuICAgIClcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiTm8gc3VwcG9ydGVkIGRheXMgd2l0aGluIHRoZSBjYWxlbmRhciB5ZWFyIHJhbmdlXCIpO1xuICAgIHRoaXMuZmlyc3RTdXBwb3J0ZWREYXkgPSBmaXJzdDtcbiAgICB0aGlzLmxhc3RTdXBwb3J0ZWREYXkgPSBsYXN0O1xuICAgIHRoaXMuZmlyc3RTdXBwb3J0ZWRXZWVrID0gYWJzb2x1dGVXZWVrT2YoZmlyc3QsIHRoaXMuZWZmZWN0aXZlT2Zmc2V0KTtcbiAgICB0aGlzLmxhc3RTdXBwb3J0ZWRXZWVrID0gYWJzb2x1dGVXZWVrT2YobGFzdCwgdGhpcy5lZmZlY3RpdmVPZmZzZXQpO1xuICB9XG4gIHByaXZhdGUgY2xhbXBGaXJzdFdlZWsod2VlazogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBLZWVwIHN1cHBvcnRlZCB3ZWVrcyBpbnNpZGUgdGhlIHZpZXdwb3J0OyByZW5kZXJSb3dzIGFkZHMgdGhlIGJ1ZmZlciByb3dzLlxuICAgIGNvbnN0IGxhc3QgPSBNYXRoLm1heChcbiAgICAgIHRoaXMuZmlyc3RTdXBwb3J0ZWRXZWVrLFxuICAgICAgdGhpcy5sYXN0U3VwcG9ydGVkV2VlayAtIHRoaXMudmlzaWJsZUNvdW50ICsgMSxcbiAgICApO1xuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmZpcnN0U3VwcG9ydGVkV2VlaywgTWF0aC5taW4obGFzdCwgd2VlaykpO1xuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0U2Nyb2xsKCk7XG4gICAgaWYgKHRoaXMuYnJvd3NlciAmJiB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBhY3QgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCA8IDMzODtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBcIi53ZWVrLXJvd1wiLFxuICAgICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvLyBDU1MgaGVpZ2h0cyBhbmQgc2Nyb2xsVG9wIHVzZSBsYXlvdXQgcGl4ZWxzOyBjbGllbnQgcmVjdGFuZ2xlcyBpbmNsdWRlIHpvb20uXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHJvdyA/IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShyb3cpLmhlaWdodCkgOiAwO1xuICAgICAgICBpZiAoaGVpZ2h0ICYmIGhlaWdodCAhPT0gdGhpcy5yb3dIZWlnaHQpIHtcbiAgICAgICAgICB0aGlzLnJvd0hlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMucm93SGVpZ2h0ICogMjAwMTtcbiAgICAgICAgICB0aGlzLnJlbmRlclJvd3MoKTtcbiAgICAgICAgICB0aGlzLnJlc2V0U2Nyb2xsKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLm9ic2VydmVyKSB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICBpZiAodGhpcy5zY3JvbGxFbmRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsRW5kVGltZXIpO1xuICAgIGlmICh0aGlzLmdlbmVyYXRvcikgdGhpcy5nZW5lcmF0b3IuY2xlYXJDYWNoZSgpO1xuICB9XG4gIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlV2tseVRyYW5zbGF0aW9uKFxuICAgICAga2V5LFxuICAgICAgdGhpcy5lZmZlY3RpdmVMb2NhbGUsXG4gICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVHJhbnNsYXRpb25zXSB8fFxuICAgICAgICB0aGlzLmRlZmF1bHRUcmFuc2xhdGlvbnMsXG4gICAgICB0aGlzLnN0cmluZ3MsXG4gICAgKTtcbiAgfVxuICBnZXQgaXNSYW5nZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdLmVuZHNXaXRoKFwiLXJhbmdlXCIpO1xuICB9XG4gIGdldCBoYXNEYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdLnN0YXJ0c1dpdGgoXCJ0aW1lXCIpO1xuICB9XG4gIGdldCBoYXNUaW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0gIT09IFwiZGF0ZVwiICYmXG4gICAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0gIT09IFwiZGF0ZS1yYW5nZVwiXG4gICAgKTtcbiAgfVxuICBnZXQgc3VibWl0VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcmVzZW50YXRpb24gPT09IFwidHJhbnNpZW50XCIgJiZcbiAgICAgICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTW9kZV0gIT09IFwiZGF0ZVwiIHx8XG4gICAgICAgIHRoaXMudmlld01vZGUgPT09IFwibWFudWFsXCIpXG4gICAgKTtcbiAgfVxuICBnZXQgdGl0bGUoKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZCA9IHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShcbiAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgdGhpcy5maXJzdFN1cHBvcnRlZERheSxcbiAgICAgICAgICBNYXRoLm1pbihcbiAgICAgICAgICAgIHRoaXMubGFzdFN1cHBvcnRlZERheSxcbiAgICAgICAgICAgIGZpcnN0RXBvY2hEYXlPZih0aGlzLmFuY2hvcldlZWssIHRoaXMuZWZmZWN0aXZlT2Zmc2V0KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZm9ybWF0TW9udGgoZCkgKyBcIiBcIiArIHRoaXMuYWRhcHRlci5mb3JtYXRZZWFyKGQpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgfVxuICBnZXQgY2FuU3VibWl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAhdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSAmJlxuICAgICAgIXRoaXMuZXJyb3JzLmxlbmd0aCAmJlxuICAgICAgdGhpcy5wZW5kaW5nVmFsdWUgIT09IG51bGxcbiAgICApO1xuICB9XG4gIHByaXZhdGUgYmxhbmsoZGF5OiBudW1iZXIpOiBEcmFmdCB7XG4gICAgY29uc3Qgc2FmZSA9IE1hdGgubWF4KFxuICAgICAgdGhpcy5maXJzdFN1cHBvcnRlZERheSxcbiAgICAgIE1hdGgubWluKHRoaXMubGFzdFN1cHBvcnRlZERheSwgZGF5KSxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBkYXRlOiB0aGlzLmFkYXB0ZXIuZXBvY2hEYXlUb0RhdGUoc2FmZSksXG4gICAgICBob3VyOiAwLFxuICAgICAgbWludXRlOiAwLFxuICAgICAgc2Vjb25kOiAwLFxuICAgICAgcHJlc2VudDogZmFsc2UsXG4gICAgfTtcbiAgfVxuICBsb2FkKHZhbHVlOiBXa2x5UGlja2VyVmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzLmRyYWZ0cyA9IFt0aGlzLmJsYW5rKHRoaXMuZm9jdXNlZCksIHRoaXMuYmxhbmsodGhpcy5mb2N1c2VkKV07XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlU2VsZWN0aW9uKHZhbHVlLCB0aGlzLCB0aGlzLmFkYXB0ZXIpO1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiAhdmFsaWRhdGlvbi5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IFt2YWx1ZV0gOiB2YWx1ZTtcbiAgICAgIHZhbHVlcy5mb3JFYWNoKCh2LCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGQgPSBkZWNvZGVJc28odik7XG4gICAgICAgIHRoaXMuZHJhZnRzW2ldID0ge1xuICAgICAgICAgIGRhdGU6IHRoaXMuaGFzRGF0ZVxuICAgICAgICAgICAgPyB0aGlzLmFkYXB0ZXIuZXBvY2hEYXlUb0RhdGUoZC5lcG9jaERheSlcbiAgICAgICAgICAgIDogdGhpcy5ibGFuayh0aGlzLnRvZGF5KS5kYXRlLFxuICAgICAgICAgIGhvdXI6IGQuaG91cixcbiAgICAgICAgICBtaW51dGU6IGQubWludXRlLFxuICAgICAgICAgIHNlY29uZDogZC5zZWNvbmQsXG4gICAgICAgICAgcHJlc2VudDogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGkgPT09IDAgJiYgdGhpcy5oYXNEYXRlKSB0aGlzLmZvY3VzZWQgPSBkLmVwb2NoRGF5O1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh2YWxpZGF0aW9uLmxlbmd0aCkge1xuICAgICAgdGhpcy5wZW5kaW5nVmFsdWUgPSBudWxsO1xuICAgICAgdGhpcy5yZXBvcnQodmFsaWRhdGlvbik7XG4gICAgfSBlbHNlIHRoaXMuY2hlY2soKTtcbiAgfVxuICB3cml0ZVZhbHVlKHZhbHVlOiBXa2x5UGlja2VyVmFsdWUpOiB2b2lkIHtcbiAgICB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMubG9hZCh2YWx1ZSk7XG4gICAgICB0aGlzLnBvc2l0aW9uKHRoaXMuZm9jdXNlZCwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogV2tseVBpY2tlclZhbHVlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSA9IGRpc2FibGVkO1xuICB9XG4gIHZhbGlkYXRlKF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmxlbmd0aCA/IHsgd2tseTogdGhpcy5lcnJvcnMgfSA6IG51bGw7XG4gIH1cbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdG9yQ2hhbmdlZCA9IGZuO1xuICB9XG4gIHRvdWNoZWQoKTogdm9pZCB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLm9uVG91Y2hlZCgpKTtcbiAgfVxuICBwcml2YXRlIHJlcG9ydChlcnJvcnM6IHJlYWRvbmx5IFdrbHlWYWxpZGF0aW9uRXJyb3JbXSk6IHZvaWQge1xuICAgIGNvbnN0IGNoYW5nZWQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmVycm9ycykgIT09IEpTT04uc3RyaW5naWZ5KGVycm9ycyk7XG4gICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7XG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuVmFsaWRhdGlvbkNoYW5nZV0uZW1pdChlcnJvcnMpO1xuICAgICAgdGhpcy52YWxpZGF0b3JDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG4gIGNoZWNrKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlRHJhZnRzKHtcbiAgICAgIGRyYWZ0czogdGhpcy5kcmFmdHMsXG4gICAgICBjb25maWdFcnJvcnM6IHRoaXMuY29uZmlnRXJyb3JzLFxuICAgICAgYWRhcHRlcjogdGhpcy5hZGFwdGVyLFxuICAgICAgc2VsZWN0aW9uOiB0aGlzLFxuICAgICAgbW9kZTogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdLFxuICAgICAgaXNSYW5nZTogdGhpcy5pc1JhbmdlLFxuICAgICAgaGFzRGF0ZTogdGhpcy5oYXNEYXRlLFxuICAgICAgaGFzVGltZTogdGhpcy5oYXNUaW1lLFxuICAgICAgc2hvd1NlY29uZHM6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TaG93U2Vjb25kc10sXG4gICAgICByZXF1aXJlZDogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlJlcXVpcmVkXSxcbiAgICB9KTtcbiAgICB0aGlzLnBlbmRpbmdWYWx1ZSA9IHJlc3VsdC5wZW5kaW5nVmFsdWU7XG4gICAgdGhpcy5yZXBvcnQocmVzdWx0LmVycm9ycyk7XG4gIH1cbiAgdHJhY2tEcmFmdChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyBFbmRwb2ludCBjb250cm9scyBrZWVwIHRoZWlyIGlkZW50aXR5IGFuZCBmb2N1cyB3aGVuIGRyYWZ0IG9iamVjdHMgc3dhcC5cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbiAgcHJpdmF0ZSBvcmRlckRyYWZ0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNSYW5nZSB8fCAhdGhpcy5kcmFmdHMuZXZlcnkoKGRyYWZ0KSA9PiBkcmFmdC5wcmVzZW50KSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmRyYWZ0cy5zb21lKChkcmFmdCkgPT4gZHJhZnQudW5zdXBwb3J0ZWRFcG9jaERheSAhPT0gdW5kZWZpbmVkKSlcbiAgICAgIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYSA9IHRoaXMuZHJhZnRzWzBdLFxuICAgICAgICBiID0gdGhpcy5kcmFmdHNbMV07XG4gICAgICBjb25zdCBrZXkgPSAoZDogRHJhZnQpID0+XG4gICAgICAgIHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheShkLmRhdGUpICogODY0MDAgK1xuICAgICAgICAoZC5ob3VyIHx8IDApICogMzYwMCArXG4gICAgICAgIChkLm1pbnV0ZSB8fCAwKSAqIDYwICtcbiAgICAgICAgKGQuc2Vjb25kIHx8IDApO1xuICAgICAgaWYgKGtleShhKSA+IGtleShiKSkgdGhpcy5kcmFmdHMgPSBbYiwgYV07XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLy8gSW1wb3NzaWJsZSBvciBpbmNvbXBsZXRlIGRhdGVzIHJlbWFpbiBlZGl0YWJsZSB1bnRpbCBjb3JyZWN0ZWQuXG4gICAgfVxuICB9XG4gIGZpbmlzaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSkgcmV0dXJuO1xuICAgIHRoaXMub3JkZXJEcmFmdHMoKTtcbiAgICBpZiAodGhpcy52aWV3TW9kZSA9PT0gXCJtYW51YWxcIiAmJiB0aGlzLmhhc0RhdGUpIHRoaXMucG9zaXRpb25Pbk1hbnVhbERhdGUoKTtcbiAgICB0aGlzLmNoZWNrKCk7XG4gICAgaWYgKHRoaXMucHJlc2VudGF0aW9uID09PSBcImlubGluZVwiICYmIHRoaXMuY2FuU3VibWl0KSB0aGlzLmNvbW1pdCgpO1xuICB9XG4gIHByaXZhdGUgY29tbWl0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5TdWJtaXQpIHJldHVybjtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5wZW5kaW5nVmFsdWU7XG4gICAgaWYgKFxuICAgICAgSlNPTi5zdHJpbmdpZnkobmV4dCkgIT09XG4gICAgICBKU09OLnN0cmluZ2lmeSh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdKVxuICAgICkge1xuICAgICAgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSA9IG5leHQ7XG4gICAgICB0aGlzLmVtaXR0ZWRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KG5leHQpO1xuICAgICAgdGhpcy5vbkNoYW5nZShuZXh0KTtcbiAgICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuVmFsdWVDaGFuZ2VdLmVtaXQobmV4dCk7XG4gICAgfVxuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cbiAgc3VibWl0KHJlYXNvbjogV2tseUNsb3NlUmVhc29uID0gXCJzdWJtaXRcIik6IHZvaWQge1xuICAgIHRoaXMuY2hlY2soKTtcbiAgICBpZiAoIXRoaXMuY2FuU3VibWl0KSByZXR1cm47XG4gICAgdGhpcy5jb21taXQoKTtcbiAgICBpZiAodGhpcy5wcmVzZW50YXRpb24gPT09IFwidHJhbnNpZW50XCIpXG4gICAgICB0aGlzW1drbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLkNsb3NlZF0uZW1pdChyZWFzb24pO1xuICB9XG4gIGNhbmNlbChyZWFzb246IFdrbHlDbG9zZVJlYXNvbiA9IFwiY2xvc2UtYnV0dG9uXCIpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSkgcmV0dXJuO1xuICAgIHRoaXMubG9hZCh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuVmFsdWVdKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIHRoaXNbV2tseVBpY2tlck91dHB1dHNQcm9wZXJ0eUtleXMuQ2xvc2VkXS5lbWl0KHJlYXNvbik7XG4gIH1cbiAgbm93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgY29uc3QgbiA9IHRoaXMuY2xvY2subm93KCk7XG4gICAgY29uc3QgZGF5ID0gTWF0aC5mbG9vcihuLmdldFRpbWUoKSAvIDg2NDAwMDAwKTtcbiAgICB0aGlzLmRyYWZ0cyA9IFswLCAxXS5tYXAoKGluZGV4KSA9PiAoe1xuICAgICAgLi4udGhpcy5jbG9ja0RyYWZ0KGRheSwgbiksXG4gICAgICBwcmVzZW50OiBpbmRleCA9PT0gMCB8fCB0aGlzLmlzUmFuZ2UsXG4gICAgfSkpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaGFzRGF0ZSAmJlxuICAgICAgKGRheSA8IHRoaXMuZmlyc3RTdXBwb3J0ZWREYXkgfHwgZGF5ID4gdGhpcy5sYXN0U3VwcG9ydGVkRGF5KVxuICAgICkge1xuICAgICAgdGhpcy5yZXBvcnQoW2Vycm9yKFwidW5zdXBwb3J0ZWQtYWRhcHRlci1kYXRlXCIsIGRheSldKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mb2N1c2VkID0gZGF5O1xuICAgIHRoaXMucG9zaXRpb24oZGF5LCB0cnVlKTtcbiAgICB0aGlzLmNoZWNrKCk7XG4gICAgdGhpcy5zdWJtaXQoXCJub3dcIik7XG4gIH1cbiAgcHJpdmF0ZSBjbG9ja0RyYWZ0KGRheTogbnVtYmVyLCBub3c6IERhdGUpOiBEcmFmdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuYmxhbmsoZGF5KSxcbiAgICAgIGhvdXI6IG5vdy5nZXRVVENIb3VycygpLFxuICAgICAgbWludXRlOlxuICAgICAgICBNYXRoLmZsb29yKFxuICAgICAgICAgIG5vdy5nZXRVVENNaW51dGVzKCkgLyB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTWludXRlU3RlcF0sXG4gICAgICAgICkgKiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTWludXRlU3RlcF0sXG4gICAgICBzZWNvbmQ6IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TaG93U2Vjb25kc11cbiAgICAgICAgPyBNYXRoLmZsb29yKFxuICAgICAgICAgICAgbm93LmdldFVUQ1NlY29uZHMoKSAvIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5TZWNvbmRTdGVwXSxcbiAgICAgICAgICApICogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlNlY29uZFN0ZXBdXG4gICAgICAgIDogMCxcbiAgICB9O1xuICB9XG4gIHByaXZhdGUgaW5pdGlhbGl6ZU1hbnVhbFJhbmdlKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmlzUmFuZ2UgfHxcbiAgICAgICF0aGlzLmhhc0RhdGUgfHxcbiAgICAgIHRoaXMuZHJhZnRzLmV2ZXJ5KChkcmFmdCkgPT4gZHJhZnQucHJlc2VudClcbiAgICApXG4gICAgICByZXR1cm47XG4gICAgbGV0IHNlZWQgPSB0aGlzLmRyYWZ0cy5maW5kKChkcmFmdCkgPT4gZHJhZnQucHJlc2VudCk7XG4gICAgaWYgKCFzZWVkKSB7XG4gICAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLlZhbHVlXSAhPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgY29uc3Qgbm93ID0gdGhpcy5jbG9jay5ub3coKTtcbiAgICAgIGNvbnN0IGluaXRpYWxFcG9jaERheSA9XG4gICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Jbml0aWFsRXBvY2hEYXldO1xuICAgICAgY29uc3QgZGF5ID1cbiAgICAgICAgaW5pdGlhbEVwb2NoRGF5ID09PSBudWxsXG4gICAgICAgICAgPyB0aGlzLmRlZmF1bHRzLmluaXRpYWxFcG9jaERheSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IE1hdGguZmxvb3Iobm93LmdldFRpbWUoKSAvIDg2NDAwMDAwKVxuICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRzLmluaXRpYWxFcG9jaERheVxuICAgICAgICAgIDogaW5pdGlhbEVwb2NoRGF5O1xuICAgICAgc2VlZCA9IHsgLi4udGhpcy5jbG9ja0RyYWZ0KGRheSwgbm93KSwgcHJlc2VudDogdHJ1ZSB9O1xuICAgIH1cbiAgICAvLyBDb21wbGV0ZSBtaXNzaW5nIGVuZHBvaW50cyB3aXRob3V0IHJlcGxhY2luZyBzZWxlY3RlZCBvciBpbnZhbGlkIGRyYWZ0cy5cbiAgICBjb25zdCBpbml0aWFsID0gc2VlZDtcbiAgICB0aGlzLmRyYWZ0cyA9IHRoaXMuZHJhZnRzLm1hcCgoZHJhZnQpID0+XG4gICAgICBkcmFmdC5wcmVzZW50ID8gZHJhZnQgOiB7IC4uLmluaXRpYWwsIGRhdGU6IHsgLi4uaW5pdGlhbC5kYXRlIH0gfSxcbiAgICApO1xuICAgIHRoaXMuZmluaXNoKCk7XG4gICAgLy8gUG9zaXRpb25pbmcgcmVuZGVycyBiZWZvcmUgdmFsaWRhdGlvbjsgcmVmcmVzaCBjb21wbGV0aW9uIGNvbnRyb2xzIGFmdGVyd2FyZC5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHRvZ2dsZVZpZXcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0gfHwgIXRoaXMuaGFzRGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMudmlld01vZGUgPSB0aGlzLnZpZXdNb2RlID09PSBcImNhbGVuZGFyXCIgPyBcIm1hbnVhbFwiIDogXCJjYWxlbmRhclwiO1xuICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSBcIm1hbnVhbFwiKSB0aGlzLmluaXRpYWxpemVNYW51YWxSYW5nZSgpO1xuICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSBcImNhbGVuZGFyXCIpIHRoaXMucG9zaXRpb25Pbk1hbnVhbERhdGUoKTtcbiAgICB0aGlzW1drbHlQaWNrZXJPdXRwdXRzUHJvcGVydHlLZXlzLlZpZXdNb2RlQ2hhbmdlXS5lbWl0KHRoaXMudmlld01vZGUpO1xuICAgIGlmICh0aGlzLnZpZXdNb2RlID09PSBcImNhbGVuZGFyXCIpIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZXNldFNjcm9sbCgpKTtcbiAgfVxuICBwcml2YXRlIHBvc2l0aW9uT25NYW51YWxEYXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IGRyYWZ0ID0gdGhpcy5kcmFmdHNbdGhpcy5tYW51YWxEYXRlRW5kcG9pbnRdO1xuICAgIGlmICghZHJhZnQgfHwgIWRyYWZ0LnByZXNlbnQpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgLy8gQSB2YWxpZCBkYXkgZm9sbG93cyB0aGUgc2VsZWN0aW9uLiBBbiBpbXBvc3NpYmxlIGRheSBrZWVwcyBpdHMgZHJhZnRcbiAgICAgIC8vIGZpZWxkcyBidXQgc3RpbGwgc2hvd3MgdGhlIGNob3NlbiBtb250aCBpbiB0aGUgY2FsZW5kYXIuXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmFkYXB0ZXIuZGF0ZVRvRXBvY2hEYXkoZHJhZnQuZGF0ZSk7XG4gICAgICB0aGlzLmZvY3VzZWQgPSB0YXJnZXQ7XG4gICAgICB0aGlzLnBvc2l0aW9uKHRhcmdldCwgdHJ1ZSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmlyc3QgPSB0aGlzLmFkYXB0ZXIuZGF0ZVRvRXBvY2hEYXkoeyAuLi5kcmFmdC5kYXRlLCBkYXk6IDEgfSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZpcnN0O1xuICAgICAgICB0aGlzLnBvc2l0aW9uKGZpcnN0LCB0cnVlKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfVxuICB9XG4gIG1vbnRocyhkcmFmdDogRHJhZnQpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0TW9udGhzKGRyYWZ0LmRhdGUueWVhcikubWFwKChtKSA9PiBtLmxhYmVsKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIG1vbnRoQ291bnQoZHJhZnQ6IERyYWZ0KTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tb250aHMoZHJhZnQpLmxlbmd0aCB8fCAxMjtcbiAgfVxuICBnZXQgaW5EYXlzKCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiBkcmFmdERheURpZmZlcmVuY2UodGhpcy5kcmFmdHMsIHRoaXMuYWRhcHRlcik7XG4gIH1cbiAgZ2V0IGluRGF5c0xhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF5cyA9IHRoaXMuaW5EYXlzO1xuICAgIHJldHVybiB0aGlzLnQoXCJpbkRheXNcIikucmVwbGFjZShcbiAgICAgIC97e1xccypkYXlzXFxzKn19L2csXG4gICAgICBkYXlzID09PSBudWxsXG4gICAgICAgID8gdGhpcy50KFwiZGF5c1VuYXZhaWxhYmxlXCIpXG4gICAgICAgIDogbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMuZWZmZWN0aXZlTG9jYWxlLCB7XG4gICAgICAgICAgICB1c2VHcm91cGluZzogZmFsc2UsXG4gICAgICAgICAgfSkuZm9ybWF0KGRheXMpLFxuICAgICk7XG4gIH1cbiAgZ2V0IHJlc3VsdGluZ0VuZERhdGUoKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZHJhZnQgPSB0aGlzLmRyYWZ0c1sxXTtcbiAgICAgIGlmIChcbiAgICAgICAgZHJhZnQudW5zdXBwb3J0ZWRFcG9jaERheSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIHRoaXMuYWRhcHRlci52YWxpZGF0ZURhdGUoZHJhZnQuZGF0ZSkubGVuZ3RoXG4gICAgICApXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgdGhpcy5hZGFwdGVyLmZvcm1hdERheShkcmFmdC5kYXRlKSxcbiAgICAgICAgdGhpcy5hZGFwdGVyLmZvcm1hdE1vbnRoKGRyYWZ0LmRhdGUpLFxuICAgICAgICB0aGlzLmFkYXB0ZXIuZm9ybWF0WWVhcihkcmFmdC5kYXRlKSxcbiAgICAgIF0uam9pbihcIiBcIik7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9XG4gIHRvZ2dsZUVuZFZpZXcodmlldzogXCJkYXRlXCIgfCBcImRheXNcIik6IHZvaWQge1xuICAgIGlmICh0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuRGlzYWJsZWRdKSByZXR1cm47XG4gICAgdGhpcy5lbmRWaWV3ID0gdmlldztcbiAgfVxuICBkYXlzKHZhbHVlOiBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0pIHJldHVybjtcbiAgICB0aGlzLm1hbnVhbERhdGVFbmRwb2ludCA9IDE7XG4gICAgc2V0RHJhZnREYXlEaWZmZXJlbmNlKHRoaXMuZHJhZnRzLCB0aGlzLmFkYXB0ZXIsIHZhbHVlKTtcbiAgICB0aGlzLmNoZWNrKCk7XG4gIH1cbiAgZmllbGQoaW5kZXg6IG51bWJlciwgZmllbGQ6IHN0cmluZywgdmFsdWU6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSkgcmV0dXJuO1xuICAgIGNvbnN0IGRyYWZ0ID0gdGhpcy5kcmFmdHNbaW5kZXhdO1xuICAgIGRyYWZ0LnByZXNlbnQgPSB0cnVlO1xuICAgIGlmIChmaWVsZCA9PT0gXCJkYXlcIiB8fCBmaWVsZCA9PT0gXCJ5ZWFyXCIgfHwgZmllbGQgPT09IFwibW9udGhcIikge1xuICAgICAgdGhpcy5tYW51YWxEYXRlRW5kcG9pbnQgPSBpbmRleDtcbiAgICAgIGRlbGV0ZSBkcmFmdC51bnN1cHBvcnRlZEVwb2NoRGF5O1xuICAgICAgbGV0IGRhdGUgPSB7IC4uLmRyYWZ0LmRhdGUsIFtmaWVsZF06IHZhbHVlIH0gYXMgV2tseUNhbGVuZGFyRGF0ZTtcbiAgICAgIGlmIChmaWVsZCA9PT0gXCJtb250aFwiKSB7XG4gICAgICAgIGxldCBtb250aDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtb250aCA9IHRoaXMuYWRhcHRlclxuICAgICAgICAgICAgLmdldE1vbnRocyhkYXRlLnllYXIpXG4gICAgICAgICAgICAuZmluZCgobSkgPT4gbS5tb250aCA9PT0gdmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICBkYXRlID0geyAuLi5kYXRlLCBtb250aENvZGU6IG1vbnRoID8gbW9udGgubW9udGhDb2RlIDogXCJcIiB9O1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkID09PSBcInllYXJcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuYWRhcHRlci5nZXRNb250aHModmFsdWUpO1xuICAgICAgICAgIGNvbnN0IG1vbnRoID0gbW9udGhzLmZpbmQoKG0pID0+IG0ubW9udGhDb2RlID09PSBkYXRlLm1vbnRoQ29kZSk7XG4gICAgICAgICAgaWYgKG1vbnRoKSBkYXRlID0geyAuLi5kYXRlLCBtb250aDogbW9udGgubW9udGggfTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIH1cbiAgICAgIGRyYWZ0LmRhdGUgPSBkYXRlO1xuICAgIH0gZWxzZSBpZiAoZmllbGQgPT09IFwiaG91clwiICYmIHRoaXMuZWZmZWN0aXZlSG91ckN5Y2xlID09PSBcImgxMlwiKVxuICAgICAgZHJhZnQuaG91ciA9XG4gICAgICAgIHZhbHVlID09PSBudWxsXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiB2YWx1ZSA+PSAxICYmIHZhbHVlIDw9IDEyXG4gICAgICAgICAgICA/ICh2YWx1ZSAlIDEyKSArICgoZHJhZnQuaG91ciB8fCAwKSA+PSAxMiA/IDEyIDogMClcbiAgICAgICAgICAgIDogMjQgKyB2YWx1ZTtcbiAgICBlbHNlIChkcmFmdCBhcyBhbnkpW2ZpZWxkXSA9IHZhbHVlO1xuICAgIHRoaXMuY2hlY2soKTtcbiAgfVxuICBkaXNwbGF5SG91cihkcmFmdDogRHJhZnQpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gZHJhZnQuaG91ciA9PT0gbnVsbFxuICAgICAgPyBudWxsXG4gICAgICA6IHRoaXMuZWZmZWN0aXZlSG91ckN5Y2xlID09PSBcImgxMlwiXG4gICAgICAgID8gZHJhZnQuaG91ciAlIDEyIHx8IDEyXG4gICAgICAgIDogZHJhZnQuaG91cjtcbiAgfVxuICBwZXJpb2QoaW5kZXg6IG51bWJlciwgcGVyaW9kOiBcImFtXCIgfCBcInBtXCIgfCBcIjI0XCIpOiB2b2lkIHtcbiAgICBpZiAodGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLkRpc2FibGVkXSkgcmV0dXJuO1xuICAgIGlmIChwZXJpb2QgPT09IFwiMjRcIikgdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPSBcImgyNFwiO1xuICAgIGVsc2Uge1xuICAgICAgdGhpcy5lZmZlY3RpdmVIb3VyQ3ljbGUgPSBcImgxMlwiO1xuICAgICAgdGhpcy5kcmFmdHNbaW5kZXhdLmhvdXIgPVxuICAgICAgICAoKHRoaXMuZHJhZnRzW2luZGV4XS5ob3VyIHx8IDApICUgMTIpICsgKHBlcmlvZCA9PT0gXCJwbVwiID8gMTIgOiAwKTtcbiAgICAgIHRoaXMuZHJhZnRzW2luZGV4XS5wcmVzZW50ID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmluaXNoKCk7XG4gICAgfVxuICB9XG4gIHNlbGVjdGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZHJhZnRzLnNvbWUoKGQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkLnByZXNlbnQgJiYgdGhpcy5hZGFwdGVyLmRhdGVUb0Vwb2NoRGF5KGQuZGF0ZSkgPT09IGRheTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGluUmFuZ2UoZGF5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNSYW5nZSB8fCAhdGhpcy5kcmFmdHMuZXZlcnkoKGQpID0+IGQucHJlc2VudCkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYSA9IHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheSh0aGlzLmRyYWZ0c1swXS5kYXRlKSxcbiAgICAgICAgYiA9IHRoaXMuYWRhcHRlci5kYXRlVG9FcG9jaERheSh0aGlzLmRyYWZ0c1sxXS5kYXRlKTtcbiAgICAgIHJldHVybiBkYXkgPiBNYXRoLm1pbihhLCBiKSAmJiBkYXkgPCBNYXRoLm1heChhLCBiKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGRheURpc2FibGVkKGRheTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKGRheSA8IHRoaXMuZmlyc3RTdXBwb3J0ZWREYXkgfHwgZGF5ID4gdGhpcy5sYXN0U3VwcG9ydGVkRGF5KVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmFkYXB0ZXIuZXBvY2hEYXlUb0RhdGUoZGF5KTtcbiAgICAgIGNvbnN0IGlzRGF0ZURpc2FibGVkID0gdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLklzRGF0ZURpc2FibGVkXTtcbiAgICAgIGlmIChcbiAgICAgICAgaXNEYXRlRGlzYWJsZWQgJiZcbiAgICAgICAgaXNEYXRlRGlzYWJsZWQoZGF5LCB7XG4gICAgICAgICAgbW9kZTogdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk1vZGVdLFxuICAgICAgICAgIGVuZHBvaW50OiB0aGlzLmlzUmFuZ2VcbiAgICAgICAgICAgID8gdGhpcy5kcmFmdHNbMF0/LnByZXNlbnQgJiYgIXRoaXMuZHJhZnRzWzFdPy5wcmVzZW50XG4gICAgICAgICAgICAgID8gXCJlbmRcIlxuICAgICAgICAgICAgICA6IFwic3RhcnRcIlxuICAgICAgICAgICAgOiBcInNpbmdsZVwiLFxuICAgICAgICAgIGNhbGVuZGFyRGF0ZTogZGF0ZSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjb25zdCBtaW4gPSB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuTWluXTtcbiAgICAgIGNvbnN0IG1heCA9IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5NYXhdO1xuICAgICAgaWYgKG1pbiAmJiBkYXkgPCBkZWNvZGVJc28obWluKS5lcG9jaERheSkgcmV0dXJuIHRydWU7XG4gICAgICBpZiAobWF4ICYmIGRheSA+IGRlY29kZUlzbyhtYXgpLmVwb2NoRGF5KSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgc2VsZWN0KGRheTogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0gfHwgdGhpcy5kYXlEaXNhYmxlZChkYXkpKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuZm9jdXNlZCA9IGRheTtcbiAgICBjb25zdCBpbmRleCA9XG4gICAgICB0aGlzLmlzUmFuZ2UgJiYgdGhpcy5kcmFmdHNbMF0ucHJlc2VudCAmJiAhdGhpcy5kcmFmdHNbMV0ucHJlc2VudCA/IDEgOiAwO1xuICAgIGlmICh0aGlzLmlzUmFuZ2UgJiYgaW5kZXggPT09IDApIHRoaXMuZHJhZnRzWzFdLnByZXNlbnQgPSBmYWxzZTtcbiAgICBkZWxldGUgdGhpcy5kcmFmdHNbaW5kZXhdLnVuc3VwcG9ydGVkRXBvY2hEYXk7XG4gICAgdGhpcy5kcmFmdHNbaW5kZXhdLmRhdGUgPSB0aGlzLmFkYXB0ZXIuZXBvY2hEYXlUb0RhdGUoZGF5KTtcbiAgICB0aGlzLmRyYWZ0c1tpbmRleF0ucHJlc2VudCA9IHRydWU7XG4gICAgdGhpcy5vcmRlckRyYWZ0cygpO1xuICAgIHRoaXMucmVuZGVyUm93cygpO1xuICAgIHRoaXMuZmluaXNoKCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wcmVzZW50YXRpb24gPT09IFwidHJhbnNpZW50XCIgJiZcbiAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5Nb2RlXSA9PT0gXCJkYXRlXCIgJiZcbiAgICAgIHRoaXMudmlld01vZGUgPT09IFwiY2FsZW5kYXJcIlxuICAgIClcbiAgICAgIHRoaXMuc3VibWl0KFwiYXV0by1zdWJtaXRcIik7XG4gIH1cbiAga2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50LCBkYXk6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBkZWx0YSA9IDA7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJBcnJvd0xlZnRcIikgZGVsdGEgPSAtMTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkFycm93UmlnaHRcIikgZGVsdGEgPSAxO1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dVcFwiKSBkZWx0YSA9IC03O1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiQXJyb3dEb3duXCIpIGRlbHRhID0gNztcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIlBhZ2VVcFwiKVxuICAgICAgZGVsdGEgPSAtNyAqIChldmVudC5zaGlmdEtleSA/IHRoaXMudmlzaWJsZUNvdW50IDogMSk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gXCJQYWdlRG93blwiKVxuICAgICAgZGVsdGEgPSA3ICogKGV2ZW50LnNoaWZ0S2V5ID8gdGhpcy52aXNpYmxlQ291bnQgOiAxKTtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBcIkhvbWVcIikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheSh0aGlzLnRvZGF5LCB7IGZvY3VzOiB0cnVlIH0pO1xuICAgIH1cbiAgICBpZiAoZGVsdGEpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBkYXkgKyBkZWx0YTtcbiAgICAgIGlmICh0YXJnZXQgPj0gdGhpcy5maXJzdFN1cHBvcnRlZERheSAmJiB0YXJnZXQgPD0gdGhpcy5sYXN0U3VwcG9ydGVkRGF5KVxuICAgICAgICB0aGlzLnNjcm9sbFRvRXBvY2hEYXkodGFyZ2V0LCB7IGZvY3VzOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHBvc2l0aW9uKFxuICAgIGRheTogbnVtYmVyLFxuICAgIHByZXNldCA9IGZhbHNlLFxuICAgIG9wdGlvbnM6IFdrbHlKdW1wT3B0aW9ucyA9IHt9LFxuICApOiB2b2lkIHtcbiAgICBkYXkgPSBNYXRoLm1heChcbiAgICAgIHRoaXMuZmlyc3RTdXBwb3J0ZWREYXksXG4gICAgICBNYXRoLm1pbih0aGlzLmxhc3RTdXBwb3J0ZWREYXksIGRheSksXG4gICAgKTtcbiAgICB0aGlzLmFuY2hvcldlZWsgPSBhYnNvbHV0ZVdlZWtPZihkYXksIHRoaXMuZWZmZWN0aXZlT2Zmc2V0KTtcbiAgICBjb25zdCB2aWV3cG9ydFByZXNldCA9IHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5WaWV3cG9ydFByZXNldF07XG4gICAgdGhpcy5jbGlwTW9udGggPSBwcmVzZXQgJiYgdmlld3BvcnRQcmVzZXQua2luZCA9PT0gXCJmdWxsLW1vbnRoXCI7XG4gICAgaWYgKHByZXNldCAmJiB2aWV3cG9ydFByZXNldC5raW5kICE9PSBcIndlZWtzXCIpIHtcbiAgICAgIGNvbnN0IGQgPSB0aGlzLmFkYXB0ZXIuZXBvY2hEYXlUb0RhdGUoZGF5KTtcbiAgICAgIHRoaXMuaW5pdGlhbE1vbnRoID0gZC55ZWFyICsgXCIvXCIgKyBkLm1vbnRoQ29kZTtcbiAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IGNhbGVuZGFyTW9udGhCb3VuZHModGhpcy5hZGFwdGVyLCBkYXkpO1xuICAgICAgdGhpcy5maXJzdFdlZWsgPSBhYnNvbHV0ZVdlZWtPZihzdGFydCwgdGhpcy5lZmZlY3RpdmVPZmZzZXQpO1xuICAgICAgdGhpcy52aXNpYmxlQ291bnQgPVxuICAgICAgICBhYnNvbHV0ZVdlZWtPZihlbmQsIHRoaXMuZWZmZWN0aXZlT2Zmc2V0KSAtIHRoaXMuZmlyc3RXZWVrICsgMTtcbiAgICAgIGlmIChcbiAgICAgICAgdmlld3BvcnRQcmVzZXQua2luZCA9PT0gXCJmdWxsLW1vbnRoLWFuZC1hcm91bmRcIiAmJlxuICAgICAgICAhdGhpcy5jb25maWdFcnJvcnMubGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gdmlld3BvcnRQcmVzZXQuZXh0cmFXZWVrc0JlZm9yZSB8fCAwLFxuICAgICAgICAgIGFmdGVyID0gdmlld3BvcnRQcmVzZXQuZXh0cmFXZWVrc0FmdGVyIHx8IDA7XG4gICAgICAgIHRoaXMuZmlyc3RXZWVrIC09IGJlZm9yZTtcbiAgICAgICAgdGhpcy52aXNpYmxlQ291bnQgKz0gYmVmb3JlICsgYWZ0ZXI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh2aWV3cG9ydFByZXNldC5raW5kID09PSBcIndlZWtzXCIpXG4gICAgICAgIHRoaXMudmlzaWJsZUNvdW50ID0gdGhpcy5jb25maWdFcnJvcnMubGVuZ3RoXG4gICAgICAgICAgPyA2XG4gICAgICAgICAgOiB2aWV3cG9ydFByZXNldC52aXNpYmxlV2Vla0NvdW50O1xuICAgICAgdGhpcy5maXJzdFdlZWsgPVxuICAgICAgICB0aGlzLmFuY2hvcldlZWsgLVxuICAgICAgICAob3B0aW9ucy5hbGlnbiA9PT0gXCJzdGFydFwiXG4gICAgICAgICAgPyAwXG4gICAgICAgICAgOiBvcHRpb25zLmFsaWduID09PSBcImVuZFwiXG4gICAgICAgICAgICA/IHRoaXMudmlzaWJsZUNvdW50IC0gMVxuICAgICAgICAgICAgOiBNYXRoLmZsb29yKHRoaXMudmlzaWJsZUNvdW50IC8gMikpO1xuICAgIH1cbiAgICB0aGlzLmZpcnN0V2VlayA9IHRoaXMuY2xhbXBGaXJzdFdlZWsodGhpcy5maXJzdFdlZWspO1xuICAgIHRoaXMuYmFzZVdlZWsgPSB0aGlzLmZpcnN0V2VlayAtIDEwMDA7XG4gICAgdGhpcy5yZW5kZXJSb3dzKCk7XG4gICAgLy8gQXBwbHkgdGhlIG5ldyBydW53YXkgYmVmb3JlIHdyaXRpbmcgc2Nyb2xsVG9wIG9yIGxvY2F0aW5nIGEgZm9jdXMgdGFyZ2V0LlxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgfVxuICBwcml2YXRlIHJlc2V0U2Nyb2xsKCk6IHZvaWQge1xuICAgIC8vIFJvdW5kIHdlZWsgYm91bmRhcmllcyB0byBhdm9pZCBzY3JvbGxUb3AgdHJ1bmNhdGlvbiB1bmRlciBDU1Mgem9vbS5cbiAgICBpZiAodGhpcy5zY3JvbGxlcilcbiAgICAgIHRoaXMuc2Nyb2xsZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSBNYXRoLnJvdW5kKDEwMDAgKiB0aGlzLnJvd0hlaWdodCk7XG4gIH1cbiAgc2Nyb2xsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy5zbmFwUGVuZGluZyA9IHRydWU7XG4gICAgdGhpcy5zY2hlZHVsZVNuYXAoKTtcbiAgICAvLyBRdWFudGl6ZSBkaXNwbGFjZW1lbnQgYXJvdW5kIHRoZSByZXNldCBwb2ludCwgZXF1YWxseSBpbiBib3RoIGRpcmVjdGlvbnMuXG4gICAgY29uc3QgcmVsYXRpdmVSb3dzID0gZWxlbWVudC5zY3JvbGxUb3AgLyB0aGlzLnJvd0hlaWdodCAtIDEwMDA7XG4gICAgY29uc3QgaW5kZXggPVxuICAgICAgMTAwMCArIE1hdGguc2lnbihyZWxhdGl2ZVJvd3MpICogTWF0aC5yb3VuZChNYXRoLmFicyhyZWxhdGl2ZVJvd3MpKTtcbiAgICBjb25zdCByZXF1ZXN0ZWRGaXJzdCA9IHRoaXMuYmFzZVdlZWsgKyBpbmRleDtcbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuY2xhbXBGaXJzdFdlZWsocmVxdWVzdGVkRmlyc3QpO1xuICAgIGlmIChyZXF1ZXN0ZWRGaXJzdCAhPT0gZmlyc3QpIHtcbiAgICAgIGVsZW1lbnQuc2Nyb2xsVG9wID0gTWF0aC5yb3VuZCgoZmlyc3QgLSB0aGlzLmJhc2VXZWVrKSAqIHRoaXMucm93SGVpZ2h0KTtcbiAgICB9XG4gICAgaWYgKGZpcnN0ID09PSB0aGlzLmZpcnN0V2VlaykgcmV0dXJuO1xuICAgIHRoaXMuY2xpcE1vbnRoID0gZmFsc2U7XG4gICAgdGhpcy5maXJzdFdlZWsgPSBmaXJzdDtcbiAgICB0aGlzLmFuY2hvcldlZWsgPSBmaXJzdCArIE1hdGguZmxvb3IodGhpcy52aXNpYmxlQ291bnQgLyAyKTtcbiAgICBpZiAoaW5kZXggPCAxMDAgfHwgaW5kZXggPiAxOTAwKSB7XG4gICAgICAvLyBQcmVzZXJ2ZSBzaWduZWQgZGlzcGxhY2VtZW50IGZyb20gdGhpcyB3ZWVrOyBtb2R1bG8gdHVybnMgZnJhY3Rpb25hbFxuICAgICAgLy8gcm91bmRpbmcganVzdCBiZWxvdyBhIGJvdW5kYXJ5IGludG8gYWxtb3N0IGEgZnVsbCByb3cgYWZ0ZXIgcmViYXNpbmcuXG4gICAgICBjb25zdCBvZmZzZXQgPVxuICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCAtIChmaXJzdCAtIHRoaXMuYmFzZVdlZWspICogdGhpcy5yb3dIZWlnaHQ7XG4gICAgICB0aGlzLmJhc2VXZWVrID0gZmlyc3QgLSAxMDAwO1xuICAgICAgZWxlbWVudC5zY3JvbGxUb3AgPSBNYXRoLnJvdW5kKDEwMDAgKiB0aGlzLnJvd0hlaWdodCArIG9mZnNldCk7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyUm93cygpO1xuICB9XG4gIHByaXZhdGUgc2NoZWR1bGVTbmFwKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxFbmRUaW1lcik7XG4gICAgdGhpcy5zY3JvbGxFbmRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zbmFwV2VlaygpLCAyMDApO1xuICB9XG4gIHNuYXBXZWVrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNjcm9sbEVuZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxFbmRUaW1lcik7XG4gICAgdGhpcy5zY3JvbGxFbmRUaW1lciA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIXRoaXMuc25hcFBlbmRpbmcgfHwgIXRoaXMuc2Nyb2xsZXIpIHJldHVybjtcbiAgICB0aGlzLnNuYXBQZW5kaW5nID0gZmFsc2U7XG4gICAgLy8gQWxpZ24gdGhlIGN1cnJlbnQgdmlydHVhbCB3ZWVrIHdpdGhvdXQgcmVidWlsZGluZyBvciByZWJhc2luZyBpdHMgcm93cy5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5zY3JvbGxlci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHRhcmdldCA9IE1hdGgucm91bmQoXG4gICAgICAodGhpcy5maXJzdFdlZWsgLSB0aGlzLmJhc2VXZWVrKSAqIHRoaXMucm93SGVpZ2h0LFxuICAgICk7XG4gICAgaWYgKGVsZW1lbnQuc2Nyb2xsVG9wICE9PSB0YXJnZXQpIGVsZW1lbnQuc2Nyb2xsVG9wID0gdGFyZ2V0O1xuICB9XG4gIHByaXZhdGUgc2hvd0ZpcnN0V2Vlayh3ZWVrOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuY2xhbXBGaXJzdFdlZWsod2Vlayk7XG4gICAgaWYgKGZpcnN0ID09PSB0aGlzLmZpcnN0V2VlaykgcmV0dXJuO1xuICAgIHRoaXMuY2xpcE1vbnRoID0gZmFsc2U7XG4gICAgdGhpcy5maXJzdFdlZWsgPSBmaXJzdDtcbiAgICB0aGlzLmFuY2hvcldlZWsgPSBmaXJzdCArIE1hdGguZmxvb3IodGhpcy52aXNpYmxlQ291bnQgLyAyKTtcbiAgICB0aGlzLmJhc2VXZWVrID0gZmlyc3QgLSAxMDAwO1xuICAgIHRoaXMucmVuZGVyUm93cygpO1xuICAgIHRoaXMucmVzZXRTY3JvbGwoKTtcbiAgfVxuICBjYW5Nb3ZlV2VlayhkZWx0YTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xhbXBGaXJzdFdlZWsodGhpcy5maXJzdFdlZWsgKyBkZWx0YSkgIT09IHRoaXMuZmlyc3RXZWVrO1xuICB9XG4gIG1vdmVXZWVrKGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5EaXNhYmxlZF0pXG4gICAgICB0aGlzLnNob3dGaXJzdFdlZWsodGhpcy5maXJzdFdlZWsgKyBkZWx0YSk7XG4gIH1cbiAgcHJpdmF0ZSByZW5kZXJSb3dzKCk6IHZvaWQge1xuICAgIC8vIEtlZXAgdGhlIHZpcnR1YWwgc2Nyb2xsIG9mZnNldCBoZXJlOyByb3cgZGF0YSBpcyBzaGFyZWQgYWNyb3NzIEFuZ3VsYXIgdmVyc2lvbnMuXG4gICAgY29uc3Qgb3ZlcnNjYW4gPSBNYXRoLm1heChcbiAgICAgIDAsXG4gICAgICBNYXRoLm1pbig1MCwgdGhpc1tXa2x5UGlja2VySW5wdXRzUHJvcGVydHlLZXlzLk92ZXJzY2FuV2Vla3NdIHx8IDApLFxuICAgICk7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0V2VlayAtIG92ZXJzY2FuO1xuICAgIHRoaXMucGFkZGluZ1RvcCA9IChzdGFydCAtIHRoaXMuYmFzZVdlZWspICogdGhpcy5yb3dIZWlnaHQ7XG4gICAgdGhpcy5yb3dzID0gY3JlYXRlV2Vla1Jvd3Moe1xuICAgICAgZ2VuZXJhdG9yOiB0aGlzLmdlbmVyYXRvcixcbiAgICAgIGFkYXB0ZXI6IHRoaXMuYWRhcHRlcixcbiAgICAgIHN0YXJ0V2Vlazogc3RhcnQsXG4gICAgICBjb3VudDogdGhpcy52aXNpYmxlQ291bnQgKyAyICogb3ZlcnNjYW4sXG4gICAgICBmaXJzdFZpc2libGVXZWVrOiB0aGlzLmZpcnN0V2VlayxcbiAgICAgIGZpcnN0U3VwcG9ydGVkRGF5OiB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5LFxuICAgICAgbGFzdFN1cHBvcnRlZERheTogdGhpcy5sYXN0U3VwcG9ydGVkRGF5LFxuICAgICAgY2xpcE1vbnRoOiB0aGlzLmNsaXBNb250aCxcbiAgICAgIGluaXRpYWxNb250aDogdGhpcy5pbml0aWFsTW9udGgsXG4gICAgICB3ZWVrTGFiZWxNb2RlOiB0aGlzW1drbHlQaWNrZXJJbnB1dHNQcm9wZXJ0eUtleXMuV2Vla0xhYmVsTW9kZV0sXG4gICAgICB3ZWVrTGFiZWxGb3JtYXR0ZXI6XG4gICAgICAgIHRoaXNbV2tseVBpY2tlcklucHV0c1Byb3BlcnR5S2V5cy5XZWVrTGFiZWxGb3JtYXR0ZXJdIHx8IG51bGwsXG4gICAgICBpc0RheURpc2FibGVkOiAoZGF5KSA9PiB0aGlzLmRheURpc2FibGVkKGRheSksXG4gICAgfSk7XG4gICAgdGhpc1tXa2x5UGlja2VyT3V0cHV0c1Byb3BlcnR5S2V5cy5WaWV3cG9ydENoYW5nZV0uZW1pdCh7XG4gICAgICBmaXJzdFZpc2libGVBYnNvbHV0ZVdlZWs6IHRoaXMuZmlyc3RXZWVrLFxuICAgICAgbGFzdFZpc2libGVBYnNvbHV0ZVdlZWs6IHRoaXMuZmlyc3RXZWVrICsgdGhpcy52aXNpYmxlQ291bnQgLSAxLFxuICAgICAgYW5jaG9yQWJzb2x1dGVXZWVrOiB0aGlzLmFuY2hvcldlZWssXG4gICAgfSk7XG4gIH1cbiAgLy8gUmV0YWluIGRheSBET00gbm9kZXMgYW5kIGtleWJvYXJkIGZvY3VzIHdoZW4gcm93IG1ldGFkYXRhIGlzIHJlZ2VuZXJhdGVkLlxuICB0cmFja0NlbGwoX2k6IG51bWJlciwgY2VsbDogeyBlcG9jaERheTogbnVtYmVyIH0pOiBudW1iZXIge1xuICAgIHJldHVybiBjZWxsLmVwb2NoRGF5O1xuICB9XG4gIHRyYWNrUm93KF9pOiBudW1iZXIsIHJvdzogUm93KTogbnVtYmVyIHtcbiAgICByZXR1cm4gcm93LndlZWsuYWJzb2x1dGVXZWVrO1xuICB9XG4gIHNjcm9sbFRvRXBvY2hEYXkoZGF5OiBudW1iZXIsIG9wdGlvbnM6IFdrbHlKdW1wT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgaW50ZWdlcihkYXkpO1xuICAgIHRoaXMuYWRhcHRlci5lcG9jaERheVRvRGF0ZShkYXkpO1xuICAgIGRheSA9IE1hdGgubWF4KFxuICAgICAgdGhpcy5maXJzdFN1cHBvcnRlZERheSxcbiAgICAgIE1hdGgubWluKHRoaXMubGFzdFN1cHBvcnRlZERheSwgZGF5KSxcbiAgICApO1xuICAgIC8vIHBvc2l0aW9uIHJlbmRlcnMgc3luY2hyb25vdXNseTsgcHVibGlzaCB0aGUgdGFiIHN0b3AgYmVmb3JlIHRoYXQgcmVuZGVyLlxuICAgIGlmIChvcHRpb25zLmZvY3VzKSB0aGlzLmZvY3VzZWQgPSBkYXk7XG4gICAgdGhpcy5wb3NpdGlvbihkYXksIGZhbHNlLCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5zZWxlY3QpIHRoaXMuc2VsZWN0KGRheSk7XG4gICAgaWYgKG9wdGlvbnMuZm9jdXMpIHRoaXMuZm9jdXNEYXkoKTtcbiAgfVxuICBzY3JvbGxUb0Fic29sdXRlV2Vlayh3ZWVrOiBudW1iZXIsIG9wdGlvbnM6IFdrbHlKdW1wT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgLy8gQSBib3VuZGFyeSB3ZWVrIGNhbiBzdGFydCBiZWZvcmUgdGhlIGFkYXB0ZXIncyBmaXJzdCBzdXBwb3J0ZWQgZGF5LlxuICAgIGNvbnN0IGZpcnN0ID0gZmlyc3RFcG9jaERheU9mKHdlZWssIHRoaXMuZWZmZWN0aXZlT2Zmc2V0KTtcbiAgICB0aGlzLnNjcm9sbFRvRXBvY2hEYXkoXG4gICAgICB3ZWVrID09PSB0aGlzLmZpcnN0U3VwcG9ydGVkV2Vla1xuICAgICAgICA/IE1hdGgubWF4KGZpcnN0LCB0aGlzLmZpcnN0U3VwcG9ydGVkRGF5KVxuICAgICAgICA6IGZpcnN0LFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICB9XG4gIHNjcm9sbFRvQ2FsZW5kYXJEYXRlKFxuICAgIGRhdGU6IFdrbHlDYWxlbmRhckRhdGUsXG4gICAgb3B0aW9uczogV2tseUp1bXBPcHRpb25zID0ge30sXG4gICk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcG9jaERheSh0aGlzLmFkYXB0ZXIuZGF0ZVRvRXBvY2hEYXkoZGF0ZSksIG9wdGlvbnMpO1xuICB9XG4gIHNjcm9sbFRvVmFsdWUodmFsdWU6IHN0cmluZywgb3B0aW9uczogV2tseUp1bXBPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbFRvRXBvY2hEYXkoZGVjb2RlSXNvKHZhbHVlKS5lcG9jaERheSwgb3B0aW9ucyk7XG4gIH1cbiAgZm9jdXNEYXkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmJyb3dzZXIpIHJldHVybjtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRlc3Ryb3llZCkgcmV0dXJuO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICBjb25zdCBkYXkgPSB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAnW2RhdGEtZGF5PVwiJyArIHRoaXMuZm9jdXNlZCArICdcIl0nLFxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCJidXR0b246bm90KDpkaXNhYmxlZCksaW5wdXQ6bm90KDpkaXNhYmxlZClcIixcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAoZGF5IHx8IGZhbGxiYWNrKT8uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|