@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.
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
@@ -1,479 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ContentChild, ViewChild, ElementRef, ChangeDetectionStrategy, ViewEncapsulation, signal, computed, effect } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { CopilotSlotComponent } from '../../lib/slots/copilot-slot.component';
4
- import { CopilotChatMessageViewComponent } from './copilot-chat-message-view.component';
5
- import { CopilotChatInputComponent } from './copilot-chat-input.component';
6
- import { CopilotChatViewScrollViewComponent } from './copilot-chat-view-scroll-view.component';
7
- import { CopilotChatViewScrollToBottomButtonComponent } from './copilot-chat-view-scroll-to-bottom-button.component';
8
- import { CopilotChatViewFeatherComponent } from './copilot-chat-view-feather.component';
9
- import { CopilotChatViewInputContainerComponent } from './copilot-chat-view-input-container.component';
10
- import { CopilotChatViewDisclaimerComponent } from './copilot-chat-view-disclaimer.component';
11
- import { cn } from '../../lib/utils';
12
- import { ResizeObserverService } from '../../services/resize-observer.service';
13
- import { CopilotChatViewHandlersService } from './copilot-chat-view-handlers.service';
14
- import { Subject } from 'rxjs';
15
- import { takeUntil } from 'rxjs/operators';
16
- import * as i0 from "@angular/core";
17
- import * as i1 from "../../services/resize-observer.service";
18
- import * as i2 from "./copilot-chat-view-handlers.service";
19
- import * as i3 from "@angular/common";
20
- /**
21
- * CopilotChatView component - Angular port of the React component.
22
- * A complete chat interface with message feed and input components.
23
- *
24
- * @example
25
- * ```html
26
- * <copilot-chat-view
27
- * [messages]="messages"
28
- * [autoScroll]="true"
29
- * [messageViewProps]="{ assistantMessage: { onThumbsUp: handleThumbsUp } }">
30
- * </copilot-chat-view>
31
- * ```
32
- */
33
- export class CopilotChatViewComponent {
34
- resizeObserverService;
35
- cdr;
36
- handlers;
37
- // Core inputs matching React props
38
- messages = [];
39
- autoScroll = true;
40
- showCursor = false;
41
- // MessageView slot inputs
42
- messageViewComponent;
43
- messageViewTemplate;
44
- messageViewClass;
45
- // ScrollView slot inputs
46
- scrollViewComponent;
47
- scrollViewTemplate;
48
- scrollViewClass;
49
- // ScrollToBottomButton slot inputs
50
- scrollToBottomButtonComponent;
51
- scrollToBottomButtonTemplate;
52
- scrollToBottomButtonClass;
53
- // Input slot inputs
54
- inputComponent;
55
- inputTemplate;
56
- // InputContainer slot inputs
57
- inputContainerComponent;
58
- inputContainerTemplate;
59
- inputContainerClass;
60
- // Feather slot inputs
61
- featherComponent;
62
- featherTemplate;
63
- featherClass;
64
- // Disclaimer slot inputs
65
- disclaimerComponent;
66
- disclaimerTemplate;
67
- disclaimerClass;
68
- disclaimerText;
69
- // Custom layout template (render prop pattern)
70
- customLayoutTemplate;
71
- // Named template slots for deep customization
72
- sendButtonTemplate;
73
- toolbarTemplate;
74
- textAreaTemplate;
75
- audioRecorderTemplate;
76
- assistantMessageMarkdownRendererTemplate;
77
- thumbsUpButtonTemplate;
78
- thumbsDownButtonTemplate;
79
- readAloudButtonTemplate;
80
- regenerateButtonTemplate;
81
- // Output events for assistant message actions (bubbled from child components)
82
- assistantMessageThumbsUp = new EventEmitter();
83
- assistantMessageThumbsDown = new EventEmitter();
84
- assistantMessageReadAloud = new EventEmitter();
85
- assistantMessageRegenerate = new EventEmitter();
86
- // Output events for user message actions (if applicable)
87
- userMessageCopy = new EventEmitter();
88
- userMessageEdit = new EventEmitter();
89
- // ViewChild references
90
- inputContainerSlotRef;
91
- // Default components for slots
92
- defaultScrollViewComponent = CopilotChatViewScrollViewComponent;
93
- defaultScrollToBottomButtonComponent = CopilotChatViewScrollToBottomButtonComponent;
94
- defaultInputContainerComponent = CopilotChatViewInputContainerComponent;
95
- defaultFeatherComponent = CopilotChatViewFeatherComponent;
96
- defaultDisclaimerComponent = CopilotChatViewDisclaimerComponent;
97
- // Signals for reactive state
98
- messagesSignal = signal([]);
99
- autoScrollSignal = signal(true);
100
- showCursorSignal = signal(false);
101
- disclaimerTextSignal = signal(undefined);
102
- disclaimerClassSignal = signal(undefined);
103
- inputContainerHeight = signal(0);
104
- isResizing = signal(false);
105
- contentPaddingBottom = computed(() => this.inputContainerHeight() + 32);
106
- // Computed signals
107
- computedClass = computed(() => cn('relative h-full'));
108
- // Slot resolution computed signals
109
- messageViewSlot = computed(() => this.messageViewTemplate || this.messageViewComponent);
110
- scrollViewSlot = computed(() => this.scrollViewTemplate || this.scrollViewComponent);
111
- scrollToBottomButtonSlot = computed(() => this.scrollToBottomButtonTemplate || this.scrollToBottomButtonComponent);
112
- inputSlot = computed(() => this.inputTemplate || this.inputComponent);
113
- inputContainerSlot = computed(() => this.inputContainerTemplate || this.inputContainerComponent);
114
- featherSlot = computed(() => this.featherTemplate || this.featherComponent);
115
- disclaimerSlot = computed(() => this.disclaimerTemplate || this.disclaimerComponent);
116
- // Context objects for slots
117
- scrollViewContext = computed(() => ({
118
- autoScroll: this.autoScrollSignal(),
119
- scrollToBottomButton: this.scrollToBottomButtonSlot(),
120
- scrollToBottomButtonClass: this.scrollToBottomButtonClass,
121
- inputContainerHeight: this.inputContainerHeight(),
122
- isResizing: this.isResizing(),
123
- messages: this.messagesSignal(),
124
- messageView: this.messageViewSlot(),
125
- messageViewClass: this.messageViewClass
126
- }));
127
- // Removed scrollViewPropsComputed - no longer needed
128
- inputContainerContext = computed(() => ({
129
- input: this.inputSlot(),
130
- disclaimer: this.disclaimerSlot(),
131
- disclaimerText: this.disclaimerTextSignal(),
132
- disclaimerClass: this.disclaimerClassSignal(),
133
- inputContainerClass: this.inputContainerClass
134
- }));
135
- // Removed inputContainerPropsComputed - no longer needed
136
- // Layout context for custom templates (render prop pattern)
137
- layoutContext = computed(() => ({
138
- messageView: this.messageViewSlot(),
139
- input: this.inputSlot(),
140
- scrollView: this.scrollViewSlot(),
141
- scrollToBottomButton: this.scrollToBottomButtonSlot(),
142
- feather: this.featherSlot(),
143
- inputContainer: this.inputContainerSlot(),
144
- disclaimer: this.disclaimerSlot()
145
- }));
146
- destroy$ = new Subject();
147
- resizeTimeoutRef;
148
- constructor(resizeObserverService, cdr, handlers) {
149
- this.resizeObserverService = resizeObserverService;
150
- this.cdr = cdr;
151
- this.handlers = handlers;
152
- // Set up effect to handle resize state timeout
153
- effect(() => {
154
- const resizing = this.isResizing();
155
- if (resizing && this.resizeTimeoutRef) {
156
- clearTimeout(this.resizeTimeoutRef);
157
- this.resizeTimeoutRef = undefined;
158
- }
159
- });
160
- }
161
- ngOnInit() {
162
- // Initialize signals with input values
163
- this.messagesSignal.set(this.messages);
164
- this.autoScrollSignal.set(this.autoScroll);
165
- this.showCursorSignal.set(this.showCursor);
166
- this.disclaimerTextSignal.set(this.disclaimerText);
167
- this.disclaimerClassSignal.set(this.disclaimerClass);
168
- // Initialize handler availability in the view-scoped service
169
- this.handlers.hasAssistantThumbsUpHandler.set(this.assistantMessageThumbsUp.observed);
170
- this.handlers.hasAssistantThumbsDownHandler.set(this.assistantMessageThumbsDown.observed);
171
- this.handlers.hasAssistantReadAloudHandler.set(this.assistantMessageReadAloud.observed);
172
- this.handlers.hasAssistantRegenerateHandler.set(this.assistantMessageRegenerate.observed);
173
- this.handlers.hasUserCopyHandler.set(this.userMessageCopy.observed);
174
- this.handlers.hasUserEditHandler.set(this.userMessageEdit.observed);
175
- }
176
- ngOnChanges() {
177
- // Update signals when inputs change
178
- this.messagesSignal.set(this.messages);
179
- this.autoScrollSignal.set(this.autoScroll);
180
- this.showCursorSignal.set(this.showCursor);
181
- this.disclaimerTextSignal.set(this.disclaimerText);
182
- this.disclaimerClassSignal.set(this.disclaimerClass);
183
- // Keep handler availability in sync
184
- this.handlers.hasAssistantThumbsUpHandler.set(this.assistantMessageThumbsUp.observed);
185
- this.handlers.hasAssistantThumbsDownHandler.set(this.assistantMessageThumbsDown.observed);
186
- this.handlers.hasAssistantReadAloudHandler.set(this.assistantMessageReadAloud.observed);
187
- this.handlers.hasAssistantRegenerateHandler.set(this.assistantMessageRegenerate.observed);
188
- this.handlers.hasUserCopyHandler.set(this.userMessageCopy.observed);
189
- this.handlers.hasUserEditHandler.set(this.userMessageEdit.observed);
190
- }
191
- ngAfterViewInit() {
192
- // Don't set a default height - measure it dynamically
193
- // Set up input container height monitoring
194
- const measureAndObserve = () => {
195
- if (!this.inputContainerSlotRef || !this.inputContainerSlotRef.nativeElement) {
196
- return false;
197
- }
198
- // The slot ref points to the copilot-slot element
199
- // We need to find the actual input container component inside it
200
- const slotElement = this.inputContainerSlotRef.nativeElement;
201
- const componentElement = slotElement.querySelector('copilot-chat-view-input-container');
202
- if (!componentElement) {
203
- return false;
204
- }
205
- // Look for the absolute positioned div that contains the input
206
- let innerDiv = componentElement.querySelector('div.absolute');
207
- // If not found by class, try first child
208
- if (!innerDiv) {
209
- innerDiv = componentElement.firstElementChild;
210
- }
211
- if (!innerDiv) {
212
- return false;
213
- }
214
- // Measure the actual height
215
- const measuredHeight = innerDiv.offsetHeight;
216
- if (measuredHeight === 0) {
217
- return false;
218
- }
219
- // Success! Set the initial height
220
- this.inputContainerHeight.set(measuredHeight);
221
- this.cdr.detectChanges();
222
- // Create an ElementRef wrapper for ResizeObserver
223
- const innerDivRef = new ElementRef(innerDiv);
224
- // Set up ResizeObserver to track changes
225
- this.resizeObserverService.observeElement(innerDivRef, 0, 250)
226
- .pipe(takeUntil(this.destroy$))
227
- .subscribe(state => {
228
- const newHeight = state.height;
229
- if (newHeight !== this.inputContainerHeight() && newHeight > 0) {
230
- this.inputContainerHeight.set(newHeight);
231
- this.isResizing.set(true);
232
- this.cdr.detectChanges();
233
- // Clear existing timeout
234
- if (this.resizeTimeoutRef) {
235
- clearTimeout(this.resizeTimeoutRef);
236
- }
237
- // Set isResizing to false after a short delay
238
- this.resizeTimeoutRef = window.setTimeout(() => {
239
- this.isResizing.set(false);
240
- this.resizeTimeoutRef = undefined;
241
- this.cdr.detectChanges();
242
- }, 250);
243
- }
244
- });
245
- return true;
246
- };
247
- // Try to measure immediately
248
- if (!measureAndObserve()) {
249
- // If failed, retry with increasing delays
250
- let attempts = 0;
251
- const maxAttempts = 10;
252
- const retry = () => {
253
- attempts++;
254
- if (measureAndObserve()) {
255
- // Successfully measured
256
- }
257
- else if (attempts < maxAttempts) {
258
- // Exponential backoff: 50ms, 100ms, 200ms, 400ms, etc.
259
- const delay = 50 * Math.pow(2, Math.min(attempts - 1, 4));
260
- setTimeout(retry, delay);
261
- }
262
- else {
263
- // Failed to measure after max attempts
264
- }
265
- };
266
- // Start retry with first delay
267
- setTimeout(retry, 50);
268
- }
269
- }
270
- ngOnDestroy() {
271
- if (this.resizeTimeoutRef) {
272
- clearTimeout(this.resizeTimeoutRef);
273
- }
274
- this.destroy$.next();
275
- this.destroy$.complete();
276
- }
277
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatViewComponent, deps: [{ token: i1.ResizeObserverService }, { token: i0.ChangeDetectorRef }, { token: i2.CopilotChatViewHandlersService }], target: i0.ɵɵFactoryTarget.Component });
278
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: CopilotChatViewComponent, isStandalone: true, selector: "copilot-chat-view", inputs: { messages: "messages", autoScroll: "autoScroll", showCursor: "showCursor", messageViewComponent: "messageViewComponent", messageViewTemplate: "messageViewTemplate", messageViewClass: "messageViewClass", scrollViewComponent: "scrollViewComponent", scrollViewTemplate: "scrollViewTemplate", scrollViewClass: "scrollViewClass", scrollToBottomButtonComponent: "scrollToBottomButtonComponent", scrollToBottomButtonTemplate: "scrollToBottomButtonTemplate", scrollToBottomButtonClass: "scrollToBottomButtonClass", inputComponent: "inputComponent", inputTemplate: "inputTemplate", inputContainerComponent: "inputContainerComponent", inputContainerTemplate: "inputContainerTemplate", inputContainerClass: "inputContainerClass", featherComponent: "featherComponent", featherTemplate: "featherTemplate", featherClass: "featherClass", disclaimerComponent: "disclaimerComponent", disclaimerTemplate: "disclaimerTemplate", disclaimerClass: "disclaimerClass", disclaimerText: "disclaimerText" }, outputs: { assistantMessageThumbsUp: "assistantMessageThumbsUp", assistantMessageThumbsDown: "assistantMessageThumbsDown", assistantMessageReadAloud: "assistantMessageReadAloud", assistantMessageRegenerate: "assistantMessageRegenerate", userMessageCopy: "userMessageCopy", userMessageEdit: "userMessageEdit" }, providers: [ResizeObserverService, CopilotChatViewHandlersService], queries: [{ propertyName: "customLayoutTemplate", first: true, predicate: ["customLayout"], descendants: true }, { propertyName: "sendButtonTemplate", first: true, predicate: ["sendButton"], descendants: true }, { propertyName: "toolbarTemplate", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "textAreaTemplate", first: true, predicate: ["textArea"], descendants: true }, { propertyName: "audioRecorderTemplate", first: true, predicate: ["audioRecorder"], descendants: true }, { propertyName: "assistantMessageMarkdownRendererTemplate", first: true, predicate: ["assistantMessageMarkdownRenderer"], descendants: true }, { propertyName: "thumbsUpButtonTemplate", first: true, predicate: ["thumbsUpButton"], descendants: true }, { propertyName: "thumbsDownButtonTemplate", first: true, predicate: ["thumbsDownButton"], descendants: true }, { propertyName: "readAloudButtonTemplate", first: true, predicate: ["readAloudButton"], descendants: true }, { propertyName: "regenerateButtonTemplate", first: true, predicate: ["regenerateButton"], descendants: true }], viewQueries: [{ propertyName: "inputContainerSlotRef", first: true, predicate: ["inputContainerSlotRef"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: `
279
- <!-- Custom layout template support (render prop pattern) -->
280
- @if (customLayoutTemplate) {
281
- <ng-container *ngTemplateOutlet="customLayoutTemplate; context: layoutContext()"></ng-container>
282
- } @else {
283
- <!-- Default layout - exact React DOM structure -->
284
- <div [class]="computedClass()">
285
- <!-- ScrollView -->
286
- <copilot-chat-view-scroll-view
287
- [autoScroll]="autoScrollSignal()"
288
- [inputContainerHeight]="inputContainerHeight()"
289
- [isResizing]="isResizing()"
290
- [messages]="messagesSignal()"
291
- [messageView]="messageViewSlot()"
292
- [messageViewClass]="messageViewClass"
293
- [scrollToBottomButton]="scrollToBottomButtonSlot()"
294
- [scrollToBottomButtonClass]="scrollToBottomButtonClass"
295
- [showCursor]="showCursorSignal()"
296
- (assistantMessageThumbsUp)="assistantMessageThumbsUp.emit($event)"
297
- (assistantMessageThumbsDown)="assistantMessageThumbsDown.emit($event)"
298
- (assistantMessageReadAloud)="assistantMessageReadAloud.emit($event)"
299
- (assistantMessageRegenerate)="assistantMessageRegenerate.emit($event)"
300
- (userMessageCopy)="userMessageCopy.emit($event)"
301
- (userMessageEdit)="userMessageEdit.emit($event)">
302
- </copilot-chat-view-scroll-view>
303
-
304
- <!-- Feather effect -->
305
- <copilot-slot
306
- [slot]="featherSlot()"
307
- [context]="{ inputClass: featherClass }"
308
- [defaultComponent]="defaultFeatherComponent">
309
- </copilot-slot>
310
-
311
- <!-- Input container -->
312
- <copilot-slot
313
- #inputContainerSlotRef
314
- [slot]="inputContainerSlot()"
315
- [context]="inputContainerContext()"
316
- [defaultComponent]="defaultInputContainerComponent">
317
- </copilot-slot>
318
- </div>
319
- }
320
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CopilotSlotComponent, selector: "copilot-slot", inputs: ["slot", "context", "defaultComponent", "outputs"] }, { kind: "component", type: CopilotChatViewScrollViewComponent, selector: "copilot-chat-view-scroll-view", inputs: ["autoScroll", "inputContainerHeight", "isResizing", "inputClass", "messages", "messageView", "messageViewClass", "showCursor", "scrollToBottomButton", "scrollToBottomButtonClass"], outputs: ["assistantMessageThumbsUp", "assistantMessageThumbsDown", "assistantMessageReadAloud", "assistantMessageRegenerate", "userMessageCopy", "userMessageEdit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
321
- }
322
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CopilotChatViewComponent, decorators: [{
323
- type: Component,
324
- args: [{
325
- selector: 'copilot-chat-view',
326
- standalone: true,
327
- imports: [
328
- CommonModule,
329
- CopilotSlotComponent,
330
- CopilotChatMessageViewComponent,
331
- CopilotChatInputComponent,
332
- CopilotChatViewScrollViewComponent,
333
- CopilotChatViewScrollToBottomButtonComponent,
334
- CopilotChatViewFeatherComponent,
335
- CopilotChatViewInputContainerComponent,
336
- CopilotChatViewDisclaimerComponent
337
- ],
338
- changeDetection: ChangeDetectionStrategy.OnPush,
339
- encapsulation: ViewEncapsulation.None,
340
- providers: [ResizeObserverService, CopilotChatViewHandlersService],
341
- template: `
342
- <!-- Custom layout template support (render prop pattern) -->
343
- @if (customLayoutTemplate) {
344
- <ng-container *ngTemplateOutlet="customLayoutTemplate; context: layoutContext()"></ng-container>
345
- } @else {
346
- <!-- Default layout - exact React DOM structure -->
347
- <div [class]="computedClass()">
348
- <!-- ScrollView -->
349
- <copilot-chat-view-scroll-view
350
- [autoScroll]="autoScrollSignal()"
351
- [inputContainerHeight]="inputContainerHeight()"
352
- [isResizing]="isResizing()"
353
- [messages]="messagesSignal()"
354
- [messageView]="messageViewSlot()"
355
- [messageViewClass]="messageViewClass"
356
- [scrollToBottomButton]="scrollToBottomButtonSlot()"
357
- [scrollToBottomButtonClass]="scrollToBottomButtonClass"
358
- [showCursor]="showCursorSignal()"
359
- (assistantMessageThumbsUp)="assistantMessageThumbsUp.emit($event)"
360
- (assistantMessageThumbsDown)="assistantMessageThumbsDown.emit($event)"
361
- (assistantMessageReadAloud)="assistantMessageReadAloud.emit($event)"
362
- (assistantMessageRegenerate)="assistantMessageRegenerate.emit($event)"
363
- (userMessageCopy)="userMessageCopy.emit($event)"
364
- (userMessageEdit)="userMessageEdit.emit($event)">
365
- </copilot-chat-view-scroll-view>
366
-
367
- <!-- Feather effect -->
368
- <copilot-slot
369
- [slot]="featherSlot()"
370
- [context]="{ inputClass: featherClass }"
371
- [defaultComponent]="defaultFeatherComponent">
372
- </copilot-slot>
373
-
374
- <!-- Input container -->
375
- <copilot-slot
376
- #inputContainerSlotRef
377
- [slot]="inputContainerSlot()"
378
- [context]="inputContainerContext()"
379
- [defaultComponent]="defaultInputContainerComponent">
380
- </copilot-slot>
381
- </div>
382
- }
383
- `
384
- }]
385
- }], ctorParameters: () => [{ type: i1.ResizeObserverService }, { type: i0.ChangeDetectorRef }, { type: i2.CopilotChatViewHandlersService }], propDecorators: { messages: [{
386
- type: Input
387
- }], autoScroll: [{
388
- type: Input
389
- }], showCursor: [{
390
- type: Input
391
- }], messageViewComponent: [{
392
- type: Input
393
- }], messageViewTemplate: [{
394
- type: Input
395
- }], messageViewClass: [{
396
- type: Input
397
- }], scrollViewComponent: [{
398
- type: Input
399
- }], scrollViewTemplate: [{
400
- type: Input
401
- }], scrollViewClass: [{
402
- type: Input
403
- }], scrollToBottomButtonComponent: [{
404
- type: Input
405
- }], scrollToBottomButtonTemplate: [{
406
- type: Input
407
- }], scrollToBottomButtonClass: [{
408
- type: Input
409
- }], inputComponent: [{
410
- type: Input
411
- }], inputTemplate: [{
412
- type: Input
413
- }], inputContainerComponent: [{
414
- type: Input
415
- }], inputContainerTemplate: [{
416
- type: Input
417
- }], inputContainerClass: [{
418
- type: Input
419
- }], featherComponent: [{
420
- type: Input
421
- }], featherTemplate: [{
422
- type: Input
423
- }], featherClass: [{
424
- type: Input
425
- }], disclaimerComponent: [{
426
- type: Input
427
- }], disclaimerTemplate: [{
428
- type: Input
429
- }], disclaimerClass: [{
430
- type: Input
431
- }], disclaimerText: [{
432
- type: Input
433
- }], customLayoutTemplate: [{
434
- type: ContentChild,
435
- args: ['customLayout']
436
- }], sendButtonTemplate: [{
437
- type: ContentChild,
438
- args: ['sendButton']
439
- }], toolbarTemplate: [{
440
- type: ContentChild,
441
- args: ['toolbar']
442
- }], textAreaTemplate: [{
443
- type: ContentChild,
444
- args: ['textArea']
445
- }], audioRecorderTemplate: [{
446
- type: ContentChild,
447
- args: ['audioRecorder']
448
- }], assistantMessageMarkdownRendererTemplate: [{
449
- type: ContentChild,
450
- args: ['assistantMessageMarkdownRenderer']
451
- }], thumbsUpButtonTemplate: [{
452
- type: ContentChild,
453
- args: ['thumbsUpButton']
454
- }], thumbsDownButtonTemplate: [{
455
- type: ContentChild,
456
- args: ['thumbsDownButton']
457
- }], readAloudButtonTemplate: [{
458
- type: ContentChild,
459
- args: ['readAloudButton']
460
- }], regenerateButtonTemplate: [{
461
- type: ContentChild,
462
- args: ['regenerateButton']
463
- }], assistantMessageThumbsUp: [{
464
- type: Output
465
- }], assistantMessageThumbsDown: [{
466
- type: Output
467
- }], assistantMessageReadAloud: [{
468
- type: Output
469
- }], assistantMessageRegenerate: [{
470
- type: Output
471
- }], userMessageCopy: [{
472
- type: Output
473
- }], userMessageEdit: [{
474
- type: Output
475
- }], inputContainerSlotRef: [{
476
- type: ViewChild,
477
- args: ['inputContainerSlotRef', { read: ElementRef }]
478
- }] } });
479
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY2hhdC9jb3BpbG90LWNoYXQtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBR1osU0FBUyxFQUNULFVBQVUsRUFDVix1QkFBdUIsRUFFdkIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixRQUFRLEVBTVIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRixPQUFPLEVBQUUsNENBQTRDLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUNySCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN2RyxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU5RixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDL0UsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FB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ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDb250ZW50Q2hpbGQsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIEFmdGVyVmlld0luaXQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIGVmZmVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb3BpbG90U2xvdENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2xpYi9zbG90cy9jb3BpbG90LXNsb3QuY29tcG9uZW50JztcbmltcG9ydCB7IENvcGlsb3RDaGF0TWVzc2FnZVZpZXdDb21wb25lbnQgfSBmcm9tICcuL2NvcGlsb3QtY2hhdC1tZXNzYWdlLXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IENvcGlsb3RDaGF0SW5wdXRDb21wb25lbnQgfSBmcm9tICcuL2NvcGlsb3QtY2hhdC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3U2Nyb2xsVmlld0NvbXBvbmVudCB9IGZyb20gJy4vY29waWxvdC1jaGF0LXZpZXctc2Nyb2xsLXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IENvcGlsb3RDaGF0Vmlld1Njcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9jb3BpbG90LWNoYXQtdmlldy1zY3JvbGwtdG8tYm90dG9tLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3RmVhdGhlckNvbXBvbmVudCB9IGZyb20gJy4vY29waWxvdC1jaGF0LXZpZXctZmVhdGhlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3SW5wdXRDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL2NvcGlsb3QtY2hhdC12aWV3LWlucHV0LWNvbnRhaW5lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3RGlzY2xhaW1lckNvbXBvbmVudCB9IGZyb20gJy4vY29waWxvdC1jaGF0LXZpZXctZGlzY2xhaW1lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ0BhZy11aS9jbGllbnQnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuaW1wb3J0IHsgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzaXplLW9ic2VydmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29waWxvdENoYXRWaWV3SGFuZGxlcnNTZXJ2aWNlIH0gZnJvbSAnLi9jb3BpbG90LWNoYXQtdmlldy1oYW5kbGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqXG4gKiBDb3BpbG90Q2hhdFZpZXcgY29tcG9uZW50IC0gQW5ndWxhciBwb3J0IG9mIHRoZSBSZWFjdCBjb21wb25lbnQuXG4gKiBBIGNvbXBsZXRlIGNoYXQgaW50ZXJmYWNlIHdpdGggbWVzc2FnZSBmZWVkIGFuZCBpbnB1dCBjb21wb25lbnRzLlxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGNvcGlsb3QtY2hhdC12aWV3XG4gKiAgIFttZXNzYWdlc109XCJtZXNzYWdlc1wiXG4gKiAgIFthdXRvU2Nyb2xsXT1cInRydWVcIlxuICogICBbbWVzc2FnZVZpZXdQcm9wc109XCJ7IGFzc2lzdGFudE1lc3NhZ2U6IHsgb25UaHVtYnNVcDogaGFuZGxlVGh1bWJzVXAgfSB9XCI+XG4gKiA8L2NvcGlsb3QtY2hhdC12aWV3PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvcGlsb3QtY2hhdC12aWV3JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBDb3BpbG90U2xvdENvbXBvbmVudCxcbiAgICBDb3BpbG90Q2hhdE1lc3NhZ2VWaWV3Q29tcG9uZW50LFxuICAgIENvcGlsb3RDaGF0SW5wdXRDb21wb25lbnQsXG4gICAgQ29waWxvdENoYXRWaWV3U2Nyb2xsVmlld0NvbXBvbmVudCxcbiAgICBDb3BpbG90Q2hhdFZpZXdTY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudCxcbiAgICBDb3BpbG90Q2hhdFZpZXdGZWF0aGVyQ29tcG9uZW50LFxuICAgIENvcGlsb3RDaGF0Vmlld0lucHV0Q29udGFpbmVyQ29tcG9uZW50LFxuICAgIENvcGlsb3RDaGF0Vmlld0Rpc2NsYWltZXJDb21wb25lbnRcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHByb3ZpZGVyczogW1Jlc2l6ZU9ic2VydmVyU2VydmljZSwgQ29waWxvdENoYXRWaWV3SGFuZGxlcnNTZXJ2aWNlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIEN1c3RvbSBsYXlvdXQgdGVtcGxhdGUgc3VwcG9ydCAocmVuZGVyIHByb3AgcGF0dGVybikgLS0+XG4gICAgQGlmIChjdXN0b21MYXlvdXRUZW1wbGF0ZSkge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbUxheW91dFRlbXBsYXRlOyBjb250ZXh0OiBsYXlvdXRDb250ZXh0KClcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDwhLS0gRGVmYXVsdCBsYXlvdXQgLSBleGFjdCBSZWFjdCBET00gc3RydWN0dXJlIC0tPlxuICAgICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzcygpXCI+XG4gICAgICAgIDwhLS0gU2Nyb2xsVmlldyAtLT5cbiAgICAgICAgPGNvcGlsb3QtY2hhdC12aWV3LXNjcm9sbC12aWV3XG4gICAgICAgICAgW2F1dG9TY3JvbGxdPVwiYXV0b1Njcm9sbFNpZ25hbCgpXCJcbiAgICAgICAgICBbaW5wdXRDb250YWluZXJIZWlnaHRdPVwiaW5wdXRDb250YWluZXJIZWlnaHQoKVwiXG4gICAgICAgICAgW2lzUmVzaXppbmddPVwiaXNSZXNpemluZygpXCJcbiAgICAgICAgICBbbWVzc2FnZXNdPVwibWVzc2FnZXNTaWduYWwoKVwiXG4gICAgICAgICAgW21lc3NhZ2VWaWV3XT1cIm1lc3NhZ2VWaWV3U2xvdCgpXCJcbiAgICAgICAgICBbbWVzc2FnZVZpZXdDbGFzc109XCJtZXNzYWdlVmlld0NsYXNzXCJcbiAgICAgICAgICBbc2Nyb2xsVG9Cb3R0b21CdXR0b25dPVwic2Nyb2xsVG9Cb3R0b21CdXR0b25TbG90KClcIlxuICAgICAgICAgIFtzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzXT1cInNjcm9sbFRvQm90dG9tQnV0dG9uQ2xhc3NcIlxuICAgICAgICAgIFtzaG93Q3Vyc29yXT1cInNob3dDdXJzb3JTaWduYWwoKVwiXG4gICAgICAgICAgKGFzc2lzdGFudE1lc3NhZ2VUaHVtYnNVcCk9XCJhc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXAuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoYXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd24pPVwiYXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd24uZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAoYXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZCk9XCJhc3Npc3RhbnRNZXNzYWdlUmVhZEFsb3VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKGFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlKT1cImFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgKHVzZXJNZXNzYWdlQ29weSk9XCJ1c2VyTWVzc2FnZUNvcHkuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAodXNlck1lc3NhZ2VFZGl0KT1cInVzZXJNZXNzYWdlRWRpdC5lbWl0KCRldmVudClcIj5cbiAgICAgICAgPC9jb3BpbG90LWNoYXQtdmlldy1zY3JvbGwtdmlldz5cblxuICAgICAgICA8IS0tIEZlYXRoZXIgZWZmZWN0IC0tPlxuICAgICAgICA8Y29waWxvdC1zbG90XG4gICAgICAgICAgW3Nsb3RdPVwiZmVhdGhlclNsb3QoKVwiXG4gICAgICAgICAgW2NvbnRleHRdPVwieyBpbnB1dENsYXNzOiBmZWF0aGVyQ2xhc3MgfVwiXG4gICAgICAgICAgW2RlZmF1bHRDb21wb25lbnRdPVwiZGVmYXVsdEZlYXRoZXJDb21wb25lbnRcIj5cbiAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG5cbiAgICAgICAgPCEtLSBJbnB1dCBjb250YWluZXIgLS0+XG4gICAgICAgIDxjb3BpbG90LXNsb3RcbiAgICAgICAgICAjaW5wdXRDb250YWluZXJTbG90UmVmXG4gICAgICAgICAgW3Nsb3RdPVwiaW5wdXRDb250YWluZXJTbG90KClcIlxuICAgICAgICAgIFtjb250ZXh0XT1cImlucHV0Q29udGFpbmVyQ29udGV4dCgpXCJcbiAgICAgICAgICBbZGVmYXVsdENvbXBvbmVudF09XCJkZWZhdWx0SW5wdXRDb250YWluZXJDb21wb25lbnRcIj5cbiAgICAgICAgPC9jb3BpbG90LXNsb3Q+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQ29waWxvdENoYXRWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8vIENvcmUgaW5wdXRzIG1hdGNoaW5nIFJlYWN0IHByb3BzXG4gIEBJbnB1dCgpIG1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcbiAgQElucHV0KCkgYXV0b1Njcm9sbDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dDdXJzb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIE1lc3NhZ2VWaWV3IHNsb3QgaW5wdXRzXG4gIEBJbnB1dCgpIG1lc3NhZ2VWaWV3Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBASW5wdXQoKSBtZXNzYWdlVmlld1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgbWVzc2FnZVZpZXdDbGFzcz86IHN0cmluZztcbiAgXG4gIC8vIFNjcm9sbFZpZXcgc2xvdCBpbnB1dHNcbiAgQElucHV0KCkgc2Nyb2xsVmlld0NvbXBvbmVudD86IFR5cGU8YW55PjtcbiAgQElucHV0KCkgc2Nyb2xsVmlld1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgc2Nyb2xsVmlld0NsYXNzPzogc3RyaW5nO1xuICBcbiAgLy8gU2Nyb2xsVG9Cb3R0b21CdXR0b24gc2xvdCBpbnB1dHNcbiAgQElucHV0KCkgc2Nyb2xsVG9Cb3R0b21CdXR0b25Db21wb25lbnQ/OiBUeXBlPGFueT47XG4gIEBJbnB1dCgpIHNjcm9sbFRvQm90dG9tQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzPzogc3RyaW5nO1xuICBcbiAgLy8gSW5wdXQgc2xvdCBpbnB1dHNcbiAgQElucHV0KCkgaW5wdXRDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIEBJbnB1dCgpIGlucHV0VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBcbiAgLy8gSW5wdXRDb250YWluZXIgc2xvdCBpbnB1dHNcbiAgQElucHV0KCkgaW5wdXRDb250YWluZXJDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIEBJbnB1dCgpIGlucHV0Q29udGFpbmVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBpbnB1dENvbnRhaW5lckNsYXNzPzogc3RyaW5nO1xuICBcbiAgLy8gRmVhdGhlciBzbG90IGlucHV0c1xuICBASW5wdXQoKSBmZWF0aGVyQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBASW5wdXQoKSBmZWF0aGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBmZWF0aGVyQ2xhc3M/OiBzdHJpbmc7XG4gIFxuICAvLyBEaXNjbGFpbWVyIHNsb3QgaW5wdXRzXG4gIEBJbnB1dCgpIGRpc2NsYWltZXJDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIEBJbnB1dCgpIGRpc2NsYWltZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGRpc2NsYWltZXJDbGFzcz86IHN0cmluZztcbiAgQElucHV0KCkgZGlzY2xhaW1lclRleHQ/OiBzdHJpbmc7XG4gIFxuICAvLyBDdXN0b20gbGF5b3V0IHRlbXBsYXRlIChyZW5kZXIgcHJvcCBwYXR0ZXJuKVxuICBAQ29udGVudENoaWxkKCdjdXN0b21MYXlvdXQnKSBjdXN0b21MYXlvdXRUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIFxuICAvLyBOYW1lZCB0ZW1wbGF0ZSBzbG90cyBmb3IgZGVlcCBjdXN0b21pemF0aW9uXG4gIEBDb250ZW50Q2hpbGQoJ3NlbmRCdXR0b24nKSBzZW5kQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKCd0b29sYmFyJykgdG9vbGJhclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZCgndGV4dEFyZWEnKSB0ZXh0QXJlYVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQENvbnRlbnRDaGlsZCgnYXVkaW9SZWNvcmRlcicpIGF1ZGlvUmVjb3JkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ2Fzc2lzdGFudE1lc3NhZ2VNYXJrZG93blJlbmRlcmVyJykgYXNzaXN0YW50TWVzc2FnZU1hcmtkb3duUmVuZGVyZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ3RodW1ic1VwQnV0dG9uJykgdGh1bWJzVXBCdXR0b25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ3RodW1ic0Rvd25CdXR0b24nKSB0aHVtYnNEb3duQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAQ29udGVudENoaWxkKCdyZWFkQWxvdWRCdXR0b24nKSByZWFkQWxvdWRCdXR0b25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBDb250ZW50Q2hpbGQoJ3JlZ2VuZXJhdGVCdXR0b24nKSByZWdlbmVyYXRlQnV0dG9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBcbiAgLy8gT3V0cHV0IGV2ZW50cyBmb3IgYXNzaXN0YW50IG1lc3NhZ2UgYWN0aW9ucyAoYnViYmxlZCBmcm9tIGNoaWxkIGNvbXBvbmVudHMpXG4gIEBPdXRwdXQoKSBhc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXAgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbWVzc2FnZTogTWVzc2FnZSB9PigpO1xuICBAT3V0cHV0KCkgYXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd24gPSBuZXcgRXZlbnRFbWl0dGVyPHsgbWVzc2FnZTogTWVzc2FnZSB9PigpO1xuICBAT3V0cHV0KCkgYXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBNZXNzYWdlIH0+KCk7XG4gIEBPdXRwdXQoKSBhc3Npc3RhbnRNZXNzYWdlUmVnZW5lcmF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBNZXNzYWdlIH0+KCk7XG4gIFxuICAvLyBPdXRwdXQgZXZlbnRzIGZvciB1c2VyIG1lc3NhZ2UgYWN0aW9ucyAoaWYgYXBwbGljYWJsZSlcbiAgQE91dHB1dCgpIHVzZXJNZXNzYWdlQ29weSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBtZXNzYWdlOiBNZXNzYWdlIH0+KCk7XG4gIEBPdXRwdXQoKSB1c2VyTWVzc2FnZUVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbWVzc2FnZTogTWVzc2FnZSB9PigpO1xuICBcbiAgLy8gVmlld0NoaWxkIHJlZmVyZW5jZXNcbiAgQFZpZXdDaGlsZCgnaW5wdXRDb250YWluZXJTbG90UmVmJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGlucHV0Q29udGFpbmVyU2xvdFJlZj86IEVsZW1lbnRSZWY7XG4gIFxuICAvLyBEZWZhdWx0IGNvbXBvbmVudHMgZm9yIHNsb3RzXG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0U2Nyb2xsVmlld0NvbXBvbmVudCA9IENvcGlsb3RDaGF0Vmlld1Njcm9sbFZpZXdDb21wb25lbnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0U2Nyb2xsVG9Cb3R0b21CdXR0b25Db21wb25lbnQgPSBDb3BpbG90Q2hhdFZpZXdTY3JvbGxUb0JvdHRvbUJ1dHRvbkNvbXBvbmVudDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRJbnB1dENvbnRhaW5lckNvbXBvbmVudCA9IENvcGlsb3RDaGF0Vmlld0lucHV0Q29udGFpbmVyQ29tcG9uZW50O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdEZlYXRoZXJDb21wb25lbnQgPSBDb3BpbG90Q2hhdFZpZXdGZWF0aGVyQ29tcG9uZW50O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdERpc2NsYWltZXJDb21wb25lbnQgPSBDb3BpbG90Q2hhdFZpZXdEaXNjbGFpbWVyQ29tcG9uZW50O1xuICBcbiAgLy8gU2lnbmFscyBmb3IgcmVhY3RpdmUgc3RhdGVcbiAgcHJvdGVjdGVkIG1lc3NhZ2VzU2lnbmFsID0gc2lnbmFsPE1lc3NhZ2VbXT4oW10pO1xuICBwcm90ZWN0ZWQgYXV0b1Njcm9sbFNpZ25hbCA9IHNpZ25hbCh0cnVlKTtcbiAgcHJvdGVjdGVkIHNob3dDdXJzb3JTaWduYWwgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgZGlzY2xhaW1lclRleHRTaWduYWwgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgZGlzY2xhaW1lckNsYXNzU2lnbmFsID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGlucHV0Q29udGFpbmVySGVpZ2h0ID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByb3RlY3RlZCBpc1Jlc2l6aW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGNvbnRlbnRQYWRkaW5nQm90dG9tID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pbnB1dENvbnRhaW5lckhlaWdodCgpICsgMzIpO1xuICBcbiAgLy8gQ29tcHV0ZWQgc2lnbmFsc1xuICBwcm90ZWN0ZWQgY29tcHV0ZWRDbGFzcyA9IGNvbXB1dGVkKCgpID0+IGNuKCdyZWxhdGl2ZSBoLWZ1bGwnKSk7XG4gIFxuICAvLyBTbG90IHJlc29sdXRpb24gY29tcHV0ZWQgc2lnbmFsc1xuICBwcm90ZWN0ZWQgbWVzc2FnZVZpZXdTbG90ID0gY29tcHV0ZWQoKCkgPT4gXG4gICAgdGhpcy5tZXNzYWdlVmlld1RlbXBsYXRlIHx8IHRoaXMubWVzc2FnZVZpZXdDb21wb25lbnRcbiAgKTtcbiAgXG4gIHByb3RlY3RlZCBzY3JvbGxWaWV3U2xvdCA9IGNvbXB1dGVkKCgpID0+IFxuICAgIHRoaXMuc2Nyb2xsVmlld1RlbXBsYXRlIHx8IHRoaXMuc2Nyb2xsVmlld0NvbXBvbmVudFxuICApO1xuICBcbiAgcHJvdGVjdGVkIHNjcm9sbFRvQm90dG9tQnV0dG9uU2xvdCA9IGNvbXB1dGVkKCgpID0+IFxuICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b21CdXR0b25UZW1wbGF0ZSB8fCB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50XG4gICk7XG4gIFxuICBwcm90ZWN0ZWQgaW5wdXRTbG90ID0gY29tcHV0ZWQoKCkgPT4gXG4gICAgdGhpcy5pbnB1dFRlbXBsYXRlIHx8IHRoaXMuaW5wdXRDb21wb25lbnRcbiAgKTtcbiAgXG4gIHByb3RlY3RlZCBpbnB1dENvbnRhaW5lclNsb3QgPSBjb21wdXRlZCgoKSA9PiBcbiAgICB0aGlzLmlucHV0Q29udGFpbmVyVGVtcGxhdGUgfHwgdGhpcy5pbnB1dENvbnRhaW5lckNvbXBvbmVudFxuICApO1xuICBcbiAgcHJvdGVjdGVkIGZlYXRoZXJTbG90ID0gY29tcHV0ZWQoKCkgPT4gXG4gICAgdGhpcy5mZWF0aGVyVGVtcGxhdGUgfHwgdGhpcy5mZWF0aGVyQ29tcG9uZW50XG4gICk7XG4gIFxuICBwcm90ZWN0ZWQgZGlzY2xhaW1lclNsb3QgPSBjb21wdXRlZCgoKSA9PiBcbiAgICB0aGlzLmRpc2NsYWltZXJUZW1wbGF0ZSB8fCB0aGlzLmRpc2NsYWltZXJDb21wb25lbnRcbiAgKTtcbiAgXG4gIC8vIENvbnRleHQgb2JqZWN0cyBmb3Igc2xvdHNcbiAgcHJvdGVjdGVkIHNjcm9sbFZpZXdDb250ZXh0ID0gY29tcHV0ZWQoKCkgPT4gKHtcbiAgICBhdXRvU2Nyb2xsOiB0aGlzLmF1dG9TY3JvbGxTaWduYWwoKSxcbiAgICBzY3JvbGxUb0JvdHRvbUJ1dHRvbjogdGhpcy5zY3JvbGxUb0JvdHRvbUJ1dHRvblNsb3QoKSxcbiAgICBzY3JvbGxUb0JvdHRvbUJ1dHRvbkNsYXNzOiB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uQ2xhc3MsXG4gICAgaW5wdXRDb250YWluZXJIZWlnaHQ6IHRoaXMuaW5wdXRDb250YWluZXJIZWlnaHQoKSxcbiAgICBpc1Jlc2l6aW5nOiB0aGlzLmlzUmVzaXppbmcoKSxcbiAgICBtZXNzYWdlczogdGhpcy5tZXNzYWdlc1NpZ25hbCgpLFxuICAgIG1lc3NhZ2VWaWV3OiB0aGlzLm1lc3NhZ2VWaWV3U2xvdCgpLFxuICAgIG1lc3NhZ2VWaWV3Q2xhc3M6IHRoaXMubWVzc2FnZVZpZXdDbGFzc1xuICB9KSk7XG4gIFxuICAvLyBSZW1vdmVkIHNjcm9sbFZpZXdQcm9wc0NvbXB1dGVkIC0gbm8gbG9uZ2VyIG5lZWRlZFxuICBcbiAgcHJvdGVjdGVkIGlucHV0Q29udGFpbmVyQ29udGV4dCA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgaW5wdXQ6IHRoaXMuaW5wdXRTbG90KCksXG4gICAgZGlzY2xhaW1lcjogdGhpcy5kaXNjbGFpbWVyU2xvdCgpLFxuICAgIGRpc2NsYWltZXJUZXh0OiB0aGlzLmRpc2NsYWltZXJUZXh0U2lnbmFsKCksXG4gICAgZGlzY2xhaW1lckNsYXNzOiB0aGlzLmRpc2NsYWltZXJDbGFzc1NpZ25hbCgpLFxuICAgIGlucHV0Q29udGFpbmVyQ2xhc3M6IHRoaXMuaW5wdXRDb250YWluZXJDbGFzc1xuICB9KSk7XG4gIFxuICAvLyBSZW1vdmVkIGlucHV0Q29udGFpbmVyUHJvcHNDb21wdXRlZCAtIG5vIGxvbmdlciBuZWVkZWRcbiAgXG4gIC8vIExheW91dCBjb250ZXh0IGZvciBjdXN0b20gdGVtcGxhdGVzIChyZW5kZXIgcHJvcCBwYXR0ZXJuKVxuICBwcm90ZWN0ZWQgbGF5b3V0Q29udGV4dCA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgbWVzc2FnZVZpZXc6IHRoaXMubWVzc2FnZVZpZXdTbG90KCksXG4gICAgaW5wdXQ6IHRoaXMuaW5wdXRTbG90KCksXG4gICAgc2Nyb2xsVmlldzogdGhpcy5zY3JvbGxWaWV3U2xvdCgpLFxuICAgIHNjcm9sbFRvQm90dG9tQnV0dG9uOiB0aGlzLnNjcm9sbFRvQm90dG9tQnV0dG9uU2xvdCgpLFxuICAgIGZlYXRoZXI6IHRoaXMuZmVhdGhlclNsb3QoKSxcbiAgICBpbnB1dENvbnRhaW5lcjogdGhpcy5pbnB1dENvbnRhaW5lclNsb3QoKSxcbiAgICBkaXNjbGFpbWVyOiB0aGlzLmRpc2NsYWltZXJTbG90KClcbiAgfSkpO1xuICBcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVzaXplVGltZW91dFJlZj86IG51bWJlcjtcbiAgXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXJTZXJ2aWNlOiBSZXNpemVPYnNlcnZlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgaGFuZGxlcnM6IENvcGlsb3RDaGF0Vmlld0hhbmRsZXJzU2VydmljZVxuICApIHtcbiAgICAvLyBTZXQgdXAgZWZmZWN0IHRvIGhhbmRsZSByZXNpemUgc3RhdGUgdGltZW91dFxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCByZXNpemluZyA9IHRoaXMuaXNSZXNpemluZygpO1xuICAgICAgaWYgKHJlc2l6aW5nICYmIHRoaXMucmVzaXplVGltZW91dFJlZikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0UmVmKTtcbiAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0UmVmID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIFxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBJbml0aWFsaXplIHNpZ25hbHMgd2l0aCBpbnB1dCB2YWx1ZXNcbiAgICB0aGlzLm1lc3NhZ2VzU2lnbmFsLnNldCh0aGlzLm1lc3NhZ2VzKTtcbiAgICB0aGlzLmF1dG9TY3JvbGxTaWduYWwuc2V0KHRoaXMuYXV0b1Njcm9sbCk7XG4gICAgdGhpcy5zaG93Q3Vyc29yU2lnbmFsLnNldCh0aGlzLnNob3dDdXJzb3IpO1xuICAgIHRoaXMuZGlzY2xhaW1lclRleHRTaWduYWwuc2V0KHRoaXMuZGlzY2xhaW1lclRleHQpO1xuICAgIHRoaXMuZGlzY2xhaW1lckNsYXNzU2lnbmFsLnNldCh0aGlzLmRpc2NsYWltZXJDbGFzcyk7XG5cbiAgICAvLyBJbml0aWFsaXplIGhhbmRsZXIgYXZhaWxhYmlsaXR5IGluIHRoZSB2aWV3LXNjb3BlZCBzZXJ2aWNlXG4gICAgdGhpcy5oYW5kbGVycy5oYXNBc3Npc3RhbnRUaHVtYnNVcEhhbmRsZXIuc2V0KHRoaXMuYXNzaXN0YW50TWVzc2FnZVRodW1ic1VwLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFRodW1ic0Rvd25IYW5kbGVyLnNldCh0aGlzLmFzc2lzdGFudE1lc3NhZ2VUaHVtYnNEb3duLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFJlYWRBbG91ZEhhbmRsZXIuc2V0KHRoaXMuYXNzaXN0YW50TWVzc2FnZVJlYWRBbG91ZC5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYW5kbGVycy5oYXNBc3Npc3RhbnRSZWdlbmVyYXRlSGFuZGxlci5zZXQodGhpcy5hc3Npc3RhbnRNZXNzYWdlUmVnZW5lcmF0ZS5vYnNlcnZlZCk7XG4gICAgdGhpcy5oYW5kbGVycy5oYXNVc2VyQ29weUhhbmRsZXIuc2V0KHRoaXMudXNlck1lc3NhZ2VDb3B5Lm9ic2VydmVkKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc1VzZXJFZGl0SGFuZGxlci5zZXQodGhpcy51c2VyTWVzc2FnZUVkaXQub2JzZXJ2ZWQpO1xuICB9XG4gIFxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAvLyBVcGRhdGUgc2lnbmFscyB3aGVuIGlucHV0cyBjaGFuZ2VcbiAgICB0aGlzLm1lc3NhZ2VzU2lnbmFsLnNldCh0aGlzLm1lc3NhZ2VzKTtcbiAgICB0aGlzLmF1dG9TY3JvbGxTaWduYWwuc2V0KHRoaXMuYXV0b1Njcm9sbCk7XG4gICAgdGhpcy5zaG93Q3Vyc29yU2lnbmFsLnNldCh0aGlzLnNob3dDdXJzb3IpO1xuICAgIHRoaXMuZGlzY2xhaW1lclRleHRTaWduYWwuc2V0KHRoaXMuZGlzY2xhaW1lclRleHQpO1xuICAgIHRoaXMuZGlzY2xhaW1lckNsYXNzU2lnbmFsLnNldCh0aGlzLmRpc2NsYWltZXJDbGFzcyk7XG5cbiAgICAvLyBLZWVwIGhhbmRsZXIgYXZhaWxhYmlsaXR5IGluIHN5bmNcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFRodW1ic1VwSGFuZGxlci5zZXQodGhpcy5hc3Npc3RhbnRNZXNzYWdlVGh1bWJzVXAub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50VGh1bWJzRG93bkhhbmRsZXIuc2V0KHRoaXMuYXNzaXN0YW50TWVzc2FnZVRodW1ic0Rvd24ub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzQXNzaXN0YW50UmVhZEFsb3VkSGFuZGxlci5zZXQodGhpcy5hc3Npc3RhbnRNZXNzYWdlUmVhZEFsb3VkLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc0Fzc2lzdGFudFJlZ2VuZXJhdGVIYW5kbGVyLnNldCh0aGlzLmFzc2lzdGFudE1lc3NhZ2VSZWdlbmVyYXRlLm9ic2VydmVkKTtcbiAgICB0aGlzLmhhbmRsZXJzLmhhc1VzZXJDb3B5SGFuZGxlci5zZXQodGhpcy51c2VyTWVzc2FnZUNvcHkub2JzZXJ2ZWQpO1xuICAgIHRoaXMuaGFuZGxlcnMuaGFzVXNlckVkaXRIYW5kbGVyLnNldCh0aGlzLnVzZXJNZXNzYWdlRWRpdC5vYnNlcnZlZCk7XG4gIH1cbiAgXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBEb24ndCBzZXQgYSBkZWZhdWx0IGhlaWdodCAtIG1lYXN1cmUgaXQgZHluYW1pY2FsbHlcbiAgICBcbiAgICAvLyBTZXQgdXAgaW5wdXQgY29udGFpbmVyIGhlaWdodCBtb25pdG9yaW5nXG4gICAgY29uc3QgbWVhc3VyZUFuZE9ic2VydmUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaW5wdXRDb250YWluZXJTbG90UmVmIHx8ICF0aGlzLmlucHV0Q29udGFpbmVyU2xvdFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVGhlIHNsb3QgcmVmIHBvaW50cyB0byB0aGUgY29waWxvdC1zbG90IGVsZW1lbnRcbiAgICAgIC8vIFdlIG5lZWQgdG8gZmluZCB0aGUgYWN0dWFsIGlucHV0IGNvbnRhaW5lciBjb21wb25lbnQgaW5zaWRlIGl0XG4gICAgICBjb25zdCBzbG90RWxlbWVudCA9IHRoaXMuaW5wdXRDb250YWluZXJTbG90UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBjb21wb25lbnRFbGVtZW50ID0gc2xvdEVsZW1lbnQucXVlcnlTZWxlY3RvcignY29waWxvdC1jaGF0LXZpZXctaW5wdXQtY29udGFpbmVyJyk7XG4gICAgICBcbiAgICAgIGlmICghY29tcG9uZW50RWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIExvb2sgZm9yIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbmVkIGRpdiB0aGF0IGNvbnRhaW5zIHRoZSBpbnB1dFxuICAgICAgbGV0IGlubmVyRGl2ID0gY29tcG9uZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKCdkaXYuYWJzb2x1dGUnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIFxuICAgICAgLy8gSWYgbm90IGZvdW5kIGJ5IGNsYXNzLCB0cnkgZmlyc3QgY2hpbGRcbiAgICAgIGlmICghaW5uZXJEaXYpIHtcbiAgICAgICAgaW5uZXJEaXYgPSBjb21wb25lbnRFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoIWlubmVyRGl2KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTWVhc3VyZSB0aGUgYWN0dWFsIGhlaWdodFxuICAgICAgY29uc3QgbWVhc3VyZWRIZWlnaHQgPSBpbm5lckRpdi5vZmZzZXRIZWlnaHQ7XG4gICAgICBcbiAgICAgIGlmIChtZWFzdXJlZEhlaWdodCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFN1Y2Nlc3MhIFNldCB0aGUgaW5pdGlhbCBoZWlnaHRcbiAgICAgIHRoaXMuaW5wdXRDb250YWluZXJIZWlnaHQuc2V0KG1lYXN1cmVkSGVpZ2h0KTtcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGFuIEVsZW1lbnRSZWYgd3JhcHBlciBmb3IgUmVzaXplT2JzZXJ2ZXJcbiAgICAgIGNvbnN0IGlubmVyRGl2UmVmID0gbmV3IEVsZW1lbnRSZWYoaW5uZXJEaXYpO1xuICAgICAgXG4gICAgICAvLyBTZXQgdXAgUmVzaXplT2JzZXJ2ZXIgdG8gdHJhY2sgY2hhbmdlc1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlclNlcnZpY2Uub2JzZXJ2ZUVsZW1lbnQoaW5uZXJEaXZSZWYsIDAsIDI1MClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKHN0YXRlID0+IHtcbiAgICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSBzdGF0ZS5oZWlnaHQ7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKG5ld0hlaWdodCAhPT0gdGhpcy5pbnB1dENvbnRhaW5lckhlaWdodCgpICYmIG5ld0hlaWdodCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDb250YWluZXJIZWlnaHQuc2V0KG5ld0hlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmlzUmVzaXppbmcuc2V0KHRydWUpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDbGVhciBleGlzdGluZyB0aW1lb3V0XG4gICAgICAgICAgICBpZiAodGhpcy5yZXNpemVUaW1lb3V0UmVmKSB7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXRSZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTZXQgaXNSZXNpemluZyB0byBmYWxzZSBhZnRlciBhIHNob3J0IGRlbGF5XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXRSZWYgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaXNSZXNpemluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXRSZWYgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0sIDI1MCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBcbiAgICAvLyBUcnkgdG8gbWVhc3VyZSBpbW1lZGlhdGVseVxuICAgIGlmICghbWVhc3VyZUFuZE9ic2VydmUoKSkge1xuICAgICAgLy8gSWYgZmFpbGVkLCByZXRyeSB3aXRoIGluY3JlYXNpbmcgZGVsYXlzXG4gICAgICBsZXQgYXR0ZW1wdHMgPSAwO1xuICAgICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxMDtcbiAgICAgIFxuICAgICAgY29uc3QgcmV0cnkgPSAoKSA9PiB7XG4gICAgICAgIGF0dGVtcHRzKys7XG4gICAgICAgIGlmIChtZWFzdXJlQW5kT2JzZXJ2ZSgpKSB7XG4gICAgICAgICAgLy8gU3VjY2Vzc2Z1bGx5IG1lYXN1cmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXR0ZW1wdHMgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmY6IDUwbXMsIDEwMG1zLCAyMDBtcywgNDAwbXMsIGV0Yy5cbiAgICAgICAgICBjb25zdCBkZWxheSA9IDUwICogTWF0aC5wb3coMiwgTWF0aC5taW4oYXR0ZW1wdHMgLSAxLCA0KSk7XG4gICAgICAgICAgc2V0VGltZW91dChyZXRyeSwgZGVsYXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhaWxlZCB0byBtZWFzdXJlIGFmdGVyIG1heCBhdHRlbXB0c1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBTdGFydCByZXRyeSB3aXRoIGZpcnN0IGRlbGF5XG4gICAgICBzZXRUaW1lb3V0KHJldHJ5LCA1MCk7XG4gICAgfVxuICB9XG4gIFxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXNpemVUaW1lb3V0UmVmKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0UmVmKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29waWxvdC1jaGF0LXZpZXcudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9jaGF0L2NvcGlsb3QtY2hhdC12aWV3LnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ0BhZy11aS9jbGllbnQnO1xuXG4vKipcbiAqIFByb3BzIGZvciBDb3BpbG90Q2hhdFZpZXcgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29waWxvdENoYXRWaWV3UHJvcHMge1xuICBtZXNzYWdlcz86IE1lc3NhZ2VbXTtcbiAgYXV0b1Njcm9sbD86IGJvb2xlYW47XG4gIFxuICAvLyBTbG90IGNvbmZpZ3VyYXRpb25zXG4gIG1lc3NhZ2VWaWV3Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBtZXNzYWdlVmlld1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgbWVzc2FnZVZpZXdDbGFzcz86IHN0cmluZztcbiAgXG4gIHNjcm9sbFZpZXdDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIHNjcm9sbFZpZXdUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIHNjcm9sbFZpZXdDbGFzcz86IHN0cmluZztcbiAgXG4gIHNjcm9sbFRvQm90dG9tQnV0dG9uQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBzY3JvbGxUb0JvdHRvbUJ1dHRvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgc2Nyb2xsVG9Cb3R0b21CdXR0b25DbGFzcz86IHN0cmluZztcbiAgXG4gIGlucHV0Q29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBpbnB1dFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgXG4gIGlucHV0Q29udGFpbmVyQ29tcG9uZW50PzogVHlwZTxhbnk+O1xuICBpbnB1dENvbnRhaW5lclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgaW5wdXRDb250YWluZXJDbGFzcz86IHN0cmluZztcbiAgXG4gIGZlYXRoZXJDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIGZlYXRoZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIGZlYXRoZXJDbGFzcz86IHN0cmluZztcbiAgXG4gIGRpc2NsYWltZXJDb21wb25lbnQ/OiBUeXBlPGFueT47XG4gIGRpc2NsYWltZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIGRpc2NsYWltZXJDbGFzcz86IHN0cmluZztcbiAgZGlzY2xhaW1lclRleHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udGV4dCBmb3IgY3VzdG9tIGxheW91dCB0ZW1wbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcGlsb3RDaGF0Vmlld0xheW91dENvbnRleHQge1xuICBtZXNzYWdlVmlldzogYW55O1xuICBpbnB1dDogYW55O1xuICBzY3JvbGxWaWV3OiBhbnk7XG4gIHNjcm9sbFRvQm90dG9tQnV0dG9uOiBhbnk7XG4gIGZlYXRoZXI6IGFueTtcbiAgaW5wdXRDb250YWluZXI6IGFueTtcbiAgZGlzY2xhaW1lcjogYW55O1xufVxuIl19