@ngxsmk/cdk 1.3.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/cva-base/cva-base.d.ts +34 -0
- package/cva-base/cva-base.d.ts.map +1 -0
- package/cva-base/index.d.ts +2 -0
- package/cva-base/index.d.ts.map +1 -0
- package/cva-base/ngxsmk-cdk-cva-base.d.ts.map +1 -0
- package/esm2022/cva-base/cva-base.mjs +45 -0
- package/esm2022/cva-base/index.mjs +2 -0
- package/esm2022/cva-base/ngxsmk-cdk-cva-base.mjs +5 -0
- package/esm2022/input-group/index.mjs +3 -0
- package/esm2022/input-group/input-group-engine.mjs +219 -0
- package/esm2022/input-group/models/index.mjs +2 -0
- package/esm2022/input-group/models/input-group.model.mjs +2 -0
- package/esm2022/input-group/ngxsmk-cdk-input-group.mjs +5 -0
- package/esm2022/listbox-keyboard/index.mjs +2 -0
- package/esm2022/listbox-keyboard/listbox-keyboard.mjs +145 -0
- package/esm2022/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.mjs +5 -0
- package/esm2022/public-api.mjs +10 -1
- package/esm2022/scheduler/index.mjs +5 -0
- package/esm2022/scheduler/models/date-range.mjs +2 -0
- package/esm2022/scheduler/models/event.model.mjs +2 -0
- package/esm2022/scheduler/models/index.mjs +6 -0
- package/esm2022/scheduler/models/resource.model.mjs +5 -0
- package/esm2022/scheduler/models/selection.model.mjs +7 -0
- package/esm2022/scheduler/models/view.model.mjs +7 -0
- package/esm2022/scheduler/ngxsmk-cdk-scheduler.mjs +5 -0
- package/esm2022/scheduler/plugin/drag-plugin.mjs +82 -0
- package/esm2022/scheduler/plugin/index.mjs +8 -0
- package/esm2022/scheduler/plugin/keyboard-plugin.mjs +150 -0
- package/esm2022/scheduler/plugin/plugin-host.mjs +48 -0
- package/esm2022/scheduler/plugin/plugin.types.mjs +2 -0
- package/esm2022/scheduler/plugin/resize-plugin.mjs +74 -0
- package/esm2022/scheduler/plugin/selection-plugin.mjs +84 -0
- package/esm2022/scheduler/plugin/tooltip-plugin.mjs +103 -0
- package/esm2022/scheduler/scheduler-engine.mjs +316 -0
- package/esm2022/scheduler/utils/date-utils.mjs +131 -0
- package/esm2022/scheduler/utils/index.mjs +3 -0
- package/esm2022/scheduler/utils/snap.mjs +24 -0
- package/esm2022/spreadsheet/index.mjs +5 -0
- package/esm2022/spreadsheet/models/cell.model.mjs +2 -0
- package/esm2022/spreadsheet/models/column.model.mjs +2 -0
- package/esm2022/spreadsheet/models/filter.model.mjs +2 -0
- package/esm2022/spreadsheet/models/formula.model.mjs +2 -0
- package/esm2022/spreadsheet/models/index.mjs +8 -0
- package/esm2022/spreadsheet/models/row.model.mjs +2 -0
- package/esm2022/spreadsheet/models/selection.model.mjs +2 -0
- package/esm2022/spreadsheet/models/sort.model.mjs +2 -0
- package/esm2022/spreadsheet/ngxsmk-cdk-spreadsheet.mjs +5 -0
- package/esm2022/spreadsheet/plugin/clipboard-plugin.mjs +171 -0
- package/esm2022/spreadsheet/plugin/filter-plugin.mjs +87 -0
- package/esm2022/spreadsheet/plugin/formula-plugin.mjs +456 -0
- package/esm2022/spreadsheet/plugin/index.mjs +10 -0
- package/esm2022/spreadsheet/plugin/plugin-host.mjs +188 -0
- package/esm2022/spreadsheet/plugin/plugin.types.mjs +2 -0
- package/esm2022/spreadsheet/plugin/selection-plugin.mjs +114 -0
- package/esm2022/spreadsheet/plugin/sort-plugin.mjs +63 -0
- package/esm2022/spreadsheet/plugin/undo-plugin.mjs +138 -0
- package/esm2022/spreadsheet/plugin/validation-plugin.mjs +71 -0
- package/esm2022/spreadsheet/spreadsheet-engine.mjs +547 -0
- package/esm2022/spreadsheet/utils/cell-utils.mjs +129 -0
- package/esm2022/spreadsheet/utils/index.mjs +2 -0
- package/esm2022/testing/a11y.mjs +6 -3
- package/fesm2022/ngxsmk-cdk-cva-base.mjs +52 -0
- package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-input-group.mjs +226 -0
- package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs +152 -0
- package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-scheduler.mjs +1035 -0
- package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs +1969 -0
- package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -0
- package/fesm2022/ngxsmk-cdk-testing.mjs +5 -2
- package/fesm2022/ngxsmk-cdk-testing.mjs.map +1 -1
- package/fesm2022/ngxsmk-cdk.mjs +5 -0
- package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
- package/input-group/index.d.ts +3 -0
- package/input-group/index.d.ts.map +1 -0
- package/input-group/input-group-engine.d.ts +88 -0
- package/input-group/input-group-engine.d.ts.map +1 -0
- package/input-group/models/index.d.ts +2 -0
- package/input-group/models/index.d.ts.map +1 -0
- package/input-group/models/input-group.model.d.ts +114 -0
- package/input-group/models/input-group.model.d.ts.map +1 -0
- package/input-group/ngxsmk-cdk-input-group.d.ts.map +1 -0
- package/listbox-keyboard/index.d.ts +2 -0
- package/listbox-keyboard/index.d.ts.map +1 -0
- package/listbox-keyboard/listbox-keyboard.d.ts +60 -0
- package/listbox-keyboard/listbox-keyboard.d.ts.map +1 -0
- package/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.d.ts.map +1 -0
- package/package.json +40 -1
- package/public-api.d.ts +8 -0
- package/public-api.d.ts.map +1 -1
- package/scheduler/index.d.ts +5 -0
- package/scheduler/index.d.ts.map +1 -0
- package/scheduler/models/date-range.d.ts +6 -0
- package/scheduler/models/date-range.d.ts.map +1 -0
- package/scheduler/models/event.model.d.ts +50 -0
- package/scheduler/models/event.model.d.ts.map +1 -0
- package/scheduler/models/index.d.ts +6 -0
- package/scheduler/models/index.d.ts.map +1 -0
- package/scheduler/models/resource.model.d.ts +16 -0
- package/scheduler/models/resource.model.d.ts.map +1 -0
- package/scheduler/models/selection.model.d.ts +12 -0
- package/scheduler/models/selection.model.d.ts.map +1 -0
- package/scheduler/models/view.model.d.ts +21 -0
- package/scheduler/models/view.model.d.ts.map +1 -0
- package/scheduler/ngxsmk-cdk-scheduler.d.ts.map +1 -0
- package/scheduler/plugin/drag-plugin.d.ts +28 -0
- package/scheduler/plugin/drag-plugin.d.ts.map +1 -0
- package/scheduler/plugin/index.d.ts +8 -0
- package/scheduler/plugin/index.d.ts.map +1 -0
- package/scheduler/plugin/keyboard-plugin.d.ts +24 -0
- package/scheduler/plugin/keyboard-plugin.d.ts.map +1 -0
- package/scheduler/plugin/plugin-host.d.ts +16 -0
- package/scheduler/plugin/plugin-host.d.ts.map +1 -0
- package/scheduler/plugin/plugin.types.d.ts +9 -0
- package/scheduler/plugin/plugin.types.d.ts.map +1 -0
- package/scheduler/plugin/resize-plugin.d.ts +26 -0
- package/scheduler/plugin/resize-plugin.d.ts.map +1 -0
- package/scheduler/plugin/selection-plugin.d.ts +40 -0
- package/scheduler/plugin/selection-plugin.d.ts.map +1 -0
- package/scheduler/plugin/tooltip-plugin.d.ts +41 -0
- package/scheduler/plugin/tooltip-plugin.d.ts.map +1 -0
- package/scheduler/scheduler-engine.d.ts +95 -0
- package/scheduler/scheduler-engine.d.ts.map +1 -0
- package/scheduler/utils/date-utils.d.ts +26 -0
- package/scheduler/utils/date-utils.d.ts.map +1 -0
- package/scheduler/utils/index.d.ts +3 -0
- package/scheduler/utils/index.d.ts.map +1 -0
- package/scheduler/utils/snap.d.ts +7 -0
- package/scheduler/utils/snap.d.ts.map +1 -0
- package/spreadsheet/index.d.ts +5 -0
- package/spreadsheet/index.d.ts.map +1 -0
- package/spreadsheet/models/cell.model.d.ts +44 -0
- package/spreadsheet/models/cell.model.d.ts.map +1 -0
- package/spreadsheet/models/column.model.d.ts +77 -0
- package/spreadsheet/models/column.model.d.ts.map +1 -0
- package/spreadsheet/models/filter.model.d.ts +15 -0
- package/spreadsheet/models/filter.model.d.ts.map +1 -0
- package/spreadsheet/models/formula.model.d.ts +65 -0
- package/spreadsheet/models/formula.model.d.ts.map +1 -0
- package/spreadsheet/models/index.d.ts +8 -0
- package/spreadsheet/models/index.d.ts.map +1 -0
- package/spreadsheet/models/row.model.d.ts +33 -0
- package/spreadsheet/models/row.model.d.ts.map +1 -0
- package/spreadsheet/models/selection.model.d.ts +18 -0
- package/spreadsheet/models/selection.model.d.ts.map +1 -0
- package/spreadsheet/models/sort.model.d.ts +14 -0
- package/spreadsheet/models/sort.model.d.ts.map +1 -0
- package/spreadsheet/ngxsmk-cdk-spreadsheet.d.ts.map +1 -0
- package/spreadsheet/plugin/clipboard-plugin.d.ts +24 -0
- package/spreadsheet/plugin/clipboard-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/filter-plugin.d.ts +21 -0
- package/spreadsheet/plugin/filter-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/formula-plugin.d.ts +39 -0
- package/spreadsheet/plugin/formula-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/index.d.ts +10 -0
- package/spreadsheet/plugin/index.d.ts.map +1 -0
- package/spreadsheet/plugin/plugin-host.d.ts +66 -0
- package/spreadsheet/plugin/plugin-host.d.ts.map +1 -0
- package/spreadsheet/plugin/plugin.types.d.ts +58 -0
- package/spreadsheet/plugin/plugin.types.d.ts.map +1 -0
- package/spreadsheet/plugin/selection-plugin.d.ts +28 -0
- package/spreadsheet/plugin/selection-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/sort-plugin.d.ts +18 -0
- package/spreadsheet/plugin/sort-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/undo-plugin.d.ts +40 -0
- package/spreadsheet/plugin/undo-plugin.d.ts.map +1 -0
- package/spreadsheet/plugin/validation-plugin.d.ts +29 -0
- package/spreadsheet/plugin/validation-plugin.d.ts.map +1 -0
- package/spreadsheet/spreadsheet-engine.d.ts +194 -0
- package/spreadsheet/spreadsheet-engine.d.ts.map +1 -0
- package/spreadsheet/utils/cell-utils.d.ts +26 -0
- package/spreadsheet/utils/cell-utils.d.ts.map +1 -0
- package/spreadsheet/utils/index.d.ts +2 -0
- package/spreadsheet/utils/index.d.ts.map +1 -0
- package/testing/a11y.d.ts +5 -1
- package/testing/a11y.d.ts.map +1 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export function createDefaultTooltipState() {
|
|
2
|
+
return {
|
|
3
|
+
visible: false,
|
|
4
|
+
event: null,
|
|
5
|
+
x: 0,
|
|
6
|
+
y: 0,
|
|
7
|
+
placement: 'top',
|
|
8
|
+
content: '',
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export class TooltipPlugin {
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
this.name = 'tooltip';
|
|
14
|
+
this.priority = 50;
|
|
15
|
+
this._timeout = null;
|
|
16
|
+
this._state = createDefaultTooltipState();
|
|
17
|
+
this._listeners = [];
|
|
18
|
+
this._options = {
|
|
19
|
+
delay: options.delay ?? 400,
|
|
20
|
+
showArrow: options.showArrow ?? true,
|
|
21
|
+
placement: options.placement ?? 'top',
|
|
22
|
+
maxWidth: options.maxWidth ?? 280,
|
|
23
|
+
onShow: options.onShow ?? (() => true),
|
|
24
|
+
onHide: options.onHide ??
|
|
25
|
+
(() => {
|
|
26
|
+
/* noop */
|
|
27
|
+
}),
|
|
28
|
+
content: options.content ?? defaultContent,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
onInit(engine) {
|
|
32
|
+
this._engine = engine;
|
|
33
|
+
}
|
|
34
|
+
onDestroy() {
|
|
35
|
+
this.hide();
|
|
36
|
+
this._clearTimeout();
|
|
37
|
+
for (const unlisten of this._listeners)
|
|
38
|
+
unlisten();
|
|
39
|
+
this._listeners = [];
|
|
40
|
+
}
|
|
41
|
+
show(event, targetEl) {
|
|
42
|
+
this._clearTimeout();
|
|
43
|
+
this._timeout = setTimeout(() => {
|
|
44
|
+
if (this._options.onShow(event) === false)
|
|
45
|
+
return;
|
|
46
|
+
const rect = targetEl.getBoundingClientRect();
|
|
47
|
+
const pos = this._computePosition(rect);
|
|
48
|
+
this._state = {
|
|
49
|
+
visible: true,
|
|
50
|
+
event,
|
|
51
|
+
x: pos.x,
|
|
52
|
+
y: pos.y,
|
|
53
|
+
placement: pos.placement,
|
|
54
|
+
content: this._options.content(event),
|
|
55
|
+
};
|
|
56
|
+
}, this._options.delay);
|
|
57
|
+
}
|
|
58
|
+
hide() {
|
|
59
|
+
this._clearTimeout();
|
|
60
|
+
if (this._state.event) {
|
|
61
|
+
this._options.onHide(this._state.event);
|
|
62
|
+
}
|
|
63
|
+
this._state = createDefaultTooltipState();
|
|
64
|
+
}
|
|
65
|
+
updatePosition(targetEl) {
|
|
66
|
+
if (!this._state.visible || !this._state.event)
|
|
67
|
+
return;
|
|
68
|
+
const rect = targetEl.getBoundingClientRect();
|
|
69
|
+
const pos = this._computePosition(rect);
|
|
70
|
+
this._state = { ...this._state, x: pos.x, y: pos.y, placement: pos.placement };
|
|
71
|
+
}
|
|
72
|
+
get state() {
|
|
73
|
+
return this._state;
|
|
74
|
+
}
|
|
75
|
+
get isVisible() {
|
|
76
|
+
return this._state.visible;
|
|
77
|
+
}
|
|
78
|
+
_computePosition(rect) {
|
|
79
|
+
const placement = this._options.placement;
|
|
80
|
+
const offset = 8;
|
|
81
|
+
switch (placement) {
|
|
82
|
+
case 'top':
|
|
83
|
+
return { x: rect.left + rect.width / 2, y: rect.top - offset, placement };
|
|
84
|
+
case 'bottom':
|
|
85
|
+
return { x: rect.left + rect.width / 2, y: rect.bottom + offset, placement };
|
|
86
|
+
case 'left':
|
|
87
|
+
return { x: rect.left - offset, y: rect.top + rect.height / 2, placement };
|
|
88
|
+
case 'right':
|
|
89
|
+
return { x: rect.right + offset, y: rect.top + rect.height / 2, placement };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
_clearTimeout() {
|
|
93
|
+
if (this._timeout) {
|
|
94
|
+
clearTimeout(this._timeout);
|
|
95
|
+
this._timeout = null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function defaultContent(event) {
|
|
100
|
+
const time = `${event.start.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} – ${event.end.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;
|
|
101
|
+
return `${event.title}\n${time}`;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jZGsvc2NoZWR1bGVyL3BsdWdpbi90b29sdGlwLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF1QkEsTUFBTSxVQUFVLHlCQUF5QjtJQUN2QyxPQUFPO1FBQ0wsT0FBTyxFQUFFLEtBQUs7UUFDZCxLQUFLLEVBQUUsSUFBSTtRQUNYLENBQUMsRUFBRSxDQUFDO1FBQ0osQ0FBQyxFQUFFLENBQUM7UUFDSixTQUFTLEVBQUUsS0FBSztRQUNoQixPQUFPLEVBQUUsRUFBRTtLQUNaLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxPQUFPLGFBQWE7SUFVeEIsWUFBWSxVQUFnQyxFQUFFO1FBVHJDLFNBQUksR0FBRyxTQUFTLENBQUM7UUFDakIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUlmLGFBQVEsR0FBeUMsSUFBSSxDQUFDO1FBQ3RELFdBQU0sR0FBaUIseUJBQXlCLEVBQUUsQ0FBQztRQUNuRCxlQUFVLEdBQW1CLEVBQUUsQ0FBQztRQUd0QyxJQUFJLENBQUMsUUFBUSxHQUFHO1lBQ2QsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksR0FBRztZQUMzQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxJQUFJO1lBQ3BDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLEtBQUs7WUFDckMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksR0FBRztZQUNqQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztZQUN0QyxNQUFNLEVBQ0osT0FBTyxDQUFDLE1BQU07Z0JBQ2QsQ0FBQyxHQUFHLEVBQUU7b0JBQ0osVUFBVTtnQkFDWixDQUFDLENBQUM7WUFDSixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxjQUFjO1NBQzNDLENBQUM7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LENBQUMsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNjaGVkdWxlckVuZ2luZSB9IGZyb20gJy4uL3NjaGVkdWxlci1lbmdpbmUnO1xuaW1wb3J0IHR5cGUgeyBTY2hlZHVsZXJFdmVudCB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgdHlwZSB7IFNjaGVkdWxlclBsdWdpbiB9IGZyb20gJy4vcGx1Z2luLnR5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sdGlwUGx1Z2luT3B0aW9ucyB7XG4gIGRlbGF5PzogbnVtYmVyO1xuICBzaG93QXJyb3c/OiBib29sZWFuO1xuICBwbGFjZW1lbnQ/OiAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JztcbiAgbWF4V2lkdGg/OiBudW1iZXI7XG4gIG9uU2hvdz86IChldmVudDogU2NoZWR1bGVyRXZlbnQpID0+IGJvb2xlYW4gfCB2b2lkO1xuICBvbkhpZGU/OiAoZXZlbnQ6IFNjaGVkdWxlckV2ZW50KSA9PiB2b2lkO1xuICBjb250ZW50PzogKGV2ZW50OiBTY2hlZHVsZXJFdmVudCkgPT4gc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2x0aXBTdGF0ZSB7XG4gIHZpc2libGU6IGJvb2xlYW47XG4gIGV2ZW50OiBTY2hlZHVsZXJFdmVudCB8IG51bGw7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICBwbGFjZW1lbnQ6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnO1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0VG9vbHRpcFN0YXRlKCk6IFRvb2x0aXBTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgdmlzaWJsZTogZmFsc2UsXG4gICAgZXZlbnQ6IG51bGwsXG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHBsYWNlbWVudDogJ3RvcCcsXG4gICAgY29udGVudDogJycsXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBUb29sdGlwUGx1Z2luIGltcGxlbWVudHMgU2NoZWR1bGVyUGx1Z2luIHtcbiAgcmVhZG9ubHkgbmFtZSA9ICd0b29sdGlwJztcbiAgcmVhZG9ubHkgcHJpb3JpdHkgPSA1MDtcblxuICBwcml2YXRlIF9lbmdpbmUhOiBTY2hlZHVsZXJFbmdpbmU7XG4gIHByaXZhdGUgX29wdGlvbnM6IFJlcXVpcmVkPFRvb2x0aXBQbHVnaW5PcHRpb25zPjtcbiAgcHJpdmF0ZSBfdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3RhdGU6IFRvb2x0aXBTdGF0ZSA9IGNyZWF0ZURlZmF1bHRUb29sdGlwU3RhdGUoKTtcbiAgcHJpdmF0ZSBfbGlzdGVuZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRvb2x0aXBQbHVnaW5PcHRpb25zID0ge30pIHtcbiAgICB0aGlzLl9vcHRpb25zID0ge1xuICAgICAgZGVsYXk6IG9wdGlvbnMuZGVsYXkgPz8gNDAwLFxuICAgICAgc2hvd0Fycm93OiBvcHRpb25zLnNob3dBcnJvdyA/PyB0cnVlLFxuICAgICAgcGxhY2VtZW50OiBvcHRpb25zLnBsYWNlbWVudCA/PyAndG9wJyxcbiAgICAgIG1heFdpZHRoOiBvcHRpb25zLm1heFdpZHRoID8/IDI4MCxcbiAgICAgIG9uU2hvdzogb3B0aW9ucy5vblNob3cgPz8gKCgpID0+IHRydWUpLFxuICAgICAgb25IaWRlOlxuICAgICAgICBvcHRpb25zLm9uSGlkZSA/P1xuICAgICAgICAoKCkgPT4ge1xuICAgICAgICAgIC8qIG5vb3AgKi9cbiAgICAgICAgfSksXG4gICAgICBjb250ZW50OiBvcHRpb25zLmNvbnRlbnQgPz8gZGVmYXVsdENvbnRlbnQsXG4gICAgfTtcbiAgfVxuXG4gIG9uSW5pdChlbmdpbmU6IFNjaGVkdWxlckVuZ2luZSk6IHZvaWQge1xuICAgIHRoaXMuX2VuZ2luZSA9IGVuZ2luZTtcbiAgfVxuXG4gIG9uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmhpZGUoKTtcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcbiAgICBmb3IgKGNvbnN0IHVubGlzdGVuIG9mIHRoaXMuX2xpc3RlbmVycykgdW5saXN0ZW4oKTtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgfVxuXG4gIHNob3coZXZlbnQ6IFNjaGVkdWxlckV2ZW50LCB0YXJnZXRFbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9jbGVhclRpbWVvdXQoKTtcblxuICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLm9uU2hvdyhldmVudCkgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHJlY3QgPSB0YXJnZXRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuX2NvbXB1dGVQb3NpdGlvbihyZWN0KTtcblxuICAgICAgdGhpcy5fc3RhdGUgPSB7XG4gICAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICAgIGV2ZW50LFxuICAgICAgICB4OiBwb3MueCxcbiAgICAgICAgeTogcG9zLnksXG4gICAgICAgIHBsYWNlbWVudDogcG9zLnBsYWNlbWVudCxcbiAgICAgICAgY29udGVudDogdGhpcy5fb3B0aW9ucy5jb250ZW50KGV2ZW50KSxcbiAgICAgIH07XG4gICAgfSwgdGhpcy5fb3B0aW9ucy5kZWxheSk7XG4gIH1cblxuICBoaWRlKCk6IHZvaWQge1xuICAgIHRoaXMuX2NsZWFyVGltZW91dCgpO1xuICAgIGlmICh0aGlzLl9zdGF0ZS5ldmVudCkge1xuICAgICAgdGhpcy5fb3B0aW9ucy5vbkhpZGUodGhpcy5fc3RhdGUuZXZlbnQpO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZSA9IGNyZWF0ZURlZmF1bHRUb29sdGlwU3RhdGUoKTtcbiAgfVxuXG4gIHVwZGF0ZVBvc2l0aW9uKHRhcmdldEVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3RhdGUudmlzaWJsZSB8fCAhdGhpcy5fc3RhdGUuZXZlbnQpIHJldHVybjtcbiAgICBjb25zdCByZWN0ID0gdGFyZ2V0RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgcG9zID0gdGhpcy5fY29tcHV0ZVBvc2l0aW9uKHJlY3QpO1xuICAgIHRoaXMuX3N0YXRlID0geyAuLi50aGlzLl9zdGF0ZSwgeDogcG9zLngsIHk6IHBvcy55LCBwbGFjZW1lbnQ6IHBvcy5wbGFjZW1lbnQgfTtcbiAgfVxuXG4gIGdldCBzdGF0ZSgpOiBUb29sdGlwU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIGdldCBpc1Zpc2libGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLnZpc2libGU7XG4gIH1cblxuICBwcml2YXRlIF9jb21wdXRlUG9zaXRpb24ocmVjdDogRE9NUmVjdCk6IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIHBsYWNlbWVudDogJ3RvcCcgfCAnYm90dG9tJyB8ICdsZWZ0JyB8ICdyaWdodCc7XG4gIH0ge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMuX29wdGlvbnMucGxhY2VtZW50O1xuICAgIGNvbnN0IG9mZnNldCA9IDg7XG5cbiAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgcmV0dXJuIHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDIsIHk6IHJlY3QudG9wIC0gb2Zmc2V0LCBwbGFjZW1lbnQgfTtcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHJldHVybiB7IHg6IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyLCB5OiByZWN0LmJvdHRvbSArIG9mZnNldCwgcGxhY2VtZW50IH07XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgcmV0dXJuIHsgeDogcmVjdC5sZWZ0IC0gb2Zmc2V0LCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gMiwgcGxhY2VtZW50IH07XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHJldHVybiB7IHg6IHJlY3QucmlnaHQgKyBvZmZzZXQsIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyLCBwbGFjZW1lbnQgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGVhclRpbWVvdXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0Q29udGVudChldmVudDogU2NoZWR1bGVyRXZlbnQpOiBzdHJpbmcge1xuICBjb25zdCB0aW1lID0gYCR7ZXZlbnQuc3RhcnQudG9Mb2NhbGVUaW1lU3RyaW5nKFtdLCB7IGhvdXI6ICcyLWRpZ2l0JywgbWludXRlOiAnMi1kaWdpdCcgfSl9IOKAkyAke2V2ZW50LmVuZC50b0xvY2FsZVRpbWVTdHJpbmcoW10sIHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KX1gO1xuICByZXR1cm4gYCR7ZXZlbnQudGl0bGV9XFxuJHt0aW1lfWA7XG59XG4iXX0=
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { computed, signal } from '@angular/core';
|
|
2
|
+
import { startOfDay, startOfWeek, endOfWeek, startOfMonth, endOfMonth, addDays, diffMinutes, isSameDay, dateRangeOverlaps, } from './utils/date-utils';
|
|
3
|
+
const HOUR_HEIGHT_MAP = {
|
|
4
|
+
compact: 48,
|
|
5
|
+
comfortable: 60,
|
|
6
|
+
dense: 36,
|
|
7
|
+
};
|
|
8
|
+
function computeRange(type, date, firstDayOfWeek) {
|
|
9
|
+
switch (type) {
|
|
10
|
+
case 'timeGridDay':
|
|
11
|
+
case 'dayGridDay':
|
|
12
|
+
case 'agenda':
|
|
13
|
+
return { start: startOfDay(date), end: addDays(startOfDay(date), 1) };
|
|
14
|
+
case 'timeGridWeek':
|
|
15
|
+
case 'dayGridWeek':
|
|
16
|
+
return { start: startOfWeek(date, firstDayOfWeek), end: endOfWeek(date, firstDayOfWeek) };
|
|
17
|
+
case 'timeGridWorkWeek': {
|
|
18
|
+
const weekStart = startOfWeek(date, firstDayOfWeek);
|
|
19
|
+
return { start: addDays(weekStart, 1), end: addDays(weekStart, 5) };
|
|
20
|
+
}
|
|
21
|
+
case 'timeGrid3Day':
|
|
22
|
+
return { start: startOfDay(date), end: addDays(startOfDay(date), 3) };
|
|
23
|
+
case 'dayGridMonth':
|
|
24
|
+
return { start: startOfMonth(date), end: endOfMonth(date) };
|
|
25
|
+
case 'timeline':
|
|
26
|
+
return { start: startOfWeek(date, firstDayOfWeek), end: endOfWeek(date, firstDayOfWeek) };
|
|
27
|
+
default:
|
|
28
|
+
return { start: startOfWeek(date, firstDayOfWeek), end: endOfWeek(date, firstDayOfWeek) };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class SchedulerEngine {
|
|
32
|
+
constructor(config = {}) {
|
|
33
|
+
this.now = signal(new Date());
|
|
34
|
+
this._config = config;
|
|
35
|
+
const firstDay = config.firstDayOfWeek ?? 1;
|
|
36
|
+
const date = config.date ?? new Date();
|
|
37
|
+
const view = config.defaultView ?? 'timeGridWeek';
|
|
38
|
+
const range = computeRange(view, date, firstDay);
|
|
39
|
+
this._lifecycle = {
|
|
40
|
+
beforeRender: signal(() => true),
|
|
41
|
+
afterRender: signal(() => {
|
|
42
|
+
/* noop */
|
|
43
|
+
}),
|
|
44
|
+
beforeCreate: signal(() => true),
|
|
45
|
+
afterCreate: signal(() => {
|
|
46
|
+
/* noop */
|
|
47
|
+
}),
|
|
48
|
+
beforeUpdate: signal(() => true),
|
|
49
|
+
afterUpdate: signal(() => {
|
|
50
|
+
/* noop */
|
|
51
|
+
}),
|
|
52
|
+
beforeDelete: signal(() => true),
|
|
53
|
+
afterDelete: signal(() => {
|
|
54
|
+
/* noop */
|
|
55
|
+
}),
|
|
56
|
+
beforeDrag: signal(() => true),
|
|
57
|
+
afterDrag: signal(() => {
|
|
58
|
+
/* noop */
|
|
59
|
+
}),
|
|
60
|
+
beforeResize: signal(() => true),
|
|
61
|
+
afterResize: signal(() => {
|
|
62
|
+
/* noop */
|
|
63
|
+
}),
|
|
64
|
+
};
|
|
65
|
+
this.events = signal(config.initialEvents ?? []);
|
|
66
|
+
this.resources = signal(config.initialResources ?? []);
|
|
67
|
+
this.plugins = signal(config.plugins ?? []);
|
|
68
|
+
this.viewState = signal({
|
|
69
|
+
type: view,
|
|
70
|
+
date: new Date(date),
|
|
71
|
+
rangeStart: range.start,
|
|
72
|
+
rangeEnd: range.end,
|
|
73
|
+
slotDuration: config.slotDuration ?? 30,
|
|
74
|
+
snapDuration: config.snapDuration ?? 15,
|
|
75
|
+
visibleHours: config.visibleHours ?? [0, 24],
|
|
76
|
+
firstDayOfWeek: firstDay,
|
|
77
|
+
locale: config.locale ?? 'en-US',
|
|
78
|
+
rtl: config.rtl ?? false,
|
|
79
|
+
density: config.density ?? 'comfortable',
|
|
80
|
+
showAllDay: config.showAllDay ?? true,
|
|
81
|
+
showWeekends: config.showWeekends ?? true,
|
|
82
|
+
showCurrentTime: config.showCurrentTime ?? true,
|
|
83
|
+
});
|
|
84
|
+
this.selection = signal({
|
|
85
|
+
selectedEventIds: new Set(),
|
|
86
|
+
selectedRange: null,
|
|
87
|
+
multiSelect: false,
|
|
88
|
+
focusedCell: null,
|
|
89
|
+
});
|
|
90
|
+
this.hourHeight = computed(() => HOUR_HEIGHT_MAP[this.viewState().density] ?? 60);
|
|
91
|
+
this.visibleEvents = computed(() => {
|
|
92
|
+
const vs = this.viewState();
|
|
93
|
+
const events = this.events();
|
|
94
|
+
return events.filter((e) => !e.allDay && dateRangeOverlaps(e.start, e.end, vs.rangeStart, vs.rangeEnd));
|
|
95
|
+
});
|
|
96
|
+
this.allDayEvents = computed(() => {
|
|
97
|
+
const vs = this.viewState();
|
|
98
|
+
const events = this.events();
|
|
99
|
+
return events.filter((e) => e.allDay && dateRangeOverlaps(e.start, e.end, vs.rangeStart, vs.rangeEnd));
|
|
100
|
+
});
|
|
101
|
+
this.timedEvents = computed(() => this.visibleEvents());
|
|
102
|
+
this.weekDates = computed(() => {
|
|
103
|
+
const vs = this.viewState();
|
|
104
|
+
const start = vs.rangeStart;
|
|
105
|
+
const dates = [];
|
|
106
|
+
let current = new Date(start);
|
|
107
|
+
while (current < vs.rangeEnd) {
|
|
108
|
+
dates.push(new Date(current));
|
|
109
|
+
current = addDays(current, 1);
|
|
110
|
+
}
|
|
111
|
+
return dates;
|
|
112
|
+
});
|
|
113
|
+
this.dayNames = computed(() => {
|
|
114
|
+
const locale = this.viewState().locale;
|
|
115
|
+
return Array.from({ length: 7 }, (_, i) => {
|
|
116
|
+
const d = startOfWeek(new Date(), this.viewState().firstDayOfWeek);
|
|
117
|
+
d.setDate(d.getDate() + i);
|
|
118
|
+
return d.toLocaleDateString(locale, { weekday: 'short' });
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
this.weekLabel = computed(() => {
|
|
122
|
+
const vs = this.viewState();
|
|
123
|
+
return (vs.rangeStart.toLocaleDateString(vs.locale, {
|
|
124
|
+
month: 'short',
|
|
125
|
+
day: 'numeric',
|
|
126
|
+
}) +
|
|
127
|
+
' – ' +
|
|
128
|
+
vs.rangeEnd.toLocaleDateString(vs.locale, {
|
|
129
|
+
month: 'short',
|
|
130
|
+
day: 'numeric',
|
|
131
|
+
year: 'numeric',
|
|
132
|
+
}));
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
get lifecycle() {
|
|
136
|
+
return this._lifecycle;
|
|
137
|
+
}
|
|
138
|
+
// ── Navigation ──
|
|
139
|
+
next() {
|
|
140
|
+
const vs = this.viewState();
|
|
141
|
+
const date = addDays(vs.date, this._viewSpan(vs.type));
|
|
142
|
+
this._navigateTo(date);
|
|
143
|
+
}
|
|
144
|
+
previous() {
|
|
145
|
+
const vs = this.viewState();
|
|
146
|
+
const date = addDays(vs.date, -this._viewSpan(vs.type));
|
|
147
|
+
this._navigateTo(date);
|
|
148
|
+
}
|
|
149
|
+
today() {
|
|
150
|
+
this._navigateTo(new Date());
|
|
151
|
+
}
|
|
152
|
+
goto(date) {
|
|
153
|
+
this._navigateTo(date);
|
|
154
|
+
}
|
|
155
|
+
setView(type, date) {
|
|
156
|
+
const vs = this.viewState();
|
|
157
|
+
const refDate = date ?? vs.date;
|
|
158
|
+
const range = computeRange(type, refDate, vs.firstDayOfWeek);
|
|
159
|
+
this.viewState.update((s) => ({
|
|
160
|
+
...s,
|
|
161
|
+
type,
|
|
162
|
+
date: new Date(refDate),
|
|
163
|
+
rangeStart: range.start,
|
|
164
|
+
rangeEnd: range.end,
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
// ── Event Mutations ──
|
|
168
|
+
addEvent(event) {
|
|
169
|
+
if (!this._runHook(this._lifecycle.beforeCreate, event))
|
|
170
|
+
return;
|
|
171
|
+
this.events.update((evts) => [...evts, event]);
|
|
172
|
+
this._lifecycle.afterCreate()(event);
|
|
173
|
+
}
|
|
174
|
+
updateEvent(id, patch) {
|
|
175
|
+
const existing = this.events().find((e) => e.id === id);
|
|
176
|
+
if (!existing)
|
|
177
|
+
return;
|
|
178
|
+
const updated = { ...existing, ...patch };
|
|
179
|
+
if (!this._runHook(this._lifecycle.beforeUpdate, updated))
|
|
180
|
+
return;
|
|
181
|
+
this.events.update((evts) => evts.map((e) => (e.id === id ? updated : e)));
|
|
182
|
+
this._lifecycle.afterUpdate()(updated);
|
|
183
|
+
}
|
|
184
|
+
removeEvent(id) {
|
|
185
|
+
const existing = this.events().find((e) => e.id === id);
|
|
186
|
+
if (!existing)
|
|
187
|
+
return;
|
|
188
|
+
if (!this._runHook(this._lifecycle.beforeDelete, existing))
|
|
189
|
+
return;
|
|
190
|
+
this.events.update((evts) => evts.filter((e) => e.id !== id));
|
|
191
|
+
this._lifecycle.afterDelete()(existing);
|
|
192
|
+
}
|
|
193
|
+
moveEvent(id, newStart, newEnd, resourceId) {
|
|
194
|
+
const existing = this.events().find((e) => e.id === id);
|
|
195
|
+
if (!existing)
|
|
196
|
+
return;
|
|
197
|
+
const move = {
|
|
198
|
+
event: existing,
|
|
199
|
+
from: existing.start,
|
|
200
|
+
to: newStart,
|
|
201
|
+
newStart,
|
|
202
|
+
newEnd,
|
|
203
|
+
resourceId,
|
|
204
|
+
};
|
|
205
|
+
if (!this._runHook(this._lifecycle.beforeDrag, existing))
|
|
206
|
+
return;
|
|
207
|
+
this.events.update((evts) => evts.map((e) => e.id === id
|
|
208
|
+
? { ...e, start: newStart, end: newEnd, resourceId: resourceId ?? e.resourceId }
|
|
209
|
+
: e));
|
|
210
|
+
this._lifecycle.afterDrag()(move);
|
|
211
|
+
}
|
|
212
|
+
resizeEvent(id, newEnd) {
|
|
213
|
+
const existing = this.events().find((e) => e.id === id);
|
|
214
|
+
if (!existing)
|
|
215
|
+
return;
|
|
216
|
+
const resize = {
|
|
217
|
+
event: existing,
|
|
218
|
+
oldEnd: existing.end,
|
|
219
|
+
newEnd,
|
|
220
|
+
};
|
|
221
|
+
if (!this._runHook(this._lifecycle.beforeResize, existing))
|
|
222
|
+
return;
|
|
223
|
+
this.events.update((evts) => evts.map((e) => (e.id === id ? { ...e, end: newEnd } : e)));
|
|
224
|
+
this._lifecycle.afterResize()(resize);
|
|
225
|
+
}
|
|
226
|
+
// ── Selection ──
|
|
227
|
+
selectEvent(id, multi = false) {
|
|
228
|
+
this.selection.update((s) => {
|
|
229
|
+
const ids = new Set(multi ? s.selectedEventIds : []);
|
|
230
|
+
if (ids.has(id)) {
|
|
231
|
+
ids.delete(id);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
ids.add(id);
|
|
235
|
+
}
|
|
236
|
+
return { ...s, selectedEventIds: ids };
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
selectRange(start, end, resourceId) {
|
|
240
|
+
this.selection.update((s) => ({
|
|
241
|
+
...s,
|
|
242
|
+
selectedRange: { start, end, resourceId },
|
|
243
|
+
}));
|
|
244
|
+
}
|
|
245
|
+
clearSelection() {
|
|
246
|
+
this.selection.update((s) => ({
|
|
247
|
+
...s,
|
|
248
|
+
selectedEventIds: new Set(),
|
|
249
|
+
selectedRange: null,
|
|
250
|
+
}));
|
|
251
|
+
}
|
|
252
|
+
isEventSelected(id) {
|
|
253
|
+
return this.selection().selectedEventIds.has(id);
|
|
254
|
+
}
|
|
255
|
+
// ── Queries ──
|
|
256
|
+
eventsForDay(day) {
|
|
257
|
+
return this.visibleEvents().filter((e) => isSameDay(e.start, day));
|
|
258
|
+
}
|
|
259
|
+
allDayEventsForDay(day) {
|
|
260
|
+
return this.allDayEvents().filter((e) => e.start.getTime() <= day.getTime() + 86_400_000 && e.end.getTime() >= day.getTime());
|
|
261
|
+
}
|
|
262
|
+
getEventsInRange(start, end) {
|
|
263
|
+
return this.events().filter((e) => dateRangeOverlaps(e.start, e.end, start, end));
|
|
264
|
+
}
|
|
265
|
+
eventTop(event) {
|
|
266
|
+
const hh = this.hourHeight();
|
|
267
|
+
return ((event.start.getHours() * 60 + event.start.getMinutes()) / 60) * hh;
|
|
268
|
+
}
|
|
269
|
+
eventHeight(event) {
|
|
270
|
+
const hh = this.hourHeight();
|
|
271
|
+
const durationMin = diffMinutes(event.start, event.end);
|
|
272
|
+
return Math.max((durationMin / 60) * hh, 18);
|
|
273
|
+
}
|
|
274
|
+
currentTimeY() {
|
|
275
|
+
const hh = this.hourHeight();
|
|
276
|
+
const now = this.now();
|
|
277
|
+
return ((now.getHours() * 60 + now.getMinutes()) / 60) * hh;
|
|
278
|
+
}
|
|
279
|
+
// ── Private ──
|
|
280
|
+
_navigateTo(date) {
|
|
281
|
+
const vs = this.viewState();
|
|
282
|
+
const range = computeRange(vs.type, date, vs.firstDayOfWeek);
|
|
283
|
+
this.viewState.update((s) => ({
|
|
284
|
+
...s,
|
|
285
|
+
date: new Date(date),
|
|
286
|
+
rangeStart: range.start,
|
|
287
|
+
rangeEnd: range.end,
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
_viewSpan(type) {
|
|
291
|
+
switch (type) {
|
|
292
|
+
case 'timeGridDay':
|
|
293
|
+
case 'dayGridDay':
|
|
294
|
+
case 'agenda':
|
|
295
|
+
return 1;
|
|
296
|
+
case 'timeGrid3Day':
|
|
297
|
+
return 3;
|
|
298
|
+
case 'timeGridWorkWeek':
|
|
299
|
+
case 'timeGridWeek':
|
|
300
|
+
case 'dayGridWeek':
|
|
301
|
+
return 7;
|
|
302
|
+
case 'dayGridMonth':
|
|
303
|
+
return 30;
|
|
304
|
+
case 'timeline':
|
|
305
|
+
return 7;
|
|
306
|
+
default:
|
|
307
|
+
return 7;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
_runHook(hook, arg) {
|
|
311
|
+
const fn = hook();
|
|
312
|
+
const result = fn(arg);
|
|
313
|
+
return result === false ? false : true;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLWVuZ2luZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Nkay9zY2hlZHVsZXIvc2NoZWR1bGVyLWVuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBb0MsTUFBTSxlQUFlLENBQUM7QUFhbkYsT0FBTyxFQUNMLFVBQVUsRUFDVixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsT0FBTyxFQUNQLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sb0JBQW9CLENBQUM7QUFrQzVCLE1BQU0sZUFBZSxHQUE0QjtJQUMvQyxPQUFPLEVBQUUsRUFBRTtJQUNYLFdBQVcsRUFBRSxFQUFFO0lBQ2YsS0FBSyxFQUFFLEVBQUU7Q0FDVixDQUFDO0FBRUYsU0FBUyxZQUFZLENBQ25CLElBQWMsRUFDZCxJQUFVLEVBQ1YsY0FBc0I7SUFFdEIsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssYUFBYSxDQUFDO1FBQ25CLEtBQUssWUFBWSxDQUFDO1FBQ2xCLEtBQUssUUFBUTtZQUNYLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEUsS0FBSyxjQUFjLENBQUM7UUFDcEIsS0FBSyxhQUFhO1lBQ2hCLE9BQU8sRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQzVGLEtBQUssa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDcEQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEUsQ0FBQztRQUNELEtBQUssY0FBYztZQUNqQixPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hFLEtBQUssY0FBYztZQUNqQixPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDOUQsS0FBSyxVQUFVO1lBQ2IsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDNUY7WUFDRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQztJQUM5RixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sT0FBTyxlQUFlO0lBb0IxQixZQUFZLFNBQTBCLEVBQUU7UUFkL0IsUUFBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFlaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUM7UUFDNUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDO1FBQ2xELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDaEIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDaEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLFVBQVU7WUFDWixDQUFDLENBQUM7WUFDRixZQUFZLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNoQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDdkIsVUFBVTtZQUNaLENBQUMsQ0FBQztZQUNGLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUN2QixVQUFVO1lBQ1osQ0FBQyxDQUFDO1lBQ0YsWUFBWSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDaEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLFVBQVU7WUFDWixDQUFDLENBQUM7WUFDRixVQUFVLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztZQUM5QixTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDckIsVUFBVTtZQUNaLENBQUMsQ0FBQztZQUNGLFlBQVksRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFdBQVcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFO2dCQUN2QixVQUFVO1lBQ1osQ0FBQyxDQUFDO1NBQ0gsQ0FBQztRQUVGLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQVk7WUFDakMsSUFBSSxFQUFFLElBQUk7WUFDVixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsS0FBSztZQUN2QixRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDbkIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRTtZQUN2QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFO1lBQ3ZDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxjQUFjLEVBQUUsUUFBUTtZQUN4QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxPQUFPO1lBQ2hDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUs7WUFDeEIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksYUFBYTtZQUN4QyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJO1lBQ3JDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUk7WUFDekMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxlQUFlLElBQUksSUFBSTtTQUNoRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBaUI7WUFDdEMsZ0JBQWdCLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDM0IsYUFBYSxFQUFFLElBQUk7WUFDbkIsV0FBVyxFQUFFLEtBQUs7WUFDbEIsV0FBVyxFQUFFLElBQUk7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVsRixJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDakMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQ2xCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUNsRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDaEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQ2xCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FDakYsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzdCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM1QixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQzVCLE1BQU0sS0FBSyxHQUFXLEVBQUUsQ0FBQztZQUN6QixJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixPQUFPLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDOUIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN2QyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLE1BQU0sQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbkUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDN0IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sQ0FDTCxFQUFFLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFDLEtBQUssRUFBRSxPQUFPO2dCQUNkLEdBQUcsRUFBRSxTQUFTO2FBQ2YsQ0FBQztnQkFDRixLQUFLO2dCQUNMLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRTtvQkFDeEMsS0FBSyxFQUFFLE9BQU87b0JBQ2QsR0FBRyxFQUFFLFNBQVM7b0JBQ2QsSUFBSSxFQUFFLFNBQVM7aUJBQ2hCLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxtQkFBbUI7SUFFbkIsSUFBSTtRQUNGLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELFFBQVE7UUFDTixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxDQUFDLElBQVU7UUFDYixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBYyxFQUFFLElBQVc7UUFDakMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QixHQUFHLENBQUM7WUFDSixJQUFJO1lBQ0osSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDdkIsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHO1NBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELHdCQUF3QjtJQUV4QixRQUFRLENBQUMsS0FBcUI7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDO1lBQUUsT0FBTztRQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFVLEVBQUUsS0FBOEI7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDdEIsTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQztZQUFFLE9BQU87UUFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFdBQVcsQ0FBQyxFQUFVO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQztZQUFFLE9BQU87UUFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxTQUFTLENBQUMsRUFBVSxFQUFFLFFBQWMsRUFBRSxNQUFZLEVBQUUsVUFBbUI7UUFDckUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFdEIsTUFBTSxJQUFJLEdBQWtCO1lBQzFCLEtBQUssRUFBRSxRQUFRO1lBQ2YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3BCLEVBQUUsRUFBRSxRQUFRO1lBQ1osUUFBUTtZQUNSLE1BQU07WUFDTixVQUFVO1NBQ1gsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQztZQUFFLE9BQU87UUFFakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDYixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUU7WUFDVCxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFO1lBQ2hGLENBQUMsQ0FBQyxDQUFDLENBQ04sQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQVUsRUFBRSxNQUFZO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRXRCLE1BQU0sTUFBTSxHQUFvQjtZQUM5QixLQUFLLEVBQUUsUUFBUTtZQUNmLE1BQU0sRUFBRSxRQUFRLENBQUMsR0FBRztZQUNwQixNQUFNO1NBQ1AsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQztZQUFFLE9BQU87UUFFbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsa0JBQWtCO0lBRWxCLFdBQVcsQ0FBQyxFQUFVLEVBQUUsS0FBSyxHQUFHLEtBQUs7UUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDZCxDQUFDO1lBQ0QsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFXLEVBQUUsR0FBUyxFQUFFLFVBQW1CO1FBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLEdBQUcsQ0FBQztZQUNKLGFBQWEsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFO1NBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QixHQUFHLENBQUM7WUFDSixnQkFBZ0IsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUMzQixhQUFhLEVBQUUsSUFBSTtTQUNwQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxlQUFlLENBQUMsRUFBVTtRQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELGdCQUFnQjtJQUVoQixZQUFZLENBQUMsR0FBUztRQUNwQixPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGtCQUFrQixDQUFDLEdBQVM7UUFDMUIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUMvQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUMzRixDQUFDO0lBQ0osQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQVcsRUFBRSxHQUFTO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBcUI7UUFDNUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDOUUsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFxQjtRQUMvQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDN0IsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELFlBQVk7UUFDVixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRCxnQkFBZ0I7SUFFUixXQUFXLENBQUMsSUFBVTtRQUM1QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QixHQUFHLENBQUM7WUFDSixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsS0FBSztZQUN2QixRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUc7U0FDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8sU0FBUyxDQUFDLElBQWM7UUFDOUIsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNiLEtBQUssYUFBYSxDQUFDO1lBQ25CLEtBQUssWUFBWSxDQUFDO1lBQ2xCLEtBQUssUUFBUTtnQkFDWCxPQUFPLENBQUMsQ0FBQztZQUNYLEtBQUssY0FBYztnQkFDakIsT0FBTyxDQUFDLENBQUM7WUFDWCxLQUFLLGtCQUFrQixDQUFDO1lBQ3hCLEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssYUFBYTtnQkFDaEIsT0FBTyxDQUFDLENBQUM7WUFDWCxLQUFLLGNBQWM7Z0JBQ2pCLE9BQU8sRUFBRSxDQUFDO1lBQ1osS0FBSyxVQUFVO2dCQUNiLE9BQU8sQ0FBQyxDQUFDO1lBQ1g7Z0JBQ0UsT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUVPLFFBQVEsQ0FBSSxJQUF3QyxFQUFFLEdBQU07UUFDbEUsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDbEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29tcHV0ZWQsIHNpZ25hbCwgdHlwZSBXcml0YWJsZVNpZ25hbCwgdHlwZSBTaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtcbiAgU2NoZWR1bGVyRXZlbnQsXG4gIFNjaGVkdWxlclJlc291cmNlLFxuICBTY2hlZHVsZXJNb3ZlLFxuICBTY2hlZHVsZXJSZXNpemUsXG4gIFZpZXdTdGF0ZSxcbiAgVmlld1R5cGUsXG4gIFNlbGVjdGlvblN0YXRlLFxuICBXb3JraW5nSG91cnMsXG4gIERlbnNpdHksXG59IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB0eXBlIHsgU2NoZWR1bGVyUGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLnR5cGVzJztcbmltcG9ydCB7XG4gIHN0YXJ0T2ZEYXksXG4gIHN0YXJ0T2ZXZWVrLFxuICBlbmRPZldlZWssXG4gIHN0YXJ0T2ZNb250aCxcbiAgZW5kT2ZNb250aCxcbiAgYWRkRGF5cyxcbiAgZGlmZk1pbnV0ZXMsXG4gIGlzU2FtZURheSxcbiAgZGF0ZVJhbmdlT3ZlcmxhcHMsXG59IGZyb20gJy4vdXRpbHMvZGF0ZS11dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyQ29uZmlnIHtcbiAgZGVmYXVsdFZpZXc/OiBWaWV3VHlwZTtcbiAgc2xvdER1cmF0aW9uPzogbnVtYmVyO1xuICBzbmFwRHVyYXRpb24/OiBudW1iZXI7XG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyO1xuICBsb2NhbGU/OiBzdHJpbmc7XG4gIHJ0bD86IGJvb2xlYW47XG4gIGRlbnNpdHk/OiBEZW5zaXR5O1xuICBzaG93QWxsRGF5PzogYm9vbGVhbjtcbiAgc2hvd1dlZWtlbmRzPzogYm9vbGVhbjtcbiAgc2hvd0N1cnJlbnRUaW1lPzogYm9vbGVhbjtcbiAgYnVzaW5lc3NIb3Vycz86IFdvcmtpbmdIb3VycztcbiAgdmlzaWJsZUhvdXJzPzogW251bWJlciwgbnVtYmVyXTtcbiAgcGx1Z2lucz86IFNjaGVkdWxlclBsdWdpbltdO1xuICBtYXhFdmVudHNQZXJDZWxsPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZUhvb2tzIHtcbiAgYmVmb3JlUmVuZGVyOiBTaWduYWw8KHN0YXRlOiBWaWV3U3RhdGUpID0+IHZvaWQ+O1xuICBhZnRlclJlbmRlcjogU2lnbmFsPChzdGF0ZTogVmlld1N0YXRlKSA9PiB2b2lkPjtcbiAgYmVmb3JlQ3JlYXRlOiBTaWduYWw8KGV2ZW50OiBTY2hlZHVsZXJFdmVudCkgPT4gYm9vbGVhbj47XG4gIGFmdGVyQ3JlYXRlOiBTaWduYWw8KGV2ZW50OiBTY2hlZHVsZXJFdmVudCkgPT4gdm9pZD47XG4gIGJlZm9yZVVwZGF0ZTogU2lnbmFsPChldmVudDogU2NoZWR1bGVyRXZlbnQpID0+IGJvb2xlYW4+O1xuICBhZnRlclVwZGF0ZTogU2lnbmFsPChldmVudDogU2NoZWR1bGVyRXZlbnQpID0+IHZvaWQ+O1xuICBiZWZvcmVEZWxldGU6IFNpZ25hbDwoZXZlbnQ6IFNjaGVkdWxlckV2ZW50KSA9PiBib29sZWFuPjtcbiAgYWZ0ZXJEZWxldGU6IFNpZ25hbDwoZXZlbnQ6IFNjaGVkdWxlckV2ZW50KSA9PiB2b2lkPjtcbiAgYmVmb3JlRHJhZzogU2lnbmFsPChldmVudDogU2NoZWR1bGVyRXZlbnQpID0+IGJvb2xlYW4+O1xuICBhZnRlckRyYWc6IFNpZ25hbDwobW92ZTogU2NoZWR1bGVyTW92ZSkgPT4gdm9pZD47XG4gIGJlZm9yZVJlc2l6ZTogU2lnbmFsPChldmVudDogU2NoZWR1bGVyRXZlbnQpID0+IGJvb2xlYW4+O1xuICBhZnRlclJlc2l6ZTogU2lnbmFsPChyZXNpemU6IFNjaGVkdWxlclJlc2l6ZSkgPT4gdm9pZD47XG59XG5cbmNvbnN0IEhPVVJfSEVJR0hUX01BUDogUmVjb3JkPERlbnNpdHksIG51bWJlcj4gPSB7XG4gIGNvbXBhY3Q6IDQ4LFxuICBjb21mb3J0YWJsZTogNjAsXG4gIGRlbnNlOiAzNixcbn07XG5cbmZ1bmN0aW9uIGNvbXB1dGVSYW5nZShcbiAgdHlwZTogVmlld1R5cGUsXG4gIGRhdGU6IERhdGUsXG4gIGZpcnN0RGF5T2ZXZWVrOiBudW1iZXIsXG4pOiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3RpbWVHcmlkRGF5JzpcbiAgICBjYXNlICdkYXlHcmlkRGF5JzpcbiAgICBjYXNlICdhZ2VuZGEnOlxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZEYXkoZGF0ZSksIGVuZDogYWRkRGF5cyhzdGFydE9mRGF5KGRhdGUpLCAxKSB9O1xuICAgIGNhc2UgJ3RpbWVHcmlkV2Vlayc6XG4gICAgY2FzZSAnZGF5R3JpZFdlZWsnOlxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0T2ZXZWVrKGRhdGUsIGZpcnN0RGF5T2ZXZWVrKSwgZW5kOiBlbmRPZldlZWsoZGF0ZSwgZmlyc3REYXlPZldlZWspIH07XG4gICAgY2FzZSAndGltZUdyaWRXb3JrV2Vlayc6IHtcbiAgICAgIGNvbnN0IHdlZWtTdGFydCA9IHN0YXJ0T2ZXZWVrKGRhdGUsIGZpcnN0RGF5T2ZXZWVrKTtcbiAgICAgIHJldHVybiB7IHN0YXJ0OiBhZGREYXlzKHdlZWtTdGFydCwgMSksIGVuZDogYWRkRGF5cyh3ZWVrU3RhcnQsIDUpIH07XG4gICAgfVxuICAgIGNhc2UgJ3RpbWVHcmlkM0RheSc6XG4gICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZkRheShkYXRlKSwgZW5kOiBhZGREYXlzKHN0YXJ0T2ZEYXkoZGF0ZSksIDMpIH07XG4gICAgY2FzZSAnZGF5R3JpZE1vbnRoJzpcbiAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mTW9udGgoZGF0ZSksIGVuZDogZW5kT2ZNb250aChkYXRlKSB9O1xuICAgIGNhc2UgJ3RpbWVsaW5lJzpcbiAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydE9mV2VlayhkYXRlLCBmaXJzdERheU9mV2VlayksIGVuZDogZW5kT2ZXZWVrKGRhdGUsIGZpcnN0RGF5T2ZXZWVrKSB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4geyBzdGFydDogc3RhcnRPZldlZWsoZGF0ZSwgZmlyc3REYXlPZldlZWspLCBlbmQ6IGVuZE9mV2VlayhkYXRlLCBmaXJzdERheU9mV2VlaykgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2NoZWR1bGVyRW5naW5lIHtcbiAgcmVhZG9ubHkgZXZlbnRzOiBXcml0YWJsZVNpZ25hbDxTY2hlZHVsZXJFdmVudFtdPjtcbiAgcmVhZG9ubHkgcmVzb3VyY2VzOiBXcml0YWJsZVNpZ25hbDxTY2hlZHVsZXJSZXNvdXJjZVtdPjtcbiAgcmVhZG9ubHkgdmlld1N0YXRlOiBXcml0YWJsZVNpZ25hbDxWaWV3U3RhdGU+O1xuICByZWFkb25seSBzZWxlY3Rpb246IFdyaXRhYmxlU2lnbmFsPFNlbGVjdGlvblN0YXRlPjtcbiAgcmVhZG9ubHkgcGx1Z2luczogV3JpdGFibGVTaWduYWw8U2NoZWR1bGVyUGx1Z2luW10+O1xuICByZWFkb25seSBub3cgPSBzaWduYWwobmV3IERhdGUoKSk7XG5cbiAgcmVhZG9ubHkgaG91ckhlaWdodDogU2lnbmFsPG51bWJlcj47XG5cbiAgcmVhZG9ubHkgdmlzaWJsZUV2ZW50czogU2lnbmFsPFNjaGVkdWxlckV2ZW50W10+O1xuICByZWFkb25seSBhbGxEYXlFdmVudHM6IFNpZ25hbDxTY2hlZHVsZXJFdmVudFtdPjtcbiAgcmVhZG9ubHkgdGltZWRFdmVudHM6IFNpZ25hbDxTY2hlZHVsZXJFdmVudFtdPjtcbiAgcmVhZG9ubHkgd2Vla0RhdGVzOiBTaWduYWw8RGF0ZVtdPjtcbiAgcmVhZG9ubHkgZGF5TmFtZXM6IFNpZ25hbDxzdHJpbmdbXT47XG4gIHJlYWRvbmx5IHdlZWtMYWJlbDogU2lnbmFsPHN0cmluZz47XG5cbiAgcHJpdmF0ZSBfbGlmZWN5Y2xlOiBMaWZlY3ljbGVIb29rcztcbiAgcHJpdmF0ZSBfY29uZmlnOiBTY2hlZHVsZXJDb25maWc7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBTY2hlZHVsZXJDb25maWcgPSB7fSkge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgICBjb25zdCBmaXJzdERheSA9IGNvbmZpZy5maXJzdERheU9mV2VlayA/PyAxO1xuICAgIGNvbnN0IGRhdGUgPSBjb25maWcuZGF0ZSA/PyBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHZpZXcgPSBjb25maWcuZGVmYXVsdFZpZXcgPz8gJ3RpbWVHcmlkV2Vlayc7XG4gICAgY29uc3QgcmFuZ2UgPSBjb21wdXRlUmFuZ2UodmlldywgZGF0ZSwgZmlyc3REYXkpO1xuXG4gICAgdGhpcy5fbGlmZWN5Y2xlID0ge1xuICAgICAgYmVmb3JlUmVuZGVyOiBzaWduYWwoKCkgPT4gdHJ1ZSksXG4gICAgICBhZnRlclJlbmRlcjogc2lnbmFsKCgpID0+IHtcbiAgICAgICAgLyogbm9vcCAqL1xuICAgICAgfSksXG4gICAgICBiZWZvcmVDcmVhdGU6IHNpZ25hbCgoKSA9PiB0cnVlKSxcbiAgICAgIGFmdGVyQ3JlYXRlOiBzaWduYWwoKCkgPT4ge1xuICAgICAgICAvKiBub29wICovXG4gICAgICB9KSxcbiAgICAgIGJlZm9yZVVwZGF0ZTogc2lnbmFsKCgpID0+IHRydWUpLFxuICAgICAgYWZ0ZXJVcGRhdGU6IHNpZ25hbCgoKSA9PiB7XG4gICAgICAgIC8qIG5vb3AgKi9cbiAgICAgIH0pLFxuICAgICAgYmVmb3JlRGVsZXRlOiBzaWduYWwoKCkgPT4gdHJ1ZSksXG4gICAgICBhZnRlckRlbGV0ZTogc2lnbmFsKCgpID0+IHtcbiAgICAgICAgLyogbm9vcCAqL1xuICAgICAgfSksXG4gICAgICBiZWZvcmVEcmFnOiBzaWduYWwoKCkgPT4gdHJ1ZSksXG4gICAgICBhZnRlckRyYWc6IHNpZ25hbCgoKSA9PiB7XG4gICAgICAgIC8qIG5vb3AgKi9cbiAgICAgIH0pLFxuICAgICAgYmVmb3JlUmVzaXplOiBzaWduYWwoKCkgPT4gdHJ1ZSksXG4gICAgICBhZnRlclJlc2l6ZTogc2lnbmFsKCgpID0+IHtcbiAgICAgICAgLyogbm9vcCAqL1xuICAgICAgfSksXG4gICAgfTtcblxuICAgIHRoaXMuZXZlbnRzID0gc2lnbmFsKGNvbmZpZy5pbml0aWFsRXZlbnRzID8/IFtdKTtcbiAgICB0aGlzLnJlc291cmNlcyA9IHNpZ25hbChjb25maWcuaW5pdGlhbFJlc291cmNlcyA/PyBbXSk7XG4gICAgdGhpcy5wbHVnaW5zID0gc2lnbmFsKGNvbmZpZy5wbHVnaW5zID8/IFtdKTtcblxuICAgIHRoaXMudmlld1N0YXRlID0gc2lnbmFsPFZpZXdTdGF0ZT4oe1xuICAgICAgdHlwZTogdmlldyxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKGRhdGUpLFxuICAgICAgcmFuZ2VTdGFydDogcmFuZ2Uuc3RhcnQsXG4gICAgICByYW5nZUVuZDogcmFuZ2UuZW5kLFxuICAgICAgc2xvdER1cmF0aW9uOiBjb25maWcuc2xvdER1cmF0aW9uID8/IDMwLFxuICAgICAgc25hcER1cmF0aW9uOiBjb25maWcuc25hcER1cmF0aW9uID8/IDE1LFxuICAgICAgdmlzaWJsZUhvdXJzOiBjb25maWcudmlzaWJsZUhvdXJzID8/IFswLCAyNF0sXG4gICAgICBmaXJzdERheU9mV2VlazogZmlyc3REYXksXG4gICAgICBsb2NhbGU6IGNvbmZpZy5sb2NhbGUgPz8gJ2VuLVVTJyxcbiAgICAgIHJ0bDogY29uZmlnLnJ0bCA/PyBmYWxzZSxcbiAgICAgIGRlbnNpdHk6IGNvbmZpZy5kZW5zaXR5ID8/ICdjb21mb3J0YWJsZScsXG4gICAgICBzaG93QWxsRGF5OiBjb25maWcuc2hvd0FsbERheSA/PyB0cnVlLFxuICAgICAgc2hvd1dlZWtlbmRzOiBjb25maWcuc2hvd1dlZWtlbmRzID8/IHRydWUsXG4gICAgICBzaG93Q3VycmVudFRpbWU6IGNvbmZpZy5zaG93Q3VycmVudFRpbWUgPz8gdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uID0gc2lnbmFsPFNlbGVjdGlvblN0YXRlPih7XG4gICAgICBzZWxlY3RlZEV2ZW50SWRzOiBuZXcgU2V0KCksXG4gICAgICBzZWxlY3RlZFJhbmdlOiBudWxsLFxuICAgICAgbXVsdGlTZWxlY3Q6IGZhbHNlLFxuICAgICAgZm9jdXNlZENlbGw6IG51bGwsXG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdXJIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiBIT1VSX0hFSUdIVF9NQVBbdGhpcy52aWV3U3RhdGUoKS5kZW5zaXR5XSA/PyA2MCk7XG5cbiAgICB0aGlzLnZpc2libGVFdmVudHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCB2cyA9IHRoaXMudmlld1N0YXRlKCk7XG4gICAgICBjb25zdCBldmVudHMgPSB0aGlzLmV2ZW50cygpO1xuICAgICAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoXG4gICAgICAgIChlKSA9PiAhZS5hbGxEYXkgJiYgZGF0ZVJhbmdlT3ZlcmxhcHMoZS5zdGFydCwgZS5lbmQsIHZzLnJhbmdlU3RhcnQsIHZzLnJhbmdlRW5kKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFsbERheUV2ZW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGNvbnN0IHZzID0gdGhpcy52aWV3U3RhdGUoKTtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IHRoaXMuZXZlbnRzKCk7XG4gICAgICByZXR1cm4gZXZlbnRzLmZpbHRlcihcbiAgICAgICAgKGUpID0+IGUuYWxsRGF5ICYmIGRhdGVSYW5nZU92ZXJsYXBzKGUuc3RhcnQsIGUuZW5kLCB2cy5yYW5nZVN0YXJ0LCB2cy5yYW5nZUVuZCksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdGhpcy50aW1lZEV2ZW50cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlzaWJsZUV2ZW50cygpKTtcblxuICAgIHRoaXMud2Vla0RhdGVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgY29uc3QgdnMgPSB0aGlzLnZpZXdTdGF0ZSgpO1xuICAgICAgY29uc3Qgc3RhcnQgPSB2cy5yYW5nZVN0YXJ0O1xuICAgICAgY29uc3QgZGF0ZXM6IERhdGVbXSA9IFtdO1xuICAgICAgbGV0IGN1cnJlbnQgPSBuZXcgRGF0ZShzdGFydCk7XG4gICAgICB3aGlsZSAoY3VycmVudCA8IHZzLnJhbmdlRW5kKSB7XG4gICAgICAgIGRhdGVzLnB1c2gobmV3IERhdGUoY3VycmVudCkpO1xuICAgICAgICBjdXJyZW50ID0gYWRkRGF5cyhjdXJyZW50LCAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRlcztcbiAgICB9KTtcblxuICAgIHRoaXMuZGF5TmFtZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCBsb2NhbGUgPSB0aGlzLnZpZXdTdGF0ZSgpLmxvY2FsZTtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiA3IH0sIChfLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgpLCB0aGlzLnZpZXdTdGF0ZSgpLmZpcnN0RGF5T2ZXZWVrKTtcbiAgICAgICAgZC5zZXREYXRlKGQuZ2V0RGF0ZSgpICsgaSk7XG4gICAgICAgIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ3Nob3J0JyB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGhpcy53ZWVrTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICBjb25zdCB2cyA9IHRoaXMudmlld1N0YXRlKCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB2cy5yYW5nZVN0YXJ0LnRvTG9jYWxlRGF0ZVN0cmluZyh2cy5sb2NhbGUsIHtcbiAgICAgICAgICBtb250aDogJ3Nob3J0JyxcbiAgICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgfSkgK1xuICAgICAgICAnIOKAkyAnICtcbiAgICAgICAgdnMucmFuZ2VFbmQudG9Mb2NhbGVEYXRlU3RyaW5nKHZzLmxvY2FsZSwge1xuICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgbGlmZWN5Y2xlKCk6IExpZmVjeWNsZUhvb2tzIHtcbiAgICByZXR1cm4gdGhpcy5fbGlmZWN5Y2xlO1xuICB9XG5cbiAgLy8g4pSA4pSAIE5hdmlnYXRpb24g4pSA4pSAXG5cbiAgbmV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCB2cyA9IHRoaXMudmlld1N0YXRlKCk7XG4gICAgY29uc3QgZGF0ZSA9IGFkZERheXModnMuZGF0ZSwgdGhpcy5fdmlld1NwYW4odnMudHlwZSkpO1xuICAgIHRoaXMuX25hdmlnYXRlVG8oZGF0ZSk7XG4gIH1cblxuICBwcmV2aW91cygpOiB2b2lkIHtcbiAgICBjb25zdCB2cyA9IHRoaXMudmlld1N0YXRlKCk7XG4gICAgY29uc3QgZGF0ZSA9IGFkZERheXModnMuZGF0ZSwgLXRoaXMuX3ZpZXdTcGFuKHZzLnR5cGUpKTtcbiAgICB0aGlzLl9uYXZpZ2F0ZVRvKGRhdGUpO1xuICB9XG5cbiAgdG9kYXkoKTogdm9pZCB7XG4gICAgdGhpcy5fbmF2aWdhdGVUbyhuZXcgRGF0ZSgpKTtcbiAgfVxuXG4gIGdvdG8oZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuX25hdmlnYXRlVG8oZGF0ZSk7XG4gIH1cblxuICBzZXRWaWV3KHR5cGU6IFZpZXdUeXBlLCBkYXRlPzogRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHZzID0gdGhpcy52aWV3U3RhdGUoKTtcbiAgICBjb25zdCByZWZEYXRlID0gZGF0ZSA/PyB2cy5kYXRlO1xuICAgIGNvbnN0IHJhbmdlID0gY29tcHV0ZVJhbmdlKHR5cGUsIHJlZkRhdGUsIHZzLmZpcnN0RGF5T2ZXZWVrKTtcbiAgICB0aGlzLnZpZXdTdGF0ZS51cGRhdGUoKHMpID0+ICh7XG4gICAgICAuLi5zLFxuICAgICAgdHlwZSxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKHJlZkRhdGUpLFxuICAgICAgcmFuZ2VTdGFydDogcmFuZ2Uuc3RhcnQsXG4gICAgICByYW5nZUVuZDogcmFuZ2UuZW5kLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFdmVudCBNdXRhdGlvbnMg4pSA4pSAXG5cbiAgYWRkRXZlbnQoZXZlbnQ6IFNjaGVkdWxlckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9ydW5Ib29rKHRoaXMuX2xpZmVjeWNsZS5iZWZvcmVDcmVhdGUsIGV2ZW50KSkgcmV0dXJuO1xuICAgIHRoaXMuZXZlbnRzLnVwZGF0ZSgoZXZ0cykgPT4gWy4uLmV2dHMsIGV2ZW50XSk7XG4gICAgdGhpcy5fbGlmZWN5Y2xlLmFmdGVyQ3JlYXRlKCkoZXZlbnQpO1xuICB9XG5cbiAgdXBkYXRlRXZlbnQoaWQ6IHN0cmluZywgcGF0Y2g6IFBhcnRpYWw8U2NoZWR1bGVyRXZlbnQ+KTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmV2ZW50cygpLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG4gICAgY29uc3QgdXBkYXRlZCA9IHsgLi4uZXhpc3RpbmcsIC4uLnBhdGNoIH07XG4gICAgaWYgKCF0aGlzLl9ydW5Ib29rKHRoaXMuX2xpZmVjeWNsZS5iZWZvcmVVcGRhdGUsIHVwZGF0ZWQpKSByZXR1cm47XG4gICAgdGhpcy5ldmVudHMudXBkYXRlKChldnRzKSA9PiBldnRzLm1hcCgoZSkgPT4gKGUuaWQgPT09IGlkID8gdXBkYXRlZCA6IGUpKSk7XG4gICAgdGhpcy5fbGlmZWN5Y2xlLmFmdGVyVXBkYXRlKCkodXBkYXRlZCk7XG4gIH1cblxuICByZW1vdmVFdmVudChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmV2ZW50cygpLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG4gICAgaWYgKCF0aGlzLl9ydW5Ib29rKHRoaXMuX2xpZmVjeWNsZS5iZWZvcmVEZWxldGUsIGV4aXN0aW5nKSkgcmV0dXJuO1xuICAgIHRoaXMuZXZlbnRzLnVwZGF0ZSgoZXZ0cykgPT4gZXZ0cy5maWx0ZXIoKGUpID0+IGUuaWQgIT09IGlkKSk7XG4gICAgdGhpcy5fbGlmZWN5Y2xlLmFmdGVyRGVsZXRlKCkoZXhpc3RpbmcpO1xuICB9XG5cbiAgbW92ZUV2ZW50KGlkOiBzdHJpbmcsIG5ld1N0YXJ0OiBEYXRlLCBuZXdFbmQ6IERhdGUsIHJlc291cmNlSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZXZlbnRzKCkuZmluZCgoZSkgPT4gZS5pZCA9PT0gaWQpO1xuICAgIGlmICghZXhpc3RpbmcpIHJldHVybjtcblxuICAgIGNvbnN0IG1vdmU6IFNjaGVkdWxlck1vdmUgPSB7XG4gICAgICBldmVudDogZXhpc3RpbmcsXG4gICAgICBmcm9tOiBleGlzdGluZy5zdGFydCxcbiAgICAgIHRvOiBuZXdTdGFydCxcbiAgICAgIG5ld1N0YXJ0LFxuICAgICAgbmV3RW5kLFxuICAgICAgcmVzb3VyY2VJZCxcbiAgICB9O1xuXG4gICAgaWYgKCF0aGlzLl9ydW5Ib29rKHRoaXMuX2xpZmVjeWNsZS5iZWZvcmVEcmFnLCBleGlzdGluZykpIHJldHVybjtcblxuICAgIHRoaXMuZXZlbnRzLnVwZGF0ZSgoZXZ0cykgPT5cbiAgICAgIGV2dHMubWFwKChlKSA9PlxuICAgICAgICBlLmlkID09PSBpZFxuICAgICAgICAgID8geyAuLi5lLCBzdGFydDogbmV3U3RhcnQsIGVuZDogbmV3RW5kLCByZXNvdXJjZUlkOiByZXNvdXJjZUlkID8/IGUucmVzb3VyY2VJZCB9XG4gICAgICAgICAgOiBlLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgdGhpcy5fbGlmZWN5Y2xlLmFmdGVyRHJhZygpKG1vdmUpO1xuICB9XG5cbiAgcmVzaXplRXZlbnQoaWQ6IHN0cmluZywgbmV3RW5kOiBEYXRlKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmV2ZW50cygpLmZpbmQoKGUpID0+IGUuaWQgPT09IGlkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm47XG5cbiAgICBjb25zdCByZXNpemU6IFNjaGVkdWxlclJlc2l6ZSA9IHtcbiAgICAgIGV2ZW50OiBleGlzdGluZyxcbiAgICAgIG9sZEVuZDogZXhpc3RpbmcuZW5kLFxuICAgICAgbmV3RW5kLFxuICAgIH07XG5cbiAgICBpZiAoIXRoaXMuX3J1bkhvb2sodGhpcy5fbGlmZWN5Y2xlLmJlZm9yZVJlc2l6ZSwgZXhpc3RpbmcpKSByZXR1cm47XG5cbiAgICB0aGlzLmV2ZW50cy51cGRhdGUoKGV2dHMpID0+IGV2dHMubWFwKChlKSA9PiAoZS5pZCA9PT0gaWQgPyB7IC4uLmUsIGVuZDogbmV3RW5kIH0gOiBlKSkpO1xuXG4gICAgdGhpcy5fbGlmZWN5Y2xlLmFmdGVyUmVzaXplKCkocmVzaXplKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTZWxlY3Rpb24g4pSA4pSAXG5cbiAgc2VsZWN0RXZlbnQoaWQ6IHN0cmluZywgbXVsdGkgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uLnVwZGF0ZSgocykgPT4ge1xuICAgICAgY29uc3QgaWRzID0gbmV3IFNldChtdWx0aSA/IHMuc2VsZWN0ZWRFdmVudElkcyA6IFtdKTtcbiAgICAgIGlmIChpZHMuaGFzKGlkKSkge1xuICAgICAgICBpZHMuZGVsZXRlKGlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlkcy5hZGQoaWQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4ucywgc2VsZWN0ZWRFdmVudElkczogaWRzIH07XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RSYW5nZShzdGFydDogRGF0ZSwgZW5kOiBEYXRlLCByZXNvdXJjZUlkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb24udXBkYXRlKChzKSA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIHNlbGVjdGVkUmFuZ2U6IHsgc3RhcnQsIGVuZCwgcmVzb3VyY2VJZCB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uLnVwZGF0ZSgocykgPT4gKHtcbiAgICAgIC4uLnMsXG4gICAgICBzZWxlY3RlZEV2ZW50SWRzOiBuZXcgU2V0KCksXG4gICAgICBzZWxlY3RlZFJhbmdlOiBudWxsLFxuICAgIH0pKTtcbiAgfVxuXG4gIGlzRXZlbnRTZWxlY3RlZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uKCkuc2VsZWN0ZWRFdmVudElkcy5oYXMoaWQpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJpZXMg4pSA4pSAXG5cbiAgZXZlbnRzRm9yRGF5KGRheTogRGF0ZSk6IFNjaGVkdWxlckV2ZW50W10ge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVFdmVudHMoKS5maWx0ZXIoKGUpID0+IGlzU2FtZURheShlLnN0YXJ0LCBkYXkpKTtcbiAgfVxuXG4gIGFsbERheUV2ZW50c0ZvckRheShkYXk6IERhdGUpOiBTY2hlZHVsZXJFdmVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5hbGxEYXlFdmVudHMoKS5maWx0ZXIoXG4gICAgICAoZSkgPT4gZS5zdGFydC5nZXRUaW1lKCkgPD0gZGF5LmdldFRpbWUoKSArIDg2XzQwMF8wMDAgJiYgZS5lbmQuZ2V0VGltZSgpID49IGRheS5nZXRUaW1lKCksXG4gICAgKTtcbiAgfVxuXG4gIGdldEV2ZW50c0luUmFuZ2Uoc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSk6IFNjaGVkdWxlckV2ZW50W10ge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cygpLmZpbHRlcigoZSkgPT4gZGF0ZVJhbmdlT3ZlcmxhcHMoZS5zdGFydCwgZS5lbmQsIHN0YXJ0LCBlbmQpKTtcbiAgfVxuXG4gIGV2ZW50VG9wKGV2ZW50OiBTY2hlZHVsZXJFdmVudCk6IG51bWJlciB7XG4gICAgY29uc3QgaGggPSB0aGlzLmhvdXJIZWlnaHQoKTtcbiAgICByZXR1cm4gKChldmVudC5zdGFydC5nZXRIb3VycygpICogNjAgKyBldmVudC5zdGFydC5nZXRNaW51dGVzKCkpIC8gNjApICogaGg7XG4gIH1cblxuICBldmVudEhlaWdodChldmVudDogU2NoZWR1bGVyRXZlbnQpOiBudW1iZXIge1xuICAgIGNvbnN0IGhoID0gdGhpcy5ob3VySGVpZ2h0KCk7XG4gICAgY29uc3QgZHVyYXRpb25NaW4gPSBkaWZmTWludXRlcyhldmVudC5zdGFydCwgZXZlbnQuZW5kKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoKGR1cmF0aW9uTWluIC8gNjApICogaGgsIDE4KTtcbiAgfVxuXG4gIGN1cnJlbnRUaW1lWSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGhoID0gdGhpcy5ob3VySGVpZ2h0KCk7XG4gICAgY29uc3Qgbm93ID0gdGhpcy5ub3coKTtcbiAgICByZXR1cm4gKChub3cuZ2V0SG91cnMoKSAqIDYwICsgbm93LmdldE1pbnV0ZXMoKSkgLyA2MCkgKiBoaDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQcml2YXRlIOKUgOKUgFxuXG4gIHByaXZhdGUgX25hdmlnYXRlVG8oZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHZzID0gdGhpcy52aWV3U3RhdGUoKTtcbiAgICBjb25zdCByYW5nZSA9IGNvbXB1dGVSYW5nZSh2cy50eXBlLCBkYXRlLCB2cy5maXJzdERheU9mV2Vlayk7XG4gICAgdGhpcy52aWV3U3RhdGUudXBkYXRlKChzKSA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIGRhdGU6IG5ldyBEYXRlKGRhdGUpLFxuICAgICAgcmFuZ2VTdGFydDogcmFuZ2Uuc3RhcnQsXG4gICAgICByYW5nZUVuZDogcmFuZ2UuZW5kLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX3ZpZXdTcGFuKHR5cGU6IFZpZXdUeXBlKTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3RpbWVHcmlkRGF5JzpcbiAgICAgIGNhc2UgJ2RheUdyaWREYXknOlxuICAgICAgY2FzZSAnYWdlbmRhJzpcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICBjYXNlICd0aW1lR3JpZDNEYXknOlxuICAgICAgICByZXR1cm4gMztcbiAgICAgIGNhc2UgJ3RpbWVHcmlkV29ya1dlZWsnOlxuICAgICAgY2FzZSAndGltZUdyaWRXZWVrJzpcbiAgICAgIGNhc2UgJ2RheUdyaWRXZWVrJzpcbiAgICAgICAgcmV0dXJuIDc7XG4gICAgICBjYXNlICdkYXlHcmlkTW9udGgnOlxuICAgICAgICByZXR1cm4gMzA7XG4gICAgICBjYXNlICd0aW1lbGluZSc6XG4gICAgICAgIHJldHVybiA3O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcnVuSG9vazxUPihob29rOiBTaWduYWw8KGFyZzogVCkgPT4gYm9vbGVhbiB8IHZvaWQ+LCBhcmc6IFQpOiBib29sZWFuIHtcbiAgICBjb25zdCBmbiA9IGhvb2soKTtcbiAgICBjb25zdCByZXN1bHQgPSBmbihhcmcpO1xuICAgIHJldHVybiByZXN1bHQgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyQ29uZmlnIHtcbiAgZGVmYXVsdFZpZXc/OiBWaWV3VHlwZTtcbiAgc2xvdER1cmF0aW9uPzogbnVtYmVyO1xuICBzbmFwRHVyYXRpb24/OiBudW1iZXI7XG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyO1xuICBsb2NhbGU/OiBzdHJpbmc7XG4gIHJ0bD86IGJvb2xlYW47XG4gIGRlbnNpdHk/OiBEZW5zaXR5O1xuICBzaG93QWxsRGF5PzogYm9vbGVhbjtcbiAgc2hvd1dlZWtlbmRzPzogYm9vbGVhbjtcbiAgc2hvd0N1cnJlbnRUaW1lPzogYm9vbGVhbjtcbiAgYnVzaW5lc3NIb3Vycz86IFdvcmtpbmdIb3VycztcbiAgdmlzaWJsZUhvdXJzPzogW251bWJlciwgbnVtYmVyXTtcbiAgcGx1Z2lucz86IFNjaGVkdWxlclBsdWdpbltdO1xuICBtYXhFdmVudHNQZXJDZWxsPzogbnVtYmVyO1xuICBkYXRlPzogRGF0ZTtcbiAgaW5pdGlhbEV2ZW50cz86IFNjaGVkdWxlckV2ZW50W107XG4gIGluaXRpYWxSZXNvdXJjZXM/OiBTY2hlZHVsZXJSZXNvdXJjZVtdO1xufVxuIl19
|