@copilotkitnext/angular 0.0.9-alpha.3 → 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.
Files changed (210) hide show
  1. package/dist/esm2022/index.mjs +2 -70
  2. package/dist/esm2022/lib/agent.mjs +73 -0
  3. package/dist/esm2022/lib/chat-config.mjs +35 -0
  4. package/dist/esm2022/lib/chat-state.mjs +18 -0
  5. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-buttons.mjs +344 -0
  6. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-renderer.mjs +260 -0
  7. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message-toolbar.mjs +22 -0
  8. package/dist/esm2022/{components/chat/copilot-chat-assistant-message.component.mjs → lib/components/chat/copilot-chat-assistant-message.mjs} +216 -240
  9. package/dist/esm2022/lib/components/chat/copilot-chat-assistant-message.types.mjs +2 -0
  10. package/dist/esm2022/lib/components/chat/copilot-chat-audio-recorder.mjs +196 -0
  11. package/dist/esm2022/lib/components/chat/copilot-chat-buttons.mjs +299 -0
  12. package/dist/esm2022/lib/components/chat/copilot-chat-input-defaults.mjs +39 -0
  13. package/dist/esm2022/lib/components/chat/copilot-chat-input.mjs +634 -0
  14. package/dist/esm2022/lib/components/chat/copilot-chat-input.types.mjs +10 -0
  15. package/dist/esm2022/lib/components/chat/copilot-chat-message-view-cursor.mjs +27 -0
  16. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.mjs +268 -0
  17. package/dist/esm2022/lib/components/chat/copilot-chat-message-view.types.mjs +2 -0
  18. package/dist/esm2022/lib/components/chat/copilot-chat-textarea.mjs +139 -0
  19. package/dist/esm2022/lib/components/chat/copilot-chat-tool-calls-view.mjs +36 -0
  20. package/dist/esm2022/lib/components/chat/copilot-chat-toolbar.mjs +20 -0
  21. package/dist/esm2022/lib/components/chat/copilot-chat-tools-menu.mjs +203 -0
  22. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-branch-navigation.mjs +118 -0
  23. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-buttons.mjs +182 -0
  24. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-renderer.mjs +28 -0
  25. package/dist/esm2022/lib/components/chat/copilot-chat-user-message-toolbar.mjs +25 -0
  26. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.mjs +306 -0
  27. package/dist/esm2022/lib/components/chat/copilot-chat-user-message.types.mjs +2 -0
  28. package/dist/esm2022/lib/components/chat/copilot-chat-view-disclaimer.mjs +48 -0
  29. package/dist/esm2022/lib/components/chat/copilot-chat-view-feather.mjs +41 -0
  30. package/dist/esm2022/lib/components/chat/copilot-chat-view-handlers.mjs +19 -0
  31. package/dist/esm2022/lib/components/chat/copilot-chat-view-input-container.mjs +96 -0
  32. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.mjs +89 -0
  33. package/dist/esm2022/lib/components/chat/copilot-chat-view-scroll-view.mjs +456 -0
  34. package/dist/esm2022/lib/components/chat/copilot-chat-view.mjs +404 -0
  35. package/dist/esm2022/lib/components/chat/copilot-chat-view.types.mjs +2 -0
  36. package/dist/esm2022/lib/components/chat/copilot-chat.mjs +167 -0
  37. package/dist/esm2022/lib/config.mjs +9 -0
  38. package/dist/esm2022/lib/copilotkit.mjs +124 -0
  39. package/dist/esm2022/lib/directives/copilotkit-agent-context.mjs +130 -0
  40. package/dist/esm2022/lib/directives/stick-to-bottom.mjs +170 -0
  41. package/dist/esm2022/lib/directives/tooltip.mjs +217 -0
  42. package/dist/esm2022/lib/human-in-the-loop.mjs +19 -0
  43. package/dist/esm2022/lib/render-tool-calls.mjs +131 -0
  44. package/dist/esm2022/lib/resize-observer.mjs +152 -0
  45. package/dist/esm2022/lib/scroll-position.mjs +124 -0
  46. package/dist/esm2022/lib/slots/copilot-slot.mjs +156 -0
  47. package/dist/esm2022/lib/slots/index.mjs +4 -0
  48. package/dist/esm2022/lib/slots/slot.types.mjs +3 -3
  49. package/dist/esm2022/lib/slots/slot.utils.mjs +19 -15
  50. package/dist/esm2022/lib/tools.mjs +31 -0
  51. package/dist/esm2022/lib/utils.mjs +3 -3
  52. package/dist/esm2022/public-api.mjs +47 -0
  53. package/dist/fesm2022/copilotkitnext-angular.mjs +5249 -8271
  54. package/dist/fesm2022/copilotkitnext-angular.mjs.map +1 -1
  55. package/dist/index.d.ts +1 -55
  56. package/dist/lib/agent.d.ts +53 -0
  57. package/dist/{core/chat-configuration/chat-configuration.types.d.ts → lib/chat-config.d.ts} +4 -8
  58. package/dist/lib/chat-state.d.ts +10 -0
  59. package/dist/lib/components/chat/copilot-chat-assistant-message-buttons.d.ts +68 -0
  60. package/dist/lib/components/chat/copilot-chat-assistant-message-renderer.d.ts +26 -0
  61. package/dist/lib/components/chat/copilot-chat-assistant-message-toolbar.d.ts +7 -0
  62. package/dist/lib/components/chat/copilot-chat-assistant-message.d.ts +178 -0
  63. package/dist/{components → lib/components}/chat/copilot-chat-assistant-message.types.d.ts +1 -1
  64. package/dist/{components/chat/copilot-chat-audio-recorder.component.d.ts → lib/components/chat/copilot-chat-audio-recorder.d.ts} +10 -10
  65. package/dist/lib/components/chat/copilot-chat-buttons.d.ts +65 -0
  66. package/dist/lib/components/chat/copilot-chat-input-defaults.d.ts +38 -0
  67. package/dist/lib/components/chat/copilot-chat-input.d.ts +133 -0
  68. package/dist/{components → lib/components}/chat/copilot-chat-input.types.d.ts +11 -11
  69. package/dist/lib/components/chat/copilot-chat-message-view-cursor.d.ts +11 -0
  70. package/dist/{components/chat/copilot-chat-message-view.component.d.ts → lib/components/chat/copilot-chat-message-view.d.ts} +68 -36
  71. package/dist/{components → lib/components}/chat/copilot-chat-message-view.types.d.ts +2 -2
  72. package/dist/lib/components/chat/copilot-chat-textarea.d.ts +41 -0
  73. package/dist/lib/components/chat/copilot-chat-tool-calls-view.d.ts +55 -0
  74. package/dist/lib/components/chat/copilot-chat-toolbar.d.ts +7 -0
  75. package/dist/lib/components/chat/copilot-chat-tools-menu.d.ts +20 -0
  76. package/dist/lib/components/chat/copilot-chat-user-message-branch-navigation.d.ts +20 -0
  77. package/dist/lib/components/chat/copilot-chat-user-message-buttons.d.ts +35 -0
  78. package/dist/lib/components/chat/copilot-chat-user-message-renderer.d.ts +8 -0
  79. package/dist/lib/components/chat/copilot-chat-user-message-toolbar.d.ts +7 -0
  80. package/dist/lib/components/chat/copilot-chat-user-message.d.ts +55 -0
  81. package/dist/{components → lib/components}/chat/copilot-chat-user-message.types.d.ts +2 -2
  82. package/dist/lib/components/chat/copilot-chat-view-disclaimer.d.ts +15 -0
  83. package/dist/{components/chat/copilot-chat-view-feather.component.d.ts → lib/components/chat/copilot-chat-view-feather.d.ts} +6 -6
  84. package/dist/{components/chat/copilot-chat-view-handlers.service.d.ts → lib/components/chat/copilot-chat-view-handlers.d.ts} +3 -3
  85. package/dist/lib/components/chat/copilot-chat-view-input-container.d.ts +23 -0
  86. package/dist/lib/components/chat/copilot-chat-view-scroll-to-bottom-button.d.ts +16 -0
  87. package/dist/lib/components/chat/copilot-chat-view-scroll-view.d.ts +114 -0
  88. package/dist/lib/components/chat/copilot-chat-view.d.ts +239 -0
  89. package/dist/{components → lib/components}/chat/copilot-chat-view.types.d.ts +2 -2
  90. package/dist/lib/components/chat/copilot-chat.d.ts +67 -0
  91. package/dist/lib/config.d.ts +16 -0
  92. package/dist/lib/copilotkit.d.ts +29 -0
  93. package/dist/{directives/copilotkit-agent-context.directive.d.ts → lib/directives/copilotkit-agent-context.d.ts} +5 -5
  94. package/dist/lib/directives/stick-to-bottom.d.ts +62 -0
  95. package/dist/lib/directives/tooltip.d.ts +33 -0
  96. package/dist/lib/human-in-the-loop.d.ts +13 -0
  97. package/dist/lib/render-tool-calls.d.ts +75 -0
  98. package/dist/{services/resize-observer.service.d.ts → lib/resize-observer.d.ts} +2 -2
  99. package/dist/{services/scroll-position.service.d.ts → lib/scroll-position.d.ts} +6 -6
  100. package/dist/lib/slots/copilot-slot.d.ts +34 -0
  101. package/dist/lib/slots/index.d.ts +3 -0
  102. package/dist/lib/slots/slot.types.d.ts +1 -1
  103. package/dist/lib/slots/slot.utils.d.ts +6 -4
  104. package/dist/lib/tools.d.ts +63 -0
  105. package/dist/lib/utils.d.ts +1 -1
  106. package/dist/public-api.d.ts +46 -0
  107. package/dist/styles.css +0 -69
  108. package/package.json +3 -3
  109. package/dist/components/chat/copilot-chat-assistant-message-buttons.component.d.ts +0 -75
  110. package/dist/components/chat/copilot-chat-assistant-message-renderer.component.d.ts +0 -31
  111. package/dist/components/chat/copilot-chat-assistant-message-toolbar.component.d.ts +0 -8
  112. package/dist/components/chat/copilot-chat-assistant-message.component.d.ts +0 -132
  113. package/dist/components/chat/copilot-chat-buttons.component.d.ts +0 -66
  114. package/dist/components/chat/copilot-chat-input-defaults.d.ts +0 -37
  115. package/dist/components/chat/copilot-chat-input.component.d.ts +0 -133
  116. package/dist/components/chat/copilot-chat-message-view-cursor.component.d.ts +0 -15
  117. package/dist/components/chat/copilot-chat-textarea.component.d.ts +0 -45
  118. package/dist/components/chat/copilot-chat-tool-calls-view.component.d.ts +0 -35
  119. package/dist/components/chat/copilot-chat-toolbar.component.d.ts +0 -8
  120. package/dist/components/chat/copilot-chat-tools-menu.component.d.ts +0 -20
  121. package/dist/components/chat/copilot-chat-user-message-branch-navigation.component.d.ts +0 -23
  122. package/dist/components/chat/copilot-chat-user-message-buttons.component.d.ts +0 -39
  123. package/dist/components/chat/copilot-chat-user-message-renderer.component.d.ts +0 -9
  124. package/dist/components/chat/copilot-chat-user-message-toolbar.component.d.ts +0 -8
  125. package/dist/components/chat/copilot-chat-user-message.component.d.ts +0 -55
  126. package/dist/components/chat/copilot-chat-view-disclaimer.component.d.ts +0 -15
  127. package/dist/components/chat/copilot-chat-view-input-container.component.d.ts +0 -23
  128. package/dist/components/chat/copilot-chat-view-scroll-to-bottom-button.component.d.ts +0 -17
  129. package/dist/components/chat/copilot-chat-view-scroll-view.component.d.ts +0 -84
  130. package/dist/components/chat/copilot-chat-view.component.d.ts +0 -205
  131. package/dist/components/chat/copilot-chat.component.d.ts +0 -36
  132. package/dist/components/copilotkit-tool-render.component.d.ts +0 -25
  133. package/dist/core/chat-configuration/chat-configuration.providers.d.ts +0 -54
  134. package/dist/core/chat-configuration/chat-configuration.service.d.ts +0 -75
  135. package/dist/core/copilotkit.providers.d.ts +0 -13
  136. package/dist/core/copilotkit.service.d.ts +0 -119
  137. package/dist/core/copilotkit.types.d.ts +0 -81
  138. package/dist/directives/copilotkit-agent.directive.d.ts +0 -106
  139. package/dist/directives/copilotkit-chat-config.directive.d.ts +0 -84
  140. package/dist/directives/copilotkit-config.directive.d.ts +0 -44
  141. package/dist/directives/copilotkit-frontend-tool.directive.d.ts +0 -25
  142. package/dist/directives/copilotkit-human-in-the-loop.directive.d.ts +0 -124
  143. package/dist/directives/stick-to-bottom.directive.d.ts +0 -62
  144. package/dist/esm2022/components/chat/copilot-chat-assistant-message-buttons.component.mjs +0 -384
  145. package/dist/esm2022/components/chat/copilot-chat-assistant-message-renderer.component.mjs +0 -286
  146. package/dist/esm2022/components/chat/copilot-chat-assistant-message-toolbar.component.mjs +0 -27
  147. package/dist/esm2022/components/chat/copilot-chat-assistant-message.types.mjs +0 -2
  148. package/dist/esm2022/components/chat/copilot-chat-audio-recorder.component.mjs +0 -202
  149. package/dist/esm2022/components/chat/copilot-chat-buttons.component.mjs +0 -321
  150. package/dist/esm2022/components/chat/copilot-chat-input-defaults.mjs +0 -38
  151. package/dist/esm2022/components/chat/copilot-chat-input.component.mjs +0 -666
  152. package/dist/esm2022/components/chat/copilot-chat-input.types.mjs +0 -10
  153. package/dist/esm2022/components/chat/copilot-chat-message-view-cursor.component.mjs +0 -45
  154. package/dist/esm2022/components/chat/copilot-chat-message-view.component.mjs +0 -296
  155. package/dist/esm2022/components/chat/copilot-chat-message-view.types.mjs +0 -2
  156. package/dist/esm2022/components/chat/copilot-chat-textarea.component.mjs +0 -188
  157. package/dist/esm2022/components/chat/copilot-chat-tool-calls-view.component.mjs +0 -222
  158. package/dist/esm2022/components/chat/copilot-chat-toolbar.component.mjs +0 -25
  159. package/dist/esm2022/components/chat/copilot-chat-tools-menu.component.mjs +0 -199
  160. package/dist/esm2022/components/chat/copilot-chat-user-message-branch-navigation.component.mjs +0 -137
  161. package/dist/esm2022/components/chat/copilot-chat-user-message-buttons.component.mjs +0 -207
  162. package/dist/esm2022/components/chat/copilot-chat-user-message-renderer.component.mjs +0 -35
  163. package/dist/esm2022/components/chat/copilot-chat-user-message-toolbar.component.mjs +0 -34
  164. package/dist/esm2022/components/chat/copilot-chat-user-message.component.mjs +0 -341
  165. package/dist/esm2022/components/chat/copilot-chat-user-message.types.mjs +0 -2
  166. package/dist/esm2022/components/chat/copilot-chat-view-disclaimer.component.mjs +0 -52
  167. package/dist/esm2022/components/chat/copilot-chat-view-feather.component.mjs +0 -55
  168. package/dist/esm2022/components/chat/copilot-chat-view-handlers.service.mjs +0 -19
  169. package/dist/esm2022/components/chat/copilot-chat-view-input-container.component.mjs +0 -110
  170. package/dist/esm2022/components/chat/copilot-chat-view-scroll-to-bottom-button.component.mjs +0 -93
  171. package/dist/esm2022/components/chat/copilot-chat-view-scroll-view.component.mjs +0 -443
  172. package/dist/esm2022/components/chat/copilot-chat-view.component.mjs +0 -479
  173. package/dist/esm2022/components/chat/copilot-chat-view.types.mjs +0 -2
  174. package/dist/esm2022/components/chat/copilot-chat.component.mjs +0 -220
  175. package/dist/esm2022/components/copilotkit-tool-render.component.mjs +0 -150
  176. package/dist/esm2022/core/chat-configuration/chat-configuration.providers.mjs +0 -65
  177. package/dist/esm2022/core/chat-configuration/chat-configuration.service.mjs +0 -145
  178. package/dist/esm2022/core/chat-configuration/chat-configuration.types.mjs +0 -26
  179. package/dist/esm2022/core/copilotkit.providers.mjs +0 -34
  180. package/dist/esm2022/core/copilotkit.service.mjs +0 -411
  181. package/dist/esm2022/core/copilotkit.types.mjs +0 -13
  182. package/dist/esm2022/directives/copilotkit-agent-context.directive.mjs +0 -130
  183. package/dist/esm2022/directives/copilotkit-agent.directive.mjs +0 -221
  184. package/dist/esm2022/directives/copilotkit-chat-config.directive.mjs +0 -218
  185. package/dist/esm2022/directives/copilotkit-config.directive.mjs +0 -94
  186. package/dist/esm2022/directives/copilotkit-frontend-tool.directive.mjs +0 -128
  187. package/dist/esm2022/directives/copilotkit-human-in-the-loop.directive.mjs +0 -265
  188. package/dist/esm2022/directives/stick-to-bottom.directive.mjs +0 -181
  189. package/dist/esm2022/lib/directives/tooltip.directive.mjs +0 -211
  190. package/dist/esm2022/lib/slots/copilot-slot.component.mjs +0 -154
  191. package/dist/esm2022/services/resize-observer.service.mjs +0 -152
  192. package/dist/esm2022/services/scroll-position.service.mjs +0 -124
  193. package/dist/esm2022/types/frontend-tool.mjs +0 -2
  194. package/dist/esm2022/types/human-in-the-loop.mjs +0 -2
  195. package/dist/esm2022/utils/agent-context.utils.mjs +0 -114
  196. package/dist/esm2022/utils/agent.utils.mjs +0 -212
  197. package/dist/esm2022/utils/chat-config.utils.mjs +0 -186
  198. package/dist/esm2022/utils/copilotkit.utils.mjs +0 -20
  199. package/dist/esm2022/utils/frontend-tool.utils.mjs +0 -224
  200. package/dist/esm2022/utils/human-in-the-loop.utils.mjs +0 -293
  201. package/dist/lib/directives/tooltip.directive.d.ts +0 -33
  202. package/dist/lib/slots/copilot-slot.component.d.ts +0 -34
  203. package/dist/types/frontend-tool.d.ts +0 -37
  204. package/dist/types/human-in-the-loop.d.ts +0 -44
  205. package/dist/utils/agent-context.utils.d.ts +0 -75
  206. package/dist/utils/agent.utils.d.ts +0 -108
  207. package/dist/utils/chat-config.utils.d.ts +0 -166
  208. package/dist/utils/copilotkit.utils.d.ts +0 -16
  209. package/dist/utils/frontend-tool.utils.d.ts +0 -119
  210. package/dist/utils/human-in-the-loop.utils.d.ts +0 -92
@@ -0,0 +1,634 @@
1
+ import { Component, TemplateRef, signal, computed, effect, ChangeDetectionStrategy, ViewEncapsulation, ContentChild, input, output, ViewChild, } from "@angular/core";
2
+ import { CommonModule } from "@angular/common";
3
+ import { CopilotSlot } from "../../slots/copilot-slot";
4
+ import { injectChatLabels } from "../../chat-config";
5
+ import { LucideAngularModule, ArrowUp } from "lucide-angular";
6
+ import { CopilotChatTextarea } from "./copilot-chat-textarea";
7
+ import { CopilotChatAudioRecorder } from "./copilot-chat-audio-recorder";
8
+ import { CopilotChatStartTranscribeButton, CopilotChatCancelTranscribeButton, CopilotChatFinishTranscribeButton, CopilotChatAddFileButton, } from "./copilot-chat-buttons";
9
+ import { CopilotChatToolbar } from "./copilot-chat-toolbar";
10
+ import { CopilotChatToolsMenu } from "./copilot-chat-tools-menu";
11
+ import { cn } from "../../utils";
12
+ import { injectChatState } from "../../chat-state";
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/common";
15
+ import * as i2 from "lucide-angular";
16
+ export class CopilotChatInput {
17
+ textAreaRef;
18
+ audioRecorderRef;
19
+ // Capture templates from content projection
20
+ sendButtonTemplate;
21
+ toolbarTemplate;
22
+ textAreaTemplate;
23
+ audioRecorderTemplate;
24
+ startTranscribeButtonTemplate;
25
+ cancelTranscribeButtonTemplate;
26
+ finishTranscribeButtonTemplate;
27
+ addFileButtonTemplate;
28
+ toolsButtonTemplate;
29
+ // Class inputs for styling default components
30
+ sendButtonClass = input(undefined);
31
+ toolbarClass = input(undefined);
32
+ textAreaClass = input(undefined);
33
+ textAreaMaxRows = input(undefined);
34
+ textAreaPlaceholder = input(undefined);
35
+ audioRecorderClass = input(undefined);
36
+ startTranscribeButtonClass = input(undefined);
37
+ cancelTranscribeButtonClass = input(undefined);
38
+ finishTranscribeButtonClass = input(undefined);
39
+ addFileButtonClass = input(undefined);
40
+ toolsButtonClass = input(undefined);
41
+ // Component inputs for overrides
42
+ sendButtonComponent = input(undefined);
43
+ toolbarComponent = input(undefined);
44
+ textAreaComponent = input(undefined);
45
+ audioRecorderComponent = input(undefined);
46
+ startTranscribeButtonComponent = input(undefined);
47
+ cancelTranscribeButtonComponent = input(undefined);
48
+ finishTranscribeButtonComponent = input(undefined);
49
+ addFileButtonComponent = input(undefined);
50
+ toolsButtonComponent = input(undefined);
51
+ // Regular inputs
52
+ mode = input(undefined);
53
+ toolsMenu = input(undefined);
54
+ autoFocus = input(undefined);
55
+ value = input(undefined);
56
+ inputClass = input(undefined);
57
+ // Note: Prefer host `class` for styling this component;
58
+ // keep only `inputClass` to style the internal wrapper if needed.
59
+ additionalToolbarItems = input(undefined);
60
+ // Output events
61
+ submitMessage = output();
62
+ startTranscribe = output();
63
+ cancelTranscribe = output();
64
+ finishTranscribe = output();
65
+ addFile = output();
66
+ valueChange = output();
67
+ // Icons and default classes
68
+ ArrowUpIcon = ArrowUp;
69
+ defaultButtonClass = cn(
70
+ // Base button styles
71
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium", "transition-all disabled:pointer-events-none disabled:opacity-50", "shrink-0 outline-none", "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
72
+ // chatInputToolbarPrimary variant
73
+ "cursor-pointer", "bg-black text-white", "dark:bg-white dark:text-black dark:focus-visible:outline-white", "rounded-full h-9 w-9", "transition-colors", "focus:outline-none", "hover:opacity-70 disabled:hover:opacity-100", "disabled:cursor-not-allowed disabled:bg-[#00000014] disabled:text-[rgb(13,13,13)]", "dark:disabled:bg-[#454545] dark:disabled:text-white");
74
+ // Services
75
+ labels = injectChatLabels();
76
+ // readonly chatConfig = injectChatConfig();
77
+ chatState = injectChatState();
78
+ // Signals
79
+ modeSignal = signal("input");
80
+ toolsMenuSignal = signal([]);
81
+ autoFocusSignal = signal(true);
82
+ customClass = signal(undefined);
83
+ // Default components
84
+ // Note: CopilotChatTextarea uses attribute selector but is a component
85
+ defaultAudioRecorder = CopilotChatAudioRecorder;
86
+ defaultSendButton = null; // Will be set to avoid circular dependency
87
+ CopilotChatToolbar = CopilotChatToolbar;
88
+ CopilotChatAddFileButton = CopilotChatAddFileButton;
89
+ CopilotChatToolsMenu = CopilotChatToolsMenu;
90
+ CopilotChatCancelTranscribeButton = CopilotChatCancelTranscribeButton;
91
+ CopilotChatFinishTranscribeButton = CopilotChatFinishTranscribeButton;
92
+ CopilotChatStartTranscribeButton = CopilotChatStartTranscribeButton;
93
+ // Computed values
94
+ computedMode = computed(() => this.modeSignal());
95
+ computedToolsMenu = computed(() => this.toolsMenu() ?? []);
96
+ computedAutoFocus = computed(() => this.autoFocus() ?? true);
97
+ computedValue = computed(() => {
98
+ const customValue = this.value() ?? "";
99
+ const configValue = this.chatState.inputValue();
100
+ return customValue || configValue || "";
101
+ });
102
+ computedClass = computed(() => {
103
+ const baseClasses = cn(
104
+ // Layout
105
+ "flex w-full flex-col items-center justify-center",
106
+ // Interaction
107
+ "cursor-text",
108
+ // Overflow and clipping
109
+ "overflow-visible bg-clip-padding contain-inline-size",
110
+ // Background
111
+ "bg-white dark:bg-[#303030]",
112
+ // Visual effects
113
+ "shadow-[0_4px_4px_0_#0000000a,0_0_1px_0_#0000009e] rounded-[28px]");
114
+ return cn(baseClasses, this.customClass());
115
+ });
116
+ // Context for slots (reactive via signals)
117
+ sendButtonContext = computed(() => ({
118
+ send: () => this.send(),
119
+ disabled: !this.computedValue().trim() || this.computedMode() === "processing",
120
+ value: this.computedValue(),
121
+ }));
122
+ toolbarContext = computed(() => ({
123
+ mode: this.computedMode(),
124
+ value: this.computedValue(),
125
+ }));
126
+ textAreaContext = computed(() => ({
127
+ value: this.computedValue(),
128
+ autoFocus: this.computedAutoFocus(),
129
+ disabled: this.computedMode() === "processing",
130
+ maxRows: this.textAreaMaxRows(),
131
+ placeholder: this.textAreaPlaceholder(),
132
+ inputClass: this.textAreaClass(),
133
+ onKeyDown: (event) => this.handleKeyDown(event),
134
+ onChange: (value) => this.handleValueChange(value),
135
+ }));
136
+ audioRecorderContext = computed(() => ({
137
+ inputShowControls: true,
138
+ }));
139
+ // Button contexts removed - now using outputs map for click handlers
140
+ toolsContext = computed(() => ({
141
+ inputToolsMenu: this.computedToolsMenu(),
142
+ inputDisabled: this.computedMode() === "transcribe",
143
+ }));
144
+ constructor() {
145
+ // Effect to handle mode changes (no signal writes)
146
+ effect(() => {
147
+ const currentMode = this.computedMode();
148
+ if (currentMode === "transcribe" && this.audioRecorderRef) {
149
+ this.audioRecorderRef.start().catch(console.error);
150
+ }
151
+ else if (this.audioRecorderRef?.getState() === "recording") {
152
+ this.audioRecorderRef.stop().catch(console.error);
153
+ }
154
+ });
155
+ }
156
+ // Output maps for slots
157
+ addFileButtonOutputs = { clicked: () => this.handleAddFile() };
158
+ cancelTranscribeButtonOutputs = {
159
+ clicked: () => this.handleCancelTranscribe(),
160
+ };
161
+ finishTranscribeButtonOutputs = {
162
+ clicked: () => this.handleFinishTranscribe(),
163
+ };
164
+ startTranscribeButtonOutputs = {
165
+ clicked: () => this.handleStartTranscribe(),
166
+ };
167
+ // Support both `clicked` (idiomatic in our slots) and `click` (legacy)
168
+ sendButtonOutputs = { clicked: () => this.send(), click: () => this.send() };
169
+ ngAfterViewInit() {
170
+ // Auto-focus if needed
171
+ if (this.computedAutoFocus() && this.textAreaRef) {
172
+ setTimeout(() => {
173
+ this.textAreaRef?.focus();
174
+ });
175
+ }
176
+ }
177
+ ngOnDestroy() {
178
+ // Clean up any resources
179
+ if (this.audioRecorderRef?.getState() === "recording") {
180
+ this.audioRecorderRef?.stop().catch(console.error);
181
+ }
182
+ }
183
+ handleKeyDown(event) {
184
+ if (event.key === "Enter" && !event.shiftKey) {
185
+ event.preventDefault();
186
+ this.send();
187
+ }
188
+ }
189
+ handleValueChange(value) {
190
+ this.valueChange.emit(value);
191
+ if (this.chatState)
192
+ this.chatState.changeInput(value);
193
+ }
194
+ send() {
195
+ const trimmed = this.computedValue().trim();
196
+ if (trimmed) {
197
+ this.submitMessage.emit(trimmed);
198
+ this.chatState.submitInput(trimmed);
199
+ if (this.chatState)
200
+ this.chatState.changeInput("");
201
+ if (this.textAreaRef)
202
+ this.textAreaRef.setValue("");
203
+ // Refocus input
204
+ if (this.textAreaRef) {
205
+ setTimeout(() => {
206
+ this.textAreaRef?.focus();
207
+ });
208
+ }
209
+ }
210
+ }
211
+ handleStartTranscribe() {
212
+ this.startTranscribe.emit();
213
+ this.modeSignal.set("transcribe");
214
+ }
215
+ handleCancelTranscribe() {
216
+ this.cancelTranscribe.emit();
217
+ this.modeSignal.set("input");
218
+ }
219
+ handleFinishTranscribe() {
220
+ this.finishTranscribe.emit();
221
+ this.modeSignal.set("input");
222
+ }
223
+ handleAddFile() {
224
+ this.addFile.emit();
225
+ }
226
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatInput, deps: [], target: i0.ɵɵFactoryTarget.Component });
227
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CopilotChatInput, isStandalone: true, selector: "copilot-chat-input", inputs: { sendButtonClass: { classPropertyName: "sendButtonClass", publicName: "sendButtonClass", isSignal: true, isRequired: false, transformFunction: null }, toolbarClass: { classPropertyName: "toolbarClass", publicName: "toolbarClass", isSignal: true, isRequired: false, transformFunction: null }, textAreaClass: { classPropertyName: "textAreaClass", publicName: "textAreaClass", isSignal: true, isRequired: false, transformFunction: null }, textAreaMaxRows: { classPropertyName: "textAreaMaxRows", publicName: "textAreaMaxRows", isSignal: true, isRequired: false, transformFunction: null }, textAreaPlaceholder: { classPropertyName: "textAreaPlaceholder", publicName: "textAreaPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, audioRecorderClass: { classPropertyName: "audioRecorderClass", publicName: "audioRecorderClass", isSignal: true, isRequired: false, transformFunction: null }, startTranscribeButtonClass: { classPropertyName: "startTranscribeButtonClass", publicName: "startTranscribeButtonClass", isSignal: true, isRequired: false, transformFunction: null }, cancelTranscribeButtonClass: { classPropertyName: "cancelTranscribeButtonClass", publicName: "cancelTranscribeButtonClass", isSignal: true, isRequired: false, transformFunction: null }, finishTranscribeButtonClass: { classPropertyName: "finishTranscribeButtonClass", publicName: "finishTranscribeButtonClass", isSignal: true, isRequired: false, transformFunction: null }, addFileButtonClass: { classPropertyName: "addFileButtonClass", publicName: "addFileButtonClass", isSignal: true, isRequired: false, transformFunction: null }, toolsButtonClass: { classPropertyName: "toolsButtonClass", publicName: "toolsButtonClass", isSignal: true, isRequired: false, transformFunction: null }, sendButtonComponent: { classPropertyName: "sendButtonComponent", publicName: "sendButtonComponent", isSignal: true, isRequired: false, transformFunction: null }, toolbarComponent: { classPropertyName: "toolbarComponent", publicName: "toolbarComponent", isSignal: true, isRequired: false, transformFunction: null }, textAreaComponent: { classPropertyName: "textAreaComponent", publicName: "textAreaComponent", isSignal: true, isRequired: false, transformFunction: null }, audioRecorderComponent: { classPropertyName: "audioRecorderComponent", publicName: "audioRecorderComponent", isSignal: true, isRequired: false, transformFunction: null }, startTranscribeButtonComponent: { classPropertyName: "startTranscribeButtonComponent", publicName: "startTranscribeButtonComponent", isSignal: true, isRequired: false, transformFunction: null }, cancelTranscribeButtonComponent: { classPropertyName: "cancelTranscribeButtonComponent", publicName: "cancelTranscribeButtonComponent", isSignal: true, isRequired: false, transformFunction: null }, finishTranscribeButtonComponent: { classPropertyName: "finishTranscribeButtonComponent", publicName: "finishTranscribeButtonComponent", isSignal: true, isRequired: false, transformFunction: null }, addFileButtonComponent: { classPropertyName: "addFileButtonComponent", publicName: "addFileButtonComponent", isSignal: true, isRequired: false, transformFunction: null }, toolsButtonComponent: { classPropertyName: "toolsButtonComponent", publicName: "toolsButtonComponent", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, toolsMenu: { classPropertyName: "toolsMenu", publicName: "toolsMenu", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, inputClass: { classPropertyName: "inputClass", publicName: "inputClass", isSignal: true, isRequired: false, transformFunction: null }, additionalToolbarItems: { classPropertyName: "additionalToolbarItems", publicName: "additionalToolbarItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { submitMessage: "submitMessage", startTranscribe: "startTranscribe", cancelTranscribe: "cancelTranscribe", finishTranscribe: "finishTranscribe", addFile: "addFile", valueChange: "valueChange" }, queries: [{ propertyName: "sendButtonTemplate", first: true, predicate: ["sendButton"], descendants: true, read: TemplateRef }, { propertyName: "toolbarTemplate", first: true, predicate: ["toolbar"], descendants: true, read: TemplateRef }, { propertyName: "textAreaTemplate", first: true, predicate: ["textArea"], descendants: true, read: TemplateRef }, { propertyName: "audioRecorderTemplate", first: true, predicate: ["audioRecorder"], descendants: true, read: TemplateRef }, { propertyName: "startTranscribeButtonTemplate", first: true, predicate: ["startTranscribeButton"], descendants: true, read: TemplateRef }, { propertyName: "cancelTranscribeButtonTemplate", first: true, predicate: ["cancelTranscribeButton"], descendants: true, read: TemplateRef }, { propertyName: "finishTranscribeButtonTemplate", first: true, predicate: ["finishTranscribeButton"], descendants: true, read: TemplateRef }, { propertyName: "addFileButtonTemplate", first: true, predicate: ["addFileButton"], descendants: true, read: TemplateRef }, { propertyName: "toolsButtonTemplate", first: true, predicate: ["toolsButton"], descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "textAreaRef", first: true, predicate: CopilotChatTextarea, descendants: true, read: CopilotChatTextarea }, { propertyName: "audioRecorderRef", first: true, predicate: CopilotChatAudioRecorder, descendants: true }], ngImport: i0, template: `
228
+ <div [class]="computedClass()">
229
+ <!-- Main input area: either textarea or audio recorder -->
230
+ @if (computedMode() === "transcribe") {
231
+ @if (audioRecorderTemplate || audioRecorderComponent()) {
232
+ <copilot-slot
233
+ [slot]="audioRecorderTemplate || audioRecorderComponent()"
234
+ [context]="audioRecorderContext()"
235
+ [defaultComponent]="defaultAudioRecorder"
236
+ >
237
+ </copilot-slot>
238
+ } @else {
239
+ <copilot-chat-audio-recorder [inputShowControls]="true">
240
+ </copilot-chat-audio-recorder>
241
+ }
242
+ } @else {
243
+ @if (textAreaTemplate || textAreaComponent()) {
244
+ <copilot-slot
245
+ [slot]="textAreaTemplate || textAreaComponent()"
246
+ [context]="textAreaContext()"
247
+ >
248
+ </copilot-slot>
249
+ } @else {
250
+ <textarea
251
+ copilotChatTextarea
252
+ [inputValue]="computedValue()"
253
+ [inputAutoFocus]="computedAutoFocus()"
254
+ [inputDisabled]="computedMode() === 'processing'"
255
+ [inputClass]="textAreaClass()"
256
+ [inputMaxRows]="textAreaMaxRows()"
257
+ [inputPlaceholder]="textAreaPlaceholder()"
258
+ (keyDown)="handleKeyDown($event)"
259
+ (valueChange)="handleValueChange($event)"
260
+ ></textarea>
261
+ }
262
+ }
263
+
264
+ <!-- Toolbar -->
265
+ @if (toolbarTemplate || toolbarComponent()) {
266
+ <copilot-slot
267
+ [slot]="toolbarTemplate || toolbarComponent()"
268
+ [context]="toolbarContext()"
269
+ [defaultComponent]="CopilotChatToolbar"
270
+ >
271
+ </copilot-slot>
272
+ } @else {
273
+ <div copilotChatToolbar>
274
+ <div class="flex items-center">
275
+ @if (addFileButtonTemplate || addFileButtonComponent()) {
276
+ <copilot-slot
277
+ [slot]="addFileButtonTemplate || addFileButtonComponent()"
278
+ [context]="{ inputDisabled: computedMode() === 'transcribe' }"
279
+ [outputs]="addFileButtonOutputs"
280
+ [defaultComponent]="CopilotChatAddFileButton"
281
+ >
282
+ </copilot-slot>
283
+ } @else {
284
+ <copilot-chat-add-file-button
285
+ [disabled]="computedMode() === 'transcribe'"
286
+ (clicked)="handleAddFile()"
287
+ >
288
+ </copilot-chat-add-file-button>
289
+ }
290
+ @if (computedToolsMenu().length > 0) {
291
+ @if (toolsButtonTemplate || toolsButtonComponent()) {
292
+ <copilot-slot
293
+ [slot]="toolsButtonTemplate || toolsButtonComponent()"
294
+ [context]="toolsContext()"
295
+ [defaultComponent]="CopilotChatToolsMenu"
296
+ >
297
+ </copilot-slot>
298
+ } @else {
299
+ <copilot-chat-tools-menu
300
+ [inputToolsMenu]="computedToolsMenu()"
301
+ [inputDisabled]="computedMode() === 'transcribe'"
302
+ >
303
+ </copilot-chat-tools-menu>
304
+ }
305
+ }
306
+ @if (additionalToolbarItems()) {
307
+ <ng-container
308
+ [ngTemplateOutlet]="additionalToolbarItems() || null"
309
+ ></ng-container>
310
+ }
311
+ </div>
312
+ <div class="flex items-center">
313
+ @if (computedMode() === "transcribe") {
314
+ @if (
315
+ cancelTranscribeButtonTemplate ||
316
+ cancelTranscribeButtonComponent()
317
+ ) {
318
+ <copilot-slot
319
+ [slot]="
320
+ cancelTranscribeButtonTemplate ||
321
+ cancelTranscribeButtonComponent()
322
+ "
323
+ [context]="{}"
324
+ [outputs]="cancelTranscribeButtonOutputs"
325
+ [defaultComponent]="CopilotChatCancelTranscribeButton"
326
+ >
327
+ </copilot-slot>
328
+ } @else {
329
+ <copilot-chat-cancel-transcribe-button
330
+ (clicked)="handleCancelTranscribe()"
331
+ >
332
+ </copilot-chat-cancel-transcribe-button>
333
+ }
334
+ @if (
335
+ finishTranscribeButtonTemplate ||
336
+ finishTranscribeButtonComponent()
337
+ ) {
338
+ <copilot-slot
339
+ [slot]="
340
+ finishTranscribeButtonTemplate ||
341
+ finishTranscribeButtonComponent()
342
+ "
343
+ [context]="{}"
344
+ [outputs]="finishTranscribeButtonOutputs"
345
+ [defaultComponent]="CopilotChatFinishTranscribeButton"
346
+ >
347
+ </copilot-slot>
348
+ } @else {
349
+ <copilot-chat-finish-transcribe-button
350
+ (clicked)="handleFinishTranscribe()"
351
+ >
352
+ </copilot-chat-finish-transcribe-button>
353
+ }
354
+ } @else {
355
+ @if (
356
+ startTranscribeButtonTemplate ||
357
+ startTranscribeButtonComponent()
358
+ ) {
359
+ <copilot-slot
360
+ [slot]="
361
+ startTranscribeButtonTemplate ||
362
+ startTranscribeButtonComponent()
363
+ "
364
+ [context]="{}"
365
+ [outputs]="startTranscribeButtonOutputs"
366
+ [defaultComponent]="CopilotChatStartTranscribeButton"
367
+ >
368
+ </copilot-slot>
369
+ } @else {
370
+ <copilot-chat-start-transcribe-button
371
+ (clicked)="handleStartTranscribe()"
372
+ >
373
+ </copilot-chat-start-transcribe-button>
374
+ }
375
+ <!-- Send button with slot -->
376
+ @if (sendButtonTemplate || sendButtonComponent()) {
377
+ <copilot-slot
378
+ [slot]="sendButtonTemplate || sendButtonComponent()"
379
+ [context]="sendButtonContext()"
380
+ [outputs]="sendButtonOutputs"
381
+ >
382
+ </copilot-slot>
383
+ } @else {
384
+ <div class="mr-[10px]">
385
+ <button
386
+ type="button"
387
+ [class]="sendButtonClass() || defaultButtonClass"
388
+ [disabled]="
389
+ !computedValue().trim() || computedMode() === 'processing'
390
+ "
391
+ (click)="send()"
392
+ >
393
+ <lucide-angular
394
+ [img]="ArrowUpIcon"
395
+ [size]="18"
396
+ ></lucide-angular>
397
+ </button>
398
+ </div>
399
+ }
400
+ }
401
+ </div>
402
+ </div>
403
+ }
404
+ </div>
405
+ `, isInline: true, styles: [":host{display:block;width:100%}.shadow-\\[0_4px_4px_0_\\#0000000a\\,_0_0_1px_0_\\#0000009e\\]{box-shadow:0 4px 4px #0000000a,0 0 1px #0000009e!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CopilotSlot, selector: "copilot-slot", inputs: ["slot", "context", "defaultComponent", "outputs"] }, { kind: "ngmodule", type: LucideAngularModule }, { kind: "component", type: i2.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "component", type: CopilotChatTextarea, selector: "textarea[copilotChatTextarea]", inputs: ["inputValue", "inputPlaceholder", "inputMaxRows", "inputAutoFocus", "inputDisabled", "inputClass"], outputs: ["valueChange", "keyDown"] }, { kind: "component", type: CopilotChatAudioRecorder, selector: "copilot-chat-audio-recorder", inputs: ["inputClass", "inputShowControls"], outputs: ["stateChange", "error"] }, { kind: "component", type: CopilotChatStartTranscribeButton, selector: "copilot-chat-start-transcribe-button", inputs: ["disabled"], outputs: ["clicked"] }, { kind: "component", type: CopilotChatCancelTranscribeButton, selector: "copilot-chat-cancel-transcribe-button", inputs: ["disabled"], outputs: ["clicked"] }, { kind: "component", type: CopilotChatFinishTranscribeButton, selector: "copilot-chat-finish-transcribe-button", inputs: ["disabled"], outputs: ["clicked"] }, { kind: "component", type: CopilotChatAddFileButton, selector: "copilot-chat-add-file-button", inputs: ["disabled"], outputs: ["clicked"] }, { kind: "component", type: CopilotChatToolbar, selector: "div[copilotChatToolbar]", inputs: ["inputClass"] }, { kind: "component", type: CopilotChatToolsMenu, selector: "copilot-chat-tools-menu", inputs: ["inputToolsMenu", "inputDisabled", "inputClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
406
+ }
407
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatInput, decorators: [{
408
+ type: Component,
409
+ args: [{ standalone: true, selector: "copilot-chat-input", imports: [
410
+ CommonModule,
411
+ CopilotSlot,
412
+ LucideAngularModule,
413
+ CopilotChatTextarea,
414
+ CopilotChatAudioRecorder,
415
+ CopilotChatStartTranscribeButton,
416
+ CopilotChatCancelTranscribeButton,
417
+ CopilotChatFinishTranscribeButton,
418
+ CopilotChatAddFileButton,
419
+ CopilotChatToolbar,
420
+ CopilotChatToolsMenu,
421
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: `
422
+ <div [class]="computedClass()">
423
+ <!-- Main input area: either textarea or audio recorder -->
424
+ @if (computedMode() === "transcribe") {
425
+ @if (audioRecorderTemplate || audioRecorderComponent()) {
426
+ <copilot-slot
427
+ [slot]="audioRecorderTemplate || audioRecorderComponent()"
428
+ [context]="audioRecorderContext()"
429
+ [defaultComponent]="defaultAudioRecorder"
430
+ >
431
+ </copilot-slot>
432
+ } @else {
433
+ <copilot-chat-audio-recorder [inputShowControls]="true">
434
+ </copilot-chat-audio-recorder>
435
+ }
436
+ } @else {
437
+ @if (textAreaTemplate || textAreaComponent()) {
438
+ <copilot-slot
439
+ [slot]="textAreaTemplate || textAreaComponent()"
440
+ [context]="textAreaContext()"
441
+ >
442
+ </copilot-slot>
443
+ } @else {
444
+ <textarea
445
+ copilotChatTextarea
446
+ [inputValue]="computedValue()"
447
+ [inputAutoFocus]="computedAutoFocus()"
448
+ [inputDisabled]="computedMode() === 'processing'"
449
+ [inputClass]="textAreaClass()"
450
+ [inputMaxRows]="textAreaMaxRows()"
451
+ [inputPlaceholder]="textAreaPlaceholder()"
452
+ (keyDown)="handleKeyDown($event)"
453
+ (valueChange)="handleValueChange($event)"
454
+ ></textarea>
455
+ }
456
+ }
457
+
458
+ <!-- Toolbar -->
459
+ @if (toolbarTemplate || toolbarComponent()) {
460
+ <copilot-slot
461
+ [slot]="toolbarTemplate || toolbarComponent()"
462
+ [context]="toolbarContext()"
463
+ [defaultComponent]="CopilotChatToolbar"
464
+ >
465
+ </copilot-slot>
466
+ } @else {
467
+ <div copilotChatToolbar>
468
+ <div class="flex items-center">
469
+ @if (addFileButtonTemplate || addFileButtonComponent()) {
470
+ <copilot-slot
471
+ [slot]="addFileButtonTemplate || addFileButtonComponent()"
472
+ [context]="{ inputDisabled: computedMode() === 'transcribe' }"
473
+ [outputs]="addFileButtonOutputs"
474
+ [defaultComponent]="CopilotChatAddFileButton"
475
+ >
476
+ </copilot-slot>
477
+ } @else {
478
+ <copilot-chat-add-file-button
479
+ [disabled]="computedMode() === 'transcribe'"
480
+ (clicked)="handleAddFile()"
481
+ >
482
+ </copilot-chat-add-file-button>
483
+ }
484
+ @if (computedToolsMenu().length > 0) {
485
+ @if (toolsButtonTemplate || toolsButtonComponent()) {
486
+ <copilot-slot
487
+ [slot]="toolsButtonTemplate || toolsButtonComponent()"
488
+ [context]="toolsContext()"
489
+ [defaultComponent]="CopilotChatToolsMenu"
490
+ >
491
+ </copilot-slot>
492
+ } @else {
493
+ <copilot-chat-tools-menu
494
+ [inputToolsMenu]="computedToolsMenu()"
495
+ [inputDisabled]="computedMode() === 'transcribe'"
496
+ >
497
+ </copilot-chat-tools-menu>
498
+ }
499
+ }
500
+ @if (additionalToolbarItems()) {
501
+ <ng-container
502
+ [ngTemplateOutlet]="additionalToolbarItems() || null"
503
+ ></ng-container>
504
+ }
505
+ </div>
506
+ <div class="flex items-center">
507
+ @if (computedMode() === "transcribe") {
508
+ @if (
509
+ cancelTranscribeButtonTemplate ||
510
+ cancelTranscribeButtonComponent()
511
+ ) {
512
+ <copilot-slot
513
+ [slot]="
514
+ cancelTranscribeButtonTemplate ||
515
+ cancelTranscribeButtonComponent()
516
+ "
517
+ [context]="{}"
518
+ [outputs]="cancelTranscribeButtonOutputs"
519
+ [defaultComponent]="CopilotChatCancelTranscribeButton"
520
+ >
521
+ </copilot-slot>
522
+ } @else {
523
+ <copilot-chat-cancel-transcribe-button
524
+ (clicked)="handleCancelTranscribe()"
525
+ >
526
+ </copilot-chat-cancel-transcribe-button>
527
+ }
528
+ @if (
529
+ finishTranscribeButtonTemplate ||
530
+ finishTranscribeButtonComponent()
531
+ ) {
532
+ <copilot-slot
533
+ [slot]="
534
+ finishTranscribeButtonTemplate ||
535
+ finishTranscribeButtonComponent()
536
+ "
537
+ [context]="{}"
538
+ [outputs]="finishTranscribeButtonOutputs"
539
+ [defaultComponent]="CopilotChatFinishTranscribeButton"
540
+ >
541
+ </copilot-slot>
542
+ } @else {
543
+ <copilot-chat-finish-transcribe-button
544
+ (clicked)="handleFinishTranscribe()"
545
+ >
546
+ </copilot-chat-finish-transcribe-button>
547
+ }
548
+ } @else {
549
+ @if (
550
+ startTranscribeButtonTemplate ||
551
+ startTranscribeButtonComponent()
552
+ ) {
553
+ <copilot-slot
554
+ [slot]="
555
+ startTranscribeButtonTemplate ||
556
+ startTranscribeButtonComponent()
557
+ "
558
+ [context]="{}"
559
+ [outputs]="startTranscribeButtonOutputs"
560
+ [defaultComponent]="CopilotChatStartTranscribeButton"
561
+ >
562
+ </copilot-slot>
563
+ } @else {
564
+ <copilot-chat-start-transcribe-button
565
+ (clicked)="handleStartTranscribe()"
566
+ >
567
+ </copilot-chat-start-transcribe-button>
568
+ }
569
+ <!-- Send button with slot -->
570
+ @if (sendButtonTemplate || sendButtonComponent()) {
571
+ <copilot-slot
572
+ [slot]="sendButtonTemplate || sendButtonComponent()"
573
+ [context]="sendButtonContext()"
574
+ [outputs]="sendButtonOutputs"
575
+ >
576
+ </copilot-slot>
577
+ } @else {
578
+ <div class="mr-[10px]">
579
+ <button
580
+ type="button"
581
+ [class]="sendButtonClass() || defaultButtonClass"
582
+ [disabled]="
583
+ !computedValue().trim() || computedMode() === 'processing'
584
+ "
585
+ (click)="send()"
586
+ >
587
+ <lucide-angular
588
+ [img]="ArrowUpIcon"
589
+ [size]="18"
590
+ ></lucide-angular>
591
+ </button>
592
+ </div>
593
+ }
594
+ }
595
+ </div>
596
+ </div>
597
+ }
598
+ </div>
599
+ `, styles: [":host{display:block;width:100%}.shadow-\\[0_4px_4px_0_\\#0000000a\\,_0_0_1px_0_\\#0000009e\\]{box-shadow:0 4px 4px #0000000a,0 0 1px #0000009e!important}\n"] }]
600
+ }], ctorParameters: () => [], propDecorators: { textAreaRef: [{
601
+ type: ViewChild,
602
+ args: [CopilotChatTextarea, { read: CopilotChatTextarea }]
603
+ }], audioRecorderRef: [{
604
+ type: ViewChild,
605
+ args: [CopilotChatAudioRecorder]
606
+ }], sendButtonTemplate: [{
607
+ type: ContentChild,
608
+ args: ["sendButton", { read: TemplateRef }]
609
+ }], toolbarTemplate: [{
610
+ type: ContentChild,
611
+ args: ["toolbar", { read: TemplateRef }]
612
+ }], textAreaTemplate: [{
613
+ type: ContentChild,
614
+ args: ["textArea", { read: TemplateRef }]
615
+ }], audioRecorderTemplate: [{
616
+ type: ContentChild,
617
+ args: ["audioRecorder", { read: TemplateRef }]
618
+ }], startTranscribeButtonTemplate: [{
619
+ type: ContentChild,
620
+ args: ["startTranscribeButton", { read: TemplateRef }]
621
+ }], cancelTranscribeButtonTemplate: [{
622
+ type: ContentChild,
623
+ args: ["cancelTranscribeButton", { read: TemplateRef }]
624
+ }], finishTranscribeButtonTemplate: [{
625
+ type: ContentChild,
626
+ args: ["finishTranscribeButton", { read: TemplateRef }]
627
+ }], addFileButtonTemplate: [{
628
+ type: ContentChild,
629
+ args: ["addFileButton", { read: TemplateRef }]
630
+ }], toolsButtonTemplate: [{
631
+ type: ContentChild,
632
+ args: ["toolsButton", { read: TemplateRef }]
633
+ }] } });
634
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LWlucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2NoYXQvY29waWxvdC1jaGF0LWlucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsV0FBVyxFQUNYLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLHVCQUF1QixFQUl2QixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxnQ0FBZ0MsRUFDaEMsaUNBQWlDLEVBQ2pDLGlDQUFpQyxFQUNqQyx3QkFBd0IsR0FDekIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUtqRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7OztBQW1PbkQsTUFBTSxPQUFPLGdCQUFnQjtJQUUzQixXQUFXLENBQXVCO0lBR2xDLGdCQUFnQixDQUE0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QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBRzVELDhCQUE4QjtzQkFEN0IsWUFBWTt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBRzdELDhCQUE4QjtzQkFEN0IsWUFBWTt1QkFBQyx3QkFBd0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBRzdELHFCQUFxQjtzQkFEcEIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQUdwRCxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgVGVtcGxhdGVSZWYsXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIEFmdGVyVmlld0luaXQsXG4gIE9uRGVzdHJveSxcbiAgVHlwZSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIENvbnRlbnRDaGlsZCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29waWxvdFNsb3QgfSBmcm9tIFwiLi4vLi4vc2xvdHMvY29waWxvdC1zbG90XCI7XG5pbXBvcnQgeyBpbmplY3RDaGF0TGFiZWxzIH0gZnJvbSBcIi4uLy4uL2NoYXQtY29uZmlnXCI7XG5pbXBvcnQgeyBMdWNpZGVBbmd1bGFyTW9kdWxlLCBBcnJvd1VwIH0gZnJvbSBcImx1Y2lkZS1hbmd1bGFyXCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdFRleHRhcmVhIH0gZnJvbSBcIi4vY29waWxvdC1jaGF0LXRleHRhcmVhXCI7XG5pbXBvcnQgeyBDb3BpbG90Q2hhdEF1ZGlvUmVjb3JkZXIgfSBmcm9tIFwiLi9jb3BpbG90LWNoYXQtYXVkaW8tcmVjb3JkZXJcIjtcbmltcG9ydCB7XG4gIENvcGlsb3RDaGF0U3RhcnRUcmFuc2NyaWJlQnV0dG9uLFxuICBDb3BpbG90Q2hhdENhbmNlbFRyYW5zY3JpYmVCdXR0b24sXG4gIENvcGlsb3RDaGF0RmluaXNoVHJhbnNjcmliZUJ1dHRvbixcbiAgQ29waWxvdENoYXRBZGRGaWxlQnV0dG9uLFxufSBmcm9tIFwiLi9jb3BpbG90LWNoYXQtYnV0dG9uc1wiO1xuaW1wb3J0IHsgQ29waWxvdENoYXRUb29sYmFyIH0gZnJvbSBcIi4vY29waWxvdC1jaGF0LXRvb2xiYXJcIjtcbmltcG9ydCB7IENvcGlsb3RDaGF0VG9vbHNNZW51IH0gZnJvbSBcIi4vY29waWxvdC1jaGF0LXRvb2xzLW1lbnVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29waWxvdENoYXRJbnB1dE1vZGUsXG4gIFRvb2xzTWVudUl0ZW0sXG59IGZyb20gXCIuL2NvcGlsb3QtY2hhdC1pbnB1dC50eXBlc1wiO1xuaW1wb3J0IHsgY24gfSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IGluamVjdENoYXRTdGF0ZSB9IGZyb20gXCIuLi8uLi9jaGF0LXN0YXRlXCI7XG5cbi8qKlxuICogQ29udGV4dCBwcm92aWRlZCB0byBzbG90IHRlbXBsYXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRCdXR0b25Db250ZXh0IHtcbiAgc2VuZDogKCkgPT4gdm9pZDtcbiAgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbGJhckNvbnRleHQge1xuICBtb2RlOiBDb3BpbG90Q2hhdElucHV0TW9kZTtcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiBcImNvcGlsb3QtY2hhdC1pbnB1dFwiLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIENvcGlsb3RTbG90LFxuICAgIEx1Y2lkZUFuZ3VsYXJNb2R1bGUsXG4gICAgQ29waWxvdENoYXRUZXh0YXJlYSxcbiAgICBDb3BpbG90Q2hhdEF1ZGlvUmVjb3JkZXIsXG4gICAgQ29waWxvdENoYXRTdGFydFRyYW5zY3JpYmVCdXR0b24sXG4gICAgQ29waWxvdENoYXRDYW5jZWxUcmFuc2NyaWJlQnV0dG9uLFxuICAgIENvcGlsb3RDaGF0RmluaXNoVHJhbnNjcmliZUJ1dHRvbixcbiAgICBDb3BpbG90Q2hhdEFkZEZpbGVCdXR0b24sXG4gICAgQ29waWxvdENoYXRUb29sYmFyLFxuICAgIENvcGlsb3RDaGF0VG9vbHNNZW51LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjb21wdXRlZENsYXNzKClcIj5cbiAgICAgIDwhLS0gTWFpbiBpbnB1dCBhcmVhOiBlaXRoZXIgdGV4dGFyZWEgb3IgYXVkaW8gcmVjb3JkZXIgLS0+XG4gICAgICBAaWYgKGNvbXB1dGVkTW9kZSgpID09PSBcInRyYW5zY3JpYmVcIikge1xuICAgICAgICBAaWYgKGF1ZGlvUmVjb3JkZXJUZW1wbGF0ZSB8fCBhdWRpb1JlY29yZGVyQ29tcG9uZW50KCkpIHtcbiAgICAgICAgICA8Y29waWxvdC1zbG90XG4gICAgICAgICAgICBbc2xvdF09XCJhdWRpb1JlY29yZGVyVGVtcGxhdGUgfHwgYXVkaW9SZWNvcmRlckNvbXBvbmVudCgpXCJcbiAgICAgICAgICAgIFtjb250ZXh0XT1cImF1ZGlvUmVjb3JkZXJDb250ZXh0KClcIlxuICAgICAgICAgICAgW2RlZmF1bHRDb21wb25lbnRdPVwiZGVmYXVsdEF1ZGlvUmVjb3JkZXJcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2NvcGlsb3Qtc2xvdD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGNvcGlsb3QtY2hhdC1hdWRpby1yZWNvcmRlciBbaW5wdXRTaG93Q29udHJvbHNdPVwidHJ1ZVwiPlxuICAgICAgICAgIDwvY29waWxvdC1jaGF0LWF1ZGlvLXJlY29yZGVyPlxuICAgICAgICB9XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgQGlmICh0ZXh0QXJlYVRlbXBsYXRlIHx8IHRleHRBcmVhQ29tcG9uZW50KCkpIHtcbiAgICAgICAgICA8Y29waWxvdC1zbG90XG4gICAgICAgICAgICBbc2xvdF09XCJ0ZXh0QXJlYVRlbXBsYXRlIHx8IHRleHRBcmVhQ29tcG9uZW50KClcIlxuICAgICAgICAgICAgW2NvbnRleHRdPVwidGV4dEFyZWFDb250ZXh0KClcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L2NvcGlsb3Qtc2xvdD5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICBjb3BpbG90Q2hhdFRleHRhcmVhXG4gICAgICAgICAgICBbaW5wdXRWYWx1ZV09XCJjb21wdXRlZFZhbHVlKClcIlxuICAgICAgICAgICAgW2lucHV0QXV0b0ZvY3VzXT1cImNvbXB1dGVkQXV0b0ZvY3VzKClcIlxuICAgICAgICAgICAgW2lucHV0RGlzYWJsZWRdPVwiY29tcHV0ZWRNb2RlKCkgPT09ICdwcm9jZXNzaW5nJ1wiXG4gICAgICAgICAgICBbaW5wdXRDbGFzc109XCJ0ZXh0QXJlYUNsYXNzKClcIlxuICAgICAgICAgICAgW2lucHV0TWF4Um93c109XCJ0ZXh0QXJlYU1heFJvd3MoKVwiXG4gICAgICAgICAgICBbaW5wdXRQbGFjZWhvbGRlcl09XCJ0ZXh0QXJlYVBsYWNlaG9sZGVyKClcIlxuICAgICAgICAgICAgKGtleURvd24pPVwiaGFuZGxlS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVWYWx1ZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICA8IS0tIFRvb2xiYXIgLS0+XG4gICAgICBAaWYgKHRvb2xiYXJUZW1wbGF0ZSB8fCB0b29sYmFyQ29tcG9uZW50KCkpIHtcbiAgICAgICAgPGNvcGlsb3Qtc2xvdFxuICAgICAgICAgIFtzbG90XT1cInRvb2xiYXJUZW1wbGF0ZSB8fCB0b29sYmFyQ29tcG9uZW50KClcIlxuICAgICAgICAgIFtjb250ZXh0XT1cInRvb2xiYXJDb250ZXh0KClcIlxuICAgICAgICAgIFtkZWZhdWx0Q29tcG9uZW50XT1cIkNvcGlsb3RDaGF0VG9vbGJhclwiXG4gICAgICAgID5cbiAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjb3BpbG90Q2hhdFRvb2xiYXI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICBAaWYgKGFkZEZpbGVCdXR0b25UZW1wbGF0ZSB8fCBhZGRGaWxlQnV0dG9uQ29tcG9uZW50KCkpIHtcbiAgICAgICAgICAgICAgPGNvcGlsb3Qtc2xvdFxuICAgICAgICAgICAgICAgIFtzbG90XT1cImFkZEZpbGVCdXR0b25UZW1wbGF0ZSB8fCBhZGRGaWxlQnV0dG9uQ29tcG9uZW50KClcIlxuICAgICAgICAgICAgICAgIFtjb250ZXh0XT1cInsgaW5wdXREaXNhYmxlZDogY29tcHV0ZWRNb2RlKCkgPT09ICd0cmFuc2NyaWJlJyB9XCJcbiAgICAgICAgICAgICAgICBbb3V0cHV0c109XCJhZGRGaWxlQnV0dG9uT3V0cHV0c1wiXG4gICAgICAgICAgICAgICAgW2RlZmF1bHRDb21wb25lbnRdPVwiQ29waWxvdENoYXRBZGRGaWxlQnV0dG9uXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L2NvcGlsb3Qtc2xvdD5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8Y29waWxvdC1jaGF0LWFkZC1maWxlLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb21wdXRlZE1vZGUoKSA9PT0gJ3RyYW5zY3JpYmUnXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJoYW5kbGVBZGRGaWxlKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvY29waWxvdC1jaGF0LWFkZC1maWxlLWJ1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoY29tcHV0ZWRUb29sc01lbnUoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIEBpZiAodG9vbHNCdXR0b25UZW1wbGF0ZSB8fCB0b29sc0J1dHRvbkNvbXBvbmVudCgpKSB7XG4gICAgICAgICAgICAgICAgPGNvcGlsb3Qtc2xvdFxuICAgICAgICAgICAgICAgICAgW3Nsb3RdPVwidG9vbHNCdXR0b25UZW1wbGF0ZSB8fCB0b29sc0J1dHRvbkNvbXBvbmVudCgpXCJcbiAgICAgICAgICAgICAgICAgIFtjb250ZXh0XT1cInRvb2xzQ29udGV4dCgpXCJcbiAgICAgICAgICAgICAgICAgIFtkZWZhdWx0Q29tcG9uZW50XT1cIkNvcGlsb3RDaGF0VG9vbHNNZW51XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxjb3BpbG90LWNoYXQtdG9vbHMtbWVudVxuICAgICAgICAgICAgICAgICAgW2lucHV0VG9vbHNNZW51XT1cImNvbXB1dGVkVG9vbHNNZW51KClcIlxuICAgICAgICAgICAgICAgICAgW2lucHV0RGlzYWJsZWRdPVwiY29tcHV0ZWRNb2RlKCkgPT09ICd0cmFuc2NyaWJlJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvY29waWxvdC1jaGF0LXRvb2xzLW1lbnU+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAoYWRkaXRpb25hbFRvb2xiYXJJdGVtcygpKSB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJhZGRpdGlvbmFsVG9vbGJhckl0ZW1zKCkgfHwgbnVsbFwiXG4gICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIEBpZiAoY29tcHV0ZWRNb2RlKCkgPT09IFwidHJhbnNjcmliZVwiKSB7XG4gICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgY2FuY2VsVHJhbnNjcmliZUJ1dHRvblRlbXBsYXRlIHx8XG4gICAgICAgICAgICAgICAgY2FuY2VsVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudCgpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIDxjb3BpbG90LXNsb3RcbiAgICAgICAgICAgICAgICAgIFtzbG90XT1cIlxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxUcmFuc2NyaWJlQnV0dG9uVGVtcGxhdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsVHJhbnNjcmliZUJ1dHRvbkNvbXBvbmVudCgpXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW2NvbnRleHRdPVwie31cIlxuICAgICAgICAgICAgICAgICAgW291dHB1dHNdPVwiY2FuY2VsVHJhbnNjcmliZUJ1dHRvbk91dHB1dHNcIlxuICAgICAgICAgICAgICAgICAgW2RlZmF1bHRDb21wb25lbnRdPVwiQ29waWxvdENoYXRDYW5jZWxUcmFuc2NyaWJlQnV0dG9uXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxjb3BpbG90LWNoYXQtY2FuY2VsLXRyYW5zY3JpYmUtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJoYW5kbGVDYW5jZWxUcmFuc2NyaWJlKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2NvcGlsb3QtY2hhdC1jYW5jZWwtdHJhbnNjcmliZS1idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICBmaW5pc2hUcmFuc2NyaWJlQnV0dG9uVGVtcGxhdGUgfHxcbiAgICAgICAgICAgICAgICBmaW5pc2hUcmFuc2NyaWJlQnV0dG9uQ29tcG9uZW50KClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgPGNvcGlsb3Qtc2xvdFxuICAgICAgICAgICAgICAgICAgW3Nsb3RdPVwiXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaFRyYW5zY3JpYmVCdXR0b25UZW1wbGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hUcmFuc2NyaWJlQnV0dG9uQ29tcG9uZW50KClcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbY29udGV4dF09XCJ7fVwiXG4gICAgICAgICAgICAgICAgICBbb3V0cHV0c109XCJmaW5pc2hUcmFuc2NyaWJlQnV0dG9uT3V0cHV0c1wiXG4gICAgICAgICAgICAgICAgICBbZGVmYXVsdENvbXBvbmVudF09XCJDb3BpbG90Q2hhdEZpbmlzaFRyYW5zY3JpYmVCdXR0b25cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2NvcGlsb3Qtc2xvdD5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGNvcGlsb3QtY2hhdC1maW5pc2gtdHJhbnNjcmliZS1idXR0b25cbiAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cImhhbmRsZUZpbmlzaFRyYW5zY3JpYmUoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvY29waWxvdC1jaGF0LWZpbmlzaC10cmFuc2NyaWJlLWJ1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgc3RhcnRUcmFuc2NyaWJlQnV0dG9uVGVtcGxhdGUgfHxcbiAgICAgICAgICAgICAgICBzdGFydFRyYW5zY3JpYmVCdXR0b25Db21wb25lbnQoKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICA8Y29waWxvdC1zbG90XG4gICAgICAgICAgICAgICAgICBbc2xvdF09XCJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUcmFuc2NyaWJlQnV0dG9uVGVtcGxhdGUgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUcmFuc2NyaWJlQnV0dG9uQ29tcG9uZW50KClcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICBbY29udGV4dF09XCJ7fVwiXG4gICAgICAgICAgICAgICAgICBbb3V0cHV0c109XCJzdGFydFRyYW5zY3JpYmVCdXR0b25PdXRwdXRzXCJcbiAgICAgICAgICAgICAgICAgIFtkZWZhdWx0Q29tcG9uZW50XT1cIkNvcGlsb3RDaGF0U3RhcnRUcmFuc2NyaWJlQnV0dG9uXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxjb3BpbG90LWNoYXQtc3RhcnQtdHJhbnNjcmliZS1idXR0b25cbiAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cImhhbmRsZVN0YXJ0VHJhbnNjcmliZSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9jb3BpbG90LWNoYXQtc3RhcnQtdHJhbnNjcmliZS1idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPCEtLSBTZW5kIGJ1dHRvbiB3aXRoIHNsb3QgLS0+XG4gICAgICAgICAgICAgIEBpZiAoc2VuZEJ1dHRvblRlbXBsYXRlIHx8IHNlbmRCdXR0b25Db21wb25lbnQoKSkge1xuICAgICAgICAgICAgICAgIDxjb3BpbG90LXNsb3RcbiAgICAgICAgICAgICAgICAgIFtzbG90XT1cInNlbmRCdXR0b25UZW1wbGF0ZSB8fCBzZW5kQnV0dG9uQ29tcG9uZW50KClcIlxuICAgICAgICAgICAgICAgICAgW2NvbnRleHRdPVwic2VuZEJ1dHRvbkNvbnRleHQoKVwiXG4gICAgICAgICAgICAgICAgICBbb3V0cHV0c109XCJzZW5kQnV0dG9uT3V0cHV0c1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvY29waWxvdC1zbG90PlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXItWzEwcHhdXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwic2VuZEJ1dHRvbkNsYXNzKCkgfHwgZGVmYXVsdEJ1dHRvbkNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICFjb21wdXRlZFZhbHVlKCkudHJpbSgpIHx8IGNvbXB1dGVkTW9kZSgpID09PSAncHJvY2Vzc2luZydcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbmQoKVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtYW5ndWxhclxuICAgICAgICAgICAgICAgICAgICAgIFtpbWddPVwiQXJyb3dVcEljb25cIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjE4XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbHVjaWRlLWFuZ3VsYXI+XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAuc2hhZG93LVxcXFxbMF80cHhfNHB4XzBfXFxcXCMwMDAwMDAwYVxcXFwyY18wXzBfMXB4XzBfXFxcXCMwMDAwMDA5ZVxcXFxdIHtcbiAgICAgICAgYm94LXNoYWRvdzpcbiAgICAgICAgICAwIDRweCA0cHggMCAjMDAwMDAwMGEsXG4gICAgICAgICAgMCAwIDFweCAwICMwMDAwMDA5ZSAhaW1wb3J0YW50O1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvcGlsb3RDaGF0SW5wdXQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKENvcGlsb3RDaGF0VGV4dGFyZWEsIHsgcmVhZDogQ29waWxvdENoYXRUZXh0YXJlYSB9KVxuICB0ZXh0QXJlYVJlZj86IENvcGlsb3RDaGF0VGV4dGFyZWE7XG5cbiAgQFZpZXdDaGlsZChDb3BpbG90Q2hhdEF1ZGlvUmVjb3JkZXIpXG4gIGF1ZGlvUmVjb3JkZXJSZWY/OiBDb3BpbG90Q2hhdEF1ZGlvUmVjb3JkZXI7XG5cbiAgLy8gQ2FwdHVyZSB0ZW1wbGF0ZXMgZnJvbSBjb250ZW50IHByb2plY3Rpb25cbiAgQENvbnRlbnRDaGlsZChcInNlbmRCdXR0b25cIiwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBzZW5kQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxTZW5kQnV0dG9uQ29udGV4dD47XG4gIEBDb250ZW50Q2hpbGQoXCJ0b29sYmFyXCIsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgdG9vbGJhclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8VG9vbGJhckNvbnRleHQ+O1xuICBAQ29udGVudENoaWxkKFwidGV4dEFyZWFcIiwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICB0ZXh0QXJlYVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChcImF1ZGlvUmVjb3JkZXJcIiwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBhdWRpb1JlY29yZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwic3RhcnRUcmFuc2NyaWJlQnV0dG9uXCIsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgc3RhcnRUcmFuc2NyaWJlQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwiY2FuY2VsVHJhbnNjcmliZUJ1dHRvblwiLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIGNhbmNlbFRyYW5zY3JpYmVCdXR0b25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoXCJmaW5pc2hUcmFuc2NyaWJlQnV0dG9uXCIsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgZmluaXNoVHJhbnNjcmliZUJ1dHRvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZChcImFkZEZpbGVCdXR0b25cIiwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBhZGRGaWxlQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKFwidG9vbHNCdXR0b25cIiwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICB0b29sc0J1dHRvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvLyBDbGFzcyBpbnB1dHMgZm9yIHN0eWxpbmcgZGVmYXVsdCBjb21wb25lbnRzXG4gIHNlbmRCdXR0b25DbGFzcyA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgdG9vbGJhckNsYXNzID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICB0ZXh0QXJlYUNsYXNzID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICB0ZXh0QXJlYU1heFJvd3MgPSBpbnB1dDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHRleHRBcmVhUGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGF1ZGlvUmVjb3JkZXJDbGFzcyA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgc3RhcnRUcmFuc2NyaWJlQnV0dG9uQ2xhc3MgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNhbmNlbFRyYW5zY3JpYmVCdXR0b25DbGFzcyA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgZmluaXNoVHJhbnNjcmliZUJ1dHRvbkNsYXNzID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBhZGRGaWxlQnV0dG9uQ2xhc3MgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHRvb2xzQnV0dG9uQ2xhc3MgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLy8gQ29tcG9uZW50IGlucHV0cyBmb3Igb3ZlcnJpZGVzXG4gIHNlbmRCdXR0b25Db21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHRvb2xiYXJDb21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHRleHRBcmVhQ29tcG9uZW50ID0gaW5wdXQ8VHlwZTxhbnk+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBhdWRpb1JlY29yZGVyQ29tcG9uZW50ID0gaW5wdXQ8VHlwZTxhbnk+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBzdGFydFRyYW5zY3JpYmVCdXR0b25Db21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNhbmNlbFRyYW5zY3JpYmVCdXR0b25Db21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGZpbmlzaFRyYW5zY3JpYmVCdXR0b25Db21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGFkZEZpbGVCdXR0b25Db21wb25lbnQgPSBpbnB1dDxUeXBlPGFueT4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHRvb2xzQnV0dG9uQ29tcG9uZW50ID0gaW5wdXQ8VHlwZTxhbnk+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIC8vIFJlZ3VsYXIgaW5wdXRzXG4gIG1vZGUgPSBpbnB1dDxDb3BpbG90Q2hhdElucHV0TW9kZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgdG9vbHNNZW51ID0gaW5wdXQ8KFRvb2xzTWVudUl0ZW0gfCBcIi1cIilbXSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgYXV0b0ZvY3VzID0gaW5wdXQ8Ym9vbGVhbiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgdmFsdWUgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGlucHV0Q2xhc3MgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIC8vIE5vdGU6IFByZWZlciBob3N0IGBjbGFzc2AgZm9yIHN0eWxpbmcgdGhpcyBjb21wb25lbnQ7XG4gIC8vIGtlZXAgb25seSBgaW5wdXRDbGFzc2AgdG8gc3R5bGUgdGhlIGludGVybmFsIHdyYXBwZXIgaWYgbmVlZGVkLlxuICBhZGRpdGlvbmFsVG9vbGJhckl0ZW1zID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAvLyBPdXRwdXQgZXZlbnRzXG4gIHN1Ym1pdE1lc3NhZ2UgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICBzdGFydFRyYW5zY3JpYmUgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgY2FuY2VsVHJhbnNjcmliZSA9IG91dHB1dDx2b2lkPigpO1xuICBmaW5pc2hUcmFuc2NyaWJlID0gb3V0cHV0PHZvaWQ+KCk7XG4gIGFkZEZpbGUgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgdmFsdWVDaGFuZ2UgPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gIC8vIEljb25zIGFuZCBkZWZhdWx0IGNsYXNzZXNcbiAgcmVhZG9ubHkgQXJyb3dVcEljb24gPSBBcnJvd1VwO1xuICByZWFkb25seSBkZWZhdWx0QnV0dG9uQ2xhc3MgPSBjbihcbiAgICAvLyBCYXNlIGJ1dHRvbiBzdHlsZXNcbiAgICBcImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMiB3aGl0ZXNwYWNlLW5vd3JhcCByb3VuZGVkLW1kIHRleHQtc20gZm9udC1tZWRpdW1cIixcbiAgICBcInRyYW5zaXRpb24tYWxsIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS01MFwiLFxuICAgIFwic2hyaW5rLTAgb3V0bGluZS1ub25lXCIsXG4gICAgXCJmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGZvY3VzLXZpc2libGU6cmluZy1bM3B4XVwiLFxuICAgIC8vIGNoYXRJbnB1dFRvb2xiYXJQcmltYXJ5IHZhcmlhbnRcbiAgICBcImN1cnNvci1wb2ludGVyXCIsXG4gICAgXCJiZy1ibGFjayB0ZXh0LXdoaXRlXCIsXG4gICAgXCJkYXJrOmJnLXdoaXRlIGRhcms6dGV4dC1ibGFjayBkYXJrOmZvY3VzLXZpc2libGU6b3V0bGluZS13aGl0ZVwiLFxuICAgIFwicm91bmRlZC1mdWxsIGgtOSB3LTlcIixcbiAgICBcInRyYW5zaXRpb24tY29sb3JzXCIsXG4gICAgXCJmb2N1czpvdXRsaW5lLW5vbmVcIixcbiAgICBcImhvdmVyOm9wYWNpdHktNzAgZGlzYWJsZWQ6aG92ZXI6b3BhY2l0eS0xMDBcIixcbiAgICBcImRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpiZy1bIzAwMDAwMDE0XSBkaXNhYmxlZDp0ZXh0LVtyZ2IoMTMsMTMsMTMpXVwiLFxuICAgIFwiZGFyazpkaXNhYmxlZDpiZy1bIzQ1NDU0NV0gZGFyazpkaXNhYmxlZDp0ZXh0LXdoaXRlXCJcbiAgKTtcblxuICAvLyBTZXJ2aWNlc1xuICByZWFkb25seSBsYWJlbHMgPSBpbmplY3RDaGF0TGFiZWxzKCk7XG4gIC8vIHJlYWRvbmx5IGNoYXRDb25maWcgPSBpbmplY3RDaGF0Q29uZmlnKCk7XG4gIHJlYWRvbmx5IGNoYXRTdGF0ZSA9IGluamVjdENoYXRTdGF0ZSgpO1xuXG4gIC8vIFNpZ25hbHNcbiAgbW9kZVNpZ25hbCA9IHNpZ25hbDxDb3BpbG90Q2hhdElucHV0TW9kZT4oXCJpbnB1dFwiKTtcbiAgdG9vbHNNZW51U2lnbmFsID0gc2lnbmFsPChUb29sc01lbnVJdGVtIHwgXCItXCIpW10+KFtdKTtcbiAgYXV0b0ZvY3VzU2lnbmFsID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICBjdXN0b21DbGFzcyA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLy8gRGVmYXVsdCBjb21wb25lbnRzXG4gIC8vIE5vdGU6IENvcGlsb3RDaGF0VGV4dGFyZWEgdXNlcyBhdHRyaWJ1dGUgc2VsZWN0b3IgYnV0IGlzIGEgY29tcG9uZW50XG4gIGRlZmF1bHRBdWRpb1JlY29yZGVyID0gQ29waWxvdENoYXRBdWRpb1JlY29yZGVyO1xuICBkZWZhdWx0U2VuZEJ1dHRvbjogYW55ID0gbnVsbDsgLy8gV2lsbCBiZSBzZXQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICBDb3BpbG90Q2hhdFRvb2xiYXIgPSBDb3BpbG90Q2hhdFRvb2xiYXI7XG4gIENvcGlsb3RDaGF0QWRkRmlsZUJ1dHRvbiA9IENvcGlsb3RDaGF0QWRkRmlsZUJ1dHRvbjtcbiAgQ29waWxvdENoYXRUb29sc01lbnUgPSBDb3BpbG90Q2hhdFRvb2xzTWVudTtcbiAgQ29waWxvdENoYXRDYW5jZWxUcmFuc2NyaWJlQnV0dG9uID0gQ29waWxvdENoYXRDYW5jZWxUcmFuc2NyaWJlQnV0dG9uO1xuICBDb3BpbG90Q2hhdEZpbmlzaFRyYW5zY3JpYmVCdXR0b24gPSBDb3BpbG90Q2hhdEZpbmlzaFRyYW5zY3JpYmVCdXR0b247XG4gIENvcGlsb3RDaGF0U3RhcnRUcmFuc2NyaWJlQnV0dG9uID0gQ29waWxvdENoYXRTdGFydFRyYW5zY3JpYmVCdXR0b247XG5cbiAgLy8gQ29tcHV0ZWQgdmFsdWVzXG4gIGNvbXB1dGVkTW9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMubW9kZVNpZ25hbCgpKTtcbiAgY29tcHV0ZWRUb29sc01lbnUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnRvb2xzTWVudSgpID8/IFtdKTtcbiAgY29tcHV0ZWRBdXRvRm9jdXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmF1dG9Gb2N1cygpID8/IHRydWUpO1xuICBjb21wdXRlZFZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlID0gdGhpcy52YWx1ZSgpID8/IFwiXCI7XG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSB0aGlzLmNoYXRTdGF0ZS5pbnB1dFZhbHVlKCk7XG4gICAgcmV0dXJuIGN1c3RvbVZhbHVlIHx8IGNvbmZpZ1ZhbHVlIHx8IFwiXCI7XG4gIH0pO1xuXG4gIGNvbXB1dGVkQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSBjbihcbiAgICAgIC8vIExheW91dFxuICAgICAgXCJmbGV4IHctZnVsbCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIixcbiAgICAgIC8vIEludGVyYWN0aW9uXG4gICAgICBcImN1cnNvci10ZXh0XCIsXG4gICAgICAvLyBPdmVyZmxvdyBhbmQgY2xpcHBpbmdcbiAgICAgIFwib3ZlcmZsb3ctdmlzaWJsZSBiZy1jbGlwLXBhZGRpbmcgY29udGFpbi1pbmxpbmUtc2l6ZVwiLFxuICAgICAgLy8gQmFja2dyb3VuZFxuICAgICAgXCJiZy13aGl0ZSBkYXJrOmJnLVsjMzAzMDMwXVwiLFxuICAgICAgLy8gVmlzdWFsIGVmZmVjdHNcbiAgICAgIFwic2hhZG93LVswXzRweF80cHhfMF8jMDAwMDAwMGEsMF8wXzFweF8wXyMwMDAwMDA5ZV0gcm91bmRlZC1bMjhweF1cIlxuICAgICk7XG4gICAgcmV0dXJuIGNuKGJhc2VDbGFzc2VzLCB0aGlzLmN1c3RvbUNsYXNzKCkpO1xuICB9KTtcblxuICAvLyBDb250ZXh0IGZvciBzbG90cyAocmVhY3RpdmUgdmlhIHNpZ25hbHMpXG4gIHNlbmRCdXR0b25Db250ZXh0ID0gY29tcHV0ZWQ8U2VuZEJ1dHRvbkNvbnRleHQ+KCgpID0+ICh7XG4gICAgc2VuZDogKCkgPT4gdGhpcy5zZW5kKCksXG4gICAgZGlzYWJsZWQ6XG4gICAgICAhdGhpcy5jb21wdXRlZFZhbHVlKCkudHJpbSgpIHx8IHRoaXMuY29tcHV0ZWRNb2RlKCkgPT09IFwicHJvY2Vzc2luZ1wiLFxuICAgIHZhbHVlOiB0aGlzLmNvbXB1dGVkVmFsdWUoKSxcbiAgfSkpO1xuXG4gIHRvb2xiYXJDb250ZXh0ID0gY29tcHV0ZWQ8VG9vbGJhckNvbnRleHQ+KCgpID0+ICh7XG4gICAgbW9kZTogdGhpcy5jb21wdXRlZE1vZGUoKSxcbiAgICB2YWx1ZTogdGhpcy5jb21wdXRlZFZhbHVlKCksXG4gIH0pKTtcblxuICB0ZXh0QXJlYUNvbnRleHQgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgIHZhbHVlOiB0aGlzLmNvbXB1dGVkVmFsdWUoKSxcbiAgICBhdXRvRm9jdXM6IHRoaXMuY29tcHV0ZWRBdXRvRm9jdXMoKSxcbiAgICBkaXNhYmxlZDogdGhpcy5jb21wdXRlZE1vZGUoKSA9PT0gXCJwcm9jZXNzaW5nXCIsXG4gICAgbWF4Um93czogdGhpcy50ZXh0QXJlYU1heFJvd3MoKSxcbiAgICBwbGFjZWhvbGRlcjogdGhpcy50ZXh0QXJlYVBsYWNlaG9sZGVyKCksXG4gICAgaW5wdXRDbGFzczogdGhpcy50ZXh0QXJlYUNsYXNzKCksXG4gICAgb25LZXlEb3duOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuaGFuZGxlS2V5RG93bihldmVudCksXG4gICAgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB0aGlzLmhhbmRsZVZhbHVlQ2hhbmdlKHZhbHVlKSxcbiAgfSkpO1xuXG4gIGF1ZGlvUmVjb3JkZXJDb250ZXh0ID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICBpbnB1dFNob3dDb250cm9sczogdHJ1ZSxcbiAgfSkpO1xuXG4gIC8vIEJ1dHRvbiBjb250ZXh0cyByZW1vdmVkIC0gbm93IHVzaW5nIG91dHB1dHMgbWFwIGZvciBjbGljayBoYW5kbGVyc1xuXG4gIHRvb2xzQ29udGV4dCA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgaW5wdXRUb29sc01lbnU6IHRoaXMuY29tcHV0ZWRUb29sc01lbnUoKSxcbiAgICBpbnB1dERpc2FibGVkOiB0aGlzLmNvbXB1dGVkTW9kZSgpID09PSBcInRyYW5zY3JpYmVcIixcbiAgfSkpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEVmZmVjdCB0byBoYW5kbGUgbW9kZSBjaGFuZ2VzIChubyBzaWduYWwgd3JpdGVzKVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50TW9kZSA9IHRoaXMuY29tcHV0ZWRNb2RlKCk7XG4gICAgICBpZiAoY3VycmVudE1vZGUgPT09IFwidHJhbnNjcmliZVwiICYmIHRoaXMuYXVkaW9SZWNvcmRlclJlZikge1xuICAgICAgICB0aGlzLmF1ZGlvUmVjb3JkZXJSZWYuc3RhcnQoKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5hdWRpb1JlY29yZGVyUmVmPy5nZXRTdGF0ZSgpID09PSBcInJlY29yZGluZ1wiKSB7XG4gICAgICAgIHRoaXMuYXVkaW9SZWNvcmRlclJlZi5zdG9wKCkuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBPdXRwdXQgbWFwcyBmb3Igc2xvdHNcbiAgYWRkRmlsZUJ1dHRvbk91dHB1dHMgPSB7IGNsaWNrZWQ6ICgpID0+IHRoaXMuaGFuZGxlQWRkRmlsZSgpIH07XG4gIGNhbmNlbFRyYW5zY3JpYmVCdXR0b25PdXRwdXRzID0ge1xuICAgIGNsaWNrZWQ6ICgpID0+IHRoaXMuaGFuZGxlQ2FuY2VsVHJhbnNjcmliZSgpLFxuICB9O1xuICBmaW5pc2hUcmFuc2NyaWJlQnV0dG9uT3V0cHV0cyA9IHtcbiAgICBjbGlja2VkOiAoKSA9PiB0aGlzLmhhbmRsZUZpbmlzaFRyYW5zY3JpYmUoKSxcbiAgfTtcbiAgc3RhcnRUcmFuc2NyaWJlQnV0dG9uT3V0cHV0cyA9IHtcbiAgICBjbGlja2VkOiAoKSA9PiB0aGlzLmhhbmRsZVN0YXJ0VHJhbnNjcmliZSgpLFxuICB9O1xuICAvLyBTdXBwb3J0IGJvdGggYGNsaWNrZWRgIChpZGlvbWF0aWMgaW4gb3VyIHNsb3RzKSBhbmQgYGNsaWNrYCAobGVnYWN5KVxuICBzZW5kQnV0dG9uT3V0cHV0cyA9IHsgY2xpY2tlZDogKCkgPT4gdGhpcy5zZW5kKCksIGNsaWNrOiAoKSA9PiB0aGlzLnNlbmQoKSB9O1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBBdXRvLWZvY3VzIGlmIG5lZWRlZFxuICAgIGlmICh0aGlzLmNvbXB1dGVkQXV0b0ZvY3VzKCkgJiYgdGhpcy50ZXh0QXJlYVJlZikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudGV4dEFyZWFSZWY/LmZvY3VzKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAvLyBDbGVhbiB1cCBhbnkgcmVzb3VyY2VzXG4gICAgaWYgKHRoaXMuYXVkaW9SZWNvcmRlclJlZj8uZ2V0U3RhdGUoKSA9PT0gXCJyZWNvcmRpbmdcIikge1xuICAgICAgdGhpcy5hdWRpb1JlY29yZGVyUmVmPy5zdG9wKCkuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09IFwiRW50ZXJcIiAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnNlbmQoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVWYWx1ZUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICBpZiAodGhpcy5jaGF0U3RhdGUpIHRoaXMuY2hhdFN0YXRlLmNoYW5nZUlucHV0KHZhbHVlKTtcbiAgfVxuXG4gIHNlbmQoKTogdm9pZCB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHRoaXMuY29tcHV0ZWRWYWx1ZSgpLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZCkge1xuICAgICAgdGhpcy5zdWJtaXRNZXNzYWdlLmVtaXQodHJpbW1lZCk7XG5cbiAgICAgIHRoaXMuY2hhdFN0YXRlLnN1Ym1pdElucHV0KHRyaW1tZWQpO1xuXG4gICAgICBpZiAodGhpcy5jaGF0U3RhdGUpIHRoaXMuY2hhdFN0YXRlLmNoYW5nZUlucHV0KFwiXCIpO1xuICAgICAgaWYgKHRoaXMudGV4dEFyZWFSZWYpIHRoaXMudGV4dEFyZWFSZWYuc2V0VmFsdWUoXCJcIik7XG5cbiAgICAgIC8vIFJlZm9jdXMgaW5wdXRcbiAgICAgIGlmICh0aGlzLnRleHRBcmVhUmVmKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGV4dEFyZWFSZWY/LmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVN0YXJ0VHJhbnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0VHJhbnNjcmliZS5lbWl0KCk7XG4gICAgdGhpcy5tb2RlU2lnbmFsLnNldChcInRyYW5zY3JpYmVcIik7XG4gIH1cblxuICBoYW5kbGVDYW5jZWxUcmFuc2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsVHJhbnNjcmliZS5lbWl0KCk7XG4gICAgdGhpcy5tb2RlU2lnbmFsLnNldChcImlucHV0XCIpO1xuICB9XG5cbiAgaGFuZGxlRmluaXNoVHJhbnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbmlzaFRyYW5zY3JpYmUuZW1pdCgpO1xuICAgIHRoaXMubW9kZVNpZ25hbC5zZXQoXCJpbnB1dFwiKTtcbiAgfVxuXG4gIGhhbmRsZUFkZEZpbGUoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRGaWxlLmVtaXQoKTtcbiAgfVxufVxuIl19