valtech-components 4.0.1036 → 4.0.1038
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/esm2022/lib/components/molecules/ai-message-renderer/ai-message-renderer.component.mjs +176 -0
- package/esm2022/lib/components/molecules/message-bubble/message-bubble.component.mjs +107 -30
- package/esm2022/lib/components/organisms/chat-window/chat-window.component.mjs +26 -3
- package/esm2022/lib/components/organisms/thread-panel/thread-panel.component.mjs +1 -1
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/valtech-components.mjs +305 -33
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/ai-message-renderer/ai-message-renderer.component.d.ts +20 -0
- package/lib/components/molecules/message-bubble/message-bubble.component.d.ts +13 -2
- package/lib/components/organisms/chat-window/chat-window.component.d.ts +8 -1
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
package/esm2022/lib/components/molecules/ai-message-renderer/ai-message-renderer.component.mjs
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { Component, computed, input } from '@angular/core';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class AiMessageRendererComponent {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.text = input('');
|
|
7
|
+
this.parts = computed(() => parseAiMessage(this.text()));
|
|
8
|
+
}
|
|
9
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AiMessageRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
10
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: AiMessageRendererComponent, isStandalone: true, selector: "val-ai-message-renderer", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
11
|
+
<div class="ai-message">
|
|
12
|
+
@for (part of parts(); track part.id) {
|
|
13
|
+
@if (part.kind === 'code') {
|
|
14
|
+
<pre class="code"><code>{{ part.code }}</code></pre>
|
|
15
|
+
} @else {
|
|
16
|
+
@switch (part.tag) {
|
|
17
|
+
@case ('h3') {
|
|
18
|
+
<h3 class="heading" [innerHTML]="part.html"></h3>
|
|
19
|
+
}
|
|
20
|
+
@case ('ul') {
|
|
21
|
+
<ul class="list">
|
|
22
|
+
@for (item of part.items ?? []; track item) {
|
|
23
|
+
<li [innerHTML]="item"></li>
|
|
24
|
+
}
|
|
25
|
+
</ul>
|
|
26
|
+
}
|
|
27
|
+
@case ('ol') {
|
|
28
|
+
<ol class="list">
|
|
29
|
+
@for (item of part.items ?? []; track item) {
|
|
30
|
+
<li [innerHTML]="item"></li>
|
|
31
|
+
}
|
|
32
|
+
</ol>
|
|
33
|
+
}
|
|
34
|
+
@default {
|
|
35
|
+
<p class="text" [innerHTML]="part.html"></p>
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
</div>
|
|
41
|
+
`, isInline: true, styles: [":host{display:block}.ai-message{display:flex;flex-direction:column;gap:.65rem}.text,.heading,.list{margin:0;overflow-wrap:anywhere}.heading{font-size:1rem;line-height:1.3;font-weight:750}.text{white-space:pre-wrap}.list{display:flex;flex-direction:column;gap:.28rem;padding-inline-start:1.15rem}.code{max-width:100%;margin:0;padding:.75rem;overflow-x:auto;border-radius:8px;background:var(--val-ai-message-code-background, rgba(15, 23, 42, .06));color:var(--val-ai-message-code-color, currentColor);font-size:.82rem;line-height:1.45}code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.text ::ng-deep code,.heading ::ng-deep code,.list ::ng-deep code{padding:.08rem .28rem;border-radius:5px;background:var(--val-ai-message-inline-code-background, rgba(15, 23, 42, .08));font-size:.9em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
|
|
42
|
+
}
|
|
43
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AiMessageRendererComponent, decorators: [{
|
|
44
|
+
type: Component,
|
|
45
|
+
args: [{ selector: 'val-ai-message-renderer', standalone: true, imports: [CommonModule], template: `
|
|
46
|
+
<div class="ai-message">
|
|
47
|
+
@for (part of parts(); track part.id) {
|
|
48
|
+
@if (part.kind === 'code') {
|
|
49
|
+
<pre class="code"><code>{{ part.code }}</code></pre>
|
|
50
|
+
} @else {
|
|
51
|
+
@switch (part.tag) {
|
|
52
|
+
@case ('h3') {
|
|
53
|
+
<h3 class="heading" [innerHTML]="part.html"></h3>
|
|
54
|
+
}
|
|
55
|
+
@case ('ul') {
|
|
56
|
+
<ul class="list">
|
|
57
|
+
@for (item of part.items ?? []; track item) {
|
|
58
|
+
<li [innerHTML]="item"></li>
|
|
59
|
+
}
|
|
60
|
+
</ul>
|
|
61
|
+
}
|
|
62
|
+
@case ('ol') {
|
|
63
|
+
<ol class="list">
|
|
64
|
+
@for (item of part.items ?? []; track item) {
|
|
65
|
+
<li [innerHTML]="item"></li>
|
|
66
|
+
}
|
|
67
|
+
</ol>
|
|
68
|
+
}
|
|
69
|
+
@default {
|
|
70
|
+
<p class="text" [innerHTML]="part.html"></p>
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
</div>
|
|
76
|
+
`, styles: [":host{display:block}.ai-message{display:flex;flex-direction:column;gap:.65rem}.text,.heading,.list{margin:0;overflow-wrap:anywhere}.heading{font-size:1rem;line-height:1.3;font-weight:750}.text{white-space:pre-wrap}.list{display:flex;flex-direction:column;gap:.28rem;padding-inline-start:1.15rem}.code{max-width:100%;margin:0;padding:.75rem;overflow-x:auto;border-radius:8px;background:var(--val-ai-message-code-background, rgba(15, 23, 42, .06));color:var(--val-ai-message-code-color, currentColor);font-size:.82rem;line-height:1.45}code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.text ::ng-deep code,.heading ::ng-deep code,.list ::ng-deep code{padding:.08rem .28rem;border-radius:5px;background:var(--val-ai-message-inline-code-background, rgba(15, 23, 42, .08));font-size:.9em}\n"] }]
|
|
77
|
+
}] });
|
|
78
|
+
function parseAiMessage(text) {
|
|
79
|
+
const parts = [];
|
|
80
|
+
const fence = /```([^\n`]*)\n?([\s\S]*?)```/g;
|
|
81
|
+
let lastIndex = 0;
|
|
82
|
+
let index = 0;
|
|
83
|
+
let match;
|
|
84
|
+
while ((match = fence.exec(text)) !== null) {
|
|
85
|
+
const before = text.slice(lastIndex, match.index).trim();
|
|
86
|
+
if (before) {
|
|
87
|
+
parts.push(...parseMarkdownBlocks(before, index));
|
|
88
|
+
index = parts.length;
|
|
89
|
+
}
|
|
90
|
+
parts.push({
|
|
91
|
+
kind: 'code',
|
|
92
|
+
id: `code-${index++}`,
|
|
93
|
+
language: match[1]?.trim() ?? '',
|
|
94
|
+
code: match[2]?.trimEnd() ?? '',
|
|
95
|
+
});
|
|
96
|
+
lastIndex = fence.lastIndex;
|
|
97
|
+
}
|
|
98
|
+
const rest = text.slice(lastIndex).trim();
|
|
99
|
+
if (rest) {
|
|
100
|
+
parts.push(...parseMarkdownBlocks(rest, index));
|
|
101
|
+
}
|
|
102
|
+
return parts.length > 0 ? parts : [{ kind: 'block', id: 'text-0', tag: 'p', html: renderInline(text) }];
|
|
103
|
+
}
|
|
104
|
+
function parseMarkdownBlocks(text, offset) {
|
|
105
|
+
const blocks = [];
|
|
106
|
+
const lines = text.split('\n');
|
|
107
|
+
let paragraph = [];
|
|
108
|
+
let listItems = [];
|
|
109
|
+
let orderedItems = [];
|
|
110
|
+
let index = offset;
|
|
111
|
+
const flushParagraph = () => {
|
|
112
|
+
if (paragraph.length === 0)
|
|
113
|
+
return;
|
|
114
|
+
blocks.push({ kind: 'block', id: `text-${index++}`, tag: 'p', html: renderInline(paragraph.join('\n')) });
|
|
115
|
+
paragraph = [];
|
|
116
|
+
};
|
|
117
|
+
const flushLists = () => {
|
|
118
|
+
if (listItems.length > 0) {
|
|
119
|
+
blocks.push({ kind: 'block', id: `list-${index++}`, tag: 'ul', items: listItems });
|
|
120
|
+
listItems = [];
|
|
121
|
+
}
|
|
122
|
+
if (orderedItems.length > 0) {
|
|
123
|
+
blocks.push({ kind: 'block', id: `list-${index++}`, tag: 'ol', items: orderedItems });
|
|
124
|
+
orderedItems = [];
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
for (const raw of lines) {
|
|
128
|
+
const line = raw.trim();
|
|
129
|
+
if (!line) {
|
|
130
|
+
flushParagraph();
|
|
131
|
+
flushLists();
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const heading = line.match(/^#{1,4}\s+(.+)$/);
|
|
135
|
+
if (heading) {
|
|
136
|
+
flushParagraph();
|
|
137
|
+
flushLists();
|
|
138
|
+
blocks.push({ kind: 'block', id: `heading-${index++}`, tag: 'h3', html: renderInline(heading[1]) });
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const bullet = line.match(/^[-*]\s+(.+)$/);
|
|
142
|
+
if (bullet) {
|
|
143
|
+
flushParagraph();
|
|
144
|
+
orderedItems = [];
|
|
145
|
+
listItems.push(renderInline(bullet[1]));
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const ordered = line.match(/^\d+\.\s+(.+)$/);
|
|
149
|
+
if (ordered) {
|
|
150
|
+
flushParagraph();
|
|
151
|
+
listItems = [];
|
|
152
|
+
orderedItems.push(renderInline(ordered[1]));
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
flushLists();
|
|
156
|
+
paragraph.push(raw);
|
|
157
|
+
}
|
|
158
|
+
flushParagraph();
|
|
159
|
+
flushLists();
|
|
160
|
+
return blocks;
|
|
161
|
+
}
|
|
162
|
+
function renderInline(text) {
|
|
163
|
+
return escapeHtml(text)
|
|
164
|
+
.replace(/`([^`]+)`/g, '<code>$1</code>')
|
|
165
|
+
.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
|
|
166
|
+
.replace(/\*([^*]+)\*/g, '<em>$1</em>');
|
|
167
|
+
}
|
|
168
|
+
function escapeHtml(text) {
|
|
169
|
+
return text
|
|
170
|
+
.replace(/&/g, '&')
|
|
171
|
+
.replace(/</g, '<')
|
|
172
|
+
.replace(/>/g, '>')
|
|
173
|
+
.replace(/"/g, '"')
|
|
174
|
+
.replace(/'/g, ''');
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktbWVzc2FnZS1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2FpLW1lc3NhZ2UtcmVuZGVyZXIvYWktbWVzc2FnZS1yZW5kZXJlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFnSDNELE1BQU0sT0FBTywwQkFBMEI7SUExR3ZDO1FBMkdXLFNBQUksR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7UUFFZixVQUFLLEdBQUcsUUFBUSxDQUFrQixHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN6RjsrR0FKWSwwQkFBMEI7bUdBQTFCLDBCQUEwQixvTkF0RzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JULHE0QkFoQ1MsWUFBWTs7NEZBdUdYLDBCQUEwQjtrQkExR3RDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JUOztBQTZFSCxTQUFTLGNBQWMsQ0FBQyxJQUFZO0lBQ2xDLE1BQU0sS0FBSyxHQUFvQixFQUFFLENBQUM7SUFDbEMsTUFBTSxLQUFLLEdBQUcsK0JBQStCLENBQUM7SUFDOUMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLElBQUksS0FBNkIsQ0FBQztJQUVsQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFB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N0MsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDZixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLFNBQVM7UUFDWCxDQUFDO1FBRUQsVUFBVSxFQUFFLENBQUM7UUFDYixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxjQUFjLEVBQUUsQ0FBQztJQUNqQixVQUFVLEVBQUUsQ0FBQztJQUNiLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFZO0lBQ2hDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQztTQUNwQixPQUFPLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ3hDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxxQkFBcUIsQ0FBQztTQUNsRCxPQUFPLENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFZO0lBQzlCLE9BQU8sSUFBSTtTQUNSLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG50eXBlIEFpTWVzc2FnZVBhcnQgPVxuICB8IHsga2luZDogJ2Jsb2NrJzsgaWQ6IHN0cmluZzsgdGFnOiAncCcgfCAnaDMnIHwgJ3VsJyB8ICdvbCc7IGh0bWw/OiBzdHJpbmc7IGl0ZW1zPzogc3RyaW5nW10gfVxuICB8IHsga2luZDogJ2NvZGUnOyBpZDogc3RyaW5nOyBjb2RlOiBzdHJpbmc7IGxhbmd1YWdlOiBzdHJpbmcgfTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWFpLW1lc3NhZ2UtcmVuZGVyZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYWktbWVzc2FnZVwiPlxuICAgICAgQGZvciAocGFydCBvZiBwYXJ0cygpOyB0cmFjayBwYXJ0LmlkKSB7XG4gICAgICAgIEBpZiAocGFydC5raW5kID09PSAnY29kZScpIHtcbiAgICAgICAgICA8cHJlIGNsYXNzPVwiY29kZVwiPjxjb2RlPnt7IHBhcnQuY29kZSB9fTwvY29kZT48L3ByZT5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgQHN3aXRjaCAocGFydC50YWcpIHtcbiAgICAgICAgICAgIEBjYXNlICgnaDMnKSB7XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImhlYWRpbmdcIiBbaW5uZXJIVE1MXT1cInBhcnQuaHRtbFwiPjwvaDM+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ3VsJykge1xuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0XCI+XG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBwYXJ0Lml0ZW1zID8/IFtdOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICA8bGkgW2lubmVySFRNTF09XCJpdGVtXCI+PC9saT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ29sJykge1xuICAgICAgICAgICAgICA8b2wgY2xhc3M9XCJsaXN0XCI+XG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBwYXJ0Lml0ZW1zID8/IFtdOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICA8bGkgW2lubmVySFRNTF09XCJpdGVtXCI+PC9saT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvb2w+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dFwiIFtpbm5lckhUTUxdPVwicGFydC5odG1sXCI+PC9wPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuXG4gICAgICAuYWktbWVzc2FnZSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMC42NXJlbTtcbiAgICAgIH1cblxuICAgICAgLnRleHQsXG4gICAgICAuaGVhZGluZyxcbiAgICAgIC5saXN0IHtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTtcbiAgICAgIH1cblxuICAgICAgLmhlYWRpbmcge1xuICAgICAgICBmb250LXNpemU6IDFyZW07XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjM7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3NTA7XG4gICAgICB9XG5cbiAgICAgIC50ZXh0IHtcbiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICAgICAgfVxuXG4gICAgICAubGlzdCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMC4yOHJlbTtcbiAgICAgICAgcGFkZGluZy1pbmxpbmUtc3RhcnQ6IDEuMTVyZW07XG4gICAgICB9XG5cbiAgICAgIC5jb2RlIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmc6IDAuNzVyZW07XG4gICAgICAgIG92ZXJmbG93LXg6IGF1dG87XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdmFsLWFpLW1lc3NhZ2UtY29kZS1iYWNrZ3JvdW5kLCByZ2JhKDE1LCAyMywgNDIsIDAuMDYpKTtcbiAgICAgICAgY29sb3I6IHZhcigtLXZhbC1haS1tZXNzYWdlLWNvZGUtY29sb3IsIGN1cnJlbnRDb2xvcik7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MnJlbTtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDU7XG4gICAgICB9XG5cbiAgICAgIGNvZGUge1xuICAgICAgICBmb250LWZhbWlseTpcbiAgICAgICAgICB1aS1tb25vc3BhY2UsXG4gICAgICAgICAgU0ZNb25vLVJlZ3VsYXIsXG4gICAgICAgICAgTWVubG8sXG4gICAgICAgICAgTW9uYWNvLFxuICAgICAgICAgIENvbnNvbGFzLFxuICAgICAgICAgICdMaWJlcmF0aW9uIE1vbm8nLFxuICAgICAgICAgIG1vbm9zcGFjZTtcbiAgICAgIH1cblxuICAgICAgLnRleHQgOjpuZy1kZWVwIGNvZGUsXG4gICAgICAuaGVhZGluZyA6Om5nLWRlZXAgY29kZSxcbiAgICAgIC5saXN0IDo6bmctZGVlcCBjb2RlIHtcbiAgICAgICAgcGFkZGluZzogMC4wOHJlbSAwLjI4cmVtO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXZhbC1haS1tZXNzYWdlLWlubGluZS1jb2RlLWJhY2tncm91bmQsIHJnYmEoMTUsIDIzLCA0MiwgMC4wOCkpO1xuICAgICAgICBmb250LXNpemU6IDAuOWVtO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFpTWVzc2FnZVJlbmRlcmVyQ29tcG9uZW50IHtcbiAgcmVhZG9ubHkgdGV4dCA9IGlucHV0PHN0cmluZz4oJycpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBwYXJ0cyA9IGNvbXB1dGVkPEFpTWVzc2FnZVBhcnRbXT4oKCkgPT4gcGFyc2VBaU1lc3NhZ2UodGhpcy50ZXh0KCkpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBaU1lc3NhZ2UodGV4dDogc3RyaW5nKTogQWlNZXNzYWdlUGFydFtdIHtcbiAgY29uc3QgcGFydHM6IEFpTWVzc2FnZVBhcnRbXSA9IFtdO1xuICBjb25zdCBmZW5jZSA9IC9gYGAoW15cXG5gXSopXFxuPyhbXFxzXFxTXSo/KWBgYC9nO1xuICBsZXQgbGFzdEluZGV4ID0gMDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuXG4gIHdoaWxlICgobWF0Y2ggPSBmZW5jZS5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGJlZm9yZSA9IHRleHQuc2xpY2UobGFzdEluZGV4LCBtYXRjaC5pbmRleCkudHJpbSgpO1xuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIHBhcnRzLnB1c2goLi4ucGFyc2VNYXJrZG93bkJsb2NrcyhiZWZvcmUsIGluZGV4KSk7XG4gICAgICBpbmRleCA9IHBhcnRzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwYXJ0cy5wdXNoKHtcbiAgICAgIGtpbmQ6ICdjb2RlJyxcbiAgICAgIGlkOiBgY29kZS0ke2luZGV4Kyt9YCxcbiAgICAgIGxhbmd1YWdlOiBtYXRjaFsxXT8udHJpbSgpID8/ICcnLFxuICAgICAgY29kZTogbWF0Y2hbMl0/LnRyaW1FbmQoKSA/PyAnJyxcbiAgICB9KTtcbiAgICBsYXN0SW5kZXggPSBmZW5jZS5sYXN0SW5kZXg7XG4gIH1cblxuICBjb25zdCByZXN0ID0gdGV4dC5zbGljZShsYXN0SW5kZXgpLnRyaW0oKTtcbiAgaWYgKHJlc3QpIHtcbiAgICBwYXJ0cy5wdXNoKC4uLnBhcnNlTWFya2Rvd25CbG9ja3MocmVzdCwgaW5kZXgpKTtcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHMgOiBbeyBraW5kOiAnYmxvY2snLCBpZDogJ3RleHQtMCcsIHRhZzogJ3AnLCBodG1sOiByZW5kZXJJbmxpbmUodGV4dCkgfV07XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWFya2Rvd25CbG9ja3ModGV4dDogc3RyaW5nLCBvZmZzZXQ6IG51bWJlcik6IEFpTWVzc2FnZVBhcnRbXSB7XG4gIGNvbnN0IGJsb2NrczogQWlNZXNzYWdlUGFydFtdID0gW107XG4gIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gIGxldCBwYXJhZ3JhcGg6IHN0cmluZ1tdID0gW107XG4gIGxldCBsaXN0SXRlbXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBvcmRlcmVkSXRlbXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBpbmRleCA9IG9mZnNldDtcblxuICBjb25zdCBmbHVzaFBhcmFncmFwaCA9ICgpID0+IHtcbiAgICBpZiAocGFyYWdyYXBoLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGJsb2Nrcy5wdXNoKHsga2luZDogJ2Jsb2NrJywgaWQ6IGB0ZXh0LSR7aW5kZXgrK31gLCB0YWc6ICdwJywgaHRtbDogcmVuZGVySW5saW5lKHBhcmFncmFwaC5qb2luKCdcXG4nKSkgfSk7XG4gICAgcGFyYWdyYXBoID0gW107XG4gIH07XG4gIGNvbnN0IGZsdXNoTGlzdHMgPSAoKSA9PiB7XG4gICAgaWYgKGxpc3RJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBibG9ja3MucHVzaCh7IGtpbmQ6ICdibG9jaycsIGlkOiBgbGlzdC0ke2luZGV4Kyt9YCwgdGFnOiAndWwnLCBpdGVtczogbGlzdEl0ZW1zIH0pO1xuICAgICAgbGlzdEl0ZW1zID0gW107XG4gICAgfVxuICAgIGlmIChvcmRlcmVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgYmxvY2tzLnB1c2goeyBraW5kOiAnYmxvY2snLCBpZDogYGxpc3QtJHtpbmRleCsrfWAsIHRhZzogJ29sJywgaXRlbXM6IG9yZGVyZWRJdGVtcyB9KTtcbiAgICAgIG9yZGVyZWRJdGVtcyA9IFtdO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiBsaW5lcykge1xuICAgIGNvbnN0IGxpbmUgPSByYXcudHJpbSgpO1xuICAgIGlmICghbGluZSkge1xuICAgICAgZmx1c2hQYXJhZ3JhcGgoKTtcbiAgICAgIGZsdXNoTGlzdHMoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRpbmcgPSBsaW5lLm1hdGNoKC9eI3sxLDR9XFxzKyguKykkLyk7XG4gICAgaWYgKGhlYWRpbmcpIHtcbiAgICAgIGZsdXNoUGFyYWdyYXBoKCk7XG4gICAgICBmbHVzaExpc3RzKCk7XG4gICAgICBibG9ja3MucHVzaCh7IGtpbmQ6ICdibG9jaycsIGlkOiBgaGVhZGluZy0ke2luZGV4Kyt9YCwgdGFnOiAnaDMnLCBodG1sOiByZW5kZXJJbmxpbmUoaGVhZGluZ1sxXSkgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBidWxsZXQgPSBsaW5lLm1hdGNoKC9eWy0qXVxccysoLispJC8pO1xuICAgIGlmIChidWxsZXQpIHtcbiAgICAgIGZsdXNoUGFyYWdyYXBoKCk7XG4gICAgICBvcmRlcmVkSXRlbXMgPSBbXTtcbiAgICAgIGxpc3RJdGVtcy5wdXNoKHJlbmRlcklubGluZShidWxsZXRbMV0pKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG9yZGVyZWQgPSBsaW5lLm1hdGNoKC9eXFxkK1xcLlxccysoLispJC8pO1xuICAgIGlmIChvcmRlcmVkKSB7XG4gICAgICBmbHVzaFBhcmFncmFwaCgpO1xuICAgICAgbGlzdEl0ZW1zID0gW107XG4gICAgICBvcmRlcmVkSXRlbXMucHVzaChyZW5kZXJJbmxpbmUob3JkZXJlZFsxXSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZmx1c2hMaXN0cygpO1xuICAgIHBhcmFncmFwaC5wdXNoKHJhdyk7XG4gIH1cblxuICBmbHVzaFBhcmFncmFwaCgpO1xuICBmbHVzaExpc3RzKCk7XG4gIHJldHVybiBibG9ja3M7XG59XG5cbmZ1bmN0aW9uIHJlbmRlcklubGluZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZXNjYXBlSHRtbCh0ZXh0KVxuICAgIC5yZXBsYWNlKC9gKFteYF0rKWAvZywgJzxjb2RlPiQxPC9jb2RlPicpXG4gICAgLnJlcGxhY2UoL1xcKlxcKihbXipdKylcXCpcXCovZywgJzxzdHJvbmc+JDE8L3N0cm9uZz4nKVxuICAgIC5yZXBsYWNlKC9cXCooW14qXSspXFwqL2csICc8ZW0+JDE8L2VtPicpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpXG4gICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKVxuICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAucmVwbGFjZSgvJy9nLCAnJiMzOTsnKTtcbn1cbiJdfQ==
|