@wizco/fenixds-ngx 17.12.0 → 17.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/contracts/contracts.component.mjs +352 -0
- package/esm2022/lib/contracts/contracts.types.mjs +2 -0
- package/esm2022/lib/datepicker/datepicker.component.mjs +743 -0
- package/esm2022/lib/datepicker/datepicker.types.mjs +2 -0
- package/esm2022/lib/datepicker/datepicker.utils.mjs +201 -0
- package/esm2022/public-api.mjs +7 -1
- package/fesm2022/wizco-fenixds-ngx.mjs +1282 -1
- package/fesm2022/wizco-fenixds-ngx.mjs.map +1 -1
- package/lib/contracts/contracts.component.d.ts +157 -0
- package/lib/contracts/contracts.component.d.ts.map +1 -0
- package/lib/contracts/contracts.types.d.ts +51 -0
- package/lib/contracts/contracts.types.d.ts.map +1 -0
- package/lib/datepicker/datepicker.component.d.ts +118 -0
- package/lib/datepicker/datepicker.component.d.ts.map +1 -0
- package/lib/datepicker/datepicker.types.d.ts +10 -0
- package/lib/datepicker/datepicker.types.d.ts.map +1 -0
- package/lib/datepicker/datepicker.utils.d.ts +25 -0
- package/lib/datepicker/datepicker.utils.d.ts.map +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -0
- package/public-api.d.ts.map +1 -1
|
@@ -0,0 +1,743 @@
|
|
|
1
|
+
import { Component, EventEmitter, HostListener, Input, Output, ViewEncapsulation, forwardRef, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ReactiveFormsModule, } from '@angular/forms';
|
|
4
|
+
import { buildDisabledPredicate, clampToMinute, coerceDate, formatDate, isValidDate, parseDate, toDateOnly, toIsoDateKey, } from './datepicker.utils';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common";
|
|
7
|
+
export class DatepickerComponent {
|
|
8
|
+
el;
|
|
9
|
+
openedChange = new EventEmitter();
|
|
10
|
+
mode = 'single';
|
|
11
|
+
valueFormat = 'api';
|
|
12
|
+
inline = false;
|
|
13
|
+
label = ' ';
|
|
14
|
+
placeholder;
|
|
15
|
+
placeholderStart = 'Data inicial';
|
|
16
|
+
placeholderEnd = 'Data final';
|
|
17
|
+
labelStart = ' ';
|
|
18
|
+
labelEnd = ' ';
|
|
19
|
+
inputId = 'datepicker_' + Math.random().toString(36).substring(2);
|
|
20
|
+
inputName;
|
|
21
|
+
required = false;
|
|
22
|
+
readonly = false;
|
|
23
|
+
showError = false;
|
|
24
|
+
allowTyping = true;
|
|
25
|
+
autoClose = true;
|
|
26
|
+
showClear = true;
|
|
27
|
+
highlightToday = true;
|
|
28
|
+
disableFuture = false;
|
|
29
|
+
disablePast = false;
|
|
30
|
+
minDate;
|
|
31
|
+
maxDate;
|
|
32
|
+
disableWeekends = false;
|
|
33
|
+
disableHolidays = false;
|
|
34
|
+
holidays = [];
|
|
35
|
+
dateFilter;
|
|
36
|
+
locale = 'pt-BR';
|
|
37
|
+
weekStartsOn = 0;
|
|
38
|
+
displayFormat;
|
|
39
|
+
apiFormat;
|
|
40
|
+
isMobile = window.innerWidth <= 768;
|
|
41
|
+
isOpen = false;
|
|
42
|
+
view = 'day';
|
|
43
|
+
control = null;
|
|
44
|
+
disabled = false;
|
|
45
|
+
selected = null;
|
|
46
|
+
rangeStart = null;
|
|
47
|
+
rangeEnd = null;
|
|
48
|
+
activeMonth = toDateOnly(new Date());
|
|
49
|
+
activeYearPageStart = new Date().getFullYear() - 6;
|
|
50
|
+
inputValue = '';
|
|
51
|
+
timeValue = '00:00';
|
|
52
|
+
manualInputError = null;
|
|
53
|
+
onTouched = () => { };
|
|
54
|
+
propagateChange = () => { };
|
|
55
|
+
constructor(el) {
|
|
56
|
+
this.el = el;
|
|
57
|
+
}
|
|
58
|
+
ngOnInit() {
|
|
59
|
+
if (this.inline) {
|
|
60
|
+
this.view = this.mode === 'month' ? 'month' : 'day';
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
writeValue(obj) {
|
|
64
|
+
this.manualInputError = null;
|
|
65
|
+
if (this.mode === 'range') {
|
|
66
|
+
const range = this.coerceRange(obj);
|
|
67
|
+
this.rangeStart = range?.start ? toDateOnly(range.start) : null;
|
|
68
|
+
this.rangeEnd = range?.end ? toDateOnly(range.end) : null;
|
|
69
|
+
this.activeMonth = toDateOnly(this.rangeStart || this.rangeEnd || new Date());
|
|
70
|
+
this.syncInputText();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const date = this.coerceSingle(obj);
|
|
74
|
+
if (!date) {
|
|
75
|
+
this.selected = null;
|
|
76
|
+
this.inputValue = '';
|
|
77
|
+
if (this.mode === 'datetime')
|
|
78
|
+
this.timeValue = '00:00';
|
|
79
|
+
this.activeMonth = toDateOnly(new Date());
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (this.mode === 'month') {
|
|
83
|
+
this.selected = new Date(date.getFullYear(), date.getMonth(), 1);
|
|
84
|
+
}
|
|
85
|
+
else if (this.mode === 'datetime') {
|
|
86
|
+
this.selected = clampToMinute(date);
|
|
87
|
+
this.timeValue = `${String(this.selected.getHours()).padStart(2, '0')}:${String(this.selected.getMinutes()).padStart(2, '0')}`;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.selected = toDateOnly(date);
|
|
91
|
+
}
|
|
92
|
+
this.activeMonth = toDateOnly(this.selected);
|
|
93
|
+
this.syncInputText();
|
|
94
|
+
}
|
|
95
|
+
registerOnChange(fn) {
|
|
96
|
+
this.propagateChange = fn;
|
|
97
|
+
}
|
|
98
|
+
registerOnTouched(fn) {
|
|
99
|
+
this.onTouched = fn;
|
|
100
|
+
}
|
|
101
|
+
setDisabledState(isDisabled) {
|
|
102
|
+
this.disabled = isDisabled;
|
|
103
|
+
if (isDisabled)
|
|
104
|
+
this.close();
|
|
105
|
+
}
|
|
106
|
+
validate(control) {
|
|
107
|
+
this.control = control;
|
|
108
|
+
if (this.manualInputError) {
|
|
109
|
+
return { wcoDateInvalid: { reason: this.manualInputError } };
|
|
110
|
+
}
|
|
111
|
+
const isDisabled = this.buildIsDisabled();
|
|
112
|
+
if (this.mode === 'range') {
|
|
113
|
+
if (this.required && (!this.rangeStart || !this.rangeEnd)) {
|
|
114
|
+
return { required: true };
|
|
115
|
+
}
|
|
116
|
+
if (this.rangeStart && this.rangeEnd) {
|
|
117
|
+
if (this.rangeStart.getTime() > this.rangeEnd.getTime()) {
|
|
118
|
+
return { wcoDateRange: { reason: 'startAfterEnd' } };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (this.rangeStart) {
|
|
122
|
+
const result = isDisabled(this.rangeStart);
|
|
123
|
+
if (result.disabled) {
|
|
124
|
+
return {
|
|
125
|
+
wcoDateDisabled: { part: 'start', reason: result.reason },
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (this.rangeEnd) {
|
|
130
|
+
const result = isDisabled(this.rangeEnd);
|
|
131
|
+
if (result.disabled) {
|
|
132
|
+
return { wcoDateDisabled: { part: 'end', reason: result.reason } };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
if (this.required && !this.selected) {
|
|
138
|
+
return { required: true };
|
|
139
|
+
}
|
|
140
|
+
if (this.selected) {
|
|
141
|
+
const result = isDisabled(this.selected);
|
|
142
|
+
if (result.disabled)
|
|
143
|
+
return { wcoDateDisabled: { reason: result.reason } };
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
get hasError() {
|
|
148
|
+
if (this.showError)
|
|
149
|
+
return true;
|
|
150
|
+
return !!this.control && this.control.invalid && this.control.touched;
|
|
151
|
+
}
|
|
152
|
+
get canInteract() {
|
|
153
|
+
return !this.disabled && !this.readonly;
|
|
154
|
+
}
|
|
155
|
+
get resolvedPlaceholder() {
|
|
156
|
+
if (this.mode === 'range') {
|
|
157
|
+
return (this.placeholder ||
|
|
158
|
+
`${this.placeholderStart || 'Data inicial'} - ${this.placeholderEnd || 'Data final'}`);
|
|
159
|
+
}
|
|
160
|
+
return this.placeholder || this.resolvedDisplayFormat();
|
|
161
|
+
}
|
|
162
|
+
open() {
|
|
163
|
+
if (!this.canInteract)
|
|
164
|
+
return;
|
|
165
|
+
this.isOpen = true;
|
|
166
|
+
this.view = this.mode === 'month' ? 'month' : 'day';
|
|
167
|
+
this.activeYearPageStart = this.activeMonth.getFullYear() - 6;
|
|
168
|
+
this.openedChange.emit(true);
|
|
169
|
+
}
|
|
170
|
+
close() {
|
|
171
|
+
if (this.inline)
|
|
172
|
+
return;
|
|
173
|
+
this.isOpen = false;
|
|
174
|
+
this.openedChange.emit(false);
|
|
175
|
+
}
|
|
176
|
+
toggleOpen() {
|
|
177
|
+
if (this.isOpen)
|
|
178
|
+
this.close();
|
|
179
|
+
else
|
|
180
|
+
this.open();
|
|
181
|
+
}
|
|
182
|
+
onInputChange(value) {
|
|
183
|
+
this.inputValue = value;
|
|
184
|
+
if (!this.allowTyping)
|
|
185
|
+
return;
|
|
186
|
+
this.manualInputError = null;
|
|
187
|
+
}
|
|
188
|
+
onInputBlur() {
|
|
189
|
+
this.onTouched();
|
|
190
|
+
if (!this.allowTyping)
|
|
191
|
+
return;
|
|
192
|
+
if (this.mode === 'range') {
|
|
193
|
+
const parsed = this.parseRangeText(this.inputValue);
|
|
194
|
+
if (!parsed && this.inputValue.trim()) {
|
|
195
|
+
this.manualInputError = 'format';
|
|
196
|
+
this.emitValue();
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
this.manualInputError = null;
|
|
200
|
+
this.rangeStart = parsed?.start ? toDateOnly(parsed.start) : null;
|
|
201
|
+
this.rangeEnd = parsed?.end ? toDateOnly(parsed.end) : null;
|
|
202
|
+
if (this.rangeStart && this.rangeEnd) {
|
|
203
|
+
if (this.rangeStart.getTime() > this.rangeEnd.getTime()) {
|
|
204
|
+
const tmp = this.rangeStart;
|
|
205
|
+
this.rangeStart = this.rangeEnd;
|
|
206
|
+
this.rangeEnd = tmp;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const isDisabled = this.buildIsDisabled();
|
|
210
|
+
if (this.rangeStart && isDisabled(this.rangeStart).disabled) {
|
|
211
|
+
this.manualInputError = 'disabled';
|
|
212
|
+
}
|
|
213
|
+
if (this.rangeEnd && isDisabled(this.rangeEnd).disabled) {
|
|
214
|
+
this.manualInputError = 'disabled';
|
|
215
|
+
}
|
|
216
|
+
this.activeMonth = toDateOnly(this.rangeStart || this.rangeEnd || new Date());
|
|
217
|
+
this.syncInputText();
|
|
218
|
+
this.emitValue();
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const parsed = this.parseUserText(this.inputValue);
|
|
222
|
+
if (!parsed && this.inputValue.trim()) {
|
|
223
|
+
this.manualInputError = 'format';
|
|
224
|
+
this.emitValue();
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
this.manualInputError = null;
|
|
228
|
+
this.applySingleSelection(parsed);
|
|
229
|
+
}
|
|
230
|
+
onTimeChange(value) {
|
|
231
|
+
this.timeValue = value;
|
|
232
|
+
if (this.mode !== 'datetime')
|
|
233
|
+
return;
|
|
234
|
+
if (!this.selected)
|
|
235
|
+
return;
|
|
236
|
+
const match = /^(\d{2}):(\d{2})$/.exec(value);
|
|
237
|
+
if (!match)
|
|
238
|
+
return;
|
|
239
|
+
const hour = Number.parseInt(match[1], 10);
|
|
240
|
+
const minute = Number.parseInt(match[2], 10);
|
|
241
|
+
if (hour > 23 || minute > 59)
|
|
242
|
+
return;
|
|
243
|
+
this.selected = new Date(this.selected.getFullYear(), this.selected.getMonth(), this.selected.getDate(), hour, minute, 0, 0);
|
|
244
|
+
this.syncInputText();
|
|
245
|
+
this.emitValue();
|
|
246
|
+
}
|
|
247
|
+
selectDay(day) {
|
|
248
|
+
if (!this.canInteract)
|
|
249
|
+
return;
|
|
250
|
+
if (day.disabled)
|
|
251
|
+
return;
|
|
252
|
+
if (this.mode === 'range') {
|
|
253
|
+
if (!this.rangeStart || (this.rangeStart && this.rangeEnd)) {
|
|
254
|
+
this.rangeStart = toDateOnly(day.date);
|
|
255
|
+
this.rangeEnd = null;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
const end = toDateOnly(day.date);
|
|
259
|
+
if (end.getTime() < this.rangeStart.getTime()) {
|
|
260
|
+
this.rangeEnd = this.rangeStart;
|
|
261
|
+
this.rangeStart = end;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
this.rangeEnd = end;
|
|
265
|
+
}
|
|
266
|
+
if (this.autoClose)
|
|
267
|
+
this.close();
|
|
268
|
+
}
|
|
269
|
+
this.activeMonth = toDateOnly(this.rangeStart || day.date);
|
|
270
|
+
this.syncInputText();
|
|
271
|
+
this.emitValue();
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (this.mode === 'datetime') {
|
|
275
|
+
const match = /^(\d{2}):(\d{2})$/.exec(this.timeValue);
|
|
276
|
+
const hour = match ? Number.parseInt(match[1], 10) : 0;
|
|
277
|
+
const minute = match ? Number.parseInt(match[2], 10) : 0;
|
|
278
|
+
this.selected = new Date(day.date.getFullYear(), day.date.getMonth(), day.date.getDate(), hour, minute, 0, 0);
|
|
279
|
+
this.syncInputText();
|
|
280
|
+
this.emitValue();
|
|
281
|
+
if (this.autoClose)
|
|
282
|
+
this.close();
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
this.selected = toDateOnly(day.date);
|
|
286
|
+
this.activeMonth = toDateOnly(this.selected);
|
|
287
|
+
this.syncInputText();
|
|
288
|
+
this.emitValue();
|
|
289
|
+
if (this.autoClose)
|
|
290
|
+
this.close();
|
|
291
|
+
}
|
|
292
|
+
selectMonth(monthIndex) {
|
|
293
|
+
if (!this.canInteract)
|
|
294
|
+
return;
|
|
295
|
+
const candidate = new Date(this.activeMonth.getFullYear(), monthIndex, 1);
|
|
296
|
+
const isDisabled = this.buildIsDisabled();
|
|
297
|
+
if (isDisabled(candidate).disabled)
|
|
298
|
+
return;
|
|
299
|
+
if (this.mode === 'month') {
|
|
300
|
+
this.selected = candidate;
|
|
301
|
+
this.activeMonth = toDateOnly(candidate);
|
|
302
|
+
this.syncInputText();
|
|
303
|
+
this.emitValue();
|
|
304
|
+
if (this.autoClose)
|
|
305
|
+
this.close();
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
this.activeMonth = toDateOnly(candidate);
|
|
309
|
+
this.view = 'day';
|
|
310
|
+
}
|
|
311
|
+
selectYear(year) {
|
|
312
|
+
if (!this.canInteract)
|
|
313
|
+
return;
|
|
314
|
+
this.activeMonth = new Date(year, this.activeMonth.getMonth(), 1);
|
|
315
|
+
this.view = this.mode === 'month' ? 'month' : 'day';
|
|
316
|
+
}
|
|
317
|
+
prev() {
|
|
318
|
+
if (this.view === 'day') {
|
|
319
|
+
this.activeMonth = new Date(this.activeMonth.getFullYear(), this.activeMonth.getMonth() - 1, 1);
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
if (this.view === 'month') {
|
|
323
|
+
this.activeMonth = new Date(this.activeMonth.getFullYear() - 1, this.activeMonth.getMonth(), 1);
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
this.activeYearPageStart -= 12;
|
|
327
|
+
}
|
|
328
|
+
next() {
|
|
329
|
+
if (this.view === 'day') {
|
|
330
|
+
this.activeMonth = new Date(this.activeMonth.getFullYear(), this.activeMonth.getMonth() + 1, 1);
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
if (this.view === 'month') {
|
|
334
|
+
this.activeMonth = new Date(this.activeMonth.getFullYear() + 1, this.activeMonth.getMonth(), 1);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
this.activeYearPageStart += 12;
|
|
338
|
+
}
|
|
339
|
+
switchView() {
|
|
340
|
+
if (this.view === 'day') {
|
|
341
|
+
this.view = 'month';
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
if (this.view === 'month') {
|
|
345
|
+
this.view = 'year';
|
|
346
|
+
this.activeYearPageStart = this.activeMonth.getFullYear() - 6;
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
this.view = this.mode === 'month' ? 'month' : 'day';
|
|
350
|
+
}
|
|
351
|
+
get headerLabel() {
|
|
352
|
+
if (this.view === 'month' || this.view === 'year') {
|
|
353
|
+
return String(this.activeMonth.getFullYear());
|
|
354
|
+
}
|
|
355
|
+
const monthFormatter = new Intl.DateTimeFormat(this.locale, {
|
|
356
|
+
month: 'long',
|
|
357
|
+
year: 'numeric',
|
|
358
|
+
});
|
|
359
|
+
const label = monthFormatter.format(new Date(this.activeMonth.getFullYear(), this.activeMonth.getMonth(), 1));
|
|
360
|
+
return label.charAt(0).toUpperCase() + label.slice(1);
|
|
361
|
+
}
|
|
362
|
+
get weekdayLabels() {
|
|
363
|
+
const formatter = new Intl.DateTimeFormat(this.locale, { weekday: 'short' });
|
|
364
|
+
const base = new Date(2023, 0, 1); // Sunday
|
|
365
|
+
const labels = [];
|
|
366
|
+
for (let i = 0; i < 7; i++) {
|
|
367
|
+
const day = new Date(base.getFullYear(), base.getMonth(), base.getDate() + i);
|
|
368
|
+
labels.push(formatter.format(day));
|
|
369
|
+
}
|
|
370
|
+
if (this.weekStartsOn === 1) {
|
|
371
|
+
const sunday = labels.shift();
|
|
372
|
+
if (sunday)
|
|
373
|
+
labels.push(sunday);
|
|
374
|
+
}
|
|
375
|
+
return labels.map((label) => {
|
|
376
|
+
const clean = label.replace('.', '').trim();
|
|
377
|
+
const first = Array.from(clean)[0] ?? '';
|
|
378
|
+
return first ? first.toLocaleUpperCase(this.locale) : '';
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
get days() {
|
|
382
|
+
const year = this.activeMonth.getFullYear();
|
|
383
|
+
const month = this.activeMonth.getMonth();
|
|
384
|
+
const first = new Date(year, month, 1);
|
|
385
|
+
const firstDow = first.getDay();
|
|
386
|
+
const offset = this.weekStartsOn === 1 ? (firstDow === 0 ? 6 : firstDow - 1) : firstDow;
|
|
387
|
+
const start = new Date(year, month, 1 - offset);
|
|
388
|
+
const isDisabled = this.buildIsDisabled();
|
|
389
|
+
const todayKey = toIsoDateKey(new Date());
|
|
390
|
+
const cells = [];
|
|
391
|
+
for (let i = 0; i < 42; i++) {
|
|
392
|
+
const date = new Date(start.getFullYear(), start.getMonth(), start.getDate() + i);
|
|
393
|
+
const inMonth = date.getMonth() === month;
|
|
394
|
+
const key = toIsoDateKey(date);
|
|
395
|
+
const disabled = isDisabled(date).disabled;
|
|
396
|
+
const isToday = this.highlightToday && key === todayKey;
|
|
397
|
+
const selectedKey = this.selected ? toIsoDateKey(this.selected) : null;
|
|
398
|
+
const startKey = this.rangeStart ? toIsoDateKey(this.rangeStart) : null;
|
|
399
|
+
const endKey = this.rangeEnd ? toIsoDateKey(this.rangeEnd) : null;
|
|
400
|
+
const isSelected = selectedKey ? key === selectedKey : false;
|
|
401
|
+
const isRangeStart = startKey ? key === startKey : false;
|
|
402
|
+
const isRangeEnd = endKey ? key === endKey : false;
|
|
403
|
+
const isInRange = this.mode === 'range' && this.rangeStart && this.rangeEnd
|
|
404
|
+
? !disabled &&
|
|
405
|
+
key >= toIsoDateKey(this.rangeStart) &&
|
|
406
|
+
key <= toIsoDateKey(this.rangeEnd)
|
|
407
|
+
: false;
|
|
408
|
+
cells.push({
|
|
409
|
+
date,
|
|
410
|
+
label: date.getDate(),
|
|
411
|
+
inMonth,
|
|
412
|
+
disabled,
|
|
413
|
+
isToday,
|
|
414
|
+
isSelected,
|
|
415
|
+
isRangeStart,
|
|
416
|
+
isRangeEnd,
|
|
417
|
+
isInRange,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
return cells;
|
|
421
|
+
}
|
|
422
|
+
isCurrentYear(year) {
|
|
423
|
+
return year === new Date().getFullYear();
|
|
424
|
+
}
|
|
425
|
+
isSelectedYear(year) {
|
|
426
|
+
if (this.mode === 'range')
|
|
427
|
+
return false;
|
|
428
|
+
return !!this.selected && this.selected.getFullYear() === year;
|
|
429
|
+
}
|
|
430
|
+
isCurrentMonth(monthIndex) {
|
|
431
|
+
const now = new Date();
|
|
432
|
+
return (monthIndex === now.getMonth() && this.activeMonth.getFullYear() === now.getFullYear());
|
|
433
|
+
}
|
|
434
|
+
isSelectedMonth(monthIndex) {
|
|
435
|
+
if (this.mode === 'range')
|
|
436
|
+
return false;
|
|
437
|
+
return (!!this.selected &&
|
|
438
|
+
this.selected.getFullYear() === this.activeMonth.getFullYear() &&
|
|
439
|
+
this.selected.getMonth() === monthIndex);
|
|
440
|
+
}
|
|
441
|
+
get monthLabels() {
|
|
442
|
+
const formatter = new Intl.DateTimeFormat(this.locale, { month: 'short' });
|
|
443
|
+
const isDisabled = this.buildIsDisabled();
|
|
444
|
+
const year = this.activeMonth.getFullYear();
|
|
445
|
+
const items = [];
|
|
446
|
+
for (let i = 0; i < 12; i++) {
|
|
447
|
+
const date = new Date(year, i, 1);
|
|
448
|
+
const label = formatter.format(date).replace('.', '').trim();
|
|
449
|
+
items.push({
|
|
450
|
+
index: i,
|
|
451
|
+
label: label.toLocaleUpperCase(this.locale),
|
|
452
|
+
disabled: isDisabled(date).disabled,
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
return items;
|
|
456
|
+
}
|
|
457
|
+
get years() {
|
|
458
|
+
return Array.from({ length: 12 }, (_, i) => this.activeYearPageStart + i);
|
|
459
|
+
}
|
|
460
|
+
onDocumentClick(event) {
|
|
461
|
+
if (!this.isOpen)
|
|
462
|
+
return;
|
|
463
|
+
const target = event.target;
|
|
464
|
+
if (!target)
|
|
465
|
+
return;
|
|
466
|
+
if (!this.el.nativeElement.contains(target))
|
|
467
|
+
this.close();
|
|
468
|
+
}
|
|
469
|
+
onResize() {
|
|
470
|
+
this.isMobile = window.innerWidth <= 768;
|
|
471
|
+
}
|
|
472
|
+
getFixedContainingBlock(el) {
|
|
473
|
+
// In some environments (e.g. Storybook), an ancestor may have `transform`,
|
|
474
|
+
// which changes the containing block for `position: fixed`.
|
|
475
|
+
// When that happens, we must position relative to that ancestor.
|
|
476
|
+
let node = el.parentElement;
|
|
477
|
+
while (node && node !== document.documentElement) {
|
|
478
|
+
const style = window.getComputedStyle(node);
|
|
479
|
+
const hasTransform = style.transform && style.transform !== 'none';
|
|
480
|
+
const hasPerspective = style.perspective && style.perspective !== 'none';
|
|
481
|
+
const hasFilter = style.filter && style.filter !== 'none';
|
|
482
|
+
const hasContainPaint = style.contain?.includes('paint') ?? false;
|
|
483
|
+
if (hasTransform || hasPerspective || hasFilter || hasContainPaint) {
|
|
484
|
+
return node;
|
|
485
|
+
}
|
|
486
|
+
node = node.parentElement;
|
|
487
|
+
}
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
emitValue() {
|
|
491
|
+
this.propagateChange(this.buildOutgoingValue());
|
|
492
|
+
}
|
|
493
|
+
buildOutgoingValue() {
|
|
494
|
+
const resolvedApiFormat = this.resolvedApiFormat();
|
|
495
|
+
const resolvedDisplayFormat = this.resolvedDisplayFormat();
|
|
496
|
+
const format = this.valueFormat === 'api' ? resolvedApiFormat : resolvedDisplayFormat;
|
|
497
|
+
if (this.mode === 'range') {
|
|
498
|
+
const start = this.rangeStart
|
|
499
|
+
? formatDate(this.rangeStart, format)
|
|
500
|
+
: null;
|
|
501
|
+
const end = this.rangeEnd ? formatDate(this.rangeEnd, format) : null;
|
|
502
|
+
return { start, end };
|
|
503
|
+
}
|
|
504
|
+
if (!this.selected)
|
|
505
|
+
return null;
|
|
506
|
+
return formatDate(this.selected, format);
|
|
507
|
+
}
|
|
508
|
+
resolvedApiFormat() {
|
|
509
|
+
if (this.apiFormat)
|
|
510
|
+
return this.apiFormat;
|
|
511
|
+
if (this.mode === 'datetime')
|
|
512
|
+
return "yyyy-MM-dd'T'HH:mm";
|
|
513
|
+
if (this.mode === 'month')
|
|
514
|
+
return 'yyyy-MM';
|
|
515
|
+
return 'yyyy-MM-dd';
|
|
516
|
+
}
|
|
517
|
+
resolvedDisplayFormat() {
|
|
518
|
+
if (this.displayFormat)
|
|
519
|
+
return this.displayFormat;
|
|
520
|
+
if (this.mode === 'datetime')
|
|
521
|
+
return 'dd/MM/yyyy HH:mm';
|
|
522
|
+
if (this.mode === 'month')
|
|
523
|
+
return 'MM/yyyy';
|
|
524
|
+
return 'dd/MM/yyyy';
|
|
525
|
+
}
|
|
526
|
+
syncInputText() {
|
|
527
|
+
const display = this.resolvedDisplayFormat();
|
|
528
|
+
if (this.mode === 'range') {
|
|
529
|
+
const start = this.rangeStart ? formatDate(this.rangeStart, display) : '';
|
|
530
|
+
const end = this.rangeEnd ? formatDate(this.rangeEnd, display) : '';
|
|
531
|
+
this.inputValue = end ? `${start} - ${end}` : start;
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
this.inputValue = this.selected ? formatDate(this.selected, display) : '';
|
|
535
|
+
}
|
|
536
|
+
parseUserText(value) {
|
|
537
|
+
const display = this.resolvedDisplayFormat();
|
|
538
|
+
const api = this.resolvedApiFormat();
|
|
539
|
+
const trimmed = value.trim();
|
|
540
|
+
if (!trimmed)
|
|
541
|
+
return null;
|
|
542
|
+
const parsedDisplay = parseDate(trimmed, display);
|
|
543
|
+
const parsedApi = parsedDisplay ? null : parseDate(trimmed, api);
|
|
544
|
+
const parsed = parsedDisplay || parsedApi;
|
|
545
|
+
if (!parsed)
|
|
546
|
+
return null;
|
|
547
|
+
if (this.mode === 'month')
|
|
548
|
+
return new Date(parsed.getFullYear(), parsed.getMonth(), 1);
|
|
549
|
+
if (this.mode === 'datetime')
|
|
550
|
+
return clampToMinute(parsed);
|
|
551
|
+
return toDateOnly(parsed);
|
|
552
|
+
}
|
|
553
|
+
parseRangeText(value) {
|
|
554
|
+
const trimmed = value.trim();
|
|
555
|
+
if (!trimmed)
|
|
556
|
+
return null;
|
|
557
|
+
const separators = [' - ', ' até ', ' to '];
|
|
558
|
+
let sepFound = null;
|
|
559
|
+
for (const sep of separators) {
|
|
560
|
+
if (trimmed.includes(sep)) {
|
|
561
|
+
sepFound = sep;
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
if (!sepFound) {
|
|
566
|
+
const only = this.parseUserText(trimmed);
|
|
567
|
+
return { start: only, end: null };
|
|
568
|
+
}
|
|
569
|
+
const parts = trimmed.split(sepFound).map((p) => p.trim());
|
|
570
|
+
const startText = parts[0] || '';
|
|
571
|
+
const endText = parts.slice(1).join(sepFound).trim();
|
|
572
|
+
const start = startText ? this.parseUserText(startText) : null;
|
|
573
|
+
const end = endText ? this.parseUserText(endText) : null;
|
|
574
|
+
if (!start && !end)
|
|
575
|
+
return null;
|
|
576
|
+
return { start, end };
|
|
577
|
+
}
|
|
578
|
+
applySingleSelection(date) {
|
|
579
|
+
if (this.mode === 'range')
|
|
580
|
+
return;
|
|
581
|
+
if (!date) {
|
|
582
|
+
this.selected = null;
|
|
583
|
+
this.syncInputText();
|
|
584
|
+
this.emitValue();
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
const isDisabled = this.buildIsDisabled();
|
|
588
|
+
if (isDisabled(date).disabled) {
|
|
589
|
+
this.manualInputError = 'disabled';
|
|
590
|
+
this.emitValue();
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
this.manualInputError = null;
|
|
594
|
+
if (this.mode === 'month')
|
|
595
|
+
this.selected = new Date(date.getFullYear(), date.getMonth(), 1);
|
|
596
|
+
else if (this.mode === 'datetime')
|
|
597
|
+
this.selected = clampToMinute(date);
|
|
598
|
+
else
|
|
599
|
+
this.selected = toDateOnly(date);
|
|
600
|
+
this.activeMonth = toDateOnly(this.selected);
|
|
601
|
+
this.syncInputText();
|
|
602
|
+
this.emitValue();
|
|
603
|
+
}
|
|
604
|
+
coerceSingle(obj) {
|
|
605
|
+
if (obj === null || obj === undefined)
|
|
606
|
+
return null;
|
|
607
|
+
if (obj instanceof Date)
|
|
608
|
+
return isValidDate(obj) ? obj : null;
|
|
609
|
+
if (typeof obj === 'string')
|
|
610
|
+
return coerceDate(obj);
|
|
611
|
+
if (typeof obj === 'object' && 'start' in obj && 'end' in obj)
|
|
612
|
+
return null;
|
|
613
|
+
return null;
|
|
614
|
+
}
|
|
615
|
+
coerceRange(obj) {
|
|
616
|
+
if (!obj)
|
|
617
|
+
return null;
|
|
618
|
+
if (typeof obj !== 'object')
|
|
619
|
+
return null;
|
|
620
|
+
if (!('start' in obj) || !('end' in obj))
|
|
621
|
+
return null;
|
|
622
|
+
const start = coerceDate(obj.start);
|
|
623
|
+
const end = coerceDate(obj.end);
|
|
624
|
+
return { start, end };
|
|
625
|
+
}
|
|
626
|
+
buildIsDisabled() {
|
|
627
|
+
const min = coerceDate(this.minDate ?? null);
|
|
628
|
+
const max = coerceDate(this.maxDate ?? null);
|
|
629
|
+
const holidaySet = new Set();
|
|
630
|
+
for (const h of this.holidays || []) {
|
|
631
|
+
const d = coerceDate(h);
|
|
632
|
+
if (d)
|
|
633
|
+
holidaySet.add(toIsoDateKey(d));
|
|
634
|
+
}
|
|
635
|
+
return buildDisabledPredicate({
|
|
636
|
+
disableFuture: this.disableFuture,
|
|
637
|
+
disablePast: this.disablePast,
|
|
638
|
+
minDate: min,
|
|
639
|
+
maxDate: max,
|
|
640
|
+
disableWeekends: this.disableWeekends,
|
|
641
|
+
disableHolidays: this.disableHolidays,
|
|
642
|
+
holidaySet,
|
|
643
|
+
dateFilter: this.dateFilter || null,
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatepickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
647
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatepickerComponent, isStandalone: true, selector: "wco-datepicker", inputs: { mode: "mode", valueFormat: "valueFormat", inline: "inline", label: "label", placeholder: "placeholder", placeholderStart: "placeholderStart", placeholderEnd: "placeholderEnd", labelStart: "labelStart", labelEnd: "labelEnd", inputId: "inputId", inputName: "inputName", required: "required", readonly: "readonly", showError: "showError", allowTyping: "allowTyping", autoClose: "autoClose", showClear: "showClear", highlightToday: "highlightToday", disableFuture: "disableFuture", disablePast: "disablePast", minDate: "minDate", maxDate: "maxDate", disableWeekends: "disableWeekends", disableHolidays: "disableHolidays", holidays: "holidays", dateFilter: "dateFilter", locale: "locale", weekStartsOn: "weekStartsOn", displayFormat: "displayFormat", apiFormat: "apiFormat" }, outputs: { openedChange: "openedChange" }, host: { listeners: { "document:click": "onDocumentClick($event)", "window:resize": "onResize()" } }, providers: [
|
|
648
|
+
{
|
|
649
|
+
provide: NG_VALUE_ACCESSOR,
|
|
650
|
+
useExisting: forwardRef(() => DatepickerComponent),
|
|
651
|
+
multi: true,
|
|
652
|
+
},
|
|
653
|
+
{
|
|
654
|
+
provide: NG_VALIDATORS,
|
|
655
|
+
useExisting: DatepickerComponent,
|
|
656
|
+
multi: true,
|
|
657
|
+
},
|
|
658
|
+
], ngImport: i0, template: "<div\n class=\"wco-datepicker\"\n [class.wco-datepicker--open]=\"isOpen\"\n [class.wco-datepicker--isMobile]=\"isMobile\"\n>\n <ng-container *ngIf=\"mode !== 'range' && !inline\">\n <div\n class=\"form-field wco-datepicker__field\"\n [class.form-field--error]=\"hasError\"\n [class.form-field--readonly]=\"readonly\"\n >\n <input\n [id]=\"inputId\"\n [name]=\"inputName\"\n [attr.required]=\"required ? '' : null\"\n [placeholder]=\"resolvedPlaceholder\"\n [readOnly]=\"readonly || !allowTyping\"\n [disabled]=\"disabled\"\n [value]=\"inputValue\"\n (click)=\"open()\"\n (input)=\"onInputChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (keydown.enter)=\"$event.preventDefault(); onInputBlur()\"\n />\n <label [for]=\"inputId\">{{ label }}</label>\n\n <span\n class=\"material-icons-round wco-datepicker__suffix wco-datepicker__toggle\"\n (click)=\"toggleOpen()\"\n >calendar_today</span\n >\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"mode === 'range' && !inline\">\n <div\n class=\"form-field wco-datepicker__field\"\n [class.form-field--error]=\"hasError\"\n [class.form-field--readonly]=\"readonly\"\n >\n <input\n [id]=\"inputId\"\n [name]=\"inputName\"\n [attr.required]=\"required ? '' : null\"\n [placeholder]=\"resolvedPlaceholder\"\n [readOnly]=\"readonly || !allowTyping\"\n [disabled]=\"disabled\"\n [value]=\"inputValue\"\n (click)=\"open()\"\n (input)=\"onInputChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (keydown.enter)=\"$event.preventDefault(); onInputBlur()\"\n />\n <label [for]=\"inputId\">{{ label }}</label>\n <span\n class=\"material-icons-round wco-datepicker__suffix wco-datepicker__toggle\"\n (click)=\"toggleOpen()\"\n >calendar_today</span\n >\n </div>\n </ng-container>\n\n <div\n class=\"wco-datepicker__box\"\n [class.wco-datepicker__box--open]=\"isOpen || inline\"\n [class.wco-datepicker__box--inline]=\"inline\"\n >\n <div class=\"wco-datepicker__panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"wco-datepicker__header\">\n <button\n type=\"button\"\n class=\"wco-datepicker__title\"\n (click)=\"switchView()\"\n [disabled]=\"!canInteract\"\n >\n {{ headerLabel }}\n <span class=\"material-icons text-primary-600\">{{\n view === \"year\" ? \"arrow_drop_up\" : \"arrow_drop_down\"\n }}</span>\n </button>\n\n <button\n type=\"button\"\n class=\"wco-datepicker__nav\"\n (click)=\"prev()\"\n [disabled]=\"!canInteract\"\n >\n <span class=\"material-icons text-primary-600\">chevron_left</span>\n </button>\n\n <button\n type=\"button\"\n class=\"wco-datepicker__nav\"\n (click)=\"next()\"\n [disabled]=\"!canInteract\"\n >\n <span class=\"material-icons text-primary-600\">chevron_right</span>\n </button>\n </div>\n\n <div class=\"wco-datepicker__content\" *ngIf=\"view === 'day'\">\n <div class=\"wco-datepicker__weekdays\">\n <span *ngFor=\"let w of weekdayLabels\">{{ w }}</span>\n </div>\n <div class=\"wco-datepicker__grid\">\n <button\n type=\"button\"\n class=\"wco-datepicker__day\"\n *ngFor=\"let d of days\"\n [class.wco-datepicker__day--muted]=\"!d.inMonth\"\n [class.wco-datepicker__day--today]=\"d.isToday\"\n [class.wco-datepicker__day--selected]=\"d.isSelected\"\n [class.wco-datepicker__day--range]=\"d.isInRange\"\n [class.wco-datepicker__day--rangeStart]=\"d.isRangeStart\"\n [class.wco-datepicker__day--rangeEnd]=\"d.isRangeEnd\"\n [disabled]=\"d.disabled || !canInteract\"\n (click)=\"selectDay(d)\"\n >\n {{ d.label }}\n </button>\n </div>\n </div>\n\n <div class=\"wco-datepicker__content\" *ngIf=\"view === 'month'\">\n <div class=\"wco-datepicker__months\">\n <button\n type=\"button\"\n class=\"wco-datepicker__month\"\n *ngFor=\"let m of monthLabels\"\n [disabled]=\"m.disabled || !canInteract\"\n [class.wco-datepicker__month--active]=\"\n m.index === activeMonth.getMonth()\n \"\n [class.wco-datepicker__month--current]=\"isCurrentMonth(m.index)\"\n [class.wco-datepicker__month--selected]=\"isSelectedMonth(m.index)\"\n (click)=\"selectMonth(m.index)\"\n >\n {{ m.label }}\n </button>\n </div>\n </div>\n\n <div class=\"wco-datepicker__content\" *ngIf=\"view === 'year'\">\n <div class=\"wco-datepicker__years\">\n <button\n type=\"button\"\n class=\"wco-datepicker__year\"\n *ngFor=\"let y of years\"\n [class.wco-datepicker__year--active]=\"\n y === activeMonth.getFullYear()\n \"\n [class.wco-datepicker__year--current]=\"isCurrentYear(y)\"\n [class.wco-datepicker__year--selected]=\"isSelectedYear(y)\"\n [disabled]=\"!canInteract\"\n (click)=\"selectYear(y)\"\n >\n {{ y }}\n </button>\n </div>\n </div>\n\n <div class=\"wco-datepicker__time\" *ngIf=\"mode === 'datetime'\">\n <label class=\"wco-datepicker__timeLabel\">Hora</label>\n <input\n type=\"time\"\n class=\"wco-datepicker__timeInput\"\n [disabled]=\"disabled || readonly\"\n [value]=\"timeValue\"\n (input)=\"onTimeChange($any($event.target).value)\"\n />\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%}.wco-datepicker{width:100%;position:relative;display:inline-block;--wco-datepicker-radius: var(--wco-radius-md, 8px);--wco-datepicker-shadow: var( --wco-shadow-level-1, 0px 2px 16px rgba(0, 0, 0, .2) );--wco-datepicker-bg: var(--wco-color-neutral-50, #fff);--wco-datepicker-border: 1px solid var(--wco-color-neutral-100, #e9ebec);--wco-datepicker-muted: var(--wco-color-neutral-500, #8d9399);--wco-datepicker-text: var(--wco-color-neutral-900, #080809);--wco-datepicker-primary: var(--wco-color-primary-600, #bf5600);--wco-datepicker-primary-weak: var(--wco-color-primary-50, #ffb578);--wco-datepicker-hover: var(--wco-color-neutral-100, #e9ebec)}.wco-datepicker .wco-datepicker__suffix{cursor:pointer;-webkit-user-select:none;user-select:none}.wco-datepicker .wco-datepicker__toggle{transition:transform .15s ease-in-out;color:var(--wco-color-primary-600)}.wco-datepicker--open .wco-datepicker__toggle{transform:rotate(180deg)}.wco-datepicker .wco-datepicker__box{position:absolute;max-width:270px;width:var(--wco-datepicker-overlay-width, 320px);z-index:2147483647;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s ease-in-out,transform .12s ease-in-out;transform:translateY(-6px)}.wco-datepicker .wco-datepicker__box--open{opacity:1;visibility:visible;pointer-events:all;transform:translateY(0)}.wco-datepicker--isMobile .wco-datepicker__box{position:absolute;width:100%;padding:var(--wco-spacing-nano, 8px)}.wco-datepicker .wco-datepicker__box--inline{position:static;padding:0;transform:none;transition:none}.wco-datepicker .wco-datepicker__panel{background:var(--wco-datepicker-bg);border:var(--wco-datepicker-border);border-radius:var(--wco-datepicker-radius);box-shadow:var(--wco-datepicker-shadow);padding:var(--wco-spacing-nano, 8px)}.wco-datepicker .wco-datepicker__header{display:grid;grid-template-columns:1fr 40px 40px;gap:var(--wco-spacing-quark, 4px);align-items:center;margin-bottom:var(--wco-spacing-nano, 8px)}.wco-datepicker .wco-datepicker__nav{width:40px;height:40px;border:none;background:transparent;cursor:pointer;color:var(--wco-datepicker-text);display:flex;justify-content:center;align-items:center}.wco-datepicker .wco-datepicker__nav:hover:not(:disabled){background:var(--wco-datepicker-hover)}.wco-datepicker .wco-datepicker__nav:disabled{cursor:not-allowed;opacity:.6}.wco-datepicker .wco-datepicker__title{border:none;background:transparent;cursor:pointer;display:inline-flex;justify-content:flex-start;align-items:center;gap:var(--wco-spacing-quark, 4px);font-family:var(--wco-font-family);font-size:var(--wco-font-size-xs, 16px);color:var(--wco-datepicker-text);padding:var(--wco-spacing-quark, 4px) var(--wco-spacing-nano, 8px)}.wco-datepicker .wco-datepicker__title:hover:not(:disabled){background:var(--wco-datepicker-hover)}.wco-datepicker .wco-datepicker__title:disabled{cursor:not-allowed;opacity:.6}.wco-datepicker .wco-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:0;padding:0 var(--wco-spacing-quark, 4px);margin-bottom:var(--wco-spacing-quark, 4px);color:var(--wco-datepicker-muted);font-size:var(--wco-font-size-xxxs, 12px);text-align:center;-webkit-user-select:none;user-select:none}.wco-datepicker .wco-datepicker__weekdays>span{width:36px;justify-self:center}.wco-datepicker .wco-datepicker__grid{display:grid;grid-template-columns:repeat(7,1fr);gap:0}.wco-datepicker .wco-datepicker__day{width:36px;height:36px;justify-self:center;position:relative;isolation:isolate;border-radius:999px;border:1px solid transparent;background:transparent;cursor:pointer;font-family:var(--wco-font-family);font-size:var(--wco-font-size-xxxs, 12px);color:var(--wco-datepicker-text)}.wco-datepicker .wco-datepicker__day:hover:not(:disabled){background:var(--wco-datepicker-primary-weak);color:var(--wco-datepicker-primary)}.wco-datepicker .wco-datepicker__day:disabled{cursor:not-allowed;opacity:.35;background:transparent}.wco-datepicker .wco-datepicker__day--muted{color:var(--wco-datepicker-muted)}.wco-datepicker .wco-datepicker__day--today{border-color:var(--wco-datepicker-text)}.wco-datepicker .wco-datepicker__day--selected{background:var(--wco-datepicker-primary);border-color:var(--wco-datepicker-primary);color:var(--wco-color-primary-text, #fff)}.wco-datepicker .wco-datepicker__day--range{background:var(--wco-datepicker-primary-weak);color:var(--wco-datepicker-primary)}.wco-datepicker .wco-datepicker__day--range:not(.wco-datepicker .wco-datepicker__day--rangeStart):not(.wco-datepicker .wco-datepicker__day--rangeEnd){border-radius:0}.wco-datepicker .wco-datepicker__day--rangeStart,.wco-datepicker .wco-datepicker__day--rangeEnd{z-index:5;border-radius:999px;background:var(--wco-datepicker-primary);border-color:var(--wco-datepicker-primary);color:var(--wco-color-primary-text, #fff)}.wco-datepicker .wco-datepicker__months,.wco-datepicker .wco-datepicker__years{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--wco-spacing-quark, 4px)}.wco-datepicker .wco-datepicker__month,.wco-datepicker .wco-datepicker__year{height:26px;border-radius:999px;border:1px solid transparent;background:transparent;cursor:pointer;display:inline-flex;align-items:center;justify-content:flex-start;padding:0 var(--wco-spacing-nano, 8px);width:max-content;justify-self:flex-start;font-family:var(--wco-font-family);font-size:var(--wco-font-size-xxxs, 12px);color:var(--wco-datepicker-text);text-align:left}.wco-datepicker .wco-datepicker__month:hover:not(:disabled),.wco-datepicker .wco-datepicker__year:hover:not(:disabled){background:var(--wco-datepicker-primary-weak);color:var(--wco-datepicker-primary)}.wco-datepicker .wco-datepicker__month:disabled,.wco-datepicker .wco-datepicker__year:disabled{cursor:not-allowed;opacity:.35;background:transparent}.wco-datepicker .wco-datepicker__month--active,.wco-datepicker .wco-datepicker__year--active{background:transparent;border-color:var(--wco-datepicker-text);font-weight:600}.wco-datepicker .wco-datepicker__month--current,.wco-datepicker .wco-datepicker__year--current{border-color:var(--wco-datepicker-text)}.wco-datepicker .wco-datepicker__month--selected,.wco-datepicker .wco-datepicker__year--selected{background:var(--wco-datepicker-primary);border-color:var(--wco-datepicker-primary);color:var(--wco-color-primary-text, #fff);font-weight:600}.wco-datepicker .wco-datepicker__time{margin-top:var(--wco-spacing-nano, 8px);display:grid;grid-template-columns:1fr auto;gap:var(--wco-spacing-nano, 8px);align-items:center}.wco-datepicker .wco-datepicker__timeLabel{font-family:var(--wco-font-family);font-size:var(--wco-font-size-xxxs, 12px);color:var(--wco-datepicker-muted)}.wco-datepicker .wco-datepicker__timeInput{border:var(--wco-datepicker-border);border-radius:999px;padding:var(--wco-spacing-quark, 4px) var(--wco-spacing-nano, 8px);font-family:var(--wco-font-family);font-size:var(--wco-font-size-xxs, 14px)}.wco-datepicker .wco-datepicker__actions{margin-top:var(--wco-spacing-nano, 8px);display:flex;justify-content:space-between;gap:var(--wco-spacing-nano, 8px)}.wco-datepicker .wco-datepicker__action{border:none;background:transparent;cursor:pointer;font-family:var(--wco-font-family);font-size:var(--wco-font-size-xxs, 14px);color:var(--wco-datepicker-primary);padding:var(--wco-spacing-quark, 4px) var(--wco-spacing-nano, 8px);border-radius:999px}.wco-datepicker .wco-datepicker__action:hover:not(:disabled){background:var(--wco-datepicker-hover)}.wco-datepicker .wco-datepicker__action:disabled{cursor:not-allowed;opacity:.6}.wco-datepicker input[readonly]+label+.material-icons-round,.wco-datepicker input:disabled+label+.material-icons-round{cursor:pointer;color:var(--wco-color-neutral-300)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: FormsModule }], encapsulation: i0.ViewEncapsulation.None });
|
|
659
|
+
}
|
|
660
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatepickerComponent, decorators: [{
|
|
661
|
+
type: Component,
|
|
662
|
+
args: [{ selector: 'wco-datepicker', standalone: true, imports: [CommonModule, ReactiveFormsModule, FormsModule], encapsulation: ViewEncapsulation.None, providers: [
|
|
663
|
+
{
|
|
664
|
+
provide: NG_VALUE_ACCESSOR,
|
|
665
|
+
useExisting: forwardRef(() => DatepickerComponent),
|
|
666
|
+
multi: true,
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
provide: NG_VALIDATORS,
|
|
670
|
+
useExisting: DatepickerComponent,
|
|
671
|
+
multi: true,
|
|
672
|
+
},
|
|
673
|
+
], template: "<div\n class=\"wco-datepicker\"\n [class.wco-datepicker--open]=\"isOpen\"\n [class.wco-datepicker--isMobile]=\"isMobile\"\n>\n <ng-container *ngIf=\"mode !== 'range' && !inline\">\n <div\n class=\"form-field wco-datepicker__field\"\n [class.form-field--error]=\"hasError\"\n [class.form-field--readonly]=\"readonly\"\n >\n <input\n [id]=\"inputId\"\n [name]=\"inputName\"\n [attr.required]=\"required ? '' : null\"\n [placeholder]=\"resolvedPlaceholder\"\n [readOnly]=\"readonly || !allowTyping\"\n [disabled]=\"disabled\"\n [value]=\"inputValue\"\n (click)=\"open()\"\n (input)=\"onInputChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (keydown.enter)=\"$event.preventDefault(); onInputBlur()\"\n />\n <label [for]=\"inputId\">{{ label }}</label>\n\n <span\n class=\"material-icons-round wco-datepicker__suffix wco-datepicker__toggle\"\n (click)=\"toggleOpen()\"\n >calendar_today</span\n >\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"mode === 'range' && !inline\">\n <div\n class=\"form-field wco-datepicker__field\"\n [class.form-field--error]=\"hasError\"\n [class.form-field--readonly]=\"readonly\"\n >\n <input\n [id]=\"inputId\"\n [name]=\"inputName\"\n [attr.required]=\"required ? '' : null\"\n [placeholder]=\"resolvedPlaceholder\"\n [readOnly]=\"readonly || !allowTyping\"\n [disabled]=\"disabled\"\n [value]=\"inputValue\"\n (click)=\"open()\"\n (input)=\"onInputChange($any($event.target).value)\"\n (blur)=\"onInputBlur()\"\n (keydown.enter)=\"$event.preventDefault(); onInputBlur()\"\n />\n <label [for]=\"inputId\">{{ label }}</label>\n <span\n class=\"material-icons-round wco-datepicker__suffix wco-datepicker__toggle\"\n (click)=\"toggleOpen()\"\n >calendar_today</span\n >\n </div>\n </ng-container>\n\n <div\n class=\"wco-datepicker__box\"\n [class.wco-datepicker__box--open]=\"isOpen || inline\"\n [class.wco-datepicker__box--inline]=\"inline\"\n >\n <div class=\"wco-datepicker__panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"wco-datepicker__header\">\n <button\n type=\"button\"\n class=\"wco-datepicker__title\"\n (click)=\"switchView()\"\n [disabled]=\"!canInteract\"\n >\n {{ headerLabel }}\n <span class=\"material-icons text-primary-600\">{{\n view === \"year\" ? \"arrow_drop_up\" : \"arrow_drop_down\"\n }}</span>\n </button>\n\n <button\n type=\"button\"\n class=\"wco-datepicker__nav\"\n (click)=\"prev()\"\n [disabled]=\"!canInteract\"\n >\n <span class=\"material-icons text-primary-600\">chevron_left</span>\n </button>\n\n <button\n type=\"button\"\n class=\"wco-datepicker__nav\"\n (click)=\"next()\"\n [disabled]=\"!canInteract\"\n >\n <span class=\"material-icons text-primary-600\">chevron_right</span>\n </button>\n </div>\n\n <div class=\"wco-datepicker__content\" *ngIf=\"view === 'day'\">\n <div class=\"wco-datepicker__weekdays\">\n <span *ngFor=\"let w of weekdayLabels\">{{ w }}</span>\n </div>\n <div class=\"wco-datepicker__grid\">\n <button\n type=\"button\"\n class=\"wco-datepicker__day\"\n *ngFor=\"let d of days\"\n [class.wco-datepicker__day--muted]=\"!d.inMonth\"\n [class.wco-datepicker__day--today]=\"d.isToday\"\n [class.wco-datepicker__day--selected]=\"d.isSelected\"\n [class.wco-datepicker__day--range]=\"d.isInRange\"\n [class.wco-datepicker__day--rangeStart]=\"d.isRangeStart\"\n [class.wco-datepicker__day--rangeEnd]=\"d.isRangeEnd\"\n [disabled]=\"d.disabled || !canInteract\"\n (click)=\"selectDay(d)\"\n >\n {{ d.label }}\n </button>\n </div>\n </div>\n\n <div class=\"wco-datepicker__content\" *ngIf=\"view === 'month'\">\n <div class=\"wco-datepicker__months\">\n <button\n type=\"button\"\n class=\"wco-datepicker__month\"\n *ngFor=\"let m of monthLabels\"\n [disabled]=\"m.disabled || !canInteract\"\n [class.wco-datepicker__month--active]=\"\n m.index === activeMonth.getMonth()\n \"\n [class.wco-datepicker__month--current]=\"isCurrentMonth(m.index)\"\n [class.wco-datepicker__month--selected]=\"isSelectedMonth(m.index)\"\n (click)=\"selectMonth(m.index)\"\n >\n {{ m.label }}\n </button>\n </div>\n </div>\n\n <div class=\"wco-datepicker__content\" *ngIf=\"view === 'year'\">\n <div class=\"wco-datepicker__years\">\n <button\n type=\"button\"\n class=\"wco-datepicker__year\"\n *ngFor=\"let y of years\"\n [class.wco-datepicker__year--active]=\"\n y === activeMonth.getFullYear()\n \"\n [class.wco-datepicker__year--current]=\"isCurrentYear(y)\"\n [class.wco-datepicker__year--selected]=\"isSelectedYear(y)\"\n [disabled]=\"!canInteract\"\n (click)=\"selectYear(y)\"\n >\n {{ y }}\n </button>\n </div>\n </div>\n\n <div class=\"wco-datepicker__time\" *ngIf=\"mode === 'datetime'\">\n <label class=\"wco-datepicker__timeLabel\">Hora</label>\n <input\n type=\"time\"\n class=\"wco-datepicker__timeInput\"\n [disabled]=\"disabled || readonly\"\n [value]=\"timeValue\"\n (input)=\"onTimeChange($any($event.target).value)\"\n />\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;width:100%}.wco-datepicker{width:100%;position:relative;display:inline-block;--wco-datepicker-radius: var(--wco-radius-md, 8px);--wco-datepicker-shadow: var( --wco-shadow-level-1, 0px 2px 16px rgba(0, 0, 0, .2) );--wco-datepicker-bg: var(--wco-color-neutral-50, #fff);--wco-datepicker-border: 1px solid var(--wco-color-neutral-100, #e9ebec);--wco-datepicker-muted: var(--wco-color-neutral-500, #8d9399);--wco-datepicker-text: var(--wco-color-neutral-900, #080809);--wco-datepicker-primary: var(--wco-color-primary-600, #bf5600);--wco-datepicker-primary-weak: var(--wco-color-primary-50, #ffb578);--wco-datepicker-hover: var(--wco-color-neutral-100, #e9ebec)}.wco-datepicker .wco-datepicker__suffix{cursor:pointer;-webkit-user-select:none;user-select:none}.wco-datepicker .wco-datepicker__toggle{transition:transform .15s ease-in-out;color:var(--wco-color-primary-600)}.wco-datepicker--open .wco-datepicker__toggle{transform:rotate(180deg)}.wco-datepicker .wco-datepicker__box{position:absolute;max-width:270px;width:var(--wco-datepicker-overlay-width, 320px);z-index:2147483647;opacity:0;visibility:hidden;pointer-events:none;transition:opacity .12s ease-in-out,transform .12s ease-in-out;transform:translateY(-6px)}.wco-datepicker .wco-datepicker__box--open{opacity:1;visibility:visible;pointer-events:all;transform:translateY(0)}.wco-datepicker--isMobile .wco-datepicker__box{position:absolute;width:100%;padding:var(--wco-spacing-nano, 8px)}.wco-datepicker .wco-datepicker__box--inline{position:static;padding:0;transform:none;transition:none}.wco-datepicker .wco-datepicker__panel{background:var(--wco-datepicker-bg);border:var(--wco-datepicker-border);border-radius:var(--wco-datepicker-radius);box-shadow:var(--wco-datepicker-shadow);padding:var(--wco-spacing-nano, 8px)}.wco-datepicker .wco-datepicker__header{display:grid;grid-template-columns:1fr 40px 40px;gap:var(--wco-spacing-quark, 4px);align-items:center;margin-bottom:var(--wco-spacing-nano, 8px)}.wco-datepicker .wco-datepicker__nav{width:40px;height:40px;border:none;background:transparent;cursor:pointer;color:var(--wco-datepicker-text);display:flex;justify-content:center;align-items:center}.wco-datepicker .wco-datepicker__nav:hover:not(:disabled){background:var(--wco-datepicker-hover)}.wco-datepicker .wco-datepicker__nav:disabled{cursor:not-allowed;opacity:.6}.wco-datepicker .wco-datepicker__title{border:none;background:transparent;cursor:pointer;display:inline-flex;justify-content:flex-start;align-items:center;gap:var(--wco-spacing-quark, 4px);font-family:var(--wco-font-family);font-size:var(--wco-font-size-xs, 16px);color:var(--wco-datepicker-text);padding:var(--wco-spacing-quark, 4px) var(--wco-spacing-nano, 8px)}.wco-datepicker .wco-datepicker__title:hover:not(:disabled){background:var(--wco-datepicker-hover)}.wco-datepicker .wco-datepicker__title:disabled{cursor:not-allowed;opacity:.6}.wco-datepicker .wco-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:0;padding:0 var(--wco-spacing-quark, 4px);margin-bottom:var(--wco-spacing-quark, 4px);color:var(--wco-datepicker-muted);font-size:var(--wco-font-size-xxxs, 12px);text-align:center;-webkit-user-select:none;user-select:none}.wco-datepicker .wco-datepicker__weekdays>span{width:36px;justify-self:center}.wco-datepicker .wco-datepicker__grid{display:grid;grid-template-columns:repeat(7,1fr);gap:0}.wco-datepicker .wco-datepicker__day{width:36px;height:36px;justify-self:center;position:relative;isolation:isolate;border-radius:999px;border:1px solid transparent;background:transparent;cursor:pointer;font-family:var(--wco-font-family);font-size:var(--wco-font-size-xxxs, 12px);color:var(--wco-datepicker-text)}.wco-datepicker .wco-datepicker__day:hover:not(:disabled){background:var(--wco-datepicker-primary-weak);color:var(--wco-datepicker-primary)}.wco-datepicker .wco-datepicker__day:disabled{cursor:not-allowed;opacity:.35;background:transparent}.wco-datepicker .wco-datepicker__day--muted{color:var(--wco-datepicker-muted)}.wco-datepicker .wco-datepicker__day--today{border-color:var(--wco-datepicker-text)}.wco-datepicker .wco-datepicker__day--selected{background:var(--wco-datepicker-primary);border-color:var(--wco-datepicker-primary);color:var(--wco-color-primary-text, #fff)}.wco-datepicker .wco-datepicker__day--range{background:var(--wco-datepicker-primary-weak);color:var(--wco-datepicker-primary)}.wco-datepicker .wco-datepicker__day--range:not(.wco-datepicker .wco-datepicker__day--rangeStart):not(.wco-datepicker .wco-datepicker__day--rangeEnd){border-radius:0}.wco-datepicker .wco-datepicker__day--rangeStart,.wco-datepicker .wco-datepicker__day--rangeEnd{z-index:5;border-radius:999px;background:var(--wco-datepicker-primary);border-color:var(--wco-datepicker-primary);color:var(--wco-color-primary-text, #fff)}.wco-datepicker .wco-datepicker__months,.wco-datepicker .wco-datepicker__years{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--wco-spacing-quark, 4px)}.wco-datepicker .wco-datepicker__month,.wco-datepicker .wco-datepicker__year{height:26px;border-radius:999px;border:1px solid transparent;background:transparent;cursor:pointer;display:inline-flex;align-items:center;justify-content:flex-start;padding:0 var(--wco-spacing-nano, 8px);width:max-content;justify-self:flex-start;font-family:var(--wco-font-family);font-size:var(--wco-font-size-xxxs, 12px);color:var(--wco-datepicker-text);text-align:left}.wco-datepicker .wco-datepicker__month:hover:not(:disabled),.wco-datepicker .wco-datepicker__year:hover:not(:disabled){background:var(--wco-datepicker-primary-weak);color:var(--wco-datepicker-primary)}.wco-datepicker .wco-datepicker__month:disabled,.wco-datepicker .wco-datepicker__year:disabled{cursor:not-allowed;opacity:.35;background:transparent}.wco-datepicker .wco-datepicker__month--active,.wco-datepicker .wco-datepicker__year--active{background:transparent;border-color:var(--wco-datepicker-text);font-weight:600}.wco-datepicker .wco-datepicker__month--current,.wco-datepicker .wco-datepicker__year--current{border-color:var(--wco-datepicker-text)}.wco-datepicker .wco-datepicker__month--selected,.wco-datepicker .wco-datepicker__year--selected{background:var(--wco-datepicker-primary);border-color:var(--wco-datepicker-primary);color:var(--wco-color-primary-text, #fff);font-weight:600}.wco-datepicker .wco-datepicker__time{margin-top:var(--wco-spacing-nano, 8px);display:grid;grid-template-columns:1fr auto;gap:var(--wco-spacing-nano, 8px);align-items:center}.wco-datepicker .wco-datepicker__timeLabel{font-family:var(--wco-font-family);font-size:var(--wco-font-size-xxxs, 12px);color:var(--wco-datepicker-muted)}.wco-datepicker .wco-datepicker__timeInput{border:var(--wco-datepicker-border);border-radius:999px;padding:var(--wco-spacing-quark, 4px) var(--wco-spacing-nano, 8px);font-family:var(--wco-font-family);font-size:var(--wco-font-size-xxs, 14px)}.wco-datepicker .wco-datepicker__actions{margin-top:var(--wco-spacing-nano, 8px);display:flex;justify-content:space-between;gap:var(--wco-spacing-nano, 8px)}.wco-datepicker .wco-datepicker__action{border:none;background:transparent;cursor:pointer;font-family:var(--wco-font-family);font-size:var(--wco-font-size-xxs, 14px);color:var(--wco-datepicker-primary);padding:var(--wco-spacing-quark, 4px) var(--wco-spacing-nano, 8px);border-radius:999px}.wco-datepicker .wco-datepicker__action:hover:not(:disabled){background:var(--wco-datepicker-hover)}.wco-datepicker .wco-datepicker__action:disabled{cursor:not-allowed;opacity:.6}.wco-datepicker input[readonly]+label+.material-icons-round,.wco-datepicker input:disabled+label+.material-icons-round{cursor:pointer;color:var(--wco-color-neutral-300)}\n"] }]
|
|
674
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { openedChange: [{
|
|
675
|
+
type: Output
|
|
676
|
+
}], mode: [{
|
|
677
|
+
type: Input
|
|
678
|
+
}], valueFormat: [{
|
|
679
|
+
type: Input
|
|
680
|
+
}], inline: [{
|
|
681
|
+
type: Input
|
|
682
|
+
}], label: [{
|
|
683
|
+
type: Input
|
|
684
|
+
}], placeholder: [{
|
|
685
|
+
type: Input
|
|
686
|
+
}], placeholderStart: [{
|
|
687
|
+
type: Input
|
|
688
|
+
}], placeholderEnd: [{
|
|
689
|
+
type: Input
|
|
690
|
+
}], labelStart: [{
|
|
691
|
+
type: Input
|
|
692
|
+
}], labelEnd: [{
|
|
693
|
+
type: Input
|
|
694
|
+
}], inputId: [{
|
|
695
|
+
type: Input
|
|
696
|
+
}], inputName: [{
|
|
697
|
+
type: Input
|
|
698
|
+
}], required: [{
|
|
699
|
+
type: Input
|
|
700
|
+
}], readonly: [{
|
|
701
|
+
type: Input
|
|
702
|
+
}], showError: [{
|
|
703
|
+
type: Input
|
|
704
|
+
}], allowTyping: [{
|
|
705
|
+
type: Input
|
|
706
|
+
}], autoClose: [{
|
|
707
|
+
type: Input
|
|
708
|
+
}], showClear: [{
|
|
709
|
+
type: Input
|
|
710
|
+
}], highlightToday: [{
|
|
711
|
+
type: Input
|
|
712
|
+
}], disableFuture: [{
|
|
713
|
+
type: Input
|
|
714
|
+
}], disablePast: [{
|
|
715
|
+
type: Input
|
|
716
|
+
}], minDate: [{
|
|
717
|
+
type: Input
|
|
718
|
+
}], maxDate: [{
|
|
719
|
+
type: Input
|
|
720
|
+
}], disableWeekends: [{
|
|
721
|
+
type: Input
|
|
722
|
+
}], disableHolidays: [{
|
|
723
|
+
type: Input
|
|
724
|
+
}], holidays: [{
|
|
725
|
+
type: Input
|
|
726
|
+
}], dateFilter: [{
|
|
727
|
+
type: Input
|
|
728
|
+
}], locale: [{
|
|
729
|
+
type: Input
|
|
730
|
+
}], weekStartsOn: [{
|
|
731
|
+
type: Input
|
|
732
|
+
}], displayFormat: [{
|
|
733
|
+
type: Input
|
|
734
|
+
}], apiFormat: [{
|
|
735
|
+
type: Input
|
|
736
|
+
}], onDocumentClick: [{
|
|
737
|
+
type: HostListener,
|
|
738
|
+
args: ['document:click', ['$event']]
|
|
739
|
+
}], onResize: [{
|
|
740
|
+
type: HostListener,
|
|
741
|
+
args: ['window:resize']
|
|
742
|
+
}] } });
|
|
743
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tcG9uZW50cy9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tcG9uZW50cy9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixpQkFBaUIsRUFDakIsVUFBVSxHQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBR0wsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsbUJBQW1CLEdBR3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFReEIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixhQUFhLEVBQ2IsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEdBQ2IsTUFBTSxvQkFBb0IsQ0FBQzs7O0FBb0M1QixNQUFNLE9BQU8sbUJBQW1CO0lBa0VWO0lBL0RWLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBRTVDLElBQUksR0FBc0IsUUFBUSxDQUFDO0lBQ25DLFdBQVcsR0FBNkIsS0FBSyxDQUFDO0lBQzlDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ1osV0FBVyxDQUFVO0lBRXJCLGdCQUFnQixHQUFHLGNBQWMsQ0FBQztJQUNsQyxjQUFjLEdBQUcsWUFBWSxDQUFDO0lBQzlCLFVBQVUsR0FBRyxHQUFHLENBQUM7SUFDakIsUUFBUSxHQUFHLEdBQUcsQ0FB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c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBc2dCTixlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUzFDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgZm9yd2FyZFJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybXNNb2R1bGUsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIFdjb0RhdGVJbnB1dCxcbiAgV2NvRGF0ZVJhbmdlLFxuICBXY29EYXRlcGlja2VyTW9kZSxcbiAgV2NvRGF0ZXBpY2tlclZhbHVlLFxuICBXY29EYXRlcGlja2VyVmFsdWVGb3JtYXQsXG59IGZyb20gJy4vZGF0ZXBpY2tlci50eXBlcyc7XG5pbXBvcnQge1xuICBidWlsZERpc2FibGVkUHJlZGljYXRlLFxuICBjbGFtcFRvTWludXRlLFxuICBjb2VyY2VEYXRlLFxuICBmb3JtYXREYXRlLFxuICBpc1ZhbGlkRGF0ZSxcbiAgcGFyc2VEYXRlLFxuICB0b0RhdGVPbmx5LFxuICB0b0lzb0RhdGVLZXksXG59IGZyb20gJy4vZGF0ZXBpY2tlci51dGlscyc7XG5cbnR5cGUgQ2FsZW5kYXJWaWV3ID0gJ2RheScgfCAnbW9udGgnIHwgJ3llYXInO1xuXG50eXBlIERheUNlbGwgPSB7XG4gIGRhdGU6IERhdGU7XG4gIGxhYmVsOiBudW1iZXI7XG4gIGluTW9udGg6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBpc1RvZGF5OiBib29sZWFuO1xuICBpc1NlbGVjdGVkOiBib29sZWFuO1xuICBpc1JhbmdlU3RhcnQ6IGJvb2xlYW47XG4gIGlzUmFuZ2VFbmQ6IGJvb2xlYW47XG4gIGlzSW5SYW5nZTogYm9vbGVhbjtcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3djby1kYXRlcGlja2VyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGVwaWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlcGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uSW5pdFxue1xuICBAT3V0cHV0KCkgb3BlbmVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBJbnB1dCgpIG1vZGU6IFdjb0RhdGVwaWNrZXJNb2RlID0gJ3NpbmdsZSc7XG4gIEBJbnB1dCgpIHZhbHVlRm9ybWF0OiBXY29EYXRlcGlja2VyVmFsdWVGb3JtYXQgPSAnYXBpJztcbiAgQElucHV0KCkgaW5saW5lID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbGFiZWwgPSAnICc7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyU3RhcnQgPSAnRGF0YSBpbmljaWFsJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXJFbmQgPSAnRGF0YSBmaW5hbCc7XG4gIEBJbnB1dCgpIGxhYmVsU3RhcnQgPSAnICc7XG4gIEBJbnB1dCgpIGxhYmVsRW5kID0gJyAnO1xuXG4gIEBJbnB1dCgpIGlucHV0SWQgPSAnZGF0ZXBpY2tlcl8nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIpO1xuICBASW5wdXQoKSBpbnB1dE5hbWU/OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0Vycm9yID0gZmFsc2U7XG5cbiAgQElucHV0KCkgYWxsb3dUeXBpbmcgPSB0cnVlO1xuICBASW5wdXQoKSBhdXRvQ2xvc2UgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93Q2xlYXIgPSB0cnVlO1xuICBASW5wdXQoKSBoaWdobGlnaHRUb2RheSA9IHRydWU7XG5cbiAgQElucHV0KCkgZGlzYWJsZUZ1dHVyZSA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlUGFzdCA9IGZhbHNlO1xuICBASW5wdXQoKSBtaW5EYXRlPzogV2NvRGF0ZUlucHV0IHwgbnVsbDtcbiAgQElucHV0KCkgbWF4RGF0ZT86IFdjb0RhdGVJbnB1dCB8IG51bGw7XG4gIEBJbnB1dCgpIGRpc2FibGVXZWVrZW5kcyA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlSG9saWRheXMgPSBmYWxzZTtcbiAgQElucHV0KCkgaG9saWRheXM6IFdjb0RhdGVJbnB1dFtdID0gW107XG4gIEBJbnB1dCgpIGRhdGVGaWx0ZXI/OiAoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbjtcblxuICBASW5wdXQoKSBsb2NhbGU6IHN0cmluZyA9ICdwdC1CUic7XG4gIEBJbnB1dCgpIHdlZWtTdGFydHNPbjogMCB8IDEgPSAwO1xuXG4gIEBJbnB1dCgpIGRpc3BsYXlGb3JtYXQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaUZvcm1hdD86IHN0cmluZztcblxuICBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDc2ODtcbiAgaXNPcGVuID0gZmFsc2U7XG4gIHZpZXc6IENhbGVuZGFyVmlldyA9ICdkYXknO1xuXG4gIHByaXZhdGUgY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IG51bGw7XG4gIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBzZWxlY3RlZDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJhbmdlU3RhcnQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByYW5nZUVuZDogRGF0ZSB8IG51bGwgPSBudWxsO1xuXG4gIGFjdGl2ZU1vbnRoID0gdG9EYXRlT25seShuZXcgRGF0ZSgpKTtcbiAgYWN0aXZlWWVhclBhZ2VTdGFydCA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIDY7XG5cbiAgaW5wdXRWYWx1ZSA9ICcnO1xuICB0aW1lVmFsdWUgPSAnMDA6MDAnO1xuXG4gIHByaXZhdGUgbWFudWFsSW5wdXRFcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG4gIHByaXZhdGUgcHJvcGFnYXRlQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5saW5lKSB7XG4gICAgICB0aGlzLnZpZXcgPSB0aGlzLm1vZGUgPT09ICdtb250aCcgPyAnbW9udGgnIDogJ2RheSc7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZShvYmo6IFdjb0RhdGVwaWNrZXJWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMubWFudWFsSW5wdXRFcnJvciA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMuY29lcmNlUmFuZ2Uob2JqKTtcbiAgICAgIHRoaXMucmFuZ2VTdGFydCA9IHJhbmdlPy5zdGFydCA/IHRvRGF0ZU9ubHkocmFuZ2Uuc3RhcnQpIDogbnVsbDtcbiAgICAgIHRoaXMucmFuZ2VFbmQgPSByYW5nZT8uZW5kID8gdG9EYXRlT25seShyYW5nZS5lbmQpIDogbnVsbDtcbiAgICAgIHRoaXMuYWN0aXZlTW9udGggPSB0b0RhdGVPbmx5KFxuICAgICAgICB0aGlzLnJhbmdlU3RhcnQgfHwgdGhpcy5yYW5nZUVuZCB8fCBuZXcgRGF0ZSgpXG4gICAgICApO1xuICAgICAgdGhpcy5zeW5jSW5wdXRUZXh0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuY29lcmNlU2luZ2xlKG9iaik7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnO1xuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RhdGV0aW1lJykgdGhpcy50aW1lVmFsdWUgPSAnMDA6MDAnO1xuICAgICAgdGhpcy5hY3RpdmVNb250aCA9IHRvRGF0ZU9ubHkobmV3IERhdGUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IGNsYW1wVG9NaW51dGUoZGF0ZSk7XG4gICAgICB0aGlzLnRpbWVWYWx1ZSA9IGAke1N0cmluZyh0aGlzLnNlbGVjdGVkLmdldEhvdXJzKCkpLnBhZFN0YXJ0KFxuICAgICAgICAyLFxuICAgICAgICAnMCdcbiAgICAgICl9OiR7U3RyaW5nKHRoaXMuc2VsZWN0ZWQuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0b0RhdGVPbmx5KGRhdGUpO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlTW9udGggPSB0b0RhdGVPbmx5KHRoaXMuc2VsZWN0ZWQpO1xuICAgIHRoaXMuc3luY0lucHV0VGV4dCgpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICB0aGlzLmNvbnRyb2wgPSBjb250cm9sO1xuXG4gICAgaWYgKHRoaXMubWFudWFsSW5wdXRFcnJvcikge1xuICAgICAgcmV0dXJuIHsgd2NvRGF0ZUludmFsaWQ6IHsgcmVhc29uOiB0aGlzLm1hbnVhbElucHV0RXJyb3IgfSB9O1xuICAgIH1cblxuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmJ1aWxkSXNEaXNhYmxlZCgpO1xuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3JhbmdlJykge1xuICAgICAgaWYgKHRoaXMucmVxdWlyZWQgJiYgKCF0aGlzLnJhbmdlU3RhcnQgfHwgIXRoaXMucmFuZ2VFbmQpKSB7XG4gICAgICAgIHJldHVybiB7IHJlcXVpcmVkOiB0cnVlIH07XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yYW5nZVN0YXJ0ICYmIHRoaXMucmFuZ2VFbmQpIHtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2VTdGFydC5nZXRUaW1lKCkgPiB0aGlzLnJhbmdlRW5kLmdldFRpbWUoKSkge1xuICAgICAgICAgIHJldHVybiB7IHdjb0RhdGVSYW5nZTogeyByZWFzb246ICdzdGFydEFmdGVyRW5kJyB9IH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJhbmdlU3RhcnQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaXNEaXNhYmxlZCh0aGlzLnJhbmdlU3RhcnQpO1xuICAgICAgICBpZiAocmVzdWx0LmRpc2FibGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdjb0RhdGVEaXNhYmxlZDogeyBwYXJ0OiAnc3RhcnQnLCByZWFzb246IHJlc3VsdC5yZWFzb24gfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yYW5nZUVuZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpc0Rpc2FibGVkKHRoaXMucmFuZ2VFbmQpO1xuICAgICAgICBpZiAocmVzdWx0LmRpc2FibGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHsgd2NvRGF0ZURpc2FibGVkOiB7IHBhcnQ6ICdlbmQnLCByZWFzb246IHJlc3VsdC5yZWFzb24gfSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5zZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIHsgcmVxdWlyZWQ6IHRydWUgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaXNEaXNhYmxlZCh0aGlzLnNlbGVjdGVkKTtcbiAgICAgIGlmIChyZXN1bHQuZGlzYWJsZWQpIHJldHVybiB7IHdjb0RhdGVEaXNhYmxlZDogeyByZWFzb246IHJlc3VsdC5yZWFzb24gfSB9O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0IGhhc0Vycm9yKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNob3dFcnJvcikgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbC5pbnZhbGlkICYmIHRoaXMuY29udHJvbC50b3VjaGVkO1xuICB9XG5cbiAgZ2V0IGNhbkludGVyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seTtcbiAgfVxuXG4gIGdldCByZXNvbHZlZFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3JhbmdlJykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5wbGFjZWhvbGRlciB8fFxuICAgICAgICBgJHt0aGlzLnBsYWNlaG9sZGVyU3RhcnQgfHwgJ0RhdGEgaW5pY2lhbCd9IC0gJHtcbiAgICAgICAgICB0aGlzLnBsYWNlaG9sZGVyRW5kIHx8ICdEYXRhIGZpbmFsJ1xuICAgICAgICB9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXIgfHwgdGhpcy5yZXNvbHZlZERpc3BsYXlGb3JtYXQoKTtcbiAgfVxuXG4gIG9wZW4oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbkludGVyYWN0KSByZXR1cm47XG4gICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgIHRoaXMudmlldyA9IHRoaXMubW9kZSA9PT0gJ21vbnRoJyA/ICdtb250aCcgOiAnZGF5JztcbiAgICB0aGlzLmFjdGl2ZVllYXJQYWdlU3RhcnQgPSB0aGlzLmFjdGl2ZU1vbnRoLmdldEZ1bGxZZWFyKCkgLSA2O1xuICAgIHRoaXMub3BlbmVkQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbmxpbmUpIHJldHVybjtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMub3BlbmVkQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgdG9nZ2xlT3BlbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHRoaXMuY2xvc2UoKTtcbiAgICBlbHNlIHRoaXMub3BlbigpO1xuICB9XG5cbiAgb25JbnB1dENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCF0aGlzLmFsbG93VHlwaW5nKSByZXR1cm47XG4gICAgdGhpcy5tYW51YWxJbnB1dEVycm9yID0gbnVsbDtcbiAgfVxuXG4gIG9uSW5wdXRCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgaWYgKCF0aGlzLmFsbG93VHlwaW5nKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlUmFuZ2VUZXh0KHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgICBpZiAoIXBhcnNlZCAmJiB0aGlzLmlucHV0VmFsdWUudHJpbSgpKSB7XG4gICAgICAgIHRoaXMubWFudWFsSW5wdXRFcnJvciA9ICdmb3JtYXQnO1xuICAgICAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFudWFsSW5wdXRFcnJvciA9IG51bGw7XG4gICAgICB0aGlzLnJhbmdlU3RhcnQgPSBwYXJzZWQ/LnN0YXJ0ID8gdG9EYXRlT25seShwYXJzZWQuc3RhcnQpIDogbnVsbDtcbiAgICAgIHRoaXMucmFuZ2VFbmQgPSBwYXJzZWQ/LmVuZCA/IHRvRGF0ZU9ubHkocGFyc2VkLmVuZCkgOiBudWxsO1xuXG4gICAgICBpZiAodGhpcy5yYW5nZVN0YXJ0ICYmIHRoaXMucmFuZ2VFbmQpIHtcbiAgICAgICAgaWYgKHRoaXMucmFuZ2VTdGFydC5nZXRUaW1lKCkgPiB0aGlzLnJhbmdlRW5kLmdldFRpbWUoKSkge1xuICAgICAgICAgIGNvbnN0IHRtcCA9IHRoaXMucmFuZ2VTdGFydDtcbiAgICAgICAgICB0aGlzLnJhbmdlU3RhcnQgPSB0aGlzLnJhbmdlRW5kO1xuICAgICAgICAgIHRoaXMucmFuZ2VFbmQgPSB0bXA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuYnVpbGRJc0Rpc2FibGVkKCk7XG4gICAgICBpZiAodGhpcy5yYW5nZVN0YXJ0ICYmIGlzRGlzYWJsZWQodGhpcy5yYW5nZVN0YXJ0KS5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLm1hbnVhbElucHV0RXJyb3IgPSAnZGlzYWJsZWQnO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmFuZ2VFbmQgJiYgaXNEaXNhYmxlZCh0aGlzLnJhbmdlRW5kKS5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLm1hbnVhbElucHV0RXJyb3IgPSAnZGlzYWJsZWQnO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFjdGl2ZU1vbnRoID0gdG9EYXRlT25seSh0aGlzLnJhbmdlU3RhcnQgfHwgdGhpcy5yYW5nZUVuZCB8fCBuZXcgRGF0ZSgpKTtcbiAgICAgIHRoaXMuc3luY0lucHV0VGV4dCgpO1xuICAgICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlVXNlclRleHQodGhpcy5pbnB1dFZhbHVlKTtcbiAgICBpZiAoIXBhcnNlZCAmJiB0aGlzLmlucHV0VmFsdWUudHJpbSgpKSB7XG4gICAgICB0aGlzLm1hbnVhbElucHV0RXJyb3IgPSAnZm9ybWF0JztcbiAgICAgIHRoaXMuZW1pdFZhbHVlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tYW51YWxJbnB1dEVycm9yID0gbnVsbDtcbiAgICB0aGlzLmFwcGx5U2luZ2xlU2VsZWN0aW9uKHBhcnNlZCk7XG4gIH1cblxuICBvblRpbWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudGltZVZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMubW9kZSAhPT0gJ2RhdGV0aW1lJykgcmV0dXJuO1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbWF0Y2ggPSAvXihcXGR7Mn0pOihcXGR7Mn0pJC8uZXhlYyh2YWx1ZSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuO1xuICAgIGNvbnN0IGhvdXIgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICBjb25zdCBtaW51dGUgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcbiAgICBpZiAoaG91ciA+IDIzIHx8IG1pbnV0ZSA+IDU5KSByZXR1cm47XG5cbiAgICB0aGlzLnNlbGVjdGVkID0gbmV3IERhdGUoXG4gICAgICB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCksXG4gICAgICB0aGlzLnNlbGVjdGVkLmdldE1vbnRoKCksXG4gICAgICB0aGlzLnNlbGVjdGVkLmdldERhdGUoKSxcbiAgICAgIGhvdXIsXG4gICAgICBtaW51dGUsXG4gICAgICAwLFxuICAgICAgMFxuICAgICk7XG4gICAgdGhpcy5zeW5jSW5wdXRUZXh0KCk7XG4gICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgfVxuXG4gIHNlbGVjdERheShkYXk6IERheUNlbGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuSW50ZXJhY3QpIHJldHVybjtcbiAgICBpZiAoZGF5LmRpc2FibGVkKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICBpZiAoIXRoaXMucmFuZ2VTdGFydCB8fCAodGhpcy5yYW5nZVN0YXJ0ICYmIHRoaXMucmFuZ2VFbmQpKSB7XG4gICAgICAgIHRoaXMucmFuZ2VTdGFydCA9IHRvRGF0ZU9ubHkoZGF5LmRhdGUpO1xuICAgICAgICB0aGlzLnJhbmdlRW5kID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRvRGF0ZU9ubHkoZGF5LmRhdGUpO1xuICAgICAgICBpZiAoZW5kLmdldFRpbWUoKSA8IHRoaXMucmFuZ2VTdGFydC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICB0aGlzLnJhbmdlRW5kID0gdGhpcy5yYW5nZVN0YXJ0O1xuICAgICAgICAgIHRoaXMucmFuZ2VTdGFydCA9IGVuZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJhbmdlRW5kID0gZW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmF1dG9DbG9zZSkgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5hY3RpdmVNb250aCA9IHRvRGF0ZU9ubHkodGhpcy5yYW5nZVN0YXJ0IHx8IGRheS5kYXRlKTtcbiAgICAgIHRoaXMuc3luY0lucHV0VGV4dCgpO1xuICAgICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IC9eKFxcZHsyfSk6KFxcZHsyfSkkLy5leGVjKHRoaXMudGltZVZhbHVlKTtcbiAgICAgIGNvbnN0IGhvdXIgPSBtYXRjaCA/IE51bWJlci5wYXJzZUludChtYXRjaFsxXSwgMTApIDogMDtcbiAgICAgIGNvbnN0IG1pbnV0ZSA9IG1hdGNoID8gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdLCAxMCkgOiAwO1xuICAgICAgdGhpcy5zZWxlY3RlZCA9IG5ldyBEYXRlKFxuICAgICAgICBkYXkuZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBkYXkuZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICBkYXkuZGF0ZS5nZXREYXRlKCksXG4gICAgICAgIGhvdXIsXG4gICAgICAgIG1pbnV0ZSxcbiAgICAgICAgMCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIHRoaXMuc3luY0lucHV0VGV4dCgpO1xuICAgICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgICAgIGlmICh0aGlzLmF1dG9DbG9zZSkgdGhpcy5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWQgPSB0b0RhdGVPbmx5KGRheS5kYXRlKTtcbiAgICB0aGlzLmFjdGl2ZU1vbnRoID0gdG9EYXRlT25seSh0aGlzLnNlbGVjdGVkKTtcbiAgICB0aGlzLnN5bmNJbnB1dFRleHQoKTtcbiAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICAgIGlmICh0aGlzLmF1dG9DbG9zZSkgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgc2VsZWN0TW9udGgobW9udGhJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbkludGVyYWN0KSByZXR1cm47XG5cbiAgICBjb25zdCBjYW5kaWRhdGUgPSBuZXcgRGF0ZSh0aGlzLmFjdGl2ZU1vbnRoLmdldEZ1bGxZZWFyKCksIG1vbnRoSW5kZXgsIDEpO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmJ1aWxkSXNEaXNhYmxlZCgpO1xuICAgIGlmIChpc0Rpc2FibGVkKGNhbmRpZGF0ZSkuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBjYW5kaWRhdGU7XG4gICAgICB0aGlzLmFjdGl2ZU1vbnRoID0gdG9EYXRlT25seShjYW5kaWRhdGUpO1xuICAgICAgdGhpcy5zeW5jSW5wdXRUZXh0KCk7XG4gICAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICAgICAgaWYgKHRoaXMuYXV0b0Nsb3NlKSB0aGlzLmNsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmVNb250aCA9IHRvRGF0ZU9ubHkoY2FuZGlkYXRlKTtcbiAgICB0aGlzLnZpZXcgPSAnZGF5JztcbiAgfVxuXG4gIHNlbGVjdFllYXIoeWVhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNhbkludGVyYWN0KSByZXR1cm47XG4gICAgdGhpcy5hY3RpdmVNb250aCA9IG5ldyBEYXRlKHllYXIsIHRoaXMuYWN0aXZlTW9udGguZ2V0TW9udGgoKSwgMSk7XG4gICAgdGhpcy52aWV3ID0gdGhpcy5tb2RlID09PSAnbW9udGgnID8gJ21vbnRoJyA6ICdkYXknO1xuICB9XG5cbiAgcHJldigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aWV3ID09PSAnZGF5Jykge1xuICAgICAgdGhpcy5hY3RpdmVNb250aCA9IG5ldyBEYXRlKFxuICAgICAgICB0aGlzLmFjdGl2ZU1vbnRoLmdldEZ1bGxZZWFyKCksXG4gICAgICAgIHRoaXMuYWN0aXZlTW9udGguZ2V0TW9udGgoKSAtIDEsXG4gICAgICAgIDFcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMuYWN0aXZlTW9udGggPSBuZXcgRGF0ZShcbiAgICAgICAgdGhpcy5hY3RpdmVNb250aC5nZXRGdWxsWWVhcigpIC0gMSxcbiAgICAgICAgdGhpcy5hY3RpdmVNb250aC5nZXRNb250aCgpLFxuICAgICAgICAxXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZVllYXJQYWdlU3RhcnQgLT0gMTI7XG4gIH1cblxuICBuZXh0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZXcgPT09ICdkYXknKSB7XG4gICAgICB0aGlzLmFjdGl2ZU1vbnRoID0gbmV3IERhdGUoXG4gICAgICAgIHRoaXMuYWN0aXZlTW9udGguZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgdGhpcy5hY3RpdmVNb250aC5nZXRNb250aCgpICsgMSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMudmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy5hY3RpdmVNb250aCA9IG5ldyBEYXRlKFxuICAgICAgICB0aGlzLmFjdGl2ZU1vbnRoLmdldEZ1bGxZZWFyKCkgKyAxLFxuICAgICAgICB0aGlzLmFjdGl2ZU1vbnRoLmdldE1vbnRoKCksXG4gICAgICAgIDFcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlWWVhclBhZ2VTdGFydCArPSAxMjtcbiAgfVxuXG4gIHN3aXRjaFZpZXcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmlldyA9PT0gJ2RheScpIHtcbiAgICAgIHRoaXMudmlldyA9ICdtb250aCc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMudmlldyA9ICd5ZWFyJztcbiAgICAgIHRoaXMuYWN0aXZlWWVhclBhZ2VTdGFydCA9IHRoaXMuYWN0aXZlTW9udGguZ2V0RnVsbFllYXIoKSAtIDY7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmlldyA9IHRoaXMubW9kZSA9PT0gJ21vbnRoJyA/ICdtb250aCcgOiAnZGF5JztcbiAgfVxuXG4gIGdldCBoZWFkZXJMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnZpZXcgPT09ICdtb250aCcgfHwgdGhpcy52aWV3ID09PSAneWVhcicpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodGhpcy5hY3RpdmVNb250aC5nZXRGdWxsWWVhcigpKTtcbiAgICB9XG5cbiAgICBjb25zdCBtb250aEZvcm1hdHRlciA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLCB7XG4gICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgIH0pO1xuICAgIGNvbnN0IGxhYmVsID0gbW9udGhGb3JtYXR0ZXIuZm9ybWF0KFxuICAgICAgbmV3IERhdGUodGhpcy5hY3RpdmVNb250aC5nZXRGdWxsWWVhcigpLCB0aGlzLmFjdGl2ZU1vbnRoLmdldE1vbnRoKCksIDEpXG4gICAgKTtcbiAgICByZXR1cm4gbGFiZWwuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBsYWJlbC5zbGljZSgxKTtcbiAgfVxuXG4gIGdldCB3ZWVrZGF5TGFiZWxzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmxvY2FsZSwgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pO1xuICAgIGNvbnN0IGJhc2UgPSBuZXcgRGF0ZSgyMDIzLCAwLCAxKTsgLy8gU3VuZGF5XG4gICAgY29uc3QgbGFiZWxzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICBjb25zdCBkYXkgPSBuZXcgRGF0ZShcbiAgICAgICAgYmFzZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBiYXNlLmdldE1vbnRoKCksXG4gICAgICAgIGJhc2UuZ2V0RGF0ZSgpICsgaVxuICAgICAgKTtcbiAgICAgIGxhYmVscy5wdXNoKGZvcm1hdHRlci5mb3JtYXQoZGF5KSk7XG4gICAgfVxuICAgIGlmICh0aGlzLndlZWtTdGFydHNPbiA9PT0gMSkge1xuICAgICAgY29uc3Qgc3VuZGF5ID0gbGFiZWxzLnNoaWZ0KCk7XG4gICAgICBpZiAoc3VuZGF5KSBsYWJlbHMucHVzaChzdW5kYXkpO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWxzLm1hcCgobGFiZWwpID0+IHtcbiAgICAgIGNvbnN0IGNsZWFuID0gbGFiZWwucmVwbGFjZSgnLicsICcnKS50cmltKCk7XG4gICAgICBjb25zdCBmaXJzdCA9IEFycmF5LmZyb20oY2xlYW4pWzBdID8/ICcnO1xuICAgICAgcmV0dXJuIGZpcnN0ID8gZmlyc3QudG9Mb2NhbGVVcHBlckNhc2UodGhpcy5sb2NhbGUpIDogJyc7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgZGF5cygpOiBEYXlDZWxsW10ge1xuICAgIGNvbnN0IHllYXIgPSB0aGlzLmFjdGl2ZU1vbnRoLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSB0aGlzLmFjdGl2ZU1vbnRoLmdldE1vbnRoKCk7XG4gICAgY29uc3QgZmlyc3QgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG4gICAgY29uc3QgZmlyc3REb3cgPSBmaXJzdC5nZXREYXkoKTtcbiAgICBjb25zdCBvZmZzZXQgPVxuICAgICAgdGhpcy53ZWVrU3RhcnRzT24gPT09IDEgPyAoZmlyc3REb3cgPT09IDAgPyA2IDogZmlyc3REb3cgLSAxKSA6IGZpcnN0RG93O1xuICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEgLSBvZmZzZXQpO1xuXG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuYnVpbGRJc0Rpc2FibGVkKCk7XG4gICAgY29uc3QgdG9kYXlLZXkgPSB0b0lzb0RhdGVLZXkobmV3IERhdGUoKSk7XG5cbiAgICBjb25zdCBjZWxsczogRGF5Q2VsbFtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MjsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoXG4gICAgICAgIHN0YXJ0LmdldEZ1bGxZZWFyKCksXG4gICAgICAgIHN0YXJ0LmdldE1vbnRoKCksXG4gICAgICAgIHN0YXJ0LmdldERhdGUoKSArIGlcbiAgICAgICk7XG4gICAgICBjb25zdCBpbk1vbnRoID0gZGF0ZS5nZXRNb250aCgpID09PSBtb250aDtcbiAgICAgIGNvbnN0IGtleSA9IHRvSXNvRGF0ZUtleShkYXRlKTtcbiAgICAgIGNvbnN0IGRpc2FibGVkID0gaXNEaXNhYmxlZChkYXRlKS5kaXNhYmxlZDtcbiAgICAgIGNvbnN0IGlzVG9kYXkgPSB0aGlzLmhpZ2hsaWdodFRvZGF5ICYmIGtleSA9PT0gdG9kYXlLZXk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkS2V5ID0gdGhpcy5zZWxlY3RlZCA/IHRvSXNvRGF0ZUtleSh0aGlzLnNlbGVjdGVkKSA6IG51bGw7XG4gICAgICBjb25zdCBzdGFydEtleSA9IHRoaXMucmFuZ2VTdGFydCA/IHRvSXNvRGF0ZUtleSh0aGlzLnJhbmdlU3RhcnQpIDogbnVsbDtcbiAgICAgIGNvbnN0IGVuZEtleSA9IHRoaXMucmFuZ2VFbmQgPyB0b0lzb0RhdGVLZXkodGhpcy5yYW5nZUVuZCkgOiBudWxsO1xuXG4gICAgICBjb25zdCBpc1NlbGVjdGVkID0gc2VsZWN0ZWRLZXkgPyBrZXkgPT09IHNlbGVjdGVkS2V5IDogZmFsc2U7XG4gICAgICBjb25zdCBpc1JhbmdlU3RhcnQgPSBzdGFydEtleSA/IGtleSA9PT0gc3RhcnRLZXkgOiBmYWxzZTtcbiAgICAgIGNvbnN0IGlzUmFuZ2VFbmQgPSBlbmRLZXkgPyBrZXkgPT09IGVuZEtleSA6IGZhbHNlO1xuICAgICAgY29uc3QgaXNJblJhbmdlID1cbiAgICAgICAgdGhpcy5tb2RlID09PSAncmFuZ2UnICYmIHRoaXMucmFuZ2VTdGFydCAmJiB0aGlzLnJhbmdlRW5kXG4gICAgICAgICAgPyAhZGlzYWJsZWQgJiZcbiAgICAgICAgICAgIGtleSA+PSB0b0lzb0RhdGVLZXkodGhpcy5yYW5nZVN0YXJ0KSAmJlxuICAgICAgICAgICAga2V5IDw9IHRvSXNvRGF0ZUtleSh0aGlzLnJhbmdlRW5kKVxuICAgICAgICAgIDogZmFsc2U7XG5cbiAgICAgIGNlbGxzLnB1c2goe1xuICAgICAgICBkYXRlLFxuICAgICAgICBsYWJlbDogZGF0ZS5nZXREYXRlKCksXG4gICAgICAgIGluTW9udGgsXG4gICAgICAgIGRpc2FibGVkLFxuICAgICAgICBpc1RvZGF5LFxuICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICBpc1JhbmdlU3RhcnQsXG4gICAgICAgIGlzUmFuZ2VFbmQsXG4gICAgICAgIGlzSW5SYW5nZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjZWxscztcbiAgfVxuXG4gIGlzQ3VycmVudFllYXIoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHllYXIgPT09IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWRZZWFyKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdyYW5nZScpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0geWVhcjtcbiAgfVxuXG4gIGlzQ3VycmVudE1vbnRoKG1vbnRoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIG1vbnRoSW5kZXggPT09IG5vdy5nZXRNb250aCgpICYmIHRoaXMuYWN0aXZlTW9udGguZ2V0RnVsbFllYXIoKSA9PT0gbm93LmdldEZ1bGxZZWFyKClcbiAgICApO1xuICB9XG5cbiAgaXNTZWxlY3RlZE1vbnRoKG1vbnRoSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdyYW5nZScpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gKFxuICAgICAgISF0aGlzLnNlbGVjdGVkICYmXG4gICAgICB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMuYWN0aXZlTW9udGguZ2V0RnVsbFllYXIoKSAmJlxuICAgICAgdGhpcy5zZWxlY3RlZC5nZXRNb250aCgpID09PSBtb250aEluZGV4XG4gICAgKTtcbiAgfVxuXG4gIGdldCBtb250aExhYmVscygpOiB7IGluZGV4OiBudW1iZXI7IGxhYmVsOiBzdHJpbmc7IGRpc2FibGVkOiBib29sZWFuIH1bXSB7XG4gICAgY29uc3QgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIHsgbW9udGg6ICdzaG9ydCcgfSk7XG4gICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuYnVpbGRJc0Rpc2FibGVkKCk7XG4gICAgY29uc3QgeWVhciA9IHRoaXMuYWN0aXZlTW9udGguZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBpdGVtczogeyBpbmRleDogbnVtYmVyOyBsYWJlbDogc3RyaW5nOyBkaXNhYmxlZDogYm9vbGVhbiB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBpLCAxKTtcbiAgICAgIGNvbnN0IGxhYmVsID0gZm9ybWF0dGVyLmZvcm1hdChkYXRlKS5yZXBsYWNlKCcuJywgJycpLnRyaW0oKTtcbiAgICAgIGl0ZW1zLnB1c2goe1xuICAgICAgICBpbmRleDogaSxcbiAgICAgICAgbGFiZWw6IGxhYmVsLnRvTG9jYWxlVXBwZXJDYXNlKHRoaXMubG9jYWxlKSxcbiAgICAgICAgZGlzYWJsZWQ6IGlzRGlzYWJsZWQoZGF0ZSkuZGlzYWJsZWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgZ2V0IHllYXJzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+IHRoaXMuYWN0aXZlWWVhclBhZ2VTdGFydCArIGkpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5lbC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxuICBvblJlc2l6ZSgpIHtcbiAgICB0aGlzLmlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPD0gNzY4O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaXhlZENvbnRhaW5pbmdCbG9jayhlbDogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIC8vIEluIHNvbWUgZW52aXJvbm1lbnRzIChlLmcuIFN0b3J5Ym9vayksIGFuIGFuY2VzdG9yIG1heSBoYXZlIGB0cmFuc2Zvcm1gLFxuICAgIC8vIHdoaWNoIGNoYW5nZXMgdGhlIGNvbnRhaW5pbmcgYmxvY2sgZm9yIGBwb3NpdGlvbjogZml4ZWRgLlxuICAgIC8vIFdoZW4gdGhhdCBoYXBwZW5zLCB3ZSBtdXN0IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoYXQgYW5jZXN0b3IuXG4gICAgbGV0IG5vZGU6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgY29uc3QgaGFzVHJhbnNmb3JtID0gc3R5bGUudHJhbnNmb3JtICYmIHN0eWxlLnRyYW5zZm9ybSAhPT0gJ25vbmUnO1xuICAgICAgY29uc3QgaGFzUGVyc3BlY3RpdmUgPSBzdHlsZS5wZXJzcGVjdGl2ZSAmJiBzdHlsZS5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnO1xuICAgICAgY29uc3QgaGFzRmlsdGVyID0gc3R5bGUuZmlsdGVyICYmIHN0eWxlLmZpbHRlciAhPT0gJ25vbmUnO1xuICAgICAgY29uc3QgaGFzQ29udGFpblBhaW50ID0gc3R5bGUuY29udGFpbj8uaW5jbHVkZXMoJ3BhaW50JykgPz8gZmFsc2U7XG5cbiAgICAgIGlmIChoYXNUcmFuc2Zvcm0gfHwgaGFzUGVyc3BlY3RpdmUgfHwgaGFzRmlsdGVyIHx8IGhhc0NvbnRhaW5QYWludCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5idWlsZE91dGdvaW5nVmFsdWUoKSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkT3V0Z29pbmdWYWx1ZSgpOiBhbnkge1xuICAgIGNvbnN0IHJlc29sdmVkQXBpRm9ybWF0ID0gdGhpcy5yZXNvbHZlZEFwaUZvcm1hdCgpO1xuICAgIGNvbnN0IHJlc29sdmVkRGlzcGxheUZvcm1hdCA9IHRoaXMucmVzb2x2ZWREaXNwbGF5Rm9ybWF0KCk7XG4gICAgY29uc3QgZm9ybWF0ID1cbiAgICAgIHRoaXMudmFsdWVGb3JtYXQgPT09ICdhcGknID8gcmVzb2x2ZWRBcGlGb3JtYXQgOiByZXNvbHZlZERpc3BsYXlGb3JtYXQ7XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAncmFuZ2UnKSB7XG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMucmFuZ2VTdGFydFxuICAgICAgICA/IGZvcm1hdERhdGUodGhpcy5yYW5nZVN0YXJ0LCBmb3JtYXQgYXMgYW55KVxuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLnJhbmdlRW5kID8gZm9ybWF0RGF0ZSh0aGlzLnJhbmdlRW5kLCBmb3JtYXQgYXMgYW55KSA6IG51bGw7XG4gICAgICByZXR1cm4geyBzdGFydCwgZW5kIH0gc2F0aXNmaWVzIFdjb0RhdGVSYW5nZTxzdHJpbmc+O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGZvcm1hdERhdGUodGhpcy5zZWxlY3RlZCwgZm9ybWF0IGFzIGFueSk7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVkQXBpRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuYXBpRm9ybWF0KSByZXR1cm4gdGhpcy5hcGlGb3JtYXQ7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RhdGV0aW1lJykgcmV0dXJuIFwieXl5eS1NTS1kZCdUJ0hIOm1tXCI7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRoJykgcmV0dXJuICd5eXl5LU1NJztcbiAgICByZXR1cm4gJ3l5eXktTU0tZGQnO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlZERpc3BsYXlGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5Rm9ybWF0KSByZXR1cm4gdGhpcy5kaXNwbGF5Rm9ybWF0O1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdkYXRldGltZScpIHJldHVybiAnZGQvTU0veXl5eSBISDptbSc7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ21vbnRoJykgcmV0dXJuICdNTS95eXl5JztcbiAgICByZXR1cm4gJ2RkL01NL3l5eXknO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jSW5wdXRUZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLnJlc29sdmVkRGlzcGxheUZvcm1hdCgpO1xuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3JhbmdlJykge1xuICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLnJhbmdlU3RhcnQgPyBmb3JtYXREYXRlKHRoaXMucmFuZ2VTdGFydCwgZGlzcGxheSBhcyBhbnkpIDogJyc7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLnJhbmdlRW5kID8gZm9ybWF0RGF0ZSh0aGlzLnJhbmdlRW5kLCBkaXNwbGF5IGFzIGFueSkgOiAnJztcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9IGVuZCA/IGAke3N0YXJ0fSAtICR7ZW5kfWAgOiBzdGFydDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLnNlbGVjdGVkID8gZm9ybWF0RGF0ZSh0aGlzLnNlbGVjdGVkLCBkaXNwbGF5IGFzIGFueSkgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VVc2VyVGV4dCh2YWx1ZTogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIGNvbnN0IGRpc3BsYXkgPSB0aGlzLnJlc29sdmVkRGlzcGxheUZvcm1hdCgpO1xuICAgIGNvbnN0IGFwaSA9IHRoaXMucmVzb2x2ZWRBcGlGb3JtYXQoKTtcblxuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHBhcnNlZERpc3BsYXkgPSBwYXJzZURhdGUodHJpbW1lZCwgZGlzcGxheSBhcyBhbnkpO1xuICAgIGNvbnN0IHBhcnNlZEFwaSA9IHBhcnNlZERpc3BsYXkgPyBudWxsIDogcGFyc2VEYXRlKHRyaW1tZWQsIGFwaSBhcyBhbnkpO1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlZERpc3BsYXkgfHwgcGFyc2VkQXBpO1xuICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDtcblxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb250aCcpIHJldHVybiBuZXcgRGF0ZShwYXJzZWQuZ2V0RnVsbFllYXIoKSwgcGFyc2VkLmdldE1vbnRoKCksIDEpO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdkYXRldGltZScpIHJldHVybiBjbGFtcFRvTWludXRlKHBhcnNlZCk7XG4gICAgcmV0dXJuIHRvRGF0ZU9ubHkocGFyc2VkKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VSYW5nZVRleHQodmFsdWU6IHN0cmluZyk6IFdjb0RhdGVSYW5nZTxEYXRlPiB8IG51bGwge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHNlcGFyYXRvcnMgPSBbJyAtICcsICcgYXTDqSAnLCAnIHRvICddO1xuICAgIGxldCBzZXBGb3VuZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBzZXAgb2Ygc2VwYXJhdG9ycykge1xuICAgICAgaWYgKHRyaW1tZWQuaW5jbHVkZXMoc2VwKSkge1xuICAgICAgICBzZXBGb3VuZCA9IHNlcDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzZXBGb3VuZCkge1xuICAgICAgY29uc3Qgb25seSA9IHRoaXMucGFyc2VVc2VyVGV4dCh0cmltbWVkKTtcbiAgICAgIHJldHVybiB7IHN0YXJ0OiBvbmx5LCBlbmQ6IG51bGwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0cyA9IHRyaW1tZWQuc3BsaXQoc2VwRm91bmQpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuICAgIGNvbnN0IHN0YXJ0VGV4dCA9IHBhcnRzWzBdIHx8ICcnO1xuICAgIGNvbnN0IGVuZFRleHQgPSBwYXJ0cy5zbGljZSgxKS5qb2luKHNlcEZvdW5kKS50cmltKCk7XG5cbiAgICBjb25zdCBzdGFydCA9IHN0YXJ0VGV4dCA/IHRoaXMucGFyc2VVc2VyVGV4dChzdGFydFRleHQpIDogbnVsbDtcbiAgICBjb25zdCBlbmQgPSBlbmRUZXh0ID8gdGhpcy5wYXJzZVVzZXJUZXh0KGVuZFRleHQpIDogbnVsbDtcbiAgICBpZiAoIXN0YXJ0ICYmICFlbmQpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTaW5nbGVTZWxlY3Rpb24oZGF0ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAncmFuZ2UnKSByZXR1cm47XG5cbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xuICAgICAgdGhpcy5zeW5jSW5wdXRUZXh0KCk7XG4gICAgICB0aGlzLmVtaXRWYWx1ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmJ1aWxkSXNEaXNhYmxlZCgpO1xuICAgIGlmIChpc0Rpc2FibGVkKGRhdGUpLmRpc2FibGVkKSB7XG4gICAgICB0aGlzLm1hbnVhbElucHV0RXJyb3IgPSAnZGlzYWJsZWQnO1xuICAgICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm1hbnVhbElucHV0RXJyb3IgPSBudWxsO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtb250aCcpIHRoaXMuc2VsZWN0ZWQgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSk7XG4gICAgZWxzZSBpZiAodGhpcy5tb2RlID09PSAnZGF0ZXRpbWUnKSB0aGlzLnNlbGVjdGVkID0gY2xhbXBUb01pbnV0ZShkYXRlKTtcbiAgICBlbHNlIHRoaXMuc2VsZWN0ZWQgPSB0b0RhdGVPbmx5KGRhdGUpO1xuXG4gICAgdGhpcy5hY3RpdmVNb250aCA9IHRvRGF0ZU9ubHkodGhpcy5zZWxlY3RlZCk7XG4gICAgdGhpcy5zeW5jSW5wdXRUZXh0KCk7XG4gICAgdGhpcy5lbWl0VmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29lcmNlU2luZ2xlKG9iajogV2NvRGF0ZXBpY2tlclZhbHVlKTogRGF0ZSB8IG51bGwge1xuICAgIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gaXNWYWxpZERhdGUob2JqKSA/IG9iaiA6IG51bGw7XG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSByZXR1cm4gY29lcmNlRGF0ZShvYmopO1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiAnc3RhcnQnIGluIG9iaiAmJiAnZW5kJyBpbiBvYmopIHJldHVybiBudWxsO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2VyY2VSYW5nZShvYmo6IFdjb0RhdGVwaWNrZXJWYWx1ZSk6IFdjb0RhdGVSYW5nZTxEYXRlPiB8IG51bGwge1xuICAgIGlmICghb2JqKSByZXR1cm4gbnVsbDtcbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHJldHVybiBudWxsO1xuICAgIGlmICghKCdzdGFydCcgaW4gb2JqKSB8fCAhKCdlbmQnIGluIG9iaikpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBjb2VyY2VEYXRlKChvYmogYXMgYW55KS5zdGFydCk7XG4gICAgY29uc3QgZW5kID0gY29lcmNlRGF0ZSgob2JqIGFzIGFueSkuZW5kKTtcbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSXNEaXNhYmxlZCgpIHtcbiAgICBjb25zdCBtaW4gPSBjb2VyY2VEYXRlKHRoaXMubWluRGF0ZSA/PyBudWxsKTtcbiAgICBjb25zdCBtYXggPSBjb2VyY2VEYXRlKHRoaXMubWF4RGF0ZSA/PyBudWxsKTtcbiAgICBjb25zdCBob2xpZGF5U2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBoIG9mIHRoaXMuaG9saWRheXMgfHwgW10pIHtcbiAgICAgIGNvbnN0IGQgPSBjb2VyY2VEYXRlKGgpO1xuICAgICAgaWYgKGQpIGhvbGlkYXlTZXQuYWRkKHRvSXNvRGF0ZUtleShkKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRGlzYWJsZWRQcmVkaWNhdGUoe1xuICAgICAgZGlzYWJsZUZ1dHVyZTogdGhpcy5kaXNhYmxlRnV0dXJlLFxuICAgICAgZGlzYWJsZVBhc3Q6IHRoaXMuZGlzYWJsZVBhc3QsXG4gICAgICBtaW5EYXRlOiBtaW4sXG4gICAgICBtYXhEYXRlOiBtYXgsXG4gICAgICBkaXNhYmxlV2Vla2VuZHM6IHRoaXMuZGlzYWJsZVdlZWtlbmRzLFxuICAgICAgZGlzYWJsZUhvbGlkYXlzOiB0aGlzLmRpc2FibGVIb2xpZGF5cyxcbiAgICAgIGhvbGlkYXlTZXQsXG4gICAgICBkYXRlRmlsdGVyOiB0aGlzLmRhdGVGaWx0ZXIgfHwgbnVsbCxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cIndjby1kYXRlcGlja2VyXCJcbiAgW2NsYXNzLndjby1kYXRlcGlja2VyLS1vcGVuXT1cImlzT3BlblwiXG4gIFtjbGFzcy53Y28tZGF0ZXBpY2tlci0taXNNb2JpbGVdPVwiaXNNb2JpbGVcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSAhPT0gJ3JhbmdlJyAmJiAhaW5saW5lXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkIHdjby1kYXRlcGlja2VyX19maWVsZFwiXG4gICAgICBbY2xhc3MuZm9ybS1maWVsZC0tZXJyb3JdPVwiaGFzRXJyb3JcIlxuICAgICAgW2NsYXNzLmZvcm0tZmllbGQtLXJlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICA+XG4gICAgICA8aW5wdXRcbiAgICAgICAgW2lkXT1cImlucHV0SWRcIlxuICAgICAgICBbbmFtZV09XCJpbnB1dE5hbWVcIlxuICAgICAgICBbYXR0ci5yZXF1aXJlZF09XCJyZXF1aXJlZCA/ICcnIDogbnVsbFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJyZXNvbHZlZFBsYWNlaG9sZGVyXCJcbiAgICAgICAgW3JlYWRPbmx5XT1cInJlYWRvbmx5IHx8ICFhbGxvd1R5cGluZ1wiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFt2YWx1ZV09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgKGNsaWNrKT1cIm9wZW4oKVwiXG4gICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgKGJsdXIpPVwib25JbnB1dEJsdXIoKVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBvbklucHV0Qmx1cigpXCJcbiAgICAgIC8+XG4gICAgICA8bGFiZWwgW2Zvcl09XCJpbnB1dElkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuXG4gICAgICA8c3BhblxuICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLWljb25zLXJvdW5kIHdjby1kYXRlcGlja2VyX19zdWZmaXggd2NvLWRhdGVwaWNrZXJfX3RvZ2dsZVwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVPcGVuKClcIlxuICAgICAgICA+Y2FsZW5kYXJfdG9kYXk8L3NwYW5cbiAgICAgID5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1vZGUgPT09ICdyYW5nZScgJiYgIWlubGluZVwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiZm9ybS1maWVsZCB3Y28tZGF0ZXBpY2tlcl9fZmllbGRcIlxuICAgICAgW2NsYXNzLmZvcm0tZmllbGQtLWVycm9yXT1cImhhc0Vycm9yXCJcbiAgICAgIFtjbGFzcy5mb3JtLWZpZWxkLS1yZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgPlxuICAgICAgPGlucHV0XG4gICAgICAgIFtpZF09XCJpbnB1dElkXCJcbiAgICAgICAgW25hbWVdPVwiaW5wdXROYW1lXCJcbiAgICAgICAgW2F0dHIucmVxdWlyZWRdPVwicmVxdWlyZWQgPyAnJyA6IG51bGxcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicmVzb2x2ZWRQbGFjZWhvbGRlclwiXG4gICAgICAgIFtyZWFkT25seV09XCJyZWFkb25seSB8fCAhYWxsb3dUeXBpbmdcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbdmFsdWVdPVwiaW5wdXRWYWx1ZVwiXG4gICAgICAgIChjbGljayk9XCJvcGVuKClcIlxuICAgICAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgIChibHVyKT1cIm9uSW5wdXRCbHVyKClcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgb25JbnB1dEJsdXIoKVwiXG4gICAgICAvPlxuICAgICAgPGxhYmVsIFtmb3JdPVwiaW5wdXRJZFwiPnt7IGxhYmVsIH19PC9sYWJlbD5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtcm91bmQgd2NvLWRhdGVwaWNrZXJfX3N1ZmZpeCB3Y28tZGF0ZXBpY2tlcl9fdG9nZ2xlXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZU9wZW4oKVwiXG4gICAgICAgID5jYWxlbmRhcl90b2RheTwvc3BhblxuICAgICAgPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJ3Y28tZGF0ZXBpY2tlcl9fYm94XCJcbiAgICBbY2xhc3Mud2NvLWRhdGVwaWNrZXJfX2JveC0tb3Blbl09XCJpc09wZW4gfHwgaW5saW5lXCJcbiAgICBbY2xhc3Mud2NvLWRhdGVwaWNrZXJfX2JveC0taW5saW5lXT1cImlubGluZVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwid2NvLWRhdGVwaWNrZXJfX3BhbmVsXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIndjby1kYXRlcGlja2VyX19oZWFkZXJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwid2NvLWRhdGVwaWNrZXJfX3RpdGxlXCJcbiAgICAgICAgICAoY2xpY2spPVwic3dpdGNoVmlldygpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbkludGVyYWN0XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IGhlYWRlckxhYmVsIH19XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyB0ZXh0LXByaW1hcnktNjAwXCI+e3tcbiAgICAgICAgICAgIHZpZXcgPT09IFwieWVhclwiID8gXCJhcnJvd19kcm9wX3VwXCIgOiBcImFycm93X2Ryb3BfZG93blwiXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cIndjby1kYXRlcGlja2VyX19uYXZcIlxuICAgICAgICAgIChjbGljayk9XCJwcmV2KClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuSW50ZXJhY3RcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyB0ZXh0LXByaW1hcnktNjAwXCI+Y2hldnJvbl9sZWZ0PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJ3Y28tZGF0ZXBpY2tlcl9fbmF2XCJcbiAgICAgICAgICAoY2xpY2spPVwibmV4dCgpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbkludGVyYWN0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgdGV4dC1wcmltYXJ5LTYwMFwiPmNoZXZyb25fcmlnaHQ8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3Y28tZGF0ZXBpY2tlcl9fY29udGVudFwiICpuZ0lmPVwidmlldyA9PT0gJ2RheSdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndjby1kYXRlcGlja2VyX193ZWVrZGF5c1wiPlxuICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCB3IG9mIHdlZWtkYXlMYWJlbHNcIj57eyB3IH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndjby1kYXRlcGlja2VyX19ncmlkXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIndjby1kYXRlcGlja2VyX19kYXlcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGQgb2YgZGF5c1wiXG4gICAgICAgICAgICBbY2xhc3Mud2NvLWRhdGVwaWNrZXJfX2RheS0tbXV0ZWRdPVwiIWQuaW5Nb250aFwiXG4gICAgICAgICAgICBbY2xhc3Mud2NvLWRhdGVwaWNrZXJfX2RheS0tdG9kYXldPVwiZC5pc1RvZGF5XCJcbiAgICAgICAgICAgIFtjbGFzcy53Y28tZGF0ZXBpY2tlcl9fZGF5LS1zZWxlY3RlZF09XCJkLmlzU2VsZWN0ZWRcIlxuICAgICAgICAgICAgW2NsYXNzLndjby1kYXRlcGlja2VyX19kYXktLXJhbmdlXT1cImQuaXNJblJhbmdlXCJcbiAgICAgICAgICAgIFtjbGFzcy53Y28tZGF0ZXBpY2tlcl9fZGF5LS1yYW5nZVN0YXJ0XT1cImQuaXNSYW5nZVN0YXJ0XCJcbiAgICAgICAgICAgIFtjbGFzcy53Y28tZGF0ZXBpY2tlcl9fZGF5LS1yYW5nZUVuZF09XCJkLmlzUmFuZ2VFbmRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImQuZGlzYWJsZWQgfHwgIWNhbkludGVyYWN0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXkoZClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGQubGFiZWwgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndjby1kYXRlcGlja2VyX19jb250ZW50XCIgKm5nSWY9XCJ2aWV3ID09PSAnbW9udGgnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3Y28tZGF0ZXBpY2tlcl9fbW9udGhzXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIndjby1kYXRlcGlja2VyX19tb250aFwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgbSBvZiBtb250aExhYmVsc1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibS5kaXNhYmxlZCB8fCAhY2FuSW50ZXJhY3RcIlxuICAgICAgICAgICAgW2NsYXNzLndjby1kYXRlcGlja2VyX19tb250aC0tYWN0aXZlXT1cIlxuICAgICAgICAgICAgICBtLmluZGV4ID09PSBhY3RpdmVNb250aC5nZXRNb250aCgpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2NsYXNzLndjby1kYXRlcGlja2VyX19tb250aC0tY3VycmVudF09XCJpc0N1cnJlbnRNb250aChtLmluZGV4KVwiXG4gICAgICAgICAgICBbY2xhc3Mud2NvLWRhdGVwaWNrZXJfX21vbnRoLS1zZWxlY3RlZF09XCJpc1NlbGVjdGVkTW9udGgobS5pbmRleClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE1vbnRoKG0uaW5kZXgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBtLmxhYmVsIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3Y28tZGF0ZXBpY2tlcl9fY29udGVudFwiICpuZ0lmPVwidmlldyA9PT0gJ3llYXInXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3Y28tZGF0ZXBpY2tlcl9feWVhcnNcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwid2NvLWRhdGVwaWNrZXJfX3llYXJcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHkgb2YgeWVhcnNcIlxuICAgICAgICAgICAgW2NsYXNzLndjby1kYXRlcGlja2VyX195ZWFyLS1hY3RpdmVdPVwiXG4gICAgICAgICAgICAgIHkgPT09IGFjdGl2ZU1vbnRoLmdldEZ1bGxZZWFyKClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbY2xhc3Mud2NvLWRhdGVwaWNrZXJfX3llYXItLWN1cnJlbnRdPVwiaXNDdXJyZW50WWVhcih5KVwiXG4gICAgICAgICAgICBbY2xhc3Mud2NvLWRhdGVwaWNrZXJfX3llYXItLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWRZZWFyKHkpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuSW50ZXJhY3RcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFllYXIoeSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHkgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndjby1kYXRlcGlja2VyX190aW1lXCIgKm5nSWY9XCJtb2RlID09PSAnZGF0ZXRpbWUnXCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIndjby1kYXRlcGlja2VyX190aW1lTGFiZWxcIj5Ib3JhPC9sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgICAgIGNsYXNzPVwid2NvLWRhdGVwaWNrZXJfX3RpbWVJbnB1dFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcbiAgICAgICAgICBbdmFsdWVdPVwidGltZVZhbHVlXCJcbiAgICAgICAgICAoaW5wdXQpPVwib25UaW1lQ2hhbmdlKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|