@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.
Files changed (179) hide show
  1. package/README.md +1 -1
  2. package/cva-base/cva-base.d.ts +34 -0
  3. package/cva-base/cva-base.d.ts.map +1 -0
  4. package/cva-base/index.d.ts +2 -0
  5. package/cva-base/index.d.ts.map +1 -0
  6. package/cva-base/ngxsmk-cdk-cva-base.d.ts.map +1 -0
  7. package/esm2022/cva-base/cva-base.mjs +45 -0
  8. package/esm2022/cva-base/index.mjs +2 -0
  9. package/esm2022/cva-base/ngxsmk-cdk-cva-base.mjs +5 -0
  10. package/esm2022/input-group/index.mjs +3 -0
  11. package/esm2022/input-group/input-group-engine.mjs +219 -0
  12. package/esm2022/input-group/models/index.mjs +2 -0
  13. package/esm2022/input-group/models/input-group.model.mjs +2 -0
  14. package/esm2022/input-group/ngxsmk-cdk-input-group.mjs +5 -0
  15. package/esm2022/listbox-keyboard/index.mjs +2 -0
  16. package/esm2022/listbox-keyboard/listbox-keyboard.mjs +145 -0
  17. package/esm2022/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.mjs +5 -0
  18. package/esm2022/public-api.mjs +10 -1
  19. package/esm2022/scheduler/index.mjs +5 -0
  20. package/esm2022/scheduler/models/date-range.mjs +2 -0
  21. package/esm2022/scheduler/models/event.model.mjs +2 -0
  22. package/esm2022/scheduler/models/index.mjs +6 -0
  23. package/esm2022/scheduler/models/resource.model.mjs +5 -0
  24. package/esm2022/scheduler/models/selection.model.mjs +7 -0
  25. package/esm2022/scheduler/models/view.model.mjs +7 -0
  26. package/esm2022/scheduler/ngxsmk-cdk-scheduler.mjs +5 -0
  27. package/esm2022/scheduler/plugin/drag-plugin.mjs +82 -0
  28. package/esm2022/scheduler/plugin/index.mjs +8 -0
  29. package/esm2022/scheduler/plugin/keyboard-plugin.mjs +150 -0
  30. package/esm2022/scheduler/plugin/plugin-host.mjs +48 -0
  31. package/esm2022/scheduler/plugin/plugin.types.mjs +2 -0
  32. package/esm2022/scheduler/plugin/resize-plugin.mjs +74 -0
  33. package/esm2022/scheduler/plugin/selection-plugin.mjs +84 -0
  34. package/esm2022/scheduler/plugin/tooltip-plugin.mjs +103 -0
  35. package/esm2022/scheduler/scheduler-engine.mjs +316 -0
  36. package/esm2022/scheduler/utils/date-utils.mjs +131 -0
  37. package/esm2022/scheduler/utils/index.mjs +3 -0
  38. package/esm2022/scheduler/utils/snap.mjs +24 -0
  39. package/esm2022/spreadsheet/index.mjs +5 -0
  40. package/esm2022/spreadsheet/models/cell.model.mjs +2 -0
  41. package/esm2022/spreadsheet/models/column.model.mjs +2 -0
  42. package/esm2022/spreadsheet/models/filter.model.mjs +2 -0
  43. package/esm2022/spreadsheet/models/formula.model.mjs +2 -0
  44. package/esm2022/spreadsheet/models/index.mjs +8 -0
  45. package/esm2022/spreadsheet/models/row.model.mjs +2 -0
  46. package/esm2022/spreadsheet/models/selection.model.mjs +2 -0
  47. package/esm2022/spreadsheet/models/sort.model.mjs +2 -0
  48. package/esm2022/spreadsheet/ngxsmk-cdk-spreadsheet.mjs +5 -0
  49. package/esm2022/spreadsheet/plugin/clipboard-plugin.mjs +171 -0
  50. package/esm2022/spreadsheet/plugin/filter-plugin.mjs +87 -0
  51. package/esm2022/spreadsheet/plugin/formula-plugin.mjs +456 -0
  52. package/esm2022/spreadsheet/plugin/index.mjs +10 -0
  53. package/esm2022/spreadsheet/plugin/plugin-host.mjs +188 -0
  54. package/esm2022/spreadsheet/plugin/plugin.types.mjs +2 -0
  55. package/esm2022/spreadsheet/plugin/selection-plugin.mjs +114 -0
  56. package/esm2022/spreadsheet/plugin/sort-plugin.mjs +63 -0
  57. package/esm2022/spreadsheet/plugin/undo-plugin.mjs +138 -0
  58. package/esm2022/spreadsheet/plugin/validation-plugin.mjs +71 -0
  59. package/esm2022/spreadsheet/spreadsheet-engine.mjs +547 -0
  60. package/esm2022/spreadsheet/utils/cell-utils.mjs +129 -0
  61. package/esm2022/spreadsheet/utils/index.mjs +2 -0
  62. package/esm2022/testing/a11y.mjs +6 -3
  63. package/fesm2022/ngxsmk-cdk-cva-base.mjs +52 -0
  64. package/fesm2022/ngxsmk-cdk-cva-base.mjs.map +1 -0
  65. package/fesm2022/ngxsmk-cdk-input-group.mjs +226 -0
  66. package/fesm2022/ngxsmk-cdk-input-group.mjs.map +1 -0
  67. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs +152 -0
  68. package/fesm2022/ngxsmk-cdk-listbox-keyboard.mjs.map +1 -0
  69. package/fesm2022/ngxsmk-cdk-scheduler.mjs +1035 -0
  70. package/fesm2022/ngxsmk-cdk-scheduler.mjs.map +1 -0
  71. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs +1969 -0
  72. package/fesm2022/ngxsmk-cdk-spreadsheet.mjs.map +1 -0
  73. package/fesm2022/ngxsmk-cdk-testing.mjs +5 -2
  74. package/fesm2022/ngxsmk-cdk-testing.mjs.map +1 -1
  75. package/fesm2022/ngxsmk-cdk.mjs +5 -0
  76. package/fesm2022/ngxsmk-cdk.mjs.map +1 -1
  77. package/input-group/index.d.ts +3 -0
  78. package/input-group/index.d.ts.map +1 -0
  79. package/input-group/input-group-engine.d.ts +88 -0
  80. package/input-group/input-group-engine.d.ts.map +1 -0
  81. package/input-group/models/index.d.ts +2 -0
  82. package/input-group/models/index.d.ts.map +1 -0
  83. package/input-group/models/input-group.model.d.ts +114 -0
  84. package/input-group/models/input-group.model.d.ts.map +1 -0
  85. package/input-group/ngxsmk-cdk-input-group.d.ts.map +1 -0
  86. package/listbox-keyboard/index.d.ts +2 -0
  87. package/listbox-keyboard/index.d.ts.map +1 -0
  88. package/listbox-keyboard/listbox-keyboard.d.ts +60 -0
  89. package/listbox-keyboard/listbox-keyboard.d.ts.map +1 -0
  90. package/listbox-keyboard/ngxsmk-cdk-listbox-keyboard.d.ts.map +1 -0
  91. package/package.json +40 -1
  92. package/public-api.d.ts +8 -0
  93. package/public-api.d.ts.map +1 -1
  94. package/scheduler/index.d.ts +5 -0
  95. package/scheduler/index.d.ts.map +1 -0
  96. package/scheduler/models/date-range.d.ts +6 -0
  97. package/scheduler/models/date-range.d.ts.map +1 -0
  98. package/scheduler/models/event.model.d.ts +50 -0
  99. package/scheduler/models/event.model.d.ts.map +1 -0
  100. package/scheduler/models/index.d.ts +6 -0
  101. package/scheduler/models/index.d.ts.map +1 -0
  102. package/scheduler/models/resource.model.d.ts +16 -0
  103. package/scheduler/models/resource.model.d.ts.map +1 -0
  104. package/scheduler/models/selection.model.d.ts +12 -0
  105. package/scheduler/models/selection.model.d.ts.map +1 -0
  106. package/scheduler/models/view.model.d.ts +21 -0
  107. package/scheduler/models/view.model.d.ts.map +1 -0
  108. package/scheduler/ngxsmk-cdk-scheduler.d.ts.map +1 -0
  109. package/scheduler/plugin/drag-plugin.d.ts +28 -0
  110. package/scheduler/plugin/drag-plugin.d.ts.map +1 -0
  111. package/scheduler/plugin/index.d.ts +8 -0
  112. package/scheduler/plugin/index.d.ts.map +1 -0
  113. package/scheduler/plugin/keyboard-plugin.d.ts +24 -0
  114. package/scheduler/plugin/keyboard-plugin.d.ts.map +1 -0
  115. package/scheduler/plugin/plugin-host.d.ts +16 -0
  116. package/scheduler/plugin/plugin-host.d.ts.map +1 -0
  117. package/scheduler/plugin/plugin.types.d.ts +9 -0
  118. package/scheduler/plugin/plugin.types.d.ts.map +1 -0
  119. package/scheduler/plugin/resize-plugin.d.ts +26 -0
  120. package/scheduler/plugin/resize-plugin.d.ts.map +1 -0
  121. package/scheduler/plugin/selection-plugin.d.ts +40 -0
  122. package/scheduler/plugin/selection-plugin.d.ts.map +1 -0
  123. package/scheduler/plugin/tooltip-plugin.d.ts +41 -0
  124. package/scheduler/plugin/tooltip-plugin.d.ts.map +1 -0
  125. package/scheduler/scheduler-engine.d.ts +95 -0
  126. package/scheduler/scheduler-engine.d.ts.map +1 -0
  127. package/scheduler/utils/date-utils.d.ts +26 -0
  128. package/scheduler/utils/date-utils.d.ts.map +1 -0
  129. package/scheduler/utils/index.d.ts +3 -0
  130. package/scheduler/utils/index.d.ts.map +1 -0
  131. package/scheduler/utils/snap.d.ts +7 -0
  132. package/scheduler/utils/snap.d.ts.map +1 -0
  133. package/spreadsheet/index.d.ts +5 -0
  134. package/spreadsheet/index.d.ts.map +1 -0
  135. package/spreadsheet/models/cell.model.d.ts +44 -0
  136. package/spreadsheet/models/cell.model.d.ts.map +1 -0
  137. package/spreadsheet/models/column.model.d.ts +77 -0
  138. package/spreadsheet/models/column.model.d.ts.map +1 -0
  139. package/spreadsheet/models/filter.model.d.ts +15 -0
  140. package/spreadsheet/models/filter.model.d.ts.map +1 -0
  141. package/spreadsheet/models/formula.model.d.ts +65 -0
  142. package/spreadsheet/models/formula.model.d.ts.map +1 -0
  143. package/spreadsheet/models/index.d.ts +8 -0
  144. package/spreadsheet/models/index.d.ts.map +1 -0
  145. package/spreadsheet/models/row.model.d.ts +33 -0
  146. package/spreadsheet/models/row.model.d.ts.map +1 -0
  147. package/spreadsheet/models/selection.model.d.ts +18 -0
  148. package/spreadsheet/models/selection.model.d.ts.map +1 -0
  149. package/spreadsheet/models/sort.model.d.ts +14 -0
  150. package/spreadsheet/models/sort.model.d.ts.map +1 -0
  151. package/spreadsheet/ngxsmk-cdk-spreadsheet.d.ts.map +1 -0
  152. package/spreadsheet/plugin/clipboard-plugin.d.ts +24 -0
  153. package/spreadsheet/plugin/clipboard-plugin.d.ts.map +1 -0
  154. package/spreadsheet/plugin/filter-plugin.d.ts +21 -0
  155. package/spreadsheet/plugin/filter-plugin.d.ts.map +1 -0
  156. package/spreadsheet/plugin/formula-plugin.d.ts +39 -0
  157. package/spreadsheet/plugin/formula-plugin.d.ts.map +1 -0
  158. package/spreadsheet/plugin/index.d.ts +10 -0
  159. package/spreadsheet/plugin/index.d.ts.map +1 -0
  160. package/spreadsheet/plugin/plugin-host.d.ts +66 -0
  161. package/spreadsheet/plugin/plugin-host.d.ts.map +1 -0
  162. package/spreadsheet/plugin/plugin.types.d.ts +58 -0
  163. package/spreadsheet/plugin/plugin.types.d.ts.map +1 -0
  164. package/spreadsheet/plugin/selection-plugin.d.ts +28 -0
  165. package/spreadsheet/plugin/selection-plugin.d.ts.map +1 -0
  166. package/spreadsheet/plugin/sort-plugin.d.ts +18 -0
  167. package/spreadsheet/plugin/sort-plugin.d.ts.map +1 -0
  168. package/spreadsheet/plugin/undo-plugin.d.ts +40 -0
  169. package/spreadsheet/plugin/undo-plugin.d.ts.map +1 -0
  170. package/spreadsheet/plugin/validation-plugin.d.ts +29 -0
  171. package/spreadsheet/plugin/validation-plugin.d.ts.map +1 -0
  172. package/spreadsheet/spreadsheet-engine.d.ts +194 -0
  173. package/spreadsheet/spreadsheet-engine.d.ts.map +1 -0
  174. package/spreadsheet/utils/cell-utils.d.ts +26 -0
  175. package/spreadsheet/utils/cell-utils.d.ts.map +1 -0
  176. package/spreadsheet/utils/index.d.ts +2 -0
  177. package/spreadsheet/utils/index.d.ts.map +1 -0
  178. package/testing/a11y.d.ts +5 -1
  179. 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