@memberjunction/ng-conversations 6.2.0-edge.0 → 6.2.0-edge.1

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 (343) hide show
  1. package/README.md +35 -2
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
  5. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  6. package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
  7. package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
  8. package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
  9. package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
  10. package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
  11. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
  12. package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
  13. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
  14. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
  15. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
  16. package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
  17. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  18. package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
  19. package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
  20. package/dist/lib/components/attachment/image-viewer.component.js +181 -47
  21. package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
  22. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
  23. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  24. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
  25. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  26. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
  27. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  28. package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
  29. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  30. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
  31. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  32. package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
  33. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  34. package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
  35. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  36. package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
  37. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  38. package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
  39. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  40. package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
  41. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  42. package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
  43. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  44. package/dist/lib/components/collection/collection-tree.component.js +220 -70
  45. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  46. package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
  47. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  48. package/dist/lib/components/collection/collection-view.component.js +154 -40
  49. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  50. package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
  51. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  52. package/dist/lib/components/collection/collections-full-view.component.js +951 -367
  53. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  54. package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
  55. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
  56. package/dist/lib/components/composer/ai-composer.component.js +388 -44
  57. package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
  58. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
  59. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
  60. package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
  61. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  62. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1090 -123
  63. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  64. package/dist/lib/components/conversation/conversation-chat-area.component.js +2399 -706
  65. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  66. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
  67. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
  68. package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
  69. package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
  70. package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
  71. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  72. package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
  73. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  74. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +40 -4
  75. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
  76. package/dist/lib/components/conversation/pinned-messages-panel.component.js +72 -14
  77. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  78. package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
  79. package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
  80. package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
  81. package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
  82. package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
  83. package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
  84. package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
  85. package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
  86. package/dist/lib/components/export/export-modal.component.d.ts +84 -10
  87. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
  88. package/dist/lib/components/export/export-modal.component.js +173 -49
  89. package/dist/lib/components/export/export-modal.component.js.map +1 -1
  90. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
  91. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
  92. package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
  93. package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
  94. package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
  95. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  96. package/dist/lib/components/library/library-full-view.component.js +119 -35
  97. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  98. package/dist/lib/components/members/members-modal.component.d.ts +76 -10
  99. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  100. package/dist/lib/components/members/members-modal.component.js +164 -50
  101. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  102. package/dist/lib/components/message/actionable-commands.component.d.ts +37 -5
  103. package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
  104. package/dist/lib/components/message/actionable-commands.component.js +82 -16
  105. package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
  106. package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
  107. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  108. package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
  109. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  110. package/dist/lib/components/message/message-input.component.d.ts +549 -74
  111. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  112. package/dist/lib/components/message/message-input.component.js +1250 -421
  113. package/dist/lib/components/message/message-input.component.js.map +1 -1
  114. package/dist/lib/components/message/message-item.component.d.ts +411 -29
  115. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  116. package/dist/lib/components/message/message-item.component.js +896 -222
  117. package/dist/lib/components/message/message-item.component.js.map +1 -1
  118. package/dist/lib/components/message/message-list.component.d.ts +288 -29
  119. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  120. package/dist/lib/components/message/message-list.component.js +561 -123
  121. package/dist/lib/components/message/message-list.component.js.map +1 -1
  122. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
  123. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
  124. package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
  125. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
  126. package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
  127. package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
  128. package/dist/lib/components/notification/activity-indicator.component.js +13 -3
  129. package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
  130. package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
  131. package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
  132. package/dist/lib/components/notification/notification-badge.component.js +36 -8
  133. package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
  134. package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
  135. package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
  136. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  137. package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
  138. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  139. package/dist/lib/components/project/project-form-modal.component.js +348 -87
  140. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  141. package/dist/lib/components/project/project-selector.component.d.ts +78 -8
  142. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  143. package/dist/lib/components/project/project-selector.component.js +177 -46
  144. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  145. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +1 -1
  146. package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
  147. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  148. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +1 -1
  149. package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
  150. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  151. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +2 -2
  152. package/dist/lib/components/realtime/realtime-session-overlay.component.js +18 -18
  153. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  154. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -23
  155. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
  156. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +136 -92
  157. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
  158. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +2 -2
  159. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
  160. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  161. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +1 -1
  162. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
  163. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  164. package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
  165. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  166. package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
  167. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  168. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +3 -1
  169. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  170. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +6 -2
  171. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  172. package/dist/lib/components/search/search-panel.component.d.ts +133 -22
  173. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  174. package/dist/lib/components/search/search-panel.component.js +312 -83
  175. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  176. package/dist/lib/components/share/share-modal.component.d.ts +69 -9
  177. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  178. package/dist/lib/components/share/share-modal.component.js +139 -31
  179. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  180. package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
  181. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  182. package/dist/lib/components/shared/user-picker.component.js +110 -30
  183. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  184. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
  185. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
  186. package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
  187. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
  188. package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
  189. package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
  190. package/dist/lib/components/sidebar/routines-section.component.js +25 -5
  191. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  192. package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
  193. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
  194. package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
  195. package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
  196. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  197. package/dist/lib/components/task/tasks-full-view.component.js +223 -75
  198. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  199. package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
  200. package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
  201. package/dist/lib/components/tasks/task-widget.component.js +100 -16
  202. package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
  203. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
  204. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  205. package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
  206. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  207. package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
  208. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  209. package/dist/lib/components/thread/thread-panel.component.js +146 -36
  210. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  211. package/dist/lib/components/toast/toast.component.d.ts +11 -1
  212. package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
  213. package/dist/lib/components/toast/toast.component.js +25 -5
  214. package/dist/lib/components/toast/toast.component.js.map +1 -1
  215. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
  216. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  217. package/dist/lib/components/workspace/conversation-workspace.component.js +887 -291
  218. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  219. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
  220. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
  221. package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
  222. package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
  223. package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
  224. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
  225. package/dist/lib/directives/chat-slot.directive.js.map +1 -1
  226. package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
  227. package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
  228. package/dist/lib/directives/search-shortcut.directive.js +14 -4
  229. package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
  230. package/dist/lib/events/chat-events.d.ts +34 -7
  231. package/dist/lib/events/chat-events.d.ts.map +1 -1
  232. package/dist/lib/events/chat-events.js +37 -7
  233. package/dist/lib/events/chat-events.js.map +1 -1
  234. package/dist/lib/models/agent-turn.model.d.ts +103 -0
  235. package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
  236. package/dist/lib/models/agent-turn.model.js +12 -0
  237. package/dist/lib/models/agent-turn.model.js.map +1 -0
  238. package/dist/lib/models/collection-view.model.js.map +1 -1
  239. package/dist/lib/models/conversation-state.model.d.ts +8 -0
  240. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  241. package/dist/lib/models/conversation-state.model.js.map +1 -1
  242. package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
  243. package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
  244. package/dist/lib/models/lazy-artifact-info.js +98 -34
  245. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  246. package/dist/lib/services/active-tasks.service.d.ts +30 -4
  247. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  248. package/dist/lib/services/active-tasks.service.js +71 -19
  249. package/dist/lib/services/active-tasks.service.js.map +1 -1
  250. package/dist/lib/services/agent-state.service.d.ts +17 -1
  251. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  252. package/dist/lib/services/agent-state.service.js +48 -16
  253. package/dist/lib/services/agent-state.service.js.map +1 -1
  254. package/dist/lib/services/artifact-permission.service.d.ts +39 -0
  255. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  256. package/dist/lib/services/artifact-permission.service.js +152 -17
  257. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  258. package/dist/lib/services/artifact-state.service.d.ts +58 -5
  259. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  260. package/dist/lib/services/artifact-state.service.js +135 -35
  261. package/dist/lib/services/artifact-state.service.js.map +1 -1
  262. package/dist/lib/services/collection-permission.service.d.ts +28 -0
  263. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  264. package/dist/lib/services/collection-permission.service.js +88 -32
  265. package/dist/lib/services/collection-permission.service.js.map +1 -1
  266. package/dist/lib/services/collection-state.service.d.ts +11 -1
  267. package/dist/lib/services/collection-state.service.d.ts.map +1 -1
  268. package/dist/lib/services/collection-state.service.js +25 -5
  269. package/dist/lib/services/collection-state.service.js.map +1 -1
  270. package/dist/lib/services/conversation-agent.service.d.ts +26 -4
  271. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  272. package/dist/lib/services/conversation-agent.service.js +57 -18
  273. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  274. package/dist/lib/services/conversation-attachment.service.d.ts +17 -0
  275. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  276. package/dist/lib/services/conversation-attachment.service.js +38 -10
  277. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  278. package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
  279. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  280. package/dist/lib/services/conversation-streaming.service.js +50 -10
  281. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  282. package/dist/lib/services/data-cache.service.d.ts +31 -0
  283. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  284. package/dist/lib/services/data-cache.service.js +71 -15
  285. package/dist/lib/services/data-cache.service.js.map +1 -1
  286. package/dist/lib/services/dialog.service.d.ts +13 -0
  287. package/dist/lib/services/dialog.service.d.ts.map +1 -1
  288. package/dist/lib/services/dialog.service.js +25 -5
  289. package/dist/lib/services/dialog.service.js.map +1 -1
  290. package/dist/lib/services/export.service.d.ts +2 -0
  291. package/dist/lib/services/export.service.d.ts.map +1 -1
  292. package/dist/lib/services/export.service.js +5 -1
  293. package/dist/lib/services/export.service.js.map +1 -1
  294. package/dist/lib/services/mention-parser.service.d.ts +10 -0
  295. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  296. package/dist/lib/services/mention-parser.service.js +25 -5
  297. package/dist/lib/services/mention-parser.service.js.map +1 -1
  298. package/dist/lib/services/notification.service.d.ts +54 -6
  299. package/dist/lib/services/notification.service.d.ts.map +1 -1
  300. package/dist/lib/services/notification.service.js +123 -27
  301. package/dist/lib/services/notification.service.js.map +1 -1
  302. package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
  303. package/dist/lib/services/realtime-audio-recorder.js +12 -12
  304. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  305. package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
  306. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
  307. package/dist/lib/services/realtime-pcm-wav.js +10 -2
  308. package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
  309. package/dist/lib/services/search.service.d.ts +42 -9
  310. package/dist/lib/services/search.service.d.ts.map +1 -1
  311. package/dist/lib/services/search.service.js +103 -23
  312. package/dist/lib/services/search.service.js.map +1 -1
  313. package/dist/lib/services/toast.service.d.ts +19 -1
  314. package/dist/lib/services/toast.service.d.ts.map +1 -1
  315. package/dist/lib/services/toast.service.js +45 -9
  316. package/dist/lib/services/toast.service.js.map +1 -1
  317. package/dist/lib/services/ui-command-handler.service.d.ts +16 -2
  318. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  319. package/dist/lib/services/ui-command-handler.service.js +36 -8
  320. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  321. package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
  322. package/dist/lib/utils/agent-artifact-summary.js +3 -3
  323. package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
  324. package/dist/lib/utils/agent-turn-routing.d.ts +69 -0
  325. package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
  326. package/dist/lib/utils/agent-turn-routing.js +96 -0
  327. package/dist/lib/utils/agent-turn-routing.js.map +1 -0
  328. package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
  329. package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
  330. package/dist/lib/utils/artifact-panel-action.js +10 -2
  331. package/dist/lib/utils/artifact-panel-action.js.map +1 -1
  332. package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
  333. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  334. package/dist/lib/utils/distinct-artifacts.js +5 -1
  335. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  336. package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
  337. package/dist/lib/utils/plan-mode-preference.js +6 -6
  338. package/dist/lib/utils/plan-mode-preference.js.map +1 -1
  339. package/dist/public-api.d.ts +3 -0
  340. package/dist/public-api.d.ts.map +1 -1
  341. package/dist/public-api.js +3 -0
  342. package/dist/public-api.js.map +1 -1
  343. package/package.json +32 -32
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-list.component.js","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-list.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, HostListener, ChangeDetectorRef } from '@angular/core';\nimport { UserInfo } from '@memberjunction/core';\nimport { MJConversationEntity, MJProjectEntity, ConversationEngine, UserInfoEngine } from '@memberjunction/core-entities';\nimport { MJDialogService } from '@memberjunction/ng-ui-components';\nimport { DialogService } from '../../services/dialog.service';\nimport { NotificationService } from '../../services/notification.service';\nimport { ActiveTasksService } from '../../services/active-tasks.service';\nimport { ProjectFormModalComponent } from '../project/project-form-modal.component';\nimport { ConversationGroupBy } from '../../models/conversation-state.model';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * A node in the conversation folder tree. Each node holds its project (folder),\n * the conversations directly assigned to it, and its nested child folders.\n */\ninterface FolderNode {\n project: MJProjectEntity;\n depth: number;\n /** Conversations directly in this folder (unpinned only — pinned live in the Pinned section). */\n conversations: MJConversationEntity[];\n children: FolderNode[];\n /** Total conversations in this folder and all descendants. */\n totalCount: number;\n /** True when this folder or any descendant has at least one (filtered) conversation. */\n hasContent: boolean;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-conversation-list',\n template: `\n <div class=\"conversation-list\">\n <!-- Header strip gated as a whole so an empty bordered band never renders:\n the ⋯ menu also hides during selection mode, so it only counts toward\n the strip when actually visible. -->\n @if (showSearch || (showHeaderMenu && !isSelectionMode)) {\n <div class=\"list-header\">\n <div class=\"header-top\">\n @if (showSearch) {\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations...\"\n [(ngModel)]=\"searchQuery\">\n }\n @if (showHeaderMenu && !isSelectionMode) {\n <div class=\"header-menu-container\">\n <button class=\"btn-menu\" (click)=\"toggleHeaderMenu($event)\" title=\"Options\">\n <i class=\"fas fa-ellipsis-v\"></i>\n </button>\n @if (isHeaderMenuOpen) {\n <div class=\"header-dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"onRefreshConversationsClick($event)\" [disabled]=\"isRefreshing\">\n <i class=\"fas fa-sync-alt\" [class.fa-spin]=\"isRefreshing\"></i>\n <span>{{ isRefreshing ? 'Refreshing...' : 'Refresh' }}</span>\n </button>\n <button class=\"dropdown-item\" (click)=\"onSelectConversationsClick($event)\">\n <i class=\"fas fa-check-square\"></i>\n <span>Select Conversations</span>\n </button>\n <button class=\"dropdown-item\" (click)=\"onToggleGroupByClick($event)\">\n <i class=\"fas\" [class.fa-folder-tree]=\"groupBy !== 'project'\" [class.fa-list]=\"groupBy === 'project'\"></i>\n <span>{{ groupBy === 'project' ? 'Show as flat list' : 'Group by folder' }}</span>\n </button>\n @if (!isMobileView) {\n <button class=\"dropdown-item\" (click)=\"onUnpinSidebarClick($event)\">\n <i class=\"fas fa-table-columns\"></i>\n <span>Hide Sidebar</span>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n @if (showNewConversationButton) {\n <button class=\"btn-new-conversation\" (click)=\"createNewConversation()\" title=\"New Conversation\">\n <i class=\"fas fa-plus\"></i>\n <span>New Conversation</span>\n </button>\n }\n <div class=\"list-content\">\n <!-- Pinned Section (only show if there are pinned conversations) -->\n @if (pinnedConversations.length > 0) {\n <div class=\"sidebar-section pinned-section\">\n @if (showSectionHeaders) {\n <div class=\"section-header\" [class.expanded]=\"pinnedExpanded\" (click)=\"togglePinned()\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <i class=\"fas fa-thumbtack section-icon\"></i>\n <span>Pinned</span>\n </div>\n </div>\n }\n <div class=\"chat-list\" [class.expanded]=\"!showSectionHeaders || pinnedExpanded\">\n @for (conversation of pinnedConversations; track conversation.ID) {\n <ng-container [ngTemplateOutlet]=\"conversationItem\" [ngTemplateOutletContext]=\"{ $implicit: conversation }\"></ng-container>\n }\n </div>\n </div>\n }\n\n <!-- showSectionHeaders=false forces the FLAT branch even in project\n grouping: the folder tree's root drop-zone and New Folder action\n live in the section header, so rendering the tree without headers\n would let a user drag a folder INTO another folder with no way to\n ever drag it back out (a one-way door). Flat + headerless is the\n coherent chrome-less rendering. -->\n @if (showSectionHeaders && groupBy === 'project') {\n <!-- Folders Section. NOTE: this whole branch is already gated on\n showSectionHeaders above, so the header + collapse state here are\n unconditional — a headerless folder tree never renders. -->\n <div class=\"sidebar-section folders-section\">\n <div class=\"section-header\" [class.expanded]=\"foldersExpanded\"\n [class.drag-over]=\"dragOverTargetId === 'folders-root'\"\n (click)=\"toggleFolders()\"\n (dragover)=\"onFoldersRootDragOver($event)\"\n (dragleave)=\"onDragLeave('folders-root')\"\n (drop)=\"onFoldersRootDrop($event)\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <span>Folders</span>\n </div>\n <button class=\"section-action-btn\" (click)=\"createFolder(null, $event)\" title=\"New Folder\">\n <i class=\"fas fa-folder-plus\"></i>\n </button>\n </div>\n <div class=\"chat-list\" [class.expanded]=\"foldersExpanded\">\n @for (node of folderTree; track node.project.ID) {\n @if (!isSearching || node.hasContent) {\n <ng-container [ngTemplateOutlet]=\"folderNode\" [ngTemplateOutletContext]=\"{ $implicit: node }\"></ng-container>\n }\n }\n @if (folderTree.length === 0) {\n <div class=\"folder-empty-hint\">No folders yet — create one to organize conversations.</div>\n }\n </div>\n </div>\n\n <!-- Ungrouped Section (drop target to remove from folder) -->\n <div class=\"sidebar-section ungrouped-section\"\n [class.drag-over]=\"dragOverTargetId === 'ungrouped'\"\n (dragover)=\"onUngroupedDragOver($event)\"\n (dragleave)=\"onDragLeave('ungrouped')\"\n (drop)=\"onUngroupedDrop($event)\">\n <!-- Same as Folders above: reached only when showSectionHeaders is true. -->\n <div class=\"section-header\" [class.expanded]=\"ungroupedExpanded\" (click)=\"toggleUngrouped()\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <span>{{ folderTree.length > 0 ? 'Ungrouped' : 'Messages' }}</span>\n </div>\n </div>\n <div class=\"chat-list\" [class.expanded]=\"ungroupedExpanded\">\n @for (conversation of ungroupedConversations; track conversation.ID) {\n <ng-container [ngTemplateOutlet]=\"conversationItem\" [ngTemplateOutletContext]=\"{ $implicit: conversation }\"></ng-container>\n }\n </div>\n </div>\n } @else {\n <!-- Flat Messages Section -->\n <div class=\"sidebar-section\">\n @if (showSectionHeaders) {\n <div class=\"section-header\" [class.expanded]=\"directMessagesExpanded\" (click)=\"toggleDirectMessages()\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <span>Messages</span>\n </div>\n </div>\n }\n <div class=\"chat-list\" [class.expanded]=\"!showSectionHeaders || directMessagesExpanded\">\n @for (conversation of unpinnedConversations; track conversation.ID) {\n <ng-container [ngTemplateOutlet]=\"conversationItem\" [ngTemplateOutletContext]=\"{ $implicit: conversation }\"></ng-container>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Selection Action Bar -->\n @if (isSelectionMode) {\n <div class=\"selection-action-bar\">\n <div class=\"selection-info\">\n <span class=\"selection-count\">{{ selectedConversationIds.size }} selected</span>\n @if (selectedConversationIds.size < filteredConversations.length) {\n <button class=\"link-btn\" (click)=\"selectAll()\">Select All</button>\n } @else {\n <button class=\"link-btn\" (click)=\"deselectAll()\">Deselect All</button>\n }\n </div>\n <div class=\"selection-actions\">\n <button class=\"btn-delete-bulk\"\n (click)=\"bulkDeleteConversations()\"\n [disabled]=\"selectedConversationIds.size === 0\">\n <i class=\"fas fa-trash\"></i>\n Delete ({{ selectedConversationIds.size }})\n </button>\n <button class=\"btn-cancel\" (click)=\"toggleSelectionMode()\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Recursive folder node: header + nested children + direct conversations -->\n <ng-template #folderNode let-node>\n <div class=\"folder-row\"\n [class.drag-over]=\"dragOverTargetId === node.project.ID\"\n [class.dragging]=\"draggedFolderId === node.project.ID\"\n [style.paddingLeft.px]=\"12 + node.depth * 14\"\n [draggable]=\"true\"\n (dragstart)=\"onFolderDragStart(node, $event)\"\n (dragend)=\"onFolderDragEnd()\"\n (click)=\"toggleFolder(node.project.ID)\"\n (dragover)=\"onFolderDragOver(node.project.ID, $event)\"\n (dragleave)=\"onDragLeave(node.project.ID)\"\n (drop)=\"onFolderDrop(node.project, $event)\"\n [title]=\"node.project.Name\">\n <i class=\"fas fa-chevron-right folder-chevron\" [class.expanded]=\"isFolderExpanded(node.project.ID)\"></i>\n <i class=\"fas {{ node.project.Icon || 'fa-folder' }} folder-icon\" [style.color]=\"node.project.Color || null\"></i>\n <span class=\"folder-name\">{{ node.project.Name }}</span>\n <span class=\"folder-count\">{{ node.totalCount }}</span>\n <div class=\"folder-actions\" (click)=\"$event.stopPropagation()\">\n <button class=\"folder-action-btn\" (click)=\"createFolder(node.project.ID, $event)\" title=\"New Subfolder\">\n <i class=\"fas fa-folder-plus\"></i>\n </button>\n <button class=\"folder-action-btn\" (click)=\"editFolder(node.project, $event)\" title=\"Edit Folder\">\n <i class=\"fas fa-pen\"></i>\n </button>\n <button class=\"folder-action-btn danger\" (click)=\"deleteFolder(node.project, $event)\" title=\"Delete Folder\">\n <i class=\"fas fa-trash\"></i>\n </button>\n </div>\n </div>\n @if (isFolderExpanded(node.project.ID)) {\n <div class=\"folder-children\">\n @for (child of node.children; track child.project.ID) {\n @if (!isSearching || child.hasContent) {\n <ng-container [ngTemplateOutlet]=\"folderNode\" [ngTemplateOutletContext]=\"{ $implicit: child }\"></ng-container>\n }\n }\n @for (conversation of node.conversations; track conversation.ID) {\n <ng-container [ngTemplateOutlet]=\"conversationItem\" [ngTemplateOutletContext]=\"{ $implicit: conversation, depth: node.depth + 1 }\"></ng-container>\n }\n @if (node.totalCount === 0 && !isSearching) {\n <div class=\"folder-empty-hint\" [style.paddingLeft.px]=\"26 + node.depth * 14\">Empty — drop a conversation here</div>\n }\n </div>\n }\n </ng-template>\n\n <!-- Shared conversation row used by Pinned, folders, and Ungrouped/Messages -->\n <ng-template #conversationItem let-conversation let-depth=\"depth\">\n <div class=\"conversation-item\"\n [class.active]=\"IsConversationActive(conversation)\"\n [class.renamed]=\"IsConversationRenamed(conversation)\"\n [class.dragging]=\"IsConversationDragging(conversation)\"\n [style.paddingLeft.px]=\"depth ? 16 + depth * 14 : 16\"\n [draggable]=\"!isSelectionMode\"\n (dragstart)=\"onConversationDragStart(conversation, $event)\"\n (dragend)=\"onConversationDragEnd()\"\n (click)=\"handleConversationClick(conversation)\">\n @if (isSelectionMode) {\n <div class=\"conversation-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"selectedConversationIds.has(conversation.ID)\"\n (click)=\"$event.stopPropagation(); toggleConversationSelection(conversation.ID)\">\n </div>\n }\n <div class=\"conversation-icon-wrapper\">\n @if (hasActiveTasks(conversation.ID)) {\n <div class=\"conversation-icon has-tasks\">\n <i class=\"fas fa-spinner fa-pulse\"></i>\n </div>\n }\n <div class=\"badge-overlay\">\n <mj-notification-badge [conversationId]=\"conversation.ID\"></mj-notification-badge>\n </div>\n </div>\n <div class=\"conversation-info\" [title]=\"conversation.Name + (conversation.Description ? '\\n' + conversation.Description : '')\">\n <div class=\"conversation-name\">\n {{ conversation.Name }}\n @if (isSharedWithMe(conversation)) {\n <i class=\"fas fa-share-nodes shared-indicator\"\n [title]=\"sharedWithMeTooltip(conversation)\"></i>\n }\n </div>\n <div class=\"conversation-preview\">{{ conversation.Description }}</div>\n </div>\n @if (!isSelectionMode) {\n <div class=\"conversation-actions\">\n <button class=\"menu-btn\" (click)=\"toggleMenu(conversation.ID, $event)\" title=\"More options\">\n <i class=\"fas fa-ellipsis\"></i>\n </button>\n @if (IsMenuOpen(conversation)) {\n <div class=\"context-menu\" (click)=\"$event.stopPropagation()\">\n @if (IsMoveSubmenuOpen(conversation)) {\n <button class=\"menu-item back\" (click)=\"closeMoveSubmenu($event)\">\n <i class=\"fas fa-chevron-left\"></i>\n <span>Move to folder</span>\n </button>\n <div class=\"menu-divider\"></div>\n <div class=\"move-folder-list\">\n <button class=\"menu-item\" [class.current]=\"!conversation.ProjectID\" (click)=\"selectMoveTarget(conversation, null)\">\n <i class=\"fas fa-inbox\"></i>\n <span>No folder</span>\n </button>\n @for (f of flatFolders; track f.project.ID) {\n <button class=\"menu-item\" [class.current]=\"IsInFolder(conversation, f.project.ID)\"\n [style.paddingLeft.px]=\"14 + f.depth * 12\"\n (click)=\"selectMoveTarget(conversation, f.project.ID)\">\n <i class=\"fas {{ f.project.Icon || 'fa-folder' }}\" [style.color]=\"f.project.Color || null\"></i>\n <span>{{ f.project.Name }}</span>\n </button>\n }\n </div>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item\" (click)=\"createFolderForConversation(conversation, $event)\">\n <i class=\"fas fa-folder-plus\"></i>\n <span>New folder…</span>\n </button>\n } @else {\n <button class=\"menu-item\" (click)=\"togglePin(conversation, $event)\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>{{ conversation.IsPinned ? 'Unpin' : 'Pin' }}</span>\n </button>\n <button class=\"menu-item\" (click)=\"openMoveSubmenu(conversation.ID, $event)\">\n <i class=\"fas fa-folder-tree\"></i>\n <span>Move to folder</span>\n <i class=\"fas fa-chevron-right submenu-arrow\"></i>\n </button>\n <button class=\"menu-item\" (click)=\"renameConversation(conversation); closeMenu()\">\n <i class=\"fas fa-edit\"></i>\n <span>Rename</span>\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"deleteConversation(conversation); closeMenu()\">\n <i class=\"fas fa-trash\"></i>\n <span>Delete</span>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n /* White-label theming tokens for the list panel. The public\n --mj-chat-list-* custom properties are host-overridable (set\n them at :root or on any ancestor); the private --conv-list-* names\n resolve the fallback ONCE here so the 70+ usages below stay simple.\n (A self-referential var() fallback would be a custom-property cycle,\n so the two-name indirection is required, not stylistic.) Defaults\n preserve the stock look exactly: a brand-secondary panel with\n on-secondary ink. Hover/border/divider states derive from the ink via\n color-mix, so they follow automatically when the ink is remapped.\n The accent trio drives the panel's ACTION surfaces (New Conversation\n button, search-focus ring, checkbox tick, drag-over highlights) —\n independent of the active-row pair so a host can tint actions on their\n own; defaults to the brand-primary action color, unchanged.\n --conv-list-hover-bg is the row-hover wash: it defaults to the same\n ink-derived tint as before (so a bg/ink remap still gives a neutral\n hover), but a host can point it at a brand tint to make hover an accent\n cue while keeping the panel itself on a neutral surface. */\n --conv-list-bg: var(--mj-chat-list-bg, var(--mj-brand-secondary));\n --conv-list-ink: var(--mj-chat-list-ink, var(--mj-brand-on-secondary));\n --conv-list-active-bg: var(--mj-chat-list-active-bg, var(--mj-brand-primary));\n --conv-list-active-ink: var(--mj-chat-list-active-ink, var(--mj-brand-on-secondary));\n --conv-list-active-hover-bg: var(--mj-chat-list-active-hover-bg, var(--mj-brand-primary-hover));\n --conv-list-accent: var(--mj-chat-list-accent, var(--mj-brand-primary));\n --conv-list-accent-ink: var(--mj-chat-list-accent-ink, var(--mj-text-inverse));\n --conv-list-accent-hover: var(--mj-chat-list-accent-hover, var(--mj-brand-primary-hover));\n --conv-list-hover-bg: var(--mj-chat-list-hover-bg, color-mix(in srgb, var(--conv-list-ink) 8%, transparent));\n }\n .conversation-list { display: flex; flex-direction: column; height: 100%; background: var(--conv-list-bg); }\n .list-header { padding: 8px; border-bottom: 1px solid color-mix(in srgb, var(--conv-list-ink) 10%, transparent); }\n .search-input {\n width: 100%;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 20%, transparent);\n border-radius: 6px;\n color: var(--conv-list-ink);\n font-size: 13px;\n transition: all 0.2s;\n }\n .search-input::placeholder { color: color-mix(in srgb, var(--conv-list-ink) 50%, transparent); }\n .search-input:focus { outline: none; background: color-mix(in srgb, var(--conv-list-ink) 15%, transparent); border-color: var(--conv-list-accent); }\n .btn-new-conversation {\n width: calc(100% - 16px);\n margin: 8px;\n padding: 10px;\n background: var(--conv-list-accent);\n color: var(--conv-list-accent-ink);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: background 0.2s;\n flex-shrink: 0;\n }\n .btn-new-conversation:hover { background: var(--conv-list-accent-hover); }\n .btn-new-conversation i { font-size: 14px; }\n .list-content { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 0; }\n\n /* Collapsible Sections */\n .sidebar-section { margin-bottom: 20px; }\n .pinned-section .section-title .section-icon {\n color: var(--mj-status-warning);\n font-size: 11px;\n margin-left: 2px;\n }\n .section-header {\n padding: 4px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n color: var(--conv-list-ink);\n font-size: 13px;\n font-weight: 500;\n transition: background 0.2s;\n user-select: none;\n }\n .section-header:hover { background: color-mix(in srgb, var(--conv-list-ink) 8%, transparent); }\n .section-title {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .section-title i {\n font-size: 10px;\n }\n .section-title i:not(.section-icon) {\n transition: transform 0.2s;\n }\n .section-header.expanded .section-title i:not(.section-icon) { transform: rotate(90deg); }\n .chat-list {\n padding: 4px 0;\n display: none;\n }\n .chat-list.expanded { display: block; }\n\n .conversation-item {\n padding: 6px 5px 6px 16px;\n cursor: pointer;\n display: flex;\n gap: 8px;\n align-items: center;\n transition: all 0.2s;\n position: relative;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n font-size: 14px;\n min-height: 45px;\n }\n .conversation-item:hover { background: var(--conv-list-hover-bg); color: var(--conv-list-ink); }\n .conversation-item:hover .conversation-actions { opacity: 1; }\n .conversation-item.active { background: var(--conv-list-active-bg); color: var(--conv-list-active-ink); }\n .conversation-icon-wrapper { position: relative; flex-shrink: 0; }\n .conversation-icon { font-size: 12px; width: 16px; text-align: center; }\n .conversation-icon.has-tasks { color: var(--mj-status-warning); }\n .badge-overlay { position: absolute; top: -4px; right: -4px; }\n .conversation-info { flex: 1; min-width: 0; }\n .conversation-name { font-weight: 600; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: flex; align-items: center; gap: 6px; }\n .shared-indicator { font-size: 10px; color: color-mix(in srgb, var(--conv-list-ink) 55%, transparent); flex-shrink: 0; }\n .conversation-item.active .shared-indicator { color: color-mix(in srgb, var(--conv-list-active-ink) 85%, transparent); }\n .conversation-preview { font-size: 12px; color: color-mix(in srgb, var(--conv-list-ink) 50%, transparent); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .conversation-item.active .conversation-preview { color: color-mix(in srgb, var(--conv-list-active-ink) 80%, transparent); }\n .conversation-meta { display: flex; align-items: center; gap: 4px; flex-shrink: 0; }\n\n /* Project Badge */\n .project-badge {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n margin-left: auto;\n background-color: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: color-mix(in srgb, var(--conv-list-ink) 60%, transparent);\n white-space: nowrap;\n max-width: 80px;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .conversation-item:hover .project-badge {\n background-color: color-mix(in srgb, var(--conv-list-ink) 15%, transparent);\n color: color-mix(in srgb, var(--conv-list-ink) 80%, transparent);\n }\n .conversation-item.active .project-badge {\n background-color: color-mix(in srgb, var(--conv-list-active-ink) 20%, transparent);\n color: var(--conv-list-active-ink);\n }\n\n .conversation-actions {\n position: absolute;\n right: 5px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s;\n z-index: 10;\n }\n .conversation-item:hover .conversation-actions { opacity: 1; pointer-events: auto; }\n .conversation-item.active .conversation-actions { opacity: 1; pointer-events: auto; }\n .conversation-actions > * { pointer-events: auto; }\n .pinned-icon { color: var(--mj-brand-accent); font-size: 12px; }\n\n /* Task Indicator */\n .task-indicator {\n color: var(--mj-status-warning);\n font-size: 12px;\n margin-right: 8px;\n flex-shrink: 0;\n animation: pulse-glow 2s ease-in-out infinite;\n }\n @keyframes pulse-glow {\n 0%, 100% {\n opacity: 1;\n filter: drop-shadow(0 0 2px var(--mj-status-warning));\n }\n 50% {\n opacity: 0.6;\n filter: drop-shadow(0 0 4px var(--mj-status-warning));\n }\n }\n .conversation-item.active .task-indicator {\n color: var(--mj-status-warning);\n }\n\n .menu-btn {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n background: var(--conv-list-bg) !important;\n border: none;\n cursor: pointer;\n transition: all 0.2s;\n }\n .menu-btn:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 15%, transparent) !important;\n color: var(--conv-list-ink);\n }\n .conversation-item.active .menu-btn {\n background: var(--conv-list-active-hover-bg) !important;\n color: var(--conv-list-active-ink);\n }\n .menu-btn i { font-size: 14px; }\n\n .context-menu {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 4px;\n min-width: 160px;\n background: var(--conv-list-bg);\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 15%, transparent);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n z-index: 1001;\n overflow: hidden;\n pointer-events: auto;\n }\n\n .menu-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n background: transparent;\n border: none;\n color: color-mix(in srgb, var(--conv-list-ink) 85%, transparent);\n font-size: 14px;\n text-align: left;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .menu-item:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: var(--conv-list-ink);\n }\n\n .menu-item i {\n width: 16px;\n font-size: 13px;\n color: color-mix(in srgb, var(--conv-list-ink) 60%, transparent);\n }\n\n .menu-item:hover i {\n color: var(--conv-list-ink);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, transparent);\n color: var(--mj-status-error);\n }\n\n .menu-item.danger i {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover i {\n color: var(--mj-status-error);\n }\n\n .menu-divider {\n height: 1px;\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n margin: 4px 0;\n }\n\n /* Rename Animation */\n .conversation-item.renamed {\n animation: renameHighlight 1500ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n /* Brand-token ramp (was hardcoded tailwind blue/purple/emerald rgba values,\n which ignored theming): primary/accent open the flash, success/primary\n carry the fade, at the original alpha ramp (40/35/30/20; glows 50-20). */\n @keyframes renameHighlight {\n 0% {\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-brand-primary) 40%, transparent),\n color-mix(in srgb, var(--mj-brand-accent) 40%, transparent));\n transform: scale(1.03);\n box-shadow: 0 0 20px color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n }\n 25% {\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-brand-primary) 35%, transparent),\n color-mix(in srgb, var(--mj-brand-accent) 35%, transparent));\n box-shadow: 0 0 15px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n 50% {\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-status-success) 30%, transparent),\n color-mix(in srgb, var(--mj-brand-primary) 30%, transparent));\n transform: scale(1.02);\n box-shadow: 0 0 10px color-mix(in srgb, var(--mj-status-success) 30%, transparent);\n }\n 75% {\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-status-success) 20%, transparent),\n color-mix(in srgb, var(--mj-brand-primary) 20%, transparent));\n box-shadow: 0 0 5px color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n }\n 100% {\n background: transparent;\n transform: scale(1);\n box-shadow: none;\n }\n }\n\n /* Selection Mode Styles */\n .header-top {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n\n /* Header menu button and dropdown */\n .header-menu-container {\n position: relative;\n flex-shrink: 0;\n }\n\n .btn-menu {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 20%, transparent);\n border-radius: 6px;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .btn-menu:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: var(--conv-list-ink);\n border-color: color-mix(in srgb, var(--conv-list-ink) 30%, transparent);\n }\n\n .header-dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n min-width: 200px;\n background: var(--conv-list-bg);\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 15%, transparent);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n z-index: 1001;\n overflow: hidden;\n padding: 4px 0;\n }\n\n .header-dropdown-menu .dropdown-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: transparent;\n border: none;\n color: color-mix(in srgb, var(--conv-list-ink) 85%, transparent);\n font-size: 13px;\n text-align: left;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .header-dropdown-menu .dropdown-item:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: var(--conv-list-ink);\n }\n\n .header-dropdown-menu .dropdown-item i {\n width: 16px;\n font-size: 13px;\n color: color-mix(in srgb, var(--conv-list-ink) 60%, transparent);\n }\n\n .header-dropdown-menu .dropdown-item:hover i {\n color: var(--conv-list-ink);\n }\n\n .header-dropdown-menu .dropdown-item .shortcut {\n margin-left: auto;\n font-size: 11px;\n color: color-mix(in srgb, var(--conv-list-ink) 40%, transparent);\n font-family: system-ui, -apple-system, sans-serif;\n }\n\n .btn-select {\n padding: 8px 12px;\n background: transparent;\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 20%, transparent);\n border-radius: 6px;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n font-size: 13px;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n .btn-select:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: var(--conv-list-ink);\n border-color: color-mix(in srgb, var(--conv-list-ink) 30%, transparent);\n }\n\n .conversation-checkbox {\n display: flex;\n align-items: center;\n margin-right: 8px;\n flex-shrink: 0;\n }\n\n .conversation-checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--conv-list-accent);\n }\n\n .selection-action-bar {\n position: sticky;\n bottom: 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--conv-list-bg);\n border-top: 1px solid color-mix(in srgb, var(--conv-list-ink) 15%, transparent);\n gap: 12px;\n flex-wrap: wrap;\n flex-shrink: 0;\n }\n\n .selection-info {\n display: flex;\n align-items: center;\n gap: 12px;\n color: color-mix(in srgb, var(--conv-list-ink) 90%, transparent);\n font-size: 14px;\n font-weight: 500;\n flex: 1 1 auto;\n min-width: 150px;\n }\n\n .selection-count {\n color: var(--conv-list-ink);\n }\n\n .link-btn {\n background: none;\n border: none;\n color: var(--mj-brand-accent);\n cursor: pointer;\n font-size: 13px;\n text-decoration: underline;\n padding: 0;\n transition: color 0.2s;\n }\n\n .link-btn:hover {\n color: var(--conv-list-ink);\n }\n\n .selection-actions {\n display: flex;\n gap: 8px;\n flex: 0 0 auto;\n }\n\n .btn-cancel {\n padding: 8px 16px;\n background: transparent;\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 20%, transparent);\n border-radius: 6px;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n }\n\n .btn-cancel:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: var(--conv-list-ink);\n }\n\n .btn-delete-bulk {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-status-error);\n border: none;\n border-radius: 6px;\n /* Deliberately NOT --conv-list-ink: this ink sits on the error-red button,\n not the panel, so it must not follow a panel remap. (brand-on-secondary\n stays light in both modes; text-inverse flips dark in dark mode.) */\n color: var(--mj-brand-on-secondary);\n cursor: pointer;\n font-size: 13px;\n font-weight: 600;\n transition: all 0.2s;\n }\n\n .btn-delete-bulk:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 80%, black);\n }\n\n .btn-delete-bulk:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-delete-bulk i {\n font-size: 12px;\n }\n\n /* Folders */\n .section-action-btn {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: color-mix(in srgb, var(--conv-list-ink) 60%, transparent);\n cursor: pointer;\n transition: all 0.2s;\n }\n .section-action-btn:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 15%, transparent);\n color: var(--conv-list-ink);\n }\n .section-action-btn i { font-size: 12px; }\n\n .folder-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 5px 8px 5px 12px;\n cursor: pointer;\n color: color-mix(in srgb, var(--conv-list-ink) 80%, transparent);\n font-size: 13px;\n transition: background 0.15s;\n user-select: none;\n position: relative;\n }\n .folder-row:hover { background: color-mix(in srgb, var(--conv-list-ink) 8%, transparent); }\n .folder-row.drag-over {\n background: color-mix(in srgb, var(--conv-list-accent) 25%, transparent);\n box-shadow: inset 0 0 0 1px var(--conv-list-accent);\n }\n .folder-row.dragging { opacity: 0.4; }\n .section-header.drag-over {\n background: color-mix(in srgb, var(--conv-list-accent) 18%, transparent);\n box-shadow: inset 0 0 0 1px var(--conv-list-accent);\n border-radius: 6px;\n }\n .folder-chevron {\n font-size: 9px;\n width: 10px;\n flex-shrink: 0;\n transition: transform 0.2s;\n color: color-mix(in srgb, var(--conv-list-ink) 55%, transparent);\n }\n .folder-chevron.expanded { transform: rotate(90deg); }\n .folder-icon { font-size: 12px; width: 16px; text-align: center; flex-shrink: 0; }\n .folder-name {\n flex: 1;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 600;\n }\n .folder-count {\n font-size: 11px;\n font-weight: 600;\n color: color-mix(in srgb, var(--conv-list-ink) 50%, transparent);\n flex-shrink: 0;\n margin-left: auto;\n padding-left: 6px;\n text-align: right;\n }\n .folder-actions {\n position: absolute;\n right: 6px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n gap: 2px;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s;\n z-index: 5;\n }\n .folder-row:hover .folder-actions { opacity: 1; pointer-events: auto; }\n .folder-row:hover .folder-count { opacity: 0; }\n .folder-action-btn {\n width: 22px;\n height: 22px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: color-mix(in srgb, var(--conv-list-ink) 60%, transparent);\n cursor: pointer;\n transition: all 0.15s;\n }\n .folder-action-btn:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 18%, transparent);\n color: var(--conv-list-ink);\n }\n .folder-action-btn.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 18%, transparent);\n color: var(--mj-status-error);\n }\n .folder-action-btn i { font-size: 11px; }\n .folder-children { display: block; }\n .folder-empty-hint {\n padding: 6px 16px;\n font-size: 11px;\n font-style: italic;\n color: color-mix(in srgb, var(--conv-list-ink) 45%, transparent);\n }\n .ungrouped-section.drag-over {\n background: color-mix(in srgb, var(--conv-list-accent) 12%, transparent);\n box-shadow: inset 0 0 0 1px var(--conv-list-accent);\n border-radius: 6px;\n }\n\n /* Dragging state */\n .conversation-item { user-select: none; }\n .conversation-item.dragging { opacity: 0.4; }\n\n /* Move-to-folder submenu */\n .menu-item.back { font-weight: 600; }\n .menu-item .submenu-arrow { margin-left: auto; font-size: 10px; }\n .menu-item.current { background: color-mix(in srgb, var(--conv-list-accent) 18%, transparent); }\n .move-folder-list { max-height: 240px; overflow-y: auto; }\n `]\n})\nexport class ConversationListComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() selectedConversationId: string | null = null;\n @Input() renamedConversationId: string | null = null;\n @Input() isSidebarPinned: boolean = true; // Whether sidebar is pinned (stays open after selection)\n @Input() isMobileView: boolean = false; // Whether we're on mobile (no pin options)\n\n // ── White-label chrome toggles (all default true = stock rendering) ──\n /** Show the search box in the list header. Flipping to false clears any active\n * search so a hidden filter can't keep silently narrowing the list. */\n @Input()\n set showSearch(value: boolean) {\n if (!value && this._searchQuery) {\n this.searchQuery = ''; // setter rebuilds the groupings\n }\n this._showSearch = value;\n }\n get showSearch(): boolean {\n return this._showSearch;\n }\n private _showSearch = true;\n /** Show the \"New Conversation\" button. */\n @Input() showNewConversationButton: boolean = true;\n /** Show the ⋯ header options menu (refresh / select / group-by / hide sidebar). */\n @Input() showHeaderMenu: boolean = true;\n /** Show the collapsible Pinned / Folders / Messages section headers. When false,\n * the list renders FLAT and fully expanded: folder grouping is bypassed (the\n * folder tree's root drop-zone and New Folder action live in the section\n * header, so a headerless tree would allow one-way folder nesting) — the\n * chrome-less rendering for embedded hosts. */\n @Input() showSectionHeaders: boolean = true;\n\n @Output() conversationSelected = new EventEmitter<string>();\n @Output() conversationDeleted = new EventEmitter<string>(); // Emits the deleted conversation ID\n @Output() newConversationRequested = new EventEmitter<void>();\n @Output() pinSidebarRequested = new EventEmitter<void>(); // Request to pin sidebar\n @Output() unpinSidebarRequested = new EventEmitter<void>(); // Request to unpin (collapse) sidebar\n @Output() refreshRequested = new EventEmitter<void>(); // Emitted after list refresh so chat area can also reload\n\n public directMessagesExpanded: boolean = true;\n public pinnedExpanded: boolean = true;\n public foldersExpanded: boolean = true;\n public ungroupedExpanded: boolean = true;\n public openMenuConversationId: string | null = null;\n public conversationIdsWithTasks = new Set<string>();\n public isSelectionMode: boolean = false;\n public selectedConversationIds = new Set<string>();\n public isHeaderMenuOpen: boolean = false;\n public isRefreshing: boolean = false;\n\n /** UserInfoEngine key for persisting folder collapse state + group-by mode. */\n private static readonly FolderPrefsKey = 'mj.conversations.folderPrefs.v1';\n\n /** How the conversation list is grouped. 'project' = folders, 'none' = flat list. */\n public groupBy: ConversationGroupBy = 'project';\n\n /** Precomputed groupings, rebuilt whenever conversations/projects/search change. */\n public pinnedConversations: MJConversationEntity[] = [];\n public unpinnedConversations: MJConversationEntity[] = [];\n public ungroupedConversations: MJConversationEntity[] = [];\n public folderTree: FolderNode[] = [];\n /** Flattened folder list (depth-ordered) for the \"Move to folder\" menu. */\n public flatFolders: FolderNode[] = [];\n\n /** Folder IDs (normalized) whose children are collapsed. Absent = expanded. */\n private collapsedFolderIds = new Set<string>();\n\n /** Drag-and-drop state. */\n public draggedConversationId: string | null = null;\n public draggedFolderId: string | null = null;\n public dragOverTargetId: string | null = null;\n\n /** When set, the open conversation menu is showing its \"Move to folder\" picker. */\n public moveSubmenuConversationId: string | null = null;\n\n private _searchQuery: string = '';\n\n private destroy$ = new Subject<void>();\n\n private engine = ConversationEngine.Instance;\n\n // Local UI state for loading/refreshing\n public IsLoading: boolean = false;\n\n constructor(\n private dialogService: DialogService,\n private notificationService: NotificationService,\n private activeTasksService: ActiveTasksService,\n private mjDialogService: MJDialogService,\n private cdr: ChangeDetectorRef\n ) {}\n\n get searchQuery(): string {\n return this._searchQuery;\n }\n set searchQuery(value: string) {\n this._searchQuery = value ?? '';\n this.rebuildGroups();\n }\n\n /** True when a search filter is active. */\n get isSearching(): boolean {\n return this._searchQuery.trim().length > 0;\n }\n\n /** Conversations matching the current search (used by selection-mode helpers). */\n get filteredConversations(): MJConversationEntity[] {\n return this.filterConversations(this.engine.Conversations);\n }\n\n private filterConversations(conversations: MJConversationEntity[]): MJConversationEntity[] {\n if (!this.isSearching) {\n return conversations;\n }\n const lowerQuery = this._searchQuery.toLowerCase();\n return conversations.filter(c =>\n (c.Name?.toLowerCase().includes(lowerQuery)) ||\n (c.Description?.toLowerCase().includes(lowerQuery))\n );\n }\n\n ngOnInit() {\n // Restore persisted folder collapse state + group-by preference\n this.loadFolderPrefs();\n\n // Load conversations (and folders) on init\n this.engine.LoadConversations(this.environmentId, this.currentUser, false);\n\n // Rebuild the precomputed groupings whenever conversations OR projects change\n // (pin, archive, rename, move-to-folder, folder create/rename/delete, etc.).\n this.engine.Conversations$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.rebuildGroups();\n this.cdr.detectChanges();\n });\n\n this.engine.Projects$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.rebuildGroups();\n this.cdr.detectChanges();\n });\n\n // Subscribe to conversation IDs with active tasks (hot set)\n this.activeTasksService.conversationIdsWithTasks$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(conversationIds => {\n this.conversationIdsWithTasks = conversationIds;\n this.cdr.detectChanges(); // Force change detection to ensure spinner icons update reliably\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n @HostListener('document:click')\n onDocumentClick(): void {\n // Close menus when clicking outside\n if (this.openMenuConversationId) {\n this.closeMenu();\n }\n if (this.isHeaderMenuOpen) {\n this.closeHeaderMenu();\n }\n }\n\n public toggleHeaderMenu(event: Event): void {\n event.stopPropagation();\n this.isHeaderMenuOpen = !this.isHeaderMenuOpen;\n }\n\n public closeHeaderMenu(): void {\n this.isHeaderMenuOpen = false;\n }\n\n public onSelectConversationsClick(event: Event): void {\n event.stopPropagation();\n this.toggleSelectionMode();\n this.closeHeaderMenu();\n }\n\n public onToggleGroupByClick(event: Event): void {\n event.stopPropagation();\n this.toggleGroupBy();\n this.closeHeaderMenu();\n }\n\n public async onRefreshConversationsClick(event: Event): Promise<void> {\n event.stopPropagation();\n if (this.isRefreshing) return;\n\n this.isRefreshing = true;\n try {\n await this.engine.LoadConversations(this.environmentId, this.currentUser, true);\n // Signal parent to also reload messages in the active conversation\n this.refreshRequested.emit();\n } catch (error) {\n console.error('Error refreshing conversations:', error);\n await this.dialogService.alert('Error', 'Failed to refresh conversations. Please try again.');\n } finally {\n this.isRefreshing = false;\n this.cdr.detectChanges();\n this.closeHeaderMenu();\n }\n }\n\n public onPinSidebarClick(event: Event): void {\n event.stopPropagation();\n this.closeHeaderMenu();\n this.pinSidebarRequested.emit();\n }\n\n public onUnpinSidebarClick(event: Event): void {\n event.stopPropagation();\n this.closeHeaderMenu();\n this.unpinSidebarRequested.emit();\n }\n\n public toggleDirectMessages(): void {\n this.directMessagesExpanded = !this.directMessagesExpanded;\n }\n\n public togglePinned(): void {\n this.pinnedExpanded = !this.pinnedExpanded;\n }\n\n public toggleFolders(): void {\n this.foldersExpanded = !this.foldersExpanded;\n }\n\n public toggleUngrouped(): void {\n this.ungroupedExpanded = !this.ungroupedExpanded;\n }\n\n // ========================================================================\n // FOLDER GROUPING\n // ========================================================================\n\n /**\n * Recomputes pinned/unpinned/ungrouped lists and the folder tree from the\n * engine's conversation + project caches and the current search filter.\n */\n private rebuildGroups(): void {\n const matching = this.filterConversations(this.engine.Conversations);\n this.pinnedConversations = matching.filter(c => c.IsPinned);\n this.unpinnedConversations = matching.filter(c => !c.IsPinned);\n\n const projects = this.engine.Projects;\n const projectIds = new Set(projects.map(p => NormalizeUUID(p.ID)));\n\n // Bucket unpinned conversations by their folder (pinned ones live in the\n // Pinned section). Conversations with no/unknown folder are \"ungrouped\".\n const conversationsByProject = new Map<string, MJConversationEntity[]>();\n const ungrouped: MJConversationEntity[] = [];\n for (const c of this.unpinnedConversations) {\n const pid = c.ProjectID ? NormalizeUUID(c.ProjectID) : null;\n if (pid && projectIds.has(pid)) {\n const arr = conversationsByProject.get(pid) ?? [];\n arr.push(c);\n conversationsByProject.set(pid, arr);\n } else {\n ungrouped.push(c);\n }\n }\n this.ungroupedConversations = ungrouped;\n\n // Index projects by parent. A project whose parent isn't loaded is treated\n // as a root so it never disappears from the tree.\n const childrenByParent = new Map<string | null, MJProjectEntity[]>();\n for (const p of projects) {\n const parentId = p.ParentID ? NormalizeUUID(p.ParentID) : null;\n const key = parentId && projectIds.has(parentId) ? parentId : null;\n const arr = childrenByParent.get(key) ?? [];\n arr.push(p);\n childrenByParent.set(key, arr);\n }\n\n const build = (parentKey: string | null, depth: number): FolderNode[] => {\n const projectsAtLevel = childrenByParent.get(parentKey) ?? [];\n return projectsAtLevel.map(p => {\n const children = build(NormalizeUUID(p.ID), depth + 1);\n const conversations = conversationsByProject.get(NormalizeUUID(p.ID)) ?? [];\n const totalCount = conversations.length + children.reduce((sum, ch) => sum + ch.totalCount, 0);\n const hasContent = conversations.length > 0 || children.some(ch => ch.hasContent);\n return { project: p, depth, conversations, children, totalCount, hasContent };\n });\n };\n this.folderTree = build(null, 0);\n this.flatFolders = this.flattenFolders(this.folderTree);\n }\n\n private flattenFolders(nodes: FolderNode[]): FolderNode[] {\n const out: FolderNode[] = [];\n for (const node of nodes) {\n out.push(node);\n out.push(...this.flattenFolders(node.children));\n }\n return out;\n }\n\n private findFolderNode(nodes: FolderNode[], projectId: string): FolderNode | null {\n for (const node of nodes) {\n if (UUIDsEqual(node.project.ID, projectId)) return node;\n const found = this.findFolderNode(node.children, projectId);\n if (found) return found;\n }\n return null;\n }\n\n public isFolderExpanded(projectId: string): boolean {\n return !this.collapsedFolderIds.has(NormalizeUUID(projectId));\n }\n\n public toggleFolder(projectId: string): void {\n const key = NormalizeUUID(projectId);\n if (this.collapsedFolderIds.has(key)) {\n this.collapsedFolderIds.delete(key);\n } else {\n this.collapsedFolderIds.add(key);\n }\n this.saveFolderPrefs();\n }\n\n public toggleGroupBy(): void {\n this.groupBy = this.groupBy === 'project' ? 'none' : 'project';\n this.saveFolderPrefs();\n this.rebuildGroups();\n }\n\n private loadFolderPrefs(): void {\n try {\n const raw = UserInfoEngine.Instance.GetSetting(ConversationListComponent.FolderPrefsKey);\n if (!raw) return;\n const parsed = JSON.parse(raw) as { collapsed?: string[]; groupBy?: ConversationGroupBy };\n this.collapsedFolderIds = new Set((parsed.collapsed ?? []).map(id => NormalizeUUID(id)));\n if (parsed.groupBy === 'none' || parsed.groupBy === 'project') {\n this.groupBy = parsed.groupBy;\n }\n } catch {\n // Corrupt/legacy value — ignore and use defaults\n }\n }\n\n private saveFolderPrefs(): void {\n const payload = JSON.stringify({\n collapsed: Array.from(this.collapsedFolderIds),\n groupBy: this.groupBy\n });\n UserInfoEngine.Instance.SetSettingDebounced(ConversationListComponent.FolderPrefsKey, payload);\n }\n\n // ========================================================================\n // DRAG & DROP (move conversation into/out of a folder)\n // ========================================================================\n\n public onConversationDragStart(conversation: MJConversationEntity, event: DragEvent): void {\n if (this.isSelectionMode) return;\n this.draggedFolderId = null;\n this.draggedConversationId = conversation.ID;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', conversation.ID);\n }\n }\n\n public onConversationDragEnd(): void {\n this.draggedConversationId = null;\n this.dragOverTargetId = null;\n }\n\n public onFolderDragStart(node: FolderNode, event: DragEvent): void {\n event.stopPropagation();\n this.draggedConversationId = null;\n this.draggedFolderId = node.project.ID;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', node.project.ID);\n }\n }\n\n public onFolderDragEnd(): void {\n this.draggedFolderId = null;\n this.dragOverTargetId = null;\n }\n\n public onFolderDragOver(projectId: string, event: DragEvent): void {\n // A conversation can drop onto any folder; a folder can drop onto any folder\n // that isn't itself or one of its own descendants (which would create a cycle).\n const accepts = this.draggedConversationId\n ? true\n : this.draggedFolderId\n ? this.isValidFolderDropTarget(projectId)\n : false;\n if (!accepts) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.dragOverTargetId = projectId;\n }\n\n public onUngroupedDragOver(event: DragEvent): void {\n if (!this.draggedConversationId) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.dragOverTargetId = 'ungrouped';\n }\n\n /** The Folders section header accepts a dragged folder to move it back to the top level. */\n public onFoldersRootDragOver(event: DragEvent): void {\n if (!this.draggedFolderId) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.dragOverTargetId = 'folders-root';\n }\n\n public onDragLeave(targetId: string): void {\n if (this.dragOverTargetId === targetId) {\n this.dragOverTargetId = null;\n }\n }\n\n public onFolderDrop(project: MJProjectEntity, event: DragEvent): void {\n event.preventDefault();\n const conversationId = this.draggedConversationId;\n const folderId = this.draggedFolderId;\n this.dragOverTargetId = null;\n this.draggedConversationId = null;\n this.draggedFolderId = null;\n if (conversationId) {\n this.moveConversation(conversationId, project.ID);\n } else if (folderId && this.isValidFolderDropTarget(project.ID, folderId)) {\n this.moveFolder(folderId, project.ID);\n }\n }\n\n public onUngroupedDrop(event: DragEvent): void {\n event.preventDefault();\n const conversationId = this.draggedConversationId;\n this.dragOverTargetId = null;\n this.draggedConversationId = null;\n if (conversationId) {\n this.moveConversation(conversationId, null);\n }\n }\n\n public onFoldersRootDrop(event: DragEvent): void {\n event.preventDefault();\n const folderId = this.draggedFolderId;\n this.dragOverTargetId = null;\n this.draggedFolderId = null;\n if (folderId) {\n this.moveFolder(folderId, null);\n }\n }\n\n /**\n * A folder can be dropped onto a target folder only if the target isn't the dragged\n * folder itself and isn't one of its descendants (otherwise we'd create a cycle).\n */\n private isValidFolderDropTarget(targetId: string, draggedId: string | null = this.draggedFolderId): boolean {\n if (!draggedId) return false;\n if (UUIDsEqual(targetId, draggedId)) return false;\n return !this.isDescendantOf(targetId, draggedId);\n }\n\n /** True when `nodeId` is a descendant of `ancestorId` in the folder tree. */\n private isDescendantOf(nodeId: string, ancestorId: string): boolean {\n const byId = new Map(this.engine.Projects.map(p => [NormalizeUUID(p.ID), p]));\n const visited = new Set<string>();\n let current = byId.get(NormalizeUUID(nodeId));\n while (current?.ParentID) {\n const parentKey = NormalizeUUID(current.ParentID);\n if (visited.has(parentKey)) break; // guard against malformed cycles\n visited.add(parentKey);\n if (UUIDsEqual(parentKey, ancestorId)) return true;\n current = byId.get(parentKey);\n }\n return false;\n }\n\n /** Assigns a conversation to a folder (or null to ungroup) and refreshes the view. */\n private async moveConversation(conversationId: string, projectId: string | null): Promise<void> {\n try {\n await this.engine.MoveConversationToProject(conversationId, projectId, this.currentUser);\n // Reveal the destination folder so the user sees where it landed\n if (projectId) {\n this.collapsedFolderIds.delete(NormalizeUUID(projectId));\n }\n this.rebuildGroups();\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Error moving conversation:', error);\n await this.dialogService.alert('Error', 'Failed to move conversation. Please try again.');\n }\n }\n\n /** Reparents a folder under another folder (or to the top level when projectId is null). */\n private async moveFolder(folderId: string, parentId: string | null): Promise<void> {\n // No-op if it's already under that parent\n const folder = this.engine.Projects.find(p => UUIDsEqual(p.ID, folderId));\n const currentParent = folder?.ParentID ?? null;\n const sameParent = (currentParent === null && parentId === null) ||\n (!!currentParent && !!parentId && UUIDsEqual(currentParent, parentId));\n if (sameParent) return;\n\n try {\n await this.engine.MoveProjectToParent(folderId, parentId, this.currentUser);\n // Reveal the new parent so the moved folder is visible\n if (parentId) {\n this.collapsedFolderIds.delete(NormalizeUUID(parentId));\n }\n this.rebuildGroups();\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Error moving folder:', error);\n await this.dialogService.alert('Error', 'Failed to move folder. Please try again.');\n }\n }\n\n // ========================================================================\n // MOVE-TO-FOLDER MENU\n // ========================================================================\n\n public openMoveSubmenu(conversationId: string, event: Event): void {\n event.stopPropagation();\n this.moveSubmenuConversationId = conversationId;\n }\n\n public closeMoveSubmenu(event: Event): void {\n event.stopPropagation();\n this.moveSubmenuConversationId = null;\n }\n\n public IsInFolder(conversation: MJConversationEntity, projectId: string): boolean {\n return !!conversation.ProjectID && UUIDsEqual(conversation.ProjectID, projectId);\n }\n\n public selectMoveTarget(conversation: MJConversationEntity, projectId: string | null): void {\n this.moveConversation(conversation.ID, projectId);\n this.closeMenu();\n }\n\n // ========================================================================\n // FOLDER CRUD (reuses the existing project form modal)\n // ========================================================================\n\n public createFolder(parentId: string | null, event?: Event): void {\n if (event) event.stopPropagation();\n this.openFolderModal(null, parentId);\n }\n\n public editFolder(project: MJProjectEntity, event?: Event): void {\n if (event) event.stopPropagation();\n this.openFolderModal(project, null);\n }\n\n public createFolderForConversation(conversation: MJConversationEntity, event: Event): void {\n event.stopPropagation();\n const conversationId = conversation.ID;\n this.closeMenu();\n this.openFolderModal(null, null, (created) => this.moveConversation(conversationId, created.ID));\n }\n\n private openFolderModal(\n project: MJProjectEntity | null,\n parentId: string | null,\n onCreated?: (project: MJProjectEntity) => void\n ): void {\n const dialogRef = this.mjDialogService.open({\n content: ProjectFormModalComponent,\n width: 600,\n minWidth: 400\n });\n\n const instance = dialogRef.Content!.instance as unknown as ProjectFormModalComponent;\n instance.dialogRef = dialogRef;\n instance.environmentId = this.environmentId;\n instance.currentUser = this.currentUser;\n if (project) instance.project = project;\n if (parentId) instance.parentId = parentId;\n\n instance.projectSaved.subscribe((saved: MJProjectEntity) => {\n // The engine's entity-event handler keeps the projects cache in sync; we\n // just reveal the parent and refresh, then run any post-create action.\n if (parentId) {\n this.collapsedFolderIds.delete(NormalizeUUID(parentId));\n }\n this.rebuildGroups();\n this.cdr.detectChanges();\n if (onCreated) onCreated(saved);\n });\n }\n\n public async deleteFolder(project: MJProjectEntity, event?: Event): Promise<void> {\n if (event) event.stopPropagation();\n\n const node = this.findFolderNode(this.folderTree, project.ID);\n const total = node?.totalCount ?? 0;\n const childCount = node?.children.length ?? 0;\n\n let message = `Are you sure you want to delete the folder \"${project.Name}\"?`;\n if (total > 0 || childCount > 0) {\n message += `\\n\\nConversations inside will be moved out of the folder`;\n message += childCount > 0 ? ` and subfolders will move up one level.` : `.`;\n message += ` Nothing is deleted.`;\n }\n\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Folder',\n message,\n okText: 'Delete',\n cancelText: 'Cancel',\n dangerous: true\n });\n if (!confirmed) return;\n\n try {\n await this.engine.DeleteProject(project.ID, this.currentUser);\n this.collapsedFolderIds.delete(NormalizeUUID(project.ID));\n this.rebuildGroups();\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Error deleting folder:', error);\n await this.dialogService.alert(\n 'Error',\n error instanceof Error ? error.message : 'Failed to delete folder. Please try again.'\n );\n }\n }\n\n IsConversationActive(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(conversation.ID, this.selectedConversationId);\n }\n\n IsConversationRenamed(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(conversation.ID, this.renamedConversationId);\n }\n\n IsMenuOpen(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(this.openMenuConversationId, conversation.ID);\n }\n\n IsConversationDragging(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(this.draggedConversationId, conversation.ID);\n }\n\n IsMoveSubmenuOpen(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(this.moveSubmenuConversationId, conversation.ID);\n }\n\n selectConversation(conversation: MJConversationEntity): void {\n this.conversationSelected.emit(conversation.ID);\n // Clear unread notifications when conversation is opened\n this.notificationService.markConversationAsRead(conversation.ID);\n }\n\n async createNewConversation(): Promise<void> {\n // Don't create DB record yet - just show the welcome screen\n // Conversation will be created when user sends first message\n this.newConversationRequested.emit();\n }\n\n async renameConversation(conversation: MJConversationEntity): Promise<void> {\n try {\n const result = await this.dialogService.input({\n title: 'Edit Conversation',\n message: 'Update the name and description for this conversation',\n inputLabel: 'Conversation Name',\n inputValue: conversation.Name || '',\n placeholder: 'My Conversation',\n required: true,\n secondInputLabel: 'Description',\n secondInputValue: conversation.Description || '',\n secondInputPlaceholder: 'Optional description',\n secondInputRequired: false,\n okText: 'Save',\n cancelText: 'Cancel'\n });\n\n if (result) {\n const newName = typeof result === 'string' ? result : result.value;\n const newDescription = typeof result === 'string' ? conversation.Description : result.secondValue;\n\n if (newName !== conversation.Name || newDescription !== conversation.Description) {\n await this.engine.SaveConversation(\n conversation.ID,\n { Name: newName, Description: newDescription || '' },\n this.currentUser\n );\n }\n }\n } catch (error) {\n console.error('Error renaming conversation:', error);\n await this.dialogService.alert('Error', 'Failed to update conversation. Please try again.');\n }\n }\n\n async deleteConversation(conversation: MJConversationEntity): Promise<void> {\n try {\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Conversation',\n message: `Are you sure you want to delete \"${conversation.Name}\"? This action cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel'\n });\n\n if (confirmed) {\n const deletedId = conversation.ID;\n await this.engine.DeleteConversation(deletedId, this.currentUser);\n this.cdr.detectChanges();\n this.conversationDeleted.emit(deletedId);\n }\n } catch (error) {\n console.error('Error deleting conversation:', error);\n await this.dialogService.alert('Error', 'Failed to delete conversation. Please try again.');\n }\n }\n\n toggleMenu(conversationId: string, event: Event): void {\n event.stopPropagation();\n this.openMenuConversationId = this.openMenuConversationId === conversationId ? null : conversationId;\n }\n\n closeMenu(): void {\n this.openMenuConversationId = null;\n this.moveSubmenuConversationId = null;\n }\n\n async togglePin(conversation: MJConversationEntity, event?: Event): Promise<void> {\n if (event) event.stopPropagation();\n this.closeMenu(); // Close immediately on user action — don't wait for the async op\n try {\n await this.engine.PinConversation(conversation.ID, !conversation.IsPinned, this.currentUser);\n } catch (error) {\n console.error('Error toggling pin:', error);\n await this.dialogService.alert('Error', 'Failed to pin/unpin conversation. Please try again.');\n }\n }\n\n hasActiveTasks(conversationId: string): boolean {\n return this.conversationIdsWithTasks.has(conversationId);\n }\n\n /** True when this conversation was shared with the current user by someone else. */\n isSharedWithMe(conversation: MJConversationEntity): boolean {\n return this.engine.GetSharedByInfo(conversation.ID) !== null;\n }\n\n /** Tooltip for the sidebar share icon: \"Shared by {email or name}\". */\n sharedWithMeTooltip(conversation: MJConversationEntity): string {\n const info = this.engine.GetSharedByInfo(conversation.ID);\n if (!info) return 'Shared with you';\n return `Shared by ${info.Email ?? info.Name ?? 'another user'}`;\n }\n\n toggleSelectionMode(): void {\n this.isSelectionMode = !this.isSelectionMode;\n if (!this.isSelectionMode) {\n this.selectedConversationIds.clear();\n }\n }\n\n toggleConversationSelection(conversationId: string): void {\n if (this.selectedConversationIds.has(conversationId)) {\n this.selectedConversationIds.delete(conversationId);\n } else {\n this.selectedConversationIds.add(conversationId);\n }\n }\n\n selectAll(): void {\n this.filteredConversations.forEach(c => {\n this.selectedConversationIds.add(c.ID);\n });\n }\n\n deselectAll(): void {\n this.selectedConversationIds.clear();\n }\n\n async bulkDeleteConversations(): Promise<void> {\n const count = this.selectedConversationIds.size;\n\n if (count === 0) return;\n\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Conversations',\n message: `Are you sure you want to delete ${count} conversation${count > 1 ? 's' : ''}? This action cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel'\n });\n\n if (confirmed) {\n try {\n const result = await this.engine.DeleteMultipleConversations(\n Array.from(this.selectedConversationIds),\n this.currentUser\n );\n\n if (result.Failed.length > 0 && result.Successful.length > 0) {\n // Partial success\n const failedNames = result.Failed.map(f => `\"${f.Name}\"`).join(', ');\n await this.dialogService.alert(\n 'Partial Success',\n `Deleted ${result.Successful.length} of ${count} conversations.\\n\\n` +\n `${result.Failed.length} could not be deleted: ${failedNames}`\n );\n } else if (result.Failed.length > 0 && result.Successful.length === 0) {\n // All failed\n await this.dialogService.alert(\n 'Delete Failed',\n `None of the ${count} conversations could be deleted. They may have already been removed.`\n );\n }\n\n // Emit deleted events for successful deletions\n for (const id of result.Successful) {\n this.conversationDeleted.emit(id);\n }\n\n } catch (error) {\n console.error('Error deleting conversations:', error);\n await this.dialogService.alert('Error', 'Failed to delete conversations. Please try again.');\n } finally {\n // Always exit selection mode after an attempt, whether success or failure\n this.selectedConversationIds.clear();\n this.isSelectionMode = false;\n this.cdr.detectChanges();\n }\n }\n }\n\n handleConversationClick(conversation: MJConversationEntity): void {\n if (this.isSelectionMode) {\n this.toggleConversationSelection(conversation.ID);\n } else {\n this.selectConversation(conversation);\n }\n }\n}"]}
1
+ {"version":3,"file":"conversation-list.component.js","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-list.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAqB,YAAY,EAAqB,SAAS,EAAc,MAAM,eAAe,CAAC;AAElJ,OAAO,EAAyC,kBAAkB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAK1H,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AAEpF,OAAO,EACL,gCAAgC,EAGjC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;;;;;;;;;;;;;;;;;;IA+DrD,AADF,+BAA8E,iBACsC;IAAhF,4MAAS,uBAAgB,KAAC;IAC1D,wBAA4B;IAC9B,iBAAS;IACT,gCAA8B;IAAA,YAA2C;IAAA,iBAAO;IAChF,kCAIqE;IAH7D,4MAAS,qBAAc,KAAC;IAI9B,wBAA+E;IACjF,iBAAS;IACT,kCAIoC;IAH5B,kNAAS,8BAAuB,KAAC;IAIvC,wBAAkC;IACpC,iBAAS;IACT,kCAI2B;IAHnB,4MAAS,iBAAU,KAAC;IAI1B,yBAAgC;IAClC,iBAAS;IACT,mCAAkG;IAAzD,6MAAS,kBAAW,KAAC;IAC5D,yBAA4B;IAEhC,AADE,iBAAS,EACL;;;IAzB0B,eAA2C;IAA3C,2EAA2C;IAGjE,cAAuC;IACvC,AADA,mEAAuC,iIAC+D;;IAEhF,cAA8C;IAA9C,8DAA8C;IAIpE,cAAuC;IACvC,AADA,mEAAuC,kGACqC;IAM5E,eAAsC;IACtC,AADA,kEAAsC,uFAC2B;;;;IAmBrE,kCAA0E;IAA7C,wOAAS,oBAAa,KAAC;IAClD,wBAA4B;IAC9B,iBAAS;;;;IAVX,AADF,+BAAwB,mBAOgB;IADpC,oVAAyB;IACzB,mOAAW,8BAAuB,KAAC;IANrC,iBAMsC;IACtC,yIAAmB;IAKrB,iBAAM;;;IAPF,cAAyB;IAAzB,kDAAyB;IAE3B,eAIC;IAJD,6CAIC;;;;IAmBK,kCAAoE;IAAtC,4PAAS,kCAA2B,KAAC;IACjE,wBAAoC;IACpC,4BAAM;IAAA,4BAAY;IACpB,AADoB,iBAAO,EAClB;;;;IAZX,AADF,+BAAkC,iBACsE;IAAxE,8OAAS,0CAAmC,KAAC;IACzE,wBAA8D;IAC9D,4BAAM;IAAA,YAAgD;IACxD,AADwD,iBAAO,EACtD;IACT,kCAAqE;IAAvC,8OAAS,mCAA4B,KAAC;IAClE,wBAA0G;IAC1G,4BAAM;IAAA,YAAqE;IAC7E,AAD6E,iBAAO,EAC3E;IACT,uJAAqB;IAMvB,iBAAM;;;IAdwE,cAAyB;IAAzB,8CAAyB;IACxE,cAA8B;IAA9B,8CAA8B;IACnD,eAAgD;IAAhD,uEAAgD;IAGvC,eAA8C;IAAC,AAA/C,8DAA8C,yCAAwC;IAC/F,eAAqE;IAArE,4FAAqE;IAE7E,cAKC;IALD,+CAKC;;;;IAlBL,AADF,+BAAmC,iBAC2C;IAAnD,gOAAS,+BAAwB,KAAC;IACzD,wBAAiC;IACnC,iBAAS;IACT,wIAAwB;IAkB1B,iBAAM;;;IAlBJ,eAiBC;IAjBD,kDAiBC;;;IAtCL,wHAAkB;IAgBlB,wHAAsB;;;IAhBtB,4CAeC;IACD,cAwBC;IAxBD,gDAwBC;;;;IAQD,AADF,+BAAsB,iBAG+F;IAD3G,4MAAS,eAAQ,MAAM,CAAC,KAAC;IAE/B,wBAAgD;IAChD,4BAAM;IAAA,oBAAI;IACZ,AADY,iBAAO,EACV;IACT,kCAEuG;IAD/F,4MAAS,eAAQ,MAAM,CAAC,KAAC;IAE/B,wBAAgD;IAChD,4BAAM;IAAA,oBAAI;IAEd,AADE,AADY,iBAAO,EACV,EACL;;;IAZqB,cAAkC;IAAlC,kDAAkC;IAEnD,oIAA0G;IACjG,cAA4B;IAA5B,iDAA4B;IAGpB,eAAkC;IAAlC,kDAAkC;IAEnD,wHAA8F;IACrF,cAA4B;IAA5B,iDAA4B;;;IA1FjD,AADF,8BAAyB,cACC;IAgCpB,AA/BF,4GAAuB,yEA+Bd;IA2CX,iBAAM;IAIN,0GAAoC;IAgBtC,iBAAM;;;IA9FF,eAyEC;IAzED,gDAyEC;IAKH,eAeC;IAfD,qEAeC;;;;IAID,kCAAgG;IAA3D,6LAAS,8BAAuB,KAAC;IACpE,wBAA2B;IAC3B,4BAAM;IAAA,gCAAgB;IACxB,AADwB,iBAAO,EACtB;;;;IASH,+BAAuF;IAAzB,0MAAS,qBAAc,KAAC;IACpF,+BAA2B;IAEzB,AADA,wBAAoC,YACS;IAC7C,4BAAM;IAAA,sBAAM;IAEhB,AADE,AADc,iBAAO,EACf,EACF;;;IANsB,iDAAiC;;;IAU3D,4BAA2H;;;;;IAAvE,AAAtC,uDAAqC,yEAAwD;;;IAZjH,8BAA4C;IAC1C,0GAA0B;IAS1B,+BAAgF;IAC9E,oHAEC;IAEL,AADE,iBAAM,EACF;;;IAdJ,cAQC;IARD,oDAQC;IACsB,cAAwD;IAAxD,+EAAwD;IAC7E,cAEC;IAFD,yCAEC;;;IAiCG,4BAA6G;;;;;IAA/D,AAAhC,iDAA+B,iEAAgD;;;IAD/F,0HAAuC;;;;IAAvC,qEAEC;;;IAGD,+BAA+B;IAAA,2EAAsD;IAAA,iBAAM;;;IAoB3F,4BAA2H;;;;;IAAvE,AAAtC,uDAAqC,yEAAwD;;;;IAzC/G,AADF,+BAA6C,cAMH;IAAnC,AADA,AADA,AADA,2LAAS,sBAAe,KAAC,0LACb,oCAA6B,KAAC,sLAC7B,mBAAY,cAAc,CAAC,KAAC,kLACjC,gCAAyB,KAAC;IACrC,+BAA2B;IACzB,wBAAoC;IACpC,4BAAM;IAAA,uBAAO;IACf,AADe,iBAAO,EAChB;IACN,kCAA2F;IAAxD,oMAAS,oBAAa,IAAI,SAAS,KAAC;IACrE,wBAAkC;IAEtC,AADE,iBAAS,EACL;IACN,+BAA0D;IACxD,6GAIC;IACD,4GAA+B;IAInC,AADE,iBAAM,EACF;IAGN,gCAIsC;IAAjC,AADA,AADA,wMAAY,kCAA2B,KAAC,uLAC3B,mBAAY,WAAW,CAAC,KAAC,mLAC9B,8BAAuB,KAAC;IAEnC,gCAA6F;IAA5B,4LAAS,wBAAiB,KAAC;IAC1F,gCAA2B;IACzB,yBAAoC;IACpC,6BAAM;IAAA,aAAsD;IAEhE,AADE,AAD8D,iBAAO,EAC/D,EACF;IACN,gCAA4D;IAC1D,sHAEC;IAEL,AADE,iBAAM,EACF;;;IA5CwB,cAAkC;IACzD,AADuB,kDAAkC,yDACF;IAarC,eAAkC;IAAlC,kDAAkC;IACvD,cAIC;IAJD,gCAIC;IACD,eAEC;IAFD,0DAEC;IAMA,cAAoD;IAApD,oEAAoD;IAK3B,cAAoC;IAApC,oDAAoC;IAGtD,eAAsD;IAAtD,6EAAsD;IAGzC,cAAoC;IAApC,oDAAoC;IACzD,cAEC;IAFD,4CAEC;;;;IAOD,+BAAuG;IAAjC,0MAAS,6BAAsB,KAAC;IACpG,+BAA2B;IACzB,wBAAoC;IACpC,4BAAM;IAAA,wBAAQ;IAElB,AADE,AADgB,iBAAO,EACjB,EACF;;;IALsB,yDAAyC;;;IASnE,4BAA2H;;;;;IAAvE,AAAtC,uDAAqC,yEAAwD;;;IAXjH,8BAA6B;IAC3B,0GAA0B;IAQ1B,+BAAwF;IACtF,oHAEC;IAEL,AADE,iBAAM,EACF;;;IAbJ,cAOC;IAPD,oDAOC;IACsB,cAAgE;IAAhE,uFAAgE;IACrF,cAEC;IAFD,2CAEC;;;;IAUP,kCAA2D;IAA3B,8LAAS,uBAAgB,KAAC;IACxD,wBAA4C;IAC5C,gCAAoC;IAAA,YAAsD;IAAA,iBAAO;IACjG,wBAA0D;IAC5D,iBAAS;;;IAF6B,eAAsD;IAAtD,oFAAsD;;;IAoC1F,gCAEiC;IAC/B,wBAA+C;IACjD,iBAAO;;;IASH,4BAA8G;;;;;IAAhE,AAAhC,iDAA+B,kEAAiD;;;IADhG,uIAAwC;;;;IAAxC,sEAEC;;;IAGD,4BAAkJ;;;;;;IAA9F,AAAtC,uDAAqC,6FAA+E;;;IAGlI,+BAA6E;IAAA,qDAAgC;IAAA,iBAAM;;;IAApF,8DAA6C;;;IAVhF,+BAA6B;IAC3B,0HAIC;IACD,kIAEC;IACD,wHAA6C;IAG/C,iBAAM;;;;IAXJ,cAIC;IAJD,gCAIC;IACD,eAEC;IAFD,qCAEC;IACD,eAEC;IAFD,2EAEC;;;;IAjDL,+BAYiC;IAD5B,AADA,AADA,AADA,AADA,AADA,AADA,oOAAa,0CAA+B,KAAC,kLAClC,wBAAiB,KAAC,yMACpB,wCAA6B,KAAC,qNAC3B,oDAAyC,KAAC,iNACzC,uCAA4B,KAAC,6MAClC,6CAAkC,KAAC,2NAC5B,oDAAyC,KAAC;IAG5D,AADA,wBAAwG,QACS;IACjH,gCAA0B;IAAA,YAAuB;IAAA,iBAAO;IASxD,2GAAiC;IAUjC,2BAAmC;IACnC,gCAA2B;IAAA,YAAqB;IAClD,AADkD,iBAAO,EACnD;IACN,0GAAyC;;;;IAlCpC,8DAA6C;IAD7C,AADA,4EAAwD,4DACF;IAUtD,AARA,gCAAkB,gCAQS;IACiB,cAAoD;IAApD,wEAAoD;IAChG,cAA8D;IAA9D,cAAA,+EAA8D,CAAA;IAAC,uDAA0C;IAClF,eAAuB;IAAvB,2CAAuB;IASjD,cASC;IATD,wDASC;IAE0B,eAAqB;IAArB,yCAAqB;IAElD,cAcC;IAdD,uEAcC;;;IAkCK,+BAAyC;IACvC,wBAAuC;IACzC,iBAAM;;;IAUJ,wBACmD;;;;IAAhD,oEAA2C;;;;IA1CtD,+BAiBqE;IAAhE,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,AADA,6OAAa,wDAA6C,KAAC,mLAChD,8BAAuB,KAAC,8NACvB,0DAA+C,KAAC,0NAC/C,mBAAY,iDAAsC,CAAC,KAAC,sNACzD,sDAA2C,KAAC,oOACrC,iDAAsC,KAAC,iMACvC,+BAAwB,KAAC,uLAC3B,wBAAiB,KAAC,+LACd,wBAAiB,KAAC,wNAC1B,wDAA6C,KAAC,oOACxC,0DAA+C,KAAC;IAClE,kCAM2D;IAAnD,wOAAS,mDAAwC,KAAC;IACxD,wBAA4B;IAC9B,iBAAS;IACT,+BAAuC;IACrC,2GAAuC;IAKvC,+BAA2B;IACzB,4CAAkF;IAEtF,AADE,iBAAM,EACF;IAEJ,AADF,+BAA+H,cAC9F;IAC7B,YACA;IAAA,2GAAoC;IAItC,iBAAM;IACN,gCAAkC;IAAA,aAA8B;IAClE,AADkE,iBAAM,EAClE;IAEJ,AADF,gCAAkC,kBAC0D;IAAjE,yOAAS,4CAAiC,KAAC;IAClE,yBAA+B;IAGrC,AADE,AADE,iBAAS,EACL,EACF;;;;;IA/CD,0EAAqD;IADrD,AADA,AADA,AADA,uEAAmD,6DACI,2DACF,6DACE;IAEvD,8DAAqC;IAiBhC,cAAuC;IAAvC,uDAAuC;IAHvC,0EAAsD;;IAQ5D,eAIC;IAJD,qEAIC;IAEwB,eAAkC;IAAlC,oDAAkC;IAG9B,cAA+F;IAA/F,yHAA+F;IAE1H,eACA;IADA,sDACA;IAAA,cAGC;IAHD,mEAGC;IAE+B,eAA8B;IAA9B,kDAA8B;;;;IA2CxD,kCAEoD;IAA5C,oPAAS,4CAAiC,KAAC;IACjD,oBAA+F;IAC/F,4BAAM;IAAA,YAAoB;IAC5B,AAD4B,iBAAO,EAC1B;;;;IAJD,2DAA0C;IADxB,0EAAsD;IAG3E,cAA+C;IAA/C,cAAA,4DAA+C,CAAA;IAAC,oDAAuC;IACpF,eAAoB;IAApB,wCAAoB;;;;IAfhC,kCAAkE;IAAnC,2NAAS,+BAAwB,KAAC;IAC/D,wBAAmC;IACnC,4BAAM;IAAA,8BAAc;IACtB,AADsB,iBAAO,EACpB;IACT,0BAAgC;IAE9B,AADF,+BAA8B,iBACiF;IAApC,qNAAS,2BAAoB,IAAI,CAAC,KAAC;IAC1G,wBAA4B;IAC5B,4BAAM;IAAA,yBAAS;IACjB,AADiB,iBAAO,EACf;IACT,uIAOC;IACH,iBAAM;IACN,2BAAgC;IAChC,mCAAmE;IAAzC,4NAAS,qCAA8B,KAAC;IAChE,yBAAkC;IAClC,6BAAM;IAAA,iCAAkB;IAC1B,AAD0B,iBAAO,EACxB;;;IAjBmB,eAA8C;IAA9C,8DAA8C;IAIxE,eAOC;IAPD,iCAOC;;;;IASD,+BAAiC;IAAA,YAAyC;IAAA,iBAAM;IAChF,kCAEsF;IAF5D,mOAAS,wBAAiB,IAAI,CAAC,KAAC;IAGxD,wBAAgC;IAChC,4BAAM;IAAA,mBAAG;IACX,AADW,iBAAO,EACT;IACT,kCAEsF;IAF5D,mOAAS,wBAAiB,KAAK,CAAC,KAAC;IAGzD,yBAA6C;IAC7C,4BAAM;IAAA,qBAAK;IACb,AADa,iBAAO,EACX;;;IAZwB,cAAyC;IAAzC,yEAAyC;IAElE,cAA+C;IAA/C,2EAA+C;;IAM/C,eAA+C;IAA/C,2EAA+C;;;;;IAMvD,kCAEsF;IAF5D,mOAAS,yBAAkB,KAAC;IAGpD,wBAAgC;IAChC,4BAAM;IAAA,YAA0D;IAClE,AADkE,iBAAO,EAChE;;;IAJD,2EAA+C;;IAG/C,eAA0D;IAA1D,mIAA0D;;;;IAkBlE,kCAAoD;IAA1B,oOAAS,sBAAe,KAAC;IACjD,yBAA2B;IAC3B,4BAAM;IAAA,sBAAM;IACd,AADc,iBAAO,EACZ;;;;IA1BT,AAdF,sHAAsC,6GAc7B;IAQT,kCAEsF;IAF5D,2NAAS,8BAAuB,KAAC;IAGzD,wBAAkC;IAClC,4BAAM;IAAA,8BAAc;IAAA,iBAAO;IAC3B,wBAAkD;IACpD,iBAAS;IACT,kCAGoF;IAF5E,qNAAS,qBAAc,KAAC;IAG9B,wBAAgC;IAChC,4BAAM;IAAA,aAAyG;IACjH,AADiH,iBAAO,EAC/G;IACT,qIAAwC;IAMxC,2BAAgC;IAChC,mCAA2D;IAA1B,sNAAS,sBAAe,KAAC;IACxD,yBAA4B;IAC5B,6BAAM;IAAA,aAAwF;IAChG,AADgG,iBAAO,EAC9F;;;IA9CT,+DAqBC;IAEO,eAA+C;IAA/C,2EAA+C;;IAQ/C,eAA8C;IAA9C,0EAA8C;;IAG9C,eAAyG;IAAzG,uIAAyG;IAEjH,cAKC;IALD,mEAKC;IAIO,eAAwF;IAAxF,sHAAwF;;;IA9ChG,AAzBF,wGAAyB,kFAyBhB;;;IAzBT,kDAyEC;;;;IAGD,kCAAmE;IAAzC,6MAAS,qCAA8B,KAAC;IAChE,wBAAkC;IAClC,4BAAM;IAAA,6BAAa;IACrB,AADqB,iBAAO,EACnB;IACT,kCAA8D;IAApC,6MAAS,gCAAyB,KAAC;IAC3D,yBAA0B;IAC1B,4BAAM;IAAA,sBAAM;IACd,AADc,iBAAO,EACZ;IACT,0BAAgC;IAChC,kCAAuE;IAAtC,6MAAS,kCAA2B,KAAC;IACpE,yBAA4B;IAC5B,6BAAM;IAAA,uBAAM;IACd,AADc,iBAAO,EACZ;;;;IAGT,kCAA6D;IAAnC,uMAAS,+BAAwB,KAAC;IAC1D,wBAA2B;IAC3B,4BAAM;IAAA,gCAAgB;IACxB,AADwB,iBAAO,EACtB;IACT,kCAAoE;IAA1C,6MAAS,sCAA+B,KAAC;IACjE,wBAAkC;IAClC,4BAAM;IAAA,0BAAU;IAClB,AADkB,iBAAO,EAChB;IACT,0BAAgC;IAChC,kCAAuD;IAA7B,uMAAS,yBAAkB,KAAC;IACpD,0BAAmC;IACnC,6BAAM;IAAA,2BAAU;IAClB,AADkB,iBAAO,EAChB;;;;IA9Gf,kCAIuE;IAAlE,AADA,wHAAS,wBAAwB,IAAC,wIACnB,uBAAuB,wBAAE,wBAAwB,KAAC;IA6FlE,AAfA,AA5EA,yFAAwB,oEA4EN,oEAeR;IAgBd,iBAAM;;;;IA/GD,AADA,kDAA+B,mCACD;IAGjC,eA2GC;IA3GD,yDAAA,cAAc,mBAAd,QAAQ,SA2GP;;AA/eT,qEAAqE;AACrE,MAAM,8BAA8B,GAAG,sCAAsC,CAAC;AAwsC9E,MAAM,OAAO,yBAAyB;IAsM1B;IACA;IACA;IACA;IACA;IAzMD,aAAa,CAAU;IACvB,WAAW,CAAY;IACvB,sBAAsB,GAAkB,IAAI,CAAC;IAC7C,qBAAqB,GAAkB,IAAI,CAAC;IAC5C,eAAe,GAAY,IAAI,CAAC,CAAC,yDAAyD;IAC1F,YAAY,GAAY,KAAK,CAAC,CAAC,2CAA2C;IAEnF,wEAAwE;IACxE;4EACwE;IACxE,IACI,UAAU,CAAC,KAAc;QAC3B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,gCAAgC;QACzD,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IACD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACO,WAAW,GAAG,IAAI,CAAC;IAC3B,0CAA0C;IACjC,yBAAyB,GAAY,IAAI,CAAC;IACnD,mFAAmF;IAC1E,cAAc,GAAY,IAAI,CAAC;IACxC;;;;oDAIgD;IACvC,kBAAkB,GAAY,IAAI,CAAC;IAElC,oBAAoB,GAAG,IAAI,YAAY,EAAU,CAAC;IAC5D;;;;;;OAMG;IACO,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC;IACjD,mBAAmB,GAAG,IAAI,YAAY,EAAU,CAAC,CAAC,oCAAoC;IAChG;;;;;;OAMG;IACO,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,oCAAoC;IACpF,wBAAwB,GAAG,IAAI,YAAY,EAAQ,CAAC;IAC9D;;;;;;OAMG;IACO,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC;IACzD,mBAAmB,GAAG,IAAI,YAAY,EAAQ,CAAC,CAAC,yBAAyB;IACnF;;;;;;OAMG;IACO,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,yBAAyB;IACzE,qBAAqB,GAAG,IAAI,YAAY,EAAQ,CAAC,CAAC,sCAAsC;IAClG;;;;;;OAMG;IACO,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,sCAAsC;IAC1F,gBAAgB,GAAG,IAAI,YAAY,EAAQ,CAAC,CAAC,0DAA0D;IACjH;;;;;;OAMG;IACO,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,0DAA0D;IAE9G;;;;OAIG;IACO,eAAe,GAAG,IAAI,YAAY,EAAU,CAAC;IAEhD,sBAAsB,GAAY,IAAI,CAAC;IACvC,cAAc,GAAY,IAAI,CAAC;IAC/B,eAAe,GAAY,IAAI,CAAC;IAChC,iBAAiB,GAAY,IAAI,CAAC;IACzC,qEAAqE;IAC9D,WAAW,GAA2B,IAAI,CAAC;IAElD,0EAA0E;IACnE,iBAAiB,GAAY,KAAK,CAAC;IAE1C,8EAA8E;IACvE,aAAa,GAA2B,EAAE,CAAC;IAC3C,WAAW,GAAkB,IAAI,CAAC;IAClC,iBAAiB,GAAY,KAAK,CAAC;IACnC,YAAY,GAAG,IAAI,gCAAgC,CAAC,8BAA8B,CAAC,CAAC;IACpF,wBAAwB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC7C,eAAe,GAAY,KAAK,CAAC;IACjC,uBAAuB,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnD,yEAAyE;IACjE,iBAAiB,GAAkB,IAAI,CAAC;IAEhD,8DAA8D;IAC9C,kBAAkB,GAAG,wEAAwE,CAAC;IAE9G,yEAAyE;IACzD,mBAAmB,GAAG,oEAAoE,CAAC;IAE3G,qEAAqE;IAC7D,MAAM,CAAU,gBAAgB,GAAG,GAAG,CAAC;IAE/C,8FAA8F;IACtF,MAAM,CAAU,wBAAwB,GAAG,EAAE,CAAC;IAEtD,2EAA2E;IACnE,MAAM,CAAU,kBAAkB,GAAG,CAAC,CAAC;IAE/C,+DAA+D;IACvD,SAAS,GAKN,IAAI,CAAC;IAEhB,kGAAkG;IAC1F,kBAAkB,GAAG,OAAO,CAAC;IAErC,yFAAyF;IACjF,kBAAkB,GAAG,KAAK,CAAC;IAE5B,gBAAgB,GAAY,KAAK,CAAC;IAElC,YAAY,GAAY,KAAK,CAAC;IAEH,WAAW,CAAgC;IACzC,aAAa,CAA2B;IAE5E,+EAA+E;IACvE,MAAM,CAAU,cAAc,GAAG,iCAAiC,CAAC;IAE3E,qFAAqF;IAC9E,OAAO,GAAwB,SAAS,CAAC;IAEhD,oDAAoD;IAC7C,MAAM,GAAuB,MAAM,CAAC;IAE3C,qCAAqC;IAC9B,aAAa,GAA8B,MAAM,CAAC;IAEzD,0EAA0E;IAClE,MAAM,CAAU,qBAAqB,GAA0D;QACrG,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,KAAK;KACZ,CAAC;IAEF,oFAAoF;IAC7E,mBAAmB,GAA2B,EAAE,CAAC;IACjD,qBAAqB,GAA2B,EAAE,CAAC;IACnD,sBAAsB,GAA2B,EAAE,CAAC;IACpD,UAAU,GAAiB,EAAE,CAAC;IACrC,2EAA2E;IACpE,WAAW,GAAiB,EAAE,CAAC;IAEtC,+EAA+E;IACvE,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/C,2BAA2B;IAC3B,sGAAsG;IAC/F,sBAAsB,GAAa,EAAE,CAAC;IACtC,eAAe,GAAkB,IAAI,CAAC;IACtC,gBAAgB,GAAkB,IAAI,CAAC;IAEtC,YAAY,GAAW,EAAE,CAAC;IAE1B,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;IAE/B,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC;IAE7C,wCAAwC;IACjC,SAAS,GAAY,KAAK,CAAC;IAElC,YACU,aAA4B,EAC5B,mBAAwC,EACxC,kBAAsC,EACtC,eAAgC,EAChC,GAAsB;QAJtB,kBAAa,GAAb,aAAa,CAAe;QAC5B,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,oBAAe,GAAf,eAAe,CAAiB;QAChC,QAAG,GAAH,GAAG,CAAmB;IAC7B,CAAC;IAEJ,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IACD,IAAI,WAAW,CAAC,KAAa;QAC3B,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAED,2CAA2C;IAC3C,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,mFAAmF;IACnF,cAAc;QACZ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,qDAAqD;IAC9C,WAAW;QAChB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;IAC1C,CAAC;IAED,2EAA2E;IACpE,eAAe,CAAC,KAAoB;QACzC,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/C,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,aAAqC;QAC/D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QACnD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC9B,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CACpD,CAAC;IACJ,CAAC;IAED,QAAQ;QACN,gEAAgE;QAChE,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,2CAA2C;QAC3C,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAE3E,8EAA8E;QAC9E,6EAA6E;QAC7E,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAC7B,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CACxB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,4DAA4D;QAC5D,IAAI,CAAC,kBAAkB,CAAC,yBAAyB,CAAC,IAAI,CACpD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE;YAC5B,IAAI,CAAC,wBAAwB,GAAG,eAAe,CAAC;YAChD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,iEAAiE;QAC7F,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAC3B,CAAC;IAED,yGAAyG;IACjG,yBAAyB;QAC/B,IAAI,CAAC,qCAAqC,EAAE,CAAC;QAC7C,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAGD,eAAe;QACb,oCAAoC;QACpC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAGD,gBAAgB;QACd,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEM,gBAAgB,CAAC,KAAY;QAClC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACjD,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAEM,oBAAoB,CAAC,KAAY;QACtC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,2BAA2B,CAAC,KAAY;QACnD,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAE9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAChF,mEAAmE;YACnE,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACxD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,oDAAoD,CAAC,CAAC;QAChG,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEM,iBAAiB,CAAC,KAAY;QACnC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAEM,mBAAmB,CAAC,KAAY;QACrC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAEM,oBAAoB;QACzB,IAAI,CAAC,sBAAsB,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC;QAC3D,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAEM,YAAY;QACjB,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC;QAC3C,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;QAC7C,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACjD,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAED,2EAA2E;IAC3E,kBAAkB;IAClB,2EAA2E;IAE3E;;;OAGG;IACH;;;;OAIG;IACI,OAAO,CAAC,KAAyB;QACtC,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,aAAa,GAAG,yBAAyB,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,uFAAuF;IAChF,QAAQ,CAAC,KAAyB;QACvC,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC1B,OAAO,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QACnD,CAAC;QACD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAChF,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAChF,CAAC;IAED;;;OAGG;IACK,iBAAiB,CAAC,aAAqC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACtC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACnC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;oBACrB,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,CAAC;gBACD,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;YACjF,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,8FAA8F;IACtF,mBAAmB,CAAC,KAAe,EAAE,cAA6B;QACxE,IAAI,CAAC,cAAc;YAAE,OAAO,CAAC,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,WAAW,CAAC,YAAkC;QACpD,MAAM,SAAS,GAAG,YAAY,CAAC,cAAc,CAAC;QAC9C,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAEO,aAAa;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC7F,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC,qBAAqB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAE/D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QACtC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnE,yEAAyE;QACzE,yEAAyE;QACzE,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAkC,CAAC;QACzE,MAAM,SAAS,GAA2B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5D,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAClD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACZ,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QAExC,2EAA2E;QAC3E,kDAAkD;QAClD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoC,CAAC;QACrE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/D,MAAM,GAAG,GAAG,QAAQ,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;YACnE,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACZ,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,SAAwB,EAAE,KAAa,EAAgB,EAAE;YACtE,MAAM,eAAe,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC9D,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBACvD,MAAM,aAAa,GAAG,sBAAsB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5E,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC/F,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;gBAClF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;YAChF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;IAEO,cAAc,CAAC,KAAmB;QACxC,MAAM,GAAG,GAAiB,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,cAAc,CAAC,KAAmB,EAAE,SAAiB;QAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAC;YACxD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC5D,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,gBAAgB,CAAC,SAAiB;QACvC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IAChE,CAAC;IAEM,YAAY,CAAC,SAAiB;QACnC,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/D,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;YACzF,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAK5B,CAAC;YACF,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzF,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC9D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAChC,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACzD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,CAAC;YACD,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK,IAAI,MAAM,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;gBACtE,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAC9C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CAAC;QACH,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACjG,CAAC;IAED,2EAA2E;IAC3E,uDAAuD;IACvD,2EAA2E;IAE3E;;;;;OAKG;IACI,uBAAuB,CAAC,YAAkC,EAAE,KAAgB;QACjF,IAAI,IAAI,CAAC,kBAAkB,KAAK,OAAO,EAAE,CAAC;YACxC,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7E,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC;YAC1C,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,KAAK,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC;YAC1C,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAEM,qBAAqB;QAC1B,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAEM,iBAAiB,CAAC,IAAgB,EAAE,KAAgB;QACzD,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,KAAK,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC;YAC1C,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAEM,gBAAgB,CAAC,SAAiB,EAAE,KAAgB;QACzD,6EAA6E;QAC7E,gFAAgF;QAChF,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC;YACpD,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,CAAC,eAAe;gBACpB,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC;gBACzC,CAAC,CAAC,KAAK,CAAC;QACZ,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,YAAY;YAAE,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;QAC/D,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACI,wBAAwB,CAAC,YAAkC;QAChE,IAAI,CAAC,YAAY,CAAC,SAAS;YAAE,OAAO,WAAW,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,SAAU,CAAC,CAAC,CAAC;QAC3F,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAC9C,CAAC;IAED;;;;OAIG;IACI,yBAAyB,CAAC,YAAkC,EAAE,KAAgB;QACnF,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrD,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;YAAE,OAAO;QACpF,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,YAAY;YAAE,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;QAC/D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAAC,YAAkC,EAAE,KAAgB;QACrF,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;QACnG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;QACjC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAEM,mBAAmB,CAAC,KAAgB;QACzC,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrD,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,YAAY;YAAE,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;QAC/D,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;IACtC,CAAC;IAED,4FAA4F;IACrF,qBAAqB,CAAC,KAAgB;QAC3C,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAClC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,YAAY;YAAE,KAAK,CAAC,YAAY,CAAC,UAAU,GAAG,MAAM,CAAC;QAC/D,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC;IACzC,CAAC;IAEM,WAAW,CAAC,QAAgB;QACjC,IAAI,IAAI,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;YACvC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,OAAwB,EAAE,KAAgB;QAClE,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;QACtC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,QAAQ,IAAI,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,KAAgB;QAC3C,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC;QACpD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;QACjC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAEM,iBAAiB,CAAC,KAAgB;QACvC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;QACtC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,uBAAuB,CAAC,QAAgB,EAAE,YAA2B,IAAI,CAAC,eAAe;QAC/F,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAC7B,IAAI,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,6EAA6E;IACrE,cAAc,CAAC,MAAc,EAAE,UAAkB;QACvD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,IAAI,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,OAAO,OAAO,EAAE,QAAQ,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,MAAM,CAAC,iCAAiC;YACpE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,IAAI,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnD,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sFAAsF;IAC9E,KAAK,CAAC,gBAAgB,CAAC,cAAsB,EAAE,SAAwB;QAC7E,MAAM,IAAI,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,iBAAiB,CAAC,eAAyB,EAAE,SAAwB;QACjF,6EAA6E;QAC7E,oEAAoE;QACpE,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEhC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kCAAkC,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACzG,mEAAmE;YACnE,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAC5B,OAAO,EACP,2CAA2C,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAC/F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,mFAAmF;IAC3E,WAAW,CAAC,cAAsB,EAAE,SAAwB;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QAChC,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC;QAC/C,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5E,CAAC;IAED,4FAA4F;IACpF,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,QAAuB;QAChE,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;QAC/C,MAAM,UAAU,GAAG,CAAC,aAAa,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC;YAC9D,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzE,IAAI,UAAU;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5E,uDAAuD;YACvD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,0CAA0C,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,gEAAgE;IAChE,2EAA2E;IAE3E;;;;OAIG;IACI,yBAAyB,CAAC,YAAkC,EAAE,KAAiB;QACpF,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,kBAAkB,KAAK,OAAO,EAAE,CAAC;YACxC,gFAAgF;YAChF,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/D,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC;YAC1C,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACjH,CAAC;IAED,yEAAyE;IAClE,WAAW,CAAC,YAAkC,EAAE,KAAiB;QACtE,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/D,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC;YAC1C,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAChH,CAAC;IAEM,mBAAmB,CAAC,OAAwB,EAAE,KAAiB;QACpE,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACxH,CAAC;IAED,qFAAqF;IAC9E,uBAAuB,CAAC,KAAiB;QAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B,CAAC;QAClD,IAAI,MAAM,EAAE,OAAO,CAAC,iCAAiC,CAAC;YAAE,OAAO;QAC/D,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACzH,CAAC;IAED,+EAA+E;IACvE,aAAa,CAAC,KAAiB;QACrC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC;IAED,0FAA0F;IAClF,YAAY,CAAC,KAAiB;QACpC,MAAM,IAAI,GAAI,KAAK,CAAC,aAAoC,EAAE,qBAAqB,EAAE,CAAC;QAClF,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;IACxE,CAAC;IAEO,eAAe,CACrB,IAAiD,EACjD,MAAkB,EAClB,gBAAgB,GAAG,KAAK;QAExB,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACjE,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACK,wBAAwB;QAC9B,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,wCAAwC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC;QACtD,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC;QAC9D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,MAAM,MAAM,GAAG,yBAAyB,CAAC,kBAAkB,CAAC;QAE5D,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC;YACzC,CAAC,GAAG,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QAEnF,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEM,gBAAgB;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjC,CAAC;IAEM,eAAe,CAAC,KAAY;QACjC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAEM,gBAAgB,CAAC,KAAY;QAClC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAED,+FAA+F;IACxF,sBAAsB,CAAC,SAAwB;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC;QACpD,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1E,OAAO,SAAS;YACd,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,IAAI,UAAU,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC;YAC3E,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC;IAC9B,CAAC;IAED,iFAAiF;IACzE,eAAe;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACjF,CAAC;IAEM,mBAAmB,CAAC,SAAwB;QACjD,KAAK,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAEM,sBAAsB,CAAC,KAAY;QACxC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACzF,CAAC;IAEM,gBAAgB,CAAC,QAAiB;QACvC,KAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEM,gBAAgB;QACrB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC;QACpD,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1B,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,gFAAgF;IACzE,YAAY;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,GAAa;QACtC,MAAM,aAAa,GAAG,GAAG;aACtB,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;aAC1C,MAAM,CAAC,CAAC,CAAC,EAA6B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QACxD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvC,UAAU,EAAE,CAAC,CAAC,EAAE;YAChB,YAAY,EAAE,CAAC,CAAC,IAAI,IAAI,cAAc;YACtC,WAAW,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;YAC7B,gBAAgB,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK;YACjC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,IAAI;SAC5C,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,WAAW,GAAG,OAAO,GAAG,CAAC;YAC5B,CAAC,CAAC,GAAG,OAAO,OAAO,aAAa,CAAC,MAAM,eAAe,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,GAAG;YAC9F,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAChC,CAAC;IAED,qFAAqF;IAC9E,WAAW,CAAC,GAAa;QAC9B,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IAEO,QAAQ,CAAC,YAA8C;QAC7D,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QACrD,OAAO,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,8FAA8F;IACvF,YAAY,CAAC,GAAa;QAC/B,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;YACnB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,sGAAsG;IAC/F,SAAS,CAAC,YAAkC;QACjD,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAEM,mBAAmB,CAAC,OAAkC;QAC3D,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEM,aAAa;QAClB,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC;QACpD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,YAAY;YAAE,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC;IAEM,aAAa;QAClB,KAAK,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACtC,CAAC;IAEM,sBAAsB,CAAC,KAAY;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;QACxC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,MAAM;YAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAEM,iBAAiB,CAAC,KAAY;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;QACxC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,MAAM;YAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAEM,mBAAmB,CAAC,KAAY;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;QACxC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,MAAM;YAAE,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAEM,sBAAsB;QAC3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAEM,uBAAuB,CAAC,KAAY;QACzC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAEM,gBAAgB;QACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,2EAA2E;IAC3E,uDAAuD;IACvD,2EAA2E;IAEpE,YAAY,CAAC,QAAuB,EAAE,KAAa;QACxD,IAAI,KAAK;YAAE,KAAK,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAEM,UAAU,CAAC,OAAwB,EAAE,KAAa;QACvD,IAAI,KAAK;YAAE,KAAK,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAEO,eAAe,CACrB,OAA+B,EAC/B,QAAuB,EACvB,SAA8C;QAE9C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAC1C,OAAO,EAAE,yBAAyB;YAClC,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAQ,CAAC,QAAgD,CAAC;QACrF,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC;QAC/B,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAC5C,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACxC,IAAI,OAAO;YAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;QACxC,IAAI,QAAQ;YAAE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAE3C,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAsB,EAAE,EAAE;YACzD,yEAAyE;YACzE,uEAAuE;YACvE,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,SAAS;gBAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,OAAwB,EAAE,KAAa;QAC/D,IAAI,KAAK;YAAE,KAAK,CAAC,eAAe,EAAE,CAAC;QAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,EAAE,UAAU,IAAI,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;QAE9C,IAAI,OAAO,GAAG,+CAA+C,OAAO,CAAC,IAAI,IAAI,CAAC;QAC9E,IAAI,KAAK,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,0DAA0D,CAAC;YACtE,OAAO,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5E,OAAO,IAAI,sBAAsB,CAAC;QACpC,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YACjD,KAAK,EAAE,eAAe;YACtB,OAAO;YACP,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,QAAQ;YACpB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9D,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAC5B,OAAO,EACP,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,4CAA4C,CACtF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oBAAoB,CAAC,YAAkC;QACrD,OAAO,UAAU,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAClE,CAAC;IAED,0EAA0E;IAC1E,sBAAsB,CAAC,YAAkC;QACvD,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,qBAAqB,CAAC,YAAkC;QACtD,OAAO,UAAU,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACjE,CAAC;IAED,sBAAsB,CAAC,YAAkC;QACvD,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,kBAAkB,CAAC,YAAkC;QACnD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAChD,yDAAyD;QACzD,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,4DAA4D;QAC5D,6DAA6D;QAC7D,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,YAAkC;QACzD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;gBAC5C,KAAK,EAAE,mBAAmB;gBAC1B,OAAO,EAAE,uDAAuD;gBAChE,UAAU,EAAE,mBAAmB;gBAC/B,UAAU,EAAE,YAAY,CAAC,IAAI,IAAI,EAAE;gBACnC,WAAW,EAAE,iBAAiB;gBAC9B,QAAQ,EAAE,IAAI;gBACd,gBAAgB,EAAE,aAAa;gBAC/B,gBAAgB,EAAE,YAAY,CAAC,WAAW,IAAI,EAAE;gBAChD,sBAAsB,EAAE,sBAAsB;gBAC9C,mBAAmB,EAAE,KAAK;gBAC1B,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACnE,MAAM,cAAc,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;gBAElG,IAAI,OAAO,KAAK,YAAY,CAAC,IAAI,IAAI,cAAc,KAAK,YAAY,CAAC,WAAW,EAAE,CAAC;oBACjF,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAChC,YAAY,CAAC,EAAE,EACf,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,IAAI,EAAE,EAAE,EACpD,IAAI,CAAC,WAAW,CACjB,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,kDAAkD,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,YAAkC;QACzD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;gBACjD,KAAK,EAAE,qBAAqB;gBAC5B,OAAO,EAAE,oCAAoC,YAAY,CAAC,IAAI,kCAAkC;gBAChG,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE,QAAQ;aACrB,CAAC,CAAC;YAEH,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACzB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,kDAAkD,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,YAAkC,EAAE,KAAa;QAC/D,IAAI,KAAK;YAAE,KAAK,CAAC,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,iEAAiE;QAC1F,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,qDAAqD,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED,cAAc,CAAC,cAAsB;QACnC,OAAO,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,CAAC;IAED,oFAAoF;IACpF,cAAc,CAAC,YAAkC;QAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;IAC/D,CAAC;IAED,uEAAuE;IACvE,mBAAmB,CAAC,YAAkC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI;YAAE,OAAO,iBAAiB,CAAC;QACpC,OAAO,aAAa,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC;IAClE,CAAC;IAED,mBAAmB;QACjB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,qBAAqB,CAAC,KAAiB;QAC5C,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAElC,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B,CAAC;QAClD,IAAI,MAAM,EAAE,OAAO,CAAC,0DAA0D,CAAC;YAAE,OAAO;QAExF,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAChC,CAAC;IAED,iEAAiE;IAC1D,cAAc;QACnB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,oEAAoE;IAC5D,wBAAwB;QAC9B,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,mGAAmG;IAC3F,kBAAkB,CAAC,cAAsB;QAC/C,IAAI,CAAC,2BAA2B,CAAC,cAAc,CAAC,CAAC;QACjD,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC;QACxC,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACK,2BAA2B;QACjC,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACpD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,mFAAmF;IAC3E,qCAAqC;QAC3C,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACpD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,mFAAmF;IAC3E,mBAAmB,CAAC,YAAiD;QAC3E,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC1D,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACK,iCAAiC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC;QAC3C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAC5B,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,oGAAoG;IAC5F,sBAAsB;QAC5B,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,CAAC,QAAiB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,IAAI,QAAQ,CAAC;QAEhF,IAAI,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACrC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1D,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,mEAAmE;gBACnE,MAAM,IAAI,GAAG,CAAC,KAAmB,EAAQ,EAAE;oBACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;4BAAE,SAAS;wBACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBACpB,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;aAAM,IAAI,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACpD,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACK,aAAa,CAAC,cAAsB;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAC5D,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,sBAAsB,CAAC;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,sEAAsE;YACtE,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACjD,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAEtC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9D,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,2BAA2B,CAAC,cAAsB;QAChD,IAAI,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,sGAAsG;IACtG,SAAS;QACP,IAAI,CAAC,sBAAsB,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YACzC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,SAAwB,EAAE,MAAgB,IAAI,CAAC,eAAe,EAAE;QACrF,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kCAAkC,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACtG,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,8DAA8D,CAAC,CAAC;QAC1G,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,aAAa,CAAC,QAAiB,EAAE,MAAgB,IAAI,CAAC,eAAe,EAAE;QAC3E,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3F,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,gDAAgD,CAAC,CAAC;QACnI,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED,wFAAwF;IAChF,KAAK,CAAC,iBAAiB,CAC7B,MAA4F,EAC5F,IAAY;QAEZ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEvC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAC5B,iBAAiB,EACjB,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,gBAAgB,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO;YACnG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,iBAAiB,IAAI,KAAK,WAAW,EAAE,CAC/D,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,uBAAuB,CAAC,MAAgB,IAAI,CAAC,eAAe,EAAE;QAClE,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO;QAExB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YACjD,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE,mCAAmC,KAAK,gBAAgB,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,iCAAiC;YACtH,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACpF,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9C,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACnC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,mDAAmD,CAAC,CAAC;QAC/F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,wFAAwF;IAChF,KAAK,CAAC,mBAAmB,CAC/B,MAA4F,EAC5F,KAAa;QAEb,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACvC,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAC5B,eAAe,EACf,eAAe,KAAK,sEAAsE,CAC3F,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAC5B,iBAAiB,EACjB,WAAW,MAAM,CAAC,UAAU,CAAC,MAAM,OAAO,KAAK,qBAAqB;YACpE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,0BAA0B,WAAW,EAAE,CAC/D,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,wEAAwE;IACxE,2EAA2E;IAE3E,oEAAoE;IACpE,IAAW,WAAW;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClD,CAAC;IAED,wGAAwG;IACjG,oBAAoB;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjF,CAAC;IAED,+EAA+E;IACxE,YAAY;QACjB,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACzE,CAAC;IAEM,QAAQ;QACb,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;IAEM,SAAS;QACd,KAAK,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,8EAA8E;IACvE,eAAe,CAAC,KAAiB;QACtC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,0DAA0D;QACnF,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;QAC7B,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3F,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3H,CAAC;IAED,2EAA2E;IAC3E,2CAA2C;IAC3C,2EAA2E;IAE3E;;;;;OAKG;IACI,kBAAkB,CAAC,YAAkC,EAAE,KAAiB;QAC7E,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACI,gBAAgB,CAAC,YAAkC,EAAE,KAAmB;QAC7E,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,WAAW,CAAC;QAC5C,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO;YAAE,OAAO;QAC1C,IAAK,KAAK,CAAC,MAA6B,EAAE,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO;QAEpE,IAAI,CAAC,SAAS,GAAG;YACf,YAAY;YACZ,CAAC,EAAE,KAAK,CAAC,OAAO;YAChB,CAAC,EAAE,KAAK,CAAC,OAAO;YAChB,KAAK,EAAE,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,yBAAyB,CAAC,gBAAgB,CAAC;SAC9F,CAAC;IACJ,CAAC;IAED,oDAAoD;IAC7C,gBAAgB,CAAC,KAAmB;QACzC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAChG,IAAI,QAAQ,GAAG,yBAAyB,CAAC,wBAAwB,EAAE,CAAC;YAClE,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAEM,eAAe;QACpB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,iBAAiB;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,uBAAuB,CAAC,YAAkC,EAAE,KAAkB;QAC5E,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,kBAAkB,KAAK,OAAO,EAAE,CAAC;YAChE,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC;QACvC,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAElE,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;YAClC,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,uDAAuD;YAChF,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;YACvC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC9B,CAAC;YACD,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,uEAAuE;gBACvE,kEAAkE;gBAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC1E,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;oBACpD,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;gBACpD,CAAC;gBACD,IAAI,CAAC,iBAAiB,GAAG,YAAY,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAClC,CAAC;YACD,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,2BAA2B;QAC3B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IACD,6CAA6C;IAC7C,IAAa,aAAa,CAAC,KAAa;QACtC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,6CAA6C;IAC7C,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,2CAA2C;IAC3C,IAAa,WAAW,CAAC,KAAe;QACtC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,2CAA2C;IAC3C,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,sDAAsD;IACtD,IAAa,sBAAsB,CAAC,KAAoB;QACtD,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACtC,CAAC;IAED,sDAAsD;IACtD,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED,qDAAqD;IACrD,IAAa,qBAAqB,CAAC,KAAoB;QACrD,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACrC,CAAC;IAED,qDAAqD;IACrD,IAAI,qBAAqB;QACvB,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAED,+CAA+C;IAC/C,IAAa,eAAe,CAAC,KAAc;QACzC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,+CAA+C;IAC/C,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC,CAAC,yDAAyD;IAE3D,4CAA4C;IAC5C,IAAa,YAAY,CAAC,KAAc;QACtC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,4CAA4C;IAC5C,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC,CAAC,2CAA2C;IAE7C,yDAAyD;IACzD,IAAa,yBAAyB,CAAC,KAAc;QACnD,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;IACzC,CAAC;IAED,yDAAyD;IACzD,IAAI,yBAAyB;QAC3B,OAAO,IAAI,CAAC,yBAAyB,CAAC;IACxC,CAAC;IAED,8CAA8C;IAC9C,IAAa,cAAc,CAAC,KAAc;QACxC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,8CAA8C;IAC9C,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,kDAAkD;IAClD,IAAa,kBAAkB,CAAC,KAAc;QAC5C,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,kDAAkD;IAClD,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,sDAAsD;IACtD,IAAW,sBAAsB;QAC/B,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED,sDAAsD;IACtD,IAAW,sBAAsB,CAAC,KAAc;QAC9C,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACtC,CAAC;IAED,8CAA8C;IAC9C,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAAc;QACtC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,+CAA+C;IAC/C,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAc;QACvC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,iDAAiD;IACjD,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,iDAAiD;IACjD,IAAW,iBAAiB,CAAC,KAAc;QACzC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjC,CAAC;IAED,wDAAwD;IACxD,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACvC,CAAC;IAED,wDAAwD;IACxD,IAAW,wBAAwB,CAAC,KAAK;QACvC,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAC;IACxC,CAAC;IAED,+CAA+C;IAC/C,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAc;QACvC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,uDAAuD;IACvD,IAAW,uBAAuB;QAChC,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED,uDAAuD;IACvD,IAAW,uBAAuB,CAAC,KAAK;QACtC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;IACvC,CAAC;IAED,gDAAgD;IAChD,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,gDAAgD;IAChD,IAAW,gBAAgB,CAAC,KAAc;QACxC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAED,4CAA4C;IAC5C,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,4CAA4C;IAC5C,IAAW,YAAY,CAAC,KAAc;QACpC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,uCAAuC;IACvC,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAA0B;QAC3C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,mDAAmD;IACnD,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED,mDAAmD;IACnD,IAAW,mBAAmB,CAAC,KAA6B;QAC1D,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;IACnC,CAAC;IAED,qDAAqD;IACrD,IAAW,qBAAqB;QAC9B,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IAED,qDAAqD;IACrD,IAAW,qBAAqB,CAAC,KAA6B;QAC5D,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACrC,CAAC;IAED,sDAAsD;IACtD,IAAW,sBAAsB;QAC/B,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED,sDAAsD;IACtD,IAAW,sBAAsB,CAAC,KAA6B;QAC7D,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACtC,CAAC;IAED,0CAA0C;IAC1C,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAmB;QACvC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,2CAA2C;IAC3C,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAmB;QACxC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,+CAA+C;IAC/C,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAoB;QAC7C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,gDAAgD;IAChD,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,gDAAgD;IAChD,IAAW,gBAAgB,CAAC,KAAoB;QAC9C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAED,2CAA2C;IAC3C,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,2CAA2C;IAC3C,IAAI,WAAW,CAAC,KAAa;QAC3B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,2CAA2C;IAC3C,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,KAAY;QAClC,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,+CAA+C;IACxC,eAAe;QACpB,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;IAED,oDAAoD;IAC7C,oBAAoB,CAAC,KAAY;QACtC,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,2DAA2D;IACpD,2BAA2B,CAAC,KAAY;QAC7C,OAAO,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,iDAAiD;IAC1C,iBAAiB,CAAC,KAAY;QACnC,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,mDAAmD;IAC5C,mBAAmB,CAAC,KAAY;QACrC,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,oDAAoD;IAC7C,oBAAoB;QACzB,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACrC,CAAC;IAED,4CAA4C;IACrC,YAAY;QACjB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED,6CAA6C;IACtC,aAAa;QAClB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAED,+CAA+C;IACxC,eAAe;QACpB,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,SAAiB;QACvC,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,4CAA4C;IACrC,YAAY,CAAC,SAAiB;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,6CAA6C;IACtC,aAAa;QAClB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAED,uDAAuD;IAChD,uBAAuB,CAAC,YAAkC,EAAE,KAAgB;QACjF,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,qDAAqD;IAC9C,qBAAqB;QAC1B,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACtC,CAAC;IAED,iDAAiD;IAC1C,iBAAiB,CAAC,IAAgB,EAAE,KAAgB;QACzD,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,+CAA+C;IACxC,eAAe;QACpB,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,SAAiB,EAAE,KAAgB;QACzD,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,mDAAmD;IAC5C,mBAAmB,CAAC,KAAgB;QACzC,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,qDAAqD;IAC9C,qBAAqB,CAAC,KAAgB;QAC3C,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,2CAA2C;IACpC,WAAW,CAAC,QAAgB;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,4CAA4C;IACrC,YAAY,CAAC,OAAwB,EAAE,KAAgB;QAC5D,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,+CAA+C;IACxC,eAAe,CAAC,KAAgB;QACrC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,iDAAiD;IAC1C,iBAAiB,CAAC,KAAgB;QACvC,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,+CAA+C;IACxC,eAAe,CAAC,KAAY;QACjC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,gDAAgD;IACzC,gBAAgB,CAAC,KAAY;QAClC,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,4CAA4C;IACrC,YAAY,CAAC,QAAuB,EAAE,KAAa;QACxD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,0CAA0C;IACnC,UAAU,CAAC,OAAwB,EAAE,KAAa;QACvD,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,4CAA4C;IACrC,YAAY,CAAC,OAAwB,EAAE,KAAa;QACzD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,kDAAkD;IAC3C,kBAAkB,CAAC,YAAkC;QAC1D,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IAED,qDAAqD;IAC9C,qBAAqB;QAC1B,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACtC,CAAC;IAED,kDAAkD;IAC3C,kBAAkB,CAAC,YAAkC;QAC1D,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IAED,kDAAkD;IAC3C,kBAAkB,CAAC,YAAkC;QAC1D,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC;IAED,yCAAyC;IAClC,SAAS,CAAC,YAAkC,EAAE,KAAa;QAChE,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,8CAA8C;IACvC,cAAc,CAAC,cAAsB;QAC1C,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IAC7C,CAAC;IAED,8CAA8C;IACvC,cAAc,CAAC,YAAkC;QACtD,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC3C,CAAC;IAED,mDAAmD;IAC5C,mBAAmB,CAAC,YAAkC;QAC3D,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAED,mDAAmD;IAC5C,mBAAmB;QACxB,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACpC,CAAC;IAED,2DAA2D;IACpD,2BAA2B,CAAC,cAAsB;QACvD,OAAO,IAAI,CAAC,2BAA2B,CAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED,yCAAyC;IAClC,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAED,2CAA2C;IACpC,WAAW;QAChB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,uDAAuD;IAChD,uBAAuB,CAAC,GAAc;QAC3C,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,uDAAuD;IAChD,uBAAuB,CAAC,YAAkC,EAAE,KAAkB;QACnF,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;mHA5nEU,yBAAyB;6DAAzB,yBAAyB;;;;;;;YAAzB,8FAAA,qBAAiB,0BAAQ,mGAAzB,sBAAkB,0BAAO;;YArqClC,8BAAsE;YAIpE,2FAAuD;YAmGvD,8FAAiC;YAMjC,8BAEqD;YAAhD,AADA,yGAAS,iCAA6B,IAAC,wGACxB,mCAA+B,IAAC;YAElD,2FAAsC;YA2EpC,AAlDF,mFAAmD,qEAkD1C;YAkBX,iBAAM;YAKN,+FAAuC;YAOzC,iBAAM;YA2DN,AAxDA,6HAAkC,kHAwDgC;YAwDlE,qDAMyC;YAAvC,iIAAU,+BAA2B,IAAC;YACxC,iBAA2B;YAM3B,8FAAmB;;YA1VY,mDAAsC;YAInE,cAkGC;YAlGD,sFAkGC;YACD,cAKC;YALD,wDAKC;YAKC,eAiBC;YAjBD,6DAiBC;YAQD,cAmEC;YAnED,6EAmEC;YAMH,eAMC;YAND,kEAMC;YAqHD,eAA6B;YAG7B,AADA,AADA,AADA,+CAA6B,+BACH,6BACF,2BACF;YASxB,cAmHC;YAnHD,2CAmHC;;;iFAwtBQ,yBAAyB;cAzqCrC,SAAS;6BACI,KAAK,YACP,sBAAsB,YACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+cT;;kBAwtBA,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAKL,KAAK;;kBAYL,KAAK;;kBAEL,KAAK;;kBAML,KAAK;;kBAEL,MAAM;;kBAQN,MAAM;;kBACN,MAAM;;kBAQN,MAAM;;kBACN,MAAM;;kBAQN,MAAM;;kBACN,MAAM;;kBAQN,MAAM;;kBACN,MAAM;;kBAQN,MAAM;;kBACN,MAAM;;kBAQN,MAAM;;kBAON,MAAM;;kBAyDN,SAAS;mBAAC,aAAa;;kBACvB,SAAS;mBAAC,eAAe;;kBA4IzB,YAAY;mBAAC,gBAAgB;;kBAW7B,YAAY;mBAAC,yBAAyB;;kBAu2CtC,KAAK;;kBAUL,KAAK;;kBAUL,KAAK;;kBAUL,KAAK;;kBAUL,KAAK;;kBAUL,KAAK;;kBAUL,KAAK;;kBAUL,KAAK;;kBAUL,KAAK;;kFAruDK,yBAAyB","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, HostListener, ChangeDetectorRef, ViewChild, ElementRef } from '@angular/core';\nimport { UserInfo } from '@memberjunction/core';\nimport { MJConversationEntity, MJProjectEntity, ConversationEngine, UserInfoEngine } from '@memberjunction/core-entities';\nimport { MJDialogService } from '@memberjunction/ng-ui-components';\nimport { DialogService } from '../../services/dialog.service';\nimport { NotificationService } from '../../services/notification.service';\nimport { ActiveTasksService } from '../../services/active-tasks.service';\nimport { ProjectFormModalComponent } from '../project/project-form-modal.component';\nimport { ConversationGroupBy, ConversationSortBy, ConversationSortDirection } from '../../models/conversation-state.model';\nimport {\n MJResourcePermissionShareAdapter,\n ResourceShareContext,\n ResourceShareDialogResult\n} from '@memberjunction/ng-resource-permissions';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * A node in the conversation folder tree. Each node holds its project (folder),\n * the conversations directly assigned to it, and its nested child folders.\n */\ninterface FolderNode {\n project: MJProjectEntity;\n depth: number;\n /** Conversations directly in this folder (unpinned only — pinned live in the Pinned section). */\n conversations: MJConversationEntity[];\n children: FolderNode[];\n /** Total conversations in this folder and all descendants. */\n totalCount: number;\n /** True when this folder or any descendant has at least one (filtered) conversation. */\n hasContent: boolean;\n}\n\n/** Resource type the conversation share rows are written against. */\nconst CONVERSATIONS_RESOURCE_TYPE_ID = '81D4BC3D-9FEB-EF11-B01A-286B35C04427';\n\n/** What a right-click menu was opened on. */\ntype ListContextMenuKind = 'conversation' | 'folder' | 'background';\n\n/**\n * Where a menu opens: its preferred top-left corner, and the line its bottom\n * edge sits on when there is no room below and it opens upward instead.\n */\ninterface MenuAnchor {\n x: number;\n y: number;\n flipBottom: number;\n}\n\n/** An open right-click menu: where it sits, and what it acts on. */\ninterface ListContextMenu {\n kind: ListContextMenuKind;\n /** Viewport position the menu renders at: its anchor, moved to stay inside the window. */\n x: number;\n y: number;\n /** The pointer (or button) the menu was opened from. */\n anchor: MenuAnchor;\n /** The clicked conversation, for a conversation menu. */\n conversation: MJConversationEntity | null;\n /** The clicked folder, for a folder menu. */\n folder: MJProjectEntity | null;\n /** Conversations the actions apply to: the whole selection, or the clicked row. */\n targets: string[];\n}\n\n@Component({\n standalone: false,\n selector: 'mj-conversation-list',\n template: `\n <div class=\"conversation-list\" [class.is-selecting]=\"IsSelectionMode\">\n <!-- Header strip gated as a whole so an empty bordered band never renders.\n While a selection exists its top row becomes the selection bar, which\n shows even for a host that hides the rest of the chrome. -->\n @if (showSearch || ShowHeaderMenu || IsSelectionMode) {\n <div class=\"list-header\">\n <div class=\"header-top\">\n @if (IsSelectionMode) {\n <div class=\"selection-bar\" role=\"toolbar\" aria-label=\"Selected conversations\">\n <button class=\"selection-bar-btn\" (click)=\"ClearSelection()\" title=\"Clear selection\" aria-label=\"Clear selection\">\n <i class=\"fas fa-xmark\"></i>\n </button>\n <span class=\"selection-count\">{{ SelectedConversationIds.size }} selected</span>\n <button class=\"selection-bar-btn\"\n (click)=\"BarSetPinned()\"\n [disabled]=\"!CanChangeAny(SelectedIds)\"\n [title]=\"CanChangeAny(SelectedIds) ? (SelectionHasUnpinned() ? 'Pin' : 'Unpin') : ChangeRefusedReason\"\n [attr.aria-label]=\"SelectionHasUnpinned() ? 'Pin' : 'Unpin'\">\n <i class=\"fas fa-thumbtack\" [class.fa-rotate-90]=\"!SelectionHasUnpinned()\"></i>\n </button>\n <button class=\"selection-bar-btn\"\n (click)=\"BarOpenMoveMenu($event)\"\n [disabled]=\"!CanChangeAny(SelectedIds)\"\n [title]=\"CanChangeAny(SelectedIds) ? 'Move to folder' : ChangeRefusedReason\"\n aria-label=\"Move to folder\">\n <i class=\"fas fa-folder-tree\"></i>\n </button>\n <button class=\"selection-bar-btn\"\n (click)=\"BarShare()\"\n [disabled]=\"!CanShareAny(SelectedIds)\"\n [title]=\"CanShareAny(SelectedIds) ? 'Share' : ShareRefusedReason\"\n aria-label=\"Share\">\n <i class=\"fas fa-user-plus\"></i>\n </button>\n <button class=\"selection-bar-btn danger\" (click)=\"BarDelete()\" title=\"Delete\" aria-label=\"Delete\">\n <i class=\"fas fa-trash\"></i>\n </button>\n </div>\n } @else {\n @if (showSearch) {\n <div class=\"search-box\">\n <input\n #searchInput\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations...\"\n [(ngModel)]=\"SearchQuery\"\n (keydown)=\"OnSearchKeydown($event)\">\n @if (IsSearching) {\n <button class=\"search-clear\" (click)=\"ClearSearch()\" title=\"Clear search\">\n <i class=\"fas fa-xmark\"></i>\n </button>\n }\n </div>\n }\n @if (ShowHeaderMenu) {\n <div class=\"header-menu-container\">\n <button class=\"btn-menu\" (click)=\"ToggleHeaderMenu($event)\" title=\"Options\">\n <i class=\"fas fa-ellipsis-v\"></i>\n </button>\n @if (IsHeaderMenuOpen) {\n <div class=\"header-dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"OnRefreshConversationsClick($event)\" [disabled]=\"IsRefreshing\">\n <i class=\"fas fa-sync-alt\" [class.fa-spin]=\"IsRefreshing\"></i>\n <span>{{ IsRefreshing ? 'Refreshing...' : 'Refresh' }}</span>\n </button>\n <button class=\"dropdown-item\" (click)=\"OnToggleGroupByClick($event)\">\n <i class=\"fas\" [class.fa-folder-tree]=\"GroupBy !== 'project'\" [class.fa-list]=\"GroupBy === 'project'\"></i>\n <span>{{ GroupBy === 'project' ? 'Show as flat list' : 'Group by folder' }}</span>\n </button>\n @if (!IsMobileView) {\n <button class=\"dropdown-item\" (click)=\"OnUnpinSidebarClick($event)\">\n <i class=\"fas fa-table-columns\"></i>\n <span>Hide Sidebar</span>\n </button>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n <!-- Sort controls. Live in the header strip, so a host that hides all\n chrome (showSearch + ShowHeaderMenu both false) gets no sort row.\n They stay put while selecting, so the list does not jump. -->\n @if (showSearch || ShowHeaderMenu) {\n <div class=\"sort-row\">\n <button class=\"sort-btn\" [class.active]=\"SortBy === 'date'\"\n (click)=\"SetSort('date')\"\n [title]=\"SortBy === 'date' ? (SortDirection === 'asc' ? 'Oldest first' : 'Newest first') : 'Sort by date'\">\n <i class=\"fas\" [ngClass]=\"SortIcon('date')\"></i>\n <span>Date</span>\n </button>\n <button class=\"sort-btn\" [class.active]=\"SortBy === 'name'\"\n (click)=\"SetSort('name')\"\n [title]=\"SortBy === 'name' ? (SortDirection === 'asc' ? 'A to Z' : 'Z to A') : 'Sort by name'\">\n <i class=\"fas\" [ngClass]=\"SortIcon('name')\"></i>\n <span>Name</span>\n </button>\n </div>\n }\n </div>\n }\n @if (ShowNewConversationButton) {\n <button class=\"btn-new-conversation\" (click)=\"CreateNewConversation()\" title=\"New Conversation\">\n <i class=\"fas fa-plus\"></i>\n <span>New Conversation</span>\n </button>\n }\n <div class=\"list-content\"\n (click)=\"OnListBackgroundClick($event)\"\n (contextmenu)=\"OnBackgroundContextMenu($event)\">\n <!-- Pinned Section (only show if there are pinned conversations) -->\n @if (PinnedConversations.length > 0) {\n <div class=\"sidebar-section pinned-section\">\n @if (ShowSectionHeaders) {\n <div class=\"section-header\" [class.expanded]=\"PinnedExpanded\" (click)=\"TogglePinned()\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <i class=\"fas fa-thumbtack section-icon\"></i>\n <span>Pinned</span>\n </div>\n </div>\n }\n <div class=\"chat-list\" [class.expanded]=\"!ShowSectionHeaders || PinnedExpanded\">\n @for (conversation of PinnedConversations; track conversation.ID) {\n <ng-container [ngTemplateOutlet]=\"conversationItem\" [ngTemplateOutletContext]=\"{ $implicit: conversation }\"></ng-container>\n }\n </div>\n </div>\n }\n\n <!-- ShowSectionHeaders=false forces the FLAT branch even in project\n grouping: the folder tree's root drop-zone and New Folder action\n live in the section header, so rendering the tree without headers\n would let a user drag a folder INTO another folder with no way to\n ever drag it back out (a one-way door). Flat + headerless is the\n coherent chrome-less rendering. -->\n @if (ShowSectionHeaders && GroupBy === 'project') {\n <!-- Folders Section. NOTE: this whole branch is already gated on\n ShowSectionHeaders above, so the header + collapse state here are\n unconditional — a headerless folder tree never renders. -->\n <div class=\"sidebar-section folders-section\">\n <div class=\"section-header\" [class.expanded]=\"FoldersExpanded\"\n [class.drag-over]=\"DragOverTargetId === 'folders-root'\"\n (click)=\"ToggleFolders()\"\n (dragover)=\"OnFoldersRootDragOver($event)\"\n (dragleave)=\"OnDragLeave('folders-root')\"\n (drop)=\"OnFoldersRootDrop($event)\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <span>Folders</span>\n </div>\n <button class=\"section-action-btn\" (click)=\"CreateFolder(null, $event)\" title=\"New Folder\">\n <i class=\"fas fa-folder-plus\"></i>\n </button>\n </div>\n <div class=\"chat-list\" [class.expanded]=\"FoldersExpanded\">\n @for (node of FolderTree; track node.project.ID) {\n @if (!IsSearching || node.hasContent) {\n <ng-container [ngTemplateOutlet]=\"folderNode\" [ngTemplateOutletContext]=\"{ $implicit: node }\"></ng-container>\n }\n }\n @if (FolderTree.length === 0) {\n <div class=\"folder-empty-hint\">No folders yet — create one to organize conversations.</div>\n }\n </div>\n </div>\n\n <!-- Ungrouped Section (drop target to remove from folder) -->\n <div class=\"sidebar-section ungrouped-section\"\n [class.drag-over]=\"DragOverTargetId === 'ungrouped'\"\n (dragover)=\"OnUngroupedDragOver($event)\"\n (dragleave)=\"OnDragLeave('ungrouped')\"\n (drop)=\"OnUngroupedDrop($event)\">\n <!-- Same as Folders above: reached only when ShowSectionHeaders is true. -->\n <div class=\"section-header\" [class.expanded]=\"UngroupedExpanded\" (click)=\"ToggleUngrouped()\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <span>{{ FolderTree.length > 0 ? 'Ungrouped' : 'Messages' }}</span>\n </div>\n </div>\n <div class=\"chat-list\" [class.expanded]=\"UngroupedExpanded\">\n @for (conversation of UngroupedConversations; track conversation.ID) {\n <ng-container [ngTemplateOutlet]=\"conversationItem\" [ngTemplateOutletContext]=\"{ $implicit: conversation }\"></ng-container>\n }\n </div>\n </div>\n } @else {\n <!-- Flat Messages Section -->\n <div class=\"sidebar-section\">\n @if (ShowSectionHeaders) {\n <div class=\"section-header\" [class.expanded]=\"DirectMessagesExpanded\" (click)=\"ToggleDirectMessages()\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <span>Messages</span>\n </div>\n </div>\n }\n <div class=\"chat-list\" [class.expanded]=\"!ShowSectionHeaders || DirectMessagesExpanded\">\n @for (conversation of UnpinnedConversations; track conversation.ID) {\n <ng-container [ngTemplateOutlet]=\"conversationItem\" [ngTemplateOutletContext]=\"{ $implicit: conversation }\"></ng-container>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Escalate the in-place filter to a full cross-entity search. Pinned below the\n scroll region rather than appended to the results so it stays reachable without\n scrolling past every match. Only meaningful while filtering. -->\n @if (IsSearching && !IsSelectionMode) {\n <button class=\"search-escalate\" (click)=\"EscalateSearch()\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span class=\"search-escalate-label\">Search all of Chat for &ldquo;{{ SearchQuery }}&rdquo;</span>\n <i class=\"fa-solid fa-arrow-right search-escalate-go\"></i>\n </button>\n }\n </div>\n\n <!-- Recursive folder node: header + nested children + direct conversations -->\n <ng-template #folderNode let-node>\n <div class=\"folder-row\"\n [class.drag-over]=\"DragOverTargetId === node.project.ID\"\n [class.dragging]=\"DraggedFolderId === node.project.ID\"\n [style.paddingLeft.px]=\"12 + node.depth * 14\"\n [draggable]=\"true\"\n (dragstart)=\"OnFolderDragStart(node, $event)\"\n (dragend)=\"OnFolderDragEnd()\"\n (click)=\"ToggleFolder(node.project.ID)\"\n (dragover)=\"OnFolderDragOver(node.project.ID, $event)\"\n (dragleave)=\"OnDragLeave(node.project.ID)\"\n (drop)=\"OnFolderDrop(node.project, $event)\"\n (contextmenu)=\"OnFolderContextMenu(node.project, $event)\"\n [title]=\"node.project.Name\">\n <i class=\"fas fa-chevron-right folder-chevron\" [class.expanded]=\"IsFolderExpanded(node.project.ID)\"></i>\n <i class=\"fas {{ node.project.Icon || 'fa-folder' }} folder-icon\" [style.color]=\"node.project.Color || null\"></i>\n <span class=\"folder-name\">{{ node.project.Name }}</span>\n <!-- SHARED is the marked state, not personal. Two reasons: it is the state with\n consequences for other people (\"anyone here can read this folder's name\"),\n and personal is the create-time default, so marking personal would badge\n nearly every row in steady state while marking shared thins out over time.\n On an environment upgrading to this column every existing folder is shared\n and so every row is badged — which is exactly the disclosure people need at\n that moment. Sits beside the name it describes rather than at the right\n edge, which belongs to the count. -->\n @if (!node.project.OwnerUserID) {\n <!-- role=\"img\" so the aria-label is actually announced: on a bare span with no\n role, an aria-label is not reliably exposed, and the <i> carrying the glyph\n is aria-hidden. -->\n <span class=\"folder-shared\" role=\"img\"\n title=\"Shared — everyone can see this folder and its name, but not the conversations in it\"\n aria-label=\"Shared folder\">\n <i class=\"fas fa-users\" aria-hidden=\"true\"></i>\n </span>\n }\n <span class=\"folder-spacer\"></span>\n <span class=\"folder-count\">{{ node.totalCount }}</span>\n </div>\n @if (IsFolderExpanded(node.project.ID)) {\n <div class=\"folder-children\">\n @for (child of node.children; track child.project.ID) {\n @if (!IsSearching || child.hasContent) {\n <ng-container [ngTemplateOutlet]=\"folderNode\" [ngTemplateOutletContext]=\"{ $implicit: child }\"></ng-container>\n }\n }\n @for (conversation of node.conversations; track conversation.ID) {\n <ng-container [ngTemplateOutlet]=\"conversationItem\" [ngTemplateOutletContext]=\"{ $implicit: conversation, depth: node.depth + 1 }\"></ng-container>\n }\n @if (node.totalCount === 0 && !IsSearching) {\n <div class=\"folder-empty-hint\" [style.paddingLeft.px]=\"26 + node.depth * 14\">Empty — drop a conversation here</div>\n }\n </div>\n }\n </ng-template>\n\n <!-- Shared conversation row used by Pinned, folders, and Ungrouped/Messages -->\n <ng-template #conversationItem let-conversation let-depth=\"depth\">\n <div class=\"conversation-item\"\n [class.active]=\"IsConversationActive(conversation)\"\n [class.selected]=\"IsConversationSelected(conversation)\"\n [class.renamed]=\"IsConversationRenamed(conversation)\"\n [class.dragging]=\"IsConversationDragging(conversation)\"\n [style.paddingLeft.px]=\"depth ? 16 + depth * 14 : 16\"\n [draggable]=\"CanChange(conversation)\"\n (dragstart)=\"OnConversationDragStart(conversation, $event)\"\n (dragend)=\"OnConversationDragEnd()\"\n (dragover)=\"OnConversationRowDragOver(conversation, $event)\"\n (dragleave)=\"OnDragLeave(ConversationDropTargetId(conversation))\"\n (drop)=\"OnConversationRowDrop(conversation, $event)\"\n (pointerdown)=\"OnRowPointerDown(conversation, $event)\"\n (pointermove)=\"OnRowPointerMove($event)\"\n (pointerup)=\"CancelLongPress()\"\n (pointercancel)=\"CancelLongPress()\"\n (click)=\"HandleConversationClick(conversation, $event)\"\n (contextmenu)=\"OnConversationContextMenu(conversation, $event)\">\n <button class=\"row-check\"\n role=\"checkbox\"\n [class.checked]=\"IsConversationSelected(conversation)\"\n [attr.aria-checked]=\"IsConversationSelected(conversation)\"\n [attr.aria-label]=\"'Select ' + (conversation.Name || 'conversation')\"\n [style.left.px]=\"(depth || 0) * 14 + 4\"\n (click)=\"OnRowCheckboxClick(conversation, $event)\">\n <i class=\"fas fa-check\"></i>\n </button>\n <div class=\"conversation-icon-wrapper\">\n @if (HasActiveTasks(conversation.ID)) {\n <div class=\"conversation-icon has-tasks\">\n <i class=\"fas fa-spinner fa-pulse\"></i>\n </div>\n }\n <div class=\"badge-overlay\">\n <mj-notification-badge [conversationId]=\"conversation.ID\"></mj-notification-badge>\n </div>\n </div>\n <div class=\"conversation-info\" [title]=\"conversation.Name + (conversation.Description ? '\\n' + conversation.Description : '')\">\n <div class=\"conversation-name\">\n {{ conversation.Name }}\n @if (IsSharedWithMe(conversation)) {\n <i class=\"fas fa-share-nodes shared-indicator\"\n [title]=\"SharedWithMeTooltip(conversation)\"></i>\n }\n </div>\n <div class=\"conversation-preview\">{{ conversation.Description }}</div>\n </div>\n <div class=\"conversation-actions\">\n <button class=\"menu-btn\" (click)=\"OpenRowMenu(conversation, $event)\" title=\"More options\">\n <i class=\"fas fa-ellipsis\"></i>\n </button>\n </div>\n </div>\n </ng-template>\n\n <mj-resource-share-dialog\n [Visible]=\"IsShareDialogOpen\"\n [Contexts]=\"ShareContexts\"\n [Adapter]=\"ShareAdapter\"\n [Notice]=\"ShareNotice\"\n ResourceLabel=\"conversation\"\n (Result)=\"OnShareDialogResult($event)\">\n </mj-resource-share-dialog>\n\n <!-- One menu for every right-click target: a conversation row (the clicked\n row, or the whole selection when it is part of it), a folder row, or the\n empty space of the list. Fixed-positioned at the pointer, and moved as\n needed to stay inside the window. -->\n @if (ContextMenu) {\n <div class=\"list-context-menu\" #contextMenuEl\n [style.left.px]=\"ContextMenu.x\"\n [style.top.px]=\"ContextMenu.y\"\n (click)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\">\n @switch (ContextMenu.kind) {\n @case ('conversation') {\n @if (IsMoveSubmenuOpen) {\n <button class=\"menu-item back\" (click)=\"CloseMoveSubmenu($event)\">\n <i class=\"fas fa-chevron-left\"></i>\n <span>Move to folder</span>\n </button>\n <div class=\"menu-divider\"></div>\n <div class=\"move-folder-list\">\n <button class=\"menu-item\" [class.current]=\"IsSingleTargetInFolder(null)\" (click)=\"ContextMoveToFolder(null)\">\n <i class=\"fas fa-inbox\"></i>\n <span>No folder</span>\n </button>\n @for (f of FlatFolders; track f.project.ID) {\n <button class=\"menu-item\" [class.current]=\"IsSingleTargetInFolder(f.project.ID)\"\n [style.paddingLeft.px]=\"14 + f.depth * 12\"\n (click)=\"ContextMoveToFolder(f.project.ID)\">\n <i class=\"fas {{ f.project.Icon || 'fa-folder' }}\" [style.color]=\"f.project.Color || null\"></i>\n <span>{{ f.project.Name }}</span>\n </button>\n }\n </div>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item\" (click)=\"ContextMoveToNewFolder($event)\">\n <i class=\"fas fa-folder-plus\"></i>\n <span>New folder&hellip;</span>\n </button>\n } @else {\n @if (ContextMenu.targets.length > 1) {\n <div class=\"context-menu-header\">{{ ContextMenu.targets.length }} selected</div>\n <button class=\"menu-item\" (click)=\"ContextSetPinned(true)\"\n [disabled]=\"!CanChangeAny(ContextMenu.targets)\"\n [attr.title]=\"CanChangeAny(ContextMenu.targets) ? null : ChangeRefusedReason\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>Pin</span>\n </button>\n <button class=\"menu-item\" (click)=\"ContextSetPinned(false)\"\n [disabled]=\"!CanChangeAny(ContextMenu.targets)\"\n [attr.title]=\"CanChangeAny(ContextMenu.targets) ? null : ChangeRefusedReason\">\n <i class=\"fas fa-thumbtack fa-rotate-90\"></i>\n <span>Unpin</span>\n </button>\n } @else {\n <button class=\"menu-item\" (click)=\"ContextTogglePin()\"\n [disabled]=\"!CanChangeAny(ContextMenu.targets)\"\n [attr.title]=\"CanChangeAny(ContextMenu.targets) ? null : ChangeRefusedReason\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>{{ ContextMenu.conversation?.IsPinned ? 'Unpin' : 'Pin' }}</span>\n </button>\n }\n <button class=\"menu-item\" (click)=\"OpenMoveSubmenu($event)\"\n [disabled]=\"!CanChangeAny(ContextMenu.targets)\"\n [attr.title]=\"CanChangeAny(ContextMenu.targets) ? null : ChangeRefusedReason\">\n <i class=\"fas fa-folder-tree\"></i>\n <span>Move to folder</span>\n <i class=\"fas fa-chevron-right submenu-arrow\"></i>\n </button>\n <button class=\"menu-item\"\n (click)=\"ContextShare()\"\n [disabled]=\"!CanShareAny(ContextMenu.targets)\"\n [attr.title]=\"CanShareAny(ContextMenu.targets) ? null : ShareRefusedReason\">\n <i class=\"fas fa-user-plus\"></i>\n <span>{{ ContextMenu.targets.length > 1 ? 'Share ' + ContextMenu.targets.length + ' conversations' : 'Share' }}</span>\n </button>\n @if (ContextMenu.targets.length === 1) {\n <button class=\"menu-item\" (click)=\"ContextRename()\">\n <i class=\"fas fa-edit\"></i>\n <span>Rename</span>\n </button>\n }\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"ContextDelete()\">\n <i class=\"fas fa-trash\"></i>\n <span>{{ ContextMenu.targets.length > 1 ? 'Delete ' + ContextMenu.targets.length : 'Delete' }}</span>\n </button>\n }\n }\n @case ('folder') {\n <button class=\"menu-item\" (click)=\"ContextCreateSubfolder($event)\">\n <i class=\"fas fa-folder-plus\"></i>\n <span>New Subfolder</span>\n </button>\n <button class=\"menu-item\" (click)=\"ContextEditFolder($event)\">\n <i class=\"fas fa-pen\"></i>\n <span>Rename</span>\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"ContextDeleteFolder($event)\">\n <i class=\"fas fa-trash\"></i>\n <span>Delete</span>\n </button>\n }\n @default {\n <button class=\"menu-item\" (click)=\"ContextNewConversation()\">\n <i class=\"fas fa-plus\"></i>\n <span>New Conversation</span>\n </button>\n <button class=\"menu-item\" (click)=\"ContextCreateRootFolder($event)\">\n <i class=\"fas fa-folder-plus\"></i>\n <span>New Folder</span>\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item\" (click)=\"ContextSelectAll()\">\n <i class=\"fas fa-check-double\"></i>\n <span>Select All</span>\n </button>\n }\n }\n </div>\n }\n `,\n styles: [`\n :host {\n display: block;\n height: 100%;\n /* White-label theming tokens for the list panel. The public\n --mj-chat-list-* custom properties are host-overridable (set\n them at :root or on any ancestor); the private --conv-list-* names\n resolve the fallback ONCE here so the 70+ usages below stay simple.\n (A self-referential var() fallback would be a custom-property cycle,\n so the two-name indirection is required, not stylistic.) Defaults\n preserve the stock look exactly: a brand-secondary panel with\n on-secondary ink. Hover/border/divider states derive from the ink via\n color-mix, so they follow automatically when the ink is remapped.\n The accent trio drives the panel's ACTION surfaces (New Conversation\n button, search-focus ring, checkbox tick, drag-over highlights) —\n independent of the active-row pair so a host can tint actions on their\n own; defaults to the brand-primary action color, unchanged.\n --conv-list-hover-bg is the row-hover wash: it defaults to the same\n ink-derived tint as before (so a bg/ink remap still gives a neutral\n hover), but a host can point it at a brand tint to make hover an accent\n cue while keeping the panel itself on a neutral surface. */\n --conv-list-bg: var(--mj-chat-list-bg, var(--mj-brand-secondary));\n --conv-list-ink: var(--mj-chat-list-ink, var(--mj-brand-on-secondary));\n --conv-list-active-bg: var(--mj-chat-list-active-bg, var(--mj-brand-primary));\n --conv-list-active-ink: var(--mj-chat-list-active-ink, var(--mj-brand-on-secondary));\n --conv-list-active-hover-bg: var(--mj-chat-list-active-hover-bg, var(--mj-brand-primary-hover));\n --conv-list-accent: var(--mj-chat-list-accent, var(--mj-brand-primary));\n --conv-list-accent-ink: var(--mj-chat-list-accent-ink, var(--mj-text-inverse));\n --conv-list-accent-hover: var(--mj-chat-list-accent-hover, var(--mj-brand-primary-hover));\n --conv-list-hover-bg: var(--mj-chat-list-hover-bg, color-mix(in srgb, var(--conv-list-ink) 8%, transparent));\n }\n .conversation-list { display: flex; flex-direction: column; height: 100%; background: var(--conv-list-bg); }\n .list-header { padding: 8px; border-bottom: 1px solid color-mix(in srgb, var(--conv-list-ink) 10%, transparent); }\n .search-box { position: relative; flex: 1; min-width: 0; display: flex; }\n .search-clear {\n position: absolute;\n right: 4px;\n top: 50%;\n transform: translateY(-50%);\n width: 22px;\n height: 22px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: color-mix(in srgb, var(--conv-list-ink) 55%, transparent);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s;\n }\n .sort-row { display: flex; gap: 6px; margin-top: 8px; }\n .sort-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: transparent;\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 20%, transparent);\n border-radius: 6px;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s;\n }\n .sort-btn i { font-size: 11px; }\n .sort-btn:hover { background: var(--conv-list-hover-bg); color: var(--conv-list-ink); }\n .sort-btn.active {\n background: color-mix(in srgb, var(--conv-list-accent) 18%, transparent);\n border-color: var(--conv-list-accent);\n color: var(--conv-list-ink);\n font-weight: 600;\n }\n .search-clear:hover { background: color-mix(in srgb, var(--conv-list-ink) 12%, transparent); color: var(--conv-list-ink); }\n .search-input {\n width: 100%;\n padding: 8px 28px 8px 12px;\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 20%, transparent);\n border-radius: 6px;\n color: var(--conv-list-ink);\n font-size: 13px;\n transition: all 0.2s;\n }\n .search-input::placeholder { color: color-mix(in srgb, var(--conv-list-ink) 50%, transparent); }\n .search-input:focus { outline: none; background: color-mix(in srgb, var(--conv-list-ink) 15%, transparent); border-color: var(--conv-list-accent); }\n .btn-new-conversation {\n width: calc(100% - 16px);\n margin: 8px;\n padding: 10px;\n background: var(--conv-list-accent);\n color: var(--conv-list-accent-ink);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: background 0.2s;\n flex-shrink: 0;\n }\n .btn-new-conversation:hover { background: var(--conv-list-accent-hover); }\n .btn-new-conversation i { font-size: 14px; }\n .list-content { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 0; }\n\n /* Collapsible Sections */\n .sidebar-section { margin-bottom: 20px; }\n\n /* Reads as a continuation of the list rather than a second control: full-width row,\n ink-derived like every other affordance in this panel, no input styling. */\n .search-escalate {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n padding: 10px 12px;\n border: none;\n border-top: 1px solid color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n background: transparent;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n font-size: 13px;\n text-align: left;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .search-escalate:hover {\n background: var(--conv-list-hover-bg);\n color: var(--conv-list-ink);\n }\n\n /* Truncate rather than wrap — the query is user text of unbounded length. */\n .search-escalate-label {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .search-escalate-go { opacity: 0.6; }\n .pinned-section .section-title .section-icon {\n color: var(--mj-status-warning);\n font-size: 11px;\n margin-left: 2px;\n }\n .section-header {\n padding: 4px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n color: var(--conv-list-ink);\n font-size: 13px;\n font-weight: 500;\n transition: background 0.2s;\n user-select: none;\n }\n .section-header:hover { background: color-mix(in srgb, var(--conv-list-ink) 8%, transparent); }\n .section-title {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .section-title i {\n font-size: 10px;\n }\n .section-title i:not(.section-icon) {\n transition: transform 0.2s;\n }\n .section-header.expanded .section-title i:not(.section-icon) { transform: rotate(90deg); }\n .chat-list {\n padding: 4px 0;\n display: none;\n }\n .chat-list.expanded { display: block; }\n\n .conversation-item {\n padding: 6px 5px 6px 16px;\n cursor: pointer;\n display: flex;\n gap: 8px;\n align-items: center;\n transition: all 0.2s;\n position: relative;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n font-size: 14px;\n min-height: 45px;\n }\n .conversation-item:hover { background: var(--conv-list-hover-bg); color: var(--conv-list-ink); }\n .conversation-item:hover .conversation-actions { opacity: 1; }\n .conversation-item.active { background: var(--conv-list-active-bg); color: var(--conv-list-active-ink); }\n /* A selected row is marked by its ticked checkbox and an accent tint. The\n open conversation keeps its solid .active fill, so a row that is both\n still reads as the open one. */\n .conversation-item.selected { background: color-mix(in srgb, var(--conv-list-accent) 16%, transparent); }\n .conversation-item.selected:hover { background: color-mix(in srgb, var(--conv-list-accent) 24%, transparent); }\n .conversation-item.active.selected { background: var(--conv-list-active-bg); }\n /* Row checkbox: the mouse route to a selection. It sits in the row's left\n padding, hidden until the row is hovered, and shows on every row while a\n selection exists (on touch too, where there is no hover). */\n .row-check {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: 14px;\n height: 14px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1.5px solid color-mix(in srgb, var(--conv-list-ink) 45%, transparent);\n border-radius: 3px;\n color: transparent;\n cursor: pointer;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.15s;\n z-index: 2;\n }\n .row-check i { font-size: 8px; }\n .conversation-list.is-selecting .row-check { opacity: 1; pointer-events: auto; }\n @media (hover: hover) {\n .conversation-item:hover .row-check { opacity: 1; pointer-events: auto; }\n }\n .row-check.checked {\n background: var(--conv-list-accent);\n border-color: var(--conv-list-accent);\n color: var(--conv-list-accent-ink);\n }\n .conversation-item.active .row-check:not(.checked) {\n border-color: color-mix(in srgb, var(--conv-list-active-ink) 70%, transparent);\n }\n .conversation-icon-wrapper { position: relative; flex-shrink: 0; }\n .conversation-icon { font-size: 12px; width: 16px; text-align: center; }\n .conversation-icon.has-tasks { color: var(--mj-status-warning); }\n .badge-overlay { position: absolute; top: -4px; right: -4px; }\n .conversation-info { flex: 1; min-width: 0; }\n .conversation-name { font-weight: 600; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: flex; align-items: center; gap: 6px; }\n .shared-indicator { font-size: 10px; color: color-mix(in srgb, var(--conv-list-ink) 55%, transparent); flex-shrink: 0; }\n .conversation-item.active .shared-indicator { color: color-mix(in srgb, var(--conv-list-active-ink) 85%, transparent); }\n .conversation-preview { font-size: 12px; color: color-mix(in srgb, var(--conv-list-ink) 50%, transparent); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .conversation-item.active .conversation-preview { color: color-mix(in srgb, var(--conv-list-active-ink) 80%, transparent); }\n .conversation-meta { display: flex; align-items: center; gap: 4px; flex-shrink: 0; }\n\n /* Project Badge */\n .project-badge {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n margin-left: auto;\n background-color: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: color-mix(in srgb, var(--conv-list-ink) 60%, transparent);\n white-space: nowrap;\n max-width: 80px;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .conversation-item:hover .project-badge {\n background-color: color-mix(in srgb, var(--conv-list-ink) 15%, transparent);\n color: color-mix(in srgb, var(--conv-list-ink) 80%, transparent);\n }\n .conversation-item.active .project-badge {\n background-color: color-mix(in srgb, var(--conv-list-active-ink) 20%, transparent);\n color: var(--conv-list-active-ink);\n }\n\n .conversation-actions {\n position: absolute;\n right: 5px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s;\n z-index: 10;\n }\n .conversation-item:hover .conversation-actions { opacity: 1; pointer-events: auto; }\n .conversation-item.active .conversation-actions { opacity: 1; pointer-events: auto; }\n .conversation-actions > * { pointer-events: auto; }\n /* No hover on touch, so the ⋯ button is always shown there. */\n @media (hover: none) {\n .conversation-actions { opacity: 1; pointer-events: auto; }\n }\n .pinned-icon { color: var(--mj-brand-accent); font-size: 12px; }\n\n /* Task Indicator */\n .task-indicator {\n color: var(--mj-status-warning);\n font-size: 12px;\n margin-right: 8px;\n flex-shrink: 0;\n animation: pulse-glow 2s ease-in-out infinite;\n }\n @keyframes pulse-glow {\n 0%, 100% {\n opacity: 1;\n filter: drop-shadow(0 0 2px var(--mj-status-warning));\n }\n 50% {\n opacity: 0.6;\n filter: drop-shadow(0 0 4px var(--mj-status-warning));\n }\n }\n .conversation-item.active .task-indicator {\n color: var(--mj-status-warning);\n }\n\n .menu-btn {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n background: var(--conv-list-bg) !important;\n border: none;\n cursor: pointer;\n transition: all 0.2s;\n }\n .menu-btn:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 15%, transparent) !important;\n color: var(--conv-list-ink);\n }\n .conversation-item.active .menu-btn {\n background: var(--conv-list-active-hover-bg) !important;\n color: var(--conv-list-active-ink);\n }\n .menu-btn i { font-size: 14px; }\n\n /* The one right-click menu. Fixed to the viewport so it escapes the list's\n scroll container and is never clipped by a row. */\n .list-context-menu {\n position: fixed;\n min-width: 190px;\n max-height: 70vh;\n overflow-y: auto;\n background: var(--conv-list-bg);\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 15%, transparent);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n z-index: 1001;\n padding: 4px 0;\n }\n\n .context-menu-header {\n padding: 6px 14px 8px;\n font-size: 12px;\n font-weight: 600;\n color: color-mix(in srgb, var(--conv-list-ink) 60%, transparent);\n border-bottom: 1px solid color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n margin-bottom: 4px;\n }\n\n .menu-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n background: transparent;\n border: none;\n color: color-mix(in srgb, var(--conv-list-ink) 85%, transparent);\n font-size: 14px;\n text-align: left;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .menu-item:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: var(--conv-list-ink);\n }\n\n .menu-item i {\n width: 16px;\n font-size: 13px;\n color: color-mix(in srgb, var(--conv-list-ink) 60%, transparent);\n }\n\n .menu-item:hover i {\n color: var(--conv-list-ink);\n }\n\n .menu-item.danger {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover {\n background: color-mix(in srgb, var(--mj-status-error) 15%, transparent);\n color: var(--mj-status-error);\n }\n\n .menu-item.danger i {\n color: var(--mj-status-error);\n }\n\n .menu-item.danger:hover i {\n color: var(--mj-status-error);\n }\n\n .menu-divider {\n height: 1px;\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n margin: 4px 0;\n }\n\n /* Rename Animation */\n .conversation-item.renamed {\n animation: renameHighlight 1500ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n /* Brand-token ramp (was hardcoded tailwind blue/purple/emerald rgba values,\n which ignored theming): primary/accent open the flash, success/primary\n carry the fade, at the original alpha ramp (40/35/30/20; glows 50-20). */\n @keyframes renameHighlight {\n 0% {\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-brand-primary) 40%, transparent),\n color-mix(in srgb, var(--mj-brand-accent) 40%, transparent));\n transform: scale(1.03);\n box-shadow: 0 0 20px color-mix(in srgb, var(--mj-brand-primary) 50%, transparent);\n }\n 25% {\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-brand-primary) 35%, transparent),\n color-mix(in srgb, var(--mj-brand-accent) 35%, transparent));\n box-shadow: 0 0 15px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n }\n 50% {\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-status-success) 30%, transparent),\n color-mix(in srgb, var(--mj-brand-primary) 30%, transparent));\n transform: scale(1.02);\n box-shadow: 0 0 10px color-mix(in srgb, var(--mj-status-success) 30%, transparent);\n }\n 75% {\n background: linear-gradient(90deg,\n color-mix(in srgb, var(--mj-status-success) 20%, transparent),\n color-mix(in srgb, var(--mj-brand-primary) 20%, transparent));\n box-shadow: 0 0 5px color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n }\n 100% {\n background: transparent;\n transform: scale(1);\n box-shadow: none;\n }\n }\n\n /* Header top row: the search box and ⋯ menu, or the selection bar while a\n selection exists. A fixed minimum height keeps the list from jumping\n when one replaces the other. */\n .header-top {\n display: flex;\n gap: 8px;\n align-items: center;\n min-height: 36px;\n }\n\n .selection-bar {\n display: flex;\n align-items: center;\n gap: 2px;\n flex: 1;\n min-width: 0;\n }\n\n .selection-count {\n flex: 1;\n min-width: 0;\n padding: 0 6px;\n color: var(--conv-list-ink);\n font-size: 13px;\n font-weight: 600;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .selection-bar-btn {\n width: 32px;\n height: 32px;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: color-mix(in srgb, var(--conv-list-ink) 75%, transparent);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .selection-bar-btn i { font-size: 13px; }\n .selection-bar-btn:hover:not(:disabled) { background: var(--conv-list-hover-bg); color: var(--conv-list-ink); }\n .selection-bar-btn:disabled { opacity: 0.4; cursor: not-allowed; }\n .selection-bar-btn.danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 15%, transparent);\n color: var(--mj-status-error);\n }\n\n /* Header menu button and dropdown */\n .header-menu-container {\n position: relative;\n flex-shrink: 0;\n }\n\n .btn-menu {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 20%, transparent);\n border-radius: 6px;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .btn-menu:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: var(--conv-list-ink);\n border-color: color-mix(in srgb, var(--conv-list-ink) 30%, transparent);\n }\n\n .header-dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n min-width: 200px;\n background: var(--conv-list-bg);\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 15%, transparent);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n z-index: 1001;\n overflow: hidden;\n padding: 4px 0;\n }\n\n .header-dropdown-menu .dropdown-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: transparent;\n border: none;\n color: color-mix(in srgb, var(--conv-list-ink) 85%, transparent);\n font-size: 13px;\n text-align: left;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .header-dropdown-menu .dropdown-item:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: var(--conv-list-ink);\n }\n\n .header-dropdown-menu .dropdown-item i {\n width: 16px;\n font-size: 13px;\n color: color-mix(in srgb, var(--conv-list-ink) 60%, transparent);\n }\n\n .header-dropdown-menu .dropdown-item:hover i {\n color: var(--conv-list-ink);\n }\n\n .header-dropdown-menu .dropdown-item .shortcut {\n margin-left: auto;\n font-size: 11px;\n color: color-mix(in srgb, var(--conv-list-ink) 40%, transparent);\n font-family: system-ui, -apple-system, sans-serif;\n }\n\n .btn-select {\n padding: 8px 12px;\n background: transparent;\n border: 1px solid color-mix(in srgb, var(--conv-list-ink) 20%, transparent);\n border-radius: 6px;\n color: color-mix(in srgb, var(--conv-list-ink) 70%, transparent);\n font-size: 13px;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n .btn-select:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 10%, transparent);\n color: var(--conv-list-ink);\n border-color: color-mix(in srgb, var(--conv-list-ink) 30%, transparent);\n }\n\n\n /* Folders */\n .section-action-btn {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n border-radius: 4px;\n color: color-mix(in srgb, var(--conv-list-ink) 60%, transparent);\n cursor: pointer;\n transition: all 0.2s;\n }\n .section-action-btn:hover {\n background: color-mix(in srgb, var(--conv-list-ink) 15%, transparent);\n color: var(--conv-list-ink);\n }\n .section-action-btn i { font-size: 12px; }\n\n .folder-row {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 5px 8px 5px 12px;\n cursor: pointer;\n color: color-mix(in srgb, var(--conv-list-ink) 80%, transparent);\n font-size: 13px;\n transition: background 0.15s;\n user-select: none;\n position: relative;\n }\n .folder-row:hover { background: color-mix(in srgb, var(--conv-list-ink) 8%, transparent); }\n .folder-row.drag-over {\n background: color-mix(in srgb, var(--conv-list-accent) 25%, transparent);\n box-shadow: inset 0 0 0 1px var(--conv-list-accent);\n }\n .folder-row.dragging { opacity: 0.4; }\n .section-header.drag-over {\n background: color-mix(in srgb, var(--conv-list-accent) 18%, transparent);\n box-shadow: inset 0 0 0 1px var(--conv-list-accent);\n border-radius: 6px;\n }\n .folder-chevron {\n font-size: 9px;\n width: 10px;\n flex-shrink: 0;\n transition: transform 0.2s;\n color: color-mix(in srgb, var(--conv-list-ink) 55%, transparent);\n }\n .folder-chevron.expanded { transform: rotate(90deg); }\n .folder-icon { font-size: 12px; width: 16px; text-align: center; flex-shrink: 0; }\n .folder-name {\n /* NOT flex: 1. Growing to fill the row would push the shared badge to the right\n edge, beside the count, instead of beside the name it describes. The\n .folder-spacer after the badge takes the slack instead. Shrink + min-width:0\n keeps the ellipsis behaviour on a long name. */\n flex: 0 1 auto;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-weight: 600;\n }\n .folder-count {\n font-size: 11px;\n font-weight: 600;\n color: color-mix(in srgb, var(--conv-list-ink) 50%, transparent);\n flex-shrink: 0;\n margin-left: auto;\n padding-left: 6px;\n text-align: right;\n }\n .folder-spacer {\n flex: 1 1 auto;\n min-width: 0;\n }\n .folder-shared {\n flex-shrink: 0;\n margin-left: 6px;\n font-size: 10px;\n line-height: 1;\n /* Same muted treatment as .folder-count, so it reads as metadata and does not\n compete with the folder's own colour. */\n color: color-mix(in srgb, var(--conv-list-ink) 50%, transparent);\n }\n .folder-children { display: block; }\n .folder-empty-hint {\n padding: 6px 16px;\n font-size: 11px;\n font-style: italic;\n color: color-mix(in srgb, var(--conv-list-ink) 45%, transparent);\n }\n .ungrouped-section.drag-over {\n background: color-mix(in srgb, var(--conv-list-accent) 12%, transparent);\n box-shadow: inset 0 0 0 1px var(--conv-list-accent);\n border-radius: 6px;\n }\n\n /* Dragging state. Rows never select text or raise the touch callout, so a\n long-press can select the row instead. */\n .conversation-item { -webkit-touch-callout: none; -webkit-user-select: none; user-select: none; }\n .conversation-item.dragging { opacity: 0.4; }\n\n /* Move-to-folder submenu */\n .menu-item.back { font-weight: 600; }\n .menu-item .submenu-arrow { margin-left: auto; font-size: 10px; }\n .menu-item.current { background: color-mix(in srgb, var(--conv-list-accent) 18%, transparent); }\n .move-folder-list { max-height: 240px; overflow-y: auto; }\n `]\n})\nexport class ConversationListComponent implements OnInit, OnDestroy {\n @Input() EnvironmentId!: string;\n @Input() CurrentUser!: UserInfo;\n @Input() SelectedConversationId: string | null = null;\n @Input() RenamedConversationId: string | null = null;\n @Input() IsSidebarPinned: boolean = true; // Whether sidebar is pinned (stays open after selection)\n @Input() IsMobileView: boolean = false; // Whether we're on mobile (no pin options)\n\n // ── White-label chrome toggles (all default true = stock rendering) ──\n /** Show the search box in the list header. Flipping to false clears any active\n * search so a hidden filter can't keep silently narrowing the list. */\n @Input()\n set showSearch(value: boolean) {\n if (!value && this._searchQuery) {\n this.SearchQuery = ''; // setter rebuilds the groupings\n }\n this._showSearch = value;\n }\n get showSearch(): boolean {\n return this._showSearch;\n }\n private _showSearch = true;\n /** Show the \"New Conversation\" button. */\n @Input() ShowNewConversationButton: boolean = true;\n /** Show the ⋯ header options menu (refresh / select / group-by / hide sidebar). */\n @Input() ShowHeaderMenu: boolean = true;\n /** Show the collapsible Pinned / Folders / Messages section headers. When false,\n * the list renders FLAT and fully expanded: folder grouping is bypassed (the\n * folder tree's root drop-zone and New Folder action live in the section\n * header, so a headerless tree would allow one-way folder nesting) — the\n * chrome-less rendering for embedded hosts. */\n @Input() ShowSectionHeaders: boolean = true;\n\n @Output() ConversationSelected = new EventEmitter<string>();\n /**\n * @deprecated Use {@link ConversationSelected}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (conversationSelected) keeps working. Must stay AFTER ConversationSelected: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() conversationSelected = this.ConversationSelected;\n @Output() ConversationDeleted = new EventEmitter<string>(); // Emits the deleted conversation ID\n /**\n * @deprecated Use {@link ConversationDeleted}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (conversationDeleted) keeps working. Must stay AFTER ConversationDeleted: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() conversationDeleted = this.ConversationDeleted; // Emits the deleted conversation ID\n @Output() NewConversationRequested = new EventEmitter<void>();\n /**\n * @deprecated Use {@link NewConversationRequested}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (newConversationRequested) keeps working. Must stay AFTER NewConversationRequested: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() newConversationRequested = this.NewConversationRequested;\n @Output() PinSidebarRequested = new EventEmitter<void>(); // Request to pin sidebar\n /**\n * @deprecated Use {@link PinSidebarRequested}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (pinSidebarRequested) keeps working. Must stay AFTER PinSidebarRequested: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() pinSidebarRequested = this.PinSidebarRequested; // Request to pin sidebar\n @Output() UnpinSidebarRequested = new EventEmitter<void>(); // Request to unpin (collapse) sidebar\n /**\n * @deprecated Use {@link UnpinSidebarRequested}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (unpinSidebarRequested) keeps working. Must stay AFTER UnpinSidebarRequested: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() unpinSidebarRequested = this.UnpinSidebarRequested; // Request to unpin (collapse) sidebar\n @Output() RefreshRequested = new EventEmitter<void>(); // Emitted after list refresh so chat area can also reload\n /**\n * @deprecated Use {@link RefreshRequested}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (refreshRequested) keeps working. Must stay AFTER RefreshRequested: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() refreshRequested = this.RefreshRequested; // Emitted after list refresh so chat area can also reload\n\n /**\n * The user wants the current filter term searched across all of Chat, not just this list.\n * Emits the term. This panel filters only loaded conversations by Name/Description, so it\n * cannot answer \"where did we discuss X\" — the host owns that surface and the routing to it.\n */\n @Output() SearchEscalated = new EventEmitter<string>();\n\n public DirectMessagesExpanded: boolean = true;\n public PinnedExpanded: boolean = true;\n public FoldersExpanded: boolean = true;\n public UngroupedExpanded: boolean = true;\n /** The open right-click menu, or null. Positioned at the pointer. */\n public ContextMenu: ListContextMenu | null = null;\n\n /** True while the open conversation menu is showing its folder picker. */\n public IsMoveSubmenuOpen: boolean = false;\n\n /** Resources the share dialog is currently offering, one per conversation. */\n public ShareContexts: ResourceShareContext[] = [];\n public ShareNotice: string | null = null;\n public IsShareDialogOpen: boolean = false;\n public ShareAdapter = new MJResourcePermissionShareAdapter(CONVERSATIONS_RESOURCE_TYPE_ID);\n public ConversationIdsWithTasks = new Set<string>();\n public IsSelectionMode: boolean = false;\n public SelectedConversationIds = new Set<string>();\n\n /** Row a Shift-click ranges from — the last row picked without Shift. */\n private selectionAnchorId: string | null = null;\n\n /** Why Share is unavailable, shown on its disabled button. */\n public readonly ShareRefusedReason = 'Only the owner, or someone with Owner access, can share a conversation';\n\n /** Why Move and Pin are unavailable, shown on their disabled buttons. */\n public readonly ChangeRefusedReason = 'You need Edit access to move or pin a conversation shared with you';\n\n /** How long a touch must rest on a row before it selects the row. */\n private static readonly longPressDelayMs = 500;\n\n /** How far a touch may drift, in pixels, before it counts as a scroll rather than a press. */\n private static readonly longPressMoveTolerancePx = 10;\n\n /** Space kept between the right-click menu and the edges of the window. */\n private static readonly menuViewportMargin = 8;\n\n /** The touch press waiting to become a long-press, or null. */\n private longPress: {\n conversation: MJConversationEntity;\n x: number;\n y: number;\n timer: ReturnType<typeof setTimeout>;\n } | null = null;\n\n /** Pointer type of the latest press on a row. On touch, a tap while selecting toggles the row. */\n private lastRowPointerType = 'mouse';\n\n /** Set by a completed long-press, so the click that ends the same press does nothing. */\n private ignoreNextRowClick = false;\n\n public IsHeaderMenuOpen: boolean = false;\n\n public IsRefreshing: boolean = false;\n\n @ViewChild('searchInput') private searchInput?: ElementRef<HTMLInputElement>;\n @ViewChild('contextMenuEl') private contextMenuEl?: ElementRef<HTMLElement>;\n\n /** UserInfoEngine key for persisting folder collapse state + group-by mode. */\n private static readonly folderPrefsKey = 'mj.conversations.folderPrefs.v1';\n\n /** How the conversation list is grouped. 'project' = folders, 'none' = flat list. */\n public GroupBy: ConversationGroupBy = 'project';\n\n /** Field every section of the list is sorted on. */\n public SortBy: ConversationSortBy = 'date';\n\n /** Direction of the current sort. */\n public SortDirection: ConversationSortDirection = 'desc';\n\n /** Direction each field falls back to when it becomes the active sort. */\n private static readonly defaultSortDirections: Record<ConversationSortBy, ConversationSortDirection> = {\n date: 'desc',\n name: 'asc'\n };\n\n /** Precomputed groupings, rebuilt whenever conversations/projects/search change. */\n public PinnedConversations: MJConversationEntity[] = [];\n public UnpinnedConversations: MJConversationEntity[] = [];\n public UngroupedConversations: MJConversationEntity[] = [];\n public FolderTree: FolderNode[] = [];\n /** Flattened folder list (depth-ordered) for the \"Move to folder\" menu. */\n public FlatFolders: FolderNode[] = [];\n\n /** Folder IDs (normalized) whose children are collapsed. Absent = expanded. */\n private collapsedFolderIds = new Set<string>();\n\n /** Drag-and-drop state. */\n /** Conversations currently being dragged — the whole selection when the grabbed row is part of it. */\n public DraggedConversationIds: string[] = [];\n public DraggedFolderId: string | null = null;\n public DragOverTargetId: string | null = null;\n\n private _searchQuery: string = '';\n\n private destroy$ = new Subject<void>();\n\n private engine = ConversationEngine.Instance;\n\n // Local UI state for loading/refreshing\n public IsLoading: boolean = false;\n\n constructor(\n private dialogService: DialogService,\n private notificationService: NotificationService,\n private activeTasksService: ActiveTasksService,\n private mjDialogService: MJDialogService,\n private cdr: ChangeDetectorRef\n ) {}\n\n get SearchQuery(): string {\n return this._searchQuery;\n }\n set SearchQuery(value: string) {\n this._searchQuery = value ?? '';\n this.rebuildGroups();\n this.dropHiddenRowsFromSelection();\n }\n\n /** True when a search filter is active. */\n get IsSearching(): boolean {\n return this._searchQuery.trim().length > 0;\n }\n\n /** Hand the current filter term to the host to search across every Chat entity. */\n EscalateSearch(): void {\n this.SearchEscalated.emit(this._searchQuery.trim());\n }\n\n /** Clears the search box and returns focus to it. */\n public ClearSearch(): void {\n this.SearchQuery = '';\n this.searchInput?.nativeElement.focus();\n }\n\n /** Escape in the search box clears it without closing any host overlay. */\n public OnSearchKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.IsSearching) {\n event.stopPropagation();\n this.ClearSearch();\n }\n }\n\n private filterConversations(conversations: MJConversationEntity[]): MJConversationEntity[] {\n if (!this.IsSearching) {\n return conversations;\n }\n const lowerQuery = this._searchQuery.toLowerCase();\n return conversations.filter(c =>\n (c.Name?.toLowerCase().includes(lowerQuery)) ||\n (c.Description?.toLowerCase().includes(lowerQuery))\n );\n }\n\n ngOnInit() {\n // Restore persisted folder collapse state + group-by preference\n this.loadFolderPrefs();\n\n // Load conversations (and folders) on init\n this.engine.LoadConversations(this.EnvironmentId, this.CurrentUser, false);\n\n // Rebuild the precomputed groupings whenever conversations OR projects change\n // (pin, archive, rename, move-to-folder, folder create/rename/delete, etc.).\n this.engine.Conversations$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => this.onConversationListChanged());\n\n this.engine.Projects$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.rebuildGroups();\n this.cdr.detectChanges();\n });\n\n // Subscribe to conversation IDs with active tasks (hot set)\n this.activeTasksService.conversationIdsWithTasks$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(conversationIds => {\n this.ConversationIdsWithTasks = conversationIds;\n this.cdr.detectChanges(); // Force change detection to ensure spinner icons update reliably\n });\n }\n\n ngOnDestroy() {\n this.CancelLongPress();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Rebuilds the groupings from the engine's list, first dropping selected conversations that left it. */\n private onConversationListChanged(): void {\n this.dropRemovedConversationsFromSelection();\n this.rebuildGroups();\n this.cdr.detectChanges();\n }\n\n @HostListener('document:click')\n onDocumentClick(): void {\n // Close menus when clicking outside\n if (this.ContextMenu) {\n this.CloseContextMenu();\n }\n if (this.IsHeaderMenuOpen) {\n this.CloseHeaderMenu();\n }\n }\n\n @HostListener('document:keydown.escape')\n onDocumentEscape(): void {\n if (this.ContextMenu) {\n this.CloseContextMenu();\n return;\n }\n if (this.IsSelectionMode) {\n this.exitSelectionMode();\n }\n }\n\n public ToggleHeaderMenu(event: Event): void {\n event.stopPropagation();\n this.IsHeaderMenuOpen = !this.IsHeaderMenuOpen;\n }\n\n public CloseHeaderMenu(): void {\n this.IsHeaderMenuOpen = false;\n }\n\n public OnToggleGroupByClick(event: Event): void {\n event.stopPropagation();\n this.ToggleGroupBy();\n this.CloseHeaderMenu();\n }\n\n public async OnRefreshConversationsClick(event: Event): Promise<void> {\n event.stopPropagation();\n if (this.IsRefreshing) return;\n\n this.IsRefreshing = true;\n try {\n await this.engine.LoadConversations(this.EnvironmentId, this.CurrentUser, true);\n // Signal parent to also reload messages in the active conversation\n this.RefreshRequested.emit();\n } catch (error) {\n console.error('Error refreshing conversations:', error);\n await this.dialogService.alert('Error', 'Failed to refresh conversations. Please try again.');\n } finally {\n this.IsRefreshing = false;\n this.cdr.detectChanges();\n this.CloseHeaderMenu();\n }\n }\n\n public OnPinSidebarClick(event: Event): void {\n event.stopPropagation();\n this.CloseHeaderMenu();\n this.PinSidebarRequested.emit();\n }\n\n public OnUnpinSidebarClick(event: Event): void {\n event.stopPropagation();\n this.CloseHeaderMenu();\n this.UnpinSidebarRequested.emit();\n }\n\n public ToggleDirectMessages(): void {\n this.DirectMessagesExpanded = !this.DirectMessagesExpanded;\n this.dropHiddenRowsFromSelection();\n }\n\n public TogglePinned(): void {\n this.PinnedExpanded = !this.PinnedExpanded;\n this.dropHiddenRowsFromSelection();\n }\n\n public ToggleFolders(): void {\n this.FoldersExpanded = !this.FoldersExpanded;\n this.dropHiddenRowsFromSelection();\n }\n\n public ToggleUngrouped(): void {\n this.UngroupedExpanded = !this.UngroupedExpanded;\n this.dropHiddenRowsFromSelection();\n }\n\n // ========================================================================\n // FOLDER GROUPING\n // ========================================================================\n\n /**\n * Recomputes pinned/unpinned/ungrouped lists and the folder tree from the\n * engine's conversation + project caches and the current search filter.\n */\n /**\n * Makes `field` the active sort. Choosing the field that is already active\n * flips the direction; switching fields starts from that field's natural\n * direction (newest first for date, A-Z for name).\n */\n public SetSort(field: ConversationSortBy): void {\n if (this.SortBy === field) {\n this.SortDirection = this.SortDirection === 'asc' ? 'desc' : 'asc';\n } else {\n this.SortBy = field;\n this.SortDirection = ConversationListComponent.defaultSortDirections[field];\n }\n this.saveFolderPrefs();\n this.rebuildGroups();\n }\n\n /** Icon for a sort button: direction arrow when active, plain field icon otherwise. */\n public SortIcon(field: ConversationSortBy): string {\n if (this.SortBy !== field) {\n return field === 'date' ? 'fa-clock' : 'fa-font';\n }\n if (field === 'date') {\n return this.SortDirection === 'asc' ? 'fa-arrow-up-1-9' : 'fa-arrow-down-9-1';\n }\n return this.SortDirection === 'asc' ? 'fa-arrow-up-a-z' : 'fa-arrow-down-z-a';\n }\n\n /**\n * Orders conversations by the active sort. Returns a new array so the caller's\n * source list is never mutated. Conversations with no name sort last.\n */\n private sortConversations(conversations: MJConversationEntity[]): MJConversationEntity[] {\n const factor = this.SortDirection === 'asc' ? 1 : -1;\n return [...conversations].sort((a, b) => {\n if (this.SortBy === 'name') {\n const aName = a.Name?.trim() ?? '';\n const bName = b.Name?.trim() ?? '';\n if (!aName || !bName) {\n return aName === bName ? 0 : (aName ? -1 : 1);\n }\n return aName.localeCompare(bName, undefined, { sensitivity: 'base' }) * factor;\n }\n return (this.updatedTime(a) - this.updatedTime(b)) * factor;\n });\n }\n\n /** Position of a conversation in a rendered-order list, or -1. Case-insensitive on the ID. */\n private indexOfConversation(order: string[], conversationId: string | null): number {\n if (!conversationId) return -1;\n return order.findIndex(id => UUIDsEqual(id, conversationId));\n }\n\n private updatedTime(conversation: MJConversationEntity): number {\n const updatedAt = conversation.__mj_UpdatedAt;\n return updatedAt ? new Date(updatedAt).getTime() : 0;\n }\n\n private rebuildGroups(): void {\n const matching = this.sortConversations(this.filterConversations(this.engine.Conversations));\n this.PinnedConversations = matching.filter(c => c.IsPinned);\n this.UnpinnedConversations = matching.filter(c => !c.IsPinned);\n\n const projects = this.engine.Projects;\n const projectIds = new Set(projects.map(p => NormalizeUUID(p.ID)));\n\n // Bucket unpinned conversations by their folder (pinned ones live in the\n // Pinned section). Conversations with no/unknown folder are \"ungrouped\".\n const conversationsByProject = new Map<string, MJConversationEntity[]>();\n const ungrouped: MJConversationEntity[] = [];\n for (const c of this.UnpinnedConversations) {\n const pid = c.ProjectID ? NormalizeUUID(c.ProjectID) : null;\n if (pid && projectIds.has(pid)) {\n const arr = conversationsByProject.get(pid) ?? [];\n arr.push(c);\n conversationsByProject.set(pid, arr);\n } else {\n ungrouped.push(c);\n }\n }\n this.UngroupedConversations = ungrouped;\n\n // Index projects by parent. A project whose parent isn't loaded is treated\n // as a root so it never disappears from the tree.\n const childrenByParent = new Map<string | null, MJProjectEntity[]>();\n for (const p of projects) {\n const parentId = p.ParentID ? NormalizeUUID(p.ParentID) : null;\n const key = parentId && projectIds.has(parentId) ? parentId : null;\n const arr = childrenByParent.get(key) ?? [];\n arr.push(p);\n childrenByParent.set(key, arr);\n }\n\n const build = (parentKey: string | null, depth: number): FolderNode[] => {\n const projectsAtLevel = childrenByParent.get(parentKey) ?? [];\n return projectsAtLevel.map(p => {\n const children = build(NormalizeUUID(p.ID), depth + 1);\n const conversations = conversationsByProject.get(NormalizeUUID(p.ID)) ?? [];\n const totalCount = conversations.length + children.reduce((sum, ch) => sum + ch.totalCount, 0);\n const hasContent = conversations.length > 0 || children.some(ch => ch.hasContent);\n return { project: p, depth, conversations, children, totalCount, hasContent };\n });\n };\n this.FolderTree = build(null, 0);\n this.FlatFolders = this.flattenFolders(this.FolderTree);\n }\n\n private flattenFolders(nodes: FolderNode[]): FolderNode[] {\n const out: FolderNode[] = [];\n for (const node of nodes) {\n out.push(node);\n out.push(...this.flattenFolders(node.children));\n }\n return out;\n }\n\n private findFolderNode(nodes: FolderNode[], projectId: string): FolderNode | null {\n for (const node of nodes) {\n if (UUIDsEqual(node.project.ID, projectId)) return node;\n const found = this.findFolderNode(node.children, projectId);\n if (found) return found;\n }\n return null;\n }\n\n public IsFolderExpanded(projectId: string): boolean {\n return !this.collapsedFolderIds.has(NormalizeUUID(projectId));\n }\n\n public ToggleFolder(projectId: string): void {\n const key = NormalizeUUID(projectId);\n if (this.collapsedFolderIds.has(key)) {\n this.collapsedFolderIds.delete(key);\n } else {\n this.collapsedFolderIds.add(key);\n }\n this.saveFolderPrefs();\n this.dropHiddenRowsFromSelection();\n }\n\n public ToggleGroupBy(): void {\n this.GroupBy = this.GroupBy === 'project' ? 'none' : 'project';\n this.saveFolderPrefs();\n this.rebuildGroups();\n this.dropHiddenRowsFromSelection();\n }\n\n private loadFolderPrefs(): void {\n try {\n const raw = UserInfoEngine.Instance.GetSetting(ConversationListComponent.folderPrefsKey);\n if (!raw) return;\n const parsed = JSON.parse(raw) as {\n collapsed?: string[];\n groupBy?: ConversationGroupBy;\n sortBy?: ConversationSortBy;\n sortDirection?: ConversationSortDirection;\n };\n this.collapsedFolderIds = new Set((parsed.collapsed ?? []).map(id => NormalizeUUID(id)));\n if (parsed.groupBy === 'none' || parsed.groupBy === 'project') {\n this.GroupBy = parsed.groupBy;\n }\n if (parsed.sortBy === 'date' || parsed.sortBy === 'name') {\n this.SortBy = parsed.sortBy;\n }\n if (parsed.sortDirection === 'asc' || parsed.sortDirection === 'desc') {\n this.SortDirection = parsed.sortDirection;\n }\n } catch {\n // Corrupt/legacy value — ignore and use defaults\n }\n }\n\n private saveFolderPrefs(): void {\n const payload = JSON.stringify({\n collapsed: Array.from(this.collapsedFolderIds),\n groupBy: this.GroupBy,\n sortBy: this.SortBy,\n sortDirection: this.SortDirection\n });\n UserInfoEngine.Instance.SetSettingDebounced(ConversationListComponent.folderPrefsKey, payload);\n }\n\n // ========================================================================\n // DRAG & DROP (move conversation into/out of a folder)\n // ========================================================================\n\n /**\n * Starts a conversation drag. Grabbing a row that is part of the current\n * selection drags the whole selection; grabbing any other row drags that row\n * alone and leaves the selection untouched. A touch press that lifts the row\n * selects it instead, since on touch a long-press means select.\n */\n public OnConversationDragStart(conversation: MJConversationEntity, event: DragEvent): void {\n if (this.lastRowPointerType === 'touch') {\n event.preventDefault();\n this.completeLongPress();\n return;\n }\n this.DraggedFolderId = null;\n this.DraggedConversationIds = this.SelectedConversationIds.has(conversation.ID)\n ? Array.from(this.SelectedConversationIds)\n : [conversation.ID];\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', this.DraggedConversationIds.join(','));\n }\n }\n\n public OnConversationDragEnd(): void {\n this.DraggedConversationIds = [];\n this.DragOverTargetId = null;\n }\n\n public OnFolderDragStart(node: FolderNode, event: DragEvent): void {\n event.stopPropagation();\n this.DraggedConversationIds = [];\n this.DraggedFolderId = node.project.ID;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', node.project.ID);\n }\n }\n\n public OnFolderDragEnd(): void {\n this.DraggedFolderId = null;\n this.DragOverTargetId = null;\n }\n\n public OnFolderDragOver(projectId: string, event: DragEvent): void {\n // A conversation can drop onto any folder; a folder can drop onto any folder\n // that isn't itself or one of its own descendants (which would create a cycle).\n const accepts = this.DraggedConversationIds.length > 0\n ? true\n : this.DraggedFolderId\n ? this.isValidFolderDropTarget(projectId)\n : false;\n if (!accepts) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.DragOverTargetId = projectId;\n }\n\n /**\n * Drop target id for a conversation row: its folder, or the Ungrouped section\n * when it has none. Resolved through the folder tree so the highlight matches\n * the folder row's own ID regardless of how the conversation stores it.\n */\n public ConversationDropTargetId(conversation: MJConversationEntity): string {\n if (!conversation.ProjectID) return 'ungrouped';\n const node = this.FlatFolders.find(f => UUIDsEqual(f.project.ID, conversation.ProjectID!));\n return node ? node.project.ID : 'ungrouped';\n }\n\n /**\n * A conversation row accepts a conversation drag and stands in for its folder,\n * so dropping onto the rows inside a folder files the drag there too. A row\n * that is part of the drag itself is not a target.\n */\n public OnConversationRowDragOver(conversation: MJConversationEntity, event: DragEvent): void {\n if (this.DraggedConversationIds.length === 0) return;\n if (this.DraggedConversationIds.some(id => UUIDsEqual(id, conversation.ID))) return;\n event.preventDefault();\n event.stopPropagation();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.DragOverTargetId = this.ConversationDropTargetId(conversation);\n }\n\n public async OnConversationRowDrop(conversation: MJConversationEntity, event: DragEvent): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n const conversationIds = this.DraggedConversationIds.filter(id => !UUIDsEqual(id, conversation.ID));\n this.DragOverTargetId = null;\n this.DraggedConversationIds = [];\n if (conversationIds.length > 0) {\n await this.moveConversations(conversationIds, conversation.ProjectID ?? null);\n }\n }\n\n public OnUngroupedDragOver(event: DragEvent): void {\n if (this.DraggedConversationIds.length === 0) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.DragOverTargetId = 'ungrouped';\n }\n\n /** The Folders section header accepts a dragged folder to move it back to the top level. */\n public OnFoldersRootDragOver(event: DragEvent): void {\n if (!this.DraggedFolderId) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n this.DragOverTargetId = 'folders-root';\n }\n\n public OnDragLeave(targetId: string): void {\n if (this.DragOverTargetId === targetId) {\n this.DragOverTargetId = null;\n }\n }\n\n public async OnFolderDrop(project: MJProjectEntity, event: DragEvent): Promise<void> {\n event.preventDefault();\n const conversationIds = this.DraggedConversationIds;\n const folderId = this.DraggedFolderId;\n this.DragOverTargetId = null;\n this.DraggedConversationIds = [];\n this.DraggedFolderId = null;\n if (conversationIds.length > 0) {\n await this.moveConversations(conversationIds, project.ID);\n } else if (folderId && this.isValidFolderDropTarget(project.ID, folderId)) {\n await this.moveFolder(folderId, project.ID);\n }\n }\n\n public async OnUngroupedDrop(event: DragEvent): Promise<void> {\n event.preventDefault();\n const conversationIds = this.DraggedConversationIds;\n this.DragOverTargetId = null;\n this.DraggedConversationIds = [];\n if (conversationIds.length > 0) {\n await this.moveConversations(conversationIds, null);\n }\n }\n\n public OnFoldersRootDrop(event: DragEvent): void {\n event.preventDefault();\n const folderId = this.DraggedFolderId;\n this.DragOverTargetId = null;\n this.DraggedFolderId = null;\n if (folderId) {\n this.moveFolder(folderId, null);\n }\n }\n\n /**\n * A folder can be dropped onto a target folder only if the target isn't the dragged\n * folder itself and isn't one of its descendants (otherwise we'd create a cycle).\n */\n private isValidFolderDropTarget(targetId: string, draggedId: string | null = this.DraggedFolderId): boolean {\n if (!draggedId) return false;\n if (UUIDsEqual(targetId, draggedId)) return false;\n return !this.isDescendantOf(targetId, draggedId);\n }\n\n /** True when `nodeId` is a descendant of `ancestorId` in the folder tree. */\n private isDescendantOf(nodeId: string, ancestorId: string): boolean {\n const byId = new Map(this.engine.Projects.map(p => [NormalizeUUID(p.ID), p]));\n const visited = new Set<string>();\n let current = byId.get(NormalizeUUID(nodeId));\n while (current?.ParentID) {\n const parentKey = NormalizeUUID(current.ParentID);\n if (visited.has(parentKey)) break; // guard against malformed cycles\n visited.add(parentKey);\n if (UUIDsEqual(parentKey, ancestorId)) return true;\n current = byId.get(parentKey);\n }\n return false;\n }\n\n /** Assigns a conversation to a folder (or null to ungroup) and refreshes the view. */\n private async moveConversation(conversationId: string, projectId: string | null): Promise<void> {\n await this.moveConversations([conversationId], projectId);\n }\n\n /**\n * Assigns several conversations to a folder (or null to ungroup) in one batch,\n * reveals the destination folder, and refreshes the view.\n */\n private async moveConversations(conversationIds: string[], projectId: string | null): Promise<void> {\n // Dropping onto a folder's own contents is easy to do by accident — skip the\n // conversations that already live there rather than re-saving them.\n const toMove = conversationIds.filter(id => !this.isInProject(id, projectId));\n if (toMove.length === 0) return;\n\n try {\n const result = await this.engine.MoveMultipleConversationsToProject(toMove, projectId, this.CurrentUser);\n // Reveal the destination folder so the user sees where they landed\n if (projectId) {\n this.collapsedFolderIds.delete(NormalizeUUID(projectId));\n }\n await this.reportBulkOutcome(result, 'moved');\n this.rebuildGroups();\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Error moving conversations:', error);\n await this.dialogService.alert(\n 'Error',\n `Failed to move the selected conversation${toMove.length === 1 ? '' : 's'}. Please try again.`\n );\n }\n }\n\n /** True when a conversation already sits in the given folder (or in no folder). */\n private isInProject(conversationId: string, projectId: string | null): boolean {\n const conversation = this.engine.GetConversation(conversationId);\n if (!conversation) return false;\n const current = conversation.ProjectID ?? null;\n return projectId ? !!current && UUIDsEqual(current, projectId) : !current;\n }\n\n /** Reparents a folder under another folder (or to the top level when projectId is null). */\n private async moveFolder(folderId: string, parentId: string | null): Promise<void> {\n // No-op if it's already under that parent\n const folder = this.engine.Projects.find(p => UUIDsEqual(p.ID, folderId));\n const currentParent = folder?.ParentID ?? null;\n const sameParent = (currentParent === null && parentId === null) ||\n (!!currentParent && !!parentId && UUIDsEqual(currentParent, parentId));\n if (sameParent) return;\n\n try {\n await this.engine.MoveProjectToParent(folderId, parentId, this.CurrentUser);\n // Reveal the new parent so the moved folder is visible\n if (parentId) {\n this.collapsedFolderIds.delete(NormalizeUUID(parentId));\n }\n this.rebuildGroups();\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Error moving folder:', error);\n await this.dialogService.alert('Error', 'Failed to move folder. Please try again.');\n }\n }\n\n // ========================================================================\n // RIGHT-CLICK MENU — one menu for rows, folders and empty space\n // ========================================================================\n\n /**\n * Opens the conversation menu. It acts on the whole selection when the clicked\n * row is part of it, and on that row alone otherwise — so right-clicking\n * something you had not selected never disturbs the selection.\n */\n public OnConversationContextMenu(conversation: MJConversationEntity, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.lastRowPointerType === 'touch') {\n // Some touch browsers report a long-press as a right-click; it selects instead.\n this.completeLongPress();\n return;\n }\n const targets = this.SelectedConversationIds.has(conversation.ID)\n ? Array.from(this.SelectedConversationIds)\n : [conversation.ID];\n this.openContextMenu({ kind: 'conversation', conversation, folder: null, targets }, this.pointerAnchor(event));\n }\n\n /** The row's ⋯ button opens the same menu, anchored under the button. */\n public OpenRowMenu(conversation: MJConversationEntity, event: MouseEvent): void {\n event.stopPropagation();\n const targets = this.SelectedConversationIds.has(conversation.ID)\n ? Array.from(this.SelectedConversationIds)\n : [conversation.ID];\n this.openContextMenu({ kind: 'conversation', conversation, folder: null, targets }, this.buttonAnchor(event));\n }\n\n public OnFolderContextMenu(project: MJProjectEntity, event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.openContextMenu({ kind: 'folder', conversation: null, folder: project, targets: [] }, this.pointerAnchor(event));\n }\n\n /** Empty space: a click that landed on a row or folder is theirs, not the list's. */\n public OnBackgroundContextMenu(event: MouseEvent): void {\n const target = event.target as HTMLElement | null;\n if (target?.closest('.conversation-item, .folder-row')) return;\n event.preventDefault();\n this.openContextMenu({ kind: 'background', conversation: null, folder: null, targets: [] }, this.pointerAnchor(event));\n }\n\n /** A menu opened at the pointer opens upward from the pointer when it must. */\n private pointerAnchor(event: MouseEvent): MenuAnchor {\n return { x: event.clientX, y: event.clientY, flipBottom: event.clientY };\n }\n\n /** A menu opened from a button sits under it, or above it when there is no room below. */\n private buttonAnchor(event: MouseEvent): MenuAnchor {\n const rect = (event.currentTarget as HTMLElement | null)?.getBoundingClientRect();\n if (!rect) return this.pointerAnchor(event);\n return { x: rect.left, y: rect.bottom + 2, flipBottom: rect.top - 2 };\n }\n\n private openContextMenu(\n menu: Omit<ListContextMenu, 'x' | 'y' | 'anchor'>,\n anchor: MenuAnchor,\n showFolderPicker = false\n ): void {\n this.IsMoveSubmenuOpen = showFolderPicker;\n this.ContextMenu = { ...menu, anchor, x: anchor.x, y: anchor.y };\n this.fitContextMenuInViewport();\n }\n\n /**\n * Keeps the open menu inside the window: it opens upward from its anchor when\n * there is no room below, and moves left when there is no room to the right.\n * Runs again whenever the folder picker changes the menu's height.\n */\n private fitContextMenuInViewport(): void {\n if (!this.ContextMenu) return;\n this.cdr.detectChanges(); // render the menu so it can be measured\n const menuElement = this.contextMenuEl?.nativeElement;\n if (!menuElement) return;\n\n const { width, height } = menuElement.getBoundingClientRect();\n const { anchor } = this.ContextMenu;\n const margin = ConversationListComponent.menuViewportMargin;\n\n let y = anchor.y;\n if (y + height > window.innerHeight - margin) {\n const above = anchor.flipBottom - height;\n y = above >= margin ? above : Math.max(margin, window.innerHeight - margin - height);\n }\n const x = Math.max(margin, Math.min(anchor.x, window.innerWidth - margin - width));\n\n this.ContextMenu = { ...this.ContextMenu, x, y };\n this.cdr.detectChanges();\n }\n\n public CloseContextMenu(): void {\n this.ContextMenu = null;\n this.IsMoveSubmenuOpen = false;\n }\n\n public OpenMoveSubmenu(event: Event): void {\n event.stopPropagation();\n this.IsMoveSubmenuOpen = true;\n this.fitContextMenuInViewport();\n }\n\n public CloseMoveSubmenu(event: Event): void {\n event.stopPropagation();\n this.IsMoveSubmenuOpen = false;\n this.fitContextMenuInViewport();\n }\n\n /** Marks the folder a single conversation already sits in. Never marks a multi-target menu. */\n public IsSingleTargetInFolder(projectId: string | null): boolean {\n const conversation = this.ContextMenu?.conversation;\n if (!conversation || this.ContextMenu?.targets.length !== 1) return false;\n return projectId\n ? !!conversation.ProjectID && UUIDsEqual(conversation.ProjectID, projectId)\n : !conversation.ProjectID;\n }\n\n /** Conversations the menu's actions apply to — its targets, or the selection. */\n private actionTargetIds(): string[] {\n const targets = this.ContextMenu?.targets ?? [];\n return targets.length > 0 ? targets : Array.from(this.SelectedConversationIds);\n }\n\n public ContextMoveToFolder(projectId: string | null): void {\n void this.BulkMoveToFolder(projectId);\n }\n\n public ContextMoveToNewFolder(event: Event): void {\n event.stopPropagation();\n const ids = this.actionTargetIds();\n this.CloseContextMenu();\n this.openFolderModal(null, null, (created) => this.moveConversations(ids, created.ID));\n }\n\n public ContextSetPinned(isPinned: boolean): void {\n void this.BulkSetPinned(isPinned);\n }\n\n public ContextTogglePin(): void {\n const conversation = this.ContextMenu?.conversation;\n if (!conversation) return;\n void this.BulkSetPinned(!conversation.IsPinned);\n }\n\n /** Shares the menu's targets — the whole selection, or just the clicked row. */\n public ContextShare(): void {\n const ids = this.actionTargetIds();\n this.CloseContextMenu();\n this.shareConversations(ids);\n }\n\n /**\n * Opens the dialog the chat header uses for the conversations the user may\n * share, and reports how many were left out. Says why when there are none.\n */\n private shareConversations(ids: string[]): void {\n const conversations = ids\n .map(id => this.engine.GetConversation(id))\n .filter((c): c is MJConversationEntity => !!c);\n const shareable = conversations.filter(c => this.canShare(c));\n if (shareable.length === 0) {\n void this.dialogService.alert('Cannot Share', `${this.ShareRefusedReason}.`);\n return;\n }\n\n const skipped = conversations.length - shareable.length;\n this.ShareContexts = shareable.map(c => ({\n ResourceID: c.ID,\n ResourceName: c.Name ?? 'Conversation',\n OwnerUserID: c.UserID ?? null,\n OwnerDisplayName: c.User ?? 'You',\n CurrentUserID: this.CurrentUser?.ID ?? null\n }));\n this.ShareNotice = skipped > 0\n ? `${skipped} of ${conversations.length} left out — ${this.ShareRefusedReason.toLowerCase()}.`\n : null;\n this.IsShareDialogOpen = true;\n }\n\n /** True when at least one of the conversations can be shared by the current user. */\n public CanShareAny(ids: string[]): boolean {\n return ids.some(id => this.canShare(this.engine.GetConversation(id)));\n }\n\n private canShare(conversation: MJConversationEntity | undefined): boolean {\n if (!conversation || !this.CurrentUser) return false;\n return this.engine.CanShareConversation(conversation, this.CurrentUser.ID);\n }\n\n /** True when at least one of the conversations can be moved or pinned by the current user. */\n public CanChangeAny(ids: string[]): boolean {\n return ids.some(id => {\n const conversation = this.engine.GetConversation(id);\n return !!conversation && this.CanChange(conversation);\n });\n }\n\n /** True when the user may move or pin the conversation: they own it, or hold Edit or Owner access. */\n public CanChange(conversation: MJConversationEntity): boolean {\n if (!this.CurrentUser) return false;\n return this.engine.CanEditConversation(conversation, this.CurrentUser.ID);\n }\n\n public OnShareDialogResult(_result: ResourceShareDialogResult): void {\n this.IsShareDialogOpen = false;\n this.ShareContexts = [];\n this.ShareNotice = null;\n this.cdr.detectChanges();\n }\n\n public ContextRename(): void {\n const conversation = this.ContextMenu?.conversation;\n this.CloseContextMenu();\n if (conversation) this.RenameConversation(conversation);\n }\n\n public ContextDelete(): void {\n void this.BulkDeleteConversations();\n }\n\n public ContextCreateSubfolder(event: Event): void {\n const folder = this.ContextMenu?.folder;\n this.CloseContextMenu();\n if (folder) this.CreateFolder(folder.ID, event);\n }\n\n public ContextEditFolder(event: Event): void {\n const folder = this.ContextMenu?.folder;\n this.CloseContextMenu();\n if (folder) this.EditFolder(folder, event);\n }\n\n public ContextDeleteFolder(event: Event): void {\n const folder = this.ContextMenu?.folder;\n this.CloseContextMenu();\n if (folder) void this.DeleteFolder(folder, event);\n }\n\n public ContextNewConversation(): void {\n this.CloseContextMenu();\n this.CreateNewConversation();\n }\n\n public ContextCreateRootFolder(event: Event): void {\n this.CloseContextMenu();\n this.CreateFolder(null, event);\n }\n\n public ContextSelectAll(): void {\n this.CloseContextMenu();\n this.IsSelectionMode = true;\n this.SelectAll();\n }\n\n // ========================================================================\n // FOLDER CRUD (reuses the existing project form modal)\n // ========================================================================\n\n public CreateFolder(parentId: string | null, event?: Event): void {\n if (event) event.stopPropagation();\n this.openFolderModal(null, parentId);\n }\n\n public EditFolder(project: MJProjectEntity, event?: Event): void {\n if (event) event.stopPropagation();\n this.openFolderModal(project, null);\n }\n\n private openFolderModal(\n project: MJProjectEntity | null,\n parentId: string | null,\n onCreated?: (project: MJProjectEntity) => void\n ): void {\n const dialogRef = this.mjDialogService.open({\n content: ProjectFormModalComponent,\n width: 600,\n minWidth: 400\n });\n\n const instance = dialogRef.Content!.instance as unknown as ProjectFormModalComponent;\n instance.dialogRef = dialogRef;\n instance.environmentId = this.EnvironmentId;\n instance.currentUser = this.CurrentUser;\n if (project) instance.project = project;\n if (parentId) instance.parentId = parentId;\n\n instance.projectSaved.subscribe((saved: MJProjectEntity) => {\n // The engine's entity-event handler keeps the projects cache in sync; we\n // just reveal the parent and refresh, then run any post-create action.\n if (parentId) {\n this.collapsedFolderIds.delete(NormalizeUUID(parentId));\n }\n this.rebuildGroups();\n this.cdr.detectChanges();\n if (onCreated) onCreated(saved);\n });\n }\n\n public async DeleteFolder(project: MJProjectEntity, event?: Event): Promise<void> {\n if (event) event.stopPropagation();\n\n const node = this.findFolderNode(this.FolderTree, project.ID);\n const total = node?.totalCount ?? 0;\n const childCount = node?.children.length ?? 0;\n\n let message = `Are you sure you want to delete the folder \"${project.Name}\"?`;\n if (total > 0 || childCount > 0) {\n message += `\\n\\nConversations inside will be moved out of the folder`;\n message += childCount > 0 ? ` and subfolders will move up one level.` : `.`;\n message += ` Nothing is deleted.`;\n }\n\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Folder',\n message,\n okText: 'Delete',\n cancelText: 'Cancel',\n dangerous: true\n });\n if (!confirmed) return;\n\n try {\n await this.engine.DeleteProject(project.ID, this.CurrentUser);\n this.collapsedFolderIds.delete(NormalizeUUID(project.ID));\n this.rebuildGroups();\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Error deleting folder:', error);\n await this.dialogService.alert(\n 'Error',\n error instanceof Error ? error.message : 'Failed to delete folder. Please try again.'\n );\n }\n }\n\n IsConversationActive(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(conversation.ID, this.SelectedConversationId);\n }\n\n /** True when this conversation is part of the current multi-selection. */\n IsConversationSelected(conversation: MJConversationEntity): boolean {\n return this.IsSelectionMode && this.SelectedConversationIds.has(conversation.ID);\n }\n\n IsConversationRenamed(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(conversation.ID, this.RenamedConversationId);\n }\n\n IsConversationDragging(conversation: MJConversationEntity): boolean {\n return this.DraggedConversationIds.some(id => UUIDsEqual(id, conversation.ID));\n }\n\n SelectConversation(conversation: MJConversationEntity): void {\n this.ConversationSelected.emit(conversation.ID);\n // Clear unread notifications when conversation is opened\n this.notificationService.markConversationAsRead(conversation.ID);\n }\n\n async CreateNewConversation(): Promise<void> {\n // Don't create DB record yet - just show the welcome screen\n // Conversation will be created when user sends first message\n this.NewConversationRequested.emit();\n }\n\n async RenameConversation(conversation: MJConversationEntity): Promise<void> {\n try {\n const result = await this.dialogService.input({\n title: 'Edit Conversation',\n message: 'Update the name and description for this conversation',\n inputLabel: 'Conversation Name',\n inputValue: conversation.Name || '',\n placeholder: 'My Conversation',\n required: true,\n secondInputLabel: 'Description',\n secondInputValue: conversation.Description || '',\n secondInputPlaceholder: 'Optional description',\n secondInputRequired: false,\n okText: 'Save',\n cancelText: 'Cancel'\n });\n\n if (result) {\n const newName = typeof result === 'string' ? result : result.value;\n const newDescription = typeof result === 'string' ? conversation.Description : result.secondValue;\n\n if (newName !== conversation.Name || newDescription !== conversation.Description) {\n await this.engine.SaveConversation(\n conversation.ID,\n { Name: newName, Description: newDescription || '' },\n this.CurrentUser\n );\n }\n }\n } catch (error) {\n console.error('Error renaming conversation:', error);\n await this.dialogService.alert('Error', 'Failed to update conversation. Please try again.');\n }\n }\n\n async DeleteConversation(conversation: MJConversationEntity): Promise<void> {\n try {\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Conversation',\n message: `Are you sure you want to delete \"${conversation.Name}\"? This action cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel'\n });\n\n if (confirmed) {\n const deletedId = conversation.ID;\n await this.engine.DeleteConversation(deletedId, this.CurrentUser);\n this.cdr.detectChanges();\n this.ConversationDeleted.emit(deletedId);\n }\n } catch (error) {\n console.error('Error deleting conversation:', error);\n await this.dialogService.alert('Error', 'Failed to delete conversation. Please try again.');\n }\n }\n\n async TogglePin(conversation: MJConversationEntity, event?: Event): Promise<void> {\n if (event) event.stopPropagation();\n this.CloseContextMenu(); // Close immediately on user action — don't wait for the async op\n try {\n await this.engine.PinConversation(conversation.ID, !conversation.IsPinned, this.CurrentUser);\n } catch (error) {\n console.error('Error toggling pin:', error);\n await this.dialogService.alert('Error', 'Failed to pin/unpin conversation. Please try again.');\n }\n }\n\n HasActiveTasks(conversationId: string): boolean {\n return this.ConversationIdsWithTasks.has(conversationId);\n }\n\n /** True when this conversation was shared with the current user by someone else. */\n IsSharedWithMe(conversation: MJConversationEntity): boolean {\n return this.engine.GetSharedByInfo(conversation.ID) !== null;\n }\n\n /** Tooltip for the sidebar share icon: \"Shared by {email or name}\". */\n SharedWithMeTooltip(conversation: MJConversationEntity): string {\n const info = this.engine.GetSharedByInfo(conversation.ID);\n if (!info) return 'Shared with you';\n return `Shared by ${info.Email ?? info.Name ?? 'another user'}`;\n }\n\n ToggleSelectionMode(): void {\n if (this.IsSelectionMode) {\n this.exitSelectionMode();\n } else {\n this.IsSelectionMode = true;\n }\n }\n\n /**\n * Clicking the empty space of the list drops the selection, the way clicking\n * blank space in a file browser does. A click that landed on a row, folder,\n * section header or button is handled by that element instead.\n */\n public OnListBackgroundClick(event: MouseEvent): void {\n if (!this.IsSelectionMode) return;\n\n const target = event.target as HTMLElement | null;\n if (target?.closest('.conversation-item, .folder-row, .section-header, button')) return;\n\n this.exitSelectionMode();\n }\n\n private exitSelectionMode(): void {\n this.IsSelectionMode = false;\n this.SelectedConversationIds.clear();\n this.selectionAnchorId = null;\n }\n\n /** Ends selection mode from the selection bar's clear button. */\n public ClearSelection(): void {\n this.exitSelectionMode();\n }\n\n /** Selection mode closes itself once the last row is deselected. */\n private exitSelectionModeIfEmpty(): void {\n if (this.SelectedConversationIds.size === 0) {\n this.exitSelectionMode();\n }\n }\n\n /** Adds or removes one row and makes it the range anchor, ending the mode when nothing is left. */\n private toggleRowSelection(conversationId: string): void {\n this.ToggleConversationSelection(conversationId);\n this.selectionAnchorId = conversationId;\n this.exitSelectionModeIfEmpty();\n }\n\n /**\n * Drops selected rows the view no longer shows — after a search edit, a\n * collapse, or a grouping change — so no action can reach a row the user\n * cannot see. A list rebuild alone does not call this: a move into a\n * collapsed folder keeps its rows selected for a follow-up action.\n */\n private dropHiddenRowsFromSelection(): void {\n if (this.SelectedConversationIds.size === 0) return;\n const visible = new Set(this.visibleConversationIds().map(id => NormalizeUUID(id)));\n this.removeFromSelection(id => !visible.has(NormalizeUUID(id)));\n }\n\n /** Drops selected conversations that are no longer in the engine's list at all. */\n private dropRemovedConversationsFromSelection(): void {\n if (this.SelectedConversationIds.size === 0) return;\n const listed = new Set(this.engine.Conversations.map(c => NormalizeUUID(c.ID)));\n this.removeFromSelection(id => !listed.has(NormalizeUUID(id)));\n }\n\n /** Removes the selected IDs that match, and ends selection mode if none remain. */\n private removeFromSelection(shouldRemove: (conversationId: string) => boolean): void {\n for (const id of Array.from(this.SelectedConversationIds)) {\n if (shouldRemove(id)) {\n this.SelectedConversationIds.delete(id);\n }\n }\n this.exitSelectionModeIfEmpty();\n }\n\n /**\n * Adds the open conversation to a selection that is just starting, so it moves\n * with the rows picked alongside it. Returns the id added, or null when nothing\n * is open or it is hidden inside a collapsed folder or section.\n */\n private seedSelectionWithOpenConversation(): string | null {\n const openId = this.SelectedConversationId;\n if (!openId) return null;\n const visibleId = this.visibleConversationIds().find(id => UUIDsEqual(id, openId));\n if (!visibleId) return null;\n this.SelectedConversationIds.add(visibleId);\n return visibleId;\n }\n\n /** Conversation IDs in the order the list renders them, skipping collapsed sections and folders. */\n private visibleConversationIds(): string[] {\n const ids: string[] = [];\n const sectionOpen = (expanded: boolean) => !this.ShowSectionHeaders || expanded;\n\n if (sectionOpen(this.PinnedExpanded)) {\n ids.push(...this.PinnedConversations.map(c => c.ID));\n }\n\n if (this.ShowSectionHeaders && this.GroupBy === 'project') {\n if (this.FoldersExpanded) {\n // Subfolders render above their parent folder's own conversations.\n const walk = (nodes: FolderNode[]): void => {\n for (const node of nodes) {\n if (!this.IsFolderExpanded(node.project.ID)) continue;\n walk(node.children);\n ids.push(...node.conversations.map(c => c.ID));\n }\n };\n walk(this.FolderTree);\n }\n if (this.UngroupedExpanded) {\n ids.push(...this.UngroupedConversations.map(c => c.ID));\n }\n } else if (sectionOpen(this.DirectMessagesExpanded)) {\n ids.push(...this.UnpinnedConversations.map(c => c.ID));\n }\n\n return ids;\n }\n\n /**\n * Adds every row between the anchor and `conversationId` to the selection.\n * Rows already picked stay picked — a range never takes a selection away.\n *\n * With nothing picked yet the open conversation stands in as the anchor, so a\n * single Shift-click highlights the span from it rather than one lone row.\n */\n private selectRangeTo(conversationId: string): void {\n const order = this.visibleConversationIds();\n const end = this.indexOfConversation(order, conversationId);\n if (end < 0) return;\n\n const anchorId = this.selectionAnchorId ?? this.SelectedConversationId;\n const start = this.indexOfConversation(order, anchorId);\n if (start < 0) {\n // No anchor and no open conversation on screen — pick this row alone.\n this.SelectedConversationIds.add(conversationId);\n this.selectionAnchorId = conversationId;\n return;\n }\n this.selectionAnchorId = order[start];\n\n const [from, to] = start <= end ? [start, end] : [end, start];\n for (let i = from; i <= to; i++) {\n this.SelectedConversationIds.add(order[i]);\n }\n }\n\n ToggleConversationSelection(conversationId: string): void {\n if (this.SelectedConversationIds.has(conversationId)) {\n this.SelectedConversationIds.delete(conversationId);\n } else {\n this.SelectedConversationIds.add(conversationId);\n }\n }\n\n /** Selects every row on screen — never rows hidden by the search or a collapsed folder or section. */\n SelectAll(): void {\n this.visibleConversationIds().forEach(id => {\n this.SelectedConversationIds.add(id);\n });\n }\n\n DeselectAll(): void {\n this.SelectedConversationIds.clear();\n }\n\n /**\n * Moves the conversations into one folder, or out of all folders when projectId\n * is null. The selection survives so a second bulk action can follow.\n */\n async BulkMoveToFolder(projectId: string | null, ids: string[] = this.actionTargetIds()): Promise<void> {\n this.CloseContextMenu();\n if (ids.length === 0) return;\n\n try {\n const result = await this.engine.MoveMultipleConversationsToProject(ids, projectId, this.CurrentUser);\n await this.reportBulkOutcome(result, 'moved');\n } catch (error) {\n console.error('Error moving conversations:', error);\n await this.dialogService.alert('Error', 'Failed to move the selected conversations. Please try again.');\n }\n this.cdr.detectChanges();\n }\n\n /** Pins or unpins the conversations, keeping the selection. */\n async BulkSetPinned(isPinned: boolean, ids: string[] = this.actionTargetIds()): Promise<void> {\n this.CloseContextMenu();\n if (ids.length === 0) return;\n\n try {\n const result = await this.engine.PinMultipleConversations(ids, isPinned, this.CurrentUser);\n await this.reportBulkOutcome(result, isPinned ? 'pinned' : 'unpinned');\n } catch (error) {\n console.error('Error pinning conversations:', error);\n await this.dialogService.alert('Error', `Failed to ${isPinned ? 'pin' : 'unpin'} the selected conversations. Please try again.`);\n }\n this.cdr.detectChanges();\n }\n\n /** Reports the conversations a bulk action could not change. Silent on full success. */\n private async reportBulkOutcome(\n result: { Successful: string[]; Failed: Array<{ ID: string; Name: string; Error: string }> },\n verb: string\n ): Promise<void> {\n if (result.Failed.length === 0) return;\n\n const failedNames = result.Failed.map(f => `\"${f.Name}\" (${f.Error})`).join(', ');\n await this.dialogService.alert(\n 'Partial Success',\n `${result.Successful.length} conversation${result.Successful.length === 1 ? '' : 's'} ${verb}.\\n\\n` +\n `${result.Failed.length} could not be ${verb}: ${failedNames}`\n );\n }\n\n /**\n * Deletes the conversations after confirmation. Only the deleted ones leave the\n * selection: deleting a row outside it leaves it alone, and rows that failed\n * stay selected so the user can try again.\n */\n async BulkDeleteConversations(ids: string[] = this.actionTargetIds()): Promise<void> {\n const count = ids.length;\n this.CloseContextMenu();\n\n if (count === 0) return;\n\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Conversations',\n message: `Are you sure you want to delete ${count} conversation${count > 1 ? 's' : ''}? This action cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel'\n });\n if (!confirmed) return;\n\n try {\n const result = await this.engine.DeleteMultipleConversations(ids, this.CurrentUser);\n await this.reportDeleteOutcome(result, count);\n for (const id of result.Successful) {\n this.ConversationDeleted.emit(id);\n }\n const deleted = new Set(result.Successful.map(id => NormalizeUUID(id)));\n this.removeFromSelection(id => deleted.has(NormalizeUUID(id)));\n } catch (error) {\n console.error('Error deleting conversations:', error);\n await this.dialogService.alert('Error', 'Failed to delete conversations. Please try again.');\n } finally {\n this.cdr.detectChanges();\n }\n }\n\n /** Reports the conversations a bulk delete could not remove. Silent on full success. */\n private async reportDeleteOutcome(\n result: { Successful: string[]; Failed: Array<{ ID: string; Name: string; Error: string }> },\n count: number\n ): Promise<void> {\n if (result.Failed.length === 0) return;\n if (result.Successful.length === 0) {\n await this.dialogService.alert(\n 'Delete Failed',\n `None of the ${count} conversations could be deleted. They may have already been removed.`\n );\n return;\n }\n const failedNames = result.Failed.map(f => `\"${f.Name}\"`).join(', ');\n await this.dialogService.alert(\n 'Partial Success',\n `Deleted ${result.Successful.length} of ${count} conversations.\\n\\n` +\n `${result.Failed.length} could not be deleted: ${failedNames}`\n );\n }\n\n // ========================================================================\n // SELECTION BAR — stands in for the search row while a selection exists\n // ========================================================================\n\n /** The selected conversation IDs, in the order they were picked. */\n public get SelectedIds(): string[] {\n return Array.from(this.SelectedConversationIds);\n }\n\n /** True when any selected conversation is unpinned, so the bar's pin button pins rather than unpins. */\n public SelectionHasUnpinned(): boolean {\n return this.SelectedIds.some(id => !this.engine.GetConversation(id)?.IsPinned);\n }\n\n /** The bar acts on the selection even while a menu for another row is open. */\n public BarSetPinned(): void {\n void this.BulkSetPinned(this.SelectionHasUnpinned(), this.SelectedIds);\n }\n\n public BarShare(): void {\n this.CloseContextMenu();\n this.shareConversations(this.SelectedIds);\n }\n\n public BarDelete(): void {\n void this.BulkDeleteConversations(this.SelectedIds);\n }\n\n /** Opens the folder picker for the selection, under the bar's Move button. */\n public BarOpenMoveMenu(event: MouseEvent): void {\n event.stopPropagation(); // the document click would close the picker straight away\n const ids = this.SelectedIds;\n const conversation = ids.length === 1 ? this.engine.GetConversation(ids[0]) ?? null : null;\n this.openContextMenu({ kind: 'conversation', conversation, folder: null, targets: ids }, this.buttonAnchor(event), true);\n }\n\n // ========================================================================\n // ROW CLICKS, CHECKBOXES AND TOUCH PRESSES\n // ========================================================================\n\n /**\n * The row checkbox adds or removes its row without opening it — the mouse\n * route to a selection that needs no keyboard. Shift-click extends a range.\n * Unlike a Ctrl-click it never takes the open conversation along, so the\n * checkboxes show exactly what is picked.\n */\n public OnRowCheckboxClick(conversation: MJConversationEntity, event: MouseEvent): void {\n event.stopPropagation();\n this.IsSelectionMode = true;\n if (event.shiftKey) {\n this.selectRangeTo(conversation.ID);\n return;\n }\n this.toggleRowSelection(conversation.ID);\n }\n\n /**\n * Starts timing a touch press on a row; held long enough, it selects the row.\n * Presses on the row's own buttons (the checkbox and ⋯) are theirs to handle.\n */\n public OnRowPointerDown(conversation: MJConversationEntity, event: PointerEvent): void {\n this.lastRowPointerType = event.pointerType;\n this.ignoreNextRowClick = false;\n this.CancelLongPress();\n if (event.pointerType !== 'touch') return;\n if ((event.target as HTMLElement | null)?.closest('button')) return;\n\n this.longPress = {\n conversation,\n x: event.clientX,\n y: event.clientY,\n timer: setTimeout(() => this.completeLongPress(), ConversationListComponent.longPressDelayMs)\n };\n }\n\n /** A touch that drifts is a scroll, not a press. */\n public OnRowPointerMove(event: PointerEvent): void {\n if (!this.longPress) return;\n const distance = Math.hypot(event.clientX - this.longPress.x, event.clientY - this.longPress.y);\n if (distance > ConversationListComponent.longPressMoveTolerancePx) {\n this.CancelLongPress();\n }\n }\n\n public CancelLongPress(): void {\n if (this.longPress) {\n clearTimeout(this.longPress.timer);\n this.longPress = null;\n }\n }\n\n /**\n * Completes the press in progress, if any: selects its row and starts\n * selection mode, as a long-press does in Gmail. The click that ends the same\n * press is then ignored, so it does not undo the selection.\n */\n private completeLongPress(): void {\n const press = this.longPress;\n if (!press) return;\n this.CancelLongPress();\n this.ignoreNextRowClick = true;\n this.IsSelectionMode = true;\n this.SelectedConversationIds.add(press.conversation.ID);\n this.selectionAnchorId = press.conversation.ID;\n this.cdr.detectChanges();\n }\n\n /**\n * Routes a row click. Ctrl/Cmd toggles one row and Shift extends from the\n * anchor, either one starting selection mode. On touch, while selecting, a tap\n * adds or removes the row. Any other click collapses the selection and opens\n * the conversation.\n */\n HandleConversationClick(conversation: MJConversationEntity, event?: MouseEvent): void {\n if (this.ignoreNextRowClick) {\n this.ignoreNextRowClick = false;\n return;\n }\n if (this.IsSelectionMode && this.lastRowPointerType === 'touch') {\n this.toggleRowSelection(conversation.ID);\n return;\n }\n\n const isRangeClick = !!event?.shiftKey;\n const isToggleClick = !!event && (event.ctrlKey || event.metaKey);\n\n if (isRangeClick || isToggleClick) {\n event?.preventDefault(); // a Shift-click would otherwise paint a text selection\n const entering = !this.IsSelectionMode;\n if (entering) {\n this.IsSelectionMode = true;\n }\n if (isRangeClick) {\n this.selectRangeTo(conversation.ID);\n } else {\n // The open conversation reads as picked, so a Ctrl-click that starts a\n // selection takes it along; a Shift-click already ranges from it.\n const seeded = entering ? this.seedSelectionWithOpenConversation() : null;\n if (!seeded || !UUIDsEqual(seeded, conversation.ID)) {\n this.ToggleConversationSelection(conversation.ID);\n }\n this.selectionAnchorId = conversation.ID;\n this.exitSelectionModeIfEmpty();\n }\n return;\n }\n\n // A plain click collapses the selection down to this one conversation, the\n // way a file browser does.\n if (this.IsSelectionMode) {\n this.exitSelectionMode();\n }\n this.SelectConversation(conversation);\n }\n /** @deprecated Use {@link EnvironmentId}. */\n @Input() set environmentId(value: string) {\n this.EnvironmentId = value;\n }\n\n /** @deprecated Use {@link EnvironmentId}. */\n get environmentId(): string {\n return this.EnvironmentId;\n }\n\n /** @deprecated Use {@link CurrentUser}. */\n @Input() set currentUser(value: UserInfo) {\n this.CurrentUser = value;\n }\n\n /** @deprecated Use {@link CurrentUser}. */\n get currentUser(): UserInfo {\n return this.CurrentUser;\n }\n\n /** @deprecated Use {@link SelectedConversationId}. */\n @Input() set selectedConversationId(value: string | null) {\n this.SelectedConversationId = value;\n }\n\n /** @deprecated Use {@link SelectedConversationId}. */\n get selectedConversationId(): string | null {\n return this.SelectedConversationId;\n }\n\n /** @deprecated Use {@link RenamedConversationId}. */\n @Input() set renamedConversationId(value: string | null) {\n this.RenamedConversationId = value;\n }\n\n /** @deprecated Use {@link RenamedConversationId}. */\n get renamedConversationId(): string | null {\n return this.RenamedConversationId;\n }\n\n /** @deprecated Use {@link IsSidebarPinned}. */\n @Input() set isSidebarPinned(value: boolean) {\n this.IsSidebarPinned = value;\n }\n\n /** @deprecated Use {@link IsSidebarPinned}. */\n get isSidebarPinned(): boolean {\n return this.IsSidebarPinned;\n } // Whether sidebar is pinned (stays open after selection)\n\n /** @deprecated Use {@link IsMobileView}. */\n @Input() set isMobileView(value: boolean) {\n this.IsMobileView = value;\n }\n\n /** @deprecated Use {@link IsMobileView}. */\n get isMobileView(): boolean {\n return this.IsMobileView;\n } // Whether we're on mobile (no pin options)\n\n /** @deprecated Use {@link ShowNewConversationButton}. */\n @Input() set showNewConversationButton(value: boolean) {\n this.ShowNewConversationButton = value;\n }\n\n /** @deprecated Use {@link ShowNewConversationButton}. */\n get showNewConversationButton(): boolean {\n return this.ShowNewConversationButton;\n }\n\n /** @deprecated Use {@link ShowHeaderMenu}. */\n @Input() set showHeaderMenu(value: boolean) {\n this.ShowHeaderMenu = value;\n }\n\n /** @deprecated Use {@link ShowHeaderMenu}. */\n get showHeaderMenu(): boolean {\n return this.ShowHeaderMenu;\n }\n\n /** @deprecated Use {@link ShowSectionHeaders}. */\n @Input() set showSectionHeaders(value: boolean) {\n this.ShowSectionHeaders = value;\n }\n\n /** @deprecated Use {@link ShowSectionHeaders}. */\n get showSectionHeaders(): boolean {\n return this.ShowSectionHeaders;\n }\n\n /** @deprecated Use {@link DirectMessagesExpanded}. */\n public get directMessagesExpanded(): boolean {\n return this.DirectMessagesExpanded;\n }\n\n /** @deprecated Use {@link DirectMessagesExpanded}. */\n public set directMessagesExpanded(value: boolean) {\n this.DirectMessagesExpanded = value;\n }\n\n /** @deprecated Use {@link PinnedExpanded}. */\n public get pinnedExpanded(): boolean {\n return this.PinnedExpanded;\n }\n\n /** @deprecated Use {@link PinnedExpanded}. */\n public set pinnedExpanded(value: boolean) {\n this.PinnedExpanded = value;\n }\n\n /** @deprecated Use {@link FoldersExpanded}. */\n public get foldersExpanded(): boolean {\n return this.FoldersExpanded;\n }\n\n /** @deprecated Use {@link FoldersExpanded}. */\n public set foldersExpanded(value: boolean) {\n this.FoldersExpanded = value;\n }\n\n /** @deprecated Use {@link UngroupedExpanded}. */\n public get ungroupedExpanded(): boolean {\n return this.UngroupedExpanded;\n }\n\n /** @deprecated Use {@link UngroupedExpanded}. */\n public set ungroupedExpanded(value: boolean) {\n this.UngroupedExpanded = value;\n }\n\n /** @deprecated Use {@link ConversationIdsWithTasks}. */\n public get conversationIdsWithTasks() {\n return this.ConversationIdsWithTasks;\n }\n\n /** @deprecated Use {@link ConversationIdsWithTasks}. */\n public set conversationIdsWithTasks(value) {\n this.ConversationIdsWithTasks = value;\n }\n\n /** @deprecated Use {@link IsSelectionMode}. */\n public get isSelectionMode(): boolean {\n return this.IsSelectionMode;\n }\n\n /** @deprecated Use {@link IsSelectionMode}. */\n public set isSelectionMode(value: boolean) {\n this.IsSelectionMode = value;\n }\n\n /** @deprecated Use {@link SelectedConversationIds}. */\n public get selectedConversationIds() {\n return this.SelectedConversationIds;\n }\n\n /** @deprecated Use {@link SelectedConversationIds}. */\n public set selectedConversationIds(value) {\n this.SelectedConversationIds = value;\n }\n\n /** @deprecated Use {@link IsHeaderMenuOpen}. */\n public get isHeaderMenuOpen(): boolean {\n return this.IsHeaderMenuOpen;\n }\n\n /** @deprecated Use {@link IsHeaderMenuOpen}. */\n public set isHeaderMenuOpen(value: boolean) {\n this.IsHeaderMenuOpen = value;\n }\n\n /** @deprecated Use {@link IsRefreshing}. */\n public get isRefreshing(): boolean {\n return this.IsRefreshing;\n }\n\n /** @deprecated Use {@link IsRefreshing}. */\n public set isRefreshing(value: boolean) {\n this.IsRefreshing = value;\n }\n\n /** @deprecated Use {@link GroupBy}. */\n public get groupBy(): ConversationGroupBy {\n return this.GroupBy;\n }\n\n /** @deprecated Use {@link GroupBy}. */\n public set groupBy(value: ConversationGroupBy) {\n this.GroupBy = value;\n }\n\n /** @deprecated Use {@link PinnedConversations}. */\n public get pinnedConversations(): MJConversationEntity[] {\n return this.PinnedConversations;\n }\n\n /** @deprecated Use {@link PinnedConversations}. */\n public set pinnedConversations(value: MJConversationEntity[]) {\n this.PinnedConversations = value;\n }\n\n /** @deprecated Use {@link UnpinnedConversations}. */\n public get unpinnedConversations(): MJConversationEntity[] {\n return this.UnpinnedConversations;\n }\n\n /** @deprecated Use {@link UnpinnedConversations}. */\n public set unpinnedConversations(value: MJConversationEntity[]) {\n this.UnpinnedConversations = value;\n }\n\n /** @deprecated Use {@link UngroupedConversations}. */\n public get ungroupedConversations(): MJConversationEntity[] {\n return this.UngroupedConversations;\n }\n\n /** @deprecated Use {@link UngroupedConversations}. */\n public set ungroupedConversations(value: MJConversationEntity[]) {\n this.UngroupedConversations = value;\n }\n\n /** @deprecated Use {@link FolderTree}. */\n public get folderTree(): FolderNode[] {\n return this.FolderTree;\n }\n\n /** @deprecated Use {@link FolderTree}. */\n public set folderTree(value: FolderNode[]) {\n this.FolderTree = value;\n }\n\n /** @deprecated Use {@link FlatFolders}. */\n public get flatFolders(): FolderNode[] {\n return this.FlatFolders;\n }\n\n /** @deprecated Use {@link FlatFolders}. */\n public set flatFolders(value: FolderNode[]) {\n this.FlatFolders = value;\n }\n\n /** @deprecated Use {@link DraggedFolderId}. */\n public get draggedFolderId(): string | null {\n return this.DraggedFolderId;\n }\n\n /** @deprecated Use {@link DraggedFolderId}. */\n public set draggedFolderId(value: string | null) {\n this.DraggedFolderId = value;\n }\n\n /** @deprecated Use {@link DragOverTargetId}. */\n public get dragOverTargetId(): string | null {\n return this.DragOverTargetId;\n }\n\n /** @deprecated Use {@link DragOverTargetId}. */\n public set dragOverTargetId(value: string | null) {\n this.DragOverTargetId = value;\n }\n\n /** @deprecated Use {@link SearchQuery}. */\n get searchQuery(): string {\n return this.SearchQuery;\n }\n\n /** @deprecated Use {@link SearchQuery}. */\n set searchQuery(value: string) {\n this.SearchQuery = value;\n }\n\n /** @deprecated Use {@link IsSearching}. */\n get isSearching(): boolean {\n return this.IsSearching;\n }\n\n /** @deprecated Use {@link ToggleHeaderMenu}. */\n public toggleHeaderMenu(event: Event): void {\n return this.ToggleHeaderMenu(event);\n }\n\n /** @deprecated Use {@link CloseHeaderMenu}. */\n public closeHeaderMenu(): void {\n return this.CloseHeaderMenu();\n }\n\n /** @deprecated Use {@link OnToggleGroupByClick}. */\n public onToggleGroupByClick(event: Event): void {\n return this.OnToggleGroupByClick(event);\n }\n\n /** @deprecated Use {@link OnRefreshConversationsClick}. */\n public onRefreshConversationsClick(event: Event): Promise<void> {\n return this.OnRefreshConversationsClick(event);\n }\n\n /** @deprecated Use {@link OnPinSidebarClick}. */\n public onPinSidebarClick(event: Event): void {\n return this.OnPinSidebarClick(event);\n }\n\n /** @deprecated Use {@link OnUnpinSidebarClick}. */\n public onUnpinSidebarClick(event: Event): void {\n return this.OnUnpinSidebarClick(event);\n }\n\n /** @deprecated Use {@link ToggleDirectMessages}. */\n public toggleDirectMessages(): void {\n return this.ToggleDirectMessages();\n }\n\n /** @deprecated Use {@link TogglePinned}. */\n public togglePinned(): void {\n return this.TogglePinned();\n }\n\n /** @deprecated Use {@link ToggleFolders}. */\n public toggleFolders(): void {\n return this.ToggleFolders();\n }\n\n /** @deprecated Use {@link ToggleUngrouped}. */\n public toggleUngrouped(): void {\n return this.ToggleUngrouped();\n }\n\n /** @deprecated Use {@link IsFolderExpanded}. */\n public isFolderExpanded(projectId: string): boolean {\n return this.IsFolderExpanded(projectId);\n }\n\n /** @deprecated Use {@link ToggleFolder}. */\n public toggleFolder(projectId: string): void {\n return this.ToggleFolder(projectId);\n }\n\n /** @deprecated Use {@link ToggleGroupBy}. */\n public toggleGroupBy(): void {\n return this.ToggleGroupBy();\n }\n\n /** @deprecated Use {@link OnConversationDragStart}. */\n public onConversationDragStart(conversation: MJConversationEntity, event: DragEvent): void {\n return this.OnConversationDragStart(conversation, event);\n }\n\n /** @deprecated Use {@link OnConversationDragEnd}. */\n public onConversationDragEnd(): void {\n return this.OnConversationDragEnd();\n }\n\n /** @deprecated Use {@link OnFolderDragStart}. */\n public onFolderDragStart(node: FolderNode, event: DragEvent): void {\n return this.OnFolderDragStart(node, event);\n }\n\n /** @deprecated Use {@link OnFolderDragEnd}. */\n public onFolderDragEnd(): void {\n return this.OnFolderDragEnd();\n }\n\n /** @deprecated Use {@link OnFolderDragOver}. */\n public onFolderDragOver(projectId: string, event: DragEvent): void {\n return this.OnFolderDragOver(projectId, event);\n }\n\n /** @deprecated Use {@link OnUngroupedDragOver}. */\n public onUngroupedDragOver(event: DragEvent): void {\n return this.OnUngroupedDragOver(event);\n }\n\n /** @deprecated Use {@link OnFoldersRootDragOver}. */\n public onFoldersRootDragOver(event: DragEvent): void {\n return this.OnFoldersRootDragOver(event);\n }\n\n /** @deprecated Use {@link OnDragLeave}. */\n public onDragLeave(targetId: string): void {\n return this.OnDragLeave(targetId);\n }\n\n /** @deprecated Use {@link OnFolderDrop}. */\n public onFolderDrop(project: MJProjectEntity, event: DragEvent): Promise<void> {\n return this.OnFolderDrop(project, event);\n }\n\n /** @deprecated Use {@link OnUngroupedDrop}. */\n public onUngroupedDrop(event: DragEvent): Promise<void> {\n return this.OnUngroupedDrop(event);\n }\n\n /** @deprecated Use {@link OnFoldersRootDrop}. */\n public onFoldersRootDrop(event: DragEvent): void {\n return this.OnFoldersRootDrop(event);\n }\n\n /** @deprecated Use {@link OpenMoveSubmenu}. */\n public openMoveSubmenu(event: Event): void {\n return this.OpenMoveSubmenu(event);\n }\n\n /** @deprecated Use {@link CloseMoveSubmenu}. */\n public closeMoveSubmenu(event: Event): void {\n return this.CloseMoveSubmenu(event);\n }\n\n /** @deprecated Use {@link CreateFolder}. */\n public createFolder(parentId: string | null, event?: Event): void {\n return this.CreateFolder(parentId, event);\n }\n\n /** @deprecated Use {@link EditFolder}. */\n public editFolder(project: MJProjectEntity, event?: Event): void {\n return this.EditFolder(project, event);\n }\n\n /** @deprecated Use {@link DeleteFolder}. */\n public deleteFolder(project: MJProjectEntity, event?: Event): Promise<void> {\n return this.DeleteFolder(project, event);\n }\n\n /** @deprecated Use {@link SelectConversation}. */\n public selectConversation(conversation: MJConversationEntity): void {\n return this.SelectConversation(conversation);\n }\n\n /** @deprecated Use {@link CreateNewConversation}. */\n public createNewConversation(): Promise<void> {\n return this.CreateNewConversation();\n }\n\n /** @deprecated Use {@link RenameConversation}. */\n public renameConversation(conversation: MJConversationEntity): Promise<void> {\n return this.RenameConversation(conversation);\n }\n\n /** @deprecated Use {@link DeleteConversation}. */\n public deleteConversation(conversation: MJConversationEntity): Promise<void> {\n return this.DeleteConversation(conversation);\n }\n\n /** @deprecated Use {@link TogglePin}. */\n public togglePin(conversation: MJConversationEntity, event?: Event): Promise<void> {\n return this.TogglePin(conversation, event);\n }\n\n /** @deprecated Use {@link HasActiveTasks}. */\n public hasActiveTasks(conversationId: string): boolean {\n return this.HasActiveTasks(conversationId);\n }\n\n /** @deprecated Use {@link IsSharedWithMe}. */\n public isSharedWithMe(conversation: MJConversationEntity): boolean {\n return this.IsSharedWithMe(conversation);\n }\n\n /** @deprecated Use {@link SharedWithMeTooltip}. */\n public sharedWithMeTooltip(conversation: MJConversationEntity): string {\n return this.SharedWithMeTooltip(conversation);\n }\n\n /** @deprecated Use {@link ToggleSelectionMode}. */\n public toggleSelectionMode(): void {\n return this.ToggleSelectionMode();\n }\n\n /** @deprecated Use {@link ToggleConversationSelection}. */\n public toggleConversationSelection(conversationId: string): void {\n return this.ToggleConversationSelection(conversationId);\n }\n\n /** @deprecated Use {@link SelectAll}. */\n public selectAll(): void {\n return this.SelectAll();\n }\n\n /** @deprecated Use {@link DeselectAll}. */\n public deselectAll(): void {\n return this.DeselectAll();\n }\n\n /** @deprecated Use {@link BulkDeleteConversations}. */\n public bulkDeleteConversations(ids?: string[]): Promise<void> {\n return this.BulkDeleteConversations(ids);\n }\n\n /** @deprecated Use {@link HandleConversationClick}. */\n public handleConversationClick(conversation: MJConversationEntity, event?: MouseEvent): void {\n return this.HandleConversationClick(conversation, event);\n }\n}"]}