@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,374 @@
1
+ // framework/angular/web-search/web-search.component.ts
2
+ //
3
+ // Native Angular port of framework/react/web-search/WebSearch.tsx.
4
+ // The agent's web searches as a trail: each query and what came back, each page
5
+ // read, skimmed or skipped and why, a summary once done, and an answer whose
6
+ // citations light their pages. Inputs mirror the React props; the open-state
7
+ // callback becomes an @Output() EventEmitter.
8
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core';
9
+ import { VoIconComponent } from '../core/icon.component';
10
+ import * as i0 from "@angular/core";
11
+ const STATUS = {
12
+ reading: ['Reading', ''],
13
+ read: ['Read', ''],
14
+ skimmed: ['Skimmed', ''],
15
+ paywall: ['Skipped: paywall', 'vo-warn'],
16
+ blocked: ['Skipped: blocked', 'vo-warn'],
17
+ timeout: ['Skipped: timeout', 'vo-warn'],
18
+ };
19
+ /** The agent's web searches as a trail, with an answer whose citations light their pages. */
20
+ export class WebSearchComponent {
21
+ constructor() {
22
+ this.queries = [];
23
+ /** True once searching and reading are over: the trail folds to its summary. */
24
+ this.done = false;
25
+ /** Without the panel, for a chat stream. */
26
+ this.bare = true;
27
+ this.openChange = new EventEmitter();
28
+ this.STATUS = STATUS;
29
+ this.hot = null;
30
+ this.said = '';
31
+ this.controlled = false;
32
+ this.inner = true;
33
+ this.qOpen = {};
34
+ this.lastSaid = '';
35
+ }
36
+ /** Whether the trail is open. Left out, it folds once done turns true. */
37
+ set open(value) {
38
+ this.controlled = value !== undefined;
39
+ if (value !== undefined)
40
+ this.inner = value;
41
+ }
42
+ get isOpen() {
43
+ return this.inner;
44
+ }
45
+ get flatPages() {
46
+ return this.queries.flatMap((q) => (q.pages ?? []).map((p) => ({ ...p, q: q.key })));
47
+ }
48
+ get sites() {
49
+ return [...new Set(this.flatPages.map((p) => p.domain))];
50
+ }
51
+ get marks() {
52
+ return this.sites.slice(0, 4);
53
+ }
54
+ get line() {
55
+ const read = this.flatPages.filter((p) => p.status === 'read' || p.status === 'skimmed').length;
56
+ if (this.done)
57
+ return `${this.queries.length} searches, ${read} pages read`;
58
+ const current = this.queries.find((q) => q.status === 'searching');
59
+ if (current)
60
+ return `Searching for “${current.query}”`;
61
+ const reading = this.flatPages.filter((p) => p.status === 'reading').length;
62
+ if (reading)
63
+ return `Reading ${reading} pages`;
64
+ return 'Searching the web';
65
+ }
66
+ get hotPage() {
67
+ return this.hot != null ? this.flatPages.find((p) => p.cite === this.hot) : undefined;
68
+ }
69
+ get answerParts() {
70
+ if (!this.answer)
71
+ return [];
72
+ return this.answer.split(/(\[\d+\])/).map((part) => {
73
+ const m = part.match(/^\[(\d+)\]$/);
74
+ return m ? { cite: +m[1] } : { text: part };
75
+ });
76
+ }
77
+ hasPages(q) {
78
+ return !!q.pages?.length;
79
+ }
80
+ isQOpen(q) {
81
+ if (!this.hasPages(q))
82
+ return false;
83
+ const auto = q.pages?.some((p) => p.status === 'reading') ?? false;
84
+ return this.qOpen[q.key] ?? auto;
85
+ }
86
+ isSkip(p) {
87
+ return p.status !== 'read' && p.status !== 'skimmed' && p.status !== 'reading';
88
+ }
89
+ qLabel(q) {
90
+ if (q.status !== 'done')
91
+ return null;
92
+ const res = q.results ? `${q.results} results` : 'no results';
93
+ return `${q.query}: ${res}${q.time ? ', ' + q.time : ''}`;
94
+ }
95
+ pageLabel(p) {
96
+ return `${p.title}, ${p.domain}${p.date ? ', ' + p.date : ''}: ${STATUS[p.status][0]}`;
97
+ }
98
+ citeLabel(n) {
99
+ if (n === undefined)
100
+ return '';
101
+ const p = this.flatPages.find((x) => x.cite === n);
102
+ return p ? `Source ${n}: ${p.title}, ${p.domain}` : `Source ${n}`;
103
+ }
104
+ toggle() {
105
+ this.setOpen(!this.inner);
106
+ }
107
+ toggleQ(q) {
108
+ if (!this.hasPages(q))
109
+ return;
110
+ this.qOpen = { ...this.qOpen, [q.key]: !this.isQOpen(q) };
111
+ }
112
+ setOpen(o) {
113
+ if (!this.controlled)
114
+ this.inner = o;
115
+ this.openChange.emit(o);
116
+ }
117
+ ngOnChanges(changes) {
118
+ if (changes['done'] && this.done && !this.controlled) {
119
+ this.inner = false;
120
+ }
121
+ // only changes of phase are announced
122
+ const current = this.queries.find((q) => q.status === 'searching');
123
+ const next = this.done ? `Done: ${this.line}` : current ? `Searching for ${current.query}` : '';
124
+ if (next && next !== this.lastSaid) {
125
+ this.lastSaid = next;
126
+ this.said = next;
127
+ }
128
+ }
129
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
130
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: WebSearchComponent, isStandalone: true, selector: "vo-web-search", inputs: { queries: "queries", done: "done", answer: "answer", open: "open", bare: "bare" }, outputs: { openChange: "openChange" }, usesOnChanges: true, ngImport: i0, template: `
131
+ <div
132
+ data-vo=""
133
+ class="vo-wsx"
134
+ [class.vo-panel]="!bare"
135
+ [style.paddingInline]="bare ? '0' : null"
136
+ >
137
+ <button type="button" class="vo-wsx-h" [attr.aria-expanded]="isOpen" (click)="toggle()">
138
+ <span class="vo-wsx-ic">
139
+ @if (done) {
140
+ <vo-icon name="globe" size="xs"></vo-icon>
141
+ } @else {
142
+ <span class="vo-spin" aria-hidden="true"></span>
143
+ }
144
+ </span>
145
+ <span class="vo-wsx-st vo-sw" [class.vo-shim]="!done">{{ line }}</span>
146
+ <span class="vo-wsx-marks" aria-hidden="true">
147
+ @for (s of marks; track s) {
148
+ <span [class.vo-hl]="hotPage?.domain === s">{{ s[0].toUpperCase() }}</span>
149
+ }
150
+ @if (sites.length > 4) {
151
+ <span class="vo-n">+{{ sites.length - 4 }}</span>
152
+ }
153
+ </span>
154
+ <vo-icon name="chev-d" size="xs"></vo-icon>
155
+ </button>
156
+
157
+ <div class="vo-fold vo-wsx-fold" [class.vo-shut]="!isOpen" [attr.inert]="isOpen ? null : ''">
158
+ <div>
159
+ <div class="vo-wsx-list">
160
+ @for (q of queries; track q.key) {
161
+ <div
162
+ class="vo-wsx-q vo-enter"
163
+ [class.vo-hl]="hotPage && hotPage.q === q.key && !isQOpen(q)"
164
+ >
165
+ <button
166
+ type="button"
167
+ class="vo-wsx-qh"
168
+ [class.vo-empty]="!hasPages(q)"
169
+ [attr.aria-expanded]="isQOpen(q)"
170
+ [attr.aria-label]="qLabel(q)"
171
+ (click)="toggleQ(q)"
172
+ >
173
+ <vo-icon name="search" size="xs"></vo-icon>
174
+ <span class="vo-t" [class.vo-shim]="q.status === 'searching'">{{ q.query }}</span>
175
+ <span class="vo-n" [class.vo-none]="q.status === 'done' && !q.results">{{
176
+ q.status === 'searching' ? 'Searching' : q.results ? q.results + ' results' : 'No results'
177
+ }}</span>
178
+ <span class="vo-tm vo-num">{{ q.status === 'done' ? q.time : '' }}</span>
179
+ <vo-icon name="chev-r" size="xs"></vo-icon>
180
+ </button>
181
+ @if (q.rewritten) {
182
+ <span class="vo-wsx-rw">
183
+ <vo-icon name="refresh" size="xs"></vo-icon>Asked again in other words
184
+ </span>
185
+ }
186
+ @if (hasPages(q)) {
187
+ <div class="vo-fold" [class.vo-shut]="!isQOpen(q)" [attr.inert]="isQOpen(q) ? null : ''">
188
+ <div>
189
+ <ul class="vo-wsx-rs">
190
+ @for (p of q.pages; track p.title) {
191
+ <li
192
+ tabindex="0"
193
+ class="vo-wsx-r vo-enter"
194
+ [class.vo-skip]="isSkip(p)"
195
+ [class.vo-hl]="hotPage && hotPage.q === q.key && hotPage.title === p.title"
196
+ [attr.aria-label]="pageLabel(p)"
197
+ >
198
+ <span class="vo-wsx-fav" aria-hidden="true">{{ p.domain[0].toUpperCase() }}</span>
199
+ <span class="vo-tx">
200
+ <span class="vo-t">{{ p.title }}</span>
201
+ <span class="vo-d">{{ p.domain }}{{ p.date ? ' · ' + p.date : '' }}</span>
202
+ </span>
203
+ <span class="vo-tag" [class]="STATUS[p.status][1]">
204
+ @if (p.status === 'reading') {
205
+ <span class="vo-spin" aria-hidden="true"></span>
206
+ }
207
+ {{ STATUS[p.status][0] }}
208
+ </span>
209
+ </li>
210
+ }
211
+ </ul>
212
+ </div>
213
+ </div>
214
+ }
215
+ </div>
216
+ }
217
+ </div>
218
+ </div>
219
+ </div>
220
+
221
+ @if (answer) {
222
+ <div class="vo-wsx-ans">
223
+ @for (part of answerParts; track $index) {
224
+ @if (part.cite !== undefined) {
225
+ <button
226
+ type="button"
227
+ class="vo-wsx-cite"
228
+ [class.vo-on]="hot === part.cite"
229
+ [attr.aria-label]="citeLabel(part.cite)"
230
+ (pointerenter)="hot = part.cite ?? null"
231
+ (pointerleave)="hot = null"
232
+ (focus)="hot = part.cite ?? null"
233
+ (blur)="hot = null"
234
+ >{{ part.cite }}</button>
235
+ } @else {
236
+ <span>{{ part.text }}</span>
237
+ }
238
+ }
239
+ </div>
240
+ }
241
+ <p class="vo-wsx-sr" role="status">{{ said }}</p>
242
+ </div>
243
+ `, isInline: true, styles: [".vo-wsx{padding:6px;display:flex;flex-direction:column;font-size:13px}.vo-wsx-h{display:flex;align-items:center;gap:10px;width:100%;padding:var(--vo-s-2) 10px;border-radius:var(--vo-r-in);text-align:left;font-size:13.5px;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-wsx-h:hover{background:var(--vo-row)}}.vo-wsx-ic{width:16px;height:16px;flex:none;display:grid;place-items:center;color:var(--vo-fg2)}.vo-wsx-ic .vo-spin{width:11px;height:11px}.vo-wsx-st{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-wsx-h>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-wsx-h[aria-expanded=false]>.vo-i{transform:rotate(-90deg)}.vo-wsx-marks{display:flex;align-items:center}.vo-wsx-marks span{width:20px;height:20px;border-radius:50%;display:grid;place-items:center;margin-left:-5px;background:var(--vo-chip);color:var(--vo-fg2);font-size:10.5px;font-weight:500;box-shadow:0 0 0 2px var(--vo-surface);transition:background .2s,color .2s}.vo-wsx-marks span.vo-n{background:var(--vo-surface);color:var(--vo-muted);box-shadow:0 0 0 2px var(--vo-surface),inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:10px}.vo-wsx-marks span.vo-hl{background:var(--vo-fg2);color:var(--vo-surface)}.vo-wsx-list{display:flex;flex-direction:column;gap:2px;padding:2px 0 var(--vo-s-1)}.vo-wsx-q{display:flex;flex-direction:column}.vo-wsx-qh{display:grid;grid-template-columns:16px minmax(0,1fr) auto auto 12px;align-items:center;column-gap:var(--vo-s-2);width:100%;padding:6px 10px;border-radius:calc(10px * var(--vo-rk));text-align:left;transition:background var(--vo-t-fast)}.vo-wsx-q.vo-hl>.vo-wsx-qh{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-wsx-qh:hover{background:var(--vo-row)}}.vo-wsx-qh>.vo-i:first-child{color:var(--vo-muted)}.vo-wsx-qh .vo-t{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--vo-fg)}.vo-wsx-qh .vo-n,.vo-wsx-qh .vo-tm{font-size:12px;color:var(--vo-muted);white-space:nowrap}.vo-wsx-qh .vo-n.vo-none{color:var(--vo-warn)}.vo-wsx-qh>.vo-i:last-child{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-wsx-qh[aria-expanded=true]>.vo-i:last-child{transform:rotate(90deg)}.vo-wsx-qh[aria-expanded=false].vo-empty>.vo-i:last-child{visibility:hidden}.vo-wsx-rw{display:flex;align-items:center;gap:6px;padding:0 10px 2px 34px;font-size:12px;color:var(--vo-muted)}.vo-wsx-rs{list-style:none;margin:0;padding:2px 0 var(--vo-s-1) 26px;display:flex;flex-direction:column;gap:2px}.vo-wsx-r{display:grid;grid-template-columns:20px minmax(0,1fr) auto;column-gap:var(--vo-s-2);align-items:center;padding:5px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));transition:background var(--vo-t-fast);cursor:default}.vo-wsx-r.vo-hl{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-wsx-r:hover{background:var(--vo-row)}}.vo-wsx-r:focus-visible{outline-offset:-2px}.vo-wsx-fav{width:20px;height:20px;border-radius:calc(6px * var(--vo-rk));display:grid;place-items:center;background:var(--vo-chip);color:var(--vo-fg2);font-size:10.5px;font-weight:500}.vo-wsx-r .vo-tx{display:flex;flex-direction:column;min-width:0;line-height:1.35}.vo-wsx-r .vo-t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:12.5px;color:var(--vo-fg)}.vo-wsx-r .vo-d{font-size:11.5px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-wsx-r.vo-skip .vo-t{color:var(--vo-muted)}.vo-wsx-r .vo-tag .vo-spin{width:9px;height:9px}.vo-wsx-ans{padding:var(--vo-s-2) 10px 6px;font-size:13.5px;line-height:1.6;color:var(--vo-fg)}.vo-wsx-ans:empty{display:none}.vo-wsx-cite{display:inline-grid;place-items:center;min-width:18px;height:17px;padding:0 4px;margin:0 1px;border-radius:calc(5px * var(--vo-rk));background:var(--vo-chip);color:var(--vo-fg2);font-size:11px;font-weight:500;vertical-align:1px;transition:background var(--vo-t-fast),color var(--vo-t-fast)}.vo-wsx-cite.vo-on{background:var(--vo-fg2);color:var(--vo-surface)}@media (hover:hover) and (pointer:fine){.vo-wsx-cite:hover{background:var(--vo-fg2);color:var(--vo-surface)}}.vo-wsx-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-sw{display:inline-block;transition:opacity .2s var(--vo-ease),filter .2s var(--vo-ease),transform .25s var(--vo-ease)}.vo-sw.vo-out{opacity:0;filter:blur(3px);transform:translateY(3px)}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}@media (prefers-reduced-motion:reduce){.vo-shim{color:var(--vo-fg);background:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
244
+ }
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: WebSearchComponent, decorators: [{
246
+ type: Component,
247
+ args: [{ selector: 'vo-web-search', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
248
+ <div
249
+ data-vo=""
250
+ class="vo-wsx"
251
+ [class.vo-panel]="!bare"
252
+ [style.paddingInline]="bare ? '0' : null"
253
+ >
254
+ <button type="button" class="vo-wsx-h" [attr.aria-expanded]="isOpen" (click)="toggle()">
255
+ <span class="vo-wsx-ic">
256
+ @if (done) {
257
+ <vo-icon name="globe" size="xs"></vo-icon>
258
+ } @else {
259
+ <span class="vo-spin" aria-hidden="true"></span>
260
+ }
261
+ </span>
262
+ <span class="vo-wsx-st vo-sw" [class.vo-shim]="!done">{{ line }}</span>
263
+ <span class="vo-wsx-marks" aria-hidden="true">
264
+ @for (s of marks; track s) {
265
+ <span [class.vo-hl]="hotPage?.domain === s">{{ s[0].toUpperCase() }}</span>
266
+ }
267
+ @if (sites.length > 4) {
268
+ <span class="vo-n">+{{ sites.length - 4 }}</span>
269
+ }
270
+ </span>
271
+ <vo-icon name="chev-d" size="xs"></vo-icon>
272
+ </button>
273
+
274
+ <div class="vo-fold vo-wsx-fold" [class.vo-shut]="!isOpen" [attr.inert]="isOpen ? null : ''">
275
+ <div>
276
+ <div class="vo-wsx-list">
277
+ @for (q of queries; track q.key) {
278
+ <div
279
+ class="vo-wsx-q vo-enter"
280
+ [class.vo-hl]="hotPage && hotPage.q === q.key && !isQOpen(q)"
281
+ >
282
+ <button
283
+ type="button"
284
+ class="vo-wsx-qh"
285
+ [class.vo-empty]="!hasPages(q)"
286
+ [attr.aria-expanded]="isQOpen(q)"
287
+ [attr.aria-label]="qLabel(q)"
288
+ (click)="toggleQ(q)"
289
+ >
290
+ <vo-icon name="search" size="xs"></vo-icon>
291
+ <span class="vo-t" [class.vo-shim]="q.status === 'searching'">{{ q.query }}</span>
292
+ <span class="vo-n" [class.vo-none]="q.status === 'done' && !q.results">{{
293
+ q.status === 'searching' ? 'Searching' : q.results ? q.results + ' results' : 'No results'
294
+ }}</span>
295
+ <span class="vo-tm vo-num">{{ q.status === 'done' ? q.time : '' }}</span>
296
+ <vo-icon name="chev-r" size="xs"></vo-icon>
297
+ </button>
298
+ @if (q.rewritten) {
299
+ <span class="vo-wsx-rw">
300
+ <vo-icon name="refresh" size="xs"></vo-icon>Asked again in other words
301
+ </span>
302
+ }
303
+ @if (hasPages(q)) {
304
+ <div class="vo-fold" [class.vo-shut]="!isQOpen(q)" [attr.inert]="isQOpen(q) ? null : ''">
305
+ <div>
306
+ <ul class="vo-wsx-rs">
307
+ @for (p of q.pages; track p.title) {
308
+ <li
309
+ tabindex="0"
310
+ class="vo-wsx-r vo-enter"
311
+ [class.vo-skip]="isSkip(p)"
312
+ [class.vo-hl]="hotPage && hotPage.q === q.key && hotPage.title === p.title"
313
+ [attr.aria-label]="pageLabel(p)"
314
+ >
315
+ <span class="vo-wsx-fav" aria-hidden="true">{{ p.domain[0].toUpperCase() }}</span>
316
+ <span class="vo-tx">
317
+ <span class="vo-t">{{ p.title }}</span>
318
+ <span class="vo-d">{{ p.domain }}{{ p.date ? ' · ' + p.date : '' }}</span>
319
+ </span>
320
+ <span class="vo-tag" [class]="STATUS[p.status][1]">
321
+ @if (p.status === 'reading') {
322
+ <span class="vo-spin" aria-hidden="true"></span>
323
+ }
324
+ {{ STATUS[p.status][0] }}
325
+ </span>
326
+ </li>
327
+ }
328
+ </ul>
329
+ </div>
330
+ </div>
331
+ }
332
+ </div>
333
+ }
334
+ </div>
335
+ </div>
336
+ </div>
337
+
338
+ @if (answer) {
339
+ <div class="vo-wsx-ans">
340
+ @for (part of answerParts; track $index) {
341
+ @if (part.cite !== undefined) {
342
+ <button
343
+ type="button"
344
+ class="vo-wsx-cite"
345
+ [class.vo-on]="hot === part.cite"
346
+ [attr.aria-label]="citeLabel(part.cite)"
347
+ (pointerenter)="hot = part.cite ?? null"
348
+ (pointerleave)="hot = null"
349
+ (focus)="hot = part.cite ?? null"
350
+ (blur)="hot = null"
351
+ >{{ part.cite }}</button>
352
+ } @else {
353
+ <span>{{ part.text }}</span>
354
+ }
355
+ }
356
+ </div>
357
+ }
358
+ <p class="vo-wsx-sr" role="status">{{ said }}</p>
359
+ </div>
360
+ `, styles: [".vo-wsx{padding:6px;display:flex;flex-direction:column;font-size:13px}.vo-wsx-h{display:flex;align-items:center;gap:10px;width:100%;padding:var(--vo-s-2) 10px;border-radius:var(--vo-r-in);text-align:left;font-size:13.5px;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-wsx-h:hover{background:var(--vo-row)}}.vo-wsx-ic{width:16px;height:16px;flex:none;display:grid;place-items:center;color:var(--vo-fg2)}.vo-wsx-ic .vo-spin{width:11px;height:11px}.vo-wsx-st{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-wsx-h>.vo-i{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-wsx-h[aria-expanded=false]>.vo-i{transform:rotate(-90deg)}.vo-wsx-marks{display:flex;align-items:center}.vo-wsx-marks span{width:20px;height:20px;border-radius:50%;display:grid;place-items:center;margin-left:-5px;background:var(--vo-chip);color:var(--vo-fg2);font-size:10.5px;font-weight:500;box-shadow:0 0 0 2px var(--vo-surface);transition:background .2s,color .2s}.vo-wsx-marks span.vo-n{background:var(--vo-surface);color:var(--vo-muted);box-shadow:0 0 0 2px var(--vo-surface),inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:10px}.vo-wsx-marks span.vo-hl{background:var(--vo-fg2);color:var(--vo-surface)}.vo-wsx-list{display:flex;flex-direction:column;gap:2px;padding:2px 0 var(--vo-s-1)}.vo-wsx-q{display:flex;flex-direction:column}.vo-wsx-qh{display:grid;grid-template-columns:16px minmax(0,1fr) auto auto 12px;align-items:center;column-gap:var(--vo-s-2);width:100%;padding:6px 10px;border-radius:calc(10px * var(--vo-rk));text-align:left;transition:background var(--vo-t-fast)}.vo-wsx-q.vo-hl>.vo-wsx-qh{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-wsx-qh:hover{background:var(--vo-row)}}.vo-wsx-qh>.vo-i:first-child{color:var(--vo-muted)}.vo-wsx-qh .vo-t{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--vo-fg)}.vo-wsx-qh .vo-n,.vo-wsx-qh .vo-tm{font-size:12px;color:var(--vo-muted);white-space:nowrap}.vo-wsx-qh .vo-n.vo-none{color:var(--vo-warn)}.vo-wsx-qh>.vo-i:last-child{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-wsx-qh[aria-expanded=true]>.vo-i:last-child{transform:rotate(90deg)}.vo-wsx-qh[aria-expanded=false].vo-empty>.vo-i:last-child{visibility:hidden}.vo-wsx-rw{display:flex;align-items:center;gap:6px;padding:0 10px 2px 34px;font-size:12px;color:var(--vo-muted)}.vo-wsx-rs{list-style:none;margin:0;padding:2px 0 var(--vo-s-1) 26px;display:flex;flex-direction:column;gap:2px}.vo-wsx-r{display:grid;grid-template-columns:20px minmax(0,1fr) auto;column-gap:var(--vo-s-2);align-items:center;padding:5px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));transition:background var(--vo-t-fast);cursor:default}.vo-wsx-r.vo-hl{background:var(--vo-row)}@media (hover:hover) and (pointer:fine){.vo-wsx-r:hover{background:var(--vo-row)}}.vo-wsx-r:focus-visible{outline-offset:-2px}.vo-wsx-fav{width:20px;height:20px;border-radius:calc(6px * var(--vo-rk));display:grid;place-items:center;background:var(--vo-chip);color:var(--vo-fg2);font-size:10.5px;font-weight:500}.vo-wsx-r .vo-tx{display:flex;flex-direction:column;min-width:0;line-height:1.35}.vo-wsx-r .vo-t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:12.5px;color:var(--vo-fg)}.vo-wsx-r .vo-d{font-size:11.5px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-wsx-r.vo-skip .vo-t{color:var(--vo-muted)}.vo-wsx-r .vo-tag .vo-spin{width:9px;height:9px}.vo-wsx-ans{padding:var(--vo-s-2) 10px 6px;font-size:13.5px;line-height:1.6;color:var(--vo-fg)}.vo-wsx-ans:empty{display:none}.vo-wsx-cite{display:inline-grid;place-items:center;min-width:18px;height:17px;padding:0 4px;margin:0 1px;border-radius:calc(5px * var(--vo-rk));background:var(--vo-chip);color:var(--vo-fg2);font-size:11px;font-weight:500;vertical-align:1px;transition:background var(--vo-t-fast),color var(--vo-t-fast)}.vo-wsx-cite.vo-on{background:var(--vo-fg2);color:var(--vo-surface)}@media (hover:hover) and (pointer:fine){.vo-wsx-cite:hover{background:var(--vo-fg2);color:var(--vo-surface)}}.vo-wsx-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.vo-shim{background:linear-gradient(90deg,var(--vo-fg) 0%,var(--vo-fg) 38%,var(--vo-faint) 50%,var(--vo-fg) 62%,var(--vo-fg) 100%);background-size:260% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:vo-shim 2.2s linear infinite}@keyframes vo-shim{0%{background-position:100% 0}to{background-position:-160% 0}}.vo-enter{animation:vo-enter var(--vo-t-slow) var(--vo-ease) backwards}@keyframes vo-enter{0%{opacity:0;transform:translateY(6px);filter:blur(4px)}to{opacity:1;transform:none;filter:blur(0)}}.vo-sw{display:inline-block;transition:opacity .2s var(--vo-ease),filter .2s var(--vo-ease),transform .25s var(--vo-ease)}.vo-sw.vo-out{opacity:0;filter:blur(3px);transform:translateY(3px)}.vo-fold{display:grid;grid-template-rows:1fr;grid-template-columns:minmax(0,1fr);transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease)}.vo-fold>*{overflow:clip;overflow-clip-margin:12px;min-height:0;min-width:0}.vo-fold.vo-shut{grid-template-rows:0fr;opacity:0;visibility:hidden;transition:grid-template-rows var(--vo-t) var(--vo-ease),opacity var(--vo-t) var(--vo-ease),visibility 0s var(--vo-t)}@media (prefers-reduced-motion:reduce){.vo-shim{color:var(--vo-fg);background:none}}\n"] }]
361
+ }], propDecorators: { queries: [{
362
+ type: Input
363
+ }], done: [{
364
+ type: Input
365
+ }], answer: [{
366
+ type: Input
367
+ }], open: [{
368
+ type: Input
369
+ }], bare: [{
370
+ type: Input
371
+ }], openChange: [{
372
+ type: Output
373
+ }] } });
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLXNlYXJjaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi93ZWItc2VhcmNoL3dlYi1zZWFyY2guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsbUVBQW1FO0FBQ25FLGdGQUFnRjtBQUNoRiw2RUFBNkU7QUFDN0UsNkVBQTZFO0FBQzdFLDhDQUE4QztBQUU5QyxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBOEJ6RCxNQUFNLE1BQU0sR0FBZ0Q7SUFDMUQsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztJQUN4QixJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO0lBQ2xCLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7SUFDeEIsT0FBTyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDO0lBQ3hDLE9BQU8sRUFBRSxDQUFDLGtCQUFrQixFQUFFLFNBQVMsQ0FBQztJQUN4QyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUM7Q0FDekMsQ0FBQztBQWFGLDZGQUE2RjtBQTBIN0YsTUFBTSxPQUFPLGtCQUFrQjtJQXpIL0I7UUEwSFcsWUFBTyxHQUFlLEVBQUUsQ0FBQztRQUNsQyxnRkFBZ0Y7UUFDdkUsU0FBSSxHQUFHLEtBQUssQ0FBQztRQVF0Qiw0Q0FBNEM7UUFDbkMsU0FBSSxHQUFHLElBQUksQ0FBQztRQUVYLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRTFDLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFFekIsUUFBRyxHQUFrQixJQUFJLENBQUM7UUFDMUIsU0FBSSxHQUFHLEVBQUUs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Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUhULDRyTEFsSFMsZUFBZTs7NEZBcUhkLGtCQUFrQjtrQkF6SDlCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksaUJBQ0QsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLGVBQWUsQ0FBQyxZQUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpSFQ7OEJBSVEsT0FBTztzQkFBZixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRU8sSUFBSTtzQkFBaEIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL3dlYi1zZWFyY2gvd2ViLXNlYXJjaC5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC93ZWItc2VhcmNoL1dlYlNlYXJjaC50c3guXG4vLyBUaGUgYWdlbnQncyB3ZWIgc2VhcmNoZXMgYXMgYSB0cmFpbDogZWFjaCBxdWVyeSBhbmQgd2hhdCBjYW1lIGJhY2ssIGVhY2ggcGFnZVxuLy8gcmVhZCwgc2tpbW1lZCBvciBza2lwcGVkIGFuZCB3aHksIGEgc3VtbWFyeSBvbmNlIGRvbmUsIGFuZCBhbiBhbnN3ZXIgd2hvc2Vcbi8vIGNpdGF0aW9ucyBsaWdodCB0aGVpciBwYWdlcy4gSW5wdXRzIG1pcnJvciB0aGUgUmVhY3QgcHJvcHM7IHRoZSBvcGVuLXN0YXRlXG4vLyBjYWxsYmFjayBiZWNvbWVzIGFuIEBPdXRwdXQoKSBFdmVudEVtaXR0ZXIuXG5cbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZvSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUvaWNvbi5jb21wb25lbnQnO1xuXG4vKiogT25lIHBhZ2UgdGhlIGFnZW50IG9wZW5lZCBmb3IgYSBxdWVyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViUGFnZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIC8qKiBMaWtlIFwic3RyaXBlLmNvbVwiLiAqL1xuICBkb21haW46IHN0cmluZztcbiAgLyoqIExpa2UgXCJPY3QgMjAyNlwiLiAqL1xuICBkYXRlPzogc3RyaW5nO1xuICAvKiogcmVhZGluZyB3aGlsZSB0aGUgYWdlbnQgb3BlbnMgaXQ7IHRoZSBza2lwcGVkIG9uZXMgc2F5IHdoeS4gKi9cbiAgc3RhdHVzOiAncmVhZGluZycgfCAncmVhZCcgfCAnc2tpbW1lZCcgfCAncGF5d2FsbCcgfCAnYmxvY2tlZCcgfCAndGltZW91dCc7XG4gIC8qKiBUaGUgbnVtYmVyIHRoZSBhbnN3ZXIgY2l0ZXMgaXQgYnksIGFzIFsxXS4gKi9cbiAgY2l0ZT86IG51bWJlcjtcbn1cblxuLyoqIE9uZSBzZWFyY2ggdGhlIGFnZW50IG1hZGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlF1ZXJ5IHtcbiAga2V5OiBzdHJpbmc7XG4gIHF1ZXJ5OiBzdHJpbmc7XG4gIC8qKiBzZWFyY2hpbmcgc2hpbW1lcnM7IGRvbmUgc2hvd3MgdGhlIGNvdW50IGFuZCB0aGUgdGltZS4gKi9cbiAgc3RhdHVzOiAnc2VhcmNoaW5nJyB8ICdkb25lJztcbiAgLyoqIEhvdyBtYW55IHJlc3VsdHMgY2FtZSBiYWNrOyAwIHNheXMgTm8gcmVzdWx0cy4gKi9cbiAgcmVzdWx0cz86IG51bWJlcjtcbiAgLyoqIExpa2UgXCIwLjlzXCIuICovXG4gIHRpbWU/OiBzdHJpbmc7XG4gIC8qKiBUaGlzIHF1ZXJ5IGFza3MgdGhlIG9uZSBiZWZvcmUgaXQgYWdhaW4gaW4gb3RoZXIgd29yZHMuICovXG4gIHJld3JpdHRlbj86IGJvb2xlYW47XG4gIHBhZ2VzPzogV2ViUGFnZVtdO1xufVxuXG5jb25zdCBTVEFUVVM6IFJlY29yZDxXZWJQYWdlWydzdGF0dXMnXSwgW3N0cmluZywgc3RyaW5nXT4gPSB7XG4gIHJlYWRpbmc6IFsnUmVhZGluZycsICcnXSxcbiAgcmVhZDogWydSZWFkJywgJyddLFxuICBza2ltbWVkOiBbJ1NraW1tZWQnLCAnJ10sXG4gIHBheXdhbGw6IFsnU2tpcHBlZDogcGF5d2FsbCcsICd2by13YXJuJ10sXG4gIGJsb2NrZWQ6IFsnU2tpcHBlZDogYmxvY2tlZCcsICd2by13YXJuJ10sXG4gIHRpbWVvdXQ6IFsnU2tpcHBlZDogdGltZW91dCcsICd2by13YXJuJ10sXG59O1xuXG4vKiogT25lIGZsYXR0ZW5lZCBwYWdlIHdpdGggaXRzIHF1ZXJ5IGtleSwgZm9yIGNpdGF0aW9ucyBhbmQgbWFya3MuICovXG5pbnRlcmZhY2UgRmxhdFBhZ2UgZXh0ZW5kcyBXZWJQYWdlIHtcbiAgcTogc3RyaW5nO1xufVxuXG4vKiogT25lIHBpZWNlIG9mIHRoZSBhbnN3ZXI6IHBsYWluIHRleHQgb3IgYSBjaXRhdGlvbiBidXR0b24uICovXG5pbnRlcmZhY2UgQW5zd2VyUGFydCB7XG4gIHRleHQ/OiBzdHJpbmc7XG4gIGNpdGU/OiBudW1iZXI7XG59XG5cbi8qKiBUaGUgYWdlbnQncyB3ZWIgc2VhcmNoZXMgYXMgYSB0cmFpbCwgd2l0aCBhbiBhbnN3ZXIgd2hvc2UgY2l0YXRpb25zIGxpZ2h0IHRoZWlyIHBhZ2VzLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndm8td2ViLXNlYXJjaCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgY2xhc3M9XCJ2by13c3hcIlxuICAgICAgW2NsYXNzLnZvLXBhbmVsXT1cIiFiYXJlXCJcbiAgICAgIFtzdHlsZS5wYWRkaW5nSW5saW5lXT1cImJhcmUgPyAnMCcgOiBudWxsXCJcbiAgICA+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXdzeC1oXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIiAoY2xpY2spPVwidG9nZ2xlKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by13c3gtaWNcIj5cbiAgICAgICAgICBAaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJnbG9iZVwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by13c3gtc3Qgdm8tc3dcIiBbY2xhc3Mudm8tc2hpbV09XCIhZG9uZVwiPnt7IGxpbmUgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidm8td3N4LW1hcmtzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgQGZvciAocyBvZiBtYXJrczsgdHJhY2sgcykge1xuICAgICAgICAgICAgPHNwYW4gW2NsYXNzLnZvLWhsXT1cImhvdFBhZ2U/LmRvbWFpbiA9PT0gc1wiPnt7IHNbMF0udG9VcHBlckNhc2UoKSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChzaXRlcy5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW5cIj4re3sgc2l0ZXMubGVuZ3RoIC0gNCB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHZvLWljb24gbmFtZT1cImNoZXYtZFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwidm8tZm9sZCB2by13c3gtZm9sZFwiIFtjbGFzcy52by1zaHV0XT1cIiFpc09wZW5cIiBbYXR0ci5pbmVydF09XCJpc09wZW4gPyBudWxsIDogJydcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8td3N4LWxpc3RcIj5cbiAgICAgICAgICAgIEBmb3IgKHEgb2YgcXVlcmllczsgdHJhY2sgcS5rZXkpIHtcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidm8td3N4LXEgdm8tZW50ZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy52by1obF09XCJob3RQYWdlICYmIGhvdFBhZ2UucSA9PT0gcS5rZXkgJiYgIWlzUU9wZW4ocSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInZvLXdzeC1xaFwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudm8tZW1wdHldPVwiIWhhc1BhZ2VzKHEpXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNRT3BlbihxKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInFMYWJlbChxKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUShxKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cInNlYXJjaFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tdFwiIFtjbGFzcy52by1zaGltXT1cInEuc3RhdHVzID09PSAnc2VhcmNoaW5nJ1wiPnt7IHEucXVlcnkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW5cIiBbY2xhc3Mudm8tbm9uZV09XCJxLnN0YXR1cyA9PT0gJ2RvbmUnICYmICFxLnJlc3VsdHNcIj57e1xuICAgICAgICAgICAgICAgICAgICBxLnN0YXR1cyA9PT0gJ3NlYXJjaGluZycgPyAnU2VhcmNoaW5nJyA6IHEucmVzdWx0cyA/IHEucmVzdWx0cyArICcgcmVzdWx0cycgOiAnTm8gcmVzdWx0cydcbiAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10bSB2by1udW1cIj57eyBxLnN0YXR1cyA9PT0gJ2RvbmUnID8gcS50aW1lIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2hldi1yXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIEBpZiAocS5yZXdyaXR0ZW4pIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8td3N4LXJ3XCI+XG4gICAgICAgICAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJyZWZyZXNoXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPkFza2VkIGFnYWluIGluIG90aGVyIHdvcmRzXG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoaGFzUGFnZXMocSkpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1mb2xkXCIgW2NsYXNzLnZvLXNodXRdPVwiIWlzUU9wZW4ocSlcIiBbYXR0ci5pbmVydF09XCJpc1FPcGVuKHEpID8gbnVsbCA6ICcnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwidm8td3N4LXJzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChwIG9mIHEucGFnZXM7IHRyYWNrIHAudGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZvLXdzeC1yIHZvLWVudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mudm8tc2tpcF09XCJpc1NraXAocClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by1obF09XCJob3RQYWdlICYmIGhvdFBhZ2UucSA9PT0gcS5rZXkgJiYgaG90UGFnZS50aXRsZSA9PT0gcC50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwYWdlTGFiZWwocClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by13c3gtZmF2XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgcC5kb21haW5bMF0udG9VcHBlckNhc2UoKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXR4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRcIj57eyBwLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1kXCI+e3sgcC5kb21haW4gfX17eyBwLmRhdGUgPyAnIMK3ICcgKyBwLmRhdGUgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by10YWdcIiBbY2xhc3NdPVwiU1RBVFVTW3Auc3RhdHVzXVsxXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChwLnN0YXR1cyA9PT0gJ3JlYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFNUQVRVU1twLnN0YXR1c11bMF0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKGFuc3dlcikge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidm8td3N4LWFuc1wiPlxuICAgICAgICAgIEBmb3IgKHBhcnQgb2YgYW5zd2VyUGFydHM7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgQGlmIChwYXJ0LmNpdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2by13c3gtY2l0ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnZvLW9uXT1cImhvdCA9PT0gcGFydC5jaXRlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNpdGVMYWJlbChwYXJ0LmNpdGUpXCJcbiAgICAgICAgICAgICAgICAocG9pbnRlcmVudGVyKT1cImhvdCA9IHBhcnQuY2l0ZSA/PyBudWxsXCJcbiAgICAgICAgICAgICAgICAocG9pbnRlcmxlYXZlKT1cImhvdCA9IG51bGxcIlxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJob3QgPSBwYXJ0LmNpdGUgPz8gbnVsbFwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiaG90ID0gbnVsbFwiXG4gICAgICAgICAgICAgID57eyBwYXJ0LmNpdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8c3Bhbj57eyBwYXJ0LnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxwIGNsYXNzPVwidm8td3N4LXNyXCIgcm9sZT1cInN0YXR1c1wiPnt7IHNhaWQgfX08L3A+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsOiAnLi93ZWItc2VhcmNoLmNzcycsXG59KVxuZXhwb3J0IGNsYXNzIFdlYlNlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHF1ZXJpZXM6IFdlYlF1ZXJ5W10gPSBbXTtcbiAgLyoqIFRydWUgb25jZSBzZWFyY2hpbmcgYW5kIHJlYWRpbmcgYXJlIG92ZXI6IHRoZSB0cmFpbCBmb2xkcyB0byBpdHMgc3VtbWFyeS4gKi9cbiAgQElucHV0KCkgZG9uZSA9IGZhbHNlO1xuICAvKiogVGhlIGFuc3dlciwgd2l0aCBzb3VyY2VzIGNpdGVkIGFzIFsxXSwgWzJdLiBFYWNoIG51bWJlciBwb2ludHMgYXQgdGhlIHBhZ2Ugd2l0aCB0aGF0IGNpdGUuICovXG4gIEBJbnB1dCgpIGFuc3dlcj86IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhlIHRyYWlsIGlzIG9wZW4uIExlZnQgb3V0LCBpdCBmb2xkcyBvbmNlIGRvbmUgdHVybnMgdHJ1ZS4gKi9cbiAgQElucHV0KCkgc2V0IG9wZW4odmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNvbnRyb2xsZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB0aGlzLmlubmVyID0gdmFsdWU7XG4gIH1cbiAgLyoqIFdpdGhvdXQgdGhlIHBhbmVsLCBmb3IgYSBjaGF0IHN0cmVhbS4gKi9cbiAgQElucHV0KCkgYmFyZSA9IHRydWU7XG5cbiAgQE91dHB1dCgpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgU1RBVFVTID0gU1RBVFVTO1xuXG4gIGhvdDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHNhaWQgPSAnJztcblxuICBwcml2YXRlIGNvbnRyb2xsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbm5lciA9IHRydWU7XG4gIHByaXZhdGUgcU9wZW46IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIHByaXZhdGUgbGFzdFNhaWQgPSAnJztcblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlubmVyO1xuICB9XG5cbiAgZ2V0IGZsYXRQYWdlcygpOiBGbGF0UGFnZVtdIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyaWVzLmZsYXRNYXAoKHEpID0+IChxLnBhZ2VzID8/IFtdKS5tYXAoKHApID0+ICh7IC4uLnAsIHE6IHEua2V5IH0pKSk7XG4gIH1cblxuICBnZXQgc2l0ZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4ubmV3IFNldCh0aGlzLmZsYXRQYWdlcy5tYXAoKHApID0+IHAuZG9tYWluKSldO1xuICB9XG5cbiAgZ2V0IG1hcmtzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5zaXRlcy5zbGljZSgwLCA0KTtcbiAgfVxuXG4gIGdldCBsaW5lKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcmVhZCA9IHRoaXMuZmxhdFBhZ2VzLmZpbHRlcigocCkgPT4gcC5zdGF0dXMgPT09ICdyZWFkJyB8fCBwLnN0YXR1cyA9PT0gJ3NraW1tZWQnKS5sZW5ndGg7XG4gICAgaWYgKHRoaXMuZG9uZSkgcmV0dXJuIGAke3RoaXMucXVlcmllcy5sZW5ndGh9IHNlYXJjaGVzLCAke3JlYWR9IHBhZ2VzIHJlYWRgO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnF1ZXJpZXMuZmluZCgocSkgPT4gcS5zdGF0dXMgPT09ICdzZWFyY2hpbmcnKTtcbiAgICBpZiAoY3VycmVudCkgcmV0dXJuIGBTZWFyY2hpbmcgZm9yIOKAnCR7Y3VycmVudC5xdWVyeX3igJ1gO1xuICAgIGNvbnN0IHJlYWRpbmcgPSB0aGlzLmZsYXRQYWdlcy5maWx0ZXIoKHApID0+IHAuc3RhdHVzID09PSAncmVhZGluZycpLmxlbmd0aDtcbiAgICBpZiAocmVhZGluZykgcmV0dXJuIGBSZWFkaW5nICR7cmVhZGluZ30gcGFnZXNgO1xuICAgIHJldHVybiAnU2VhcmNoaW5nIHRoZSB3ZWInO1xuICB9XG5cbiAgZ2V0IGhvdFBhZ2UoKTogRmxhdFBhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmhvdCAhPSBudWxsID8gdGhpcy5mbGF0UGFnZXMuZmluZCgocCkgPT4gcC5jaXRlID09PSB0aGlzLmhvdCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQgYW5zd2VyUGFydHMoKTogQW5zd2VyUGFydFtdIHtcbiAgICBpZiAoIXRoaXMuYW5zd2VyKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuYW5zd2VyLnNwbGl0KC8oXFxbXFxkK1xcXSkvKS5tYXAoKHBhcnQpID0+IHtcbiAgICAgIGNvbnN0IG0gPSBwYXJ0Lm1hdGNoKC9eXFxbKFxcZCspXFxdJC8pO1xuICAgICAgcmV0dXJuIG0gPyB7IGNpdGU6ICttWzFdIH0gOiB7IHRleHQ6IHBhcnQgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGhhc1BhZ2VzKHE6IFdlYlF1ZXJ5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhcS5wYWdlcz8ubGVuZ3RoO1xuICB9XG5cbiAgaXNRT3BlbihxOiBXZWJRdWVyeSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5oYXNQYWdlcyhxKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGF1dG8gPSBxLnBhZ2VzPy5zb21lKChwKSA9PiBwLnN0YXR1cyA9PT0gJ3JlYWRpbmcnKSA/PyBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5xT3BlbltxLmtleV0gPz8gYXV0bztcbiAgfVxuXG4gIGlzU2tpcChwOiBXZWJQYWdlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHAuc3RhdHVzICE9PSAncmVhZCcgJiYgcC5zdGF0dXMgIT09ICdza2ltbWVkJyAmJiBwLnN0YXR1cyAhPT0gJ3JlYWRpbmcnO1xuICB9XG5cbiAgcUxhYmVsKHE6IFdlYlF1ZXJ5KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHEuc3RhdHVzICE9PSAnZG9uZScpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJlcyA9IHEucmVzdWx0cyA/IGAke3EucmVzdWx0c30gcmVzdWx0c2AgOiAnbm8gcmVzdWx0cyc7XG4gICAgcmV0dXJuIGAke3EucXVlcnl9OiAke3Jlc30ke3EudGltZSA/ICcsICcgKyBxLnRpbWUgOiAnJ31gO1xuICB9XG5cbiAgcGFnZUxhYmVsKHA6IFdlYlBhZ2UpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwLnRpdGxlfSwgJHtwLmRvbWFpbn0ke3AuZGF0ZSA/ICcsICcgKyBwLmRhdGUgOiAnJ306ICR7U1RBVFVTW3Auc3RhdHVzXVswXX1gO1xuICB9XG5cbiAgY2l0ZUxhYmVsKG46IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gICAgaWYgKG4gPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHAgPSB0aGlzLmZsYXRQYWdlcy5maW5kKCh4KSA9PiB4LmNpdGUgPT09IG4pO1xuICAgIHJldHVybiBwID8gYFNvdXJjZSAke259OiAke3AudGl0bGV9LCAke3AuZG9tYWlufWAgOiBgU291cmNlICR7bn1gO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0T3BlbighdGhpcy5pbm5lcik7XG4gIH1cblxuICB0b2dnbGVRKHE6IFdlYlF1ZXJ5KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc1BhZ2VzKHEpKSByZXR1cm47XG4gICAgdGhpcy5xT3BlbiA9IHsgLi4udGhpcy5xT3BlbiwgW3Eua2V5XTogIXRoaXMuaXNRT3BlbihxKSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRPcGVuKG86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlZCkgdGhpcy5pbm5lciA9IG87XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQobyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RvbmUnXSAmJiB0aGlzLmRvbmUgJiYgIXRoaXMuY29udHJvbGxlZCkge1xuICAgICAgdGhpcy5pbm5lciA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBvbmx5IGNoYW5nZXMgb2YgcGhhc2UgYXJlIGFubm91bmNlZFxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnF1ZXJpZXMuZmluZCgocSkgPT4gcS5zdGF0dXMgPT09ICdzZWFyY2hpbmcnKTtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5kb25lID8gYERvbmU6ICR7dGhpcy5saW5lfWAgOiBjdXJyZW50ID8gYFNlYXJjaGluZyBmb3IgJHtjdXJyZW50LnF1ZXJ5fWAgOiAnJztcbiAgICBpZiAobmV4dCAmJiBuZXh0ICE9PSB0aGlzLmxhc3RTYWlkKSB7XG4gICAgICB0aGlzLmxhc3RTYWlkID0gbmV4dDtcbiAgICAgIHRoaXMuc2FpZCA9IG5leHQ7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,67 @@
1
+ import { EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export type EvalStatus = 'queued' | 'running' | 'pass' | 'fail';
4
+ export type EvalFilter = 'all' | 'fail';
5
+ /** A fix button under a failed case's details, like "Use $24 and rerun". */
6
+ export interface EvalFix {
7
+ label: string;
8
+ onClick: () => void;
9
+ }
10
+ /** One eval case: what it checks, how it did, and (for a failure) the details. */
11
+ export interface EvalCase {
12
+ id: string;
13
+ /** What it checks, like "Prices match the billing table". */
14
+ name: string;
15
+ status: EvalStatus;
16
+ /** How long it took, like "0.9s", shown once it has a result. */
17
+ time?: string;
18
+ /** For a failed case: what should have come back. */
19
+ expected?: string;
20
+ /** For a failed case: what came back instead. */
21
+ got?: string;
22
+ /** For a failed case: where the expected answer comes from. */
23
+ source?: string;
24
+ /** For a failed case: a white button under its details, like "Use $24 and rerun". */
25
+ fix?: EvalFix;
26
+ }
27
+ /** An eval suite's latest run: a bar per case, a pass count, and the cases. */
28
+ export declare class EvalResultsComponent implements OnChanges, OnDestroy {
29
+ /** Like "Pricing copy evals". */
30
+ title: string;
31
+ /** The line under the title, like "Copy agent · 8 cases · run 2h ago". */
32
+ subtitle?: string;
33
+ cases: EvalCase[];
34
+ /** Whether the whole suite is running: the button spins and the count reads "Running 3 of 8". */
35
+ running: boolean;
36
+ /** Defaults to "Run evals". */
37
+ runLabel: string;
38
+ /** How many passed the run before. Once the run settles, a tag compares with it. */
39
+ previousPassed?: number;
40
+ /** Which cases show: all of them, or only the failed ones. */
41
+ filter?: EvalFilter;
42
+ defaultFilter: EvalFilter;
43
+ /** Ids of the failed cases that are open. Leave it out to let each one open itself. */
44
+ open?: string[];
45
+ defaultOpen: string[];
46
+ /** Emitted by the run button. */
47
+ run: EventEmitter<void>;
48
+ filterChange: EventEmitter<EvalFilter>;
49
+ openChange: EventEmitter<string[]>;
50
+ private readonly motion;
51
+ show: EvalFilter;
52
+ opened: string[];
53
+ ngOnChanges(changes: SimpleChanges): void;
54
+ get failed(): number;
55
+ private get passed();
56
+ private get settled();
57
+ get count(): string;
58
+ get belowPrevious(): boolean;
59
+ get delta(): string;
60
+ seg(status: EvalStatus): string;
61
+ isOpen(k: EvalCase): boolean;
62
+ pick(v: EvalFilter): void;
63
+ toggle(k: EvalCase): void;
64
+ ngOnDestroy(): void;
65
+ static ɵfac: i0.ɵɵFactoryDeclaration<EvalResultsComponent, never>;
66
+ static ɵcmp: i0.ɵɵComponentDeclaration<EvalResultsComponent, "vo-eval-results", never, { "title": { "alias": "title"; "required": false; }; "subtitle": { "alias": "subtitle"; "required": false; }; "cases": { "alias": "cases"; "required": false; }; "running": { "alias": "running"; "required": false; }; "runLabel": { "alias": "runLabel"; "required": false; }; "previousPassed": { "alias": "previousPassed"; "required": false; }; "filter": { "alias": "filter"; "required": false; }; "defaultFilter": { "alias": "defaultFilter"; "required": false; }; "open": { "alias": "open"; "required": false; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; }; }, { "run": "run"; "filterChange": "filterChange"; "openChange": "openChange"; }, never, never, true, never>;
67
+ }
@@ -0,0 +1,74 @@
1
+ import { EventEmitter, OnChanges, OnDestroy, SimpleChanges } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** Whether the answer was rated good or bad. */
4
+ export type FeedbackRating = 'up' | 'down' | null;
5
+ /** What was picked and written when the sheet is sent. */
6
+ export interface Feedback {
7
+ reasons: string[];
8
+ comment: string;
9
+ }
10
+ export declare class FeedbackSheetComponent implements OnChanges, OnDestroy {
11
+ /** The answer being rated, shown above the thumbs. */
12
+ message?: string;
13
+ /** Whether the answer was rated good or bad. Leave it out to let the thumbs set it. */
14
+ rating?: FeedbackRating;
15
+ defaultRating: FeedbackRating;
16
+ /** Whether the reasons sheet is open. Leave it out and thumbs down opens it. */
17
+ open?: boolean;
18
+ defaultOpen: boolean;
19
+ /** The reasons picked. Leave it out to let the chips keep it. */
20
+ selected?: string[];
21
+ defaultSelected: string[];
22
+ /** What is written in the box. Leave it out to let the box keep it. */
23
+ comment: string;
24
+ defaultComment: string;
25
+ /** Shows the spinner on Send, for a scripted demo. */
26
+ sending: boolean;
27
+ /** The heading of the sheet that opens on thumbs down. */
28
+ question: string;
29
+ /** Quick reasons to pick from. */
30
+ reasons: string[];
31
+ placeholder: string;
32
+ /** A quiet note beside the buttons, like who sees the feedback. */
33
+ note: string;
34
+ /** What was sent, which shows the thank-you line. Leave it out and Send sets it. */
35
+ sent: Feedback | null;
36
+ /** Sits flat under a message in a chat thread (the default). Set false to give it a card of its own. */
37
+ bare: boolean;
38
+ ratingChange: EventEmitter<FeedbackRating>;
39
+ openChange: EventEmitter<boolean>;
40
+ selectedChange: EventEmitter<string[]>;
41
+ commentChange: EventEmitter<string>;
42
+ sentChange: EventEmitter<Feedback | null>;
43
+ /** Called with what the person picked and wrote when Send is pressed. */
44
+ submit: EventEmitter<Feedback>;
45
+ private boxRef?;
46
+ private readonly motion;
47
+ rate: FeedbackRating;
48
+ isOpen: boolean;
49
+ picked: string[];
50
+ stShown: string;
51
+ stOut: boolean;
52
+ private rateSet;
53
+ private openSet;
54
+ private selSet;
55
+ private busy;
56
+ private timers;
57
+ get thanksLine(): string;
58
+ private get status();
59
+ ngOnChanges(changes: SimpleChanges): void;
60
+ private later;
61
+ /** Crossfade the status line to the next text. */
62
+ private swap;
63
+ private setRate;
64
+ private setOpen;
65
+ up(): void;
66
+ down(focus: boolean): void;
67
+ toggle(reason: string): void;
68
+ onComment(value: string): void;
69
+ cancel(): void;
70
+ send(): void;
71
+ ngOnDestroy(): void;
72
+ static ɵfac: i0.ɵɵFactoryDeclaration<FeedbackSheetComponent, never>;
73
+ static ɵcmp: i0.ɵɵComponentDeclaration<FeedbackSheetComponent, "vo-feedback-sheet", never, { "message": { "alias": "message"; "required": false; }; "rating": { "alias": "rating"; "required": false; }; "defaultRating": { "alias": "defaultRating"; "required": false; }; "open": { "alias": "open"; "required": false; }; "defaultOpen": { "alias": "defaultOpen"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "defaultSelected": { "alias": "defaultSelected"; "required": false; }; "comment": { "alias": "comment"; "required": false; }; "defaultComment": { "alias": "defaultComment"; "required": false; }; "sending": { "alias": "sending"; "required": false; }; "question": { "alias": "question"; "required": false; }; "reasons": { "alias": "reasons"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "note": { "alias": "note"; "required": false; }; "sent": { "alias": "sent"; "required": false; }; "bare": { "alias": "bare"; "required": false; }; }, { "ratingChange": "ratingChange"; "openChange": "openChange"; "selectedChange": "selectedChange"; "commentChange": "commentChange"; "sentChange": "sentChange"; "submit": "submit"; }, never, never, true, never>;
74
+ }