@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,417 @@
|
|
|
1
|
+
// framework/angular/line-chart/line-chart.component.ts
|
|
2
|
+
//
|
|
3
|
+
// Native Angular port of framework/react/line-chart/LineChart.tsx.
|
|
4
|
+
// Two series over time: the first is a solid line with a soft fill, the rest
|
|
5
|
+
// dashed to compare against. The lines draw in from the left while the big
|
|
6
|
+
// number counts up; a pointer readout follows the cursor and the legend toggles
|
|
7
|
+
// the series (one always stays on). Inputs mirror the React props; the draw-in,
|
|
8
|
+
// the count-up and the pointer readout are ported from the vanilla JS
|
|
9
|
+
// (line-chart.js). Tokens only — no color literals.
|
|
10
|
+
//
|
|
11
|
+
// No icons are used by this component, so core/icon.component is not imported.
|
|
12
|
+
import { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "../core/reduced-motion.service";
|
|
15
|
+
const W = 320, H = 140;
|
|
16
|
+
// a smooth line through the points, eased halfway between each pair, as the site draws it
|
|
17
|
+
function smooth(p) {
|
|
18
|
+
return p
|
|
19
|
+
.map((q, i) => {
|
|
20
|
+
if (!i)
|
|
21
|
+
return `M${q[0]} ${q[1]}`;
|
|
22
|
+
const a = p[i - 1], m = (q[0] - a[0]) / 2;
|
|
23
|
+
return `C${a[0] + m} ${a[1]} ${q[0] - m} ${q[1]} ${q[0]} ${q[1]}`;
|
|
24
|
+
})
|
|
25
|
+
.join(' ');
|
|
26
|
+
}
|
|
27
|
+
/** The default whole-number format, like 1,620. */
|
|
28
|
+
function formatCount(n) {
|
|
29
|
+
return Math.round(n).toLocaleString('en-US');
|
|
30
|
+
}
|
|
31
|
+
export class LineChartComponent {
|
|
32
|
+
/** Keys of the series shown. Leave it out to let the legend toggle them. One always stays on. */
|
|
33
|
+
set visible(value) {
|
|
34
|
+
this.controlled = value !== undefined;
|
|
35
|
+
if (value !== undefined) {
|
|
36
|
+
this.on = this.series.map((s) => value.includes(s.key));
|
|
37
|
+
if (this.ready)
|
|
38
|
+
this.apply();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
constructor(reduced, cdr) {
|
|
42
|
+
this.reduced = reduced;
|
|
43
|
+
this.cdr = cdr;
|
|
44
|
+
/** The name over the big number, like "Active editors". */
|
|
45
|
+
this.label = '';
|
|
46
|
+
/** The first series is the main one; the others are dashed, to compare against. */
|
|
47
|
+
this.series = [];
|
|
48
|
+
/** One name per point, shown in the hover readout, like the months. */
|
|
49
|
+
this.points = [];
|
|
50
|
+
/** Writes a value. Defaults to whole numbers like 1,620. */
|
|
51
|
+
this.format = formatCount;
|
|
52
|
+
this.visibleChange = new EventEmitter();
|
|
53
|
+
this.W = W;
|
|
54
|
+
this.H = H;
|
|
55
|
+
this.grid = [35, 70, 105];
|
|
56
|
+
this.ids = 'lnx' + Math.random().toString(36).slice(2, 8);
|
|
57
|
+
this.views = [];
|
|
58
|
+
this.drawOrder = [];
|
|
59
|
+
this.ticks = [];
|
|
60
|
+
this.areaD = '';
|
|
61
|
+
this.leadColor = 'var(--vo-accent)';
|
|
62
|
+
this.clip = 0;
|
|
63
|
+
this.value = 0;
|
|
64
|
+
this.at = false;
|
|
65
|
+
this.px = 0;
|
|
66
|
+
this.ttLeft = 0;
|
|
67
|
+
this.ttValue = '';
|
|
68
|
+
this.ttLabel = '';
|
|
69
|
+
this.on = [];
|
|
70
|
+
this.lo = 0;
|
|
71
|
+
this.hi = 1;
|
|
72
|
+
this.last = 1;
|
|
73
|
+
this.controlled = false;
|
|
74
|
+
this.ready = false;
|
|
75
|
+
this.timers = [];
|
|
76
|
+
this.frames = [];
|
|
77
|
+
}
|
|
78
|
+
color(k) {
|
|
79
|
+
return this.series[k].color ?? (k ? `var(--vo-c${(k % 6) + 1})` : 'var(--vo-accent)');
|
|
80
|
+
}
|
|
81
|
+
y(d) {
|
|
82
|
+
return 136 - ((d - this.lo) / (this.hi - this.lo || 1)) * 128;
|
|
83
|
+
}
|
|
84
|
+
ngAfterViewInit() {
|
|
85
|
+
const n = this.points.length;
|
|
86
|
+
this.last = Math.max(1, n - 1);
|
|
87
|
+
const all = this.series.flatMap((s) => s.values);
|
|
88
|
+
const min = Math.min(...all), max = Math.max(...all);
|
|
89
|
+
[this.lo, this.hi] = this.range ?? [min - (max - min) * 0.11, max + (max - min) * 0.08];
|
|
90
|
+
this.ticks = this.axis ?? this.points.filter((_, i) => i % 2 === 0);
|
|
91
|
+
if (!this.controlled) {
|
|
92
|
+
const def = this.defaultVisible ?? this.series.map((s) => s.key);
|
|
93
|
+
this.on = this.series.map((s) => def.includes(s.key));
|
|
94
|
+
}
|
|
95
|
+
this.views = this.series.map((s, index) => {
|
|
96
|
+
const pts = s.values.map((d, i) => [(i / this.last) * W, this.y(d)]);
|
|
97
|
+
return {
|
|
98
|
+
series: s,
|
|
99
|
+
index,
|
|
100
|
+
points: pts,
|
|
101
|
+
d: smooth(pts),
|
|
102
|
+
color: this.color(index),
|
|
103
|
+
dash: index ? '4 4' : null,
|
|
104
|
+
shown: this.on[index],
|
|
105
|
+
ptLeft: 0,
|
|
106
|
+
ptTop: 0,
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
// the main line is drawn last so it sits on top of the dashed ones
|
|
110
|
+
this.drawOrder = [...this.views.slice(1).reverse(), ...this.views.slice(0, 1)];
|
|
111
|
+
this.areaD = `${this.views[0]?.d ?? ''} L${W} ${H} L0 ${H} Z`;
|
|
112
|
+
this.apply();
|
|
113
|
+
this.ready = true;
|
|
114
|
+
const lead = Math.max(0, this.on.indexOf(true));
|
|
115
|
+
const target = this.series[lead]?.values[n - 1] ?? 0;
|
|
116
|
+
this.cdr.detectChanges();
|
|
117
|
+
// the lines draw in from the left while the big number counts up
|
|
118
|
+
if (this.reduced.reduce()) {
|
|
119
|
+
this.clip = W;
|
|
120
|
+
this.value = target;
|
|
121
|
+
this.cdr.markForCheck();
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
this.later(() => {
|
|
125
|
+
this.tween(0, W, 1300, (w) => (this.clip = w), true);
|
|
126
|
+
this.tween(0, target, 1300, (n2) => (this.value = n2), true);
|
|
127
|
+
}, 260);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
apply() {
|
|
131
|
+
for (const v of this.views)
|
|
132
|
+
v.shown = this.on[v.index];
|
|
133
|
+
this.areaD = `${this.views[0]?.d ?? ''} L${W} ${H} L0 ${H} Z`;
|
|
134
|
+
this.leadColor = this.views[0]?.color ?? 'var(--vo-accent)';
|
|
135
|
+
this.cdr.markForCheck();
|
|
136
|
+
}
|
|
137
|
+
toggle(k) {
|
|
138
|
+
const onCount = this.on.filter(Boolean).length;
|
|
139
|
+
if (this.on[k] && onCount === 1)
|
|
140
|
+
return;
|
|
141
|
+
if (!this.controlled) {
|
|
142
|
+
this.on = this.on.map((v, j) => (j === k ? !v : v));
|
|
143
|
+
this.apply();
|
|
144
|
+
// the big number rolls to the latest value of the leading line that is showing
|
|
145
|
+
const lead = Math.max(0, this.on.indexOf(true));
|
|
146
|
+
const to = this.series[lead].values[this.points.length - 1];
|
|
147
|
+
const from = this.value;
|
|
148
|
+
if (from !== to) {
|
|
149
|
+
if (this.reduced.reduce())
|
|
150
|
+
this.value = to;
|
|
151
|
+
else
|
|
152
|
+
this.tween(from, to, 600, (n) => (this.value = n), false);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
this.visibleChange.emit(this.series.filter((_, j) => (j === k ? !this.on[j] : this.on[j])).map((s) => s.key));
|
|
156
|
+
}
|
|
157
|
+
move(e) {
|
|
158
|
+
const b = this.chart.nativeElement.getBoundingClientRect();
|
|
159
|
+
const i = Math.max(0, Math.min(this.last, Math.round(((e.clientX - b.left) / b.width) * this.last)));
|
|
160
|
+
this.at = true;
|
|
161
|
+
this.px = (i / this.last) * b.width;
|
|
162
|
+
this.ttLeft = Math.max(50, Math.min(this.px, b.width - 50));
|
|
163
|
+
for (const v of this.views) {
|
|
164
|
+
v.ptLeft = this.px;
|
|
165
|
+
v.ptTop = (v.points[i][1] / H) * b.height;
|
|
166
|
+
}
|
|
167
|
+
const lead = Math.max(0, this.on.indexOf(true));
|
|
168
|
+
this.ttValue = this.format(this.series[lead].values[i]) + (this.unit ? ' ' + this.unit : '');
|
|
169
|
+
const both = this.on[0] && this.on[1];
|
|
170
|
+
if (this.compareLabel && both && this.series[1]) {
|
|
171
|
+
const pct = Math.round((this.series[0].values[i] / this.series[1].values[i] - 1) * 100);
|
|
172
|
+
this.ttLabel = `${this.points[i]}, ${pct < 0 ? '−' : '+'}${Math.abs(pct)}% ${this.compareLabel}`;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
this.ttLabel = this.points[i];
|
|
176
|
+
}
|
|
177
|
+
this.value = this.series[lead].values[i];
|
|
178
|
+
this.cdr.markForCheck();
|
|
179
|
+
}
|
|
180
|
+
leave() {
|
|
181
|
+
this.at = false;
|
|
182
|
+
const lead = Math.max(0, this.on.indexOf(true));
|
|
183
|
+
this.value = this.series[lead].values[this.points.length - 1];
|
|
184
|
+
this.cdr.markForCheck();
|
|
185
|
+
}
|
|
186
|
+
// eases from `from` to `to` over `dur`; `easeInOut` uses the cubic in-out from the vanilla draw
|
|
187
|
+
tween(from, to, dur, set, easeInOut) {
|
|
188
|
+
const t0 = performance.now();
|
|
189
|
+
const step = (t) => {
|
|
190
|
+
const p = Math.max(0, Math.min(1, (t - t0) / dur));
|
|
191
|
+
const e = easeInOut
|
|
192
|
+
? p < 0.5
|
|
193
|
+
? 4 * p * p * p
|
|
194
|
+
: 1 - Math.pow(-2 * p + 2, 3) / 2
|
|
195
|
+
: 1 - Math.pow(1 - p, 3);
|
|
196
|
+
set(from + (to - from) * e);
|
|
197
|
+
this.cdr.markForCheck();
|
|
198
|
+
if (p < 1)
|
|
199
|
+
this.frames.push(requestAnimationFrame(step));
|
|
200
|
+
};
|
|
201
|
+
this.frames.push(requestAnimationFrame(step));
|
|
202
|
+
}
|
|
203
|
+
later(fn, ms) {
|
|
204
|
+
this.timers.push(setTimeout(fn, ms));
|
|
205
|
+
}
|
|
206
|
+
ngOnDestroy() {
|
|
207
|
+
this.timers.forEach(clearTimeout);
|
|
208
|
+
this.frames.forEach(cancelAnimationFrame);
|
|
209
|
+
this.timers = [];
|
|
210
|
+
this.frames = [];
|
|
211
|
+
}
|
|
212
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LineChartComponent, deps: [{ token: i1.ReducedMotionService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
213
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LineChartComponent, isStandalone: true, selector: "vo-line-chart", inputs: { label: "label", series: "series", points: "points", axis: "axis", range: "range", unit: "unit", compareLabel: "compareLabel", format: "format", visible: "visible", defaultVisible: "defaultVisible" }, outputs: { visibleChange: "visibleChange" }, viewQueries: [{ propertyName: "chart", first: true, predicate: ["chart"], descendants: true }], ngImport: i0, template: `
|
|
214
|
+
<div data-vo="" class="vo-lnx vo-panel">
|
|
215
|
+
<div class="vo-lnx-h">
|
|
216
|
+
<div>
|
|
217
|
+
<span class="vo-muted">{{ label }}</span>
|
|
218
|
+
<b class="vo-num vo-lnx-v">{{ format(value) }}</b>
|
|
219
|
+
</div>
|
|
220
|
+
<div class="vo-lnx-lg">
|
|
221
|
+
@for (s of views; track s.series.key) {
|
|
222
|
+
<button
|
|
223
|
+
type="button"
|
|
224
|
+
class="vo-lnx-k"
|
|
225
|
+
[class.vo-on]="s.shown"
|
|
226
|
+
[attr.aria-pressed]="s.shown"
|
|
227
|
+
(click)="toggle(s.index)"
|
|
228
|
+
>
|
|
229
|
+
<i [style.background]="s.color"></i>{{ s.series.label }}
|
|
230
|
+
</button>
|
|
231
|
+
}
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
<div
|
|
235
|
+
#chart
|
|
236
|
+
class="vo-lnx-ch"
|
|
237
|
+
(pointermove)="move($event)"
|
|
238
|
+
(pointerleave)="leave()"
|
|
239
|
+
>
|
|
240
|
+
<svg
|
|
241
|
+
class="vo-lnx-svg"
|
|
242
|
+
[attr.viewBox]="'0 0 ' + W + ' ' + H"
|
|
243
|
+
preserveAspectRatio="none"
|
|
244
|
+
aria-hidden="true"
|
|
245
|
+
>
|
|
246
|
+
<defs>
|
|
247
|
+
<linearGradient [attr.id]="ids + 'g'" x1="0" x2="0" y1="0" y2="1">
|
|
248
|
+
<stop offset="0" [attr.stop-color]="leadColor" stop-opacity=".16"></stop>
|
|
249
|
+
<stop offset="1" [attr.stop-color]="leadColor" stop-opacity="0"></stop>
|
|
250
|
+
</linearGradient>
|
|
251
|
+
<clipPath [attr.id]="ids + 'c'">
|
|
252
|
+
<rect x="0" y="-10" [attr.width]="clip" height="160"></rect>
|
|
253
|
+
</clipPath>
|
|
254
|
+
</defs>
|
|
255
|
+
@for (g of grid; track g) {
|
|
256
|
+
<line class="vo-gl" x1="0" [attr.x2]="W" [attr.y1]="g" [attr.y2]="g"></line>
|
|
257
|
+
}
|
|
258
|
+
<g [attr.clip-path]="'url(#' + ids + 'c)'">
|
|
259
|
+
<path
|
|
260
|
+
class="vo-ar"
|
|
261
|
+
[attr.d]="areaD"
|
|
262
|
+
[attr.fill]="'url(#' + ids + 'g)'"
|
|
263
|
+
[style.opacity]="views[0]?.shown ? 1 : 0"
|
|
264
|
+
></path>
|
|
265
|
+
<!-- the main line goes on top -->
|
|
266
|
+
@for (s of drawOrder; track s.series.key) {
|
|
267
|
+
<path
|
|
268
|
+
class="vo-ln"
|
|
269
|
+
[class.vo-off]="!s.shown"
|
|
270
|
+
[attr.d]="s.d"
|
|
271
|
+
[style.stroke]="s.color"
|
|
272
|
+
[attr.stroke-dasharray]="s.dash"
|
|
273
|
+
></path>
|
|
274
|
+
}
|
|
275
|
+
</g>
|
|
276
|
+
</svg>
|
|
277
|
+
<div class="vo-lnx-x" [style.left.px]="at ? px : null"></div>
|
|
278
|
+
<div class="vo-lnx-tt" [style.left.px]="at ? ttLeft : null">
|
|
279
|
+
<b class="vo-num">{{ ttValue }}</b>
|
|
280
|
+
<span>{{ ttLabel }}</span>
|
|
281
|
+
</div>
|
|
282
|
+
@for (s of views; track s.series.key) {
|
|
283
|
+
<span
|
|
284
|
+
class="vo-lnx-pt"
|
|
285
|
+
[class.vo-on]="s.shown"
|
|
286
|
+
[style.color]="s.color"
|
|
287
|
+
[style.left.px]="at ? s.ptLeft : null"
|
|
288
|
+
[style.top.px]="at ? s.ptTop : null"
|
|
289
|
+
></span>
|
|
290
|
+
}
|
|
291
|
+
</div>
|
|
292
|
+
<div class="vo-lnx-ax vo-muted vo-num">
|
|
293
|
+
@for (t of ticks; track $index) {
|
|
294
|
+
<span>{{ t }}</span>
|
|
295
|
+
}
|
|
296
|
+
</div>
|
|
297
|
+
</div>
|
|
298
|
+
`, isInline: true, styles: [".vo-lnx{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:10px}.vo-lnx-h{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;flex-wrap:wrap}.vo-lnx-h>div:first-child{display:flex;flex-direction:column;font-size:12.5px}.vo-lnx-v{font-size:14px;font-weight:500;letter-spacing:-.02em;color:var(--vo-fg)}.vo-lnx-lg{display:flex;gap:var(--vo-s-1)}.vo-lnx-k{display:flex;align-items:center;gap:6px;height:26px;padding:0 9px;border-radius:var(--vo-r-pill);font-size:12px;color:var(--vo-muted);transition:color .2s,background .2s}@media (hover:hover) and (pointer:fine){.vo-lnx-k:hover{background:var(--vo-row)}}.vo-lnx-k.vo-on{color:var(--vo-fg)}.vo-lnx-k i{width:8px;height:8px;border-radius:50%;transition:transform .3s var(--vo-ease),opacity .3s}.vo-lnx-k:not(.vo-on) i{opacity:.3;transform:scale(.6)}.vo-lnx-ch{position:relative;height:150px}.vo-lnx-svg{width:100%;height:100%;display:block;overflow:visible}.vo-lnx-svg .vo-gl{stroke:var(--vo-line);stroke-width:1;vector-effect:non-scaling-stroke}.vo-lnx-svg .vo-ln{fill:none;stroke-width:2;vector-effect:non-scaling-stroke;stroke-linejoin:round;stroke-linecap:round;transition:opacity .4s}.vo-lnx-svg .vo-ln.vo-off{opacity:0}.vo-lnx-svg .vo-ar{transition:opacity .4s}.vo-lnx-x{position:absolute;top:0;bottom:0;width:1px;background:var(--vo-faint);opacity:0;transition:opacity .2s;pointer-events:none}.vo-lnx-tt{position:absolute;top:-6px;padding:6px 9px;border-radius:calc(10px * var(--vo-rk));background:var(--vo-ink);color:var(--vo-on-ink);font-size:11.5px;display:flex;flex-direction:column;opacity:0;transform:translate(-50%,-100%) translateY(4px);transition:opacity .2s,transform .25s var(--vo-ease);pointer-events:none;white-space:nowrap}.vo-lnx-tt span{opacity:.7}@media (hover:hover) and (pointer:fine){.vo-lnx-ch:hover .vo-lnx-x,.vo-lnx-ch:hover .vo-lnx-tt{opacity:1}}@media (hover:hover) and (pointer:fine){.vo-lnx-ch:hover .vo-lnx-tt{transform:translate(-50%,-100%)}}.vo-lnx-pt{position:absolute;width:9px;height:9px;margin:-4.5px;border-radius:50%;background:var(--vo-surface);box-shadow:0 0 0 2px currentColor;opacity:0;transition:opacity .2s;pointer-events:none}@media (hover:hover) and (pointer:fine){.vo-lnx-ch:hover .vo-lnx-pt.vo-on{opacity:1}}.vo-lnx-ax{display:flex;justify-content:space-between;font-size:11px}\n"], encapsulation: i0.ViewEncapsulation.None }); }
|
|
299
|
+
}
|
|
300
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LineChartComponent, decorators: [{
|
|
301
|
+
type: Component,
|
|
302
|
+
args: [{ selector: 'vo-line-chart', standalone: true, encapsulation: ViewEncapsulation.None, template: `
|
|
303
|
+
<div data-vo="" class="vo-lnx vo-panel">
|
|
304
|
+
<div class="vo-lnx-h">
|
|
305
|
+
<div>
|
|
306
|
+
<span class="vo-muted">{{ label }}</span>
|
|
307
|
+
<b class="vo-num vo-lnx-v">{{ format(value) }}</b>
|
|
308
|
+
</div>
|
|
309
|
+
<div class="vo-lnx-lg">
|
|
310
|
+
@for (s of views; track s.series.key) {
|
|
311
|
+
<button
|
|
312
|
+
type="button"
|
|
313
|
+
class="vo-lnx-k"
|
|
314
|
+
[class.vo-on]="s.shown"
|
|
315
|
+
[attr.aria-pressed]="s.shown"
|
|
316
|
+
(click)="toggle(s.index)"
|
|
317
|
+
>
|
|
318
|
+
<i [style.background]="s.color"></i>{{ s.series.label }}
|
|
319
|
+
</button>
|
|
320
|
+
}
|
|
321
|
+
</div>
|
|
322
|
+
</div>
|
|
323
|
+
<div
|
|
324
|
+
#chart
|
|
325
|
+
class="vo-lnx-ch"
|
|
326
|
+
(pointermove)="move($event)"
|
|
327
|
+
(pointerleave)="leave()"
|
|
328
|
+
>
|
|
329
|
+
<svg
|
|
330
|
+
class="vo-lnx-svg"
|
|
331
|
+
[attr.viewBox]="'0 0 ' + W + ' ' + H"
|
|
332
|
+
preserveAspectRatio="none"
|
|
333
|
+
aria-hidden="true"
|
|
334
|
+
>
|
|
335
|
+
<defs>
|
|
336
|
+
<linearGradient [attr.id]="ids + 'g'" x1="0" x2="0" y1="0" y2="1">
|
|
337
|
+
<stop offset="0" [attr.stop-color]="leadColor" stop-opacity=".16"></stop>
|
|
338
|
+
<stop offset="1" [attr.stop-color]="leadColor" stop-opacity="0"></stop>
|
|
339
|
+
</linearGradient>
|
|
340
|
+
<clipPath [attr.id]="ids + 'c'">
|
|
341
|
+
<rect x="0" y="-10" [attr.width]="clip" height="160"></rect>
|
|
342
|
+
</clipPath>
|
|
343
|
+
</defs>
|
|
344
|
+
@for (g of grid; track g) {
|
|
345
|
+
<line class="vo-gl" x1="0" [attr.x2]="W" [attr.y1]="g" [attr.y2]="g"></line>
|
|
346
|
+
}
|
|
347
|
+
<g [attr.clip-path]="'url(#' + ids + 'c)'">
|
|
348
|
+
<path
|
|
349
|
+
class="vo-ar"
|
|
350
|
+
[attr.d]="areaD"
|
|
351
|
+
[attr.fill]="'url(#' + ids + 'g)'"
|
|
352
|
+
[style.opacity]="views[0]?.shown ? 1 : 0"
|
|
353
|
+
></path>
|
|
354
|
+
<!-- the main line goes on top -->
|
|
355
|
+
@for (s of drawOrder; track s.series.key) {
|
|
356
|
+
<path
|
|
357
|
+
class="vo-ln"
|
|
358
|
+
[class.vo-off]="!s.shown"
|
|
359
|
+
[attr.d]="s.d"
|
|
360
|
+
[style.stroke]="s.color"
|
|
361
|
+
[attr.stroke-dasharray]="s.dash"
|
|
362
|
+
></path>
|
|
363
|
+
}
|
|
364
|
+
</g>
|
|
365
|
+
</svg>
|
|
366
|
+
<div class="vo-lnx-x" [style.left.px]="at ? px : null"></div>
|
|
367
|
+
<div class="vo-lnx-tt" [style.left.px]="at ? ttLeft : null">
|
|
368
|
+
<b class="vo-num">{{ ttValue }}</b>
|
|
369
|
+
<span>{{ ttLabel }}</span>
|
|
370
|
+
</div>
|
|
371
|
+
@for (s of views; track s.series.key) {
|
|
372
|
+
<span
|
|
373
|
+
class="vo-lnx-pt"
|
|
374
|
+
[class.vo-on]="s.shown"
|
|
375
|
+
[style.color]="s.color"
|
|
376
|
+
[style.left.px]="at ? s.ptLeft : null"
|
|
377
|
+
[style.top.px]="at ? s.ptTop : null"
|
|
378
|
+
></span>
|
|
379
|
+
}
|
|
380
|
+
</div>
|
|
381
|
+
<div class="vo-lnx-ax vo-muted vo-num">
|
|
382
|
+
@for (t of ticks; track $index) {
|
|
383
|
+
<span>{{ t }}</span>
|
|
384
|
+
}
|
|
385
|
+
</div>
|
|
386
|
+
</div>
|
|
387
|
+
`, styles: [".vo-lnx{padding:var(--vo-s-4);display:flex;flex-direction:column;gap:10px}.vo-lnx-h{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;flex-wrap:wrap}.vo-lnx-h>div:first-child{display:flex;flex-direction:column;font-size:12.5px}.vo-lnx-v{font-size:14px;font-weight:500;letter-spacing:-.02em;color:var(--vo-fg)}.vo-lnx-lg{display:flex;gap:var(--vo-s-1)}.vo-lnx-k{display:flex;align-items:center;gap:6px;height:26px;padding:0 9px;border-radius:var(--vo-r-pill);font-size:12px;color:var(--vo-muted);transition:color .2s,background .2s}@media (hover:hover) and (pointer:fine){.vo-lnx-k:hover{background:var(--vo-row)}}.vo-lnx-k.vo-on{color:var(--vo-fg)}.vo-lnx-k i{width:8px;height:8px;border-radius:50%;transition:transform .3s var(--vo-ease),opacity .3s}.vo-lnx-k:not(.vo-on) i{opacity:.3;transform:scale(.6)}.vo-lnx-ch{position:relative;height:150px}.vo-lnx-svg{width:100%;height:100%;display:block;overflow:visible}.vo-lnx-svg .vo-gl{stroke:var(--vo-line);stroke-width:1;vector-effect:non-scaling-stroke}.vo-lnx-svg .vo-ln{fill:none;stroke-width:2;vector-effect:non-scaling-stroke;stroke-linejoin:round;stroke-linecap:round;transition:opacity .4s}.vo-lnx-svg .vo-ln.vo-off{opacity:0}.vo-lnx-svg .vo-ar{transition:opacity .4s}.vo-lnx-x{position:absolute;top:0;bottom:0;width:1px;background:var(--vo-faint);opacity:0;transition:opacity .2s;pointer-events:none}.vo-lnx-tt{position:absolute;top:-6px;padding:6px 9px;border-radius:calc(10px * var(--vo-rk));background:var(--vo-ink);color:var(--vo-on-ink);font-size:11.5px;display:flex;flex-direction:column;opacity:0;transform:translate(-50%,-100%) translateY(4px);transition:opacity .2s,transform .25s var(--vo-ease);pointer-events:none;white-space:nowrap}.vo-lnx-tt span{opacity:.7}@media (hover:hover) and (pointer:fine){.vo-lnx-ch:hover .vo-lnx-x,.vo-lnx-ch:hover .vo-lnx-tt{opacity:1}}@media (hover:hover) and (pointer:fine){.vo-lnx-ch:hover .vo-lnx-tt{transform:translate(-50%,-100%)}}.vo-lnx-pt{position:absolute;width:9px;height:9px;margin:-4.5px;border-radius:50%;background:var(--vo-surface);box-shadow:0 0 0 2px currentColor;opacity:0;transition:opacity .2s;pointer-events:none}@media (hover:hover) and (pointer:fine){.vo-lnx-ch:hover .vo-lnx-pt.vo-on{opacity:1}}.vo-lnx-ax{display:flex;justify-content:space-between;font-size:11px}\n"] }]
|
|
388
|
+
}], ctorParameters: () => [{ type: i1.ReducedMotionService }, { type: i0.ChangeDetectorRef }], propDecorators: { label: [{
|
|
389
|
+
type: Input,
|
|
390
|
+
args: [{ required: true }]
|
|
391
|
+
}], series: [{
|
|
392
|
+
type: Input,
|
|
393
|
+
args: [{ required: true }]
|
|
394
|
+
}], points: [{
|
|
395
|
+
type: Input,
|
|
396
|
+
args: [{ required: true }]
|
|
397
|
+
}], axis: [{
|
|
398
|
+
type: Input
|
|
399
|
+
}], range: [{
|
|
400
|
+
type: Input
|
|
401
|
+
}], unit: [{
|
|
402
|
+
type: Input
|
|
403
|
+
}], compareLabel: [{
|
|
404
|
+
type: Input
|
|
405
|
+
}], format: [{
|
|
406
|
+
type: Input
|
|
407
|
+
}], visible: [{
|
|
408
|
+
type: Input
|
|
409
|
+
}], defaultVisible: [{
|
|
410
|
+
type: Input
|
|
411
|
+
}], visibleChange: [{
|
|
412
|
+
type: Output
|
|
413
|
+
}], chart: [{
|
|
414
|
+
type: ViewChild,
|
|
415
|
+
args: ['chart']
|
|
416
|
+
}] } });
|
|
417
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saW5lLWNoYXJ0L2xpbmUtY2hhcnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsbUVBQW1FO0FBQ25FLDZFQUE2RTtBQUM3RSwyRUFBMkU7QUFDM0UsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRixzRUFBc0U7QUFDdEUsb0RBQW9EO0FBQ3BELEVBQUU7QUFDRiwrRUFBK0U7QUFFL0UsT0FBTyxFQUdMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDOzs7QUFldkIsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7QUFFdkIsMEZBQTBGO0FBQzFGLFNBQVMsTUFBTSxDQUFDLENBQXFCO0lBQ25DLE9BQU8sQ0FBQztTQUNMLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNaLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxD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QkFDRCxpQkFBaUIsQ0FBQyxJQUFJLFlBQzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUZUO3lIQUswQixLQUFLO3NCQUEvQixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFFRSxNQUFNO3NCQUFoQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFFRSxNQUFNO3NCQUFoQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFFaEIsSUFBSTtzQkFBWixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRU8sT0FBTztzQkFBbkIsS0FBSztnQkFPRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVJLGFBQWE7c0JBQXRCLE1BQU07Z0JBRXFCLEtBQUs7c0JBQWhDLFNBQVM7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGZyYW1ld29yay9hbmd1bGFyL2xpbmUtY2hhcnQvbGluZS1jaGFydC5jb21wb25lbnQudHNcbi8vXG4vLyBOYXRpdmUgQW5ndWxhciBwb3J0IG9mIGZyYW1ld29yay9yZWFjdC9saW5lLWNoYXJ0L0xpbmVDaGFydC50c3guXG4vLyBUd28gc2VyaWVzIG92ZXIgdGltZTogdGhlIGZpcnN0IGlzIGEgc29saWQgbGluZSB3aXRoIGEgc29mdCBmaWxsLCB0aGUgcmVzdFxuLy8gZGFzaGVkIHRvIGNvbXBhcmUgYWdhaW5zdC4gVGhlIGxpbmVzIGRyYXcgaW4gZnJvbSB0aGUgbGVmdCB3aGlsZSB0aGUgYmlnXG4vLyBudW1iZXIgY291bnRzIHVwOyBhIHBvaW50ZXIgcmVhZG91dCBmb2xsb3dzIHRoZSBjdXJzb3IgYW5kIHRoZSBsZWdlbmQgdG9nZ2xlc1xuLy8gdGhlIHNlcmllcyAob25lIGFsd2F5cyBzdGF5cyBvbikuIElucHV0cyBtaXJyb3IgdGhlIFJlYWN0IHByb3BzOyB0aGUgZHJhdy1pbixcbi8vIHRoZSBjb3VudC11cCBhbmQgdGhlIHBvaW50ZXIgcmVhZG91dCBhcmUgcG9ydGVkIGZyb20gdGhlIHZhbmlsbGEgSlNcbi8vIChsaW5lLWNoYXJ0LmpzKS4gVG9rZW5zIG9ubHkg4oCUIG5vIGNvbG9yIGxpdGVyYWxzLlxuLy9cbi8vIE5vIGljb25zIGFyZSB1c2VkIGJ5IHRoaXMgY29tcG9uZW50LCBzbyBjb3JlL2ljb24uY29tcG9uZW50IGlzIG5vdCBpbXBvcnRlZC5cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVkdWNlZE1vdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb3JlL3JlZHVjZWQtbW90aW9uLnNlcnZpY2UnO1xuXG4vKiogT25lIHNlcmllcyBvZiB0aGUgY2hhcnQuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmVDaGFydFNlcmllcyB7XG4gIC8qKiBOYW1lcyB0aGUgc2VyaWVzIGluIGB2aXNpYmxlYC4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIC8qKiBUaGUgbGVnZW5kJ3MgbGFiZWwsIGxpa2UgXCJUaGlzIHllYXJcIi4gKi9cbiAgbGFiZWw6IHN0cmluZztcbiAgLyoqIE9uZSB2YWx1ZSBwZXIgcG9pbnQsIG9sZGVzdCBmaXJzdC4gKi9cbiAgdmFsdWVzOiBudW1iZXJbXTtcbiAgLyoqIERlZmF1bHRzIHRvIHRoZSBjaGFydCBwYWxldHRlOiB0aGUgYWNjZW50IGZvciB0aGUgZmlyc3Qgc2VyaWVzLCB0aGVuIHZpb2xldCwgZ3JlZW4gYW5kIHNvIG9uLiAqL1xuICBjb2xvcj86IHN0cmluZztcbn1cblxuY29uc3QgVyA9IDMyMCwgSCA9IDE0MDtcblxuLy8gYSBzbW9vdGggbGluZSB0aHJvdWdoIHRoZSBwb2ludHMsIGVhc2VkIGhhbGZ3YXkgYmV0d2VlbiBlYWNoIHBhaXIsIGFzIHRoZSBzaXRlIGRyYXdzIGl0XG5mdW5jdGlvbiBzbW9vdGgocDogW251bWJlciwgbnVtYmVyXVtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBcbiAgICAubWFwKChxLCBpKSA9PiB7XG4gICAgICBpZiAoIWkpIHJldHVybiBgTSR7cVswXX0gJHtxWzFdfWA7XG4gICAgICBjb25zdCBhID0gcFtpIC0gMV0sIG0gPSAocVswXSAtIGFbMF0pIC8gMjtcbiAgICAgIHJldHVybiBgQyR7YVswXSArIG19ICR7YVsxXX0gJHtxWzBdIC0gbX0gJHtxWzFdfSAke3FbMF19ICR7cVsxXX1gO1xuICAgIH0pXG4gICAgLmpvaW4oJyAnKTtcbn1cblxuLyoqIFRoZSBkZWZhdWx0IHdob2xlLW51bWJlciBmb3JtYXQsIGxpa2UgMSw2MjAuICovXG5mdW5jdGlvbiBmb3JtYXRDb3VudChuOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gTWF0aC5yb3VuZChuKS50b0xvY2FsZVN0cmluZygnZW4tVVMnKTtcbn1cblxuLyoqIEludGVybmFsIHBlci1zZXJpZXMgcmVuZGVyIHN0YXRlLiAqL1xuaW50ZXJmYWNlIFNlcmllc1ZpZXcge1xuICBzZXJpZXM6IExpbmVDaGFydFNlcmllcztcbiAgaW5kZXg6IG51bWJlcjtcbiAgZDogc3RyaW5nO1xuICBwb2ludHM6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgY29sb3I6IHN0cmluZztcbiAgZGFzaDogc3RyaW5nIHwgbnVsbDtcbiAgc2hvd246IGJvb2xlYW47XG4gIHB0TGVmdDogbnVtYmVyO1xuICBwdFRvcDogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2by1saW5lLWNoYXJ0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGRhdGEtdm89XCJcIiBjbGFzcz1cInZvLWxueCB2by1wYW5lbFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInZvLWxueC1oXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2by1tdXRlZFwiPnt7IGxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDxiIGNsYXNzPVwidm8tbnVtIHZvLWxueC12XCI+e3sgZm9ybWF0KHZhbHVlKSB9fTwvYj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2by1sbngtbGdcIj5cbiAgICAgICAgICBAZm9yIChzIG9mIHZpZXdzOyB0cmFjayBzLnNlcmllcy5rZXkpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidm8tbG54LWtcIlxuICAgICAgICAgICAgICBbY2xhc3Mudm8tb25dPVwicy5zaG93blwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJzLnNob3duXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZShzLmluZGV4KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInMuY29sb3JcIj48L2k+e3sgcy5zZXJpZXMubGFiZWwgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXZcbiAgICAgICAgI2NoYXJ0XG4gICAgICAgIGNsYXNzPVwidm8tbG54LWNoXCJcbiAgICAgICAgKHBvaW50ZXJtb3ZlKT1cIm1vdmUoJGV2ZW50KVwiXG4gICAgICAgIChwb2ludGVybGVhdmUpPVwibGVhdmUoKVwiXG4gICAgICA+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICBjbGFzcz1cInZvLWxueC1zdmdcIlxuICAgICAgICAgIFthdHRyLnZpZXdCb3hdPVwiJzAgMCAnICsgVyArICcgJyArIEhcIlxuICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89XCJub25lXCJcbiAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgW2F0dHIuaWRdPVwiaWRzICsgJ2cnXCIgeDE9XCIwXCIgeDI9XCIwXCIgeTE9XCIwXCIgeTI9XCIxXCI+XG4gICAgICAgICAgICAgIDxzdG9wIG9mZnNldD1cIjBcIiBbYXR0ci5zdG9wLWNvbG9yXT1cImxlYWRDb2xvclwiIHN0b3Atb3BhY2l0eT1cIi4xNlwiPjwvc3RvcD5cbiAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PVwiMVwiIFthdHRyLnN0b3AtY29sb3JdPVwibGVhZENvbG9yXCIgc3RvcC1vcGFjaXR5PVwiMFwiPjwvc3RvcD5cbiAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XG4gICAgICAgICAgICA8Y2xpcFBhdGggW2F0dHIuaWRdPVwiaWRzICsgJ2MnXCI+XG4gICAgICAgICAgICAgIDxyZWN0IHg9XCIwXCIgeT1cIi0xMFwiIFthdHRyLndpZHRoXT1cImNsaXBcIiBoZWlnaHQ9XCIxNjBcIj48L3JlY3Q+XG4gICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICBAZm9yIChnIG9mIGdyaWQ7IHRyYWNrIGcpIHtcbiAgICAgICAgICAgIDxsaW5lIGNsYXNzPVwidm8tZ2xcIiB4MT1cIjBcIiBbYXR0ci54Ml09XCJXXCIgW2F0dHIueTFdPVwiZ1wiIFthdHRyLnkyXT1cImdcIj48L2xpbmU+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxnIFthdHRyLmNsaXAtcGF0aF09XCIndXJsKCMnICsgaWRzICsgJ2MpJ1wiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgY2xhc3M9XCJ2by1hclwiXG4gICAgICAgICAgICAgIFthdHRyLmRdPVwiYXJlYURcIlxuICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cIid1cmwoIycgKyBpZHMgKyAnZyknXCJcbiAgICAgICAgICAgICAgW3N0eWxlLm9wYWNpdHldPVwidmlld3NbMF0/LnNob3duID8gMSA6IDBcIlxuICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgIDwhLS0gdGhlIG1haW4gbGluZSBnb2VzIG9uIHRvcCAtLT5cbiAgICAgICAgICAgIEBmb3IgKHMgb2YgZHJhd09yZGVyOyB0cmFjayBzLnNlcmllcy5rZXkpIHtcbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBjbGFzcz1cInZvLWxuXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mudm8tb2ZmXT1cIiFzLnNob3duXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kXT1cInMuZFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnN0cm9rZV09XCJzLmNvbG9yXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cInMuZGFzaFwiXG4gICAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9nPlxuICAgICAgICA8L3N2Zz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLWxueC14XCIgW3N0eWxlLmxlZnQucHhdPVwiYXQgPyBweCA6IG51bGxcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZvLWxueC10dFwiIFtzdHlsZS5sZWZ0LnB4XT1cImF0ID8gdHRMZWZ0IDogbnVsbFwiPlxuICAgICAgICAgIDxiIGNsYXNzPVwidm8tbnVtXCI+e3sgdHRWYWx1ZSB9fTwvYj5cbiAgICAgICAgICA8c3Bhbj57eyB0dExhYmVsIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGZvciAocyBvZiB2aWV3czsgdHJhY2sgcy5zZXJpZXMua2V5KSB7XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwidm8tbG54LXB0XCJcbiAgICAgICAgICAgIFtjbGFzcy52by1vbl09XCJzLnNob3duXCJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzLmNvbG9yXCJcbiAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImF0ID8gcy5wdExlZnQgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiYXQgPyBzLnB0VG9wIDogbnVsbFwiXG4gICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidm8tbG54LWF4IHZvLW11dGVkIHZvLW51bVwiPlxuICAgICAgICBAZm9yICh0IG9mIHRpY2tzOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICA8c3Bhbj57eyB0IH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVVcmw6ICcuL2xpbmUtY2hhcnQuY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgTGluZUNoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqIFRoZSBuYW1lIG92ZXIgdGhlIGJpZyBudW1iZXIsIGxpa2UgXCJBY3RpdmUgZWRpdG9yc1wiLiAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBsYWJlbCA9ICcnO1xuICAvKiogVGhlIGZpcnN0IHNlcmllcyBpcyB0aGUgbWFpbiBvbmU7IHRoZSBvdGhlcnMgYXJlIGRhc2hlZCwgdG8gY29tcGFyZSBhZ2FpbnN0LiAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBzZXJpZXM6IExpbmVDaGFydFNlcmllc1tdID0gW107XG4gIC8qKiBPbmUgbmFtZSBwZXIgcG9pbnQsIHNob3duIGluIHRoZSBob3ZlciByZWFkb3V0LCBsaWtlIHRoZSBtb250aHMuICovXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIHBvaW50czogc3RyaW5nW10gPSBbXTtcbiAgLyoqIExhYmVscyBzcHJlYWQgYWxvbmcgdGhlIGJvdHRvbS4gRGVmYXVsdHMgdG8gZXZlcnkgb3RoZXIgcG9pbnQuICovXG4gIEBJbnB1dCgpIGF4aXM/OiBzdHJpbmdbXTtcbiAgLyoqIFRoZSB2YWx1ZXMgYXQgdGhlIGJvdHRvbSBhbmQgdG9wIG9mIHRoZSBjaGFydC4gRGVmYXVsdHMgdG8gdGhlIGRhdGEncyByYW5nZSB3aXRoIGEgbGl0dGxlIHJvb20uICovXG4gIEBJbnB1dCgpIHJhbmdlPzogW251bWJlciwgbnVtYmVyXTtcbiAgLyoqIFdoYXQgdGhlIHZhbHVlcyBjb3VudCwgbGlrZSBcImVkaXRvcnNcIiBpbiBcIjEsNjIwIGVkaXRvcnNcIi4gKi9cbiAgQElucHV0KCkgdW5pdD86IHN0cmluZztcbiAgLyoqIEVuZHMgdGhlIHJlYWRvdXQncyBjb21wYXJpc29uIG9mIHRoZSBmaXJzdCB0d28gc2VyaWVzLCBsaWtlIFwidnMgbGFzdCB5ZWFyXCIuICovXG4gIEBJbnB1dCgpIGNvbXBhcmVMYWJlbD86IHN0cmluZztcbiAgLyoqIFdyaXRlcyBhIHZhbHVlLiBEZWZhdWx0cyB0byB3aG9sZSBudW1iZXJzIGxpa2UgMSw2MjAuICovXG4gIEBJbnB1dCgpIGZvcm1hdDogKG46IG51bWJlcikgPT4gc3RyaW5nID0gZm9ybWF0Q291bnQ7XG4gIC8qKiBLZXlzIG9mIHRoZSBzZXJpZXMgc2hvd24uIExlYXZlIGl0IG91dCB0byBsZXQgdGhlIGxlZ2VuZCB0b2dnbGUgdGhlbS4gT25lIGFsd2F5cyBzdGF5cyBvbi4gKi9cbiAgQElucHV0KCkgc2V0IHZpc2libGUodmFsdWU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5jb250cm9sbGVkID0gdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vbiA9IHRoaXMuc2VyaWVzLm1hcCgocykgPT4gdmFsdWUuaW5jbHVkZXMocy5rZXkpKTtcbiAgICAgIGlmICh0aGlzLnJlYWR5KSB0aGlzLmFwcGx5KCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpIGRlZmF1bHRWaXNpYmxlPzogc3RyaW5nW107XG5cbiAgQE91dHB1dCgpIHZpc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NoYXJ0JykgcHJpdmF0ZSBjaGFydCE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIHJlYWRvbmx5IFcgPSBXO1xuICByZWFkb25seSBIID0gSDtcbiAgcmVhZG9ubHkgZ3JpZCA9IFszNSwgNzAsIDEwNV07XG4gIGlkcyA9ICdsbngnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG5cbiAgdmlld3M6IFNlcmllc1ZpZXdbXSA9IFtdO1xuICBkcmF3T3JkZXI6IFNlcmllc1ZpZXdbXSA9IFtdO1xuICB0aWNrczogc3RyaW5nW10gPSBbXTtcbiAgYXJlYUQgPSAnJztcbiAgbGVhZENvbG9yID0gJ3ZhcigtLXZvLWFjY2VudCknO1xuXG4gIGNsaXAgPSAwO1xuICB2YWx1ZSA9IDA7XG4gIGF0ID0gZmFsc2U7XG4gIHB4ID0gMDtcbiAgdHRMZWZ0ID0gMDtcbiAgdHRWYWx1ZSA9ICcnO1xuICB0dExhYmVsID0gJyc7XG5cbiAgcHJpdmF0ZSBvbjogYm9vbGVhbltdID0gW107XG4gIHByaXZhdGUgbG8gPSAwO1xuICBwcml2YXRlIGhpID0gMTtcbiAgcHJpdmF0ZSBsYXN0ID0gMTtcbiAgcHJpdmF0ZSBjb250cm9sbGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSB0aW1lcnM6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBmcmFtZXM6IG51bWJlcltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWR1Y2VkOiBSZWR1Y2VkTW90aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBwcml2YXRlIGNvbG9yKGs6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWVzW2tdLmNvbG9yID8/IChrID8gYHZhcigtLXZvLWMkeyhrICUgNikgKyAxfSlgIDogJ3ZhcigtLXZvLWFjY2VudCknKTtcbiAgfVxuXG4gIHByaXZhdGUgeShkOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAxMzYgLSAoKGQgLSB0aGlzLmxvKSAvICh0aGlzLmhpIC0gdGhpcy5sbyB8fCAxKSkgKiAxMjg7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgbiA9IHRoaXMucG9pbnRzLmxlbmd0aDtcbiAgICB0aGlzLmxhc3QgPSBNYXRoLm1heCgxLCBuIC0gMSk7XG4gICAgY29uc3QgYWxsID0gdGhpcy5zZXJpZXMuZmxhdE1hcCgocykgPT4gcy52YWx1ZXMpO1xuICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKC4uLmFsbCksIG1heCA9IE1hdGgubWF4KC4uLmFsbCk7XG4gICAgW3RoaXMubG8sIHRoaXMuaGldID0gdGhpcy5yYW5nZSA/PyBbbWluIC0gKG1heCAtIG1pbikgKiAwLjExLCBtYXggKyAobWF4IC0gbWluKSAqIDAuMDhdO1xuICAgIHRoaXMudGlja3MgPSB0aGlzLmF4aXMgPz8gdGhpcy5wb2ludHMuZmlsdGVyKChfLCBpKSA9PiBpICUgMiA9PT0gMCk7XG5cbiAgICBpZiAoIXRoaXMuY29udHJvbGxlZCkge1xuICAgICAgY29uc3QgZGVmID0gdGhpcy5kZWZhdWx0VmlzaWJsZSA/PyB0aGlzLnNlcmllcy5tYXAoKHMpID0+IHMua2V5KTtcbiAgICAgIHRoaXMub24gPSB0aGlzLnNlcmllcy5tYXAoKHMpID0+IGRlZi5pbmNsdWRlcyhzLmtleSkpO1xuICAgIH1cblxuICAgIHRoaXMudmlld3MgPSB0aGlzLnNlcmllcy5tYXAoKHMsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwdHMgPSBzLnZhbHVlcy5tYXAoKGQsIGkpOiBbbnVtYmVyLCBudW1iZXJdID0+IFsoaSAvIHRoaXMubGFzdCkgKiBXLCB0aGlzLnkoZCldKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlcmllczogcyxcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHBvaW50czogcHRzLFxuICAgICAgICBkOiBzbW9vdGgocHRzKSxcbiAgICAgICAgY29sb3I6IHRoaXMuY29sb3IoaW5kZXgpLFxuICAgICAgICBkYXNoOiBpbmRleCA/ICc0IDQnIDogbnVsbCxcbiAgICAgICAgc2hvd246IHRoaXMub25baW5kZXhdLFxuICAgICAgICBwdExlZnQ6IDAsXG4gICAgICAgIHB0VG9wOiAwLFxuICAgICAgfTtcbiAgICB9KTtcbiAgICAvLyB0aGUgbWFpbiBsaW5lIGlzIGRyYXduIGxhc3Qgc28gaXQgc2l0cyBvbiB0b3Agb2YgdGhlIGRhc2hlZCBvbmVzXG4gICAgdGhpcy5kcmF3T3JkZXIgPSBbLi4udGhpcy52aWV3cy5zbGljZSgxKS5yZXZlcnNlKCksIC4uLnRoaXMudmlld3Muc2xpY2UoMCwgMSldO1xuICAgIHRoaXMuYXJlYUQgPSBgJHt0aGlzLnZpZXdzWzBdPy5kID8/ICcnfSBMJHtXfSAke0h9IEwwICR7SH0gWmA7XG5cbiAgICB0aGlzLmFwcGx5KCk7XG4gICAgdGhpcy5yZWFkeSA9IHRydWU7XG5cbiAgICBjb25zdCBsZWFkID0gTWF0aC5tYXgoMCwgdGhpcy5vbi5pbmRleE9mKHRydWUpKTtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnNlcmllc1tsZWFkXT8udmFsdWVzW24gLSAxXSA/PyAwO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcblxuICAgIC8vIHRoZSBsaW5lcyBkcmF3IGluIGZyb20gdGhlIGxlZnQgd2hpbGUgdGhlIGJpZyBudW1iZXIgY291bnRzIHVwXG4gICAgaWYgKHRoaXMucmVkdWNlZC5yZWR1Y2UoKSkge1xuICAgICAgdGhpcy5jbGlwID0gVztcbiAgICAgIHRoaXMudmFsdWUgPSB0YXJnZXQ7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXRlcigoKSA9PiB7XG4gICAgICAgIHRoaXMudHdlZW4oMCwgVywgMTMwMCwgKHcpID0+ICh0aGlzLmNsaXAgPSB3KSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMudHdlZW4oMCwgdGFyZ2V0LCAxMzAwLCAobjIpID0+ICh0aGlzLnZhbHVlID0gbjIpLCB0cnVlKTtcbiAgICAgIH0sIDI2MCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy52aWV3cykgdi5zaG93biA9IHRoaXMub25bdi5pbmRleF07XG4gICAgdGhpcy5hcmVhRCA9IGAke3RoaXMudmlld3NbMF0/LmQgPz8gJyd9IEwke1d9ICR7SH0gTDAgJHtIfSBaYDtcbiAgICB0aGlzLmxlYWRDb2xvciA9IHRoaXMudmlld3NbMF0/LmNvbG9yID8/ICd2YXIoLS12by1hY2NlbnQpJztcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHRvZ2dsZShrOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBvbkNvdW50ID0gdGhpcy5vbi5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgIGlmICh0aGlzLm9uW2tdICYmIG9uQ291bnQgPT09IDEpIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29udHJvbGxlZCkge1xuICAgICAgdGhpcy5vbiA9IHRoaXMub24ubWFwKCh2LCBqKSA9PiAoaiA9PT0gayA/ICF2IDogdikpO1xuICAgICAgdGhpcy5hcHBseSgpO1xuICAgICAgLy8gdGhlIGJpZyBudW1iZXIgcm9sbHMgdG8gdGhlIGxhdGVzdCB2YWx1ZSBvZiB0aGUgbGVhZGluZyBsaW5lIHRoYXQgaXMgc2hvd2luZ1xuICAgICAgY29uc3QgbGVhZCA9IE1hdGgubWF4KDAsIHRoaXMub24uaW5kZXhPZih0cnVlKSk7XG4gICAgICBjb25zdCB0byA9IHRoaXMuc2VyaWVzW2xlYWRdLnZhbHVlc1t0aGlzLnBvaW50cy5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IGZyb20gPSB0aGlzLnZhbHVlO1xuICAgICAgaWYgKGZyb20gIT09IHRvKSB7XG4gICAgICAgIGlmICh0aGlzLnJlZHVjZWQucmVkdWNlKCkpIHRoaXMudmFsdWUgPSB0bztcbiAgICAgICAgZWxzZSB0aGlzLnR3ZWVuKGZyb20sIHRvLCA2MDAsIChuKSA9PiAodGhpcy52YWx1ZSA9IG4pLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudmlzaWJsZUNoYW5nZS5lbWl0KHRoaXMuc2VyaWVzLmZpbHRlcigoXywgaikgPT4gKGogPT09IGsgPyAhdGhpcy5vbltqXSA6IHRoaXMub25bal0pKS5tYXAoKHMpID0+IHMua2V5KSk7XG4gIH1cblxuICBtb3ZlKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGIgPSB0aGlzLmNoYXJ0Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRoaXMubGFzdCwgTWF0aC5yb3VuZCgoKGUuY2xpZW50WCAtIGIubGVmdCkgLyBiLndpZHRoKSAqIHRoaXMubGFzdCkpKTtcbiAgICB0aGlzLmF0ID0gdHJ1ZTtcbiAgICB0aGlzLnB4ID0gKGkgLyB0aGlzLmxhc3QpICogYi53aWR0aDtcbiAgICB0aGlzLnR0TGVmdCA9IE1hdGgubWF4KDUwLCBNYXRoLm1pbih0aGlzLnB4LCBiLndpZHRoIC0gNTApKTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy52aWV3cykge1xuICAgICAgdi5wdExlZnQgPSB0aGlzLnB4O1xuICAgICAgdi5wdFRvcCA9ICh2LnBvaW50c1tpXVsxXSAvIEgpICogYi5oZWlnaHQ7XG4gICAgfVxuICAgIGNvbnN0IGxlYWQgPSBNYXRoLm1heCgwLCB0aGlzLm9uLmluZGV4T2YodHJ1ZSkpO1xuICAgIHRoaXMudHRWYWx1ZSA9IHRoaXMuZm9ybWF0KHRoaXMuc2VyaWVzW2xlYWRdLnZhbHVlc1tpXSkgKyAodGhpcy51bml0ID8gJyAnICsgdGhpcy51bml0IDogJycpO1xuICAgIGNvbnN0IGJvdGggPSB0aGlzLm9uWzBdICYmIHRoaXMub25bMV07XG4gICAgaWYgKHRoaXMuY29tcGFyZUxhYmVsICYmIGJvdGggJiYgdGhpcy5zZXJpZXNbMV0pIHtcbiAgICAgIGNvbnN0IHBjdCA9IE1hdGgucm91bmQoKHRoaXMuc2VyaWVzWzBdLnZhbHVlc1tpXSAvIHRoaXMuc2VyaWVzWzFdLnZhbHVlc1tpXSAtIDEpICogMTAwKTtcbiAgICAgIHRoaXMudHRMYWJlbCA9IGAke3RoaXMucG9pbnRzW2ldfSwgJHtwY3QgPCAwID8gJ+KIkicgOiAnKyd9JHtNYXRoLmFicyhwY3QpfSUgJHt0aGlzLmNvbXBhcmVMYWJlbH1gO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnR0TGFiZWwgPSB0aGlzLnBvaW50c1tpXTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuc2VyaWVzW2xlYWRdLnZhbHVlc1tpXTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGxlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuYXQgPSBmYWxzZTtcbiAgICBjb25zdCBsZWFkID0gTWF0aC5tYXgoMCwgdGhpcy5vbi5pbmRleE9mKHRydWUpKTtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5zZXJpZXNbbGVhZF0udmFsdWVzW3RoaXMucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLy8gZWFzZXMgZnJvbSBgZnJvbWAgdG8gYHRvYCBvdmVyIGBkdXJgOyBgZWFzZUluT3V0YCB1c2VzIHRoZSBjdWJpYyBpbi1vdXQgZnJvbSB0aGUgdmFuaWxsYSBkcmF3XG4gIHByaXZhdGUgdHdlZW4oZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBkdXI6IG51bWJlciwgc2V0OiAobjogbnVtYmVyKSA9PiB2b2lkLCBlYXNlSW5PdXQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHN0ZXAgPSAodDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBwID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKHQgLSB0MCkgLyBkdXIpKTtcbiAgICAgIGNvbnN0IGUgPSBlYXNlSW5PdXRcbiAgICAgICAgPyBwIDwgMC41XG4gICAgICAgICAgPyA0ICogcCAqIHAgKiBwXG4gICAgICAgICAgOiAxIC0gTWF0aC5wb3coLTIgKiBwICsgMiwgMykgLyAyXG4gICAgICAgIDogMSAtIE1hdGgucG93KDEgLSBwLCAzKTtcbiAgICAgIHNldChmcm9tICsgKHRvIC0gZnJvbSkgKiBlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgaWYgKHAgPCAxKSB0aGlzLmZyYW1lcy5wdXNoKHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKSk7XG4gICAgfTtcbiAgICB0aGlzLmZyYW1lcy5wdXNoKHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGVwKSk7XG4gIH1cblxuICBwcml2YXRlIGxhdGVyKGZuOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50aW1lcnMucHVzaChzZXRUaW1lb3V0KGZuLCBtcykpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy50aW1lcnMuZm9yRWFjaChjbGVhclRpbWVvdXQpO1xuICAgIHRoaXMuZnJhbWVzLmZvckVhY2goY2FuY2VsQW5pbWF0aW9uRnJhbWUpO1xuICAgIHRoaXMudGltZXJzID0gW107XG4gICAgdGhpcy5mcmFtZXMgPSBbXTtcbiAgfVxufVxuIl19
|