@copilotkitnext/angular 0.0.9-alpha.2 → 0.0.10
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/dist/esm2022/index.mjs +2 -70
- package/dist/esm2022/lib/agent.mjs +73 -0
- package/dist/esm2022/lib/chat-config.mjs +35 -0
- package/dist/esm2022/lib/chat-state.mjs +18 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
- package/dist/esm2022/{components/chat/copilot-chat-assistant-message.component.mjs → lib/components/chat/copilot-chat-assistant-message.mjs} +216 -240
- package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +118 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +306 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
- package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
- package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
- package/dist/esm2022/lib/config.mjs +9 -0
- package/dist/esm2022/lib/copilotkit.mjs +124 -0
- package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
- package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
- package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
- package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
- package/dist/esm2022/lib/render-tool-calls.mjs +131 -0
- package/dist/esm2022/lib/resize-observer.mjs +152 -0
- package/dist/esm2022/lib/scroll-position.mjs +124 -0
- package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
- package/dist/esm2022/lib/slots/index.mjs +4 -0
- package/dist/esm2022/lib/slots/slot.types.mjs +3 -3
- package/dist/esm2022/lib/slots/slot.utils.mjs +19 -15
- package/dist/esm2022/lib/tools.mjs +31 -0
- package/dist/esm2022/lib/utils.mjs +3 -3
- package/dist/esm2022/public-api.mjs +47 -0
- package/dist/fesm2022/copilotkitnext-angular.mjs +5249 -8271
- package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
- package/dist/index.d.ts +1 -55
- package/dist/lib/agent.d.ts +53 -0
- package/dist/{core/chat-configuration/chat-configuration.types.d.ts → lib/chat-config.d.ts} +4 -8
- package/dist/lib/chat-state.d.ts +10 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +178 -0
- package/dist/{components → lib/components}/chat/copilot-chat-assistant-message.types.d.ts +1 -1
- package/dist/{components/chat/copilot-chat-audio-recorder.component.d.ts → lib/components/chat/copilot-chat-audio-recorder.d.ts} +10 -10
- package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
- package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
- package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
- package/dist/{components → lib/components}/chat/copilot-chat-input.types.d.ts +11 -11
- package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
- package/dist/{components/chat/copilot-chat-message-view.component.d.ts → lib/components/chat/copilot-chat-message-view.d.ts} +68 -36
- package/dist/{components → lib/components}/chat/copilot-chat-message-view.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
- package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +55 -0
- package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
- package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +20 -0
- package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
- package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
- package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
- package/dist/lib/components/chat/copilot-chat-user-message.d.ts +55 -0
- package/dist/{components → lib/components}/chat/copilot-chat-user-message.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
- package/dist/{components/chat/copilot-chat-view-feather.component.d.ts → lib/components/chat/copilot-chat-view-feather.d.ts} +6 -6
- package/dist/{components/chat/copilot-chat-view-handlers.service.d.ts → lib/components/chat/copilot-chat-view-handlers.d.ts} +3 -3
- package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
- package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
- package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +114 -0
- package/dist/lib/components/chat/copilot-chat-view.d.ts +239 -0
- package/dist/{components → lib/components}/chat/copilot-chat-view.types.d.ts +2 -2
- package/dist/lib/components/chat/copilot-chat.d.ts +67 -0
- package/dist/lib/config.d.ts +16 -0
- package/dist/lib/copilotkit.d.ts +29 -0
- package/dist/{directives/copilotkit-agent-context.directive.d.ts → lib/directives/copilotkit-agent-context.d.ts} +5 -5
- package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
- package/dist/lib/directives/tooltip.d.ts +33 -0
- package/dist/lib/human-in-the-loop.d.ts +13 -0
- package/dist/lib/render-tool-calls.d.ts +75 -0
- package/dist/{services/resize-observer.service.d.ts → lib/resize-observer.d.ts} +2 -2
- package/dist/{services/scroll-position.service.d.ts → lib/scroll-position.d.ts} +6 -6
- package/dist/lib/slots/copilot-slot.d.ts +34 -0
- package/dist/lib/slots/index.d.ts +3 -0
- package/dist/lib/slots/slot.types.d.ts +1 -1
- package/dist/lib/slots/slot.utils.d.ts +6 -4
- package/dist/lib/tools.d.ts +63 -0
- package/dist/lib/utils.d.ts +1 -1
- package/dist/public-api.d.ts +46 -0
- package/dist/styles.css +0 -69
- package/package.json +3 -3
- package/dist/components/chat/copilot-chat-assistant-message-buttons.component.d.ts +0 -75
- package/dist/components/chat/copilot-chat-assistant-message-renderer.component.d.ts +0 -31
- package/dist/components/chat/copilot-chat-assistant-message-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +0 -132
- package/dist/components/chat/copilot-chat-buttons.component.d.ts +0 -66
- package/dist/components/chat/copilot-chat-input-defaults.d.ts +0 -37
- package/dist/components/chat/copilot-chat-input.component.d.ts +0 -133
- package/dist/components/chat/copilot-chat-message-view-cursor.component.d.ts +0 -15
- package/dist/components/chat/copilot-chat-textarea.component.d.ts +0 -45
- package/dist/components/chat/copilot-chat-tool-calls-view.component.d.ts +0 -35
- package/dist/components/chat/copilot-chat-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-tools-menu.component.d.ts +0 -20
- package/dist/components/chat/copilot-chat-user-message-branch-navigation.component.d.ts +0 -23
- package/dist/components/chat/copilot-chat-user-message-buttons.component.d.ts +0 -39
- package/dist/components/chat/copilot-chat-user-message-renderer.component.d.ts +0 -9
- package/dist/components/chat/copilot-chat-user-message-toolbar.component.d.ts +0 -8
- package/dist/components/chat/copilot-chat-user-message.component.d.ts +0 -55
- package/dist/components/chat/copilot-chat-view-disclaimer.component.d.ts +0 -15
- package/dist/components/chat/copilot-chat-view-input-container.component.d.ts +0 -23
- package/dist/components/chat/copilot-chat-view-scroll-to-bottom-button.component.d.ts +0 -17
- package/dist/components/chat/copilot-chat-view-scroll-view.component.d.ts +0 -84
- package/dist/components/chat/copilot-chat-view.component.d.ts +0 -205
- package/dist/components/chat/copilot-chat.component.d.ts +0 -36
- package/dist/components/copilotkit-tool-render.component.d.ts +0 -25
- package/dist/core/chat-configuration/chat-configuration.providers.d.ts +0 -54
- package/dist/core/chat-configuration/chat-configuration.service.d.ts +0 -75
- package/dist/core/copilotkit.providers.d.ts +0 -13
- package/dist/core/copilotkit.service.d.ts +0 -119
- package/dist/core/copilotkit.types.d.ts +0 -81
- package/dist/directives/copilotkit-agent.directive.d.ts +0 -106
- package/dist/directives/copilotkit-chat-config.directive.d.ts +0 -84
- package/dist/directives/copilotkit-config.directive.d.ts +0 -44
- package/dist/directives/copilotkit-frontend-tool.directive.d.ts +0 -25
- package/dist/directives/copilotkit-human-in-the-loop.directive.d.ts +0 -124
- package/dist/directives/stick-to-bottom.directive.d.ts +0 -62
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +0 -384
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +0 -286
- package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +0 -27
- package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +0 -202
- package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +0 -321
- package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +0 -38
- package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +0 -666
- package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +0 -10
- package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +0 -45
- package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +0 -296
- package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +0 -188
- package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +0 -222
- package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +0 -25
- package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +0 -199
- package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +0 -137
- package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +0 -207
- package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +0 -35
- package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +0 -34
- package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +0 -341
- package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +0 -52
- package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +0 -55
- package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +0 -19
- package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +0 -110
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +0 -93
- package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +0 -443
- package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +0 -479
- package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +0 -2
- package/dist/esm2022/components/chat/copilot-chat.component.mjs +0 -220
- package/dist/esm2022/components/copilotkit-tool-render.component.mjs +0 -150
- package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +0 -65
- package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +0 -145
- package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +0 -26
- package/dist/esm2022/core/copilotkit.providers.mjs +0 -34
- package/dist/esm2022/core/copilotkit.service.mjs +0 -411
- package/dist/esm2022/core/copilotkit.types.mjs +0 -13
- package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +0 -130
- package/dist/esm2022/directives/copilotkit-agent.directive.mjs +0 -221
- package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +0 -218
- package/dist/esm2022/directives/copilotkit-config.directive.mjs +0 -94
- package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +0 -128
- package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +0 -265
- package/dist/esm2022/directives/stick-to-bottom.directive.mjs +0 -181
- package/dist/esm2022/lib/directives/tooltip.directive.mjs +0 -211
- package/dist/esm2022/lib/slots/copilot-slot.component.mjs +0 -154
- package/dist/esm2022/services/resize-observer.service.mjs +0 -152
- package/dist/esm2022/services/scroll-position.service.mjs +0 -124
- package/dist/esm2022/types/frontend-tool.mjs +0 -2
- package/dist/esm2022/types/human-in-the-loop.mjs +0 -2
- package/dist/esm2022/utils/agent-context.utils.mjs +0 -114
- package/dist/esm2022/utils/agent.utils.mjs +0 -212
- package/dist/esm2022/utils/chat-config.utils.mjs +0 -186
- package/dist/esm2022/utils/copilotkit.utils.mjs +0 -20
- package/dist/esm2022/utils/frontend-tool.utils.mjs +0 -224
- package/dist/esm2022/utils/human-in-the-loop.utils.mjs +0 -293
- package/dist/lib/directives/tooltip.directive.d.ts +0 -33
- package/dist/lib/slots/copilot-slot.component.d.ts +0 -34
- package/dist/types/frontend-tool.d.ts +0 -37
- package/dist/types/human-in-the-loop.d.ts +0 -44
- package/dist/utils/agent-context.utils.d.ts +0 -75
- package/dist/utils/agent.utils.d.ts +0 -108
- package/dist/utils/chat-config.utils.d.ts +0 -166
- package/dist/utils/copilotkit.utils.d.ts +0 -16
- package/dist/utils/frontend-tool.utils.d.ts +0 -119
- package/dist/utils/human-in-the-loop.utils.d.ts +0 -92
package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { LucideAngularModule, ChevronDown } from 'lucide-angular';
|
|
4
|
-
import { cn } from '../../lib/utils';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "lucide-angular";
|
|
7
|
-
/**
|
|
8
|
-
* ScrollToBottomButton component for CopilotChatView
|
|
9
|
-
* Matches React implementation exactly with same Tailwind classes
|
|
10
|
-
*/
|
|
11
|
-
export class CopilotChatViewScrollToBottomButtonComponent {
|
|
12
|
-
inputClass;
|
|
13
|
-
disabled = false;
|
|
14
|
-
// Support function-style click handler via slot context
|
|
15
|
-
onClick;
|
|
16
|
-
// Simple, idiomatic Angular output
|
|
17
|
-
clicked = new EventEmitter();
|
|
18
|
-
// Icon reference
|
|
19
|
-
ChevronDown = ChevronDown;
|
|
20
|
-
// Computed class matching React exactly
|
|
21
|
-
get computedClass() {
|
|
22
|
-
return cn(
|
|
23
|
-
// Base button styles
|
|
24
|
-
'rounded-full w-10 h-10 p-0',
|
|
25
|
-
// Background colors
|
|
26
|
-
'bg-white dark:bg-gray-900',
|
|
27
|
-
// Border and shadow
|
|
28
|
-
'shadow-lg border border-gray-200 dark:border-gray-700',
|
|
29
|
-
// Hover states
|
|
30
|
-
'hover:bg-gray-50 dark:hover:bg-gray-800',
|
|
31
|
-
// Layout
|
|
32
|
-
'flex items-center justify-center cursor-pointer',
|
|
33
|
-
// Transition
|
|
34
|
-
'transition-colors',
|
|
35
|
-
// Focus states
|
|
36
|
-
'focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2',
|
|
37
|
-
// Custom classes
|
|
38
|
-
this.inputClass);
|
|
39
|
-
}
|
|
40
|
-
handleClick() {
|
|
41
|
-
if (!this.disabled) {
|
|
42
|
-
// Call input handler if provided (slot-style)
|
|
43
|
-
if (this.onClick) {
|
|
44
|
-
this.onClick();
|
|
45
|
-
}
|
|
46
|
-
this.clicked.emit();
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatViewScrollToBottomButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
50
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CopilotChatViewScrollToBottomButtonComponent, isStandalone: true, selector: "copilot-chat-view-scroll-to-bottom-button", inputs: { inputClass: "inputClass", disabled: "disabled", onClick: "onClick" }, outputs: { clicked: "clicked" }, ngImport: i0, template: `
|
|
51
|
-
<button
|
|
52
|
-
type="button"
|
|
53
|
-
[class]="computedClass"
|
|
54
|
-
[disabled]="disabled"
|
|
55
|
-
(click)="handleClick()">
|
|
56
|
-
<lucide-angular
|
|
57
|
-
[img]="ChevronDown"
|
|
58
|
-
class="w-4 h-4 text-gray-600 dark:text-white">
|
|
59
|
-
</lucide-angular>
|
|
60
|
-
</button>
|
|
61
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i1.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
62
|
-
}
|
|
63
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatViewScrollToBottomButtonComponent, decorators: [{
|
|
64
|
-
type: Component,
|
|
65
|
-
args: [{
|
|
66
|
-
selector: 'copilot-chat-view-scroll-to-bottom-button',
|
|
67
|
-
standalone: true,
|
|
68
|
-
imports: [CommonModule, LucideAngularModule],
|
|
69
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
70
|
-
encapsulation: ViewEncapsulation.None,
|
|
71
|
-
template: `
|
|
72
|
-
<button
|
|
73
|
-
type="button"
|
|
74
|
-
[class]="computedClass"
|
|
75
|
-
[disabled]="disabled"
|
|
76
|
-
(click)="handleClick()">
|
|
77
|
-
<lucide-angular
|
|
78
|
-
[img]="ChevronDown"
|
|
79
|
-
class="w-4 h-4 text-gray-600 dark:text-white">
|
|
80
|
-
</lucide-angular>
|
|
81
|
-
</button>
|
|
82
|
-
`
|
|
83
|
-
}]
|
|
84
|
-
}], propDecorators: { inputClass: [{
|
|
85
|
-
type: Input
|
|
86
|
-
}], disabled: [{
|
|
87
|
-
type: Input
|
|
88
|
-
}], onClick: [{
|
|
89
|
-
type: Input
|
|
90
|
-
}], clicked: [{
|
|
91
|
-
type: Output
|
|
92
|
-
}] } });
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXZpZXctc2Nyb2xsLXRvLWJvdHRvbS1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy1zY3JvbGwtdG8tYm90dG9tLWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFFckM7OztHQUdHO0FBb0JILE1BQU0sT0FBTyw0Q0FBNEM7SUFDOUMsVUFBVSxDQUFVO0lBQ3BCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFDbkMsd0RBQXdEO0lBQy9DLE9BQU8sQ0FBYztJQUU5QixtQ0FBbUM7SUFDekIsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFN0MsaUJBQWlCO0lBQ0UsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUU3Qyx3Q0FBd0M7SUFDeEMsSUFBSSxhQUFhO1FBQ2YsT0FBTyxFQUFFO1FBQ1AscUJBQXFCO1FBQ3JCLDRCQUE0QjtRQUM1QixvQkFBb0I7UUFDcEIsMkJBQTJCO1FBQzNCLG9CQUFvQjtRQUNwQix1REFBdUQ7UUFDdkQsZUFBZTtRQUNmLHlDQUF5QztRQUN6QyxTQUFTO1FBQ1QsaURBQWlEO1FBQ2pELGFBQWE7UUFDYixtQkFBbUI7UUFDbkIsZUFBZTtRQUNmLHFFQUFxRTtRQUNyRSxpQkFBaUI7UUFDakIsSUFBSSxDQUFDLFVBQVUsQ0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQiw4Q0FBOEM7WUFDOUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixDQUFDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQzt3R0ExQ1UsNENBQTRDOzRGQUE1Qyw0Q0FBNEMsc05BYjdDOzs7Ozs7Ozs7OztHQVdULDJEQWRTLFlBQVksOEJBQUUsbUJBQW1COzs0RkFnQmhDLDRDQUE0QztrQkFuQnhELFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLDJDQUEyQztvQkFDckQsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQztvQkFDNUMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO29CQUNyQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7O0dBV1Q7aUJBQ0Y7OEJBRVUsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFHSSxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBMdWNpZGVBbmd1bGFyTW9kdWxlLCBDaGV2cm9uRG93biB9IGZyb20gJ2x1Y2lkZS1hbmd1bGFyJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi4vLi4vbGliL3V0aWxzJztcblxuLyoqXG4gKiBTY3JvbGxUb0JvdHRvbUJ1dHRvbiBjb21wb25lbnQgZm9yIENvcGlsb3RDaGF0Vmlld1xuICogTWF0Y2hlcyBSZWFjdCBpbXBsZW1lbnRhdGlvbiBleGFjdGx5IHdpdGggc2FtZSBUYWlsd2luZCBjbGFzc2VzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC10by1ib3R0b20tYnV0dG9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTHVjaWRlQW5ndWxhck1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIChjbGljayk9XCJoYW5kbGVDbGljaygpXCI+XG4gICAgICA8bHVjaWRlLWFuZ3VsYXJcbiAgICAgICAgW2ltZ109XCJDaGV2cm9uRG93blwiXG4gICAgICAgIGNsYXNzPVwidy00IGgtNCB0ZXh0LWdyYXktNjAwIGRhcms6dGV4dC13aGl0ZVwiPlxuICAgICAgPC9sdWNpZGUtYW5ndWxhcj5cbiAgICA8L2J1dHRvbj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90Q2hhdFZpZXdTY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGlucHV0Q2xhc3M/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIFN1cHBvcnQgZnVuY3Rpb24tc3R5bGUgY2xpY2sgaGFuZGxlciB2aWEgc2xvdCBjb250ZXh0XG4gIEBJbnB1dCgpIG9uQ2xpY2s/OiAoKSA9PiB2b2lkO1xuICBcbiAgLy8gU2ltcGxlLCBpZGlvbWF0aWMgQW5ndWxhciBvdXRwdXRcbiAgQE91dHB1dCgpIGNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIFxuICAvLyBJY29uIHJlZmVyZW5jZVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgQ2hldnJvbkRvd24gPSBDaGV2cm9uRG93bjtcbiAgXG4gIC8vIENvbXB1dGVkIGNsYXNzIG1hdGNoaW5nIFJlYWN0IGV4YWN0bHlcbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY24oXG4gICAgICAvLyBCYXNlIGJ1dHRvbiBzdHlsZXNcbiAgICAgICdyb3VuZGVkLWZ1bGwgdy0xMCBoLTEwIHAtMCcsXG4gICAgICAvLyBCYWNrZ3JvdW5kIGNvbG9yc1xuICAgICAgJ2JnLXdoaXRlIGRhcms6YmctZ3JheS05MDAnLFxuICAgICAgLy8gQm9yZGVyIGFuZCBzaGFkb3dcbiAgICAgICdzaGFkb3ctbGcgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTcwMCcsXG4gICAgICAvLyBIb3ZlciBzdGF0ZXNcbiAgICAgICdob3ZlcjpiZy1ncmF5LTUwIGRhcms6aG92ZXI6YmctZ3JheS04MDAnLFxuICAgICAgLy8gTGF5b3V0XG4gICAgICAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgY3Vyc29yLXBvaW50ZXInLFxuICAgICAgLy8gVHJhbnNpdGlvblxuICAgICAgJ3RyYW5zaXRpb24tY29sb3JzJyxcbiAgICAgIC8vIEZvY3VzIHN0YXRlc1xuICAgICAgJ2ZvY3VzOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTInLFxuICAgICAgLy8gQ3VzdG9tIGNsYXNzZXNcbiAgICAgIHRoaXMuaW5wdXRDbGFzc1xuICAgICk7XG4gIH1cbiAgXG4gIGhhbmRsZUNsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgLy8gQ2FsbCBpbnB1dCBoYW5kbGVyIGlmIHByb3ZpZGVkIChzbG90LXN0eWxlKVxuICAgICAgaWYgKHRoaXMub25DbGljaykge1xuICAgICAgICB0aGlzLm9uQ2xpY2soKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xpY2tlZC5lbWl0KCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,443 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, ChangeDetectionStrategy, ViewEncapsulation, signal, computed, inject, PLATFORM_ID, ChangeDetectorRef } from '@angular/core';
|
|
2
|
-
import { CommonModule, isPlatformBrowser } from '@angular/common';
|
|
3
|
-
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
4
|
-
import { CopilotSlotComponent } from '../../lib/slots/copilot-slot.component';
|
|
5
|
-
import { CopilotChatMessageViewComponent } from './copilot-chat-message-view.component';
|
|
6
|
-
import { CopilotChatViewScrollToBottomButtonComponent } from './copilot-chat-view-scroll-to-bottom-button.component';
|
|
7
|
-
import { StickToBottomDirective } from '../../directives/stick-to-bottom.directive';
|
|
8
|
-
import { ScrollPositionService } from '../../services/scroll-position.service';
|
|
9
|
-
import { cn } from '../../lib/utils';
|
|
10
|
-
import { Subject } from 'rxjs';
|
|
11
|
-
import { takeUntil } from 'rxjs/operators';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "@angular/cdk/scrolling";
|
|
14
|
-
/**
|
|
15
|
-
* ScrollView component for CopilotChatView
|
|
16
|
-
* Handles auto-scrolling and scroll position management
|
|
17
|
-
*/
|
|
18
|
-
export class CopilotChatViewScrollViewComponent {
|
|
19
|
-
cdr = inject(ChangeDetectorRef);
|
|
20
|
-
autoScroll = true;
|
|
21
|
-
_inputContainerHeight = 0;
|
|
22
|
-
set inputContainerHeight(value) {
|
|
23
|
-
this._inputContainerHeight = value;
|
|
24
|
-
this.inputContainerHeightSignal.set(value);
|
|
25
|
-
this.cdr.markForCheck();
|
|
26
|
-
}
|
|
27
|
-
get inputContainerHeight() {
|
|
28
|
-
return this._inputContainerHeight;
|
|
29
|
-
}
|
|
30
|
-
isResizing = false;
|
|
31
|
-
inputClass;
|
|
32
|
-
messages = [];
|
|
33
|
-
messageView;
|
|
34
|
-
messageViewClass;
|
|
35
|
-
showCursor = false;
|
|
36
|
-
// Handler availability flags removed in favor of DI service
|
|
37
|
-
// Slot inputs
|
|
38
|
-
scrollToBottomButton;
|
|
39
|
-
scrollToBottomButtonClass;
|
|
40
|
-
// Output events (bubbled from message view)
|
|
41
|
-
assistantMessageThumbsUp = new EventEmitter();
|
|
42
|
-
assistantMessageThumbsDown = new EventEmitter();
|
|
43
|
-
assistantMessageReadAloud = new EventEmitter();
|
|
44
|
-
assistantMessageRegenerate = new EventEmitter();
|
|
45
|
-
userMessageCopy = new EventEmitter();
|
|
46
|
-
userMessageEdit = new EventEmitter();
|
|
47
|
-
// ViewChild references
|
|
48
|
-
scrollContainer;
|
|
49
|
-
contentContainer;
|
|
50
|
-
stickToBottomDirective;
|
|
51
|
-
// Default components
|
|
52
|
-
defaultMessageViewComponent = CopilotChatMessageViewComponent;
|
|
53
|
-
defaultScrollToBottomButtonComponent = CopilotChatViewScrollToBottomButtonComponent;
|
|
54
|
-
// Signals
|
|
55
|
-
hasMounted = signal(false);
|
|
56
|
-
showScrollButton = signal(false);
|
|
57
|
-
isAtBottom = signal(true);
|
|
58
|
-
inputContainerHeightSignal = signal(0);
|
|
59
|
-
paddingBottom = computed(() => this.inputContainerHeightSignal() + 32);
|
|
60
|
-
// Computed class
|
|
61
|
-
computedClass = computed(() => cn(this.inputClass));
|
|
62
|
-
destroy$ = new Subject();
|
|
63
|
-
platformId = inject(PLATFORM_ID);
|
|
64
|
-
scrollPositionService = inject(ScrollPositionService);
|
|
65
|
-
ngOnInit() {
|
|
66
|
-
// Check if we're in the browser
|
|
67
|
-
if (isPlatformBrowser(this.platformId)) {
|
|
68
|
-
// Set mounted after a tick to allow for hydration
|
|
69
|
-
setTimeout(() => {
|
|
70
|
-
this.hasMounted.set(true);
|
|
71
|
-
}, 0);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
ngOnChanges() {
|
|
75
|
-
// Update signals when inputs change
|
|
76
|
-
// Force change detection when inputContainerHeight changes
|
|
77
|
-
if (this.inputContainerHeight !== undefined) {
|
|
78
|
-
this.cdr.detectChanges();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
ngAfterViewInit() {
|
|
82
|
-
if (!this.autoScroll) {
|
|
83
|
-
// Wait for the view to be fully rendered after hasMounted is set
|
|
84
|
-
setTimeout(() => {
|
|
85
|
-
if (this.scrollContainer) {
|
|
86
|
-
// Check initial scroll position
|
|
87
|
-
const initialState = this.scrollPositionService.getScrollState(this.scrollContainer.nativeElement, 10);
|
|
88
|
-
this.showScrollButton.set(!initialState.isAtBottom);
|
|
89
|
-
// Monitor scroll position for manual mode
|
|
90
|
-
this.scrollPositionService.monitorScrollPosition(this.scrollContainer, 10)
|
|
91
|
-
.pipe(takeUntil(this.destroy$))
|
|
92
|
-
.subscribe(state => {
|
|
93
|
-
this.showScrollButton.set(!state.isAtBottom);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
}, 100);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Handle isAtBottom change from StickToBottom directive
|
|
101
|
-
*/
|
|
102
|
-
onIsAtBottomChange(isAtBottom) {
|
|
103
|
-
this.isAtBottom.set(isAtBottom);
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Scroll to bottom for manual mode
|
|
107
|
-
*/
|
|
108
|
-
scrollToBottom() {
|
|
109
|
-
if (this.scrollContainer) {
|
|
110
|
-
this.scrollPositionService.scrollToBottom(this.scrollContainer, true);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Scroll to bottom for stick-to-bottom mode
|
|
115
|
-
*/
|
|
116
|
-
scrollToBottomFromStick() {
|
|
117
|
-
if (this.stickToBottomDirective) {
|
|
118
|
-
this.stickToBottomDirective.scrollToBottom('smooth');
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
ngOnDestroy() {
|
|
122
|
-
this.destroy$.next();
|
|
123
|
-
this.destroy$.complete();
|
|
124
|
-
}
|
|
125
|
-
// Output maps for slots
|
|
126
|
-
scrollToBottomOutputs = { clicked: () => this.scrollToBottom() };
|
|
127
|
-
scrollToBottomFromStickOutputs = { clicked: () => this.scrollToBottomFromStick() };
|
|
128
|
-
// Context methods for templates
|
|
129
|
-
messageViewContext() {
|
|
130
|
-
return { messages: this.messages, inputClass: this.messageViewClass, showCursor: this.showCursor };
|
|
131
|
-
}
|
|
132
|
-
scrollToBottomContext() {
|
|
133
|
-
return {
|
|
134
|
-
inputClass: this.scrollToBottomButtonClass,
|
|
135
|
-
onClick: () => this.scrollToBottom()
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
scrollToBottomFromStickContext() {
|
|
139
|
-
return {
|
|
140
|
-
inputClass: this.scrollToBottomButtonClass,
|
|
141
|
-
onClick: () => this.scrollToBottomFromStick()
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatViewScrollViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
145
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CopilotChatViewScrollViewComponent, isStandalone: true, selector: "copilot-chat-view-scroll-view", inputs: { autoScroll: "autoScroll", inputContainerHeight: "inputContainerHeight", isResizing: "isResizing", inputClass: "inputClass", messages: "messages", messageView: "messageView", messageViewClass: "messageViewClass", showCursor: "showCursor", scrollToBottomButton: "scrollToBottomButton", scrollToBottomButtonClass: "scrollToBottomButtonClass" }, outputs: { assistantMessageThumbsUp: "assistantMessageThumbsUp", assistantMessageThumbsDown: "assistantMessageThumbsDown", assistantMessageReadAloud: "assistantMessageReadAloud", assistantMessageRegenerate: "assistantMessageRegenerate", userMessageCopy: "userMessageCopy", userMessageEdit: "userMessageEdit" }, providers: [ScrollPositionService], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, read: ElementRef }, { propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ElementRef }, { propertyName: "stickToBottomDirective", first: true, predicate: StickToBottomDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
146
|
-
@if (!hasMounted()) {
|
|
147
|
-
<!-- SSR/Initial render without stick-to-bottom -->
|
|
148
|
-
<div class="h-full max-h-full flex flex-col min-h-0 overflow-y-scroll overflow-x-hidden">
|
|
149
|
-
<div class="px-4 sm:px-0">
|
|
150
|
-
<ng-content></ng-content>
|
|
151
|
-
</div>
|
|
152
|
-
</div>
|
|
153
|
-
} @else if (!autoScroll) {
|
|
154
|
-
<!-- Manual scroll mode -->
|
|
155
|
-
<div class="h-full max-h-full flex flex-col min-h-0 relative">
|
|
156
|
-
<div
|
|
157
|
-
#scrollContainer
|
|
158
|
-
cdkScrollable
|
|
159
|
-
[class]="computedClass()"
|
|
160
|
-
class="overflow-y-scroll overflow-x-hidden">
|
|
161
|
-
<div #contentContainer class="px-4 sm:px-0">
|
|
162
|
-
<!-- Content with padding-bottom matching React -->
|
|
163
|
-
<div [style.padding-bottom.px]="paddingBottom()">
|
|
164
|
-
<div class="max-w-3xl mx-auto">
|
|
165
|
-
@if (messageView) {
|
|
166
|
-
<copilot-slot
|
|
167
|
-
[slot]="messageView"
|
|
168
|
-
[context]="messageViewContext()"
|
|
169
|
-
[defaultComponent]="defaultMessageViewComponent">
|
|
170
|
-
</copilot-slot>
|
|
171
|
-
} @else {
|
|
172
|
-
<copilot-chat-message-view
|
|
173
|
-
[messages]="messages"
|
|
174
|
-
[inputClass]="messageViewClass"
|
|
175
|
-
[showCursor]="showCursor"
|
|
176
|
-
(assistantMessageThumbsUp)="assistantMessageThumbsUp.emit($event)"
|
|
177
|
-
(assistantMessageThumbsDown)="assistantMessageThumbsDown.emit($event)"
|
|
178
|
-
(assistantMessageReadAloud)="assistantMessageReadAloud.emit($event)"
|
|
179
|
-
(assistantMessageRegenerate)="assistantMessageRegenerate.emit($event)"
|
|
180
|
-
(userMessageCopy)="userMessageCopy.emit($event)"
|
|
181
|
-
(userMessageEdit)="userMessageEdit.emit($event)">
|
|
182
|
-
</copilot-chat-message-view>
|
|
183
|
-
}
|
|
184
|
-
</div>
|
|
185
|
-
</div>
|
|
186
|
-
</div>
|
|
187
|
-
</div>
|
|
188
|
-
|
|
189
|
-
<!-- Scroll to bottom button for manual mode, OUTSIDE scrollable content -->
|
|
190
|
-
@if (showScrollButton() && !isResizing) {
|
|
191
|
-
<div
|
|
192
|
-
class="absolute inset-x-0 flex justify-center z-30"
|
|
193
|
-
[style.bottom.px]="inputContainerHeightSignal() + 16">
|
|
194
|
-
<copilot-slot
|
|
195
|
-
[slot]="scrollToBottomButton"
|
|
196
|
-
[context]="scrollToBottomContext()"
|
|
197
|
-
[defaultComponent]="defaultScrollToBottomButtonComponent"
|
|
198
|
-
[outputs]="scrollToBottomOutputs">
|
|
199
|
-
</copilot-slot>
|
|
200
|
-
</div>
|
|
201
|
-
}
|
|
202
|
-
</div>
|
|
203
|
-
} @else {
|
|
204
|
-
<!-- Auto-scroll mode with StickToBottom directive -->
|
|
205
|
-
<div class="h-full max-h-full flex flex-col min-h-0 relative">
|
|
206
|
-
<div
|
|
207
|
-
#scrollContainer
|
|
208
|
-
cdkScrollable
|
|
209
|
-
copilotStickToBottom
|
|
210
|
-
[enabled]="autoScroll"
|
|
211
|
-
[threshold]="10"
|
|
212
|
-
[debounceMs]="0"
|
|
213
|
-
[initialBehavior]="'smooth'"
|
|
214
|
-
[resizeBehavior]="'smooth'"
|
|
215
|
-
(isAtBottomChange)="onIsAtBottomChange($event)"
|
|
216
|
-
[class]="computedClass()"
|
|
217
|
-
class="overflow-y-scroll overflow-x-hidden">
|
|
218
|
-
|
|
219
|
-
<!-- Scrollable content wrapper -->
|
|
220
|
-
<div class="px-4 sm:px-0">
|
|
221
|
-
<!-- Content with padding-bottom matching React -->
|
|
222
|
-
<div [style.padding-bottom.px]="paddingBottom()">
|
|
223
|
-
<div class="max-w-3xl mx-auto">
|
|
224
|
-
@if (messageView) {
|
|
225
|
-
<copilot-slot
|
|
226
|
-
[slot]="messageView"
|
|
227
|
-
[context]="messageViewContext()"
|
|
228
|
-
[defaultComponent]="defaultMessageViewComponent">
|
|
229
|
-
</copilot-slot>
|
|
230
|
-
} @else {
|
|
231
|
-
<copilot-chat-message-view
|
|
232
|
-
[messages]="messages"
|
|
233
|
-
[inputClass]="messageViewClass"
|
|
234
|
-
[showCursor]="showCursor"
|
|
235
|
-
(assistantMessageThumbsUp)="assistantMessageThumbsUp.emit($event)"
|
|
236
|
-
(assistantMessageThumbsDown)="assistantMessageThumbsDown.emit($event)"
|
|
237
|
-
(assistantMessageReadAloud)="assistantMessageReadAloud.emit($event)"
|
|
238
|
-
(assistantMessageRegenerate)="assistantMessageRegenerate.emit($event)"
|
|
239
|
-
(userMessageCopy)="userMessageCopy.emit($event)"
|
|
240
|
-
(userMessageEdit)="userMessageEdit.emit($event)">
|
|
241
|
-
</copilot-chat-message-view>
|
|
242
|
-
}
|
|
243
|
-
</div>
|
|
244
|
-
</div>
|
|
245
|
-
</div>
|
|
246
|
-
</div>
|
|
247
|
-
|
|
248
|
-
<!-- Scroll to bottom button - hidden during resize, OUTSIDE scrollable content -->
|
|
249
|
-
@if (!isAtBottom() && !isResizing) {
|
|
250
|
-
<div
|
|
251
|
-
class="absolute inset-x-0 flex justify-center z-30"
|
|
252
|
-
[style.bottom.px]="inputContainerHeightSignal() + 16">
|
|
253
|
-
<copilot-slot
|
|
254
|
-
[slot]="scrollToBottomButton"
|
|
255
|
-
[context]="scrollToBottomFromStickContext()"
|
|
256
|
-
[defaultComponent]="defaultScrollToBottomButtonComponent"
|
|
257
|
-
[outputs]="scrollToBottomFromStickOutputs">
|
|
258
|
-
</copilot-slot>
|
|
259
|
-
</div>
|
|
260
|
-
}
|
|
261
|
-
</div>
|
|
262
|
-
}
|
|
263
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "component", type: CopilotSlotComponent, selector: "copilot-slot", inputs: ["slot", "context", "defaultComponent", "outputs"] }, { kind: "component", type: CopilotChatMessageViewComponent, selector: "copilot-chat-message-view", inputs: ["messages", "showCursor", "isLoading", "inputClass", "assistantMessageComponent", "assistantMessageTemplate", "assistantMessageClass", "userMessageComponent", "userMessageTemplate", "userMessageClass", "cursorComponent", "cursorTemplate", "cursorClass"], outputs: ["assistantMessageThumbsUp", "assistantMessageThumbsDown", "assistantMessageReadAloud", "assistantMessageRegenerate", "userMessageCopy", "userMessageEdit"] }, { kind: "directive", type: StickToBottomDirective, selector: "[copilotStickToBottom]", inputs: ["enabled", "threshold", "initialBehavior", "resizeBehavior", "debounceMs"], outputs: ["isAtBottomChange", "scrollToBottomRequested"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
264
|
-
}
|
|
265
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatViewScrollViewComponent, decorators: [{
|
|
266
|
-
type: Component,
|
|
267
|
-
args: [{
|
|
268
|
-
selector: 'copilot-chat-view-scroll-view',
|
|
269
|
-
standalone: true,
|
|
270
|
-
imports: [
|
|
271
|
-
CommonModule,
|
|
272
|
-
ScrollingModule,
|
|
273
|
-
CopilotSlotComponent,
|
|
274
|
-
CopilotChatMessageViewComponent,
|
|
275
|
-
CopilotChatViewScrollToBottomButtonComponent,
|
|
276
|
-
StickToBottomDirective
|
|
277
|
-
],
|
|
278
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
279
|
-
encapsulation: ViewEncapsulation.None,
|
|
280
|
-
providers: [ScrollPositionService],
|
|
281
|
-
template: `
|
|
282
|
-
@if (!hasMounted()) {
|
|
283
|
-
<!-- SSR/Initial render without stick-to-bottom -->
|
|
284
|
-
<div class="h-full max-h-full flex flex-col min-h-0 overflow-y-scroll overflow-x-hidden">
|
|
285
|
-
<div class="px-4 sm:px-0">
|
|
286
|
-
<ng-content></ng-content>
|
|
287
|
-
</div>
|
|
288
|
-
</div>
|
|
289
|
-
} @else if (!autoScroll) {
|
|
290
|
-
<!-- Manual scroll mode -->
|
|
291
|
-
<div class="h-full max-h-full flex flex-col min-h-0 relative">
|
|
292
|
-
<div
|
|
293
|
-
#scrollContainer
|
|
294
|
-
cdkScrollable
|
|
295
|
-
[class]="computedClass()"
|
|
296
|
-
class="overflow-y-scroll overflow-x-hidden">
|
|
297
|
-
<div #contentContainer class="px-4 sm:px-0">
|
|
298
|
-
<!-- Content with padding-bottom matching React -->
|
|
299
|
-
<div [style.padding-bottom.px]="paddingBottom()">
|
|
300
|
-
<div class="max-w-3xl mx-auto">
|
|
301
|
-
@if (messageView) {
|
|
302
|
-
<copilot-slot
|
|
303
|
-
[slot]="messageView"
|
|
304
|
-
[context]="messageViewContext()"
|
|
305
|
-
[defaultComponent]="defaultMessageViewComponent">
|
|
306
|
-
</copilot-slot>
|
|
307
|
-
} @else {
|
|
308
|
-
<copilot-chat-message-view
|
|
309
|
-
[messages]="messages"
|
|
310
|
-
[inputClass]="messageViewClass"
|
|
311
|
-
[showCursor]="showCursor"
|
|
312
|
-
(assistantMessageThumbsUp)="assistantMessageThumbsUp.emit($event)"
|
|
313
|
-
(assistantMessageThumbsDown)="assistantMessageThumbsDown.emit($event)"
|
|
314
|
-
(assistantMessageReadAloud)="assistantMessageReadAloud.emit($event)"
|
|
315
|
-
(assistantMessageRegenerate)="assistantMessageRegenerate.emit($event)"
|
|
316
|
-
(userMessageCopy)="userMessageCopy.emit($event)"
|
|
317
|
-
(userMessageEdit)="userMessageEdit.emit($event)">
|
|
318
|
-
</copilot-chat-message-view>
|
|
319
|
-
}
|
|
320
|
-
</div>
|
|
321
|
-
</div>
|
|
322
|
-
</div>
|
|
323
|
-
</div>
|
|
324
|
-
|
|
325
|
-
<!-- Scroll to bottom button for manual mode, OUTSIDE scrollable content -->
|
|
326
|
-
@if (showScrollButton() && !isResizing) {
|
|
327
|
-
<div
|
|
328
|
-
class="absolute inset-x-0 flex justify-center z-30"
|
|
329
|
-
[style.bottom.px]="inputContainerHeightSignal() + 16">
|
|
330
|
-
<copilot-slot
|
|
331
|
-
[slot]="scrollToBottomButton"
|
|
332
|
-
[context]="scrollToBottomContext()"
|
|
333
|
-
[defaultComponent]="defaultScrollToBottomButtonComponent"
|
|
334
|
-
[outputs]="scrollToBottomOutputs">
|
|
335
|
-
</copilot-slot>
|
|
336
|
-
</div>
|
|
337
|
-
}
|
|
338
|
-
</div>
|
|
339
|
-
} @else {
|
|
340
|
-
<!-- Auto-scroll mode with StickToBottom directive -->
|
|
341
|
-
<div class="h-full max-h-full flex flex-col min-h-0 relative">
|
|
342
|
-
<div
|
|
343
|
-
#scrollContainer
|
|
344
|
-
cdkScrollable
|
|
345
|
-
copilotStickToBottom
|
|
346
|
-
[enabled]="autoScroll"
|
|
347
|
-
[threshold]="10"
|
|
348
|
-
[debounceMs]="0"
|
|
349
|
-
[initialBehavior]="'smooth'"
|
|
350
|
-
[resizeBehavior]="'smooth'"
|
|
351
|
-
(isAtBottomChange)="onIsAtBottomChange($event)"
|
|
352
|
-
[class]="computedClass()"
|
|
353
|
-
class="overflow-y-scroll overflow-x-hidden">
|
|
354
|
-
|
|
355
|
-
<!-- Scrollable content wrapper -->
|
|
356
|
-
<div class="px-4 sm:px-0">
|
|
357
|
-
<!-- Content with padding-bottom matching React -->
|
|
358
|
-
<div [style.padding-bottom.px]="paddingBottom()">
|
|
359
|
-
<div class="max-w-3xl mx-auto">
|
|
360
|
-
@if (messageView) {
|
|
361
|
-
<copilot-slot
|
|
362
|
-
[slot]="messageView"
|
|
363
|
-
[context]="messageViewContext()"
|
|
364
|
-
[defaultComponent]="defaultMessageViewComponent">
|
|
365
|
-
</copilot-slot>
|
|
366
|
-
} @else {
|
|
367
|
-
<copilot-chat-message-view
|
|
368
|
-
[messages]="messages"
|
|
369
|
-
[inputClass]="messageViewClass"
|
|
370
|
-
[showCursor]="showCursor"
|
|
371
|
-
(assistantMessageThumbsUp)="assistantMessageThumbsUp.emit($event)"
|
|
372
|
-
(assistantMessageThumbsDown)="assistantMessageThumbsDown.emit($event)"
|
|
373
|
-
(assistantMessageReadAloud)="assistantMessageReadAloud.emit($event)"
|
|
374
|
-
(assistantMessageRegenerate)="assistantMessageRegenerate.emit($event)"
|
|
375
|
-
(userMessageCopy)="userMessageCopy.emit($event)"
|
|
376
|
-
(userMessageEdit)="userMessageEdit.emit($event)">
|
|
377
|
-
</copilot-chat-message-view>
|
|
378
|
-
}
|
|
379
|
-
</div>
|
|
380
|
-
</div>
|
|
381
|
-
</div>
|
|
382
|
-
</div>
|
|
383
|
-
|
|
384
|
-
<!-- Scroll to bottom button - hidden during resize, OUTSIDE scrollable content -->
|
|
385
|
-
@if (!isAtBottom() && !isResizing) {
|
|
386
|
-
<div
|
|
387
|
-
class="absolute inset-x-0 flex justify-center z-30"
|
|
388
|
-
[style.bottom.px]="inputContainerHeightSignal() + 16">
|
|
389
|
-
<copilot-slot
|
|
390
|
-
[slot]="scrollToBottomButton"
|
|
391
|
-
[context]="scrollToBottomFromStickContext()"
|
|
392
|
-
[defaultComponent]="defaultScrollToBottomButtonComponent"
|
|
393
|
-
[outputs]="scrollToBottomFromStickOutputs">
|
|
394
|
-
</copilot-slot>
|
|
395
|
-
</div>
|
|
396
|
-
}
|
|
397
|
-
</div>
|
|
398
|
-
}
|
|
399
|
-
`
|
|
400
|
-
}]
|
|
401
|
-
}], propDecorators: { autoScroll: [{
|
|
402
|
-
type: Input
|
|
403
|
-
}], inputContainerHeight: [{
|
|
404
|
-
type: Input
|
|
405
|
-
}], isResizing: [{
|
|
406
|
-
type: Input
|
|
407
|
-
}], inputClass: [{
|
|
408
|
-
type: Input
|
|
409
|
-
}], messages: [{
|
|
410
|
-
type: Input
|
|
411
|
-
}], messageView: [{
|
|
412
|
-
type: Input
|
|
413
|
-
}], messageViewClass: [{
|
|
414
|
-
type: Input
|
|
415
|
-
}], showCursor: [{
|
|
416
|
-
type: Input
|
|
417
|
-
}], scrollToBottomButton: [{
|
|
418
|
-
type: Input
|
|
419
|
-
}], scrollToBottomButtonClass: [{
|
|
420
|
-
type: Input
|
|
421
|
-
}], assistantMessageThumbsUp: [{
|
|
422
|
-
type: Output
|
|
423
|
-
}], assistantMessageThumbsDown: [{
|
|
424
|
-
type: Output
|
|
425
|
-
}], assistantMessageReadAloud: [{
|
|
426
|
-
type: Output
|
|
427
|
-
}], assistantMessageRegenerate: [{
|
|
428
|
-
type: Output
|
|
429
|
-
}], userMessageCopy: [{
|
|
430
|
-
type: Output
|
|
431
|
-
}], userMessageEdit: [{
|
|
432
|
-
type: Output
|
|
433
|
-
}], scrollContainer: [{
|
|
434
|
-
type: ViewChild,
|
|
435
|
-
args: ['scrollContainer', { read: ElementRef }]
|
|
436
|
-
}], contentContainer: [{
|
|
437
|
-
type: ViewChild,
|
|
438
|
-
args: ['contentContainer', { read: ElementRef }]
|
|
439
|
-
}], stickToBottomDirective: [{
|
|
440
|
-
type: ViewChild,
|
|
441
|
-
args: [StickToBottomDirective]
|
|
442
|
-
}] } });
|
|
443
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXZpZXctc2Nyb2xsLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy1zY3JvbGwtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUNWLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFFBQVEsRUFLUixNQUFNLEVBQ04sV0FBVyxFQUNYLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFpQixlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsNENBQTRDLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUNySCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUUzQzs7O0dBR0c7QUF1SUgsTUFBTSxPQUFPLGtDQUFrQztJQUNyQyxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0Is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QyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQ0csZ0JBQWdCO3NCQUFwRSxTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDaEIsc0JBQXNCO3NCQUF4RCxTQUFTO3VCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgc2lnbmFsLFxuICBjb21wdXRlZCxcbiAgT25Jbml0LFxuICBPbkNoYW5nZXMsXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uRGVzdHJveSxcbiAgaW5qZWN0LFxuICBQTEFURk9STV9JRCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENka1Njcm9sbGFibGUsIFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgQ29waWxvdFNsb3RDb21wb25lbnQgfSBmcm9tICcuLi8uLi9saWIvc2xvdHMvY29waWxvdC1zbG90LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdE1lc3NhZ2VWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi9jb3BpbG90LWNoYXQtbWVzc2FnZS12aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFZpZXdTY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vY29waWxvdC1jaGF0LXZpZXctc2Nyb2xsLXRvLWJvdHRvbS1idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFN0aWNrVG9Cb3R0b21EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3N0aWNrLXRvLWJvdHRvbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2Nyb2xsUG9zaXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2Nyb2xsLXBvc2l0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ0BhZy11aS9jbGllbnQnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG4vKipcbiAqIFNjcm9sbFZpZXcgY29tcG9uZW50IGZvciBDb3BpbG90Q2hhdFZpZXdcbiAqIEhhbmRsZXMgYXV0by1zY3JvbGxpbmcgYW5kIHNjcm9sbCBwb3NpdGlvbiBtYW5hZ2VtZW50XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC12aWV3JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgQ29waWxvdFNsb3RDb21wb25lbnQsXG4gICAgQ29waWxvdENoYXRNZXNzYWdlVmlld0NvbXBvbmVudCxcbiAgICBDb3BpbG90Q2hhdFZpZXdTY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudCxcbiAgICBTdGlja1RvQm90dG9tRGlyZWN0aXZlXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtTY3JvbGxQb3NpdGlvblNlcnZpY2VdLFxuICB0ZW1wbGF0ZTogYFxuICAgIEBpZiAoIWhhc01vdW50ZWQoKSkge1xuICAgICAgPCEtLSBTU1IvSW5pdGlhbCByZW5kZXIgd2l0aG91dCBzdGljay10by1ib3R0b20gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiaC1mdWxsIG1heC1oLWZ1bGwgZmxleCBmbGV4LWNvbCBtaW4taC0wIG92ZXJmbG93LXktc2Nyb2xsIG92ZXJmbG93LXgtaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJweC00IHNtOnB4LTBcIj5cbiAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSBpZiAoIWF1dG9TY3JvbGwpIHtcbiAgICAgIDwhLS0gTWFudWFsIHNjcm9sbCBtb2RlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImgtZnVsbCBtYXgtaC1mdWxsIGZsZXggZmxleC1jb2wgbWluLWgtMCByZWxhdGl2ZVwiPlxuICAgICAgICA8ZGl2IFxuICAgICAgICAgICNzY3JvbGxDb250YWluZXJcbiAgICAgICAgICBjZGtTY3JvbGxhYmxlXG4gICAgICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3MoKVwiXG4gICAgICAgICAgY2xhc3M9XCJvdmVyZmxvdy15LXNjcm9sbCBvdmVyZmxvdy14LWhpZGRlblwiPlxuICAgICAgICAgIDxkaXYgI2NvbnRlbnRDb250YWluZXIgY2xhc3M9XCJweC00IHNtOnB4LTBcIj5cbiAgICAgICAgICAgIDwhLS0gQ29udGVudCB3aXRoIHBhZGRpbmctYm90dG9tIG1hdGNoaW5nIFJlYWN0IC0tPlxuICAgICAgICAgICAgPGRpdiBbc3R5bGUucGFkZGluZy1ib3R0b20ucHhdPVwicGFkZGluZ0JvdHRvbSgpXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXgtdy0zeGwgbXgtYXV0b1wiPlxuICAgICAgICAgICAgICAgIEBpZiAobWVzc2FnZVZpZXcpIHtcbiAgICAgICAgICAgICAgICAgIDxjb3BpbG90LXNsb3RcbiAgICAgICAgICAgICAgICAgICAgW3Nsb3RdPVwibWVzc2FnZVZpZXdcIlxuICAgICAgICAgICAgICAgICAgICBbY29udGV4dF09XCJtZXNzYWdlVmlld0NvbnRleHQoKVwiXG4gICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0Q29tcG9uZW50XT1cImRlZmF1bHRNZXNzYWdlVmlld0NvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICA8Y29waWxvdC1jaGF0LW1lc3NhZ2Utdmlld1xuICAgICAgICAgICAgICAgICAgICBbbWVzc2FnZXNdPVwibWVzc2FnZXNcIlxuICAgICAgICAgICAgICAgICAgICBbaW5wdXRDbGFzc109XCJtZXNzYWdlVmlld0NsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDdXJzb3JdPVwic2hvd0N1cnNvclwiXG4gICAgICAgICAgICAgICAgICAgIChhc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXApPVwiYXNzaXN0YW50TWVzc2FnZVRodW1ic1VwLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChhc3Npc3RhbnRNZXNzYWdlVGh1bWJzRG93bik9XCJhc3Npc3RhbnRNZXNzYWdlVGh1bWJzRG93bi5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoYXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZCk9XCJhc3Npc3RhbnRNZXNzYWdlUmVhZEFsb3VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChhc3Npc3RhbnRNZXNzYWdlUmVnZW5lcmF0ZSk9XCJhc3Npc3RhbnRNZXNzYWdlUmVnZW5lcmF0ZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAodXNlck1lc3NhZ2VDb3B5KT1cInVzZXJNZXNzYWdlQ29weS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAodXNlck1lc3NhZ2VFZGl0KT1cInVzZXJNZXNzYWdlRWRpdC5lbWl0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIDwvY29waWxvdC1jaGF0LW1lc3NhZ2Utdmlldz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgPCEtLSBTY3JvbGwgdG8gYm90dG9tIGJ1dHRvbiBmb3IgbWFudWFsIG1vZGUsIE9VVFNJREUgc2Nyb2xsYWJsZSBjb250ZW50IC0tPlxuICAgICAgICBAaWYgKHNob3dTY3JvbGxCdXR0b24oKSAmJiAhaXNSZXNpemluZykge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQteC0wIGZsZXgganVzdGlmeS1jZW50ZXIgei0zMFwiXG4gICAgICAgICAgICBbc3R5bGUuYm90dG9tLnB4XT1cImlucHV0Q29udGFpbmVySGVpZ2h0U2lnbmFsKCkgKyAxNlwiPlxuICAgICAgICAgICAgPGNvcGlsb3Qtc2xvdFxuICAgICAgICAgICAgICBbc2xvdF09XCJzY3JvbGxUb0JvdHRvbUJ1dHRvblwiXG4gICAgICAgICAgICAgIFtjb250ZXh0XT1cInNjcm9sbFRvQm90dG9tQ29udGV4dCgpXCJcbiAgICAgICAgICAgICAgW2RlZmF1bHRDb21wb25lbnRdPVwiZGVmYXVsdFNjcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50XCJcbiAgICAgICAgICAgICAgW291dHB1dHNdPVwic2Nyb2xsVG9Cb3R0b21PdXRwdXRzXCI+XG4gICAgICAgICAgICA8L2NvcGlsb3Qtc2xvdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8IS0tIEF1dG8tc2Nyb2xsIG1vZGUgd2l0aCBTdGlja1RvQm90dG9tIGRpcmVjdGl2ZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgbWF4LWgtZnVsbCBmbGV4IGZsZXgtY29sIG1pbi1oLTAgcmVsYXRpdmVcIj5cbiAgICAgICAgPGRpdiBcbiAgICAgICAgICAjc2Nyb2xsQ29udGFpbmVyXG4gICAgICAgICAgY2RrU2Nyb2xsYWJsZVxuICAgICAgICAgIGNvcGlsb3RTdGlja1RvQm90dG9tXG4gICAgICAgICAgW2VuYWJsZWRdPVwiYXV0b1Njcm9sbFwiXG4gICAgICAgICAgW3RocmVzaG9sZF09XCIxMFwiXG4gICAgICAgICAgW2RlYm91bmNlTXNdPVwiMFwiXG4gICAgICAgICAgW2luaXRpYWxCZWhhdmlvcl09XCInc21vb3RoJ1wiXG4gICAgICAgICAgW3Jlc2l6ZUJlaGF2aW9yXT1cIidzbW9vdGgnXCJcbiAgICAgICAgICAoaXNBdEJvdHRvbUNoYW5nZSk9XCJvbklzQXRCb3R0b21DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3MoKVwiXG4gICAgICAgICAgY2xhc3M9XCJvdmVyZmxvdy15LXNjcm9sbCBvdmVyZmxvdy14LWhpZGRlblwiPlxuICAgICAgICAgIFxuICAgICAgICAgIDwhLS0gU2Nyb2xsYWJsZSBjb250ZW50IHdyYXBwZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgc206cHgtMFwiPlxuICAgICAgICAgICAgPCEtLSBDb250ZW50IHdpdGggcGFkZGluZy1ib3R0b20gbWF0Y2hpbmcgUmVhY3QgLS0+XG4gICAgICAgICAgICA8ZGl2IFtzdHlsZS5wYWRkaW5nLWJvdHRvbS5weF09XCJwYWRkaW5nQm90dG9tKClcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1heC13LTN4bCBteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgQGlmIChtZXNzYWdlVmlldykge1xuICAgICAgICAgICAgICAgICAgPGNvcGlsb3Qtc2xvdFxuICAgICAgICAgICAgICAgICAgICBbc2xvdF09XCJtZXNzYWdlVmlld1wiXG4gICAgICAgICAgICAgICAgICAgIFtjb250ZXh0XT1cIm1lc3NhZ2VWaWV3Q29udGV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRDb21wb25lbnRdPVwiZGVmYXVsdE1lc3NhZ2VWaWV3Q29tcG9uZW50XCI+XG4gICAgICAgICAgICAgICAgICA8L2NvcGlsb3Qtc2xvdD5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDxjb3BpbG90LWNoYXQtbWVzc2FnZS12aWV3XG4gICAgICAgICAgICAgICAgICAgIFttZXNzYWdlc109XCJtZXNzYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dENsYXNzXT1cIm1lc3NhZ2VWaWV3Q2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICBbc2hvd0N1cnNvcl09XCJzaG93Q3Vyc29yXCJcbiAgICAgICAgICAgICAgICAgICAgKGFzc2lzdGFudE1lc3NhZ2VUaHVtYnNVcCk9XCJhc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXAuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGFzc2lzdGFudE1lc3NhZ2VUaHVtYnNEb3duKT1cImFzc2lzdGFudE1lc3NhZ2VUaHVtYnNEb3duLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChhc3Npc3RhbnRNZXNzYWdlUmVhZEFsb3VkKT1cImFzc2lzdGFudE1lc3NhZ2VSZWFkQWxvdWQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlKT1cImFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICh1c2VyTWVzc2FnZUNvcHkpPVwidXNlck1lc3NhZ2VDb3B5LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICh1c2VyTWVzc2FnZUVkaXQpPVwidXNlck1lc3NhZ2VFZGl0LmVtaXQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPC9jb3BpbG90LWNoYXQtbWVzc2FnZS12aWV3PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICA8IS0tIFNjcm9sbCB0byBib3R0b20gYnV0dG9uIC0gaGlkZGVuIGR1cmluZyByZXNpemUsIE9VVFNJREUgc2Nyb2xsYWJsZSBjb250ZW50IC0tPlxuICAgICAgICBAaWYgKCFpc0F0Qm90dG9tKCkgJiYgIWlzUmVzaXppbmcpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGluc2V0LXgtMCBmbGV4IGp1c3RpZnktY2VudGVyIHotMzBcIlxuICAgICAgICAgICAgW3N0eWxlLmJvdHRvbS5weF09XCJpbnB1dENvbnRhaW5lckhlaWdodFNpZ25hbCgpICsgMTZcIj5cbiAgICAgICAgICAgIDxjb3BpbG90LXNsb3RcbiAgICAgICAgICAgICAgW3Nsb3RdPVwic2Nyb2xsVG9Cb3R0b21CdXR0b25cIlxuICAgICAgICAgICAgICBbY29udGV4dF09XCJzY3JvbGxUb0JvdHRvbUZyb21TdGlja0NvbnRleHQoKVwiXG4gICAgICAgICAgICAgIFtkZWZhdWx0Q29tcG9uZW50XT1cImRlZmF1bHRTY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudFwiXG4gICAgICAgICAgICAgIFtvdXRwdXRzXT1cInNjcm9sbFRvQm90dG9tRnJvbVN0aWNrT3V0cHV0c1wiPlxuICAgICAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBDb3BpbG90Q2hhdFZpZXdTY3JvbGxWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgXG4gIEBJbnB1dCgpIGF1dG9TY3JvbGw6IGJvb2xlYW4gPSB0cnVlO1xuICBcbiAgcHJpdmF0ZSBfaW5wdXRDb250YWluZXJIZWlnaHQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIFxuICBzZXQgaW5wdXRDb250YWluZXJIZWlnaHQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2lucHV0Q29udGFpbmVySGVpZ2h0ID0gdmFsdWU7XG4gICAgdGhpcy5pbnB1dENvbnRhaW5lckhlaWdodFNpZ25hbC5zZXQodmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCBpbnB1dENvbnRhaW5lckhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dENvbnRhaW5lckhlaWdodDtcbiAgfVxuICBcbiAgQElucHV0KCkgaXNSZXNpemluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpbnB1dENsYXNzPzogc3RyaW5nO1xuICBASW5wdXQoKSBtZXNzYWdlczogTWVzc2FnZVtdID0gW107XG4gIEBJbnB1dCgpIG1lc3NhZ2VWaWV3PzogYW55O1xuICBASW5wdXQoKSBtZXNzYWdlVmlld0NsYXNzPzogc3RyaW5nO1xuICBASW5wdXQoKSBzaG93Q3Vyc29yOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvLyBIYW5kbGVyIGF2YWlsYWJpbGl0eSBmbGFncyByZW1vdmVkIGluIGZhdm9yIG9mIERJIHNlcnZpY2VcbiAgXG4gIC8vIFNsb3QgaW5wdXRzXG4gIEBJbnB1dCgpIHNjcm9sbFRvQm90dG9tQnV0dG9uPzogYW55O1xuICBASW5wdXQoKSBzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzPzogc3RyaW5nO1xuICBcbiAgLy8gT3V0cHV0IGV2ZW50cyAoYnViYmxlZCBmcm9tIG1lc3NhZ2UgdmlldylcbiAgQE91dHB1dCgpIGFzc2lzdGFudE1lc3NhZ2VUaHVtYnNVcCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBNZXNzYWdlIH0+KCk7XG4gIEBPdXRwdXQoKSBhc3Npc3RhbnRNZXNzYWdlVGh1bWJzRG93biA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBNZXNzYWdlIH0+KCk7XG4gIEBPdXRwdXQoKSBhc3Npc3RhbnRNZXNzYWdlUmVhZEFsb3VkID0gbmV3IEV2ZW50RW1pdHRlcjx7IG1lc3NhZ2U6IE1lc3NhZ2UgfT4oKTtcbiAgQE91dHB1dCgpIGFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlID0gbmV3IEV2ZW50RW1pdHRlcjx7IG1lc3NhZ2U6IE1lc3NhZ2UgfT4oKTtcbiAgQE91dHB1dCgpIHVzZXJNZXNzYWdlQ29weSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBNZXNzYWdlIH0+KCk7XG4gIEBPdXRwdXQoKSB1c2VyTWVzc2FnZUVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbWVzc2FnZTogTWVzc2FnZSB9PigpO1xuICBcbiAgLy8gVmlld0NoaWxkIHJlZmVyZW5jZXNcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHNjcm9sbENvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdjb250ZW50Q29udGFpbmVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGNvbnRlbnRDb250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZChTdGlja1RvQm90dG9tRGlyZWN0aXZlKSBzdGlja1RvQm90dG9tRGlyZWN0aXZlPzogU3RpY2tUb0JvdHRvbURpcmVjdGl2ZTtcbiAgXG4gIC8vIERlZmF1bHQgY29tcG9uZW50c1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdE1lc3NhZ2VWaWV3Q29tcG9uZW50ID0gQ29waWxvdENoYXRNZXNzYWdlVmlld0NvbXBvbmVudDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRTY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudCA9IENvcGlsb3RDaGF0Vmlld1Njcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50O1xuICBcbiAgLy8gU2lnbmFsc1xuICBwcm90ZWN0ZWQgaGFzTW91bnRlZCA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCBzaG93U2Nyb2xsQnV0dG9uID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIGlzQXRCb3R0b20gPSBzaWduYWwodHJ1ZSk7XG4gIHByb3RlY3RlZCBpbnB1dENvbnRhaW5lckhlaWdodFNpZ25hbCA9IHNpZ25hbCgwKTtcbiAgcHJvdGVjdGVkIHBhZGRpbmdCb3R0b20gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmlucHV0Q29udGFpbmVySGVpZ2h0U2lnbmFsKCkgKyAzMik7XG4gIFxuICAvLyBDb21wdXRlZCBjbGFzc1xuICBwcm90ZWN0ZWQgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IFxuICAgIGNuKHRoaXMuaW5wdXRDbGFzcylcbiAgKTtcbiAgXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICBwcml2YXRlIHNjcm9sbFBvc2l0aW9uU2VydmljZSA9IGluamVjdChTY3JvbGxQb3NpdGlvblNlcnZpY2UpO1xuICBcbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gdGhlIGJyb3dzZXJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgLy8gU2V0IG1vdW50ZWQgYWZ0ZXIgYSB0aWNrIHRvIGFsbG93IGZvciBoeWRyYXRpb25cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhhc01vdW50ZWQuc2V0KHRydWUpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG4gIFxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgc2lnbmFscyB3aGVuIGlucHV0cyBjaGFuZ2VcbiAgICAvLyBGb3JjZSBjaGFuZ2UgZGV0ZWN0aW9uIHdoZW4gaW5wdXRDb250YWluZXJIZWlnaHQgY2hhbmdlc1xuICAgIGlmICh0aGlzLmlucHV0Q29udGFpbmVySGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cbiAgXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXV0b1Njcm9sbCkge1xuICAgICAgLy8gV2FpdCBmb3IgdGhlIHZpZXcgdG8gYmUgZnVsbHkgcmVuZGVyZWQgYWZ0ZXIgaGFzTW91bnRlZCBpcyBzZXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zY3JvbGxDb250YWluZXIpIHtcbiAgICAgICAgICAvLyBDaGVjayBpbml0aWFsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHRoaXMuc2Nyb2xsUG9zaXRpb25TZXJ2aWNlLmdldFNjcm9sbFN0YXRlKHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIDEwKTtcbiAgICAgICAgICB0aGlzLnNob3dTY3JvbGxCdXR0b24uc2V0KCFpbml0aWFsU3RhdGUuaXNBdEJvdHRvbSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTW9uaXRvciBzY3JvbGwgcG9zaXRpb24gZm9yIG1hbnVhbCBtb2RlXG4gICAgICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvblNlcnZpY2UubW9uaXRvclNjcm9sbFBvc2l0aW9uKHRoaXMuc2Nyb2xsQ29udGFpbmVyLCAxMClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNob3dTY3JvbGxCdXR0b24uc2V0KCFzdGF0ZS5pc0F0Qm90dG9tKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBpc0F0Qm90dG9tIGNoYW5nZSBmcm9tIFN0aWNrVG9Cb3R0b20gZGlyZWN0aXZlXG4gICAqL1xuICBvbklzQXRCb3R0b21DaGFuZ2UoaXNBdEJvdHRvbTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNBdEJvdHRvbS5zZXQoaXNBdEJvdHRvbSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTY3JvbGwgdG8gYm90dG9tIGZvciBtYW51YWwgbW9kZVxuICAgKi9cbiAgc2Nyb2xsVG9Cb3R0b20oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2Nyb2xsQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uU2VydmljZS5zY3JvbGxUb0JvdHRvbSh0aGlzLnNjcm9sbENvbnRhaW5lciwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogU2Nyb2xsIHRvIGJvdHRvbSBmb3Igc3RpY2stdG8tYm90dG9tIG1vZGVcbiAgICovXG4gIHNjcm9sbFRvQm90dG9tRnJvbVN0aWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0aWNrVG9Cb3R0b21EaXJlY3RpdmUpIHtcbiAgICAgIHRoaXMuc3RpY2tUb0JvdHRvbURpcmVjdGl2ZS5zY3JvbGxUb0JvdHRvbSgnc21vb3RoJyk7XG4gICAgfVxuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbiAgXG4gIC8vIE91dHB1dCBtYXBzIGZvciBzbG90c1xuICBzY3JvbGxUb0JvdHRvbU91dHB1dHMgPSB7IGNsaWNrZWQ6ICgpID0+IHRoaXMuc2Nyb2xsVG9Cb3R0b20oKSB9O1xuICBzY3JvbGxUb0JvdHRvbUZyb21TdGlja091dHB1dHMgPSB7IGNsaWNrZWQ6ICgpID0+IHRoaXMuc2Nyb2xsVG9Cb3R0b21Gcm9tU3RpY2soKSB9O1xuICBcbiAgLy8gQ29udGV4dCBtZXRob2RzIGZvciB0ZW1wbGF0ZXNcbiAgbWVzc2FnZVZpZXdDb250ZXh0KCk6IGFueSB7XG4gICAgcmV0dXJuIHsgbWVzc2FnZXM6IHRoaXMubWVzc2FnZXMsIGlucHV0Q2xhc3M6IHRoaXMubWVzc2FnZVZpZXdDbGFzcywgc2hvd0N1cnNvcjogdGhpcy5zaG93Q3Vyc29yIH07XG4gIH1cbiAgXG4gIHNjcm9sbFRvQm90dG9tQ29udGV4dCgpOiBhbnkge1xuICAgIHJldHVybiB7IFxuICAgICAgaW5wdXRDbGFzczogdGhpcy5zY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzLFxuICAgICAgb25DbGljazogKCkgPT4gdGhpcy5zY3JvbGxUb0JvdHRvbSgpXG4gICAgfTtcbiAgfVxuICBcbiAgc2Nyb2xsVG9Cb3R0b21Gcm9tU3RpY2tDb250ZXh0KCk6IGFueSB7XG4gICAgcmV0dXJuIHsgXG4gICAgICBpbnB1dENsYXNzOiB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uQ2xhc3MsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB0aGlzLnNjcm9sbFRvQm90dG9tRnJvbVN0aWNrKClcbiAgICB9O1xuICB9XG59XG4iXX0=
|