@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,676 @@
1
+ // framework/angular/human-handoff/human-handoff.component.ts
2
+ //
3
+ // Native Angular port of framework/react/human-handoff/HumanHandoff.tsx.
4
+ // The agent passes a conversation to a person: why, who has it (with Reassign),
5
+ // when the reply is due, the context they need to pick it up, and what the
6
+ // customer was told — with a row at the foot that says where it stands. Inputs
7
+ // mirror the React props; callbacks become @Output EventEmitters.
8
+ //
9
+ // Icon substitutions (the Angular icon set has no "user" or "link"): the header
10
+ // badge uses "users" in place of the single-person "user" glyph, and the
11
+ // conversation link uses "ext" in place of "link". All other icons (chev-d,
12
+ // clock, edit, check, alert, ok) map 1:1.
13
+ import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
14
+ import { VoIconComponent } from '../core/icon.component';
15
+ import { ReducedMotionService } from '../core/reduced-motion.service';
16
+ import * as i0 from "@angular/core";
17
+ const initialsOf = (p) => p.initials ??
18
+ p.name
19
+ .split(' ')
20
+ .map((w) => w[0])
21
+ .join('')
22
+ .slice(0, 2);
23
+ /** The agent hands a conversation to a person, with what they need to pick it up. */
24
+ export class HumanHandoffComponent {
25
+ constructor() {
26
+ /** The card's heading. */
27
+ this.title = 'Handed off to a person';
28
+ /** Why the agent handed off, like "Refund over $500 needs a person". */
29
+ this.reason = '';
30
+ /** Who has it, or null while the agent is still finding someone. */
31
+ this.assignee = null;
32
+ /** The two lines shown while assignee is null. */
33
+ this.finding = { title: 'Finding someone' };
34
+ /** Seconds left until the reply is due. Whole minutes; orange under five; overdue at 0 or less. */
35
+ this.secondsLeft = 0;
36
+ /** The whole window, for the bar and the line beside it ("15 min target"). */
37
+ this.targetSeconds = 900;
38
+ /** What the person needs to pick it up. */
39
+ this.summary = '';
40
+ /** A few key facts, as label and value rows. */
41
+ this.facts = [];
42
+ /** What the agent told the customer. */
43
+ this.message = '';
44
+ /** The label over the message, like "Sent to Dana". */
45
+ this.messageLabel = 'Sent to the customer';
46
+ /** Set to true to add Edit: the message turns editable, and Save emits messageChange. */
47
+ this.editable = false;
48
+ /** Adds "· edited" to the label. */
49
+ this.edited = false;
50
+ /** The row at the foot that says where it stands. */
51
+ this.status = { title: '' };
52
+ /** Overridable labels. */
53
+ this.labels = {};
54
+ /** Emitted when a row is picked in Reassign. */
55
+ this.reassign = new EventEmitter();
56
+ /** Emitted by Save with the new message text (only when editable). */
57
+ this.messageChange = new EventEmitter();
58
+ this.motion = inject(ReducedMotionService);
59
+ this.editing = false;
60
+ this.menuOpen = false;
61
+ // resolved labels, recomputed when inputs change
62
+ this.L = this.resolveLabels();
63
+ this.onOutside = (e) => {
64
+ if (!this.menuOpen)
65
+ return;
66
+ const t = e.target;
67
+ if (this.pop?.nativeElement.contains(t) || this.reassignBtn?.nativeElement.contains(t))
68
+ return;
69
+ this.menuOpen = false;
70
+ };
71
+ }
72
+ ngOnChanges(changes) {
73
+ if (changes['labels'] || changes['targetSeconds']) {
74
+ this.L = this.resolveLabels();
75
+ }
76
+ // the box is drawn afresh each render in React; here we only overwrite its
77
+ // text when we are not editing, so what is typed is never clobbered
78
+ if (changes['message'] && !this.editing && this.box) {
79
+ this.box.nativeElement.textContent = this.message;
80
+ }
81
+ }
82
+ ngAfterViewInit() {
83
+ document.addEventListener('pointerdown', this.onOutside, true);
84
+ }
85
+ ngOnDestroy() {
86
+ document.removeEventListener('pointerdown', this.onOutside, true);
87
+ if (this.closeTimer)
88
+ clearTimeout(this.closeTimer);
89
+ }
90
+ resolveLabels() {
91
+ return {
92
+ assignedTo: 'Assigned to',
93
+ context: 'Context passed along',
94
+ reassign: 'Reassign',
95
+ reassignTo: 'Reassign to',
96
+ target: `${Math.round(this.targetSeconds / 60)} min target`,
97
+ edit: 'Edit',
98
+ save: 'Save',
99
+ cancel: 'Cancel',
100
+ edited: 'edited',
101
+ ...this.labels,
102
+ };
103
+ }
104
+ initials(p) {
105
+ return initialsOf(p);
106
+ }
107
+ whoLine(p) {
108
+ return [p.team, p.presence].filter(Boolean).join(' · ');
109
+ }
110
+ metaLine(p) {
111
+ return [p.team, p.presence].filter(Boolean).join(' · ');
112
+ }
113
+ get hasMessageChange() {
114
+ return this.editable;
115
+ }
116
+ get left() {
117
+ return Math.max(0, this.secondsLeft);
118
+ }
119
+ get due() {
120
+ const s = this.secondsLeft;
121
+ const m = Math.floor(s / 60);
122
+ return s <= 0
123
+ ? 'Reply overdue'
124
+ : m < 1
125
+ ? 'Reply due in under a minute'
126
+ : `Reply due in ${m} min`;
127
+ }
128
+ get slaTone() {
129
+ return this.secondsLeft <= 0 ? 'vo-bad' : this.secondsLeft < 300 ? 'vo-warn' : '';
130
+ }
131
+ get barWidth() {
132
+ return Math.min(100, (this.left / this.targetSeconds) * 100);
133
+ }
134
+ get st() {
135
+ return this.status.tone ?? 'wait';
136
+ }
137
+ // ---- reassign menu ----
138
+ toggleMenu() {
139
+ this.menuOpen = !this.menuOpen;
140
+ }
141
+ choose(p) {
142
+ if (p.name !== this.assignee?.name)
143
+ this.reassign.emit(p);
144
+ this.closeMenuSoon();
145
+ }
146
+ closeMenuSoon() {
147
+ if (this.closeTimer)
148
+ clearTimeout(this.closeTimer);
149
+ this.closeTimer = setTimeout(() => (this.menuOpen = false), this.motion.reduce() ? 0 : 120);
150
+ }
151
+ // ---- in-place edit of the message ----
152
+ startEdit() {
153
+ this.editing = true;
154
+ const focus = () => {
155
+ const b = this.box?.nativeElement;
156
+ if (!b)
157
+ return;
158
+ b.focus();
159
+ const s = getSelection();
160
+ s?.selectAllChildren(b);
161
+ s?.collapseToEnd();
162
+ };
163
+ if (this.motion.reduce())
164
+ focus();
165
+ else
166
+ requestAnimationFrame(focus);
167
+ }
168
+ save() {
169
+ const t = (this.box?.nativeElement.innerText ?? '').trim();
170
+ if (t && t !== this.message)
171
+ this.messageChange.emit(t);
172
+ this.editing = false;
173
+ }
174
+ cancelEdit() {
175
+ this.editing = false;
176
+ if (this.box)
177
+ this.box.nativeElement.textContent = this.message;
178
+ }
179
+ onKeydown(e) {
180
+ if (e.key === 'Escape') {
181
+ if (this.menuOpen) {
182
+ this.menuOpen = false;
183
+ this.reassignBtn?.nativeElement.focus({ preventScroll: true });
184
+ }
185
+ else if (this.editing) {
186
+ this.cancelEdit();
187
+ }
188
+ }
189
+ }
190
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HumanHandoffComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
191
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: HumanHandoffComponent, isStandalone: true, selector: "vo-human-handoff", inputs: { title: "title", reason: "reason", assignee: "assignee", finding: "finding", people: "people", secondsLeft: "secondsLeft", targetSeconds: "targetSeconds", summary: "summary", facts: "facts", link: "link", message: "message", messageLabel: "messageLabel", editable: "editable", edited: "edited", status: "status", labels: "labels", className: "className" }, outputs: { reassign: "reassign", messageChange: "messageChange" }, viewQueries: [{ propertyName: "box", first: true, predicate: ["box"], descendants: true }, { propertyName: "reassignBtn", first: true, predicate: ["reassignBtn"], descendants: true }, { propertyName: "pop", first: true, predicate: ["pop"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
192
+ <div
193
+ #root
194
+ data-vo=""
195
+ [class]="className"
196
+ style="width:100%;container-type:inline-size"
197
+ (keydown)="onKeydown($event)"
198
+ >
199
+ <div class="vo-hox vo-panel">
200
+ <div class="vo-hox-h">
201
+ <span class="vo-hox-ic"><vo-icon name="users"></vo-icon></span>
202
+ <div class="vo-hox-ht">
203
+ <b>{{ title }}</b><span class="vo-muted">{{ reason }}</span>
204
+ </div>
205
+ </div>
206
+
207
+ <div class="vo-hox-b">
208
+ <div class="vo-hox-col">
209
+ <span class="vo-hox-lb">{{ L.assignedTo }}</span>
210
+ <div class="vo-hox-who">
211
+ <span class="vo-hox-av">
212
+ @if (assignee) {
213
+ <span
214
+ class="vo-av vo-enter"
215
+ [style.background]="assignee.color ?? 'var(--vo-av-l)'"
216
+ >{{ initials(assignee) }}</span
217
+ >
218
+ } @else {
219
+ <span class="vo-spin" aria-hidden="true"></span>
220
+ }
221
+ </span>
222
+ <span class="vo-hox-wt">
223
+ <b>{{ assignee ? assignee.name : finding.title }}</b>
224
+ @if (assignee) {
225
+ <span
226
+ class="vo-hox-wd vo-enter"
227
+ [class.vo-ok]="assignee.tone === 'ok'"
228
+ [class.vo-warn]="assignee.tone === 'warn'"
229
+ >
230
+ @if (assignee.presence) {
231
+ <span class="vo-dot"></span>
232
+ }
233
+ <span>{{ whoLine(assignee) }}</span>
234
+ </span>
235
+ } @else {
236
+ <span class="vo-hox-wd"><span>{{ finding.detail }}</span></span>
237
+ }
238
+ </span>
239
+ @if (people) {
240
+ <button
241
+ #reassignBtn
242
+ type="button"
243
+ class="vo-hox-rb"
244
+ aria-haspopup="menu"
245
+ [attr.aria-expanded]="menuOpen"
246
+ [disabled]="!assignee"
247
+ (click)="toggleMenu()"
248
+ >
249
+ {{ L.reassign }}<vo-icon name="chev-d" size="xs"></vo-icon>
250
+ </button>
251
+ }
252
+ </div>
253
+
254
+ <div
255
+ class="vo-hox-sla"
256
+ [class.vo-warn]="slaTone === 'vo-warn'"
257
+ [class.vo-bad]="slaTone === 'vo-bad'"
258
+ >
259
+ <div class="vo-hox-sl">
260
+ <vo-icon name="clock"></vo-icon>
261
+ <span class="vo-hox-due vo-num">{{ due }}</span>
262
+ <span class="vo-muted">{{ L.target }}</span>
263
+ </div>
264
+ <div
265
+ class="vo-hox-bar"
266
+ role="progressbar"
267
+ aria-label="Time left to reply"
268
+ [attr.aria-valuemin]="0"
269
+ [attr.aria-valuemax]="targetSeconds"
270
+ [attr.aria-valuenow]="left"
271
+ >
272
+ <i [style.width.%]="barWidth"></i>
273
+ </div>
274
+ </div>
275
+
276
+ <div class="vo-hox-ms">
277
+ <div class="vo-hox-mh">
278
+ <span class="vo-hox-lb">{{
279
+ edited ? messageLabel + ' · ' + L.edited : messageLabel
280
+ }}</span>
281
+ <span class="vo-sp"></span>
282
+ @if (hasMessageChange && editing) {
283
+ <button type="button" class="vo-pill vo-ghost vo-sm" (click)="cancelEdit()">
284
+ {{ L.cancel }}
285
+ </button>
286
+ }
287
+ @if (hasMessageChange) {
288
+ @if (editing) {
289
+ <button type="button" class="vo-pill vo-primary vo-sm" (click)="save()">
290
+ {{ L.save }}
291
+ </button>
292
+ } @else {
293
+ <button type="button" class="vo-pill vo-ghost vo-sm" (click)="startEdit()">
294
+ <vo-icon name="edit" size="xs"></vo-icon>{{ L.edit }}
295
+ </button>
296
+ }
297
+ }
298
+ </div>
299
+ <div
300
+ #box
301
+ class="vo-hox-mb"
302
+ [attr.contenteditable]="editing ? 'true' : null"
303
+ role="textbox"
304
+ aria-multiline="true"
305
+ [attr.aria-readonly]="!editing"
306
+ [attr.aria-label]="messageLabel"
307
+ spellcheck="false"
308
+ >
309
+ {{ message }}
310
+ </div>
311
+ </div>
312
+ </div>
313
+
314
+ <div class="vo-hox-col">
315
+ <span class="vo-hox-lb">{{ L.context }}</span>
316
+ <p class="vo-hox-sum">{{ summary }}</p>
317
+ @if (facts.length > 0) {
318
+ <div class="vo-hox-facts">
319
+ @for (f of facts; track f.label) {
320
+ <div class="vo-hox-f">
321
+ <span class="vo-k">{{ f.label }}</span>
322
+ <span class="vo-v vo-num">{{ f.value }}</span>
323
+ </div>
324
+ }
325
+ </div>
326
+ }
327
+ @if (link) {
328
+ @if (link.href) {
329
+ <a
330
+ class="vo-fchip vo-lnk vo-hox-lnk"
331
+ [href]="link.href"
332
+ [attr.data-tip]="link.tip"
333
+ (click)="link.onClick && link.onClick()"
334
+ >
335
+ <vo-icon name="ext" size="xs"></vo-icon><span>{{ link.label }}</span>
336
+ </a>
337
+ } @else {
338
+ <button
339
+ type="button"
340
+ class="vo-fchip vo-lnk vo-hox-lnk"
341
+ [attr.data-tip]="link.tip"
342
+ (click)="link.onClick && link.onClick()"
343
+ >
344
+ <vo-icon name="ext" size="xs"></vo-icon><span>{{ link.label }}</span>
345
+ </button>
346
+ }
347
+ }
348
+ </div>
349
+ </div>
350
+
351
+ <div
352
+ class="vo-hox-st"
353
+ [class.vo-warn]="st === 'warn'"
354
+ [class.vo-ok]="st === 'ok'"
355
+ aria-live="polite"
356
+ >
357
+ <span class="vo-g">
358
+ @if (status.person; as p) {
359
+ <span class="vo-av" [style.background]="p.color ?? 'var(--vo-av-l)'">{{
360
+ initials(p)
361
+ }}</span>
362
+ } @else if (st === 'wait') {
363
+ <span class="vo-spin" aria-hidden="true"></span>
364
+ } @else {
365
+ <vo-icon [name]="st === 'warn' ? 'alert' : 'ok'"></vo-icon>
366
+ }
367
+ </span>
368
+ <span class="vo-t">
369
+ <b>{{ status.title }}</b>
370
+ @if (status.detail) {
371
+ <span>{{ status.detail }}</span>
372
+ }
373
+ </span>
374
+ </div>
375
+
376
+ @if (people) {
377
+ <div
378
+ #pop
379
+ class="vo-pop vo-hox-pop"
380
+ [class.vo-open]="menuOpen"
381
+ role="menu"
382
+ [attr.aria-label]="L.reassignTo"
383
+ style="right:0;--vo-origin:top right"
384
+ >
385
+ <div class="vo-ph">{{ L.reassignTo }}</div>
386
+ @for (p of people; track p.name) {
387
+ <button
388
+ type="button"
389
+ class="vo-mi"
390
+ role="menuitemradio"
391
+ [attr.aria-checked]="p.name === assignee?.name"
392
+ (click)="choose(p)"
393
+ >
394
+ <span class="vo-av" [style.background]="p.color ?? 'var(--vo-av-l)'">{{
395
+ initials(p)
396
+ }}</span>
397
+ <span
398
+ >{{ p.name }}<span class="vo-d">{{ metaLine(p) }}</span></span
399
+ >
400
+ <span class="vo-ck"><vo-icon name="check" size="xs"></vo-icon></span>
401
+ </button>
402
+ }
403
+ </div>
404
+ }
405
+ </div>
406
+ </div>
407
+ `, isInline: true, styles: [".vo-hox{position:relative;width:100%;margin:0 auto;padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3)}.vo-hox-h{display:flex;align-items:center;gap:var(--vo-s-3)}.vo-hox-ic{width:32px;height:32px;border-radius:calc(9px * var(--vo-rk));background:var(--vo-chip);color:var(--vo-fg2);display:grid;place-items:center;flex:none}.vo-hox-ht{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-ht b{font-weight:500;font-size:14px}.vo-hox-ht span{font-size:13px}.vo-hox-b{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--vo-s-4) var(--vo-s-6);align-items:start;padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}@container (max-width:600px){.vo-hox-b{grid-template-columns:minmax(0,1fr)}.vo-hox-col+.vo-hox-col{padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}}.vo-hox-col{display:flex;flex-direction:column;gap:var(--vo-s-2);min-width:0}.vo-hox-lb{font-size:12px;color:var(--vo-muted)}.vo-hox-who{display:flex;align-items:center;gap:10px;min-height:40px}.vo-hox-av{width:28px;height:28px;display:grid;place-items:center;flex:none;border-radius:50%;background:var(--vo-chip);color:var(--vo-fg2)}.vo-hox-av .vo-av{width:28px;height:28px;font-size:11px}.vo-hox-wt{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-wt b{font-weight:500;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-hox-wd{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-hox-wd .vo-dot{color:var(--vo-faint)}.vo-hox-wd.vo-ok .vo-dot{color:var(--vo-ok-mark)}.vo-hox-wd.vo-warn{color:var(--vo-warn)}.vo-hox-wd.vo-warn .vo-dot{color:var(--vo-warn-mark)}.vo-hox-rb{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 var(--vo-s-2) 0 10px;border-radius:var(--vo-r-pill);font-size:13px;color:var(--vo-fg2);flex:none;transition:background .16s,color .16s}.vo-hox-rb[aria-expanded=true]{background:var(--vo-row);color:var(--vo-fg)}@media (hover:hover) and (pointer:fine){.vo-hox-rb:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-hox-rb>svg{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-hox-rb[aria-expanded=true]>svg{transform:rotate(180deg)}.vo-hox-rb[disabled]{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-hox-pop{min-width:240px}.vo-hox-pop .vo-mi .vo-av{width:20px;height:20px;font-size:9px}.vo-hox-pop .vo-mi>span:not(.vo-ck):not(.vo-av){flex:1;min-width:0}.vo-hox-sla{display:flex;flex-direction:column;gap:var(--vo-s-2);padding-top:var(--vo-s-2)}.vo-hox-sl{display:flex;align-items:center;gap:var(--vo-s-2);font-size:13px}.vo-hox-sl>svg{color:var(--vo-fg2);flex:none}.vo-hox-sl .vo-muted{margin-left:auto;font-size:12px;white-space:nowrap}.vo-hox-due{min-width:0}.vo-hox-bar{height:4px;border-radius:2px;background:var(--vo-chip);overflow:hidden}.vo-hox-bar i{display:block;height:100%;width:100%;border-radius:inherit;background:var(--vo-fg2);transition:width 1s linear,background .3s}.vo-hox-sla.vo-warn .vo-hox-sl>svg,.vo-hox-sla.vo-warn .vo-hox-due{color:var(--vo-warn)}.vo-hox-sla.vo-warn .vo-hox-bar i{background:var(--vo-warn-mark)}.vo-hox-sla.vo-bad .vo-hox-sl>svg,.vo-hox-sla.vo-bad .vo-hox-due{color:var(--vo-bad)}.vo-hox-sum{margin:0;font-size:13px;line-height:1.5;color:var(--vo-fg2)}.vo-hox-facts{display:flex;flex-direction:column;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-hox-f{display:flex;align-items:center;gap:10px;min-height:32px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13px}.vo-hox-f .vo-k{width:72px;flex:none;color:var(--vo-muted)}.vo-hox-f .vo-v{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-hox-lnk{align-self:flex-start;max-width:100%}.vo-hox-lnk>span{overflow:hidden;text-overflow:ellipsis}.vo-hox-ms{display:flex;flex-direction:column;gap:var(--vo-s-2);margin-top:var(--vo-s-1);padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-hox-mh{display:flex;align-items:center;gap:var(--vo-s-2);min-height:28px}.vo-hox-mh .vo-sp{flex:1}.vo-hox-mb{padding:10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13.5px;line-height:1.5;outline:0;transition:box-shadow var(--vo-t-fast),background var(--vo-t-fast)}.vo-hox-mb[contenteditable=true]{background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line) 50%,transparent)}@supports (corner-shape:squircle){.vo-hox-mb[contenteditable=true]{corner-shape:squircle;border-radius:var(--vo-r-box-sq)}}.vo-hox-mb[contenteditable=true]:focus{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line-strong) 50%,transparent)}.vo-hox-st{display:flex;align-items:center;gap:var(--vo-s-3);padding:10px 10px 10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-chip);font-size:13.5px;transition:background .32s}.vo-hox-st.vo-warn{background:var(--vo-warn-bg)}.vo-hox-st.vo-ok{background:var(--vo-ok-bg)}.vo-hox-st .vo-g{width:18px;height:18px;display:grid;place-items:center;flex:none;color:var(--vo-fg2)}.vo-hox-st.vo-warn .vo-g{color:var(--vo-warn)}.vo-hox-st.vo-ok .vo-g{color:var(--vo-ok)}.vo-hox-st .vo-g .vo-av{width:18px;height:18px;font-size:8.5px}.vo-hox-st .vo-t{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-st .vo-t b{font-weight:400}.vo-hox-st .vo-t>span{font-size:13px;color:var(--vo-fg2)}.vo-hox-st .vo-t,.vo-hox-sum,.vo-hox-mb{text-wrap:pretty}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;display:inline-block}.vo-av{width:22px;height:22px;border-radius:50%;display:inline-grid;place-items:center;font-size:10px;font-weight:500;color:#fff;flex:none}.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-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-fchip{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 10px 0 var(--vo-s-2);border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:12.5px;color:var(--vo-fg);white-space:nowrap}.vo-fchip.vo-lnk{background:none;padding:0 2px;height:auto;color:var(--vo-accent-fg);box-shadow:none;cursor:pointer;transition:color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-fchip.vo-lnk:hover{color:var(--vo-accent)}}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-pop{position:absolute;z-index:50;min-width:200px;background:var(--vo-raised);border-radius:calc(14px * var(--vo-rk));box-shadow:var(--vo-shadow-pop);padding:6px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px) scale(.98);transform-origin:var(--vo-origin,top left);filter:blur(3px);transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;pointer-events:auto;transform:none;filter:none;transition-property:opacity,transform,filter}.vo-ph{padding:6px var(--vo-s-2) var(--vo-s-1);font-size:11.5px;color:var(--vo-muted)}.vo-mi{display:flex;align-items:center;gap:10px;width:100%;padding:7px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));font-size:13px;text-align:left;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi+.vo-mi{margin-top:2px}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}@media (hover:hover) and (pointer:fine){.vo-mi:is(:hover,[aria-checked=true]) .vo-d{color:var(--vo-fg2)}}.vo-mi .vo-ck{margin-left:auto;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transition:opacity var(--vo-t-fast)}.vo-mi[aria-checked=true] .vo-ck{opacity:1}.vo-mi[aria-checked=true]{background:var(--vo-row);font-weight:500}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
408
+ }
409
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: HumanHandoffComponent, decorators: [{
410
+ type: Component,
411
+ args: [{ selector: 'vo-human-handoff', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
412
+ <div
413
+ #root
414
+ data-vo=""
415
+ [class]="className"
416
+ style="width:100%;container-type:inline-size"
417
+ (keydown)="onKeydown($event)"
418
+ >
419
+ <div class="vo-hox vo-panel">
420
+ <div class="vo-hox-h">
421
+ <span class="vo-hox-ic"><vo-icon name="users"></vo-icon></span>
422
+ <div class="vo-hox-ht">
423
+ <b>{{ title }}</b><span class="vo-muted">{{ reason }}</span>
424
+ </div>
425
+ </div>
426
+
427
+ <div class="vo-hox-b">
428
+ <div class="vo-hox-col">
429
+ <span class="vo-hox-lb">{{ L.assignedTo }}</span>
430
+ <div class="vo-hox-who">
431
+ <span class="vo-hox-av">
432
+ @if (assignee) {
433
+ <span
434
+ class="vo-av vo-enter"
435
+ [style.background]="assignee.color ?? 'var(--vo-av-l)'"
436
+ >{{ initials(assignee) }}</span
437
+ >
438
+ } @else {
439
+ <span class="vo-spin" aria-hidden="true"></span>
440
+ }
441
+ </span>
442
+ <span class="vo-hox-wt">
443
+ <b>{{ assignee ? assignee.name : finding.title }}</b>
444
+ @if (assignee) {
445
+ <span
446
+ class="vo-hox-wd vo-enter"
447
+ [class.vo-ok]="assignee.tone === 'ok'"
448
+ [class.vo-warn]="assignee.tone === 'warn'"
449
+ >
450
+ @if (assignee.presence) {
451
+ <span class="vo-dot"></span>
452
+ }
453
+ <span>{{ whoLine(assignee) }}</span>
454
+ </span>
455
+ } @else {
456
+ <span class="vo-hox-wd"><span>{{ finding.detail }}</span></span>
457
+ }
458
+ </span>
459
+ @if (people) {
460
+ <button
461
+ #reassignBtn
462
+ type="button"
463
+ class="vo-hox-rb"
464
+ aria-haspopup="menu"
465
+ [attr.aria-expanded]="menuOpen"
466
+ [disabled]="!assignee"
467
+ (click)="toggleMenu()"
468
+ >
469
+ {{ L.reassign }}<vo-icon name="chev-d" size="xs"></vo-icon>
470
+ </button>
471
+ }
472
+ </div>
473
+
474
+ <div
475
+ class="vo-hox-sla"
476
+ [class.vo-warn]="slaTone === 'vo-warn'"
477
+ [class.vo-bad]="slaTone === 'vo-bad'"
478
+ >
479
+ <div class="vo-hox-sl">
480
+ <vo-icon name="clock"></vo-icon>
481
+ <span class="vo-hox-due vo-num">{{ due }}</span>
482
+ <span class="vo-muted">{{ L.target }}</span>
483
+ </div>
484
+ <div
485
+ class="vo-hox-bar"
486
+ role="progressbar"
487
+ aria-label="Time left to reply"
488
+ [attr.aria-valuemin]="0"
489
+ [attr.aria-valuemax]="targetSeconds"
490
+ [attr.aria-valuenow]="left"
491
+ >
492
+ <i [style.width.%]="barWidth"></i>
493
+ </div>
494
+ </div>
495
+
496
+ <div class="vo-hox-ms">
497
+ <div class="vo-hox-mh">
498
+ <span class="vo-hox-lb">{{
499
+ edited ? messageLabel + ' · ' + L.edited : messageLabel
500
+ }}</span>
501
+ <span class="vo-sp"></span>
502
+ @if (hasMessageChange && editing) {
503
+ <button type="button" class="vo-pill vo-ghost vo-sm" (click)="cancelEdit()">
504
+ {{ L.cancel }}
505
+ </button>
506
+ }
507
+ @if (hasMessageChange) {
508
+ @if (editing) {
509
+ <button type="button" class="vo-pill vo-primary vo-sm" (click)="save()">
510
+ {{ L.save }}
511
+ </button>
512
+ } @else {
513
+ <button type="button" class="vo-pill vo-ghost vo-sm" (click)="startEdit()">
514
+ <vo-icon name="edit" size="xs"></vo-icon>{{ L.edit }}
515
+ </button>
516
+ }
517
+ }
518
+ </div>
519
+ <div
520
+ #box
521
+ class="vo-hox-mb"
522
+ [attr.contenteditable]="editing ? 'true' : null"
523
+ role="textbox"
524
+ aria-multiline="true"
525
+ [attr.aria-readonly]="!editing"
526
+ [attr.aria-label]="messageLabel"
527
+ spellcheck="false"
528
+ >
529
+ {{ message }}
530
+ </div>
531
+ </div>
532
+ </div>
533
+
534
+ <div class="vo-hox-col">
535
+ <span class="vo-hox-lb">{{ L.context }}</span>
536
+ <p class="vo-hox-sum">{{ summary }}</p>
537
+ @if (facts.length > 0) {
538
+ <div class="vo-hox-facts">
539
+ @for (f of facts; track f.label) {
540
+ <div class="vo-hox-f">
541
+ <span class="vo-k">{{ f.label }}</span>
542
+ <span class="vo-v vo-num">{{ f.value }}</span>
543
+ </div>
544
+ }
545
+ </div>
546
+ }
547
+ @if (link) {
548
+ @if (link.href) {
549
+ <a
550
+ class="vo-fchip vo-lnk vo-hox-lnk"
551
+ [href]="link.href"
552
+ [attr.data-tip]="link.tip"
553
+ (click)="link.onClick && link.onClick()"
554
+ >
555
+ <vo-icon name="ext" size="xs"></vo-icon><span>{{ link.label }}</span>
556
+ </a>
557
+ } @else {
558
+ <button
559
+ type="button"
560
+ class="vo-fchip vo-lnk vo-hox-lnk"
561
+ [attr.data-tip]="link.tip"
562
+ (click)="link.onClick && link.onClick()"
563
+ >
564
+ <vo-icon name="ext" size="xs"></vo-icon><span>{{ link.label }}</span>
565
+ </button>
566
+ }
567
+ }
568
+ </div>
569
+ </div>
570
+
571
+ <div
572
+ class="vo-hox-st"
573
+ [class.vo-warn]="st === 'warn'"
574
+ [class.vo-ok]="st === 'ok'"
575
+ aria-live="polite"
576
+ >
577
+ <span class="vo-g">
578
+ @if (status.person; as p) {
579
+ <span class="vo-av" [style.background]="p.color ?? 'var(--vo-av-l)'">{{
580
+ initials(p)
581
+ }}</span>
582
+ } @else if (st === 'wait') {
583
+ <span class="vo-spin" aria-hidden="true"></span>
584
+ } @else {
585
+ <vo-icon [name]="st === 'warn' ? 'alert' : 'ok'"></vo-icon>
586
+ }
587
+ </span>
588
+ <span class="vo-t">
589
+ <b>{{ status.title }}</b>
590
+ @if (status.detail) {
591
+ <span>{{ status.detail }}</span>
592
+ }
593
+ </span>
594
+ </div>
595
+
596
+ @if (people) {
597
+ <div
598
+ #pop
599
+ class="vo-pop vo-hox-pop"
600
+ [class.vo-open]="menuOpen"
601
+ role="menu"
602
+ [attr.aria-label]="L.reassignTo"
603
+ style="right:0;--vo-origin:top right"
604
+ >
605
+ <div class="vo-ph">{{ L.reassignTo }}</div>
606
+ @for (p of people; track p.name) {
607
+ <button
608
+ type="button"
609
+ class="vo-mi"
610
+ role="menuitemradio"
611
+ [attr.aria-checked]="p.name === assignee?.name"
612
+ (click)="choose(p)"
613
+ >
614
+ <span class="vo-av" [style.background]="p.color ?? 'var(--vo-av-l)'">{{
615
+ initials(p)
616
+ }}</span>
617
+ <span
618
+ >{{ p.name }}<span class="vo-d">{{ metaLine(p) }}</span></span
619
+ >
620
+ <span class="vo-ck"><vo-icon name="check" size="xs"></vo-icon></span>
621
+ </button>
622
+ }
623
+ </div>
624
+ }
625
+ </div>
626
+ </div>
627
+ `, styles: [".vo-hox{position:relative;width:100%;margin:0 auto;padding:var(--vo-s-4);display:flex;flex-direction:column;gap:var(--vo-s-3)}.vo-hox-h{display:flex;align-items:center;gap:var(--vo-s-3)}.vo-hox-ic{width:32px;height:32px;border-radius:calc(9px * var(--vo-rk));background:var(--vo-chip);color:var(--vo-fg2);display:grid;place-items:center;flex:none}.vo-hox-ht{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-ht b{font-weight:500;font-size:14px}.vo-hox-ht span{font-size:13px}.vo-hox-b{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:var(--vo-s-4) var(--vo-s-6);align-items:start;padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}@container (max-width:600px){.vo-hox-b{grid-template-columns:minmax(0,1fr)}.vo-hox-col+.vo-hox-col{padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}}.vo-hox-col{display:flex;flex-direction:column;gap:var(--vo-s-2);min-width:0}.vo-hox-lb{font-size:12px;color:var(--vo-muted)}.vo-hox-who{display:flex;align-items:center;gap:10px;min-height:40px}.vo-hox-av{width:28px;height:28px;display:grid;place-items:center;flex:none;border-radius:50%;background:var(--vo-chip);color:var(--vo-fg2)}.vo-hox-av .vo-av{width:28px;height:28px;font-size:11px}.vo-hox-wt{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-wt b{font-weight:500;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-hox-wd{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-hox-wd .vo-dot{color:var(--vo-faint)}.vo-hox-wd.vo-ok .vo-dot{color:var(--vo-ok-mark)}.vo-hox-wd.vo-warn{color:var(--vo-warn)}.vo-hox-wd.vo-warn .vo-dot{color:var(--vo-warn-mark)}.vo-hox-rb{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 var(--vo-s-2) 0 10px;border-radius:var(--vo-r-pill);font-size:13px;color:var(--vo-fg2);flex:none;transition:background .16s,color .16s}.vo-hox-rb[aria-expanded=true]{background:var(--vo-row);color:var(--vo-fg)}@media (hover:hover) and (pointer:fine){.vo-hox-rb:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-hox-rb>svg{color:var(--vo-muted);transition:transform .32s var(--vo-ease)}.vo-hox-rb[aria-expanded=true]>svg{transform:rotate(180deg)}.vo-hox-rb[disabled]{opacity:1;cursor:not-allowed;background:none;color:var(--vo-dis)}.vo-hox-pop{min-width:240px}.vo-hox-pop .vo-mi .vo-av{width:20px;height:20px;font-size:9px}.vo-hox-pop .vo-mi>span:not(.vo-ck):not(.vo-av){flex:1;min-width:0}.vo-hox-sla{display:flex;flex-direction:column;gap:var(--vo-s-2);padding-top:var(--vo-s-2)}.vo-hox-sl{display:flex;align-items:center;gap:var(--vo-s-2);font-size:13px}.vo-hox-sl>svg{color:var(--vo-fg2);flex:none}.vo-hox-sl .vo-muted{margin-left:auto;font-size:12px;white-space:nowrap}.vo-hox-due{min-width:0}.vo-hox-bar{height:4px;border-radius:2px;background:var(--vo-chip);overflow:hidden}.vo-hox-bar i{display:block;height:100%;width:100%;border-radius:inherit;background:var(--vo-fg2);transition:width 1s linear,background .3s}.vo-hox-sla.vo-warn .vo-hox-sl>svg,.vo-hox-sla.vo-warn .vo-hox-due{color:var(--vo-warn)}.vo-hox-sla.vo-warn .vo-hox-bar i{background:var(--vo-warn-mark)}.vo-hox-sla.vo-bad .vo-hox-sl>svg,.vo-hox-sla.vo-bad .vo-hox-due{color:var(--vo-bad)}.vo-hox-sum{margin:0;font-size:13px;line-height:1.5;color:var(--vo-fg2)}.vo-hox-facts{display:flex;flex-direction:column;border-bottom:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-hox-f{display:flex;align-items:center;gap:10px;min-height:32px;border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13px}.vo-hox-f .vo-k{width:72px;flex:none;color:var(--vo-muted)}.vo-hox-f .vo-v{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vo-hox-lnk{align-self:flex-start;max-width:100%}.vo-hox-lnk>span{overflow:hidden;text-overflow:ellipsis}.vo-hox-ms{display:flex;flex-direction:column;gap:var(--vo-s-2);margin-top:var(--vo-s-1);padding-top:var(--vo-s-3);border-top:1px solid color-mix(in srgb,var(--vo-line) 50%,transparent)}.vo-hox-mh{display:flex;align-items:center;gap:var(--vo-s-2);min-height:28px}.vo-hox-mh .vo-sp{flex:1}.vo-hox-mb{padding:10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:13.5px;line-height:1.5;outline:0;transition:box-shadow var(--vo-t-fast),background var(--vo-t-fast)}.vo-hox-mb[contenteditable=true]{background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line) 50%,transparent)}@supports (corner-shape:squircle){.vo-hox-mb[contenteditable=true]{corner-shape:squircle;border-radius:var(--vo-r-box-sq)}}.vo-hox-mb[contenteditable=true]:focus{box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-field-line-strong) 50%,transparent)}.vo-hox-st{display:flex;align-items:center;gap:var(--vo-s-3);padding:10px 10px 10px var(--vo-s-3);border-radius:var(--vo-r-in);background:var(--vo-chip);font-size:13.5px;transition:background .32s}.vo-hox-st.vo-warn{background:var(--vo-warn-bg)}.vo-hox-st.vo-ok{background:var(--vo-ok-bg)}.vo-hox-st .vo-g{width:18px;height:18px;display:grid;place-items:center;flex:none;color:var(--vo-fg2)}.vo-hox-st.vo-warn .vo-g{color:var(--vo-warn)}.vo-hox-st.vo-ok .vo-g{color:var(--vo-ok)}.vo-hox-st .vo-g .vo-av{width:18px;height:18px;font-size:8.5px}.vo-hox-st .vo-t{flex:1;min-width:0;display:flex;flex-direction:column}.vo-hox-st .vo-t b{font-weight:400}.vo-hox-st .vo-t>span{font-size:13px;color:var(--vo-fg2)}.vo-hox-st .vo-t,.vo-hox-sum,.vo-hox-mb{text-wrap:pretty}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-num{font-variant-numeric:tabular-nums}.vo-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;display:inline-block}.vo-av{width:22px;height:22px;border-radius:50%;display:inline-grid;place-items:center;font-size:10px;font-weight:500;color:#fff;flex:none}.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-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-fchip{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 10px 0 var(--vo-s-2);border-radius:var(--vo-r-pill);background:var(--vo-surface);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--vo-line) 50%,transparent);font-size:12.5px;color:var(--vo-fg);white-space:nowrap}.vo-fchip.vo-lnk{background:none;padding:0 2px;height:auto;color:var(--vo-accent-fg);box-shadow:none;cursor:pointer;transition:color var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-fchip.vo-lnk:hover{color:var(--vo-accent)}}.vo-pill{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:32px;padding:0 14px;border-radius:var(--vo-r-pill);font-size:13px;font-weight:500;white-space:nowrap;cursor:pointer;transition:background var(--vo-t-fast),color var(--vo-t-fast),opacity var(--vo-t-fast),transform .15s}.vo-pill:active{transform:scale(.97)}.vo-pill.vo-primary{background:var(--vo-accent);color:var(--vo-on-accent)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-primary:hover{background:var(--vo-accent-2)}}.vo-pill.vo-ghost{color:var(--vo-fg2)}@media (hover:hover) and (pointer:fine){.vo-pill.vo-ghost:hover{background:var(--vo-row);color:var(--vo-fg)}}.vo-pill.vo-sm{height:28px;padding:0 11px;font-size:12.5px}.vo-pop{position:absolute;z-index:50;min-width:200px;background:var(--vo-raised);border-radius:calc(14px * var(--vo-rk));box-shadow:var(--vo-shadow-pop);padding:6px;opacity:0;visibility:hidden;pointer-events:none;transform:translateY(6px) scale(.98);transform-origin:var(--vo-origin,top left);filter:blur(3px);transition:opacity .2s var(--vo-ease),transform .35s var(--vo-ease),filter .2s var(--vo-ease),visibility 0s .2s}.vo-pop.vo-open{opacity:1;visibility:visible;pointer-events:auto;transform:none;filter:none;transition-property:opacity,transform,filter}.vo-ph{padding:6px var(--vo-s-2) var(--vo-s-1);font-size:11.5px;color:var(--vo-muted)}.vo-mi{display:flex;align-items:center;gap:10px;width:100%;padding:7px var(--vo-s-2);border-radius:calc(9px * var(--vo-rk));font-size:13px;text-align:left;color:var(--vo-fg);cursor:pointer;transition:background var(--vo-t-fast)}@media (hover:hover) and (pointer:fine){.vo-mi:hover{background:var(--vo-row)}}.vo-mi+.vo-mi{margin-top:2px}.vo-mi .vo-d{display:block;font-size:12px;color:var(--vo-muted)}@media (hover:hover) and (pointer:fine){.vo-mi:is(:hover,[aria-checked=true]) .vo-d{color:var(--vo-fg2)}}.vo-mi .vo-ck{margin-left:auto;color:var(--vo-accent-fg,var(--vo-accent));opacity:0;transition:opacity var(--vo-t-fast)}.vo-mi[aria-checked=true] .vo-ck{opacity:1}.vo-mi[aria-checked=true]{background:var(--vo-row);font-weight:500}\n"] }]
628
+ }], propDecorators: { title: [{
629
+ type: Input
630
+ }], reason: [{
631
+ type: Input
632
+ }], assignee: [{
633
+ type: Input
634
+ }], finding: [{
635
+ type: Input
636
+ }], people: [{
637
+ type: Input
638
+ }], secondsLeft: [{
639
+ type: Input
640
+ }], targetSeconds: [{
641
+ type: Input
642
+ }], summary: [{
643
+ type: Input
644
+ }], facts: [{
645
+ type: Input
646
+ }], link: [{
647
+ type: Input
648
+ }], message: [{
649
+ type: Input
650
+ }], messageLabel: [{
651
+ type: Input
652
+ }], editable: [{
653
+ type: Input
654
+ }], edited: [{
655
+ type: Input
656
+ }], status: [{
657
+ type: Input
658
+ }], labels: [{
659
+ type: Input
660
+ }], className: [{
661
+ type: Input
662
+ }], reassign: [{
663
+ type: Output
664
+ }], messageChange: [{
665
+ type: Output
666
+ }], box: [{
667
+ type: ViewChild,
668
+ args: ['box']
669
+ }], reassignBtn: [{
670
+ type: ViewChild,
671
+ args: ['reassignBtn']
672
+ }], pop: [{
673
+ type: ViewChild,
674
+ args: ['pop']
675
+ }] } });
676
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHVtYW4taGFuZG9mZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9odW1hbi1oYW5kb2ZmL2h1bWFuLWhhbmRvZmYuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZEQUE2RDtBQUM3RCxFQUFFO0FBQ0YseUVBQXlFO0FBQ3pFLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsK0VBQStFO0FBQy9FLGtFQUFrRTtBQUNsRSxFQUFFO0FBQ0YsZ0ZBQWdGO0FBQ2hGLHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFDNUUsMENBQTBDO0FBRTFDLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixFQUNqQixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQTREdEUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFnQixFQUFVLEVBQUUsQ0FDOUMsQ0FBQyxDQUFDLFFBQVE7SUFDVixDQUFDLENBQUMsSUFBSTtTQUNILEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDO1NBQ1IsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVqQixxRkFBcUY7QUFpT3JGLE1BQU0sT0FBTyxxQkFBcUI7SUFoT2xDO1FBaU9FLDBCQUEwQjtRQUNqQixVQUFLLEdBQUcsd0JBQXdCLENBQUM7UUFDMUMsd0VBQXdFO1FBQy9ELFdBQU0sR0FBRyxFQUFFLENBQUM7UUFDckIsb0VBQW9FO1FBQzNELGFBQVEsR0FBeUIsSUFBSSxDQUFDO1FB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QUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdJLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFFbUIsR0FBRztzQkFBNUIsU0FBUzt1QkFBQyxLQUFLO2dCQUNrQixXQUFXO3NCQUE1QyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0UsR0FBRztzQkFBNUIsU0FBUzt1QkFBQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZnJhbWV3b3JrL2FuZ3VsYXIvaHVtYW4taGFuZG9mZi9odW1hbi1oYW5kb2ZmLmNvbXBvbmVudC50c1xuLy9cbi8vIE5hdGl2ZSBBbmd1bGFyIHBvcnQgb2YgZnJhbWV3b3JrL3JlYWN0L2h1bWFuLWhhbmRvZmYvSHVtYW5IYW5kb2ZmLnRzeC5cbi8vIFRoZSBhZ2VudCBwYXNzZXMgYSBjb252ZXJzYXRpb24gdG8gYSBwZXJzb246IHdoeSwgd2hvIGhhcyBpdCAod2l0aCBSZWFzc2lnbiksXG4vLyB3aGVuIHRoZSByZXBseSBpcyBkdWUsIHRoZSBjb250ZXh0IHRoZXkgbmVlZCB0byBwaWNrIGl0IHVwLCBhbmQgd2hhdCB0aGVcbi8vIGN1c3RvbWVyIHdhcyB0b2xkIOKAlCB3aXRoIGEgcm93IGF0IHRoZSBmb290IHRoYXQgc2F5cyB3aGVyZSBpdCBzdGFuZHMuIElucHV0c1xuLy8gbWlycm9yIHRoZSBSZWFjdCBwcm9wczsgY2FsbGJhY2tzIGJlY29tZSBAT3V0cHV0IEV2ZW50RW1pdHRlcnMuXG4vL1xuLy8gSWNvbiBzdWJzdGl0dXRpb25zICh0aGUgQW5ndWxhciBpY29uIHNldCBoYXMgbm8gXCJ1c2VyXCIgb3IgXCJsaW5rXCIpOiB0aGUgaGVhZGVyXG4vLyBiYWRnZSB1c2VzIFwidXNlcnNcIiBpbiBwbGFjZSBvZiB0aGUgc2luZ2xlLXBlcnNvbiBcInVzZXJcIiBnbHlwaCwgYW5kIHRoZVxuLy8gY29udmVyc2F0aW9uIGxpbmsgdXNlcyBcImV4dFwiIGluIHBsYWNlIG9mIFwibGlua1wiLiBBbGwgb3RoZXIgaWNvbnMgKGNoZXYtZCxcbi8vIGNsb2NrLCBlZGl0LCBjaGVjaywgYWxlcnQsIG9rKSBtYXAgMToxLlxuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWb0ljb25Db21wb25lbnQgfSBmcm9tICcuLi9jb3JlL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IFJlZHVjZWRNb3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29yZS9yZWR1Y2VkLW1vdGlvbi5zZXJ2aWNlJztcblxuLyoqIEEgcGVyc29uIHRoZSBjb252ZXJzYXRpb24gY2FuIGdvIHRvLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kb2ZmUGVyc29uIHtcbiAgLyoqIFVzZWQgYXMgdGhlIGtleSwgc28ga2VlcCBpdCB1bmlxdWUuICovXG4gIG5hbWU6IHN0cmluZztcbiAgaW5pdGlhbHM/OiBzdHJpbmc7XG4gIC8qKiBUaGUgYXZhdGFyJ3MgY29sb3VyLCBsaWtlICd2YXIoLS12by1hdi1tKScuICovXG4gIGNvbG9yPzogc3RyaW5nO1xuICAvKiogTGlrZSBcIkJpbGxpbmdcIi4gKi9cbiAgdGVhbT86IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhleSBjYW4gdGFrZSBpdCBub3csIGxpa2UgXCJBdmFpbGFibGVcIiwgXCJJbiBhIGNhbGxcIiBvciBcIk91dCB1bnRpbCAycG1cIi4gKi9cbiAgcHJlc2VuY2U/OiBzdHJpbmc7XG4gIC8qKiBvayBwdXRzIGEgZ3JlZW4gZG90IGJlZm9yZSB0aGUgcHJlc2VuY2UsIHdhcm4gdHVybnMgaXQgb3JhbmdlLiAqL1xuICB0b25lPzogJ29rJyB8ICd3YXJuJztcbn1cblxuLyoqIE9uZSBrZXkgZmFjdCBwYXNzZWQgYWxvbmcsIGFzIGEgbGFiZWwgYW5kIHZhbHVlIHJvdy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZG9mZkZhY3Qge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKiogQSBsaW5rIHRvIHRoZSB3aG9sZSBjb252ZXJzYXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRvZmZMaW5rIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgaHJlZj86IHN0cmluZztcbiAgb25DbGljaz86ICgpID0+IHZvaWQ7XG4gIHRpcD86IHN0cmluZztcbn1cblxuLyoqIFRoZSB0d28gbGluZXMgc2hvd24gd2hpbGUgbm8gb25lIGhhcyBpdCB5ZXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRvZmZGaW5kaW5nIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG4vKiogVGhlIHJvdyBhdCB0aGUgZm9vdCB0aGF0IHNheXMgd2hlcmUgaXQgc3RhbmRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kb2ZmU3RhdHVzIHtcbiAgLyoqIHdhaXQgaXMgbmV1dHJhbCB3aXRoIGEgc3Bpbm5lciwgd2FybiBvcmFuZ2Ugd2l0aCBhbiBhbGVydCwgb2sgZ3JlZW4uICovXG4gIHRvbmU/OiAnd2FpdCcgfCAnd2FybicgfCAnb2snO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXRhaWw/OiBzdHJpbmc7XG4gIC8qKiBTaG93biBpbiBwbGFjZSBvZiB0aGUgaWNvbiwgbGlrZSB0aGUgcGVyc29uIHdobyBqdXN0IGpvaW5lZC4gKi9cbiAgcGVyc29uPzogSGFuZG9mZlBlcnNvbjtcbn1cblxuLyoqIE92ZXJyaWRhYmxlIGxhYmVscy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZG9mZkxhYmVscyB7XG4gIGFzc2lnbmVkVG8/OiBzdHJpbmc7XG4gIGNvbnRleHQ/OiBzdHJpbmc7XG4gIHJlYXNzaWduPzogc3RyaW5nO1xuICByZWFzc2lnblRvPzogc3RyaW5nO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIGVkaXQ/OiBzdHJpbmc7XG4gIHNhdmU/OiBzdHJpbmc7XG4gIGNhbmNlbD86IHN0cmluZztcbiAgZWRpdGVkPzogc3RyaW5nO1xufVxuXG5jb25zdCBpbml0aWFsc09mID0gKHA6IEhhbmRvZmZQZXJzb24pOiBzdHJpbmcgPT5cbiAgcC5pbml0aWFscyA/P1xuICBwLm5hbWVcbiAgICAuc3BsaXQoJyAnKVxuICAgIC5tYXAoKHcpID0+IHdbMF0pXG4gICAgLmpvaW4oJycpXG4gICAgLnNsaWNlKDAsIDIpO1xuXG4vKiogVGhlIGFnZW50IGhhbmRzIGEgY29udmVyc2F0aW9uIHRvIGEgcGVyc29uLCB3aXRoIHdoYXQgdGhleSBuZWVkIHRvIHBpY2sgaXQgdXAuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by1odW1hbi1oYW5kb2ZmJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW1ZvSWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgI3Jvb3RcbiAgICAgIGRhdGEtdm89XCJcIlxuICAgICAgW2NsYXNzXT1cImNsYXNzTmFtZVwiXG4gICAgICBzdHlsZT1cIndpZHRoOjEwMCU7Y29udGFpbmVyLXR5cGU6aW5saW5lLXNpemVcIlxuICAgICAgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudClcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3ggdm8tcGFuZWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLWhveC1oXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1ob3gtaWNcIj48dm8taWNvbiBuYW1lPVwidXNlcnNcIj48L3ZvLWljb24+PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtaHRcIj5cbiAgICAgICAgICAgIDxiPnt7IHRpdGxlIH19PC9iPjxzcGFuIGNsYXNzPVwidm8tbXV0ZWRcIj57eyByZWFzb24gfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtYlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtY29sXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWhveC1sYlwiPnt7IEwuYXNzaWduZWRUbyB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtd2hvXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taG94LWF2XCI+XG4gICAgICAgICAgICAgICAgQGlmIChhc3NpZ25lZSkge1xuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1hdiB2by1lbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImFzc2lnbmVlLmNvbG9yID8/ICd2YXIoLS12by1hdi1sKSdcIlxuICAgICAgICAgICAgICAgICAgICA+e3sgaW5pdGlhbHMoYXNzaWduZWUpIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwaW5cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taG94LXd0XCI+XG4gICAgICAgICAgICAgICAgPGI+e3sgYXNzaWduZWUgPyBhc3NpZ25lZS5uYW1lIDogZmluZGluZy50aXRsZSB9fTwvYj5cbiAgICAgICAgICAgICAgICBAaWYgKGFzc2lnbmVlKSB7XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInZvLWhveC13ZCB2by1lbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy52by1va109XCJhc3NpZ25lZS50b25lID09PSAnb2snXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnZvLXdhcm5dPVwiYXNzaWduZWUudG9uZSA9PT0gJ3dhcm4nXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChhc3NpZ25lZS5wcmVzZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZG90XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHdob0xpbmUoYXNzaWduZWUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1ob3gtd2RcIj48c3Bhbj57eyBmaW5kaW5nLmRldGFpbCB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIEBpZiAocGVvcGxlKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgI3JlYXNzaWduQnRuXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwidm8taG94LXJiXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJtZW51XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwibWVudU9wZW5cIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFhc3NpZ25lZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7eyBMLnJlYXNzaWduIH19PHZvLWljb24gbmFtZT1cImNoZXYtZFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJ2by1ob3gtc2xhXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnZvLXdhcm5dPVwic2xhVG9uZSA9PT0gJ3ZvLXdhcm4nXCJcbiAgICAgICAgICAgICAgW2NsYXNzLnZvLWJhZF09XCJzbGFUb25lID09PSAndm8tYmFkJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtc2xcIj5cbiAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiY2xvY2tcIj48L3ZvLWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1ob3gtZHVlIHZvLW51bVwiPnt7IGR1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLW11dGVkXCI+e3sgTC50YXJnZXQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1ob3gtYmFyXCJcbiAgICAgICAgICAgICAgICByb2xlPVwicHJvZ3Jlc3NiYXJcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJUaW1lIGxlZnQgdG8gcmVwbHlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtdmFsdWVtaW5dPVwiMFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS12YWx1ZW1heF09XCJ0YXJnZXRTZWNvbmRzXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXZhbHVlbm93XT1cImxlZnRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGkgW3N0eWxlLndpZHRoLiVdPVwiYmFyV2lkdGhcIj48L2k+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtbXNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWhveC1taFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8taG94LWxiXCI+e3tcbiAgICAgICAgICAgICAgICAgIGVkaXRlZCA/IG1lc3NhZ2VMYWJlbCArICcgwrcgJyArIEwuZWRpdGVkIDogbWVzc2FnZUxhYmVsXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICBAaWYgKGhhc01lc3NhZ2VDaGFuZ2UgJiYgZWRpdGluZykge1xuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ2by1waWxsIHZvLWdob3N0IHZvLXNtXCIgKGNsaWNrKT1cImNhbmNlbEVkaXQoKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBMLmNhbmNlbCB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAoaGFzTWVzc2FnZUNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgQGlmIChlZGl0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidm8tcGlsbCB2by1wcmltYXJ5IHZvLXNtXCIgKGNsaWNrKT1cInNhdmUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IEwuc2F2ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tZ2hvc3Qgdm8tc21cIiAoY2xpY2spPVwic3RhcnRFZGl0KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwiZWRpdFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj57eyBMLmVkaXQgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICNib3hcbiAgICAgICAgICAgICAgICBjbGFzcz1cInZvLWhveC1tYlwiXG4gICAgICAgICAgICAgICAgW2F0dHIuY29udGVudGVkaXRhYmxlXT1cImVkaXRpbmcgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICByb2xlPVwidGV4dGJveFwiXG4gICAgICAgICAgICAgICAgYXJpYS1tdWx0aWxpbmU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cIiFlZGl0aW5nXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm1lc3NhZ2VMYWJlbFwiXG4gICAgICAgICAgICAgICAgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IG1lc3NhZ2UgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtY29sXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWhveC1sYlwiPnt7IEwuY29udGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwidm8taG94LXN1bVwiPnt7IHN1bW1hcnkgfX08L3A+XG4gICAgICAgICAgICBAaWYgKGZhY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZvLWhveC1mYWN0c1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGYgb2YgZmFjdHM7IHRyYWNrIGYubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1ob3gtZlwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWtcIj57eyBmLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXYgdm8tbnVtXCI+e3sgZi52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKGxpbmspIHtcbiAgICAgICAgICAgICAgQGlmIChsaW5rLmhyZWYpIHtcbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1mY2hpcCB2by1sbmsgdm8taG94LWxua1wiXG4gICAgICAgICAgICAgICAgICBbaHJlZl09XCJsaW5rLmhyZWZcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS10aXBdPVwibGluay50aXBcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImxpbmsub25DbGljayAmJiBsaW5rLm9uQ2xpY2soKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHZvLWljb24gbmFtZT1cImV4dFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48c3Bhbj57eyBsaW5rLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInZvLWZjaGlwIHZvLWxuayB2by1ob3gtbG5rXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdGlwXT1cImxpbmsudGlwXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJsaW5rLm9uQ2xpY2sgJiYgbGluay5vbkNsaWNrKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDx2by1pY29uIG5hbWU9XCJleHRcIiBzaXplPVwieHNcIj48L3ZvLWljb24+PHNwYW4+e3sgbGluay5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ2by1ob3gtc3RcIlxuICAgICAgICAgIFtjbGFzcy52by13YXJuXT1cInN0ID09PSAnd2FybidcIlxuICAgICAgICAgIFtjbGFzcy52by1va109XCJzdCA9PT0gJ29rJ1wiXG4gICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tZ1wiPlxuICAgICAgICAgICAgQGlmIChzdGF0dXMucGVyc29uOyBhcyBwKSB7XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYXZcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJwLmNvbG9yID8/ICd2YXIoLS12by1hdi1sKSdcIj57e1xuICAgICAgICAgICAgICAgIGluaXRpYWxzKHApXG4gICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoc3QgPT09ICd3YWl0Jykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXNwaW5cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPHZvLWljb24gW25hbWVdPVwic3QgPT09ICd3YXJuJyA/ICdhbGVydCcgOiAnb2snXCI+PC92by1pY29uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLXRcIj5cbiAgICAgICAgICAgIDxiPnt7IHN0YXR1cy50aXRsZSB9fTwvYj5cbiAgICAgICAgICAgIEBpZiAoc3RhdHVzLmRldGFpbCkge1xuICAgICAgICAgICAgICA8c3Bhbj57eyBzdGF0dXMuZGV0YWlsIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmIChwZW9wbGUpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAjcG9wXG4gICAgICAgICAgICBjbGFzcz1cInZvLXBvcCB2by1ob3gtcG9wXCJcbiAgICAgICAgICAgIFtjbGFzcy52by1vcGVuXT1cIm1lbnVPcGVuXCJcbiAgICAgICAgICAgIHJvbGU9XCJtZW51XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiTC5yZWFzc2lnblRvXCJcbiAgICAgICAgICAgIHN0eWxlPVwicmlnaHQ6MDstLXZvLW9yaWdpbjp0b3AgcmlnaHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1waFwiPnt7IEwucmVhc3NpZ25UbyB9fTwvZGl2PlxuICAgICAgICAgICAgQGZvciAocCBvZiBwZW9wbGU7IHRyYWNrIHAubmFtZSkge1xuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1taVwiXG4gICAgICAgICAgICAgICAgcm9sZT1cIm1lbnVpdGVtcmFkaW9cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJwLm5hbWUgPT09IGFzc2lnbmVlPy5uYW1lXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hvb3NlKHApXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYXZcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJwLmNvbG9yID8/ICd2YXIoLS12by1hdi1sKSdcIj57e1xuICAgICAgICAgICAgICAgICAgaW5pdGlhbHMocClcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgPnt7IHAubmFtZSB9fTxzcGFuIGNsYXNzPVwidm8tZFwiPnt7IG1ldGFMaW5lKHApIH19PC9zcGFuPjwvc3BhblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWNrXCI+PHZvLWljb24gbmFtZT1cImNoZWNrXCIgc2l6ZT1cInhzXCI+PC92by1pY29uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vaHVtYW4taGFuZG9mZi5jc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBIdW1hbkhhbmRvZmZDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKiBUaGUgY2FyZCdzIGhlYWRpbmcuICovXG4gIEBJbnB1dCgpIHRpdGxlID0gJ0hhbmRlZCBvZmYgdG8gYSBwZXJzb24nO1xuICAvKiogV2h5IHRoZSBhZ2VudCBoYW5kZWQgb2ZmLCBsaWtlIFwiUmVmdW5kIG92ZXIgJDUwMCBuZWVkcyBhIHBlcnNvblwiLiAqL1xuICBASW5wdXQoKSByZWFzb24gPSAnJztcbiAgLyoqIFdobyBoYXMgaXQsIG9yIG51bGwgd2hpbGUgdGhlIGFnZW50IGlzIHN0aWxsIGZpbmRpbmcgc29tZW9uZS4gKi9cbiAgQElucHV0KCkgYXNzaWduZWU6IEhhbmRvZmZQZXJzb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSB0d28gbGluZXMgc2hvd24gd2hpbGUgYXNzaWduZWUgaXMgbnVsbC4gKi9cbiAgQElucHV0KCkgZmluZGluZzogSGFuZG9mZkZpbmRpbmcgPSB7IHRpdGxlOiAnRmluZGluZyBzb21lb25lJyB9O1xuICAvKiogVGhlIHBlb3BsZSBpdCBjYW4gZ28gdG8gaW5zdGVhZC4gTGVhdmUgaXQgb3V0IHRvIGhpZGUgUmVhc3NpZ24uICovXG4gIEBJbnB1dCgpIHBlb3BsZT86IEhhbmRvZmZQZXJzb25bXTtcbiAgLyoqIFNlY29uZHMgbGVmdCB1bnRpbCB0aGUgcmVwbHkgaXMgZHVlLiBXaG9sZSBtaW51dGVzOyBvcmFuZ2UgdW5kZXIgZml2ZTsgb3ZlcmR1ZSBhdCAwIG9yIGxlc3MuICovXG4gIEBJbnB1dCgpIHNlY29uZHNMZWZ0ID0gMDtcbiAgLyoqIFRoZSB3aG9sZSB3aW5kb3csIGZvciB0aGUgYmFyIGFuZCB0aGUgbGluZSBiZXNpZGUgaXQgKFwiMTUgbWluIHRhcmdldFwiKS4gKi9cbiAgQElucHV0KCkgdGFyZ2V0U2Vjb25kcyA9IDkwMDtcbiAgLyoqIFdoYXQgdGhlIHBlcnNvbiBuZWVkcyB0byBwaWNrIGl0IHVwLiAqL1xuICBASW5wdXQoKSBzdW1tYXJ5ID0gJyc7XG4gIC8qKiBBIGZldyBrZXkgZmFjdHMsIGFzIGxhYmVsIGFuZCB2YWx1ZSByb3dzLiAqL1xuICBASW5wdXQoKSBmYWN0czogSGFuZG9mZkZhY3RbXSA9IFtdO1xuICAvKiogQSBsaW5rIHRvIHRoZSB3aG9sZSBjb252ZXJzYXRpb24uICovXG4gIEBJbnB1dCgpIGxpbms/OiBIYW5kb2ZmTGluaztcbiAgLyoqIFdoYXQgdGhlIGFnZW50IHRvbGQgdGhlIGN1c3RvbWVyLiAqL1xuICBASW5wdXQoKSBtZXNzYWdlID0gJyc7XG4gIC8qKiBUaGUgbGFiZWwgb3ZlciB0aGUgbWVzc2FnZSwgbGlrZSBcIlNlbnQgdG8gRGFuYVwiLiAqL1xuICBASW5wdXQoKSBtZXNzYWdlTGFiZWwgPSAnU2VudCB0byB0aGUgY3VzdG9tZXInO1xuICAvKiogU2V0IHRvIHRydWUgdG8gYWRkIEVkaXQ6IHRoZSBtZXNzYWdlIHR1cm5zIGVkaXRhYmxlLCBhbmQgU2F2ZSBlbWl0cyBtZXNzYWdlQ2hhbmdlLiAqL1xuICBASW5wdXQoKSBlZGl0YWJsZSA9IGZhbHNlO1xuICAvKiogQWRkcyBcIsK3IGVkaXRlZFwiIHRvIHRoZSBsYWJlbC4gKi9cbiAgQElucHV0KCkgZWRpdGVkID0gZmFsc2U7XG4gIC8qKiBUaGUgcm93IGF0IHRoZSBmb290IHRoYXQgc2F5cyB3aGVyZSBpdCBzdGFuZHMuICovXG4gIEBJbnB1dCgpIHN0YXR1czogSGFuZG9mZlN0YXR1cyA9IHsgdGl0bGU6ICcnIH07XG4gIC8qKiBPdmVycmlkYWJsZSBsYWJlbHMuICovXG4gIEBJbnB1dCgpIGxhYmVsczogSGFuZG9mZkxhYmVscyA9IHt9O1xuXG4gIEBJbnB1dCgpIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKiogRW1pdHRlZCB3aGVuIGEgcm93IGlzIHBpY2tlZCBpbiBSZWFzc2lnbi4gKi9cbiAgQE91dHB1dCgpIHJlYXNzaWduID0gbmV3IEV2ZW50RW1pdHRlcjxIYW5kb2ZmUGVyc29uPigpO1xuICAvKiogRW1pdHRlZCBieSBTYXZlIHdpdGggdGhlIG5ldyBtZXNzYWdlIHRleHQgKG9ubHkgd2hlbiBlZGl0YWJsZSkuICovXG4gIEBPdXRwdXQoKSBtZXNzYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQFZpZXdDaGlsZCgnYm94JykgcHJpdmF0ZSBib3ghOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgncmVhc3NpZ25CdG4nKSBwcml2YXRlIHJlYXNzaWduQnRuPzogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BvcCcpIHByaXZhdGUgcG9wPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtb3Rpb24gPSBpbmplY3QoUmVkdWNlZE1vdGlvblNlcnZpY2UpO1xuXG4gIGVkaXRpbmcgPSBmYWxzZTtcbiAgbWVudU9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbG9zZVRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG5cbiAgLy8gcmVzb2x2ZWQgbGFiZWxzLCByZWNvbXB1dGVkIHdoZW4gaW5wdXRzIGNoYW5nZVxuICBMOiBSZXF1aXJlZDxIYW5kb2ZmTGFiZWxzPiA9IHRoaXMucmVzb2x2ZUxhYmVscygpO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snbGFiZWxzJ10gfHwgY2hhbmdlc1sndGFyZ2V0U2Vjb25kcyddKSB7XG4gICAgICB0aGlzLkwgPSB0aGlzLnJlc29sdmVMYWJlbHMoKTtcbiAgICB9XG4gICAgLy8gdGhlIGJveCBpcyBkcmF3biBhZnJlc2ggZWFjaCByZW5kZXIgaW4gUmVhY3Q7IGhlcmUgd2Ugb25seSBvdmVyd3JpdGUgaXRzXG4gICAgLy8gdGV4dCB3aGVuIHdlIGFyZSBub3QgZWRpdGluZywgc28gd2hhdCBpcyB0eXBlZCBpcyBuZXZlciBjbG9iYmVyZWRcbiAgICBpZiAoY2hhbmdlc1snbWVzc2FnZSddICYmICF0aGlzLmVkaXRpbmcgJiYgdGhpcy5ib3gpIHtcbiAgICAgIHRoaXMuYm94Lm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLm1lc3NhZ2U7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vbk91dHNpZGUsIHRydWUpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm9uT3V0c2lkZSwgdHJ1ZSk7XG4gICAgaWYgKHRoaXMuY2xvc2VUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lcik7XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVMYWJlbHMoKTogUmVxdWlyZWQ8SGFuZG9mZkxhYmVscz4ge1xuICAgIHJldHVybiB7XG4gICAgICBhc3NpZ25lZFRvOiAnQXNzaWduZWQgdG8nLFxuICAgICAgY29udGV4dDogJ0NvbnRleHQgcGFzc2VkIGFsb25nJyxcbiAgICAgIHJlYXNzaWduOiAnUmVhc3NpZ24nLFxuICAgICAgcmVhc3NpZ25UbzogJ1JlYXNzaWduIHRvJyxcbiAgICAgIHRhcmdldDogYCR7TWF0aC5yb3VuZCh0aGlzLnRhcmdldFNlY29uZHMgLyA2MCl9IG1pbiB0YXJnZXRgLFxuICAgICAgZWRpdDogJ0VkaXQnLFxuICAgICAgc2F2ZTogJ1NhdmUnLFxuICAgICAgY2FuY2VsOiAnQ2FuY2VsJyxcbiAgICAgIGVkaXRlZDogJ2VkaXRlZCcsXG4gICAgICAuLi50aGlzLmxhYmVscyxcbiAgICB9O1xuICB9XG5cbiAgaW5pdGlhbHMocDogSGFuZG9mZlBlcnNvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGluaXRpYWxzT2YocCk7XG4gIH1cblxuICB3aG9MaW5lKHA6IEhhbmRvZmZQZXJzb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBbcC50ZWFtLCBwLnByZXNlbmNlXS5maWx0ZXIoQm9vbGVhbikuam9pbignIMK3ICcpO1xuICB9XG5cbiAgbWV0YUxpbmUocDogSGFuZG9mZlBlcnNvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIFtwLnRlYW0sIHAucHJlc2VuY2VdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgwrcgJyk7XG4gIH1cblxuICBnZXQgaGFzTWVzc2FnZUNoYW5nZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZGl0YWJsZTtcbiAgfVxuXG4gIGdldCBsZWZ0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMuc2Vjb25kc0xlZnQpO1xuICB9XG5cbiAgZ2V0IGR1ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHMgPSB0aGlzLnNlY29uZHNMZWZ0O1xuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKHMgLyA2MCk7XG4gICAgcmV0dXJuIHMgPD0gMFxuICAgICAgPyAnUmVwbHkgb3ZlcmR1ZSdcbiAgICAgIDogbSA8IDFcbiAgICAgICAgPyAnUmVwbHkgZHVlIGluIHVuZGVyIGEgbWludXRlJ1xuICAgICAgICA6IGBSZXBseSBkdWUgaW4gJHttfSBtaW5gO1xuICB9XG5cbiAgZ2V0IHNsYVRvbmUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZWNvbmRzTGVmdCA8PSAwID8gJ3ZvLWJhZCcgOiB0aGlzLnNlY29uZHNMZWZ0IDwgMzAwID8gJ3ZvLXdhcm4nIDogJyc7XG4gIH1cblxuICBnZXQgYmFyV2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCAodGhpcy5sZWZ0IC8gdGhpcy50YXJnZXRTZWNvbmRzKSAqIDEwMCk7XG4gIH1cblxuICBnZXQgc3QoKTogJ3dhaXQnIHwgJ3dhcm4nIHwgJ29rJyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzLnRvbmUgPz8gJ3dhaXQnO1xuICB9XG5cbiAgLy8gLS0tLSByZWFzc2lnbiBtZW51IC0tLS1cbiAgdG9nZ2xlTWVudSgpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVPcGVuID0gIXRoaXMubWVudU9wZW47XG4gIH1cblxuICBjaG9vc2UocDogSGFuZG9mZlBlcnNvbik6IHZvaWQge1xuICAgIGlmIChwLm5hbWUgIT09IHRoaXMuYXNzaWduZWU/Lm5hbWUpIHRoaXMucmVhc3NpZ24uZW1pdChwKTtcbiAgICB0aGlzLmNsb3NlTWVudVNvb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VNZW51U29vbigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jbG9zZVRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5jbG9zZVRpbWVyKTtcbiAgICB0aGlzLmNsb3NlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLm1lbnVPcGVuID0gZmFsc2UpLCB0aGlzLm1vdGlvbi5yZWR1Y2UoKSA/IDAgOiAxMjApO1xuICB9XG5cbiAgLy8gLS0tLSBpbi1wbGFjZSBlZGl0IG9mIHRoZSBtZXNzYWdlIC0tLS1cbiAgc3RhcnRFZGl0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdGluZyA9IHRydWU7XG4gICAgY29uc3QgZm9jdXMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBiID0gdGhpcy5ib3g/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoIWIpIHJldHVybjtcbiAgICAgIGIuZm9jdXMoKTtcbiAgICAgIGNvbnN0IHMgPSBnZXRTZWxlY3Rpb24oKTtcbiAgICAgIHM/LnNlbGVjdEFsbENoaWxkcmVuKGIpO1xuICAgICAgcz8uY29sbGFwc2VUb0VuZCgpO1xuICAgIH07XG4gICAgaWYgKHRoaXMubW90aW9uLnJlZHVjZSgpKSBmb2N1cygpO1xuICAgIGVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZvY3VzKTtcbiAgfVxuXG4gIHNhdmUoKTogdm9pZCB7XG4gICAgY29uc3QgdCA9ICh0aGlzLmJveD8ubmF0aXZlRWxlbWVudC5pbm5lclRleHQgPz8gJycpLnRyaW0oKTtcbiAgICBpZiAodCAmJiB0ICE9PSB0aGlzLm1lc3NhZ2UpIHRoaXMubWVzc2FnZUNoYW5nZS5lbWl0KHQpO1xuICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgY2FuY2VsRWRpdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5ib3gpIHRoaXMuYm94Lm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLm1lc3NhZ2U7XG4gIH1cblxuICBvbktleWRvd24oZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGlmICh0aGlzLm1lbnVPcGVuKSB7XG4gICAgICAgIHRoaXMubWVudU9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWFzc2lnbkJ0bj8ubmF0aXZlRWxlbWVudC5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZWRpdGluZykge1xuICAgICAgICB0aGlzLmNhbmNlbEVkaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG9uT3V0c2lkZSA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRoaXMubWVudU9wZW4pIHJldHVybjtcbiAgICBjb25zdCB0ID0gZS50YXJnZXQgYXMgTm9kZTtcbiAgICBpZiAodGhpcy5wb3A/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnModCkgfHwgdGhpcy5yZWFzc2lnbkJ0bj8ubmF0aXZlRWxlbWVudC5jb250YWlucyh0KSkgcmV0dXJuO1xuICAgIHRoaXMubWVudU9wZW4gPSBmYWxzZTtcbiAgfTtcbn1cbiJdfQ==