@visuno/angular 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/LICENSE +24 -0
  2. package/README.md +56 -2
  3. package/account-table/account-table.component.d.ts +72 -0
  4. package/action-log/action-log.component.d.ts +41 -0
  5. package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
  6. package/agent-inbox/agent-inbox.component.d.ts +75 -0
  7. package/agent-lanes/agent-lanes.component.d.ts +152 -0
  8. package/agent-phases/agent-phases.component.d.ts +62 -0
  9. package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
  10. package/agent-tree/agent-tree.component.d.ts +80 -0
  11. package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
  12. package/artifact-card/artifact-card.component.d.ts +145 -0
  13. package/attachment-tray/attachment-tray.component.d.ts +84 -0
  14. package/badge/badge.component.d.ts +25 -0
  15. package/bar-chart/bar-chart.component.d.ts +87 -0
  16. package/browser-session/browser-session.component.d.ts +70 -0
  17. package/buttons/buttons.component.d.ts +63 -0
  18. package/card/card.component.d.ts +21 -0
  19. package/change-review/change-review.component.d.ts +97 -0
  20. package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
  21. package/code-viewer/code-viewer.component.d.ts +86 -0
  22. package/composer/composer.component.d.ts +114 -0
  23. package/context-meter/context-meter.component.d.ts +60 -0
  24. package/core/icon.component.d.ts +10 -0
  25. package/core/reduced-motion.service.d.ts +15 -0
  26. package/decision-prompt/decision-prompt.component.d.ts +56 -0
  27. package/design-review/design-review.component.d.ts +108 -0
  28. package/design-tuner/design-tuner.component.d.ts +75 -0
  29. package/details-panel/details-panel.component.d.ts +150 -0
  30. package/donut-chart/donut-chart.component.d.ts +63 -0
  31. package/draft-review/draft-review.component.d.ts +128 -0
  32. package/error-recovery/error-recovery.component.d.ts +59 -0
  33. package/esm2022/account-table/account-table.component.mjs +399 -0
  34. package/esm2022/action-log/action-log.component.mjs +177 -0
  35. package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
  36. package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
  37. package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
  38. package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
  39. package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
  40. package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
  41. package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
  42. package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
  43. package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
  44. package/esm2022/badge/badge.component.mjs +97 -0
  45. package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
  46. package/esm2022/browser-session/browser-session.component.mjs +352 -0
  47. package/esm2022/buttons/buttons.component.mjs +215 -0
  48. package/esm2022/card/card.component.mjs +107 -0
  49. package/esm2022/change-review/change-review.component.mjs +398 -0
  50. package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
  51. package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
  52. package/esm2022/composer/composer.component.mjs +743 -0
  53. package/esm2022/context-meter/context-meter.component.mjs +275 -0
  54. package/esm2022/core/icon.component.mjs +111 -0
  55. package/esm2022/core/reduced-motion.service.mjs +34 -0
  56. package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
  57. package/esm2022/design-review/design-review.component.mjs +428 -0
  58. package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
  59. package/esm2022/details-panel/details-panel.component.mjs +537 -0
  60. package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
  61. package/esm2022/draft-review/draft-review.component.mjs +549 -0
  62. package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
  63. package/esm2022/eval-results/eval-results.component.mjs +368 -0
  64. package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
  65. package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
  66. package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
  67. package/esm2022/grid/grid.component.mjs +66 -0
  68. package/esm2022/health-score/health-score.component.mjs +420 -0
  69. package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
  70. package/esm2022/image-generation/image-generation.component.mjs +1028 -0
  71. package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
  72. package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
  73. package/esm2022/line-chart/line-chart.component.mjs +417 -0
  74. package/esm2022/live-answer/live-answer.component.mjs +411 -0
  75. package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
  76. package/esm2022/modal/modal.component.mjs +202 -0
  77. package/esm2022/model-picker/model-picker.component.mjs +491 -0
  78. package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
  79. package/esm2022/plan-review/plan-review.component.mjs +432 -0
  80. package/esm2022/progress/progress.component.mjs +503 -0
  81. package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
  82. package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
  83. package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
  84. package/esm2022/public-api.mjs +88 -0
  85. package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
  86. package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
  87. package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
  88. package/esm2022/response-versions/response-versions.component.mjs +288 -0
  89. package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
  90. package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
  91. package/esm2022/run-cost/run-cost.component.mjs +215 -0
  92. package/esm2022/run-queue/run-queue.component.mjs +481 -0
  93. package/esm2022/run-summary/run-summary.component.mjs +331 -0
  94. package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
  95. package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
  96. package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
  97. package/esm2022/source-stack/source-stack.component.mjs +245 -0
  98. package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
  99. package/esm2022/status-pill/status-pill.component.mjs +305 -0
  100. package/esm2022/steering/steering.component.mjs +343 -0
  101. package/esm2022/step-loader/step-loader.component.mjs +209 -0
  102. package/esm2022/task-table/task-table.component.mjs +534 -0
  103. package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
  104. package/esm2022/thinking/thinking.component.mjs +276 -0
  105. package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
  106. package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
  107. package/esm2022/toast/toast.component.mjs +195 -0
  108. package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
  109. package/esm2022/tool-call/tool-call.component.mjs +273 -0
  110. package/esm2022/tooltip/tooltip.component.mjs +417 -0
  111. package/esm2022/top-pages/top-pages.component.mjs +240 -0
  112. package/esm2022/trace-view/trace-view.component.mjs +440 -0
  113. package/esm2022/visuno-angular.mjs +5 -0
  114. package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
  115. package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
  116. package/esm2022/web-search/web-search.component.mjs +374 -0
  117. package/eval-results/eval-results.component.d.ts +67 -0
  118. package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
  119. package/fesm2022/visuno-angular.mjs +31992 -0
  120. package/fesm2022/visuno-angular.mjs.map +1 -0
  121. package/field-extraction/field-extraction.component.d.ts +82 -0
  122. package/funnel-chart/funnel-chart.component.d.ts +70 -0
  123. package/grid/grid.component.d.ts +22 -0
  124. package/health-score/health-score.component.d.ts +87 -0
  125. package/human-handoff/human-handoff.component.d.ts +125 -0
  126. package/image-generation/image-generation.component.d.ts +253 -0
  127. package/index.d.ts +5 -0
  128. package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
  129. package/launch-checklist/launch-checklist.component.d.ts +46 -0
  130. package/line-chart/line-chart.component.d.ts +89 -0
  131. package/live-answer/live-answer.component.d.ts +110 -0
  132. package/metric-insight/metric-insight.component.d.ts +110 -0
  133. package/modal/modal.component.d.ts +37 -0
  134. package/model-picker/model-picker.component.d.ts +97 -0
  135. package/package.json +51 -4
  136. package/permission-gate/permission-gate.component.d.ts +100 -0
  137. package/plan-review/plan-review.component.d.ts +86 -0
  138. package/progress/progress.component.d.ts +91 -0
  139. package/prompt-library/prompt-library.component.d.ts +121 -0
  140. package/prompt-starters/prompt-starters.component.d.ts +65 -0
  141. package/proposal-card/proposal-card.component.d.ts +101 -0
  142. package/public-api.d.ts +82 -0
  143. package/radar-chart/radar-chart.component.d.ts +110 -0
  144. package/radial-goals/radial-goals.component.d.ts +90 -0
  145. package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
  146. package/response-versions/response-versions.component.d.ts +54 -0
  147. package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
  148. package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
  149. package/run-cost/run-cost.component.d.ts +43 -0
  150. package/run-queue/run-queue.component.d.ts +93 -0
  151. package/run-summary/run-summary.component.d.ts +81 -0
  152. package/scatter-chart/scatter-chart.component.d.ts +139 -0
  153. package/score-breakdown/score-breakdown.component.d.ts +107 -0
  154. package/segmented-control/segmented-control.component.d.ts +44 -0
  155. package/source-stack/source-stack.component.d.ts +60 -0
  156. package/stat-cards/stat-cards.component.d.ts +86 -0
  157. package/status-pill/status-pill.component.d.ts +64 -0
  158. package/steering/steering.component.d.ts +75 -0
  159. package/step-loader/step-loader.component.d.ts +40 -0
  160. package/styles.css +424 -0
  161. package/task-table/task-table.component.d.ts +114 -0
  162. package/terminal-stream/terminal-stream.component.d.ts +110 -0
  163. package/thinking/thinking.component.d.ts +63 -0
  164. package/thinking-states/thinking-states.component.d.ts +51 -0
  165. package/thread-panel/thread-panel.component.d.ts +75 -0
  166. package/toast/toast.component.d.ts +56 -0
  167. package/toast-stack/toast-stack.component.d.ts +72 -0
  168. package/tokens.css +424 -0
  169. package/tool-call/tool-call.component.d.ts +61 -0
  170. package/tooltip/tooltip.component.d.ts +89 -0
  171. package/top-pages/top-pages.component.d.ts +75 -0
  172. package/trace-view/trace-view.component.d.ts +95 -0
  173. package/voice-capture/voice-capture.component.d.ts +103 -0
  174. package/voice-orb/voice-orb.component.d.ts +78 -0
  175. package/web-search/web-search.component.d.ts +77 -0
@@ -0,0 +1,916 @@
1
+ // framework/angular/artifact-card/artifact-card.component.ts
2
+ //
3
+ // Native Angular port of framework/react/artifact-card/ArtifactCard.tsx.
4
+ // A file the agent made, shown four ways: a compact row, a card with its first
5
+ // page, a chip inside a message, or a stack of its versions. Each plays a
6
+ // writing state, then opens in a reader, switches versions, copies and
7
+ // downloads the same way. Inputs mirror the React props; React callbacks become
8
+ // @Output() EventEmitters.
9
+ //
10
+ // Icon notes: the Angular core glyph set has no download/panel/maximize/layers/
11
+ // history glyphs, so the closest available names are substituted — Open uses
12
+ // `ext` (open out), Download uses `chev-d` (a downward arrow), and the Versions
13
+ // buttons use `clock` (history).
14
+ import { Component, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
15
+ import { NgTemplateOutlet } from '@angular/common';
16
+ import { VoIconComponent } from '../core/icon.component';
17
+ import { ReducedMotionService } from '../core/reduced-motion.service';
18
+ import * as i0 from "@angular/core";
19
+ const MIME = {
20
+ md: 'text/markdown',
21
+ csv: 'text/csv',
22
+ json: 'application/json',
23
+ html: 'text/html',
24
+ };
25
+ const slug = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
26
+ const ago = (meta) => meta.replace(/^edited\s+/i, '');
27
+ const firstPara = (content) => content
28
+ .split(/\n\s*\n/)
29
+ .map((b) => b.trim())
30
+ .find((b) => b && !/^(#|[-*] |\d+\. |v\d+,)/.test(b)) ?? '';
31
+ const LINES = [
32
+ [{ t: 'p', w: 94 }, { t: 'p', w: 72 }, { t: 's' }, { t: 'b', w: 82 }, { t: 'b', w: 74 }, { t: 'b', w: 66 }, { t: 'b', w: 78 }, { t: 's' }, { t: 'p', w: 88 }, { t: 'p', w: 52 }],
33
+ [{ t: 'p', w: 92 }, { t: 'p', w: 86 }, { t: 'p', w: 56 }, { t: 's' }, { t: 'b', w: 80 }, { t: 'b', w: 72 }, { t: 'b', w: 86 }, { t: 'b', w: 64 }, { t: 's' }, { t: 'p', w: 70 }],
34
+ [{ t: 'p', w: 90 }, { t: 'p', w: 78 }, { t: 's' }, { t: 'n', w: 84 }, { t: 'n', w: 70 }, { t: 'n', w: 78 }, { t: 's' }, { t: 'b', w: 76 }, { t: 'b', w: 68 }, { t: 'b', w: 82 }],
35
+ ];
36
+ // the preview's lines, a little different for each version so drafts are easy to tell apart
37
+ const WIDTHS = [[96, 88, 70, 82], [92, 84, 90, 64], [90, 78, 86, 72]];
38
+ export class ArtifactCardComponent {
39
+ constructor() {
40
+ /** How the card shows the file. */
41
+ this.variant = 'compact';
42
+ /** The versions, oldest first. */
43
+ this.versions = [];
44
+ /** 'writing' while the agent is still making the file; 'ready' once it is done. */
45
+ this.state = 'ready';
46
+ /** The line shown while writing, like "Reading the page…". */
47
+ this.status = 'Writing…';
48
+ /** The kind of file on the meta line, like "Report" or "Table". */
49
+ this.kind = 'Report';
50
+ /** The file's icon. */
51
+ this.icon = 'file-text';
52
+ /** The extension Download saves with. "csv" also shows the content as a table in the reader. */
53
+ this.ext = 'md';
54
+ this.className = '';
55
+ /** Emitted when the shown version changes. */
56
+ this.versionChange = new EventEmitter();
57
+ /** Emitted when the file is opened, with the version shown. With a listener, Open does not show the card's own reader. */
58
+ this.opened = new EventEmitter();
59
+ /** Emitted after Copy has put the version's content on the clipboard. */
60
+ this.copied = new EventEmitter();
61
+ /** Emitted after Download has saved the version's content as a file. */
62
+ this.downloaded = new EventEmitter();
63
+ this.host = inject(ElementRef);
64
+ this.motion = inject(ReducedMotionService);
65
+ // which version is shown (uncontrolled unless `version` is set)
66
+ this.curIndex = 0;
67
+ this.controlled = false;
68
+ this.flashed = null;
69
+ this.said = '';
70
+ this.settled = false;
71
+ this.wasWriting = false;
72
+ this.reading = null;
73
+ this.openerEl = null;
74
+ // versions menu
75
+ this.menuOpen = false;
76
+ this.menuLeft = 0;
77
+ this.menuTop = 0;
78
+ // stack
79
+ this.fanned = false;
80
+ this.peek = null;
81
+ this.typedTitle = '';
82
+ this.stackTimers = [];
83
+ this.stackAnims = [];
84
+ this.onDocPointer = (e) => {
85
+ const t = e.target;
86
+ if (this.menuOpen && !this.menuEl?.nativeElement.contains(t) && !this.openerTrigger?.contains(t)) {
87
+ this.closeMenu();
88
+ }
89
+ if (this.fanned && !this.desk?.nativeElement.contains(t) && !this.fanBtn?.nativeElement.contains(t)) {
90
+ this.fan(false);
91
+ }
92
+ };
93
+ }
94
+ ngOnChanges(changes) {
95
+ if (changes['version']) {
96
+ this.controlled = this.version !== undefined;
97
+ if (this.version !== undefined)
98
+ this.curIndex = this.version;
99
+ }
100
+ if (changes['defaultVersion'] && !this.controlled && this.defaultVersion !== undefined) {
101
+ this.curIndex = this.defaultVersion;
102
+ }
103
+ if (changes['versions'] && !this.controlled && this.defaultVersion === undefined) {
104
+ this.curIndex = Math.max(0, this.versions.length - 1);
105
+ }
106
+ if (changes['state']) {
107
+ const writing = this.state === 'writing';
108
+ if (this.wasWriting && !writing) {
109
+ this.settled = true;
110
+ this.say(`${this.v.title} is ready, v${this.i + 1}`);
111
+ }
112
+ this.wasWriting = writing;
113
+ }
114
+ if (changes['variant'] || changes['state'])
115
+ this.restartStack();
116
+ }
117
+ ngAfterViewInit() {
118
+ this.wasWriting = this.state === 'writing';
119
+ document.addEventListener('pointerdown', this.onDocPointer);
120
+ this.restartStack();
121
+ }
122
+ ngOnDestroy() {
123
+ document.removeEventListener('pointerdown', this.onDocPointer);
124
+ clearTimeout(this.flashTimer);
125
+ clearTimeout(this.sayTimer);
126
+ this.clearStack();
127
+ }
128
+ // ---- derived state ----
129
+ get n() { return this.versions.length; }
130
+ get last() { return this.n - 1; }
131
+ get i() { return Math.max(0, Math.min(this.last, this.curIndex)); }
132
+ get v() { return this.versions[this.i] ?? { title: '', meta: '', content: '' }; }
133
+ get writing() { return this.state === 'writing'; }
134
+ get shown() { return this.fanned && this.peek != null ? this.peek : this.i; }
135
+ get reversed() { return this.versions.map((_, k) => k).reverse(); }
136
+ get actionSize() { return this.variant === 'inline' || this.variant === 'preview' ? 'sm' : 'md'; }
137
+ get summary() { return this.v.summary ?? firstPara(this.v.content); }
138
+ get previewWidths() { return WIDTHS[this.i % 3]; }
139
+ clamp(x) { return Math.max(0, Math.min(1, x ?? 0)); }
140
+ shortMeta(meta) { return ago(meta); }
141
+ whenHtml(meta) {
142
+ const short = ago(meta);
143
+ return short === meta ? meta : `<span class="vo-afx-ed">edited </span>${short}`;
144
+ }
145
+ stackLines(n) { return LINES[n === this.last ? 2 : n % 2]; }
146
+ get csvRows() {
147
+ return this.v.content.trim().split('\n').map((r) => r.split(','));
148
+ }
149
+ get bodyBlocks() {
150
+ const out = [];
151
+ this.v.content.split(/\n\s*\n/).map((b) => b.trim()).filter(Boolean).forEach((b) => {
152
+ const lines = b.split('\n');
153
+ if (/^# /.test(b))
154
+ return;
155
+ if (/^#{2,} /.test(b))
156
+ out.push({ kind: 'h3', text: b.replace(/^#+ /, '') });
157
+ else if (lines.every((l) => /^[-*] /.test(l)))
158
+ out.push({ kind: 'ul', items: lines.map((l) => l.slice(2)) });
159
+ else if (lines.every((l) => /^\d+\. /.test(l)))
160
+ out.push({ kind: 'ol', items: lines.map((l) => l.replace(/^\d+\. /, '')) });
161
+ else
162
+ out.push({ kind: 'p', text: b });
163
+ });
164
+ return out;
165
+ }
166
+ // ---- announcements and feedback ----
167
+ say(msg) {
168
+ this.said = '';
169
+ clearTimeout(this.sayTimer);
170
+ this.sayTimer = setTimeout(() => (this.said = msg), 60);
171
+ }
172
+ flash(key) {
173
+ this.flashed = key;
174
+ clearTimeout(this.flashTimer);
175
+ this.flashTimer = setTimeout(() => (this.flashed = null), 1600);
176
+ }
177
+ // ---- actions ----
178
+ pick(nn) {
179
+ if (nn === this.i)
180
+ return;
181
+ if (!this.controlled)
182
+ this.curIndex = nn;
183
+ this.versionChange.emit(nn);
184
+ this.say(`Showing v${nn + 1}, ${this.versions[nn].meta}`);
185
+ }
186
+ copy(key) {
187
+ try {
188
+ navigator.clipboard?.writeText(this.v.content).catch(() => { });
189
+ }
190
+ catch { /* the page may not write to the clipboard */ }
191
+ this.flash(key);
192
+ this.say(`Copied ${this.v.title}, v${this.i + 1}, to the clipboard`);
193
+ this.copied.emit(this.i);
194
+ }
195
+ download(key) {
196
+ const name = `${this.fileName ?? slug(this.v.title)}-v${this.i + 1}.${this.ext}`;
197
+ const url = URL.createObjectURL(new Blob([this.v.content], { type: MIME[this.ext] ?? 'text/plain' }));
198
+ const a = document.createElement('a');
199
+ a.href = url;
200
+ a.download = name;
201
+ a.hidden = true;
202
+ document.body.append(a);
203
+ a.click();
204
+ a.remove();
205
+ setTimeout(() => URL.revokeObjectURL(url), 5000);
206
+ this.flash(key);
207
+ this.say(`Downloaded ${name}`);
208
+ this.downloaded.emit(this.i);
209
+ }
210
+ open(kindOf, opener, src) {
211
+ if (this.writing)
212
+ return;
213
+ if (this.opened.observed) {
214
+ this.opened.emit(this.i);
215
+ return;
216
+ }
217
+ this.openerEl = opener;
218
+ this.reading = { kind: kindOf, src, opener };
219
+ this.say(`Opened ${this.v.title}, v${this.i + 1}`);
220
+ // move focus into the dialog once it renders
221
+ setTimeout(() => this.closeBtn?.nativeElement.focus({ preventScroll: true }));
222
+ }
223
+ closeReader() {
224
+ this.reading = null;
225
+ this.openerEl?.focus({ preventScroll: true });
226
+ }
227
+ readerKeys(e) {
228
+ if (e.key === 'Escape') {
229
+ e.preventDefault();
230
+ e.stopPropagation();
231
+ this.closeReader();
232
+ return;
233
+ }
234
+ if (e.key !== 'Tab' || !this.pan)
235
+ return;
236
+ const f = [...this.pan.nativeElement.querySelectorAll('button,[tabindex="0"]')];
237
+ const first = f[0], lastEl = f[f.length - 1];
238
+ if (e.shiftKey && (document.activeElement === first || document.activeElement === this.pan.nativeElement)) {
239
+ e.preventDefault();
240
+ lastEl?.focus();
241
+ }
242
+ else if (!e.shiftKey && document.activeElement === lastEl) {
243
+ e.preventDefault();
244
+ first?.focus();
245
+ }
246
+ }
247
+ // ---- versions menu ----
248
+ toggleMenu(trigger) {
249
+ this.menuOpen ? this.closeMenu() : this.openMenu(trigger);
250
+ }
251
+ openMenu(trigger) {
252
+ this.openerTrigger = trigger;
253
+ this.menuOpen = true;
254
+ setTimeout(() => {
255
+ this.placeMenu(trigger);
256
+ const menu = this.menuEl?.nativeElement;
257
+ const b = menu?.querySelector('[aria-checked="true"]') ?? menu?.querySelector('.vo-mi');
258
+ b?.focus({ preventScroll: true });
259
+ });
260
+ }
261
+ closeMenu() { this.menuOpen = false; }
262
+ placeMenu(trigger) {
263
+ const menu = this.menuEl?.nativeElement, host = this.host.nativeElement;
264
+ if (!menu)
265
+ return;
266
+ const hr = host.getBoundingClientRect(), br = trigger.getBoundingClientRect();
267
+ this.menuLeft = Math.round(br.left - hr.left - 6);
268
+ this.menuTop = Math.round(br.bottom - hr.top + 6);
269
+ }
270
+ pickFromMenu(nn) {
271
+ this.pick(nn);
272
+ this.closeMenu();
273
+ this.openerTrigger?.focus({ preventScroll: true });
274
+ }
275
+ triggerKeys(e) {
276
+ if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
277
+ e.preventDefault();
278
+ this.openMenu(e.currentTarget);
279
+ }
280
+ }
281
+ menuKeys(e) {
282
+ const menu = this.menuEl?.nativeElement;
283
+ const it = [...(menu?.querySelectorAll('.vo-mi') ?? [])];
284
+ const k = it.indexOf(document.activeElement);
285
+ if (e.key === 'ArrowDown') {
286
+ e.preventDefault();
287
+ it[(k + 1) % it.length]?.focus();
288
+ }
289
+ else if (e.key === 'ArrowUp') {
290
+ e.preventDefault();
291
+ it[(k - 1 + it.length) % it.length]?.focus();
292
+ }
293
+ else if (e.key === 'Home') {
294
+ e.preventDefault();
295
+ it[0]?.focus();
296
+ }
297
+ else if (e.key === 'End') {
298
+ e.preventDefault();
299
+ it[it.length - 1]?.focus();
300
+ }
301
+ else if (e.key === 'Escape') {
302
+ e.preventDefault();
303
+ e.stopPropagation();
304
+ this.closeMenu();
305
+ this.openerTrigger?.focus({ preventScroll: true });
306
+ }
307
+ else if (e.key === 'Tab') {
308
+ this.closeMenu();
309
+ }
310
+ }
311
+ // ---- stack ----
312
+ setPeek(nn) { this.peek = nn; }
313
+ sheetStyle(nn) {
314
+ if (this.fanned) {
315
+ const o = nn - this.last / 2;
316
+ return {
317
+ transform: `translate(calc(${o} * var(--vo-fx)),${Math.abs(o) * 6 + (this.peek === nn ? -8 : 0)}px) rotate(${o * 6}deg)`,
318
+ 'z-index': this.peek === nn ? 9 : nn + 1,
319
+ };
320
+ }
321
+ const behind = this.versions.map((_, k) => k).reverse().filter((k) => k !== this.i);
322
+ const d = nn === this.i ? 0 : behind.indexOf(nn) + 1;
323
+ return { '--vo-d': d, 'z-index': this.n - d };
324
+ }
325
+ fan(on, focus = false) {
326
+ if (this.writing)
327
+ return;
328
+ this.fanned = on;
329
+ this.peek = null;
330
+ if (on && focus) {
331
+ setTimeout(() => this.desk?.nativeElement.querySelector(`[data-i="${this.i}"]`)?.focus({ preventScroll: true }));
332
+ }
333
+ }
334
+ sheetClick(nn, el) {
335
+ if (this.writing)
336
+ return;
337
+ if (this.fanned) {
338
+ this.pick(nn);
339
+ this.fan(false);
340
+ this.fanBtn?.nativeElement.focus({ preventScroll: true });
341
+ }
342
+ else
343
+ this.open('page', this.host.nativeElement.querySelector('.vo-afx-open'), el);
344
+ }
345
+ openStack(opener) {
346
+ if (this.writing)
347
+ return;
348
+ if (this.fanned)
349
+ this.fan(false);
350
+ this.open('page', opener, this.desk?.nativeElement.querySelector(`[data-i="${this.i}"]`) ?? null);
351
+ }
352
+ deskKeys(e) {
353
+ if (!this.fanned)
354
+ return;
355
+ const sheets = [...(this.desk?.nativeElement.querySelectorAll('.vo-afx-sh') ?? [])];
356
+ const k = sheets.indexOf(document.activeElement);
357
+ let nn = null;
358
+ if (e.key === 'ArrowRight' || e.key === 'ArrowDown')
359
+ nn = Math.min(this.last, k + 1);
360
+ else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp')
361
+ nn = Math.max(0, k - 1);
362
+ else if (e.key === 'Home')
363
+ nn = 0;
364
+ else if (e.key === 'End')
365
+ nn = this.last;
366
+ else if (e.key === 'Escape') {
367
+ e.preventDefault();
368
+ e.stopPropagation();
369
+ this.fan(false);
370
+ this.fanBtn?.nativeElement.focus({ preventScroll: true });
371
+ return;
372
+ }
373
+ else if (e.key === 'Tab') {
374
+ this.fan(false);
375
+ return;
376
+ }
377
+ if (nn != null) {
378
+ e.preventDefault();
379
+ sheets[nn]?.focus();
380
+ }
381
+ }
382
+ // writing: a blank sheet drops onto the stack, the title is typed, and a pen draws each line of the new page
383
+ restartStack() {
384
+ this.clearStack();
385
+ if (this.variant !== 'stack' || !this.writing)
386
+ return;
387
+ setTimeout(() => this.runStack());
388
+ }
389
+ clearStack() {
390
+ this.stackTimers.forEach(clearTimeout);
391
+ this.stackTimers = [];
392
+ this.stackAnims.forEach((a) => a.cancel());
393
+ this.stackAnims = [];
394
+ this.typedTitle = '';
395
+ }
396
+ runStack() {
397
+ const sh = this.desk?.nativeElement.querySelector(`[data-i="${this.last}"]`);
398
+ if (!sh)
399
+ return;
400
+ let alive = true;
401
+ const onDone = () => (alive = false);
402
+ this.stackTimers.push(setTimeout(onDone, 60_000));
403
+ const sleep = (ms) => new Promise((res, rej) => this.stackTimers.push(setTimeout(() => (alive ? res() : rej(new Error('stop'))), ms)));
404
+ const motion = !this.motion.reduce();
405
+ const E = getComputedStyle(sh).getPropertyValue('--vo-ease').trim() || 'ease';
406
+ const T = this.versions[this.last]?.title ?? '';
407
+ void (async () => {
408
+ if (motion)
409
+ this.stackAnims.push(sh.animate([{ transform: 'translateY(-36px)', opacity: 0 }, { transform: 'none', opacity: 1 }], { duration: 700, easing: E, composite: 'add' }));
410
+ this.typedTitle = '';
411
+ await sleep(300);
412
+ if (!motion)
413
+ this.typedTitle = T;
414
+ else
415
+ for (let k = 1; k <= T.length; k++) {
416
+ this.typedTitle = T.slice(0, k);
417
+ await sleep(40);
418
+ }
419
+ await sleep(motion ? 250 : 0);
420
+ const pen = sh.querySelector('.vo-afx-pen');
421
+ const rows = [...sh.querySelectorAll('.vo-afx-r')].filter((x) => x.offsetParent);
422
+ for (const x of rows) {
423
+ const line = x.querySelector('i'), dot = x.querySelector('b');
424
+ if (!motion) {
425
+ this.stackAnims.push(line.animate([{ transform: 'none' }], { fill: 'forwards' }));
426
+ if (dot)
427
+ this.stackAnims.push(dot.animate([{ transform: 'none' }], { fill: 'forwards' }));
428
+ await sleep(150);
429
+ continue;
430
+ }
431
+ const x0 = x.offsetLeft + line.offsetLeft, x1 = x0 + line.offsetWidth, y = x.offsetTop + x.offsetHeight / 2 - 3.5, ms = 260 + line.offsetWidth * 1.4;
432
+ if (dot)
433
+ this.stackAnims.push(dot.animate([{ transform: 'scaleX(0)' }, { transform: 'none' }], { duration: 120, fill: 'forwards' }));
434
+ this.stackAnims.push(line.animate([{ transform: 'scaleX(0)' }, { transform: 'scaleX(1)' }], { duration: ms, easing: 'cubic-bezier(.4,0,.3,1)', fill: 'forwards' }));
435
+ if (pen)
436
+ this.stackAnims.push(pen.animate([{ transform: `translate(${x0 - 3}px,${y}px)`, opacity: 1 }, { transform: `translate(${x1 - 3}px,${y}px)`, opacity: 1 }], { duration: ms, easing: 'cubic-bezier(.4,0,.3,1)', fill: 'forwards' }));
437
+ await sleep(ms + 70);
438
+ }
439
+ pen?.getAnimations().forEach((a) => a.cancel());
440
+ })().catch(() => { });
441
+ }
442
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ArtifactCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
443
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ArtifactCardComponent, isStandalone: true, selector: "vo-artifact-card", inputs: { variant: "variant", versions: "versions", version: "version", defaultVersion: "defaultVersion", state: "state", status: "status", progress: "progress", kind: "kind", icon: "icon", fileName: "fileName", ext: "ext", openLabel: "openLabel", className: "className" }, outputs: { versionChange: "versionChange", opened: "opened", copied: "copied", downloaded: "downloaded" }, viewQueries: [{ propertyName: "menuEl", first: true, predicate: ["menuEl"], descendants: true }, { propertyName: "desk", first: true, predicate: ["desk"], descendants: true }, { propertyName: "fanBtn", first: true, predicate: ["fanBtn"], descendants: true }, { propertyName: "pan", first: true, predicate: ["pan"], descendants: true }, { propertyName: "closeBtn", first: true, predicate: ["closeBtn"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
444
+ <div data-vo="" class="vo-afx" [class]="className">
445
+ <!-- compact: an icon, the name, one line of meta and Open -->
446
+ @if (variant === 'compact') {
447
+ <div class="vo-afx-w">
448
+ <div class="vo-afx-cp-card vo-afx-card" [class.vo-is-writing]="writing">
449
+ <span class="vo-afx-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon"></vo-icon></span>
450
+ <div class="vo-afx-cp-tx"><div class="vo-afx-cp-t">{{ v.title }}</div>
451
+ <ng-container [ngTemplateOutlet]="metaLine"></ng-container>
452
+ </div>
453
+ <div class="vo-afx-cp-act">
454
+ <ng-container [ngTemplateOutlet]="actions"></ng-container>
455
+ <button type="button" class="vo-pill vo-sm vo-accent vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
456
+ [disabled]="writing" (click)="open('view', $any($event.currentTarget), null)"><vo-icon name="ext"></vo-icon><span class="vo-afx-lbl">Open</span></button>
457
+ </div>
458
+ @if (writing) {
459
+ <span class="vo-afx-cp-bar" aria-hidden="true" [style.transform]="'scaleX(' + clamp(progress) + ')'"></span>
460
+ }
461
+ </div>
462
+ <ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
463
+ </div>
464
+ }
465
+
466
+ <!-- preview: the same card with the first page showing -->
467
+ @if (variant === 'preview') {
468
+ <div class="vo-afx-w vo-afx-pv">
469
+ <div class="vo-afx-pv-card vo-afx-card" [class.vo-is-writing]="writing">
470
+ <div class="vo-afx-pv-prev" aria-hidden="true">
471
+ <div class="vo-afx-pv-page" #pvPage>
472
+ <div class="vo-afx-pv-k"><span class="vo-afx-wr">Writing…</span><span class="vo-afx-fin">{{ kind }} · v{{ i + 1 }}</span></div>
473
+ <div class="vo-afx-pv-h">{{ v.title }}</div>
474
+ <p class="vo-afx-pv-p">{{ summary }}@if (writing) {<span class="vo-afx-caret"></span>}</p>
475
+ <div class="vo-afx-pv-ls">
476
+ @for (w of previewWidths; track $index) {
477
+ <i [style.--vo-w]="w + '%'"></i>
478
+ }
479
+ </div>
480
+ </div>
481
+ </div>
482
+ <div class="vo-afx-pv-meta">
483
+ <span class="vo-afx-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon"></vo-icon></span>
484
+ <div class="vo-afx-pv-tx"><div class="vo-afx-pv-t">{{ v.title }}</div>
485
+ <ng-container [ngTemplateOutlet]="metaLine"></ng-container>
486
+ </div>
487
+ <div class="vo-afx-pv-act">
488
+ <ng-container [ngTemplateOutlet]="actions"></ng-container>
489
+ <button type="button" class="vo-ib vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
490
+ [disabled]="writing" (click)="open('page', $any($event.currentTarget), pvPage)"><vo-icon name="ext"></vo-icon></button>
491
+ </div>
492
+ </div>
493
+ </div>
494
+ <ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
495
+ </div>
496
+ }
497
+
498
+ <!-- inline: one line inside the message; versions and actions fold out on hover or focus -->
499
+ @if (variant === 'inline') {
500
+ <div class="vo-afx-w">
501
+ <span class="vo-afx-chip" [class.vo-is-writing]="writing" [class.vo-pin]="menuOpen">
502
+ <button type="button" class="vo-afx-in-main" [disabled]="writing" (click)="open('view', $any($event.currentTarget), null)">
503
+ <span class="vo-afx-in-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon" size="sm"></vo-icon></span>
504
+ <span class="vo-afx-in-t"><span class="vo-afx-sr">Open </span>{{ v.title }}</span>
505
+ <span class="vo-afx-in-m"><span class="vo-afx-wr vo-shim">{{ status }}</span>
506
+ <span class="vo-afx-fin" [class.vo-enter]="settled"><span class="vo-afx-v">v{{ i + 1 }}</span><span class="vo-afx-msep" aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(v.meta)"></span></span></span>
507
+ </button>
508
+ <span class="vo-afx-tray"><span>
509
+ <span class="vo-afx-tsep" aria-hidden="true"></span>
510
+ @if (n > 1) {
511
+ <button type="button" class="vo-ib vo-afx-vb3" aria-label="Versions" aria-haspopup="menu"
512
+ [attr.aria-expanded]="menuOpen" (click)="toggleMenu($any($event.currentTarget))" (keydown)="triggerKeys($event)"><vo-icon name="clock" size="sm"></vo-icon></button>
513
+ }
514
+ <ng-container [ngTemplateOutlet]="actions"></ng-container>
515
+ </span></span>
516
+ </span>
517
+ <ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
518
+ </div>
519
+ }
520
+
521
+ <!-- stack: the report as a stack of paper; Versions lays the sheets out to pick one -->
522
+ @if (variant === 'stack') {
523
+ <div class="vo-afx-w vo-afx-st" [class.vo-is-writing]="writing" [class.vo-fan]="fanned">
524
+ <div class="vo-afx-desk" #desk>
525
+ <div class="vo-afx-stack" role="menu" [attr.aria-label]="'Versions of ' + v.title" [attr.aria-hidden]="!fanned" (keydown)="deskKeys($event)">
526
+ @for (x of versions; track shIdx; let shIdx = $index) {
527
+ <button type="button" class="vo-afx-sh" [class.vo-blank]="writing && shIdx === last" role="menuitemradio"
528
+ [attr.data-i]="shIdx" [attr.aria-checked]="shIdx === i" [attr.tabindex]="fanned && shIdx === i ? 0 : -1"
529
+ [attr.aria-label]="'v' + (shIdx + 1) + ', ' + x.meta + (x.note ? ': ' + x.note : '')" [style]="sheetStyle(shIdx)"
530
+ (click)="sheetClick(shIdx, $any($event.currentTarget))"
531
+ (pointerenter)="fanned && setPeek(shIdx)" (pointerleave)="fanned && setPeek(null)"
532
+ (focus)="fanned && setPeek(shIdx)" (blur)="fanned && setPeek(null)">
533
+ <span class="vo-afx-pg" aria-hidden="true">
534
+ <span class="vo-afx-st-k"><span>{{ writing && shIdx === last ? 'Writing…' : 'v' + (shIdx + 1) }}</span></span>
535
+ <span class="vo-afx-st-h">{{ writing && shIdx === last ? typedTitle : x.title }}</span>
536
+ <span class="vo-afx-st-ls">
537
+ @for (ln of stackLines(shIdx); track lnIdx; let lnIdx = $index) {
538
+ @if (ln.t === 's') {
539
+ <span class="vo-afx-gap"></span>
540
+ } @else {
541
+ <span class="vo-afx-r" [class.vo-n]="ln.t === 'n'">@if (ln.t !== 'p') {<b></b>}<i [style.--vo-w]="ln.w + '%'"></i></span>
542
+ }
543
+ }
544
+ </span>
545
+ @if (shIdx === last) {<span class="vo-afx-pen"></span>}
546
+ </span>
547
+ <span class="vo-afx-tab" aria-hidden="true"><vo-icon name="check" size="xs"></vo-icon><span>v{{ shIdx + 1 }}</span><span class="vo-afx-ta"> · {{ shortMeta(x.meta) }}</span></span>
548
+ </button>
549
+ }
550
+ </div>
551
+ </div>
552
+ <div class="vo-afx-cap">
553
+ <div class="vo-afx-st-t">{{ v.title }}</div>
554
+ <div class="vo-afx-meta vo-afx-st-m"><span class="vo-afx-wr vo-shim">{{ status }}</span>
555
+ <span class="vo-afx-fin" [class.vo-enter]="settled"><span>{{ kind }}</span><span aria-hidden="true">·</span><span class="vo-afx-v">v{{ shown + 1 }}</span><span aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(versions[shown].meta)"></span></span>
556
+ </div>
557
+ <div class="vo-fold vo-afx-nw" [class.vo-shut]="!fanned"><div><div class="vo-afx-note">{{ versions[shown].note }}</div></div></div>
558
+ </div>
559
+ <div class="vo-afx-st-act">
560
+ @if (n > 1) {
561
+ <button type="button" class="vo-pill vo-sm vo-line vo-afx-fan" #fanBtn aria-haspopup="menu" [attr.aria-expanded]="fanned" (click)="fan(!fanned, true)"><vo-icon name="clock"></vo-icon><span>Versions</span></button>
562
+ }
563
+ <ng-container [ngTemplateOutlet]="actions"></ng-container>
564
+ <button type="button" class="vo-pill vo-sm vo-accent vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
565
+ [disabled]="writing" (click)="openStack($any($event.currentTarget))"><vo-icon name="ext"></vo-icon><span class="vo-afx-lbl">Open</span></button>
566
+ </div>
567
+ </div>
568
+ }
569
+
570
+ <!-- the opened file: a modal reader over the card's nearest positioned ancestor -->
571
+ @if (reading) {
572
+ <div class="vo-afx-sheet" #sheet (keydown)="readerKeys($event)">
573
+ <div class="vo-afx-scrim" #scrim (click)="closeReader()"></div>
574
+ <div class="vo-afx-pan" [class.vo-afx-page]="reading.kind === 'page'" [class.vo-afx-view]="reading.kind === 'view'"
575
+ role="dialog" aria-modal="true" [attr.aria-label]="v.title" tabindex="-1" #pan>
576
+ <div class="vo-afx-ph">
577
+ <span class="vo-afx-ic" aria-hidden="true"><vo-icon [name]="icon"></vo-icon></span>
578
+ <div class="vo-afx-ptx"><div class="vo-afx-pt">{{ v.title }}</div><div class="vo-afx-pm">{{ kind }} · v{{ i + 1 }} · {{ v.meta }}</div></div>
579
+ <button type="button" class="vo-ib vo-afx-x" aria-label="Close" #closeBtn (click)="closeReader()"><vo-icon name="x"></vo-icon></button>
580
+ </div>
581
+ <div class="vo-afx-pb" tabindex="0" role="region" [attr.aria-label]="v.title + ', v' + (i + 1)">
582
+ @if (ext === 'csv') {
583
+ <table class="vo-afx-tb">
584
+ <thead><tr>@for (h of csvRows[0]; track $index) {<th scope="col" [class.vo-num]="$index">{{ h }}</th>}</tr></thead>
585
+ <tbody>@for (row of csvRows.slice(1); track $index) {
586
+ <tr>@for (cell of row; track $index) {
587
+ @if ($index) {<td class="vo-num">{{ cell }}</td>} @else {<th scope="row">{{ cell }}</th>}
588
+ }</tr>
589
+ }</tbody>
590
+ </table>
591
+ } @else {
592
+ @for (b of bodyBlocks; track $index) {
593
+ @switch (b.kind) {
594
+ @case ('h3') { <h3>{{ b.text }}</h3> }
595
+ @case ('ul') { <ul>@for (li of b.items; track $index) {<li>{{ li }}</li>}</ul> }
596
+ @case ('ol') { <ol>@for (li of b.items; track $index) {<li>{{ li }}</li>}</ol> }
597
+ @default { <p>{{ b.text }}</p> }
598
+ }
599
+ }
600
+ }
601
+ </div>
602
+ <div class="vo-afx-pf">
603
+ <button type="button" class="vo-pill vo-sm vo-line vo-afx-copy" [class.vo-copied]="flashed === 'rcopy'" (click)="copy('rcopy')"><vo-icon [name]="flashed === 'rcopy' ? 'check' : 'copy'" size="sm"></vo-icon><span class="vo-afx-lbl">{{ flashed === 'rcopy' ? 'Copied' : 'Copy' }}</span></button>
604
+ <button type="button" class="vo-pill vo-sm vo-line vo-afx-dl" [class.vo-copied]="flashed === 'rdl'" (click)="download('rdl')"><vo-icon [name]="flashed === 'rdl' ? 'check' : 'chev-d'" size="sm"></vo-icon><span class="vo-afx-lbl">{{ flashed === 'rdl' ? 'Downloaded' : 'Download' }}</span></button>
605
+ </div>
606
+ </div>
607
+ </div>
608
+ }
609
+
610
+ <!-- the versions menu, shared by the compact, preview and inline variants -->
611
+ <ng-template #versionsMenu>
612
+ @if (n > 1) {
613
+ <div class="vo-pop vo-afx-menu" [class.vo-open]="menuOpen" role="menu" [attr.aria-label]="'Versions of ' + v.title"
614
+ #menuEl [attr.inert]="menuOpen ? null : ''" [style.left.px]="menuLeft" [style.top.px]="menuTop" (keydown)="menuKeys($event)">
615
+ <div class="vo-ph" aria-hidden="true">Versions</div>
616
+ @for (n2 of reversed; track n2) {
617
+ <button type="button" class="vo-mi" role="menuitemradio" tabindex="-1" [attr.aria-checked]="n2 === i" [attr.data-i]="n2"
618
+ (click)="pickFromMenu(n2)">
619
+ <span class="vo-afx-mb"><span>v{{ n2 + 1 }}<span class="vo-afx-mw"> · {{ shortMeta(versions[n2].meta) }}</span></span>@if (versions[n2].note) {<span class="vo-d">{{ versions[n2].note }}</span>}</span>
620
+ <vo-icon name="check" class="vo-ck" size="sm"></vo-icon>
621
+ </button>
622
+ }
623
+ </div>
624
+ }
625
+ </ng-template>
626
+
627
+ <!-- the meta line, shared by the compact and preview variants -->
628
+ <ng-template #metaLine>
629
+ <div class="vo-afx-meta">
630
+ <span class="vo-afx-wr vo-shim">{{ status }}</span>
631
+ <span class="vo-afx-fin" [class.vo-enter]="settled">
632
+ <span>{{ kind }}</span><span aria-hidden="true">·</span>
633
+ @if (n > 1) {
634
+ <button type="button" class="vo-afx-vb" aria-haspopup="menu" [attr.aria-expanded]="menuOpen"
635
+ [attr.aria-label]="'v' + (i + 1) + ' of ' + n + ' versions'" (click)="toggleMenu($any($event.currentTarget))" (keydown)="triggerKeys($event)"><span class="vo-afx-vt">v{{ i + 1 }}</span><vo-icon name="chev-d" size="xs"></vo-icon></button>
636
+ } @else {
637
+ <span class="vo-afx-v">v1</span>
638
+ }
639
+ <span aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(v.meta)"></span>
640
+ </span>
641
+ </div>
642
+ </ng-template>
643
+
644
+ <!-- Copy and Download, shared by every variant -->
645
+ <ng-template #actions>
646
+ <button type="button" class="vo-ib vo-afx-copy" [class.vo-copied]="flashed === 'copy'" [attr.aria-label]="'Copy ' + v.title" (click)="copy('copy')"><vo-icon [name]="flashed === 'copy' ? 'check' : 'copy'" [size]="actionSize"></vo-icon></button>
647
+ <button type="button" class="vo-ib vo-afx-dl" [class.vo-copied]="flashed === 'dl'" [attr.aria-label]="'Download ' + v.title" (click)="download('dl')"><vo-icon [name]="flashed === 'dl' ? 'check' : 'chev-d'" [size]="actionSize"></vo-icon></button>
648
+ </ng-template>
649
+
650
+ <div class="vo-afx-sr" role="status" aria-live="polite">{{ said }}</div>
651
+ </div>
652
+ `, isInline: true, styles: [".vo-afx{--vo-afx-t2:var(--vo-muted);width:100%;container-type:inline-size}.vo-afx.vo-dm>.vo-afx-main{position:relative;min-height:452px;justify-content:center}@container (max-width:400px){.vo-afx.vo-dm>.vo-afx-main{min-height:474px}}:root[data-theme=dark] .vo-afx{--vo-afx-t2:#c0c0c0}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-afx{--vo-afx-t2:#c0c0c0}}.vo-afx>.vo-demo .vo-seg2 button{color:var(--vo-afx-t2)}.vo-afx>.vo-demo .vo-seg2 button[aria-pressed=true]{color:var(--vo-fg)}.vo-afx-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.vo-afx-w{position:relative;width:100%;transition:transform var(--vo-t) var(--vo-ease)}.vo-afx-ic{width:36px;height:36px;border-radius:calc(10px * var(--vo-rk));display:grid;place-items:center;flex:none;background:var(--vo-accent-bg);color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-ic .vo-spin{display:none}.vo-is-writing .vo-afx-ic .vo-spin{display:inline-block}.vo-is-writing .vo-afx-ic svg{display:none}.vo-afx-meta{display:flex;align-items:center;min-width:0;height:20px;font-size:12.5px;color:var(--vo-afx-t2);white-space:nowrap}.vo-afx-fin{display:flex;align-items:center;gap:5px;min-width:0}.vo-afx-meta .vo-afx-wr{display:none;overflow:hidden;text-overflow:ellipsis}.vo-is-writing .vo-afx-meta .vo-afx-wr{display:inline}.vo-is-writing .vo-afx-meta .vo-afx-fin{display:none}.vo-afx-when{overflow:hidden;text-overflow:ellipsis;min-width:0}.vo-afx-vb{position:relative;z-index:1;display:inline-flex;align-items:center;gap:1px;height:20px;padding:0 3px 0 5px;margin:0 -2px;border-radius:calc(6px * var(--vo-rk));font-size:12.5px;font-weight:500;color:var(--vo-fg);transition:background var(--vo-t-fast)}.vo-afx-vb[aria-expanded=true]{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-afx-vb:hover{background:var(--vo-row)}}.vo-afx-vb .vo-i{color:var(--vo-fg2)}.vo-afx-menu{width:264px;max-width:calc(100% - 16px)}.vo-afx-menu:not(.vo-open){visibility:hidden;transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .35s}.vo-afx-menu .vo-ph{color:var(--vo-afx-t2)}.vo-afx-menu .vo-mi{align-items:flex-start;gap:var(--vo-s-2)}.vo-afx-menu .vo-mi:focus-visible{outline-offset:-2px;background:var(--vo-row)}.vo-afx-mb{display:flex;flex-direction:column;min-width:0}.vo-afx-mw{font-weight:400;color:var(--vo-afx-t2)}.vo-afx-menu .vo-mi .vo-d{color:var(--vo-afx-t2);font-weight:400;white-space:normal}@media (hover:hover) and (pointer:fine){.vo-afx-menu .vo-mi:is(:hover,.vo-hl,[aria-checked=true]) .vo-d{color:var(--vo-afx-t2);font-weight:400;white-space:normal}}.vo-afx-menu .vo-mi .vo-ck{margin-top:3px}.vo-afx-card{position:relative}.vo-afx-card .vo-afx-open:after{content:\"\";position:absolute;inset:0;border-radius:inherit}.vo-afx-card .vo-afx-open{transform:none!important}.vo-afx-card :is(.vo-afx-copy,.vo-afx-dl,.vo-afx-vb){position:relative;z-index:1}.vo-afx .vo-copied .vo-afx-lbl{color:var(--vo-fg)}.vo-afx-sheet{position:absolute;inset:0;z-index:20;border-radius:inherit;overflow:hidden}.vo-afx-scrim{position:absolute;inset:0;background:color-mix(in srgb,var(--vo-stage) 78%,transparent)}.vo-afx-pan{position:absolute;display:flex;flex-direction:column;background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow-pop);overflow:hidden;outline:none}.vo-afx-pan.vo-afx-view{inset:0}.vo-afx-pan.vo-afx-page{inset:0;margin:auto;width:min(400px,100%);transform-origin:0 0}.vo-afx-ph{display:flex;align-items:center;gap:10px;padding:10px var(--vo-s-2) 10px 14px;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-ph .vo-afx-ic{width:30px;height:30px;border-radius:var(--vo-r-sm)}.vo-afx-ptx{flex:1;min-width:0}.vo-afx-pt{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pm{font-size:12.5px;color:var(--vo-afx-t2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pb{flex:1;min-height:0;overflow:auto;padding:14px 18px 18px;font-size:13.5px;line-height:1.6;outline:none}.vo-afx-pb:focus-visible{box-shadow:inset 0 0 0 2px var(--vo-focus)}.vo-afx-pb h3{margin:var(--vo-s-4) 0 var(--vo-s-1);font-size:12.5px;font-weight:500;color:var(--vo-afx-t2)}.vo-afx-pb p{margin:0}.vo-afx-pb :is(ul,ol){margin:0;padding-left:18px}.vo-afx-pb li+li{margin-top:3px}.vo-afx-pb li::marker{color:var(--vo-fg2)}.vo-afx-tb{width:100%;border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums}.vo-afx-tb :is(th,td){padding:7px var(--vo-s-2);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);text-align:left;font-weight:400}.vo-afx-tb thead th{font-size:12.5px;color:var(--vo-afx-t2);font-weight:500}.vo-afx-tb .vo-num{text-align:right}.vo-afx-tb tbody th{font-weight:500}.vo-afx-pf{display:flex;align-items:center;gap:6px;padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-pf .vo-pill .vo-afx-lbl{min-width:58px;text-align:left}.vo-afx-pf .vo-pill.vo-copied{color:var(--vo-fg)!important}.vo-afx-pf .vo-pill.vo-copied .vo-i{color:var(--vo-ok)}.vo-afx-cp{max-width:440px;display:flex;flex-direction:column;gap:14px}.vo-afx-cp-a{margin:0;font-size:14px;line-height:1.6;text-wrap:pretty}.vo-afx-cp-list{display:flex;flex-direction:column;gap:var(--vo-s-2)}.vo-afx-cp-card{display:flex;align-items:center;gap:var(--vo-s-3);padding:10px var(--vo-s-2) 10px 10px;border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:background var(--vo-t-fast),box-shadow var(--vo-t-fast);overflow:hidden}@media (hover:hover) and (pointer:fine){.vo-afx-cp-card:not(.vo-is-writing):hover{background:var(--vo-wash)}}@media (hover:hover) and (pointer:fine){:root:not([data-style=soft]) .vo-afx-cp-card:not(.vo-is-writing):hover:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}}.vo-afx-cp-tx{flex:1;min-width:0}.vo-afx-cp-t{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-cp-act{display:flex;align-items:center;gap:2px;flex:none;transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-cp-act .vo-pill{margin-left:var(--vo-s-1);gap:6px;padding:0 10px}@media (hover:hover) and (pointer:fine){.vo-afx .vo-afx-open.vo-pill.vo-accent:hover{background:color-mix(in srgb,var(--vo-accent) 86%,#000)}}.vo-is-writing .vo-afx-cp-act{opacity:0;visibility:hidden}.vo-afx-cp-bar{position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--vo-accent-mark);transform-origin:left center;transform:scaleX(0);opacity:0;transition:transform .9s var(--vo-ease),opacity .3s var(--vo-ease)}.vo-is-writing .vo-afx-cp-bar{opacity:1}@container (max-width:400px){.vo-afx-ed{display:none}.vo-afx-fin{gap:var(--vo-s-1)}.vo-afx-card .vo-afx-ic{width:32px;height:32px;border-radius:calc(9px * var(--vo-rk))}.vo-afx-card :is(.vo-afx-copy,.vo-afx-dl,.vo-ib.vo-afx-open){width:28px;height:28px}.vo-afx-cp-act,.vo-afx-pv-act{gap:0}.vo-afx-cp-card{padding-right:6px;gap:10px}.vo-afx-pv-meta{gap:10px;padding-right:6px}.vo-afx-pv-meta .vo-afx-ic,.vo-afx-cp-act .vo-pill .vo-afx-lbl{display:none}.vo-afx-cp-act .vo-pill{width:28px;height:28px;padding:0;margin-left:2px}}.vo-afx-pv{width:min(100%,380px)}.vo-afx-pv-card{border-radius:var(--vo-r-card);background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:box-shadow var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-afx-pv-card:not(.vo-is-writing):hover{box-shadow:var(--vo-shadow-pop)}}@media (hover:hover) and (pointer:fine){:root:not([data-style=soft]) .vo-afx-pv-card:not(.vo-is-writing):hover:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}}.vo-afx-pv-prev{position:relative;height:164px;overflow:hidden;padding:18px 22px 0;border-radius:var(--vo-r-card) var(--vo-r-card) 0 0;background:var(--vo-stage);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-pv-page{height:100%;padding:14px var(--vo-s-4) 0;border-radius:var(--vo-r-sm) var(--vo-r-sm) 0 0;background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:transform var(--vo-t) var(--vo-ease)}@media (hover:hover) and (pointer:fine){.vo-afx-pv-card:not(.vo-is-writing):hover .vo-afx-pv-page{transform:translateY(-3px)}}.vo-afx-pv-k{font-size:11px;line-height:16px;color:var(--vo-afx-t2)}.vo-afx-pv-k .vo-afx-wr,.vo-is-writing .vo-afx-pv-k .vo-afx-fin{display:none}.vo-is-writing .vo-afx-pv-k .vo-afx-wr{display:inline}.vo-afx-pv-h{margin-top:2px;font-size:13px;font-weight:500;line-height:18px}.vo-afx-pv-p{margin:6px 0 0;min-height:54px;font-size:11.5px;line-height:18px;color:var(--vo-fg);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.vo-afx-caret{display:inline-block;width:1.5px;height:12px;margin-left:1px;vertical-align:-2px;background:var(--vo-accent-mark);animation:vo-bpblink 1s steps(1,end) infinite}.vo-afx-pv-ls{display:flex;flex-direction:column;gap:var(--vo-s-2);margin-top:10px;-webkit-mask-image:linear-gradient(#000 0,transparent 44px);mask-image:linear-gradient(#000 0,transparent 44px)}.vo-afx-pv-ls i{display:block;height:4px;border-radius:2px;width:var(--vo-w);background:color-mix(in srgb,var(--vo-fg) 8%,var(--vo-surface));transform-origin:left center;transition:width var(--vo-t) var(--vo-ease)}.vo-is-writing .vo-afx-pv-ls i{transform:scaleX(0)}.vo-afx-pv-meta{display:flex;align-items:center;gap:var(--vo-s-3);padding:var(--vo-s-3) var(--vo-s-2) var(--vo-s-3) 14px}.vo-afx-pv-tx{flex:1;min-width:0}.vo-afx-pv-t{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pv-act{display:flex;align-items:center;gap:2px;flex:none;transition:opacity var(--vo-t) var(--vo-ease)}.vo-is-writing .vo-afx-pv-act{opacity:0;visibility:hidden}.vo-afx-in{max-width:440px;display:flex;flex-direction:column;gap:14px}.vo-afx-in-msg{display:flex;flex-direction:column;gap:10px}.vo-afx-in-msg p{margin:0;font-size:14px;line-height:1.6;text-wrap:pretty}.vo-afx-chip{display:inline-flex;align-items:center;align-self:flex-start;max-width:100%;height:34px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);transition:box-shadow var(--vo-t-fast),background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-afx-chip:not(.vo-is-writing):is(:hover,:focus-within,.vo-pin){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent),0 1px 2px #0000000d}}.vo-afx-in-main{display:inline-flex;align-items:center;gap:var(--vo-s-2);min-width:0;height:34px;padding:0 var(--vo-s-3) 0 10px;border-radius:var(--vo-r-pill);font-size:13px}.vo-afx-in-main:focus-visible{outline-offset:-2px!important}.vo-afx-in-ic{display:grid;place-items:center;width:16px;height:16px;flex:none;color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-in-ic .vo-spin{display:none;width:11px;height:11px}.vo-is-writing .vo-afx-in-ic .vo-spin{display:inline-block}.vo-is-writing .vo-afx-in-ic svg{display:none}.vo-afx-in-t{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.vo-afx-in-m{color:var(--vo-afx-t2);white-space:nowrap;font-size:12.5px}.vo-afx-in-m .vo-afx-wr{display:none}.vo-afx-in-m .vo-afx-fin{display:inline-flex;gap:var(--vo-s-1)}.vo-is-writing .vo-afx-in-m .vo-afx-wr{display:inline}.vo-is-writing .vo-afx-in-m .vo-afx-fin{display:none}.vo-afx-tray{display:grid;grid-template-columns:0fr;opacity:0;transition:grid-template-columns var(--vo-t) var(--vo-ease),opacity var(--vo-t-fast) var(--vo-ease)}.vo-afx-tray>span{display:flex;align-items:center;min-width:0;overflow:hidden}.vo-afx-tray>span>:last-child{margin-right:3px}@media (hover:hover) and (pointer:fine){.vo-afx-chip:not(.vo-is-writing):is(:hover,:focus-within,.vo-pin) .vo-afx-tray{grid-template-columns:1fr;opacity:1}}.vo-afx-tray .vo-ib{width:28px;height:28px}.vo-afx-tray .vo-ib:focus-visible{outline-offset:-2px}.vo-afx-tsep{flex:none;width:1px;height:16px;margin-right:3px;background:var(--vo-line)}@media (hover:none){.vo-afx-chip:not(.vo-is-writing) .vo-afx-tray{grid-template-columns:1fr;opacity:1}}@container (max-width:400px){.vo-afx-in-m :is(.vo-afx-when,.vo-afx-msep){display:none}}.vo-afx-st{display:flex;flex-direction:column;align-items:center;gap:18px;--vo-sw:150px;--vo-sh:194px;--vo-fx:min(122px,calc((100cqw - var(--vo-sw) - 24px) / 2));--vo-ln:color-mix(in srgb,var(--vo-fg) 26%,var(--vo-surface))}@container (max-width:360px){.vo-afx-st{--vo-sw:112px;--vo-sh:146px}}.vo-afx-desk{position:relative;width:var(--vo-sw);height:calc(var(--vo-sh) + 24px)}.vo-afx-desk:before{content:\"\";position:absolute;left:4%;right:4%;bottom:-10px;height:26px;border-radius:50%;background:radial-gradient(closest-side,rgba(0,0,0,.13),transparent);transition:opacity var(--vo-t) var(--vo-ease)}:root[data-theme=dark] .vo-afx-desk:before{background:radial-gradient(closest-side,rgba(0,0,0,.5),transparent)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-afx-desk:before{background:radial-gradient(closest-side,rgba(0,0,0,.5),transparent)}}:root:not([data-style=soft]) .vo-afx-desk:not(:where([data-style=soft],[data-style=soft] *)):before,.vo-afx-st.vo-fan .vo-afx-desk:before{opacity:0}.vo-afx-stack{position:absolute;inset:0}.vo-afx-sh{--vo-pk:-1.5px;position:absolute;left:0;top:12px;width:var(--vo-sw);height:var(--vo-sh);padding:0;text-align:left;border-radius:calc(10px * var(--vo-rk));background:var(--vo-surface);box-shadow:var(--vo-shadow);transform:translate(calc(var(--vo-d,0) * var(--vo-pk)),calc(var(--vo-d,0) * var(--vo-pk)));transition:transform var(--vo-t-slow) var(--vo-ease),box-shadow var(--vo-t) var(--vo-ease)}.vo-afx-st:not(.vo-fan):not(.vo-is-writing):has(:focus-visible) .vo-afx-sh{--vo-pk:-4px}@media (hover:hover) and (pointer:fine){.vo-afx-st:not(.vo-fan):not(.vo-is-writing) .vo-afx-desk:hover .vo-afx-sh{--vo-pk:-4px}}.vo-afx-sh:focus-visible{outline-offset:3px}.vo-afx-st:not(.vo-fan) .vo-afx-sh[aria-checked=true]{box-shadow:var(--vo-shadow-pop)}.vo-afx-st.vo-is-writing .vo-afx-sh{cursor:default}.vo-afx-pg{position:absolute;inset:0;display:flex;flex-direction:column;padding:var(--vo-s-3);border-radius:inherit;overflow:hidden}.vo-afx-st-k{display:flex;align-items:center;justify-content:space-between;font-size:11px;line-height:14px;color:var(--vo-afx-t2)}.vo-afx-st-h{min-height:32px;margin-top:var(--vo-s-1);font-size:12.5px;font-weight:500;line-height:16px;color:var(--vo-fg)}.vo-afx-st-ls{display:flex;flex-direction:column;gap:7px;margin-top:10px}.vo-afx-r{position:relative;display:flex;align-items:center;gap:5px;height:4px}.vo-afx-r i{display:block;height:3px;border-radius:2px;width:var(--vo-w);background:var(--vo-ln);transform-origin:left center}.vo-afx-r b{flex:none;width:4px;height:4px;border-radius:50%;background:var(--vo-ln)}.vo-afx-r.vo-n b{width:6px;height:6px;margin:0 -1px;background:var(--vo-accent-mark)}.vo-afx-gap{height:3px}.vo-afx-st .vo-blank .vo-afx-r :is(i,b){transform:scaleX(0)}.vo-afx-pen{position:absolute;left:0;top:0;width:7px;height:7px;border-radius:50%;background:var(--vo-accent-mark);box-shadow:0 0 0 3px var(--vo-surface);opacity:0;pointer-events:none}@container (max-width:360px){.vo-afx-st-ls{gap:6px;margin-top:var(--vo-s-2)}.vo-afx-st-ls>:nth-child(n+7){display:none}}.vo-afx-tab{position:absolute;left:50%;top:calc(100% + 10px);display:inline-flex;align-items:center;gap:var(--vo-s-1);transform:translate(-50%);white-space:nowrap;font-size:11.5px;color:var(--vo-afx-t2);opacity:0;transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-tab .vo-i{display:none;color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-st.vo-fan .vo-afx-tab{opacity:1}.vo-afx-sh[aria-checked=true] .vo-afx-tab{color:var(--vo-fg);font-weight:500}.vo-afx-sh[aria-checked=true] .vo-afx-tab .vo-i{display:inline-block}@container (max-width:360px){.vo-afx-tab .vo-afx-ta{display:none}}.vo-afx-cap{display:flex;flex-direction:column;align-items:center;max-width:100%;text-align:center;transition:margin var(--vo-t) var(--vo-ease)}.vo-afx-st.vo-fan .vo-afx-cap{margin-top:22px}.vo-afx-st-t{font-size:14px;font-weight:500}.vo-afx-st-m{justify-content:center;max-width:100%}.vo-afx-note{padding-top:2px;font-size:12.5px;color:var(--vo-fg)}.vo-afx-st-act{display:flex;align-items:center;gap:var(--vo-s-1);transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-st-act .vo-pill{gap:6px}.vo-afx-st.vo-is-writing .vo-afx-st-act{opacity:0;visibility:hidden}.vo-i{width:16px;height:16px;flex:none;display:inline-block;vertical-align:-3px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}.vo-i.vo-s{width:14px;height:14px}.vo-i.vo-xs{width:12px;height:12px}.vo-i.vo-l{width:18px;height:18px}.vo-num{font-variant-numeric:tabular-nums}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}@keyframes vo-bpblink{50%{opacity:0}}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-accent{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-accent:hover{background:var(--vo-accent-2)}}.vo-pill.vo-line{background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);color:var(--vo-fg)}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-copied{color:var(--vo-ok)!important}@media (hover:hover) and (pointer:fine){.vo-copied:hover{color:var(--vo-ok)!important}}.vo-pop{position:absolute;z-index:50;min-width:200px;background:var(--vo-raised);border-radius:calc(14px * var(--vo-rk));box-shadow:var(--vo-shadow-pop);padding:6px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px) scale(.98);transform-origin:var(--vo-origin,top left);filter:blur(3px);transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;pointer-events:auto;transform:none;filter:none;transition-property:opacity,transform,filter}.vo-pop .vo-ph{padding:6px var(--vo-s-2) var(--vo-s-1);font-size:11.5px;color:var(--vo-muted)}.vo-mi{display:flex;align-items:center;gap:10px;width:100%;padding:7px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));font-size:13px;text-align:left;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi+.vo-mi{margin-top:2px}.vo-mi .vo-i{color:var(--vo-fg2)}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-mi .vo-ck{margin-left:auto;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transition:opacity var(--vo-t-fast)}.vo-mi[aria-checked=true] .vo-ck{opacity:1}.vo-mi[aria-checked=true]{background:var(--vo-row);font-weight:500}.vo-bub{align-self:flex-end;max-width:85%;background:var(--vo-hover);border-radius:var(--vo-r-card);padding:9px 13px;font-size:14px;line-height:1.45}.vo-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:hidden;min-height:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None }); }
653
+ }
654
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ArtifactCardComponent, decorators: [{
655
+ type: Component,
656
+ args: [{ selector: 'vo-artifact-card', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent, NgTemplateOutlet], template: `
657
+ <div data-vo="" class="vo-afx" [class]="className">
658
+ <!-- compact: an icon, the name, one line of meta and Open -->
659
+ @if (variant === 'compact') {
660
+ <div class="vo-afx-w">
661
+ <div class="vo-afx-cp-card vo-afx-card" [class.vo-is-writing]="writing">
662
+ <span class="vo-afx-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon"></vo-icon></span>
663
+ <div class="vo-afx-cp-tx"><div class="vo-afx-cp-t">{{ v.title }}</div>
664
+ <ng-container [ngTemplateOutlet]="metaLine"></ng-container>
665
+ </div>
666
+ <div class="vo-afx-cp-act">
667
+ <ng-container [ngTemplateOutlet]="actions"></ng-container>
668
+ <button type="button" class="vo-pill vo-sm vo-accent vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
669
+ [disabled]="writing" (click)="open('view', $any($event.currentTarget), null)"><vo-icon name="ext"></vo-icon><span class="vo-afx-lbl">Open</span></button>
670
+ </div>
671
+ @if (writing) {
672
+ <span class="vo-afx-cp-bar" aria-hidden="true" [style.transform]="'scaleX(' + clamp(progress) + ')'"></span>
673
+ }
674
+ </div>
675
+ <ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
676
+ </div>
677
+ }
678
+
679
+ <!-- preview: the same card with the first page showing -->
680
+ @if (variant === 'preview') {
681
+ <div class="vo-afx-w vo-afx-pv">
682
+ <div class="vo-afx-pv-card vo-afx-card" [class.vo-is-writing]="writing">
683
+ <div class="vo-afx-pv-prev" aria-hidden="true">
684
+ <div class="vo-afx-pv-page" #pvPage>
685
+ <div class="vo-afx-pv-k"><span class="vo-afx-wr">Writing…</span><span class="vo-afx-fin">{{ kind }} · v{{ i + 1 }}</span></div>
686
+ <div class="vo-afx-pv-h">{{ v.title }}</div>
687
+ <p class="vo-afx-pv-p">{{ summary }}@if (writing) {<span class="vo-afx-caret"></span>}</p>
688
+ <div class="vo-afx-pv-ls">
689
+ @for (w of previewWidths; track $index) {
690
+ <i [style.--vo-w]="w + '%'"></i>
691
+ }
692
+ </div>
693
+ </div>
694
+ </div>
695
+ <div class="vo-afx-pv-meta">
696
+ <span class="vo-afx-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon"></vo-icon></span>
697
+ <div class="vo-afx-pv-tx"><div class="vo-afx-pv-t">{{ v.title }}</div>
698
+ <ng-container [ngTemplateOutlet]="metaLine"></ng-container>
699
+ </div>
700
+ <div class="vo-afx-pv-act">
701
+ <ng-container [ngTemplateOutlet]="actions"></ng-container>
702
+ <button type="button" class="vo-ib vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
703
+ [disabled]="writing" (click)="open('page', $any($event.currentTarget), pvPage)"><vo-icon name="ext"></vo-icon></button>
704
+ </div>
705
+ </div>
706
+ </div>
707
+ <ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
708
+ </div>
709
+ }
710
+
711
+ <!-- inline: one line inside the message; versions and actions fold out on hover or focus -->
712
+ @if (variant === 'inline') {
713
+ <div class="vo-afx-w">
714
+ <span class="vo-afx-chip" [class.vo-is-writing]="writing" [class.vo-pin]="menuOpen">
715
+ <button type="button" class="vo-afx-in-main" [disabled]="writing" (click)="open('view', $any($event.currentTarget), null)">
716
+ <span class="vo-afx-in-ic"><span class="vo-spin" aria-hidden="true"></span><vo-icon [name]="icon" size="sm"></vo-icon></span>
717
+ <span class="vo-afx-in-t"><span class="vo-afx-sr">Open </span>{{ v.title }}</span>
718
+ <span class="vo-afx-in-m"><span class="vo-afx-wr vo-shim">{{ status }}</span>
719
+ <span class="vo-afx-fin" [class.vo-enter]="settled"><span class="vo-afx-v">v{{ i + 1 }}</span><span class="vo-afx-msep" aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(v.meta)"></span></span></span>
720
+ </button>
721
+ <span class="vo-afx-tray"><span>
722
+ <span class="vo-afx-tsep" aria-hidden="true"></span>
723
+ @if (n > 1) {
724
+ <button type="button" class="vo-ib vo-afx-vb3" aria-label="Versions" aria-haspopup="menu"
725
+ [attr.aria-expanded]="menuOpen" (click)="toggleMenu($any($event.currentTarget))" (keydown)="triggerKeys($event)"><vo-icon name="clock" size="sm"></vo-icon></button>
726
+ }
727
+ <ng-container [ngTemplateOutlet]="actions"></ng-container>
728
+ </span></span>
729
+ </span>
730
+ <ng-container [ngTemplateOutlet]="versionsMenu"></ng-container>
731
+ </div>
732
+ }
733
+
734
+ <!-- stack: the report as a stack of paper; Versions lays the sheets out to pick one -->
735
+ @if (variant === 'stack') {
736
+ <div class="vo-afx-w vo-afx-st" [class.vo-is-writing]="writing" [class.vo-fan]="fanned">
737
+ <div class="vo-afx-desk" #desk>
738
+ <div class="vo-afx-stack" role="menu" [attr.aria-label]="'Versions of ' + v.title" [attr.aria-hidden]="!fanned" (keydown)="deskKeys($event)">
739
+ @for (x of versions; track shIdx; let shIdx = $index) {
740
+ <button type="button" class="vo-afx-sh" [class.vo-blank]="writing && shIdx === last" role="menuitemradio"
741
+ [attr.data-i]="shIdx" [attr.aria-checked]="shIdx === i" [attr.tabindex]="fanned && shIdx === i ? 0 : -1"
742
+ [attr.aria-label]="'v' + (shIdx + 1) + ', ' + x.meta + (x.note ? ': ' + x.note : '')" [style]="sheetStyle(shIdx)"
743
+ (click)="sheetClick(shIdx, $any($event.currentTarget))"
744
+ (pointerenter)="fanned && setPeek(shIdx)" (pointerleave)="fanned && setPeek(null)"
745
+ (focus)="fanned && setPeek(shIdx)" (blur)="fanned && setPeek(null)">
746
+ <span class="vo-afx-pg" aria-hidden="true">
747
+ <span class="vo-afx-st-k"><span>{{ writing && shIdx === last ? 'Writing…' : 'v' + (shIdx + 1) }}</span></span>
748
+ <span class="vo-afx-st-h">{{ writing && shIdx === last ? typedTitle : x.title }}</span>
749
+ <span class="vo-afx-st-ls">
750
+ @for (ln of stackLines(shIdx); track lnIdx; let lnIdx = $index) {
751
+ @if (ln.t === 's') {
752
+ <span class="vo-afx-gap"></span>
753
+ } @else {
754
+ <span class="vo-afx-r" [class.vo-n]="ln.t === 'n'">@if (ln.t !== 'p') {<b></b>}<i [style.--vo-w]="ln.w + '%'"></i></span>
755
+ }
756
+ }
757
+ </span>
758
+ @if (shIdx === last) {<span class="vo-afx-pen"></span>}
759
+ </span>
760
+ <span class="vo-afx-tab" aria-hidden="true"><vo-icon name="check" size="xs"></vo-icon><span>v{{ shIdx + 1 }}</span><span class="vo-afx-ta"> · {{ shortMeta(x.meta) }}</span></span>
761
+ </button>
762
+ }
763
+ </div>
764
+ </div>
765
+ <div class="vo-afx-cap">
766
+ <div class="vo-afx-st-t">{{ v.title }}</div>
767
+ <div class="vo-afx-meta vo-afx-st-m"><span class="vo-afx-wr vo-shim">{{ status }}</span>
768
+ <span class="vo-afx-fin" [class.vo-enter]="settled"><span>{{ kind }}</span><span aria-hidden="true">·</span><span class="vo-afx-v">v{{ shown + 1 }}</span><span aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(versions[shown].meta)"></span></span>
769
+ </div>
770
+ <div class="vo-fold vo-afx-nw" [class.vo-shut]="!fanned"><div><div class="vo-afx-note">{{ versions[shown].note }}</div></div></div>
771
+ </div>
772
+ <div class="vo-afx-st-act">
773
+ @if (n > 1) {
774
+ <button type="button" class="vo-pill vo-sm vo-line vo-afx-fan" #fanBtn aria-haspopup="menu" [attr.aria-expanded]="fanned" (click)="fan(!fanned, true)"><vo-icon name="clock"></vo-icon><span>Versions</span></button>
775
+ }
776
+ <ng-container [ngTemplateOutlet]="actions"></ng-container>
777
+ <button type="button" class="vo-pill vo-sm vo-accent vo-afx-open" [attr.aria-label]="openLabel ?? 'Open ' + v.title"
778
+ [disabled]="writing" (click)="openStack($any($event.currentTarget))"><vo-icon name="ext"></vo-icon><span class="vo-afx-lbl">Open</span></button>
779
+ </div>
780
+ </div>
781
+ }
782
+
783
+ <!-- the opened file: a modal reader over the card's nearest positioned ancestor -->
784
+ @if (reading) {
785
+ <div class="vo-afx-sheet" #sheet (keydown)="readerKeys($event)">
786
+ <div class="vo-afx-scrim" #scrim (click)="closeReader()"></div>
787
+ <div class="vo-afx-pan" [class.vo-afx-page]="reading.kind === 'page'" [class.vo-afx-view]="reading.kind === 'view'"
788
+ role="dialog" aria-modal="true" [attr.aria-label]="v.title" tabindex="-1" #pan>
789
+ <div class="vo-afx-ph">
790
+ <span class="vo-afx-ic" aria-hidden="true"><vo-icon [name]="icon"></vo-icon></span>
791
+ <div class="vo-afx-ptx"><div class="vo-afx-pt">{{ v.title }}</div><div class="vo-afx-pm">{{ kind }} · v{{ i + 1 }} · {{ v.meta }}</div></div>
792
+ <button type="button" class="vo-ib vo-afx-x" aria-label="Close" #closeBtn (click)="closeReader()"><vo-icon name="x"></vo-icon></button>
793
+ </div>
794
+ <div class="vo-afx-pb" tabindex="0" role="region" [attr.aria-label]="v.title + ', v' + (i + 1)">
795
+ @if (ext === 'csv') {
796
+ <table class="vo-afx-tb">
797
+ <thead><tr>@for (h of csvRows[0]; track $index) {<th scope="col" [class.vo-num]="$index">{{ h }}</th>}</tr></thead>
798
+ <tbody>@for (row of csvRows.slice(1); track $index) {
799
+ <tr>@for (cell of row; track $index) {
800
+ @if ($index) {<td class="vo-num">{{ cell }}</td>} @else {<th scope="row">{{ cell }}</th>}
801
+ }</tr>
802
+ }</tbody>
803
+ </table>
804
+ } @else {
805
+ @for (b of bodyBlocks; track $index) {
806
+ @switch (b.kind) {
807
+ @case ('h3') { <h3>{{ b.text }}</h3> }
808
+ @case ('ul') { <ul>@for (li of b.items; track $index) {<li>{{ li }}</li>}</ul> }
809
+ @case ('ol') { <ol>@for (li of b.items; track $index) {<li>{{ li }}</li>}</ol> }
810
+ @default { <p>{{ b.text }}</p> }
811
+ }
812
+ }
813
+ }
814
+ </div>
815
+ <div class="vo-afx-pf">
816
+ <button type="button" class="vo-pill vo-sm vo-line vo-afx-copy" [class.vo-copied]="flashed === 'rcopy'" (click)="copy('rcopy')"><vo-icon [name]="flashed === 'rcopy' ? 'check' : 'copy'" size="sm"></vo-icon><span class="vo-afx-lbl">{{ flashed === 'rcopy' ? 'Copied' : 'Copy' }}</span></button>
817
+ <button type="button" class="vo-pill vo-sm vo-line vo-afx-dl" [class.vo-copied]="flashed === 'rdl'" (click)="download('rdl')"><vo-icon [name]="flashed === 'rdl' ? 'check' : 'chev-d'" size="sm"></vo-icon><span class="vo-afx-lbl">{{ flashed === 'rdl' ? 'Downloaded' : 'Download' }}</span></button>
818
+ </div>
819
+ </div>
820
+ </div>
821
+ }
822
+
823
+ <!-- the versions menu, shared by the compact, preview and inline variants -->
824
+ <ng-template #versionsMenu>
825
+ @if (n > 1) {
826
+ <div class="vo-pop vo-afx-menu" [class.vo-open]="menuOpen" role="menu" [attr.aria-label]="'Versions of ' + v.title"
827
+ #menuEl [attr.inert]="menuOpen ? null : ''" [style.left.px]="menuLeft" [style.top.px]="menuTop" (keydown)="menuKeys($event)">
828
+ <div class="vo-ph" aria-hidden="true">Versions</div>
829
+ @for (n2 of reversed; track n2) {
830
+ <button type="button" class="vo-mi" role="menuitemradio" tabindex="-1" [attr.aria-checked]="n2 === i" [attr.data-i]="n2"
831
+ (click)="pickFromMenu(n2)">
832
+ <span class="vo-afx-mb"><span>v{{ n2 + 1 }}<span class="vo-afx-mw"> · {{ shortMeta(versions[n2].meta) }}</span></span>@if (versions[n2].note) {<span class="vo-d">{{ versions[n2].note }}</span>}</span>
833
+ <vo-icon name="check" class="vo-ck" size="sm"></vo-icon>
834
+ </button>
835
+ }
836
+ </div>
837
+ }
838
+ </ng-template>
839
+
840
+ <!-- the meta line, shared by the compact and preview variants -->
841
+ <ng-template #metaLine>
842
+ <div class="vo-afx-meta">
843
+ <span class="vo-afx-wr vo-shim">{{ status }}</span>
844
+ <span class="vo-afx-fin" [class.vo-enter]="settled">
845
+ <span>{{ kind }}</span><span aria-hidden="true">·</span>
846
+ @if (n > 1) {
847
+ <button type="button" class="vo-afx-vb" aria-haspopup="menu" [attr.aria-expanded]="menuOpen"
848
+ [attr.aria-label]="'v' + (i + 1) + ' of ' + n + ' versions'" (click)="toggleMenu($any($event.currentTarget))" (keydown)="triggerKeys($event)"><span class="vo-afx-vt">v{{ i + 1 }}</span><vo-icon name="chev-d" size="xs"></vo-icon></button>
849
+ } @else {
850
+ <span class="vo-afx-v">v1</span>
851
+ }
852
+ <span aria-hidden="true">·</span><span class="vo-afx-when" [innerHTML]="whenHtml(v.meta)"></span>
853
+ </span>
854
+ </div>
855
+ </ng-template>
856
+
857
+ <!-- Copy and Download, shared by every variant -->
858
+ <ng-template #actions>
859
+ <button type="button" class="vo-ib vo-afx-copy" [class.vo-copied]="flashed === 'copy'" [attr.aria-label]="'Copy ' + v.title" (click)="copy('copy')"><vo-icon [name]="flashed === 'copy' ? 'check' : 'copy'" [size]="actionSize"></vo-icon></button>
860
+ <button type="button" class="vo-ib vo-afx-dl" [class.vo-copied]="flashed === 'dl'" [attr.aria-label]="'Download ' + v.title" (click)="download('dl')"><vo-icon [name]="flashed === 'dl' ? 'check' : 'chev-d'" [size]="actionSize"></vo-icon></button>
861
+ </ng-template>
862
+
863
+ <div class="vo-afx-sr" role="status" aria-live="polite">{{ said }}</div>
864
+ </div>
865
+ `, styles: [".vo-afx{--vo-afx-t2:var(--vo-muted);width:100%;container-type:inline-size}.vo-afx.vo-dm>.vo-afx-main{position:relative;min-height:452px;justify-content:center}@container (max-width:400px){.vo-afx.vo-dm>.vo-afx-main{min-height:474px}}:root[data-theme=dark] .vo-afx{--vo-afx-t2:#c0c0c0}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-afx{--vo-afx-t2:#c0c0c0}}.vo-afx>.vo-demo .vo-seg2 button{color:var(--vo-afx-t2)}.vo-afx>.vo-demo .vo-seg2 button[aria-pressed=true]{color:var(--vo-fg)}.vo-afx-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.vo-afx-w{position:relative;width:100%;transition:transform var(--vo-t) var(--vo-ease)}.vo-afx-ic{width:36px;height:36px;border-radius:calc(10px * var(--vo-rk));display:grid;place-items:center;flex:none;background:var(--vo-accent-bg);color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-ic .vo-spin{display:none}.vo-is-writing .vo-afx-ic .vo-spin{display:inline-block}.vo-is-writing .vo-afx-ic svg{display:none}.vo-afx-meta{display:flex;align-items:center;min-width:0;height:20px;font-size:12.5px;color:var(--vo-afx-t2);white-space:nowrap}.vo-afx-fin{display:flex;align-items:center;gap:5px;min-width:0}.vo-afx-meta .vo-afx-wr{display:none;overflow:hidden;text-overflow:ellipsis}.vo-is-writing .vo-afx-meta .vo-afx-wr{display:inline}.vo-is-writing .vo-afx-meta .vo-afx-fin{display:none}.vo-afx-when{overflow:hidden;text-overflow:ellipsis;min-width:0}.vo-afx-vb{position:relative;z-index:1;display:inline-flex;align-items:center;gap:1px;height:20px;padding:0 3px 0 5px;margin:0 -2px;border-radius:calc(6px * var(--vo-rk));font-size:12.5px;font-weight:500;color:var(--vo-fg);transition:background var(--vo-t-fast)}.vo-afx-vb[aria-expanded=true]{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-afx-vb:hover{background:var(--vo-row)}}.vo-afx-vb .vo-i{color:var(--vo-fg2)}.vo-afx-menu{width:264px;max-width:calc(100% - 16px)}.vo-afx-menu:not(.vo-open){visibility:hidden;transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .35s}.vo-afx-menu .vo-ph{color:var(--vo-afx-t2)}.vo-afx-menu .vo-mi{align-items:flex-start;gap:var(--vo-s-2)}.vo-afx-menu .vo-mi:focus-visible{outline-offset:-2px;background:var(--vo-row)}.vo-afx-mb{display:flex;flex-direction:column;min-width:0}.vo-afx-mw{font-weight:400;color:var(--vo-afx-t2)}.vo-afx-menu .vo-mi .vo-d{color:var(--vo-afx-t2);font-weight:400;white-space:normal}@media (hover:hover) and (pointer:fine){.vo-afx-menu .vo-mi:is(:hover,.vo-hl,[aria-checked=true]) .vo-d{color:var(--vo-afx-t2);font-weight:400;white-space:normal}}.vo-afx-menu .vo-mi .vo-ck{margin-top:3px}.vo-afx-card{position:relative}.vo-afx-card .vo-afx-open:after{content:\"\";position:absolute;inset:0;border-radius:inherit}.vo-afx-card .vo-afx-open{transform:none!important}.vo-afx-card :is(.vo-afx-copy,.vo-afx-dl,.vo-afx-vb){position:relative;z-index:1}.vo-afx .vo-copied .vo-afx-lbl{color:var(--vo-fg)}.vo-afx-sheet{position:absolute;inset:0;z-index:20;border-radius:inherit;overflow:hidden}.vo-afx-scrim{position:absolute;inset:0;background:color-mix(in srgb,var(--vo-stage) 78%,transparent)}.vo-afx-pan{position:absolute;display:flex;flex-direction:column;background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow-pop);overflow:hidden;outline:none}.vo-afx-pan.vo-afx-view{inset:0}.vo-afx-pan.vo-afx-page{inset:0;margin:auto;width:min(400px,100%);transform-origin:0 0}.vo-afx-ph{display:flex;align-items:center;gap:10px;padding:10px var(--vo-s-2) 10px 14px;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-ph .vo-afx-ic{width:30px;height:30px;border-radius:var(--vo-r-sm)}.vo-afx-ptx{flex:1;min-width:0}.vo-afx-pt{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pm{font-size:12.5px;color:var(--vo-afx-t2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pb{flex:1;min-height:0;overflow:auto;padding:14px 18px 18px;font-size:13.5px;line-height:1.6;outline:none}.vo-afx-pb:focus-visible{box-shadow:inset 0 0 0 2px var(--vo-focus)}.vo-afx-pb h3{margin:var(--vo-s-4) 0 var(--vo-s-1);font-size:12.5px;font-weight:500;color:var(--vo-afx-t2)}.vo-afx-pb p{margin:0}.vo-afx-pb :is(ul,ol){margin:0;padding-left:18px}.vo-afx-pb li+li{margin-top:3px}.vo-afx-pb li::marker{color:var(--vo-fg2)}.vo-afx-tb{width:100%;border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums}.vo-afx-tb :is(th,td){padding:7px var(--vo-s-2);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);text-align:left;font-weight:400}.vo-afx-tb thead th{font-size:12.5px;color:var(--vo-afx-t2);font-weight:500}.vo-afx-tb .vo-num{text-align:right}.vo-afx-tb tbody th{font-weight:500}.vo-afx-pf{display:flex;align-items:center;gap:6px;padding:10px 14px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-pf .vo-pill .vo-afx-lbl{min-width:58px;text-align:left}.vo-afx-pf .vo-pill.vo-copied{color:var(--vo-fg)!important}.vo-afx-pf .vo-pill.vo-copied .vo-i{color:var(--vo-ok)}.vo-afx-cp{max-width:440px;display:flex;flex-direction:column;gap:14px}.vo-afx-cp-a{margin:0;font-size:14px;line-height:1.6;text-wrap:pretty}.vo-afx-cp-list{display:flex;flex-direction:column;gap:var(--vo-s-2)}.vo-afx-cp-card{display:flex;align-items:center;gap:var(--vo-s-3);padding:10px var(--vo-s-2) 10px 10px;border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:background var(--vo-t-fast),box-shadow var(--vo-t-fast);overflow:hidden}@media (hover:hover) and (pointer:fine){.vo-afx-cp-card:not(.vo-is-writing):hover{background:var(--vo-wash)}}@media (hover:hover) and (pointer:fine){:root:not([data-style=soft]) .vo-afx-cp-card:not(.vo-is-writing):hover:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}}.vo-afx-cp-tx{flex:1;min-width:0}.vo-afx-cp-t{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-cp-act{display:flex;align-items:center;gap:2px;flex:none;transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-cp-act .vo-pill{margin-left:var(--vo-s-1);gap:6px;padding:0 10px}@media (hover:hover) and (pointer:fine){.vo-afx .vo-afx-open.vo-pill.vo-accent:hover{background:color-mix(in srgb,var(--vo-accent) 86%,#000)}}.vo-is-writing .vo-afx-cp-act{opacity:0;visibility:hidden}.vo-afx-cp-bar{position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--vo-accent-mark);transform-origin:left center;transform:scaleX(0);opacity:0;transition:transform .9s var(--vo-ease),opacity .3s var(--vo-ease)}.vo-is-writing .vo-afx-cp-bar{opacity:1}@container (max-width:400px){.vo-afx-ed{display:none}.vo-afx-fin{gap:var(--vo-s-1)}.vo-afx-card .vo-afx-ic{width:32px;height:32px;border-radius:calc(9px * var(--vo-rk))}.vo-afx-card :is(.vo-afx-copy,.vo-afx-dl,.vo-ib.vo-afx-open){width:28px;height:28px}.vo-afx-cp-act,.vo-afx-pv-act{gap:0}.vo-afx-cp-card{padding-right:6px;gap:10px}.vo-afx-pv-meta{gap:10px;padding-right:6px}.vo-afx-pv-meta .vo-afx-ic,.vo-afx-cp-act .vo-pill .vo-afx-lbl{display:none}.vo-afx-cp-act .vo-pill{width:28px;height:28px;padding:0;margin-left:2px}}.vo-afx-pv{width:min(100%,380px)}.vo-afx-pv-card{border-radius:var(--vo-r-card);background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:box-shadow var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-afx-pv-card:not(.vo-is-writing):hover{box-shadow:var(--vo-shadow-pop)}}@media (hover:hover) and (pointer:fine){:root:not([data-style=soft]) .vo-afx-pv-card:not(.vo-is-writing):hover:not(:where([data-style=soft],[data-style=soft] *)){box-shadow:0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent)}}.vo-afx-pv-prev{position:relative;height:164px;overflow:hidden;padding:18px 22px 0;border-radius:var(--vo-r-card) var(--vo-r-card) 0 0;background:var(--vo-stage);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-afx-pv-page{height:100%;padding:14px var(--vo-s-4) 0;border-radius:var(--vo-r-sm) var(--vo-r-sm) 0 0;background:var(--vo-surface);box-shadow:var(--vo-shadow);transition:transform var(--vo-t) var(--vo-ease)}@media (hover:hover) and (pointer:fine){.vo-afx-pv-card:not(.vo-is-writing):hover .vo-afx-pv-page{transform:translateY(-3px)}}.vo-afx-pv-k{font-size:11px;line-height:16px;color:var(--vo-afx-t2)}.vo-afx-pv-k .vo-afx-wr,.vo-is-writing .vo-afx-pv-k .vo-afx-fin{display:none}.vo-is-writing .vo-afx-pv-k .vo-afx-wr{display:inline}.vo-afx-pv-h{margin-top:2px;font-size:13px;font-weight:500;line-height:18px}.vo-afx-pv-p{margin:6px 0 0;min-height:54px;font-size:11.5px;line-height:18px;color:var(--vo-fg);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.vo-afx-caret{display:inline-block;width:1.5px;height:12px;margin-left:1px;vertical-align:-2px;background:var(--vo-accent-mark);animation:vo-bpblink 1s steps(1,end) infinite}.vo-afx-pv-ls{display:flex;flex-direction:column;gap:var(--vo-s-2);margin-top:10px;-webkit-mask-image:linear-gradient(#000 0,transparent 44px);mask-image:linear-gradient(#000 0,transparent 44px)}.vo-afx-pv-ls i{display:block;height:4px;border-radius:2px;width:var(--vo-w);background:color-mix(in srgb,var(--vo-fg) 8%,var(--vo-surface));transform-origin:left center;transition:width var(--vo-t) var(--vo-ease)}.vo-is-writing .vo-afx-pv-ls i{transform:scaleX(0)}.vo-afx-pv-meta{display:flex;align-items:center;gap:var(--vo-s-3);padding:var(--vo-s-3) var(--vo-s-2) var(--vo-s-3) 14px}.vo-afx-pv-tx{flex:1;min-width:0}.vo-afx-pv-t{font-size:13.5px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-afx-pv-act{display:flex;align-items:center;gap:2px;flex:none;transition:opacity var(--vo-t) var(--vo-ease)}.vo-is-writing .vo-afx-pv-act{opacity:0;visibility:hidden}.vo-afx-in{max-width:440px;display:flex;flex-direction:column;gap:14px}.vo-afx-in-msg{display:flex;flex-direction:column;gap:10px}.vo-afx-in-msg p{margin:0;font-size:14px;line-height:1.6;text-wrap:pretty}.vo-afx-chip{display:inline-flex;align-items:center;align-self:flex-start;max-width:100%;height:34px;border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);transition:box-shadow var(--vo-t-fast),background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-afx-chip:not(.vo-is-writing):is(:hover,:focus-within,.vo-pin){box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-rail) 50%,transparent),0 1px 2px #0000000d}}.vo-afx-in-main{display:inline-flex;align-items:center;gap:var(--vo-s-2);min-width:0;height:34px;padding:0 var(--vo-s-3) 0 10px;border-radius:var(--vo-r-pill);font-size:13px}.vo-afx-in-main:focus-visible{outline-offset:-2px!important}.vo-afx-in-ic{display:grid;place-items:center;width:16px;height:16px;flex:none;color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-in-ic .vo-spin{display:none;width:11px;height:11px}.vo-is-writing .vo-afx-in-ic .vo-spin{display:inline-block}.vo-is-writing .vo-afx-in-ic svg{display:none}.vo-afx-in-t{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.vo-afx-in-m{color:var(--vo-afx-t2);white-space:nowrap;font-size:12.5px}.vo-afx-in-m .vo-afx-wr{display:none}.vo-afx-in-m .vo-afx-fin{display:inline-flex;gap:var(--vo-s-1)}.vo-is-writing .vo-afx-in-m .vo-afx-wr{display:inline}.vo-is-writing .vo-afx-in-m .vo-afx-fin{display:none}.vo-afx-tray{display:grid;grid-template-columns:0fr;opacity:0;transition:grid-template-columns var(--vo-t) var(--vo-ease),opacity var(--vo-t-fast) var(--vo-ease)}.vo-afx-tray>span{display:flex;align-items:center;min-width:0;overflow:hidden}.vo-afx-tray>span>:last-child{margin-right:3px}@media (hover:hover) and (pointer:fine){.vo-afx-chip:not(.vo-is-writing):is(:hover,:focus-within,.vo-pin) .vo-afx-tray{grid-template-columns:1fr;opacity:1}}.vo-afx-tray .vo-ib{width:28px;height:28px}.vo-afx-tray .vo-ib:focus-visible{outline-offset:-2px}.vo-afx-tsep{flex:none;width:1px;height:16px;margin-right:3px;background:var(--vo-line)}@media (hover:none){.vo-afx-chip:not(.vo-is-writing) .vo-afx-tray{grid-template-columns:1fr;opacity:1}}@container (max-width:400px){.vo-afx-in-m :is(.vo-afx-when,.vo-afx-msep){display:none}}.vo-afx-st{display:flex;flex-direction:column;align-items:center;gap:18px;--vo-sw:150px;--vo-sh:194px;--vo-fx:min(122px,calc((100cqw - var(--vo-sw) - 24px) / 2));--vo-ln:color-mix(in srgb,var(--vo-fg) 26%,var(--vo-surface))}@container (max-width:360px){.vo-afx-st{--vo-sw:112px;--vo-sh:146px}}.vo-afx-desk{position:relative;width:var(--vo-sw);height:calc(var(--vo-sh) + 24px)}.vo-afx-desk:before{content:\"\";position:absolute;left:4%;right:4%;bottom:-10px;height:26px;border-radius:50%;background:radial-gradient(closest-side,rgba(0,0,0,.13),transparent);transition:opacity var(--vo-t) var(--vo-ease)}:root[data-theme=dark] .vo-afx-desk:before{background:radial-gradient(closest-side,rgba(0,0,0,.5),transparent)}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .vo-afx-desk:before{background:radial-gradient(closest-side,rgba(0,0,0,.5),transparent)}}:root:not([data-style=soft]) .vo-afx-desk:not(:where([data-style=soft],[data-style=soft] *)):before,.vo-afx-st.vo-fan .vo-afx-desk:before{opacity:0}.vo-afx-stack{position:absolute;inset:0}.vo-afx-sh{--vo-pk:-1.5px;position:absolute;left:0;top:12px;width:var(--vo-sw);height:var(--vo-sh);padding:0;text-align:left;border-radius:calc(10px * var(--vo-rk));background:var(--vo-surface);box-shadow:var(--vo-shadow);transform:translate(calc(var(--vo-d,0) * var(--vo-pk)),calc(var(--vo-d,0) * var(--vo-pk)));transition:transform var(--vo-t-slow) var(--vo-ease),box-shadow var(--vo-t) var(--vo-ease)}.vo-afx-st:not(.vo-fan):not(.vo-is-writing):has(:focus-visible) .vo-afx-sh{--vo-pk:-4px}@media (hover:hover) and (pointer:fine){.vo-afx-st:not(.vo-fan):not(.vo-is-writing) .vo-afx-desk:hover .vo-afx-sh{--vo-pk:-4px}}.vo-afx-sh:focus-visible{outline-offset:3px}.vo-afx-st:not(.vo-fan) .vo-afx-sh[aria-checked=true]{box-shadow:var(--vo-shadow-pop)}.vo-afx-st.vo-is-writing .vo-afx-sh{cursor:default}.vo-afx-pg{position:absolute;inset:0;display:flex;flex-direction:column;padding:var(--vo-s-3);border-radius:inherit;overflow:hidden}.vo-afx-st-k{display:flex;align-items:center;justify-content:space-between;font-size:11px;line-height:14px;color:var(--vo-afx-t2)}.vo-afx-st-h{min-height:32px;margin-top:var(--vo-s-1);font-size:12.5px;font-weight:500;line-height:16px;color:var(--vo-fg)}.vo-afx-st-ls{display:flex;flex-direction:column;gap:7px;margin-top:10px}.vo-afx-r{position:relative;display:flex;align-items:center;gap:5px;height:4px}.vo-afx-r i{display:block;height:3px;border-radius:2px;width:var(--vo-w);background:var(--vo-ln);transform-origin:left center}.vo-afx-r b{flex:none;width:4px;height:4px;border-radius:50%;background:var(--vo-ln)}.vo-afx-r.vo-n b{width:6px;height:6px;margin:0 -1px;background:var(--vo-accent-mark)}.vo-afx-gap{height:3px}.vo-afx-st .vo-blank .vo-afx-r :is(i,b){transform:scaleX(0)}.vo-afx-pen{position:absolute;left:0;top:0;width:7px;height:7px;border-radius:50%;background:var(--vo-accent-mark);box-shadow:0 0 0 3px var(--vo-surface);opacity:0;pointer-events:none}@container (max-width:360px){.vo-afx-st-ls{gap:6px;margin-top:var(--vo-s-2)}.vo-afx-st-ls>:nth-child(n+7){display:none}}.vo-afx-tab{position:absolute;left:50%;top:calc(100% + 10px);display:inline-flex;align-items:center;gap:var(--vo-s-1);transform:translate(-50%);white-space:nowrap;font-size:11.5px;color:var(--vo-afx-t2);opacity:0;transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-tab .vo-i{display:none;color:var(--vo-accent-fg,var(--vo-accent))}.vo-afx-st.vo-fan .vo-afx-tab{opacity:1}.vo-afx-sh[aria-checked=true] .vo-afx-tab{color:var(--vo-fg);font-weight:500}.vo-afx-sh[aria-checked=true] .vo-afx-tab .vo-i{display:inline-block}@container (max-width:360px){.vo-afx-tab .vo-afx-ta{display:none}}.vo-afx-cap{display:flex;flex-direction:column;align-items:center;max-width:100%;text-align:center;transition:margin var(--vo-t) var(--vo-ease)}.vo-afx-st.vo-fan .vo-afx-cap{margin-top:22px}.vo-afx-st-t{font-size:14px;font-weight:500}.vo-afx-st-m{justify-content:center;max-width:100%}.vo-afx-note{padding-top:2px;font-size:12.5px;color:var(--vo-fg)}.vo-afx-st-act{display:flex;align-items:center;gap:var(--vo-s-1);transition:opacity var(--vo-t) var(--vo-ease)}.vo-afx-st-act .vo-pill{gap:6px}.vo-afx-st.vo-is-writing .vo-afx-st-act{opacity:0;visibility:hidden}.vo-i{width:16px;height:16px;flex:none;display:inline-block;vertical-align:-3px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}.vo-i.vo-s{width:14px;height:14px}.vo-i.vo-xs{width:12px;height:12px}.vo-i.vo-l{width:18px;height:18px}.vo-num{font-variant-numeric:tabular-nums}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}@keyframes vo-bpblink{50%{opacity:0}}.vo-ib{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;color:var(--vo-fg2);cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),transform .15s}@media (hover:hover) and (pointer:fine){.vo-ib:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-ib:active{transform:scale(.94)}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-accent{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-accent:hover{background:var(--vo-accent-2)}}.vo-pill.vo-line{background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);color:var(--vo-fg)}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-copied{color:var(--vo-ok)!important}@media (hover:hover) and (pointer:fine){.vo-copied:hover{color:var(--vo-ok)!important}}.vo-pop{position:absolute;z-index:50;min-width:200px;background:var(--vo-raised);border-radius:calc(14px * var(--vo-rk));box-shadow:var(--vo-shadow-pop);padding:6px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px) scale(.98);transform-origin:var(--vo-origin,top left);filter:blur(3px);transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;pointer-events:auto;transform:none;filter:none;transition-property:opacity,transform,filter}.vo-pop .vo-ph{padding:6px var(--vo-s-2) var(--vo-s-1);font-size:11.5px;color:var(--vo-muted)}.vo-mi{display:flex;align-items:center;gap:10px;width:100%;padding:7px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));font-size:13px;text-align:left;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi+.vo-mi{margin-top:2px}.vo-mi .vo-i{color:var(--vo-fg2)}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}.vo-mi .vo-ck{margin-left:auto;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transition:opacity var(--vo-t-fast)}.vo-mi[aria-checked=true] .vo-ck{opacity:1}.vo-mi[aria-checked=true]{background:var(--vo-row);font-weight:500}.vo-bub{align-self:flex-end;max-width:85%;background:var(--vo-hover);border-radius:var(--vo-r-card);padding:9px 13px;font-size:14px;line-height:1.45}.vo-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:hidden;min-height:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0}\n"] }]
866
+ }], propDecorators: { variant: [{
867
+ type: Input
868
+ }], versions: [{
869
+ type: Input
870
+ }], version: [{
871
+ type: Input
872
+ }], defaultVersion: [{
873
+ type: Input
874
+ }], state: [{
875
+ type: Input
876
+ }], status: [{
877
+ type: Input
878
+ }], progress: [{
879
+ type: Input
880
+ }], kind: [{
881
+ type: Input
882
+ }], icon: [{
883
+ type: Input
884
+ }], fileName: [{
885
+ type: Input
886
+ }], ext: [{
887
+ type: Input
888
+ }], openLabel: [{
889
+ type: Input
890
+ }], className: [{
891
+ type: Input
892
+ }], versionChange: [{
893
+ type: Output
894
+ }], opened: [{
895
+ type: Output
896
+ }], copied: [{
897
+ type: Output
898
+ }], downloaded: [{
899
+ type: Output
900
+ }], menuEl: [{
901
+ type: ViewChild,
902
+ args: ['menuEl']
903
+ }], desk: [{
904
+ type: ViewChild,
905
+ args: ['desk']
906
+ }], fanBtn: [{
907
+ type: ViewChild,
908
+ args: ['fanBtn']
909
+ }], pan: [{
910
+ type: ViewChild,
911
+ args: ['pan']
912
+ }], closeBtn: [{
913
+ type: ViewChild,
914
+ args: ['closeBtn']
915
+ }] } });
916
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWZhY3QtY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcnRpZmFjdC1jYXJkL2FydGlmYWN0LWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YseUVBQXlFO0FBQ3pFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsdUVBQXVFO0FBQ3ZFLGdGQUFnRjtBQUNoRiwyQkFBMkI7QUFDM0IsRUFBRTtBQUNGLGdGQUFnRjtBQUNoRiw2RUFBNkU7QUFDN0UsZ0ZBQWdGO0FBQ2hGLGlDQUFpQztBQUVqQyxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFtQixNQUFNLHdCQUF3QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQXNCdEUsTUFBTSxJQUFJLEdBQTJCO0lBQ25DLEVBQUUsRUFBRSxlQUFlO0lBQ25CLEdBQUcsRUFBRSxVQUFVO0lBQ2YsSUFBSSxFQUFFLGtCQUFrQjtJQUN4QixJQUFJLEVBQUUsV0FBVztDQUNsQixDQUFDO0FBQ0YsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUN6QixDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5RCxNQUFNLFNBQVMsR0FBRyxDQUFDLE9BQWUsRUFBRSxFQUFFLENBQ3BDLE9BQU87S0FDSixLQUFLLENBQUMsU0FBUyxDQUFDO0tBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ3BCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBZWhFLE1BQU0sS0FBSyxHQUFhO0lBQ3RCLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hMLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hMLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0NBQ2pMLENBQUM7QUFDRiw0RkFBNEY7QUFDNUYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENB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QUFoQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdJLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTTtnQkFFRyxVQUFVO3NCQUFuQixNQUFNO2dCQUVzQixNQUFNO3NCQUFsQyxTQUFTO3VCQUFDLFFBQVE7Z0JBQ1EsSUFBSTtzQkFBOUIsU0FBUzt1QkFBQyxNQUFNO2dCQUNZLE1BQU07c0JBQWxDLFNBQVM7dUJBQUMsUUFBUTtnQkFDTyxHQUFHO3NCQUE1QixTQUFTO3VCQUFDLEtBQUs7Z0JBQ2UsUUFBUTtzQkFBdEMsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnJhbWV3b3JrL2FuZ3VsYXIvYXJ0aWZhY3QtY2FyZC9hcnRpZmFjdC1jYXJkLmNvbXBvbmVudC50c1xuLy9cbi8vIE5hdGl2ZSBBbmd1bGFyIHBvcnQgb2YgZnJhbWV3b3JrL3JlYWN0L2FydGlmYWN0LWNhcmQvQXJ0aWZhY3RDYXJkLnRzeC5cbi8vIEEgZmlsZSB0aGUgYWdlbnQgbWFkZSwgc2hvd24gZm91ciB3YXlzOiBhIGNvbXBhY3Qgcm93LCBhIGNhcmQgd2l0aCBpdHMgZmlyc3Rcbi8vIHBhZ2UsIGEgY2hpcCBpbnNpZGUgYSBtZXNzYWdlLCBvciBhIHN0YWNrIG9mIGl0cyB2ZXJzaW9ucy4gRWFjaCBwbGF5cyBhXG4vLyB3cml0aW5nIHN0YXRlLCB0aGVuIG9wZW5zIGluIGEgcmVhZGVyLCBzd2l0Y2hlcyB2ZXJzaW9ucywgY29waWVzIGFuZFxuLy8gZG93bmxvYWRzIHRoZSBzYW1lIHdheS4gSW5wdXRzIG1pcnJvciB0aGUgUmVhY3QgcHJvcHM7IFJlYWN0IGNhbGxiYWNrcyBiZWNvbWVcbi8vIEBPdXRwdXQoKSBFdmVudEVtaXR0ZXJzLlxuLy9cbi8vIEljb24gbm90ZXM6IHRoZSBBbmd1bGFyIGNvcmUgZ2x5cGggc2V0IGhhcyBubyBkb3dubG9hZC9wYW5lbC9tYXhpbWl6ZS9sYXllcnMvXG4vLyBoaXN0b3J5IGdseXBocywgc28gdGhlIGNsb3Nlc3QgYXZhaWxhYmxlIG5hbWVzIGFyZSBzdWJzdGl0dXRlZCDigJQgT3BlbiB1c2VzXG4vLyBgZXh0YCAob3BlbiBvdXQpLCBEb3dubG9hZCB1c2VzIGBjaGV2LWRgIChhIGRvd253YXJkIGFycm93KSwgYW5kIHRoZSBWZXJzaW9uc1xuLy8gYnV0dG9ucyB1c2UgYGNsb2NrYCAoaGlzdG9yeSkuXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgVm9JY29uQ29tcG9uZW50LCB0eXBlIFZvSWNvbk5hbWUgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlZHVjZWRNb3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9yZWR1Y2VkLW1vdGlvbi5zZXJ2aWNlJztcblxuLyoqIE9uZSB2ZXJzaW9uIG9mIHRoZSBmaWxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcnRpZmFjdFZlcnNpb24ge1xuICAvKiogVGhlIGZpbGUncyBuYW1lIGluIHRoaXMgdmVyc2lvbiwgbGlrZSBcIlByaWNpbmcgcGFnZSByZXZpZXdcIi4gKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIFdoZW4gdGhpcyB2ZXJzaW9uIHdhcyBtYWRlLCBsaWtlIFwiZWRpdGVkIDIgaG91cnMgYWdvXCIuICovXG4gIG1ldGE6IHN0cmluZztcbiAgLyoqIFdoYXQgY2hhbmdlZCBpbiB0aGlzIHZlcnNpb24sIGxpa2UgXCJBZGRlZCBhIGNvbXBldGl0b3IgcHJpY2UgY2hlY2tcIi4gKi9cbiAgbm90ZT86IHN0cmluZztcbiAgLyoqIFRoZSBmaWxlIGl0c2VsZiwgYXMgTWFya2Rvd24gKG9yIENTViB3aGVuIGBleHRgIGlzIFwiY3N2XCIpLiAqL1xuICBjb250ZW50OiBzdHJpbmc7XG4gIC8qKiBUaGUgdGV4dCBvbiB0aGUgcHJldmlldydzIGZpcnN0IHBhZ2UuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBwYXJhZ3JhcGggb2YgYGNvbnRlbnRgLiAqL1xuICBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG4vKiogSG93IHRoZSBjYXJkIHNob3dzIHRoZSBmaWxlLiAqL1xuZXhwb3J0IHR5cGUgQXJ0aWZhY3RWYXJpYW50ID0gJ2NvbXBhY3QnIHwgJ3ByZXZpZXcnIHwgJ2lubGluZScgfCAnc3RhY2snO1xuXG4vKiogV2hldGhlciB0aGUgYWdlbnQgaXMgc3RpbGwgbWFraW5nIHRoZSBmaWxlLiAqL1xuZXhwb3J0IHR5cGUgQXJ0aWZhY3RTdGF0ZSA9ICd3cml0aW5nJyB8ICdyZWFkeSc7XG5cbmNvbnN0IE1JTUU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIG1kOiAndGV4dC9tYXJrZG93bicsXG4gIGNzdjogJ3RleHQvY3N2JyxcbiAganNvbjogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICBodG1sOiAndGV4dC9odG1sJyxcbn07XG5jb25zdCBzbHVnID0gKHM6IHN0cmluZykgPT5cbiAgcy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG5jb25zdCBhZ28gPSAobWV0YTogc3RyaW5nKSA9PiBtZXRhLnJlcGxhY2UoL15lZGl0ZWRcXHMrL2ksICcnKTtcbmNvbnN0IGZpcnN0UGFyYSA9IChjb250ZW50OiBzdHJpbmcpID0+XG4gIGNvbnRlbnRcbiAgICAuc3BsaXQoL1xcblxccypcXG4vKVxuICAgIC5tYXAoKGIpID0+IGIudHJpbSgpKVxuICAgIC5maW5kKChiKSA9PiBiICYmICEvXigjfFstKl0gfFxcZCtcXC4gfHZcXGQrLCkvLnRlc3QoYikpID8/ICcnO1xuXG4vKiogQSBibG9jayBvZiB0aGUgcmVhZGVyJ3MgcmVuZGVyZWQgYm9keS4gKi9cbmludGVyZmFjZSBCbG9jayB7XG4gIGtpbmQ6ICdoMycgfCAncCcgfCAndWwnIHwgJ29sJztcbiAgdGV4dD86IHN0cmluZztcbiAgaXRlbXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIE9uZSBkcmF3biBsaW5lIG9uIGEgc3RhY2sgc2hlZXQ6IHAgYSBwYXJhZ3JhcGgsIGIgYSBidWxsZXQsIG4gYSBudW1iZXJlZCBmaXgsIHMgYSBnYXAuICovXG5pbnRlcmZhY2UgTGluZSB7XG4gIHQ6ICdwJyB8ICdiJyB8ICduJyB8ICdzJztcbiAgdz86IG51bWJlcjtcbn1cblxuY29uc3QgTElORVM6IExpbmVbXVtdID0gW1xuICBbeyB0OiAncCcsIHc6IDk0IH0sIHsgdDogJ3AnLCB3OiA3MiB9LCB7IHQ6ICdzJyB9LCB7IHQ6ICdiJywgdzogODIgfSwgeyB0OiAnYicsIHc6IDc0IH0sIHsgdDogJ2InLCB3OiA2NiB9LCB7IHQ6ICdiJywgdzogNzggfSwgeyB0OiAncycgfSwgeyB0OiAncCcsIHc6IDg4IH0sIHsgdDogJ3AnLCB3OiA1MiB9XSxcbiAgW3sgdDogJ3AnLCB3OiA5MiB9LCB7IHQ6ICdwJywgdzogODYgfSwgeyB0OiAncCcsIHc6IDU2IH0sIHsgdDogJ3MnIH0sIHsgdDogJ2InLCB3OiA4MCB9LCB7IHQ6ICdiJywgdzogNzIgfSwgeyB0OiAnYicsIHc6IDg2IH0sIHsgdDogJ2InLCB3OiA2NCB9LCB7IHQ6ICdzJyB9LCB7IHQ6ICdwJywgdzogNzAgfV0sXG4gIFt7IHQ6ICdwJywgdzogOTAgfSwgeyB0OiAncCcsIHc6IDc4IH0sIHsgdDogJ3MnIH0sIHsgdDogJ24nLCB3OiA4NCB9LCB7IHQ6ICduJywgdzogNzAgfSwgeyB0OiAnbicsIHc6IDc4IH0sIHsgdDogJ3MnIH0sIHsgdDogJ2InLCB3OiA3NiB9LCB7IHQ6ICdiJywgdzogNjggfSwgeyB0OiAnYicsIHc6IDgyIH1dLFxuXTtcbi8vIHRoZSBwcmV2aWV3J3MgbGluZXMsIGEgbGl0dGxlIGRpZmZlcmVudCBmb3IgZWFjaCB2ZXJzaW9uIHNvIGRyYWZ0cyBhcmUgZWFzeSB0byB0ZWxsIGFwYXJ0XG5jb25zdCBXSURUSFMgPSBbWzk2LCA4OCwgNzAsIDgyXSwgWzkyLCA4NCwgOTAsIDY0XSwgWzkwLCA3OCwgODYsIDcyXV07XG5cbi8qKiBBIHZpZXcgdGhlIHJlYWRlciBpcyBzaG93aW5nLCBvciBudWxsIHdoZW4gY2xvc2VkLiAqL1xuaW50ZXJmYWNlIFJlYWRpbmcge1xuICBraW5kOiAndmlldycgfCAncGFnZSc7XG4gIHNyYzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICBvcGVuZXI6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndm8tYXJ0aWZhY3QtY2FyZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnQsIE5nVGVtcGxhdGVPdXRsZXRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgZGF0YS12bz1cIlwiIGNsYXNzPVwidm8tYWZ4XCIgW2NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICAgICAgPCEtLSBjb21wYWN0OiBhbiBpY29uLCB0aGUgbmFtZSwgb25lIGxpbmUgb2YgbWV0YSBhbmQgT3BlbiAtLT5cbiAgICAgIEBpZiAodmFyaWFudCA9PT0gJ2NvbXBhY3QnKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtY3AtY2FyZCB2by1hZngtY2FyZFwiIFtjbGFzcy52by1pcy13cml0aW5nXT1cIndyaXRpbmdcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWljXCI+PHNwYW4gY2xhc3M9XCJ2by1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjx2by1pY29uIFtuYW1lXT1cImljb25cIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1jcC10eFwiPjxkaXYgY2xhc3M9XCJ2by1hZngtY3AtdFwiPnt7IHYudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJtZXRhTGluZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LWNwLWFjdFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFjdGlvbnNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLXNtIHZvLWFjY2VudCB2by1hZngtb3BlblwiIFthdHRyLmFyaWEtbGFiZWxdPVwib3BlbkxhYmVsID8/ICdPcGVuICcgKyB2LnRpdGxlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid3JpdGluZ1wiIChjbGljayk9XCJvcGVuKCd2aWV3JywgJGFueSgkZXZlbnQuY3VycmVudFRhcmdldCksIG51bGwpXCI+PHZvLWljb24gbmFtZT1cImV4dFwiPjwvdm8taWNvbj48c3BhbiBjbGFzcz1cInZvLWFmeC1sYmxcIj5PcGVuPC9zcGFuPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKHdyaXRpbmcpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hZngtY3AtYmFyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgW3N0eWxlLnRyYW5zZm9ybV09XCInc2NhbGVYKCcgKyBjbGFtcChwcm9ncmVzcykgKyAnKSdcIj48L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ2ZXJzaW9uc01lbnVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gcHJldmlldzogdGhlIHNhbWUgY2FyZCB3aXRoIHRoZSBmaXJzdCBwYWdlIHNob3dpbmcgLS0+XG4gICAgICBAaWYgKHZhcmlhbnQgPT09ICdwcmV2aWV3Jykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LXcgdm8tYWZ4LXB2XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wdi1jYXJkIHZvLWFmeC1jYXJkXCIgW2NsYXNzLnZvLWlzLXdyaXRpbmddPVwid3JpdGluZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wdi1wcmV2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtcHYtcGFnZVwiICNwdlBhZ2U+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wdi1rXCI+PHNwYW4gY2xhc3M9XCJ2by1hZngtd3JcIj5Xcml0aW5n4oCmPC9zcGFuPjxzcGFuIGNsYXNzPVwidm8tYWZ4LWZpblwiPnt7IGtpbmQgfX0gwrcgdnt7IGkgKyAxIH19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtcHYtaFwiPnt7IHYudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInZvLWFmeC1wdi1wXCI+e3sgc3VtbWFyeSB9fUBpZiAod3JpdGluZykgezxzcGFuIGNsYXNzPVwidm8tYWZ4LWNhcmV0XCI+PC9zcGFuPn08L3A+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wdi1sc1wiPlxuICAgICAgICAgICAgICAgICAgQGZvciAodyBvZiBwcmV2aWV3V2lkdGhzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGkgW3N0eWxlLi0tdm8td109XCJ3ICsgJyUnXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wdi1tZXRhXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWljXCI+PHNwYW4gY2xhc3M9XCJ2by1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjx2by1pY29uIFtuYW1lXT1cImljb25cIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LXB2LXR4XCI+PGRpdiBjbGFzcz1cInZvLWFmeC1wdi10XCI+e3sgdi50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibWV0YUxpbmVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtcHYtYWN0XCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJhY3Rpb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1pYiB2by1hZngtb3BlblwiIFthdHRyLmFyaWEtbGFiZWxdPVwib3BlbkxhYmVsID8/ICdPcGVuICcgKyB2LnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ3cml0aW5nXCIgKGNsaWNrKT1cIm9wZW4oJ3BhZ2UnLCAkYW55KCRldmVudC5jdXJyZW50VGFyZ2V0KSwgcHZQYWdlKVwiPjx2by1pY29uIG5hbWU9XCJleHRcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ2ZXJzaW9uc01lbnVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gaW5saW5lOiBvbmUgbGluZSBpbnNpZGUgdGhlIG1lc3NhZ2U7IHZlcnNpb25zIGFuZCBhY3Rpb25zIGZvbGQgb3V0IG9uIGhvdmVyIG9yIGZvY3VzIC0tPlxuICAgICAgQGlmICh2YXJpYW50ID09PSAnaW5saW5lJykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LXdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1jaGlwXCIgW2NsYXNzLnZvLWlzLXdyaXRpbmddPVwid3JpdGluZ1wiIFtjbGFzcy52by1waW5dPVwibWVudU9wZW5cIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tYWZ4LWluLW1haW5cIiBbZGlzYWJsZWRdPVwid3JpdGluZ1wiIChjbGljayk9XCJvcGVuKCd2aWV3JywgJGFueSgkZXZlbnQuY3VycmVudFRhcmdldCksIG51bGwpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWluLWljXCI+PHNwYW4gY2xhc3M9XCJ2by1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjx2by1pY29uIFtuYW1lXT1cImljb25cIiBzaXplPVwic21cIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1pbi10XCI+PHNwYW4gY2xhc3M9XCJ2by1hZngtc3JcIj5PcGVuIDwvc3Bhbj57eyB2LnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1pbi1tXCI+PHNwYW4gY2xhc3M9XCJ2by1hZngtd3Igdm8tc2hpbVwiPnt7IHN0YXR1cyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1maW5cIiBbY2xhc3Mudm8tZW50ZXJdPVwic2V0dGxlZFwiPjxzcGFuIGNsYXNzPVwidm8tYWZ4LXZcIj52e3sgaSArIDEgfX08L3NwYW4+PHNwYW4gY2xhc3M9XCJ2by1hZngtbXNlcFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPsK3PC9zcGFuPjxzcGFuIGNsYXNzPVwidm8tYWZ4LXdoZW5cIiBbaW5uZXJIVE1MXT1cIndoZW5IdG1sKHYubWV0YSlcIj48L3NwYW4+PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hZngtdHJheVwiPjxzcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC10c2VwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICBAaWYgKG4gPiAxKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1pYiB2by1hZngtdmIzXCIgYXJpYS1sYWJlbD1cIlZlcnNpb25zXCIgYXJpYS1oYXNwb3B1cD1cIm1lbnVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtZW51T3BlblwiIChjbGljayk9XCJ0b2dnbGVNZW51KCRhbnkoJGV2ZW50LmN1cnJlbnRUYXJnZXQpKVwiIChrZXlkb3duKT1cInRyaWdnZXJLZXlzKCRldmVudClcIj48dm8taWNvbiBuYW1lPVwiY2xvY2tcIiBzaXplPVwic21cIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJhY3Rpb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3NwYW4+PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInZlcnNpb25zTWVudVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSBzdGFjazogdGhlIHJlcG9ydCBhcyBhIHN0YWNrIG9mIHBhcGVyOyBWZXJzaW9ucyBsYXlzIHRoZSBzaGVldHMgb3V0IHRvIHBpY2sgb25lIC0tPlxuICAgICAgQGlmICh2YXJpYW50ID09PSAnc3RhY2snKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtdyB2by1hZngtc3RcIiBbY2xhc3Mudm8taXMtd3JpdGluZ109XCJ3cml0aW5nXCIgW2NsYXNzLnZvLWZhbl09XCJmYW5uZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LWRlc2tcIiAjZGVzaz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtc3RhY2tcIiByb2xlPVwibWVudVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1ZlcnNpb25zIG9mICcgKyB2LnRpdGxlXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWZhbm5lZFwiIChrZXlkb3duKT1cImRlc2tLZXlzKCRldmVudClcIj5cbiAgICAgICAgICAgICAgQGZvciAoeCBvZiB2ZXJzaW9uczsgdHJhY2sgc2hJZHg7IGxldCBzaElkeCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tYWZ4LXNoXCIgW2NsYXNzLnZvLWJsYW5rXT1cIndyaXRpbmcgJiYgc2hJZHggPT09IGxhc3RcIiByb2xlPVwibWVudWl0ZW1yYWRpb1wiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWldPVwic2hJZHhcIiBbYXR0ci5hcmlhLWNoZWNrZWRdPVwic2hJZHggPT09IGlcIiBbYXR0ci50YWJpbmRleF09XCJmYW5uZWQgJiYgc2hJZHggPT09IGkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIndicgKyAoc2hJZHggKyAxKSArICcsICcgKyB4Lm1ldGEgKyAoeC5ub3RlID8gJzogJyArIHgubm90ZSA6ICcnKVwiIFtzdHlsZV09XCJzaGVldFN0eWxlKHNoSWR4KVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hlZXRDbGljayhzaElkeCwgJGFueSgkZXZlbnQuY3VycmVudFRhcmdldCkpXCJcbiAgICAgICAgICAgICAgICAgIChwb2ludGVyZW50ZXIpPVwiZmFubmVkICYmIHNldFBlZWsoc2hJZHgpXCIgKHBvaW50ZXJsZWF2ZSk9XCJmYW5uZWQgJiYgc2V0UGVlayhudWxsKVwiXG4gICAgICAgICAgICAgICAgICAoZm9jdXMpPVwiZmFubmVkICYmIHNldFBlZWsoc2hJZHgpXCIgKGJsdXIpPVwiZmFubmVkICYmIHNldFBlZWsobnVsbClcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LXBnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LXN0LWtcIj48c3Bhbj57eyB3cml0aW5nICYmIHNoSWR4ID09PSBsYXN0ID8gJ1dyaXRpbmfigKYnIDogJ3YnICsgKHNoSWR4ICsgMSkgfX08L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1zdC1oXCI+e3sgd3JpdGluZyAmJiBzaElkeCA9PT0gbGFzdCA/IHR5cGVkVGl0bGUgOiB4LnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1zdC1sc1wiPlxuICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGxuIG9mIHN0YWNrTGluZXMoc2hJZHgpOyB0cmFjayBsbklkeDsgbGV0IGxuSWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGxuLnQgPT09ICdzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1nYXBcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hZngtclwiIFtjbGFzcy52by1uXT1cImxuLnQgPT09ICduJ1wiPkBpZiAobG4udCAhPT0gJ3AnKSB7PGI+PC9iPn08aSBbc3R5bGUuLS12by13XT1cImxuLncgKyAnJSdcIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNoSWR4ID09PSBsYXN0KSB7PHNwYW4gY2xhc3M9XCJ2by1hZngtcGVuXCI+PC9zcGFuPn1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LXRhYlwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjx2by1pY29uIG5hbWU9XCJjaGVja1wiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48c3Bhbj52e3sgc2hJZHggKyAxIH19PC9zcGFuPjxzcGFuIGNsYXNzPVwidm8tYWZ4LXRhXCI+IMK3IHt7IHNob3J0TWV0YSh4Lm1ldGEpIH19PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1jYXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtc3QtdFwiPnt7IHYudGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtbWV0YSB2by1hZngtc3QtbVwiPjxzcGFuIGNsYXNzPVwidm8tYWZ4LXdyIHZvLXNoaW1cIj57eyBzdGF0dXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWZpblwiIFtjbGFzcy52by1lbnRlcl09XCJzZXR0bGVkXCI+PHNwYW4+e3sga2luZCB9fTwvc3Bhbj48c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj7Ctzwvc3Bhbj48c3BhbiBjbGFzcz1cInZvLWFmeC12XCI+dnt7IHNob3duICsgMSB9fTwvc3Bhbj48c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj7Ctzwvc3Bhbj48c3BhbiBjbGFzcz1cInZvLWFmeC13aGVuXCIgW2lubmVySFRNTF09XCJ3aGVuSHRtbCh2ZXJzaW9uc1tzaG93bl0ubWV0YSlcIj48L3NwYW4+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZCB2by1hZngtbndcIiBbY2xhc3Mudm8tc2h1dF09XCIhZmFubmVkXCI+PGRpdj48ZGl2IGNsYXNzPVwidm8tYWZ4LW5vdGVcIj57eyB2ZXJzaW9uc1tzaG93bl0ubm90ZSB9fTwvZGl2PjwvZGl2PjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtc3QtYWN0XCI+XG4gICAgICAgICAgICBAaWYgKG4gPiAxKSB7XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1zbSB2by1saW5lIHZvLWFmeC1mYW5cIiAjZmFuQnRuIGFyaWEtaGFzcG9wdXA9XCJtZW51XCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJmYW5uZWRcIiAoY2xpY2spPVwiZmFuKCFmYW5uZWQsIHRydWUpXCI+PHZvLWljb24gbmFtZT1cImNsb2NrXCI+PC92by1pY29uPjxzcGFuPlZlcnNpb25zPC9zcGFuPjwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJhY3Rpb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tc20gdm8tYWNjZW50IHZvLWFmeC1vcGVuXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJvcGVuTGFiZWwgPz8gJ09wZW4gJyArIHYudGl0bGVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid3JpdGluZ1wiIChjbGljayk9XCJvcGVuU3RhY2soJGFueSgkZXZlbnQuY3VycmVudFRhcmdldCkpXCI+PHZvLWljb24gbmFtZT1cImV4dFwiPjwvdm8taWNvbj48c3BhbiBjbGFzcz1cInZvLWFmeC1sYmxcIj5PcGVuPC9zcGFuPjwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgPCEtLSB0aGUgb3BlbmVkIGZpbGU6IGEgbW9kYWwgcmVhZGVyIG92ZXIgdGhlIGNhcmQncyBuZWFyZXN0IHBvc2l0aW9uZWQgYW5jZXN0b3IgLS0+XG4gICAgICBAaWYgKHJlYWRpbmcpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1zaGVldFwiICNzaGVldCAoa2V5ZG93bik9XCJyZWFkZXJLZXlzKCRldmVudClcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LXNjcmltXCIgI3NjcmltIChjbGljayk9XCJjbG9zZVJlYWRlcigpXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wYW5cIiBbY2xhc3Mudm8tYWZ4LXBhZ2VdPVwicmVhZGluZy5raW5kID09PSAncGFnZSdcIiBbY2xhc3Mudm8tYWZ4LXZpZXddPVwicmVhZGluZy5raW5kID09PSAndmlldydcIlxuICAgICAgICAgICAgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ2LnRpdGxlXCIgdGFiaW5kZXg9XCItMVwiICNwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LXBoXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWljXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PHZvLWljb24gW25hbWVdPVwiaWNvblwiPjwvdm8taWNvbj48L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtcHR4XCI+PGRpdiBjbGFzcz1cInZvLWFmeC1wdFwiPnt7IHYudGl0bGUgfX08L2Rpdj48ZGl2IGNsYXNzPVwidm8tYWZ4LXBtXCI+e3sga2luZCB9fSDCtyB2e3sgaSArIDEgfX0gwrcge3sgdi5tZXRhIH19PC9kaXY+PC9kaXY+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8taWIgdm8tYWZ4LXhcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAjY2xvc2VCdG4gKGNsaWNrKT1cImNsb3NlUmVhZGVyKClcIj48dm8taWNvbiBuYW1lPVwieFwiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWFmeC1wYlwiIHRhYmluZGV4PVwiMFwiIHJvbGU9XCJyZWdpb25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInYudGl0bGUgKyAnLCB2JyArIChpICsgMSlcIj5cbiAgICAgICAgICAgICAgQGlmIChleHQgPT09ICdjc3YnKSB7XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidm8tYWZ4LXRiXCI+XG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+PHRyPkBmb3IgKGggb2YgY3N2Um93c1swXTsgdHJhY2sgJGluZGV4KSB7PHRoIHNjb3BlPVwiY29sXCIgW2NsYXNzLnZvLW51bV09XCIkaW5kZXhcIj57eyBoIH19PC90aD59PC90cj48L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRib2R5PkBmb3IgKHJvdyBvZiBjc3ZSb3dzLnNsaWNlKDEpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRyPkBmb3IgKGNlbGwgb2Ygcm93OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCRpbmRleCkgezx0ZCBjbGFzcz1cInZvLW51bVwiPnt7IGNlbGwgfX08L3RkPn0gQGVsc2Ugezx0aCBzY29wZT1cInJvd1wiPnt7IGNlbGwgfX08L3RoPn1cbiAgICAgICAgICAgICAgICAgICAgfTwvdHI+XG4gICAgICAgICAgICAgICAgICB9PC90Ym9keT5cbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAZm9yIChiIG9mIGJvZHlCbG9ja3M7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgQHN3aXRjaCAoYi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgnaDMnKSB7IDxoMz57eyBiLnRleHQgfX08L2gzPiB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgndWwnKSB7IDx1bD5AZm9yIChsaSBvZiBiLml0ZW1zOyB0cmFjayAkaW5kZXgpIHs8bGk+e3sgbGkgfX08L2xpPn08L3VsPiB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgnb2wnKSB7IDxvbD5AZm9yIChsaSBvZiBiLml0ZW1zOyB0cmFjayAkaW5kZXgpIHs8bGk+e3sgbGkgfX08L2xpPn08L29sPiB9XG4gICAgICAgICAgICAgICAgICAgIEBkZWZhdWx0IHsgPHA+e3sgYi50ZXh0IH19PC9wPiB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtcGZcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLXNtIHZvLWxpbmUgdm8tYWZ4LWNvcHlcIiBbY2xhc3Mudm8tY29waWVkXT1cImZsYXNoZWQgPT09ICdyY29weSdcIiAoY2xpY2spPVwiY29weSgncmNvcHknKVwiPjx2by1pY29uIFtuYW1lXT1cImZsYXNoZWQgPT09ICdyY29weScgPyAnY2hlY2snIDogJ2NvcHknXCIgc2l6ZT1cInNtXCI+PC92by1pY29uPjxzcGFuIGNsYXNzPVwidm8tYWZ4LWxibFwiPnt7IGZsYXNoZWQgPT09ICdyY29weScgPyAnQ29waWVkJyA6ICdDb3B5JyB9fTwvc3Bhbj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLXNtIHZvLWxpbmUgdm8tYWZ4LWRsXCIgW2NsYXNzLnZvLWNvcGllZF09XCJmbGFzaGVkID09PSAncmRsJ1wiIChjbGljayk9XCJkb3dubG9hZCgncmRsJylcIj48dm8taWNvbiBbbmFtZV09XCJmbGFzaGVkID09PSAncmRsJyA/ICdjaGVjaycgOiAnY2hldi1kJ1wiIHNpemU9XCJzbVwiPjwvdm8taWNvbj48c3BhbiBjbGFzcz1cInZvLWFmeC1sYmxcIj57eyBmbGFzaGVkID09PSAncmRsJyA/ICdEb3dubG9hZGVkJyA6ICdEb3dubG9hZCcgfX08L3NwYW4+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIDwhLS0gdGhlIHZlcnNpb25zIG1lbnUsIHNoYXJlZCBieSB0aGUgY29tcGFjdCwgcHJldmlldyBhbmQgaW5saW5lIHZhcmlhbnRzIC0tPlxuICAgICAgPG5nLXRlbXBsYXRlICN2ZXJzaW9uc01lbnU+XG4gICAgICAgIEBpZiAobiA+IDEpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tcG9wIHZvLWFmeC1tZW51XCIgW2NsYXNzLnZvLW9wZW5dPVwibWVudU9wZW5cIiByb2xlPVwibWVudVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1ZlcnNpb25zIG9mICcgKyB2LnRpdGxlXCJcbiAgICAgICAgICAgICNtZW51RWwgW2F0dHIuaW5lcnRdPVwibWVudU9wZW4gPyBudWxsIDogJydcIiBbc3R5bGUubGVmdC5weF09XCJtZW51TGVmdFwiIFtzdHlsZS50b3AucHhdPVwibWVudVRvcFwiIChrZXlkb3duKT1cIm1lbnVLZXlzKCRldmVudClcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1waFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlZlcnNpb25zPC9kaXY+XG4gICAgICAgICAgICBAZm9yIChuMiBvZiByZXZlcnNlZDsgdHJhY2sgbjIpIHtcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1taVwiIHJvbGU9XCJtZW51aXRlbXJhZGlvXCIgdGFiaW5kZXg9XCItMVwiIFthdHRyLmFyaWEtY2hlY2tlZF09XCJuMiA9PT0gaVwiIFthdHRyLmRhdGEtaV09XCJuMlwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInBpY2tGcm9tTWVudShuMilcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC1tYlwiPjxzcGFuPnZ7eyBuMiArIDEgfX08c3BhbiBjbGFzcz1cInZvLWFmeC1td1wiPiDCtyB7eyBzaG9ydE1ldGEodmVyc2lvbnNbbjJdLm1ldGEpIH19PC9zcGFuPjwvc3Bhbj5AaWYgKHZlcnNpb25zW24yXS5ub3RlKSB7PHNwYW4gY2xhc3M9XCJ2by1kXCI+e3sgdmVyc2lvbnNbbjJdLm5vdGUgfX08L3NwYW4+fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2hlY2tcIiBjbGFzcz1cInZvLWNrXCIgc2l6ZT1cInNtXCI+PC92by1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPCEtLSB0aGUgbWV0YSBsaW5lLCBzaGFyZWQgYnkgdGhlIGNvbXBhY3QgYW5kIHByZXZpZXcgdmFyaWFudHMgLS0+XG4gICAgICA8bmctdGVtcGxhdGUgI21ldGFMaW5lPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWZ4LW1ldGFcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFmeC13ciB2by1zaGltXCI+e3sgc3RhdHVzIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWZ4LWZpblwiIFtjbGFzcy52by1lbnRlcl09XCJzZXR0bGVkXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyBraW5kIH19PC9zcGFuPjxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPsK3PC9zcGFuPlxuICAgICAgICAgICAgQGlmIChuID4gMSkge1xuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWFmeC12YlwiIGFyaWEtaGFzcG9wdXA9XCJtZW51XCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtZW51T3BlblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIndicgKyAoaSArIDEpICsgJyBvZiAnICsgbiArICcgdmVyc2lvbnMnXCIgKGNsaWNrKT1cInRvZ2dsZU1lbnUoJGFueSgkZXZlbnQuY3VycmVudFRhcmdldCkpXCIgKGtleWRvd24pPVwidHJpZ2dlcktleXMoJGV2ZW50KVwiPjxzcGFuIGNsYXNzPVwidm8tYWZ4LXZ0XCI+dnt7IGkgKyAxIH19PC9zcGFuPjx2by1pY29uIG5hbWU9XCJjaGV2LWRcIiBzaXplPVwieHNcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1hZngtdlwiPnYxPC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+wrc8L3NwYW4+PHNwYW4gY2xhc3M9XCJ2by1hZngtd2hlblwiIFtpbm5lckhUTUxdPVwid2hlbkh0bWwodi5tZXRhKVwiPjwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPCEtLSBDb3B5IGFuZCBEb3dubG9hZCwgc2hhcmVkIGJ5IGV2ZXJ5IHZhcmlhbnQgLS0+XG4gICAgICA8bmctdGVtcGxhdGUgI2FjdGlvbnM+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8taWIgdm8tYWZ4LWNvcHlcIiBbY2xhc3Mudm8tY29waWVkXT1cImZsYXNoZWQgPT09ICdjb3B5J1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NvcHkgJyArIHYudGl0bGVcIiAoY2xpY2spPVwiY29weSgnY29weScpXCI+PHZvLWljb24gW25hbWVdPVwiZmxhc2hlZCA9PT0gJ2NvcHknID8gJ2NoZWNrJyA6ICdjb3B5J1wiIFtzaXplXT1cImFjdGlvblNpemVcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8taWIgdm8tYWZ4LWRsXCIgW2NsYXNzLnZvLWNvcGllZF09XCJmbGFzaGVkID09PSAnZGwnXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInRG93bmxvYWQgJyArIHYudGl0bGVcIiAoY2xpY2spPVwiZG93bmxvYWQoJ2RsJylcIj48dm8taWNvbiBbbmFtZV09XCJmbGFzaGVkID09PSAnZGwnID8gJ2NoZWNrJyA6ICdjaGV2LWQnXCIgW3NpemVdPVwiYWN0aW9uU2l6ZVwiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1hZngtc3JcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+e3sgc2FpZCB9fTwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vYXJ0aWZhY3QtY2FyZC5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBBcnRpZmFjdENhcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBIb3cgdGhlIGNhcmQgc2hvd3MgdGhlIGZpbGUuICovXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IEFydGlmYWN0VmFyaWFudCA9ICdjb21wYWN0JztcbiAgLyoqIFRoZSB2ZXJzaW9ucywgb2xkZXN0IGZpcnN0LiAqL1xuICBASW5wdXQoKSB2ZXJzaW9uczogQXJ0aWZhY3RWZXJzaW9uW10gPSBbXTtcbiAgLyoqIEluZGV4IG9mIHRoZSB2ZXJzaW9uIHNob3duLiBMZWF2ZSBpdCBvdXQgdG8gbGV0IHRoZSB2ZXJzaW9ucyBtZW51IGNoYW5nZSBpdC4gKi9cbiAgQElucHV0KCkgdmVyc2lvbj86IG51bWJlcjtcbiAgLyoqIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi4gKi9cbiAgQElucHV0KCkgZGVmYXVsdFZlcnNpb24/OiBudW1iZXI7XG4gIC8qKiAnd3JpdGluZycgd2hpbGUgdGhlIGFnZW50IGlzIHN0aWxsIG1ha2luZyB0aGUgZmlsZTsgJ3JlYWR5JyBvbmNlIGl0IGlzIGRvbmUuICovXG4gIEBJbnB1dCgpIHN0YXRlOiBBcnRpZmFjdFN0YXRlID0gJ3JlYWR5JztcbiAgLyoqIFRoZSBsaW5lIHNob3duIHdoaWxlIHdyaXRpbmcsIGxpa2UgXCJSZWFkaW5nIHRoZSBwYWdl4oCmXCIuICovXG4gIEBJbnB1dCgpIHN0YXR1cyA9ICdXcml0aW5n4oCmJztcbiAgLyoqIEhvdyBmYXIgdGhlIHdyaXRpbmcgaGFzIGdvdCwgZnJvbSAwIHRvIDEgKHRoZSBjb21wYWN0IGNhcmQgZHJhd3MgaXQgYWxvbmcgaXRzIGJvdHRvbSBlZGdlKS4gKi9cbiAgQElucHV0KCkgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gIC8qKiBUaGUga2luZCBvZiBmaWxlIG9uIHRoZSBtZXRhIGxpbmUsIGxpa2UgXCJSZXBvcnRcIiBvciBcIlRhYmxlXCIuICovXG4gIEBJbnB1dCgpIGtpbmQgPSAnUmVwb3J0JztcbiAgLyoqIFRoZSBmaWxlJ3MgaWNvbi4gKi9cbiAgQElucHV0KCkgaWNvbjogVm9JY29uTmFtZSA9ICdmaWxlLXRleHQnO1xuICAvKiogVGhlIG5hbWUgRG93bmxvYWQgc2F2ZXMgdW5kZXIsIGJlZm9yZSBcIi12My5tZFwiLiBEZWZhdWx0cyB0byB0aGUgdGl0bGUgaW4gbG93ZXJjYXNlLCB3aXRoIGRhc2hlcy4gKi9cbiAgQElucHV0KCkgZmlsZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBUaGUgZXh0ZW5zaW9uIERvd25sb2FkIHNhdmVzIHdpdGguIFwiY3N2XCIgYWxzbyBzaG93cyB0aGUgY29udGVudCBhcyBhIHRhYmxlIGluIHRoZSByZWFkZXIuICovXG4gIEBJbnB1dCgpIGV4dCA9ICdtZCc7XG4gIC8qKiBUaGUgT3BlbiBidXR0b24ncyB0aXAsIGxpa2UgXCJPcGVuIGJlc2lkZSB0aGUgY2hhdFwiLiBJdHMgbGFiZWwgc3RheXMgXCJPcGVuXCIuICovXG4gIEBJbnB1dCgpIG9wZW5MYWJlbD86IHN0cmluZztcbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG5cbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgc2hvd24gdmVyc2lvbiBjaGFuZ2VzLiAqL1xuICBAT3V0cHV0KCkgdmVyc2lvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSBmaWxlIGlzIG9wZW5lZCwgd2l0aCB0aGUgdmVyc2lvbiBzaG93bi4gV2l0aCBhIGxpc3RlbmVyLCBPcGVuIGRvZXMgbm90IHNob3cgdGhlIGNhcmQncyBvd24gcmVhZGVyLiAqL1xuICBAT3V0cHV0KCkgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIC8qKiBFbWl0dGVkIGFmdGVyIENvcHkgaGFzIHB1dCB0aGUgdmVyc2lvbidzIGNvbnRlbnQgb24gdGhlIGNsaXBib2FyZC4gKi9cbiAgQE91dHB1dCgpIGNvcGllZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAvKiogRW1pdHRlZCBhZnRlciBEb3dubG9hZCBoYXMgc2F2ZWQgdGhlIHZlcnNpb24ncyBjb250ZW50IGFzIGEgZmlsZS4gKi9cbiAgQE91dHB1dCgpIGRvd25sb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBAVmlld0NoaWxkKCdtZW51RWwnKSBwcml2YXRlIG1lbnVFbD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdkZXNrJykgcHJpdmF0ZSBkZXNrPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2ZhbkJ0bicpIHByaXZhdGUgZmFuQnRuPzogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbicpIHByaXZhdGUgcGFuPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2Nsb3NlQnRuJykgcHJpdmF0ZSBjbG9zZUJ0bj86IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW90aW9uID0gaW5qZWN0KFJlZHVjZWRNb3Rpb25TZXJ2aWNlKTtcblxuICAvLyB3aGljaCB2ZXJzaW9uIGlzIHNob3duICh1bmNvbnRyb2xsZWQgdW5sZXNzIGB2ZXJzaW9uYCBpcyBzZXQpXG4gIHByaXZhdGUgY3VySW5kZXggPSAwO1xuICBwcml2YXRlIGNvbnRyb2xsZWQgPSBmYWxzZTtcbiAgZmxhc2hlZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZmxhc2hUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICBzYWlkID0gJyc7XG4gIHByaXZhdGUgc2F5VGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgc2V0dGxlZCA9IGZhbHNlO1xuICBwcml2YXRlIHdhc1dyaXRpbmcgPSBmYWxzZTtcbiAgcmVhZGluZzogUmVhZGluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9wZW5lckVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8vIHZlcnNpb25zIG1lbnVcbiAgbWVudU9wZW4gPSBmYWxzZTtcbiAgbWVudUxlZnQgPSAwO1xuICBtZW51VG9wID0gMDtcbiAgcHJpdmF0ZSBvcGVuZXJUcmlnZ2VyPzogSFRNTEVsZW1lbnQ7XG5cbiAgLy8gc3RhY2tcbiAgZmFubmVkID0gZmFsc2U7XG4gIHBlZWs6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICB0eXBlZFRpdGxlID0gJyc7XG4gIHByaXZhdGUgc3RhY2tUaW1lcnM6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBzdGFja0FuaW1zOiBBbmltYXRpb25bXSA9IFtdO1xuXG4gIHByaXZhdGUgb25Eb2NQb2ludGVyID0gKGU6IFBvaW50ZXJFdmVudCkgPT4ge1xuICAgIGNvbnN0IHQgPSBlLnRhcmdldCBhcyBOb2RlO1xuICAgIGlmICh0aGlzLm1lbnVPcGVuICYmICF0aGlzLm1lbnVFbD8ubmF0aXZlRWxlbWVudC5jb250YWlucyh0KSAmJiAhdGhpcy5vcGVuZXJUcmlnZ2VyPy5jb250YWlucyh0KSkge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZmFubmVkICYmICF0aGlzLmRlc2s/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkgJiYgIXRoaXMuZmFuQnRuPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHQpKSB7XG4gICAgICB0aGlzLmZhbihmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmVyc2lvbiddKSB7XG4gICAgICB0aGlzLmNvbnRyb2xsZWQgPSB0aGlzLnZlcnNpb24gIT09IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0aGlzLnZlcnNpb24gIT09IHVuZGVmaW5lZCkgdGhpcy5jdXJJbmRleCA9IHRoaXMudmVyc2lvbjtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2RlZmF1bHRWZXJzaW9uJ10gJiYgIXRoaXMuY29udHJvbGxlZCAmJiB0aGlzLmRlZmF1bHRWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY3VySW5kZXggPSB0aGlzLmRlZmF1bHRWZXJzaW9uO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlc1sndmVyc2lvbnMnXSAmJiAhdGhpcy5jb250cm9sbGVkICYmIHRoaXMuZGVmYXVsdFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXJJbmRleCA9IE1hdGgubWF4KDAsIHRoaXMudmVyc2lvbnMubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzWydzdGF0ZSddKSB7XG4gICAgICBjb25zdCB3cml0aW5nID0gdGhpcy5zdGF0ZSA9PT0gJ3dyaXRpbmcnO1xuICAgICAgaWYgKHRoaXMud2FzV3JpdGluZyAmJiAhd3JpdGluZykge1xuICAgICAgICB0aGlzLnNldHRsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNheShgJHt0aGlzLnYudGl0bGV9IGlzIHJlYWR5LCB2JHt0aGlzLmkgKyAxfWApO1xuICAgICAgfVxuICAgICAgdGhpcy53YXNXcml0aW5nID0gd3JpdGluZztcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3ZhcmlhbnQnXSB8fCBjaGFuZ2VzWydzdGF0ZSddKSB0aGlzLnJlc3RhcnRTdGFjaygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMud2FzV3JpdGluZyA9IHRoaXMuc3RhdGUgPT09ICd3cml0aW5nJztcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub25Eb2NQb2ludGVyKTtcbiAgICB0aGlzLnJlc3RhcnRTdGFjaygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uRG9jUG9pbnRlcik7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmxhc2hUaW1lcik7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuc2F5VGltZXIpO1xuICAgIHRoaXMuY2xlYXJTdGFjaygpO1xuICB9XG5cbiAgLy8gLS0tLSBkZXJpdmVkIHN0YXRlIC0tLS1cbiAgZ2V0IG4oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMudmVyc2lvbnMubGVuZ3RoOyB9XG4gIGdldCBsYXN0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLm4gLSAxOyB9XG4gIGdldCBpKCk6IG51bWJlciB7IHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmxhc3QsIHRoaXMuY3VySW5kZXgpKTsgfVxuICBnZXQgdigpOiBBcnRpZmFjdFZlcnNpb24geyByZXR1cm4gdGhpcy52ZXJzaW9uc1t0aGlzLmldID8/IHsgdGl0bGU6ICcnLCBtZXRhOiAnJywgY29udGVudDogJycgfTsgfVxuICBnZXQgd3JpdGluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuc3RhdGUgPT09ICd3cml0aW5nJzsgfVxuICBnZXQgc2hvd24oKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZmFubmVkICYmIHRoaXMucGVlayAhPSBudWxsID8gdGhpcy5wZWVrIDogdGhpcy5pOyB9XG4gIGdldCByZXZlcnNlZCgpOiBudW1iZXJbXSB7IHJldHVybiB0aGlzLnZlcnNpb25zLm1hcCgoXywgaykgPT4gaykucmV2ZXJzZSgpOyB9XG4gIGdldCBhY3Rpb25TaXplKCk6ICdzbScgfCAnbWQnIHsgcmV0dXJuIHRoaXMudmFyaWFudCA9PT0gJ2lubGluZScgfHwgdGhpcy52YXJpYW50ID09PSAncHJldmlldycgPyAnc20nIDogJ21kJzsgfVxuICBnZXQgc3VtbWFyeSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy52LnN1bW1hcnkgPz8gZmlyc3RQYXJhKHRoaXMudi5jb250ZW50KTsgfVxuICBnZXQgcHJldmlld1dpZHRocygpOiBudW1iZXJbXSB7IHJldHVybiBXSURUSFNbdGhpcy5pICUgM107IH1cblxuICBjbGFtcCh4PzogbnVtYmVyKTogbnVtYmVyIHsgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHggPz8gMCkpOyB9XG4gIHNob3J0TWV0YShtZXRhOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gYWdvKG1ldGEpOyB9XG4gIHdoZW5IdG1sKG1ldGE6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2hvcnQgPSBhZ28obWV0YSk7XG4gICAgcmV0dXJuIHNob3J0ID09PSBtZXRhID8gbWV0YSA6IGA8c3BhbiBjbGFzcz1cInZvLWFmeC1lZFwiPmVkaXRlZCA8L3NwYW4+JHtzaG9ydH1gO1xuICB9XG4gIHN0YWNrTGluZXMobjogbnVtYmVyKTogTGluZVtdIHsgcmV0dXJuIExJTkVTW24gPT09IHRoaXMubGFzdCA/IDIgOiBuICUgMl07IH1cblxuICBnZXQgY3N2Um93cygpOiBzdHJpbmdbXVtdIHtcbiAgICByZXR1cm4gdGhpcy52LmNvbnRlbnQudHJpbSgpLnNwbGl0KCdcXG4nKS5tYXAoKHIpID0+IHIuc3BsaXQoJywnKSk7XG4gIH1cbiAgZ2V0IGJvZHlCbG9ja3MoKTogQmxvY2tbXSB7XG4gICAgY29uc3Qgb3V0OiBCbG9ja1tdID0gW107XG4gICAgdGhpcy52LmNvbnRlbnQuc3BsaXQoL1xcblxccypcXG4vKS5tYXAoKGIpID0+IGIudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaCgoYikgPT4ge1xuICAgICAgY29uc3QgbGluZXMgPSBiLnNwbGl0KCdcXG4nKTtcbiAgICAgIGlmICgvXiMgLy50ZXN0KGIpKSByZXR1cm47XG4gICAgICBpZiAoL14jezIsfSAvLnRlc3QoYikpIG91dC5wdXNoKHsga2luZDogJ2gzJywgdGV4dDogYi5yZXBsYWNlKC9eIysgLywgJycpIH0pO1xuICAgICAgZWxzZSBpZiAobGluZXMuZXZlcnkoKGwpID0+IC9eWy0qXSAvLnRlc3QobCkpKSBvdXQucHVzaCh7IGtpbmQ6ICd1bCcsIGl0ZW1zOiBsaW5lcy5tYXAoKGwpID0+IGwuc2xpY2UoMikpIH0pO1xuICAgICAgZWxzZSBpZiAobGluZXMuZXZlcnkoKGwpID0+IC9eXFxkK1xcLiAvLnRlc3QobCkpKSBvdXQucHVzaCh7IGtpbmQ6ICdvbCcsIGl0ZW1zOiBsaW5lcy5tYXAoKGwpID0+IGwucmVwbGFjZSgvXlxcZCtcXC4gLywgJycpKSB9KTtcbiAgICAgIGVsc2Ugb3V0LnB1c2goeyBraW5kOiAncCcsIHRleHQ6IGIgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8vIC0tLS0gYW5ub3VuY2VtZW50cyBhbmQgZmVlZGJhY2sgLS0tLVxuICBwcml2YXRlIHNheShtc2c6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2FpZCA9ICcnO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnNheVRpbWVyKTtcbiAgICB0aGlzLnNheVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5zYWlkID0gbXNnKSwgNjApO1xuICB9XG4gIHByaXZhdGUgZmxhc2goa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZsYXNoZWQgPSBrZXk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZmxhc2hUaW1lcik7XG4gICAgdGhpcy5mbGFzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiAodGhpcy5mbGFzaGVkID0gbnVsbCksIDE2MDApO1xuICB9XG5cbiAgLy8gLS0tLSBhY3Rpb25zIC0tLS1cbiAgcHJpdmF0ZSBwaWNrKG5uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAobm4gPT09IHRoaXMuaSkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb250cm9sbGVkKSB0aGlzLmN1ckluZGV4ID0gbm47XG4gICAgdGhpcy52ZXJzaW9uQ2hhbmdlLmVtaXQobm4pO1xuICAgIHRoaXMuc2F5KGBTaG93aW5nIHYke25uICsgMX0sICR7dGhpcy52ZXJzaW9uc1tubl0ubWV0YX1gKTtcbiAgfVxuICBjb3B5KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHsgbmF2aWdhdG9yLmNsaXBib2FyZD8ud3JpdGVUZXh0KHRoaXMudi5jb250ZW50KS5jYXRjaCgoKSA9PiB7fSk7IH0gY2F0Y2ggeyAvKiB0aGUgcGFnZSBtYXkgbm90IHdyaXRlIHRvIHRoZSBjbGlwYm9hcmQgKi8gfVxuICAgIHRoaXMuZmxhc2goa2V5KTtcbiAgICB0aGlzLnNheShgQ29waWVkICR7dGhpcy52LnRpdGxlfSwgdiR7dGhpcy5pICsgMX0sIHRvIHRoZSBjbGlwYm9hcmRgKTtcbiAgICB0aGlzLmNvcGllZC5lbWl0KHRoaXMuaSk7XG4gIH1cbiAgZG93bmxvYWQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gYCR7dGhpcy5maWxlTmFtZSA/PyBzbHVnKHRoaXMudi50aXRsZSl9LXYke3RoaXMuaSArIDF9LiR7dGhpcy5leHR9YDtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aGlzLnYuY29udGVudF0sIHsgdHlwZTogTUlNRVt0aGlzLmV4dF0gPz8gJ3RleHQvcGxhaW4nIH0pKTtcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIGEuaHJlZiA9IHVybDsgYS5kb3dubG9hZCA9IG5hbWU7IGEuaGlkZGVuID0gdHJ1ZTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChhKTsgYS5jbGljaygpOyBhLnJlbW92ZSgpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpLCA1MDAwKTtcbiAgICB0aGlzLmZsYXNoKGtleSk7XG4gICAgdGhpcy5zYXkoYERvd25sb2FkZWQgJHtuYW1lfWApO1xuICAgIHRoaXMuZG93bmxvYWRlZC5lbWl0KHRoaXMuaSk7XG4gIH1cbiAgb3BlbihraW5kT2Y6ICd2aWV3JyB8ICdwYWdlJywgb3BlbmVyOiBIVE1MRWxlbWVudCB8IG51bGwsIHNyYzogSFRNTEVsZW1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3JpdGluZykgcmV0dXJuO1xuICAgIGlmICh0aGlzLm9wZW5lZC5vYnNlcnZlZCkgeyB0aGlzLm9wZW5lZC5lbWl0KHRoaXMuaSk7IHJldHVybjsgfVxuICAgIHRoaXMub3BlbmVyRWwgPSBvcGVuZXI7XG4gICAgdGhpcy5yZWFkaW5nID0geyBraW5kOiBraW5kT2YsIHNyYywgb3BlbmVyIH07XG4gICAgdGhpcy5zYXkoYE9wZW5lZCAke3RoaXMudi50aXRsZX0sIHYke3RoaXMuaSArIDF9YCk7XG4gICAgLy8gbW92ZSBmb2N1cyBpbnRvIHRoZSBkaWFsb2cgb25jZSBpdCByZW5kZXJzXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNsb3NlQnRuPy5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KSk7XG4gIH1cbiAgY2xvc2VSZWFkZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZWFkaW5nID0gbnVsbDtcbiAgICB0aGlzLm9wZW5lckVsPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gIH1cbiAgcmVhZGVyS2V5cyhlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuY2xvc2VSZWFkZXIoKTsgcmV0dXJuOyB9XG4gICAgaWYgKGUua2V5ICE9PSAnVGFiJyB8fCAhdGhpcy5wYW4pIHJldHVybjtcbiAgICBjb25zdCBmID0gWy4uLnRoaXMucGFuLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ2J1dHRvbixbdGFiaW5kZXg9XCIwXCJdJyldO1xuICAgIGNvbnN0IGZpcnN0ID0gZlswXSwgbGFzdEVsID0gZltmLmxlbmd0aCAtIDFdO1xuICAgIGlmIChlLnNoaWZ0S2V5ICYmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBmaXJzdCB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnBhbi5uYXRpdmVFbGVtZW50KSkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGxhc3RFbD8uZm9jdXMoKTsgfVxuICAgIGVsc2UgaWYgKCFlLnNoaWZ0S2V5ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGxhc3RFbCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IGZpcnN0Py5mb2N1cygpOyB9XG4gIH1cblxuICAvLyAtLS0tIHZlcnNpb25zIG1lbnUgLS0tLVxuICB0b2dnbGVNZW51KHRyaWdnZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5tZW51T3BlbiA/IHRoaXMuY2xvc2VNZW51KCkgOiB0aGlzLm9wZW5NZW51KHRyaWdnZXIpO1xuICB9XG4gIHByaXZhdGUgb3Blbk1lbnUodHJpZ2dlcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5lclRyaWdnZXIgPSB0cmlnZ2VyO1xuICAgIHRoaXMubWVudU9wZW4gPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5wbGFjZU1lbnUodHJpZ2dlcik7XG4gICAgICBjb25zdCBtZW51ID0gdGhpcy5tZW51RWw/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBiID0gbWVudT8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1thcmlhLWNoZWNrZWQ9XCJ0cnVlXCJdJykgPz8gbWVudT8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy52by1taScpO1xuICAgICAgYj8uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICAgIH0pO1xuICB9XG4gIGNsb3NlTWVudSgpOiB2b2lkIHsgdGhpcy5tZW51T3BlbiA9IGZhbHNlOyB9XG4gIHByaXZhdGUgcGxhY2VNZW51KHRyaWdnZXI6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3QgbWVudSA9IHRoaXMubWVudUVsPy5uYXRpdmVFbGVtZW50LCBob3N0ID0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFtZW51KSByZXR1cm47XG4gICAgY29uc3QgaHIgPSBob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBiciA9IHRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5tZW51TGVmdCA9IE1hdGgucm91bmQoYnIubGVmdCAtIGhyLmxlZnQgLSA2KTtcbiAgICB0aGlzLm1lbnVUb3AgPSBNYXRoLnJvdW5kKGJyLmJvdHRvbSAtIGhyLnRvcCArIDYpO1xuICB9XG4gIHBpY2tGcm9tTWVudShubjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5waWNrKG5uKTtcbiAgICB0aGlzLmNsb3NlTWVudSgpO1xuICAgIHRoaXMub3BlbmVyVHJpZ2dlcj8uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICB9XG4gIHRyaWdnZXJLZXlzKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZS5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGUua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMub3Blbk1lbnUoZS5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgbWVudUtleXMoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG1lbnUgPSB0aGlzLm1lbnVFbD8ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBpdCA9IFsuLi4obWVudT8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJy52by1taScpID8/IFtdKV07XG4gICAgY29uc3QgayA9IGl0LmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgaWYgKGUua2V5ID09PSAnQXJyb3dEb3duJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGl0WyhrICsgMSkgJSBpdC5sZW5ndGhdPy5mb2N1cygpOyB9XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGl0WyhrIC0gMSArIGl0Lmxlbmd0aCkgJSBpdC5sZW5ndGhdPy5mb2N1cygpOyB9XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdIb21lJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGl0WzBdPy5mb2N1cygpOyB9XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdFbmQnKSB7IGUucHJldmVudERlZmF1bHQoKTsgaXRbaXQubGVuZ3RoIC0gMV0/LmZvY3VzKCk7IH1cbiAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyB0aGlzLmNsb3NlTWVudSgpOyB0aGlzLm9wZW5lclRyaWdnZXI/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfVxuICAgIGVsc2UgaWYgKGUua2V5ID09PSAnVGFiJykgeyB0aGlzLmNsb3NlTWVudSgpOyB9XG4gIH1cblxuICAvLyAtLS0tIHN0YWNrIC0tLS1cbiAgc2V0UGVlayhubjogbnVtYmVyIHwgbnVsbCk6IHZvaWQgeyB0aGlzLnBlZWsgPSBubjsgfVxuICBzaGVldFN0eWxlKG5uOiBudW1iZXIpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+IHtcbiAgICBpZiAodGhpcy5mYW5uZWQpIHtcbiAgICAgIGNvbnN0IG8gPSBubiAtIHRoaXMubGFzdCAvIDI7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoY2FsYygke299ICogdmFyKC0tdm8tZngpKSwke01hdGguYWJzKG8pICogNiArICh0aGlzLnBlZWsgPT09IG5uID8gLTggOiAwKX1weCkgcm90YXRlKCR7byAqIDZ9ZGVnKWAsXG4gICAgICAgICd6LWluZGV4JzogdGhpcy5wZWVrID09PSBubiA/IDkgOiBubiArIDEsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBiZWhpbmQgPSB0aGlzLnZlcnNpb25zLm1hcCgoXywgaykgPT4gaykucmV2ZXJzZSgpLmZpbHRlcigoaykgPT4gayAhPT0gdGhpcy5pKTtcbiAgICBjb25zdCBkID0gbm4gPT09IHRoaXMuaSA/IDAgOiBiZWhpbmQuaW5kZXhPZihubikgKyAxO1xuICAgIHJldHVybiB7ICctLXZvLWQnOiBkLCAnei1pbmRleCc6IHRoaXMubiAtIGQgfTtcbiAgfVxuICBmYW4ob246IGJvb2xlYW4sIGZvY3VzID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53cml0aW5nKSByZXR1cm47XG4gICAgdGhpcy5mYW5uZWQgPSBvbjsgdGhpcy5wZWVrID0gbnVsbDtcbiAgICBpZiAob24gJiYgZm9jdXMpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5kZXNrPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbZGF0YS1pPVwiJHt0aGlzLml9XCJdYCk/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KSk7XG4gICAgfVxuICB9XG4gIHNoZWV0Q2xpY2sobm46IG51bWJlciwgZWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3JpdGluZykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmZhbm5lZCkgeyB0aGlzLnBpY2sobm4pOyB0aGlzLmZhbihmYWxzZSk7IHRoaXMuZmFuQnRuPy5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfVxuICAgIGVsc2UgdGhpcy5vcGVuKCdwYWdlJywgdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy52by1hZngtb3BlbicpLCBlbCk7XG4gIH1cbiAgb3BlblN0YWNrKG9wZW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53cml0aW5nKSByZXR1cm47XG4gICAgaWYgKHRoaXMuZmFubmVkKSB0aGlzLmZhbihmYWxzZSk7XG4gICAgdGhpcy5vcGVuKCdwYWdlJywgb3BlbmVyLCB0aGlzLmRlc2s/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtkYXRhLWk9XCIke3RoaXMuaX1cIl1gKSA/PyBudWxsKTtcbiAgfVxuICBkZXNrS2V5cyhlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZhbm5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHNoZWV0cyA9IFsuLi4odGhpcy5kZXNrPy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcudm8tYWZ4LXNoJykgPz8gW10pXTtcbiAgICBjb25zdCBrID0gc2hlZXRzLmluZGV4T2YoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCk7XG4gICAgbGV0IG5uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0JyB8fCBlLmtleSA9PT0gJ0Fycm93RG93bicpIG5uID0gTWF0aC5taW4odGhpcy5sYXN0LCBrICsgMSk7XG4gICAgZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGUua2V5ID09PSAnQXJyb3dVcCcpIG5uID0gTWF0aC5tYXgoMCwgayAtIDEpO1xuICAgIGVsc2UgaWYgKGUua2V5ID09PSAnSG9tZScpIG5uID0gMDtcbiAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0VuZCcpIG5uID0gdGhpcy5sYXN0O1xuICAgIGVsc2UgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IHRoaXMuZmFuKGZhbHNlKTsgdGhpcy5mYW5CdG4/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pOyByZXR1cm47IH1cbiAgICBlbHNlIGlmIChlLmtleSA9PT0gJ1RhYicpIHsgdGhpcy5mYW4oZmFsc2UpOyByZXR1cm47IH1cbiAgICBpZiAobm4gIT0gbnVsbCkgeyBlLnByZXZlbnREZWZhdWx0KCk7IHNoZWV0c1tubl0/LmZvY3VzKCk7IH1cbiAgfVxuXG4gIC8vIHdyaXRpbmc6IGEgYmxhbmsgc2hlZXQgZHJvcHMgb250byB0aGUgc3RhY2ssIHRoZSB0aXRsZSBpcyB0eXBlZCwgYW5kIGEgcGVuIGRyYXdzIGVhY2ggbGluZSBvZiB0aGUgbmV3IHBhZ2VcbiAgcHJpdmF0ZSByZXN0YXJ0U3RhY2soKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclN0YWNrKCk7XG4gICAgaWYgKHRoaXMudmFyaWFudCAhPT0gJ3N0YWNrJyB8fCAhdGhpcy53cml0aW5nKSByZXR1cm47XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJ1blN0YWNrKCkpO1xuICB9XG4gIHByaXZhdGUgY2xlYXJTdGFjaygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YWNrVGltZXJzLmZvckVhY2goY2xlYXJUaW1lb3V0KTtcbiAgICB0aGlzLnN0YWNrVGltZXJzID0gW107XG4gICAgdGhpcy5zdGFja0FuaW1zLmZvckVhY2goKGEpID0+IGEuY2FuY2VsKCkpO1xuICAgIHRoaXMuc3RhY2tBbmltcyA9IFtdO1xuICAgIHRoaXMudHlwZWRUaXRsZSA9ICcnO1xuICB9XG4gIHByaXZhdGUgcnVuU3RhY2soKTogdm9pZCB7XG4gICAgY29uc3Qgc2ggPSB0aGlzLmRlc2s/Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtkYXRhLWk9XCIke3RoaXMubGFzdH1cIl1gKTtcbiAgICBpZiAoIXNoKSByZXR1cm47XG4gICAgbGV0IGFsaXZlID0gdHJ1ZTtcbiAgICBjb25zdCBvbkRvbmUgPSAoKSA9PiAoYWxpdmUgPSBmYWxzZSk7XG4gICAgdGhpcy5zdGFja1RpbWVycy5wdXNoKHNldFRpbWVvdXQob25Eb25lLCA2MF8wMDApKTtcbiAgICBjb25zdCBzbGVlcCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZTx2b2lkPigocmVzLCByZWopID0+IHRoaXMuc3RhY2tUaW1lcnMucHVzaChzZXRUaW1lb3V0KCgpID0+IChhbGl2ZSA/IHJlcygpIDogcmVqKG5ldyBFcnJvcignc3RvcCcpKSksIG1zKSkpO1xuICAgIGNvbnN0IG1vdGlvbiA9ICF0aGlzLm1vdGlvbi5yZWR1Y2UoKTtcbiAgICBjb25zdCBFID0gZ2V0Q29tcHV0ZWRTdHlsZShzaCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS12by1lYXNlJykudHJpbSgpIHx8ICdlYXNlJztcbiAgICBjb25zdCBUID0gdGhpcy52ZXJzaW9uc1t0aGlzLmxhc3RdPy50aXRsZSA/PyAnJztcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAobW90aW9uKSB0aGlzLnN0YWNrQW5pbXMucHVzaChzaC5hbmltYXRlKFt7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTM2cHgpJywgb3BhY2l0eTogMCB9LCB7IHRyYW5zZm9ybTogJ25vbmUnLCBvcGFjaXR5OiAxIH1dLCB7IGR1cmF0aW9uOiA3MDAsIGVhc2luZzogRSwgY29tcG9zaXRlOiAnYWRkJyB9KSk7XG4gICAgICB0aGlzLnR5cGVkVGl0bGUgPSAnJztcbiAgICAgIGF3YWl0IHNsZWVwKDMwMCk7XG4gICAgICBpZiAoIW1vdGlvbikgdGhpcy50eXBlZFRpdGxlID0gVDtcbiAgICAgIGVsc2UgZm9yIChsZXQgayA9IDE7IGsgPD0gVC5sZW5ndGg7IGsrKykgeyB0aGlzLnR5cGVkVGl0bGUgPSBULnNsaWNlKDAsIGspOyBhd2FpdCBzbGVlcCg0MCk7IH1cbiAgICAgIGF3YWl0IHNsZWVwKG1vdGlvbiA/IDI1MCA6IDApO1xuICAgICAgY29uc3QgcGVuID0gc2gucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy52by1hZngtcGVuJyk7XG4gICAgICBjb25zdCByb3dzID0gWy4uLnNoLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcudm8tYWZ4LXInKV0uZmlsdGVyKCh4KSA9PiB4Lm9mZnNldFBhcmVudCk7XG4gICAgICBmb3IgKGNvbnN0IHggb2Ygcm93cykge1xuICAgICAgICBjb25zdCBsaW5lID0geC5xdWVyeVNlbGVjdG9yKCdpJykhLCBkb3QgPSB4LnF1ZXJ5U2VsZWN0b3IoJ2InKTtcbiAgICAgICAgaWYgKCFtb3Rpb24pIHsgdGhpcy5zdGFja0FuaW1zLnB1c2gobGluZS5hbmltYXRlKFt7IHRyYW5zZm9ybTogJ25vbmUnIH1dLCB7IGZpbGw6ICdmb3J3YXJkcycgfSkpOyBpZiAoZG90KSB0aGlzLnN0YWNrQW5pbXMucHVzaChkb3QuYW5pbWF0ZShbeyB0cmFuc2Zvcm06ICdub25lJyB9XSwgeyBmaWxsOiAnZm9yd2FyZHMnIH0pKTsgYXdhaXQgc2xlZXAoMTUwKTsgY29udGludWU7IH1cbiAgICAgICAgY29uc3QgeDAgPSB4Lm9mZnNldExlZnQgKyBsaW5lLm9mZnNldExlZnQsIHgxID0geDAgKyBsaW5lLm9mZnNldFdpZHRoLCB5ID0geC5vZmZzZXRUb3AgKyB4Lm9mZnNldEhlaWdodCAvIDIgLSAzLjUsIG1zID0gMjYwICsgbGluZS5vZmZzZXRXaWR0aCAqIDEuNDtcbiAgICAgICAgaWYgKGRvdCkgdGhpcy5zdGFja0FuaW1zLnB1c2goZG90LmFuaW1hdGUoW3sgdHJhbnNmb3JtOiAnc2NhbGVYKDApJyB9LCB7IHRyYW5zZm9ybTogJ25vbmUnIH1dLCB7IGR1cmF0aW9uOiAxMjAsIGZpbGw6ICdmb3J3YXJkcycgfSkpO1xuICAgICAgICB0aGlzLnN0YWNrQW5pbXMucHVzaChsaW5lLmFuaW1hdGUoW3sgdHJhbnNmb3JtOiAnc2NhbGVYKDApJyB9LCB7IHRyYW5zZm9ybTogJ3NjYWxlWCgxKScgfV0sIHsgZHVyYXRpb246IG1zLCBlYXNpbmc6ICdjdWJpYy1iZXppZXIoLjQsMCwuMywxKScsIGZpbGw6ICdmb3J3YXJkcycgfSkpO1xuICAgICAgICBpZiAocGVuKSB0aGlzLnN0YWNrQW5pbXMucHVzaChwZW4uYW5pbWF0ZShbeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoJHt4MCAtIDN9cHgsJHt5fXB4KWAsIG9wYWNpdHk6IDEgfSwgeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoJHt4MSAtIDN9cHgsJHt5fXB4KWAsIG9wYWNpdHk6IDEgfV0sIHsgZHVyYXRpb246IG1zLCBlYXNpbmc6ICdjdWJpYy1iZXppZXIoLjQsMCwuMywxKScsIGZpbGw6ICdmb3J3YXJkcycgfSkpO1xuICAgICAgICBhd2FpdCBzbGVlcChtcyArIDcwKTtcbiAgICAgIH1cbiAgICAgIHBlbj8uZ2V0QW5pbWF0aW9ucygpLmZvckVhY2goKGEpID0+IGEuY2FuY2VsKCkpO1xuICAgIH0pKCkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG59XG4iXX0=