@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,1028 @@
1
+ // framework/angular/image-generation/image-generation.component.ts
2
+ //
3
+ // Native Angular port of framework/react/image-generation/ImageGeneration.tsx.
4
+ // A prompt with style chips, a shape and how many pictures, and a model; the
5
+ // pictures it makes, each resolving from grain into dots, then detail under a
6
+ // sweeping scan line, then sharp (Blueprint: square cells and a hard scan, no
7
+ // blur); each can fail with Retry, and a finished one can be upscaled, varied,
8
+ // downloaded, opened larger or used as a reference. Beside it, a gallery of
9
+ // earlier pictures and style presets; narrower, they take the feed's place under
10
+ // a Create / Gallery / Styles switch. `generate` makes the pictures and reports
11
+ // how far each has come. Inputs mirror the React props; React callbacks become
12
+ // @Output() EventEmitters. Uncontrolled inputs keep their own state when the
13
+ // matching Input is left undefined.
14
+ //
15
+ // Icon substitutions (the shared Angular icon set is smaller than the site's):
16
+ // image -> eye, wand -> spark, max -> plus, layers -> redo, down -> chev-d,
17
+ // clip -> copy, up-thumb / down-thumb -> hand.
18
+ import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
19
+ import { VoIconComponent } from '../core/icon.component';
20
+ import { ReducedMotionService } from '../core/reduced-motion.service';
21
+ import * as i0 from "@angular/core";
22
+ const STYLES = ['Editorial', 'Poster', 'Surreal', '35mm'];
23
+ const SHAPES = { '1:1': 1, '3:4': 3 / 4, '16:9': 16 / 9 };
24
+ const STAGES = ['Composing', 'Adding detail', 'Upscaling'];
25
+ const CROPS = ['30% 35%', '70% 40%', '45% 70%', '60% 25%'];
26
+ const shapeName = (r) => ({ 1: '1:1', 0.75: '3:4', 0.8: '4:5', 0.667: '2:3', 1.333: '4:3', 1.5: '3:2', 1.778: '16:9' }[Math.round(r * 1000) / 1000] || '');
27
+ const bg = (im) => [im?.src && `url("${im.src}")`, im?.placeholder].filter(Boolean).join(', ') || undefined;
28
+ const statusOf = (s) => s.error ? 'fail' : s.progress >= 1 && s.image ? 'done' : s.image || s.progress > 0 ? 'gen' : 'wait';
29
+ /** A grain tile, drawn once on a canvas. */
30
+ let grain = '';
31
+ function makeGrain(off) {
32
+ if (off)
33
+ return '';
34
+ if (grain)
35
+ return grain;
36
+ try {
37
+ const n = 96;
38
+ const cv = document.createElement('canvas');
39
+ cv.width = cv.height = n;
40
+ const x = cv.getContext('2d');
41
+ if (!x)
42
+ return '';
43
+ const d = x.createImageData(n, n);
44
+ for (let i = 0; i < d.data.length; i += 4) {
45
+ const c = Math.random() < 0.5 ? 20 : 245;
46
+ d.data[i] = d.data[i + 1] = d.data[i + 2] = c;
47
+ d.data[i + 3] = 40 + Math.random() * 150;
48
+ }
49
+ x.putImageData(d, 0, 0);
50
+ grain = `url("${cv.toDataURL()}")`;
51
+ return grain;
52
+ }
53
+ catch {
54
+ return '';
55
+ }
56
+ }
57
+ export class ImageGenerationComponent {
58
+ constructor() {
59
+ /** The project, shown after "Images" in the header, like "Spring lookbook". */
60
+ this.title = 'Untitled';
61
+ /** The first part of the header. Defaults to "Images". */
62
+ this.section = 'Images';
63
+ /** The style chips under the prompt. */
64
+ this.styles = STYLES;
65
+ /** Earlier pictures, newest first. Pictures made here join them at the top. */
66
+ this.gallery = [];
67
+ /** The Styles tab. Picking one sets the style chips. */
68
+ this.presets = [];
69
+ this.className = '';
70
+ this.defaultPrompt = '';
71
+ this.defaultSelectedStyles = [];
72
+ this.defaultShape = '3:4';
73
+ this.defaultCount = 4;
74
+ this.defaultTab = 'gallery';
75
+ this.promptChange = new EventEmitter();
76
+ this.selectedStylesChange = new EventEmitter();
77
+ this.shapeChange = new EventEmitter();
78
+ this.countChange = new EventEmitter();
79
+ this.modelChange = new EventEmitter();
80
+ this.tabChange = new EventEmitter();
81
+ /** Called for each action on a picture. For 'upscale', return a promise. */
82
+ this.action = new EventEmitter();
83
+ this.motion = inject(ReducedMotionService);
84
+ this.STAGES = STAGES;
85
+ this.shapeOpts = ['1:1', '3:4', '16:9'];
86
+ this.countOpts = [1, 2, 3, 4];
87
+ this.viewOpts = [
88
+ { value: 'create', label: 'Create' },
89
+ { value: 'gallery', label: 'Gallery' },
90
+ { value: 'styles', label: 'Styles' },
91
+ ];
92
+ this.statusOf = statusOf;
93
+ // state
94
+ this.promptState = '';
95
+ this.pickedState = [];
96
+ this.shapeState = '3:4';
97
+ this.countState = 4;
98
+ this.modelState = '';
99
+ this.tabState = 'gallery';
100
+ this.view = 'create';
101
+ this.run = null;
102
+ this.made = [];
103
+ this.fresh = new Set();
104
+ this.refs = [];
105
+ this.rating = {};
106
+ this.upped = {};
107
+ this.lb = null;
108
+ this.said = '';
109
+ this.runRate = 0;
110
+ this.hl = [];
111
+ this.flash = null;
112
+ this.copied = false;
113
+ this.pop = null;
114
+ this.grid = { cols: 1, rows: 1 };
115
+ this.noise = '';
116
+ this.runs = 0;
117
+ this.timers = new Set();
118
+ this.pendingLbFocus = false;
119
+ }
120
+ // controllable inputs (undefined => the component keeps its own state)
121
+ set prompt(v) { if (v !== undefined)
122
+ this.promptState = v; }
123
+ get prompt() { return this.promptState; }
124
+ set selectedStyles(v) { if (v !== undefined)
125
+ this.pickedState = v; }
126
+ set shape(v) { if (v !== undefined)
127
+ this.shapeState = v; }
128
+ get shape() { return this.shapeState; }
129
+ set count(v) { if (v !== undefined)
130
+ this.countState = v; }
131
+ get count() { return this.countState; }
132
+ set model(v) { if (v !== undefined)
133
+ this.modelState = v; }
134
+ get model() { return this.modelState; }
135
+ set tab(v) { if (v !== undefined)
136
+ this.tabState = v; }
137
+ get tab() { return this.tabState; }
138
+ get picked() { return this.pickedState; }
139
+ ngAfterViewInit() {
140
+ this.promptState = this.promptState || this.defaultPrompt;
141
+ if (!this.pickedState.length)
142
+ this.pickedState = [...this.defaultSelectedStyles];
143
+ this.shapeState = this.shapeState ?? this.defaultShape;
144
+ this.countState = this.countState ?? this.defaultCount;
145
+ this.modelState = this.modelState || this.defaultModel || this.models?.[0]?.key || '';
146
+ this.tabState = this.tabState ?? this.defaultTab;
147
+ this.noise = makeGrain(this.motion.reduce());
148
+ }
149
+ ngOnDestroy() {
150
+ this.timers.forEach((t) => clearTimeout(t));
151
+ this.timers.clear();
152
+ this.ro?.disconnect();
153
+ }
154
+ after(ms, fn) {
155
+ const t = setTimeout(() => { this.timers.delete(t); fn(); }, this.motion.reduce() ? Math.min(ms, 30) : ms);
156
+ this.timers.add(t);
157
+ }
158
+ // ----- derived -----
159
+ get busy() {
160
+ return !!this.run && this.run.slots.some((s) => { const st = statusOf(s); return st === 'wait' || st === 'gen'; });
161
+ }
162
+ get all() { return [...this.made, ...this.gallery]; }
163
+ get n() { return this.run?.slots.length ?? 0; }
164
+ get nDone() { return this.run?.slots.filter((s) => statusOf(s) === 'done').length ?? 0; }
165
+ get nBad() { return this.run?.slots.filter((s) => s.error).length ?? 0; }
166
+ get pics() { return this.n === 1 ? 'picture' : `${this.n} pictures`; }
167
+ get capPics() { return this.pics[0].toUpperCase() + this.pics.slice(1); }
168
+ get live() { return this.run ? this.run.slots.filter((s) => !s.error) : []; }
169
+ get total() { return this.live.length ? this.live.reduce((a, s) => a + Math.min(1, s.progress), 0) / this.live.length : 0; }
170
+ get pctTotal() { return Math.round(this.total * 100); }
171
+ get stage() { return !this.busy ? 3 : this.total < 0.3 ? 0 : this.total < 0.8 ? 1 : 2; }
172
+ get secs() { return this.run ? Math.max(1, Math.round(((this.run.done ?? performance.now()) - this.run.t0) / 1000)) : 0; }
173
+ get modelLabel() { return this.models?.find((m) => m.key === this.model)?.label ?? ''; }
174
+ get modelIcon() { return this.models?.find((m) => m.key === this.model)?.icon ?? 'spark'; }
175
+ get runMeta() {
176
+ if (!this.run)
177
+ return '';
178
+ return [this.modelLabel, shapeName(this.run.ratio), this.run.request.styles.join(', ') || 'No style'].filter(Boolean).join(' · ');
179
+ }
180
+ get doneList() {
181
+ if (!this.run)
182
+ return [];
183
+ const r = this.run;
184
+ return r.slots.filter((s) => statusOf(s) === 'done' && s.image).map((s) => ({
185
+ ...s.image, ratio: r.ratio, prompt: s.image.prompt ?? r.request.prompt, styles: s.image.styles ?? r.request.styles,
186
+ }));
187
+ }
188
+ get cols() {
189
+ const cols = [[], []], hgt = [0, 0];
190
+ this.all.forEach((im) => { const k = hgt[0] <= hgt[1] ? 0 : 1; cols[k].push(im); hgt[k] += 1 / (im.ratio ?? 1) + 0.06; });
191
+ return cols;
192
+ }
193
+ get tabOpts() {
194
+ return [{ value: 'gallery', label: 'Gallery' }, ...(this.presets.length ? [{ value: 'styles', label: 'Styles' }] : [])];
195
+ }
196
+ get lbAt() { return this.lb ? this.lb.list.findIndex((x) => x.key === this.lb.key) : -1; }
197
+ get lbImg() { return this.lb ? this.lb.list[this.lbAt] : undefined; }
198
+ imgBg(im) { return bg(im) ?? null; }
199
+ pct(s) { return Math.round((Math.floor(Math.min(1, s.progress) * 30) / 30) * 100); }
200
+ metaOf(im) {
201
+ return [shapeName(im.ratio ?? 1), (im.styles ?? []).join(', ') || 'No style', this.upped[im.key] === 'up' ? 'Upscaled 2×' : ''].filter(Boolean).join(' · ');
202
+ }
203
+ flashed(id, icon) { return this.flash?.id === id ? 'check' : icon; }
204
+ presetOn(p) { return p.styles.length === this.picked.length && p.styles.every((s) => this.picked.includes(s)); }
205
+ doneImg(s) { return s.image ? this.doneList.find((x) => x.key === s.image.key) : undefined; }
206
+ /* the effect, from how far a picture has come. Progress moves in the steps an image model takes (30 of them). */
207
+ look(s) {
208
+ const r = this.run;
209
+ if (!r)
210
+ return {};
211
+ const st = statusOf(s), p = Math.floor(Math.min(1, s.progress) * 30) / 30;
212
+ const v = { '--vo-ar': r.ratio, '--vo-art': s.image?.placeholder ?? 'none' };
213
+ if (st === 'wait')
214
+ Object.assign(v, { '--vo-sc': 0, '--vo-gr': 0.5 });
215
+ if (st === 'gen' || st === 'fail') {
216
+ const a = Math.min(1, p / 0.3), b = Math.max(0, Math.min(1, (p - 0.3) / 0.52)), sc = Math.max(0, Math.min(1, (p - 0.34) / 0.46)), u = Math.max(0, Math.min(1, (p - 0.8) / 0.2));
217
+ Object.assign(v, {
218
+ '--vo-cell': '12px', '--vo-dot': `${a >= 1 ? 12 : 1 + a * 7.5}px`, '--vo-sq': `${a >= 1 ? 12 : 2 + a * 9}px`, '--vo-bl': `${18 - b * 14}px`,
219
+ '--vo-sc': sc, '--vo-lo': sc > 0 && sc < 1 ? 1 : 0, '--vo-sb': `${3 * (1 - u)}px`, '--vo-gr': 0.5 * (1 - p), '--vo-stp': '200ms',
220
+ });
221
+ }
222
+ if (st === 'done')
223
+ Object.assign(v, { '--vo-sc': 1, '--vo-sb': '0px', '--vo-gr': 0, '--vo-lo': 0, '--vo-stp': '450ms' });
224
+ return v;
225
+ }
226
+ // ----- controllable setters -----
227
+ setPrompt(v) { if (this.promptState !== v) {
228
+ this.promptState = v;
229
+ this.promptChange.emit(v);
230
+ } }
231
+ setPicked(v) { this.pickedState = v; this.selectedStylesChange.emit(v); }
232
+ setShape(v) { this.shapeState = v; this.shapeChange.emit(v); }
233
+ setCount(v) { this.countState = v; this.countChange.emit(v); }
234
+ pickModel(key) { this.modelState = key; this.modelChange.emit(key); this.pop = null; }
235
+ showTab(t) { this.tabState = t; this.tabChange.emit(t); }
236
+ showView(v) { this.view = v; if (v !== 'create')
237
+ this.showTab(v); }
238
+ onPrompt(e) { this.setPrompt(e.target.value); }
239
+ onKey(e) {
240
+ if (e.key === 'Enter' && !e.shiftKey && !e.isComposing) {
241
+ e.preventDefault();
242
+ this.doGenerate();
243
+ }
244
+ }
245
+ submit(e) { e.preventDefault(); this.doGenerate(); }
246
+ togglePop(p) { this.pop = this.pop === p ? null : p; }
247
+ // ----- the run -----
248
+ update(id, map) {
249
+ return (slot, u) => {
250
+ const r = this.run;
251
+ if (!r || r.id !== id)
252
+ return;
253
+ const i = map(slot), s = r.slots[i];
254
+ if (!s)
255
+ return;
256
+ if (u.progress != null)
257
+ s.progress = Math.max(0, Math.min(1, u.progress));
258
+ if (u.image)
259
+ s.image = u.image;
260
+ if (u.error)
261
+ s.error = u.error;
262
+ this.afterUpdate();
263
+ };
264
+ }
265
+ afterUpdate() {
266
+ const r = this.run;
267
+ if (!r)
268
+ return;
269
+ // a finished picture joins the gallery, at the top
270
+ const ready = r.slots.filter((s) => statusOf(s) === 'done' && s.image && !this.made.some((m) => m.key === s.image.key))
271
+ .map((s) => ({ ...s.image, ratio: r.ratio, prompt: s.image.prompt ?? r.request.prompt, styles: s.image.styles ?? r.request.styles }));
272
+ if (ready.length) {
273
+ this.made = [...ready, ...this.made];
274
+ this.fresh = new Set(ready.map((x) => x.key));
275
+ this.after(700, () => { this.fresh = new Set(); });
276
+ }
277
+ if (!this.busy && r.slots.length && !r.done)
278
+ r.done = performance.now();
279
+ this.announce();
280
+ }
281
+ announce() {
282
+ if (!this.run)
283
+ return;
284
+ this.said = this.stage < 3 ? `${STAGES[this.stage]}, ${this.pics}`
285
+ : this.nBad ? `${this.nDone} of ${this.n} ready, ${this.nBad} failed. Retry is on the failed one`
286
+ : `${this.n === 1 ? 'Picture' : this.pics} ready`;
287
+ }
288
+ start(request, ratio) {
289
+ this.pop = null;
290
+ this.lb = null;
291
+ const id = ++this.runs;
292
+ this.run = { id, request, ratio, slots: Array.from({ length: request.count }, (_, i) => ({ key: `${id}-${i}`, progress: 0 })), t0: performance.now() };
293
+ this.runRate = 0;
294
+ this.announce();
295
+ this.observeTiles();
296
+ void Promise.resolve(this.generate?.(request, this.update(id, (s) => s))).catch(() => { });
297
+ }
298
+ doGenerate() {
299
+ const text = this.prompt.trim();
300
+ if (!text || this.busy)
301
+ return;
302
+ this.start({ prompt: text, styles: this.picked, shape: this.shape, count: this.count, model: this.model, references: this.refs }, SHAPES[this.shape]);
303
+ }
304
+ retry(i) {
305
+ const r = this.run;
306
+ if (!r)
307
+ return;
308
+ const s = r.slots[i];
309
+ s.progress = 0;
310
+ s.error = undefined;
311
+ this.said = `Making picture ${i + 1} again`;
312
+ void Promise.resolve(this.generate?.({ ...r.request, count: 1, retry: i }, this.update(r.id, () => i))).catch(() => { });
313
+ }
314
+ vary(im) {
315
+ this.said = 'Making a variation';
316
+ this.start({ prompt: im.prompt ?? this.prompt, styles: im.styles ?? this.picked, shape: this.shape, count: 1, model: this.model, references: this.refs, variationOf: im }, im.ratio ?? SHAPES[this.shape]);
317
+ }
318
+ upscale(im) {
319
+ this.upped = { ...this.upped, [im.key]: 'upping' };
320
+ this.said = 'Upscaling';
321
+ this.action.emit({ action: 'upscale', image: im });
322
+ this.after(1700, () => { this.upped = { ...this.upped, [im.key]: 'up' }; this.said = 'Upscaled to twice the size'; });
323
+ }
324
+ note(id, label) {
325
+ this.flash = { id, label };
326
+ this.said = label;
327
+ this.after(1600, () => { if (this.flash?.id === id)
328
+ this.flash = null; });
329
+ }
330
+ download(im, id) {
331
+ if (im.src) {
332
+ const a = document.createElement('a');
333
+ a.href = im.src;
334
+ a.download = '';
335
+ document.body.appendChild(a);
336
+ a.click();
337
+ a.remove();
338
+ }
339
+ this.action.emit({ action: 'download', image: im });
340
+ this.note(id, im.src ? 'Downloading' : 'No file to download');
341
+ }
342
+ reference(im, mine) {
343
+ if (!this.refs.includes(im))
344
+ this.refs = [...this.refs.slice(-2), im];
345
+ this.said = 'Added as a reference';
346
+ this.action.emit({ action: 'reference', image: im });
347
+ if (mine)
348
+ this.after(0, () => this.ta?.nativeElement.focus({ preventScroll: true }));
349
+ }
350
+ useAsRef(im) { this.closeLb(false); this.reference(im, true); }
351
+ removeRef(im) { this.refs = this.refs.filter((x) => x !== im); this.said = 'Reference removed'; this.ta?.nativeElement.focus({ preventScroll: true }); }
352
+ rate(im, v) {
353
+ const on = this.rating[im.key] !== v;
354
+ const x = { ...this.rating };
355
+ if (on)
356
+ x[im.key] = v;
357
+ else
358
+ delete x[im.key];
359
+ this.rating = x;
360
+ this.said = on ? (v === 1 ? 'Marked as good' : 'Marked as bad') : 'Rating removed';
361
+ if (on)
362
+ this.action.emit({ action: v === 1 ? 'like' : 'dislike', image: im });
363
+ }
364
+ rateRun(v) {
365
+ const on = this.runRate !== v;
366
+ this.runRate = on ? v : 0;
367
+ this.said = on ? (v === 1 ? 'Marked as good' : 'Marked as bad') : 'Rating removed';
368
+ }
369
+ copyPrompt() {
370
+ if (!this.run)
371
+ return;
372
+ void navigator.clipboard?.writeText(this.run.request.prompt).catch(() => { });
373
+ this.action.emit({ action: 'copy', image: this.run.slots[0]?.image ?? { key: '', alt: '' } });
374
+ this.copied = true;
375
+ this.said = 'Prompt copied';
376
+ this.after(1600, () => { this.copied = false; });
377
+ }
378
+ toggleStyle(s) { this.setPicked(this.picked.includes(s) ? this.picked.filter((x) => x !== s) : [...this.picked, s]); }
379
+ pickPreset(p) {
380
+ const changed = this.styles.filter((s) => this.picked.includes(s) !== p.styles.includes(s));
381
+ this.setPicked(this.styles.filter((s) => p.styles.includes(s)));
382
+ this.hl = changed;
383
+ this.after(700, () => { this.hl = []; });
384
+ this.said = `${p.label}: ${p.styles.join(' and ')}`;
385
+ if (this.view !== 'create')
386
+ this.showView('create');
387
+ }
388
+ // ----- the larger view -----
389
+ openFromTile(s, e) {
390
+ if (statusOf(s) !== 'done' || !s.image)
391
+ return;
392
+ const im = this.doneList.find((x) => x.key === s.image.key);
393
+ if (!im)
394
+ return;
395
+ this.open(this.doneList, im.key, e.currentTarget, e.isTrusted);
396
+ }
397
+ openGallery(im, e) { this.open(this.all, im.key, e.currentTarget, true); }
398
+ open(list, key, from, mine) {
399
+ this.pop = null;
400
+ this.lb = { list, key, from, mine };
401
+ if (mine) {
402
+ this.pendingLbFocus = true;
403
+ this.after(0, () => this.focusLb());
404
+ }
405
+ }
406
+ focusLb() {
407
+ if (!this.pendingLbFocus)
408
+ return;
409
+ this.pendingLbFocus = false;
410
+ this.lbEl?.nativeElement.querySelector('.vo-igx-lbx')?.focus({ preventScroll: true });
411
+ }
412
+ closeLb(back) {
413
+ const from = this.lb?.from;
414
+ this.lb = null;
415
+ if (back && from?.isConnected)
416
+ from.focus({ preventScroll: true });
417
+ }
418
+ step(d) {
419
+ if (!this.lb)
420
+ return;
421
+ const i = this.lbAt + d;
422
+ if (i >= 0 && i < this.lb.list.length)
423
+ this.lb = { ...this.lb, key: this.lb.list[i].key };
424
+ }
425
+ lbKeys(e) {
426
+ if (!this.lb)
427
+ return;
428
+ if (e.key === 'Escape') {
429
+ e.preventDefault();
430
+ e.stopPropagation();
431
+ this.closeLb(true);
432
+ return;
433
+ }
434
+ if ((e.key === 'ArrowLeft' || e.key === 'ArrowRight') && !e.target.closest('.vo-igx-lbf')) {
435
+ e.preventDefault();
436
+ this.step(e.key === 'ArrowLeft' ? -1 : 1);
437
+ return;
438
+ }
439
+ if (e.key === 'Tab') {
440
+ const f = Array.from(this.lbEl?.nativeElement.querySelectorAll('button:not(:disabled)') ?? []), a = f[0], z = f[f.length - 1];
441
+ if (e.shiftKey && document.activeElement === a) {
442
+ e.preventDefault();
443
+ z?.focus();
444
+ }
445
+ else if (!e.shiftKey && document.activeElement === z) {
446
+ e.preventDefault();
447
+ a?.focus();
448
+ }
449
+ }
450
+ }
451
+ // the pictures share the room, as large as their shape and number allow
452
+ observeTiles() {
453
+ this.ro?.disconnect();
454
+ this.after(0, () => {
455
+ const el = this.tiles?.nativeElement;
456
+ if (!el)
457
+ return;
458
+ const fit = () => {
459
+ const r = this.run;
460
+ if (!r)
461
+ return;
462
+ const W = el.clientWidth, H = el.clientHeight, k = r.slots.length, g = 8;
463
+ let best = { cols: 1, rows: 1, w: -1, gap: k };
464
+ for (let cols = 1; cols <= k; cols++) {
465
+ const rows = Math.ceil(k / cols), w = Math.min((W - (cols - 1) * g) / cols, (H - (rows - 1) * g) / rows * r.ratio), gap = cols * rows - k;
466
+ if (w > best.w + 0.5 || (w > best.w - 0.5 && gap <= best.gap))
467
+ best = { cols, rows, w, gap };
468
+ }
469
+ if (this.grid.cols !== best.cols || this.grid.rows !== best.rows)
470
+ this.grid = { cols: best.cols, rows: best.rows };
471
+ };
472
+ fit();
473
+ this.ro = new ResizeObserver(fit);
474
+ this.ro.observe(el);
475
+ });
476
+ }
477
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ImageGenerationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
478
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ImageGenerationComponent, isStandalone: true, selector: "vo-image-generation", inputs: { title: "title", section: "section", styles: "styles", models: "models", gallery: "gallery", presets: "presets", className: "className", prompt: "prompt", defaultPrompt: "defaultPrompt", selectedStyles: "selectedStyles", defaultSelectedStyles: "defaultSelectedStyles", shape: "shape", defaultShape: "defaultShape", count: "count", defaultCount: "defaultCount", model: "model", defaultModel: "defaultModel", tab: "tab", defaultTab: "defaultTab", generate: "generate" }, outputs: { promptChange: "promptChange", selectedStylesChange: "selectedStylesChange", shapeChange: "shapeChange", countChange: "countChange", modelChange: "modelChange", tabChange: "tabChange", action: "action" }, viewQueries: [{ propertyName: "root", first: true, predicate: ["root"], descendants: true }, { propertyName: "tiles", first: true, predicate: ["tiles"], descendants: true }, { propertyName: "ta", first: true, predicate: ["ta"], descendants: true }, { propertyName: "lbEl", first: true, predicate: ["lbEl"], descendants: true }], ngImport: i0, template: `
479
+ <div
480
+ #root
481
+ data-vo=""
482
+ class="vo-igx"
483
+ [class]="className"
484
+ role="region"
485
+ aria-label="Image generation"
486
+ [style.--vo-noise]="noise || null"
487
+ >
488
+ <div class="vo-igx-in" [attr.data-view]="view">
489
+ <div class="vo-igx-main" role="group" aria-label="Create">
490
+ <div class="vo-igx-h">
491
+ <span class="vo-igx-cr"><span>{{ section }}</span><vo-icon name="chev-r"></vo-icon><b>{{ title }}</b></span>
492
+ <div class="vo-seg2 vo-igx-vw" role="group" aria-label="Show">
493
+ @for (o of viewOpts; track o.value) {
494
+ <button type="button" [attr.aria-pressed]="view === o.value" (click)="showView(o.value)">{{ o.label }}</button>
495
+ }
496
+ </div>
497
+ </div>
498
+ <div class="vo-igx-feed">
499
+ @if (run) {
500
+ <div class="vo-bub vo-igx-ask">{{ run.request.prompt }}</div>
501
+ } @else {
502
+ <div class="vo-igx-empty">
503
+ <div class="vo-igx-ef" aria-hidden="true"><span><vo-icon name="eye"></vo-icon></span><span><vo-icon name="eye"></vo-icon></span><span><vo-icon name="eye"></vo-icon></span></div>
504
+ <span>Describe a picture and press Generate</span>
505
+ </div>
506
+ }
507
+ @if (run) {
508
+ <div class="vo-igx-run">
509
+ <div class="vo-igx-rh">
510
+ <span class="vo-igx-rt">
511
+ @if (busy) {
512
+ <span class="vo-spin" aria-hidden="true"></span><span>Generating {{ pics }}</span>
513
+ } @else if (nBad) {
514
+ <vo-icon name="alert"></vo-icon><span>{{ nDone }} of {{ n }} ready, {{ nBad }} failed</span>
515
+ } @else {
516
+ <vo-icon name="eye"></vo-icon><span>{{ n === 1 ? 'Picture' : capPics }} ready in {{ secs }}s</span>
517
+ }
518
+ </span>
519
+ <span class="vo-igx-steps" aria-hidden="true">
520
+ @for (s of STAGES; track s; let k = $index) {
521
+ <span [class.vo-done]="k < stage" [class.vo-on]="k === stage"><i></i><vo-icon name="check"></vo-icon>{{ s }}</span>
522
+ }
523
+ </span>
524
+ <span class="vo-igx-pc vo-num" aria-hidden="true">{{ busy ? pctTotal + '%' : '' }}</span>
525
+ </div>
526
+ <div
527
+ #tiles
528
+ class="vo-igx-tiles"
529
+ role="group"
530
+ aria-label="Pictures"
531
+ [style.--vo-cols]="grid.cols"
532
+ [style.--vo-rows]="grid.rows"
533
+ >
534
+ @for (s of run.slots; track s.key; let i = $index) {
535
+ <figure
536
+ class="vo-igx-t"
537
+ [class.vo-up]="s.image && upped[s.image.key] === 'upping'"
538
+ [attr.data-st]="statusOf(s)"
539
+ [style]="look(s)"
540
+ >
541
+ <button
542
+ type="button"
543
+ class="vo-igx-o"
544
+ aria-haspopup="dialog"
545
+ [disabled]="statusOf(s) !== 'done'"
546
+ [attr.aria-label]="statusOf(s) === 'done' ? 'Open picture ' + (i + 1) + ': ' + s.image?.alt : 'Picture ' + (i + 1) + ', ' + (statusOf(s) === 'fail' ? 'failed' : 'being made')"
547
+ (click)="openFromTile(s, $event)"
548
+ >
549
+ <span class="vo-igx-ly vo-igx-b" [style.background-image]="imgBg(s.image)"></span>
550
+ <span class="vo-igx-ly vo-igx-s" [style.background-image]="imgBg(s.image)"></span>
551
+ <span class="vo-igx-n"></span>
552
+ <span class="vo-igx-l"><span></span><span></span></span>
553
+ </button>
554
+ @if (s.image && upped[s.image.key] === 'up') {
555
+ <span class="vo-tag vo-igx-tg">2×</span>
556
+ }
557
+ <span class="vo-igx-tp vo-num" aria-hidden="true">{{ pct(s) }}%</span>
558
+ <div class="vo-igx-f">
559
+ <vo-icon name="alert"></vo-icon><b>Couldn't finish</b><span>{{ s.error }}</span>
560
+ <button type="button" class="vo-pill vo-line vo-sm" [attr.aria-label]="'Retry picture ' + (i + 1)" (click)="retry(i)"><vo-icon name="refresh" size="xs"></vo-icon>Retry</button>
561
+ </div>
562
+ @if (doneImg(s); as im) {
563
+ <div class="vo-igx-q">
564
+ <button type="button" class="vo-ib" [attr.aria-label]="'Vary picture ' + (i + 1)" data-tip="Vary" (click)="vary(im)"><vo-icon name="redo"></vo-icon></button>
565
+ <button type="button" class="vo-ib" [attr.aria-label]="'Upscale picture ' + (i + 1)" data-tip="Upscale" (click)="upscale(im)"><vo-icon name="plus"></vo-icon></button>
566
+ <button type="button" class="vo-ib" [attr.aria-label]="'Download picture ' + (i + 1)" [attr.data-tip]="flash?.id === 't' + i ? flash?.label : 'Download'" (click)="download(im, 't' + i)"><vo-icon [name]="flashed('t' + i, 'chev-d')"></vo-icon></button>
567
+ </div>
568
+ }
569
+ </figure>
570
+ }
571
+ </div>
572
+ <div class="vo-igx-acts" role="toolbar" aria-label="Rate and copy">
573
+ <button type="button" class="vo-ib" aria-label="Good pictures" [attr.aria-pressed]="runRate === 1" data-tip="Good pictures" (click)="rateRun(1)"><vo-icon name="hand"></vo-icon></button>
574
+ <button type="button" class="vo-ib" aria-label="Bad pictures" [attr.aria-pressed]="runRate === -1" data-tip="Bad pictures" (click)="rateRun(-1)"><vo-icon name="hand"></vo-icon></button>
575
+ <button type="button" class="vo-ib" aria-label="Copy prompt" [attr.data-tip]="copied ? 'Prompt copied' : 'Copy prompt'" (click)="copyPrompt()"><vo-icon [name]="copied ? 'check' : 'copy'"></vo-icon></button>
576
+ <span class="vo-igx-meta">{{ runMeta }}</span>
577
+ </div>
578
+ </div>
579
+ }
580
+ <p class="vo-igx-sr" aria-live="polite">{{ said }}</p>
581
+ </div>
582
+ <form class="vo-igx-cmp" (submit)="submit($event)">
583
+ @if (refs.length) {
584
+ <div class="vo-igx-refs" role="group" aria-label="References">
585
+ @for (im of refs; track im.key; let i = $index) {
586
+ <span class="vo-igx-ref"><span class="vo-igx-rp"><span class="vo-igx-ly" [style.background-image]="imgBg(im)"></span></span>Reference {{ i + 1 }}
587
+ <button type="button" class="vo-ib" [attr.aria-label]="'Remove reference ' + (i + 1)" data-tip="Remove" (click)="removeRef(im)"><vo-icon name="x" size="xs"></vo-icon></button>
588
+ </span>
589
+ }
590
+ </div>
591
+ }
592
+ <textarea
593
+ #ta
594
+ class="vo-igx-ta"
595
+ rows="2"
596
+ aria-label="Prompt"
597
+ placeholder="Describe the picture you want"
598
+ [value]="prompt"
599
+ (input)="onPrompt($event)"
600
+ (keydown)="onKey($event)"
601
+ ></textarea>
602
+ @if (styles.length) {
603
+ <div class="vo-igx-sty" role="group" aria-label="Styles">
604
+ @for (s of styles; track s) {
605
+ <button type="button" class="vo-igx-sc" [class.vo-hl]="hl.includes(s)" [attr.aria-pressed]="picked.includes(s)" (click)="toggleStyle(s)"><vo-icon name="check"></vo-icon>{{ s }}</button>
606
+ }
607
+ </div>
608
+ }
609
+ <div class="vo-igx-bar">
610
+ <button type="button" class="vo-chip vo-igx-set" aria-haspopup="dialog" [attr.aria-expanded]="pop === 'set'" data-tip="Shape and number" [attr.aria-label]="'Shape ' + shape + ', ' + (count === 1 ? '1 picture' : count + ' pictures')" (click)="togglePop('set')"><vo-icon name="eye"></vo-icon><span>{{ shape }} · {{ count }}</span><vo-icon name="chev-d"></vo-icon></button>
611
+ @if (models?.length) {
612
+ <button type="button" class="vo-chip vo-igx-mdl" aria-haspopup="menu" [attr.aria-expanded]="pop === 'model'" data-tip="Image model" (click)="togglePop('model')"><vo-icon [name]="modelIcon"></vo-icon><span>{{ modelLabel }}</span><vo-icon name="chev-d"></vo-icon></button>
613
+ }
614
+ <span class="vo-sp"></span>
615
+ <button type="submit" class="vo-pill vo-primary vo-igx-go" aria-label="Generate" [attr.data-tip]="busy ? 'Generating' : 'Generate'" data-tip-k="↵" [disabled]="!prompt.trim() || busy"><vo-icon name="spark"></vo-icon><span>Generate</span></button>
616
+ </div>
617
+ @if (pop === 'set') {
618
+ <div class="vo-pop vo-igx-pp-set" role="dialog" aria-label="Shape and number">
619
+ <div class="vo-ph">Shape</div>
620
+ <div class="vo-seg2 vo-igx-ars" role="group" aria-label="Shape">
621
+ @for (v of shapeOpts; track v) {
622
+ <button type="button" [attr.aria-pressed]="shape === v" (click)="setShape(v)">{{ v }}</button>
623
+ }
624
+ </div>
625
+ <div class="vo-ph">Pictures</div>
626
+ <div class="vo-seg2 vo-igx-cts" role="group" aria-label="Pictures">
627
+ @for (v of countOpts; track v) {
628
+ <button type="button" [attr.aria-pressed]="count === v" (click)="setCount(v)">{{ v }}</button>
629
+ }
630
+ </div>
631
+ </div>
632
+ }
633
+ @if (pop === 'model' && models?.length) {
634
+ <div class="vo-pop vo-igx-pp-m" role="menu" aria-label="Image model">
635
+ <div class="vo-ph">Image model</div>
636
+ @for (m of models; track m.key) {
637
+ <button type="button" class="vo-mi" role="menuitemradio" [attr.aria-checked]="m.key === model" (click)="pickModel(m.key)"><vo-icon [name]="m.icon ?? 'spark'"></vo-icon><span>{{ m.label }}@if (m.description) {<span class="vo-d">{{ m.description }}</span>}</span><span class="vo-ck"><vo-icon name="check"></vo-icon></span></button>
638
+ }
639
+ </div>
640
+ }
641
+ </form>
642
+ </div>
643
+ <div class="vo-igx-side" role="group" aria-label="Library">
644
+ <div class="vo-igx-sh">
645
+ <div class="vo-seg2 vo-igx-tb" role="group" aria-label="Show">
646
+ @for (o of tabOpts; track o.value) {
647
+ <button type="button" [attr.aria-pressed]="tab === o.value" (click)="showTab(o.value)">{{ o.label }}</button>
648
+ }
649
+ </div>
650
+ <span class="vo-sp"></span><span class="vo-muted vo-num">{{ all.length }}</span>
651
+ </div>
652
+ <div class="vo-igx-pane" role="group" aria-label="Gallery" [hidden]="tab !== 'gallery'">
653
+ <div class="vo-igx-gal">
654
+ @for (col of cols; track $index) {
655
+ <div class="vo-igx-col">
656
+ @for (im of col; track im.key) {
657
+ <button type="button" class="vo-igx-g" [class.vo-new]="fresh.has(im.key)" aria-haspopup="dialog" [attr.aria-label]="im.alt" [style.--vo-ar]="im.ratio ?? 1" (click)="openGallery(im, $event)">
658
+ <span class="vo-igx-ly" [style.background-image]="imgBg(im)"></span>
659
+ </button>
660
+ }
661
+ </div>
662
+ }
663
+ </div>
664
+ </div>
665
+ <div class="vo-igx-pane" role="group" aria-label="Style presets" [hidden]="tab !== 'styles'">
666
+ <div class="vo-igx-prs">
667
+ @for (p of presets; track p.key) {
668
+ <button type="button" class="vo-igx-pr" [attr.aria-pressed]="presetOn(p)" (click)="pickPreset(p)">
669
+ <span class="vo-igx-prp"><span class="vo-igx-ly" [style.background-image]="imgBg(p.image)"></span></span>
670
+ <span class="vo-igx-prt"><b>{{ p.label }}</b>@if (p.description) {<span class="vo-muted">{{ p.description }}</span>}</span>
671
+ </button>
672
+ }
673
+ </div>
674
+ </div>
675
+ </div>
676
+ @if (lb && lbImg) {
677
+ <div
678
+ #lbEl
679
+ class="vo-igx-lb vo-open"
680
+ role="dialog"
681
+ aria-modal="true"
682
+ [attr.aria-label]="'Picture ' + (lbAt + 1) + ' of ' + lb.list.length"
683
+ (keydown)="lbKeys($event)"
684
+ >
685
+ <div class="vo-igx-lbh">
686
+ <div class="vo-igx-lbt"><b>{{ lbImg.prompt ?? lbImg.alt }}</b><span class="vo-muted">{{ metaOf(lbImg) }}</span></div>
687
+ <span class="vo-muted vo-num">{{ lbAt + 1 }} of {{ lb.list.length }}</span>
688
+ <button type="button" class="vo-ib vo-igx-lbx" aria-label="Close" data-tip="Close" data-tip-k="Esc" (click)="closeLb(true)"><vo-icon name="x"></vo-icon></button>
689
+ </div>
690
+ <div class="vo-igx-lbb">
691
+ <button type="button" class="vo-pill vo-line vo-igx-lbn" aria-label="Previous picture" data-tip="Previous" [disabled]="lbAt <= 0" (click)="step(-1)"><vo-icon name="chev-l"></vo-icon></button>
692
+ <div class="vo-igx-lbs">
693
+ <figure class="vo-igx-t" [class.vo-up]="upped[lbImg.key] === 'upping'" data-st="done" [style.--vo-ar]="lbImg.ratio ?? 1" [style.--vo-art]="lbImg.placeholder ?? 'none'">
694
+ <span class="vo-igx-ly vo-igx-b" [style.background-image]="imgBg(lbImg)"></span>
695
+ <span class="vo-igx-ly vo-igx-s" role="img" [attr.aria-label]="lbImg.alt" [style.background-image]="imgBg(lbImg)"></span>
696
+ <span class="vo-igx-l" aria-hidden="true"><span></span><span></span></span>
697
+ @if (upped[lbImg.key] === 'up') {
698
+ <span class="vo-tag vo-igx-tg">2×</span>
699
+ }
700
+ </figure>
701
+ </div>
702
+ <button type="button" class="vo-pill vo-line vo-igx-lbn" aria-label="Next picture" data-tip="Next" [disabled]="lbAt >= lb.list.length - 1" (click)="step(1)"><vo-icon name="chev-r"></vo-icon></button>
703
+ </div>
704
+ <div class="vo-igx-lbf" role="toolbar" aria-label="Picture actions">
705
+ <button type="button" class="vo-pill vo-line vo-sm" aria-label="Upscale" data-tip="Upscale to twice the size" (click)="upscale(lbImg)"><vo-icon name="plus" size="xs"></vo-icon><span class="vo-igx-lbl">Upscale</span></button>
706
+ <button type="button" class="vo-pill vo-line vo-sm" aria-label="Vary" data-tip="Make a variation" (click)="vary(lbImg)"><vo-icon name="redo" size="xs"></vo-icon><span class="vo-igx-lbl">Vary</span></button>
707
+ <button type="button" class="vo-pill vo-line vo-sm" aria-label="Use as reference" data-tip="Use as reference" (click)="useAsRef(lbImg)"><vo-icon name="copy" size="xs"></vo-icon><span class="vo-igx-lbl">Use as reference</span></button>
708
+ <button type="button" class="vo-pill vo-line vo-sm" aria-label="Download" [attr.data-tip]="flash?.id === 'lb' ? flash?.label : 'Download'" (click)="download(lbImg, 'lb')"><vo-icon [name]="flashed('lb', 'chev-d')" size="xs"></vo-icon><span class="vo-igx-lbl">Download</span></button>
709
+ <span class="vo-igx-sep" aria-hidden="true"></span>
710
+ <button type="button" class="vo-ib" aria-label="Good picture" [attr.aria-pressed]="rating[lbImg.key] === 1" data-tip="Good picture" (click)="rate(lbImg, 1)"><vo-icon name="hand"></vo-icon></button>
711
+ <button type="button" class="vo-ib" aria-label="Bad picture" [attr.aria-pressed]="rating[lbImg.key] === -1" data-tip="Bad picture" (click)="rate(lbImg, -1)"><vo-icon name="hand"></vo-icon></button>
712
+ </div>
713
+ </div>
714
+ }
715
+ </div>
716
+ </div>
717
+ `, isInline: true, styles: [".vo-card.vo-wide .vo-stage-in:has(>.vo-igx){max-width:900px}.vo-igx{width:100%;container:igx/inline-size;text-align:left}.vo-igx-in{position:relative;display:grid;grid-template-columns:minmax(0,1fr) 252px;gap:var(--vo-s-3);height:572px}.vo-igx-main,.vo-igx-side{min-width:0;min-height:0;display:flex;flex-direction:column;background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);overflow:hidden}.vo-igx-h{flex:none;display:flex;align-items:center;gap:var(--vo-s-2);height:44px;padding:0 var(--vo-s-2) 0 var(--vo-s-4);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13px}.vo-igx-cr{flex:1;min-width:0;display:flex;align-items:center;gap:2px;white-space:nowrap;color:var(--vo-muted)}.vo-igx-cr .vo-i{color:var(--vo-faint);flex:none}.vo-igx-cr b{min-width:0;font-weight:500;color:var(--vo-fg);overflow:hidden;text-overflow:ellipsis}.vo-igx-vw{display:none}.vo-igx-feed{flex:1;min-height:0;display:flex;flex-direction:column;gap:var(--vo-s-3);padding:var(--vo-s-4) var(--vo-s-4) var(--vo-s-2)}.vo-igx-ask{flex:none;max-width:88%;font-size:13.5px;line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.vo-igx-ask:empty{display:none}.vo-igx-run{flex:1;min-height:0;display:flex;flex-direction:column;gap:10px}.vo-igx-run[hidden]{display:none}.vo-igx-rh{flex:none;display:flex;align-items:center;gap:var(--vo-s-3);min-height:20px;font-size:13px}.vo-igx-rt{flex:1;min-width:0;display:flex;align-items:center;gap:var(--vo-s-2);white-space:nowrap}.vo-igx-rt>span{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-igx-rt .vo-i{color:var(--vo-fg2)}.vo-igx-rt .vo-spin{width:11px;height:11px;color:var(--vo-fg2)}.vo-igx-steps{flex:none;display:flex;align-items:center;gap:10px;font-size:12px;color:var(--vo-muted);white-space:nowrap}.vo-igx-steps span{display:inline-flex;align-items:center;gap:5px;transition:color var(--vo-t-fast)}.vo-igx-steps i{width:6px;height:6px;border-radius:50%;background:var(--vo-rail);transition:background var(--vo-t-fast)}.vo-igx-steps .vo-on{color:var(--vo-fg)}.vo-igx-steps .vo-on i{background:var(--vo-fg2)}.vo-igx-steps .vo-done{color:var(--vo-fg2)}.vo-igx-steps .vo-done i{display:none}.vo-igx-steps .vo-i{display:none;width:12px;height:12px}.vo-igx-steps .vo-done .vo-i{display:inline-block}.vo-igx-pc{flex:none;min-width:34px;font-size:12px;color:var(--vo-fg2);text-align:right}.vo-igx-tiles{flex:1;min-height:0;display:flex;flex-wrap:wrap;align-content:center;justify-content:center;gap:var(--vo-s-2);container-type:size}.vo-igx-t{position:relative;flex:none;margin:0;width:min(calc((100cqw - (var(--vo-cols,1) - 1) * var(--vo-s-2)) / var(--vo-cols,1)),calc((100cqh - (var(--vo-rows,1) - 1) * var(--vo-s-2)) / var(--vo-rows,1) * var(--vo-ar,1)));aspect-ratio:var(--vo-ar,1);border-radius:var(--vo-r-in);overflow:hidden;isolation:isolate;background:var(--vo-row);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-igx-o{position:absolute;inset:0;width:100%;height:100%;display:block;border-radius:inherit;cursor:zoom-in}.vo-igx-o:disabled{cursor:default}.vo-igx-o:focus-visible{outline-offset:-2px}.vo-igx-ly{position:absolute;inset:0;background-image:var(--vo-art);background-size:cover;background-position:center;pointer-events:none}.vo-igx-b{transform:scale(calc(1.14 * var(--vo-vz,1)));transform-origin:var(--vo-vo,50% 50%);filter:blur(var(--vo-bl,18px)) saturate(1.3);opacity:0;transition:filter var(--vo-stp,.2s) linear,opacity .5s var(--vo-ease)}.vo-igx-t:is([data-st=gen],[data-st=fail]) .vo-igx-b{opacity:1}.vo-igx-t[data-st=gen] .vo-igx-b{-webkit-mask:radial-gradient(circle,#000 var(--vo-dot,1px),transparent calc(var(--vo-dot,1px) + 1px)) 50% 50%/var(--vo-cell,12px) var(--vo-cell,12px);mask:radial-gradient(circle,#000 var(--vo-dot,1px),transparent calc(var(--vo-dot,1px) + 1px)) 50% 50%/var(--vo-cell,12px) var(--vo-cell,12px)}.vo-igx-t[data-st=fail] .vo-igx-b{filter:blur(var(--vo-bl,18px)) grayscale(1);opacity:.55}.vo-igx-s{transform:scale(var(--vo-vz,1));transform-origin:var(--vo-vo,50% 50%);clip-path:inset(0 0 calc(100% - var(--vo-sc,1) * 100%) 0);filter:blur(var(--vo-sb,0px));transition:clip-path var(--vo-stp,.2s) linear,filter var(--vo-stp,.2s) linear,opacity .5s var(--vo-ease)}.vo-igx-t:is([data-st=wait],[data-st=fail]) .vo-igx-s{opacity:0}.vo-igx-n{position:absolute;inset:0;pointer-events:none;background-image:var(--vo-noise,none);background-size:96px 96px;opacity:var(--vo-gr,0);transition:opacity var(--vo-stp,.2s) linear}.vo-igx-t:is([data-st=wait],[data-st=gen]) .vo-igx-n{animation:vo-igxgr .48s steps(1,end) infinite}.vo-igx-t[data-st=wait] .vo-igx-n{opacity:.5}@keyframes vo-igxgr{0%{background-position:0 0}25%{background-position:-31px 17px}50%{background-position:23px -41px}75%{background-position:-13px -29px}}.vo-igx-l{position:absolute;inset:0;pointer-events:none;opacity:0;transform:translateY(calc(var(--vo-sc,0) * 100%));transition:transform var(--vo-stp,.2s) linear,opacity .3s}.vo-igx-l>span{position:absolute;left:0;right:0}.vo-igx-l>span:first-child{top:-1px;height:2px;background:#ffffffeb}.vo-igx-l>span:last-child{bottom:100%;height:32px;background:linear-gradient(#fff0,#ffffff38)}.vo-igx-t[data-st=gen] .vo-igx-l{opacity:var(--vo-lo,0)}.vo-igx-t.vo-up .vo-igx-b{opacity:1;-webkit-mask:none;mask:none;filter:blur(3px);transition:none}.vo-igx-t.vo-up .vo-igx-s{animation:vo-igxrv 1.6s var(--vo-ease-io) both}.vo-igx-t.vo-up .vo-igx-l{animation:vo-igxsc 1.6s var(--vo-ease-io) both}@keyframes vo-igxrv{0%{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0)}}@keyframes vo-igxsc{0%{opacity:1;transform:translateY(0)}88%{opacity:1}to{opacity:0;transform:translateY(100%)}}.vo-igx-tp{position:absolute;left:var(--vo-s-2);bottom:var(--vo-s-2);height:20px;padding:0 7px;display:inline-flex;align-items:center;border-radius:var(--vo-r-tag);background:color-mix(in srgb,var(--vo-surface) 90%,transparent);color:var(--vo-fg);font-size:11.5px;font-weight:500;opacity:0;transition:opacity .3s;pointer-events:none}.vo-igx-t:is([data-st=wait],[data-st=gen]) .vo-igx-tp{opacity:1}.vo-igx-tg{position:absolute;left:6px;top:6px;background:color-mix(in srgb,var(--vo-surface) 90%,transparent);color:var(--vo-fg);pointer-events:none}.vo-igx-tg:empty{display:none}.vo-igx-f{position:absolute;inset:0;display:none;flex-direction:column;align-items:center;justify-content:center;gap:var(--vo-s-1);padding:var(--vo-s-2);text-align:center;background:color-mix(in srgb,var(--vo-surface) 84%,transparent);font-size:12px;line-height:1.35;color:var(--vo-fg2)}.vo-igx-t[data-st=fail] .vo-igx-f{display:flex}.vo-igx-f>.vo-i{color:var(--vo-bad)}.vo-igx-f b{font-size:12.5px;font-weight:500;color:var(--vo-fg)}.vo-igx-f .vo-pill{margin-top:var(--vo-s-1)}.vo-igx-q{position:absolute;right:6px;bottom:6px;display:flex;gap:2px;padding:2px;border-radius:calc(11px * var(--vo-rk));background:color-mix(in srgb,var(--vo-surface) 94%,transparent);box-shadow:var(--vo-shadow);opacity:0;transform:translateY(4px);pointer-events:none;transition:opacity var(--vo-t-fast),transform var(--vo-t-fast) var(--vo-ease)}.vo-igx-q .vo-ib{width:28px;height:28px}@media (hover:hover) and (pointer:fine){.vo-igx-t[data-st=done]:hover .vo-igx-q{opacity:1;transform:none;pointer-events:auto}}.vo-igx-t[data-st=done]:is(:focus-within,.vo-hov) .vo-igx-q{opacity:1;transform:none;pointer-events:auto}.vo-igx-acts{flex:none;display:flex;align-items:center;gap:2px;min-height:30px;margin-left:-6px}.vo-igx-acts .vo-ib[aria-pressed=true],.vo-igx-lb .vo-ib[aria-pressed=true]{background:var(--vo-chip);color:var(--vo-fg)}.vo-igx-sep{flex:none;width:1px;height:16px;margin:0 6px;background:color-mix(in srgb,var(--vo-line) 100%,transparent)}.vo-igx-meta{flex:1;min-width:0;font-size:12px;color:var(--vo-muted);text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-igx-empty{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--vo-s-3);font-size:13px;color:var(--vo-muted);text-align:center}.vo-igx-empty[hidden]{display:none}.vo-igx-ef{display:flex;gap:var(--vo-s-2)}.vo-igx-ef span{width:40px;aspect-ratio:3/4;display:grid;place-items:center;border-radius:var(--vo-r-sm);background:var(--vo-row);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);color:var(--vo-faint)}.vo-igx-ef span:nth-child(2){transform:translateY(-6px)}.vo-igx-cmp{flex:none;margin:0 var(--vo-s-3) var(--vo-s-3);display:flex;flex-direction:column;border-radius:var(--vo-r-box);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line) 50%,transparent);transition:box-shadow var(--vo-t-fast)}.vo-igx-cmp:focus-within{box-shadow:inset 0 0 0 1px var(--vo-field-line-strong)}.vo-igx-refs{display:flex;flex-wrap:wrap;gap:6px;padding:10px var(--vo-s-3) 0}.vo-igx-refs:empty{display:none}.vo-igx-ref{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 var(--vo-s-1) 0 3px;border-radius:var(--vo-r-tag);background:var(--vo-chip);font-size:12px;color:var(--vo-fg2);white-space:nowrap}.vo-igx-ref .vo-igx-rp{position:relative;width:20px;height:20px;border-radius:calc(5px * var(--vo-rk));overflow:hidden;background:var(--vo-row)}.vo-igx-ref .vo-ib{width:20px;height:20px}.vo-igx-ta{display:block;width:100%;height:58px;border:0;outline:0;resize:none;background:none;color:var(--vo-fg);font:inherit;font-size:14px;line-height:1.45;padding:var(--vo-s-3) var(--vo-s-3) 2px}.vo-igx-ta::placeholder{color:var(--vo-muted)}.vo-igx-sty{display:flex;flex-wrap:wrap;gap:6px;padding:6px var(--vo-s-3) 0}.vo-igx-sc{display:inline-flex;align-items:center;gap:0;height:26px;padding:0 10px;border-radius:var(--vo-r-tag);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 100%,transparent);font-size:12.5px;color:var(--vo-fg2);white-space:nowrap;transition:background var(--vo-t-fast),color var(--vo-t-fast),box-shadow var(--vo-t-fast),gap var(--vo-t) var(--vo-ease)}.vo-igx-sc .vo-i{width:0;opacity:0;transition:width var(--vo-t) var(--vo-ease),opacity var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-igx-sc:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-igx-sc[aria-pressed=true]{gap:5px;color:var(--vo-fg);box-shadow:inset 0 0 0 1px var(--vo-faint)}.vo-igx-sc[aria-pressed=true] .vo-i{width:12px;opacity:1}.vo-igx-sc.vo-hl{background:var(--vo-row)}.vo-igx-bar{display:flex;align-items:center;gap:var(--vo-s-1);padding:var(--vo-s-2) var(--vo-s-2) var(--vo-s-2) 6px}.vo-igx-bar .vo-chip{height:32px;padding:0 10px;gap:6px;background:none;min-width:0;font-size:13px;color:var(--vo-fg2)}.vo-igx-bar .vo-chip[aria-expanded=true]{background:var(--vo-row);color:var(--vo-fg)}@media (hover:hover) and (pointer:fine){.vo-igx-bar .vo-chip:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-igx-bar .vo-chip>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-igx-bar .vo-chip>.vo-i:last-child{color:var(--vo-muted)}.vo-igx-bar .vo-sp{flex:1}.vo-igx-go{flex:none}.vo-igx-pp-set{min-width:236px;padding:var(--vo-s-2) 10px 10px}.vo-igx-pp-set .vo-ph{padding:var(--vo-s-1) 0 6px}.vo-igx-pp-set .vo-seg2{display:flex;margin-bottom:var(--vo-s-1)}.vo-igx-pp-set .vo-seg2 button{flex:1}.vo-igx-sh{flex:none;display:flex;align-items:center;gap:var(--vo-s-2);height:44px;padding:0 var(--vo-s-2);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-igx-sh .vo-sp{flex:1}.vo-igx-sh .vo-muted{font-size:12px;padding-right:6px}.vo-igx-pane{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;padding:var(--vo-s-2)}.vo-igx-pane[hidden]{display:none}.vo-igx-pane:focus-visible{outline-offset:-2px}.vo-igx-gal{display:flex;gap:6px;align-items:flex-start}.vo-igx-col{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.vo-igx-g{position:relative;display:block;width:100%;aspect-ratio:var(--vo-ar,1);border-radius:var(--vo-r-sm);overflow:hidden;background:var(--vo-row);cursor:zoom-in;transition:opacity var(--vo-t-fast)}.vo-igx-g .vo-igx-ly{transform:scale(var(--vo-vz,1));transform-origin:var(--vo-vo,50% 50%);transition:transform .5s var(--vo-ease)}@media (hover:hover) and (pointer:fine){.vo-igx-g:hover .vo-igx-ly{transform:scale(calc(var(--vo-vz,1) * 1.04))}}.vo-igx-g:focus-visible{outline-offset:-2px}.vo-igx-g.vo-new{animation:vo-igxnew .7s var(--vo-ease) both}@keyframes vo-igxnew{0%{opacity:0;filter:blur(8px);transform:translateY(-8px)}to{opacity:1;filter:none;transform:none}}:root:not([data-style=soft]) .vo-igx-g.vo-new:not(:where([data-style=soft],[data-style=soft] *)){animation:vo-igxwipe var(--vo-t-slow) var(--vo-ease) both}@keyframes vo-igxwipe{0%{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0)}}.vo-igx-prs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.vo-igx-pr{display:flex;flex-direction:column;gap:6px;padding:4px 4px 8px;border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 100%,transparent);text-align:left;transition:background var(--vo-t-fast),box-shadow var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-igx-pr:hover{background:var(--vo-row)}}.vo-igx-pr[aria-pressed=true]{box-shadow:inset 0 0 0 1px var(--vo-faint)}.vo-igx-prp{position:relative;display:block;aspect-ratio:4/3;border-radius:var(--vo-r-sm);overflow:hidden;background:var(--vo-row)}.vo-igx-prt{display:flex;flex-direction:column;padding:0 4px;font-size:12.5px;line-height:1.35}.vo-igx-prt b{font-weight:500;color:var(--vo-fg)}.vo-igx-prt .vo-muted{font-size:11.5px}.vo-igx-lb{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;border-radius:var(--vo-r-card);background:var(--vo-surface);box-shadow:var(--vo-shadow);overflow:hidden}.vo-igx-lb[hidden]{display:none}.vo-igx-lb.vo-open{animation:vo-igxlb .42s var(--vo-ease) both}@keyframes vo-igxlb{0%{opacity:0}to{opacity:1}}.vo-igx-lb.vo-open .vo-igx-lbs>.vo-igx-t{animation:vo-igxlbp .6s var(--vo-ease) both}@keyframes vo-igxlbp{0%{opacity:0;transform:scale(.94);filter:blur(10px)}to{opacity:1;transform:none;filter:none}}:root:not([data-style=soft]) .vo-igx-lb.vo-open:not(:where([data-style=soft],[data-style=soft] *)){animation:vo-igxwipe var(--vo-t-slow) var(--vo-ease) both}:root:not([data-style=soft]) .vo-igx-lb.vo-open .vo-igx-lbs>.vo-igx-t:not(:where([data-style=soft],[data-style=soft] *)){animation:none}.vo-igx-lbh{flex:none;display:flex;align-items:center;gap:var(--vo-s-2);min-height:48px;padding:6px var(--vo-s-2) 6px var(--vo-s-4);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-igx-lbt{flex:1;min-width:0;display:flex;flex-direction:column;font-size:13px;line-height:1.35}.vo-igx-lbt b{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-igx-lbt .vo-muted{font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-igx-lbb{flex:1;min-height:0;display:flex;align-items:center;gap:var(--vo-s-2);padding:var(--vo-s-3) var(--vo-s-2)}.vo-igx-lbs{flex:1;min-width:0;height:100%;display:flex;align-items:center;justify-content:center;container-type:size}.vo-igx-lbs>.vo-igx-t{width:min(100cqw,100cqh * var(--vo-ar,1));cursor:default}.vo-igx-lbn{flex:none;width:32px;padding:0}@media (hover:hover) and (pointer:fine){.vo-igx-lbn:not(:disabled):hover{background:var(--vo-row)}}.vo-igx-lbf{flex:none;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:var(--vo-s-1);padding:var(--vo-s-2) var(--vo-s-3) var(--vo-s-3)}.vo-igx-lbf .vo-igx-sep{margin:0 var(--vo-s-1)}.vo-igx-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@container igx (max-width:780px){.vo-igx-steps span:not(.vo-on){display:none}}@container igx (max-width:820px){.vo-igx-in{grid-template-columns:minmax(0,1fr) 212px}.vo-igx-f>span{display:none}}@container igx (max-width:620px){.vo-igx-in{grid-template-columns:minmax(0,1fr);height:600px}.vo-igx-main,.vo-igx-side{grid-area:1/1}.vo-igx-side{margin-top:45px;border-radius:0 0 var(--vo-r-card) var(--vo-r-card);box-shadow:none;visibility:hidden}.vo-igx-sh{display:none}.vo-igx-vw{display:inline-flex}.vo-igx-cr{display:none}.vo-igx-h{justify-content:space-between;padding-left:var(--vo-s-2)}.vo-igx-in:is([data-view=gallery],[data-view=styles]) .vo-igx-side{visibility:visible;z-index:2}.vo-igx-in:is([data-view=gallery],[data-view=styles]) :is(.vo-igx-feed,.vo-igx-cmp){visibility:hidden}.vo-igx-steps span:not(.vo-on){display:none}.vo-igx-pane{padding:var(--vo-s-3)}.vo-igx-gal,.vo-igx-col{gap:var(--vo-s-2)}.vo-igx-prs{grid-template-columns:repeat(3,minmax(0,1fr))}}@container igx (max-width:440px){.vo-igx-in{height:640px}.vo-igx-feed{padding:var(--vo-s-3) var(--vo-s-3) var(--vo-s-2)}.vo-igx-ask{display:block;white-space:nowrap;text-overflow:ellipsis}.vo-igx-sty{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;gap:var(--vo-s-1)}.vo-igx-sty::-webkit-scrollbar{display:none}.vo-igx-sc{flex:none;padding:0 var(--vo-s-2)}.vo-igx-f>span{display:none}.vo-igx-cmp{margin:0 var(--vo-s-2) var(--vo-s-2)}.vo-igx-steps{display:none}.vo-igx-go{width:32px;padding:0}.vo-igx-go span,.vo-igx-meta{display:none}.vo-igx-prs{grid-template-columns:repeat(2,minmax(0,1fr))}.vo-igx-lbf .vo-igx-lbl,.vo-igx-lbn{display:none}}@container igx (max-width:340px){.vo-igx-bar .vo-chip>.vo-i:first-child{display:none}.vo-igx-bar .vo-chip{padding:0 var(--vo-s-2)}}:root:not([data-style=soft]) .vo-igx-t[data-st=gen] .vo-igx-b:not(:where([data-style=soft],[data-style=soft] *)){opacity:.55;-webkit-mask:linear-gradient(90deg,#000 var(--vo-sq,2px),transparent 0) 0 0/var(--vo-cell,12px) var(--vo-cell,12px),linear-gradient(#000 var(--vo-sq,2px),transparent 0) 0 0/var(--vo-cell,12px) var(--vo-cell,12px);-webkit-mask-composite:source-in;mask:linear-gradient(90deg,#000 var(--vo-sq,2px),transparent 0) 0 0/var(--vo-cell,12px) var(--vo-cell,12px),linear-gradient(#000 var(--vo-sq,2px),transparent 0) 0 0/var(--vo-cell,12px) var(--vo-cell,12px);mask-composite:intersect}:root:not([data-style=soft]) .vo-igx-t.vo-up .vo-igx-b:not(:where([data-style=soft],[data-style=soft] *)){opacity:.45}:root:not([data-style=soft]) .vo-igx-l>span:first-child:not(:where([data-style=soft],[data-style=soft] *)){height:1px;top:0;background:var(--vo-accent-mark)}:root:not([data-style=soft]) .vo-igx-l>span:last-child:not(:where([data-style=soft],[data-style=soft] *)){display:none}:root:not([data-style=soft]) .vo-igx-t.vo-up .vo-igx-l:not(:where([data-style=soft],[data-style=soft] *)),:root:not([data-style=soft]) .vo-igx-t.vo-up .vo-igx-s:not(:where([data-style=soft],[data-style=soft] *)){animation-timing-function:steps(14,end)}@media (prefers-reduced-motion:reduce){.vo-igx .vo-igx-t :is(.vo-igx-b,.vo-igx-n,.vo-igx-l){display:none}.vo-igx .vo-igx-t .vo-igx-s{clip-path:none;filter:none;animation:none;transition:opacity .4s}.vo-igx .vo-igx-t:is([data-st=wait],[data-st=gen],[data-st=fail]) .vo-igx-s{opacity:0}.vo-igx-g.vo-new,.vo-igx-lb.vo-open,.vo-igx-lb.vo-open .vo-igx-lbs>.vo-igx-t{animation:none}.vo-igx-sc,.vo-igx-sc .vo-i{transition:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
718
+ }
719
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ImageGenerationComponent, decorators: [{
720
+ type: Component,
721
+ args: [{ selector: 'vo-image-generation', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
722
+ <div
723
+ #root
724
+ data-vo=""
725
+ class="vo-igx"
726
+ [class]="className"
727
+ role="region"
728
+ aria-label="Image generation"
729
+ [style.--vo-noise]="noise || null"
730
+ >
731
+ <div class="vo-igx-in" [attr.data-view]="view">
732
+ <div class="vo-igx-main" role="group" aria-label="Create">
733
+ <div class="vo-igx-h">
734
+ <span class="vo-igx-cr"><span>{{ section }}</span><vo-icon name="chev-r"></vo-icon><b>{{ title }}</b></span>
735
+ <div class="vo-seg2 vo-igx-vw" role="group" aria-label="Show">
736
+ @for (o of viewOpts; track o.value) {
737
+ <button type="button" [attr.aria-pressed]="view === o.value" (click)="showView(o.value)">{{ o.label }}</button>
738
+ }
739
+ </div>
740
+ </div>
741
+ <div class="vo-igx-feed">
742
+ @if (run) {
743
+ <div class="vo-bub vo-igx-ask">{{ run.request.prompt }}</div>
744
+ } @else {
745
+ <div class="vo-igx-empty">
746
+ <div class="vo-igx-ef" aria-hidden="true"><span><vo-icon name="eye"></vo-icon></span><span><vo-icon name="eye"></vo-icon></span><span><vo-icon name="eye"></vo-icon></span></div>
747
+ <span>Describe a picture and press Generate</span>
748
+ </div>
749
+ }
750
+ @if (run) {
751
+ <div class="vo-igx-run">
752
+ <div class="vo-igx-rh">
753
+ <span class="vo-igx-rt">
754
+ @if (busy) {
755
+ <span class="vo-spin" aria-hidden="true"></span><span>Generating {{ pics }}</span>
756
+ } @else if (nBad) {
757
+ <vo-icon name="alert"></vo-icon><span>{{ nDone }} of {{ n }} ready, {{ nBad }} failed</span>
758
+ } @else {
759
+ <vo-icon name="eye"></vo-icon><span>{{ n === 1 ? 'Picture' : capPics }} ready in {{ secs }}s</span>
760
+ }
761
+ </span>
762
+ <span class="vo-igx-steps" aria-hidden="true">
763
+ @for (s of STAGES; track s; let k = $index) {
764
+ <span [class.vo-done]="k < stage" [class.vo-on]="k === stage"><i></i><vo-icon name="check"></vo-icon>{{ s }}</span>
765
+ }
766
+ </span>
767
+ <span class="vo-igx-pc vo-num" aria-hidden="true">{{ busy ? pctTotal + '%' : '' }}</span>
768
+ </div>
769
+ <div
770
+ #tiles
771
+ class="vo-igx-tiles"
772
+ role="group"
773
+ aria-label="Pictures"
774
+ [style.--vo-cols]="grid.cols"
775
+ [style.--vo-rows]="grid.rows"
776
+ >
777
+ @for (s of run.slots; track s.key; let i = $index) {
778
+ <figure
779
+ class="vo-igx-t"
780
+ [class.vo-up]="s.image && upped[s.image.key] === 'upping'"
781
+ [attr.data-st]="statusOf(s)"
782
+ [style]="look(s)"
783
+ >
784
+ <button
785
+ type="button"
786
+ class="vo-igx-o"
787
+ aria-haspopup="dialog"
788
+ [disabled]="statusOf(s) !== 'done'"
789
+ [attr.aria-label]="statusOf(s) === 'done' ? 'Open picture ' + (i + 1) + ': ' + s.image?.alt : 'Picture ' + (i + 1) + ', ' + (statusOf(s) === 'fail' ? 'failed' : 'being made')"
790
+ (click)="openFromTile(s, $event)"
791
+ >
792
+ <span class="vo-igx-ly vo-igx-b" [style.background-image]="imgBg(s.image)"></span>
793
+ <span class="vo-igx-ly vo-igx-s" [style.background-image]="imgBg(s.image)"></span>
794
+ <span class="vo-igx-n"></span>
795
+ <span class="vo-igx-l"><span></span><span></span></span>
796
+ </button>
797
+ @if (s.image && upped[s.image.key] === 'up') {
798
+ <span class="vo-tag vo-igx-tg">2×</span>
799
+ }
800
+ <span class="vo-igx-tp vo-num" aria-hidden="true">{{ pct(s) }}%</span>
801
+ <div class="vo-igx-f">
802
+ <vo-icon name="alert"></vo-icon><b>Couldn't finish</b><span>{{ s.error }}</span>
803
+ <button type="button" class="vo-pill vo-line vo-sm" [attr.aria-label]="'Retry picture ' + (i + 1)" (click)="retry(i)"><vo-icon name="refresh" size="xs"></vo-icon>Retry</button>
804
+ </div>
805
+ @if (doneImg(s); as im) {
806
+ <div class="vo-igx-q">
807
+ <button type="button" class="vo-ib" [attr.aria-label]="'Vary picture ' + (i + 1)" data-tip="Vary" (click)="vary(im)"><vo-icon name="redo"></vo-icon></button>
808
+ <button type="button" class="vo-ib" [attr.aria-label]="'Upscale picture ' + (i + 1)" data-tip="Upscale" (click)="upscale(im)"><vo-icon name="plus"></vo-icon></button>
809
+ <button type="button" class="vo-ib" [attr.aria-label]="'Download picture ' + (i + 1)" [attr.data-tip]="flash?.id === 't' + i ? flash?.label : 'Download'" (click)="download(im, 't' + i)"><vo-icon [name]="flashed('t' + i, 'chev-d')"></vo-icon></button>
810
+ </div>
811
+ }
812
+ </figure>
813
+ }
814
+ </div>
815
+ <div class="vo-igx-acts" role="toolbar" aria-label="Rate and copy">
816
+ <button type="button" class="vo-ib" aria-label="Good pictures" [attr.aria-pressed]="runRate === 1" data-tip="Good pictures" (click)="rateRun(1)"><vo-icon name="hand"></vo-icon></button>
817
+ <button type="button" class="vo-ib" aria-label="Bad pictures" [attr.aria-pressed]="runRate === -1" data-tip="Bad pictures" (click)="rateRun(-1)"><vo-icon name="hand"></vo-icon></button>
818
+ <button type="button" class="vo-ib" aria-label="Copy prompt" [attr.data-tip]="copied ? 'Prompt copied' : 'Copy prompt'" (click)="copyPrompt()"><vo-icon [name]="copied ? 'check' : 'copy'"></vo-icon></button>
819
+ <span class="vo-igx-meta">{{ runMeta }}</span>
820
+ </div>
821
+ </div>
822
+ }
823
+ <p class="vo-igx-sr" aria-live="polite">{{ said }}</p>
824
+ </div>
825
+ <form class="vo-igx-cmp" (submit)="submit($event)">
826
+ @if (refs.length) {
827
+ <div class="vo-igx-refs" role="group" aria-label="References">
828
+ @for (im of refs; track im.key; let i = $index) {
829
+ <span class="vo-igx-ref"><span class="vo-igx-rp"><span class="vo-igx-ly" [style.background-image]="imgBg(im)"></span></span>Reference {{ i + 1 }}
830
+ <button type="button" class="vo-ib" [attr.aria-label]="'Remove reference ' + (i + 1)" data-tip="Remove" (click)="removeRef(im)"><vo-icon name="x" size="xs"></vo-icon></button>
831
+ </span>
832
+ }
833
+ </div>
834
+ }
835
+ <textarea
836
+ #ta
837
+ class="vo-igx-ta"
838
+ rows="2"
839
+ aria-label="Prompt"
840
+ placeholder="Describe the picture you want"
841
+ [value]="prompt"
842
+ (input)="onPrompt($event)"
843
+ (keydown)="onKey($event)"
844
+ ></textarea>
845
+ @if (styles.length) {
846
+ <div class="vo-igx-sty" role="group" aria-label="Styles">
847
+ @for (s of styles; track s) {
848
+ <button type="button" class="vo-igx-sc" [class.vo-hl]="hl.includes(s)" [attr.aria-pressed]="picked.includes(s)" (click)="toggleStyle(s)"><vo-icon name="check"></vo-icon>{{ s }}</button>
849
+ }
850
+ </div>
851
+ }
852
+ <div class="vo-igx-bar">
853
+ <button type="button" class="vo-chip vo-igx-set" aria-haspopup="dialog" [attr.aria-expanded]="pop === 'set'" data-tip="Shape and number" [attr.aria-label]="'Shape ' + shape + ', ' + (count === 1 ? '1 picture' : count + ' pictures')" (click)="togglePop('set')"><vo-icon name="eye"></vo-icon><span>{{ shape }} · {{ count }}</span><vo-icon name="chev-d"></vo-icon></button>
854
+ @if (models?.length) {
855
+ <button type="button" class="vo-chip vo-igx-mdl" aria-haspopup="menu" [attr.aria-expanded]="pop === 'model'" data-tip="Image model" (click)="togglePop('model')"><vo-icon [name]="modelIcon"></vo-icon><span>{{ modelLabel }}</span><vo-icon name="chev-d"></vo-icon></button>
856
+ }
857
+ <span class="vo-sp"></span>
858
+ <button type="submit" class="vo-pill vo-primary vo-igx-go" aria-label="Generate" [attr.data-tip]="busy ? 'Generating' : 'Generate'" data-tip-k="↵" [disabled]="!prompt.trim() || busy"><vo-icon name="spark"></vo-icon><span>Generate</span></button>
859
+ </div>
860
+ @if (pop === 'set') {
861
+ <div class="vo-pop vo-igx-pp-set" role="dialog" aria-label="Shape and number">
862
+ <div class="vo-ph">Shape</div>
863
+ <div class="vo-seg2 vo-igx-ars" role="group" aria-label="Shape">
864
+ @for (v of shapeOpts; track v) {
865
+ <button type="button" [attr.aria-pressed]="shape === v" (click)="setShape(v)">{{ v }}</button>
866
+ }
867
+ </div>
868
+ <div class="vo-ph">Pictures</div>
869
+ <div class="vo-seg2 vo-igx-cts" role="group" aria-label="Pictures">
870
+ @for (v of countOpts; track v) {
871
+ <button type="button" [attr.aria-pressed]="count === v" (click)="setCount(v)">{{ v }}</button>
872
+ }
873
+ </div>
874
+ </div>
875
+ }
876
+ @if (pop === 'model' && models?.length) {
877
+ <div class="vo-pop vo-igx-pp-m" role="menu" aria-label="Image model">
878
+ <div class="vo-ph">Image model</div>
879
+ @for (m of models; track m.key) {
880
+ <button type="button" class="vo-mi" role="menuitemradio" [attr.aria-checked]="m.key === model" (click)="pickModel(m.key)"><vo-icon [name]="m.icon ?? 'spark'"></vo-icon><span>{{ m.label }}@if (m.description) {<span class="vo-d">{{ m.description }}</span>}</span><span class="vo-ck"><vo-icon name="check"></vo-icon></span></button>
881
+ }
882
+ </div>
883
+ }
884
+ </form>
885
+ </div>
886
+ <div class="vo-igx-side" role="group" aria-label="Library">
887
+ <div class="vo-igx-sh">
888
+ <div class="vo-seg2 vo-igx-tb" role="group" aria-label="Show">
889
+ @for (o of tabOpts; track o.value) {
890
+ <button type="button" [attr.aria-pressed]="tab === o.value" (click)="showTab(o.value)">{{ o.label }}</button>
891
+ }
892
+ </div>
893
+ <span class="vo-sp"></span><span class="vo-muted vo-num">{{ all.length }}</span>
894
+ </div>
895
+ <div class="vo-igx-pane" role="group" aria-label="Gallery" [hidden]="tab !== 'gallery'">
896
+ <div class="vo-igx-gal">
897
+ @for (col of cols; track $index) {
898
+ <div class="vo-igx-col">
899
+ @for (im of col; track im.key) {
900
+ <button type="button" class="vo-igx-g" [class.vo-new]="fresh.has(im.key)" aria-haspopup="dialog" [attr.aria-label]="im.alt" [style.--vo-ar]="im.ratio ?? 1" (click)="openGallery(im, $event)">
901
+ <span class="vo-igx-ly" [style.background-image]="imgBg(im)"></span>
902
+ </button>
903
+ }
904
+ </div>
905
+ }
906
+ </div>
907
+ </div>
908
+ <div class="vo-igx-pane" role="group" aria-label="Style presets" [hidden]="tab !== 'styles'">
909
+ <div class="vo-igx-prs">
910
+ @for (p of presets; track p.key) {
911
+ <button type="button" class="vo-igx-pr" [attr.aria-pressed]="presetOn(p)" (click)="pickPreset(p)">
912
+ <span class="vo-igx-prp"><span class="vo-igx-ly" [style.background-image]="imgBg(p.image)"></span></span>
913
+ <span class="vo-igx-prt"><b>{{ p.label }}</b>@if (p.description) {<span class="vo-muted">{{ p.description }}</span>}</span>
914
+ </button>
915
+ }
916
+ </div>
917
+ </div>
918
+ </div>
919
+ @if (lb && lbImg) {
920
+ <div
921
+ #lbEl
922
+ class="vo-igx-lb vo-open"
923
+ role="dialog"
924
+ aria-modal="true"
925
+ [attr.aria-label]="'Picture ' + (lbAt + 1) + ' of ' + lb.list.length"
926
+ (keydown)="lbKeys($event)"
927
+ >
928
+ <div class="vo-igx-lbh">
929
+ <div class="vo-igx-lbt"><b>{{ lbImg.prompt ?? lbImg.alt }}</b><span class="vo-muted">{{ metaOf(lbImg) }}</span></div>
930
+ <span class="vo-muted vo-num">{{ lbAt + 1 }} of {{ lb.list.length }}</span>
931
+ <button type="button" class="vo-ib vo-igx-lbx" aria-label="Close" data-tip="Close" data-tip-k="Esc" (click)="closeLb(true)"><vo-icon name="x"></vo-icon></button>
932
+ </div>
933
+ <div class="vo-igx-lbb">
934
+ <button type="button" class="vo-pill vo-line vo-igx-lbn" aria-label="Previous picture" data-tip="Previous" [disabled]="lbAt <= 0" (click)="step(-1)"><vo-icon name="chev-l"></vo-icon></button>
935
+ <div class="vo-igx-lbs">
936
+ <figure class="vo-igx-t" [class.vo-up]="upped[lbImg.key] === 'upping'" data-st="done" [style.--vo-ar]="lbImg.ratio ?? 1" [style.--vo-art]="lbImg.placeholder ?? 'none'">
937
+ <span class="vo-igx-ly vo-igx-b" [style.background-image]="imgBg(lbImg)"></span>
938
+ <span class="vo-igx-ly vo-igx-s" role="img" [attr.aria-label]="lbImg.alt" [style.background-image]="imgBg(lbImg)"></span>
939
+ <span class="vo-igx-l" aria-hidden="true"><span></span><span></span></span>
940
+ @if (upped[lbImg.key] === 'up') {
941
+ <span class="vo-tag vo-igx-tg">2×</span>
942
+ }
943
+ </figure>
944
+ </div>
945
+ <button type="button" class="vo-pill vo-line vo-igx-lbn" aria-label="Next picture" data-tip="Next" [disabled]="lbAt >= lb.list.length - 1" (click)="step(1)"><vo-icon name="chev-r"></vo-icon></button>
946
+ </div>
947
+ <div class="vo-igx-lbf" role="toolbar" aria-label="Picture actions">
948
+ <button type="button" class="vo-pill vo-line vo-sm" aria-label="Upscale" data-tip="Upscale to twice the size" (click)="upscale(lbImg)"><vo-icon name="plus" size="xs"></vo-icon><span class="vo-igx-lbl">Upscale</span></button>
949
+ <button type="button" class="vo-pill vo-line vo-sm" aria-label="Vary" data-tip="Make a variation" (click)="vary(lbImg)"><vo-icon name="redo" size="xs"></vo-icon><span class="vo-igx-lbl">Vary</span></button>
950
+ <button type="button" class="vo-pill vo-line vo-sm" aria-label="Use as reference" data-tip="Use as reference" (click)="useAsRef(lbImg)"><vo-icon name="copy" size="xs"></vo-icon><span class="vo-igx-lbl">Use as reference</span></button>
951
+ <button type="button" class="vo-pill vo-line vo-sm" aria-label="Download" [attr.data-tip]="flash?.id === 'lb' ? flash?.label : 'Download'" (click)="download(lbImg, 'lb')"><vo-icon [name]="flashed('lb', 'chev-d')" size="xs"></vo-icon><span class="vo-igx-lbl">Download</span></button>
952
+ <span class="vo-igx-sep" aria-hidden="true"></span>
953
+ <button type="button" class="vo-ib" aria-label="Good picture" [attr.aria-pressed]="rating[lbImg.key] === 1" data-tip="Good picture" (click)="rate(lbImg, 1)"><vo-icon name="hand"></vo-icon></button>
954
+ <button type="button" class="vo-ib" aria-label="Bad picture" [attr.aria-pressed]="rating[lbImg.key] === -1" data-tip="Bad picture" (click)="rate(lbImg, -1)"><vo-icon name="hand"></vo-icon></button>
955
+ </div>
956
+ </div>
957
+ }
958
+ </div>
959
+ </div>
960
+ `, styles: [".vo-card.vo-wide .vo-stage-in:has(>.vo-igx){max-width:900px}.vo-igx{width:100%;container:igx/inline-size;text-align:left}.vo-igx-in{position:relative;display:grid;grid-template-columns:minmax(0,1fr) 252px;gap:var(--vo-s-3);height:572px}.vo-igx-main,.vo-igx-side{min-width:0;min-height:0;display:flex;flex-direction:column;background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);overflow:hidden}.vo-igx-h{flex:none;display:flex;align-items:center;gap:var(--vo-s-2);height:44px;padding:0 var(--vo-s-2) 0 var(--vo-s-4);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13px}.vo-igx-cr{flex:1;min-width:0;display:flex;align-items:center;gap:2px;white-space:nowrap;color:var(--vo-muted)}.vo-igx-cr .vo-i{color:var(--vo-faint);flex:none}.vo-igx-cr b{min-width:0;font-weight:500;color:var(--vo-fg);overflow:hidden;text-overflow:ellipsis}.vo-igx-vw{display:none}.vo-igx-feed{flex:1;min-height:0;display:flex;flex-direction:column;gap:var(--vo-s-3);padding:var(--vo-s-4) var(--vo-s-4) var(--vo-s-2)}.vo-igx-ask{flex:none;max-width:88%;font-size:13.5px;line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.vo-igx-ask:empty{display:none}.vo-igx-run{flex:1;min-height:0;display:flex;flex-direction:column;gap:10px}.vo-igx-run[hidden]{display:none}.vo-igx-rh{flex:none;display:flex;align-items:center;gap:var(--vo-s-3);min-height:20px;font-size:13px}.vo-igx-rt{flex:1;min-width:0;display:flex;align-items:center;gap:var(--vo-s-2);white-space:nowrap}.vo-igx-rt>span{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-igx-rt .vo-i{color:var(--vo-fg2)}.vo-igx-rt .vo-spin{width:11px;height:11px;color:var(--vo-fg2)}.vo-igx-steps{flex:none;display:flex;align-items:center;gap:10px;font-size:12px;color:var(--vo-muted);white-space:nowrap}.vo-igx-steps span{display:inline-flex;align-items:center;gap:5px;transition:color var(--vo-t-fast)}.vo-igx-steps i{width:6px;height:6px;border-radius:50%;background:var(--vo-rail);transition:background var(--vo-t-fast)}.vo-igx-steps .vo-on{color:var(--vo-fg)}.vo-igx-steps .vo-on i{background:var(--vo-fg2)}.vo-igx-steps .vo-done{color:var(--vo-fg2)}.vo-igx-steps .vo-done i{display:none}.vo-igx-steps .vo-i{display:none;width:12px;height:12px}.vo-igx-steps .vo-done .vo-i{display:inline-block}.vo-igx-pc{flex:none;min-width:34px;font-size:12px;color:var(--vo-fg2);text-align:right}.vo-igx-tiles{flex:1;min-height:0;display:flex;flex-wrap:wrap;align-content:center;justify-content:center;gap:var(--vo-s-2);container-type:size}.vo-igx-t{position:relative;flex:none;margin:0;width:min(calc((100cqw - (var(--vo-cols,1) - 1) * var(--vo-s-2)) / var(--vo-cols,1)),calc((100cqh - (var(--vo-rows,1) - 1) * var(--vo-s-2)) / var(--vo-rows,1) * var(--vo-ar,1)));aspect-ratio:var(--vo-ar,1);border-radius:var(--vo-r-in);overflow:hidden;isolation:isolate;background:var(--vo-row);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-igx-o{position:absolute;inset:0;width:100%;height:100%;display:block;border-radius:inherit;cursor:zoom-in}.vo-igx-o:disabled{cursor:default}.vo-igx-o:focus-visible{outline-offset:-2px}.vo-igx-ly{position:absolute;inset:0;background-image:var(--vo-art);background-size:cover;background-position:center;pointer-events:none}.vo-igx-b{transform:scale(calc(1.14 * var(--vo-vz,1)));transform-origin:var(--vo-vo,50% 50%);filter:blur(var(--vo-bl,18px)) saturate(1.3);opacity:0;transition:filter var(--vo-stp,.2s) linear,opacity .5s var(--vo-ease)}.vo-igx-t:is([data-st=gen],[data-st=fail]) .vo-igx-b{opacity:1}.vo-igx-t[data-st=gen] .vo-igx-b{-webkit-mask:radial-gradient(circle,#000 var(--vo-dot,1px),transparent calc(var(--vo-dot,1px) + 1px)) 50% 50%/var(--vo-cell,12px) var(--vo-cell,12px);mask:radial-gradient(circle,#000 var(--vo-dot,1px),transparent calc(var(--vo-dot,1px) + 1px)) 50% 50%/var(--vo-cell,12px) var(--vo-cell,12px)}.vo-igx-t[data-st=fail] .vo-igx-b{filter:blur(var(--vo-bl,18px)) grayscale(1);opacity:.55}.vo-igx-s{transform:scale(var(--vo-vz,1));transform-origin:var(--vo-vo,50% 50%);clip-path:inset(0 0 calc(100% - var(--vo-sc,1) * 100%) 0);filter:blur(var(--vo-sb,0px));transition:clip-path var(--vo-stp,.2s) linear,filter var(--vo-stp,.2s) linear,opacity .5s var(--vo-ease)}.vo-igx-t:is([data-st=wait],[data-st=fail]) .vo-igx-s{opacity:0}.vo-igx-n{position:absolute;inset:0;pointer-events:none;background-image:var(--vo-noise,none);background-size:96px 96px;opacity:var(--vo-gr,0);transition:opacity var(--vo-stp,.2s) linear}.vo-igx-t:is([data-st=wait],[data-st=gen]) .vo-igx-n{animation:vo-igxgr .48s steps(1,end) infinite}.vo-igx-t[data-st=wait] .vo-igx-n{opacity:.5}@keyframes vo-igxgr{0%{background-position:0 0}25%{background-position:-31px 17px}50%{background-position:23px -41px}75%{background-position:-13px -29px}}.vo-igx-l{position:absolute;inset:0;pointer-events:none;opacity:0;transform:translateY(calc(var(--vo-sc,0) * 100%));transition:transform var(--vo-stp,.2s) linear,opacity .3s}.vo-igx-l>span{position:absolute;left:0;right:0}.vo-igx-l>span:first-child{top:-1px;height:2px;background:#ffffffeb}.vo-igx-l>span:last-child{bottom:100%;height:32px;background:linear-gradient(#fff0,#ffffff38)}.vo-igx-t[data-st=gen] .vo-igx-l{opacity:var(--vo-lo,0)}.vo-igx-t.vo-up .vo-igx-b{opacity:1;-webkit-mask:none;mask:none;filter:blur(3px);transition:none}.vo-igx-t.vo-up .vo-igx-s{animation:vo-igxrv 1.6s var(--vo-ease-io) both}.vo-igx-t.vo-up .vo-igx-l{animation:vo-igxsc 1.6s var(--vo-ease-io) both}@keyframes vo-igxrv{0%{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0)}}@keyframes vo-igxsc{0%{opacity:1;transform:translateY(0)}88%{opacity:1}to{opacity:0;transform:translateY(100%)}}.vo-igx-tp{position:absolute;left:var(--vo-s-2);bottom:var(--vo-s-2);height:20px;padding:0 7px;display:inline-flex;align-items:center;border-radius:var(--vo-r-tag);background:color-mix(in srgb,var(--vo-surface) 90%,transparent);color:var(--vo-fg);font-size:11.5px;font-weight:500;opacity:0;transition:opacity .3s;pointer-events:none}.vo-igx-t:is([data-st=wait],[data-st=gen]) .vo-igx-tp{opacity:1}.vo-igx-tg{position:absolute;left:6px;top:6px;background:color-mix(in srgb,var(--vo-surface) 90%,transparent);color:var(--vo-fg);pointer-events:none}.vo-igx-tg:empty{display:none}.vo-igx-f{position:absolute;inset:0;display:none;flex-direction:column;align-items:center;justify-content:center;gap:var(--vo-s-1);padding:var(--vo-s-2);text-align:center;background:color-mix(in srgb,var(--vo-surface) 84%,transparent);font-size:12px;line-height:1.35;color:var(--vo-fg2)}.vo-igx-t[data-st=fail] .vo-igx-f{display:flex}.vo-igx-f>.vo-i{color:var(--vo-bad)}.vo-igx-f b{font-size:12.5px;font-weight:500;color:var(--vo-fg)}.vo-igx-f .vo-pill{margin-top:var(--vo-s-1)}.vo-igx-q{position:absolute;right:6px;bottom:6px;display:flex;gap:2px;padding:2px;border-radius:calc(11px * var(--vo-rk));background:color-mix(in srgb,var(--vo-surface) 94%,transparent);box-shadow:var(--vo-shadow);opacity:0;transform:translateY(4px);pointer-events:none;transition:opacity var(--vo-t-fast),transform var(--vo-t-fast) var(--vo-ease)}.vo-igx-q .vo-ib{width:28px;height:28px}@media (hover:hover) and (pointer:fine){.vo-igx-t[data-st=done]:hover .vo-igx-q{opacity:1;transform:none;pointer-events:auto}}.vo-igx-t[data-st=done]:is(:focus-within,.vo-hov) .vo-igx-q{opacity:1;transform:none;pointer-events:auto}.vo-igx-acts{flex:none;display:flex;align-items:center;gap:2px;min-height:30px;margin-left:-6px}.vo-igx-acts .vo-ib[aria-pressed=true],.vo-igx-lb .vo-ib[aria-pressed=true]{background:var(--vo-chip);color:var(--vo-fg)}.vo-igx-sep{flex:none;width:1px;height:16px;margin:0 6px;background:color-mix(in srgb,var(--vo-line) 100%,transparent)}.vo-igx-meta{flex:1;min-width:0;font-size:12px;color:var(--vo-muted);text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-igx-empty{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--vo-s-3);font-size:13px;color:var(--vo-muted);text-align:center}.vo-igx-empty[hidden]{display:none}.vo-igx-ef{display:flex;gap:var(--vo-s-2)}.vo-igx-ef span{width:40px;aspect-ratio:3/4;display:grid;place-items:center;border-radius:var(--vo-r-sm);background:var(--vo-row);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);color:var(--vo-faint)}.vo-igx-ef span:nth-child(2){transform:translateY(-6px)}.vo-igx-cmp{flex:none;margin:0 var(--vo-s-3) var(--vo-s-3);display:flex;flex-direction:column;border-radius:var(--vo-r-box);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line) 50%,transparent);transition:box-shadow var(--vo-t-fast)}.vo-igx-cmp:focus-within{box-shadow:inset 0 0 0 1px var(--vo-field-line-strong)}.vo-igx-refs{display:flex;flex-wrap:wrap;gap:6px;padding:10px var(--vo-s-3) 0}.vo-igx-refs:empty{display:none}.vo-igx-ref{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 var(--vo-s-1) 0 3px;border-radius:var(--vo-r-tag);background:var(--vo-chip);font-size:12px;color:var(--vo-fg2);white-space:nowrap}.vo-igx-ref .vo-igx-rp{position:relative;width:20px;height:20px;border-radius:calc(5px * var(--vo-rk));overflow:hidden;background:var(--vo-row)}.vo-igx-ref .vo-ib{width:20px;height:20px}.vo-igx-ta{display:block;width:100%;height:58px;border:0;outline:0;resize:none;background:none;color:var(--vo-fg);font:inherit;font-size:14px;line-height:1.45;padding:var(--vo-s-3) var(--vo-s-3) 2px}.vo-igx-ta::placeholder{color:var(--vo-muted)}.vo-igx-sty{display:flex;flex-wrap:wrap;gap:6px;padding:6px var(--vo-s-3) 0}.vo-igx-sc{display:inline-flex;align-items:center;gap:0;height:26px;padding:0 10px;border-radius:var(--vo-r-tag);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 100%,transparent);font-size:12.5px;color:var(--vo-fg2);white-space:nowrap;transition:background var(--vo-t-fast),color var(--vo-t-fast),box-shadow var(--vo-t-fast),gap var(--vo-t) var(--vo-ease)}.vo-igx-sc .vo-i{width:0;opacity:0;transition:width var(--vo-t) var(--vo-ease),opacity var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-igx-sc:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-igx-sc[aria-pressed=true]{gap:5px;color:var(--vo-fg);box-shadow:inset 0 0 0 1px var(--vo-faint)}.vo-igx-sc[aria-pressed=true] .vo-i{width:12px;opacity:1}.vo-igx-sc.vo-hl{background:var(--vo-row)}.vo-igx-bar{display:flex;align-items:center;gap:var(--vo-s-1);padding:var(--vo-s-2) var(--vo-s-2) var(--vo-s-2) 6px}.vo-igx-bar .vo-chip{height:32px;padding:0 10px;gap:6px;background:none;min-width:0;font-size:13px;color:var(--vo-fg2)}.vo-igx-bar .vo-chip[aria-expanded=true]{background:var(--vo-row);color:var(--vo-fg)}@media (hover:hover) and (pointer:fine){.vo-igx-bar .vo-chip:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-igx-bar .vo-chip>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-igx-bar .vo-chip>.vo-i:last-child{color:var(--vo-muted)}.vo-igx-bar .vo-sp{flex:1}.vo-igx-go{flex:none}.vo-igx-pp-set{min-width:236px;padding:var(--vo-s-2) 10px 10px}.vo-igx-pp-set .vo-ph{padding:var(--vo-s-1) 0 6px}.vo-igx-pp-set .vo-seg2{display:flex;margin-bottom:var(--vo-s-1)}.vo-igx-pp-set .vo-seg2 button{flex:1}.vo-igx-sh{flex:none;display:flex;align-items:center;gap:var(--vo-s-2);height:44px;padding:0 var(--vo-s-2);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-igx-sh .vo-sp{flex:1}.vo-igx-sh .vo-muted{font-size:12px;padding-right:6px}.vo-igx-pane{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;padding:var(--vo-s-2)}.vo-igx-pane[hidden]{display:none}.vo-igx-pane:focus-visible{outline-offset:-2px}.vo-igx-gal{display:flex;gap:6px;align-items:flex-start}.vo-igx-col{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.vo-igx-g{position:relative;display:block;width:100%;aspect-ratio:var(--vo-ar,1);border-radius:var(--vo-r-sm);overflow:hidden;background:var(--vo-row);cursor:zoom-in;transition:opacity var(--vo-t-fast)}.vo-igx-g .vo-igx-ly{transform:scale(var(--vo-vz,1));transform-origin:var(--vo-vo,50% 50%);transition:transform .5s var(--vo-ease)}@media (hover:hover) and (pointer:fine){.vo-igx-g:hover .vo-igx-ly{transform:scale(calc(var(--vo-vz,1) * 1.04))}}.vo-igx-g:focus-visible{outline-offset:-2px}.vo-igx-g.vo-new{animation:vo-igxnew .7s var(--vo-ease) both}@keyframes vo-igxnew{0%{opacity:0;filter:blur(8px);transform:translateY(-8px)}to{opacity:1;filter:none;transform:none}}:root:not([data-style=soft]) .vo-igx-g.vo-new:not(:where([data-style=soft],[data-style=soft] *)){animation:vo-igxwipe var(--vo-t-slow) var(--vo-ease) both}@keyframes vo-igxwipe{0%{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0)}}.vo-igx-prs{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}.vo-igx-pr{display:flex;flex-direction:column;gap:6px;padding:4px 4px 8px;border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 100%,transparent);text-align:left;transition:background var(--vo-t-fast),box-shadow var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-igx-pr:hover{background:var(--vo-row)}}.vo-igx-pr[aria-pressed=true]{box-shadow:inset 0 0 0 1px var(--vo-faint)}.vo-igx-prp{position:relative;display:block;aspect-ratio:4/3;border-radius:var(--vo-r-sm);overflow:hidden;background:var(--vo-row)}.vo-igx-prt{display:flex;flex-direction:column;padding:0 4px;font-size:12.5px;line-height:1.35}.vo-igx-prt b{font-weight:500;color:var(--vo-fg)}.vo-igx-prt .vo-muted{font-size:11.5px}.vo-igx-lb{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;border-radius:var(--vo-r-card);background:var(--vo-surface);box-shadow:var(--vo-shadow);overflow:hidden}.vo-igx-lb[hidden]{display:none}.vo-igx-lb.vo-open{animation:vo-igxlb .42s var(--vo-ease) both}@keyframes vo-igxlb{0%{opacity:0}to{opacity:1}}.vo-igx-lb.vo-open .vo-igx-lbs>.vo-igx-t{animation:vo-igxlbp .6s var(--vo-ease) both}@keyframes vo-igxlbp{0%{opacity:0;transform:scale(.94);filter:blur(10px)}to{opacity:1;transform:none;filter:none}}:root:not([data-style=soft]) .vo-igx-lb.vo-open:not(:where([data-style=soft],[data-style=soft] *)){animation:vo-igxwipe var(--vo-t-slow) var(--vo-ease) both}:root:not([data-style=soft]) .vo-igx-lb.vo-open .vo-igx-lbs>.vo-igx-t:not(:where([data-style=soft],[data-style=soft] *)){animation:none}.vo-igx-lbh{flex:none;display:flex;align-items:center;gap:var(--vo-s-2);min-height:48px;padding:6px var(--vo-s-2) 6px var(--vo-s-4);border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-igx-lbt{flex:1;min-width:0;display:flex;flex-direction:column;font-size:13px;line-height:1.35}.vo-igx-lbt b{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-igx-lbt .vo-muted{font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-igx-lbb{flex:1;min-height:0;display:flex;align-items:center;gap:var(--vo-s-2);padding:var(--vo-s-3) var(--vo-s-2)}.vo-igx-lbs{flex:1;min-width:0;height:100%;display:flex;align-items:center;justify-content:center;container-type:size}.vo-igx-lbs>.vo-igx-t{width:min(100cqw,100cqh * var(--vo-ar,1));cursor:default}.vo-igx-lbn{flex:none;width:32px;padding:0}@media (hover:hover) and (pointer:fine){.vo-igx-lbn:not(:disabled):hover{background:var(--vo-row)}}.vo-igx-lbf{flex:none;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:var(--vo-s-1);padding:var(--vo-s-2) var(--vo-s-3) var(--vo-s-3)}.vo-igx-lbf .vo-igx-sep{margin:0 var(--vo-s-1)}.vo-igx-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}@container igx (max-width:780px){.vo-igx-steps span:not(.vo-on){display:none}}@container igx (max-width:820px){.vo-igx-in{grid-template-columns:minmax(0,1fr) 212px}.vo-igx-f>span{display:none}}@container igx (max-width:620px){.vo-igx-in{grid-template-columns:minmax(0,1fr);height:600px}.vo-igx-main,.vo-igx-side{grid-area:1/1}.vo-igx-side{margin-top:45px;border-radius:0 0 var(--vo-r-card) var(--vo-r-card);box-shadow:none;visibility:hidden}.vo-igx-sh{display:none}.vo-igx-vw{display:inline-flex}.vo-igx-cr{display:none}.vo-igx-h{justify-content:space-between;padding-left:var(--vo-s-2)}.vo-igx-in:is([data-view=gallery],[data-view=styles]) .vo-igx-side{visibility:visible;z-index:2}.vo-igx-in:is([data-view=gallery],[data-view=styles]) :is(.vo-igx-feed,.vo-igx-cmp){visibility:hidden}.vo-igx-steps span:not(.vo-on){display:none}.vo-igx-pane{padding:var(--vo-s-3)}.vo-igx-gal,.vo-igx-col{gap:var(--vo-s-2)}.vo-igx-prs{grid-template-columns:repeat(3,minmax(0,1fr))}}@container igx (max-width:440px){.vo-igx-in{height:640px}.vo-igx-feed{padding:var(--vo-s-3) var(--vo-s-3) var(--vo-s-2)}.vo-igx-ask{display:block;white-space:nowrap;text-overflow:ellipsis}.vo-igx-sty{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;gap:var(--vo-s-1)}.vo-igx-sty::-webkit-scrollbar{display:none}.vo-igx-sc{flex:none;padding:0 var(--vo-s-2)}.vo-igx-f>span{display:none}.vo-igx-cmp{margin:0 var(--vo-s-2) var(--vo-s-2)}.vo-igx-steps{display:none}.vo-igx-go{width:32px;padding:0}.vo-igx-go span,.vo-igx-meta{display:none}.vo-igx-prs{grid-template-columns:repeat(2,minmax(0,1fr))}.vo-igx-lbf .vo-igx-lbl,.vo-igx-lbn{display:none}}@container igx (max-width:340px){.vo-igx-bar .vo-chip>.vo-i:first-child{display:none}.vo-igx-bar .vo-chip{padding:0 var(--vo-s-2)}}:root:not([data-style=soft]) .vo-igx-t[data-st=gen] .vo-igx-b:not(:where([data-style=soft],[data-style=soft] *)){opacity:.55;-webkit-mask:linear-gradient(90deg,#000 var(--vo-sq,2px),transparent 0) 0 0/var(--vo-cell,12px) var(--vo-cell,12px),linear-gradient(#000 var(--vo-sq,2px),transparent 0) 0 0/var(--vo-cell,12px) var(--vo-cell,12px);-webkit-mask-composite:source-in;mask:linear-gradient(90deg,#000 var(--vo-sq,2px),transparent 0) 0 0/var(--vo-cell,12px) var(--vo-cell,12px),linear-gradient(#000 var(--vo-sq,2px),transparent 0) 0 0/var(--vo-cell,12px) var(--vo-cell,12px);mask-composite:intersect}:root:not([data-style=soft]) .vo-igx-t.vo-up .vo-igx-b:not(:where([data-style=soft],[data-style=soft] *)){opacity:.45}:root:not([data-style=soft]) .vo-igx-l>span:first-child:not(:where([data-style=soft],[data-style=soft] *)){height:1px;top:0;background:var(--vo-accent-mark)}:root:not([data-style=soft]) .vo-igx-l>span:last-child:not(:where([data-style=soft],[data-style=soft] *)){display:none}:root:not([data-style=soft]) .vo-igx-t.vo-up .vo-igx-l:not(:where([data-style=soft],[data-style=soft] *)),:root:not([data-style=soft]) .vo-igx-t.vo-up .vo-igx-s:not(:where([data-style=soft],[data-style=soft] *)){animation-timing-function:steps(14,end)}@media (prefers-reduced-motion:reduce){.vo-igx .vo-igx-t :is(.vo-igx-b,.vo-igx-n,.vo-igx-l){display:none}.vo-igx .vo-igx-t .vo-igx-s{clip-path:none;filter:none;animation:none;transition:opacity .4s}.vo-igx .vo-igx-t:is([data-st=wait],[data-st=gen],[data-st=fail]) .vo-igx-s{opacity:0}.vo-igx-g.vo-new,.vo-igx-lb.vo-open,.vo-igx-lb.vo-open .vo-igx-lbs>.vo-igx-t{animation:none}.vo-igx-sc,.vo-igx-sc .vo-i{transition:none}}\n"] }]
961
+ }], propDecorators: { title: [{
962
+ type: Input
963
+ }], section: [{
964
+ type: Input
965
+ }], styles: [{
966
+ type: Input
967
+ }], models: [{
968
+ type: Input
969
+ }], gallery: [{
970
+ type: Input
971
+ }], presets: [{
972
+ type: Input
973
+ }], className: [{
974
+ type: Input
975
+ }], prompt: [{
976
+ type: Input
977
+ }], defaultPrompt: [{
978
+ type: Input
979
+ }], selectedStyles: [{
980
+ type: Input
981
+ }], defaultSelectedStyles: [{
982
+ type: Input
983
+ }], shape: [{
984
+ type: Input
985
+ }], defaultShape: [{
986
+ type: Input
987
+ }], count: [{
988
+ type: Input
989
+ }], defaultCount: [{
990
+ type: Input
991
+ }], model: [{
992
+ type: Input
993
+ }], defaultModel: [{
994
+ type: Input
995
+ }], tab: [{
996
+ type: Input
997
+ }], defaultTab: [{
998
+ type: Input
999
+ }], generate: [{
1000
+ type: Input
1001
+ }], promptChange: [{
1002
+ type: Output
1003
+ }], selectedStylesChange: [{
1004
+ type: Output
1005
+ }], shapeChange: [{
1006
+ type: Output
1007
+ }], countChange: [{
1008
+ type: Output
1009
+ }], modelChange: [{
1010
+ type: Output
1011
+ }], tabChange: [{
1012
+ type: Output
1013
+ }], action: [{
1014
+ type: Output
1015
+ }], root: [{
1016
+ type: ViewChild,
1017
+ args: ['root']
1018
+ }], tiles: [{
1019
+ type: ViewChild,
1020
+ args: ['tiles']
1021
+ }], ta: [{
1022
+ type: ViewChild,
1023
+ args: ['ta']
1024
+ }], lbEl: [{
1025
+ type: ViewChild,
1026
+ args: ['lbEl']
1027
+ }] } });
1028
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtZ2VuZXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9pbWFnZS1nZW5lcmF0aW9uL2ltYWdlLWdlbmVyYXRpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1FQUFtRTtBQUNuRSxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsaUZBQWlGO0FBQ2pGLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsNkVBQTZFO0FBQzdFLG9DQUFvQztBQUNwQyxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSwrQ0FBK0M7QUFFL0MsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFtQixNQUFNLHdCQUF3QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQXlGdEUsTUFBTSxNQUFNLEdBQUcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMxRCxNQUFNLE1BQU0sR0FBK0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDdEYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzNELE1BQU0sS0FBSyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFFM0QsTUFBTSxTQUFT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QyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLElBQUksSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzlFLElBQUksT0FBTyxLQUFhLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakYsSUFBSSxJQUFJLEtBQWEsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLElBQUksS0FBSyxLQUFhLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwSSxJQUFJLFFBQVEsS0FBYSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsSUFBSSxLQUFLLEtBQWEsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRyxJQUFJLElBQUksS0FBYSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsSSxJQUFJLFVBQVUsS0FBYSxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRyxJQUFJLFNBQVMsS0FBaUIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdkcsSUFBSSxPQUFPO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BJLENBQUM7SUFDRCxJQUFJLFFBQVE7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMxRSxHQUFHLENBQUMsQ0FBQyxLQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU07U0FDdEgsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0QsSUFBSSxJQUFJO1FBQ04sTUFBTSxJQUFJLEdBQXVCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSSxPQUFPO1FBQ1QsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQWlCLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkksQ0FBQztJQUNELElBQUksSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxFQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRyxJQUFJLEtBQUssS0FBaUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFakcsS0FBSyxDQUFDLEVBQW1CLElBQW1CLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEUsR0FBRyxDQUFDLENBQU8sSUFBWSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEcsTUFBTSxDQUFDLEVBQWtCO1FBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5SixDQUFDO0lBQ0QsT0FBTyxDQUFDLEVBQVUsRUFBRSxJQUFnQixJQUFnQixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLFFBQVEsQ0FBQyxDQUFtQixJQUFhLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNJLE9BQU8sQ0FBQyxDQUFPLElBQWdDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEtBQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUVoSSxpSEFBaUg7SUFDakgsSUFBSSxDQUFDLENBQU87UUFDVixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxRSxNQUFNLENBQUMsR0FBb0MsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLElBQUksTUFBTSxFQUFFLENBQUM7UUFDOUcsSUFBSSxFQUFFLEtBQUssTUFBTTtZQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN0RSxJQUFJLEVBQUUsS0FBSyxLQUFLLElBQUksRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoTCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtnQkFDZixXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUk7Z0JBQzNJLFNBQVMsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTzthQUNqSSxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxFQUFFLEtBQUssTUFBTTtZQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUs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LENBQUMsQ0FBQyxLQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUFDLENBQUM7UUFDOUosSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ08sUUFBUTtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU87UUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDaEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFB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QUUsS0FBYTtRQUNwQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFO1lBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsUUFBUSxDQUFDLEVBQWtCLEVBQUUsRUFBVTtRQUNyQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQUMsQ0FBQztRQUM3SSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDTyxTQUFTLENBQUMsRUFBa0IsRUFBRSxJQUFhO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMs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QUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7UUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsV0FBVyxDQUFDLENBQVMsSUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwSSxVQUFVLENBQUMsQ0FBbUI7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFB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QUFFLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztvQkFDMUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7d0JBQUUsSUFBSSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQy9GLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJO29CQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JILENBQUMsQ0FBQztZQUNGLEdBQUcsRUFBRSxDQUFDO1lBQ04sSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F6VlUsd0JBQXdCO21HQUF4Qix3QkFBd0IsNmtDQWxQekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK09ULGd0bEJBaFBTLGVBQWU7OzRGQW1QZCx3QkFBd0I7a0JBdlBwQyxTQUFTOytCQUNFLHFCQUFxQixjQUNuQixJQUFJLGlCQUNELGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyxlQUFlLENBQUMsWUFDaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK09UOzhCQUtRLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR08sTUFBTTtzQkFBbEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFDTyxLQUFLO3NCQUFqQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ08sS0FBSztzQkFBakIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNPLEdBQUc7c0JBQWYsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRVksSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNO2dCQUNHLEtBQUs7c0JBQXhCLFNBQVM7dUJBQUMsT0FBTztnQkFDRCxFQUFFO3NCQUFsQixTQUFTO3VCQUFDLElBQUk7Z0JBQ0ksSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnJhbWV3b3JrL2FuZ3VsYXIvaW1hZ2UtZ2VuZXJhdGlvbi9pbWFnZS1nZW5lcmF0aW9uLmNvbXBvbmVudC50c1xuLy9cbi8vIE5hdGl2ZSBBbmd1bGFyIHBvcnQgb2YgZnJhbWV3b3JrL3JlYWN0L2ltYWdlLWdlbmVyYXRpb24vSW1hZ2VHZW5lcmF0aW9uLnRzeC5cbi8vIEEgcHJvbXB0IHdpdGggc3R5bGUgY2hpcHMsIGEgc2hhcGUgYW5kIGhvdyBtYW55IHBpY3R1cmVzLCBhbmQgYSBtb2RlbDsgdGhlXG4vLyBwaWN0dXJlcyBpdCBtYWtlcywgZWFjaCByZXNvbHZpbmcgZnJvbSBncmFpbiBpbnRvIGRvdHMsIHRoZW4gZGV0YWlsIHVuZGVyIGFcbi8vIHN3ZWVwaW5nIHNjYW4gbGluZSwgdGhlbiBzaGFycCAoQmx1ZXByaW50OiBzcXVhcmUgY2VsbHMgYW5kIGEgaGFyZCBzY2FuLCBub1xuLy8gYmx1cik7IGVhY2ggY2FuIGZhaWwgd2l0aCBSZXRyeSwgYW5kIGEgZmluaXNoZWQgb25lIGNhbiBiZSB1cHNjYWxlZCwgdmFyaWVkLFxuLy8gZG93bmxvYWRlZCwgb3BlbmVkIGxhcmdlciBvciB1c2VkIGFzIGEgcmVmZXJlbmNlLiBCZXNpZGUgaXQsIGEgZ2FsbGVyeSBvZlxuLy8gZWFybGllciBwaWN0dXJlcyBhbmQgc3R5bGUgcHJlc2V0czsgbmFycm93ZXIsIHRoZXkgdGFrZSB0aGUgZmVlZCdzIHBsYWNlIHVuZGVyXG4vLyBhIENyZWF0ZSAvIEdhbGxlcnkgLyBTdHlsZXMgc3dpdGNoLiBgZ2VuZXJhdGVgIG1ha2VzIHRoZSBwaWN0dXJlcyBhbmQgcmVwb3J0c1xuLy8gaG93IGZhciBlYWNoIGhhcyBjb21lLiBJbnB1dHMgbWlycm9yIHRoZSBSZWFjdCBwcm9wczsgUmVhY3QgY2FsbGJhY2tzIGJlY29tZVxuLy8gQE91dHB1dCgpIEV2ZW50RW1pdHRlcnMuIFVuY29udHJvbGxlZCBpbnB1dHMga2VlcCB0aGVpciBvd24gc3RhdGUgd2hlbiB0aGVcbi8vIG1hdGNoaW5nIElucHV0IGlzIGxlZnQgdW5kZWZpbmVkLlxuLy9cbi8vIEljb24gc3Vic3RpdHV0aW9ucyAodGhlIHNoYXJlZCBBbmd1bGFyIGljb24gc2V0IGlzIHNtYWxsZXIgdGhhbiB0aGUgc2l0ZSdzKTpcbi8vIGltYWdlIC0+IGV5ZSwgd2FuZCAtPiBzcGFyaywgbWF4IC0+IHBsdXMsIGxheWVycyAtPiByZWRvLCBkb3duIC0+IGNoZXYtZCxcbi8vIGNsaXAgLT4gY29weSwgdXAtdGh1bWIgLyBkb3duLXRodW1iIC0+IGhhbmQuXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWb0ljb25Db21wb25lbnQsIHR5cGUgVm9JY29uTmFtZSB9IGZyb20gJy4uL2NvcmUvaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVkdWNlZE1vdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3JlZHVjZWQtbW90aW9uLnNlcnZpY2UnO1xuXG4vKiogQSBwaWN0dXJlOiBvbmUgbWFkZSBieSB5b3VyIG1vZGVsLCBvciBhbiBlYXJsaWVyIG9uZSBpbiB0aGUgZ2FsbGVyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVkSW1hZ2Uge1xuICBrZXk6IHN0cmluZztcbiAgLyoqIFRoZSBwaWN0dXJlLiBXaXRob3V0IGl0LCBgcGxhY2Vob2xkZXJgIHN0YW5kcyBpbi4gKi9cbiAgc3JjPzogc3RyaW5nO1xuICAvKiogV2hhdCB0aGUgcGljdHVyZSBzaG93cywgZm9yIHNjcmVlbiByZWFkZXJzLiAqL1xuICBhbHQ6IHN0cmluZztcbiAgLyoqIEEgQ1NTIGJhY2tncm91bmQgZHJhd24gdW5kZXIgdGhlIHBpY3R1cmUgd2hpbGUgaXQgbG9hZHMgKG9yIGluc3RlYWQgb2YgaXQpLCBsaWtlIGEgZ3JhZGllbnQgb2YgaXRzIGNvbG91cnMuICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKiogSXRzIHdpZHRoIG92ZXIgaXRzIGhlaWdodCwgbGlrZSAwLjc1IGZvciAzOjQgKDEgYnkgZGVmYXVsdCkuICovXG4gIHJhdGlvPzogbnVtYmVyO1xuICAvKiogVGhlIHByb21wdCBpdCB3YXMgbWFkZSBmcm9tLCBzaG93biBpbiB0aGUgbGFyZ2VyIHZpZXcuICovXG4gIHByb21wdD86IHN0cmluZztcbiAgLyoqIFRoZSBzdHlsZXMgaXQgd2FzIG1hZGUgd2l0aC4gKi9cbiAgc3R5bGVzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCB0eXBlIEltYWdlU2hhcGUgPSAnMToxJyB8ICczOjQnIHwgJzE2OjknO1xuXG4vKiogV2hhdCBHZW5lcmF0ZSBhc2tzIHlvdXIgbW9kZWwgZm9yLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVJlcXVlc3Qge1xuICBwcm9tcHQ6IHN0cmluZztcbiAgLyoqIFRoZSBzdHlsZSBjaGlwcyB0aGF0IGFyZSBvbi4gKi9cbiAgc3R5bGVzOiBzdHJpbmdbXTtcbiAgc2hhcGU6IEltYWdlU2hhcGU7XG4gIC8qKiBIb3cgbWFueSBwaWN0dXJlcywgMSB0byA0LiAqL1xuICBjb3VudDogbnVtYmVyO1xuICAvKiogVGhlIG1vZGVsJ3Mga2V5LiAqL1xuICBtb2RlbDogc3RyaW5nO1xuICAvKiogUGljdHVyZXMgYWRkZWQgd2l0aCBVc2UgYXMgcmVmZXJlbmNlLiAqL1xuICByZWZlcmVuY2VzOiBHZW5lcmF0ZWRJbWFnZVtdO1xuICAvKiogU2V0IGZvciBWYXJ5OiB0aGUgcGljdHVyZSB0byBtYWtlIGEgdmFyaWF0aW9uIG9mIChjb3VudCBpcyAxKS4gKi9cbiAgdmFyaWF0aW9uT2Y/OiBHZW5lcmF0ZWRJbWFnZTtcbiAgLyoqIFNldCBmb3IgUmV0cnk6IHdoaWNoIHBpY3R1cmUgb2YgdGhlIHJ1biBpcyBiZWluZyBtYWRlIGFnYWluIChjb3VudCBpcyAxLCB1cGRhdGVzIGdvIHRvIHNsb3QgMCkuICovXG4gIHJldHJ5PzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCB5b3VyIG1vZGVsIHJlcG9ydHMgZm9yIG9uZSBwaWN0dXJlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0aW9uVXBkYXRlIHtcbiAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gIGltYWdlPzogR2VuZXJhdGVkSW1hZ2U7XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG4vKiogQSBzdHlsZSBwcmVzZXQ6IGEgcGljdHVyZSBhbmQgdGhlIHN0eWxlIGNoaXBzIGl0IHR1cm5zIG9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbWFnZVN0eWxlUHJlc2V0IHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogVGhlIHN0eWxlIGNoaXBzIGl0IHR1cm5zIG9uICh0aGUgb3RoZXJzIGdvIG9mZikuICovXG4gIHN0eWxlczogc3RyaW5nW107XG4gIGltYWdlPzogR2VuZXJhdGVkSW1hZ2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VNb2RlbCB7XG4gIGtleTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICAvKiogTGlrZSBcIk1vc3QgZGV0YWlsLCBhYm91dCA2cyBhIHBpY3R1cmVcIi4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGljb24/OiBWb0ljb25OYW1lO1xufVxuXG5leHBvcnQgdHlwZSBJbWFnZUFjdGlvbiA9ICd1cHNjYWxlJyB8ICdkb3dubG9hZCcgfCAncmVmZXJlbmNlJyB8ICdsaWtlJyB8ICdkaXNsaWtlJyB8ICdjb3B5JztcblxuLyoqIFRoZSBjYWxsYmFjayB0aGF0IG1ha2VzIHRoZSBwaWN0dXJlczogY2FsbCBgdXBkYXRlKHNsb3QsIOKApilgIGZvciBlYWNoIG9uZS4gKi9cbmV4cG9ydCB0eXBlIEdlbmVyYXRlRm4gPSAoXG4gIHJlcXVlc3Q6IEdlbmVyYXRlUmVxdWVzdCxcbiAgdXBkYXRlOiAoc2xvdDogbnVtYmVyLCB1cGRhdGU6IEdlbmVyYXRpb25VcGRhdGUpID0+IHZvaWQsXG4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG50eXBlIFN0YXR1cyA9ICd3YWl0JyB8ICdnZW4nIHwgJ2RvbmUnIHwgJ2ZhaWwnO1xuaW50ZXJmYWNlIFNsb3Qge1xuICBrZXk6IHN0cmluZztcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcbiAgaW1hZ2U/OiBHZW5lcmF0ZWRJbWFnZTtcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIGVsPzogSFRNTEVsZW1lbnQ7XG59XG5pbnRlcmZhY2UgUnVuIHtcbiAgaWQ6IG51bWJlcjtcbiAgcmVxdWVzdDogR2VuZXJhdGVSZXF1ZXN0O1xuICByYXRpbzogbnVtYmVyO1xuICBzbG90czogU2xvdFtdO1xuICB0MDogbnVtYmVyO1xuICBkb25lPzogbnVtYmVyO1xufVxuXG5jb25zdCBTVFlMRVMgPSBbJ0VkaXRvcmlhbCcsICdQb3N0ZXInLCAnU3VycmVhbCcsICczNW1tJ107XG5jb25zdCBTSEFQRVM6IFJlY29yZDxJbWFnZVNoYXBlLCBudW1iZXI+ID0geyAnMToxJzogMSwgJzM6NCc6IDMgLyA0LCAnMTY6OSc6IDE2IC8gOSB9O1xuY29uc3QgU1RBR0VTID0gWydDb21wb3NpbmcnLCAnQWRkaW5nIGRldGFpbCcsICdVcHNjYWxpbmcnXTtcbmNvbnN0IENST1BTID0gWyczMCUgMzUlJywgJzcwJSA0MCUnLCAnNDUlIDcwJScsICc2MCUgMjUlJ107XG5cbmNvbnN0IHNoYXBlTmFtZSA9IChyOiBudW1iZXIpOiBzdHJpbmcgPT5cbiAgKHsgMTogJzE6MScsIDAuNzU6ICczOjQnLCAwLjg6ICc0OjUnLCAwLjY2NzogJzI6MycsIDEuMzMzOiAnNDozJywgMS41OiAnMzoyJywgMS43Nzg6ICcxNjo5JyB9IGFzIFJlY29yZDxudW1iZXIsIHN0cmluZz4pW1xuICAgIE1hdGgucm91bmQociAqIDEwMDApIC8gMTAwMFxuICBdIHx8ICcnO1xuY29uc3QgYmcgPSAoaW0/OiBHZW5lcmF0ZWRJbWFnZSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICBbaW0/LnNyYyAmJiBgdXJsKFwiJHtpbS5zcmN9XCIpYCwgaW0/LnBsYWNlaG9sZGVyXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKSB8fCB1bmRlZmluZWQ7XG5jb25zdCBzdGF0dXNPZiA9IChzOiBTbG90KTogU3RhdHVzID0+XG4gIHMuZXJyb3IgPyAnZmFpbCcgOiBzLnByb2dyZXNzID49IDEgJiYgcy5pbWFnZSA/ICdkb25lJyA6IHMuaW1hZ2UgfHwgcy5wcm9ncmVzcyA+IDAgPyAnZ2VuJyA6ICd3YWl0JztcblxuLyoqIEEgZ3JhaW4gdGlsZSwgZHJhd24gb25jZSBvbiBhIGNhbnZhcy4gKi9cbmxldCBncmFpbiA9ICcnO1xuZnVuY3Rpb24gbWFrZUdyYWluKG9mZjogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChvZmYpIHJldHVybiAnJztcbiAgaWYgKGdyYWluKSByZXR1cm4gZ3JhaW47XG4gIHRyeSB7XG4gICAgY29uc3QgbiA9IDk2O1xuICAgIGNvbnN0IGN2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY3Yud2lkdGggPSBjdi5oZWlnaHQgPSBuO1xuICAgIGNvbnN0IHggPSBjdi5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICgheCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGQgPSB4LmNyZWF0ZUltYWdlRGF0YShuLCBuKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGQuZGF0YS5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgY29uc3QgYyA9IE1hdGgucmFuZG9tKCkgPCAwLjUgPyAyMCA6IDI0NTtcbiAgICAgIGQuZGF0YVtpXSA9IGQuZGF0YVtpICsgMV0gPSBkLmRhdGFbaSArIDJdID0gYztcbiAgICAgIGQuZGF0YVtpICsgM10gPSA0MCArIE1hdGgucmFuZG9tKCkgKiAxNTA7XG4gICAgfVxuICAgIHgucHV0SW1hZ2VEYXRhKGQsIDAsIDApO1xuICAgIGdyYWluID0gYHVybChcIiR7Y3YudG9EYXRhVVJMKCl9XCIpYDtcbiAgICByZXR1cm4gZ3JhaW47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by1pbWFnZS1nZW5lcmF0aW9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW1ZvSWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI3Jvb3RcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgY2xhc3M9XCJ2by1pZ3hcIlxuICAgICAgW2NsYXNzXT1cImNsYXNzTmFtZVwiXG4gICAgICByb2xlPVwicmVnaW9uXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJJbWFnZSBnZW5lcmF0aW9uXCJcbiAgICAgIFtzdHlsZS4tLXZvLW5vaXNlXT1cIm5vaXNlIHx8IG51bGxcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtaW5cIiBbYXR0ci5kYXRhLXZpZXddPVwidmlld1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidm8taWd4LW1haW5cIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiQ3JlYXRlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWlneC1oXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWlneC1jclwiPjxzcGFuPnt7IHNlY3Rpb24gfX08L3NwYW4+PHZvLWljb24gbmFtZT1cImNoZXYtclwiPjwvdm8taWNvbj48Yj57eyB0aXRsZSB9fTwvYj48L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tc2VnMiB2by1pZ3gtdndcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiU2hvd1wiPlxuICAgICAgICAgICAgICBAZm9yIChvIG9mIHZpZXdPcHRzOyB0cmFjayBvLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInZpZXcgPT09IG8udmFsdWVcIiAoY2xpY2spPVwic2hvd1ZpZXcoby52YWx1ZSlcIj57eyBvLmxhYmVsIH19PC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtZmVlZFwiPlxuICAgICAgICAgICAgQGlmIChydW4pIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWJ1YiB2by1pZ3gtYXNrXCI+e3sgcnVuLnJlcXVlc3QucHJvbXB0IH19PC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWlneC1lbXB0eVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtZWZcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48c3Bhbj48dm8taWNvbiBuYW1lPVwiZXllXCI+PC92by1pY29uPjwvc3Bhbj48c3Bhbj48dm8taWNvbiBuYW1lPVwiZXllXCI+PC92by1pY29uPjwvc3Bhbj48c3Bhbj48dm8taWNvbiBuYW1lPVwiZXllXCI+PC92by1pY29uPjwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5EZXNjcmliZSBhIHBpY3R1cmUgYW5kIHByZXNzIEdlbmVyYXRlPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAocnVuKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtcnVuXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWlneC1yaFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1pZ3gtcnRcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChidXN5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjxzcGFuPkdlbmVyYXRpbmcge3sgcGljcyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAobkJhZCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJhbGVydFwiPjwvdm8taWNvbj48c3Bhbj57eyBuRG9uZSB9fSBvZiB7eyBuIH19IHJlYWR5LCB7eyBuQmFkIH19IGZhaWxlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cImV5ZVwiPjwvdm8taWNvbj48c3Bhbj57eyBuID09PSAxID8gJ1BpY3R1cmUnIDogY2FwUGljcyB9fSByZWFkeSBpbiB7eyBzZWNzIH19czwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1pZ3gtc3RlcHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAocyBvZiBTVEFHRVM7IHRyYWNrIHM7IGxldCBrID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzLnZvLWRvbmVdPVwiayA8IHN0YWdlXCIgW2NsYXNzLnZvLW9uXT1cImsgPT09IHN0YWdlXCI+PGk+PC9pPjx2by1pY29uIG5hbWU9XCJjaGVja1wiPjwvdm8taWNvbj57eyBzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWlneC1wYyB2by1udW1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBidXN5ID8gcGN0VG90YWwgKyAnJScgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAjdGlsZXNcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidm8taWd4LXRpbGVzXCJcbiAgICAgICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUGljdHVyZXNcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLi0tdm8tY29sc109XCJncmlkLmNvbHNcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLi0tdm8tcm93c109XCJncmlkLnJvd3NcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHMgb2YgcnVuLnNsb3RzOyB0cmFjayBzLmtleTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGZpZ3VyZVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidm8taWd4LXRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by11cF09XCJzLmltYWdlICYmIHVwcGVkW3MuaW1hZ2Uua2V5XSA9PT0gJ3VwcGluZydcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtc3RdPVwic3RhdHVzT2YocylcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJsb29rKHMpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1pZ3gtb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwiZGlhbG9nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzdGF0dXNPZihzKSAhPT0gJ2RvbmUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic3RhdHVzT2YocykgPT09ICdkb25lJyA/ICdPcGVuIHBpY3R1cmUgJyArIChpICsgMSkgKyAnOiAnICsgcy5pbWFnZT8uYWx0IDogJ1BpY3R1cmUgJyArIChpICsgMSkgKyAnLCAnICsgKHN0YXR1c09mKHMpID09PSAnZmFpbCcgPyAnZmFpbGVkJyA6ICdiZWluZyBtYWRlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5Gcm9tVGlsZShzLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWlneC1seSB2by1pZ3gtYlwiIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cImltZ0JnKHMuaW1hZ2UpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1pZ3gtbHkgdm8taWd4LXNcIiBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJpbWdCZyhzLmltYWdlKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taWd4LW5cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWlneC1sXCI+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChzLmltYWdlICYmIHVwcGVkW3MuaW1hZ2Uua2V5XSA9PT0gJ3VwJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10YWcgdm8taWd4LXRnXCI+MsOXPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWlneC10cCB2by1udW1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj57eyBwY3QocykgfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cImFsZXJ0XCI+PC92by1pY29uPjxiPkNvdWxkbid0IGZpbmlzaDwvYj48c3Bhbj57eyBzLmVycm9yIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWxpbmUgdm8tc21cIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZXRyeSBwaWN0dXJlICcgKyAoaSArIDEpXCIgKGNsaWNrKT1cInJldHJ5KGkpXCI+PHZvLWljb24gbmFtZT1cInJlZnJlc2hcIiBzaXplPVwieHNcIj48L3ZvLWljb24+UmV0cnk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGRvbmVJbWcocyk7IGFzIGltKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taWd4LXFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1pYlwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1ZhcnkgcGljdHVyZSAnICsgKGkgKyAxKVwiIGRhdGEtdGlwPVwiVmFyeVwiIChjbGljayk9XCJ2YXJ5KGltKVwiPjx2by1pY29uIG5hbWU9XCJyZWRvXCI+PC92by1pY29uPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWliXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInVXBzY2FsZSBwaWN0dXJlICcgKyAoaSArIDEpXCIgZGF0YS10aXA9XCJVcHNjYWxlXCIgKGNsaWNrKT1cInVwc2NhbGUoaW0pXCI+PHZvLWljb24gbmFtZT1cInBsdXNcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8taWJcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidEb3dubG9hZCBwaWN0dXJlICcgKyAoaSArIDEpXCIgW2F0dHIuZGF0YS10aXBdPVwiZmxhc2g/LmlkID09PSAndCcgKyBpID8gZmxhc2g/LmxhYmVsIDogJ0Rvd25sb2FkJ1wiIChjbGljayk9XCJkb3dubG9hZChpbSwgJ3QnICsgaSlcIj48dm8taWNvbiBbbmFtZV09XCJmbGFzaGVkKCd0JyArIGksICdjaGV2LWQnKVwiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9maWd1cmU+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWlneC1hY3RzXCIgcm9sZT1cInRvb2xiYXJcIiBhcmlhLWxhYmVsPVwiUmF0ZSBhbmQgY29weVwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1pYlwiIGFyaWEtbGFiZWw9XCJHb29kIHBpY3R1cmVzXCIgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInJ1blJhdGUgPT09IDFcIiBkYXRhLXRpcD1cIkdvb2QgcGljdHVyZXNcIiAoY2xpY2spPVwicmF0ZVJ1bigxKVwiPjx2by1pY29uIG5hbWU9XCJoYW5kXCI+PC92by1pY29uPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1pYlwiIGFyaWEtbGFiZWw9XCJCYWQgcGljdHVyZXNcIiBbYXR0ci5hcmlhLXByZXNzZWRdPVwicnVuUmF0ZSA9PT0gLTFcIiBkYXRhLXRpcD1cIkJhZCBwaWN0dXJlc1wiIChjbGljayk9XCJyYXRlUnVuKC0xKVwiPjx2by1pY29uIG5hbWU9XCJoYW5kXCI+PC92by1pY29uPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1pYlwiIGFyaWEtbGFiZWw9XCJDb3B5IHByb21wdFwiIFthdHRyLmRhdGEtdGlwXT1cImNvcGllZCA/ICdQcm9tcHQgY29waWVkJyA6ICdDb3B5IHByb21wdCdcIiAoY2xpY2spPVwiY29weVByb21wdCgpXCI+PHZvLWljb24gW25hbWVdPVwiY29waWVkID8gJ2NoZWNrJyA6ICdjb3B5J1wiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taWd4LW1ldGFcIj57eyBydW5NZXRhIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidm8taWd4LXNyXCIgYXJpYS1saXZlPVwicG9saXRlXCI+e3sgc2FpZCB9fTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Zm9ybSBjbGFzcz1cInZvLWlneC1jbXBcIiAoc3VibWl0KT1cInN1Ym1pdCgkZXZlbnQpXCI+XG4gICAgICAgICAgICBAaWYgKHJlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtcmVmc1wiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJSZWZlcmVuY2VzXCI+XG4gICAgICAgICAgICAgICAgQGZvciAoaW0gb2YgcmVmczsgdHJhY2sgaW0ua2V5OyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1pZ3gtcmVmXCI+PHNwYW4gY2xhc3M9XCJ2by1pZ3gtcnBcIj48c3BhbiBjbGFzcz1cInZvLWlneC1seVwiIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cImltZ0JnKGltKVwiPjwvc3Bhbj48L3NwYW4+UmVmZXJlbmNlIHt7IGkgKyAxIH19XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8taWJcIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmUgcmVmZXJlbmNlICcgKyAoaSArIDEpXCIgZGF0YS10aXA9XCJSZW1vdmVcIiAoY2xpY2spPVwicmVtb3ZlUmVmKGltKVwiPjx2by1pY29uIG5hbWU9XCJ4XCIgc2l6ZT1cInhzXCI+PC92by1pY29uPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgI3RhXG4gICAgICAgICAgICAgIGNsYXNzPVwidm8taWd4LXRhXCJcbiAgICAgICAgICAgICAgcm93cz1cIjJcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiUHJvbXB0XCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJEZXNjcmliZSB0aGUgcGljdHVyZSB5b3Ugd2FudFwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJwcm9tcHRcIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwib25Qcm9tcHQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5KCRldmVudClcIlxuICAgICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICBAaWYgKHN0eWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWlneC1zdHlcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiU3R5bGVzXCI+XG4gICAgICAgICAgICAgICAgQGZvciAocyBvZiBzdHlsZXM7IHRyYWNrIHMpIHtcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8taWd4LXNjXCIgW2NsYXNzLnZvLWhsXT1cImhsLmluY2x1ZGVzKHMpXCIgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInBpY2tlZC5pbmNsdWRlcyhzKVwiIChjbGljayk9XCJ0b2dnbGVTdHlsZShzKVwiPjx2by1pY29uIG5hbWU9XCJjaGVja1wiPjwvdm8taWNvbj57eyBzIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtYmFyXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tY2hpcCB2by1pZ3gtc2V0XCIgYXJpYS1oYXNwb3B1cD1cImRpYWxvZ1wiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicG9wID09PSAnc2V0J1wiIGRhdGEtdGlwPVwiU2hhcGUgYW5kIG51bWJlclwiIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1NoYXBlICcgKyBzaGFwZSArICcsICcgKyAoY291bnQgPT09IDEgPyAnMSBwaWN0dXJlJyA6IGNvdW50ICsgJyBwaWN0dXJlcycpXCIgKGNsaWNrKT1cInRvZ2dsZVBvcCgnc2V0JylcIj48dm8taWNvbiBuYW1lPVwiZXllXCI+PC92by1pY29uPjxzcGFuPnt7IHNoYXBlIH19IMK3IHt7IGNvdW50IH19PC9zcGFuPjx2by1pY29uIG5hbWU9XCJjaGV2LWRcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICAgIEBpZiAobW9kZWxzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWNoaXAgdm8taWd4LW1kbFwiIGFyaWEtaGFzcG9wdXA9XCJtZW51XCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJwb3AgPT09ICdtb2RlbCdcIiBkYXRhLXRpcD1cIkltYWdlIG1vZGVsXCIgKGNsaWNrKT1cInRvZ2dsZVBvcCgnbW9kZWwnKVwiPjx2by1pY29uIFtuYW1lXT1cIm1vZGVsSWNvblwiPjwvdm8taWNvbj48c3Bhbj57eyBtb2RlbExhYmVsIH19PC9zcGFuPjx2by1pY29uIG5hbWU9XCJjaGV2LWRcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJ2by1waWxsIHZvLXByaW1hcnkgdm8taWd4LWdvXCIgYXJpYS1sYWJlbD1cIkdlbmVyYXRlXCIgW2F0dHIuZGF0YS10aXBdPVwiYnVzeSA/ICdHZW5lcmF0aW5nJyA6ICdHZW5lcmF0ZSdcIiBkYXRhLXRpcC1rPVwi4oa1XCIgW2Rpc2FibGVkXT1cIiFwcm9tcHQudHJpbSgpIHx8IGJ1c3lcIj48dm8taWNvbiBuYW1lPVwic3BhcmtcIj48L3ZvLWljb24+PHNwYW4+R2VuZXJhdGU8L3NwYW4+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIEBpZiAocG9wID09PSAnc2V0Jykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tcG9wIHZvLWlneC1wcC1zZXRcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbD1cIlNoYXBlIGFuZCBudW1iZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tcGhcIj5TaGFwZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1zZWcyIHZvLWlneC1hcnNcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiU2hhcGVcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHYgb2Ygc2hhcGVPcHRzOyB0cmFjayB2KSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFthdHRyLmFyaWEtcHJlc3NlZF09XCJzaGFwZSA9PT0gdlwiIChjbGljayk9XCJzZXRTaGFwZSh2KVwiPnt7IHYgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tcGhcIj5QaWN0dXJlczwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1zZWcyIHZvLWlneC1jdHNcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiUGljdHVyZXNcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHYgb2YgY291bnRPcHRzOyB0cmFjayB2KSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIFthdHRyLmFyaWEtcHJlc3NlZF09XCJjb3VudCA9PT0gdlwiIChjbGljayk9XCJzZXRDb3VudCh2KVwiPnt7IHYgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHBvcCA9PT0gJ21vZGVsJyAmJiBtb2RlbHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tcG9wIHZvLWlneC1wcC1tXCIgcm9sZT1cIm1lbnVcIiBhcmlhLWxhYmVsPVwiSW1hZ2UgbW9kZWxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tcGhcIj5JbWFnZSBtb2RlbDwvZGl2PlxuICAgICAgICAgICAgICAgIEBmb3IgKG0gb2YgbW9kZWxzOyB0cmFjayBtLmtleSkge1xuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1taVwiIHJvbGU9XCJtZW51aXRlbXJhZGlvXCIgW2F0dHIuYXJpYS1jaGVja2VkXT1cIm0ua2V5ID09PSBtb2RlbFwiIChjbGljayk9XCJwaWNrTW9kZWwobS5rZXkpXCI+PHZvLWljb24gW25hbWVdPVwibS5pY29uID8/ICdzcGFyaydcIj48L3ZvLWljb24+PHNwYW4+e3sgbS5sYWJlbCB9fUBpZiAobS5kZXNjcmlwdGlvbikgezxzcGFuIGNsYXNzPVwidm8tZFwiPnt7IG0uZGVzY3JpcHRpb24gfX08L3NwYW4+fTwvc3Bhbj48c3BhbiBjbGFzcz1cInZvLWNrXCI+PHZvLWljb24gbmFtZT1cImNoZWNrXCI+PC92by1pY29uPjwvc3Bhbj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtc2lkZVwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJMaWJyYXJ5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWlneC1zaFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLXNlZzIgdm8taWd4LXRiXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlNob3dcIj5cbiAgICAgICAgICAgICAgQGZvciAobyBvZiB0YWJPcHRzOyB0cmFjayBvLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInRhYiA9PT0gby52YWx1ZVwiIChjbGljayk9XCJzaG93VGFiKG8udmFsdWUpXCI+e3sgby5sYWJlbCB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJ2by1tdXRlZCB2by1udW1cIj57eyBhbGwubGVuZ3RoIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtcGFuZVwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJHYWxsZXJ5XCIgW2hpZGRlbl09XCJ0YWIgIT09ICdnYWxsZXJ5J1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWlneC1nYWxcIj5cbiAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtY29sXCI+XG4gICAgICAgICAgICAgICAgICBAZm9yIChpbSBvZiBjb2w7IHRyYWNrIGltLmtleSkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWlneC1nXCIgW2NsYXNzLnZvLW5ld109XCJmcmVzaC5oYXMoaW0ua2V5KVwiIGFyaWEtaGFzcG9wdXA9XCJkaWFsb2dcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImltLmFsdFwiIFtzdHlsZS4tLXZvLWFyXT1cImltLnJhdGlvID8/IDFcIiAoY2xpY2spPVwib3BlbkdhbGxlcnkoaW0sICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWlneC1seVwiIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cImltZ0JnKGltKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtcGFuZVwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJTdHlsZSBwcmVzZXRzXCIgW2hpZGRlbl09XCJ0YWIgIT09ICdzdHlsZXMnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taWd4LXByc1wiPlxuICAgICAgICAgICAgICBAZm9yIChwIG9mIHByZXNldHM7IHRyYWNrIHAua2V5KSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1pZ3gtcHJcIiBbYXR0ci5hcmlhLXByZXNzZWRdPVwicHJlc2V0T24ocClcIiAoY2xpY2spPVwicGlja1ByZXNldChwKVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1pZ3gtcHJwXCI+PHNwYW4gY2xhc3M9XCJ2by1pZ3gtbHlcIiBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJpbWdCZyhwLmltYWdlKVwiPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWlneC1wcnRcIj48Yj57eyBwLmxhYmVsIH19PC9iPkBpZiAocC5kZXNjcmlwdGlvbikgezxzcGFuIGNsYXNzPVwidm8tbXV0ZWRcIj57eyBwLmRlc2NyaXB0aW9uIH19PC9zcGFuPn08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmIChsYiAmJiBsYkltZykge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICNsYkVsXG4gICAgICAgICAgICBjbGFzcz1cInZvLWlneC1sYiB2by1vcGVuXCJcbiAgICAgICAgICAgIHJvbGU9XCJkaWFsb2dcIlxuICAgICAgICAgICAgYXJpYS1tb2RhbD1cInRydWVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUGljdHVyZSAnICsgKGxiQXQgKyAxKSArICcgb2YgJyArIGxiLmxpc3QubGVuZ3RoXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cImxiS2V5cygkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taWd4LWxiaFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taWd4LWxidFwiPjxiPnt7IGxiSW1nLnByb21wdCA/PyBsYkltZy5hbHQgfX08L2I+PHNwYW4gY2xhc3M9XCJ2by1tdXRlZFwiPnt7IG1ldGFPZihsYkltZykgfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tbXV0ZWQgdm8tbnVtXCI+e3sgbGJBdCArIDEgfX0gb2Yge3sgbGIubGlzdC5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8taWIgdm8taWd4LWxieFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIGRhdGEtdGlwPVwiQ2xvc2VcIiBkYXRhLXRpcC1rPVwiRXNjXCIgKGNsaWNrKT1cImNsb3NlTGIodHJ1ZSlcIj48dm8taWNvbiBuYW1lPVwieFwiPjwvdm8taWNvbj48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWlneC1sYmJcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWxpbmUgdm8taWd4LWxiblwiIGFyaWEtbGFiZWw9XCJQcmV2aW91cyBwaWN0dXJlXCIgZGF0YS10aXA9XCJQcmV2aW91c1wiIFtkaXNhYmxlZF09XCJsYkF0IDw9IDBcIiAoY2xpY2spPVwic3RlcCgtMSlcIj48dm8taWNvbiBuYW1lPVwiY2hldi1sXCI+PC92by1pY29uPjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8taWd4LWxic1wiPlxuICAgICAgICAgICAgICAgIDxmaWd1cmUgY2xhc3M9XCJ2by1pZ3gtdFwiIFtjbGFzcy52by11cF09XCJ1cHBlZFtsYkltZy5rZXldID09PSAndXBwaW5nJ1wiIGRhdGEtc3Q9XCJkb25lXCIgW3N0eWxlLi0tdm8tYXJdPVwibGJJbWcucmF0aW8gPz8gMVwiIFtzdHlsZS4tLXZvLWFydF09XCJsYkltZy5wbGFjZWhvbGRlciA/PyAnbm9uZSdcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taWd4LWx5IHZvLWlneC1iXCIgW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdPVwiaW1nQmcobGJJbWcpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1pZ3gtbHkgdm8taWd4LXNcIiByb2xlPVwiaW1nXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJsYkltZy5hbHRcIiBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJpbWdCZyhsYkltZylcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWlneC1sXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PHNwYW4+PC9zcGFuPjxzcGFuPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICBAaWYgKHVwcGVkW2xiSW1nLmtleV0gPT09ICd1cCcpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10YWcgdm8taWd4LXRnXCI+MsOXPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZmlndXJlPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWxpbmUgdm8taWd4LWxiblwiIGFyaWEtbGFiZWw9XCJOZXh0IHBpY3R1cmVcIiBkYXRhLXRpcD1cIk5leHRcIiBbZGlzYWJsZWRdPVwibGJBdCA+PSBsYi5saXN0Lmxlbmd0aCAtIDFcIiAoY2xpY2spPVwic3RlcCgxKVwiPjx2by1pY29uIG5hbWU9XCJjaGV2LXJcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1pZ3gtbGJmXCIgcm9sZT1cInRvb2xiYXJcIiBhcmlhLWxhYmVsPVwiUGljdHVyZSBhY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1saW5lIHZvLXNtXCIgYXJpYS1sYWJlbD1cIlVwc2NhbGVcIiBkYXRhLXRpcD1cIlVwc2NhbGUgdG8gdHdpY2UgdGhlIHNpemVcIiAoY2xpY2spPVwidXBzY2FsZShsYkltZylcIj48dm8taWNvbiBuYW1lPVwicGx1c1wiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48c3BhbiBjbGFzcz1cInZvLWlneC1sYmxcIj5VcHNjYWxlPC9zcGFuPjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tbGluZSB2by1zbVwiIGFyaWEtbGFiZWw9XCJWYXJ5XCIgZGF0YS10aXA9XCJNYWtlIGEgdmFyaWF0aW9uXCIgKGNsaWNrKT1cInZhcnkobGJJbWcpXCI+PHZvLWljb24gbmFtZT1cInJlZG9cIiBzaXplPVwieHNcIj48L3ZvLWljb24+PHNwYW4gY2xhc3M9XCJ2by1pZ3gtbGJsXCI+VmFyeTwvc3Bhbj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWxpbmUgdm8tc21cIiBhcmlhLWxhYmVsPVwiVXNlIGFzIHJlZmVyZW5jZVwiIGRhdGEtdGlwPVwiVXNlIGFzIHJlZmVyZW5jZVwiIChjbGljayk9XCJ1c2VBc1JlZihsYkltZylcIj48dm8taWNvbiBuYW1lPVwiY29weVwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48c3BhbiBjbGFzcz1cInZvLWlneC1sYmxcIj5Vc2UgYXMgcmVmZXJlbmNlPC9zcGFuPjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tbGluZSB2by1zbVwiIGFyaWEtbGFiZWw9XCJEb3dubG9hZFwiIFthdHRyLmRhdGEtdGlwXT1cImZsYXNoPy5pZCA9PT0gJ2xiJyA/IGZsYXNoPy5sYWJlbCA6ICdEb3dubG9hZCdcIiAoY2xpY2spPVwiZG93bmxvYWQobGJJbWcsICdsYicpXCI+PHZvLWljb24gW25hbWVdPVwiZmxhc2hlZCgnbGInLCAnY2hldi1kJylcIiBzaXplPVwieHNcIj48L3ZvLWljb24+PHNwYW4gY2xhc3M9XCJ2by1pZ3gtbGJsXCI+RG93bmxvYWQ8L3NwYW4+PC9idXR0b24+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taWd4LXNlcFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1pYlwiIGFyaWEtbGFiZWw9XCJHb29kIHBpY3R1cmVcIiBbYXR0ci5hcmlhLXByZXNzZWRdPVwicmF0aW5nW2xiSW1nLmtleV0gPT09IDFcIiBkYXRhLXRpcD1cIkdvb2QgcGljdHVyZVwiIChjbGljayk9XCJyYXRlKGxiSW1nLCAxKVwiPjx2by1pY29uIG5hbWU9XCJoYW5kXCI+PC92by1pY29uPjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLWliXCIgYXJpYS1sYWJlbD1cIkJhZCBwaWN0dXJlXCIgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInJhdGluZ1tsYkltZy5rZXldID09PSAtMVwiIGRhdGEtdGlwPVwiQmFkIHBpY3R1cmVcIiAoY2xpY2spPVwicmF0ZShsYkltZywgLTEpXCI+PHZvLWljb24gbmFtZT1cImhhbmRcIj48L3ZvLWljb24+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsOiAnLi9pbWFnZS1nZW5lcmF0aW9uLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlR2VuZXJhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBUaGUgcHJvamVjdCwgc2hvd24gYWZ0ZXIgXCJJbWFnZXNcIiBpbiB0aGUgaGVhZGVyLCBsaWtlIFwiU3ByaW5nIGxvb2tib29rXCIuICovXG4gIEBJbnB1dCgpIHRpdGxlID0gJ1VudGl0bGVkJztcbiAgLyoqIFRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBoZWFkZXIuIERlZmF1bHRzIHRvIFwiSW1hZ2VzXCIuICovXG4gIEBJbnB1dCgpIHNlY3Rpb24gPSAnSW1hZ2VzJztcbiAgLyoqIFRoZSBzdHlsZSBjaGlwcyB1bmRlciB0aGUgcHJvbXB0LiAqL1xuICBASW5wdXQoKSBzdHlsZXM6IHN0cmluZ1tdID0gU1RZTEVTO1xuICAvKiogVGhlIG1vZGVscyBpbiB0aGUgbW9kZWwgbWVudS4gTGVhdmUgaXQgb3V0IHRvIGhpZGUgdGhlIG1lbnUuICovXG4gIEBJbnB1dCgpIG1vZGVscz86IEltYWdlTW9kZWxbXTtcbiAgLyoqIEVhcmxpZXIgcGljdHVyZXMsIG5ld2VzdCBmaXJzdC4gUGljdHVyZXMgbWFkZSBoZXJlIGpvaW4gdGhlbSBhdCB0aGUgdG9wLiAqL1xuICBASW5wdXQoKSBnYWxsZXJ5OiBHZW5lcmF0ZWRJbWFnZVtdID0gW107XG4gIC8qKiBUaGUgU3R5bGVzIHRhYi4gUGlja2luZyBvbmUgc2V0cyB0aGUgc3R5bGUgY2hpcHMuICovXG4gIEBJbnB1dCgpIHByZXNldHM6IEltYWdlU3R5bGVQcmVzZXRbXSA9IFtdO1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcblxuICAvLyBjb250cm9sbGFibGUgaW5wdXRzICh1bmRlZmluZWQgPT4gdGhlIGNvbXBvbmVudCBrZWVwcyBpdHMgb3duIHN0YXRlKVxuICBASW5wdXQoKSBzZXQgcHJvbXB0KHY6IHN0cmluZyB8IHVuZGVmaW5lZCkgeyBpZiAodiAhPT0gdW5kZWZpbmVkKSB0aGlzLnByb21wdFN0YXRlID0gdjsgfVxuICBnZXQgcHJvbXB0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnByb21wdFN0YXRlOyB9XG4gIEBJbnB1dCgpIGRlZmF1bHRQcm9tcHQgPSAnJztcbiAgQElucHV0KCkgc2V0IHNlbGVjdGVkU3R5bGVzKHY6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7IGlmICh2ICE9PSB1bmRlZmluZWQpIHRoaXMucGlja2VkU3RhdGUgPSB2OyB9XG4gIEBJbnB1dCgpIGRlZmF1bHRTZWxlY3RlZFN0eWxlczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgc2V0IHNoYXBlKHY6IEltYWdlU2hhcGUgfCB1bmRlZmluZWQpIHsgaWYgKHYgIT09IHVuZGVmaW5lZCkgdGhpcy5zaGFwZVN0YXRlID0gdjsgfVxuICBnZXQgc2hhcGUoKTogSW1hZ2VTaGFwZSB7IHJldHVybiB0aGlzLnNoYXBlU3RhdGU7IH1cbiAgQElucHV0KCkgZGVmYXVsdFNoYXBlOiBJbWFnZVNoYXBlID0gJzM6NCc7XG4gIEBJbnB1dCgpIHNldCBjb3VudCh2OiBudW1iZXIgfCB1bmRlZmluZWQpIHsgaWYgKHYgIT09IHVuZGVmaW5lZCkgdGhpcy5jb3VudFN0YXRlID0gdjsgfVxuICBnZXQgY291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuY291bnRTdGF0ZTsgfVxuICBASW5wdXQoKSBkZWZhdWx0Q291bnQgPSA0O1xuICBASW5wdXQoKSBzZXQgbW9kZWwodjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7IGlmICh2ICE9PSB1bmRlZmluZWQpIHRoaXMubW9kZWxTdGF0ZSA9IHY7IH1cbiAgZ2V0IG1vZGVsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm1vZGVsU3RhdGU7IH1cbiAgQElucHV0KCkgZGVmYXVsdE1vZGVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBzZXQgdGFiKHY6ICdnYWxsZXJ5JyB8ICdzdHlsZXMnIHwgdW5kZWZpbmVkKSB7IGlmICh2ICE9PSB1bmRlZmluZWQpIHRoaXMudGFiU3RhdGUgPSB2OyB9XG4gIGdldCB0YWIoKTogJ2dhbGxlcnknIHwgJ3N0eWxlcycgeyByZXR1cm4gdGhpcy50YWJTdGF0ZTsgfVxuICBASW5wdXQoKSBkZWZhdWx0VGFiOiAnZ2FsbGVyeScgfCAnc3R5bGVzJyA9ICdnYWxsZXJ5JztcblxuICAvKiogTWFrZXMgdGhlIHBpY3R1cmVzOiBjYWxsIGB1cGRhdGUoc2xvdCwg4oCmKWAgZm9yIGVhY2ggb25lIGFzIGl0IGdvZXMuICovXG4gIEBJbnB1dCgpIGdlbmVyYXRlPzogR2VuZXJhdGVGbjtcblxuICBAT3V0cHV0KCkgcHJvbXB0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBzZWxlY3RlZFN0eWxlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nW10+KCk7XG4gIEBPdXRwdXQoKSBzaGFwZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VTaGFwZT4oKTtcbiAgQE91dHB1dCgpIGNvdW50Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBtb2RlbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgdGFiQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjwnZ2FsbGVyeScgfCAnc3R5bGVzJz4oKTtcbiAgLyoqIENhbGxlZCBmb3IgZWFjaCBhY3Rpb24gb24gYSBwaWN0dXJlLiBGb3IgJ3Vwc2NhbGUnLCByZXR1cm4gYSBwcm9taXNlLiAqL1xuICBAT3V0cHV0KCkgYWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IGFjdGlvbjogSW1hZ2VBY3Rpb247IGltYWdlOiBHZW5lcmF0ZWRJbWFnZSB9PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3Jvb3QnKSByb290ITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3RpbGVzJykgdGlsZXM/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgndGEnKSB0YT86IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2xiRWwnKSBsYkVsPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb3Rpb24gPSBpbmplY3QoUmVkdWNlZE1vdGlvblNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IFNUQUdFUyA9IFNUQUdFUztcbiAgcmVhZG9ubHkgc2hhcGVPcHRzOiBJbWFnZVNoYXBlW10gPSBbJzE6MScsICczOjQnLCAnMTY6OSddO1xuICByZWFkb25seSBjb3VudE9wdHMgPSBbMSwgMiwgMywgNF07XG4gIHJlYWRvbmx5IHZpZXdPcHRzID0gW1xuICAgIHsgdmFsdWU6ICdjcmVhdGUnIGFzIGNvbnN0LCBsYWJlbDogJ0NyZWF0ZScgfSxcbiAgICB7IHZhbHVlOiAnZ2FsbGVyeScgYXMgY29uc3QsIGxhYmVsOiAnR2FsbGVyeScgfSxcbiAgICB7IHZhbHVlOiAnc3R5bGVzJyBhcyBjb25zdCwgbGFiZWw6ICdTdHlsZXMnIH0sXG4gIF07XG4gIHJlYWRvbmx5IHN0YXR1c09mID0gc3RhdHVzT2Y7XG5cbiAgLy8gc3RhdGVcbiAgcHJvbXB0U3RhdGUgPSAnJztcbiAgcGlja2VkU3RhdGU6IHN0cmluZ1tdID0gW107XG4gIHNoYXBlU3RhdGU6IEltYWdlU2hhcGUgPSAnMzo0JztcbiAgY291bnRTdGF0ZSA9IDQ7XG4gIG1vZGVsU3RhdGUgPSAnJztcbiAgdGFiU3RhdGU6ICdnYWxsZXJ5JyB8ICdzdHlsZXMnID0gJ2dhbGxlcnknO1xuXG4gIHZpZXc6ICdjcmVhdGUnIHwgJ2dhbGxlcnknIHwgJ3N0eWxlcycgPSAnY3JlYXRlJztcbiAgcnVuOiBSdW4gfCBudWxsID0gbnVsbDtcbiAgbWFkZTogR2VuZXJhdGVkSW1hZ2VbXSA9IFtdO1xuICBmcmVzaCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZWZzOiBHZW5lcmF0ZWRJbWFnZVtdID0gW107XG4gIHJhdGluZzogUmVjb3JkPHN0cmluZywgMSB8IC0xPiA9IHt9O1xuICB1cHBlZDogUmVjb3JkPHN0cmluZywgJ3VwJyB8ICd1cHBpbmcnPiA9IHt9O1xuICBsYjogeyBsaXN0OiBHZW5lcmF0ZWRJbWFnZVtdOyBrZXk6IHN0cmluZzsgZnJvbTogSFRNTEVsZW1lbnQgfCBudWxsOyBtaW5lOiBib29sZWFuIH0gfCBudWxsID0gbnVsbDtcbiAgc2FpZCA9ICcnO1xuICBydW5SYXRlOiAwIHwgMSB8IC0xID0gMDtcbiAgaGw6IHN0cmluZ1tdID0gW107XG4gIGZsYXNoOiB7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICBjb3BpZWQgPSBmYWxzZTtcbiAgcG9wOiAnc2V0JyB8ICdtb2RlbCcgfCBudWxsID0gbnVsbDtcbiAgZ3JpZCA9IHsgY29sczogMSwgcm93czogMSB9O1xuICBub2lzZSA9ICcnO1xuXG4gIHByaXZhdGUgcnVucyA9IDA7XG4gIHByaXZhdGUgdGltZXJzID0gbmV3IFNldDxSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4oKTtcbiAgcHJpdmF0ZSBybz86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIHBlbmRpbmdMYkZvY3VzID0gZmFsc2U7XG5cbiAgZ2V0IHBpY2tlZCgpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLnBpY2tlZFN0YXRlOyB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMucHJvbXB0U3RhdGUgPSB0aGlzLnByb21wdFN0YXRlIHx8IHRoaXMuZGVmYXVsdFByb21wdDtcbiAgICBpZiAoIXRoaXMucGlja2VkU3RhdGUubGVuZ3RoKSB0aGlzLnBpY2tlZFN0YXRlID0gWy4uLnRoaXMuZGVmYXVsdFNlbGVjdGVkU3R5bGVzXTtcbiAgICB0aGlzLnNoYXBlU3RhdGUgPSB0aGlzLnNoYXBlU3RhdGUgPz8gdGhpcy5kZWZhdWx0U2hhcGU7XG4gICAgdGhpcy5jb3VudFN0YXRlID0gdGhpcy5jb3VudFN0YXRlID8/IHRoaXMuZGVmYXVsdENvdW50O1xuICAgIHRoaXMubW9kZWxTdGF0ZSA9IHRoaXMubW9kZWxTdGF0ZSB8fCB0aGlzLmRlZmF1bHRNb2RlbCB8fCB0aGlzLm1vZGVscz8uWzBdPy5rZXkgfHwgJyc7XG4gICAgdGhpcy50YWJTdGF0ZSA9IHRoaXMudGFiU3RhdGUgPz8gdGhpcy5kZWZhdWx0VGFiO1xuICAgIHRoaXMubm9pc2UgPSBtYWtlR3JhaW4odGhpcy5tb3Rpb24ucmVkdWNlKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy50aW1lcnMuZm9yRWFjaCgodCkgPT4gY2xlYXJUaW1lb3V0KHQpKTtcbiAgICB0aGlzLnRpbWVycy5jbGVhcigpO1xuICAgIHRoaXMucm8/LmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWZ0ZXIobXM6IG51bWJlciwgZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCB0ID0gc2V0VGltZW91dCgoKSA9PiB7IHRoaXMudGltZXJzLmRlbGV0ZSh0KTsgZm4oKTsgfSwgdGhpcy5tb3Rpb24ucmVkdWNlKCkgPyBNYXRoLm1pbihtcywgMzApIDogbXMpO1xuICAgIHRoaXMudGltZXJzLmFkZCh0KTtcbiAgfVxuXG4gIC8vIC0tLS0tIGRlcml2ZWQgLS0tLS1cbiAgZ2V0IGJ1c3koKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5ydW4gJiYgdGhpcy5ydW4uc2xvdHMuc29tZSgocykgPT4geyBjb25zdCBzdCA9IHN0YXR1c09mKHMpOyByZXR1cm4gc3QgPT09ICd3YWl0JyB8fCBzdCA9PT0gJ2dlbic7IH0pO1xuICB9XG4gIGdldCBhbGwoKTogR2VuZXJhdGVkSW1hZ2VbXSB7IHJldHVybiBbLi4udGhpcy5tYWRlLCAuLi50aGlzLmdhbGxlcnldOyB9XG4gIGdldCBuKCk6IG51bWJlciB7IHJldHVybiB0aGlzLnJ1bj8uc2xvdHMubGVuZ3RoID8/IDA7IH1cbiAgZ2V0IG5Eb25lKCk6IG51bWJlciB7IHJldHVybiB0aGlzLnJ1bj8uc2xvdHMuZmlsdGVyKChzKSA9PiBzdGF0dXNPZihzKSA9PT0gJ2RvbmUnKS5sZW5ndGggPz8gMDsgfVxuICBnZXQgbkJhZCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5ydW4/LnNsb3RzLmZpbHRlcigocykgPT4gcy5lcnJvcikubGVuZ3RoID8/IDA7IH1cbiAgZ2V0IHBpY3MoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMubiA9PT0gMSA/ICdwaWN0dXJlJyA6IGAke3RoaXMubn0gcGljdHVyZXNgOyB9XG4gIGdldCBjYXBQaWNzKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnBpY3NbMF0udG9VcHBlckNhc2UoKSArIHRoaXMucGljcy5zbGljZSgxKTsgfVxuICBnZXQgbGl2ZSgpOiBTbG90W10geyByZXR1cm4gdGhpcy5ydW4gPyB0aGlzLnJ1bi5zbG90cy5maWx0ZXIoKHMpID0+ICFzLmVycm9yKSA6IFtdOyB9XG4gIGdldCB0b3RhbCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5saXZlLmxlbmd0aCA/IHRoaXMubGl2ZS5yZWR1Y2UoKGEsIHMpID0+IGEgKyBNYXRoLm1pbigxLCBzLnByb2dyZXNzKSwgMCkgLyB0aGlzLmxpdmUubGVuZ3RoIDogMDsgfVxuICBnZXQgcGN0VG90YWwoKTogbnVtYmVyIHsgcmV0dXJuIE1hdGgucm91bmQodGhpcy50b3RhbCAqIDEwMCk7IH1cbiAgZ2V0IHN0YWdlKCk6IG51bWJlciB7IHJldHVybiAhdGhpcy5idXN5ID8gMyA6IHRoaXMudG90YWwgPCAwLjMgPyAwIDogdGhpcy50b3RhbCA8IDAuOCA/IDEgOiAyOyB9XG4gIGdldCBzZWNzKCk6IG51bWJlciB7IHJldHVybiB0aGlzLnJ1biA/IE1hdGgubWF4KDEsIE1hdGgucm91bmQoKCh0aGlzLnJ1bi5kb25lID8/IHBlcmZvcm1hbmNlLm5vdygpKSAtIHRoaXMucnVuLnQwKSAvIDEwMDApKSA6IDA7IH1cbiAgZ2V0IG1vZGVsTGFiZWwoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMubW9kZWxzPy5maW5kKChtKSA9PiBtLmtleSA9PT0gdGhpcy5tb2RlbCk/LmxhYmVsID8/ICcnOyB9XG4gIGdldCBtb2RlbEljb24oKTogVm9JY29uTmFtZSB7IHJldHVybiB0aGlzLm1vZGVscz8uZmluZCgobSkgPT4gbS5rZXkgPT09IHRoaXMubW9kZWwpPy5pY29uID8/ICdzcGFyayc7IH1cbiAgZ2V0IHJ1bk1ldGEoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIFt0aGlzLm1vZGVsTGFiZWwsIHNoYXBlTmFtZSh0aGlzLnJ1bi5yYXRpbyksIHRoaXMucnVuLnJlcXVlc3Quc3R5bGVzLmpvaW4oJywgJykgfHwgJ05vIHN0eWxlJ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDCtyAnKTtcbiAgfVxuICBnZXQgZG9uZUxpc3QoKTogR2VuZXJhdGVkSW1hZ2VbXSB7XG4gICAgaWYgKCF0aGlzLnJ1bikgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHIgPSB0aGlzLnJ1bjtcbiAgICByZXR1cm4gci5zbG90cy5maWx0ZXIoKHMpID0+IHN0YXR1c09mKHMpID09PSAnZG9uZScgJiYgcy5pbWFnZSkubWFwKChzKSA9PiAoe1xuICAgICAgLi4ucy5pbWFnZSEsIHJhdGlvOiByLnJhdGlvLCBwcm9tcHQ6IHMuaW1hZ2UhLnByb21wdCA/PyByLnJlcXVlc3QucHJvbXB0LCBzdHlsZXM6IHMuaW1hZ2UhLnN0eWxlcyA/PyByLnJlcXVlc3Quc3R5bGVzLFxuICAgIH0pKTtcbiAgfVxuICBnZXQgY29scygpOiBHZW5lcmF0ZWRJbWFnZVtdW10ge1xuICAgIGNvbnN0IGNvbHM6IEdlbmVyYXRlZEltYWdlW11bXSA9IFtbXSwgW11dLCBoZ3QgPSBbMCwgMF07XG4gICAgdGhpcy5hbGwuZm9yRWFjaCgoaW0pID0+IHsgY29uc3QgayA9IGhndFswXSA8PSBoZ3RbMV0gPyAwIDogMTsgY29sc1trXS5wdXNoKGltKTsgaGd0W2tdICs9IDEgLyAoaW0ucmF0aW8gPz8gMSkgKyAwLjA2OyB9KTtcbiAgICByZXR1cm4gY29scztcbiAgfVxuICBnZXQgdGFiT3B0cygpOiB7IHZhbHVlOiAnZ2FsbGVyeScgfCAnc3R5bGVzJzsgbGFiZWw6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiBbeyB2YWx1ZTogJ2dhbGxlcnknLCBsYWJlbDogJ0dhbGxlcnknIH0sIC4uLih0aGlzLnByZXNldHMubGVuZ3RoID8gW3sgdmFsdWU6ICdzdHlsZXMnIGFzIGNvbnN0LCBsYWJlbDogJ1N0eWxlcycgfV0gOiBbXSldO1xuICB9XG4gIGdldCBsYkF0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLmxiID8gdGhpcy5sYi5saXN0LmZpbmRJbmRleCgoeCkgPT4geC5rZXkgPT09IHRoaXMubGIhLmtleSkgOiAtMTsgfVxuICBnZXQgbGJJbWcoKTogR2VuZXJhdGVkSW1hZ2UgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5sYiA/IHRoaXMubGIubGlzdFt0aGlzLmxiQXRdIDogdW5kZWZpbmVkOyB9XG5cbiAgaW1nQmcoaW0/OiBHZW5lcmF0ZWRJbWFnZSk6IHN0cmluZyB8IG51bGwgeyByZXR1cm4gYmcoaW0pID8/IG51bGw7IH1cbiAgcGN0KHM6IFNsb3QpOiBudW1iZXIgeyByZXR1cm4gTWF0aC5yb3VuZCgoTWF0aC5mbG9vcihNYXRoLm1pbigxLCBzLnByb2dyZXNzKSAqIDMwKSAvIDMwKSAqIDEwMCk7IH1cbiAgbWV0YU9mKGltOiBHZW5lcmF0ZWRJbWFnZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtzaGFwZU5hbWUoaW0ucmF0aW8gPz8gMSksIChpbS5zdHlsZXMgPz8gW10pLmpvaW4oJywgJykgfHwgJ05vIHN0eWxlJywgdGhpcy51cHBlZFtpbS5rZXldID09PSAndXAnID8gJ1Vwc2NhbGVkIDLDlycgOiAnJ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDCtyAnKTtcbiAgfVxuICBmbGFzaGVkKGlkOiBzdHJpbmcsIGljb246IFZvSWNvbk5hbWUpOiBWb0ljb25OYW1lIHsgcmV0dXJuIHRoaXMuZmxhc2g/LmlkID09PSBpZCA/ICdjaGVjaycgOiBpY29uOyB9XG4gIHByZXNldE9uKHA6IEltYWdlU3R5bGVQcmVzZXQpOiBib29sZWFuIHsgcmV0dXJuIHAuc3R5bGVzLmxlbmd0aCA9PT0gdGhpcy5waWNrZWQubGVuZ3RoICYmIHAuc3R5bGVzLmV2ZXJ5KChzKSA9PiB0aGlzLnBpY2tlZC5pbmNsdWRlcyhzKSk7IH1cbiAgZG9uZUltZyhzOiBTbG90KTogR2VuZXJhdGVkSW1hZ2UgfCB1bmRlZmluZWQgeyByZXR1cm4gcy5pbWFnZSA/IHRoaXMuZG9uZUxpc3QuZmluZCgoeCkgPT4geC5rZXkgPT09IHMuaW1hZ2UhLmtleSkgOiB1bmRlZmluZWQ7IH1cblxuICAvKiB0aGUgZWZmZWN0LCBmcm9tIGhvdyBmYXIgYSBwaWN0dXJlIGhhcyBjb21lLiBQcm9ncmVzcyBtb3ZlcyBpbiB0aGUgc3RlcHMgYW4gaW1hZ2UgbW9kZWwgdGFrZXMgKDMwIG9mIHRoZW0pLiAqL1xuICBsb29rKHM6IFNsb3QpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+IHtcbiAgICBjb25zdCByID0gdGhpcy5ydW47IGlmICghcikgcmV0dXJuIHt9O1xuICAgIGNvbnN0IHN0ID0gc3RhdHVzT2YocyksIHAgPSBNYXRoLmZsb29yKE1hdGgubWluKDEsIHMucHJvZ3Jlc3MpICogMzApIC8gMzA7XG4gICAgY29uc3QgdjogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPiA9IHsgJy0tdm8tYXInOiByLnJhdGlvLCAnLS12by1hcnQnOiBzLmltYWdlPy5wbGFjZWhvbGRlciA/PyAnbm9uZScgfTtcbiAgICBpZiAoc3QgPT09ICd3YWl0JykgT2JqZWN0LmFzc2lnbih2LCB7ICctLXZvLXNjJzogMCwgJy0tdm8tZ3InOiAwLjUgfSk7XG4gICAgaWYgKHN0ID09PSAnZ2VuJyB8fCBzdCA9PT0gJ2ZhaWwnKSB7XG4gICAgICBjb25zdCBhID0gTWF0aC5taW4oMSwgcCAvIDAuMyksIGIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAocCAtIDAuMykgLyAwLjUyKSksIHNjID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKHAgLSAwLjM0KSAvIDAuNDYpKSwgdSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChwIC0gMC44KSAvIDAuMikpO1xuICAgICAgT2JqZWN0LmFzc2lnbih2LCB7XG4gICAgICAgICctLXZvLWNlbGwnOiAnMTJweCcsICctLXZvLWRvdCc6IGAke2EgPj0gMSA/IDEyIDogMSArIGEgKiA3LjV9cHhgLCAnLS12by1zcSc6IGAke2EgPj0gMSA/IDEyIDogMiArIGEgKiA5fXB4YCwgJy0tdm8tYmwnOiBgJHsxOCAtIGIgKiAxNH1weGAsXG4gICAgICAgICctLXZvLXNjJzogc2MsICctLXZvLWxvJzogc2MgPiAwICYmIHNjIDwgMSA/IDEgOiAwLCAnLS12by1zYic6IGAkezMgKiAoMSAtIHUpfXB4YCwgJy0tdm8tZ3InOiAwLjUgKiAoMSAtIHApLCAnLS12by1zdHAnOiAnMjAwbXMnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChzdCA9PT0gJ2RvbmUnKSBPYmplY3QuYXNzaWduKHYsIHsgJy0tdm8tc2MnOiAxLCAnLS12by1zYic6ICcwcHgnLCAnLS12by1ncic6IDAsICctLXZvLWxvJzogMCwgJy0tdm8tc3RwJzogJzQ1MG1zJyB9KTtcbiAgICByZXR1cm4gdjtcbiAgfVxuXG4gIC8vIC0tLS0tIGNvbnRyb2xsYWJsZSBzZXR0ZXJzIC0tLS0tXG4gIHByaXZhdGUgc2V0UHJvbXB0KHY6IHN0cmluZyk6IHZvaWQgeyBpZiAodGhpcy5wcm9tcHRTdGF0ZSAhPT0gdikgeyB0aGlzLnByb21wdFN0YXRlID0gdjsgdGhpcy5wcm9tcHRDaGFuZ2UuZW1pdCh2KTsgfSB9XG4gIHByaXZhdGUgc2V0UGlja2VkKHY6IHN0cmluZ1tdKTogdm9pZCB7IHRoaXMucGlja2VkU3RhdGUgPSB2OyB0aGlzLnNlbGVjdGVkU3R5bGVzQ2hhbmdlLmVtaXQodik7IH1cbiAgc2V0U2hhcGUodjogSW1hZ2VTaGFwZSk6IHZvaWQgeyB0aGlzLnNoYXBlU3RhdGUgPSB2OyB0aGlzLnNoYXBlQ2hhbmdlLmVtaXQodik7IH1cbiAgc2V0Q291bnQodjogbnVtYmVyKTogdm9pZCB7IHRoaXMuY291bnRTdGF0ZSA9IHY7IHRoaXMuY291bnRDaGFuZ2UuZW1pdCh2KTsgfVxuICBwaWNrTW9kZWwoa2V5OiBzdHJpbmcpOiB2b2lkIHsgdGhpcy5tb2RlbFN0YXRlID0ga2V5OyB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQoa2V5KTsgdGhpcy5wb3AgPSBudWxsOyB9XG4gIHNob3dUYWIodDogJ2dhbGxlcnknIHwgJ3N0eWxlcycpOiB2b2lkIHsgdGhpcy50YWJTdGF0ZSA9IHQ7IHRoaXMudGFiQ2hhbmdlLmVtaXQodCk7IH1cbiAgc2hvd1ZpZXcodjogJ2NyZWF0ZScgfCAnZ2FsbGVyeScgfCAnc3R5bGVzJyk6IHZvaWQgeyB0aGlzLnZpZXcgPSB2OyBpZiAodiAhPT0gJ2NyZWF0ZScpIHRoaXMuc2hvd1RhYih2KTsgfVxuXG4gIG9uUHJvbXB0KGU6IEV2ZW50KTogdm9pZCB7IHRoaXMuc2V0UHJvbXB0KChlLnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50KS52YWx1ZSk7IH1cbiAgb25LZXkoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyAmJiAhZS5zaGlmdEtleSAmJiAhKGUgYXMgdW5rbm93biBhcyB7IGlzQ29tcG9zaW5nOiBib29sZWFuIH0pLmlzQ29tcG9zaW5nKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy5kb0dlbmVyYXRlKCk7IH1cbiAgfVxuICBzdWJtaXQoZTogRXZlbnQpOiB2b2lkIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLmRvR2VuZXJhdGUoKTsgfVxuICB0b2dnbGVQb3AocDogJ3NldCcgfCAnbW9kZWwnKTogdm9pZCB7IHRoaXMucG9wID0gdGhpcy5wb3AgPT09IHAgPyBudWxsIDogcDsgfVxuXG4gIC8vIC0tLS0tIHRoZSBydW4gLS0tLS1cbiAgcHJpdmF0ZSB1cGRhdGUoaWQ6IG51bWJlciwgbWFwOiAoc2xvdDogbnVtYmVyKSA9PiBudW1iZXIpOiAoc2xvdDogbnVtYmVyLCB1OiBHZW5lcmF0aW9uVXBkYXRlKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gKHNsb3QsIHUpID0+IHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLnJ1bjsgaWYgKCFyIHx8IHIuaWQgIT09IGlkKSByZXR1cm47XG4gICAgICBjb25zdCBpID0gbWFwKHNsb3QpLCBzID0gci5zbG90c1tpXTsgaWYgKCFzKSByZXR1cm47XG4gICAgICBpZiAodS5wcm9ncmVzcyAhPSBudWxsKSBzLnByb2dyZXNzID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdS5wcm9ncmVzcykpO1xuICAgICAgaWYgKHUuaW1hZ2UpIHMuaW1hZ2UgPSB1LmltYWdlO1xuICAgICAgaWYgKHUuZXJyb3IpIHMuZXJyb3IgPSB1LmVycm9yO1xuICAgICAgdGhpcy5hZnRlclVwZGF0ZSgpO1xuICAgIH07XG4gIH1cbiAgcHJpdmF0ZSBhZnRlclVwZGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCByID0gdGhpcy5ydW47IGlmICghcikgcmV0dXJuO1xuICAgIC8vIGEgZmluaXNoZWQgcGljdHVyZSBqb2lucyB0aGUgZ2FsbGVyeSwgYXQgdGhlIHRvcFxuICAgIGNvbnN0IHJlYWR5ID0gci5zbG90cy5maWx0ZXIoKHMpID0+IHN0YXR1c09mKHMpID09PSAnZG9uZScgJiYgcy5pbWFnZSAmJiAhdGhpcy5tYWRlLnNvbWUoKG0pID0+IG0ua2V5ID09PSBzLmltYWdlIS5rZXkpKVxuICAgICAgLm1hcCgocykgPT4gKHsgLi4ucy5pbWFnZSEsIHJhdGlvOiByLnJhdGlvLCBwcm9tcHQ6IHMuaW1hZ2UhLnByb21wdCA/PyByLnJlcXVlc3QucHJvbXB0LCBzdHlsZXM6IHMuaW1hZ2UhLnN0eWxlcyA/PyByLnJlcXVlc3Quc3R5bGVzIH0pKTtcbiAgICBpZiAocmVhZHkubGVuZ3RoKSB7IHRoaXMubWFkZSA9IFsuLi5yZWFkeSwgLi4udGhpcy5tYWRlXTsgdGhpcy5mcmVzaCA9IG5ldyBTZXQocmVhZHkubWFwKCh4KSA9PiB4LmtleSkpOyB0aGlzLmFmdGVyKDcwMCwgKCkgPT4geyB0aGlzLmZyZXNoID0gbmV3IFNldCgpOyB9KTsgfVxuICAgIGlmICghdGhpcy5idXN5ICYmIHIuc2xvdHMubGVuZ3RoICYmICFyLmRvbmUpIHIuZG9uZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIHRoaXMuYW5ub3VuY2UoKTtcbiAgfVxuICBwcml2YXRlIGFubm91bmNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ydW4pIHJldHVybjtcbiAgICB0aGlzLnNhaWQgPSB0aGlzLnN0YWdlIDwgMyA/IGAke1NUQUdFU1t0aGlzLnN0YWdlXX0sICR7dGhpcy5waWNzfWBcbiAgICAgIDogdGhpcy5uQmFkID8gYCR7dGhpcy5uRG9uZX0gb2YgJHt0aGlzLm59IHJlYWR5LCAke3RoaXMubkJhZH0gZmFpbGVkLiBSZXRyeSBpcyBvbiB0aGUgZmFpbGVkIG9uZWBcbiAgICAgIDogYCR7dGhpcy5uID09PSAxID8gJ1BpY3R1cmUnIDogdGhpcy5waWNzfSByZWFkeWA7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0KHJlcXVlc3Q6IEdlbmVyYXRlUmVxdWVzdCwgcmF0aW86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucG9wID0gbnVsbDsgdGhpcy5sYiA9IG51bGw7XG4gICAgY29uc3QgaWQgPSArK3RoaXMucnVucztcbiAgICB0aGlzLnJ1biA9IHsgaWQsIHJlcXVlc3QsIHJhdGlvLCBzbG90czogQXJyYXkuZnJvbSh7IGxlbmd0aDogcmVxdWVzdC5jb3VudCB9LCAoXywgaSkgPT4gKHsga2V5OiBgJHtpZH0tJHtpfWAsIHByb2dyZXNzOiAwIH0pKSwgdDA6IHBlcmZvcm1hbmNlLm5vdygpIH07XG4gICAgdGhpcy5ydW5SYXRlID0gMDtcbiAgICB0aGlzLmFubm91bmNlKCk7XG4gICAgdGhpcy5vYnNlcnZlVGlsZXMoKTtcbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZSh0aGlzLmdlbmVyYXRlPy4ocmVxdWVzdCwgdGhpcy51cGRhdGUoaWQsIChzKSA9PiBzKSkpLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxuICBwcml2YXRlIGRvR2VuZXJhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMucHJvbXB0LnRyaW0oKTsgaWYgKCF0ZXh0IHx8IHRoaXMuYnVzeSkgcmV0dXJuO1xuICAgIHRoaXMuc3RhcnQoeyBwcm9tcHQ6IHRleHQsIHN0eWxlczogdGhpcy5waWNrZWQsIHNoYXBlOiB0aGlzLnNoYXBlLCBjb3VudDogdGhpcy5jb3VudCwgbW9kZWw6IHRoaXMubW9kZWwsIHJlZmVyZW5jZXM6IHRoaXMucmVmcyB9LCBTSEFQRVNbdGhpcy5zaGFwZV0pO1xuICB9XG4gIHJldHJ5KGk6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHIgPSB0aGlzLnJ1bjsgaWYgKCFyKSByZXR1cm47XG4gICAgY29uc3QgcyA9IHIuc2xvdHNbaV07IHMucHJvZ3Jlc3MgPSAwOyBzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2FpZCA9IGBNYWtpbmcgcGljdHVyZSAke2kgKyAxfSBhZ2FpbmA7XG4gICAgdm9pZCBQcm9taXNlLnJlc29sdmUodGhpcy5nZW5lcmF0ZT8uKHsgLi4uci5yZXF1ZXN0LCBjb3VudDogMSwgcmV0cnk6IGkgfSwgdGhpcy51cGRhdGUoci5pZCwgKCkgPT4gaSkpKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cbiAgdmFyeShpbTogR2VuZXJhdGVkSW1hZ2UpOiB2b2lkIHtcbiAgICB0aGlzLnNhaWQgPSAnTWFraW5nIGEgdmFyaWF0aW9uJztcbiAgICB0aGlzLnN0YXJ0KHsgcHJvbXB0OiBpbS5wcm9tcHQgPz8gdGhpcy5wcm9tcHQsIHN0eWxlczogaW0uc3R5bGVzID8/IHRoaXMucGlja2VkLCBzaGFwZTogdGhpcy5zaGFwZSwgY291bnQ6IDEsIG1vZGVsOiB0aGlzLm1vZGVsLCByZWZlcmVuY2VzOiB0aGlzLnJlZnMsIHZhcmlhdGlvbk9mOiBpbSB9LCBpbS5yYXRpbyA/PyBTSEFQRVNbdGhpcy5zaGFwZV0pO1xuICB9XG4gIHVwc2NhbGUoaW06IEdlbmVyYXRlZEltYWdlKTogdm9pZCB7XG4gICAgdGhpcy51cHBlZCA9IHsgLi4udGhpcy51cHBlZCwgW2ltLmtleV06ICd1cHBpbmcnIH07IHRoaXMuc2FpZCA9ICdVcHNjYWxpbmcnO1xuICAgIHRoaXMuYWN0aW9uLmVtaXQoeyBhY3Rpb246ICd1cHNjYWxlJywgaW1hZ2U6IGltIH0pO1xuICAgIHRoaXMuYWZ0ZXIoMTcwMCwgKCkgPT4geyB0aGlzLnVwcGVkID0geyAuLi50aGlzLnVwcGVkLCBbaW0ua2V5XTogJ3VwJyB9OyB0aGlzLnNhaWQgPSAnVXBzY2FsZWQgdG8gdHdpY2UgdGhlIHNpemUnOyB9KTtcbiAgfVxuICBwcml2YXRlIG5vdGUoaWQ6IHN0cmluZywgbGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmxhc2ggPSB7IGlkLCBsYWJlbCB9OyB0aGlzLnNhaWQgPSBsYWJlbDtcbiAgICB0aGlzLmFmdGVyKDE2MDAsICgpID0+IHsgaWYgKHRoaXMuZmxhc2g/LmlkID09PSBpZCkgdGhpcy5mbGFzaCA9IG51bGw7IH0pO1xuICB9XG4gIGRvd25sb2FkKGltOiBHZW5lcmF0ZWRJbWFnZSwgaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChpbS5zcmMpIHsgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsgYS5ocmVmID0gaW0uc3JjOyBhLmRvd25sb2FkID0gJyc7IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7IGEuY2xpY2soKTsgYS5yZW1vdmUoKTsgfVxuICAgIHRoaXMuYWN0aW9uLmVtaXQoeyBhY3Rpb246ICdkb3dubG9hZCcsIGltYWdlOiBpbSB9KTtcbiAgICB0aGlzLm5vdGUoaWQsIGltLnNyYyA/ICdEb3dubG9hZGluZycgOiAnTm8gZmlsZSB0byBkb3dubG9hZCcpO1xuICB9XG4gIHByaXZhdGUgcmVmZXJlbmNlKGltOiBHZW5lcmF0ZWRJbWFnZSwgbWluZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZWZzLmluY2x1ZGVzKGltKSkgdGhpcy5yZWZzID0gWy4uLnRoaXMucmVmcy5zbGljZSgtMiksIGltXTtcbiAgICB0aGlzLnNhaWQgPSAnQWRkZWQgYXMgYSByZWZlcmVuY2UnOyB0aGlzLmFjdGlvbi5lbWl0KHsgYWN0aW9uOiAncmVmZXJlbmNlJywgaW1hZ2U6IGltIH0pO1xuICAgIGlmIChtaW5lKSB0aGlzLmFmdGVyKDAsICgpID0+IHRoaXMudGE/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pKTtcbiAgfVxuICB1c2VBc1JlZihpbTogR2VuZXJhdGVkSW1hZ2UpOiB2b2lkIHsgdGhpcy5jbG9zZUxiKGZhbHNlKTsgdGhpcy5yZWZlcmVuY2UoaW0sIHRydWUpOyB9XG4gIHJlbW92ZVJlZihpbTogR2VuZXJhdGVkSW1hZ2UpOiB2b2lkIHsgdGhpcy5yZWZzID0gdGhpcy5yZWZzLmZpbHRlcigoeCkgPT4geCAhPT0gaW0pOyB0aGlzLnNhaWQgPSAnUmVmZXJlbmNlIHJlbW92ZWQnOyB0aGlzLnRhPy5uYXRpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTsgfVxuICByYXRlKGltOiBHZW5lcmF0ZWRJbWFnZSwgdjogMSB8IC0xKTogdm9pZCB7XG4gICAgY29uc3Qgb24gPSB0aGlzLnJhdGluZ1tpbS5rZXldICE9PSB2O1xuICAgIGNvbnN0IHggPSB7IC4uLnRoaXMucmF0aW5nIH07IGlmIChvbikgeFtpbS5rZXldID0gdjsgZWxzZSBkZWxldGUgeFtpbS5rZXldOyB0aGlzLnJhdGluZyA9IHg7XG4gICAgdGhpcy5zYWlkID0gb24gPyAodiA9PT0gMSA/ICdNYXJrZWQgYXMgZ29vZCcgOiAnTWFya2VkIGFzIGJhZCcpIDogJ1JhdGluZyByZW1vdmVkJztcbiAgICBpZiAob24pIHRoaXMuYWN0aW9uLmVtaXQoeyBhY3Rpb246IHYgPT09IDEgPyAnbGlrZScgOiAnZGlzbGlrZScsIGltYWdlOiBpbSB9KTtcbiAgfVxuICByYXRlUnVuKHY6IDEgfCAtMSk6IHZvaWQge1xuICAgIGNvbnN0IG9uID0gdGhpcy5ydW5SYXRlICE9PSB2OyB0aGlzLnJ1blJhdGUgPSBvbiA/IHYgOiAwO1xuICAgIHRoaXMuc2FpZCA9IG9uID8gKHYgPT09IDEgPyAnTWFya2VkIGFzIGdvb2QnIDogJ01hcmtlZCBhcyBiYWQnKSA6ICdSYXRpbmcgcmVtb3ZlZCc7XG4gIH1cbiAgY29weVByb21wdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucnVuKSByZXR1cm47XG4gICAgdm9pZCBuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQodGhpcy5ydW4ucmVxdWVzdC5wcm9tcHQpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB0aGlzLmFjdGlvbi5lbWl0KHsgYWN0aW9uOiAnY29weScsIGltYWdlOiB0aGlzLnJ1bi5zbG90c1swXT8uaW1hZ2UgPz8geyBrZXk6ICcnLCBhbHQ6ICcnIH0gfSk7XG4gICAgdGhpcy5jb3BpZWQgPSB0cnVlOyB0aGlzLnNhaWQgPSAnUHJvbXB0IGNvcGllZCc7XG4gICAgdGhpcy5hZnRlcigxNjAwLCAoKSA9PiB7IHRoaXMuY29waWVkID0gZmFsc2U7IH0pO1xuICB9XG4gIHRvZ2dsZVN0eWxlKHM6IHN0cmluZyk6IHZvaWQgeyB0aGlzLnNldFBpY2tlZCh0aGlzLnBpY2tlZC5pbmNsdWRlcyhzKSA/IHRoaXMucGlja2VkLmZpbHRlcigoeCkgPT4geCAhPT0gcykgOiBbLi4udGhpcy5waWNrZWQsIHNdKTsgfVxuICBwaWNrUHJlc2V0KHA6IEltYWdlU3R5bGVQcmVzZXQpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5zdHlsZXMuZmlsdGVyKChzKSA9PiB0aGlzLnBpY2tlZC5pbmNsdWRlcyhzKSAhPT0gcC5zdHlsZXMuaW5jbHVkZXMocykpO1xuICAgIHRoaXMuc2V0UGlja2VkKHRoaXMuc3R5bGVzLmZpbHRlcigocykgPT4gcC5zdHlsZXMuaW5jbHVkZXMocykpKTsgdGhpcy5obCA9IGNoYW5nZWQ7IHRoaXMuYWZ0ZXIoNzAwLCAoKSA9PiB7IHRoaXMuaGwgPSBbXTsgfSk7XG4gICAgdGhpcy5zYWlkID0gYCR7cC5sYWJlbH06ICR7cC5zdHlsZXMuam9pbignIGFuZCAnKX1gO1xuICAgIGlmICh0aGlzLnZpZXcgIT09ICdjcmVhdGUnKSB0aGlzLnNob3dWaWV3KCdjcmVhdGUnKTtcbiAgfVxuXG4gIC8vIC0tLS0tIHRoZSBsYXJnZXIgdmlldyAtLS0tLVxuICBvcGVuRnJvbVRpbGUoczogU2xvdCwgZTogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoc3RhdHVzT2YocykgIT09ICdkb25lJyB8fCAhcy5pbWFnZSkgcmV0dXJuO1xuICAgIGNvbnN0IGltID0gdGhpcy5kb25lTGlzdC5maW5kKCh4KSA9PiB4LmtleSA9PT0gcy5pbWFnZSEua2V5KTsgaWYgKCFpbSkgcmV0dXJuO1xuICAgIHRoaXMub3Blbih0aGlzLmRvbmVMaXN0LCBpbS5rZXksIGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCwgZS5pc1RydXN0ZWQpO1xuICB9XG4gIG9wZW5HYWxsZXJ5KGltOiBHZW5lcmF0ZWRJbWFnZSwgZTogRXZlbnQpOiB2b2lkIHsgdGhpcy5vcGVuKHRoaXMuYWxsLCBpbS5rZXksIGUuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7IH1cbiAgcHJpdmF0ZSBvcGVuKGxpc3Q6IEdlbmVyYXRlZEltYWdlW10sIGtleTogc3RyaW5nLCBmcm9tOiBIVE1MRWxlbWVudCB8IG51bGwsIG1pbmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnBvcCA9IG51bGw7IHRoaXMubGIgPSB7IGxpc3QsIGtleSwgZnJvbSwgbWluZSB9O1xuICAgIGlmIChtaW5lKSB7IHRoaXMucGVuZGluZ0xiRm9jdXMgPSB0cnVlOyB0aGlzLmFmdGVyKDAsICgpID0+IHRoaXMuZm9jdXNMYigpKTsgfVxuICB9XG4gIHByaXZhdGUgZm9jdXNMYigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVuZGluZ0xiRm9jdXMpIHJldHVybjsgdGhpcy5wZW5kaW5nTGJGb2N1cyA9IGZhbHNlO1xuICAgIHRoaXMubGJFbD8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignLnZvLWlneC1sYngnKT8uZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xuICB9XG4gIGNsb3NlTGIoYmFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGZyb20gPSB0aGlzLmxiPy5mcm9tOyB0aGlzLmxiID0gbnVsbDtcbiAgICBpZiAoYmFjayAmJiBmcm9tPy5pc0Nvbm5lY3RlZCkgZnJvbS5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gIH1cbiAgc3RlcChkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubGIpIHJldHVybjsgY29uc3QgaSA9IHRoaXMubGJBdCArIGQ7XG4gICAgaWYgKGkgPj0gMCAmJiBpIDwgdGhpcy5sYi5saXN0Lmxlbmd0aCkgdGhpcy5sYiA9IHsgLi4udGhpcy5sYiwga2V5OiB0aGlzLmxiLmxpc3RbaV0ua2V5IH07XG4gIH1cbiAgbGJLZXlzKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubGIpIHJldHVybjtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgdGhpcy5jbG9zZUxiKHRydWUpOyByZXR1cm47IH1cbiAgICBpZiAoKGUua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSAmJiAhKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KCcudm8taWd4LWxiZicpKSB7IGUucHJldmVudERlZmF1bHQoKTsgdGhpcy5zdGVwKGUua2V5ID09PSAnQXJyb3dMZWZ0JyA/IC0xIDogMSk7IHJldHVybjsgfVxuICAgIGlmIChlLmtleSA9PT0gJ1RhYicpIHtcbiAgICAgIGNvbnN0IGYgPSBBcnJheS5mcm9tKHRoaXMubGJFbD8ubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uOm5vdCg6ZGlzYWJsZWQpJykgPz8gW10pLCBhID0gZlswXSwgeiA9IGZbZi5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChlLnNoaWZ0S2V5ICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGEpIHsgZS5wcmV2ZW50RGVmYXVsdCgpOyB6Py5mb2N1cygpOyB9XG4gICAgICBlbHNlIGlmICghZS5zaGlmdEtleSAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB6KSB7IGUucHJldmVudERlZmF1bHQoKTsgYT8uZm9jdXMoKTsgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHRoZSBwaWN0dXJlcyBzaGFyZSB0aGUgcm9vbSwgYXMgbGFyZ2UgYXMgdGhlaXIgc2hhcGUgYW5kIG51bWJlciBhbGxvd1xuICBwcml2YXRlIG9ic2VydmVUaWxlcygpOiB2b2lkIHtcbiAgICB0aGlzLnJvPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5hZnRlcigwLCAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMudGlsZXM/Lm5hdGl2ZUVsZW1lbnQ7IGlmICghZWwpIHJldHVybjtcbiAgICAgIGNvbnN0IGZpdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgciA9IHRoaXMucnVuOyBpZiAoIXIpIHJldHVybjtcbiAgICAgICAgY29uc3QgVyA9IGVsLmNsaWVudFdpZHRoLCBIID0gZWwuY2xpZW50SGVpZ2h0LCBrID0gci5zbG90cy5sZW5ndGgsIGcgPSA4O1xuICAgICAgICBsZXQgYmVzdCA9IHsgY29sczogMSwgcm93czogMSwgdzogLTEsIGdhcDogayB9O1xuICAgICAgICBmb3IgKGxldCBjb2xzID0gMTsgY29scyA8PSBrOyBjb2xzKyspIHtcbiAgICAgICAgICBjb25zdCByb3dzID0gTWF0aC5jZWlsKGsgLyBjb2xzKSwgdyA9IE1hdGgubWluKChXIC0gKGNvbHMgLSAxKSAqIGcpIC8gY29scywgKEggLSAocm93cyAtIDEpICogZykgLyByb3dzICogci5yYXRpbyksIGdhcCA9IGNvbHMgKiByb3dzIC0gaztcbiAgICAgICAgICBpZiAodyA+IGJlc3QudyArIDAuNSB8fCAodyA+IGJlc3QudyAtIDAuNSAmJiBnYXAgPD0gYmVzdC5nYXApKSBiZXN0ID0geyBjb2xzLCByb3dzLCB3LCBnYXAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncmlkLmNvbHMgIT09IGJlc3QuY29scyB8fCB0aGlzLmdyaWQucm93cyAhPT0gYmVzdC5yb3dzKSB0aGlzLmdyaWQgPSB7IGNvbHM6IGJlc3QuY29scywgcm93czogYmVzdC5yb3dzIH07XG4gICAgICB9O1xuICAgICAgZml0KCk7XG4gICAgICB0aGlzLnJvID0gbmV3IFJlc2l6ZU9ic2VydmVyKGZpdCk7IHRoaXMucm8ub2JzZXJ2ZShlbCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==