qqsl-agent 0.0.2 → 0.0.4
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/assets/images/floating/arrow-down.png +0 -0
- package/assets/images/floating/history-menu.png +0 -0
- package/assets/images/floating/new-chat.png +0 -0
- package/assets/styles/index.css +6 -1
- package/chat/chat-input/chat-input.component.d.ts +18 -4
- package/chat/chat-sidebar/chat-sidebar.component.d.ts +2 -1
- package/chat/chat.module.d.ts +21 -17
- package/chat/floating-chat/floating-chat.component.d.ts +43 -0
- package/chat/models/knowledge-list.model.d.ts +15 -0
- package/chat/models/send-message.model.d.ts +15 -6
- package/chat/public-api.d.ts +1 -0
- package/esm2020/chat/chat-input/chat-input.component.mjs +92 -19
- package/esm2020/chat/chat-messages/chat-messages.component.mjs +3 -3
- package/esm2020/chat/chat-sidebar/chat-sidebar.component.mjs +8 -5
- package/esm2020/chat/chat.component.mjs +3 -3
- package/esm2020/chat/chat.module.mjs +19 -4
- package/esm2020/chat/floating-chat/floating-chat.component.mjs +228 -0
- package/esm2020/chat/models/knowledge-list.model.mjs +1 -1
- package/esm2020/chat/models/send-message.model.mjs +1 -1
- package/esm2020/chat/public-api.mjs +2 -1
- package/fesm2015/qqsl-agent-chat.mjs +432 -127
- package/fesm2015/qqsl-agent-chat.mjs.map +1 -1
- package/fesm2020/qqsl-agent-chat.mjs +432 -127
- package/fesm2020/qqsl-agent-chat.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// chat-input.component.ts
|
|
2
2
|
import { Component, Output, EventEmitter, ViewChild, inject, Input } from '@angular/core';
|
|
3
|
-
import { HttpService } from '../services/
|
|
3
|
+
import { HttpService } from '../services/http2.service';
|
|
4
4
|
import { StoreService } from '../store/store.service';
|
|
5
5
|
import { SseService } from '../services/sse.service';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
@@ -8,12 +8,15 @@ import * as i1 from "@angular/common";
|
|
|
8
8
|
import * as i2 from "ng-zorro-antd/core/transition-patch";
|
|
9
9
|
import * as i3 from "ng-zorro-antd/popover";
|
|
10
10
|
import * as i4 from "ng-zorro-antd/radio";
|
|
11
|
-
import * as i5 from "ng-zorro-antd/
|
|
12
|
-
import * as i6 from "ng-zorro-antd/
|
|
13
|
-
import * as i7 from "
|
|
11
|
+
import * as i5 from "ng-zorro-antd/icon";
|
|
12
|
+
import * as i6 from "ng-zorro-antd/steps";
|
|
13
|
+
import * as i7 from "ng-zorro-antd/select";
|
|
14
|
+
import * as i8 from "ng-zorro-antd/tree-select";
|
|
15
|
+
import * as i9 from "@angular/forms";
|
|
14
16
|
export class ChatInputComponent {
|
|
15
17
|
constructor() {
|
|
16
18
|
this.messages = [];
|
|
19
|
+
this.mode = 'full';
|
|
17
20
|
this.sendMessage = new EventEmitter();
|
|
18
21
|
this.messageChange = new EventEmitter();
|
|
19
22
|
this.enter = new EventEmitter();
|
|
@@ -25,32 +28,94 @@ export class ChatInputComponent {
|
|
|
25
28
|
this.currentModel = null;
|
|
26
29
|
this.currentKnowledge = [];
|
|
27
30
|
this.modelList = [];
|
|
28
|
-
this.knowledgeList = [];
|
|
29
31
|
this.modelPopoverVisible = false;
|
|
30
32
|
this.knowledgePopoverVisible = false;
|
|
31
33
|
this.deepThink = true;
|
|
34
|
+
this.knowledgeStepIndex = 0;
|
|
35
|
+
this.typesData = [];
|
|
36
|
+
this.categoriesData = [];
|
|
37
|
+
this.tagsData = [];
|
|
38
|
+
this.selectedTypes = [];
|
|
39
|
+
this.selectedCategories = [];
|
|
40
|
+
this.selectedTags = [];
|
|
32
41
|
}
|
|
33
42
|
ngOnInit() {
|
|
34
43
|
this.getModelList();
|
|
35
|
-
this.
|
|
44
|
+
this.loadTypes();
|
|
36
45
|
}
|
|
37
46
|
// 可供交互的模型
|
|
38
47
|
getModelList() {
|
|
39
|
-
this.httpService.get(`${this.storeService.getBaseUrl()}/api/ChatModel/models`).subscribe(
|
|
48
|
+
this.httpService.get(`${this.storeService.getBaseUrl()}/api/ChatModel/models`).subscribe(res => {
|
|
40
49
|
this.modelList = res;
|
|
41
50
|
if (res.length) {
|
|
42
51
|
this.currentModel = res[0];
|
|
43
52
|
}
|
|
44
53
|
});
|
|
45
54
|
}
|
|
46
|
-
|
|
47
|
-
|
|
55
|
+
onTypeChange(types) {
|
|
56
|
+
this.selectedTypes = types;
|
|
57
|
+
this.loadCategories(types);
|
|
58
|
+
this.selectedCategories = [];
|
|
59
|
+
this.selectedTags = [];
|
|
60
|
+
this.tagsData = [];
|
|
61
|
+
this.knowledgeStepIndex = types.length ? 1 : 0;
|
|
62
|
+
}
|
|
63
|
+
onCategoryChange(categories) {
|
|
64
|
+
this.selectedCategories = categories;
|
|
65
|
+
this.loadTags(categories);
|
|
66
|
+
this.selectedTags = [];
|
|
67
|
+
this.knowledgeStepIndex = categories.length ? 2 : 1;
|
|
68
|
+
}
|
|
69
|
+
onTagChange(tags) {
|
|
70
|
+
this.knowledgeStepIndex = tags.length ? 2 : 1;
|
|
71
|
+
}
|
|
72
|
+
// 获取分类
|
|
73
|
+
loadTypes() {
|
|
74
|
+
this.httpService
|
|
75
|
+
.get(`${this.storeService.getBaseUrl()}/api/ChatModel/knowledgeTypes`)
|
|
76
|
+
.subscribe(res => {
|
|
77
|
+
this.typesData = res;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// 获取目录
|
|
81
|
+
loadCategories(types) {
|
|
48
82
|
this.httpService
|
|
49
|
-
.
|
|
50
|
-
.
|
|
51
|
-
|
|
83
|
+
.post(`${this.storeService.getBaseUrl()}/api/ChatModel/knowledge/catalogs`, {
|
|
84
|
+
types: this.selectedTypes,
|
|
85
|
+
})
|
|
86
|
+
.subscribe(res => {
|
|
87
|
+
this.categoriesData = this.convertToTree(res);
|
|
52
88
|
});
|
|
53
89
|
}
|
|
90
|
+
loadTags(categories) {
|
|
91
|
+
this.httpService
|
|
92
|
+
.post(`${this.storeService.getBaseUrl()}/api/ChatModel/knowledge/tags`, {
|
|
93
|
+
catalog: categories,
|
|
94
|
+
})
|
|
95
|
+
.subscribe(res => {
|
|
96
|
+
this.tagsData = res;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
convertToTree(data) {
|
|
100
|
+
if (Array.isArray(data)) {
|
|
101
|
+
return data.map(item => convertNode(item));
|
|
102
|
+
}
|
|
103
|
+
function convertNode(node) {
|
|
104
|
+
let result = {
|
|
105
|
+
title: node.name || '',
|
|
106
|
+
value: node.iCode,
|
|
107
|
+
key: node.iCode,
|
|
108
|
+
};
|
|
109
|
+
if (node.children && node.children.length > 0) {
|
|
110
|
+
result.children = node.children.map((child) => convertNode(child));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
result.children = [];
|
|
114
|
+
}
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
return convertNode(data); // 如果是单个对象
|
|
118
|
+
}
|
|
54
119
|
modelVisibleChange(value) {
|
|
55
120
|
this.modelPopoverVisible = value;
|
|
56
121
|
}
|
|
@@ -102,8 +167,11 @@ export class ChatInputComponent {
|
|
|
102
167
|
model: this.currentModel?.iCode ?? '',
|
|
103
168
|
think: this.deepThink,
|
|
104
169
|
question: msg.question,
|
|
105
|
-
|
|
106
|
-
|
|
170
|
+
parameter: {
|
|
171
|
+
type: this.selectedTypes,
|
|
172
|
+
catalogs: this.selectedCategories,
|
|
173
|
+
tags: this.selectedTags,
|
|
174
|
+
},
|
|
107
175
|
};
|
|
108
176
|
this.sendMessage.emit({ message, isRegenerate: true });
|
|
109
177
|
}
|
|
@@ -119,18 +187,21 @@ export class ChatInputComponent {
|
|
|
119
187
|
model: this.currentModel?.iCode ?? '',
|
|
120
188
|
think: this.deepThink,
|
|
121
189
|
question: text,
|
|
122
|
-
|
|
123
|
-
|
|
190
|
+
parameter: {
|
|
191
|
+
type: this.selectedTypes,
|
|
192
|
+
catalogs: this.selectedCategories,
|
|
193
|
+
tags: this.selectedTags,
|
|
194
|
+
},
|
|
124
195
|
};
|
|
125
196
|
this.clearInput();
|
|
126
197
|
this.sendMessage.emit({ message, isRegenerate: false });
|
|
127
198
|
}
|
|
128
199
|
}
|
|
129
200
|
ChatInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChatInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
130
|
-
ChatInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ChatInputComponent, selector: "ngx-chat-input", inputs: { messages: "messages" }, outputs: { sendMessage: "sendMessage", messageChange: "messageChange", enter: "enter", paste: "paste" }, viewQueries: [{ propertyName: "editor", first: true, predicate: ["editorRef"], descendants: true }, { propertyName: "chatInputWrapper", first: true, predicate: ["chatInputWrapper"], descendants: true }], ngImport: i0, template: "<!-- \u65B0\u804A\u5929\u4F4D\u4E8E\u5C4F\u5E55\u4E2D\u95F4\uFF0C\u53D1\u9001\u6D88\u606F\u4E4B\u540E\u4F4D\u4E8E\u5E95\u90E8 -->\n<div class=\"chat-input-wrapper\" #chatInputWrapper [class.center]=\"!messages.length\">\n <div class=\"new-chat-title\" *ngIf=\"!messages.length\">\n <img src=\"/assets/images/logo.png\" />\n <span>\u4F60\u597D\uFF0C\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u5230\u4F60\uFF1F\u5F00\u59CB\u5BF9\u8BDD\u5427</span>\n </div>\n <div class=\"chat-input\">\n <div\n #editorRef\n class=\"input-creative-editor\"\n contenteditable=\"true\"\n spellcheck=\"false\"\n data-placeholder=\"\u8BF7\u8F93\u5165\u5E76\u53D1\u9001\u6D88\u606F\"\n [attr.data-empty]=\"isEmpty\"\n (input)=\"handleInput()\"\n (keydown.enter)=\"handleEnter($event)\"\n (paste)=\"handlePaste($event)\"\n ></div>\n <div class=\"input-bottom\">\n <div class=\"input-tools\">\n <div class=\"select-tool\" [ngClass]=\"{ 'select-tool-active': deepThink }\" (click)=\"toggleDeepThink()\">\n <svg\n t=\"1764131026949\"\n style=\"width: 14px; height: 14px\"\n class=\"icon\"\n viewBox=\"0 0 1024 1024\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n p-id=\"5012\"\n width=\"64\"\n height=\"64\"\n >\n <path\n d=\"M903.36 512a795.52 795.52 0 0 1 65.536 136.704c48 132.16 39.616 230.528-25.024 295.168-64.64 64.64-163.008 72.96-295.168 24.96A795.52 795.52 0 0 1 512 903.424a795.52 795.52 0 0 1-136.704 65.536c-132.096 48-230.528 39.616-295.168-25.024-64.64-64.64-72.96-163.008-24.96-295.104 16.64-46.016 38.528-91.52 65.536-136.768A795.52 795.52 0 0 1 55.04 375.232C7.04 243.2 15.36 144.768 80 80.128 144.768 15.488 243.2 7.168 375.296 55.04c46.016 16.64 91.584 38.528 136.768 65.536A795.52 795.52 0 0 1 648.768 55.104c132.096-48 230.464-39.616 295.104 25.024 64.64 64.64 72.96 163.008 25.024 295.104A795.52 795.52 0 0 1 903.36 512z m-53.12-79.424c15.168-28.736 27.968-57.536 38.464-86.4 35.584-98.112 33.92-166.656-5.12-205.696-39.04-39.04-107.648-40.768-205.696-5.12a685.44 685.44 0 0 0-86.4 38.4 1240.96 1240.96 0 0 1 138.432 120.32 1240.832 1240.832 0 0 1 120.32 138.496zM432.576 173.824a685.44 685.44 0 0 0-86.4-38.528c-98.112-35.584-166.656-33.92-205.696 5.12-39.04 39.04-40.768 107.648-5.12 205.696 10.432 28.928 23.296 57.728 38.4 86.4a1240.896 1240.896 0 0 1 120.32-138.432 1240.832 1240.832 0 0 1 138.496-120.32zM173.824 591.488a685.44 685.44 0 0 0-38.464 86.4c-35.648 98.048-33.92 166.592 5.12 205.632 39.04 39.04 107.584 40.768 205.696 5.12a685.44 685.44 0 0 0 86.4-38.4 1240.768 1240.768 0 0 1-138.496-120.32 1240.96 1240.96 0 0 1-120.256-138.432z m495.744 78.08A1112.064 1112.064 0 0 0 802.048 512a1112.064 1112.064 0 0 0-132.48-157.568A1112.128 1112.128 0 0 0 512 221.952a1112.128 1112.128 0 0 0-157.504 132.48A1112.064 1112.064 0 0 0 222.016 512a1112.192 1112.192 0 0 0 132.416 157.568A1112.064 1112.064 0 0 0 512 802.048a1112.128 1112.128 0 0 0 157.568-132.48z m-78.08 180.608c28.672 15.168 57.472 28.032 86.4 38.464 98.048 35.648 166.592 33.92 205.632-5.12 39.04-39.04 40.768-107.584 5.12-205.696a685.504 685.504 0 0 0-38.4-86.4 1240.832 1240.832 0 0 1-120.32 138.496 1240.96 1240.96 0 0 1-138.432 120.32zM585.088 512a73.152 73.152 0 1 1-146.24 0 73.152 73.152 0 0 1 146.304 0z\"\n fill=\"currentColor\"\n p-id=\"5013\"\n ></path>\n </svg>\n \u6DF1\u5EA6\u601D\u8003\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"modelListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"modelPopoverVisible\"\n (nzPopoverVisibleChange)=\"modelVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/toggle-model.png\" style=\"width: 12px; height: 12px\" />\n {{ currentModel ? currentModel?.name : '\u9009\u62E9\u6A21\u578B' }}\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"knowledgeListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"knowledgePopoverVisible\"\n (nzPopoverVisibleChange)=\"knowledgeVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/relate.png\" style=\"width: 14px; height: 8px\" />\n \u5173\u8054\u77E5\u8BC6\u5E93\n </div>\n </div>\n <img class=\"send\" src=\"/assets/images/input/send.png\" (click)=\"send()\" [hidden]=\"sseService.loading$ | async\" />\n <div class=\"send-loading\" *ngIf=\"sseService.loading$ | async\">\n <div class=\"send-loading-inner\">\n <svg viewBox=\"0 0 36 36\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" data-icon=\"spin\">\n <defs>\n <linearGradient x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"100%\" id=\"linearGradient-1\">\n <stop stop-color=\"currentColor\" stop-opacity=\"0\" offset=\"0%\"></stop>\n <stop stop-color=\"currentColor\" stop-opacity=\"0.50\" offset=\"39.9430698%\"></stop>\n <stop stop-color=\"currentColor\" offset=\"100%\"></stop>\n </linearGradient>\n </defs>\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect fill-opacity=\"0.01\" fill=\"none\" x=\"0\" y=\"0\" width=\"36\" height=\"36\"></rect>\n <path\n d=\"M34,18 C34,9.163444 26.836556,2 18,2 C11.6597233,2 6.18078805,5.68784135 3.59122325,11.0354951\"\n stroke=\"url(#linearGradient-1)\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n <!-- <img class=\"send\" src=\"/assets/images/input/send-gray.png\" /> -->\n </div>\n </div>\n <div class=\"chat-input-backdrop\"></div>\n</div>\n\n<ng-template #modelListContent>\n <div style=\"width: 200px\">\n <div class=\"select-title\">\n \u5207\u6362\u6A21\u578B\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"modelVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-radio-group [(ngModel)]=\"currentModel\">\n <label\n nz-radio\n [nzValue]=\"item\"\n [style.margin-top.px]=\"i === 0 ? 0 : 10\"\n *ngFor=\"let item of modelList; let i = index\"\n >\n {{ item.name }}\n </label>\n </nz-radio-group>\n </div>\n </div>\n</ng-template>\n\n<ng-template #knowledgeListContent>\n <div style=\"width: 150px\">\n <div class=\"select-title\">\n \u5173\u8054\u77E5\u8BC6\u5E93\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"knowledgeVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-checkbox-wrapper style=\"width: 100%\" (nzOnChange)=\"knowledgeSelectChange($event)\">\n <div *ngFor=\"let item of knowledgeList\">\n <label nz-checkbox [nzValue]=\"item.iCode\">{{ item.name }}</label>\n </div>\n </nz-checkbox-wrapper>\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.chat-input-wrapper{position:absolute;bottom:0;left:0;right:0;max-width:800px;min-width:350px;margin:0 auto;padding-bottom:40px}.chat-input-wrapper.center{bottom:50%;transform:translateY(50%)}.new-chat-title{display:flex;align-items:center;justify-content:center;padding-bottom:40px;text-align:center;font-weight:500;font-size:24px;color:#000}.new-chat-title img{width:40px;height:32px;margin-right:12px;margin-top:-6px}.chat-input{position:relative;display:flex;flex-direction:column;justify-content:space-between;padding:20px 18px;margin:0 auto;background:#FFFFFF;box-shadow:0 2px 8px #0000001a;border-radius:20px;border:1px solid #D9DADB;z-index:30}.chat-input .input-creative-editor{min-height:60px;max-height:300px;overflow-y:auto;outline:none;box-shadow:none;border:none}.chat-input .input-creative-editor[data-empty=true]:before{content:attr(data-placeholder);color:#9a9b9b}.chat-input .input-bottom{padding-top:16px;display:flex;align-items:center;justify-content:space-between;-webkit-user-select:none;user-select:none}.chat-input .input-bottom .input-tools{display:flex;align-items:center;gap:10px}.chat-input .input-bottom .select-tool{display:flex;align-items:center;justify-content:center;height:36px;padding:0 12px;gap:12px;background:#FFFFFF;border-radius:12px;border:1px solid #DBDCE0;cursor:pointer}.chat-input .input-bottom .select-tool-active{border-color:#b7c8fe;color:#3964fe;background:#edf3fe}.chat-input .input-bottom .send{width:32px;height:32px}::ng-deep .params-select-popover .ant-popover-inner{border-radius:10px}::ng-deep .params-select-popover .select-title{display:flex;align-items:center;justify-content:center;position:relative}::ng-deep .params-select-popover .select-title i{position:absolute;right:0;top:3px;cursor:pointer}::ng-deep .params-select-popover .select-content{max-height:200px;padding:16px 0;overflow-y:auto}.chat-input-backdrop{position:absolute;bottom:0;left:0;width:100%;height:100px;z-index:10;background-image:linear-gradient(to bottom,hsl(0,0%,99%),hsla(0,0%,99%,.8))}.send-loading{min-width:34px;height:34px;border-radius:50%;margin-top:auto;display:flex;flex-shrink:0;align-items:center;flex-direction:column;justify-content:center;cursor:not-allowed;white-space:nowrap;color:#fff;background:#3964fe;transition:background .2s;opacity:.4}.send-loading-inner{width:16px;height:16px}.send-loading svg{will-change:transform;animation:.6s linear infinite send-loading}@keyframes send-loading{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i3.NzPopoverDirective, selector: "[nz-popover]", inputs: ["nzPopoverArrowPointAtCenter", "nzPopoverTitle", "nzPopoverContent", "nz-popover", "nzPopoverTrigger", "nzPopoverPlacement", "nzPopoverOrigin", "nzPopoverVisible", "nzPopoverMouseEnterDelay", "nzPopoverMouseLeaveDelay", "nzPopoverOverlayClassName", "nzPopoverOverlayStyle", "nzPopoverBackdrop"], outputs: ["nzPopoverVisibleChange"], exportAs: ["nzPopover"] }, { kind: "component", type: i4.NzRadioComponent, selector: "[nz-radio],[nz-radio-button]", inputs: ["nzValue", "nzDisabled", "nzAutoFocus"], exportAs: ["nzRadio"] }, { kind: "component", type: i4.NzRadioGroupComponent, selector: "nz-radio-group", inputs: ["nzDisabled", "nzButtonStyle", "nzSize", "nzName"], exportAs: ["nzRadioGroup"] }, { kind: "component", type: i5.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { kind: "component", type: i5.NzCheckboxWrapperComponent, selector: "nz-checkbox-wrapper", outputs: ["nzOnChange"], exportAs: ["nzCheckboxWrapper"] }, { kind: "directive", type: i6.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
|
|
201
|
+
ChatInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ChatInputComponent, selector: "ngx-chat-input", inputs: { messages: "messages", mode: "mode" }, outputs: { sendMessage: "sendMessage", messageChange: "messageChange", enter: "enter", paste: "paste" }, viewQueries: [{ propertyName: "editor", first: true, predicate: ["editorRef"], descendants: true }, { propertyName: "chatInputWrapper", first: true, predicate: ["chatInputWrapper"], descendants: true }], ngImport: i0, template: "<!-- \u65B0\u804A\u5929\u4F4D\u4E8E\u5C4F\u5E55\u4E2D\u95F4\uFF0C\u53D1\u9001\u6D88\u606F\u4E4B\u540E\u4F4D\u4E8E\u5E95\u90E8 -->\n<div\n class=\"chat-input-wrapper\"\n #chatInputWrapper\n [class.center]=\"!messages.length\"\n [ngStyle]=\"{ 'padding-bottom': mode === 'full' ? '40px' : '10px' }\"\n>\n <div class=\"new-chat-title\" *ngIf=\"!messages.length\">\n <img src=\"/assets/images/logo.png\" />\n <span>\u4F60\u597D\uFF0C\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u5230\u4F60\uFF1F\u5F00\u59CB\u5BF9\u8BDD\u5427</span>\n </div>\n <div class=\"chat-input\">\n <div\n #editorRef\n class=\"input-creative-editor\"\n contenteditable=\"true\"\n spellcheck=\"false\"\n data-placeholder=\"\u8BF7\u8F93\u5165\u5E76\u53D1\u9001\u6D88\u606F\"\n [attr.data-empty]=\"isEmpty\"\n (input)=\"handleInput()\"\n (keydown.enter)=\"handleEnter($event)\"\n (paste)=\"handlePaste($event)\"\n ></div>\n <div class=\"input-bottom\">\n <div class=\"input-tools\">\n <div class=\"select-tool\" [ngClass]=\"{ 'select-tool-active': deepThink }\" (click)=\"toggleDeepThink()\">\n <svg\n t=\"1764131026949\"\n style=\"width: 14px; height: 14px\"\n class=\"icon\"\n viewBox=\"0 0 1024 1024\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n p-id=\"5012\"\n width=\"64\"\n height=\"64\"\n >\n <path\n d=\"M903.36 512a795.52 795.52 0 0 1 65.536 136.704c48 132.16 39.616 230.528-25.024 295.168-64.64 64.64-163.008 72.96-295.168 24.96A795.52 795.52 0 0 1 512 903.424a795.52 795.52 0 0 1-136.704 65.536c-132.096 48-230.528 39.616-295.168-25.024-64.64-64.64-72.96-163.008-24.96-295.104 16.64-46.016 38.528-91.52 65.536-136.768A795.52 795.52 0 0 1 55.04 375.232C7.04 243.2 15.36 144.768 80 80.128 144.768 15.488 243.2 7.168 375.296 55.04c46.016 16.64 91.584 38.528 136.768 65.536A795.52 795.52 0 0 1 648.768 55.104c132.096-48 230.464-39.616 295.104 25.024 64.64 64.64 72.96 163.008 25.024 295.104A795.52 795.52 0 0 1 903.36 512z m-53.12-79.424c15.168-28.736 27.968-57.536 38.464-86.4 35.584-98.112 33.92-166.656-5.12-205.696-39.04-39.04-107.648-40.768-205.696-5.12a685.44 685.44 0 0 0-86.4 38.4 1240.96 1240.96 0 0 1 138.432 120.32 1240.832 1240.832 0 0 1 120.32 138.496zM432.576 173.824a685.44 685.44 0 0 0-86.4-38.528c-98.112-35.584-166.656-33.92-205.696 5.12-39.04 39.04-40.768 107.648-5.12 205.696 10.432 28.928 23.296 57.728 38.4 86.4a1240.896 1240.896 0 0 1 120.32-138.432 1240.832 1240.832 0 0 1 138.496-120.32zM173.824 591.488a685.44 685.44 0 0 0-38.464 86.4c-35.648 98.048-33.92 166.592 5.12 205.632 39.04 39.04 107.584 40.768 205.696 5.12a685.44 685.44 0 0 0 86.4-38.4 1240.768 1240.768 0 0 1-138.496-120.32 1240.96 1240.96 0 0 1-120.256-138.432z m495.744 78.08A1112.064 1112.064 0 0 0 802.048 512a1112.064 1112.064 0 0 0-132.48-157.568A1112.128 1112.128 0 0 0 512 221.952a1112.128 1112.128 0 0 0-157.504 132.48A1112.064 1112.064 0 0 0 222.016 512a1112.192 1112.192 0 0 0 132.416 157.568A1112.064 1112.064 0 0 0 512 802.048a1112.128 1112.128 0 0 0 157.568-132.48z m-78.08 180.608c28.672 15.168 57.472 28.032 86.4 38.464 98.048 35.648 166.592 33.92 205.632-5.12 39.04-39.04 40.768-107.584 5.12-205.696a685.504 685.504 0 0 0-38.4-86.4 1240.832 1240.832 0 0 1-120.32 138.496 1240.96 1240.96 0 0 1-138.432 120.32zM585.088 512a73.152 73.152 0 1 1-146.24 0 73.152 73.152 0 0 1 146.304 0z\"\n fill=\"currentColor\"\n p-id=\"5013\"\n ></path>\n </svg>\n \u6DF1\u5EA6\u601D\u8003\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"modelListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"modelPopoverVisible\"\n (nzPopoverVisibleChange)=\"modelVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/toggle-model.png\" style=\"width: 12px; height: 12px\" />\n {{ currentModel ? currentModel?.name : '\u9009\u62E9\u6A21\u578B' }}\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"knowledgeListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"knowledgePopoverVisible\"\n (nzPopoverVisibleChange)=\"knowledgeVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/relate.png\" style=\"width: 14px; height: 8px\" />\n \u5173\u8054\u77E5\u8BC6\u5E93\n </div>\n </div>\n <img class=\"send\" src=\"/assets/images/input/send.png\" (click)=\"send()\" [hidden]=\"sseService.loading$ | async\" />\n <div class=\"send-loading\" *ngIf=\"sseService.loading$ | async\">\n <div class=\"send-loading-inner\">\n <svg viewBox=\"0 0 36 36\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" data-icon=\"spin\">\n <defs>\n <linearGradient x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"100%\" id=\"linearGradient-1\">\n <stop stop-color=\"currentColor\" stop-opacity=\"0\" offset=\"0%\"></stop>\n <stop stop-color=\"currentColor\" stop-opacity=\"0.50\" offset=\"39.9430698%\"></stop>\n <stop stop-color=\"currentColor\" offset=\"100%\"></stop>\n </linearGradient>\n </defs>\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect fill-opacity=\"0.01\" fill=\"none\" x=\"0\" y=\"0\" width=\"36\" height=\"36\"></rect>\n <path\n d=\"M34,18 C34,9.163444 26.836556,2 18,2 C11.6597233,2 6.18078805,5.68784135 3.59122325,11.0354951\"\n stroke=\"url(#linearGradient-1)\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n <!-- <img class=\"send\" src=\"/assets/images/input/send-gray.png\" /> -->\n </div>\n </div>\n <div class=\"chat-input-backdrop\"></div>\n</div>\n\n<ng-template #modelListContent>\n <div style=\"width: 200px\">\n <div class=\"select-title\">\n \u5207\u6362\u6A21\u578B\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"modelVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-radio-group [(ngModel)]=\"currentModel\">\n <label\n nz-radio\n [nzValue]=\"item\"\n [style.margin-top.px]=\"i === 0 ? 0 : 10\"\n *ngFor=\"let item of modelList; let i = index\"\n >\n {{ item.name }}\n </label>\n </nz-radio-group>\n </div>\n </div>\n</ng-template>\n\n<ng-template #knowledgeListContent>\n <div style=\"width: 250px\">\n <div class=\"select-title\">\n \u5173\u8054\u77E5\u8BC6\u5E93\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"knowledgeVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-steps [nzCurrent]=\"knowledgeStepIndex\" nzProgressDot nzDirection=\"vertical\" nzSize=\"small\">\n <nz-step nzTitle=\"\u9009\u62E9\u5206\u7C7B\" [nzDescription]=\"typeSelectTpl\">\n <ng-template #typeSelectTpl>\n <nz-select\n [(ngModel)]=\"selectedTypes\"\n nzMode=\"multiple\"\n style=\"width: 100%\"\n (ngModelChange)=\"onTypeChange($event)\"\n nzPlaceHolder=\"\u8BF7\u9009\u62E9\u5206\u7C7B\"\n >\n <nz-option [nzValue]=\"item.type\" [nzLabel]=\"item.typeC\" *ngFor=\"let item of typesData\"></nz-option>\n </nz-select>\n </ng-template>\n </nz-step>\n <nz-step nzTitle=\"\u641C\u7D22\u9009\u62E9\u76EE\u5F55\" [nzDescription]=\"categorySelectTpl\">\n <ng-template #categorySelectTpl>\n <nz-tree-select\n style=\"width: 100%\"\n [(ngModel)]=\"selectedCategories\"\n [nzNodes]=\"categoriesData\"\n (ngModelChange)=\"onCategoryChange($event)\"\n nzCheckStrictly\n nzShowSearch\n nzCheckable\n nzPlaceHolder=\"\u8BF7\u9009\u62E9\u76EE\u5F55\"\n ></nz-tree-select>\n </ng-template>\n </nz-step>\n <nz-step nzTitle=\"\u9009\u62E9\u6807\u7B7E\" [nzDescription]=\"tagSelectTpl\">\n <ng-template #tagSelectTpl>\n <nz-select\n [(ngModel)]=\"selectedTags\"\n nzMode=\"multiple\"\n nzPlaceHolder=\"\u8BF7\u9009\u62E9\u6807\u7B7E\"\n style=\"width: 100%\"\n (ngModelChange)=\"onTagChange($event)\"\n >\n <nz-option-group [nzLabel]=\"item.name\" *ngFor=\"let item of tagsData\">\n <nz-option\n [nzValue]=\"child.iCode\"\n [nzLabel]=\"child.name\"\n *ngFor=\"let child of item.children\"\n ></nz-option>\n </nz-option-group>\n </nz-select>\n </ng-template>\n </nz-step>\n </nz-steps>\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{width:100%;container-type:inline-size;container-name:chat-container}.chat-input-wrapper{position:absolute;bottom:0;left:0;right:0;max-width:800px;min-width:350px;margin:0 auto;padding-bottom:40px}@container chat-container (max-width: 1000px){.chat-input-wrapper{max-width:90%}}.chat-input-wrapper.center{bottom:50%;transform:translateY(50%)}.new-chat-title{display:flex;align-items:center;justify-content:center;padding-bottom:40px;text-align:center;font-weight:500;font-size:24px;color:#000}.new-chat-title img{width:40px;height:32px;margin-right:12px;margin-top:-6px}.chat-input{position:relative;display:flex;flex-direction:column;justify-content:space-between;padding:20px 18px;margin:0 auto;background:#FFFFFF;box-shadow:0 2px 8px #0000001a;border-radius:20px;border:1px solid #D9DADB;z-index:30}.chat-input .input-creative-editor{min-height:60px;max-height:300px;overflow-y:auto;outline:none;box-shadow:none;border:none}.chat-input .input-creative-editor[data-empty=true]:before{content:attr(data-placeholder);color:#9a9b9b}.chat-input .input-bottom{padding-top:16px;display:flex;align-items:center;justify-content:space-between;-webkit-user-select:none;user-select:none}.chat-input .input-bottom .input-tools{display:flex;align-items:center;gap:10px}.chat-input .input-bottom .select-tool{display:flex;align-items:center;justify-content:center;height:36px;padding:0 12px;gap:12px;background:#FFFFFF;border-radius:12px;border:1px solid #DBDCE0;cursor:pointer}.chat-input .input-bottom .select-tool-active{border-color:#b7c8fe;color:#3964fe;background:#edf3fe}.chat-input .input-bottom .send{width:32px;height:32px}::ng-deep .params-select-popover .ant-popover-inner{border-radius:10px}::ng-deep .params-select-popover .select-title{display:flex;align-items:center;justify-content:center;position:relative}::ng-deep .params-select-popover .select-title i{position:absolute;right:0;top:3px;cursor:pointer}::ng-deep .params-select-popover .select-content{max-height:400px;padding:16px 0 16px 1px;overflow-y:auto}.chat-input-backdrop{position:absolute;bottom:0;left:0;width:100%;height:100px;z-index:10;background-image:linear-gradient(to bottom,hsl(0,0%,99%),hsla(0,0%,99%,.8))}.send-loading{min-width:34px;height:34px;border-radius:50%;margin-top:auto;display:flex;flex-shrink:0;align-items:center;flex-direction:column;justify-content:center;cursor:not-allowed;white-space:nowrap;color:#fff;background:#3964fe;transition:background .2s;opacity:.4}.send-loading-inner{width:16px;height:16px}.send-loading svg{will-change:transform;animation:.6s linear infinite send-loading}@keyframes send-loading{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i3.NzPopoverDirective, selector: "[nz-popover]", inputs: ["nzPopoverArrowPointAtCenter", "nzPopoverTitle", "nzPopoverContent", "nz-popover", "nzPopoverTrigger", "nzPopoverPlacement", "nzPopoverOrigin", "nzPopoverVisible", "nzPopoverMouseEnterDelay", "nzPopoverMouseLeaveDelay", "nzPopoverOverlayClassName", "nzPopoverOverlayStyle", "nzPopoverBackdrop"], outputs: ["nzPopoverVisibleChange"], exportAs: ["nzPopover"] }, { kind: "component", type: i4.NzRadioComponent, selector: "[nz-radio],[nz-radio-button]", inputs: ["nzValue", "nzDisabled", "nzAutoFocus"], exportAs: ["nzRadio"] }, { kind: "component", type: i4.NzRadioGroupComponent, selector: "nz-radio-group", inputs: ["nzDisabled", "nzButtonStyle", "nzSize", "nzName"], exportAs: ["nzRadioGroup"] }, { kind: "directive", type: i5.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "component", type: i6.NzStepsComponent, selector: "nz-steps", inputs: ["nzCurrent", "nzDirection", "nzLabelPlacement", "nzType", "nzSize", "nzStartIndex", "nzStatus", "nzProgressDot"], outputs: ["nzIndexChange"], exportAs: ["nzSteps"] }, { kind: "component", type: i6.NzStepComponent, selector: "nz-step", inputs: ["nzTitle", "nzSubtitle", "nzDescription", "nzDisabled", "nzPercentage", "nzSize", "nzStatus", "nzIcon"], exportAs: ["nzStep"] }, { kind: "component", type: i7.NzOptionComponent, selector: "nz-option", inputs: ["nzLabel", "nzValue", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { kind: "component", type: i7.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzPlacement", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzSelectOnTab", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { kind: "component", type: i7.NzOptionGroupComponent, selector: "nz-option-group", inputs: ["nzLabel"], exportAs: ["nzOptionGroup"] }, { kind: "component", type: i8.NzTreeSelectComponent, selector: "nz-tree-select", inputs: ["nzId", "nzAllowClear", "nzShowExpand", "nzShowLine", "nzDropdownMatchSelectWidth", "nzCheckable", "nzHideUnMatched", "nzShowIcon", "nzShowSearch", "nzDisabled", "nzAsyncData", "nzMultiple", "nzDefaultExpandAll", "nzCheckStrictly", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzExpandedIcon", "nzNotFoundContent", "nzNodes", "nzOpen", "nzSize", "nzPlaceHolder", "nzDropdownStyle", "nzDropdownClassName", "nzBackdrop", "nzStatus", "nzPlacement", "nzExpandedKeys", "nzDisplayWith", "nzMaxTagCount", "nzMaxTagPlaceholder", "nzTreeTemplate"], outputs: ["nzOpenChange", "nzCleared", "nzRemoved", "nzExpandChange", "nzTreeClick", "nzTreeCheckBoxChange"], exportAs: ["nzTreeSelect"] }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] });
|
|
131
202
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChatInputComponent, decorators: [{
|
|
132
203
|
type: Component,
|
|
133
|
-
args: [{ selector: 'ngx-chat-input', template: "<!-- \u65B0\u804A\u5929\u4F4D\u4E8E\u5C4F\u5E55\u4E2D\u95F4\uFF0C\u53D1\u9001\u6D88\u606F\u4E4B\u540E\u4F4D\u4E8E\u5E95\u90E8 -->\n<div class=\"chat-input-wrapper\" #chatInputWrapper [class.center]=\"!messages.length\">\n <div class=\"new-chat-title\" *ngIf=\"!messages.length\">\n <img src=\"/assets/images/logo.png\" />\n <span>\u4F60\u597D\uFF0C\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u5230\u4F60\uFF1F\u5F00\u59CB\u5BF9\u8BDD\u5427</span>\n </div>\n <div class=\"chat-input\">\n <div\n #editorRef\n class=\"input-creative-editor\"\n contenteditable=\"true\"\n spellcheck=\"false\"\n data-placeholder=\"\u8BF7\u8F93\u5165\u5E76\u53D1\u9001\u6D88\u606F\"\n [attr.data-empty]=\"isEmpty\"\n (input)=\"handleInput()\"\n (keydown.enter)=\"handleEnter($event)\"\n (paste)=\"handlePaste($event)\"\n ></div>\n <div class=\"input-bottom\">\n <div class=\"input-tools\">\n <div class=\"select-tool\" [ngClass]=\"{ 'select-tool-active': deepThink }\" (click)=\"toggleDeepThink()\">\n <svg\n t=\"1764131026949\"\n style=\"width: 14px; height: 14px\"\n class=\"icon\"\n viewBox=\"0 0 1024 1024\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n p-id=\"5012\"\n width=\"64\"\n height=\"64\"\n >\n <path\n d=\"M903.36 512a795.52 795.52 0 0 1 65.536 136.704c48 132.16 39.616 230.528-25.024 295.168-64.64 64.64-163.008 72.96-295.168 24.96A795.52 795.52 0 0 1 512 903.424a795.52 795.52 0 0 1-136.704 65.536c-132.096 48-230.528 39.616-295.168-25.024-64.64-64.64-72.96-163.008-24.96-295.104 16.64-46.016 38.528-91.52 65.536-136.768A795.52 795.52 0 0 1 55.04 375.232C7.04 243.2 15.36 144.768 80 80.128 144.768 15.488 243.2 7.168 375.296 55.04c46.016 16.64 91.584 38.528 136.768 65.536A795.52 795.52 0 0 1 648.768 55.104c132.096-48 230.464-39.616 295.104 25.024 64.64 64.64 72.96 163.008 25.024 295.104A795.52 795.52 0 0 1 903.36 512z m-53.12-79.424c15.168-28.736 27.968-57.536 38.464-86.4 35.584-98.112 33.92-166.656-5.12-205.696-39.04-39.04-107.648-40.768-205.696-5.12a685.44 685.44 0 0 0-86.4 38.4 1240.96 1240.96 0 0 1 138.432 120.32 1240.832 1240.832 0 0 1 120.32 138.496zM432.576 173.824a685.44 685.44 0 0 0-86.4-38.528c-98.112-35.584-166.656-33.92-205.696 5.12-39.04 39.04-40.768 107.648-5.12 205.696 10.432 28.928 23.296 57.728 38.4 86.4a1240.896 1240.896 0 0 1 120.32-138.432 1240.832 1240.832 0 0 1 138.496-120.32zM173.824 591.488a685.44 685.44 0 0 0-38.464 86.4c-35.648 98.048-33.92 166.592 5.12 205.632 39.04 39.04 107.584 40.768 205.696 5.12a685.44 685.44 0 0 0 86.4-38.4 1240.768 1240.768 0 0 1-138.496-120.32 1240.96 1240.96 0 0 1-120.256-138.432z m495.744 78.08A1112.064 1112.064 0 0 0 802.048 512a1112.064 1112.064 0 0 0-132.48-157.568A1112.128 1112.128 0 0 0 512 221.952a1112.128 1112.128 0 0 0-157.504 132.48A1112.064 1112.064 0 0 0 222.016 512a1112.192 1112.192 0 0 0 132.416 157.568A1112.064 1112.064 0 0 0 512 802.048a1112.128 1112.128 0 0 0 157.568-132.48z m-78.08 180.608c28.672 15.168 57.472 28.032 86.4 38.464 98.048 35.648 166.592 33.92 205.632-5.12 39.04-39.04 40.768-107.584 5.12-205.696a685.504 685.504 0 0 0-38.4-86.4 1240.832 1240.832 0 0 1-120.32 138.496 1240.96 1240.96 0 0 1-138.432 120.32zM585.088 512a73.152 73.152 0 1 1-146.24 0 73.152 73.152 0 0 1 146.304 0z\"\n fill=\"currentColor\"\n p-id=\"5013\"\n ></path>\n </svg>\n \u6DF1\u5EA6\u601D\u8003\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"modelListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"modelPopoverVisible\"\n (nzPopoverVisibleChange)=\"modelVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/toggle-model.png\" style=\"width: 12px; height: 12px\" />\n {{ currentModel ? currentModel?.name : '\u9009\u62E9\u6A21\u578B' }}\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"knowledgeListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"knowledgePopoverVisible\"\n (nzPopoverVisibleChange)=\"knowledgeVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/relate.png\" style=\"width: 14px; height: 8px\" />\n \u5173\u8054\u77E5\u8BC6\u5E93\n </div>\n </div>\n <img class=\"send\" src=\"/assets/images/input/send.png\" (click)=\"send()\" [hidden]=\"sseService.loading$ | async\" />\n <div class=\"send-loading\" *ngIf=\"sseService.loading$ | async\">\n <div class=\"send-loading-inner\">\n <svg viewBox=\"0 0 36 36\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" data-icon=\"spin\">\n <defs>\n <linearGradient x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"100%\" id=\"linearGradient-1\">\n <stop stop-color=\"currentColor\" stop-opacity=\"0\" offset=\"0%\"></stop>\n <stop stop-color=\"currentColor\" stop-opacity=\"0.50\" offset=\"39.9430698%\"></stop>\n <stop stop-color=\"currentColor\" offset=\"100%\"></stop>\n </linearGradient>\n </defs>\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect fill-opacity=\"0.01\" fill=\"none\" x=\"0\" y=\"0\" width=\"36\" height=\"36\"></rect>\n <path\n d=\"M34,18 C34,9.163444 26.836556,2 18,2 C11.6597233,2 6.18078805,5.68784135 3.59122325,11.0354951\"\n stroke=\"url(#linearGradient-1)\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n <!-- <img class=\"send\" src=\"/assets/images/input/send-gray.png\" /> -->\n </div>\n </div>\n <div class=\"chat-input-backdrop\"></div>\n</div>\n\n<ng-template #modelListContent>\n <div style=\"width: 200px\">\n <div class=\"select-title\">\n \u5207\u6362\u6A21\u578B\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"modelVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-radio-group [(ngModel)]=\"currentModel\">\n <label\n nz-radio\n [nzValue]=\"item\"\n [style.margin-top.px]=\"i === 0 ? 0 : 10\"\n *ngFor=\"let item of modelList; let i = index\"\n >\n {{ item.name }}\n </label>\n </nz-radio-group>\n </div>\n </div>\n</ng-template>\n\n<ng-template #knowledgeListContent>\n <div style=\"width: 150px\">\n <div class=\"select-title\">\n \u5173\u8054\u77E5\u8BC6\u5E93\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"knowledgeVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-checkbox-wrapper style=\"width: 100%\" (nzOnChange)=\"knowledgeSelectChange($event)\">\n <div *ngFor=\"let item of knowledgeList\">\n <label nz-checkbox [nzValue]=\"item.iCode\">{{ item.name }}</label>\n </div>\n </nz-checkbox-wrapper>\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.chat-input-wrapper{position:absolute;bottom:0;left:0;right:0;max-width:800px;min-width:350px;margin:0 auto;padding-bottom:40px}.chat-input-wrapper.center{bottom:50%;transform:translateY(50%)}.new-chat-title{display:flex;align-items:center;justify-content:center;padding-bottom:40px;text-align:center;font-weight:500;font-size:24px;color:#000}.new-chat-title img{width:40px;height:32px;margin-right:12px;margin-top:-6px}.chat-input{position:relative;display:flex;flex-direction:column;justify-content:space-between;padding:20px 18px;margin:0 auto;background:#FFFFFF;box-shadow:0 2px 8px #0000001a;border-radius:20px;border:1px solid #D9DADB;z-index:30}.chat-input .input-creative-editor{min-height:60px;max-height:300px;overflow-y:auto;outline:none;box-shadow:none;border:none}.chat-input .input-creative-editor[data-empty=true]:before{content:attr(data-placeholder);color:#9a9b9b}.chat-input .input-bottom{padding-top:16px;display:flex;align-items:center;justify-content:space-between;-webkit-user-select:none;user-select:none}.chat-input .input-bottom .input-tools{display:flex;align-items:center;gap:10px}.chat-input .input-bottom .select-tool{display:flex;align-items:center;justify-content:center;height:36px;padding:0 12px;gap:12px;background:#FFFFFF;border-radius:12px;border:1px solid #DBDCE0;cursor:pointer}.chat-input .input-bottom .select-tool-active{border-color:#b7c8fe;color:#3964fe;background:#edf3fe}.chat-input .input-bottom .send{width:32px;height:32px}::ng-deep .params-select-popover .ant-popover-inner{border-radius:10px}::ng-deep .params-select-popover .select-title{display:flex;align-items:center;justify-content:center;position:relative}::ng-deep .params-select-popover .select-title i{position:absolute;right:0;top:3px;cursor:pointer}::ng-deep .params-select-popover .select-content{max-height:200px;padding:16px 0;overflow-y:auto}.chat-input-backdrop{position:absolute;bottom:0;left:0;width:100%;height:100px;z-index:10;background-image:linear-gradient(to bottom,hsl(0,0%,99%),hsla(0,0%,99%,.8))}.send-loading{min-width:34px;height:34px;border-radius:50%;margin-top:auto;display:flex;flex-shrink:0;align-items:center;flex-direction:column;justify-content:center;cursor:not-allowed;white-space:nowrap;color:#fff;background:#3964fe;transition:background .2s;opacity:.4}.send-loading-inner{width:16px;height:16px}.send-loading svg{will-change:transform;animation:.6s linear infinite send-loading}@keyframes send-loading{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
|
|
204
|
+
args: [{ selector: 'ngx-chat-input', template: "<!-- \u65B0\u804A\u5929\u4F4D\u4E8E\u5C4F\u5E55\u4E2D\u95F4\uFF0C\u53D1\u9001\u6D88\u606F\u4E4B\u540E\u4F4D\u4E8E\u5E95\u90E8 -->\n<div\n class=\"chat-input-wrapper\"\n #chatInputWrapper\n [class.center]=\"!messages.length\"\n [ngStyle]=\"{ 'padding-bottom': mode === 'full' ? '40px' : '10px' }\"\n>\n <div class=\"new-chat-title\" *ngIf=\"!messages.length\">\n <img src=\"/assets/images/logo.png\" />\n <span>\u4F60\u597D\uFF0C\u6709\u4EC0\u4E48\u53EF\u4EE5\u5E2E\u5230\u4F60\uFF1F\u5F00\u59CB\u5BF9\u8BDD\u5427</span>\n </div>\n <div class=\"chat-input\">\n <div\n #editorRef\n class=\"input-creative-editor\"\n contenteditable=\"true\"\n spellcheck=\"false\"\n data-placeholder=\"\u8BF7\u8F93\u5165\u5E76\u53D1\u9001\u6D88\u606F\"\n [attr.data-empty]=\"isEmpty\"\n (input)=\"handleInput()\"\n (keydown.enter)=\"handleEnter($event)\"\n (paste)=\"handlePaste($event)\"\n ></div>\n <div class=\"input-bottom\">\n <div class=\"input-tools\">\n <div class=\"select-tool\" [ngClass]=\"{ 'select-tool-active': deepThink }\" (click)=\"toggleDeepThink()\">\n <svg\n t=\"1764131026949\"\n style=\"width: 14px; height: 14px\"\n class=\"icon\"\n viewBox=\"0 0 1024 1024\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n p-id=\"5012\"\n width=\"64\"\n height=\"64\"\n >\n <path\n d=\"M903.36 512a795.52 795.52 0 0 1 65.536 136.704c48 132.16 39.616 230.528-25.024 295.168-64.64 64.64-163.008 72.96-295.168 24.96A795.52 795.52 0 0 1 512 903.424a795.52 795.52 0 0 1-136.704 65.536c-132.096 48-230.528 39.616-295.168-25.024-64.64-64.64-72.96-163.008-24.96-295.104 16.64-46.016 38.528-91.52 65.536-136.768A795.52 795.52 0 0 1 55.04 375.232C7.04 243.2 15.36 144.768 80 80.128 144.768 15.488 243.2 7.168 375.296 55.04c46.016 16.64 91.584 38.528 136.768 65.536A795.52 795.52 0 0 1 648.768 55.104c132.096-48 230.464-39.616 295.104 25.024 64.64 64.64 72.96 163.008 25.024 295.104A795.52 795.52 0 0 1 903.36 512z m-53.12-79.424c15.168-28.736 27.968-57.536 38.464-86.4 35.584-98.112 33.92-166.656-5.12-205.696-39.04-39.04-107.648-40.768-205.696-5.12a685.44 685.44 0 0 0-86.4 38.4 1240.96 1240.96 0 0 1 138.432 120.32 1240.832 1240.832 0 0 1 120.32 138.496zM432.576 173.824a685.44 685.44 0 0 0-86.4-38.528c-98.112-35.584-166.656-33.92-205.696 5.12-39.04 39.04-40.768 107.648-5.12 205.696 10.432 28.928 23.296 57.728 38.4 86.4a1240.896 1240.896 0 0 1 120.32-138.432 1240.832 1240.832 0 0 1 138.496-120.32zM173.824 591.488a685.44 685.44 0 0 0-38.464 86.4c-35.648 98.048-33.92 166.592 5.12 205.632 39.04 39.04 107.584 40.768 205.696 5.12a685.44 685.44 0 0 0 86.4-38.4 1240.768 1240.768 0 0 1-138.496-120.32 1240.96 1240.96 0 0 1-120.256-138.432z m495.744 78.08A1112.064 1112.064 0 0 0 802.048 512a1112.064 1112.064 0 0 0-132.48-157.568A1112.128 1112.128 0 0 0 512 221.952a1112.128 1112.128 0 0 0-157.504 132.48A1112.064 1112.064 0 0 0 222.016 512a1112.192 1112.192 0 0 0 132.416 157.568A1112.064 1112.064 0 0 0 512 802.048a1112.128 1112.128 0 0 0 157.568-132.48z m-78.08 180.608c28.672 15.168 57.472 28.032 86.4 38.464 98.048 35.648 166.592 33.92 205.632-5.12 39.04-39.04 40.768-107.584 5.12-205.696a685.504 685.504 0 0 0-38.4-86.4 1240.832 1240.832 0 0 1-120.32 138.496 1240.96 1240.96 0 0 1-138.432 120.32zM585.088 512a73.152 73.152 0 1 1-146.24 0 73.152 73.152 0 0 1 146.304 0z\"\n fill=\"currentColor\"\n p-id=\"5013\"\n ></path>\n </svg>\n \u6DF1\u5EA6\u601D\u8003\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"modelListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"modelPopoverVisible\"\n (nzPopoverVisibleChange)=\"modelVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/toggle-model.png\" style=\"width: 12px; height: 12px\" />\n {{ currentModel ? currentModel?.name : '\u9009\u62E9\u6A21\u578B' }}\n </div>\n <div\n class=\"select-tool\"\n nz-popover\n [nzPopoverContent]=\"knowledgeListContent\"\n nzPopoverTrigger=\"click\"\n nzPopoverOverlayClassName=\"params-select-popover\"\n [nzPopoverVisible]=\"knowledgePopoverVisible\"\n (nzPopoverVisibleChange)=\"knowledgeVisibleChange($event)\"\n >\n <img src=\"/assets/images/input/relate.png\" style=\"width: 14px; height: 8px\" />\n \u5173\u8054\u77E5\u8BC6\u5E93\n </div>\n </div>\n <img class=\"send\" src=\"/assets/images/input/send.png\" (click)=\"send()\" [hidden]=\"sseService.loading$ | async\" />\n <div class=\"send-loading\" *ngIf=\"sseService.loading$ | async\">\n <div class=\"send-loading-inner\">\n <svg viewBox=\"0 0 36 36\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" data-icon=\"spin\">\n <defs>\n <linearGradient x1=\"0%\" y1=\"100%\" x2=\"100%\" y2=\"100%\" id=\"linearGradient-1\">\n <stop stop-color=\"currentColor\" stop-opacity=\"0\" offset=\"0%\"></stop>\n <stop stop-color=\"currentColor\" stop-opacity=\"0.50\" offset=\"39.9430698%\"></stop>\n <stop stop-color=\"currentColor\" offset=\"100%\"></stop>\n </linearGradient>\n </defs>\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <rect fill-opacity=\"0.01\" fill=\"none\" x=\"0\" y=\"0\" width=\"36\" height=\"36\"></rect>\n <path\n d=\"M34,18 C34,9.163444 26.836556,2 18,2 C11.6597233,2 6.18078805,5.68784135 3.59122325,11.0354951\"\n stroke=\"url(#linearGradient-1)\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n <!-- <img class=\"send\" src=\"/assets/images/input/send-gray.png\" /> -->\n </div>\n </div>\n <div class=\"chat-input-backdrop\"></div>\n</div>\n\n<ng-template #modelListContent>\n <div style=\"width: 200px\">\n <div class=\"select-title\">\n \u5207\u6362\u6A21\u578B\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"modelVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-radio-group [(ngModel)]=\"currentModel\">\n <label\n nz-radio\n [nzValue]=\"item\"\n [style.margin-top.px]=\"i === 0 ? 0 : 10\"\n *ngFor=\"let item of modelList; let i = index\"\n >\n {{ item.name }}\n </label>\n </nz-radio-group>\n </div>\n </div>\n</ng-template>\n\n<ng-template #knowledgeListContent>\n <div style=\"width: 250px\">\n <div class=\"select-title\">\n \u5173\u8054\u77E5\u8BC6\u5E93\n <i nz-icon nzType=\"close\" style=\"color: #999\" (click)=\"knowledgeVisibleChange(false)\"></i>\n </div>\n <div class=\"select-content\">\n <nz-steps [nzCurrent]=\"knowledgeStepIndex\" nzProgressDot nzDirection=\"vertical\" nzSize=\"small\">\n <nz-step nzTitle=\"\u9009\u62E9\u5206\u7C7B\" [nzDescription]=\"typeSelectTpl\">\n <ng-template #typeSelectTpl>\n <nz-select\n [(ngModel)]=\"selectedTypes\"\n nzMode=\"multiple\"\n style=\"width: 100%\"\n (ngModelChange)=\"onTypeChange($event)\"\n nzPlaceHolder=\"\u8BF7\u9009\u62E9\u5206\u7C7B\"\n >\n <nz-option [nzValue]=\"item.type\" [nzLabel]=\"item.typeC\" *ngFor=\"let item of typesData\"></nz-option>\n </nz-select>\n </ng-template>\n </nz-step>\n <nz-step nzTitle=\"\u641C\u7D22\u9009\u62E9\u76EE\u5F55\" [nzDescription]=\"categorySelectTpl\">\n <ng-template #categorySelectTpl>\n <nz-tree-select\n style=\"width: 100%\"\n [(ngModel)]=\"selectedCategories\"\n [nzNodes]=\"categoriesData\"\n (ngModelChange)=\"onCategoryChange($event)\"\n nzCheckStrictly\n nzShowSearch\n nzCheckable\n nzPlaceHolder=\"\u8BF7\u9009\u62E9\u76EE\u5F55\"\n ></nz-tree-select>\n </ng-template>\n </nz-step>\n <nz-step nzTitle=\"\u9009\u62E9\u6807\u7B7E\" [nzDescription]=\"tagSelectTpl\">\n <ng-template #tagSelectTpl>\n <nz-select\n [(ngModel)]=\"selectedTags\"\n nzMode=\"multiple\"\n nzPlaceHolder=\"\u8BF7\u9009\u62E9\u6807\u7B7E\"\n style=\"width: 100%\"\n (ngModelChange)=\"onTagChange($event)\"\n >\n <nz-option-group [nzLabel]=\"item.name\" *ngFor=\"let item of tagsData\">\n <nz-option\n [nzValue]=\"child.iCode\"\n [nzLabel]=\"child.name\"\n *ngFor=\"let child of item.children\"\n ></nz-option>\n </nz-option-group>\n </nz-select>\n </ng-template>\n </nz-step>\n </nz-steps>\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host{width:100%;container-type:inline-size;container-name:chat-container}.chat-input-wrapper{position:absolute;bottom:0;left:0;right:0;max-width:800px;min-width:350px;margin:0 auto;padding-bottom:40px}@container chat-container (max-width: 1000px){.chat-input-wrapper{max-width:90%}}.chat-input-wrapper.center{bottom:50%;transform:translateY(50%)}.new-chat-title{display:flex;align-items:center;justify-content:center;padding-bottom:40px;text-align:center;font-weight:500;font-size:24px;color:#000}.new-chat-title img{width:40px;height:32px;margin-right:12px;margin-top:-6px}.chat-input{position:relative;display:flex;flex-direction:column;justify-content:space-between;padding:20px 18px;margin:0 auto;background:#FFFFFF;box-shadow:0 2px 8px #0000001a;border-radius:20px;border:1px solid #D9DADB;z-index:30}.chat-input .input-creative-editor{min-height:60px;max-height:300px;overflow-y:auto;outline:none;box-shadow:none;border:none}.chat-input .input-creative-editor[data-empty=true]:before{content:attr(data-placeholder);color:#9a9b9b}.chat-input .input-bottom{padding-top:16px;display:flex;align-items:center;justify-content:space-between;-webkit-user-select:none;user-select:none}.chat-input .input-bottom .input-tools{display:flex;align-items:center;gap:10px}.chat-input .input-bottom .select-tool{display:flex;align-items:center;justify-content:center;height:36px;padding:0 12px;gap:12px;background:#FFFFFF;border-radius:12px;border:1px solid #DBDCE0;cursor:pointer}.chat-input .input-bottom .select-tool-active{border-color:#b7c8fe;color:#3964fe;background:#edf3fe}.chat-input .input-bottom .send{width:32px;height:32px}::ng-deep .params-select-popover .ant-popover-inner{border-radius:10px}::ng-deep .params-select-popover .select-title{display:flex;align-items:center;justify-content:center;position:relative}::ng-deep .params-select-popover .select-title i{position:absolute;right:0;top:3px;cursor:pointer}::ng-deep .params-select-popover .select-content{max-height:400px;padding:16px 0 16px 1px;overflow-y:auto}.chat-input-backdrop{position:absolute;bottom:0;left:0;width:100%;height:100px;z-index:10;background-image:linear-gradient(to bottom,hsl(0,0%,99%),hsla(0,0%,99%,.8))}.send-loading{min-width:34px;height:34px;border-radius:50%;margin-top:auto;display:flex;flex-shrink:0;align-items:center;flex-direction:column;justify-content:center;cursor:not-allowed;white-space:nowrap;color:#fff;background:#3964fe;transition:background .2s;opacity:.4}.send-loading-inner{width:16px;height:16px}.send-loading svg{will-change:transform;animation:.6s linear infinite send-loading}@keyframes send-loading{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
|
|
134
205
|
}], propDecorators: { editor: [{
|
|
135
206
|
type: ViewChild,
|
|
136
207
|
args: ['editorRef']
|
|
@@ -139,6 +210,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
139
210
|
args: ['chatInputWrapper']
|
|
140
211
|
}], messages: [{
|
|
141
212
|
type: Input
|
|
213
|
+
}], mode: [{
|
|
214
|
+
type: Input
|
|
142
215
|
}], sendMessage: [{
|
|
143
216
|
type: Output
|
|
144
217
|
}], messageChange: [{
|
|
@@ -148,4 +221,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
148
221
|
}], paste: [{
|
|
149
222
|
type: Output
|
|
150
223
|
}] } });
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZ2VudC9jaGF0L2NoYXQtaW5wdXQvY2hhdC1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZ2VudC9jaGF0L2NoYXQtaW5wdXQvY2hhdC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwwQkFBMEI7QUFDMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFjLFNBQVMsRUFBRSxNQUFNLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7Ozs7QUFPckQsTUFBTSxPQUFPLGtCQUFrQjtJQUwvQjtRQVFXLGFBQVEsR0FBYyxFQUFFLENBQUM7UUFDeEIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBb0QsQ0FBQztRQUNuRixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDM0MsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDbkMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFFcEMsZ0JBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEMsaUJBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckMsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV2QyxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLHFCQUFnQixHQUFhLEVBQUUsQ0FBQztRQUNoQyxjQUFT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UUFBUSxFQUFFLElBQUk7WUFDZCxTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNO1lBQ3pDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1NBQ3JDLENBQUM7UUFDRixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQzs7Z0hBbElVLGtCQUFrQjtvR0FBbEIsa0JBQWtCLDZZQ2YvQiw4dk9Ba0lBOzRGRG5IYSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsZ0JBQWdCOzhCQUtGLE1BQU07c0JBQTdCLFNBQVM7dUJBQUMsV0FBVztnQkFDUyxnQkFBZ0I7c0JBQTlDLFNBQVM7dUJBQUMsa0JBQWtCO2dCQUNwQixRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gY2hhdC1pbnB1dC5jb21wb25lbnQudHNcbmltcG9ydCB7IENvbXBvbmVudCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgaW5qZWN0LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2h0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBJTW9kZWwsIElNb2RlbExpc3QgfSBmcm9tICcuLi9tb2RlbHMvbW9kZWwtbGlzdC5tb2RlbCc7XG5pbXBvcnQgeyBTdG9yZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yZS9zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IElLbm93bGVkZ2VMaXN0IH0gZnJvbSAnLi4vbW9kZWxzL2tub3dsZWRnZS1saXN0Lm1vZGVsJztcbmltcG9ydCB7IElTZW5kTWVzc2FnZSB9IGZyb20gJy4uL21vZGVscy9zZW5kLW1lc3NhZ2UubW9kZWwnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4uL21vZGVscy9tZXNzYWdlLm1vZGVsJztcbmltcG9ydCB7IFNzZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zc2Uuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1jaGF0LWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0LWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENoYXRJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2VkaXRvclJlZicpIGVkaXRvciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdjaGF0SW5wdXRXcmFwcGVyJykgY2hhdElucHV0V3JhcHBlciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBASW5wdXQoKSBtZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gIEBPdXRwdXQoKSBzZW5kTWVzc2FnZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBJU2VuZE1lc3NhZ2U7IGlzUmVnZW5lcmF0ZTogYm9vbGVhbiB9PigpO1xuICBAT3V0cHV0KCkgbWVzc2FnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHBhc3RlID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcblxuICBwcml2YXRlIGh0dHBTZXJ2aWNlID0gaW5qZWN0KEh0dHBTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBzdG9yZVNlcnZpY2UgPSBpbmplY3QoU3RvcmVTZXJ2aWNlKTtcbiAgcHVibGljIHNzZVNlcnZpY2UgPSBpbmplY3QoU3NlU2VydmljZSk7XG5cbiAgaXNFbXB0eSA9IHRydWU7XG4gIGN1cnJlbnRNb2RlbDogSU1vZGVsIHwgbnVsbCA9IG51bGw7XG4gIGN1cnJlbnRLbm93bGVkZ2U6IHN0cmluZ1tdID0gW107XG4gIG1vZGVsTGlzdDogSU1vZGVsTGlzdCA9IFtdO1xuICBrbm93bGVkZ2VMaXN0OiBJS25vd2xlZGdlTGlzdCA9IFtdO1xuICBtb2RlbFBvcG92ZXJWaXNpYmxlID0gZmFsc2U7XG4gIGtub3dsZWRnZVBvcG92ZXJWaXNpYmxlID0gZmFsc2U7XG4gIGRlZXBUaGluayA9IHRydWU7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRNb2RlbExpc3QoKTtcbiAgICB0aGlzLmdldEtub3dsZWRnZUxpc3QoKTtcbiAgfVxuXG4gIC8vIOWPr+S+m+S6pOS6kueahOaooeWei1xuICBnZXRNb2RlbExpc3QoKTogdm9pZCB7XG4gICAgdGhpcy5odHRwU2VydmljZS5nZXQoYCR7dGhpcy5zdG9yZVNlcnZpY2UuZ2V0QmFzZVVybCgpfS9hcGkvQ2hhdE1vZGVsL21vZGVsc2ApLnN1YnNjcmliZSgocmVzOiBJTW9kZWxMaXN0KSA9PiB7XG4gICAgICB0aGlzLm1vZGVsTGlzdCA9IHJlcztcbiAgICAgIGlmIChyZXMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGVsID0gcmVzWzBdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8g5qih5Z6L5Y+v6YCJ55qE55+l6K+G5bqTXG4gIGdldEtub3dsZWRnZUxpc3QoKTogdm9pZCB7XG4gICAgdGhpcy5odHRwU2VydmljZVxuICAgICAgLmdldChgJHt0aGlzLnN0b3JlU2VydmljZS5nZXRCYXNlVXJsKCl9L2FwaS9DaGF0TW9kZWwva25vd2xlZGdlc2ApXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IElLbm93bGVkZ2VMaXN0KSA9PiB7XG4gICAgICAgIHRoaXMua25vd2xlZGdlTGlzdCA9IHJlcztcbiAgICAgIH0pO1xuICB9XG5cbiAgbW9kZWxWaXNpYmxlQ2hhbmdlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbFBvcG92ZXJWaXNpYmxlID0gdmFsdWU7XG4gIH1cblxuICBrbm93bGVkZ2VWaXNpYmxlQ2hhbmdlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5rbm93bGVkZ2VQb3BvdmVyVmlzaWJsZSA9IHZhbHVlO1xuICB9XG5cbiAga25vd2xlZGdlU2VsZWN0Q2hhbmdlKHZhbHVlOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudEtub3dsZWRnZSA9IHZhbHVlO1xuICB9XG5cbiAgdG9nZ2xlRGVlcFRoaW5rKCk6IHZvaWQge1xuICAgIHRoaXMuZGVlcFRoaW5rID0gIXRoaXMuZGVlcFRoaW5rO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVFbXB0eVN0YXRlKCkge1xuICAgIGNvbnN0IGVsID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB0ZXh0ID0gZWwudGV4dENvbnRlbnQ/LnRyaW0oKSB8fCAnJztcbiAgICBjb25zdCBoYXNPbmx5QnIgPSBlbC5pbm5lckhUTUwgPT09ICc8YnI+JyB8fCBlbC5pbm5lckhUTUwgPT09ICcnO1xuXG4gICAgdGhpcy5pc0VtcHR5ID0gdGV4dCA9PT0gJycgJiYgaGFzT25seUJyO1xuICB9XG5cbiAgaGFuZGxlSW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVFbXB0eVN0YXRlKCk7XG4gICAgY29uc3QgaHRtbCA9IHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50IHx8ICcnO1xuICAgIC8vIHRoaXMubWVzc2FnZUNoYW5nZS5lbWl0KHRleHQpO1xuICB9XG5cbiAgaGFuZGxlRW50ZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCEoZXZlbnQgYXMgS2V5Ym9hcmRFdmVudCkuc2hpZnRLZXkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyB0aGlzLmVudGVyLmVtaXQoKGV2ZW50IGFzIGFueSkudGFyZ2V0IS5pbm5lclRleHQhLnJlcGxhY2UoL1xccysvZywgXCIgXCIpLnRyaW0oKSk7XG4gICAgICB0aGlzLnNlbmQoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVQYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyB0aGlzLnBhc3RlLmVtaXQoZXZlbnQpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVFbXB0eVN0YXRlKCksIDApO1xuICB9XG5cbiAgY2xlYXJJbnB1dCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuICAgIHRoaXMuaGFuZGxlSW5wdXQoKTtcbiAgfVxuXG4gIHJlZ2VuZXJhdGVTZW5kKG1zZzogTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIOato+WcqOWbnuetlOS4rVxuICAgIGlmICh0aGlzLnNzZVNlcnZpY2UubG9hZGluZ1NvdXJjZS52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb252ZXJzYXRpb24gPSB0aGlzLnN0b3JlU2VydmljZS5nZXRDb252ZXJzYXRpb25JQ29kZSgpO1xuICAgIGNvbnN0IG1lc3NhZ2U6IElTZW5kTWVzc2FnZSA9IHtcbiAgICAgIGNvbnZlcnNhdGlvbixcbiAgICAgIHF1ZXN0aW9uSUNvZGU6IG1zZy5pQ29kZSxcbiAgICAgIG1vZGVsOiB0aGlzLmN1cnJlbnRNb2RlbD8uaUNvZGUgPz8gJycsXG4gICAgICB0aGluazogdGhpcy5kZWVwVGhpbmssXG4gICAgICBxdWVzdGlvbjogbXNnLnF1ZXN0aW9uLFxuICAgICAga25vd2xlZGdlOiAhIXRoaXMuY3VycmVudEtub3dsZWRnZS5sZW5ndGgsXG4gICAgICBrbm93bGVkZ2VMaXN0OiB0aGlzLmN1cnJlbnRLbm93bGVkZ2UsXG4gICAgfTtcbiAgICB0aGlzLnNlbmRNZXNzYWdlLmVtaXQoeyBtZXNzYWdlLCBpc1JlZ2VuZXJhdGU6IHRydWUgfSk7XG4gIH1cblxuICBzZW5kKCk6IHZvaWQge1xuICAgIC8vIOato+WcqOWbnuetlOS4rVxuICAgIGlmICh0aGlzLnNzZVNlcnZpY2UubG9hZGluZ1NvdXJjZS52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudCB8fCAnJztcbiAgICBjb25zdCBjb252ZXJzYXRpb24gPSB0aGlzLnN0b3JlU2VydmljZS5nZXRDb252ZXJzYXRpb25JQ29kZSgpO1xuICAgIGNvbnN0IG1lc3NhZ2U6IElTZW5kTWVzc2FnZSA9IHtcbiAgICAgIGNvbnZlcnNhdGlvbixcbiAgICAgIG1vZGVsOiB0aGlzLmN1cnJlbnRNb2RlbD8uaUNvZGUgPz8gJycsXG4gICAgICB0aGluazogdGhpcy5kZWVwVGhpbmssXG4gICAgICBxdWVzdGlvbjogdGV4dCxcbiAgICAgIGtub3dsZWRnZTogISF0aGlzLmN1cnJlbnRLbm93bGVkZ2UubGVuZ3RoLFxuICAgICAga25vd2xlZGdlTGlzdDogdGhpcy5jdXJyZW50S25vd2xlZGdlLFxuICAgIH07XG4gICAgdGhpcy5jbGVhcklucHV0KCk7XG4gICAgdGhpcy5zZW5kTWVzc2FnZS5lbWl0KHsgbWVzc2FnZSwgaXNSZWdlbmVyYXRlOiBmYWxzZSB9KTtcbiAgfVxufVxuIiwiPCEtLSDmlrDogYrlpKnkvY3kuo7lsY/luZXkuK3pl7TvvIzlj5HpgIHmtojmga/kuYvlkI7kvY3kuo7lupXpg6ggLS0+XG48ZGl2IGNsYXNzPVwiY2hhdC1pbnB1dC13cmFwcGVyXCIgI2NoYXRJbnB1dFdyYXBwZXIgW2NsYXNzLmNlbnRlcl09XCIhbWVzc2FnZXMubGVuZ3RoXCI+XG4gIDxkaXYgY2xhc3M9XCJuZXctY2hhdC10aXRsZVwiICpuZ0lmPVwiIW1lc3NhZ2VzLmxlbmd0aFwiPlxuICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pbWFnZXMvbG9nby5wbmdcIiAvPlxuICAgIDxzcGFuPuS9oOWlve+8jOacieS7gOS5iOWPr+S7peW4ruWIsOS9oO+8n+W8gOWni+WvueivneWQpzwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjaGF0LWlucHV0XCI+XG4gICAgPGRpdlxuICAgICAgI2VkaXRvclJlZlxuICAgICAgY2xhc3M9XCJpbnB1dC1jcmVhdGl2ZS1lZGl0b3JcIlxuICAgICAgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXG4gICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgZGF0YS1wbGFjZWhvbGRlcj1cIuivt+i+k+WFpeW5tuWPkemAgea2iOaBr1wiXG4gICAgICBbYXR0ci5kYXRhLWVtcHR5XT1cImlzRW1wdHlcIlxuICAgICAgKGlucHV0KT1cImhhbmRsZUlucHV0KClcIlxuICAgICAgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlRW50ZXIoJGV2ZW50KVwiXG4gICAgICAocGFzdGUpPVwiaGFuZGxlUGFzdGUoJGV2ZW50KVwiXG4gICAgPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ib3R0b21cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC10b29sc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXRvb2xcIiBbbmdDbGFzc109XCJ7ICdzZWxlY3QtdG9vbC1hY3RpdmUnOiBkZWVwVGhpbmsgfVwiIChjbGljayk9XCJ0b2dnbGVEZWVwVGhpbmsoKVwiPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHQ9XCIxNzY0MTMxMDI2OTQ5XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDE0cHg7IGhlaWdodDogMTRweFwiXG4gICAgICAgICAgICBjbGFzcz1cImljb25cIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIlxuICAgICAgICAgICAgdmVyc2lvbj1cIjEuMVwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgIHAtaWQ9XCI1MDEyXCJcbiAgICAgICAgICAgIHdpZHRoPVwiNjRcIlxuICAgICAgICAgICAgaGVpZ2h0PVwiNjRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGQ9XCJNOTAzLjM2IDUxMmE3OTUuNTIgNzk1LjUyIDAgMCAxIDY1LjUzNiAxMzYuNzA0YzQ4IDEzMi4xNiAzOS42MTYgMjMwLjUyOC0yNS4wMjQgMjk1LjE2OC02NC42NCA2NC42NC0xNjMuMDA4IDcyLjk2LTI5NS4xNjggMjQuOTZBNzk1LjUyIDc5NS41MiAwIDAgMSA1MTIgOTAzLjQyNGE3OTUuNTIgNzk1LjUyIDAgMCAxLTEzNi43MDQgNjUuNTM2Yy0xMzIuMDk2IDQ4LTIzMC41MjggMzkuNjE2LTI5NS4xNjgtMjUuMDI0LTY0LjY0LTY0LjY0LTcyLjk2LTE2My4wMDgtMjQuOTYtMjk1LjEwNCAxNi42NC00Ni4wMTYgMzguNTI4LTkxLjUyIDY1LjUzNi0xMzYuNzY4QTc5NS41MiA3OTUuNTIgMCAwIDEgNTUuMDQgMzc1LjIzMkM3LjA0IDI0My4yIDE1LjM2IDE0NC43NjggODAgODAuMTI4IDE0NC43NjggMTUuNDg4IDI0My4yIDcuMTY4IDM3NS4yOTYgNTUuMDRjNDYuMDE2IDE2LjY0IDkxLjU4NCAzOC41MjggMTM2Ljc2OCA2NS41MzZBNzk1LjUyIDc5NS41MiAwIDAgMSA2NDguNzY4IDU1LjEwNGMxMzIuMDk2LTQ4IDIzMC40NjQtMzkuNjE2IDI5NS4xMDQgMjUuMDI0IDY0LjY0IDY0LjY0IDcyLjk2IDE2My4wMDggMjUuMDI0IDI5NS4xMDRBNzk1LjUyIDc5NS41MiAwIDAgMSA5MDMuMzYgNTEyeiBtLTUzLjEyLTc5LjQyNGMxNS4xNjgtMjguNzM2IDI3Ljk2OC01Ny41MzYgMzguNDY0LTg2LjQgMzUuNTg0LTk4LjExMiAzMy45Mi0xNjYuNjU2LTUuMTItMjA1LjY5Ni0zOS4wNC0zOS4wNC0xMDcuNjQ4LTQwLjc2OC0yMDUuNjk2LTUuMTJhNjg1LjQ0IDY4NS40NCAwIDAgMC04Ni40IDM4LjQgMTI0MC45NiAxMjQwLjk2IDAgMCAxIDEzOC40MzIgMTIwLjMyIDEyNDAuODMyIDEyNDAuODMyIDAgMCAxIDEyMC4zMiAxMzguNDk2ek00MzIuNTc2IDE3My44MjRhNjg1LjQ0IDY4NS40NCAwIDAgMC04Ni40LTM4LjUyOGMtOTguMTEyLTM1LjU4NC0xNjYuNjU2LTMzLjkyLTIwNS42OTYgNS4xMi0zOS4wNCAzOS4wNC00MC43NjggMTA3LjY0OC01LjEyIDIwNS42OTYgMTAuNDMyIDI4LjkyOCAyMy4yOTYgNTcuNzI4IDM4LjQgODYuNGExMjQwLjg5NiAxMjQwLjg5NiAwIDAgMSAxMjAuMzItMTM4LjQzMiAxMjQwLjgzMiAxMjQwLjgzMiAwIDAgMSAxMzguNDk2LTEyMC4zMnpNMTczLjgyNCA1OTEuNDg4YTY4NS40NCA2ODUuNDQgMCAwIDAtMzguNDY0IDg2LjRjLTM1LjY0OCA5OC4wNDgtMzMuOTIgMTY2LjU5MiA1LjEyIDIwNS42MzIgMzkuMDQgMzkuMDQgMTA3LjU4NCA0MC43NjggMjA1LjY5NiA1LjEyYTY4NS40NCA2ODUuNDQgMCAwIDAgODYuNC0zOC40IDEyNDAuNzY4IDEyNDAuNzY4IDAgMCAxLTEzOC40OTYtMTIwLjMyIDEyNDAuOTYgMTI0MC45NiAwIDAgMS0xMjAuMjU2LTEzOC40MzJ6IG00OTUuNzQ0IDc4LjA4QTExMTIuMDY0IDExMTIuMDY0IDAgMCAwIDgwMi4wNDggNTEyYTExMTIuMDY0IDExMTIuMDY0IDAgMCAwLTEzMi40OC0xNTcuNTY4QTExMTIuMTI4IDExMTIuMTI4IDAgMCAwIDUxMiAyMjEuOTUyYTExMTIuMTI4IDExMTIuMTI4IDAgMCAwLTE1Ny41MDQgMTMyLjQ4QTExMTIuMDY0IDExMTIuMDY0IDAgMCAwIDIyMi4wMTYgNTEyYTExMTIuMTkyIDExMTIuMTkyIDAgMCAwIDEzMi40MTYgMTU3LjU2OEExMTEyLjA2NCAxMTEyLjA2NCAwIDAgMCA1MTIgODAyLjA0OGExMTEyLjEyOCAxMTEyLjEyOCAwIDAgMCAxNTcuNTY4LTEzMi40OHogbS03OC4wOCAxODAuNjA4YzI4LjY3MiAxNS4xNjggNTcuNDcyIDI4LjAzMiA4Ni40IDM4LjQ2NCA5OC4wNDggMzUuNjQ4IDE2Ni41OTIgMzMuOTIgMjA1LjYzMi01LjEyIDM5LjA0LTM5LjA0IDQwLjc2OC0xMDcuNTg0IDUuMTItMjA1LjY5NmE2ODUuNTA0IDY4NS41MDQgMCAwIDAtMzguNC04Ni40IDEyNDAuODMyIDEyNDAuODMyIDAgMCAxLTEyMC4zMiAxMzguNDk2IDEyNDAuOTYgMTI0MC45NiAwIDAgMS0xMzguNDMyIDEyMC4zMnpNNTg1LjA4OCA1MTJhNzMuMTUyIDczLjE1MiAwIDEgMS0xNDYuMjQgMCA3My4xNTIgNzMuMTUyIDAgMCAxIDE0Ni4zMDQgMHpcIlxuICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgcC1pZD1cIjUwMTNcIlxuICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICDmt7HluqbmgJ3ogINcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNlbGVjdC10b29sXCJcbiAgICAgICAgICBuei1wb3BvdmVyXG4gICAgICAgICAgW256UG9wb3ZlckNvbnRlbnRdPVwibW9kZWxMaXN0Q29udGVudFwiXG4gICAgICAgICAgbnpQb3BvdmVyVHJpZ2dlcj1cImNsaWNrXCJcbiAgICAgICAgICBuelBvcG92ZXJPdmVybGF5Q2xhc3NOYW1lPVwicGFyYW1zLXNlbGVjdC1wb3BvdmVyXCJcbiAgICAgICAgICBbbnpQb3BvdmVyVmlzaWJsZV09XCJtb2RlbFBvcG92ZXJWaXNpYmxlXCJcbiAgICAgICAgICAobnpQb3BvdmVyVmlzaWJsZUNoYW5nZSk9XCJtb2RlbFZpc2libGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaW1hZ2VzL2lucHV0L3RvZ2dsZS1tb2RlbC5wbmdcIiBzdHlsZT1cIndpZHRoOiAxMnB4OyBoZWlnaHQ6IDEycHhcIiAvPlxuICAgICAgICAgIHt7IGN1cnJlbnRNb2RlbCA/IGN1cnJlbnRNb2RlbD8ubmFtZSA6ICfpgInmi6nmqKHlnosnIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJzZWxlY3QtdG9vbFwiXG4gICAgICAgICAgbnotcG9wb3ZlclxuICAgICAgICAgIFtuelBvcG92ZXJDb250ZW50XT1cImtub3dsZWRnZUxpc3RDb250ZW50XCJcbiAgICAgICAgICBuelBvcG92ZXJUcmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICAgIG56UG9wb3Zlck92ZXJsYXlDbGFzc05hbWU9XCJwYXJhbXMtc2VsZWN0LXBvcG92ZXJcIlxuICAgICAgICAgIFtuelBvcG92ZXJWaXNpYmxlXT1cImtub3dsZWRnZVBvcG92ZXJWaXNpYmxlXCJcbiAgICAgICAgICAobnpQb3BvdmVyVmlzaWJsZUNoYW5nZSk9XCJrbm93bGVkZ2VWaXNpYmxlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ltYWdlcy9pbnB1dC9yZWxhdGUucG5nXCIgc3R5bGU9XCJ3aWR0aDogMTRweDsgaGVpZ2h0OiA4cHhcIiAvPlxuICAgICAgICAgIOWFs+iBlOefpeivhuW6k1xuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGltZyBjbGFzcz1cInNlbmRcIiBzcmM9XCIvYXNzZXRzL2ltYWdlcy9pbnB1dC9zZW5kLnBuZ1wiIChjbGljayk9XCJzZW5kKClcIiBbaGlkZGVuXT1cInNzZVNlcnZpY2UubG9hZGluZyQgfCBhc3luY1wiIC8+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VuZC1sb2FkaW5nXCIgKm5nSWY9XCJzc2VTZXJ2aWNlLmxvYWRpbmckIHwgYXN5bmNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbmQtbG9hZGluZy1pbm5lclwiPlxuICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzNiAzNlwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1pY29uPVwic3BpblwiPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCB4MT1cIjAlXCIgeTE9XCIxMDAlXCIgeDI9XCIxMDAlXCIgeTI9XCIxMDAlXCIgaWQ9XCJsaW5lYXJHcmFkaWVudC0xXCI+XG4gICAgICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj1cImN1cnJlbnRDb2xvclwiIHN0b3Atb3BhY2l0eT1cIjBcIiBvZmZzZXQ9XCIwJVwiPjwvc3RvcD5cbiAgICAgICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPVwiY3VycmVudENvbG9yXCIgc3RvcC1vcGFjaXR5PVwiMC41MFwiIG9mZnNldD1cIjM5Ljk0MzA2OTglXCI+PC9zdG9wPlxuICAgICAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9XCJjdXJyZW50Q29sb3JcIiBvZmZzZXQ9XCIxMDAlXCI+PC9zdG9wPlxuICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgPGcgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICAgICAgPHJlY3QgZmlsbC1vcGFjaXR5PVwiMC4wMVwiIGZpbGw9XCJub25lXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMzZcIiBoZWlnaHQ9XCIzNlwiPjwvcmVjdD5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBkPVwiTTM0LDE4IEMzNCw5LjE2MzQ0NCAyNi44MzY1NTYsMiAxOCwyIEMxMS42NTk3MjMzLDIgNi4xODA3ODgwNSw1LjY4Nzg0MTM1IDMuNTkxMjIzMjUsMTEuMDM1NDk1MVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwidXJsKCNsaW5lYXJHcmFkaWVudC0xKVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiNFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8IS0tIDxpbWcgY2xhc3M9XCJzZW5kXCIgc3JjPVwiL2Fzc2V0cy9pbWFnZXMvaW5wdXQvc2VuZC1ncmF5LnBuZ1wiIC8+IC0tPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNoYXQtaW5wdXQtYmFja2Ryb3BcIj48L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI21vZGVsTGlzdENvbnRlbnQ+XG4gIDxkaXYgc3R5bGU9XCJ3aWR0aDogMjAwcHhcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXRpdGxlXCI+XG4gICAgICDliIfmjaLmqKHlnotcbiAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiY2xvc2VcIiBzdHlsZT1cImNvbG9yOiAjOTk5XCIgKGNsaWNrKT1cIm1vZGVsVmlzaWJsZUNoYW5nZShmYWxzZSlcIj48L2k+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdC1jb250ZW50XCI+XG4gICAgICA8bnotcmFkaW8tZ3JvdXAgWyhuZ01vZGVsKV09XCJjdXJyZW50TW9kZWxcIj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgbnotcmFkaW9cbiAgICAgICAgICBbbnpWYWx1ZV09XCJpdGVtXCJcbiAgICAgICAgICBbc3R5bGUubWFyZ2luLXRvcC5weF09XCJpID09PSAwID8gMCA6IDEwXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtb2RlbExpc3Q7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L256LXJhZGlvLWdyb3VwPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAja25vd2xlZGdlTGlzdENvbnRlbnQ+XG4gIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTUwcHhcIj5cbiAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXRpdGxlXCI+XG4gICAgICDlhbPogZTnn6Xor4blupNcbiAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiY2xvc2VcIiBzdHlsZT1cImNvbG9yOiAjOTk5XCIgKGNsaWNrKT1cImtub3dsZWRnZVZpc2libGVDaGFuZ2UoZmFsc2UpXCI+PC9pPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtY29udGVudFwiPlxuICAgICAgPG56LWNoZWNrYm94LXdyYXBwZXIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiIChuek9uQ2hhbmdlKT1cImtub3dsZWRnZVNlbGVjdENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Yga25vd2xlZGdlTGlzdFwiPlxuICAgICAgICAgIDxsYWJlbCBuei1jaGVja2JveCBbbnpWYWx1ZV09XCJpdGVtLmlDb2RlXCI+e3sgaXRlbS5uYW1lIH19PC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L256LWNoZWNrYm94LXdyYXBwZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZ2VudC9jaGF0L2NoYXQtaW5wdXQvY2hhdC1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZ2VudC9jaGF0L2NoYXQtaW5wdXQvY2hhdC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwwQkFBMEI7QUFDMUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFjLFNBQVMsRUFBRSxNQUFNLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFJdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7Ozs7OztBQVFyRCxNQUFNLE9BQU8sa0JBQWtCO0lBTC9CO1FBUVcsYUFBUSxHQUFjLEVBQUUsQ0FBQztRQUN6QixTQUFJLEdBQW9CLE1BQU0sQ0FBQztRQUM5QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFvRCxDQUFDO1FBQ25GLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMzQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNuQyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUVwQyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNsQyxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXZDLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFDZixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMscUJB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QUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQ3pELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBaUI7WUFDNUIsWUFBWTtZQUNaLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3JDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUztZQUNyQixRQUFRLEVBQUUsSUFBSTtZQUNkLFNBQVMsRUFBRTtnQkFDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQ3hCLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCO2dCQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVk7YUFDeEI7U0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7O2dIQWxOVSxrQkFBa0I7b0dBQWxCLGtCQUFrQiwyWkNoQi9CLDhvU0FrTEE7NEZEbEthLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxnQkFBZ0I7OEJBS0YsTUFBTTtzQkFBN0IsU0FBUzt1QkFBQyxXQUFXO2dCQUNTLGdCQUFnQjtzQkFBOUMsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBQ3BCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxLQUFLO3NCQUFkLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gY2hhdC1pbnB1dC5jb21wb25lbnQudHNcbmltcG9ydCB7IENvbXBvbmVudCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgaW5qZWN0LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2h0dHAyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSU1vZGVsLCBJTW9kZWxMaXN0IH0gZnJvbSAnLi4vbW9kZWxzL21vZGVsLWxpc3QubW9kZWwnO1xuaW1wb3J0IHsgU3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vc3RvcmUvc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBJS25vd2xlZGdlQ2F0ZWdvcnksIElLbm93bGVkZ2VMaXN0LCBJS25vd2xlZGdlVGFnLCBJS25vd2xlZGdlVHlwZSB9IGZyb20gJy4uL21vZGVscy9rbm93bGVkZ2UtbGlzdC5tb2RlbCc7XG5pbXBvcnQgeyBJU2VuZE1lc3NhZ2UgfSBmcm9tICcuLi9tb2RlbHMvc2VuZC1tZXNzYWdlLm1vZGVsJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuLi9tb2RlbHMvbWVzc2FnZS5tb2RlbCc7XG5pbXBvcnQgeyBTc2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3NlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTnpUcmVlTm9kZU9wdGlvbnMgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHJlZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1jaGF0LWlucHV0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0LWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENoYXRJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2VkaXRvclJlZicpIGVkaXRvciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdjaGF0SW5wdXRXcmFwcGVyJykgY2hhdElucHV0V3JhcHBlciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBASW5wdXQoKSBtZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gIEBJbnB1dCgpIG1vZGU6ICdmdWxsJyB8ICdjYXJkJyA9ICdmdWxsJztcbiAgQE91dHB1dCgpIHNlbmRNZXNzYWdlID0gbmV3IEV2ZW50RW1pdHRlcjx7IG1lc3NhZ2U6IElTZW5kTWVzc2FnZTsgaXNSZWdlbmVyYXRlOiBib29sZWFuIH0+KCk7XG4gIEBPdXRwdXQoKSBtZXNzYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBlbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgcGFzdGUgPSBuZXcgRXZlbnRFbWl0dGVyPEV2ZW50PigpO1xuXG4gIHByaXZhdGUgaHR0cFNlcnZpY2UgPSBpbmplY3QoSHR0cFNlcnZpY2UpO1xuICBwcml2YXRlIHN0b3JlU2VydmljZSA9IGluamVjdChTdG9yZVNlcnZpY2UpO1xuICBwdWJsaWMgc3NlU2VydmljZSA9IGluamVjdChTc2VTZXJ2aWNlKTtcblxuICBpc0VtcHR5ID0gdHJ1ZTtcbiAgY3VycmVudE1vZGVsOiBJTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgY3VycmVudEtub3dsZWRnZTogc3RyaW5nW10gPSBbXTtcbiAgbW9kZWxMaXN0OiBJTW9kZWxMaXN0ID0gW107XG4gIG1vZGVsUG9wb3ZlclZpc2libGUgPSBmYWxzZTtcbiAga25vd2xlZGdlUG9wb3ZlclZpc2libGUgPSBmYWxzZTtcbiAgZGVlcFRoaW5rID0gdHJ1ZTtcblxuICBrbm93bGVkZ2VTdGVwSW5kZXggPSAwO1xuICB0eXBlc0RhdGE6IElLbm93bGVkZ2VUeXBlW10gPSBbXTtcbiAgY2F0ZWdvcmllc0RhdGE6IE56VHJlZU5vZGVPcHRpb25zW10gPSBbXTtcbiAgdGFnc0RhdGE6IElLbm93bGVkZ2VUYWdbXSA9IFtdO1xuICBzZWxlY3RlZFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuICBzZWxlY3RlZENhdGVnb3JpZXM6IHN0cmluZ1tdID0gW107XG4gIHNlbGVjdGVkVGFnczogc3RyaW5nW10gPSBbXTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldE1vZGVsTGlzdCgpO1xuICAgIHRoaXMubG9hZFR5cGVzKCk7XG4gIH1cblxuICAvLyDlj6/kvpvkuqTkupLnmoTmqKHlnotcbiAgZ2V0TW9kZWxMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMuaHR0cFNlcnZpY2UuZ2V0PElNb2RlbExpc3Q+KGAke3RoaXMuc3RvcmVTZXJ2aWNlLmdldEJhc2VVcmwoKX0vYXBpL0NoYXRNb2RlbC9tb2RlbHNgKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIHRoaXMubW9kZWxMaXN0ID0gcmVzO1xuICAgICAgaWYgKHJlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50TW9kZWwgPSByZXNbMF07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvblR5cGVDaGFuZ2UodHlwZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFR5cGVzID0gdHlwZXM7XG4gICAgdGhpcy5sb2FkQ2F0ZWdvcmllcyh0eXBlcyk7XG5cbiAgICB0aGlzLnNlbGVjdGVkQ2F0ZWdvcmllcyA9IFtdO1xuICAgIHRoaXMuc2VsZWN0ZWRUYWdzID0gW107XG4gICAgdGhpcy50YWdzRGF0YSA9IFtdO1xuICAgIHRoaXMua25vd2xlZGdlU3RlcEluZGV4ID0gdHlwZXMubGVuZ3RoID8gMSA6IDA7XG4gIH1cblxuICBvbkNhdGVnb3J5Q2hhbmdlKGNhdGVnb3JpZXM6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENhdGVnb3JpZXMgPSBjYXRlZ29yaWVzO1xuICAgIHRoaXMubG9hZFRhZ3MoY2F0ZWdvcmllcyk7XG4gICAgdGhpcy5zZWxlY3RlZFRhZ3MgPSBbXTtcbiAgICB0aGlzLmtub3dsZWRnZVN0ZXBJbmRleCA9IGNhdGVnb3JpZXMubGVuZ3RoID8gMiA6IDE7XG4gIH1cblxuICBvblRhZ0NoYW5nZSh0YWdzOiBhbnlbXSk6IHZvaWQge1xuICAgIHRoaXMua25vd2xlZGdlU3RlcEluZGV4ID0gdGFncy5sZW5ndGggPyAyIDogMTtcbiAgfVxuXG4gIC8vIOiOt+WPluWIhuexu1xuICBwcml2YXRlIGxvYWRUeXBlcygpOiB2b2lkIHtcbiAgICB0aGlzLmh0dHBTZXJ2aWNlXG4gICAgICAuZ2V0PElLbm93bGVkZ2VUeXBlW10+KGAke3RoaXMuc3RvcmVTZXJ2aWNlLmdldEJhc2VVcmwoKX0vYXBpL0NoYXRNb2RlbC9rbm93bGVkZ2VUeXBlc2ApXG4gICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIHRoaXMudHlwZXNEYXRhID0gcmVzO1xuICAgICAgfSk7XG4gIH1cblxuICAvLyDojrflj5bnm67lvZVcbiAgcHJpdmF0ZSBsb2FkQ2F0ZWdvcmllcyh0eXBlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLmh0dHBTZXJ2aWNlXG4gICAgICAucG9zdDxJS25vd2xlZGdlQ2F0ZWdvcnlbXT4oYCR7dGhpcy5zdG9yZVNlcnZpY2UuZ2V0QmFzZVVybCgpfS9hcGkvQ2hhdE1vZGVsL2tub3dsZWRnZS9jYXRhbG9nc2AsIHtcbiAgICAgICAgdHlwZXM6IHRoaXMuc2VsZWN0ZWRUeXBlcyxcbiAgICAgIH0pXG4gICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIHRoaXMuY2F0ZWdvcmllc0RhdGEgPSB0aGlzLmNvbnZlcnRUb1RyZWUocmVzKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkVGFncyhjYXRlZ29yaWVzOiBhbnlbXSk6IHZvaWQge1xuICAgIHRoaXMuaHR0cFNlcnZpY2VcbiAgICAgIC5wb3N0PElLbm93bGVkZ2VUYWdbXT4oYCR7dGhpcy5zdG9yZVNlcnZpY2UuZ2V0QmFzZVVybCgpfS9hcGkvQ2hhdE1vZGVsL2tub3dsZWRnZS90YWdzYCwge1xuICAgICAgICBjYXRhbG9nOiBjYXRlZ29yaWVzLFxuICAgICAgfSlcbiAgICAgIC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgdGhpcy50YWdzRGF0YSA9IHJlcztcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VG9UcmVlKGRhdGE6IGFueSk6IGFueSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLm1hcChpdGVtID0+IGNvbnZlcnROb2RlKGl0ZW0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb252ZXJ0Tm9kZShub2RlOiBhbnkpIHtcbiAgICAgIGxldCByZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgdGl0bGU6IG5vZGUubmFtZSB8fCAnJyxcbiAgICAgICAgdmFsdWU6IG5vZGUuaUNvZGUsXG4gICAgICAgIGtleTogbm9kZS5pQ29kZSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQuY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLm1hcCgoY2hpbGQ6IGFueSkgPT4gY29udmVydE5vZGUoY2hpbGQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBjb252ZXJ0Tm9kZShkYXRhKTsgLy8g5aaC5p6c5piv5Y2V5Liq5a+56LGhXG4gIH1cblxuICBtb2RlbFZpc2libGVDaGFuZ2UodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsUG9wb3ZlclZpc2libGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGtub3dsZWRnZVZpc2libGVDaGFuZ2UodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmtub3dsZWRnZVBvcG92ZXJWaXNpYmxlID0gdmFsdWU7XG4gIH1cblxuICBrbm93bGVkZ2VTZWxlY3RDaGFuZ2UodmFsdWU6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50S25vd2xlZGdlID0gdmFsdWU7XG4gIH1cblxuICB0b2dnbGVEZWVwVGhpbmsoKTogdm9pZCB7XG4gICAgdGhpcy5kZWVwVGhpbmsgPSAhdGhpcy5kZWVwVGhpbms7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUVtcHR5U3RhdGUoKSB7XG4gICAgY29uc3QgZWwgPSB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHRleHQgPSBlbC50ZXh0Q29udGVudD8udHJpbSgpIHx8ICcnO1xuICAgIGNvbnN0IGhhc09ubHlCciA9IGVsLmlubmVySFRNTCA9PT0gJzxicj4nIHx8IGVsLmlubmVySFRNTCA9PT0gJyc7XG5cbiAgICB0aGlzLmlzRW1wdHkgPSB0ZXh0ID09PSAnJyAmJiBoYXNPbmx5QnI7XG4gIH1cblxuICBoYW5kbGVJbnB1dCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUVtcHR5U3RhdGUoKTtcbiAgICBjb25zdCBodG1sID0gdGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gICAgY29uc3QgdGV4dCA9IHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgLy8gdGhpcy5tZXNzYWdlQ2hhbmdlLmVtaXQodGV4dCk7XG4gIH1cblxuICBoYW5kbGVFbnRlcihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIShldmVudCBhcyBLZXlib2FyZEV2ZW50KS5zaGlmdEtleSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vIHRoaXMuZW50ZXIuZW1pdCgoZXZlbnQgYXMgYW55KS50YXJnZXQhLmlubmVyVGV4dCEucmVwbGFjZSgvXFxzKy9nLCBcIiBcIikudHJpbSgpKTtcbiAgICAgIHRoaXMuc2VuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xuICAgIC8vIHRoaXMucGFzdGUuZW1pdChldmVudCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZUVtcHR5U3RhdGUoKSwgMCk7XG4gIH1cblxuICBjbGVhcklucHV0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5oYW5kbGVJbnB1dCgpO1xuICB9XG5cbiAgcmVnZW5lcmF0ZVNlbmQobXNnOiBNZXNzYWdlKTogdm9pZCB7XG4gICAgLy8g5q2j5Zyo5Zue562U5LitXG4gICAgaWYgKHRoaXMuc3NlU2VydmljZS5sb2FkaW5nU291cmNlLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IHRoaXMuc3RvcmVTZXJ2aWNlLmdldENvbnZlcnNhdGlvbklDb2RlKCk7XG4gICAgY29uc3QgbWVzc2FnZTogSVNlbmRNZXNzYWdlID0ge1xuICAgICAgY29udmVyc2F0aW9uLFxuICAgICAgcXVlc3Rpb25JQ29kZTogbXNnLmlDb2RlLFxuICAgICAgbW9kZWw6IHRoaXMuY3VycmVudE1vZGVsPy5pQ29kZSA/PyAnJyxcbiAgICAgIHRoaW5rOiB0aGlzLmRlZXBUaGluayxcbiAgICAgIHF1ZXN0aW9uOiBtc2cucXVlc3Rpb24sXG4gICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgdHlwZTogdGhpcy5zZWxlY3RlZFR5cGVzLFxuICAgICAgICBjYXRhbG9nczogdGhpcy5zZWxlY3RlZENhdGVnb3JpZXMsXG4gICAgICAgIHRhZ3M6IHRoaXMuc2VsZWN0ZWRUYWdzLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuc2VuZE1lc3NhZ2UuZW1pdCh7IG1lc3NhZ2UsIGlzUmVnZW5lcmF0ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHNlbmQoKTogdm9pZCB7XG4gICAgLy8g5q2j5Zyo5Zue562U5LitXG4gICAgaWYgKHRoaXMuc3NlU2VydmljZS5sb2FkaW5nU291cmNlLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVkaXRvci5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50IHx8ICcnO1xuICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IHRoaXMuc3RvcmVTZXJ2aWNlLmdldENvbnZlcnNhdGlvbklDb2RlKCk7XG4gICAgY29uc3QgbWVzc2FnZTogSVNlbmRNZXNzYWdlID0ge1xuICAgICAgY29udmVyc2F0aW9uLFxuICAgICAgbW9kZWw6IHRoaXMuY3VycmVudE1vZGVsPy5pQ29kZSA/PyAnJyxcbiAgICAgIHRoaW5rOiB0aGlzLmRlZXBUaGluayxcbiAgICAgIHF1ZXN0aW9uOiB0ZXh0LFxuICAgICAgcGFyYW1ldGVyOiB7XG4gICAgICAgIHR5cGU6IHRoaXMuc2VsZWN0ZWRUeXBlcyxcbiAgICAgICAgY2F0YWxvZ3M6IHRoaXMuc2VsZWN0ZWRDYXRlZ29yaWVzLFxuICAgICAgICB0YWdzOiB0aGlzLnNlbGVjdGVkVGFncyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICB0aGlzLnNlbmRNZXNzYWdlLmVtaXQoeyBtZXNzYWdlLCBpc1JlZ2VuZXJhdGU6IGZhbHNlIH0pO1xuICB9XG59XG4iLCI8IS0tIOaWsOiBiuWkqeS9jeS6juWxj+W5leS4remXtO+8jOWPkemAgea2iOaBr+S5i+WQjuS9jeS6juW6lemDqCAtLT5cbjxkaXZcbiAgY2xhc3M9XCJjaGF0LWlucHV0LXdyYXBwZXJcIlxuICAjY2hhdElucHV0V3JhcHBlclxuICBbY2xhc3MuY2VudGVyXT1cIiFtZXNzYWdlcy5sZW5ndGhcIlxuICBbbmdTdHlsZV09XCJ7ICdwYWRkaW5nLWJvdHRvbSc6IG1vZGUgPT09ICdmdWxsJyA/ICc0MHB4JyA6ICcxMHB4JyB9XCJcbj5cbiAgPGRpdiBjbGFzcz1cIm5ldy1jaGF0LXRpdGxlXCIgKm5nSWY9XCIhbWVzc2FnZXMubGVuZ3RoXCI+XG4gICAgPGltZyBzcmM9XCIvYXNzZXRzL2ltYWdlcy9sb2dvLnBuZ1wiIC8+XG4gICAgPHNwYW4+5L2g5aW977yM5pyJ5LuA5LmI5Y+v5Lul5biu5Yiw5L2g77yf5byA5aeL5a+56K+d5ZCnPC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNoYXQtaW5wdXRcIj5cbiAgICA8ZGl2XG4gICAgICAjZWRpdG9yUmVmXG4gICAgICBjbGFzcz1cImlucHV0LWNyZWF0aXZlLWVkaXRvclwiXG4gICAgICBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJcbiAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICBkYXRhLXBsYWNlaG9sZGVyPVwi6K+36L6T5YWl5bm25Y+R6YCB5raI5oGvXCJcbiAgICAgIFthdHRyLmRhdGEtZW1wdHldPVwiaXNFbXB0eVwiXG4gICAgICAoaW5wdXQpPVwiaGFuZGxlSW5wdXQoKVwiXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVFbnRlcigkZXZlbnQpXCJcbiAgICAgIChwYXN0ZSk9XCJoYW5kbGVQYXN0ZSgkZXZlbnQpXCJcbiAgICA+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWJvdHRvbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXRvb2xzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtdG9vbFwiIFtuZ0NsYXNzXT1cInsgJ3NlbGVjdC10b29sLWFjdGl2ZSc6IGRlZXBUaGluayB9XCIgKGNsaWNrKT1cInRvZ2dsZURlZXBUaGluaygpXCI+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgdD1cIjE3NjQxMzEwMjY5NDlcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTRweDsgaGVpZ2h0OiAxNHB4XCJcbiAgICAgICAgICAgIGNsYXNzPVwiaWNvblwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEwMjQgMTAyNFwiXG4gICAgICAgICAgICB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgcC1pZD1cIjUwMTJcIlxuICAgICAgICAgICAgd2lkdGg9XCI2NFwiXG4gICAgICAgICAgICBoZWlnaHQ9XCI2NFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk05MDMuMzYgNTEyYTc5NS41MiA3OTUuNTIgMCAwIDEgNjUuNTM2IDEzNi43MDRjNDggMTMyLjE2IDM5LjYxNiAyMzAuNTI4LTI1LjAyNCAyOTUuMTY4LTY0LjY0IDY0LjY0LTE2My4wMDggNzIuOTYtMjk1LjE2OCAyNC45NkE3OTUuNTIgNzk1LjUyIDAgMCAxIDUxMiA5MDMuNDI0YTc5NS41MiA3OTUuNTIgMCAwIDEtMTM2LjcwNCA2NS41MzZjLTEzMi4wOTYgNDgtMjMwLjUyOCAzOS42MTYtMjk1LjE2OC0yNS4wMjQtNjQuNjQtNjQuNjQtNzIuOTYtMTYzLjAwOC0yNC45Ni0yOTUuMTA0IDE2LjY0LTQ2LjAxNiAzOC41MjgtOTEuNTIgNjUuNTM2LTEzNi43NjhBNzk1LjUyIDc5NS41MiAwIDAgMSA1NS4wNCAzNzUuMjMyQzcuMDQgMjQzLjIgMTUuMzYgMTQ0Ljc2OCA4MCA4MC4xMjggMTQ0Ljc2OCAxNS40ODggMjQzLjIgNy4xNjggMzc1LjI5NiA1NS4wNGM0Ni4wMTYgMTYuNjQgOTEuNTg0IDM4LjUyOCAxMzYuNzY4IDY1LjUzNkE3OTUuNTIgNzk1LjUyIDAgMCAxIDY0OC43NjggNTUuMTA0YzEzMi4wOTYtNDggMjMwLjQ2NC0zOS42MTYgMjk1LjEwNCAyNS4wMjQgNjQuNjQgNjQuNjQgNzIuOTYgMTYzLjAwOCAyNS4wMjQgMjk1LjEwNEE3OTUuNTIgNzk1LjUyIDAgMCAxIDkwMy4zNiA1MTJ6IG0tNTMuMTItNzkuNDI0YzE1LjE2OC0yOC43MzYgMjcuOTY4LTU3LjUzNiAzOC40NjQtODYuNCAzNS41ODQtOTguMTEyIDMzLjkyLTE2Ni42NTYtNS4xMi0yMDUuNjk2LTM5LjA0LTM5LjA0LTEwNy42NDgtNDAuNzY4LTIwNS42OTYtNS4xMmE2ODUuNDQgNjg1LjQ0IDAgMCAwLTg2LjQgMzguNCAxMjQwLjk2IDEyNDAuOTYgMCAwIDEgMTM4LjQzMiAxMjAuMzIgMTI0MC44MzIgMTI0MC44MzIgMCAwIDEgMTIwLjMyIDEzOC40OTZ6TTQzMi41NzYgMTczLjgyNGE2ODUuNDQgNjg1LjQ0IDAgMCAwLTg2LjQtMzguNTI4Yy05OC4xMTItMzUuNTg0LTE2Ni42NTYtMzMuOTItMjA1LjY5NiA1LjEyLTM5LjA0IDM5LjA0LTQwLjc2OCAxMDcuNjQ4LTUuMTIgMjA1LjY5NiAxMC40MzIgMjguOTI4IDIzLjI5NiA1Ny43MjggMzguNCA4Ni40YTEyNDAuODk2IDEyNDAuODk2IDAgMCAxIDEyMC4zMi0xMzguNDMyIDEyNDAuODMyIDEyNDAuODMyIDAgMCAxIDEzOC40OTYtMTIwLjMyek0xNzMuODI0IDU5MS40ODhhNjg1LjQ0IDY4NS40NCAwIDAgMC0zOC40NjQgODYuNGMtMzUuNjQ4IDk4LjA0OC0zMy45MiAxNjYuNTkyIDUuMTIgMjA1LjYzMiAzOS4wNCAzOS4wNCAxMDcuNTg0IDQwLjc2OCAyMDUuNjk2IDUuMTJhNjg1LjQ0IDY4NS40NCAwIDAgMCA4Ni40LTM4LjQgMTI0MC43NjggMTI0MC43NjggMCAwIDEtMTM4LjQ5Ni0xMjAuMzIgMTI0MC45NiAxMjQwLjk2IDAgMCAxLTEyMC4yNTYtMTM4LjQzMnogbTQ5NS43NDQgNzguMDhBMTExMi4wNjQgMTExMi4wNjQgMCAwIDAgODAyLjA0OCA1MTJhMTExMi4wNjQgMTExMi4wNjQgMCAwIDAtMTMyLjQ4LTE1Ny41NjhBMTExMi4xMjggMTExMi4xMjggMCAwIDAgNTEyIDIyMS45NTJhMTExMi4xMjggMTExMi4xMjggMCAwIDAtMTU3LjUwNCAxMzIuNDhBMTExMi4wNjQgMTExMi4wNjQgMCAwIDAgMjIyLjAxNiA1MTJhMTExMi4xOTIgMTExMi4xOTIgMCAwIDAgMTMyLjQxNiAxNTcuNTY4QTExMTIuMDY0IDExMTIuMDY0IDAgMCAwIDUxMiA4MDIuMDQ4YTExMTIuMTI4IDExMTIuMTI4IDAgMCAwIDE1Ny41NjgtMTMyLjQ4eiBtLTc4LjA4IDE4MC42MDhjMjguNjcyIDE1LjE2OCA1Ny40NzIgMjguMDMyIDg2LjQgMzguNDY0IDk4LjA0OCAzNS42NDggMTY2LjU5MiAzMy45MiAyMDUuNjMyLTUuMTIgMzkuMDQtMzkuMDQgNDAuNzY4LTEwNy41ODQgNS4xMi0yMDUuNjk2YTY4NS41MDQgNjg1LjUwNCAwIDAgMC0zOC40LTg2LjQgMTI0MC44MzIgMTI0MC44MzIgMCAwIDEtMTIwLjMyIDEzOC40OTYgMTI0MC45NiAxMjQwLjk2IDAgMCAxLTEzOC40MzIgMTIwLjMyek01ODUuMDg4IDUxMmE3My4xNTIgNzMuMTUyIDAgMSAxLTE0Ni4yNCAwIDczLjE1MiA3My4xNTIgMCAwIDEgMTQ2LjMwNCAwelwiXG4gICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICBwLWlkPVwiNTAxM1wiXG4gICAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIOa3seW6puaAneiAg1xuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwic2VsZWN0LXRvb2xcIlxuICAgICAgICAgIG56LXBvcG92ZXJcbiAgICAgICAgICBbbnpQb3BvdmVyQ29udGVudF09XCJtb2RlbExpc3RDb250ZW50XCJcbiAgICAgICAgICBuelBvcG92ZXJUcmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgICAgIG56UG9wb3Zlck92ZXJsYXlDbGFzc05hbWU9XCJwYXJhbXMtc2VsZWN0LXBvcG92ZXJcIlxuICAgICAgICAgIFtuelBvcG92ZXJWaXNpYmxlXT1cIm1vZGVsUG9wb3ZlclZpc2libGVcIlxuICAgICAgICAgIChuelBvcG92ZXJWaXNpYmxlQ2hhbmdlKT1cIm1vZGVsVmlzaWJsZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pbWFnZXMvaW5wdXQvdG9nZ2xlLW1vZGVsLnBuZ1wiIHN0eWxlPVwid2lkdGg6IDEycHg7IGhlaWdodDogMTJweFwiIC8+XG4gICAgICAgICAge3sgY3VycmVudE1vZGVsID8gY3VycmVudE1vZGVsPy5uYW1lIDogJ+mAieaLqeaooeWeiycgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cInNlbGVjdC10b29sXCJcbiAgICAgICAgICBuei1wb3BvdmVyXG4gICAgICAgICAgW256UG9wb3ZlckNvbnRlbnRdPVwia25vd2xlZGdlTGlzdENvbnRlbnRcIlxuICAgICAgICAgIG56UG9wb3ZlclRyaWdnZXI9XCJjbGlja1wiXG4gICAgICAgICAgbnpQb3BvdmVyT3ZlcmxheUNsYXNzTmFtZT1cInBhcmFtcy1zZWxlY3QtcG9wb3ZlclwiXG4gICAgICAgICAgW256UG9wb3ZlclZpc2libGVdPVwia25vd2xlZGdlUG9wb3ZlclZpc2libGVcIlxuICAgICAgICAgIChuelBvcG92ZXJWaXNpYmxlQ2hhbmdlKT1cImtub3dsZWRnZVZpc2libGVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaW1hZ2VzL2lucHV0L3JlbGF0ZS5wbmdcIiBzdHlsZT1cIndpZHRoOiAxNHB4OyBoZWlnaHQ6IDhweFwiIC8+XG4gICAgICAgICAg5YWz6IGU55+l6K+G5bqTXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8aW1nIGNsYXNzPVwic2VuZFwiIHNyYz1cIi9hc3NldHMvaW1hZ2VzL2lucHV0L3NlbmQucG5nXCIgKGNsaWNrKT1cInNlbmQoKVwiIFtoaWRkZW5dPVwic3NlU2VydmljZS5sb2FkaW5nJCB8IGFzeW5jXCIgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZW5kLWxvYWRpbmdcIiAqbmdJZj1cInNzZVNlcnZpY2UubG9hZGluZyQgfCBhc3luY1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VuZC1sb2FkaW5nLWlubmVyXCI+XG4gICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDM2IDM2XCIgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWljb249XCJzcGluXCI+XG4gICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPVwiMCVcIiB5MT1cIjEwMCVcIiB4Mj1cIjEwMCVcIiB5Mj1cIjEwMCVcIiBpZD1cImxpbmVhckdyYWRpZW50LTFcIj5cbiAgICAgICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPVwiY3VycmVudENvbG9yXCIgc3RvcC1vcGFjaXR5PVwiMFwiIG9mZnNldD1cIjAlXCI+PC9zdG9wPlxuICAgICAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9XCJjdXJyZW50Q29sb3JcIiBzdG9wLW9wYWNpdHk9XCIwLjUwXCIgb2Zmc2V0PVwiMzkuOTQzMDY5OCVcIj48L3N0b3A+XG4gICAgICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj1cImN1cnJlbnRDb2xvclwiIG9mZnNldD1cIjEwMCVcIj48L3N0b3A+XG4gICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XG4gICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICA8ZyBzdHJva2U9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiMVwiIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxuICAgICAgICAgICAgICA8cmVjdCBmaWxsLW9wYWNpdHk9XCIwLjAxXCIgZmlsbD1cIm5vbmVcIiB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCIzNlwiIGhlaWdodD1cIjM2XCI+PC9yZWN0PlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIGQ9XCJNMzQsMTggQzM0LDkuMTYzNDQ0IDI2LjgzNjU1NiwyIDE4LDIgQzExLjY1OTcyMzMsMiA2LjE4MDc4ODA1LDUuNjg3ODQxMzUgMy41OTEyMjMyNSwxMS4wMzU0OTUxXCJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJ1cmwoI2xpbmVhckdyYWRpZW50LTEpXCJcbiAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCI0XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwhLS0gPGltZyBjbGFzcz1cInNlbmRcIiBzcmM9XCIvYXNzZXRzL2ltYWdlcy9pbnB1dC9zZW5kLWdyYXkucG5nXCIgLz4gLS0+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2hhdC1pbnB1dC1iYWNrZHJvcFwiPjwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kZWxMaXN0Q29udGVudD5cbiAgPGRpdiBzdHlsZT1cIndpZHRoOiAyMDBweFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtdGl0bGVcIj5cbiAgICAgIOWIh+aNouaooeWei1xuICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJjbG9zZVwiIHN0eWxlPVwiY29sb3I6ICM5OTlcIiAoY2xpY2spPVwibW9kZWxWaXNpYmxlQ2hhbmdlKGZhbHNlKVwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LWNvbnRlbnRcIj5cbiAgICAgIDxuei1yYWRpby1ncm91cCBbKG5nTW9kZWwpXT1cImN1cnJlbnRNb2RlbFwiPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBuei1yYWRpb1xuICAgICAgICAgIFtuelZhbHVlXT1cIml0ZW1cIlxuICAgICAgICAgIFtzdHlsZS5tYXJnaW4tdG9wLnB4XT1cImkgPT09IDAgPyAwIDogMTBcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1vZGVsTGlzdDsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBpdGVtLm5hbWUgfX1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvbnotcmFkaW8tZ3JvdXA+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNrbm93bGVkZ2VMaXN0Q29udGVudD5cbiAgPGRpdiBzdHlsZT1cIndpZHRoOiAyNTBweFwiPlxuICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QtdGl0bGVcIj5cbiAgICAgIOWFs+iBlOefpeivhuW6k1xuICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJjbG9zZVwiIHN0eWxlPVwiY29sb3I6ICM5OTlcIiAoY2xpY2spPVwia25vd2xlZGdlVmlzaWJsZUNoYW5nZShmYWxzZSlcIj48L2k+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNlbGVjdC1jb250ZW50XCI+XG4gICAgICA8bnotc3RlcHMgW256Q3VycmVudF09XCJrbm93bGVkZ2VTdGVwSW5kZXhcIiBuelByb2dyZXNzRG90IG56RGlyZWN0aW9uPVwidmVydGljYWxcIiBuelNpemU9XCJzbWFsbFwiPlxuICAgICAgICA8bnotc3RlcCBuelRpdGxlPVwi6YCJ5oup5YiG57G7XCIgW256RGVzY3JpcHRpb25dPVwidHlwZVNlbGVjdFRwbFwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdHlwZVNlbGVjdFRwbD5cbiAgICAgICAgICAgIDxuei1zZWxlY3RcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFR5cGVzXCJcbiAgICAgICAgICAgICAgbnpNb2RlPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlXCJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25UeXBlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBuelBsYWNlSG9sZGVyPVwi6K+36YCJ5oup5YiG57G7XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG56LW9wdGlvbiBbbnpWYWx1ZV09XCJpdGVtLnR5cGVcIiBbbnpMYWJlbF09XCJpdGVtLnR5cGVDXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdHlwZXNEYXRhXCI+PC9uei1vcHRpb24+XG4gICAgICAgICAgICA8L256LXNlbGVjdD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L256LXN0ZXA+XG4gICAgICAgIDxuei1zdGVwIG56VGl0bGU9XCLmkJzntKLpgInmi6nnm67lvZVcIiBbbnpEZXNjcmlwdGlvbl09XCJjYXRlZ29yeVNlbGVjdFRwbFwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2F0ZWdvcnlTZWxlY3RUcGw+XG4gICAgICAgICAgICA8bnotdHJlZS1zZWxlY3RcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDYXRlZ29yaWVzXCJcbiAgICAgICAgICAgICAgW256Tm9kZXNdPVwiY2F0ZWdvcmllc0RhdGFcIlxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNhdGVnb3J5Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBuekNoZWNrU3RyaWN0bHlcbiAgICAgICAgICAgICAgbnpTaG93U2VhcmNoXG4gICAgICAgICAgICAgIG56Q2hlY2thYmxlXG4gICAgICAgICAgICAgIG56UGxhY2VIb2xkZXI9XCLor7fpgInmi6nnm67lvZVcIlxuICAgICAgICAgICAgPjwvbnotdHJlZS1zZWxlY3Q+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uei1zdGVwPlxuICAgICAgICA8bnotc3RlcCBuelRpdGxlPVwi6YCJ5oup5qCH562+XCIgW256RGVzY3JpcHRpb25dPVwidGFnU2VsZWN0VHBsXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICN0YWdTZWxlY3RUcGw+XG4gICAgICAgICAgICA8bnotc2VsZWN0XG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRUYWdzXCJcbiAgICAgICAgICAgICAgbnpNb2RlPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgICBuelBsYWNlSG9sZGVyPVwi6K+36YCJ5oup5qCH562+XCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVGFnQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bnotb3B0aW9uLWdyb3VwIFtuekxhYmVsXT1cIml0ZW0ubmFtZVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIHRhZ3NEYXRhXCI+XG4gICAgICAgICAgICAgICAgPG56LW9wdGlvblxuICAgICAgICAgICAgICAgICAgW256VmFsdWVdPVwiY2hpbGQuaUNvZGVcIlxuICAgICAgICAgICAgICAgICAgW256TGFiZWxdPVwiY2hpbGQubmFtZVwiXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hpbGQgb2YgaXRlbS5jaGlsZHJlblwiXG4gICAgICAgICAgICAgICAgPjwvbnotb3B0aW9uPlxuICAgICAgICAgICAgICA8L256LW9wdGlvbi1ncm91cD5cbiAgICAgICAgICAgIDwvbnotc2VsZWN0PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbnotc3RlcD5cbiAgICAgIDwvbnotc3RlcHM+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -96,7 +96,7 @@ export class ChatMessagesComponent {
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
ChatMessagesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ChatMessagesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
99
|
-
ChatMessagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ChatMessagesComponent, selector: "ngx-chat-messages", inputs: { messages: "messages" }, outputs: { regenerateAnswer: "regenerateAnswer" }, viewQueries: [{ propertyName: "messagesContainer", first: true, predicate: ["messagesContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- chat-messages.component.html -->\n<script src=\"chat-messages.component.ts\"></script>\n<div class=\"messages-container\" #messagesContainer>\n <div class=\"message-list\" [style.--input-height.px]=\"inputHeight\">\n <div class=\"question message-wrapper\" *ngFor=\"let msg of messages; let i = index\">\n <!-- Q -->\n <div class=\"bubble-wrapper user-msg\">\n <div class=\"message-bubble\">\n <div class=\"message-content message-human\">\n {{ msg.question }}\n </div>\n </div>\n </div>\n <!-- A -->\n <div class=\"bubble-wrapper ai-msg\" *ngIf=\"msg.answers[msg.answerIndex]\">\n <div\n class=\"bubble-loading\"\n *ngIf=\"!msg.answers[msg.answerIndex].think && !msg.answers[msg.answerIndex].content\"\n >\n <div class=\"bubble-loading-dot\" *ngFor=\"let item of [1, 2, 3]\"></div>\n </div>\n <div class=\"message-bubble\">\n <!-- \u601D\u8003 -->\n <div class=\"message-think\" *ngIf=\"msg.answers[msg.answerIndex].think\">\n <div\n class=\"message-think-header\"\n (click)=\"msg.answers[msg.answerIndex].thinkExpand = !msg.answers[msg.answerIndex].thinkExpand\"\n >\n <div class=\"message-think-header-title\">\n <img src=\"/assets/images/card/think-finish.png\" />\n {{ msg.answers[msg.answerIndex].content ? '\u5DF2\u5B8C\u6210\u601D\u8003' : '\u6B63\u5728\u601D\u8003\u4E2D...' }}\n </div>\n <div class=\"arrow-icon\" [class.rotated]=\"msg.answers[msg.answerIndex].thinkExpand\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n </div>\n <div\n class=\"message-content message-assistant message-markdown\"\n [@expandCollapse]=\"msg.answers[msg.answerIndex].thinkExpand ? 'expanded' : 'collapsed'\"\n [innerHTML]=\"msg.answers[msg.answerIndex].think | markdown\"\n [hidden]=\"!msg.answers[msg.answerIndex].thinkExpand\"\n ></div>\n </div>\n <!-- \u56DE\u7B54 -->\n <div\n class=\"message-content message-assistant message-markdown\"\n [innerHTML]=\"msg.answers[msg.answerIndex].content | markdown\"\n ></div>\n <!-- \u56DE\u7B54\u5DE5\u5177\u680F -->\n <div class=\"assistant-tools\" *ngIf=\"msg.answers[msg.answerIndex].content\">\n <ngx-simple-pagination\n [current]=\"msg.answerIndex + 1\"\n [total]=\"msg.answers.length\"\n (pageChange)=\"onPageChange($event, msg)\"\n *ngIf=\"msg.answers.length > 1\"\n ></ngx-simple-pagination>\n <img\n src=\"assets/images/card/copy.png\"\n alt=\"\u590D\u5236\"\n (click)=\"copyContent(msg.answers[msg.answerIndex].content)\"\n />\n <img\n src=\"assets/images/card/refresh.png\"\n alt=\"\u91CD\u65B0\u751F\u6210\"\n (click)=\"regenerate(msg)\"\n *ngIf=\"i === messages.length - 1\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <!-- <div style=\"padding-bottom: 160px\"></div> -->\n </div>\n</div>\n", styles: [":host{width:100%;height:100%}.messages-container{width:100%;height:100%;overflow-y:auto;scrollbar-gutter:stable both-edges}.message-list{height:auto;padding-top:16px;padding-bottom:var(--input-height, 210px);display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:16px}.message-wrapper{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;margin-bottom:16px;max-width:800px;min-width:350px}.bubble-wrapper{width:100%;display:flex;flex-direction:column;justify-content:center}.bubble-wrapper.user-msg{align-items:end}.bubble-wrapper.ai-msg{align-items:start}.bubble-loading{display:flex;align-items:center;justify-content:flex-start;height:24px;margin-top:4px;margin-bottom:16px}.bubble-loading-dot{width:6px;height:6px;border-radius:50%;margin-right:6px;background-color:#bbb;animation:.9s linear infinite loading-dot}.bubble-loading-dot:first-child{animation-delay:0s}.bubble-loading-dot:nth-child(2){animation-delay:.1s}.bubble-loading-dot:nth-child(3){animation-delay:.2s}@keyframes loading-dot{0%,to{opacity:.3}33%,66%{opacity:1}}.message-bubble{width:100%;display:flex;align-items:flex-end;flex-direction:column;gap:8px}.message-bubble .message-content.message-human{padding:8px 16px;margin-left:auto;border-radius:12px;background:#E4EDFD;color:#004ad3}.message-bubble .message-content.message-assistant{padding:0;width:100%;background:#fff}.message-bubble .message-markdown{background:#fff}.message-bubble .message-think{width:100%;padding:12px;background:#FFFFFF;border-radius:10px;border:1px solid #D9DADB;font-size:14px}.message-bubble .message-think-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;color:#000;font-size:16px}.message-bubble .message-think-header-title{display:flex;align-items:center;gap:10px}.message-bubble .message-think-header-title img{width:14px;height:14px}.message-bubble .message-think .message-content{padding-top:12px;color:#61666b}.message-bubble .arrow-icon{transition:transform .3s ease}.message-bubble .arrow-icon.rotated{transform:rotate(0)}.message-bubble .arrow-icon:not(.rotated){transform:rotate(-90deg)}.assistant-tools{width:100%;display:flex;align-items:center;gap:24px}.assistant-tools img{width:14px;height:14px;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.SimplePaginationComponent, selector: "ngx-simple-pagination", inputs: ["current", "total"], outputs: ["pageChange"] }, { kind: "pipe", type: i3.MarkdownPipe, name: "markdown" }], animations: [
|
|
99
|
+
ChatMessagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ChatMessagesComponent, selector: "ngx-chat-messages", inputs: { messages: "messages" }, outputs: { regenerateAnswer: "regenerateAnswer" }, viewQueries: [{ propertyName: "messagesContainer", first: true, predicate: ["messagesContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- chat-messages.component.html -->\n<script src=\"chat-messages.component.ts\"></script>\n<div class=\"messages-container\" #messagesContainer>\n <div class=\"message-list\" [style.--input-height.px]=\"inputHeight\">\n <div class=\"question message-wrapper\" *ngFor=\"let msg of messages; let i = index\">\n <!-- Q -->\n <div class=\"bubble-wrapper user-msg\">\n <div class=\"message-bubble\">\n <div class=\"message-content message-human\">\n {{ msg.question }}\n </div>\n </div>\n </div>\n <!-- A -->\n <div class=\"bubble-wrapper ai-msg\" *ngIf=\"msg.answers[msg.answerIndex]\">\n <div\n class=\"bubble-loading\"\n *ngIf=\"!msg.answers[msg.answerIndex].think && !msg.answers[msg.answerIndex].content\"\n >\n <div class=\"bubble-loading-dot\" *ngFor=\"let item of [1, 2, 3]\"></div>\n </div>\n <div class=\"message-bubble\">\n <!-- \u601D\u8003 -->\n <div class=\"message-think\" *ngIf=\"msg.answers[msg.answerIndex].think\">\n <div\n class=\"message-think-header\"\n (click)=\"msg.answers[msg.answerIndex].thinkExpand = !msg.answers[msg.answerIndex].thinkExpand\"\n >\n <div class=\"message-think-header-title\">\n <img src=\"/assets/images/card/think-finish.png\" />\n {{ msg.answers[msg.answerIndex].content ? '\u5DF2\u5B8C\u6210\u601D\u8003' : '\u6B63\u5728\u601D\u8003\u4E2D...' }}\n </div>\n <div class=\"arrow-icon\" [class.rotated]=\"msg.answers[msg.answerIndex].thinkExpand\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n </div>\n <div\n class=\"message-content message-assistant message-markdown\"\n [@expandCollapse]=\"msg.answers[msg.answerIndex].thinkExpand ? 'expanded' : 'collapsed'\"\n [innerHTML]=\"msg.answers[msg.answerIndex].think | markdown\"\n [hidden]=\"!msg.answers[msg.answerIndex].thinkExpand\"\n ></div>\n </div>\n <!-- \u56DE\u7B54 -->\n <div\n class=\"message-content message-assistant message-markdown\"\n [innerHTML]=\"msg.answers[msg.answerIndex].content | markdown\"\n ></div>\n <!-- \u56DE\u7B54\u5DE5\u5177\u680F -->\n <div class=\"assistant-tools\" *ngIf=\"msg.answers[msg.answerIndex].content\">\n <ngx-simple-pagination\n [current]=\"msg.answerIndex + 1\"\n [total]=\"msg.answers.length\"\n (pageChange)=\"onPageChange($event, msg)\"\n *ngIf=\"msg.answers.length > 1\"\n ></ngx-simple-pagination>\n <img\n src=\"assets/images/card/copy.png\"\n alt=\"\u590D\u5236\"\n (click)=\"copyContent(msg.answers[msg.answerIndex].content)\"\n />\n <img\n src=\"assets/images/card/refresh.png\"\n alt=\"\u91CD\u65B0\u751F\u6210\"\n (click)=\"regenerate(msg)\"\n *ngIf=\"i === messages.length - 1\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <!-- <div style=\"padding-bottom: 160px\"></div> -->\n </div>\n</div>\n", styles: [":host{width:100%;height:100%}.messages-container{width:100%;height:100%;overflow-y:auto;scrollbar-gutter:stable both-edges;container-type:inline-size;container-name:chat-container}.message-list{height:auto;padding-top:16px;padding-bottom:var(--input-height, 210px);display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:16px}.message-wrapper{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;margin-bottom:16px;max-width:800px;min-width:350px}@container chat-container (max-width: 1000px){.message-wrapper{max-width:90%}}.bubble-wrapper{width:100%;display:flex;flex-direction:column;justify-content:center}.bubble-wrapper.user-msg{align-items:end}.bubble-wrapper.ai-msg{align-items:start}.bubble-loading{display:flex;align-items:center;justify-content:flex-start;height:24px;margin-top:4px;margin-bottom:16px}.bubble-loading-dot{width:6px;height:6px;border-radius:50%;margin-right:6px;background-color:#bbb;animation:.9s linear infinite loading-dot}.bubble-loading-dot:first-child{animation-delay:0s}.bubble-loading-dot:nth-child(2){animation-delay:.1s}.bubble-loading-dot:nth-child(3){animation-delay:.2s}@keyframes loading-dot{0%,to{opacity:.3}33%,66%{opacity:1}}.message-bubble{width:100%;display:flex;align-items:flex-end;flex-direction:column;gap:8px}.message-bubble .message-content.message-human{padding:8px 16px;margin-left:auto;border-radius:12px;background:#E4EDFD;color:#004ad3}.message-bubble .message-content.message-assistant{padding:0;width:100%;background:#fff}.message-bubble .message-markdown{background:#fff}.message-bubble .message-think{width:100%;padding:12px;background:#FFFFFF;border-radius:10px;border:1px solid #D9DADB;font-size:14px}.message-bubble .message-think-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;color:#000;font-size:16px}.message-bubble .message-think-header-title{display:flex;align-items:center;gap:10px}.message-bubble .message-think-header-title img{width:14px;height:14px}.message-bubble .message-think .message-content{padding-top:12px;color:#61666b}.message-bubble .arrow-icon{transition:transform .3s ease}.message-bubble .arrow-icon.rotated{transform:rotate(0)}.message-bubble .arrow-icon:not(.rotated){transform:rotate(-90deg)}.assistant-tools{width:100%;display:flex;align-items:center;gap:24px}.assistant-tools img{width:14px;height:14px;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.SimplePaginationComponent, selector: "ngx-simple-pagination", inputs: ["current", "total"], outputs: ["pageChange"] }, { kind: "pipe", type: i3.MarkdownPipe, name: "markdown" }], animations: [
|
|
100
100
|
trigger('expandCollapse', [
|
|
101
101
|
state('collapsed', style({ height: '0px', opacity: 0 })),
|
|
102
102
|
state('expanded', style({ height: '*', opacity: 1 })),
|
|
@@ -111,7 +111,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
111
111
|
state('expanded', style({ height: '*', opacity: 1 })),
|
|
112
112
|
transition('expanded <=> collapsed', animate('300ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
113
113
|
]),
|
|
114
|
-
], template: "<!-- chat-messages.component.html -->\n<script src=\"chat-messages.component.ts\"></script>\n<div class=\"messages-container\" #messagesContainer>\n <div class=\"message-list\" [style.--input-height.px]=\"inputHeight\">\n <div class=\"question message-wrapper\" *ngFor=\"let msg of messages; let i = index\">\n <!-- Q -->\n <div class=\"bubble-wrapper user-msg\">\n <div class=\"message-bubble\">\n <div class=\"message-content message-human\">\n {{ msg.question }}\n </div>\n </div>\n </div>\n <!-- A -->\n <div class=\"bubble-wrapper ai-msg\" *ngIf=\"msg.answers[msg.answerIndex]\">\n <div\n class=\"bubble-loading\"\n *ngIf=\"!msg.answers[msg.answerIndex].think && !msg.answers[msg.answerIndex].content\"\n >\n <div class=\"bubble-loading-dot\" *ngFor=\"let item of [1, 2, 3]\"></div>\n </div>\n <div class=\"message-bubble\">\n <!-- \u601D\u8003 -->\n <div class=\"message-think\" *ngIf=\"msg.answers[msg.answerIndex].think\">\n <div\n class=\"message-think-header\"\n (click)=\"msg.answers[msg.answerIndex].thinkExpand = !msg.answers[msg.answerIndex].thinkExpand\"\n >\n <div class=\"message-think-header-title\">\n <img src=\"/assets/images/card/think-finish.png\" />\n {{ msg.answers[msg.answerIndex].content ? '\u5DF2\u5B8C\u6210\u601D\u8003' : '\u6B63\u5728\u601D\u8003\u4E2D...' }}\n </div>\n <div class=\"arrow-icon\" [class.rotated]=\"msg.answers[msg.answerIndex].thinkExpand\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n </div>\n <div\n class=\"message-content message-assistant message-markdown\"\n [@expandCollapse]=\"msg.answers[msg.answerIndex].thinkExpand ? 'expanded' : 'collapsed'\"\n [innerHTML]=\"msg.answers[msg.answerIndex].think | markdown\"\n [hidden]=\"!msg.answers[msg.answerIndex].thinkExpand\"\n ></div>\n </div>\n <!-- \u56DE\u7B54 -->\n <div\n class=\"message-content message-assistant message-markdown\"\n [innerHTML]=\"msg.answers[msg.answerIndex].content | markdown\"\n ></div>\n <!-- \u56DE\u7B54\u5DE5\u5177\u680F -->\n <div class=\"assistant-tools\" *ngIf=\"msg.answers[msg.answerIndex].content\">\n <ngx-simple-pagination\n [current]=\"msg.answerIndex + 1\"\n [total]=\"msg.answers.length\"\n (pageChange)=\"onPageChange($event, msg)\"\n *ngIf=\"msg.answers.length > 1\"\n ></ngx-simple-pagination>\n <img\n src=\"assets/images/card/copy.png\"\n alt=\"\u590D\u5236\"\n (click)=\"copyContent(msg.answers[msg.answerIndex].content)\"\n />\n <img\n src=\"assets/images/card/refresh.png\"\n alt=\"\u91CD\u65B0\u751F\u6210\"\n (click)=\"regenerate(msg)\"\n *ngIf=\"i === messages.length - 1\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <!-- <div style=\"padding-bottom: 160px\"></div> -->\n </div>\n</div>\n", styles: [":host{width:100%;height:100%}.messages-container{width:100%;height:100%;overflow-y:auto;scrollbar-gutter:stable both-edges}.message-list{height:auto;padding-top:16px;padding-bottom:var(--input-height, 210px);display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:16px}.message-wrapper{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;margin-bottom:16px;max-width:800px;min-width:350px}.bubble-wrapper{width:100%;display:flex;flex-direction:column;justify-content:center}.bubble-wrapper.user-msg{align-items:end}.bubble-wrapper.ai-msg{align-items:start}.bubble-loading{display:flex;align-items:center;justify-content:flex-start;height:24px;margin-top:4px;margin-bottom:16px}.bubble-loading-dot{width:6px;height:6px;border-radius:50%;margin-right:6px;background-color:#bbb;animation:.9s linear infinite loading-dot}.bubble-loading-dot:first-child{animation-delay:0s}.bubble-loading-dot:nth-child(2){animation-delay:.1s}.bubble-loading-dot:nth-child(3){animation-delay:.2s}@keyframes loading-dot{0%,to{opacity:.3}33%,66%{opacity:1}}.message-bubble{width:100%;display:flex;align-items:flex-end;flex-direction:column;gap:8px}.message-bubble .message-content.message-human{padding:8px 16px;margin-left:auto;border-radius:12px;background:#E4EDFD;color:#004ad3}.message-bubble .message-content.message-assistant{padding:0;width:100%;background:#fff}.message-bubble .message-markdown{background:#fff}.message-bubble .message-think{width:100%;padding:12px;background:#FFFFFF;border-radius:10px;border:1px solid #D9DADB;font-size:14px}.message-bubble .message-think-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;color:#000;font-size:16px}.message-bubble .message-think-header-title{display:flex;align-items:center;gap:10px}.message-bubble .message-think-header-title img{width:14px;height:14px}.message-bubble .message-think .message-content{padding-top:12px;color:#61666b}.message-bubble .arrow-icon{transition:transform .3s ease}.message-bubble .arrow-icon.rotated{transform:rotate(0)}.message-bubble .arrow-icon:not(.rotated){transform:rotate(-90deg)}.assistant-tools{width:100%;display:flex;align-items:center;gap:24px}.assistant-tools img{width:14px;height:14px;cursor:pointer}\n"] }]
|
|
114
|
+
], template: "<!-- chat-messages.component.html -->\n<script src=\"chat-messages.component.ts\"></script>\n<div class=\"messages-container\" #messagesContainer>\n <div class=\"message-list\" [style.--input-height.px]=\"inputHeight\">\n <div class=\"question message-wrapper\" *ngFor=\"let msg of messages; let i = index\">\n <!-- Q -->\n <div class=\"bubble-wrapper user-msg\">\n <div class=\"message-bubble\">\n <div class=\"message-content message-human\">\n {{ msg.question }}\n </div>\n </div>\n </div>\n <!-- A -->\n <div class=\"bubble-wrapper ai-msg\" *ngIf=\"msg.answers[msg.answerIndex]\">\n <div\n class=\"bubble-loading\"\n *ngIf=\"!msg.answers[msg.answerIndex].think && !msg.answers[msg.answerIndex].content\"\n >\n <div class=\"bubble-loading-dot\" *ngFor=\"let item of [1, 2, 3]\"></div>\n </div>\n <div class=\"message-bubble\">\n <!-- \u601D\u8003 -->\n <div class=\"message-think\" *ngIf=\"msg.answers[msg.answerIndex].think\">\n <div\n class=\"message-think-header\"\n (click)=\"msg.answers[msg.answerIndex].thinkExpand = !msg.answers[msg.answerIndex].thinkExpand\"\n >\n <div class=\"message-think-header-title\">\n <img src=\"/assets/images/card/think-finish.png\" />\n {{ msg.answers[msg.answerIndex].content ? '\u5DF2\u5B8C\u6210\u601D\u8003' : '\u6B63\u5728\u601D\u8003\u4E2D...' }}\n </div>\n <div class=\"arrow-icon\" [class.rotated]=\"msg.answers[msg.answerIndex].thinkExpand\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </div>\n </div>\n <div\n class=\"message-content message-assistant message-markdown\"\n [@expandCollapse]=\"msg.answers[msg.answerIndex].thinkExpand ? 'expanded' : 'collapsed'\"\n [innerHTML]=\"msg.answers[msg.answerIndex].think | markdown\"\n [hidden]=\"!msg.answers[msg.answerIndex].thinkExpand\"\n ></div>\n </div>\n <!-- \u56DE\u7B54 -->\n <div\n class=\"message-content message-assistant message-markdown\"\n [innerHTML]=\"msg.answers[msg.answerIndex].content | markdown\"\n ></div>\n <!-- \u56DE\u7B54\u5DE5\u5177\u680F -->\n <div class=\"assistant-tools\" *ngIf=\"msg.answers[msg.answerIndex].content\">\n <ngx-simple-pagination\n [current]=\"msg.answerIndex + 1\"\n [total]=\"msg.answers.length\"\n (pageChange)=\"onPageChange($event, msg)\"\n *ngIf=\"msg.answers.length > 1\"\n ></ngx-simple-pagination>\n <img\n src=\"assets/images/card/copy.png\"\n alt=\"\u590D\u5236\"\n (click)=\"copyContent(msg.answers[msg.answerIndex].content)\"\n />\n <img\n src=\"assets/images/card/refresh.png\"\n alt=\"\u91CD\u65B0\u751F\u6210\"\n (click)=\"regenerate(msg)\"\n *ngIf=\"i === messages.length - 1\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <!-- <div style=\"padding-bottom: 160px\"></div> -->\n </div>\n</div>\n", styles: [":host{width:100%;height:100%}.messages-container{width:100%;height:100%;overflow-y:auto;scrollbar-gutter:stable both-edges;container-type:inline-size;container-name:chat-container}.message-list{height:auto;padding-top:16px;padding-bottom:var(--input-height, 210px);display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:16px}.message-wrapper{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;margin-bottom:16px;max-width:800px;min-width:350px}@container chat-container (max-width: 1000px){.message-wrapper{max-width:90%}}.bubble-wrapper{width:100%;display:flex;flex-direction:column;justify-content:center}.bubble-wrapper.user-msg{align-items:end}.bubble-wrapper.ai-msg{align-items:start}.bubble-loading{display:flex;align-items:center;justify-content:flex-start;height:24px;margin-top:4px;margin-bottom:16px}.bubble-loading-dot{width:6px;height:6px;border-radius:50%;margin-right:6px;background-color:#bbb;animation:.9s linear infinite loading-dot}.bubble-loading-dot:first-child{animation-delay:0s}.bubble-loading-dot:nth-child(2){animation-delay:.1s}.bubble-loading-dot:nth-child(3){animation-delay:.2s}@keyframes loading-dot{0%,to{opacity:.3}33%,66%{opacity:1}}.message-bubble{width:100%;display:flex;align-items:flex-end;flex-direction:column;gap:8px}.message-bubble .message-content.message-human{padding:8px 16px;margin-left:auto;border-radius:12px;background:#E4EDFD;color:#004ad3}.message-bubble .message-content.message-assistant{padding:0;width:100%;background:#fff}.message-bubble .message-markdown{background:#fff}.message-bubble .message-think{width:100%;padding:12px;background:#FFFFFF;border-radius:10px;border:1px solid #D9DADB;font-size:14px}.message-bubble .message-think-header{display:flex;align-items:center;justify-content:space-between;cursor:pointer;color:#000;font-size:16px}.message-bubble .message-think-header-title{display:flex;align-items:center;gap:10px}.message-bubble .message-think-header-title img{width:14px;height:14px}.message-bubble .message-think .message-content{padding-top:12px;color:#61666b}.message-bubble .arrow-icon{transition:transform .3s ease}.message-bubble .arrow-icon.rotated{transform:rotate(0)}.message-bubble .arrow-icon:not(.rotated){transform:rotate(-90deg)}.assistant-tools{width:100%;display:flex;align-items:center;gap:24px}.assistant-tools img{width:14px;height:14px;cursor:pointer}\n"] }]
|
|
115
115
|
}], propDecorators: { messages: [{
|
|
116
116
|
type: Input
|
|
117
117
|
}], messagesContainer: [{
|
|
@@ -120,4 +120,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
120
120
|
}], regenerateAnswer: [{
|
|
121
121
|
type: Output
|
|
122
122
|
}] } });
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZ2VudC9jaGF0L2NoYXQtbWVzc2FnZXMvY2hhdC1tZXNzYWdlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZ2VudC9jaGF0L2NoYXQtbWVzc2FnZXMvY2hhdC1tZXNzYWdlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2QkFBNkI7QUFDN0IsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUdULE1BQU0sRUFFTixNQUFNLEVBQ04sWUFBWSxHQUdiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFjakYsTUFBTSxPQUFPLHFCQUFxQjtJQVpsQztRQWFXLGFBQVEsR0FBYyxFQUFFLENBQUM7UUFFbEM7O1dBRUc7UUFDTyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRWpELE9BQUUsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNuQyxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLGNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakMsUUFBRyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXZD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LFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNyRCxVQUFVLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7eUJBQ3RGLENBQUM7cUJBQ0g7OEJBR1EsUUFBUTtzQkFBaEIsS0FBSztnQkFDMEIsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFJcEIsZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gY2hhdC1tZXNzYWdlcy5jb21wb25lbnQudHNcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgaW5qZWN0LFxuICBBZnRlclZpZXdJbml0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuLi9tb2RlbHMvbWVzc2FnZS5tb2RlbCc7XG5pbXBvcnQgeyBNYXJrZG93blN0cmVhbVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tYXJrZG93bi1zdHJlYW0uc2VydmljZSc7XG5pbXBvcnQgeyBTc2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3NlLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWFya2VkIH0gZnJvbSAnbWFya2VkJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE56TWVzc2FnZVNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL21lc3NhZ2UnO1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1jaGF0LW1lc3NhZ2VzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtbWVzc2FnZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0LW1lc3NhZ2VzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdleHBhbmRDb2xsYXBzZScsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQnLCBzdHlsZSh7IGhlaWdodDogJzBweCcsIG9wYWNpdHk6IDAgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgb3BhY2l0eTogMSB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMzAwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZXNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBtZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gIEBWaWV3Q2hpbGQoJ21lc3NhZ2VzQ29udGFpbmVyJykgbWVzc2FnZXNDb250YWluZXIhOiBFbGVtZW50UmVmO1xuICAvKipcbiAgICog6YeN5paw55Sf5oiQ5Zue562UXG4gICAqL1xuICBAT3V0cHV0KCkgcmVnZW5lcmF0ZUFuc3dlciA9IG5ldyBFdmVudEVtaXR0ZXI8TWVzc2FnZT4oKTtcblxuICBwcml2YXRlIG1kID0gaW5qZWN0KE1hcmtkb3duU3RyZWFtU2VydmljZSk7XG4gIHByaXZhdGUgc3NlU2VydmljZSA9IGluamVjdChTc2VTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBzYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcbiAgcHJpdmF0ZSBtc2cgPSBpbmplY3QoTnpNZXNzYWdlU2VydmljZSk7XG5cbiAgaXNMb2FkaW5nID0gZmFsc2U7XG4gIGlucHV0SGVpZ2h0ID0gMTgwO1xuICByZW5kZXJlZEh0bWw6IFNhZmVIdG1sID0gJyc7XG4gIHByaXZhdGUgYWNjdW11bGF0ZWRNYXJrZG93biA9ICcnO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNzZVNlcnZpY2UubG9hZGluZyQuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHN0YXR1cztcbiAgICB9KTtcbiAgICB0aGlzLnNzZVNlcnZpY2UuZGVsdGEkLnN1YnNjcmliZShkZWx0YSA9PiB7XG4gICAgICBpZiAoIWRlbHRhKSByZXR1cm47XG5cbiAgICAgIHRoaXMuYWNjdW11bGF0ZWRNYXJrZG93biArPSBkZWx0YTtcbiAgICAgIHRoaXMucmVuZGVyZWRIdG1sID0gdGhpcy5tZC5yZW5kZXJJbmNyZW1lbnRhbCh0aGlzLmFjY3VtdWxhdGVkTWFya2Rvd24pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIC8vIOato+WcqOWbnuetlOS4rVxuICAgIGlmICh0aGlzLmlzTG9hZGluZykge1xuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snbWVzc2FnZXMnXSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgIH0sIDUwKTtcbiAgICB9XG4gIH1cblxuICAvLyDmu5rliqjliLDlupXpg6hcbiAgc2Nyb2xsVG9Cb3R0b20oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VzQ29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZXNDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLm1lc3NhZ2VzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgY29weUNvbnRlbnQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgd2luZG93LmlzU2VjdXJlQ29udGV4dCkge1xuICAgICAgLy8g5L2/55So546w5LujIENsaXBib2FyZCBBUElcbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLm1zZy5zdWNjZXNzKCflpI3liLbmiJDlip8nKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShudW06IG51bWJlciwgbXNnOiBNZXNzYWdlKTogdm9pZCB7XG4gICAgbXNnLmFuc3dlckluZGV4ID0gbnVtIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiDph43mlrDnlJ/miJDlpJrkuKrlm57nrZRcbiAgICovXG4gIHJlZ2VuZXJhdGUobXNnOiBNZXNzYWdlKTogdm9pZCB7XG4gICAgLy8gY29uc3QgcXVlc3Rpb24gPSB0aGlzLm1lc3NhZ2VzW2luZGV4IC0gMV0ubWVzc2FnZTtcbiAgICAvLyDph43mlrDnlJ/miJDkvb/nlKjlupXpg6jmnIDmlrDnmoTphY3nva7vvIzph43mlrDosIPnlKhzZW5kTWVzc2FnZVxuICAgIHRoaXMucmVnZW5lcmF0ZUFuc3dlci5lbWl0KG1zZyk7XG4gIH1cblxuICAvLyDmiorlrozmlbTnmoQgbWFya2Rvd24g5Z2X5riy5p+T77yM5Ymp5LiL55qE55WZ57uZ5omT5a2X5Yy6XG4gIHByaXZhdGUgcmVuZGVyQ29tcGxldGVCbG9ja3MobWFya2Rvd246IHN0cmluZyk6IHsgcmVuZGVyZWQ6IHN0cmluZzsgcmVtYWluaW5nOiBzdHJpbmcgfSB7XG4gICAgLy8g5om+5Yiw5pyA5ZCO5LiA5Liq5o2i6KGM56ym5LmL5YmN55qE6YO95riy5p+T77yI6Laz5aSf5Lid5ruR77yJXG4gICAgY29uc3QgbGluZXMgPSBtYXJrZG93bi5zcGxpdCgnXFxuJyk7XG4gICAgbGV0IGJyZWFrUG9pbnQgPSBsaW5lcy5sZW5ndGg7XG5cbiAgICAvLyDku47lkI7lvoDliY3mib7vvIzkv53nlZnmnKrlrozmiJDnmoTku6PnoIHlnZcv6KGo5qC8L+WIl+ihqFxuICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgaWYgKGxpbmUudHJpbSgpID09PSAnJyB8fCBsaW5lLnN0YXJ0c1dpdGgoJ2BgYCcpIHx8IGxpbmUuc3RhcnRzV2l0aCgnfCcpIHx8IGxpbmUuc3RhcnRzV2l0aCgnLSAnKSkge1xuICAgICAgICBicmVha1BvaW50ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVQYXJ0ID0gbGluZXMuc2xpY2UoMCwgYnJlYWtQb2ludCkuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVtYWluaW5nUGFydCA9IGxpbmVzLnNsaWNlKGJyZWFrUG9pbnQpLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3QgaHRtbCA9IHRoaXMubWQucmVuZGVySW5jcmVtZW50YWwoY29tcGxldGVQYXJ0KTtcbiAgICAvLyBjb25zdCBodG1sID0gbWFya2VkKGNvbXBsZXRlUGFydCwgeyBicmVha3M6IHRydWUsIGdmbTogdHJ1ZSB9KTtcbiAgICByZXR1cm4geyByZW5kZXJlZDogaHRtbCBhcyBzdHJpbmcsIHJlbWFpbmluZzogcmVtYWluaW5nUGFydCB9O1xuICB9XG59XG4iLCI8IS0tIGNoYXQtbWVzc2FnZXMuY29tcG9uZW50Lmh0bWwgLS0+XG48c2NyaXB0IHNyYz1cImNoYXQtbWVzc2FnZXMuY29tcG9uZW50LnRzXCI+PC9zY3JpcHQ+XG48ZGl2IGNsYXNzPVwibWVzc2FnZXMtY29udGFpbmVyXCIgI21lc3NhZ2VzQ29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1saXN0XCIgW3N0eWxlLi0taW5wdXQtaGVpZ2h0LnB4XT1cImlucHV0SGVpZ2h0XCI+XG4gICAgPGRpdiBjbGFzcz1cInF1ZXN0aW9uIG1lc3NhZ2Utd3JhcHBlclwiICpuZ0Zvcj1cImxldCBtc2cgb2YgbWVzc2FnZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDwhLS0gUSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJidWJibGUtd3JhcHBlciB1c2VyLW1zZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1idWJibGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1jb250ZW50IG1lc3NhZ2UtaHVtYW5cIj5cbiAgICAgICAgICAgIHt7IG1zZy5xdWVzdGlvbiB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBBIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImJ1YmJsZS13cmFwcGVyIGFpLW1zZ1wiICpuZ0lmPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJidWJibGUtbG9hZGluZ1wiXG4gICAgICAgICAgKm5nSWY9XCIhbXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGluayAmJiAhbXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS5jb250ZW50XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJidWJibGUtbG9hZGluZy1kb3RcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBbMSwgMiwgM11cIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWJ1YmJsZVwiPlxuICAgICAgICAgIDwhLS0g5oCd6ICDIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLXRoaW5rXCIgKm5nSWY9XCJtc2cuYW5zd2Vyc1ttc2cuYW5zd2VySW5kZXhdLnRoaW5rXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwibWVzc2FnZS10aGluay1oZWFkZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGlua0V4cGFuZCA9ICFtc2cuYW5zd2Vyc1ttc2cuYW5zd2VySW5kZXhdLnRoaW5rRXhwYW5kXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtdGhpbmstaGVhZGVyLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ltYWdlcy9jYXJkL3RoaW5rLWZpbmlzaC5wbmdcIiAvPlxuICAgICAgICAgICAgICAgIHt7IG1zZy5hbnN3ZXJzW21zZy5hbnN3ZXJJbmRleF0uY29udGVudCA/ICflt7LlrozmiJDmgJ3ogIMnIDogJ+ato+WcqOaAneiAg+S4rS4uLicgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdy1pY29uXCIgW2NsYXNzLnJvdGF0ZWRdPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGlua0V4cGFuZFwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiPlxuICAgICAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjYgOSAxMiAxNSAxOCA5XCI+PC9wb2x5bGluZT5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJtZXNzYWdlLWNvbnRlbnQgbWVzc2FnZS1hc3Npc3RhbnQgbWVzc2FnZS1tYXJrZG93blwiXG4gICAgICAgICAgICAgIFtAZXhwYW5kQ29sbGFwc2VdPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGlua0V4cGFuZCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGluayB8IG1hcmtkb3duXCJcbiAgICAgICAgICAgICAgW2hpZGRlbl09XCIhbXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGlua0V4cGFuZFwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSDlm57nrZQgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtZXNzYWdlLWNvbnRlbnQgbWVzc2FnZS1hc3Npc3RhbnQgbWVzc2FnZS1tYXJrZG93blwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm1zZy5hbnN3ZXJzW21zZy5hbnN3ZXJJbmRleF0uY29udGVudCB8IG1hcmtkb3duXCJcbiAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgPCEtLSDlm57nrZTlt6XlhbfmoI8gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFzc2lzdGFudC10b29sc1wiICpuZ0lmPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS5jb250ZW50XCI+XG4gICAgICAgICAgICA8bmd4LXNpbXBsZS1wYWdpbmF0aW9uXG4gICAgICAgICAgICAgIFtjdXJyZW50XT1cIm1zZy5hbnN3ZXJJbmRleCArIDFcIlxuICAgICAgICAgICAgICBbdG90YWxdPVwibXNnLmFuc3dlcnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudCwgbXNnKVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwibXNnLmFuc3dlcnMubGVuZ3RoID4gMVwiXG4gICAgICAgICAgICA+PC9uZ3gtc2ltcGxlLXBhZ2luYXRpb24+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pbWFnZXMvY2FyZC9jb3B5LnBuZ1wiXG4gICAgICAgICAgICAgIGFsdD1cIuWkjeWItlwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjb3B5Q29udGVudChtc2cuYW5zd2Vyc1ttc2cuYW5zd2VySW5kZXhdLmNvbnRlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pbWFnZXMvY2FyZC9yZWZyZXNoLnBuZ1wiXG4gICAgICAgICAgICAgIGFsdD1cIumHjeaWsOeUn+aIkFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZWdlbmVyYXRlKG1zZylcIlxuICAgICAgICAgICAgICAqbmdJZj1cImkgPT09IG1lc3NhZ2VzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gPGRpdiBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAxNjBweFwiPjwvZGl2PiAtLT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZ2VudC9jaGF0L2NoYXQtbWVzc2FnZXMvY2hhdC1tZXNzYWdlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZ2VudC9jaGF0L2NoYXQtbWVzc2FnZXMvY2hhdC1tZXNzYWdlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2QkFBNkI7QUFDN0IsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUdULE1BQU0sRUFFTixNQUFNLEVBQ04sWUFBWSxHQUdiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsWUFBWSxFQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFjakYsTUFBTSxPQUFPLHFCQUFxQjtJQVpsQztRQWFXLGFBQVEsR0FBYyxFQUFFLENBQUM7UUFFbEM7O1dBRUc7UUFDTyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRWpELE9BQUUsR0FBRyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNuQyxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLGNBQVMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakMsUUFBRyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXZD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LFVBQVUsRUFBRSxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNyRCxVQUFVLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7eUJBQ3RGLENBQUM7cUJBQ0g7OEJBR1EsUUFBUTtzQkFBaEIsS0FBSztnQkFDMEIsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFJcEIsZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gY2hhdC1tZXNzYWdlcy5jb21wb25lbnQudHNcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgaW5qZWN0LFxuICBBZnRlclZpZXdJbml0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuLi9tb2RlbHMvbWVzc2FnZS5tb2RlbCc7XG5pbXBvcnQgeyBNYXJrZG93blN0cmVhbVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tYXJrZG93bi1zdHJlYW0uc2VydmljZSc7XG5pbXBvcnQgeyBTc2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3NlLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWFya2VkIH0gZnJvbSAnbWFya2VkJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE56TWVzc2FnZVNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL21lc3NhZ2UnO1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1jaGF0LW1lc3NhZ2VzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXQtbWVzc2FnZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0LW1lc3NhZ2VzLmNvbXBvbmVudC5zY3NzJ10sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdleHBhbmRDb2xsYXBzZScsIFtcbiAgICAgIHN0YXRlKCdjb2xsYXBzZWQnLCBzdHlsZSh7IGhlaWdodDogJzBweCcsIG9wYWNpdHk6IDAgfSkpLFxuICAgICAgc3RhdGUoJ2V4cGFuZGVkJywgc3R5bGUoeyBoZWlnaHQ6ICcqJywgb3BhY2l0eTogMSB9KSksXG4gICAgICB0cmFuc2l0aW9uKCdleHBhbmRlZCA8PT4gY29sbGFwc2VkJywgYW5pbWF0ZSgnMzAwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpJykpLFxuICAgIF0pLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZXNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBtZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gIEBWaWV3Q2hpbGQoJ21lc3NhZ2VzQ29udGFpbmVyJykgbWVzc2FnZXNDb250YWluZXIhOiBFbGVtZW50UmVmO1xuICAvKipcbiAgICog6YeN5paw55Sf5oiQ5Zue562UXG4gICAqL1xuICBAT3V0cHV0KCkgcmVnZW5lcmF0ZUFuc3dlciA9IG5ldyBFdmVudEVtaXR0ZXI8TWVzc2FnZT4oKTtcblxuICBwcml2YXRlIG1kID0gaW5qZWN0KE1hcmtkb3duU3RyZWFtU2VydmljZSk7XG4gIHByaXZhdGUgc3NlU2VydmljZSA9IGluamVjdChTc2VTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBzYW5pdGl6ZXIgPSBpbmplY3QoRG9tU2FuaXRpemVyKTtcbiAgcHJpdmF0ZSBtc2cgPSBpbmplY3QoTnpNZXNzYWdlU2VydmljZSk7XG5cbiAgaXNMb2FkaW5nID0gZmFsc2U7XG4gIGlucHV0SGVpZ2h0ID0gMTgwO1xuICByZW5kZXJlZEh0bWw6IFNhZmVIdG1sID0gJyc7XG4gIHByaXZhdGUgYWNjdW11bGF0ZWRNYXJrZG93biA9ICcnO1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNzZVNlcnZpY2UubG9hZGluZyQuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHN0YXR1cztcbiAgICB9KTtcbiAgICB0aGlzLnNzZVNlcnZpY2UuZGVsdGEkLnN1YnNjcmliZShkZWx0YSA9PiB7XG4gICAgICBpZiAoIWRlbHRhKSByZXR1cm47XG5cbiAgICAgIHRoaXMuYWNjdW11bGF0ZWRNYXJrZG93biArPSBkZWx0YTtcbiAgICAgIHRoaXMucmVuZGVyZWRIdG1sID0gdGhpcy5tZC5yZW5kZXJJbmNyZW1lbnRhbCh0aGlzLmFjY3VtdWxhdGVkTWFya2Rvd24pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIC8vIOato+WcqOWbnuetlOS4rVxuICAgIGlmICh0aGlzLmlzTG9hZGluZykge1xuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1snbWVzc2FnZXMnXSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgIH0sIDUwKTtcbiAgICB9XG4gIH1cblxuICAvLyDmu5rliqjliLDlupXpg6hcbiAgc2Nyb2xsVG9Cb3R0b20oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1lc3NhZ2VzQ29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZXNDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLm1lc3NhZ2VzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgY29weUNvbnRlbnQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgd2luZG93LmlzU2VjdXJlQ29udGV4dCkge1xuICAgICAgLy8g5L2/55So546w5LujIENsaXBib2FyZCBBUElcbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLm1zZy5zdWNjZXNzKCflpI3liLbmiJDlip8nKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFnZUNoYW5nZShudW06IG51bWJlciwgbXNnOiBNZXNzYWdlKTogdm9pZCB7XG4gICAgbXNnLmFuc3dlckluZGV4ID0gbnVtIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiDph43mlrDnlJ/miJDlpJrkuKrlm57nrZRcbiAgICovXG4gIHJlZ2VuZXJhdGUobXNnOiBNZXNzYWdlKTogdm9pZCB7XG4gICAgLy8gY29uc3QgcXVlc3Rpb24gPSB0aGlzLm1lc3NhZ2VzW2luZGV4IC0gMV0ubWVzc2FnZTtcbiAgICAvLyDph43mlrDnlJ/miJDkvb/nlKjlupXpg6jmnIDmlrDnmoTphY3nva7vvIzph43mlrDosIPnlKhzZW5kTWVzc2FnZVxuICAgIHRoaXMucmVnZW5lcmF0ZUFuc3dlci5lbWl0KG1zZyk7XG4gIH1cblxuICAvLyDmiorlrozmlbTnmoQgbWFya2Rvd24g5Z2X5riy5p+T77yM5Ymp5LiL55qE55WZ57uZ5omT5a2X5Yy6XG4gIHByaXZhdGUgcmVuZGVyQ29tcGxldGVCbG9ja3MobWFya2Rvd246IHN0cmluZyk6IHsgcmVuZGVyZWQ6IHN0cmluZzsgcmVtYWluaW5nOiBzdHJpbmcgfSB7XG4gICAgLy8g5om+5Yiw5pyA5ZCO5LiA5Liq5o2i6KGM56ym5LmL5YmN55qE6YO95riy5p+T77yI6Laz5aSf5Lid5ruR77yJXG4gICAgY29uc3QgbGluZXMgPSBtYXJrZG93bi5zcGxpdCgnXFxuJyk7XG4gICAgbGV0IGJyZWFrUG9pbnQgPSBsaW5lcy5sZW5ndGg7XG5cbiAgICAvLyDku47lkI7lvoDliY3mib7vvIzkv53nlZnmnKrlrozmiJDnmoTku6PnoIHlnZcv6KGo5qC8L+WIl+ihqFxuICAgIGZvciAobGV0IGkgPSBsaW5lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgaWYgKGxpbmUudHJpbSgpID09PSAnJyB8fCBsaW5lLnN0YXJ0c1dpdGgoJ2BgYCcpIHx8IGxpbmUuc3RhcnRzV2l0aCgnfCcpIHx8IGxpbmUuc3RhcnRzV2l0aCgnLSAnKSkge1xuICAgICAgICBicmVha1BvaW50ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGVQYXJ0ID0gbGluZXMuc2xpY2UoMCwgYnJlYWtQb2ludCkuam9pbignXFxuJyk7XG4gICAgY29uc3QgcmVtYWluaW5nUGFydCA9IGxpbmVzLnNsaWNlKGJyZWFrUG9pbnQpLmpvaW4oJ1xcbicpO1xuXG4gICAgY29uc3QgaHRtbCA9IHRoaXMubWQucmVuZGVySW5jcmVtZW50YWwoY29tcGxldGVQYXJ0KTtcbiAgICAvLyBjb25zdCBodG1sID0gbWFya2VkKGNvbXBsZXRlUGFydCwgeyBicmVha3M6IHRydWUsIGdmbTogdHJ1ZSB9KTtcbiAgICByZXR1cm4geyByZW5kZXJlZDogaHRtbCBhcyBzdHJpbmcsIHJlbWFpbmluZzogcmVtYWluaW5nUGFydCB9O1xuICB9XG59XG4iLCI8IS0tIGNoYXQtbWVzc2FnZXMuY29tcG9uZW50Lmh0bWwgLS0+XG48c2NyaXB0IHNyYz1cImNoYXQtbWVzc2FnZXMuY29tcG9uZW50LnRzXCI+PC9zY3JpcHQ+XG48ZGl2IGNsYXNzPVwibWVzc2FnZXMtY29udGFpbmVyXCIgI21lc3NhZ2VzQ29udGFpbmVyPlxuICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1saXN0XCIgW3N0eWxlLi0taW5wdXQtaGVpZ2h0LnB4XT1cImlucHV0SGVpZ2h0XCI+XG4gICAgPGRpdiBjbGFzcz1cInF1ZXN0aW9uIG1lc3NhZ2Utd3JhcHBlclwiICpuZ0Zvcj1cImxldCBtc2cgb2YgbWVzc2FnZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgIDwhLS0gUSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJidWJibGUtd3JhcHBlciB1c2VyLW1zZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1idWJibGVcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1jb250ZW50IG1lc3NhZ2UtaHVtYW5cIj5cbiAgICAgICAgICAgIHt7IG1zZy5xdWVzdGlvbiB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBBIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImJ1YmJsZS13cmFwcGVyIGFpLW1zZ1wiICpuZ0lmPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XVwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJidWJibGUtbG9hZGluZ1wiXG4gICAgICAgICAgKm5nSWY9XCIhbXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGluayAmJiAhbXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS5jb250ZW50XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJidWJibGUtbG9hZGluZy1kb3RcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBbMSwgMiwgM11cIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLWJ1YmJsZVwiPlxuICAgICAgICAgIDwhLS0g5oCd6ICDIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXNzYWdlLXRoaW5rXCIgKm5nSWY9XCJtc2cuYW5zd2Vyc1ttc2cuYW5zd2VySW5kZXhdLnRoaW5rXCI+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwibWVzc2FnZS10aGluay1oZWFkZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGlua0V4cGFuZCA9ICFtc2cuYW5zd2Vyc1ttc2cuYW5zd2VySW5kZXhdLnRoaW5rRXhwYW5kXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtdGhpbmstaGVhZGVyLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ltYWdlcy9jYXJkL3RoaW5rLWZpbmlzaC5wbmdcIiAvPlxuICAgICAgICAgICAgICAgIHt7IG1zZy5hbnN3ZXJzW21zZy5hbnN3ZXJJbmRleF0uY29udGVudCA/ICflt7LlrozmiJDmgJ3ogIMnIDogJ+ato+WcqOaAneiAg+S4rS4uLicgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnJvdy1pY29uXCIgW2NsYXNzLnJvdGF0ZWRdPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGlua0V4cGFuZFwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiPlxuICAgICAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjYgOSAxMiAxNSAxOCA5XCI+PC9wb2x5bGluZT5cbiAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJtZXNzYWdlLWNvbnRlbnQgbWVzc2FnZS1hc3Npc3RhbnQgbWVzc2FnZS1tYXJrZG93blwiXG4gICAgICAgICAgICAgIFtAZXhwYW5kQ29sbGFwc2VdPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGlua0V4cGFuZCA/ICdleHBhbmRlZCcgOiAnY29sbGFwc2VkJ1wiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGluayB8IG1hcmtkb3duXCJcbiAgICAgICAgICAgICAgW2hpZGRlbl09XCIhbXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS50aGlua0V4cGFuZFwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPCEtLSDlm57nrZQgLS0+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJtZXNzYWdlLWNvbnRlbnQgbWVzc2FnZS1hc3Npc3RhbnQgbWVzc2FnZS1tYXJrZG93blwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm1zZy5hbnN3ZXJzW21zZy5hbnN3ZXJJbmRleF0uY29udGVudCB8IG1hcmtkb3duXCJcbiAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgPCEtLSDlm57nrZTlt6XlhbfmoI8gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFzc2lzdGFudC10b29sc1wiICpuZ0lmPVwibXNnLmFuc3dlcnNbbXNnLmFuc3dlckluZGV4XS5jb250ZW50XCI+XG4gICAgICAgICAgICA8bmd4LXNpbXBsZS1wYWdpbmF0aW9uXG4gICAgICAgICAgICAgIFtjdXJyZW50XT1cIm1zZy5hbnN3ZXJJbmRleCArIDFcIlxuICAgICAgICAgICAgICBbdG90YWxdPVwibXNnLmFuc3dlcnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgKHBhZ2VDaGFuZ2UpPVwib25QYWdlQ2hhbmdlKCRldmVudCwgbXNnKVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwibXNnLmFuc3dlcnMubGVuZ3RoID4gMVwiXG4gICAgICAgICAgICA+PC9uZ3gtc2ltcGxlLXBhZ2luYXRpb24+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pbWFnZXMvY2FyZC9jb3B5LnBuZ1wiXG4gICAgICAgICAgICAgIGFsdD1cIuWkjeWItlwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjb3B5Q29udGVudChtc2cuYW5zd2Vyc1ttc2cuYW5zd2VySW5kZXhdLmNvbnRlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pbWFnZXMvY2FyZC9yZWZyZXNoLnBuZ1wiXG4gICAgICAgICAgICAgIGFsdD1cIumHjeaWsOeUn+aIkFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZWdlbmVyYXRlKG1zZylcIlxuICAgICAgICAgICAgICAqbmdJZj1cImkgPT09IG1lc3NhZ2VzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gPGRpdiBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAxNjBweFwiPjwvZGl2PiAtLT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|