@sinequa/assistant 3.5.3 → 3.5.5
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/chat/chat.component.d.ts +14 -11
- package/chat/styles/assistant.scss +80 -80
- package/chat/styles/references.scss +22 -22
- package/esm2020/chat/charts/chart/chart.component.mjs +3 -3
- package/esm2020/chat/chat-message/chat-message.component.mjs +3 -3
- package/esm2020/chat/chat-reference/chat-reference.component.mjs +3 -3
- package/esm2020/chat/chat-settings-v3/chat-settings-v3.component.mjs +3 -3
- package/esm2020/chat/chat.component.mjs +3 -3
- package/esm2020/chat/chat.service.mjs +1 -1
- package/esm2020/chat/debug-message/debug-message.component.mjs +3 -3
- package/esm2020/chat/format-icon/format-icon.component.mjs +1 -1
- package/esm2020/chat/format-icon/icons.mjs +1 -1
- package/esm2020/chat/initials-avatar/initials-avatar.component.mjs +3 -3
- package/esm2020/chat/instance-manager.service.mjs +1 -1
- package/esm2020/chat/messages/de.mjs +1 -1
- package/esm2020/chat/messages/en.mjs +1 -1
- package/esm2020/chat/messages/fr.mjs +1 -1
- package/esm2020/chat/messages/index.mjs +1 -1
- package/esm2020/chat/prompt.component.mjs +23 -23
- package/esm2020/chat/public-api.mjs +1 -1
- package/esm2020/chat/rest-chat.service.mjs +1 -1
- package/esm2020/chat/saved-chats/saved-chats.component.mjs +3 -3
- package/esm2020/chat/token-progress-bar/token-progress-bar.component.mjs +3 -3
- package/esm2020/chat/types.mjs +1 -1
- package/esm2020/chat/websocket-chat.service.mjs +1 -1
- package/esm2020/public-api.mjs +1 -1
- package/fesm2015/sinequa-assistant-chat.mjs +40 -40
- package/fesm2015/sinequa-assistant-chat.mjs.map +1 -1
- package/fesm2015/sinequa-assistant.mjs.map +1 -1
- package/fesm2020/sinequa-assistant-chat.mjs +40 -40
- package/fesm2020/sinequa-assistant-chat.mjs.map +1 -1
- package/fesm2020/sinequa-assistant.mjs.map +1 -1
- package/package.json +1 -1
package/chat/chat.component.d.ts
CHANGED
|
@@ -958,11 +958,7 @@ export declare class ChatComponent extends AbstractFacet implements OnInit, OnCh
|
|
|
958
958
|
id: string;
|
|
959
959
|
title: string;
|
|
960
960
|
text: string;
|
|
961
|
-
size: number;
|
|
962
|
-
* Starting from the provided index, remove all subsequent messages from the chat history and the UI accordingly.
|
|
963
|
-
* The assistant will regenerate a new answer based on the updated chat history.
|
|
964
|
-
* @param index The index of the assistant's message to regenerate
|
|
965
|
-
*/
|
|
961
|
+
size: number;
|
|
966
962
|
$selected: boolean;
|
|
967
963
|
matchlocations: string[];
|
|
968
964
|
rank: number;
|
|
@@ -1032,7 +1028,12 @@ export declare class ChatComponent extends AbstractFacet implements OnInit, OnCh
|
|
|
1032
1028
|
image: import("@sinequa/core/web-services").RFMDisplay;
|
|
1033
1029
|
status: import("@sinequa/core/web-services").RFMDisplay;
|
|
1034
1030
|
eventCount: number;
|
|
1035
|
-
average: number;
|
|
1031
|
+
average: number; /**
|
|
1032
|
+
* Send a "dislike" event on clicking on the thumb-down icon of an assistant's message.
|
|
1033
|
+
* It also opens the issue reporting dialog.
|
|
1034
|
+
* @param message The assistant message to dislike
|
|
1035
|
+
* @param rank The rank of the message to dislike
|
|
1036
|
+
*/
|
|
1036
1037
|
imageAction: import("@sinequa/core/web-services").RFMDisplay;
|
|
1037
1038
|
availableActions: import("@sinequa/core/web-services").RFMDisplay;
|
|
1038
1039
|
} | undefined;
|
|
@@ -1042,7 +1043,9 @@ export declare class ChatComponent extends AbstractFacet implements OnInit, OnCh
|
|
|
1042
1043
|
eventCount: number;
|
|
1043
1044
|
average: number;
|
|
1044
1045
|
imageAction: import("@sinequa/core/web-services").RFMDisplay;
|
|
1045
|
-
availableActions: import("@sinequa/core/web-services").RFMDisplay;
|
|
1046
|
+
availableActions: import("@sinequa/core/web-services").RFMDisplay; /**
|
|
1047
|
+
* Report an issue related to the assistant's message.
|
|
1048
|
+
*/
|
|
1046
1049
|
} | undefined;
|
|
1047
1050
|
} | undefined;
|
|
1048
1051
|
groupcount?: number | undefined;
|
|
@@ -1056,14 +1059,14 @@ export declare class ChatComponent extends AbstractFacet implements OnInit, OnCh
|
|
|
1056
1059
|
id: number;
|
|
1057
1060
|
score: number;
|
|
1058
1061
|
rlocation: number[];
|
|
1062
|
+
/**
|
|
1063
|
+
* Close the issue reporting dialog.
|
|
1064
|
+
*/
|
|
1059
1065
|
highlightedText: string;
|
|
1060
1066
|
$expanded?: boolean | undefined;
|
|
1061
1067
|
}[];
|
|
1062
1068
|
} | undefined;
|
|
1063
|
-
$hasPassages?: boolean | undefined;
|
|
1064
|
-
* Handle the click on a reference's 'open original document'.
|
|
1065
|
-
* @param data
|
|
1066
|
-
*/
|
|
1069
|
+
$hasPassages?: boolean | undefined;
|
|
1067
1070
|
}>;
|
|
1068
1071
|
/** Event emitter triggered when the user clicks to open the preview of a document representing the context attachment */
|
|
1069
1072
|
openPreview: EventEmitter<ChatContextAttachment>;
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
/****************************************************
|
|
2
|
-
variables
|
|
3
|
-
****************************************************/
|
|
4
|
-
$sm: 576px;
|
|
5
|
-
$md: 768px;
|
|
6
|
-
$lg: 992px;
|
|
7
|
-
$xl: 1200px;
|
|
8
|
-
$xxl: 1400px;
|
|
9
|
-
|
|
10
|
-
$size-0: var(--ast-size-0, 0rem);
|
|
11
|
-
$size-1: var(--ast-size-1, 0.25rem);
|
|
12
|
-
$size-2: var(--ast-size-2, 0.5rem);
|
|
13
|
-
$size-3: var(--ast-size-3, 0.75rem);
|
|
14
|
-
$size-4: var(--ast-size-4, 1rem);
|
|
15
|
-
$size-5: var(--ast-size-5, 1.25rem);
|
|
16
|
-
$size-6: var(--ast-size-6, 1.5rem);
|
|
17
|
-
|
|
18
|
-
$fw-bold: var(--font-weight-bold, 500);
|
|
19
|
-
$container-width: var(--container-width, 800px);
|
|
20
|
-
|
|
21
|
-
/****************************************************
|
|
22
|
-
colors
|
|
23
|
-
****************************************************/
|
|
24
|
-
$ast-primary-bg: var(--ast-primary-bg, #f2f8fe);
|
|
25
|
-
$ast-primary-color: var(--ast-primary-color, #005DA7);
|
|
26
|
-
$ast-secondary-bg: var(--ast-secondary-bg, #FFF8F1);
|
|
27
|
-
$ast-secondary-color: var(--ast-secondary-color, #FF732E);
|
|
28
|
-
$ast-saved-chat-hover-background: var(--ast-saved-chat-hover-background, #FFF8F1);
|
|
29
|
-
$ast-input-bg: var(--ast-input-bg, #F8F8F8);
|
|
30
|
-
$ast-input-color: var(--ast-input-color, #B0B0B0);
|
|
31
|
-
$ast-muted-color: var(--ast-muted-color, rgba(33, 37, 41, 0.75));
|
|
32
|
-
|
|
33
|
-
/****************************************************
|
|
34
|
-
classes
|
|
35
|
-
****************************************************/
|
|
36
|
-
|
|
37
|
-
.ast-primary {
|
|
38
|
-
color: $ast-primary-color;
|
|
39
|
-
background-color: $ast-primary-bg;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
.ast-primary-hover {
|
|
43
|
-
background-color: $ast-primary-bg;
|
|
44
|
-
|
|
45
|
-
&:hover {
|
|
46
|
-
color: $ast-primary-color;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
.ast-secondary {
|
|
51
|
-
color: $ast-secondary-color;
|
|
52
|
-
background-color: $ast-secondary-bg;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
.ast-btn {
|
|
56
|
-
border: 0;
|
|
57
|
-
text-align: left;
|
|
58
|
-
padding-top: 0.5rem;
|
|
59
|
-
padding-bottom: 0.5rem;
|
|
60
|
-
display: flex;
|
|
61
|
-
align-items: center;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
.dark {
|
|
65
|
-
--ast-primary-bg: #0d0701;
|
|
66
|
-
--ast-primary-color: #008cd1;
|
|
67
|
-
--ast-secondary-bg: #00070e;
|
|
68
|
-
--ast-secondary-color: #ffa258;
|
|
69
|
-
--ast-input-bg: #070707;
|
|
70
|
-
--ast-input-color: rgba(222, 218, 218, 0.75);
|
|
71
|
-
--ast-muted-color: rgba(222, 218, 218, 0.75);
|
|
72
|
-
--ast-saved-chat-hover-background: #262421;
|
|
73
|
-
--ast-message-table-border-color: #333333;
|
|
74
|
-
--ast-message-table-tr-bg: #070707;
|
|
75
|
-
--ast-message-table-tr-border-color: #222222;
|
|
76
|
-
--ast-reference-icon-color: white;
|
|
77
|
-
--ast-reference-icon-active-color: black;
|
|
78
|
-
--ast-reference-passages-color: white;
|
|
79
|
-
--ast-reference-expanded-hover-bg: #262421;
|
|
80
|
-
--ast-message-reference-color: black;
|
|
1
|
+
/****************************************************
|
|
2
|
+
variables
|
|
3
|
+
****************************************************/
|
|
4
|
+
$sm: 576px;
|
|
5
|
+
$md: 768px;
|
|
6
|
+
$lg: 992px;
|
|
7
|
+
$xl: 1200px;
|
|
8
|
+
$xxl: 1400px;
|
|
9
|
+
|
|
10
|
+
$size-0: var(--ast-size-0, 0rem);
|
|
11
|
+
$size-1: var(--ast-size-1, 0.25rem);
|
|
12
|
+
$size-2: var(--ast-size-2, 0.5rem);
|
|
13
|
+
$size-3: var(--ast-size-3, 0.75rem);
|
|
14
|
+
$size-4: var(--ast-size-4, 1rem);
|
|
15
|
+
$size-5: var(--ast-size-5, 1.25rem);
|
|
16
|
+
$size-6: var(--ast-size-6, 1.5rem);
|
|
17
|
+
|
|
18
|
+
$fw-bold: var(--font-weight-bold, 500);
|
|
19
|
+
$container-width: var(--container-width, 800px);
|
|
20
|
+
|
|
21
|
+
/****************************************************
|
|
22
|
+
colors
|
|
23
|
+
****************************************************/
|
|
24
|
+
$ast-primary-bg: var(--ast-primary-bg, #f2f8fe);
|
|
25
|
+
$ast-primary-color: var(--ast-primary-color, #005DA7);
|
|
26
|
+
$ast-secondary-bg: var(--ast-secondary-bg, #FFF8F1);
|
|
27
|
+
$ast-secondary-color: var(--ast-secondary-color, #FF732E);
|
|
28
|
+
$ast-saved-chat-hover-background: var(--ast-saved-chat-hover-background, #FFF8F1);
|
|
29
|
+
$ast-input-bg: var(--ast-input-bg, #F8F8F8);
|
|
30
|
+
$ast-input-color: var(--ast-input-color, #B0B0B0);
|
|
31
|
+
$ast-muted-color: var(--ast-muted-color, rgba(33, 37, 41, 0.75));
|
|
32
|
+
|
|
33
|
+
/****************************************************
|
|
34
|
+
classes
|
|
35
|
+
****************************************************/
|
|
36
|
+
|
|
37
|
+
.ast-primary {
|
|
38
|
+
color: $ast-primary-color;
|
|
39
|
+
background-color: $ast-primary-bg;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.ast-primary-hover {
|
|
43
|
+
background-color: $ast-primary-bg;
|
|
44
|
+
|
|
45
|
+
&:hover {
|
|
46
|
+
color: $ast-primary-color;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.ast-secondary {
|
|
51
|
+
color: $ast-secondary-color;
|
|
52
|
+
background-color: $ast-secondary-bg;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.ast-btn {
|
|
56
|
+
border: 0;
|
|
57
|
+
text-align: left;
|
|
58
|
+
padding-top: 0.5rem;
|
|
59
|
+
padding-bottom: 0.5rem;
|
|
60
|
+
display: flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.dark {
|
|
65
|
+
--ast-primary-bg: #0d0701;
|
|
66
|
+
--ast-primary-color: #008cd1;
|
|
67
|
+
--ast-secondary-bg: #00070e;
|
|
68
|
+
--ast-secondary-color: #ffa258;
|
|
69
|
+
--ast-input-bg: #070707;
|
|
70
|
+
--ast-input-color: rgba(222, 218, 218, 0.75);
|
|
71
|
+
--ast-muted-color: rgba(222, 218, 218, 0.75);
|
|
72
|
+
--ast-saved-chat-hover-background: #262421;
|
|
73
|
+
--ast-message-table-border-color: #333333;
|
|
74
|
+
--ast-message-table-tr-bg: #070707;
|
|
75
|
+
--ast-message-table-tr-border-color: #222222;
|
|
76
|
+
--ast-reference-icon-color: white;
|
|
77
|
+
--ast-reference-icon-active-color: black;
|
|
78
|
+
--ast-reference-passages-color: white;
|
|
79
|
+
--ast-reference-expanded-hover-bg: #262421;
|
|
80
|
+
--ast-message-reference-color: black;
|
|
81
81
|
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
:host ::ng-deep { // required so it is applied for the tooltip
|
|
2
|
-
.reference,
|
|
3
|
-
.message-content .reference,
|
|
4
|
-
.attachment .reference {
|
|
5
|
-
position: relative;
|
|
6
|
-
bottom: var(--ast-reference-bottom, 0.3em);
|
|
7
|
-
font-weight: var(--ast-reference-font-weight, bold);
|
|
8
|
-
padding: var(--ast-reference-padding, 0 0.2em);
|
|
9
|
-
margin: var(--ast-reference-margin, 0 0.1em);
|
|
10
|
-
border-radius: var(--ast-reference-border-radius, 0.2em);
|
|
11
|
-
background-color: var(--ast-reference-background-color, lightblue);
|
|
12
|
-
color: var(--ast-reference-color, black);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.reference,
|
|
16
|
-
.message-content .reference {
|
|
17
|
-
font-size: var(--ast-reference-message-font-size, 0.7em);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.attachment .reference {
|
|
21
|
-
font-size: var(--ast-reference-attachment-font-size, 13px);
|
|
22
|
-
}
|
|
1
|
+
:host ::ng-deep { // required so it is applied for the tooltip
|
|
2
|
+
.reference,
|
|
3
|
+
.message-content .reference,
|
|
4
|
+
.attachment .reference {
|
|
5
|
+
position: relative;
|
|
6
|
+
bottom: var(--ast-reference-bottom, 0.3em);
|
|
7
|
+
font-weight: var(--ast-reference-font-weight, bold);
|
|
8
|
+
padding: var(--ast-reference-padding, 0 0.2em);
|
|
9
|
+
margin: var(--ast-reference-margin, 0 0.1em);
|
|
10
|
+
border-radius: var(--ast-reference-border-radius, 0.2em);
|
|
11
|
+
background-color: var(--ast-reference-background-color, lightblue);
|
|
12
|
+
color: var(--ast-reference-color, black);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.reference,
|
|
16
|
+
.message-content .reference {
|
|
17
|
+
font-size: var(--ast-reference-message-font-size, 0.7em);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.attachment .reference {
|
|
21
|
+
font-size: var(--ast-reference-attachment-font-size, 13px);
|
|
22
|
+
}
|
|
23
23
|
}
|
|
@@ -30,11 +30,11 @@ export class ChartComponent {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
ChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
33
|
-
ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChartComponent, isStandalone: true, selector: "sq-assistant-chart", inputs: { rawChartData: "rawChartData" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"chart-container\">\n <canvas id=\"chart-canvas\">{{ chart }}</canvas>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
33
|
+
ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChartComponent, isStandalone: true, selector: "sq-assistant-chart", inputs: { rawChartData: "rawChartData" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"chart-container\">\r\n <canvas id=\"chart-canvas\">{{ chart }}</canvas>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
34
34
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChartComponent, decorators: [{
|
|
35
35
|
type: Component,
|
|
36
|
-
args: [{ selector: 'sq-assistant-chart', standalone: true, imports: [CommonModule], template: "<div class=\"chart-container\">\n <canvas id=\"chart-canvas\">{{ chart }}</canvas>\n</div>\n" }]
|
|
36
|
+
args: [{ selector: 'sq-assistant-chart', standalone: true, imports: [CommonModule], template: "<div class=\"chart-container\">\r\n <canvas id=\"chart-canvas\">{{ chart }}</canvas>\r\n</div>\r\n" }]
|
|
37
37
|
}], ctorParameters: function () { return []; }, propDecorators: { rawChartData: [{
|
|
38
38
|
type: Input
|
|
39
39
|
}] } });
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhcnRzL2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXJ0cy9jaGFydC9jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsU0FBUyxFQUFFLEtBQUssRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBOztBQUUvQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUM7QUFTakMsTUFBTSxPQUFPLGNBQWM7SUFNekIsZ0JBQWdCLENBQUM7SUFFakIsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQzNCLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ3BFO0lBQ0gsQ0FBQztJQUVPLGVBQWU7UUFDckIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUUxQyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTlELElBQUcsYUFBYSxFQUFDO1lBQ2YsSUFBRztnQkFDRCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQVcsQ0FBQztnQkFDdEgsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFekMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFFckQ7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLGtFQUFrRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzFGO1NBRUY7YUFDSTtZQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztTQUM1QztJQUNILENBQUM7OzJHQW5DVSxjQUFjOytGQUFkLGNBQWMsNklDYjNCLHVHQUdBLHlERE1ZLFlBQVk7MkZBSVgsY0FBYztrQkFQMUIsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDOzBFQUtkLFlBQVk7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPbkNoYW5nZXMsIENvbXBvbmVudCwgSW5wdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ2hhcnQsIHJlZ2lzdGVyYWJsZXMgfSBmcm9tICdjaGFydC5qcydcclxuXHJcbkNoYXJ0LnJlZ2lzdGVyKC4uLnJlZ2lzdGVyYWJsZXMpO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzcS1hc3Npc3RhbnQtY2hhcnQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXJ0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jaGFydC5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSByYXdDaGFydERhdGE6IHN0cmluZztcclxuXHJcbiAgcHVibGljIGNoYXJ0OiBDaGFydDtcclxuICBwcml2YXRlIGRlYm91bmNlVGltZXI6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3Jhd0NoYXJ0RGF0YSddKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmRlYm91bmNlVGltZXIpO1xyXG4gICAgICB0aGlzLmRlYm91bmNlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdGlhbGl6ZUNoYXJ0KCksIDMwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVDaGFydCgpIHtcclxuICAgIENoYXJ0LmdldENoYXJ0KCdjaGFydC1jYW52YXMnKT8uZGVzdHJveSgpO1xyXG5cclxuICAgIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhcnQtY2FudmFzJyk7XHJcblxyXG4gICAgaWYoY2FudmFzRWxlbWVudCl7XHJcbiAgICAgIHRyeXtcclxuICAgICAgICBsZXQgY2hhcnRJbnB1dCA9IHRoaXMucmF3Q2hhcnREYXRhLm1hdGNoKC88Y2hhcnRqcz4oe1tcXHNcXFNdKj8pPFxcL2NoYXJ0anM+Lyk/LlsxXT8udHJpbSgpLnJlcGxhY2UoLycvZywgJ1wiJykgYXMgc3RyaW5nO1xyXG4gICAgICAgIGxldCBjaGFydENvbmZpZyA9IEpTT04ucGFyc2UoY2hhcnRJbnB1dCk7ICBcclxuICAgXHJcbiAgICAgICAgdGhpcy5jaGFydCA9IG5ldyBDaGFydCgnY2hhcnQtY2FudmFzJywgY2hhcnRDb25maWcpO1xyXG5cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGNoYXJ0IGNvbmZpZ3VyYXRpb24sIGNoZWNrIHRoZSBhc3Npc3RhbnQgY29uZmlndXJhdGlvbjogJywgZXJyb3IpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0NoYXJ0IENhbnZhcyBpcyBub3QgZm91bmQnKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNoYXJ0LWNvbnRhaW5lclwiPlxyXG4gICAgPGNhbnZhcyBpZD1cImNoYXJ0LWNhbnZhc1wiPnt7IGNoYXJ0IH19PC9jYW52YXM+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
@@ -209,11 +209,11 @@ export class ChatMessageComponent {
|
|
|
209
209
|
}
|
|
210
210
|
}
|
|
211
211
|
ChatMessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatMessageComponent, deps: [{ token: i1.SearchService }, { token: i2.UIService }, { token: i3.PrincipalWebService }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
212
|
-
ChatMessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatMessageComponent, isStandalone: true, selector: "sq-chat-message", inputs: { message: "message", conversation: "conversation", suggestedActions: "suggestedActions", assistantMessageIcon: "assistantMessageIcon", userMessageIcon: "userMessageIcon", streaming: "streaming", canEdit: "canEdit", canRegenerate: "canRegenerate", canCopy: "canCopy", canDebug: "canDebug", canLike: "canLike", canDislike: "canDislike" }, outputs: { openDocument: "openDocument", openPreview: "openPreview", suggestAction: "suggestAction", edit: "edit", copy: "copy", regenerate: "regenerate", like: "like", dislike: "dislike", debug: "debug" }, usesOnChanges: true, ngImport: i0, template: "<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <i [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"message.role === 'assistant'\"></i>\n <ng-container *ngIf=\"message?.role === 'user'\">\n <i [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"!!userMessageIcon; else initialsAvatar\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-fw fa-spin fa-circle-notch\" *ngIf=\"!step.done\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\">: {{step.content}}</span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\n </div>\n\n <remark *ngIf=\"message?.role === 'assistant' && message.messageType === 'MARKDOWN'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy to clipboard\" (click)=\"copyMessage(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit(message); liked = true;\">\n <i class=\"far fa-thumbs-up\"></i>\n </button>\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit(message); disliked = true;\">\n <i class=\"far fa-thumbs-down\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canDebug && !!message.additionalProperties.$debug && message.additionalProperties.$debug?.length > 0\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\n <i class=\"far fa-list-alt\"></i>\n </button>\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n *ngIf=\"!hiddenTooltip\"\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:table;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem}.sq-chat-message-actions button:hover{color:var(--ast-primary-color, #005DA7)}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UtilsModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "component", type: i5.Collapse, selector: "sq-collapse", inputs: ["collapsed"] }, { kind: "ngmodule", type: RemarkModule }, { kind: "component", type: i6.RemarkComponent, selector: "remark", inputs: ["markdown", "processor", "debug"] }, { kind: "directive", type: i6.RemarkTemplateDirective, selector: "[remarkTemplate]", inputs: ["remarkTemplate"] }, { kind: "component", type: InitialsAvatarComponent, selector: "sq-initials-avatar", inputs: ["fullName", "size"] }, { kind: "component", type: ChatReferenceComponent, selector: "sq-chat-reference", inputs: ["reference", "attachment", "partId"], outputs: ["openDocument", "openPreview"] }, { kind: "component", type: ChartComponent, selector: "sq-assistant-chart", inputs: ["rawChartData"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
212
|
+
ChatMessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: ChatMessageComponent, isStandalone: true, selector: "sq-chat-message", inputs: { message: "message", conversation: "conversation", suggestedActions: "suggestedActions", assistantMessageIcon: "assistantMessageIcon", userMessageIcon: "userMessageIcon", streaming: "streaming", canEdit: "canEdit", canRegenerate: "canRegenerate", canCopy: "canCopy", canDebug: "canDebug", canLike: "canLike", canDislike: "canDislike" }, outputs: { openDocument: "openDocument", openPreview: "openPreview", suggestAction: "suggestAction", edit: "edit", copy: "copy", regenerate: "regenerate", like: "like", dislike: "dislike", debug: "debug" }, usesOnChanges: true, ngImport: i0, template: "<!-- Message icon -->\r\n<span class=\"message-icon\" [title]=\"message?.role\">\r\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\r\n <i [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"message.role === 'assistant'\"></i>\r\n <ng-container *ngIf=\"message?.role === 'user'\">\r\n <i [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"!!userMessageIcon; else initialsAvatar\"></i>\r\n <ng-template #initialsAvatar>\r\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\r\n </ng-template>\r\n </ng-container>\r\n</span>\r\n\r\n<!-- Message body -->\r\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\r\n\r\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\r\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\r\n View progress\r\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\r\n </a>\r\n <sq-collapse [collapsed]=\"collapseProgress\">\r\n <ng-template>\r\n <ul class=\"list-unstyled\">\r\n <li *ngFor=\"let step of progress\">\r\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\r\n <i class=\"fas fa-fw fa-spin fa-circle-notch\" *ngIf=\"!step.done\"></i>\r\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\r\n <span *ngIf=\"step.content\">: {{step.content}}</span>\r\n </li>\r\n </ul>\r\n </ng-template>\r\n </sq-collapse>\r\n </div>\r\n\r\n <div class=\"message-content\" *ngIf=\"message.content\">\r\n\r\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\r\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\r\n </div>\r\n\r\n <remark *ngIf=\"message?.role === 'assistant' && message.messageType === 'MARKDOWN'\" [markdown]=\"message.content\" [processor]=\"processor\">\r\n\r\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\r\n\r\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\r\n class=\"reference\"\r\n [sqTooltip]=\"attachment\"\r\n [sqTooltipTemplate]=\"tooltipTpl\"\r\n [hoverableTooltip]=\"true\"\r\n >{{ref.refId}}\r\n </a>\r\n\r\n <ng-template #staticRefTpl>\r\n <span class=\"reference\">{{ref.refId}}</span>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n <ng-template remarkTemplate=\"streaming-placeholder\">\r\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\r\n <span class=\"placeholder ms-1\"></span>\r\n </span>\r\n </ng-template>\r\n\r\n <ng-template remarkTemplate=\"code\" let-node>\r\n <div class=\"card mb-2\">\r\n <div class=\"card-header d-flex justify-content-between align-items-center\">\r\n <span>{{node.lang}}</span>\r\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\r\n </div>\r\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template remarkTemplate=\"link\" let-node>\r\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\r\n </ng-template>\r\n\r\n </remark>\r\n\r\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\r\n\r\n <!-- List of reference, if any -->\r\n <div *ngIf=\"references?.length\" class=\"references\">\r\n <details role=\"button\" class=\"select-none\" [open]=\"showReferences\">\r\n <summary class=\"references-title\">References</summary>\r\n <ul>\r\n <ng-container *ngFor=\"let reference of references\">\r\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\r\n <sq-chat-reference\r\n [class.expanded]=\"attachment.$expanded\"\r\n [attachment]=\"attachment\"\r\n [reference]=\"reference\"\r\n (openPreview)=\"openAttachmentPreview($event)\"\r\n (openDocument)=\"openOriginalAttachment($event)\">\r\n </sq-chat-reference>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </details>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Edit / Regenerate floating actions -->\r\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\r\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\r\n <i class=\"fas fa-edit\"></i>\r\n </button>\r\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy to clipboard\" (click)=\"copyMessage(message)\">\r\n <i class=\"far fa-clipboard\"></i>\r\n </button>\r\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\r\n <i class=\"fas fa-sync-alt\"></i>\r\n </button>\r\n <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit(message); liked = true;\">\r\n <i class=\"far fa-thumbs-up\"></i>\r\n </button>\r\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit(message); disliked = true;\">\r\n <i class=\"far fa-thumbs-down\"></i>\r\n </button>\r\n <button class=\"btn btn-sm\" *ngIf=\"canDebug && !!message.additionalProperties.$debug && message.additionalProperties.$debug?.length > 0\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\r\n <i class=\"far fa-list-alt\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- List of suggested actions, if any -->\r\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\r\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\r\n <div class=\"message-content\">\r\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #tooltipTpl let-ref>\r\n <sq-chat-reference\r\n *ngIf=\"!hiddenTooltip\"\r\n class=\"expanded\"\r\n [attachment]=\"ref\"\r\n [reference]=\"ref.contextId\"\r\n [partId]=\"ref.$partId\"\r\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\r\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\r\n </sq-chat-reference>\r\n </ng-template>\r\n\r\n</div>\r\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:table;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem}.sq-chat-message-actions button:hover{color:var(--ast-primary-color, #005DA7)}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UtilsModule }, { kind: "directive", type: i2.TooltipDirective, selector: "[sqTooltip]", inputs: ["sqTooltip", "sqTooltipData", "sqTooltipTemplate", "placement", "fallbackPlacements", "delay", "hoverableTooltip", "tooltipClass"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "component", type: i5.Collapse, selector: "sq-collapse", inputs: ["collapsed"] }, { kind: "ngmodule", type: RemarkModule }, { kind: "component", type: i6.RemarkComponent, selector: "remark", inputs: ["markdown", "processor", "debug"] }, { kind: "directive", type: i6.RemarkTemplateDirective, selector: "[remarkTemplate]", inputs: ["remarkTemplate"] }, { kind: "component", type: InitialsAvatarComponent, selector: "sq-initials-avatar", inputs: ["fullName", "size"] }, { kind: "component", type: ChatReferenceComponent, selector: "sq-chat-reference", inputs: ["reference", "attachment", "partId"], outputs: ["openDocument", "openPreview"] }, { kind: "component", type: ChartComponent, selector: "sq-assistant-chart", inputs: ["rawChartData"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
213
213
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ChatMessageComponent, decorators: [{
|
|
214
214
|
type: Component,
|
|
215
215
|
args: [{ selector: "sq-chat-message", changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, UtilsModule, CollapseModule, RemarkModule,
|
|
216
|
-
InitialsAvatarComponent, ChatReferenceComponent, ChartComponent], template: "<!-- Message icon -->\n<span class=\"message-icon\" [title]=\"message?.role\">\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\n <i [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"message.role === 'assistant'\"></i>\n <ng-container *ngIf=\"message?.role === 'user'\">\n <i [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"!!userMessageIcon; else initialsAvatar\"></i>\n <ng-template #initialsAvatar>\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\n </ng-template>\n </ng-container>\n</span>\n\n<!-- Message body -->\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\n\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\n View progress\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\n </a>\n <sq-collapse [collapsed]=\"collapseProgress\">\n <ng-template>\n <ul class=\"list-unstyled\">\n <li *ngFor=\"let step of progress\">\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\n <i class=\"fas fa-fw fa-spin fa-circle-notch\" *ngIf=\"!step.done\"></i>\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\n <span *ngIf=\"step.content\">: {{step.content}}</span>\n </li>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n <div class=\"message-content\" *ngIf=\"message.content\">\n\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\n </div>\n\n <remark *ngIf=\"message?.role === 'assistant' && message.messageType === 'MARKDOWN'\" [markdown]=\"message.content\" [processor]=\"processor\">\n\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\n\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\n class=\"reference\"\n [sqTooltip]=\"attachment\"\n [sqTooltipTemplate]=\"tooltipTpl\"\n [hoverableTooltip]=\"true\"\n >{{ref.refId}}\n </a>\n\n <ng-template #staticRefTpl>\n <span class=\"reference\">{{ref.refId}}</span>\n </ng-template>\n\n </ng-template>\n\n <ng-template remarkTemplate=\"streaming-placeholder\">\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\n <span class=\"placeholder ms-1\"></span>\n </span>\n </ng-template>\n\n <ng-template remarkTemplate=\"code\" let-node>\n <div class=\"card mb-2\">\n <div class=\"card-header d-flex justify-content-between align-items-center\">\n <span>{{node.lang}}</span>\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\n </div>\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\n </div>\n </ng-template>\n\n <ng-template remarkTemplate=\"link\" let-node>\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\n </ng-template>\n\n </remark>\n\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\n\n <!-- List of reference, if any -->\n <div *ngIf=\"references?.length\" class=\"references\">\n <span class=\"references-title\">References</span> <i class=\"fas references-collapse\" [class.fa-chevron-down]=\"showReferences\" [class.fa-chevron-right]=\"!showReferences\" (click)=\"showReferences=!showReferences\"></i>\n <sq-collapse [collapsed]=\"!showReferences\">\n <ng-template>\n <ul>\n <ng-container *ngFor=\"let reference of references\">\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\n <sq-chat-reference\n [class.expanded]=\"attachment.$expanded\"\n [attachment]=\"attachment\"\n [reference]=\"reference\"\n (openPreview)=\"openAttachmentPreview($event)\"\n (openDocument)=\"openOriginalAttachment($event)\">\n </sq-chat-reference>\n </li>\n </ng-container>\n </ul>\n </ng-template>\n </sq-collapse>\n </div>\n\n </div>\n\n <!-- Edit / Regenerate floating actions -->\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy to clipboard\" (click)=\"copyMessage(message)\">\n <i class=\"far fa-clipboard\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\n <i class=\"fas fa-sync-alt\"></i>\n </button>\n <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit(message); liked = true;\">\n <i class=\"far fa-thumbs-up\"></i>\n </button>\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit(message); disliked = true;\">\n <i class=\"far fa-thumbs-down\"></i>\n </button>\n <button class=\"btn btn-sm\" *ngIf=\"canDebug && !!message.additionalProperties.$debug && message.additionalProperties.$debug?.length > 0\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\n <i class=\"far fa-list-alt\"></i>\n </button>\n </div>\n\n <!-- List of suggested actions, if any -->\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\n <div class=\"message-content\">\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\n </div>\n </div>\n </div>\n\n <ng-template #tooltipTpl let-ref>\n <sq-chat-reference\n *ngIf=\"!hiddenTooltip\"\n class=\"expanded\"\n [attachment]=\"ref\"\n [reference]=\"ref.contextId\"\n [partId]=\"ref.$partId\"\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\n </sq-chat-reference>\n </ng-template>\n\n</div>\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:table;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem}.sq-chat-message-actions button:hover{color:var(--ast-primary-color, #005DA7)}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"] }]
|
|
216
|
+
InitialsAvatarComponent, ChatReferenceComponent, ChartComponent], template: "<!-- Message icon -->\r\n<span class=\"message-icon\" [title]=\"message?.role\">\r\n <i class=\"d-block\" [style.width.px]=\"iconSize\" *ngIf=\"!message\"></i>\r\n <i [ngClass]=\"assistantMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"message.role === 'assistant'\"></i>\r\n <ng-container *ngIf=\"message?.role === 'user'\">\r\n <i [ngClass]=\"userMessageIcon\" [style.--sq-size.px]=\"iconSize\" *ngIf=\"!!userMessageIcon; else initialsAvatar\"></i>\r\n <ng-template #initialsAvatar>\r\n <sq-initials-avatar [fullName]=\"name\"></sq-initials-avatar>\r\n </ng-template>\r\n </ng-container>\r\n</span>\r\n\r\n<!-- Message body -->\r\n<div class=\"flex-grow-1\" style=\"min-width: 0;\" [ngClass]=\"'message-'+message.role\">\r\n\r\n <div *ngIf=\"message.additionalProperties.$progress as progress\" class=\"small ms-3 mb-2\">\r\n <a href=\"#\" (click)=\"collapseProgress = !collapseProgress; false\" class=\"text-muted\">\r\n View progress\r\n <i class=\"fas fa-chevron-{{collapseProgress? 'right' : 'down'}}\"></i>\r\n </a>\r\n <sq-collapse [collapsed]=\"collapseProgress\">\r\n <ng-template>\r\n <ul class=\"list-unstyled\">\r\n <li *ngFor=\"let step of progress\">\r\n <i class=\"fas fa-fw fa-check text-success\" *ngIf=\"step.done\"></i>\r\n <i class=\"fas fa-fw fa-spin fa-circle-notch\" *ngIf=\"!step.done\"></i>\r\n <span class=\"ms-2 fw-bold\">{{step.title}}</span>\r\n <span *ngIf=\"step.content\">: {{step.content}}</span>\r\n </li>\r\n </ul>\r\n </ng-template>\r\n </sq-collapse>\r\n </div>\r\n\r\n <div class=\"message-content\" *ngIf=\"message.content\">\r\n\r\n <div *ngIf=\"message?.role === 'assistant' && message.messageType === 'CHART'\">\r\n <sq-assistant-chart [rawChartData]=\"message.content\"></sq-assistant-chart>\r\n </div>\r\n\r\n <remark *ngIf=\"message?.role === 'assistant' && message.messageType === 'MARKDOWN'\" [markdown]=\"message.content\" [processor]=\"processor\">\r\n\r\n <ng-template remarkTemplate=\"chat-reference\" let-ref>\r\n\r\n <a *ngIf=\"referenceMap.get(ref.refId) as attachment; else staticRefTpl\"\r\n class=\"reference\"\r\n [sqTooltip]=\"attachment\"\r\n [sqTooltipTemplate]=\"tooltipTpl\"\r\n [hoverableTooltip]=\"true\"\r\n >{{ref.refId}}\r\n </a>\r\n\r\n <ng-template #staticRefTpl>\r\n <span class=\"reference\">{{ref.refId}}</span>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n <ng-template remarkTemplate=\"streaming-placeholder\">\r\n <span class=\"placeholder-glow\" *ngIf=\"streaming\">\r\n <span class=\"placeholder ms-1\"></span>\r\n </span>\r\n </ng-template>\r\n\r\n <ng-template remarkTemplate=\"code\" let-node>\r\n <div class=\"card mb-2\">\r\n <div class=\"card-header d-flex justify-content-between align-items-center\">\r\n <span>{{node.lang}}</span>\r\n <button class=\"btn btn-light btn-sm\" (click)=\"copyCode(node.value)\"><i class=\"far fa-fw fa-clipboard\"></i> Copy code</button>\r\n </div>\r\n <pre class=\"language-{{node.lang}} my-0 rounded-0 rounded-bottom\"><code class=\"language-{{node.lang}}\">{{node.value}}</code></pre>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template remarkTemplate=\"link\" let-node>\r\n <a [href]=\"node.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{getLinkText(node)}}</a>\r\n </ng-template>\r\n\r\n </remark>\r\n\r\n <p *ngIf=\"message?.role === 'user'\">{{message.content}}</p>\r\n\r\n <!-- List of reference, if any -->\r\n <div *ngIf=\"references?.length\" class=\"references\">\r\n <details role=\"button\" class=\"select-none\" [open]=\"showReferences\">\r\n <summary class=\"references-title\">References</summary>\r\n <ul>\r\n <ng-container *ngFor=\"let reference of references\">\r\n <li *ngIf=\"referenceMap.get(reference) as attachment\" class=\"text-truncate\">\r\n <sq-chat-reference\r\n [class.expanded]=\"attachment.$expanded\"\r\n [attachment]=\"attachment\"\r\n [reference]=\"reference\"\r\n (openPreview)=\"openAttachmentPreview($event)\"\r\n (openDocument)=\"openOriginalAttachment($event)\">\r\n </sq-chat-reference>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </details>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Edit / Regenerate floating actions -->\r\n <div class=\"sq-chat-message-actions\" *ngIf=\"message\">\r\n <button class=\"btn btn-sm\" *ngIf=\"canEdit\" sqTooltip=\"Edit message\" (click)=\"edit.emit(message)\">\r\n <i class=\"fas fa-edit\"></i>\r\n </button>\r\n <button class=\"btn btn-sm\" *ngIf=\"canCopy\" sqTooltip=\"Copy to clipboard\" (click)=\"copyMessage(message)\">\r\n <i class=\"far fa-clipboard\"></i>\r\n </button>\r\n <button class=\"btn btn-sm\" *ngIf=\"canRegenerate\" sqTooltip=\"Regenerate message\" (click)=\"regenerate.emit(message)\">\r\n <i class=\"fas fa-sync-alt\"></i>\r\n </button>\r\n <button class=\"btn btn-sm\" [class.bounce]=\"liked\" *ngIf=\"canLike\" sqTooltip=\"Like the answer\" (click)=\"like.emit(message); liked = true;\">\r\n <i class=\"far fa-thumbs-up\"></i>\r\n </button>\r\n <button class=\"btn btn-sm bounce\" [class.bounce]=\"disliked\" *ngIf=\"canDislike\" sqTooltip=\"Report an issue\" (click)=\"dislike.emit(message); disliked = true;\">\r\n <i class=\"far fa-thumbs-down\"></i>\r\n </button>\r\n <button class=\"btn btn-sm\" *ngIf=\"canDebug && !!message.additionalProperties.$debug && message.additionalProperties.$debug?.length > 0\" sqTooltip=\"Show Log Information\" (click)=\"debug.emit(message);\">\r\n <i class=\"far fa-list-alt\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- List of suggested actions, if any -->\r\n <div *ngIf=\"suggestedActions\" class=\"mt-2 message-suggestion\">\r\n <div class=\"suggested-action\" *ngFor=\"let suggestedAction of suggestedActions\" (click)=\"suggestAction.emit(suggestedAction)\">\r\n <div class=\"message-content\">\r\n <p><i class=\"fas fa-clipboard-question\"></i> {{suggestedAction.content}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #tooltipTpl let-ref>\r\n <sq-chat-reference\r\n *ngIf=\"!hiddenTooltip\"\r\n class=\"expanded\"\r\n [attachment]=\"ref\"\r\n [reference]=\"ref.contextId\"\r\n [partId]=\"ref.$partId\"\r\n (openPreview)=\"openAttachmentPreview($event, ref.$partId)\"\r\n (openDocument)=\"openOriginalAttachment($event, ref.$partId)\">\r\n </sq-chat-reference>\r\n </ng-template>\r\n\r\n</div>\r\n", styles: [".ast-primary{color:var(--ast-primary-color, #005DA7);background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover{background-color:var(--ast-primary-bg, #f2f8fe)}.ast-primary-hover:hover{color:var(--ast-primary-color, #005DA7)}.ast-secondary{color:var(--ast-secondary-color, #FF732E);background-color:var(--ast-secondary-bg, #FFF8F1)}.ast-btn{border:0;text-align:left;padding-top:.5rem;padding-bottom:.5rem;display:flex;align-items:center}.dark{--ast-primary-bg: #0d0701;--ast-primary-color: #008cd1;--ast-secondary-bg: #00070e;--ast-secondary-color: #ffa258;--ast-input-bg: #070707;--ast-input-color: rgba(222, 218, 218, .75);--ast-muted-color: rgba(222, 218, 218, .75);--ast-saved-chat-hover-background: #262421;--ast-message-table-border-color: #333333;--ast-message-table-tr-bg: #070707;--ast-message-table-tr-border-color: #222222;--ast-reference-icon-color: white;--ast-reference-icon-active-color: black;--ast-reference-passages-color: white;--ast-reference-expanded-hover-bg: #262421;--ast-message-reference-color: black}:host{display:flex}:host:not(:hover):not(.last-message) .sq-chat-message-actions{visibility:hidden}.message-content{padding:var(--ast-message-padding, var(--ast-size-3, .75rem));border-radius:var(--ast-message-border-radius, var(--ast-size-4, 1rem));display:inline-block;max-width:100%;overflow-wrap:break-word;word-wrap:break-word;word-break:break-word}.message-content .references{margin-top:var(--ast-size-5, 1.25rem)}.message-content .references ul{border-left:.2rem solid var(--ast-secondary-color, #FF732E);padding-left:var(--ast-size-5, 1.25rem);margin-top:var(--ast-size-2, .5rem)}.message-content .references .references-title{font-weight:var(--font-weight-bold, 500)}.message-content .references .references-collapse{cursor:pointer;margin-left:var(--ast-size-2, .5rem)}.message-content ::ng-deep p:last-child{margin-bottom:0}.message-content ::ng-deep .placeholder-glow .placeholder{animation-duration:.4s;width:12px;height:var(--ast-size-4, 1rem);vertical-align:text-bottom}.message-content ::ng-deep img{max-width:100%}.message-content ::ng-deep table{display:table;border:1px solid;border-color:var(--ast-message-table-border-color, #ccc);border-collapse:collapse;margin:0;padding:0;min-width:100%;overflow-x:auto;table-layout:fixed}.message-content ::ng-deep table tr{background-color:var(--ast-message-table-tr-bg, #f8f8f8);border:1px solid;border-color:var(--ast-message-table-tr-border-color, #ddd);padding:.35em}.message-content ::ng-deep table th,.message-content ::ng-deep table td{padding:.625em;text-align:center}.message-content ::ng-deep table th{font-size:.85em;letter-spacing:.1em;text-transform:uppercase}.message-content ::ng-deep .reference{color:var(--ast-message-reference-color, black)!important}.message-content ::ng-deep ul,.message-content ::ng-deep ol{display:flex;flex-direction:column;gap:.5rem;padding-right:2rem;margin-left:0;margin-right:0;padding-left:40px;unicode-bidi:-webkit-isolate;unicode-bidi:isolate;list-style:disc}.message-content ::ng-deep p:not(:first-child){margin-top:.5rem}.message-assistant .message-content{background:var(--ast-secondary-bg, #FFF8F1)}.message-user .message-content{background:var(--ast-primary-bg, #f2f8fe);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500))}.message-user .message-content p{white-space:pre-line}.message-suggestion .message-content{background:var(--ast-input-bg, #F8F8F8);font-weight:var(--ast-user-font-weight, var(--font-weight-bold, 500));transition:background-color .5s ease,color .5s ease}.message-suggestion .message-content:hover{background:var(--ast-primary-bg, #f2f8fe);color:var(--ast-primary-color, #005DA7)}.message-suggestion .message-content p{white-space:pre-line}.message-suggestion .suggested-action{cursor:pointer}.message-suggestion .suggested-action+.suggested-action{margin-top:var(--ast-size-2, .5rem)}.sq-chat-message-actions{position:absolute;bottom:calc(0rem - var(--ast-size-3, .75rem));display:flex;z-index:999}.sq-chat-message-actions button{font-size:.75rem}.sq-chat-message-actions button:hover{color:var(--ast-primary-color, #005DA7)}.message-icon{margin-top:var(--ast-size-3, .75rem);margin-right:var(--ast-size-4, 1rem)}.bounce{animation:bounce 2s ease}@keyframes bounce{10%{transform:translateY(0)}20%{transform:translateY(-15%)}30%{transform:translateY(0)}35%{transform:translateY(-7%)}37%{transform:translateY(0)}39%{transform:translateY(-3%)}40%{transform:translateY(0)}}\n"] }]
|
|
217
217
|
}], ctorParameters: function () { return [{ type: i1.SearchService }, { type: i2.UIService }, { type: i3.PrincipalWebService }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { message: [{
|
|
218
218
|
type: Input
|
|
219
219
|
}], conversation: [{
|
|
@@ -257,4 +257,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
257
257
|
}], debug: [{
|
|
258
258
|
type: Output
|
|
259
259
|
}] } });
|
|
260
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1tZXNzYWdlL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUErRCxNQUFNLGVBQWUsQ0FBQztBQUt4SyxPQUFPLEVBQUUsT0FBTyxFQUFhLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd6RCxPQUFPLEVBQWEsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sNkNBQTZDLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7OztBQWVqRSxNQUFNLE9BQU8sb0JBQW9CO0lBbUMvQixZQUNT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Q0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxXZWJTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvcmUvd2ViLXNlcnZpY2VzXCI7XG5pbXBvcnQgeyBTZWFyY2hTZXJ2aWNlIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvc2VhcmNoXCI7XG5pbXBvcnQgeyBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIENoYXRNZXNzYWdlLCBTdWdnZXN0ZWRBY3Rpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgdW5pZmllZCwgUHJvY2Vzc29yIH0gZnJvbSBcInVuaWZpZWRcIjtcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tIFwicmVtYXJrLXBhcnNlXCI7XG5pbXBvcnQgeyB2aXNpdCwgQ09OVElOVUUsIEVYSVQgfSBmcm9tIFwidW5pc3QtdXRpbC12aXNpdFwiO1xuaW1wb3J0IHsgVGV4dCwgUGFyZW50LCBDb250ZW50IH0gZnJvbSBcIm1kYXN0XCI7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcInVuaXN0XCI7XG5pbXBvcnQgeyBVSVNlcnZpY2UsIFV0aWxzTW9kdWxlIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvdXRpbHNcIjtcbmltcG9ydCByZW1hcmtHZm0gZnJvbSBcInJlbWFyay1nZm1cIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IENvbGxhcHNlTW9kdWxlIH0gZnJvbSBcIkBzaW5lcXVhL2NvbXBvbmVudHMvY29sbGFwc2VcIjtcbmltcG9ydCB7IFJlbWFya01vZHVsZSB9IGZyb20gXCJuZ3gtcmVtYXJrXCI7XG5pbXBvcnQgeyBJbml0aWFsc0F2YXRhckNvbXBvbmVudCB9IGZyb20gXCIuLi9pbml0aWFscy1hdmF0YXIvaW5pdGlhbHMtYXZhdGFyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgQ2hhdFJlZmVyZW5jZUNvbXBvbmVudCB9IGZyb20gXCIuLi9jaGF0LXJlZmVyZW5jZS9jaGF0LXJlZmVyZW5jZS5jb21wb25lbnRcIjtcblxuaW1wb3J0IFwicHJpc21qcy1jb21wb25lbnRzLWltcG9ydGVyL2VzbVwiO1xuaW1wb3J0ICdwcmlzbWpzL3BsdWdpbnMvYXV0b2xvYWRlci9wcmlzbS1hdXRvbG9hZGVyJztcbmltcG9ydCB7IENoYXJ0Q29tcG9uZW50IH0gZnJvbSBcIi4uL2NoYXJ0cy9jaGFydC9jaGFydC5jb21wb25lbnRcIjtcblxuZGVjbGFyZSBtb2R1bGUgUHJpc20ge1xuICBmdW5jdGlvbiBoaWdobGlnaHRBbGxVbmRlcihlbDogSFRNTEVsZW1lbnQpOiB2b2lkO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwic3EtY2hhdC1tZXNzYWdlXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9jaGF0LW1lc3NhZ2UuY29tcG9uZW50LnNjc3NcIl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBVdGlsc01vZHVsZSwgQ29sbGFwc2VNb2R1bGUsIFJlbWFya01vZHVsZSxcbiAgICBJbml0aWFsc0F2YXRhckNvbXBvbmVudCwgQ2hhdFJlZmVyZW5jZUNvbXBvbmVudCwgQ2hhcnRDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgbWVzc2FnZTogQ2hhdE1lc3NhZ2U7XG4gIEBJbnB1dCgpIGNvbnZlcnNhdGlvbjogQ2hhdE1lc3NhZ2VbXTtcbiAgQElucHV0KCkgc3VnZ2VzdGVkQWN0aW9uczogU3VnZ2VzdGVkQWN0aW9uW10gfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGFzc2lzdGFudE1lc3NhZ2VJY29uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHVzZXJNZXNzYWdlSWNvbjogc3RyaW5nO1xuICBASW5wdXQoKSBzdHJlYW1pbmc6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuUmVnZW5lcmF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5Db3B5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhbkRlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGNhbkxpa2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuRGlzbGlrZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgb3BlbkRvY3VtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx7cmVmZXJlbmNlOiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcn0+KCk7XG4gIEBPdXRwdXQoKSBvcGVuUHJldmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8e3JlZmVyZW5jZTogQ2hhdENvbnRleHRBdHRhY2htZW50LCBwYXJ0SWQ/OiBudW1iZXJ9PigpO1xuICBAT3V0cHV0KCkgc3VnZ2VzdEFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8U3VnZ2VzdGVkQWN0aW9uPigpO1xuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XG4gIEBPdXRwdXQoKSBjb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcbiAgQE91dHB1dCgpIHJlZ2VuZXJhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xuICBAT3V0cHV0KCkgbGlrZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XG4gIEBPdXRwdXQoKSBkaXNsaWtlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcbiAgQE91dHB1dCgpIGRlYnVnID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcblxuICBwcm9jZXNzb3I6IFByb2Nlc3NvcjtcblxuICByZWZlcmVuY2VzOiBzdHJpbmdbXSA9IFtdO1xuICByZWZlcmVuY2VNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2hhdENvbnRleHRBdHRhY2htZW50PigpO1xuICBzaG93UmVmZXJlbmNlczogYm9vbGVhbiA9IHRydWU7XG4gIGNvbGxhcHNlUHJvZ3Jlc3M6IGJvb2xlYW47XG4gIGljb25TaXplID0gMjQ7XG5cbiAgbGlrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlzbGlrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaGlkZGVuVG9vbHRpcDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzZWFyY2hTZXJ2aWNlOiBTZWFyY2hTZXJ2aWNlLFxuICAgIHB1YmxpYyB1aTogVUlTZXJ2aWNlLFxuICAgIHB1YmxpYyBwcmluY2lwYWxTZXJ2aWNlOiBQcmluY2lwYWxXZWJTZXJ2aWNlLFxuICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZlxuICApIHsgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5zdHJlYW1pbmcpIHtcbiAgICAgIHRoaXMuY29sbGFwc2VQcm9ncmVzcyA9ICF0aGlzLnN0cmVhbWluZztcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlcy5tZXNzYWdlICYmIHRoaXMubWVzc2FnZT8ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIikge1xuICAgICAgdGhpcy5yZWZlcmVuY2VzID0gW107XG4gICAgICB0aGlzLnJlZmVyZW5jZU1hcC5jbGVhcigpO1xuICAgICAgZm9yIChsZXQgbSBvZiB0aGlzLmNvbnZlcnNhdGlvbikge1xuICAgICAgICBpZiAobS5hZGRpdGlvbmFsUHJvcGVydGllcy4kYXR0YWNobWVudCkge1xuICAgICAgICAgIGZvciAoY29uc3QgYXR0YWNobWVudCBvZiBtLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRhdHRhY2htZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlZmVyZW5jZU1hcC5zZXQoJycgKyBhdHRhY2htZW50LmNvbnRleHRJZCwgeyAuLi5hdHRhY2htZW50LCAkcGFydElkOiBhdHRhY2htZW50LnBhcnRzPy5bMF0/LnBhcnRJZCB9KTtcbiAgICAgICAgICAgIGlmICghIWF0dGFjaG1lbnQucGFydHMgJiYgYXR0YWNobWVudC5wYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0YWNobWVudC5wYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZklkID0gYCR7YXR0YWNobWVudC5jb250ZXh0SWR9LiR7YXR0YWNobWVudC5wYXJ0c1tpXS5wYXJ0SWR9YDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZU1hcC5zZXQocmVmSWQsIHsgLi4uYXR0YWNobWVudCwgJHBhcnRJZDogYXR0YWNobWVudC5wYXJ0cz8uW2ldPy5wYXJ0SWQgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZihtLmNvbnRlbnQuc3RhcnRzV2l0aChcIjxjaGFydGpzPlwiKSl7XG4gICAgICAgICAgbS5tZXNzYWdlVHlwZSA9IFwiQ0hBUlRcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNle1xuICAgICAgICAgIG0ubWVzc2FnZVR5cGUgPSBcIk1BUktET1dOXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9jZXNzb3IgPSB1bmlmaWVkKClcbiAgICAgICAgLnVzZShyZW1hcmtQYXJzZSlcbiAgICAgICAgLnVzZShyZW1hcmtHZm0pXG4gICAgICAgIC51c2UoKCkgPT4gdGhpcy5yZWZlcmVuY2VQbHVnaW4pO1xuXG4gICAgICBpZiAodGhpcy5zdHJlYW1pbmcpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzb3IgPSB0aGlzLnByb2Nlc3Nvci51c2UoKCkgPT4gdGhpcy5wbGFjZWhvbGRlclBsdWdpbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIFByaXNtPy5oaWdobGlnaHRBbGxVbmRlcj8uKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAhdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbCA/ICcnXG4gICAgICA6IHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWxbJ2Z1bGxOYW1lJ10gYXMgc3RyaW5nIHx8IHRoaXMucHJpbmNpcGFsU2VydmljZS5wcmluY2lwYWwubmFtZTtcbiAgfVxuXG4gIGdldCBpc0FkbWluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByaW5jaXBhbFNlcnZpY2UucHJpbmNpcGFsPy5pc0FkbWluaXN0cmF0b3IgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBVbmlmaWVkIHBsdWdpbiBsb29rcyBhIHRleHQgbm9kZXMgYW5kIHJlcGxhY2VzIGFueSByZWZlcmVuY2UgaW4gdGhlXG4gICAqIGZvcm0gWzFdLCBbMi4zXSwgZXRjLiB3aXRoIGN1c3RvbSBub2RlcyBvZiB0eXBlIFwiY2hhdC1yZWZlcmVuY2VcIi5cbiAgICovXG4gIHJlZmVyZW5jZVBsdWdpbiA9ICh0cmVlOiBOb2RlKSA9PiB7XG5cbiAgICBjb25zdCByZWZlcmVuY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAvLyBWaXNpdCBhbGwgdGV4dCBub2Rlc1xuICAgIHZpc2l0KHRyZWUsIFwidGV4dFwiLCAobm9kZTogVGV4dCwgaW5kZXg6IG51bWJlciwgcGFyZW50OiBQYXJlbnQpID0+IHtcbiAgICAgIGxldCB0ZXh0ID0gbm9kZS52YWx1ZTtcblxuICAgICAgdGV4dCA9IHRoaXMucmVmb3JtYXRSZWZlcmVuY2VzKHRleHQpO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZ2V0UmVmZXJlbmNlTWF0Y2hlcyh0ZXh0KTtcblxuICAgICAgLy8gUXVpdCBpZiBubyByZWZlcmVuY2VzIHdlcmUgZm91bmRcbiAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQ09OVElOVUU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vZGVzOiAoQ29udGVudCAmIHsgZW5kOiBudW1iZXIgfSlbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgIGNvbnN0IHJlZklkID0gbWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICBjb25zdCBbcmVmXSA9IHJlZklkLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgLy8gV2UgZmluZCBhIHZhbGlkIHJlZmVyZW5jZSBpbiB0aGUgdGV4dFxuICAgICAgICBpZiAoIWlzTmFOKCtyZWYpKSB7XG4gICAgICAgICAgcmVmZXJlbmNlcy5hZGQoK3JlZik7IC8vIEFkZCBpdCB0byB0aGUgc2V0IG9mIHVzZWQgcmVmZXJlbmNlc1xuXG4gICAgICAgICAgLy8gSWYgbmVlZGVkLCBpbnNlcnQgYSB0ZXh0IG5vZGUgYmVmb3JlIHRoZSByZWZlcmVuY2VcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gbm9kZXMuYXQoLTEpID8/IHsgZW5kOiAwIH07XG4gICAgICAgICAgaWYgKG1hdGNoLmluZGV4ISA+IGN1cnJlbnQuZW5kKSB7XG4gICAgICAgICAgICBub2Rlcy5wdXNoKHsgdHlwZTogXCJ0ZXh0XCIsIHZhbHVlOiB0ZXh0LnN1YnN0cmluZyhjdXJyZW50LmVuZCwgbWF0Y2guaW5kZXghKSwgZW5kOiBtYXRjaC5pbmRleCEgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWRkIGEgY3VzdG9tIHJlZmVyZW5jZSBub2RlXG4gICAgICAgICAgbm9kZXMucHVzaCh7IHR5cGU6IFwiY2hhdC1yZWZlcmVuY2VcIiwgcmVmSWQsIGVuZDogbWF0Y2guaW5kZXghICsgbWF0Y2hbMF0ubGVuZ3RoIH0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBRdWl0IGlmIG5vIHJlZmVyZW5jZXMgd2VyZSBmb3VuZFxuICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQ09OVElOVUU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2Rlcy5hdCgtMSkhLmVuZCA8IHRleHQubGVuZ3RoKSB7XG4gICAgICAgIG5vZGVzLnB1c2goeyB0eXBlOiBcInRleHRcIiwgdmFsdWU6IHRleHQuc3Vic3RyaW5nKG5vZGVzLmF0KC0xKSEuZW5kLCB0ZXh0Lmxlbmd0aCksIGVuZDogdGV4dC5sZW5ndGggfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgY3VycmVudCB0ZXh0IG5vZGUgZnJvbSB0aGUgcGFyZW50IGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIG5ldyBub2Rlc1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSwgLi4ubm9kZXMpO1xuXG4gICAgICByZXR1cm4gaW5kZXggKyBub2Rlcy5sZW5ndGg7IC8vIFZpc2l0IHRoZSBuZXh0IG5vZGUgYWZ0ZXIgdGhlIGluc2VydGVkIG9uZXNcbiAgICB9KTtcblxuICAgIGlmIChyZWZlcmVuY2VzLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMgPSBBcnJheS5mcm9tKHJlZmVyZW5jZXMudmFsdWVzKCkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhIC0gYilcbiAgICAgICAgLm1hcChyID0+ICcnICsgcik7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyZWU7XG4gIH1cblxuICBwbGFjZWhvbGRlclBsdWdpbiA9ICh0cmVlOiBOb2RlKSA9PiB7XG5cbiAgICB2aXNpdCh0cmVlLCBcInRleHRcIiwgKG5vZGU6IFRleHQsIGluZGV4OiBudW1iZXIsIHBhcmVudDogUGFyZW50KSA9PiB7XG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh7IHR5cGU6IFwic3RyZWFtaW5nLXBsYWNlaG9sZGVyXCIgfSBhcyBhbnkpO1xuICAgICAgcmV0dXJuIEVYSVQ7XG4gICAgfSwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIGdldExpbmtUZXh0KG5vZGU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKG5vZGUudGV4dCkge1xuICAgICAgcmV0dXJuIG5vZGUudGV4dDsgLy8gUmV0dXJuIGRpcmVjdGx5IGlmIHRleHQgaXMgcHJvdmlkZWQgaW4gbm9kZS50ZXh0IChbRXhhbXBsZSBsaW5rXShodHRwczovL2V4YW1wbGUuY29tKSlcbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBSZWN1cnNpdmVseSBzZWFyY2ggZm9yIHRleHQgY29udGVudCBpbiBjaGlsZCBub2Rlc1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChjaGlsZC50eXBlID09PSAndGV4dCcgJiYgY2hpbGQudmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGQudmFsdWU7IC8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IHRleHQgbm9kZSBmb3VuZCAoWyoqRW1waGFzaXplZCBMaW5rIFRleHQqKl0oaHR0cHM6Ly9leGFtcGxlLmNvbSkpXG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGhpcy5nZXRMaW5rVGV4dChjaGlsZCk7IC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBjaGlsZCBub2RlcyAoWyFbRXhhbXBsZSBpbWFnZV0oaHR0cHM6Ly9leGFtcGxlLmNvbS9pbWFnZS5wbmcpXShodHRwczovL2V4YW1wbGUuY29tKSlcbiAgICAgICAgICBpZiAodGV4dENvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0Q29udGVudDsgLy8gUmV0dXJuIHRleHQgY29udGVudCBpZiBmb3VuZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ2xpbmsnOyAvLyBSZXR1cm4gZW1wdHkgc3RyaW5nIGlmIG5vIHRleHQgY29udGVudCBpcyBmb3VuZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlZm9ybWF0IFtpZHM6IDEyLjIsIDQyLjVdIHRvIFsxMi4yXVs0Mi41XVxuICAgKi9cbiAgcmVmb3JtYXRSZWZlcmVuY2VzKGNvbnRlbnQ6IHN0cmluZykge1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoL1xcWyg/Omlkcz86P1xccyopPyg/OmRvY3VtZW50cz86P1xccyopPyhcXHMqKD86LD9cXHMqXFxkKyg/OlxcLlxcZCspPyg/OlxcLnBhcnQpP1xccyopKylcXF0vZyxcbiAgICAgIChzdHIsIG1hdGNoOiBzdHJpbmcpID0+IGBbJHttYXRjaC5yZXBsYWNlKC9cXC5wYXJ0L2csIFwiXCIpLnNwbGl0KCcsJykuam9pbihcIl0gW1wiKX1dYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTWF0Y2ggYWxsIHJlZmVyZW5jZXMgaW4gYSBnaXZlbiBtZXNzYWdlXG4gICAqL1xuICBnZXRSZWZlcmVuY2VNYXRjaGVzKGNvbnRlbnQ6IHN0cmluZykge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGNvbnRlbnQubWF0Y2hBbGwoL1xcWyhcXHMqXFxkKyg/OlxcLlxcZCspP1xccyopXFxdL2cpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvcHlUb0NsaXBib2FyZChjb250ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLnVpLmNvcHlUb0NsaXBib2FyZChjb250ZW50KTtcblxuICB9XG5cbiAgY29weU1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcbiAgICB0aGlzLl9jb3B5VG9DbGlwYm9hcmQobWVzc2FnZS5jb250ZW50KTtcbiAgICB0aGlzLmNvcHkuZW1pdChtZXNzYWdlKTtcbiAgfVxuXG4gIGNvcHlDb2RlKGNvZGU6IHN0cmluZykge1xuICAgIHRoaXMuX2NvcHlUb0NsaXBib2FyZChjb2RlKTtcbiAgfVxuXG4gIG9wZW5BdHRhY2htZW50UHJldmlldyhhdHRhY2htZW50OiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcikge1xuICAgIHRoaXMub3BlblByZXZpZXcuZW1pdCh7cmVmZXJlbmNlOiBhdHRhY2htZW50LCBwYXJ0SWR9KTtcbiAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gIH1cblxuICBvcGVuT3JpZ2luYWxBdHRhY2htZW50KGF0dGFjaG1lbnQ6IENoYXRDb250ZXh0QXR0YWNobWVudCwgcGFydElkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5vcGVuRG9jdW1lbnQuZW1pdCh7cmVmZXJlbmNlOiBhdHRhY2htZW50LCBwYXJ0SWR9KTtcbiAgICB0aGlzLmhpZGVUb29sdGlwKCk7XG4gIH1cblxuICBoaWRlVG9vbHRpcCgpOiB2b2lkIHtcbiAgICB0aGlzLmhpZGRlblRvb2x0aXAgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5oaWRkZW5Ub29sdGlwID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjwhLS0gTWVzc2FnZSBpY29uIC0tPlxuPHNwYW4gY2xhc3M9XCJtZXNzYWdlLWljb25cIiBbdGl0bGVdPVwibWVzc2FnZT8ucm9sZVwiPlxuICA8aSBjbGFzcz1cImQtYmxvY2tcIiBbc3R5bGUud2lkdGgucHhdPVwiaWNvblNpemVcIiAqbmdJZj1cIiFtZXNzYWdlXCI+PC9pPlxuICA8aSBbbmdDbGFzc109XCJhc3Npc3RhbnRNZXNzYWdlSWNvblwiIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIiAqbmdJZj1cIm1lc3NhZ2Uucm9sZSA9PT0gJ2Fzc2lzdGFudCdcIj48L2k+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlPy5yb2xlID09PSAndXNlcidcIj5cbiAgICA8aSBbbmdDbGFzc109XCJ1c2VyTWVzc2FnZUljb25cIiBbc3R5bGUuLS1zcS1zaXplLnB4XT1cImljb25TaXplXCIgKm5nSWY9XCIhIXVzZXJNZXNzYWdlSWNvbjsgZWxzZSBpbml0aWFsc0F2YXRhclwiPjwvaT5cbiAgICA8bmctdGVtcGxhdGUgI2luaXRpYWxzQXZhdGFyPlxuICAgICAgPHNxLWluaXRpYWxzLWF2YXRhciBbZnVsbE5hbWVdPVwibmFtZVwiPjwvc3EtaW5pdGlhbHMtYXZhdGFyPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9zcGFuPlxuXG48IS0tIE1lc3NhZ2UgYm9keSAtLT5cbjxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiIHN0eWxlPVwibWluLXdpZHRoOiAwO1wiIFtuZ0NsYXNzXT1cIidtZXNzYWdlLScrbWVzc2FnZS5yb2xlXCI+XG5cbiAgPGRpdiAqbmdJZj1cIm1lc3NhZ2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJHByb2dyZXNzIGFzIHByb2dyZXNzXCIgY2xhc3M9XCJzbWFsbCBtcy0zIG1iLTJcIj5cbiAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJjb2xsYXBzZVByb2dyZXNzID0gIWNvbGxhcHNlUHJvZ3Jlc3M7IGZhbHNlXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XG4gICAgICBWaWV3IHByb2dyZXNzXG4gICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXt7Y29sbGFwc2VQcm9ncmVzcz8gJ3JpZ2h0JyA6ICdkb3duJ319XCI+PC9pPlxuICAgIDwvYT5cbiAgICA8c3EtY29sbGFwc2UgW2NvbGxhcHNlZF09XCJjb2xsYXBzZVByb2dyZXNzXCI+XG4gICAgICA8bmctdGVtcGxhdGU+XG4gICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWRcIj5cbiAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHN0ZXAgb2YgcHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWZ3IGZhLWNoZWNrIHRleHQtc3VjY2Vzc1wiICpuZ0lmPVwic3RlcC5kb25lXCI+PC9pPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZncgZmEtc3BpbiBmYS1jaXJjbGUtbm90Y2hcIiAqbmdJZj1cIiFzdGVwLmRvbmVcIj48L2k+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTIgZnctYm9sZFwiPnt7c3RlcC50aXRsZX19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzdGVwLmNvbnRlbnRcIj46IHt7c3RlcC5jb250ZW50fX08L3NwYW4+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9zcS1jb2xsYXBzZT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiICpuZ0lmPVwibWVzc2FnZS5jb250ZW50XCI+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibWVzc2FnZT8ucm9sZSA9PT0gJ2Fzc2lzdGFudCcgJiYgbWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ0NIQVJUJ1wiPlxuICAgICAgPHNxLWFzc2lzdGFudC1jaGFydCBbcmF3Q2hhcnREYXRhXT1cIm1lc3NhZ2UuY29udGVudFwiPjwvc3EtYXNzaXN0YW50LWNoYXJ0PlxuICAgIDwvZGl2PlxuXG4gICAgPHJlbWFyayAqbmdJZj1cIm1lc3NhZ2U/LnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNQVJLRE9XTidcIiBbbWFya2Rvd25dPVwibWVzc2FnZS5jb250ZW50XCIgW3Byb2Nlc3Nvcl09XCJwcm9jZXNzb3JcIj5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwiY2hhdC1yZWZlcmVuY2VcIiBsZXQtcmVmPlxuXG4gICAgICAgIDxhICpuZ0lmPVwicmVmZXJlbmNlTWFwLmdldChyZWYucmVmSWQpIGFzIGF0dGFjaG1lbnQ7IGVsc2Ugc3RhdGljUmVmVHBsXCJcbiAgICAgICAgICBjbGFzcz1cInJlZmVyZW5jZVwiXG4gICAgICAgICAgW3NxVG9vbHRpcF09XCJhdHRhY2htZW50XCJcbiAgICAgICAgICBbc3FUb29sdGlwVGVtcGxhdGVdPVwidG9vbHRpcFRwbFwiXG4gICAgICAgICAgW2hvdmVyYWJsZVRvb2x0aXBdPVwidHJ1ZVwiXG4gICAgICAgICAgPnt7cmVmLnJlZklkfX1cbiAgICAgICAgPC9hPlxuXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc3RhdGljUmVmVHBsPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVmZXJlbmNlXCI+e3tyZWYucmVmSWR9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwic3RyZWFtaW5nLXBsYWNlaG9sZGVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGxhY2Vob2xkZXItZ2xvd1wiICpuZ0lmPVwic3RyZWFtaW5nXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbGFjZWhvbGRlciBtcy0xXCI+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgcmVtYXJrVGVtcGxhdGU9XCJjb2RlXCIgbGV0LW5vZGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIG1iLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPHNwYW4+e3tub2RlLmxhbmd9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIChjbGljayk9XCJjb3B5Q29kZShub2RlLnZhbHVlKVwiPjxpIGNsYXNzPVwiZmFyIGZhLWZ3IGZhLWNsaXBib2FyZFwiPjwvaT4gQ29weSBjb2RlPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHByZSBjbGFzcz1cImxhbmd1YWdlLXt7bm9kZS5sYW5nfX0gbXktMCByb3VuZGVkLTAgcm91bmRlZC1ib3R0b21cIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLXt7bm9kZS5sYW5nfX1cIj57e25vZGUudmFsdWV9fTwvY29kZT48L3ByZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgcmVtYXJrVGVtcGxhdGU9XCJsaW5rXCIgbGV0LW5vZGU+XG4gICAgICAgIDxhIFtocmVmXT1cIm5vZGUudXJsXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPnt7Z2V0TGlua1RleHQobm9kZSl9fTwvYT5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8L3JlbWFyaz5cblxuICAgIDxwICpuZ0lmPVwibWVzc2FnZT8ucm9sZSA9PT0gJ3VzZXInXCI+e3ttZXNzYWdlLmNvbnRlbnR9fTwvcD5cblxuICAgIDwhLS0gTGlzdCBvZiByZWZlcmVuY2UsIGlmIGFueSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwicmVmZXJlbmNlcz8ubGVuZ3RoXCIgY2xhc3M9XCJyZWZlcmVuY2VzXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInJlZmVyZW5jZXMtdGl0bGVcIj5SZWZlcmVuY2VzPC9zcGFuPiA8aSBjbGFzcz1cImZhcyByZWZlcmVuY2VzLWNvbGxhcHNlXCIgW2NsYXNzLmZhLWNoZXZyb24tZG93bl09XCJzaG93UmVmZXJlbmNlc1wiIFtjbGFzcy5mYS1jaGV2cm9uLXJpZ2h0XT1cIiFzaG93UmVmZXJlbmNlc1wiIChjbGljayk9XCJzaG93UmVmZXJlbmNlcz0hc2hvd1JlZmVyZW5jZXNcIj48L2k+XG4gICAgICA8c3EtY29sbGFwc2UgW2NvbGxhcHNlZF09XCIhc2hvd1JlZmVyZW5jZXNcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlPlxuICAgICAgICAgIDx1bD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzXCI+XG4gICAgICAgICAgICAgIDxsaSAqbmdJZj1cInJlZmVyZW5jZU1hcC5nZXQocmVmZXJlbmNlKSBhcyBhdHRhY2htZW50XCIgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgICAgICAgIDxzcS1jaGF0LXJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmV4cGFuZGVkXT1cImF0dGFjaG1lbnQuJGV4cGFuZGVkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRhY2htZW50XT1cImF0dGFjaG1lbnRcIlxuICAgICAgICAgICAgICAgICAgW3JlZmVyZW5jZV09XCJyZWZlcmVuY2VcIlxuICAgICAgICAgICAgICAgICAgKG9wZW5QcmV2aWV3KT1cIm9wZW5BdHRhY2htZW50UHJldmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChvcGVuRG9jdW1lbnQpPVwib3Blbk9yaWdpbmFsQXR0YWNobWVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9zcS1jaGF0LXJlZmVyZW5jZT5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L3NxLWNvbGxhcHNlPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gICAgPCEtLSBFZGl0IC8gUmVnZW5lcmF0ZSBmbG9hdGluZyBhY3Rpb25zIC0tPlxuICA8ZGl2IGNsYXNzPVwic3EtY2hhdC1tZXNzYWdlLWFjdGlvbnNcIiAqbmdJZj1cIm1lc3NhZ2VcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbVwiICpuZ0lmPVwiY2FuRWRpdFwiIHNxVG9vbHRpcD1cIkVkaXQgbWVzc2FnZVwiIChjbGljayk9XCJlZGl0LmVtaXQobWVzc2FnZSlcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiAqbmdJZj1cImNhbkNvcHlcIiBzcVRvb2x0aXA9XCJDb3B5IHRvIGNsaXBib2FyZFwiIChjbGljayk9XCJjb3B5TWVzc2FnZShtZXNzYWdlKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtY2xpcGJvYXJkXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgKm5nSWY9XCJjYW5SZWdlbmVyYXRlXCIgc3FUb29sdGlwPVwiUmVnZW5lcmF0ZSBtZXNzYWdlXCIgKGNsaWNrKT1cInJlZ2VuZXJhdGUuZW1pdChtZXNzYWdlKVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3luYy1hbHRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiBbY2xhc3MuYm91bmNlXT1cImxpa2VkXCIgKm5nSWY9XCJjYW5MaWtlXCIgc3FUb29sdGlwPVwiTGlrZSB0aGUgYW5zd2VyXCIgKGNsaWNrKT1cImxpa2UuZW1pdChtZXNzYWdlKTsgbGlrZWQgPSB0cnVlO1wiPlxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGh1bWJzLXVwXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJvdW5jZVwiICBbY2xhc3MuYm91bmNlXT1cImRpc2xpa2VkXCIgKm5nSWY9XCJjYW5EaXNsaWtlXCIgc3FUb29sdGlwPVwiUmVwb3J0IGFuIGlzc3VlXCIgKGNsaWNrKT1cImRpc2xpa2UuZW1pdChtZXNzYWdlKTsgZGlzbGlrZWQgPSB0cnVlO1wiPlxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGh1bWJzLWRvd25cIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiAqbmdJZj1cImNhbkRlYnVnICYmICEhbWVzc2FnZS5hZGRpdGlvbmFsUHJvcGVydGllcy4kZGVidWcgJiYgbWVzc2FnZS5hZGRpdGlvbmFsUHJvcGVydGllcy4kZGVidWc/Lmxlbmd0aCA+IDBcIiBzcVRvb2x0aXA9XCJTaG93IExvZyBJbmZvcm1hdGlvblwiIChjbGljayk9XCJkZWJ1Zy5lbWl0KG1lc3NhZ2UpO1wiPlxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtbGlzdC1hbHRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTGlzdCBvZiBzdWdnZXN0ZWQgYWN0aW9ucywgaWYgYW55IC0tPlxuICA8ZGl2ICpuZ0lmPVwic3VnZ2VzdGVkQWN0aW9uc1wiIGNsYXNzPVwibXQtMiBtZXNzYWdlLXN1Z2dlc3Rpb25cIj5cbiAgICA8ZGl2IGNsYXNzPVwic3VnZ2VzdGVkLWFjdGlvblwiICpuZ0Zvcj1cImxldCBzdWdnZXN0ZWRBY3Rpb24gb2Ygc3VnZ2VzdGVkQWN0aW9uc1wiIChjbGljayk9XCJzdWdnZXN0QWN0aW9uLmVtaXQoc3VnZ2VzdGVkQWN0aW9uKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiPlxuICAgICAgICA8cD48aSBjbGFzcz1cImZhcyBmYS1jbGlwYm9hcmQtcXVlc3Rpb25cIj48L2k+IHt7c3VnZ2VzdGVkQWN0aW9uLmNvbnRlbnR9fTwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8bmctdGVtcGxhdGUgI3Rvb2x0aXBUcGwgbGV0LXJlZj5cbiAgICA8c3EtY2hhdC1yZWZlcmVuY2VcbiAgICAgICpuZ0lmPVwiIWhpZGRlblRvb2x0aXBcIlxuICAgICAgY2xhc3M9XCJleHBhbmRlZFwiXG4gICAgICBbYXR0YWNobWVudF09XCJyZWZcIlxuICAgICAgW3JlZmVyZW5jZV09XCJyZWYuY29udGV4dElkXCJcbiAgICAgIFtwYXJ0SWRdPVwicmVmLiRwYXJ0SWRcIlxuICAgICAgKG9wZW5QcmV2aWV3KT1cIm9wZW5BdHRhY2htZW50UHJldmlldygkZXZlbnQsIHJlZi4kcGFydElkKVwiXG4gICAgICAob3BlbkRvY3VtZW50KT1cIm9wZW5PcmlnaW5hbEF0dGFjaG1lbnQoJGV2ZW50LCByZWYuJHBhcnRJZClcIj5cbiAgICA8L3NxLWNoYXQtcmVmZXJlbmNlPlxuICA8L25nLXRlbXBsYXRlPlxuXG48L2Rpdj5cbiJdfQ==
|
|
260
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fzc2lzdGFudC9jaGF0L2NoYXQtbWVzc2FnZS9jaGF0LW1lc3NhZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNzaXN0YW50L2NoYXQvY2hhdC1tZXNzYWdlL2NoYXQtbWVzc2FnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUErRCxNQUFNLGVBQWUsQ0FBQztBQUt4SyxPQUFPLEVBQUUsT0FBTyxFQUFhLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUd6RCxPQUFPLEVBQWEsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sNkNBQTZDLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7OztBQWVqRSxNQUFNLE9BQU8sb0JBQW9CO0lBbUMvQixZQUNTLGFBQTRCLEVBQzVCLEVBQWEsRUFDYixnQkFBcUMsRUFDckMsR0FBc0IsRUFDdEIsRUFBYztRQUpkLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLE9BQUUsR0FBRixFQUFFLENBQVc7UUFDYixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXFCO1FBQ3JDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLE9BQUUsR0FBRixFQUFFLENBQVk7UUFqQ2QsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUMvQixZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzNCLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXVELENBQUM7UUFDdkYsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBdUQsQ0FBQztRQUN0RixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBQ3BELFNBQUksR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQ3ZDLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQ3ZDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQzdDLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQ3ZDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQzFDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBSWxELGVBQVUsR0FBYSxFQUFFLENBQUM7UUFDMUIsaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztRQUN4RCxtQkFBYyxHQUFZLElBQUksQ0FBQztRQUUvQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWQsVUFBSyxHQUFZLEtBQUssQ0FBQztRQUN2QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBK0QvQjs7O1dBR0c7UUFDSCxvQkFBZSxHQUFHLENBQUMsSUFBVSxFQUFFLEVBQUU7WUFFL0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztZQUVyQyx1QkFBdUI7WUFDdkIsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFVLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxFQUFFO2dCQUNoRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUV0QixJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRS9DLG1DQUFtQztnQkFDbkMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtvQkFDeEIsT0FBTyxRQUFRLENBQUM7aUJBQ2pCO2dCQUVELE1BQU0sS0FBSyxHQUFrQyxFQUFFLENBQUM7Z0JBRWhELEtBQUssSUFBSSxLQUFLLElBQUksT0FBTyxFQUFFO29CQUN6QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzlCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUMvQix3Q0FBd0M7b0JBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDaEIsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsdUNBQXVDO3dCQUU3RCxxREFBcUQ7d0JBQ3JELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQzt3QkFDM0MsSUFBSSxLQUFLLENBQUMsS0FBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUU7NEJBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBTSxFQUFFLENBQUMsQ0FBQzt5QkFDbkc7d0JBRUQsOEJBQThCO3dCQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFTLENBQUMsQ0FBQztxQkFDM0Y7aUJBQ0Y7Z0JBRUQsbUNBQW1DO2dCQUNuQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUN0QixPQUFPLFFBQVEsQ0FBQztpQkFDakI7Z0JBRUQsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUU7b0JBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDdkc7Z0JBRUQsaUZBQWlGO2dCQUNqRixNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7Z0JBRTNDLE9BQU8sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyw4Q0FBOEM7WUFDN0UsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO2dCQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO3FCQUM5QyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNyQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDMUI7WUFFRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQTtRQUVELHNCQUFpQixHQUFHLENBQUMsSUFBVSxFQUFFLEVBQUU7WUFFakMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFVLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxFQUFFO2dCQUNoRSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBUyxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRVQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUE7SUFoSUcsQ0FBQztJQUVMLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDckIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUN6QztRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksS0FBSyxXQUFXLEVBQUU7WUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxQixLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRTtvQkFDdEMsS0FBSyxNQUFNLFVBQVUsSUFBSSxDQUFDLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFO3dCQUMzRCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzt3QkFDNUcsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7NEJBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQ0FDaEQsTUFBTSxLQUFLLEdBQUcsR0FBRyxVQUFVLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0NBQ3RFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQzs2QkFDekY7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7Z0JBRUQsSUFBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBQztvQkFDbkMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7aUJBQ3pCO3FCQUNHO29CQUNGLENBQUMsQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO2lCQUM1QjthQUNGO1lBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLEVBQUU7aUJBQ3ZCLEdBQUcsQ0FBQyxXQUFXLENBQUM7aUJBQ2hCLEdBQUcsQ0FBQyxTQUFTLENBQUM7aUJBQ2QsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUVuQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFDbkU7U0FDRjtJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsS0FBSyxFQUFFLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDMUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFXLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDcEcsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxlQUFlLElBQUksS0FBSyxDQUFDO0lBQ25FLENBQUM7SUE2RUQsV0FBVyxDQUFDLElBQVM7UUFDbkIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMseUZBQXlGO1NBQzVHO2FBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNwRCxxREFBcUQ7WUFDckQsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNqQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7b0JBQ3hDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLGtHQUFrRztpQkFDdkg7cUJBQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDBHQUEwRztvQkFDdkosSUFBSSxXQUFXLEVBQUU7d0JBQ2YsT0FBTyxXQUFXLENBQUMsQ0FBQywrQkFBK0I7cUJBQ3BEO2lCQUNGO2FBQ0Y7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDLENBQUMsa0RBQWtEO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUFDLE9BQWU7UUFDaEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLG1GQUFtRixFQUN4RyxDQUFDLEdBQUcsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUNuRixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUJBQW1CLENBQUMsT0FBZTtRQUNqQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE9BQWU7UUFDdEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFbkMsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFvQjtRQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBWTtRQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELHFCQUFxQixDQUFDLFVBQWlDLEVBQUUsTUFBZTtRQUN0RSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELHNCQUFzQixDQUFDLFVBQWlDLEVBQUUsTUFBZTtRQUN2RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztpSEEzT1Usb0JBQW9CO3FHQUFwQixvQkFBb0IseW9CQ25DakMsc3ZOQW9KQSxpNklEcEhZLFlBQVksNlZBQUUsV0FBVyxzUEFBRSxjQUFjLHdIQUFFLFlBQVksbVFBQy9ELHVCQUF1Qiw2RkFBRSxzQkFBc0IsdUpBQUUsY0FBYzsyRkFFdEQsb0JBQW9CO2tCQVRoQyxTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFlBQVk7d0JBQy9ELHVCQUF1QixFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBQzt1TkFHekQsT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0ksWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csSUFBSTtzQkFBYixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFByaW5jaXBhbFdlYlNlcnZpY2UgfSBmcm9tIFwiQHNpbmVxdWEvY29yZS93ZWItc2VydmljZXNcIjtcclxuaW1wb3J0IHsgU2VhcmNoU2VydmljZSB9IGZyb20gXCJAc2luZXF1YS9jb21wb25lbnRzL3NlYXJjaFwiO1xyXG5pbXBvcnQgeyBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIENoYXRNZXNzYWdlLCBTdWdnZXN0ZWRBY3Rpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcclxuXHJcbmltcG9ydCB7IHVuaWZpZWQsIFByb2Nlc3NvciB9IGZyb20gXCJ1bmlmaWVkXCI7XHJcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tIFwicmVtYXJrLXBhcnNlXCI7XHJcbmltcG9ydCB7IHZpc2l0LCBDT05USU5VRSwgRVhJVCB9IGZyb20gXCJ1bmlzdC11dGlsLXZpc2l0XCI7XHJcbmltcG9ydCB7IFRleHQsIFBhcmVudCwgQ29udGVudCB9IGZyb20gXCJtZGFzdFwiO1xyXG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcInVuaXN0XCI7XHJcbmltcG9ydCB7IFVJU2VydmljZSwgVXRpbHNNb2R1bGUgfSBmcm9tIFwiQHNpbmVxdWEvY29tcG9uZW50cy91dGlsc1wiO1xyXG5pbXBvcnQgcmVtYXJrR2ZtIGZyb20gXCJyZW1hcmstZ2ZtXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgQ29sbGFwc2VNb2R1bGUgfSBmcm9tIFwiQHNpbmVxdWEvY29tcG9uZW50cy9jb2xsYXBzZVwiO1xyXG5pbXBvcnQgeyBSZW1hcmtNb2R1bGUgfSBmcm9tIFwibmd4LXJlbWFya1wiO1xyXG5pbXBvcnQgeyBJbml0aWFsc0F2YXRhckNvbXBvbmVudCB9IGZyb20gXCIuLi9pbml0aWFscy1hdmF0YXIvaW5pdGlhbHMtYXZhdGFyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBDaGF0UmVmZXJlbmNlQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NoYXQtcmVmZXJlbmNlL2NoYXQtcmVmZXJlbmNlLmNvbXBvbmVudFwiO1xyXG5cclxuaW1wb3J0IFwicHJpc21qcy1jb21wb25lbnRzLWltcG9ydGVyL2VzbVwiO1xyXG5pbXBvcnQgJ3ByaXNtanMvcGx1Z2lucy9hdXRvbG9hZGVyL3ByaXNtLWF1dG9sb2FkZXInO1xyXG5pbXBvcnQgeyBDaGFydENvbXBvbmVudCB9IGZyb20gXCIuLi9jaGFydHMvY2hhcnQvY2hhcnQuY29tcG9uZW50XCI7XHJcblxyXG5kZWNsYXJlIG1vZHVsZSBQcmlzbSB7XHJcbiAgZnVuY3Rpb24gaGlnaGxpZ2h0QWxsVW5kZXIoZWw6IEhUTUxFbGVtZW50KTogdm9pZDtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwic3EtY2hhdC1tZXNzYWdlXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9jaGF0LW1lc3NhZ2UuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vY2hhdC1tZXNzYWdlLmNvbXBvbmVudC5zY3NzXCJdLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVXRpbHNNb2R1bGUsIENvbGxhcHNlTW9kdWxlLCBSZW1hcmtNb2R1bGUsXHJcbiAgICBJbml0aWFsc0F2YXRhckNvbXBvbmVudCwgQ2hhdFJlZmVyZW5jZUNvbXBvbmVudCwgQ2hhcnRDb21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQElucHV0KCkgbWVzc2FnZTogQ2hhdE1lc3NhZ2U7XHJcbiAgQElucHV0KCkgY29udmVyc2F0aW9uOiBDaGF0TWVzc2FnZVtdO1xyXG4gIEBJbnB1dCgpIHN1Z2dlc3RlZEFjdGlvbnM6IFN1Z2dlc3RlZEFjdGlvbltdIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGFzc2lzdGFudE1lc3NhZ2VJY29uOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdXNlck1lc3NhZ2VJY29uOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc3RyZWFtaW5nOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGNhbkVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjYW5SZWdlbmVyYXRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY2FuQ29weTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNhbkRlYnVnOiBib29sZWFuID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY2FuTGlrZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNhbkRpc2xpa2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgb3BlbkRvY3VtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx7cmVmZXJlbmNlOiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcn0+KCk7XHJcbiAgQE91dHB1dCgpIG9wZW5QcmV2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjx7cmVmZXJlbmNlOiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcn0+KCk7XHJcbiAgQE91dHB1dCgpIHN1Z2dlc3RBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPFN1Z2dlc3RlZEFjdGlvbj4oKTtcclxuICBAT3V0cHV0KCkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgQE91dHB1dCgpIGNvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xyXG4gIEBPdXRwdXQoKSByZWdlbmVyYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGF0TWVzc2FnZT4oKTtcclxuICBAT3V0cHV0KCkgbGlrZSA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgQE91dHB1dCgpIGRpc2xpa2UgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXRNZXNzYWdlPigpO1xyXG4gIEBPdXRwdXQoKSBkZWJ1ZyA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhdE1lc3NhZ2U+KCk7XHJcblxyXG4gIHByb2Nlc3NvcjogUHJvY2Vzc29yO1xyXG5cclxuICByZWZlcmVuY2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHJlZmVyZW5jZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDaGF0Q29udGV4dEF0dGFjaG1lbnQ+KCk7XHJcbiAgc2hvd1JlZmVyZW5jZXM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGNvbGxhcHNlUHJvZ3Jlc3M6IGJvb2xlYW47XHJcbiAgaWNvblNpemUgPSAyNDtcclxuXHJcbiAgbGlrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaXNsaWtlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhpZGRlblRvb2x0aXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgc2VhcmNoU2VydmljZTogU2VhcmNoU2VydmljZSxcclxuICAgIHB1YmxpYyB1aTogVUlTZXJ2aWNlLFxyXG4gICAgcHVibGljIHByaW5jaXBhbFNlcnZpY2U6IFByaW5jaXBhbFdlYlNlcnZpY2UsXHJcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZlxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnN0cmVhbWluZykge1xyXG4gICAgICB0aGlzLmNvbGxhcHNlUHJvZ3Jlc3MgPSAhdGhpcy5zdHJlYW1pbmc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMubWVzc2FnZSAmJiB0aGlzLm1lc3NhZ2U/LnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcclxuICAgICAgdGhpcy5yZWZlcmVuY2VzID0gW107XHJcbiAgICAgIHRoaXMucmVmZXJlbmNlTWFwLmNsZWFyKCk7XHJcbiAgICAgIGZvciAobGV0IG0gb2YgdGhpcy5jb252ZXJzYXRpb24pIHtcclxuICAgICAgICBpZiAobS5hZGRpdGlvbmFsUHJvcGVydGllcy4kYXR0YWNobWVudCkge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBhdHRhY2htZW50IG9mIG0uYWRkaXRpb25hbFByb3BlcnRpZXMuJGF0dGFjaG1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VNYXAuc2V0KCcnICsgYXR0YWNobWVudC5jb250ZXh0SWQsIHsgLi4uYXR0YWNobWVudCwgJHBhcnRJZDogYXR0YWNobWVudC5wYXJ0cz8uWzBdPy5wYXJ0SWQgfSk7XHJcbiAgICAgICAgICAgIGlmICghIWF0dGFjaG1lbnQucGFydHMgJiYgYXR0YWNobWVudC5wYXJ0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRhY2htZW50LnBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZWZJZCA9IGAke2F0dGFjaG1lbnQuY29udGV4dElkfS4ke2F0dGFjaG1lbnQucGFydHNbaV0ucGFydElkfWA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZU1hcC5zZXQocmVmSWQsIHsgLi4uYXR0YWNobWVudCwgJHBhcnRJZDogYXR0YWNobWVudC5wYXJ0cz8uW2ldPy5wYXJ0SWQgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihtLmNvbnRlbnQuc3RhcnRzV2l0aChcIjxjaGFydGpzPlwiKSl7XHJcbiAgICAgICAgICBtLm1lc3NhZ2VUeXBlID0gXCJDSEFSVFwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNle1xyXG4gICAgICAgICAgbS5tZXNzYWdlVHlwZSA9IFwiTUFSS0RPV05cIjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucHJvY2Vzc29yID0gdW5pZmllZCgpXHJcbiAgICAgICAgLnVzZShyZW1hcmtQYXJzZSlcclxuICAgICAgICAudXNlKHJlbWFya0dmbSlcclxuICAgICAgICAudXNlKCgpID0+IHRoaXMucmVmZXJlbmNlUGx1Z2luKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnN0cmVhbWluZykge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc29yID0gdGhpcy5wcm9jZXNzb3IudXNlKCgpID0+IHRoaXMucGxhY2Vob2xkZXJQbHVnaW4pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBQcmlzbT8uaGlnaGxpZ2h0QWxsVW5kZXI/Lih0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAhdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbCA/ICcnXHJcbiAgICAgIDogdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbFsnZnVsbE5hbWUnXSBhcyBzdHJpbmcgfHwgdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbC5uYW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQWRtaW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmluY2lwYWxTZXJ2aWNlLnByaW5jaXBhbD8uaXNBZG1pbmlzdHJhdG9yIHx8IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBVbmlmaWVkIHBsdWdpbiBsb29rcyBhIHRleHQgbm9kZXMgYW5kIHJlcGxhY2VzIGFueSByZWZlcmVuY2UgaW4gdGhlXHJcbiAgICogZm9ybSBbMV0sIFsyLjNdLCBldGMuIHdpdGggY3VzdG9tIG5vZGVzIG9mIHR5cGUgXCJjaGF0LXJlZmVyZW5jZVwiLlxyXG4gICAqL1xyXG4gIHJlZmVyZW5jZVBsdWdpbiA9ICh0cmVlOiBOb2RlKSA9PiB7XHJcblxyXG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xyXG5cclxuICAgIC8vIFZpc2l0IGFsbCB0ZXh0IG5vZGVzXHJcbiAgICB2aXNpdCh0cmVlLCBcInRleHRcIiwgKG5vZGU6IFRleHQsIGluZGV4OiBudW1iZXIsIHBhcmVudDogUGFyZW50KSA9PiB7XHJcbiAgICAgIGxldCB0ZXh0ID0gbm9kZS52YWx1ZTtcclxuXHJcbiAgICAgIHRleHQgPSB0aGlzLnJlZm9ybWF0UmVmZXJlbmNlcyh0ZXh0KTtcclxuICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZ2V0UmVmZXJlbmNlTWF0Y2hlcyh0ZXh0KTtcclxuXHJcbiAgICAgIC8vIFF1aXQgaWYgbm8gcmVmZXJlbmNlcyB3ZXJlIGZvdW5kXHJcbiAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiBDT05USU5VRTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgbm9kZXM6IChDb250ZW50ICYgeyBlbmQ6IG51bWJlciB9KVtdID0gW107XHJcblxyXG4gICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XHJcbiAgICAgICAgY29uc3QgcmVmSWQgPSBtYXRjaFsxXS50cmltKCk7XHJcbiAgICAgICAgY29uc3QgW3JlZl0gPSByZWZJZC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgLy8gV2UgZmluZCBhIHZhbGlkIHJlZmVyZW5jZSBpbiB0aGUgdGV4dFxyXG4gICAgICAgIGlmICghaXNOYU4oK3JlZikpIHtcclxuICAgICAgICAgIHJlZmVyZW5jZXMuYWRkKCtyZWYpOyAvLyBBZGQgaXQgdG8gdGhlIHNldCBvZiB1c2VkIHJlZmVyZW5jZXNcclxuXHJcbiAgICAgICAgICAvLyBJZiBuZWVkZWQsIGluc2VydCBhIHRleHQgbm9kZSBiZWZvcmUgdGhlIHJlZmVyZW5jZVxyXG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IG5vZGVzLmF0KC0xKSA/PyB7IGVuZDogMCB9O1xyXG4gICAgICAgICAgaWYgKG1hdGNoLmluZGV4ISA+IGN1cnJlbnQuZW5kKSB7XHJcbiAgICAgICAgICAgIG5vZGVzLnB1c2goeyB0eXBlOiBcInRleHRcIiwgdmFsdWU6IHRleHQuc3Vic3RyaW5nKGN1cnJlbnQuZW5kLCBtYXRjaC5pbmRleCEpLCBlbmQ6IG1hdGNoLmluZGV4ISB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBBZGQgYSBjdXN0b20gcmVmZXJlbmNlIG5vZGVcclxuICAgICAgICAgIG5vZGVzLnB1c2goeyB0eXBlOiBcImNoYXQtcmVmZXJlbmNlXCIsIHJlZklkLCBlbmQ6IG1hdGNoLmluZGV4ISArIG1hdGNoWzBdLmxlbmd0aCB9IGFzIGFueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBRdWl0IGlmIG5vIHJlZmVyZW5jZXMgd2VyZSBmb3VuZFxyXG4gICAgICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIENPTlRJTlVFO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobm9kZXMuYXQoLTEpIS5lbmQgPCB0ZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgIG5vZGVzLnB1c2goeyB0eXBlOiBcInRleHRcIiwgdmFsdWU6IHRleHQuc3Vic3RyaW5nKG5vZGVzLmF0KC0xKSEuZW5kLCB0ZXh0Lmxlbmd0aCksIGVuZDogdGV4dC5sZW5ndGggfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIERlbGV0ZSB0aGUgY3VycmVudCB0ZXh0IG5vZGUgZnJvbSB0aGUgcGFyZW50IGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIG5ldyBub2Rlc1xyXG4gICAgICBwYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxLCAuLi5ub2Rlcyk7XHJcblxyXG4gICAgICByZXR1cm4gaW5kZXggKyBub2Rlcy5sZW5ndGg7IC8vIFZpc2l0IHRoZSBuZXh0IG5vZGUgYWZ0ZXIgdGhlIGluc2VydGVkIG9uZXNcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChyZWZlcmVuY2VzLnNpemUgPiAwKSB7XHJcbiAgICAgIHRoaXMucmVmZXJlbmNlcyA9IEFycmF5LmZyb20ocmVmZXJlbmNlcy52YWx1ZXMoKSlcclxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYSAtIGIpXHJcbiAgICAgICAgLm1hcChyID0+ICcnICsgcik7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJlZTtcclxuICB9XHJcblxyXG4gIHBsYWNlaG9sZGVyUGx1Z2luID0gKHRyZWU6IE5vZGUpID0+IHtcclxuXHJcbiAgICB2aXNpdCh0cmVlLCBcInRleHRcIiwgKG5vZGU6IFRleHQsIGluZGV4OiBudW1iZXIsIHBhcmVudDogUGFyZW50KSA9PiB7XHJcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHsgdHlwZTogXCJzdHJlYW1pbmctcGxhY2Vob2xkZXJcIiB9IGFzIGFueSk7XHJcbiAgICAgIHJldHVybiBFWElUO1xyXG4gICAgfSwgdHJ1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHRyZWU7XHJcbiAgfVxyXG5cclxuICBnZXRMaW5rVGV4dChub2RlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKG5vZGUudGV4dCkge1xyXG4gICAgICByZXR1cm4gbm9kZS50ZXh0OyAvLyBSZXR1cm4gZGlyZWN0bHkgaWYgdGV4dCBpcyBwcm92aWRlZCBpbiBub2RlLnRleHQgKFtFeGFtcGxlIGxpbmtdKGh0dHBzOi8vZXhhbXBsZS5jb20pKVxyXG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBSZWN1cnNpdmVseSBzZWFyY2ggZm9yIHRleHQgY29udGVudCBpbiBjaGlsZCBub2Rlc1xyXG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gJ3RleHQnICYmIGNoaWxkLnZhbHVlKSB7XHJcbiAgICAgICAgICByZXR1cm4gY2hpbGQudmFsdWU7IC8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IHRleHQgbm9kZSBmb3VuZCAoWyoqRW1waGFzaXplZCBMaW5rIFRleHQqKl0oaHR0cHM6Ly9leGFtcGxlLmNvbSkpXHJcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRoaXMuZ2V0TGlua1RleHQoY2hpbGQpOyAvLyBSZWN1cnNpdmVseSBzZWFyY2ggY2hpbGQgbm9kZXMgKFshW0V4YW1wbGUgaW1hZ2VdKGh0dHBzOi8vZXhhbXBsZS5jb20vaW1hZ2UucG5nKV0oaHR0cHM6Ly9leGFtcGxlLmNvbSkpXHJcbiAgICAgICAgICBpZiAodGV4dENvbnRlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRleHRDb250ZW50OyAvLyBSZXR1cm4gdGV4dCBjb250ZW50IGlmIGZvdW5kXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ2xpbmsnOyAvLyBSZXR1cm4gZW1wdHkgc3RyaW5nIGlmIG5vIHRleHQgY29udGVudCBpcyBmb3VuZFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVmb3JtYXQgW2lkczogMTIuMiwgNDIuNV0gdG8gWzEyLjJdWzQyLjVdXHJcbiAgICovXHJcbiAgcmVmb3JtYXRSZWZlcmVuY2VzKGNvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZSgvXFxbKD86aWRzPzo/XFxzKik/KD86ZG9jdW1lbnRzPzo/XFxzKik/KFxccyooPzosP1xccypcXGQrKD86XFwuXFxkKyk/KD86XFwucGFydCk/XFxzKikrKVxcXS9nLFxyXG4gICAgICAoc3RyLCBtYXRjaDogc3RyaW5nKSA9PiBgWyR7bWF0Y2gucmVwbGFjZSgvXFwucGFydC9nLCBcIlwiKS5zcGxpdCgnLCcpLmpvaW4oXCJdIFtcIil9XWBcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXRjaCBhbGwgcmVmZXJlbmNlcyBpbiBhIGdpdmVuIG1lc3NhZ2VcclxuICAgKi9cclxuICBnZXRSZWZlcmVuY2VNYXRjaGVzKGNvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20oY29udGVudC5tYXRjaEFsbCgvXFxbKFxccypcXGQrKD86XFwuXFxkKyk/XFxzKilcXF0vZykpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY29weVRvQ2xpcGJvYXJkKGNvbnRlbnQ6IHN0cmluZykge1xyXG4gICAgdGhpcy51aS5jb3B5VG9DbGlwYm9hcmQoY29udGVudCk7XHJcblxyXG4gIH1cclxuXHJcbiAgY29weU1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgIHRoaXMuX2NvcHlUb0NsaXBib2FyZChtZXNzYWdlLmNvbnRlbnQpO1xyXG4gICAgdGhpcy5jb3B5LmVtaXQobWVzc2FnZSk7XHJcbiAgfVxyXG5cclxuICBjb3B5Q29kZShjb2RlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2NvcHlUb0NsaXBib2FyZChjb2RlKTtcclxuICB9XHJcblxyXG4gIG9wZW5BdHRhY2htZW50UHJldmlldyhhdHRhY2htZW50OiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcikge1xyXG4gICAgdGhpcy5vcGVuUHJldmlldy5lbWl0KHtyZWZlcmVuY2U6IGF0dGFjaG1lbnQsIHBhcnRJZH0pO1xyXG4gICAgdGhpcy5oaWRlVG9vbHRpcCgpO1xyXG4gIH1cclxuXHJcbiAgb3Blbk9yaWdpbmFsQXR0YWNobWVudChhdHRhY2htZW50OiBDaGF0Q29udGV4dEF0dGFjaG1lbnQsIHBhcnRJZD86IG51bWJlcikge1xyXG4gICAgdGhpcy5vcGVuRG9jdW1lbnQuZW1pdCh7cmVmZXJlbmNlOiBhdHRhY2htZW50LCBwYXJ0SWR9KTtcclxuICAgIHRoaXMuaGlkZVRvb2x0aXAoKTtcclxuICB9XHJcblxyXG4gIGhpZGVUb29sdGlwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaWRkZW5Ub29sdGlwID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmhpZGRlblRvb2x0aXAgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8IS0tIE1lc3NhZ2UgaWNvbiAtLT5cclxuPHNwYW4gY2xhc3M9XCJtZXNzYWdlLWljb25cIiBbdGl0bGVdPVwibWVzc2FnZT8ucm9sZVwiPlxyXG4gIDxpIGNsYXNzPVwiZC1ibG9ja1wiIFtzdHlsZS53aWR0aC5weF09XCJpY29uU2l6ZVwiICpuZ0lmPVwiIW1lc3NhZ2VcIj48L2k+XHJcbiAgPGkgW25nQ2xhc3NdPVwiYXNzaXN0YW50TWVzc2FnZUljb25cIiBbc3R5bGUuLS1zcS1zaXplLnB4XT1cImljb25TaXplXCIgKm5nSWY9XCJtZXNzYWdlLnJvbGUgPT09ICdhc3Npc3RhbnQnXCI+PC9pPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZXNzYWdlPy5yb2xlID09PSAndXNlcidcIj5cclxuICAgIDxpIFtuZ0NsYXNzXT1cInVzZXJNZXNzYWdlSWNvblwiIFtzdHlsZS4tLXNxLXNpemUucHhdPVwiaWNvblNpemVcIiAqbmdJZj1cIiEhdXNlck1lc3NhZ2VJY29uOyBlbHNlIGluaXRpYWxzQXZhdGFyXCI+PC9pPlxyXG4gICAgPG5nLXRlbXBsYXRlICNpbml0aWFsc0F2YXRhcj5cclxuICAgICAgPHNxLWluaXRpYWxzLWF2YXRhciBbZnVsbE5hbWVdPVwibmFtZVwiPjwvc3EtaW5pdGlhbHMtYXZhdGFyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9zcGFuPlxyXG5cclxuPCEtLSBNZXNzYWdlIGJvZHkgLS0+XHJcbjxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiIHN0eWxlPVwibWluLXdpZHRoOiAwO1wiIFtuZ0NsYXNzXT1cIidtZXNzYWdlLScrbWVzc2FnZS5yb2xlXCI+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJtZXNzYWdlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiRwcm9ncmVzcyBhcyBwcm9ncmVzc1wiIGNsYXNzPVwic21hbGwgbXMtMyBtYi0yXCI+XHJcbiAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJjb2xsYXBzZVByb2dyZXNzID0gIWNvbGxhcHNlUHJvZ3Jlc3M7IGZhbHNlXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+XHJcbiAgICAgIFZpZXcgcHJvZ3Jlc3NcclxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi17e2NvbGxhcHNlUHJvZ3Jlc3M/ICdyaWdodCcgOiAnZG93bid9fVwiPjwvaT5cclxuICAgIDwvYT5cclxuICAgIDxzcS1jb2xsYXBzZSBbY29sbGFwc2VkXT1cImNvbGxhcHNlUHJvZ3Jlc3NcIj5cclxuICAgICAgPG5nLXRlbXBsYXRlPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWRcIj5cclxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgc3RlcCBvZiBwcm9ncmVzc1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1mdyBmYS1jaGVjayB0ZXh0LXN1Y2Nlc3NcIiAqbmdJZj1cInN0ZXAuZG9uZVwiPjwvaT5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZncgZmEtc3BpbiBmYS1jaXJjbGUtbm90Y2hcIiAqbmdJZj1cIiFzdGVwLmRvbmVcIj48L2k+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMiBmdy1ib2xkXCI+e3tzdGVwLnRpdGxlfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic3RlcC5jb250ZW50XCI+OiB7e3N0ZXAuY29udGVudH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9zcS1jb2xsYXBzZT5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiICpuZ0lmPVwibWVzc2FnZS5jb250ZW50XCI+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIm1lc3NhZ2U/LnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdDSEFSVCdcIj5cclxuICAgICAgPHNxLWFzc2lzdGFudC1jaGFydCBbcmF3Q2hhcnREYXRhXT1cIm1lc3NhZ2UuY29udGVudFwiPjwvc3EtYXNzaXN0YW50LWNoYXJ0PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPHJlbWFyayAqbmdJZj1cIm1lc3NhZ2U/LnJvbGUgPT09ICdhc3Npc3RhbnQnICYmIG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNQVJLRE9XTidcIiBbbWFya2Rvd25dPVwibWVzc2FnZS5jb250ZW50XCIgW3Byb2Nlc3Nvcl09XCJwcm9jZXNzb3JcIj5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSByZW1hcmtUZW1wbGF0ZT1cImNoYXQtcmVmZXJlbmNlXCIgbGV0LXJlZj5cclxuXHJcbiAgICAgICAgPGEgKm5nSWY9XCJyZWZlcmVuY2VNYXAuZ2V0KHJlZi5yZWZJZCkgYXMgYXR0YWNobWVudDsgZWxzZSBzdGF0aWNSZWZUcGxcIlxyXG4gICAgICAgICAgY2xhc3M9XCJyZWZlcmVuY2VcIlxyXG4gICAgICAgICAgW3NxVG9vbHRpcF09XCJhdHRhY2htZW50XCJcclxuICAgICAgICAgIFtzcVRvb2x0aXBUZW1wbGF0ZV09XCJ0b29sdGlwVHBsXCJcclxuICAgICAgICAgIFtob3ZlcmFibGVUb29sdGlwXT1cInRydWVcIlxyXG4gICAgICAgICAgPnt7cmVmLnJlZklkfX1cclxuICAgICAgICA8L2E+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc3RhdGljUmVmVHBsPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWZlcmVuY2VcIj57e3JlZi5yZWZJZH19PC9zcGFuPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHJlbWFya1RlbXBsYXRlPVwic3RyZWFtaW5nLXBsYWNlaG9sZGVyXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJwbGFjZWhvbGRlci1nbG93XCIgKm5nSWY9XCJzdHJlYW1pbmdcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGxhY2Vob2xkZXIgbXMtMVwiPjwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgcmVtYXJrVGVtcGxhdGU9XCJjb2RlXCIgbGV0LW5vZGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbWItMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4+e3tub2RlLmxhbmd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtXCIgKGNsaWNrKT1cImNvcHlDb2RlKG5vZGUudmFsdWUpXCI+PGkgY2xhc3M9XCJmYXIgZmEtZncgZmEtY2xpcGJvYXJkXCI+PC9pPiBDb3B5IGNvZGU8L2J1dHRvbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPHByZSBjbGFzcz1cImxhbmd1YWdlLXt7bm9kZS5sYW5nfX0gbXktMCByb3VuZGVkLTAgcm91bmRlZC1ib3R0b21cIj48Y29kZSBjbGFzcz1cImxhbmd1YWdlLXt7bm9kZS5sYW5nfX1cIj57e25vZGUudmFsdWV9fTwvY29kZT48L3ByZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSByZW1hcmtUZW1wbGF0ZT1cImxpbmtcIiBsZXQtbm9kZT5cclxuICAgICAgICA8YSBbaHJlZl09XCJub2RlLnVybFwiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj57e2dldExpbmtUZXh0KG5vZGUpfX08L2E+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPC9yZW1hcms+XHJcblxyXG4gICAgPHAgKm5nSWY9XCJtZXNzYWdlPy5yb2xlID09PSAndXNlcidcIj57e21lc3NhZ2UuY29udGVudH19PC9wPlxyXG5cclxuICAgIDwhLS0gTGlzdCBvZiByZWZlcmVuY2UsIGlmIGFueSAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJyZWZlcmVuY2VzPy5sZW5ndGhcIiBjbGFzcz1cInJlZmVyZW5jZXNcIj5cclxuICAgICAgPGRldGFpbHMgcm9sZT1cImJ1dHRvblwiIGNsYXNzPVwic2VsZWN0LW5vbmVcIiBbb3Blbl09XCJzaG93UmVmZXJlbmNlc1wiPlxyXG4gICAgICAgIDxzdW1tYXJ5IGNsYXNzPVwicmVmZXJlbmNlcy10aXRsZVwiPlJlZmVyZW5jZXM8L3N1bW1hcnk+XHJcbiAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzXCI+XHJcbiAgICAgICAgICAgICAgPGxpICpuZ0lmPVwicmVmZXJlbmNlTWFwLmdldChyZWZlcmVuY2UpIGFzIGF0dGFjaG1lbnRcIiAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8c3EtY2hhdC1yZWZlcmVuY2VcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmV4cGFuZGVkXT1cImF0dGFjaG1lbnQuJGV4cGFuZGVkXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dGFjaG1lbnRdPVwiYXR0YWNobWVudFwiXHJcbiAgICAgICAgICAgICAgICAgIFtyZWZlcmVuY2VdPVwicmVmZXJlbmNlXCJcclxuICAgICAgICAgICAgICAgICAgKG9wZW5QcmV2aWV3KT1cIm9wZW5BdHRhY2htZW50UHJldmlldygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKG9wZW5Eb2N1bWVudCk9XCJvcGVuT3JpZ2luYWxBdHRhY2htZW50KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDwvc3EtY2hhdC1yZWZlcmVuY2U+XHJcbiAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L3VsPlxyXG4gICAgICA8L2RldGFpbHM+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBFZGl0IC8gUmVnZW5lcmF0ZSBmbG9hdGluZyBhY3Rpb25zIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJzcS1jaGF0LW1lc3NhZ2UtYWN0aW9uc1wiICpuZ0lmPVwibWVzc2FnZVwiPlxyXG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiAqbmdJZj1cImNhbkVkaXRcIiBzcVRvb2x0aXA9XCJFZGl0IG1lc3NhZ2VcIiAoY2xpY2spPVwiZWRpdC5lbWl0KG1lc3NhZ2UpXCI+XHJcbiAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWVkaXRcIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgKm5nSWY9XCJjYW5Db3B5XCIgc3FUb29sdGlwPVwiQ29weSB0byBjbGlwYm9hcmRcIiAoY2xpY2spPVwiY29weU1lc3NhZ2UobWVzc2FnZSlcIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtY2xpcGJvYXJkXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbVwiICpuZ0lmPVwiY2FuUmVnZW5lcmF0ZVwiIHNxVG9vbHRpcD1cIlJlZ2VuZXJhdGUgbWVzc2FnZVwiIChjbGljayk9XCJyZWdlbmVyYXRlLmVtaXQobWVzc2FnZSlcIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3luYy1hbHRcIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgW2NsYXNzLmJvdW5jZV09XCJsaWtlZFwiICpuZ0lmPVwiY2FuTGlrZVwiIHNxVG9vbHRpcD1cIkxpa2UgdGhlIGFuc3dlclwiIChjbGljayk9XCJsaWtlLmVtaXQobWVzc2FnZSk7IGxpa2VkID0gdHJ1ZTtcIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGh1bWJzLXVwXCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBib3VuY2VcIiAgW2NsYXNzLmJvdW5jZV09XCJkaXNsaWtlZFwiICpuZ0lmPVwiY2FuRGlzbGlrZVwiIHNxVG9vbHRpcD1cIlJlcG9ydCBhbiBpc3N1ZVwiIChjbGljayk9XCJkaXNsaWtlLmVtaXQobWVzc2FnZSk7IGRpc2xpa2VkID0gdHJ1ZTtcIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGh1bWJzLWRvd25cIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtXCIgKm5nSWY9XCJjYW5EZWJ1ZyAmJiAhIW1lc3NhZ2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJGRlYnVnICYmIG1lc3NhZ2UuYWRkaXRpb25hbFByb3BlcnRpZXMuJGRlYnVnPy5sZW5ndGggPiAwXCIgc3FUb29sdGlwPVwiU2hvdyBMb2cgSW5mb3JtYXRpb25cIiAoY2xpY2spPVwiZGVidWcuZW1pdChtZXNzYWdlKTtcIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtbGlzdC1hbHRcIj48L2k+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBMaXN0IG9mIHN1Z2dlc3RlZCBhY3Rpb25zLCBpZiBhbnkgLS0+XHJcbiAgPGRpdiAqbmdJZj1cInN1Z2dlc3RlZEFjdGlvbnNcIiBjbGFzcz1cIm10LTIgbWVzc2FnZS1zdWdnZXN0aW9uXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3VnZ2VzdGVkLWFjdGlvblwiICpuZ0Zvcj1cImxldCBzdWdnZXN0ZWRBY3Rpb24gb2Ygc3VnZ2VzdGVkQWN0aW9uc1wiIChjbGljayk9XCJzdWdnZXN0QWN0aW9uLmVtaXQoc3VnZ2VzdGVkQWN0aW9uKVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZS1jb250ZW50XCI+XHJcbiAgICAgICAgPHA+PGkgY2xhc3M9XCJmYXMgZmEtY2xpcGJvYXJkLXF1ZXN0aW9uXCI+PC9pPiB7e3N1Z2dlc3RlZEFjdGlvbi5jb250ZW50fX08L3A+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjdG9vbHRpcFRwbCBsZXQtcmVmPlxyXG4gICAgPHNxLWNoYXQtcmVmZXJlbmNlXHJcbiAgICAgICpuZ0lmPVwiIWhpZGRlblRvb2x0aXBcIlxyXG4gICAgICBjbGFzcz1cImV4cGFuZGVkXCJcclxuICAgICAgW2F0dGFjaG1lbnRdPVwicmVmXCJcclxuICAgICAgW3JlZmVyZW5jZV09XCJyZWYuY29udGV4dElkXCJcclxuICAgICAgW3BhcnRJZF09XCJyZWYuJHBhcnRJZFwiXHJcbiAgICAgIChvcGVuUHJldmlldyk9XCJvcGVuQXR0YWNobWVudFByZXZpZXcoJGV2ZW50LCByZWYuJHBhcnRJZClcIlxyXG4gICAgICAob3BlbkRvY3VtZW50KT1cIm9wZW5PcmlnaW5hbEF0dGFjaG1lbnQoJGV2ZW50LCByZWYuJHBhcnRJZClcIj5cclxuICAgIDwvc3EtY2hhdC1yZWZlcmVuY2U+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjwvZGl2PlxyXG4iXX0=
|