@aakash58/chatbot 1.1.20 → 1.1.21

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 (351) hide show
  1. package/.editorconfig +17 -0
  2. package/.vscode/extensions.json +4 -0
  3. package/.vscode/launch.json +41 -0
  4. package/.vscode/settings.json +14 -0
  5. package/.vscode/tasks.json +60 -0
  6. package/README.md +298 -22
  7. package/angular.json +132 -0
  8. package/docs/PUBLISHING_GUIDE.md +104 -0
  9. package/package.json +75 -29
  10. package/projects/app-doohbot/public/assets/const/app-const.json +15 -0
  11. package/projects/app-doohbot/public/assets/const/doohclick_license.json +6 -0
  12. package/projects/app-doohbot/public/favicon.ico +0 -0
  13. package/projects/app-doohbot/src/app/app.config.ts +13 -0
  14. package/projects/app-doohbot/src/app/app.html +31 -0
  15. package/projects/app-doohbot/src/app/app.routes.ts +3 -0
  16. package/projects/app-doohbot/src/app/app.scss +279 -0
  17. package/projects/app-doohbot/src/app/app.spec.ts +23 -0
  18. package/projects/app-doohbot/src/app/app.ts +72 -0
  19. package/projects/app-doohbot/src/index.html +15 -0
  20. package/projects/app-doohbot/src/main.ts +6 -0
  21. package/projects/app-doohbot/src/styles.scss +15 -0
  22. package/projects/app-doohbot/tsconfig.app.json +15 -0
  23. package/projects/app-doohbot/tsconfig.spec.json +14 -0
  24. package/projects/doohbot/README.md +64 -0
  25. package/projects/doohbot/docs/README.md +140 -0
  26. package/projects/doohbot/ng-package.json +10 -0
  27. package/projects/doohbot/package.json +16 -0
  28. package/projects/doohbot/src/lib/app/chat/chat-ui-state.service.ts +194 -0
  29. package/projects/doohbot/src/lib/app/chat/chat.service.ts +547 -0
  30. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.html +27 -0
  31. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.scss +115 -0
  32. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.ts +35 -0
  33. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.html +3 -0
  34. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.scss +20 -0
  35. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.ts +12 -0
  36. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.html +34 -0
  37. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.scss +78 -0
  38. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.ts +52 -0
  39. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.html +77 -0
  40. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.scss +346 -0
  41. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.ts +188 -0
  42. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.html +146 -0
  43. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.scss +187 -0
  44. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.ts +256 -0
  45. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.html +17 -0
  46. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.scss +59 -0
  47. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.ts +28 -0
  48. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.html +138 -0
  49. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.scss +436 -0
  50. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.ts +106 -0
  51. package/projects/doohbot/src/lib/app/chat/model/chat-history.model.ts +57 -0
  52. package/projects/doohbot/src/lib/app/chat/model/chat-request.model.ts +17 -0
  53. package/projects/doohbot/src/lib/app/chat/model/chat-response.model.ts +9 -0
  54. package/projects/doohbot/src/lib/app/chat/model/chat-session.model.ts +14 -0
  55. package/{lib/app/chat/model/chat-stream-message.model.d.ts → projects/doohbot/src/lib/app/chat/model/chat-stream-message.model.ts} +6 -5
  56. package/projects/doohbot/src/lib/app/chat/model/chat-stream-response.model.ts +12 -0
  57. package/projects/doohbot/src/lib/app/chat/services/chat-api.service.ts +82 -0
  58. package/projects/doohbot/src/lib/app/chat/services/chat-audio.service.ts +44 -0
  59. package/projects/doohbot/src/lib/app/chat/services/chat-history.service.ts +303 -0
  60. package/projects/doohbot/src/lib/app/login/login-form.component.html +80 -0
  61. package/projects/doohbot/src/lib/app/login/login-form.component.scss +189 -0
  62. package/projects/doohbot/src/lib/app/login/login-form.component.ts +45 -0
  63. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.html +81 -0
  64. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.scss +179 -0
  65. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.ts +217 -0
  66. package/projects/doohbot/src/lib/app/personalization/personalization.service.ts +197 -0
  67. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.html +111 -0
  68. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.scss +218 -0
  69. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.ts +121 -0
  70. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.html +46 -0
  71. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.scss +138 -0
  72. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.ts +28 -0
  73. package/projects/doohbot/src/lib/app/personalization/sections/preferences/color-picker-dialog.component.ts +92 -0
  74. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.html +198 -0
  75. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.scss +107 -0
  76. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.ts +103 -0
  77. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.html +46 -0
  78. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.scss +131 -0
  79. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.ts +23 -0
  80. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.html +33 -0
  81. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.scss +61 -0
  82. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.ts +20 -0
  83. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.html +30 -0
  84. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.scss +59 -0
  85. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.ts +12 -0
  86. package/projects/doohbot/src/lib/constant/doohbot-constant.ts +40 -0
  87. package/projects/doohbot/src/lib/constant/html-entities.ts +8 -0
  88. package/projects/doohbot/src/lib/constant/utf8.ts +9 -0
  89. package/projects/doohbot/src/lib/core/app-const.ts +63 -0
  90. package/projects/doohbot/src/lib/core/auth/account-api.service.ts +53 -0
  91. package/projects/doohbot/src/lib/core/auth/auth.service.ts +478 -0
  92. package/projects/doohbot/src/lib/core/auth/models/auth-result.model.ts +4 -0
  93. package/projects/doohbot/src/lib/core/auth/models/federated-login-request.model.ts +5 -0
  94. package/projects/doohbot/src/lib/core/auth/models/login-request.model.ts +6 -0
  95. package/projects/doohbot/src/lib/core/auth/storage.service.ts +113 -0
  96. package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.directive.ts +123 -0
  97. package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.module.ts +9 -0
  98. package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.directive.ts +58 -0
  99. package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.module.ts +9 -0
  100. package/projects/doohbot/src/lib/core/directives/popout/popout.directive.ts +169 -0
  101. package/projects/doohbot/src/lib/core/directives/popout/popout.module.ts +9 -0
  102. package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.directive.ts +197 -0
  103. package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.module.ts +9 -0
  104. package/projects/doohbot/src/lib/core/enums/api-request-state.enum.ts +9 -0
  105. package/projects/doohbot/src/lib/core/environments/environment.prod.ts +14 -0
  106. package/projects/doohbot/src/lib/core/environments/environment.ts +14 -0
  107. package/projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts +72 -0
  108. package/projects/doohbot/src/lib/core/http/http-stream.service.ts +105 -0
  109. package/projects/doohbot/src/lib/core/http/http.service.ts +148 -0
  110. package/projects/doohbot/src/lib/core/interceptors/auth.interceptor.ts +118 -0
  111. package/projects/doohbot/src/lib/core/interceptors/license.interceptor.ts +50 -0
  112. package/projects/doohbot/src/lib/core/models/api-config.model.ts +82 -0
  113. package/projects/doohbot/src/lib/core/models/api-request.model.ts +92 -0
  114. package/projects/doohbot/src/lib/core/models/api-response.model.ts +13 -0
  115. package/projects/doohbot/src/lib/core/models/doohbot-config.model.ts +109 -0
  116. package/{lib/core/models/license.model.d.ts → projects/doohbot/src/lib/core/models/license.model.ts} +27 -23
  117. package/projects/doohbot/src/lib/core/models/message.ts +18 -0
  118. package/projects/doohbot/src/lib/core/models/theme-config.model.ts +48 -0
  119. package/projects/doohbot/src/lib/core/services/core-config.service.ts +53 -0
  120. package/projects/doohbot/src/lib/core/services/doohbot-api.service.ts +207 -0
  121. package/projects/doohbot/src/lib/core/services/license.service.ts +171 -0
  122. package/projects/doohbot/src/lib/core/services/markdown.service.ts +73 -0
  123. package/projects/doohbot/src/lib/core/services/theme.service.ts +305 -0
  124. package/{lib/core/types/auth-mode.type.d.ts → projects/doohbot/src/lib/core/types/auth-mode.type.ts} +4 -4
  125. package/{lib/core/types/auth-status.type.d.ts → projects/doohbot/src/lib/core/types/auth-status.type.ts} +5 -4
  126. package/{lib/core/types/chat-stream.type.d.ts → projects/doohbot/src/lib/core/types/chat-stream.type.ts} +4 -4
  127. package/{lib/core/types/message-role.type.d.ts → projects/doohbot/src/lib/core/types/message-role.type.ts} +4 -4
  128. package/{lib/core/types/prompt-mode.type.d.ts → projects/doohbot/src/lib/core/types/prompt-mode.type.ts} +5 -4
  129. package/{lib/core/types/snackbar-error.type.d.ts → projects/doohbot/src/lib/core/types/snackbar-error.type.ts} +5 -4
  130. package/{lib/core/types/tenant-resolution-strategy.type.d.ts → projects/doohbot/src/lib/core/types/tenant-resolution-strategy.type.ts} +4 -4
  131. package/projects/doohbot/src/lib/core/utils/error-handler.util.ts +31 -0
  132. package/projects/doohbot/src/lib/core/utils/logger.service.ts +45 -0
  133. package/projects/doohbot/src/lib/doohbot-input.ts +19 -0
  134. package/projects/doohbot/src/lib/doohbot.component.html +34 -0
  135. package/projects/doohbot/src/lib/doohbot.component.scss +17 -0
  136. package/projects/doohbot/src/lib/doohbot.component.spec.ts +31 -0
  137. package/projects/doohbot/src/lib/doohbot.component.ts +545 -0
  138. package/projects/doohbot/src/lib/elements.ts +25 -0
  139. package/projects/doohbot/src/lib/predefined_messages.ts +14 -0
  140. package/projects/doohbot/src/lib/shared/chips/chips.component.html +9 -0
  141. package/projects/doohbot/src/lib/shared/chips/chips.component.scss +29 -0
  142. package/projects/doohbot/src/lib/shared/chips/chips.component.spec.ts +22 -0
  143. package/projects/doohbot/src/lib/shared/chips/chips.component.ts +20 -0
  144. package/projects/doohbot/src/lib/shared/dialog/dialog.component.html +29 -0
  145. package/projects/doohbot/src/lib/shared/dialog/dialog.component.scss +100 -0
  146. package/projects/doohbot/src/lib/shared/dialog/dialog.component.ts +42 -0
  147. package/projects/doohbot/src/lib/shared/dialog/dialog.service.ts +62 -0
  148. package/projects/doohbot/src/lib/shared/dialog/dialog.utils.ts +102 -0
  149. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.html +30 -0
  150. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.scss +53 -0
  151. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.spec.ts +22 -0
  152. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.ts +35 -0
  153. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.html +16 -0
  154. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.scss +45 -0
  155. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.ts +46 -0
  156. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.html +5 -0
  157. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.scss +0 -0
  158. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.spec.ts +22 -0
  159. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.ts +20 -0
  160. package/projects/doohbot/src/lib/shared/pipes/simple-markdown.pipe.ts +19 -0
  161. package/projects/doohbot/src/lib/shared/popout/popout.html +1 -0
  162. package/projects/doohbot/src/lib/shared/popout/popout.scss +0 -0
  163. package/projects/doohbot/src/lib/shared/popout/popout.spec.ts +23 -0
  164. package/projects/doohbot/src/lib/shared/popout/popout.ts +11 -0
  165. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.html +7 -0
  166. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.scss +125 -0
  167. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.spec.ts +21 -0
  168. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts +44 -0
  169. package/projects/doohbot/src/lib/shared/snackbar/snackbar.service.ts +54 -0
  170. package/{lib/shared/snackbar/snackbar.utils.d.ts → projects/doohbot/src/lib/shared/snackbar/snackbar.utils.ts} +49 -33
  171. package/projects/doohbot/src/lib/styles/_theme.scss +132 -0
  172. package/projects/doohbot/src/lib/styles/material-override.scss +302 -0
  173. package/projects/doohbot/src/lib/styles/utility.scss +588 -0
  174. package/projects/doohbot/src/public-api.ts +42 -0
  175. package/projects/doohbot/tsconfig.lib.json +15 -0
  176. package/projects/doohbot/tsconfig.lib.prod.json +11 -0
  177. package/projects/doohbot/tsconfig.spec.json +10 -0
  178. package/proxy.conf.json +8 -0
  179. package/publish.config.js +25 -0
  180. package/scripts/publishing/index.ts +67 -0
  181. package/scripts/publishing/pipeline/01-clean.ts +11 -0
  182. package/scripts/publishing/pipeline/02-validate-pre.ts +8 -0
  183. package/scripts/publishing/pipeline/03-build.ts +7 -0
  184. package/scripts/publishing/pipeline/04-validate-post.ts +8 -0
  185. package/scripts/publishing/pipeline/05-prepare-package.ts +29 -0
  186. package/scripts/publishing/pipeline/06-version.ts +23 -0
  187. package/scripts/publishing/pipeline/07-publish.ts +14 -0
  188. package/scripts/publishing/pipeline/08-cleanup.ts +5 -0
  189. package/scripts/publishing/types.ts +36 -0
  190. package/scripts/publishing/utils/command.ts +15 -0
  191. package/scripts/publishing/utils/config.ts +17 -0
  192. package/scripts/validate.ts +166 -0
  193. package/tsconfig.json +45 -0
  194. package/tsconfig.scripts.json +15 -0
  195. package/esm2022/aakash58-chatbot.mjs +0 -5
  196. package/esm2022/lib/app/chat/chat-ui-state.service.mjs +0 -170
  197. package/esm2022/lib/app/chat/chat.service.mjs +0 -445
  198. package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +0 -50
  199. package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +0 -12
  200. package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +0 -66
  201. package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +0 -186
  202. package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +0 -312
  203. package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +0 -36
  204. package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +0 -115
  205. package/esm2022/lib/app/chat/model/chat-history.model.mjs +0 -2
  206. package/esm2022/lib/app/chat/model/chat-request.model.mjs +0 -2
  207. package/esm2022/lib/app/chat/model/chat-response.model.mjs +0 -2
  208. package/esm2022/lib/app/chat/model/chat-session.model.mjs +0 -2
  209. package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +0 -2
  210. package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +0 -2
  211. package/esm2022/lib/app/chat/services/chat-api.service.mjs +0 -61
  212. package/esm2022/lib/app/chat/services/chat-audio.service.mjs +0 -50
  213. package/esm2022/lib/app/chat/services/chat-history.service.mjs +0 -252
  214. package/esm2022/lib/app/login/login-form.component.mjs +0 -46
  215. package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +0 -194
  216. package/esm2022/lib/app/personalization/personalization.service.mjs +0 -149
  217. package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +0 -122
  218. package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +0 -86
  219. package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +0 -115
  220. package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +0 -29
  221. package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +0 -30
  222. package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +0 -12
  223. package/esm2022/lib/constant/doohbot-constant.mjs +0 -28
  224. package/esm2022/lib/constant/html-entities.mjs +0 -9
  225. package/esm2022/lib/constant/utf8.mjs +0 -10
  226. package/esm2022/lib/core/app-const.mjs +0 -61
  227. package/esm2022/lib/core/auth/account-api.service.mjs +0 -40
  228. package/esm2022/lib/core/auth/auth.service.mjs +0 -391
  229. package/esm2022/lib/core/auth/models/auth-result.model.mjs +0 -3
  230. package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +0 -6
  231. package/esm2022/lib/core/auth/models/login-request.model.mjs +0 -6
  232. package/esm2022/lib/core/auth/storage.service.mjs +0 -110
  233. package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +0 -112
  234. package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +0 -55
  235. package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +0 -179
  236. package/esm2022/lib/core/environments/environment.mjs +0 -15
  237. package/esm2022/lib/core/environments/environment.prod.mjs +0 -15
  238. package/esm2022/lib/core/helpers/crypto-helper.service.mjs +0 -52
  239. package/esm2022/lib/core/http/http-stream.service.mjs +0 -97
  240. package/esm2022/lib/core/http/http.service.mjs +0 -103
  241. package/esm2022/lib/core/interceptors/auth.interceptor.mjs +0 -96
  242. package/esm2022/lib/core/interceptors/license.interceptor.mjs +0 -44
  243. package/esm2022/lib/core/models/api-config.model.mjs +0 -18
  244. package/esm2022/lib/core/models/api-request.model.mjs +0 -2
  245. package/esm2022/lib/core/models/api-response.model.mjs +0 -8
  246. package/esm2022/lib/core/models/doohbot-config.model.mjs +0 -18
  247. package/esm2022/lib/core/models/license.model.mjs +0 -2
  248. package/esm2022/lib/core/models/message.mjs +0 -2
  249. package/esm2022/lib/core/models/theme-config.model.mjs +0 -2
  250. package/esm2022/lib/core/services/core-config.service.mjs +0 -52
  251. package/esm2022/lib/core/services/license.service.mjs +0 -145
  252. package/esm2022/lib/core/services/markdown.service.mjs +0 -64
  253. package/esm2022/lib/core/services/theme.service.mjs +0 -248
  254. package/esm2022/lib/core/types/auth-mode.type.mjs +0 -2
  255. package/esm2022/lib/core/types/auth-status.type.mjs +0 -5
  256. package/esm2022/lib/core/types/chat-stream.type.mjs +0 -2
  257. package/esm2022/lib/core/types/message-role.type.mjs +0 -2
  258. package/esm2022/lib/core/types/prompt-mode.type.mjs +0 -5
  259. package/esm2022/lib/core/types/snackbar-error.type.mjs +0 -5
  260. package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +0 -2
  261. package/esm2022/lib/core/utils/logger.service.mjs +0 -42
  262. package/esm2022/lib/doohbot-input.mjs +0 -20
  263. package/esm2022/lib/doohbot.component.mjs +0 -444
  264. package/esm2022/lib/predefined_messages.mjs +0 -15
  265. package/esm2022/lib/shared/chips/chips.component.mjs +0 -28
  266. package/esm2022/lib/shared/dialog/dialog.component.mjs +0 -36
  267. package/esm2022/lib/shared/dialog/dialog.service.mjs +0 -64
  268. package/esm2022/lib/shared/dialog/dialog.utils.mjs +0 -85
  269. package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +0 -29
  270. package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +0 -38
  271. package/esm2022/lib/shared/menu-item/menu-item.component.mjs +0 -24
  272. package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +0 -27
  273. package/esm2022/lib/shared/snackbar/snackbar.component.mjs +0 -43
  274. package/esm2022/lib/shared/snackbar/snackbar.service.mjs +0 -46
  275. package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +0 -43
  276. package/esm2022/public-api.mjs +0 -37
  277. package/fesm2022/aakash58-chatbot.mjs +0 -5193
  278. package/fesm2022/aakash58-chatbot.mjs.map +0 -1
  279. package/index.d.ts +0 -5
  280. package/lib/app/chat/chat-ui-state.service.d.ts +0 -96
  281. package/lib/app/chat/chat.service.d.ts +0 -88
  282. package/lib/app/chat/components/chat-button/chat-button.component.d.ts +0 -16
  283. package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +0 -5
  284. package/lib/app/chat/components/chat-header/chat-header.component.d.ts +0 -24
  285. package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +0 -49
  286. package/lib/app/chat/components/chat-window/chat-window.component.d.ts +0 -107
  287. package/lib/app/chat/components/message-input/message-input.component.d.ts +0 -12
  288. package/lib/app/chat/components/message-list/message-list.component.d.ts +0 -40
  289. package/lib/app/chat/model/chat-history.model.d.ts +0 -51
  290. package/lib/app/chat/model/chat-request.model.d.ts +0 -10
  291. package/lib/app/chat/model/chat-response.model.d.ts +0 -9
  292. package/lib/app/chat/model/chat-session.model.d.ts +0 -12
  293. package/lib/app/chat/model/chat-stream-response.model.d.ts +0 -10
  294. package/lib/app/chat/services/chat-api.service.d.ts +0 -30
  295. package/lib/app/chat/services/chat-audio.service.d.ts +0 -19
  296. package/lib/app/chat/services/chat-history.service.d.ts +0 -53
  297. package/lib/app/login/login-form.component.d.ts +0 -20
  298. package/lib/app/personalization/personalization-dialog.component.d.ts +0 -53
  299. package/lib/app/personalization/personalization.service.d.ts +0 -66
  300. package/lib/app/personalization/sections/account/account-section.component.d.ts +0 -30
  301. package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +0 -17
  302. package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +0 -27
  303. package/lib/app/personalization/sections/profile/profile-section.component.d.ts +0 -17
  304. package/lib/app/personalization/sections/settings/setting-section.component.d.ts +0 -10
  305. package/lib/app/personalization/sections/terms/terms-section.component.d.ts +0 -5
  306. package/lib/constant/doohbot-constant.d.ts +0 -12
  307. package/lib/constant/html-entities.d.ts +0 -8
  308. package/lib/constant/utf8.d.ts +0 -9
  309. package/lib/core/app-const.d.ts +0 -11
  310. package/lib/core/auth/account-api.service.d.ts +0 -20
  311. package/lib/core/auth/auth.service.d.ts +0 -90
  312. package/lib/core/auth/models/auth-result.model.d.ts +0 -4
  313. package/lib/core/auth/models/federated-login-request.model.d.ts +0 -5
  314. package/lib/core/auth/models/login-request.model.d.ts +0 -6
  315. package/lib/core/auth/storage.service.d.ts +0 -21
  316. package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +0 -23
  317. package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +0 -14
  318. package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +0 -30
  319. package/lib/core/environments/environment.d.ts +0 -7
  320. package/lib/core/environments/environment.prod.d.ts +0 -7
  321. package/lib/core/helpers/crypto-helper.service.d.ts +0 -12
  322. package/lib/core/http/http-stream.service.d.ts +0 -18
  323. package/lib/core/http/http.service.d.ts +0 -20
  324. package/lib/core/interceptors/auth.interceptor.d.ts +0 -18
  325. package/lib/core/interceptors/license.interceptor.d.ts +0 -11
  326. package/lib/core/models/api-config.model.d.ts +0 -58
  327. package/lib/core/models/api-request.model.d.ts +0 -77
  328. package/lib/core/models/api-response.model.d.ts +0 -6
  329. package/lib/core/models/doohbot-config.model.d.ts +0 -81
  330. package/lib/core/models/message.d.ts +0 -16
  331. package/lib/core/models/theme-config.model.d.ts +0 -28
  332. package/lib/core/services/core-config.service.d.ts +0 -23
  333. package/lib/core/services/license.service.d.ts +0 -33
  334. package/lib/core/services/markdown.service.d.ts +0 -8
  335. package/lib/core/services/theme.service.d.ts +0 -40
  336. package/lib/core/utils/logger.service.d.ts +0 -11
  337. package/lib/doohbot-input.d.ts +0 -19
  338. package/lib/doohbot.component.d.ts +0 -108
  339. package/lib/predefined_messages.d.ts +0 -2
  340. package/lib/shared/chips/chips.component.d.ts +0 -10
  341. package/lib/shared/dialog/dialog.component.d.ts +0 -19
  342. package/lib/shared/dialog/dialog.service.d.ts +0 -29
  343. package/lib/shared/dialog/dialog.utils.d.ts +0 -41
  344. package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +0 -11
  345. package/lib/shared/input-dialog/input-dialog.component.d.ts +0 -20
  346. package/lib/shared/menu-item/menu-item.component.d.ts +0 -9
  347. package/lib/shared/pipes/simple-markdown.pipe.d.ts +0 -10
  348. package/lib/shared/snackbar/snackbar.component.d.ts +0 -14
  349. package/lib/shared/snackbar/snackbar.service.d.ts +0 -19
  350. package/public-api.d.ts +0 -11
  351. /package/{src → projects/doohbot/src}/assets/bot.mp3 +0 -0
@@ -1,194 +0,0 @@
1
- import { Component, inject } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule } from '@angular/forms';
4
- import { MatDialogModule, MatDialogRef } from '@angular/material/dialog';
5
- import { MatButtonModule } from '@angular/material/button';
6
- import { MatIconModule } from '@angular/material/icon';
7
- import { MatTabsModule } from '@angular/material/tabs';
8
- import { MatSlideToggleModule } from '@angular/material/slide-toggle';
9
- import { MatFormFieldModule } from '@angular/material/form-field';
10
- import { MatInputModule } from '@angular/material/input';
11
- import { MatSelectModule } from '@angular/material/select';
12
- import { MatTooltipModule } from '@angular/material/tooltip';
13
- import { PreferencesSectionComponent } from './sections/preferences/preferences-section.component';
14
- import { ProfileSectionComponent } from './sections/profile/profile-section.component';
15
- import { TermsSectionComponent } from './sections/terms/terms-section.component';
16
- import { SettingSectionComponent } from './sections/settings/setting-section.component';
17
- import { AccountSectionComponent } from './sections/account/account-section.component';
18
- import { ChatHistoryService } from '../chat/services/chat-history.service';
19
- import { AuthService } from '../../core/auth/auth.service';
20
- import { PersonalizationService } from './personalization.service';
21
- import { DialogService } from '../../shared/dialog/dialog.service';
22
- import { DialogUtils } from '../../shared/dialog/dialog.utils';
23
- import { SnackbarService } from '../../shared/snackbar/snackbar.service';
24
- import { ThemeService } from '../../core/services/theme.service';
25
- import * as i0 from "@angular/core";
26
- import * as i1 from "@angular/material/dialog";
27
- import * as i2 from "@angular/material/button";
28
- import * as i3 from "@angular/material/icon";
29
- import * as i4 from "@angular/material/tooltip";
30
- export class PersonalizationDialogComponent {
31
- constructor() {
32
- this.dialogRef = inject((MatDialogRef));
33
- this.dialogService = inject(DialogService);
34
- this.personalization = inject(PersonalizationService);
35
- this.authService = inject(AuthService);
36
- this.chatHistory = inject(ChatHistoryService);
37
- this.snackbar = inject(SnackbarService);
38
- // Local copy of settings for editing
39
- this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));
40
- this.activeSection = 'profile';
41
- this.sections = [
42
- { id: 'account', label: 'Account', type: 'header' },
43
- { id: 'profile', label: 'My profile', icon: 'person_outline', type: 'item' },
44
- { id: 'account_settings', label: 'Manage Account', icon: 'manage_accounts', type: 'item' },
45
- { id: 'preferences', label: 'Preferences', icon: 'tune', type: 'item' },
46
- { id: 'workspace', label: 'Workspace', type: 'header' },
47
- { id: 'general', label: 'Settings', icon: 'settings', type: 'item' },
48
- { id: 'info', label: 'Support', type: 'header' },
49
- { id: 'terms', label: 'Terms & Conditions', icon: 'description', type: 'item' },
50
- ];
51
- this.colorTokens = [
52
- {
53
- name: 'Standard',
54
- value: 'default',
55
- },
56
- { name: 'Purple', value: '#7c3aed' },
57
- { name: 'Pink', value: '#db2777' },
58
- { name: 'Red', value: '#dc2626' },
59
- { name: 'Orange', value: '#ea580c' },
60
- { name: 'Green', value: '#16a34a' },
61
- { name: 'Teal', value: '#0d9488' },
62
- { name: 'Blue', value: '#2563eb' },
63
- ];
64
- this.themeService = inject(ThemeService);
65
- this.originalColor = '';
66
- this.isSaved = false;
67
- this.originalColor = this.personalization.settings().appearance.primaryColor;
68
- }
69
- onSave() {
70
- if (this.activeSection === 'preferences') {
71
- this.isSaved = true;
72
- this.personalization.updateAppearance(this.settings.appearance);
73
- // Re-apply to ensure consistency (effect handles it, but just in case)
74
- this.snackbar.success('Appearance settings saved');
75
- }
76
- else if (this.activeSection === 'general') {
77
- this.personalization.updateInstructions(this.settings.customInstructions);
78
- this.snackbar.success('Settings saved');
79
- }
80
- }
81
- onCancel() {
82
- this.dialogRef.close(false);
83
- // ngOnDestroy will handle revert
84
- }
85
- ngOnDestroy() {
86
- if (!this.isSaved) {
87
- // Revert to original color if not saved
88
- this.themeService.applyPrimaryColorToGlobal(this.originalColor);
89
- }
90
- }
91
- onReset() {
92
- DialogUtils.confirmReset(this.dialogService).subscribe((confirmed) => {
93
- if (confirmed) {
94
- // Only reset the current section
95
- if (this.activeSection === 'preferences') {
96
- // Reset only appearance settings to defaults
97
- this.personalization.resetToDefaults();
98
- // Re-clone settings to update UI
99
- this.settings = JSON.parse(JSON.stringify(this.personalization.settings()));
100
- // Live preview the reset
101
- this.themeService.applyPrimaryColorToGlobal(this.settings.appearance.primaryColor);
102
- }
103
- }
104
- });
105
- }
106
- selectTheme(theme) {
107
- this.settings.appearance.theme = theme;
108
- // Optional: Preview theme? User only asked for color.
109
- }
110
- selectColor(color) {
111
- this.settings.appearance.primaryColor = color;
112
- //! Live Preview for changed color
113
- // this.themeService.applyPrimaryColorToGlobal(color);
114
- }
115
- selectButtonStyle(style) {
116
- this.settings.appearance.buttonStyle = style;
117
- }
118
- selectSection(sectionId) {
119
- if (this.sections.find((s) => s.id === sectionId && s.type === 'item')) {
120
- this.activeSection = sectionId;
121
- }
122
- }
123
- get hasChanges() {
124
- if (this.activeSection === 'preferences')
125
- return this.hasPreferencesChanges();
126
- if (this.activeSection === 'general')
127
- return this.hasInstructionChanges();
128
- return false;
129
- }
130
- hasPreferencesChanges() {
131
- const original = this.personalization.settings().appearance;
132
- const current = this.settings.appearance;
133
- return JSON.stringify(original) !== JSON.stringify(current);
134
- }
135
- hasInstructionChanges() {
136
- const original = this.personalization.settings().customInstructions;
137
- const current = this.settings.customInstructions;
138
- return JSON.stringify(original) !== JSON.stringify(current);
139
- }
140
- get username() {
141
- return this.authService.getLoggedInUserName();
142
- }
143
- get userImageUrl() {
144
- return this.authService.getLoggedInUserImageUrl();
145
- }
146
- get userRole() {
147
- return this.authService.getLoggedInUserRole();
148
- }
149
- isCustomColorSelected() {
150
- return !this.colorTokens.some((token) => token.value.toLowerCase() === this.settings.appearance.primaryColor.toLowerCase());
151
- }
152
- onCustomColorChange(event) {
153
- const color = event.target.value;
154
- this.selectColor(color);
155
- }
156
- deleteAllHistory() {
157
- const userId = this.authService.getUserId() || '';
158
- this.chatHistory.deleteAllHistory(userId.toString()).subscribe(() => {
159
- // History cleared
160
- });
161
- }
162
- logoutAllDevices() {
163
- console.log('Logging out of all devices...');
164
- // Implement service call when API is ready
165
- }
166
- deleteAccount() {
167
- console.log('Deleting account...');
168
- // Implement service call when API is ready
169
- }
170
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
171
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PersonalizationDialogComponent, isStandalone: true, selector: "app-personalization-dialog", ngImport: i0, template: "<div class=\"personalization-container\">\r\n <div class=\"header\">\r\n <div class=\"title-section\">\r\n <mat-icon class=\"header-icon\">settings_suggest</mat-icon>\r\n <h2>Personalization</h2>\r\n </div>\r\n <button mat-icon-button (click)=\"onCancel()\" matTooltip=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"dialog-layout no-padding\">\r\n <!-- Sidebar Navigation -->\r\n <aside class=\"sidebar\">\r\n @for (section of sections; track section.id) {\r\n @if (section.type === 'header') {\r\n <div class=\"nav-header\">{{ section.label }}</div>\r\n } @else {\r\n <div\r\n class=\"nav-item\"\r\n [class.active]=\"activeSection === section.id\"\r\n (click)=\"selectSection(section.id)\"\r\n >\r\n <mat-icon>{{ section.icon }}</mat-icon>\r\n <span>{{ section.label }}</span>\r\n </div>\r\n }\r\n }\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <main class=\"main-content\">\r\n <!-- Appearance / Preferences Section -->\r\n @if (activeSection === 'preferences') {\r\n <app-preferences-section\r\n [settings]=\"settings\"\r\n [colorTokens]=\"colorTokens\"\r\n [isCustomColorSelected]=\"isCustomColorSelected()\"\r\n [defaultColor]=\"personalization.developerDefaults().primaryColor || 'default'\"\r\n (onThemeSelect)=\"selectTheme($event)\"\r\n (onColorSelect)=\"selectColor($event)\"\r\n (onButtonStyleSelect)=\"selectButtonStyle($event)\"\r\n (onSave)=\"onSave()\"\r\n (onReset)=\"onReset()\"\r\n >\r\n </app-preferences-section>\r\n }\r\n\r\n <!-- Account / Profile Section -->\r\n @if (activeSection === 'account_settings') {\r\n <app-account-section\r\n (onDeleteAllHistory)=\"deleteAllHistory()\"\r\n (onLogoutAll)=\"logoutAllDevices()\"\r\n (onDeleteAccount)=\"deleteAccount()\"\r\n ></app-account-section>\r\n }\r\n\r\n @if (activeSection === 'profile') {\r\n <app-profile-section\r\n [username]=\"username\"\r\n [userImageUrl]=\"userImageUrl\"\r\n [userRole]=\"userRole\"\r\n ></app-profile-section>\r\n }\r\n\r\n <!-- General Section -->\r\n @if (activeSection === 'general') {\r\n <app-setting-section\r\n [settings]=\"settings\"\r\n [hasChanges]=\"hasChanges\"\r\n (onSave)=\"onSave()\"\r\n ></app-setting-section>\r\n }\r\n\r\n <!-- Terms and Conditions Section -->\r\n @if (activeSection === 'terms') {\r\n <app-terms-section></app-terms-section>\r\n }\r\n </main>\r\n </mat-dialog-content>\r\n</div>\r\n", styles: [".personalization-container{display:flex;flex-direction:column;width:100%;height:100%;max-width:none;max-height:none;max-height:90vh;background:var(--background-color);color:var(--text-color);border-radius:12px;overflow:hidden;box-shadow:var(--border-shadow-color)}.personalization-container .header{flex:0 0 auto;display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-bottom:1px solid var(--border-color);background:var(--background-color)}.personalization-container .header .title-section{display:flex;align-items:center;gap:10px}.personalization-container .header .title-section .header-icon{color:var(--secondary-text-color);font-size:20px;width:20px;height:20px}.personalization-container .header .title-section h2{margin:0;font-size:.95rem;font-weight:500;color:var(--secondary-text-color)}.personalization-container .dialog-layout{display:flex;padding:0;margin:0;flex:1;overflow:hidden}.personalization-container .sidebar{width:240px;background:rgba(var(--black-rgb),.02);border-right:1px solid var(--border-color);padding:16px 8px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;scrollbar-gutter:stable}.personalization-container .sidebar::-webkit-scrollbar{width:4px}.personalization-container .sidebar::-webkit-scrollbar-track{background:transparent}.personalization-container .sidebar::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .sidebar::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.personalization-container .sidebar .nav-header{padding:12px 12px 6px;font-size:.75rem;font-weight:600;text-transform:uppercase;color:var(--secondary-text-color);letter-spacing:.5px}.personalization-container .sidebar .nav-item{display:flex;align-items:center;gap:12px;padding:8px 12px;border-radius:6px;cursor:pointer;transition:all .2s ease;color:var(--text-color)}.personalization-container .sidebar .nav-item mat-icon{font-size:18px;width:18px;height:18px;color:var(--secondary-text-color)}.personalization-container .sidebar .nav-item span{font-size:.9rem;font-weight:400}.personalization-container .sidebar .nav-item:hover{background:rgba(var(--black-rgb),.05)}.personalization-container .sidebar .nav-item.active{background:rgba(var(--primary-color-rgb),.1);font-weight:500;color:var(--primary-color)}.personalization-container .sidebar .nav-item.active mat-icon{color:var(--primary-color)}.personalization-container .main-content{flex:1;overflow-y:auto;background:var(--background-color);position:relative}.personalization-container .main-content::-webkit-scrollbar{width:6px}.personalization-container .main-content::-webkit-scrollbar-track{background:transparent}.personalization-container .main-content::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .main-content::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.full-width{width:100%}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}:host-context(.dark-theme) .personalization-container .sidebar{background:var(--background-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: PreferencesSectionComponent, selector: "app-preferences-section", inputs: ["settings", "colorTokens", "isCustomColorSelected", "defaultColor"], outputs: ["onThemeSelect", "onColorSelect", "onButtonStyleSelect", "onSave", "onReset"] }, { kind: "component", type: ProfileSectionComponent, selector: "app-profile-section", inputs: ["username", "userImageUrl", "userRole"] }, { kind: "component", type: SettingSectionComponent, selector: "app-setting-section", inputs: ["settings", "hasChanges"], outputs: ["onSave"] }, { kind: "component", type: TermsSectionComponent, selector: "app-terms-section" }, { kind: "component", type: AccountSectionComponent, selector: "app-account-section", inputs: ["organizationId"], outputs: ["onDeleteAllHistory", "onLogoutAll", "onLogoutSession", "onDeleteAccount"] }] }); }
172
- }
173
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationDialogComponent, decorators: [{
174
- type: Component,
175
- args: [{ selector: 'app-personalization-dialog', standalone: true, imports: [
176
- CommonModule,
177
- FormsModule,
178
- MatDialogModule,
179
- MatButtonModule,
180
- MatIconModule,
181
- MatTabsModule,
182
- MatSlideToggleModule,
183
- MatFormFieldModule,
184
- MatInputModule,
185
- MatSelectModule,
186
- MatTooltipModule,
187
- PreferencesSectionComponent,
188
- ProfileSectionComponent,
189
- SettingSectionComponent,
190
- TermsSectionComponent,
191
- AccountSectionComponent,
192
- ], template: "<div class=\"personalization-container\">\r\n <div class=\"header\">\r\n <div class=\"title-section\">\r\n <mat-icon class=\"header-icon\">settings_suggest</mat-icon>\r\n <h2>Personalization</h2>\r\n </div>\r\n <button mat-icon-button (click)=\"onCancel()\" matTooltip=\"Close\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"dialog-layout no-padding\">\r\n <!-- Sidebar Navigation -->\r\n <aside class=\"sidebar\">\r\n @for (section of sections; track section.id) {\r\n @if (section.type === 'header') {\r\n <div class=\"nav-header\">{{ section.label }}</div>\r\n } @else {\r\n <div\r\n class=\"nav-item\"\r\n [class.active]=\"activeSection === section.id\"\r\n (click)=\"selectSection(section.id)\"\r\n >\r\n <mat-icon>{{ section.icon }}</mat-icon>\r\n <span>{{ section.label }}</span>\r\n </div>\r\n }\r\n }\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <main class=\"main-content\">\r\n <!-- Appearance / Preferences Section -->\r\n @if (activeSection === 'preferences') {\r\n <app-preferences-section\r\n [settings]=\"settings\"\r\n [colorTokens]=\"colorTokens\"\r\n [isCustomColorSelected]=\"isCustomColorSelected()\"\r\n [defaultColor]=\"personalization.developerDefaults().primaryColor || 'default'\"\r\n (onThemeSelect)=\"selectTheme($event)\"\r\n (onColorSelect)=\"selectColor($event)\"\r\n (onButtonStyleSelect)=\"selectButtonStyle($event)\"\r\n (onSave)=\"onSave()\"\r\n (onReset)=\"onReset()\"\r\n >\r\n </app-preferences-section>\r\n }\r\n\r\n <!-- Account / Profile Section -->\r\n @if (activeSection === 'account_settings') {\r\n <app-account-section\r\n (onDeleteAllHistory)=\"deleteAllHistory()\"\r\n (onLogoutAll)=\"logoutAllDevices()\"\r\n (onDeleteAccount)=\"deleteAccount()\"\r\n ></app-account-section>\r\n }\r\n\r\n @if (activeSection === 'profile') {\r\n <app-profile-section\r\n [username]=\"username\"\r\n [userImageUrl]=\"userImageUrl\"\r\n [userRole]=\"userRole\"\r\n ></app-profile-section>\r\n }\r\n\r\n <!-- General Section -->\r\n @if (activeSection === 'general') {\r\n <app-setting-section\r\n [settings]=\"settings\"\r\n [hasChanges]=\"hasChanges\"\r\n (onSave)=\"onSave()\"\r\n ></app-setting-section>\r\n }\r\n\r\n <!-- Terms and Conditions Section -->\r\n @if (activeSection === 'terms') {\r\n <app-terms-section></app-terms-section>\r\n }\r\n </main>\r\n </mat-dialog-content>\r\n</div>\r\n", styles: [".personalization-container{display:flex;flex-direction:column;width:100%;height:100%;max-width:none;max-height:none;max-height:90vh;background:var(--background-color);color:var(--text-color);border-radius:12px;overflow:hidden;box-shadow:var(--border-shadow-color)}.personalization-container .header{flex:0 0 auto;display:flex;justify-content:space-between;align-items:center;padding:12px 20px;border-bottom:1px solid var(--border-color);background:var(--background-color)}.personalization-container .header .title-section{display:flex;align-items:center;gap:10px}.personalization-container .header .title-section .header-icon{color:var(--secondary-text-color);font-size:20px;width:20px;height:20px}.personalization-container .header .title-section h2{margin:0;font-size:.95rem;font-weight:500;color:var(--secondary-text-color)}.personalization-container .dialog-layout{display:flex;padding:0;margin:0;flex:1;overflow:hidden}.personalization-container .sidebar{width:240px;background:rgba(var(--black-rgb),.02);border-right:1px solid var(--border-color);padding:16px 8px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;scrollbar-gutter:stable}.personalization-container .sidebar::-webkit-scrollbar{width:4px}.personalization-container .sidebar::-webkit-scrollbar-track{background:transparent}.personalization-container .sidebar::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .sidebar::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.personalization-container .sidebar .nav-header{padding:12px 12px 6px;font-size:.75rem;font-weight:600;text-transform:uppercase;color:var(--secondary-text-color);letter-spacing:.5px}.personalization-container .sidebar .nav-item{display:flex;align-items:center;gap:12px;padding:8px 12px;border-radius:6px;cursor:pointer;transition:all .2s ease;color:var(--text-color)}.personalization-container .sidebar .nav-item mat-icon{font-size:18px;width:18px;height:18px;color:var(--secondary-text-color)}.personalization-container .sidebar .nav-item span{font-size:.9rem;font-weight:400}.personalization-container .sidebar .nav-item:hover{background:rgba(var(--black-rgb),.05)}.personalization-container .sidebar .nav-item.active{background:rgba(var(--primary-color-rgb),.1);font-weight:500;color:var(--primary-color)}.personalization-container .sidebar .nav-item.active mat-icon{color:var(--primary-color)}.personalization-container .main-content{flex:1;overflow-y:auto;background:var(--background-color);position:relative}.personalization-container .main-content::-webkit-scrollbar{width:6px}.personalization-container .main-content::-webkit-scrollbar-track{background:transparent}.personalization-container .main-content::-webkit-scrollbar-thumb{background:rgba(var(--black-rgb),.1);border-radius:10px}.personalization-container .main-content::-webkit-scrollbar-thumb:hover{background:rgba(var(--black-rgb),.2)}.full-width{width:100%}@keyframes slideIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}:host-context(.dark-theme) .personalization-container .sidebar{background:var(--background-color)}\n"] }]
193
- }], ctorParameters: () => [] });
194
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uYWxpemF0aW9uLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvYXBwL3BlcnNvbmFsaXphdGlvbi9wZXJzb25hbGl6YXRpb24tZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rvb2hib3Qvc3JjL2xpYi9hcHAvcGVyc29uYWxpemF0aW9uL3BlcnNvbmFsaXphdGlvbi1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFD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QUNuQywyQ0FBMkM7SUFDN0MsQ0FBQzsrR0F0S1UsOEJBQThCO21HQUE5Qiw4QkFBOEIsc0ZDakQzQyx5eUZBaUZBLG1vR0RwREksWUFBWSw4QkFDWixXQUFXLDhCQUNYLGVBQWUsMEpBQ2YsZUFBZSwySUFDZixhQUFhLG1MQUNiLGFBQWEsOEJBQ2Isb0JBQW9CLDhCQUNwQixrQkFBa0IsOEJBQ2xCLGNBQWMsOEJBQ2QsZUFBZSw4QkFDZixnQkFBZ0IsNlRBQ2hCLDJCQUEyQiwyT0FDM0IsdUJBQXVCLGtIQUN2Qix1QkFBdUIseUhBQ3ZCLHFCQUFxQiw4REFDckIsdUJBQXVCOzs0RkFLZCw4QkFBOEI7a0JBeEIxQyxTQUFTOytCQUNFLDRCQUE0QixjQUMxQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGFBQWE7d0JBQ2Isb0JBQW9CO3dCQUNwQixrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLDJCQUEyQjt3QkFDM0IsdUJBQXVCO3dCQUN2Qix1QkFBdUI7d0JBQ3ZCLHFCQUFxQjt3QkFDckIsdUJBQXVCO3FCQUN4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XHJcbmltcG9ydCB7IE1hdFNsaWRlVG9nZ2xlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcbmltcG9ydCB7IFByZWZlcmVuY2VzU2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vc2VjdGlvbnMvcHJlZmVyZW5jZXMvcHJlZmVyZW5jZXMtc2VjdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQcm9maWxlU2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vc2VjdGlvbnMvcHJvZmlsZS9wcm9maWxlLXNlY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGVybXNTZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9zZWN0aW9ucy90ZXJtcy90ZXJtcy1zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNldHRpbmdTZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9zZWN0aW9ucy9zZXR0aW5ncy9zZXR0aW5nLXNlY3Rpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQWNjb3VudFNlY3Rpb25Db21wb25lbnQgfSBmcm9tICcuL3NlY3Rpb25zL2FjY291bnQvYWNjb3VudC1zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENoYXRIaXN0b3J5U2VydmljZSB9IGZyb20gJy4uL2NoYXQvc2VydmljZXMvY2hhdC1oaXN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvYXV0aC9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQZXJzb25hbGl6YXRpb25TZXJ2aWNlLCBQZXJzb25hbGl6YXRpb25TZXR0aW5ncyB9IGZyb20gJy4vcGVyc29uYWxpemF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RpYWxvZy9kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWxvZ1V0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RpYWxvZy9kaWFsb2cudXRpbHMnO1xyXG5pbXBvcnQgeyBTbmFja2JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc25hY2tiYXIvc25hY2tiYXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvdGhlbWUuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1wZXJzb25hbGl6YXRpb24tZGlhbG9nJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgTWF0RGlhbG9nTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdFRhYnNNb2R1bGUsXHJcbiAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIFByZWZlcmVuY2VzU2VjdGlvbkNvbXBvbmVudCxcclxuICAgIFByb2ZpbGVTZWN0aW9uQ29tcG9uZW50LFxyXG4gICAgU2V0dGluZ1NlY3Rpb25Db21wb25lbnQsXHJcbiAgICBUZXJtc1NlY3Rpb25Db21wb25lbnQsXHJcbiAgICBBY2NvdW50U2VjdGlvbkNvbXBvbmVudCxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wZXJzb25hbGl6YXRpb24tZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wZXJzb25hbGl6YXRpb24tZGlhbG9nLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQZXJzb25hbGl6YXRpb25EaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgZGlhbG9nUmVmID0gaW5qZWN0KE1hdERpYWxvZ1JlZjxQZXJzb25hbGl6YXRpb25EaWFsb2dDb21wb25lbnQ+KTtcclxuICBwcml2YXRlIGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoRGlhbG9nU2VydmljZSk7XHJcbiAgcHVibGljIHBlcnNvbmFsaXphdGlvbiA9IGluamVjdChQZXJzb25hbGl6YXRpb25TZXJ2aWNlKTtcclxuICBwcml2YXRlIGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcclxuICBwcml2YXRlIGNoYXRIaXN0b3J5ID0gaW5qZWN0KENoYXRIaXN0b3J5U2VydmljZSk7XHJcbiAgcHJpdmF0ZSBzbmFja2JhciA9IGluamVjdChTbmFja2JhclNlcnZpY2UpO1xyXG5cclxuICAvLyBMb2NhbCBjb3B5IG9mIHNldHRpbmdzIGZvciBlZGl0aW5nXHJcbiAgcHVibGljIHNldHRpbmdzOiBQZXJzb25hbGl6YXRpb25TZXR0aW5ncyA9IEpTT04ucGFyc2UoXHJcbiAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnBlcnNvbmFsaXphdGlvbi5zZXR0aW5ncygpKSxcclxuICApO1xyXG5cclxuICBwdWJsaWMgYWN0aXZlU2VjdGlvbiA9ICdwcm9maWxlJztcclxuXHJcbiAgcHVibGljIHNlY3Rpb25zID0gW1xyXG4gICAgeyBpZDogJ2FjY291bnQnLCBsYWJlbDogJ0FjY291bnQnLCB0eXBlOiAnaGVhZGVyJyB9LFxyXG4gICAgeyBpZDogJ3Byb2ZpbGUnLCBsYWJlbDogJ015IHByb2ZpbGUnLCBpY29uOiAncGVyc29uX291dGxpbmUnLCB0eXBlOiAnaXRlbScgfSxcclxuICAgIHsgaWQ6ICdhY2NvdW50X3NldHRpbmdzJywgbGFiZWw6ICdNYW5hZ2UgQWNjb3VudCcsIGljb246ICdtYW5hZ2VfYWNjb3VudHMnLCB0eXBlOiAnaXRlbScgfSxcclxuICAgIHsgaWQ6ICdwcmVmZXJlbmNlcycsIGxhYmVsOiAnUHJlZmVyZW5jZXMnLCBpY29uOiAndHVuZScsIHR5cGU6ICdpdGVtJyB9LFxyXG4gICAgeyBpZDogJ3dvcmtzcGFjZScsIGxhYmVsOiAnV29ya3NwYWNlJywgdHlwZTogJ2hlYWRlcicgfSxcclxuICAgIHsgaWQ6ICdnZW5lcmFsJywgbGFiZWw6ICdTZXR0aW5ncycsIGljb246ICdzZXR0aW5ncycsIHR5cGU6ICdpdGVtJyB9LFxyXG4gICAgeyBpZDogJ2luZm8nLCBsYWJlbDogJ1N1cHBvcnQnLCB0eXBlOiAnaGVhZGVyJyB9LFxyXG4gICAgeyBpZDogJ3Rlcm1zJywgbGFiZWw6ICdUZXJtcyAmIENvbmRpdGlvbnMnLCBpY29uOiAnZGVzY3JpcHRpb24nLCB0eXBlOiAnaXRlbScgfSxcclxuICBdO1xyXG5cclxuICBwdWJsaWMgY29sb3JUb2tlbnMgPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdTdGFuZGFyZCcsXHJcbiAgICAgIHZhbHVlOiAnZGVmYXVsdCcsXHJcbiAgICB9LFxyXG4gICAgeyBuYW1lOiAnUHVycGxlJywgdmFsdWU6ICcjN2MzYWVkJyB9LFxyXG4gICAgeyBuYW1lOiAnUGluaycsIHZhbHVlOiAnI2RiMjc3NycgfSxcclxuICAgIHsgbmFtZTogJ1JlZCcsIHZhbHVlOiAnI2RjMjYyNicgfSxcclxuICAgIHsgbmFtZTogJ09yYW5nZScsIHZhbHVlOiAnI2VhNTgwYycgfSxcclxuICAgIHsgbmFtZTogJ0dyZWVuJywgdmFsdWU6ICcjMTZhMzRhJyB9LFxyXG4gICAgeyBuYW1lOiAnVGVhbCcsIHZhbHVlOiAnIzBkOTQ4OCcgfSxcclxuICAgIHsgbmFtZTogJ0JsdWUnLCB2YWx1ZTogJyMyNTYzZWInIH0sXHJcbiAgXTtcclxuXHJcbiAgcHJpdmF0ZSB0aGVtZVNlcnZpY2UgPSBpbmplY3QoVGhlbWVTZXJ2aWNlKTtcclxuICBwcml2YXRlIG9yaWdpbmFsQ29sb3I6IHN0cmluZyA9ICcnO1xyXG4gIHByaXZhdGUgaXNTYXZlZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMub3JpZ2luYWxDb2xvciA9IHRoaXMucGVyc29uYWxpemF0aW9uLnNldHRpbmdzKCkuYXBwZWFyYW5jZS5wcmltYXJ5Q29sb3I7XHJcbiAgfVxyXG5cclxuICBvblNhdmUoKSB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVTZWN0aW9uID09PSAncHJlZmVyZW5jZXMnKSB7XHJcbiAgICAgIHRoaXMuaXNTYXZlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMucGVyc29uYWxpemF0aW9uLnVwZGF0ZUFwcGVhcmFuY2UodGhpcy5zZXR0aW5ncy5hcHBlYXJhbmNlKTtcclxuICAgICAgLy8gUmUtYXBwbHkgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IChlZmZlY3QgaGFuZGxlcyBpdCwgYnV0IGp1c3QgaW4gY2FzZSlcclxuICAgICAgdGhpcy5zbmFja2Jhci5zdWNjZXNzKCdBcHBlYXJhbmNlIHNldHRpbmdzIHNhdmVkJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlU2VjdGlvbiA9PT0gJ2dlbmVyYWwnKSB7XHJcbiAgICAgIHRoaXMucGVyc29uYWxpemF0aW9uLnVwZGF0ZUluc3RydWN0aW9ucyh0aGlzLnNldHRpbmdzLmN1c3RvbUluc3RydWN0aW9ucyk7XHJcbiAgICAgIHRoaXMuc25hY2tiYXIuc3VjY2VzcygnU2V0dGluZ3Mgc2F2ZWQnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpO1xyXG4gICAgLy8gbmdPbkRlc3Ryb3kgd2lsbCBoYW5kbGUgcmV2ZXJ0XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICghdGhpcy5pc1NhdmVkKSB7XHJcbiAgICAgIC8vIFJldmVydCB0byBvcmlnaW5hbCBjb2xvciBpZiBub3Qgc2F2ZWRcclxuICAgICAgdGhpcy50aGVtZVNlcnZpY2UuYXBwbHlQcmltYXJ5Q29sb3JUb0dsb2JhbCh0aGlzLm9yaWdpbmFsQ29sb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25SZXNldCgpIHtcclxuICAgIERpYWxvZ1V0aWxzLmNvbmZpcm1SZXNldCh0aGlzLmRpYWxvZ1NlcnZpY2UpLnN1YnNjcmliZSgoY29uZmlybWVkKSA9PiB7XHJcbiAgICAgIGlmIChjb25maXJtZWQpIHtcclxuICAgICAgICAvLyBPbmx5IHJlc2V0IHRoZSBjdXJyZW50IHNlY3Rpb25cclxuICAgICAgICBpZiAodGhpcy5hY3RpdmVTZWN0aW9uID09PSAncHJlZmVyZW5jZXMnKSB7XHJcbiAgICAgICAgICAvLyBSZXNldCBvbmx5IGFwcGVhcmFuY2Ugc2V0dGluZ3MgdG8gZGVmYXVsdHNcclxuICAgICAgICAgIHRoaXMucGVyc29uYWxpemF0aW9uLnJlc2V0VG9EZWZhdWx0cygpO1xyXG4gICAgICAgICAgLy8gUmUtY2xvbmUgc2V0dGluZ3MgdG8gdXBkYXRlIFVJXHJcbiAgICAgICAgICB0aGlzLnNldHRpbmdzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnBlcnNvbmFsaXphdGlvbi5zZXR0aW5ncygpKSk7XHJcblxyXG4gICAgICAgICAgLy8gTGl2ZSBwcmV2aWV3IHRoZSByZXNldFxyXG4gICAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UuYXBwbHlQcmltYXJ5Q29sb3JUb0dsb2JhbCh0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2UucHJpbWFyeUNvbG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0VGhlbWUodGhlbWU6ICdsaWdodCcgfCAnZGFyaycgfCAnYXV0bycpIHtcclxuICAgIHRoaXMuc2V0dGluZ3MuYXBwZWFyYW5jZS50aGVtZSA9IHRoZW1lO1xyXG4gICAgLy8gT3B0aW9uYWw6IFByZXZpZXcgdGhlbWU/IFVzZXIgb25seSBhc2tlZCBmb3IgY29sb3IuXHJcbiAgfVxyXG5cclxuICBzZWxlY3RDb2xvcihjb2xvcjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2UucHJpbWFyeUNvbG9yID0gY29sb3I7XHJcbiAgICAvLyEgTGl2ZSBQcmV2aWV3IGZvciBjaGFuZ2VkIGNvbG9yXHJcbiAgICAvLyB0aGlzLnRoZW1lU2VydmljZS5hcHBseVByaW1hcnlDb2xvclRvR2xvYmFsKGNvbG9yKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEJ1dHRvblN0eWxlKHN0eWxlOiAnZmFiJyB8ICdzaWRlYmFyJyB8ICdzaWRlYmFyLXRvcCcgfCAnc2lkZWJhci1ib3R0b20nKSB7XHJcbiAgICB0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2UuYnV0dG9uU3R5bGUgPSBzdHlsZTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFNlY3Rpb24oc2VjdGlvbklkOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLnNlY3Rpb25zLmZpbmQoKHMpID0+IHMuaWQgPT09IHNlY3Rpb25JZCAmJiBzLnR5cGUgPT09ICdpdGVtJykpIHtcclxuICAgICAgdGhpcy5hY3RpdmVTZWN0aW9uID0gc2VjdGlvbklkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0NoYW5nZXMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVTZWN0aW9uID09PSAncHJlZmVyZW5jZXMnKSByZXR1cm4gdGhpcy5oYXNQcmVmZXJlbmNlc0NoYW5nZXMoKTtcclxuICAgIGlmICh0aGlzLmFjdGl2ZVNlY3Rpb24gPT09ICdnZW5lcmFsJykgcmV0dXJuIHRoaXMuaGFzSW5zdHJ1Y3Rpb25DaGFuZ2VzKCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBoYXNQcmVmZXJlbmNlc0NoYW5nZXMoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBvcmlnaW5hbCA9IHRoaXMucGVyc29uYWxpemF0aW9uLnNldHRpbmdzKCkuYXBwZWFyYW5jZTtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnNldHRpbmdzLmFwcGVhcmFuY2U7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyZW50KTtcclxuICB9XHJcblxyXG4gIGhhc0luc3RydWN0aW9uQ2hhbmdlcygpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IG9yaWdpbmFsID0gdGhpcy5wZXJzb25hbGl6YXRpb24uc2V0dGluZ3MoKS5jdXN0b21JbnN0cnVjdGlvbnM7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zZXR0aW5ncy5jdXN0b21JbnN0cnVjdGlvbnM7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob3JpZ2luYWwpICE9PSBKU09OLnN0cmluZ2lmeShjdXJyZW50KTtcclxuICB9XHJcblxyXG4gIGdldCB1c2VybmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VkSW5Vc2VyTmFtZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHVzZXJJbWFnZVVybCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlZEluVXNlckltYWdlVXJsKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdXNlclJvbGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlZEluVXNlclJvbGUoKTtcclxuICB9XHJcblxyXG4gIGlzQ3VzdG9tQ29sb3JTZWxlY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5jb2xvclRva2Vucy5zb21lKFxyXG4gICAgICAodG9rZW4pID0+IHRva2VuLnZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuc2V0dGluZ3MuYXBwZWFyYW5jZS5wcmltYXJ5Q29sb3IudG9Mb3dlckNhc2UoKSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBvbkN1c3RvbUNvbG9yQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xyXG4gICAgY29uc3QgY29sb3IgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xyXG4gICAgdGhpcy5zZWxlY3RDb2xvcihjb2xvcik7XHJcbiAgfVxyXG5cclxuICBkZWxldGVBbGxIaXN0b3J5KCkge1xyXG4gICAgY29uc3QgdXNlcklkID0gdGhpcy5hdXRoU2VydmljZS5nZXRVc2VySWQoKSB8fCAnJztcclxuICAgIHRoaXMuY2hhdEhpc3RvcnkuZGVsZXRlQWxsSGlzdG9yeSh1c2VySWQudG9TdHJpbmcoKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgLy8gSGlzdG9yeSBjbGVhcmVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvZ291dEFsbERldmljZXMoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnTG9nZ2luZyBvdXQgb2YgYWxsIGRldmljZXMuLi4nKTtcclxuICAgIC8vIEltcGxlbWVudCBzZXJ2aWNlIGNhbGwgd2hlbiBBUEkgaXMgcmVhZHlcclxuICB9XHJcblxyXG4gIGRlbGV0ZUFjY291bnQoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnRGVsZXRpbmcgYWNjb3VudC4uLicpO1xyXG4gICAgLy8gSW1wbGVtZW50IHNlcnZpY2UgY2FsbCB3aGVuIEFQSSBpcyByZWFkeVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwicGVyc29uYWxpemF0aW9uLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1zZWN0aW9uXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImhlYWRlci1pY29uXCI+c2V0dGluZ3Nfc3VnZ2VzdDwvbWF0LWljb24+XHJcbiAgICAgIDxoMj5QZXJzb25hbGl6YXRpb248L2gyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoKVwiIG1hdFRvb2x0aXA9XCJDbG9zZVwiPlxyXG4gICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJkaWFsb2ctbGF5b3V0IG5vLXBhZGRpbmdcIj5cclxuICAgIDwhLS0gU2lkZWJhciBOYXZpZ2F0aW9uIC0tPlxyXG4gICAgPGFzaWRlIGNsYXNzPVwic2lkZWJhclwiPlxyXG4gICAgICBAZm9yIChzZWN0aW9uIG9mIHNlY3Rpb25zOyB0cmFjayBzZWN0aW9uLmlkKSB7XHJcbiAgICAgICAgQGlmIChzZWN0aW9uLnR5cGUgPT09ICdoZWFkZXInKSB7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibmF2LWhlYWRlclwiPnt7IHNlY3Rpb24ubGFiZWwgfX08L2Rpdj5cclxuICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgY2xhc3M9XCJuYXYtaXRlbVwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlU2VjdGlvbiA9PT0gc2VjdGlvbi5pZFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTZWN0aW9uKHNlY3Rpb24uaWQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uPnt7IHNlY3Rpb24uaWNvbiB9fTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IHNlY3Rpb24ubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIDwvYXNpZGU+XHJcblxyXG4gICAgPCEtLSBNYWluIENvbnRlbnQgQXJlYSAtLT5cclxuICAgIDxtYWluIGNsYXNzPVwibWFpbi1jb250ZW50XCI+XHJcbiAgICAgIDwhLS0gQXBwZWFyYW5jZSAvIFByZWZlcmVuY2VzIFNlY3Rpb24gLS0+XHJcbiAgICAgIEBpZiAoYWN0aXZlU2VjdGlvbiA9PT0gJ3ByZWZlcmVuY2VzJykge1xyXG4gICAgICAgIDxhcHAtcHJlZmVyZW5jZXMtc2VjdGlvblxyXG4gICAgICAgICAgW3NldHRpbmdzXT1cInNldHRpbmdzXCJcclxuICAgICAgICAgIFtjb2xvclRva2Vuc109XCJjb2xvclRva2Vuc1wiXHJcbiAgICAgICAgICBbaXNDdXN0b21Db2xvclNlbGVjdGVkXT1cImlzQ3VzdG9tQ29sb3JTZWxlY3RlZCgpXCJcclxuICAgICAgICAgIFtkZWZhdWx0Q29sb3JdPVwicGVyc29uYWxpemF0aW9uLmRldmVsb3BlckRlZmF1bHRzKCkucHJpbWFyeUNvbG9yIHx8ICdkZWZhdWx0J1wiXHJcbiAgICAgICAgICAob25UaGVtZVNlbGVjdCk9XCJzZWxlY3RUaGVtZSgkZXZlbnQpXCJcclxuICAgICAgICAgIChvbkNvbG9yU2VsZWN0KT1cInNlbGVjdENvbG9yKCRldmVudClcIlxyXG4gICAgICAgICAgKG9uQnV0dG9uU3R5bGVTZWxlY3QpPVwic2VsZWN0QnV0dG9uU3R5bGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAob25TYXZlKT1cIm9uU2F2ZSgpXCJcclxuICAgICAgICAgIChvblJlc2V0KT1cIm9uUmVzZXQoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgIDwvYXBwLXByZWZlcmVuY2VzLXNlY3Rpb24+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDwhLS0gQWNjb3VudCAvIFByb2ZpbGUgU2VjdGlvbiAtLT5cclxuICAgICAgQGlmIChhY3RpdmVTZWN0aW9uID09PSAnYWNjb3VudF9zZXR0aW5ncycpIHtcclxuICAgICAgICA8YXBwLWFjY291bnQtc2VjdGlvblxyXG4gICAgICAgICAgKG9uRGVsZXRlQWxsSGlzdG9yeSk9XCJkZWxldGVBbGxIaXN0b3J5KClcIlxyXG4gICAgICAgICAgKG9uTG9nb3V0QWxsKT1cImxvZ291dEFsbERldmljZXMoKVwiXHJcbiAgICAgICAgICAob25EZWxldGVBY2NvdW50KT1cImRlbGV0ZUFjY291bnQoKVwiXHJcbiAgICAgICAgPjwvYXBwLWFjY291bnQtc2VjdGlvbj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmIChhY3RpdmVTZWN0aW9uID09PSAncHJvZmlsZScpIHtcclxuICAgICAgICA8YXBwLXByb2ZpbGUtc2VjdGlvblxyXG4gICAgICAgICAgW3VzZXJuYW1lXT1cInVzZXJuYW1lXCJcclxuICAgICAgICAgIFt1c2VySW1hZ2VVcmxdPVwidXNlckltYWdlVXJsXCJcclxuICAgICAgICAgIFt1c2VyUm9sZV09XCJ1c2VyUm9sZVwiXHJcbiAgICAgICAgPjwvYXBwLXByb2ZpbGUtc2VjdGlvbj5cclxuICAgICAgfVxyXG5cclxuICAgICAgPCEtLSBHZW5lcmFsIFNlY3Rpb24gLS0+XHJcbiAgICAgIEBpZiAoYWN0aXZlU2VjdGlvbiA9PT0gJ2dlbmVyYWwnKSB7XHJcbiAgICAgICAgPGFwcC1zZXR0aW5nLXNlY3Rpb25cclxuICAgICAgICAgIFtzZXR0aW5nc109XCJzZXR0aW5nc1wiXHJcbiAgICAgICAgICBbaGFzQ2hhbmdlc109XCJoYXNDaGFuZ2VzXCJcclxuICAgICAgICAgIChvblNhdmUpPVwib25TYXZlKClcIlxyXG4gICAgICAgID48L2FwcC1zZXR0aW5nLXNlY3Rpb24+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDwhLS0gVGVybXMgYW5kIENvbmRpdGlvbnMgU2VjdGlvbiAtLT5cclxuICAgICAgQGlmIChhY3RpdmVTZWN0aW9uID09PSAndGVybXMnKSB7XHJcbiAgICAgICAgPGFwcC10ZXJtcy1zZWN0aW9uPjwvYXBwLXRlcm1zLXNlY3Rpb24+XHJcbiAgICAgIH1cclxuICAgIDwvbWFpbj5cclxuICA8L21hdC1kaWFsb2ctY29udGVudD5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -1,149 +0,0 @@
1
- import { Injectable, signal, inject, effect } from '@angular/core';
2
- import { StorageService } from '../../core/auth/storage.service';
3
- import { AuthService } from '../../core/auth/auth.service';
4
- import { toSignal } from '@angular/core/rxjs-interop';
5
- import * as i0 from "@angular/core";
6
- const BASE_STORAGE_KEY = 'app.personalization.v1';
7
- const DEFAULT_SETTINGS = {
8
- customInstructions: {
9
- enabled: false,
10
- aboutUser: '',
11
- responseStyle: '',
12
- characteristics: {
13
- warm: 'Default',
14
- enthusiastic: 'Default',
15
- headersAndLists: 'Default',
16
- emoji: 'Default',
17
- },
18
- aboutYou: {
19
- nickname: '',
20
- occupation: '',
21
- },
22
- },
23
- appearance: {
24
- theme: 'auto',
25
- primaryColor: 'default',
26
- buttonStyle: 'fab',
27
- },
28
- meta: {
29
- version: 1,
30
- lastUpdated: Date.now(),
31
- },
32
- };
33
- export class PersonalizationService {
34
- constructor() {
35
- this.storage = inject(StorageService);
36
- this.authService = inject(AuthService);
37
- // Reactive Authentication Status
38
- this.authStatus = toSignal(this.authService.authStatus$);
39
- // State Signals
40
- this._settings = signal(DEFAULT_SETTINGS);
41
- this.settings = this._settings.asReadonly();
42
- // Developer-provided defaults (from DoohbotInput)
43
- this._developerDefaults = signal({});
44
- this.developerDefaults = this._developerDefaults.asReadonly();
45
- // Reload settings when auth status changes (user logins or logouts)
46
- effect(() => {
47
- const status = this.authStatus();
48
- this._settings.set(this.loadSettings());
49
- }, { allowSignalWrites: true });
50
- // Automatically persist changes when settings signal updates
51
- effect(() => {
52
- const currentSettings = this._settings();
53
- this.saveSettings(currentSettings);
54
- });
55
- }
56
- getStorageKey() {
57
- const userId = this.authService.getUserId();
58
- return userId ? `${BASE_STORAGE_KEY}_${userId}` : BASE_STORAGE_KEY;
59
- }
60
- /**
61
- * Update custom instructions
62
- */
63
- updateInstructions(instructions) {
64
- this._settings.update((s) => ({
65
- ...s,
66
- customInstructions: { ...s.customInstructions, ...instructions },
67
- meta: { ...s.meta, lastUpdated: Date.now() },
68
- }));
69
- }
70
- /**
71
- * Update appearance settings
72
- */
73
- updateAppearance(appearance) {
74
- this._settings.update((s) => ({
75
- ...s,
76
- appearance: { ...s.appearance, ...appearance },
77
- meta: { ...s.meta, lastUpdated: Date.now() },
78
- }));
79
- }
80
- /**
81
- * Set initial developer defaults (called from DoohbotComponent)
82
- */
83
- setDeveloperDefaults(defaults) {
84
- this._developerDefaults.set(defaults);
85
- // Refresh settings to apply defaults if no user settings are saved
86
- this._settings.set(this.loadSettings());
87
- }
88
- /**
89
- * Reset all personalization to defaults
90
- */
91
- resetToDefaults() {
92
- this._settings.set({
93
- ...DEFAULT_SETTINGS,
94
- meta: { ...DEFAULT_SETTINGS.meta, lastUpdated: Date.now() },
95
- });
96
- }
97
- /**
98
- * Get the formatted instructions block for chat requests
99
- */
100
- getFormattedInstructions() {
101
- const s = this._settings().customInstructions;
102
- if (!s.enabled)
103
- return '';
104
- let block = '--- CUSTOM INSTRUCTIONS ---\n';
105
- if (s.aboutUser) {
106
- block += `USER CONTEXT: ${s.aboutUser}\n`;
107
- }
108
- if (s.responseStyle) {
109
- block += `RESPONSE STYLE: ${s.responseStyle}\n`;
110
- }
111
- block += '---------------------------';
112
- return s.aboutUser || s.responseStyle ? block : '';
113
- }
114
- loadSettings() {
115
- try {
116
- const key = this.getStorageKey();
117
- // StorageService.get handles decryption/parsing
118
- const saved = this.storage.get(key);
119
- if (saved) {
120
- return { ...DEFAULT_SETTINGS, ...saved };
121
- }
122
- }
123
- catch (e) {
124
- console.error('Failed to load personalization settings', e);
125
- }
126
- // Return defaults merged with developer overrides
127
- return {
128
- ...DEFAULT_SETTINGS,
129
- appearance: {
130
- ...DEFAULT_SETTINGS.appearance,
131
- ...this._developerDefaults(),
132
- primaryColor: 'default', //! Force 'default' for fresh loads so it resolves dynamically
133
- },
134
- };
135
- }
136
- saveSettings(settings) {
137
- const key = this.getStorageKey();
138
- this.storage.set(key, settings);
139
- }
140
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
141
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationService, providedIn: 'root' }); }
142
- }
143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PersonalizationService, decorators: [{
144
- type: Injectable,
145
- args: [{
146
- providedIn: 'root',
147
- }]
148
- }], ctorParameters: () => [] });
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc29uYWxpemF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvYXBwL3BlcnNvbmFsaXphdGlvbi9wZXJzb25hbGl6YXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQXFDdEQsTUFBTSxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQztBQUVsRCxNQUFNLGdCQUFnQixHQUE0QjtJQUNoRCxrQkFBa0IsRUFBRTtRQUNsQixPQUFPLEVBQUUsS0FBSztRQUNkLFNBQVMsRUFBRSxFQUFFO1FBQ2IsYUFBYSxFQUFFLEVBQUU7UUFDakIsZUFBZSxFQUFFO1lBQ2YsSUFBSSxFQUFFLFNBQVM7WUFDZixZQUFZLEVBQUUsU0FBUztZQUN2QixlQUFlLEVBQUUsU0FBUztZQUMxQixLQUFLLEVBQUUsU0FBUztTQUNqQjtRQUNELFFBQVEsRUFBRTtZQUNSLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLEVBQUU7U0FDZjtLQUNGO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsS0FBSyxFQUFFLE1BQU07UUFDYixZQUFZLEVBQUUsU0FBUztRQUN2QixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELElBQUksRUFBRTtRQUNKLE9BQU8sRUFBRSxDQUFDO1FBQ1YsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7S0FDeEI7Q0FDRixDQUFDO0FBS0YsTUFBTSxPQUFPLHNCQUFzQjtJQWVqQztRQWRR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QUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDNUIsWUFBWSxFQUFFLFNBQVMsRUFBRSwrREFBK0Q7YUFDekY7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLFlBQVksQ0FBQyxRQUFpQztRQUNwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7K0dBM0hVLHNCQUFzQjttSEFBdEIsc0JBQXNCLGNBRnJCLE1BQU07OzRGQUVQLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwsIGluamVjdCwgZWZmZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGguc2VydmljZSc7XHJcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaGFyYWN0ZXJpc3RpY3Mge1xyXG4gIHdhcm06IHN0cmluZztcclxuICBlbnRodXNpYXN0aWM6IHN0cmluZztcclxuICBoZWFkZXJzQW5kTGlzdHM6IHN0cmluZztcclxuICBlbW9qaTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFib3V0WW91IHtcclxuICBuaWNrbmFtZTogc3RyaW5nO1xyXG4gIG9jY3VwYXRpb246IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21JbnN0cnVjdGlvbnMge1xyXG4gIGVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgYWJvdXRVc2VyOiBzdHJpbmc7XHJcbiAgcmVzcG9uc2VTdHlsZTogc3RyaW5nO1xyXG4gIGNoYXJhY3RlcmlzdGljczogQ2hhcmFjdGVyaXN0aWNzO1xyXG4gIGFib3V0WW91OiBBYm91dFlvdTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBcHBlYXJhbmNlU2V0dGluZ3Mge1xyXG4gIHRoZW1lOiAnbGlnaHQnIHwgJ2RhcmsnIHwgJ2F1dG8nO1xyXG4gIHByaW1hcnlDb2xvcjogc3RyaW5nO1xyXG4gIGJ1dHRvblN0eWxlOiAnZmFiJyB8ICdzaWRlYmFyJyB8ICdzaWRlYmFyLXRvcCcgfCAnc2lkZWJhci1ib3R0b20nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvbmFsaXphdGlvblNldHRpbmdzIHtcclxuICBjdXN0b21JbnN0cnVjdGlvbnM6IEN1c3RvbUluc3RydWN0aW9ucztcclxuICBhcHBlYXJhbmNlOiBBcHBlYXJhbmNlU2V0dGluZ3M7XHJcbiAgbWV0YToge1xyXG4gICAgdmVyc2lvbjogbnVtYmVyO1xyXG4gICAgbGFzdFVwZGF0ZWQ6IG51bWJlcjtcclxuICB9O1xyXG59XHJcblxyXG5jb25zdCBCQVNFX1NUT1JBR0VfS0VZID0gJ2FwcC5wZXJzb25hbGl6YXRpb24udjEnO1xyXG5cclxuY29uc3QgREVGQVVMVF9TRVRUSU5HUzogUGVyc29uYWxpemF0aW9uU2V0dGluZ3MgPSB7XHJcbiAgY3VzdG9tSW5zdHJ1Y3Rpb25zOiB7XHJcbiAgICBlbmFibGVkOiBmYWxzZSxcclxuICAgIGFib3V0VXNlcjogJycsXHJcbiAgICByZXNwb25zZVN0eWxlOiAnJyxcclxuICAgIGNoYXJhY3RlcmlzdGljczoge1xyXG4gICAgICB3YXJtOiAnRGVmYXVsdCcsXHJcbiAgICAgIGVudGh1c2lhc3RpYzogJ0RlZmF1bHQnLFxyXG4gICAgICBoZWFkZXJzQW5kTGlzdHM6ICdEZWZhdWx0JyxcclxuICAgICAgZW1vamk6ICdEZWZhdWx0JyxcclxuICAgIH0sXHJcbiAgICBhYm91dFlvdToge1xyXG4gICAgICBuaWNrbmFtZTogJycsXHJcbiAgICAgIG9jY3VwYXRpb246ICcnLFxyXG4gICAgfSxcclxuICB9LFxyXG4gIGFwcGVhcmFuY2U6IHtcclxuICAgIHRoZW1lOiAnYXV0bycsXHJcbiAgICBwcmltYXJ5Q29sb3I6ICdkZWZhdWx0JywgLy8gU3RhbmRhcmQgcHJpbWFyeSBjb2xvciAocmVzb2x2ZXMgdG8gZGV2ZWxvcGVyIGRlZmF1bHQpXHJcbiAgICBidXR0b25TdHlsZTogJ2ZhYicsXHJcbiAgfSxcclxuICBtZXRhOiB7XHJcbiAgICB2ZXJzaW9uOiAxLFxyXG4gICAgbGFzdFVwZGF0ZWQ6IERhdGUubm93KCksXHJcbiAgfSxcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQZXJzb25hbGl6YXRpb25TZXJ2aWNlIHtcclxuICBwcml2YXRlIHN0b3JhZ2UgPSBpbmplY3QoU3RvcmFnZVNlcnZpY2UpO1xyXG4gIHByaXZhdGUgYXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xyXG5cclxuICAvLyBSZWFjdGl2ZSBBdXRoZW50aWNhdGlvbiBTdGF0dXNcclxuICBwcml2YXRlIGF1dGhTdGF0dXMgPSB0b1NpZ25hbCh0aGlzLmF1dGhTZXJ2aWNlLmF1dGhTdGF0dXMkKTtcclxuXHJcbiAgLy8gU3RhdGUgU2lnbmFsc1xyXG4gIHByaXZhdGUgX3NldHRpbmdzID0gc2lnbmFsPFBlcnNvbmFsaXphdGlvblNldHRpbmdzPihERUZBVUxUX1NFVFRJTkdTKTtcclxuICBwdWJsaWMgc2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncy5hc1JlYWRvbmx5KCk7XHJcblxyXG4gIC8vIERldmVsb3Blci1wcm92aWRlZCBkZWZhdWx0cyAoZnJvbSBEb29oYm90SW5wdXQpXHJcbiAgcHJpdmF0ZSBfZGV2ZWxvcGVyRGVmYXVsdHMgPSBzaWduYWw8UGFydGlhbDxBcHBlYXJhbmNlU2V0dGluZ3M+Pih7fSk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGRldmVsb3BlckRlZmF1bHRzID0gdGhpcy5fZGV2ZWxvcGVyRGVmYXVsdHMuYXNSZWFkb25seSgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIFJlbG9hZCBzZXR0aW5ncyB3aGVuIGF1dGggc3RhdHVzIGNoYW5nZXMgKHVzZXIgbG9naW5zIG9yIGxvZ291dHMpXHJcbiAgICBlZmZlY3QoXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmF1dGhTdGF0dXMoKTtcclxuICAgICAgICB0aGlzLl9zZXR0aW5ncy5zZXQodGhpcy5sb2FkU2V0dGluZ3MoKSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSwgLy8gVE9ET1xyXG4gICAgKTtcclxuXHJcbiAgICAvLyBBdXRvbWF0aWNhbGx5IHBlcnNpc3QgY2hhbmdlcyB3aGVuIHNldHRpbmdzIHNpZ25hbCB1cGRhdGVzXHJcbiAgICBlZmZlY3QoKCkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJyZW50U2V0dGluZ3MgPSB0aGlzLl9zZXR0aW5ncygpO1xyXG4gICAgICB0aGlzLnNhdmVTZXR0aW5ncyhjdXJyZW50U2V0dGluZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFN0b3JhZ2VLZXkoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHVzZXJJZCA9IHRoaXMuYXV0aFNlcnZpY2UuZ2V0VXNlcklkKCk7XHJcbiAgICByZXR1cm4gdXNlcklkID8gYCR7QkFTRV9TVE9SQUdFX0tFWX1fJHt1c2VySWR9YCA6IEJBU0VfU1RPUkFHRV9LRVk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgY3VzdG9tIGluc3RydWN0aW9uc1xyXG4gICAqL1xyXG4gIHVwZGF0ZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFBhcnRpYWw8Q3VzdG9tSW5zdHJ1Y3Rpb25zPikge1xyXG4gICAgdGhpcy5fc2V0dGluZ3MudXBkYXRlKChzKSA9PiAoe1xyXG4gICAgICAuLi5zLFxyXG4gICAgICBjdXN0b21JbnN0cnVjdGlvbnM6IHsgLi4ucy5jdXN0b21JbnN0cnVjdGlvbnMsIC4uLmluc3RydWN0aW9ucyB9LFxyXG4gICAgICBtZXRhOiB7IC4uLnMubWV0YSwgbGFzdFVwZGF0ZWQ6IERhdGUubm93KCkgfSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBhcHBlYXJhbmNlIHNldHRpbmdzXHJcbiAgICovXHJcbiAgdXBkYXRlQXBwZWFyYW5jZShhcHBlYXJhbmNlOiBQYXJ0aWFsPEFwcGVhcmFuY2VTZXR0aW5ncz4pIHtcclxuICAgIHRoaXMuX3NldHRpbmdzLnVwZGF0ZSgocykgPT4gKHtcclxuICAgICAgLi4ucyxcclxuICAgICAgYXBwZWFyYW5jZTogeyAuLi5zLmFwcGVhcmFuY2UsIC4uLmFwcGVhcmFuY2UgfSxcclxuICAgICAgbWV0YTogeyAuLi5zLm1ldGEsIGxhc3RVcGRhdGVkOiBEYXRlLm5vdygpIH0sXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgaW5pdGlhbCBkZXZlbG9wZXIgZGVmYXVsdHMgKGNhbGxlZCBmcm9tIERvb2hib3RDb21wb25lbnQpXHJcbiAgICovXHJcbiAgc2V0RGV2ZWxvcGVyRGVmYXVsdHMoZGVmYXVsdHM6IFBhcnRpYWw8QXBwZWFyYW5jZVNldHRpbmdzPikge1xyXG4gICAgdGhpcy5fZGV2ZWxvcGVyRGVmYXVsdHMuc2V0KGRlZmF1bHRzKTtcclxuICAgIC8vIFJlZnJlc2ggc2V0dGluZ3MgdG8gYXBwbHkgZGVmYXVsdHMgaWYgbm8gdXNlciBzZXR0aW5ncyBhcmUgc2F2ZWRcclxuICAgIHRoaXMuX3NldHRpbmdzLnNldCh0aGlzLmxvYWRTZXR0aW5ncygpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IGFsbCBwZXJzb25hbGl6YXRpb24gdG8gZGVmYXVsdHNcclxuICAgKi9cclxuICByZXNldFRvRGVmYXVsdHMoKSB7XHJcbiAgICB0aGlzLl9zZXR0aW5ncy5zZXQoe1xyXG4gICAgICAuLi5ERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgICBtZXRhOiB7IC4uLkRFRkFVTFRfU0VUVElOR1MubWV0YSwgbGFzdFVwZGF0ZWQ6IERhdGUubm93KCkgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBmb3JtYXR0ZWQgaW5zdHJ1Y3Rpb25zIGJsb2NrIGZvciBjaGF0IHJlcXVlc3RzXHJcbiAgICovXHJcbiAgZ2V0Rm9ybWF0dGVkSW5zdHJ1Y3Rpb25zKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzID0gdGhpcy5fc2V0dGluZ3MoKS5jdXN0b21JbnN0cnVjdGlvbnM7XHJcbiAgICBpZiAoIXMuZW5hYmxlZCkgcmV0dXJuICcnO1xyXG5cclxuICAgIGxldCBibG9jayA9ICctLS0gQ1VTVE9NIElOU1RSVUNUSU9OUyAtLS1cXG4nO1xyXG4gICAgaWYgKHMuYWJvdXRVc2VyKSB7XHJcbiAgICAgIGJsb2NrICs9IGBVU0VSIENPTlRFWFQ6ICR7cy5hYm91dFVzZXJ9XFxuYDtcclxuICAgIH1cclxuICAgIGlmIChzLnJlc3BvbnNlU3R5bGUpIHtcclxuICAgICAgYmxvY2sgKz0gYFJFU1BPTlNFIFNUWUxFOiAke3MucmVzcG9uc2VTdHlsZX1cXG5gO1xyXG4gICAgfVxyXG4gICAgYmxvY2sgKz0gJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSc7XHJcblxyXG4gICAgcmV0dXJuIHMuYWJvdXRVc2VyIHx8IHMucmVzcG9uc2VTdHlsZSA/IGJsb2NrIDogJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRTZXR0aW5ncygpOiBQZXJzb25hbGl6YXRpb25TZXR0aW5ncyB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmdldFN0b3JhZ2VLZXkoKTtcclxuICAgICAgLy8gU3RvcmFnZVNlcnZpY2UuZ2V0IGhhbmRsZXMgZGVjcnlwdGlvbi9wYXJzaW5nXHJcbiAgICAgIGNvbnN0IHNhdmVkID0gdGhpcy5zdG9yYWdlLmdldChrZXkpO1xyXG4gICAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICByZXR1cm4geyAuLi5ERUZBVUxUX1NFVFRJTkdTLCAuLi5zYXZlZCB9O1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHBlcnNvbmFsaXphdGlvbiBzZXR0aW5ncycsIGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybiBkZWZhdWx0cyBtZXJnZWQgd2l0aCBkZXZlbG9wZXIgb3ZlcnJpZGVzXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5ERUZBVUxUX1NFVFRJTkdTLFxyXG4gICAgICBhcHBlYXJhbmNlOiB7XHJcbiAgICAgICAgLi4uREVGQVVMVF9TRVRUSU5HUy5hcHBlYXJhbmNlLFxyXG4gICAgICAgIC4uLnRoaXMuX2RldmVsb3BlckRlZmF1bHRzKCksXHJcbiAgICAgICAgcHJpbWFyeUNvbG9yOiAnZGVmYXVsdCcsIC8vISBGb3JjZSAnZGVmYXVsdCcgIGZvciBmcmVzaCBsb2FkcyBzbyBpdCByZXNvbHZlcyBkeW5hbWljYWxseVxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZVNldHRpbmdzKHNldHRpbmdzOiBQZXJzb25hbGl6YXRpb25TZXR0aW5ncykge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRTdG9yYWdlS2V5KCk7XHJcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0KGtleSwgc2V0dGluZ3MpO1xyXG4gIH1cclxufVxyXG4iXX0=