@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.
- package/LICENSE +24 -0
- package/README.md +56 -2
- package/account-table/account-table.component.d.ts +72 -0
- package/action-log/action-log.component.d.ts +41 -0
- package/activity-heatmap/activity-heatmap.component.d.ts +67 -0
- package/agent-inbox/agent-inbox.component.d.ts +75 -0
- package/agent-lanes/agent-lanes.component.d.ts +152 -0
- package/agent-phases/agent-phases.component.d.ts +62 -0
- package/agent-run-timeline/agent-run-timeline.component.d.ts +113 -0
- package/agent-tree/agent-tree.component.d.ts +80 -0
- package/answer-action-bar/answer-action-bar.component.d.ts +110 -0
- package/artifact-card/artifact-card.component.d.ts +145 -0
- package/attachment-tray/attachment-tray.component.d.ts +84 -0
- package/badge/badge.component.d.ts +25 -0
- package/bar-chart/bar-chart.component.d.ts +87 -0
- package/browser-session/browser-session.component.d.ts +70 -0
- package/buttons/buttons.component.d.ts +63 -0
- package/card/card.component.d.ts +21 -0
- package/change-review/change-review.component.d.ts +97 -0
- package/citation-hover-card/citation-hover-card.component.d.ts +95 -0
- package/code-viewer/code-viewer.component.d.ts +86 -0
- package/composer/composer.component.d.ts +114 -0
- package/context-meter/context-meter.component.d.ts +60 -0
- package/core/icon.component.d.ts +10 -0
- package/core/reduced-motion.service.d.ts +15 -0
- package/decision-prompt/decision-prompt.component.d.ts +56 -0
- package/design-review/design-review.component.d.ts +108 -0
- package/design-tuner/design-tuner.component.d.ts +75 -0
- package/details-panel/details-panel.component.d.ts +150 -0
- package/donut-chart/donut-chart.component.d.ts +63 -0
- package/draft-review/draft-review.component.d.ts +128 -0
- package/error-recovery/error-recovery.component.d.ts +59 -0
- package/esm2022/account-table/account-table.component.mjs +399 -0
- package/esm2022/action-log/action-log.component.mjs +177 -0
- package/esm2022/activity-heatmap/activity-heatmap.component.mjs +285 -0
- package/esm2022/agent-inbox/agent-inbox.component.mjs +284 -0
- package/esm2022/agent-lanes/agent-lanes.component.mjs +600 -0
- package/esm2022/agent-phases/agent-phases.component.mjs +300 -0
- package/esm2022/agent-run-timeline/agent-run-timeline.component.mjs +412 -0
- package/esm2022/agent-tree/agent-tree.component.mjs +393 -0
- package/esm2022/answer-action-bar/answer-action-bar.component.mjs +636 -0
- package/esm2022/artifact-card/artifact-card.component.mjs +916 -0
- package/esm2022/attachment-tray/attachment-tray.component.mjs +402 -0
- package/esm2022/badge/badge.component.mjs +97 -0
- package/esm2022/bar-chart/bar-chart.component.mjs +300 -0
- package/esm2022/browser-session/browser-session.component.mjs +352 -0
- package/esm2022/buttons/buttons.component.mjs +215 -0
- package/esm2022/card/card.component.mjs +107 -0
- package/esm2022/change-review/change-review.component.mjs +398 -0
- package/esm2022/citation-hover-card/citation-hover-card.component.mjs +360 -0
- package/esm2022/code-viewer/code-viewer.component.mjs +291 -0
- package/esm2022/composer/composer.component.mjs +743 -0
- package/esm2022/context-meter/context-meter.component.mjs +275 -0
- package/esm2022/core/icon.component.mjs +111 -0
- package/esm2022/core/reduced-motion.service.mjs +34 -0
- package/esm2022/decision-prompt/decision-prompt.component.mjs +259 -0
- package/esm2022/design-review/design-review.component.mjs +428 -0
- package/esm2022/design-tuner/design-tuner.component.mjs +341 -0
- package/esm2022/details-panel/details-panel.component.mjs +537 -0
- package/esm2022/donut-chart/donut-chart.component.mjs +240 -0
- package/esm2022/draft-review/draft-review.component.mjs +549 -0
- package/esm2022/error-recovery/error-recovery.component.mjs +231 -0
- package/esm2022/eval-results/eval-results.component.mjs +368 -0
- package/esm2022/feedback-sheet/feedback-sheet.component.mjs +411 -0
- package/esm2022/field-extraction/field-extraction.component.mjs +368 -0
- package/esm2022/funnel-chart/funnel-chart.component.mjs +258 -0
- package/esm2022/grid/grid.component.mjs +66 -0
- package/esm2022/health-score/health-score.component.mjs +420 -0
- package/esm2022/human-handoff/human-handoff.component.mjs +676 -0
- package/esm2022/image-generation/image-generation.component.mjs +1028 -0
- package/esm2022/inline-text-diff/inline-text-diff.component.mjs +390 -0
- package/esm2022/launch-checklist/launch-checklist.component.mjs +229 -0
- package/esm2022/line-chart/line-chart.component.mjs +417 -0
- package/esm2022/live-answer/live-answer.component.mjs +411 -0
- package/esm2022/metric-insight/metric-insight.component.mjs +511 -0
- package/esm2022/modal/modal.component.mjs +202 -0
- package/esm2022/model-picker/model-picker.component.mjs +491 -0
- package/esm2022/permission-gate/permission-gate.component.mjs +498 -0
- package/esm2022/plan-review/plan-review.component.mjs +432 -0
- package/esm2022/progress/progress.component.mjs +503 -0
- package/esm2022/prompt-library/prompt-library.component.mjs +453 -0
- package/esm2022/prompt-starters/prompt-starters.component.mjs +272 -0
- package/esm2022/proposal-card/proposal-card.component.mjs +402 -0
- package/esm2022/public-api.mjs +88 -0
- package/esm2022/radar-chart/radar-chart.component.mjs +500 -0
- package/esm2022/radial-goals/radial-goals.component.mjs +418 -0
- package/esm2022/reasoning-trail/reasoning-trail.component.mjs +284 -0
- package/esm2022/response-versions/response-versions.component.mjs +288 -0
- package/esm2022/rewrite-toolbar/rewrite-toolbar.component.mjs +397 -0
- package/esm2022/rich-text-editor/rich-text-editor.component.mjs +1755 -0
- package/esm2022/run-cost/run-cost.component.mjs +215 -0
- package/esm2022/run-queue/run-queue.component.mjs +481 -0
- package/esm2022/run-summary/run-summary.component.mjs +331 -0
- package/esm2022/scatter-chart/scatter-chart.component.mjs +705 -0
- package/esm2022/score-breakdown/score-breakdown.component.mjs +460 -0
- package/esm2022/segmented-control/segmented-control.component.mjs +180 -0
- package/esm2022/source-stack/source-stack.component.mjs +245 -0
- package/esm2022/stat-cards/stat-cards.component.mjs +258 -0
- package/esm2022/status-pill/status-pill.component.mjs +305 -0
- package/esm2022/steering/steering.component.mjs +343 -0
- package/esm2022/step-loader/step-loader.component.mjs +209 -0
- package/esm2022/task-table/task-table.component.mjs +534 -0
- package/esm2022/terminal-stream/terminal-stream.component.mjs +583 -0
- package/esm2022/thinking/thinking.component.mjs +276 -0
- package/esm2022/thinking-states/thinking-states.component.mjs +333 -0
- package/esm2022/thread-panel/thread-panel.component.mjs +271 -0
- package/esm2022/toast/toast.component.mjs +195 -0
- package/esm2022/toast-stack/toast-stack.component.mjs +301 -0
- package/esm2022/tool-call/tool-call.component.mjs +273 -0
- package/esm2022/tooltip/tooltip.component.mjs +417 -0
- package/esm2022/top-pages/top-pages.component.mjs +240 -0
- package/esm2022/trace-view/trace-view.component.mjs +440 -0
- package/esm2022/visuno-angular.mjs +5 -0
- package/esm2022/voice-capture/voice-capture.component.mjs +650 -0
- package/esm2022/voice-orb/voice-orb.component.mjs +538 -0
- package/esm2022/web-search/web-search.component.mjs +374 -0
- package/eval-results/eval-results.component.d.ts +67 -0
- package/feedback-sheet/feedback-sheet.component.d.ts +74 -0
- package/fesm2022/visuno-angular.mjs +31992 -0
- package/fesm2022/visuno-angular.mjs.map +1 -0
- package/field-extraction/field-extraction.component.d.ts +82 -0
- package/funnel-chart/funnel-chart.component.d.ts +70 -0
- package/grid/grid.component.d.ts +22 -0
- package/health-score/health-score.component.d.ts +87 -0
- package/human-handoff/human-handoff.component.d.ts +125 -0
- package/image-generation/image-generation.component.d.ts +253 -0
- package/index.d.ts +5 -0
- package/inline-text-diff/inline-text-diff.component.d.ts +76 -0
- package/launch-checklist/launch-checklist.component.d.ts +46 -0
- package/line-chart/line-chart.component.d.ts +89 -0
- package/live-answer/live-answer.component.d.ts +110 -0
- package/metric-insight/metric-insight.component.d.ts +110 -0
- package/modal/modal.component.d.ts +37 -0
- package/model-picker/model-picker.component.d.ts +97 -0
- package/package.json +51 -4
- package/permission-gate/permission-gate.component.d.ts +100 -0
- package/plan-review/plan-review.component.d.ts +86 -0
- package/progress/progress.component.d.ts +91 -0
- package/prompt-library/prompt-library.component.d.ts +121 -0
- package/prompt-starters/prompt-starters.component.d.ts +65 -0
- package/proposal-card/proposal-card.component.d.ts +101 -0
- package/public-api.d.ts +82 -0
- package/radar-chart/radar-chart.component.d.ts +110 -0
- package/radial-goals/radial-goals.component.d.ts +90 -0
- package/reasoning-trail/reasoning-trail.component.d.ts +73 -0
- package/response-versions/response-versions.component.d.ts +54 -0
- package/rewrite-toolbar/rewrite-toolbar.component.d.ts +92 -0
- package/rich-text-editor/rich-text-editor.component.d.ts +180 -0
- package/run-cost/run-cost.component.d.ts +43 -0
- package/run-queue/run-queue.component.d.ts +93 -0
- package/run-summary/run-summary.component.d.ts +81 -0
- package/scatter-chart/scatter-chart.component.d.ts +139 -0
- package/score-breakdown/score-breakdown.component.d.ts +107 -0
- package/segmented-control/segmented-control.component.d.ts +44 -0
- package/source-stack/source-stack.component.d.ts +60 -0
- package/stat-cards/stat-cards.component.d.ts +86 -0
- package/status-pill/status-pill.component.d.ts +64 -0
- package/steering/steering.component.d.ts +75 -0
- package/step-loader/step-loader.component.d.ts +40 -0
- package/styles.css +424 -0
- package/task-table/task-table.component.d.ts +114 -0
- package/terminal-stream/terminal-stream.component.d.ts +110 -0
- package/thinking/thinking.component.d.ts +63 -0
- package/thinking-states/thinking-states.component.d.ts +51 -0
- package/thread-panel/thread-panel.component.d.ts +75 -0
- package/toast/toast.component.d.ts +56 -0
- package/toast-stack/toast-stack.component.d.ts +72 -0
- package/tokens.css +424 -0
- package/tool-call/tool-call.component.d.ts +61 -0
- package/tooltip/tooltip.component.d.ts +89 -0
- package/top-pages/top-pages.component.d.ts +75 -0
- package/trace-view/trace-view.component.d.ts +95 -0
- package/voice-capture/voice-capture.component.d.ts +103 -0
- package/voice-orb/voice-orb.component.d.ts +78 -0
- package/web-search/web-search.component.d.ts +77 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
// framework/angular/agent-inbox/agent-inbox.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/agent-inbox/AgentInbox.tsx.
|
|
4
|
+
// Every agent run in one list, grouped as Needs you, Running and Done, with live
|
|
5
|
+
// clocks on the running ones. Approve starts a run that waits for you and Retry
|
|
6
|
+
// tries a failed one again; a run that changes group glides to its place.
|
|
7
|
+
// Inputs mirror the React props; callback props become @Output EventEmitters.
|
|
8
|
+
// The per-second clock tick and the FLIP glide are ported from the React logic
|
|
9
|
+
// and the vanilla JS (agent-inbox.js). Reduced motion is respected via the shared
|
|
10
|
+
// ReducedMotionService.
|
|
11
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, inject, } from '@angular/core';
|
|
12
|
+
import { VoIconComponent } from '../core/icon.component';
|
|
13
|
+
import { ReducedMotionService } from '../core/reduced-motion.service';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
const GROUPS = [
|
|
16
|
+
['needs', 'Needs you'],
|
|
17
|
+
['running', 'Running'],
|
|
18
|
+
['done', 'Done'],
|
|
19
|
+
];
|
|
20
|
+
const clock = (s) => `${Math.floor(s / 60)}:${String(s % 60).padStart(2, '0')}`;
|
|
21
|
+
/** The ink for initials on an avatar colour: the eight avatar colours each bring their own. */
|
|
22
|
+
const avatarInk = (color) => /^var\(--vo-av-[a-z]\)$/.test(color) ? color.replace(')', '-ink)') : undefined;
|
|
23
|
+
export class AgentInboxComponent {
|
|
24
|
+
constructor() {
|
|
25
|
+
/** The runs to show. */
|
|
26
|
+
this.runs = [];
|
|
27
|
+
/** Defaults to "Inbox". */
|
|
28
|
+
this.title = 'Inbox';
|
|
29
|
+
/** Emitted by Approve on a run that needs you and hasn't failed. */
|
|
30
|
+
this.approve = new EventEmitter();
|
|
31
|
+
/** Emitted by Retry on a failed run. */
|
|
32
|
+
this.retry = new EventEmitter();
|
|
33
|
+
this.reduced = inject(ReducedMotionService);
|
|
34
|
+
// the status line crossfades when it changes, like the React <Swap>
|
|
35
|
+
this.stShown = '';
|
|
36
|
+
this.stOut = false;
|
|
37
|
+
// one tick a second drives every running clock: each counts on from the seconds it had when last given
|
|
38
|
+
this.tick = 0;
|
|
39
|
+
this.base = new Map();
|
|
40
|
+
// the FLIP glide: the tops of rows and group titles are measured after each move and eased from where they were
|
|
41
|
+
this.where = new Map();
|
|
42
|
+
this.groupOf = new Map();
|
|
43
|
+
this.firstMeasure = true;
|
|
44
|
+
this.moveTimers = new Set();
|
|
45
|
+
}
|
|
46
|
+
get visibleGroups() {
|
|
47
|
+
// a group with nothing in it goes away
|
|
48
|
+
return GROUPS.filter(([g]) => this.runs.some((r) => r.group === g));
|
|
49
|
+
}
|
|
50
|
+
rowsOf(g) {
|
|
51
|
+
return this.runs
|
|
52
|
+
.filter((r) => r.group === g)
|
|
53
|
+
.map((run) => {
|
|
54
|
+
const col = run.color ?? 'var(--vo-accent)';
|
|
55
|
+
const fail = g === 'needs' && !!run.failed;
|
|
56
|
+
return {
|
|
57
|
+
run,
|
|
58
|
+
group: g,
|
|
59
|
+
fail,
|
|
60
|
+
col,
|
|
61
|
+
ink: avatarInk(col) ?? (run.color ? '#fff' : 'var(--vo-on-accent)'),
|
|
62
|
+
detail: g === 'done' ? run.agent : run.detail ?? '',
|
|
63
|
+
initial: run.agent.charAt(0),
|
|
64
|
+
seconds: g === 'running' ? this.secs(run) : 0,
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
fmt(s) {
|
|
69
|
+
return clock(s);
|
|
70
|
+
}
|
|
71
|
+
secs(r) {
|
|
72
|
+
const b = this.base.get(r.id);
|
|
73
|
+
const s = r.seconds ?? 0;
|
|
74
|
+
if (!b || b.s !== s) {
|
|
75
|
+
this.base.set(r.id, { s, at: this.tick });
|
|
76
|
+
return s;
|
|
77
|
+
}
|
|
78
|
+
return b.s + this.tick - b.at;
|
|
79
|
+
}
|
|
80
|
+
line() {
|
|
81
|
+
const need = this.runs.filter((r) => r.group === 'needs').length;
|
|
82
|
+
const running = this.runs.filter((r) => r.group === 'running').length;
|
|
83
|
+
const done = this.runs.filter((r) => r.group === 'done').length;
|
|
84
|
+
return (this.status ??
|
|
85
|
+
(need
|
|
86
|
+
? `${need} need${need > 1 ? '' : 's'} you`
|
|
87
|
+
: running
|
|
88
|
+
? `${running} running`
|
|
89
|
+
: `All clear · ${done} done today`));
|
|
90
|
+
}
|
|
91
|
+
setLine() {
|
|
92
|
+
const next = this.line();
|
|
93
|
+
if (!this.stShown) {
|
|
94
|
+
this.stShown = next;
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (next === this.stShown)
|
|
98
|
+
return;
|
|
99
|
+
this.stOut = true;
|
|
100
|
+
clearTimeout(this.stTimer);
|
|
101
|
+
this.stTimer = setTimeout(() => {
|
|
102
|
+
this.stShown = next;
|
|
103
|
+
this.stOut = false;
|
|
104
|
+
}, this.reduced.reduce() ? 0 : 170);
|
|
105
|
+
}
|
|
106
|
+
ngAfterViewInit() {
|
|
107
|
+
this.measure();
|
|
108
|
+
this.ticker = setInterval(() => {
|
|
109
|
+
// only advance the shared clock while something is running
|
|
110
|
+
if (this.runs.some((r) => r.group === 'running') && !this.reduced.reduce())
|
|
111
|
+
this.tick += 1;
|
|
112
|
+
}, 1000);
|
|
113
|
+
}
|
|
114
|
+
ngOnChanges(changes) {
|
|
115
|
+
if (!changes['runs'])
|
|
116
|
+
return;
|
|
117
|
+
// drop clock bases for runs no longer running
|
|
118
|
+
for (const id of [...this.base.keys()]) {
|
|
119
|
+
if (!this.runs.some((r) => r.id === id && r.group === 'running'))
|
|
120
|
+
this.base.delete(id);
|
|
121
|
+
}
|
|
122
|
+
this.setLine();
|
|
123
|
+
// the layout has not updated yet; glide on the next frame
|
|
124
|
+
if (!this.firstMeasure) {
|
|
125
|
+
requestAnimationFrame(() => this.measure());
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// measure every visible row and group title, and ease each from where it last was
|
|
129
|
+
measure() {
|
|
130
|
+
const box = this.list?.nativeElement;
|
|
131
|
+
if (!box)
|
|
132
|
+
return;
|
|
133
|
+
const top = box.getBoundingClientRect().top;
|
|
134
|
+
const next = new Map();
|
|
135
|
+
const ease = getComputedStyle(box).getPropertyValue('--vo-ease').trim() || 'ease';
|
|
136
|
+
const reduce = this.reduced.reduce();
|
|
137
|
+
box.querySelectorAll('[data-k]').forEach((el) => {
|
|
138
|
+
const k = el.dataset['k'];
|
|
139
|
+
const y = el.getBoundingClientRect().top - top;
|
|
140
|
+
const was = this.where.get(k);
|
|
141
|
+
next.set(k, y);
|
|
142
|
+
if (reduce || this.firstMeasure)
|
|
143
|
+
return;
|
|
144
|
+
if (was === undefined) {
|
|
145
|
+
// a group or row that comes back fades in
|
|
146
|
+
el.animate([{ opacity: 0 }, { opacity: 1 }], { duration: 260 });
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (Math.abs(was - y) > 1) {
|
|
150
|
+
el.animate([{ transform: `translateY(${was - y}px)` }, { transform: 'none' }], { duration: 420, easing: ease });
|
|
151
|
+
}
|
|
152
|
+
// the moving row rides above the rest while it travels
|
|
153
|
+
const moved = this.groupOf.get(k);
|
|
154
|
+
const now = this.runs.find((r) => r.id === k)?.group;
|
|
155
|
+
if (moved && now && moved !== now) {
|
|
156
|
+
el.classList.add('vo-mv');
|
|
157
|
+
const t = setTimeout(() => {
|
|
158
|
+
el.classList.remove('vo-mv');
|
|
159
|
+
this.moveTimers.delete(t);
|
|
160
|
+
}, 440);
|
|
161
|
+
this.moveTimers.add(t);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
this.where = next;
|
|
165
|
+
this.groupOf = new Map(this.runs.map((r) => [r.id, r.group]));
|
|
166
|
+
this.firstMeasure = false;
|
|
167
|
+
}
|
|
168
|
+
ngOnDestroy() {
|
|
169
|
+
if (this.ticker)
|
|
170
|
+
clearInterval(this.ticker);
|
|
171
|
+
clearTimeout(this.stTimer);
|
|
172
|
+
this.moveTimers.forEach((t) => clearTimeout(t));
|
|
173
|
+
this.moveTimers.clear();
|
|
174
|
+
}
|
|
175
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgentInboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
176
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AgentInboxComponent, isStandalone: true, selector: "vo-agent-inbox", inputs: { runs: "runs", title: "title", status: "status", className: "className" }, outputs: { approve: "approve", retry: "retry" }, viewQueries: [{ propertyName: "list", first: true, predicate: ["list"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
177
|
+
<div data-vo="" [class]="'vo-aib vo-panel' + (className ? ' ' + className : '')">
|
|
178
|
+
<div class="vo-aib-h">
|
|
179
|
+
<b>{{ title }}</b>
|
|
180
|
+
<span aria-live="polite"><span class="vo-sw vo-muted vo-aib-st" [class.vo-out]="stOut">{{ stShown }}</span></span>
|
|
181
|
+
</div>
|
|
182
|
+
<div #list>
|
|
183
|
+
@for (g of visibleGroups; track g[0]) {
|
|
184
|
+
<section class="vo-aib-g" [attr.aria-label]="g[1]">
|
|
185
|
+
<div class="vo-aib-gh" [attr.data-k]="'h:' + g[0]"><span>{{ g[1] }}</span><span class="vo-n">{{ rowsOf(g[0]).length }}</span></div>
|
|
186
|
+
<div class="vo-aib-gl" role="list">
|
|
187
|
+
@for (row of rowsOf(g[0]); track row.run.id) {
|
|
188
|
+
<div [attr.data-k]="row.run.id" class="vo-aib-i" [class.vo-fail]="row.fail" role="listitem">
|
|
189
|
+
<span class="vo-aib-av" [style.background]="row.col" [style.color]="row.ink" aria-hidden="true">{{ row.initial }}</span>
|
|
190
|
+
<span class="vo-aib-t">
|
|
191
|
+
<b>{{ row.run.title }}</b>
|
|
192
|
+
<span
|
|
193
|
+
class="vo-sw"
|
|
194
|
+
[attr.title]="row.fail && row.run.why ? row.run.why : null"
|
|
195
|
+
>{{ row.detail }}</span>
|
|
196
|
+
</span>
|
|
197
|
+
<span class="vo-aib-r">
|
|
198
|
+
@if (row.group === 'needs') {
|
|
199
|
+
@if (row.fail) {
|
|
200
|
+
<button type="button" class="vo-pill vo-sm vo-aib-go" [attr.aria-label]="'Retry ' + row.run.title" (click)="retry.emit(row.run.id)">
|
|
201
|
+
<vo-icon name="refresh" size="xs"></vo-icon>Retry
|
|
202
|
+
</button>
|
|
203
|
+
} @else {
|
|
204
|
+
<button type="button" class="vo-pill vo-primary vo-sm vo-aib-go" [attr.aria-label]="'Approve ' + row.run.title" (click)="approve.emit(row.run.id)">Approve</button>
|
|
205
|
+
}
|
|
206
|
+
} @else if (row.group === 'running') {
|
|
207
|
+
<span class="vo-spin" aria-hidden="true"></span><span class="vo-num">{{ fmt(row.seconds) }}</span>
|
|
208
|
+
} @else {
|
|
209
|
+
<span class="vo-ok"><vo-icon name="ok" size="xs"></vo-icon></span><span>{{ row.run.ended }}</span>
|
|
210
|
+
}
|
|
211
|
+
</span>
|
|
212
|
+
</div>
|
|
213
|
+
}
|
|
214
|
+
</div>
|
|
215
|
+
</section>
|
|
216
|
+
}
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
`, isInline: true, styles: [".vo-aib{width:100%;max-width:440px;margin:0 auto;padding:6px}.vo-aib-h{display:flex;align-items:baseline;justify-content:space-between;gap:var(--vo-s-3);padding:var(--vo-s-2) 10px 6px}.vo-aib-h b{font-weight:500;font-size:14px}.vo-aib-st{font-size:12.5px}.vo-aib-g{display:flex;flex-direction:column}.vo-aib-gh{display:flex;align-items:center;gap:var(--vo-s-2);padding:var(--vo-s-3) 10px var(--vo-s-1);font-size:12px;color:var(--vo-muted)}.vo-aib-gh .vo-n{font-variant-numeric:tabular-nums}.vo-aib-gl{display:flex;flex-direction:column}.vo-aib-i{display:flex;align-items:center;gap:10px;padding:var(--vo-s-2) 10px;border-radius:calc(10px * var(--vo-rk));font-size:13px;transition:background .16s}@media (hover:hover) and (pointer:fine){.vo-aib-i:hover{background:var(--vo-row)}}.vo-aib-i.vo-mv{position:relative;z-index:1;background:var(--vo-surface);box-shadow:var(--vo-shadow)}.vo-aib-i.vo-mv.vo-fail{background:var(--vo-bad-bg)}.vo-aib-av{width:28px;height:28px;border-radius:var(--vo-r-sm);display:grid;place-items:center;flex:none;font-size:11px;font-weight:500}.vo-aib-t{flex:1;min-width:0;display:flex;flex-direction:column}.vo-aib-t b{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-aib-t span{font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-aib-i.vo-fail .vo-aib-t span{color:var(--vo-bad)}.vo-aib-r{display:flex;align-items:center;gap:6px;flex:none;font-size:12.5px;color:var(--vo-fg2)}.vo-aib-r .vo-spin{width:11px;height:11px;color:var(--vo-accent-fg,var(--vo-accent))}.vo-aib-r .vo-ok{color:var(--vo-ok);display:grid}.vo-aib-i.vo-fail{background:var(--vo-bad-bg)}.vo-aib-i.vo-fail .vo-aib-r .vo-pill{background:var(--vo-surface);color:var(--vo-fg);box-shadow:var(--vo-shadow)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-muted{color:var(--vo-muted)}.vo-num{font-variant-numeric:tabular-nums}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.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-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-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-sm{height:28px;padding:0 11px;font-size:12.5px}@media (prefers-reduced-motion:reduce){.vo-spin,.vo-enter{animation:none}}\n"], dependencies: [{ kind: "component", type: VoIconComponent, selector: "vo-icon", inputs: ["name", "size"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
220
|
+
}
|
|
221
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgentInboxComponent, decorators: [{
|
|
222
|
+
type: Component,
|
|
223
|
+
args: [{ selector: 'vo-agent-inbox', standalone: true, encapsulation: ViewEncapsulation.None, imports: [VoIconComponent], template: `
|
|
224
|
+
<div data-vo="" [class]="'vo-aib vo-panel' + (className ? ' ' + className : '')">
|
|
225
|
+
<div class="vo-aib-h">
|
|
226
|
+
<b>{{ title }}</b>
|
|
227
|
+
<span aria-live="polite"><span class="vo-sw vo-muted vo-aib-st" [class.vo-out]="stOut">{{ stShown }}</span></span>
|
|
228
|
+
</div>
|
|
229
|
+
<div #list>
|
|
230
|
+
@for (g of visibleGroups; track g[0]) {
|
|
231
|
+
<section class="vo-aib-g" [attr.aria-label]="g[1]">
|
|
232
|
+
<div class="vo-aib-gh" [attr.data-k]="'h:' + g[0]"><span>{{ g[1] }}</span><span class="vo-n">{{ rowsOf(g[0]).length }}</span></div>
|
|
233
|
+
<div class="vo-aib-gl" role="list">
|
|
234
|
+
@for (row of rowsOf(g[0]); track row.run.id) {
|
|
235
|
+
<div [attr.data-k]="row.run.id" class="vo-aib-i" [class.vo-fail]="row.fail" role="listitem">
|
|
236
|
+
<span class="vo-aib-av" [style.background]="row.col" [style.color]="row.ink" aria-hidden="true">{{ row.initial }}</span>
|
|
237
|
+
<span class="vo-aib-t">
|
|
238
|
+
<b>{{ row.run.title }}</b>
|
|
239
|
+
<span
|
|
240
|
+
class="vo-sw"
|
|
241
|
+
[attr.title]="row.fail && row.run.why ? row.run.why : null"
|
|
242
|
+
>{{ row.detail }}</span>
|
|
243
|
+
</span>
|
|
244
|
+
<span class="vo-aib-r">
|
|
245
|
+
@if (row.group === 'needs') {
|
|
246
|
+
@if (row.fail) {
|
|
247
|
+
<button type="button" class="vo-pill vo-sm vo-aib-go" [attr.aria-label]="'Retry ' + row.run.title" (click)="retry.emit(row.run.id)">
|
|
248
|
+
<vo-icon name="refresh" size="xs"></vo-icon>Retry
|
|
249
|
+
</button>
|
|
250
|
+
} @else {
|
|
251
|
+
<button type="button" class="vo-pill vo-primary vo-sm vo-aib-go" [attr.aria-label]="'Approve ' + row.run.title" (click)="approve.emit(row.run.id)">Approve</button>
|
|
252
|
+
}
|
|
253
|
+
} @else if (row.group === 'running') {
|
|
254
|
+
<span class="vo-spin" aria-hidden="true"></span><span class="vo-num">{{ fmt(row.seconds) }}</span>
|
|
255
|
+
} @else {
|
|
256
|
+
<span class="vo-ok"><vo-icon name="ok" size="xs"></vo-icon></span><span>{{ row.run.ended }}</span>
|
|
257
|
+
}
|
|
258
|
+
</span>
|
|
259
|
+
</div>
|
|
260
|
+
}
|
|
261
|
+
</div>
|
|
262
|
+
</section>
|
|
263
|
+
}
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
`, styles: [".vo-aib{width:100%;max-width:440px;margin:0 auto;padding:6px}.vo-aib-h{display:flex;align-items:baseline;justify-content:space-between;gap:var(--vo-s-3);padding:var(--vo-s-2) 10px 6px}.vo-aib-h b{font-weight:500;font-size:14px}.vo-aib-st{font-size:12.5px}.vo-aib-g{display:flex;flex-direction:column}.vo-aib-gh{display:flex;align-items:center;gap:var(--vo-s-2);padding:var(--vo-s-3) 10px var(--vo-s-1);font-size:12px;color:var(--vo-muted)}.vo-aib-gh .vo-n{font-variant-numeric:tabular-nums}.vo-aib-gl{display:flex;flex-direction:column}.vo-aib-i{display:flex;align-items:center;gap:10px;padding:var(--vo-s-2) 10px;border-radius:calc(10px * var(--vo-rk));font-size:13px;transition:background .16s}@media (hover:hover) and (pointer:fine){.vo-aib-i:hover{background:var(--vo-row)}}.vo-aib-i.vo-mv{position:relative;z-index:1;background:var(--vo-surface);box-shadow:var(--vo-shadow)}.vo-aib-i.vo-mv.vo-fail{background:var(--vo-bad-bg)}.vo-aib-av{width:28px;height:28px;border-radius:var(--vo-r-sm);display:grid;place-items:center;flex:none;font-size:11px;font-weight:500}.vo-aib-t{flex:1;min-width:0;display:flex;flex-direction:column}.vo-aib-t b{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-aib-t span{font-size:12px;color:var(--vo-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.vo-aib-i.vo-fail .vo-aib-t span{color:var(--vo-bad)}.vo-aib-r{display:flex;align-items:center;gap:6px;flex:none;font-size:12.5px;color:var(--vo-fg2)}.vo-aib-r .vo-spin{width:11px;height:11px;color:var(--vo-accent-fg,var(--vo-accent))}.vo-aib-r .vo-ok{color:var(--vo-ok);display:grid}.vo-aib-i.vo-fail{background:var(--vo-bad-bg)}.vo-aib-i.vo-fail .vo-aib-r .vo-pill{background:var(--vo-surface);color:var(--vo-fg);box-shadow:var(--vo-shadow)}.vo-panel{background:var(--vo-surface);border-radius:var(--vo-r-card);box-shadow:var(--vo-shadow);position:relative}.vo-muted{color:var(--vo-muted)}.vo-num{font-variant-numeric:tabular-nums}.vo-spin{width:12px;height:12px;border-radius:50%;border:1.5px solid currentColor;border-right-color:transparent;animation:vo-rot .8s linear infinite;flex:none;display:inline-block}@keyframes vo-rot{to{transform:rotate(360deg)}}.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-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-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-sm{height:28px;padding:0 11px;font-size:12.5px}@media (prefers-reduced-motion:reduce){.vo-spin,.vo-enter{animation:none}}\n"] }]
|
|
267
|
+
}], propDecorators: { runs: [{
|
|
268
|
+
type: Input,
|
|
269
|
+
args: [{ required: true }]
|
|
270
|
+
}], title: [{
|
|
271
|
+
type: Input
|
|
272
|
+
}], status: [{
|
|
273
|
+
type: Input
|
|
274
|
+
}], className: [{
|
|
275
|
+
type: Input
|
|
276
|
+
}], approve: [{
|
|
277
|
+
type: Output
|
|
278
|
+
}], retry: [{
|
|
279
|
+
type: Output
|
|
280
|
+
}], list: [{
|
|
281
|
+
type: ViewChild,
|
|
282
|
+
args: ['list']
|
|
283
|
+
}] } });
|
|
284
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtaW5ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vYWdlbnQtaW5ib3gvYWdlbnQtaW5ib3guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLGlGQUFpRjtBQUNqRixnRkFBZ0Y7QUFDaEYsMEVBQTBFO0FBQzFFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0Usa0ZBQWtGO0FBQ2xGLHdCQUF3QjtBQUV4QixPQUFPLEVBRUwsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUEyQnRFLE1BQU0sTUFBTSxHQUEyQjtJQUNyQyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUM7SUFDdEIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO0lBQ3RCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztDQUNqQixDQUFDO0FBRUYsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFFeEYsK0ZBQStGO0FBQy9GLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBYSxFQUFzQixFQUFFLENBQ3RELHdCQUF3QixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUs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eXRHQTVDUyxlQUFlOzs0RkErQ2QsbUJBQW1CO2tCQW5EL0IsU0FBUzsrQkFDRSxnQkFBZ0IsY0FDZCxJQUFJLGlCQUNELGlCQUFpQixDQUFDLElBQUksV0FDNUIsQ0FBQyxlQUFlLENBQUMsWUFDaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQ1Q7OEJBSzBCLElBQUk7c0JBQTlCLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUVoQixLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0ksT0FBTztzQkFBaEIsTUFBTTtnQkFFRyxLQUFLO3NCQUFkLE1BQU07Z0JBRW9CLElBQUk7c0JBQTlCLFNBQVM7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL2FnZW50LWluYm94L2FnZW50LWluYm94LmNvbXBvbmVudC50c1xuLy9cbi8vIE5hdGl2ZSBBbmd1bGFyIHBvcnQgb2YgZnJhbWV3b3JrL3JlYWN0L2FnZW50LWluYm94L0FnZW50SW5ib3gudHN4LlxuLy8gRXZlcnkgYWdlbnQgcnVuIGluIG9uZSBsaXN0LCBncm91cGVkIGFzIE5lZWRzIHlvdSwgUnVubmluZyBhbmQgRG9uZSwgd2l0aCBsaXZlXG4vLyBjbG9ja3Mgb24gdGhlIHJ1bm5pbmcgb25lcy4gQXBwcm92ZSBzdGFydHMgYSBydW4gdGhhdCB3YWl0cyBmb3IgeW91IGFuZCBSZXRyeVxuLy8gdHJpZXMgYSBmYWlsZWQgb25lIGFnYWluOyBhIHJ1biB0aGF0IGNoYW5nZXMgZ3JvdXAgZ2xpZGVzIHRvIGl0cyBwbGFjZS5cbi8vIElucHV0cyBtaXJyb3IgdGhlIFJlYWN0IHByb3BzOyBjYWxsYmFjayBwcm9wcyBiZWNvbWUgQE91dHB1dCBFdmVudEVtaXR0ZXJzLlxuLy8gVGhlIHBlci1zZWNvbmQgY2xvY2sgdGljayBhbmQgdGhlIEZMSVAgZ2xpZGUgYXJlIHBvcnRlZCBmcm9tIHRoZSBSZWFjdCBsb2dpY1xuLy8gYW5kIHRoZSB2YW5pbGxhIEpTIChhZ2VudC1pbmJveC5qcykuIFJlZHVjZWQgbW90aW9uIGlzIHJlc3BlY3RlZCB2aWEgdGhlIHNoYXJlZFxuLy8gUmVkdWNlZE1vdGlvblNlcnZpY2UuXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZvSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvcmUvaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVkdWNlZE1vdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3JlZHVjZWQtbW90aW9uLnNlcnZpY2UnO1xuXG4vKiogV2hpY2ggcGFydCBvZiB0aGUgaW5ib3ggYSBydW4gc2l0cyBpbi4gKi9cbmV4cG9ydCB0eXBlIEluYm94R3JvdXAgPSAnbmVlZHMnIHwgJ3J1bm5pbmcnIHwgJ2RvbmUnO1xuXG4vKiogT25lIGFnZW50IHJ1biBpbiB0aGUgaW5ib3guICovXG5leHBvcnQgaW50ZXJmYWNlIEluYm94UnVuIHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqIFdoYXQgdGhlIHJ1biBpcyBmb3IsIGxpa2UgXCJQdWJsaXNoIHRoZSBwcmljaW5nIHBhZ2VcIi4gKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIFdoaWNoIGFnZW50IHJ1bnMgaXQuIEl0cyBmaXJzdCBsZXR0ZXIgbWFya3MgdGhlIHJvdywgYW5kIGEgZmluaXNoZWQgcnVuIHNob3dzIGl0IHVuZGVyIHRoZSB0aXRsZS4gKi9cbiAgYWdlbnQ6IHN0cmluZztcbiAgLyoqIFRoZSBtYXJrJ3MgZmlsbCwgbGlrZSAndmFyKC0tdm8tYXYtbCknLiBBbiBhdmF0YXIgY29sb3VyIGJyaW5ncyBpdHMgb3duIGluaywgYW55IG90aGVyIGNvbG91ciB0YWtlcyB3aGl0ZSBpbml0aWFscy4gRGVmYXVsdHMgdG8gdGhlIGFjY2VudC4gKi9cbiAgY29sb3I/OiBzdHJpbmc7XG4gIGdyb3VwOiBJbmJveEdyb3VwO1xuICAvKiogVGhlIGxpbmUgdW5kZXIgdGhlIHRpdGxlOiB3aHkgaXQgbmVlZHMgeW91LCBvciB3aGF0IGl0IGlzIGRvaW5nIG5vdy4gQSBmaW5pc2hlZCBydW4gc2hvd3MgaXRzIGFnZW50IGluc3RlYWQuICovXG4gIGRldGFpbD86IHN0cmluZztcbiAgLyoqIE1hcmtzIGEgcnVuIHRoYXQgbmVlZHMgeW91IGJlY2F1c2UgaXQgZmFpbGVkOiBpdHMgcm93IHR1cm5zIHJlZCBhbmQgb2ZmZXJzIFJldHJ5IGluc3RlYWQgb2YgQXBwcm92ZS4gKi9cbiAgZmFpbGVkPzogYm9vbGVhbjtcbiAgLyoqIE1vcmUgb24gdGhlIGZhaWx1cmUsIGluIGEgdG9vbHRpcCBvbiBpdHMgZGV0YWlsIGxpbmUuICovXG4gIHdoeT86IHN0cmluZztcbiAgLyoqIEhvdyBsb25nIGEgcnVubmluZyBydW4gaGFzIGJlZW4gZ29pbmcsIGluIHNlY29uZHMuIEl0cyBjbG9jayBjb3VudHMgb24gZnJvbSBoZXJlLiAqL1xuICBzZWNvbmRzPzogbnVtYmVyO1xuICAvKiogV2hlbiBhIGZpbmlzaGVkIHJ1biBlbmRlZCwgbGlrZSBcIjEybSBhZ29cIi4gKi9cbiAgZW5kZWQ/OiBzdHJpbmc7XG59XG5cbmNvbnN0IEdST1VQUzogW0luYm94R3JvdXAsIHN0cmluZ11bXSA9IFtcbiAgWyduZWVkcycsICdOZWVkcyB5b3UnXSxcbiAgWydydW5uaW5nJywgJ1J1bm5pbmcnXSxcbiAgWydkb25lJywgJ0RvbmUnXSxcbl07XG5cbmNvbnN0IGNsb2NrID0gKHM6IG51bWJlcikgPT4gYCR7TWF0aC5mbG9vcihzIC8gNjApfToke1N0cmluZyhzICUgNjApLnBhZFN0YXJ0KDIsICcwJyl9YDtcblxuLyoqIFRoZSBpbmsgZm9yIGluaXRpYWxzIG9uIGFuIGF2YXRhciBjb2xvdXI6IHRoZSBlaWdodCBhdmF0YXIgY29sb3VycyBlYWNoIGJyaW5nIHRoZWlyIG93bi4gKi9cbmNvbnN0IGF2YXRhckluayA9IChjb2xvcjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gIC9edmFyXFwoLS12by1hdi1bYS16XVxcKSQvLnRlc3QoY29sb3IpID8gY29sb3IucmVwbGFjZSgnKScsICctaW5rKScpIDogdW5kZWZpbmVkO1xuXG4vKiogQSB2aWV3LW1vZGVsIHJvdyB0aGUgdGVtcGxhdGUgcmVuZGVycywgZGVyaXZlZCBmcm9tIGFuIEluYm94UnVuIGZvciBvbmUgZ3JvdXAuICovXG5pbnRlcmZhY2UgUm93IHtcbiAgcnVuOiBJbmJveFJ1bjtcbiAgZ3JvdXA6IEluYm94R3JvdXA7XG4gIGZhaWw6IGJvb2xlYW47XG4gIGNvbDogc3RyaW5nO1xuICBpbms6IHN0cmluZztcbiAgZGV0YWlsOiBzdHJpbmc7XG4gIGluaXRpYWw6IHN0cmluZztcbiAgc2Vjb25kczogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by1hZ2VudC1pbmJveCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGltcG9ydHM6IFtWb0ljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgZGF0YS12bz1cIlwiIFtjbGFzc109XCIndm8tYWliIHZvLXBhbmVsJyArIChjbGFzc05hbWUgPyAnICcgKyBjbGFzc05hbWUgOiAnJylcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ2by1haWItaFwiPlxuICAgICAgICA8Yj57eyB0aXRsZSB9fTwvYj5cbiAgICAgICAgPHNwYW4gYXJpYS1saXZlPVwicG9saXRlXCI+PHNwYW4gY2xhc3M9XCJ2by1zdyB2by1tdXRlZCB2by1haWItc3RcIiBbY2xhc3Mudm8tb3V0XT1cInN0T3V0XCI+e3sgc3RTaG93biB9fTwvc3Bhbj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgI2xpc3Q+XG4gICAgICAgIEBmb3IgKGcgb2YgdmlzaWJsZUdyb3VwczsgdHJhY2sgZ1swXSkge1xuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwidm8tYWliLWdcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImdbMV1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2by1haWItZ2hcIiBbYXR0ci5kYXRhLWtdPVwiJ2g6JyArIGdbMF1cIj48c3Bhbj57eyBnWzFdIH19PC9zcGFuPjxzcGFuIGNsYXNzPVwidm8tblwiPnt7IHJvd3NPZihnWzBdKS5sZW5ndGggfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidm8tYWliLWdsXCIgcm9sZT1cImxpc3RcIj5cbiAgICAgICAgICAgICAgQGZvciAocm93IG9mIHJvd3NPZihnWzBdKTsgdHJhY2sgcm93LnJ1bi5pZCkge1xuICAgICAgICAgICAgICAgIDxkaXYgW2F0dHIuZGF0YS1rXT1cInJvdy5ydW4uaWRcIiBjbGFzcz1cInZvLWFpYi1pXCIgW2NsYXNzLnZvLWZhaWxdPVwicm93LmZhaWxcIiByb2xlPVwibGlzdGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWliLWF2XCIgW3N0eWxlLmJhY2tncm91bmRdPVwicm93LmNvbFwiIFtzdHlsZS5jb2xvcl09XCJyb3cuaW5rXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+e3sgcm93LmluaXRpYWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZvLWFpYi10XCI+XG4gICAgICAgICAgICAgICAgICAgIDxiPnt7IHJvdy5ydW4udGl0bGUgfX08L2I+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2by1zd1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwicm93LmZhaWwgJiYgcm93LnJ1bi53aHkgPyByb3cucnVuLndoeSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICA+e3sgcm93LmRldGFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidm8tYWliLXJcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChyb3cuZ3JvdXAgPT09ICduZWVkcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKHJvdy5mYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tc20gdm8tYWliLWdvXCIgW2F0dHIuYXJpYS1sYWJlbF09XCInUmV0cnkgJyArIHJvdy5ydW4udGl0bGVcIiAoY2xpY2spPVwicmV0cnkuZW1pdChyb3cucnVuLmlkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dm8taWNvbiBuYW1lPVwicmVmcmVzaFwiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj5SZXRyeVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvLXBpbGwgdm8tcHJpbWFyeSB2by1zbSB2by1haWItZ29cIiBbYXR0ci5hcmlhLWxhYmVsXT1cIidBcHByb3ZlICcgKyByb3cucnVuLnRpdGxlXCIgKGNsaWNrKT1cImFwcHJvdmUuZW1pdChyb3cucnVuLmlkKVwiPkFwcHJvdmU8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKHJvdy5ncm91cCA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwidm8tbnVtXCI+e3sgZm10KHJvdy5zZWNvbmRzKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1va1wiPjx2by1pY29uIG5hbWU9XCJva1wiIHNpemU9XCJ4c1wiPjwvdm8taWNvbj48L3NwYW4+PHNwYW4+e3sgcm93LnJ1bi5lbmRlZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vYWdlbnQtaW5ib3guY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQWdlbnRJbmJveENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgLyoqIFRoZSBydW5zIHRvIHNob3cuICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHJ1bnM6IEluYm94UnVuW10gPSBbXTtcbiAgLyoqIERlZmF1bHRzIHRvIFwiSW5ib3hcIi4gKi9cbiAgQElucHV0KCkgdGl0bGUgPSAnSW5ib3gnO1xuICAvKiogVGhlIGxpbmUgYmVzaWRlIHRoZSB0aXRsZS4gRGVmYXVsdHMgdG8gXCIyIG5lZWQgeW91XCIsIHRoZW4gXCIyIHJ1bm5pbmdcIiwgdGhlbiBcIkFsbCBjbGVhciDCtyA0IGRvbmUgdG9kYXlcIi4gKi9cbiAgQElucHV0KCkgc3RhdHVzPzogc3RyaW5nO1xuICAvKiogQW4gZXh0cmEgY2xhc3Mgb24gdGhlIHBhbmVsLiAqL1xuICBASW5wdXQoKSBjbGFzc05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEVtaXR0ZWQgYnkgQXBwcm92ZSBvbiBhIHJ1biB0aGF0IG5lZWRzIHlvdSBhbmQgaGFzbid0IGZhaWxlZC4gKi9cbiAgQE91dHB1dCgpIGFwcHJvdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIEVtaXR0ZWQgYnkgUmV0cnkgb24gYSBmYWlsZWQgcnVuLiAqL1xuICBAT3V0cHV0KCkgcmV0cnkgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkKCdsaXN0JykgcHJpdmF0ZSBsaXN0PzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSByZWR1Y2VkID0gaW5qZWN0KFJlZHVjZWRNb3Rpb25TZXJ2aWNlKTtcblxuICAvLyB0aGUgc3RhdHVzIGxpbmUgY3Jvc3NmYWRlcyB3aGVuIGl0IGNoYW5nZXMsIGxpa2UgdGhlIFJlYWN0IDxTd2FwPlxuICBzdFNob3duID0gJyc7XG4gIHN0T3V0ID0gZmFsc2U7XG4gIHByaXZhdGUgc3RUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuXG4gIC8vIG9uZSB0aWNrIGEgc2Vjb25kIGRyaXZlcyBldmVyeSBydW5uaW5nIGNsb2NrOiBlYWNoIGNvdW50cyBvbiBmcm9tIHRoZSBzZWNvbmRzIGl0IGhhZCB3aGVuIGxhc3QgZ2l2ZW5cbiAgcHJpdmF0ZSB0aWNrID0gMDtcbiAgcHJpdmF0ZSBiYXNlID0gbmV3IE1hcDxzdHJpbmcsIHsgczogbnVtYmVyOyBhdDogbnVtYmVyIH0+KCk7XG4gIHByaXZhdGUgdGlja2VyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuXG4gIC8vIHRoZSBGTElQIGdsaWRlOiB0aGUgdG9wcyBvZiByb3dzIGFuZCBncm91cCB0aXRsZXMgYXJlIG1lYXN1cmVkIGFmdGVyIGVhY2ggbW92ZSBhbmQgZWFzZWQgZnJvbSB3aGVyZSB0aGV5IHdlcmVcbiAgcHJpdmF0ZSB3aGVyZSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgZ3JvdXBPZiA9IG5ldyBNYXA8c3RyaW5nLCBJbmJveEdyb3VwPigpO1xuICBwcml2YXRlIGZpcnN0TWVhc3VyZSA9IHRydWU7XG4gIHByaXZhdGUgbW92ZVRpbWVycyA9IG5ldyBTZXQ8UmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4+KCk7XG5cbiAgZ2V0IHZpc2libGVHcm91cHMoKTogW0luYm94R3JvdXAsIHN0cmluZ11bXSB7XG4gICAgLy8gYSBncm91cCB3aXRoIG5vdGhpbmcgaW4gaXQgZ29lcyBhd2F5XG4gICAgcmV0dXJuIEdST1VQUy5maWx0ZXIoKFtnXSkgPT4gdGhpcy5ydW5zLnNvbWUoKHIpID0+IHIuZ3JvdXAgPT09IGcpKTtcbiAgfVxuXG4gIHJvd3NPZihnOiBJbmJveEdyb3VwKTogUm93W10ge1xuICAgIHJldHVybiB0aGlzLnJ1bnNcbiAgICAgIC5maWx0ZXIoKHIpID0+IHIuZ3JvdXAgPT09IGcpXG4gICAgICAubWFwKChydW4pID0+IHtcbiAgICAgICAgY29uc3QgY29sID0gcnVuLmNvbG9yID8/ICd2YXIoLS12by1hY2NlbnQpJztcbiAgICAgICAgY29uc3QgZmFpbCA9IGcgPT09ICduZWVkcycgJiYgISFydW4uZmFpbGVkO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJ1bixcbiAgICAgICAgICBncm91cDogZyxcbiAgICAgICAgICBmYWlsLFxuICAgICAgICAgIGNvbCxcbiAgICAgICAgICBpbms6IGF2YXRhckluayhjb2wpID8/IChydW4uY29sb3IgPyAnI2ZmZicgOiAndmFyKC0tdm8tb24tYWNjZW50KScpLFxuICAgICAgICAgIGRldGFpbDogZyA9PT0gJ2RvbmUnID8gcnVuLmFnZW50IDogcnVuLmRldGFpbCA/PyAnJyxcbiAgICAgICAgICBpbml0aWFsOiBydW4uYWdlbnQuY2hhckF0KDApLFxuICAgICAgICAgIHNlY29uZHM6IGcgPT09ICdydW5uaW5nJyA/IHRoaXMuc2VjcyhydW4pIDogMCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZm10KHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsb2NrKHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWNzKHI6IEluYm94UnVuKTogbnVtYmVyIHtcbiAgICBjb25zdCBiID0gdGhpcy5iYXNlLmdldChyLmlkKTtcbiAgICBjb25zdCBzID0gci5zZWNvbmRzID8/IDA7XG4gICAgaWYgKCFiIHx8IGIucyAhPT0gcykge1xuICAgICAgdGhpcy5iYXNlLnNldChyLmlkLCB7IHMsIGF0OiB0aGlzLnRpY2sgfSk7XG4gICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgcmV0dXJuIGIucyArIHRoaXMudGljayAtIGIuYXQ7XG4gIH1cblxuICBwcml2YXRlIGxpbmUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBuZWVkID0gdGhpcy5ydW5zLmZpbHRlcigocikgPT4gci5ncm91cCA9PT0gJ25lZWRzJykubGVuZ3RoO1xuICAgIGNvbnN0IHJ1bm5pbmcgPSB0aGlzLnJ1bnMuZmlsdGVyKChyKSA9PiByLmdyb3VwID09PSAncnVubmluZycpLmxlbmd0aDtcbiAgICBjb25zdCBkb25lID0gdGhpcy5ydW5zLmZpbHRlcigocikgPT4gci5ncm91cCA9PT0gJ2RvbmUnKS5sZW5ndGg7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc3RhdHVzID8/XG4gICAgICAobmVlZFxuICAgICAgICA/IGAke25lZWR9IG5lZWQke25lZWQgPiAxID8gJycgOiAncyd9IHlvdWBcbiAgICAgICAgOiBydW5uaW5nXG4gICAgICAgICAgPyBgJHtydW5uaW5nfSBydW5uaW5nYFxuICAgICAgICAgIDogYEFsbCBjbGVhciDCtyAke2RvbmV9IGRvbmUgdG9kYXlgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldExpbmUoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMubGluZSgpO1xuICAgIGlmICghdGhpcy5zdFNob3duKSB7XG4gICAgICB0aGlzLnN0U2hvd24gPSBuZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmV4dCA9PT0gdGhpcy5zdFNob3duKSByZXR1cm47XG4gICAgdGhpcy5zdE91dCA9IHRydWU7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuc3RUaW1lcik7XG4gICAgdGhpcy5zdFRpbWVyID0gc2V0VGltZW91dChcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5zdFNob3duID0gbmV4dDtcbiAgICAgICAgdGhpcy5zdE91dCA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIHRoaXMucmVkdWNlZC5yZWR1Y2UoKSA/IDAgOiAxNzAsXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lYXN1cmUoKTtcbiAgICB0aGlzLnRpY2tlciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIC8vIG9ubHkgYWR2YW5jZSB0aGUgc2hhcmVkIGNsb2NrIHdoaWxlIHNvbWV0aGluZyBpcyBydW5uaW5nXG4gICAgICBpZiAodGhpcy5ydW5zLnNvbWUoKHIpID0+IHIuZ3JvdXAgPT09ICdydW5uaW5nJykgJiYgIXRoaXMucmVkdWNlZC5yZWR1Y2UoKSkgdGhpcy50aWNrICs9IDE7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCFjaGFuZ2VzWydydW5zJ10pIHJldHVybjtcbiAgICAvLyBkcm9wIGNsb2NrIGJhc2VzIGZvciBydW5zIG5vIGxvbmdlciBydW5uaW5nXG4gICAgZm9yIChjb25zdCBpZCBvZiBbLi4udGhpcy5iYXNlLmtleXMoKV0pIHtcbiAgICAgIGlmICghdGhpcy5ydW5zLnNvbWUoKHIpID0+IHIuaWQgPT09IGlkICYmIHIuZ3JvdXAgPT09ICdydW5uaW5nJykpIHRoaXMuYmFzZS5kZWxldGUoaWQpO1xuICAgIH1cbiAgICB0aGlzLnNldExpbmUoKTtcbiAgICAvLyB0aGUgbGF5b3V0IGhhcyBub3QgdXBkYXRlZCB5ZXQ7IGdsaWRlIG9uIHRoZSBuZXh0IGZyYW1lXG4gICAgaWYgKCF0aGlzLmZpcnN0TWVhc3VyZSkge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMubWVhc3VyZSgpKTtcbiAgICB9XG4gIH1cblxuICAvLyBtZWFzdXJlIGV2ZXJ5IHZpc2libGUgcm93IGFuZCBncm91cCB0aXRsZSwgYW5kIGVhc2UgZWFjaCBmcm9tIHdoZXJlIGl0IGxhc3Qgd2FzXG4gIHByaXZhdGUgbWVhc3VyZSgpOiB2b2lkIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLmxpc3Q/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFib3gpIHJldHVybjtcbiAgICBjb25zdCB0b3AgPSBib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgIGNvbnN0IG5leHQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGNvbnN0IGVhc2UgPSBnZXRDb21wdXRlZFN0eWxlKGJveCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS12by1lYXNlJykudHJpbSgpIHx8ICdlYXNlJztcbiAgICBjb25zdCByZWR1Y2UgPSB0aGlzLnJlZHVjZWQucmVkdWNlKCk7XG4gICAgYm94LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdbZGF0YS1rXScpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICBjb25zdCBrID0gZWwuZGF0YXNldFsnayddITtcbiAgICAgIGNvbnN0IHkgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0b3A7XG4gICAgICBjb25zdCB3YXMgPSB0aGlzLndoZXJlLmdldChrKTtcbiAgICAgIG5leHQuc2V0KGssIHkpO1xuICAgICAgaWYgKHJlZHVjZSB8fCB0aGlzLmZpcnN0TWVhc3VyZSkgcmV0dXJuO1xuICAgICAgaWYgKHdhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGEgZ3JvdXAgb3Igcm93IHRoYXQgY29tZXMgYmFjayBmYWRlcyBpblxuICAgICAgICBlbC5hbmltYXRlKFt7IG9wYWNpdHk6IDAgfSwgeyBvcGFjaXR5OiAxIH1dLCB7IGR1cmF0aW9uOiAyNjAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChNYXRoLmFicyh3YXMgLSB5KSA+IDEpIHtcbiAgICAgICAgZWwuYW5pbWF0ZShcbiAgICAgICAgICBbeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7d2FzIC0geX1weClgIH0sIHsgdHJhbnNmb3JtOiAnbm9uZScgfV0sXG4gICAgICAgICAgeyBkdXJhdGlvbjogNDIwLCBlYXNpbmc6IGVhc2UgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIHRoZSBtb3Zpbmcgcm93IHJpZGVzIGFib3ZlIHRoZSByZXN0IHdoaWxlIGl0IHRyYXZlbHNcbiAgICAgIGNvbnN0IG1vdmVkID0gdGhpcy5ncm91cE9mLmdldChrKTtcbiAgICAgIGNvbnN0IG5vdyA9IHRoaXMucnVucy5maW5kKChyKSA9PiByLmlkID09PSBrKT8uZ3JvdXA7XG4gICAgICBpZiAobW92ZWQgJiYgbm93ICYmIG1vdmVkICE9PSBub3cpIHtcbiAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgndm8tbXYnKTtcbiAgICAgICAgY29uc3QgdCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ3ZvLW12Jyk7XG4gICAgICAgICAgdGhpcy5tb3ZlVGltZXJzLmRlbGV0ZSh0KTtcbiAgICAgICAgfSwgNDQwKTtcbiAgICAgICAgdGhpcy5tb3ZlVGltZXJzLmFkZCh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLndoZXJlID0gbmV4dDtcbiAgICB0aGlzLmdyb3VwT2YgPSBuZXcgTWFwKHRoaXMucnVucy5tYXAoKHIpID0+IFtyLmlkLCByLmdyb3VwXSkpO1xuICAgIHRoaXMuZmlyc3RNZWFzdXJlID0gZmFsc2U7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aWNrZXIpIGNsZWFySW50ZXJ2YWwodGhpcy50aWNrZXIpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnN0VGltZXIpO1xuICAgIHRoaXMubW92ZVRpbWVycy5mb3JFYWNoKCh0KSA9PiBjbGVhclRpbWVvdXQodCkpO1xuICAgIHRoaXMubW92ZVRpbWVycy5jbGVhcigpO1xuICB9XG59XG4iXX0=
|