@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.
@@ -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