@aakash58/chatbot 1.0.96 → 1.0.98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/aakash58-chatbot.mjs +2322 -1858
- package/fesm2022/aakash58-chatbot.mjs.map +1 -1
- package/index.d.ts +45 -663
- package/package.json +2 -2
- package/src/assets/bot.png +0 -0
- package/src/assets/bot.svg +0 -8
- package/src/assets/header_logo.svg +0 -24
- package/src/assets/logo.png +0 -0
- package/src/assets/logo.svg +0 -9
- package/src/assets/profile.png +0 -0
- package/src/assets/title.svg +0 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aakash58-chatbot.mjs","sources":["../../../projects/doohbot/src/lib/constant/constant.ts","../../../projects/doohbot/src/lib/inputs/doohbot-input.ts","../../../projects/doohbot/src/lib/helpers/predefined_messages.ts","../../../projects/doohbot/src/lib/components/chat-button/chat-button.component.ts","../../../projects/doohbot/src/lib/components/chat-button/chat-button.component.html","../../../projects/doohbot/src/lib/shared/chips/chips.component.ts","../../../projects/doohbot/src/lib/shared/chips/chips.component.html","../../../projects/doohbot/src/lib/components/message-list/message-list.component.ts","../../../projects/doohbot/src/lib/components/message-list/message-list.component.html","../../../projects/doohbot/src/lib/components/message-input/message-input.component.ts","../../../projects/doohbot/src/lib/components/message-input/message-input.component.html","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.component.html","../../../projects/doohbot/src/lib/directives/draggable/draggable-dialog.directive.ts","../../../projects/doohbot/src/lib/directives/resizable/resizable-dialog.directive.ts","../../../projects/doohbot/src/lib/core/services/theme.service.ts","../../../projects/doohbot/src/lib/shared/dialog/dialog.component.ts","../../../projects/doohbot/src/lib/shared/dialog/dialog.component.html","../../../projects/doohbot/src/lib/shared/dialog/dialog.service.ts","../../../projects/doohbot/src/lib/components/chat-history-sidebar/chat-history-sidebar.component.ts","../../../projects/doohbot/src/lib/components/chat-history-sidebar/chat-history-sidebar.component.html","../../../projects/doohbot/src/lib/components/chat-window/chat-window.component.ts","../../../projects/doohbot/src/lib/components/chat-window/chat-window.component.html","../../../projects/doohbot/src/lib/directives/fullscreen/fullscreen.directive.ts","../../../projects/doohbot/src/lib/core/environments/environment.ts","../../../projects/doohbot/src/lib/core/app-const.ts","../../../projects/doohbot/src/lib/model/doohbot.intents.ts","../../../projects/doohbot/src/lib/model/api-config.model.ts","../../../projects/doohbot/src/lib/core/services/tenant-context.service.ts","../../../projects/doohbot/src/lib/core/services/doohbot-api.service.ts","../../../projects/doohbot/src/lib/core/services/chat-history.service.ts","../../../projects/doohbot/src/lib/core/services/http.service.ts","../../../projects/doohbot/src/lib/core/services/account.service.ts","../../../projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts","../../../projects/doohbot/src/lib/core/services/auth.service.ts","../../../projects/doohbot/src/lib/components/message-input/messaging.service.ts","../../../projects/doohbot/src/lib/core/services/chat-facade.service.ts","../../../projects/doohbot/src/lib/core/services/chat-ui-state.service.ts","../../../projects/doohbot/src/lib/core/services/doohbot-config.service.ts","../../../projects/doohbot/src/lib/constant/utf8.ts","../../../projects/doohbot/src/lib/doohbot.component.ts","../../../projects/doohbot/src/lib/doohbot.component.html","../../../projects/doohbot/src/lib/model/token.ts","../../../projects/doohbot/src/lib/shared/menu-item/menu-item.component.ts","../../../projects/doohbot/src/lib/shared/menu-item/menu-item.component.html","../../../projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.ts","../../../projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.html","../../../projects/doohbot/src/lib/core/interceptors/auth.interceptor.ts","../../../projects/doohbot/src/lib/doohbot-initializer.ts","../../../projects/doohbot/src/lib/core/services/storage.service.ts","../../../projects/doohbot/src/lib/directives/popout/popout.directive.ts","../../../projects/doohbot/src/public-api.ts","../../../projects/doohbot/src/aakash58-chatbot.ts"],"sourcesContent":["export const appConst = {\r\n //LIVE ASSETS\r\n // APP_LOGO: 'https://iili.io/f3qSQJn.md.png',\r\n // USER_AVATAR: 'https://iili.io/KpEYoCP.png',\r\n // BOT_AVATAR: 'https://iili.io/KpER0Ge.png',\r\n\r\n // ==================\r\n\r\n //png ASSETS\r\n // APP_LOGO: 'assets/logo.svg',\r\n // APP_TEXT_LOGO: 'assets/title.svg',\r\n // APP_HEADER_LOGO: 'assets/header_logo.svg',\r\n // USER_AVATAR: 'assets/profile.png',\r\n // BOT_AVATAR: 'assets/bot.png',\r\n\r\n // ==================\r\n\r\n // base64_ASSETS\r\n APP_LOGO:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDE1MCAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc2XzE0MzgpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc2XzE0MzgpIi8+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSI2LjAwMzA2IiB5MT0iNiIgeDI9IjE0Mi45NzIiIHkyPSIxNDMuMjI2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSIxNDMuMjI3IiB5MT0iNzYuODA0NiIgeDI9IjI2LjAwMSIgeTI9IjEyMi45NjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzIzNzZfMTQzOCIgeDE9IjU4LjI1NDEiIHkxPSI1OC4xNjciIHgyPSI1My45MTE3IiB5Mj0iMTMyLjk1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzIzNzZfMTQzOCI+CjxwYXRoIGQ9Ik02IDZIMTEzLjIyN0MxMjkuNzk1IDYgMTQzLjIyNyAxOS40MzE1IDE0My4yMjcgMzZWMTEyLjk3NUMxNDMuMjI3IDEyOS41NDQgMTI5Ljc5NSAxNDIuOTc1IDExMy4yMjcgMTQyLjk3NUg2VjZaIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=',\r\n APP_TEXT_LOGO:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDc3IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgNDc3IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNDUzLjkzMiA4Ny4wMjZDNDUyLjI0OSA4Ny4wMjYgNDUxLjI4NyA4Ni40MjUgNDUwLjA4NSA4NS4yMjI5TDQ0My43MTQgNzkuODEzNkM0NDIuNTEyIDc4LjYxMTUgNDQxLjkxMSA3Ny4yODkyIDQ0MS45MTEgNzUuNDg2MVY0MC44NjYySDQzMy42MTdWMzIuNDUxNkw0NDkuMTI0IDE1LjAyMTVINDUzLjIxMVYzMS4yNDk2SDQ3MC42NDFWNDAuODY2Mkg0NTMuMjExVjc2LjY4ODJINDcxLjAwMlY4Ny4wMjZINDUzLjkzMloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTM3NS44MTkgODcuMDE4N0MzNzQuNjE3IDg3LjAxODcgMzczLjA1NCA4Ni42NTggMzcxLjQ5MiA4NS4wOTUzTDM2Ni4yMDIgNzkuODA2MkMzNjUuMTIgNzguNjA0MSAzNjQuNjQgNzcuMDQxNCAzNjQuNjQgNzUuNTk4OVY0Mi42NjE5QzM2NC42NCA0MC45NzkgMzY1LjI0MSAzOS41MzY1IDM2Ni4yMDIgMzguNDU0N0wzNzEuNDkyIDMzLjE2NTVDMzcyLjkzNCAzMS43MjMgMzc0LjQ5NyAzMS4yNDIyIDM3NS44MTkgMzEuMjQyMkg0MTAuNjhDNDEyLjM2MyAzMS4yNDIyIDQxMy42ODUgMzEuODQzMiA0MTQuODg3IDMzLjA0NTNMNDIwLjI5NiAzOC4zMzQ0QzQyMS42MTkgMzkuNjU2NyA0MjIuMSA0MC45NzkgNDIyLjEgNDIuNjYxOVY3NS41OTg5QzQyMi4xIDc3LjI4MTggNDIxLjYxOSA3OC42MDQxIDQyMC4yOTYgNzkuOTI2NEw0MTQuODg3IDg1LjIxNTVDNDEzLjY4NSA4Ni40MTc2IDQxMi4zNjMgODcuMDE4NyA0MTAuNjggODcuMDE4N0gzNzUuODE5Wk0zNzUuOTM5IDc2LjgwMUg0MTAuOFY0MS40NTk5SDM3NS45MzlWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzQ5LjY0NCAzOC40NTYxQzM1MC44NDYgMzkuNzc4NCAzNTEuNDQ3IDQxLjEwMDcgMzUxLjQ0NyA0Mi43ODM2Vjc1LjYwMDRDMzUxLjQ0NyA3Ny4yODMzIDM1MC44NDYgNzguNjA1NiAzNDkuNjQ0IDc5LjkyNzlMMzQ0LjIzNCA4NS4yMTdDMzQzLjAzMiA4Ni41MzkzIDM0MS40NyA4Ny4wMjAxIDMzOS45MDcgODcuMDIwMUgzMTQuOTAzQzMxMi42MTkgODcuMDIwMSAzMTEuMjk3IDg2LjQxOTEgMzA5LjQ5NCA4NC40OTU4TDMwNi4xMjggODAuODg5NVY4Ny4wMjAxSDI5NC45NDlWNkgzMDYuMTI4VjM3LjM3NDNMMzA5LjQ5NCAzMy44ODgyQzMxMS40MTcgMzEuODQ0NyAzMTIuNjE5IDMxLjM2MzkgMzE0LjkwMyAzMS4zNjM5SDMzOS45MDdDMzQxLjU5IDMxLjM2MzkgMzQzLjAzMiAzMS44NDQ3IDM0NC4yMzQgMzMuMDQ2OEwzNDkuNjQ0IDM4LjQ1NjFaTTM0MC4xNDcgNzYuODAyNVY0MS40NjEzSDMwNi4xMjhWNzYuODAyNUgzNDAuMTQ3WiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMjc2LjUxMiAzOC40NTYxQzI3Ny43MTQgMzkuNzc4NCAyNzguMzE1IDQxLjEwMDcgMjc4LjMxNSA0Mi43ODM2Vjg3LjAyMDFIMjY3LjAxNlY0MS40NjEzSDIzMi44NzZWODcuMDIwMUgyMjEuNjk3VjZIMjMyLjg3NlYzNy40OTQ1TDIzNi4zNjIgMzMuODg4MkMyMzguNDA2IDMxLjg0NDcgMjM5LjQ4OCAzMS4zNjM5IDI0MS43NzIgMzEuMzYzOUgyNjYuNzc1QzI2OC40NTggMzEuMzYzOSAyNjkuOTAxIDMxLjg0NDcgMjcxLjEwMyAzMy4wNDY4TDI3Ni41MTIgMzguNDU2MVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTE2MC4wNTUgODcuMDE4N0MxNTguODUzIDg3LjAxODcgMTU3LjI5IDg2LjY1OCAxNTUuNzI3IDg1LjA5NTNMMTUwLjQzOCA3OS44MDYyQzE0OS4zNTYgNzguNjA0MSAxNDguODc1IDc3LjA0MTQgMTQ4Ljg3NSA3NS41OTg5VjQyLjY2MTlDMTQ4Ljg3NSA0MC45NzkgMTQ5LjQ3NyAzOS41MzY1IDE1MC40MzggMzguNDU0N0wxNTUuNzI3IDMzLjE2NTVDMTU3LjE3IDMxLjcyMyAxNTguNzMzIDMxLjI0MjIgMTYwLjA1NSAzMS4yNDIySDE5NC45MTZDMTk2LjU5OCAzMS4yNDIyIDE5Ny45MjEgMzEuODQzMiAxOTkuMTIzIDMzLjA0NTNMMjA0LjUzMiAzOC4zMzQ0QzIwNS44NTUgMzkuNjU2NyAyMDYuMzM1IDQwLjk3OSAyMDYuMzM1IDQyLjY2MTlWNzUuNTk4OUMyMDYuMzM1IDc3LjI4MTggMjA1Ljg1NSA3OC42MDQxIDIwNC41MzIgNzkuOTI2NEwxOTkuMTIzIDg1LjIxNTVDMTk3LjkyMSA4Ni40MTc2IDE5Ni41OTggODcuMDE4NyAxOTQuOTE2IDg3LjAxODdIMTYwLjA1NVpNMTYwLjE3NSA3Ni44MDFIMTk1LjAzNlY0MS40NTk5SDE2MC4xNzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNODguOTE0OCA4Ny4wMTg3Qzg3LjcxMjcgODcuMDE4NyA4Ni4xNSA4Ni42NTggODQuNTg3MyA4NS4wOTUzTDc5LjI5ODEgNzkuODA2MkM3OC4yMTYyIDc4LjYwNDEgNzcuNzM1NCA3Ny4wNDE0IDc3LjczNTQgNzUuNTk4OVY0Mi42NjE5Qzc3LjczNTQgNDAuOTc5IDc4LjMzNjQgMzkuNTM2NSA3OS4yOTgxIDM4LjQ1NDdMODQuNTg3MyAzMy4xNjU1Qzg2LjAyOTggMzEuNzIzIDg3LjU5MjUgMzEuMjQyMiA4OC45MTQ4IDMxLjI0MjJIMTIzLjc3NUMxMjUuNDU4IDMxLjI0MjIgMTI2Ljc4MSAzMS44NDMyIDEyNy45ODMgMzMuMDQ1M0wxMzMuMzkyIDM4LjMzNDRDMTM0LjcxNCAzOS42NTY3IDEzNS4xOTUgNDAuOTc5IDEzNS4xOTUgNDIuNjYxOVY3NS41OTg5QzEzNS4xOTUgNzcuMjgxOCAxMzQuNzE0IDc4LjYwNDEgMTMzLjM5MiA3OS45MjY0TDEyNy45ODMgODUuMjE1NUMxMjYuNzgxIDg2LjQxNzYgMTI1LjQ1OCA4Ny4wMTg3IDEyMy43NzUgODcuMDE4N0g4OC45MTQ4Wk04OS4wMzUgNzYuODAxSDEyMy44OTZWNDEuNDU5OUg4OS4wMzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNNTEuMTk4NiA2SDYyLjM3OFY4Ny4wMjAxSDUxLjE5ODZWODAuODg5NUw0Ny44MzI3IDg0LjQ5NThDNDYuMDI5NiA4Ni40MTkxIDQ0LjcwNzMgODcuMDIwMSA0Mi40MjMzIDg3LjAyMDFIMTcuNDE5OUMxNS44NTcxIDg3LjAyMDEgMTQuMjk0NCA4Ni41MzkzIDEzLjA5MjMgODUuMjE3TDcuODAzMTQgNzkuOTI3OUM2LjQ4MDg0IDc4LjYwNTYgNiA3Ny4yODMzIDYgNzUuNjAwNFY0Mi43ODM2QzYgNDEuMTAwNyA2LjQ4MDg0IDM5Ljc3ODQgNy44MDMxNCAzOC40NTYxTDEzLjA5MjMgMzMuMDQ2OEMxNC4yOTQ0IDMxLjg0NDcgMTUuNzM2OSAzMS4zNjM5IDE3LjQxOTkgMzEuMzYzOUg0Mi40MjMzQzQ0LjcwNzMgMzEuMzYzOSA0NS45MDk0IDMxLjg0NDcgNDcuODMyNyAzMy44ODgyTDUxLjE5ODYgMzcuMzc0M1Y2Wk0xNy4xNzk0IDc2LjgwMjVINTEuMTk4NlY0MS40NjEzSDE3LjE3OTRWNzYuODAyNVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTIxLjgzMyA1OC4xNTYySDI3LjQyMTNWNjMuNzQ0NUgyMS44MzNWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTMxLjE0NiA1OC4xNTYySDM2LjczNDNWNjMuNzQ0NUgzMS4xNDZWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTQwLjQ1ODUgNTguMTU2Mkg0Ni4wNDY4VjYzLjc0NDVINDAuNDU4NVY1OC4xNTYyWiIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzg3LjA4MiIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iNDAwLjcxMyIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzkzLjE5MiIgY3k9IjkuOTE4MjgiIHJ4PSIzLjcwNTQxIiByeT0iMy43MDUzOSIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzgwLjIyNCAyOS4zNjkxQzM4MC4yMjQgMjguMTAyNCAzODEuNTUxIDI3LjAzMjQgMzgzLjkxMyAyNi4xMzY2QzM4Ni4yNzUgMjUuMjQwOSAzODkuNDc5IDI0LjczNzcgMzkyLjgxOSAyNC43Mzc3QzM5Ni4xNiAyNC43Mzc3IDM5OS4zNjMgMjUuMjQwOSA0MDEuNzI1IDI2LjEzNjZDNDA0LjA4OCAyNy4wMzI0IDQwNS4yMzQgMjguMTAyNCA0MDUuMjM0IDI5LjM2OTFIMzkyLjcyOUgzODAuMjI0WiIgZmlsbD0iIzI4MDBGRiIvPgo8cmVjdCB4PSIzOTEuMzQiIHk9IjEwLjg0MzgiIHdpZHRoPSIzLjcwNTQxIiBoZWlnaHQ9IjE1Ljc0NzkiIGZpbGw9IiMyODAwRkYiLz4KPC9zdmc+Cg==',\r\n APP_HEADER_LOGO:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjYzIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDY2MyAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc0XzE1NDYpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYpIi8+CjwvZz4KPHBhdGggZD0iTTYzMi40MzggNTguMDA3OEg2NDkuODY3VjY3LjYyNEg2MzIuNDM4VjEwMy40NDZINjUwLjIyOVYxMTMuNzg0SDYzMy4xNThDNjMxLjQ3NiAxMTMuNzg0IDYzMC41MTQgMTEzLjE4MiA2MjkuMzEyIDExMS45OEw2MjIuOTQgMTA2LjU3MUM2MjEuNzM5IDEwNS4zNjkgNjIxLjEzOCAxMDQuMDQ3IDYyMS4xMzggMTAyLjI0NFY2Ny42MjRINjEyLjg0NFY1OS4yMDlMNjI4LjM1MSA0MS43NzkzSDYzMi40MzhWNTguMDA3OFpNMjQxLjYwNCAxMTMuNzc4SDIzMC40MjVWMTA3LjY0N0wyMjcuMDYgMTExLjI1NEMyMjUuMjU2IDExMy4xNzcgMjIzLjkzMyAxMTMuNzc4IDIyMS42NDkgMTEzLjc3OEgxOTYuNjQ2QzE5NS4wODQgMTEzLjc3OCAxOTMuNTIxIDExMy4yOTcgMTkyLjMxOSAxMTEuOTc1TDE4Ny4wMjkgMTA2LjY4NkMxODUuNzA3IDEwNS4zNjMgMTg1LjIyNyAxMDQuMDQxIDE4NS4yMjcgMTAyLjM1OFY2OS41NDFDMTg1LjIyNyA2Ny44NTg0IDE4NS43MDcgNjYuNTM2IDE4Ny4wMjkgNjUuMjEzOUwxOTIuMzE5IDU5LjgwNDdDMTkzLjUyMSA1OC42MDI3IDE5NC45NjQgNTguMTIyMSAxOTYuNjQ2IDU4LjEyMjFIMjIxLjY0OUMyMjMuOTMzIDU4LjEyMjEgMjI1LjEzNiA1OC42MDMgMjI3LjA2IDYwLjY0NjVMMjMwLjQyNSA2NC4xMzE4VjMyLjc1NzhIMjQxLjYwNFYxMTMuNzc4Wk00MTIuMTAzIDY0LjI1Mkw0MTUuNTg5IDYwLjY0NjVDNDE3LjYzMiA1OC42MDMgNDE4LjcxNCA1OC4xMjIxIDQyMC45OTggNTguMTIyMUg0NDYuMDAyQzQ0Ny42ODUgNTguMTIyMSA0NDkuMTI3IDU4LjYwMjcgNDUwLjMyOSA1OS44MDQ3TDQ1NS43MzggNjUuMjEzOUM0NTYuOTQgNjYuNTM2IDQ1Ny41NDIgNjcuODU4MyA0NTcuNTQyIDY5LjU0MVYxMTMuNzc4SDQ0Ni4yNDJWNjguMjE4OEg0MTIuMTAzVjExMy43NzhINDAwLjkyNFYzMi43NTc4SDQxMi4xMDNWNjQuMjUyWk00ODUuMzU0IDY0LjEzMThMNDg4LjcyMSA2MC42NDY1QzQ5MC42NDQgNTguNjAzIDQ5MS44NDYgNTguMTIyMSA0OTQuMTMgNTguMTIyMUg1MTkuMTM0QzUyMC44MTcgNTguMTIyMSA1MjIuMjU5IDU4LjYwMjcgNTIzLjQ2MSA1OS44MDQ3TDUyOC44NyA2NS4yMTM5QzUzMC4wNzIgNjYuNTM2IDUzMC42NzQgNjcuODU4MyA1MzAuNjc0IDY5LjU0MVYxMDIuMzU4QzUzMC42NzQgMTA0LjA0MSA1MzAuMDcyIDEwNS4zNjMgNTI4Ljg3IDEwNi42ODZMNTIzLjQ2MSAxMTEuOTc1QzUyMi4yNTkgMTEzLjI5NyA1MjAuNjk2IDExMy43NzggNTE5LjEzNCAxMTMuNzc4SDQ5NC4xM0M0OTEuODQ2IDExMy43NzggNDkwLjUyNCAxMTMuMTc3IDQ4OC43MjEgMTExLjI1NEw0ODUuMzU0IDEwNy42NDdWMTEzLjc3OEg0NzQuMTc2VjMyLjc1NzhINDg1LjM1NFY2NC4xMzE4Wk0zMDMuMDAyIDU4QzMwNC42ODUgNTggMzA2LjAwNyA1OC42MDA5IDMwNy4yMDkgNTkuODAyN0wzMTIuNjE5IDY1LjA5MThDMzEzLjk0MSA2Ni40MTQxIDMxNC40MjIgNjcuNzM3IDMxNC40MjIgNjkuNDE5OVYxMDIuMzU2QzMxNC40MjIgMTA0LjAzOSAzMTMuOTQxIDEwNS4zNjIgMzEyLjYxOSAxMDYuNjg1TDMwNy4yMDkgMTExLjk3NEMzMDYuMDA3IDExMy4xNzYgMzA0LjY4NSAxMTMuNzc2IDMwMy4wMDIgMTEzLjc3NkgyNjguMTQyQzI2Ni45NCAxMTMuNzc2IDI2NS4zNzYgMTEzLjQxNiAyNjMuODEzIDExMS44NTRMMjU4LjUyNCAxMDYuNTY0QzI1Ny40NDMgMTA1LjM2MiAyNTYuOTYyIDEwMy43OTkgMjU2Ljk2MiAxMDIuMzU2VjY5LjQxOTlDMjU2Ljk2MiA2Ny43MzcyIDI1Ny41NjMgNjYuMjk0NyAyNTguNTI0IDY1LjIxMjlMMjYzLjgxMyA1OS45MjI5QzI2NS4yNTYgNTguNDgwNCAyNjYuODE5IDU4IDI2OC4xNDIgNThIMzAzLjAwMlpNMzc0LjE0MyA1OEMzNzUuODI1IDU4LjAwMDEgMzc3LjE0OCA1OC42MDA4IDM3OC4zNSA1OS44MDI3TDM4My43NTkgNjUuMDkxOEMzODUuMDgxIDY2LjQxNDEgMzg1LjU2MiA2Ny43MzcgMzg1LjU2MiA2OS40MTk5VjEwMi4zNTZDMzg1LjU2MiAxMDQuMDM5IDM4NS4wODEgMTA1LjM2MiAzODMuNzU5IDEwNi42ODVMMzc4LjM1IDExMS45NzRDMzc3LjE0OCAxMTMuMTc2IDM3NS44MjUgMTEzLjc3NiAzNzQuMTQzIDExMy43NzZIMzM5LjI4MUMzMzguMDc5IDExMy43NzYgMzM2LjUxNyAxMTMuNDE2IDMzNC45NTQgMTExLjg1NEwzMjkuNjY1IDEwNi41NjRDMzI4LjU4MyAxMDUuMzYyIDMyOC4xMDMgMTAzLjc5OSAzMjguMTAzIDEwMi4zNTZWNjkuNDE5OUMzMjguMTAzIDY3LjczNzEgMzI4LjcwMyA2Ni4yOTQ4IDMyOS42NjUgNjUuMjEyOUwzMzQuOTU0IDU5LjkyMjlDMzM2LjM5NiA1OC40ODA3IDMzNy45NTkgNTguMDAwMSAzMzkuMjgxIDU4SDM3NC4xNDNaTTU4OS45MDYgNThDNTkxLjU4OSA1OCA1OTIuOTExIDU4LjYwMDkgNTk0LjExMyA1OS44MDI3TDU5OS41MjMgNjUuMDkxOEM2MDAuODQ2IDY2LjQxNDEgNjAxLjMyNiA2Ny43MzcgNjAxLjMyNiA2OS40MTk5VjEwMi4zNTZDNjAxLjMyNiAxMDQuMDM5IDYwMC44NDYgMTA1LjM2MiA1OTkuNTIzIDEwNi42ODVMNTk0LjExMyAxMTEuOTc0QzU5Mi45MTEgMTEzLjE3NiA1OTEuNTg5IDExMy43NzYgNTg5LjkwNiAxMTMuNzc2SDU1NS4wNDZDNTUzLjg0NCAxMTMuNzc2IDU1Mi4yOCAxMTMuNDE2IDU1MC43MTggMTExLjg1NEw1NDUuNDI5IDEwNi41NjRDNTQ0LjM0NyAxMDUuMzYyIDU0My44NjYgMTAzLjc5OSA1NDMuODY2IDEwMi4zNTZWNjkuNDE5OUM1NDMuODY2IDY3LjczNzIgNTQ0LjQ2NyA2Ni4yOTQ3IDU0NS40MjkgNjUuMjEyOUw1NTAuNzE4IDU5LjkyMjlDNTUyLjE2IDU4LjQ4MDQgNTUzLjcyNCA1OCA1NTUuMDQ2IDU4SDU4OS45MDZaTTE5Ni40MDYgMTAzLjU2MUgyMzAuNDI1VjY4LjIxODhIMTk2LjQwNlYxMDMuNTYxWk00ODUuMzU0IDEwMy41NjFINTE5LjM3NFY2OC4yMTg4SDQ4NS4zNTRWMTAzLjU2MVpNMjY4LjI2MiAxMDMuNTU5SDMwMy4xMjJWNjguMjE3OEgyNjguMjYyVjEwMy41NTlaTTMzOS40MDEgMTAzLjU1OUgzNzQuMjYzVjY4LjIxNzhIMzM5LjQwMVYxMDMuNTU5Wk01NTUuMTY2IDEwMy41NTlINTkwLjAyNlY2OC4yMTc4SDU1NS4xNjZWMTAzLjU1OVpNMjA2LjY0NyA5MC41MDJIMjAxLjA2Vjg0LjkxNDFIMjA2LjY0N1Y5MC41MDJaTTIxNS45NjEgOTAuNTAySDIxMC4zNzNWODQuOTE0MUgyMTUuOTYxVjkwLjUwMlpNMjI1LjI3MyA5MC41MDJIMjE5LjY4NlY4NC45MTQxSDIyNS4yNzNWOTAuNTAyWk01NjYuMzA5IDgyLjExODJDNTY4LjQ2IDgyLjExODIgNTcwLjIwNCA4My44NjI2IDU3MC4yMDQgODYuMDEzN0M1NzAuMjA0IDg4LjE2NDYgNTY4LjQ2IDg5LjkwODIgNTY2LjMwOSA4OS45MDgyQzU2NC4xNTggODkuOTA4MSA1NjIuNDE0IDg4LjE2NDUgNTYyLjQxNCA4Ni4wMTM3QzU2Mi40MTQgODMuODYyNyA1NjQuMTU4IDgyLjExODMgNTY2LjMwOSA4Mi4xMTgyWk01NzkuOTM5IDgyLjExODJDNTgyLjA5MSA4Mi4xMTgyIDU4My44MzQgODMuODYyNiA1ODMuODM0IDg2LjAxMzdDNTgzLjgzNCA4OC4xNjQ2IDU4Mi4wOSA4OS45MDgyIDU3OS45MzkgODkuOTA4MkM1NzcuNzg4IDg5LjkwODIgNTc2LjA0NSA4OC4xNjQ2IDU3Ni4wNDUgODYuMDEzN0M1NzYuMDQ1IDgzLjg2MjYgNTc3Ljc4OCA4Mi4xMTgyIDU3OS45MzkgODIuMTE4MlpNNTcyLjQxOSAzMi45NzA3QzU3NC40NjUgMzIuOTcwNyA1NzYuMTI0IDM0LjYyOTUgNTc2LjEyNCAzNi42NzU4QzU3Ni4xMjQgMzguMDQ3IDU3NS4zNzkgMzkuMjQzIDU3NC4yNzEgMzkuODgzOFY1MS41NzIzQzU3Ni43ODUgNTEuNzQzNCA1NzkuMTIxIDUyLjIwMDMgNTgwLjk1MiA1Mi44OTQ1QzU4My4zMTQgNTMuNzkwMiA1ODQuNDYxIDU0Ljg2MDQgNTg0LjQ2MSA1Ni4xMjdINTU5LjQ1QzU1OS40NTEgNTQuODYwNCA1NjAuNzc4IDUzLjc5MDIgNTYzLjE0IDUyLjg5NDVDNTY1LjE1IDUyLjEzMjEgNTY3Ljc3MSA1MS42NTU2IDU3MC41NjYgNTEuNTMwM1YzOS44ODQ4QzU2OS40NTkgMzkuMjQ0IDU2OC43MTQgMzguMDQ3MiA1NjguNzE0IDM2LjY3NThDNTY4LjcxNCAzNC42Mjk1IDU3MC4zNzMgMzIuOTcwNyA1NzIuNDE5IDMyLjk3MDdaIiBmaWxsPSIjMjgwMEZGIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iNi4wMDMwNiIgeTE9IjYiIHgyPSIxNDIuOTcyIiB5Mj0iMTQzLjIyNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iMTQzLjIyNyIgeTE9Ijc2LjgwNDYiIHgyPSIyNi4wMDEiIHkyPSIxMjIuOTY0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYiIHgxPSI1OC4yNTQxIiB5MT0iNTguMTY3IiB4Mj0iNTMuOTExNyIgeTI9IjEzMi45NTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMzc0XzE1NDYiPgo8cGF0aCBkPSJNNiA2SDExMy4yMjdDMTI5Ljc5NSA2IDE0My4yMjcgMTkuNDMxNSAxNDMuMjI3IDM2VjExMi45NzVDMTQzLjIyNyAxMjkuNTQ0IDEyOS43OTUgMTQyLjk3NSAxMTMuMjI3IDE0Mi45NzVINlY2WiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K',\r\n USER_AVATAR:\r\n 'data:image/png;base64,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',\r\n BOT_AVATAR:\r\n 'data:image/png;base64,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',\r\n};\r\n","import { appConst } from '../constant/constant';\r\nimport { DOOHBOT_API_URL } from './../model/token';\r\n\r\nexport class DoohbotInput {\r\n username = '';\r\n password = '';\r\n authToken?: string;\r\n\r\n DOOHBOT_API_URL?: string;\r\n\r\n // inputs\r\n userAvatarUrl: string = appConst.USER_AVATAR;\r\n\r\n // Application Constants Text\r\n readonly appTitle? = 'DoohBot';\r\n readonly appSubtitle? = 'Welcome to DoohBot';\r\n readonly welcomeDesc? =\r\n 'We provide a powerful live chat platform to help businesses connect with their customers, offer support, and increase sales through real-time conversations.';\r\n readonly chatIcon? = 'chat';\r\n readonly sendIcon? = 'send';\r\n readonly closeIcon? = 'close';\r\n readonly clear? = 'clear_all';\r\n readonly minimizeIcon? = 'remove';\r\n readonly moreIcon? = 'more_vert';\r\n readonly fullscreenIcon? = 'fullscreen';\r\n readonly fullscreenExitIcon? = 'fullscreen_exit';\r\n readonly hintText? = 'Please Enter Here';\r\n readonly errorMessage? = 'The message you submitted was too long.';\r\n\r\n // Application Constants Images\r\n readonly appLogoUrl? = appConst.APP_LOGO;\r\n readonly appTextLogoUrl? = appConst.APP_TEXT_LOGO;\r\n readonly appHeaderLogoUrl? = appConst.APP_HEADER_LOGO;\r\n readonly botAvatarUrl? = appConst.BOT_AVATAR;\r\n}\r\n","export const PredefinedMessages = ['Hello!', 'I need help', 'Contact support', 'News and Updates'];\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-chat-button',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-button.component.html',\r\n styleUrls: ['./chat-button.component.scss'],\r\n})\r\nexport class ChatButtonComponent {\r\n @Input() buttonStyle: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom' = 'fab';\r\n @Input() isChatOpen: boolean = false;\r\n @Input() unreadCount: number = 0;\r\n @Input() chatIcon: string = 'chat';\r\n @Input() appTitle: string = 'Chat';\r\n @Input() appLogoUrl: string = '';\r\n @Input() appTextLogoUrl: string = '';\r\n\r\n @Output() toggle = new EventEmitter<void>();\r\n\r\n get isSidebar(): boolean {\r\n return this.buttonStyle.startsWith('sidebar');\r\n }\r\n\r\n get sidebarPosition(): 'top' | 'center' | 'bottom' {\r\n if (!this.isSidebar) return 'center';\r\n if (this.buttonStyle === 'sidebar') return 'center';\r\n return this.buttonStyle.split('-')[1] as 'top' | 'center' | 'bottom';\r\n }\r\n\r\n onToggle() {\r\n this.toggle.emit();\r\n }\r\n}\r\n","<!-- fab -->\r\n<button class=\"chat-fab\" (click)=\"onToggle()\" *ngIf=\"buttonStyle === 'fab' && !isChatOpen\">\r\n <!-- <mat-icon>{{ chatIcon }}</mat-icon> -->\r\n <img style=\"width: 30px; height: 30px\" [src]=\"appLogoUrl\" />\r\n <!-- <div class=\"chat-logo\"></div> -->\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n\r\n<!-- sidebar button -->\r\n<button\r\n class=\"chat-sidebar\"\r\n (click)=\"onToggle()\"\r\n *ngIf=\"isSidebar && !isChatOpen\"\r\n [ngClass]=\"sidebarPosition\"\r\n>\r\n <!-- <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2> -->\r\n <img style=\"transform: rotate(-90deg); width: 100px; height: 45px\" [src]=\"appTextLogoUrl\" />\r\n\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chips',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chips.component.html',\r\n styleUrls: ['./chips.component.scss'],\r\n})\r\nexport class Chips {\r\n @Input() messages: string[] = []; // messages array\r\n @Input() disabled = false;\r\n @Output() chipClick = new EventEmitter<string>(); // emit clicked chip\r\n\r\n onChipClick(msg: string) {\r\n if (this.disabled) return;\r\n this.chipClick.emit(msg);\r\n }\r\n}\r\n","@if (messages.length > 0) {\r\n <div class=\"predefined-chips\">\r\n @for (msg of messages; track msg) {\r\n <button class=\"chip\" (click)=\"onChipClick(msg)\">\r\n {{ msg }}\r\n </button>\r\n }\r\n </div>\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n TrackByFunction,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Chips } from '../../shared/chips/chips.component';\r\nimport { Message } from '../../model/message';\r\n\r\n@Component({\r\n selector: 'app-message-list',\r\n standalone: true,\r\n imports: [CommonModule, Chips],\r\n templateUrl: './message-list.component.html',\r\n styleUrls: ['./message-list.component.scss'],\r\n})\r\nexport class MessageListComponent implements AfterViewInit, OnDestroy {\r\n @Input() messages: Message[] = [];\r\n @Input() isBotTyping: boolean = false;\r\n @Input() appLogoUrl: string = '';\r\n @Input() appSubtitle: string = '';\r\n @Input() welcomeDesc: string = '';\r\n @Input() predefinedMessages: string[] = [];\r\n @Input() botAvatarUrl: string = '';\r\n @Input() userAvatarUrl: string = '';\r\n @Input() userName: string = '';\r\n @Input() isAuthenticated: boolean = false;\r\n @Input() isGuestMode: boolean = false;\r\n @Input() trackByMessageId: TrackByFunction<Message> = (index, item) => item.id ?? index;\r\n\r\n @Output() suggestionClick = new EventEmitter<string>();\r\n @Output() loginClick = new EventEmitter<void>();\r\n @Output() continueAsGuest = new EventEmitter<void>();\r\n\r\n @ViewChild('chatMessages') private chatMessagesContainer!: ElementRef;\r\n private mutationObserver!: MutationObserver;\r\n\r\n appEmoji = {\r\n waveHand: '\\u{1F44B}',\r\n };\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.chatMessagesContainer) return;\r\n\r\n this.mutationObserver = new MutationObserver(() => this.scrollToBottom());\r\n\r\n this.mutationObserver.observe(this.chatMessagesContainer.nativeElement, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n this.scrollToBottom();\r\n }\r\n\r\n private scrollToBottom(): void {\r\n if (!this.chatMessagesContainer) {\r\n return;\r\n }\r\n const container = this.chatMessagesContainer.nativeElement;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: 'smooth',\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n\r\n onPredefinedClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n}\r\n","<div #chatMessages class=\"chat-messages\">\r\n <!-- Welcome Screen -->\r\n <div class=\"welcome-screen\" *ngIf=\"messages.length === 0 && !isBotTyping\">\r\n <img [src]=\"appLogoUrl\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 0px\" />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n <h2 class=\"welcome-greeting\" *ngIf=\"userName && isAuthenticated\">\r\n Hi, {{ userName }}!\r\n <!-- <span class=\"emoji\">👋</span> -->\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n\r\n <h3>{{ appSubtitle }}</h3>\r\n <p>{{ welcomeDesc }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n <app-chips\r\n *ngIf=\"isAuthenticated\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onPredefinedClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Guest Mode Login Button -->\r\n <div *ngIf=\"isGuestMode\" style=\"margin-top: 10px\">\r\n <button class=\"login-btn\" (click)=\"loginClick.emit()\">Login</button>\r\n </div>\r\n\r\n <!-- Fallback / Login Prompts (Below Welcome Text) -->\r\n <div\r\n *ngIf=\"!isAuthenticated && !isGuestMode\"\r\n class=\"auth-buttons-container\"\r\n style=\"margin-top: 20px\"\r\n >\r\n <button (click)=\"loginClick.emit()\" class=\"auth-btn primary\" style=\"margin-right: 10px\">\r\n Login\r\n </button>\r\n <button (click)=\"continueAsGuest.emit()\" class=\"auth-btn secondary\">Continue as Guest</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Chat Messages -->\r\n <div\r\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\r\n class=\"message-wrapper\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n <!-- Bot Avatar -->\r\n <img\r\n *ngIf=\"message.sender === 'bot'\"\r\n class=\"bot-avatar\"\r\n [src]=\"botAvatarUrl\"\r\n alt=\"Bot Avatar\"\r\n />\r\n\r\n <!-- Message Bubble -->\r\n <div\r\n class=\"message\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n {{ message.text }}\r\n <!-- Show time below message -->\r\n <div *ngIf=\"message.sender === 'bot'\" class=\"message-time\">\r\n {{ message.timestamp | date: 'shortTime' }}\r\n </div>\r\n </div>\r\n\r\n <!-- User Avatar -->\r\n <div class=\"user-avatar-container\" *ngIf=\"message.sender === 'user'\">\r\n <img class=\"user-avatar\" [src]=\"userAvatarUrl\" alt=\"User Avatar\" />\r\n <!-- <span class=\"user-name\" *ngIf=\"userName\">{{ userName }}</span> -->\r\n </div>\r\n </div>\r\n\r\n <!-- Typing Indicator -->\r\n <div class=\"message-wrapper bot\" *ngIf=\"isBotTyping\">\r\n <img class=\"bot-avatar\" [src]=\"botAvatarUrl\" alt=\"Bot Avatar\" />\r\n <div class=\"message bot\">\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-message-input',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './message-input.component.html',\r\n styleUrls: ['./message-input.component.scss'],\r\n})\r\nexport class MessageInputComponent {\r\n @Input() isBotTyping: boolean = false;\r\n @Input() hintText: string = 'Type a message...';\r\n @Input() sendIcon: string = 'send';\r\n\r\n @Output() send = new EventEmitter<string>();\r\n\r\n onSend(text: string) {\r\n if (text.trim()) {\r\n this.send.emit(text);\r\n }\r\n }\r\n}\r\n","<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input #messageInput type=\"text\" [disabled]=\"isBotTyping\"\r\n (keydown.enter)=\"onSend(messageInput.value); messageInput.value = ''\" [placeholder]=\"hintText\" />\r\n\r\n <button [disabled]=\"isBotTyping\" (click)=\"onSend(messageInput.value); messageInput.value = ''\">\r\n <mat-icon>{{ sendIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n</div>","import { Component, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-snackbar',\r\n templateUrl: './snackbar.component.html',\r\n styleUrls: ['./snackbar.component.scss'],\r\n standalone: true,\r\n imports: [MatIconModule],\r\n})\r\nexport class SnackBar implements OnInit, OnDestroy {\r\n @Input() message: string | null = null;\r\n @Input() autoDismiss: boolean = true;\r\n @Input() dismissDelay: number = 5000;\r\n @Input() show: boolean = false;\r\n\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n public timeoutId: number | null = null;\r\n\r\n ngOnInit() {\r\n if (this.autoDismiss) {\r\n this.timeoutId = setTimeout(() => {\r\n this.close();\r\n }, this.dismissDelay) as any;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.clearTimeout();\r\n }\r\n\r\n close() {\r\n this.show = false;\r\n this.message = null;\r\n this.closed.emit();\r\n }\r\n public clearTimeout() {\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n }\r\n }\r\n}\r\n","<div class=\"message-error\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">warning</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n","import { Directive, ElementRef, HostListener, Input, OnInit, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[draggableDialog]',\r\n standalone: true,\r\n})\r\nexport class DraggableDialogDirective implements OnInit {\r\n private isDragging = false;\r\n private startX = 0;\r\n private startY = 0;\r\n private offsetX = 0;\r\n private offsetY = 0;\r\n\r\n @Input('dragHandle') dragHandleSelector: string | undefined;\r\n @Input() enableDrag = false;\r\n\r\n private dragHandle: HTMLElement | undefined;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n ngOnInit() {\r\n if (!this.enableDrag) {\r\n this.el.nativeElement.removeAttribute('draggableDialog');\r\n return;\r\n }\r\n\r\n if (this.dragHandleSelector) {\r\n this.dragHandle = this.el.nativeElement.querySelector(this.dragHandleSelector);\r\n } else {\r\n this.dragHandle = this.el.nativeElement; // fallback\r\n }\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'move');\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.dragHandle || event.target !== this.dragHandle) return;\r\n\r\n this.isDragging = true;\r\n this.startX = event.clientX - this.offsetX;\r\n this.startY = event.clientY - this.offsetY;\r\n\r\n event.preventDefault();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging) return;\r\n\r\n this.offsetX = event.clientX - this.startX;\r\n this.offsetY = event.clientY - this.startY;\r\n\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'transform',\r\n `translate(${this.offsetX}px, ${this.offsetY}px)`,\r\n );\r\n }\r\n\r\n @HostListener('document:mouseup', [])\r\n onMouseUp() {\r\n this.isDragging = false;\r\n }\r\n}\r\n","// resizable-dialog.directive.ts\r\nimport {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n Input,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[resizableDialog]',\r\n standalone: true,\r\n})\r\nexport class ResizableDialogDirective implements OnInit, OnDestroy {\r\n private resizeHandles: HTMLElement[] = [];\r\n private activeHandle: string | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n private startLeft = 0;\r\n private startTop = 0;\r\n\r\n @Input() enableResize = false;\r\n\r\n // Define resize directions\r\n private directions = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n ngOnInit() {\r\n if (!this.enableResize) {\r\n this.el.nativeElement.removeAttribute('resizableDialog');\r\n return;\r\n }\r\n\r\n this.setStyle();\r\n this.createResizeHandles();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeResizeHandles();\r\n }\r\n\r\n private setStyle() {\r\n const element = this.el.nativeElement;\r\n this.renderer.setStyle(element, 'position', 'absolute');\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'boxSizing', 'border-box');\r\n }\r\n\r\n private createResizeHandles() {\r\n this.directions.forEach((dir) => {\r\n const handle = this.renderer.createElement('div');\r\n this.renderer.setAttribute(handle, 'data-dir', dir);\r\n this.renderer.setStyle(handle, 'position', 'absolute');\r\n this.renderer.setStyle(handle, 'background', 'transparent');\r\n this.renderer.setStyle(handle, 'zIndex', '10');\r\n this.renderer.setStyle(handle, 'userSelect', 'none');\r\n\r\n // Set size and position based on direction\r\n if (dir.includes('e') || dir.includes('w')) {\r\n this.renderer.setStyle(handle, 'width', '10px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('e') ? 'e-resize' : 'w-resize');\r\n this.renderer.setStyle(handle, 'top', '0');\r\n this.renderer.setStyle(handle, 'bottom', '0');\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '0' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '0' : null);\r\n }\r\n if (dir.includes('n') || dir.includes('s')) {\r\n this.renderer.setStyle(handle, 'height', '10px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('s') ? 's-resize' : 'n-resize');\r\n this.renderer.setStyle(handle, 'left', '0');\r\n this.renderer.setStyle(handle, 'right', '0');\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '0' : null);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '0' : null);\r\n }\r\n if (dir === 'ne' || dir === 'nw' || dir === 'se' || dir === 'sw') {\r\n this.renderer.setStyle(handle, 'width', '12px');\r\n this.renderer.setStyle(handle, 'height', '12px');\r\n this.renderer.setStyle(handle, 'borderRadius', '50%');\r\n this.renderer.setStyle(handle, 'cursor', `${dir}-resize`);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '0' : null);\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '0' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '0' : null);\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '0' : null);\r\n }\r\n\r\n this.renderer.appendChild(this.el.nativeElement, handle);\r\n this.resizeHandles.push(handle);\r\n });\r\n }\r\n\r\n private removeResizeHandles() {\r\n this.resizeHandles.forEach((handle) => {\r\n this.renderer.removeChild(this.el.nativeElement, handle);\r\n });\r\n this.resizeHandles = [];\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n const target = event.target as HTMLElement;\r\n const dir = target.getAttribute('data-dir');\r\n if (!dir) return;\r\n\r\n event.preventDefault();\r\n\r\n this.activeHandle = dir;\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = parseFloat(this.getComputedStyleValue('width'));\r\n this.startHeight = parseFloat(this.getComputedStyleValue('height'));\r\n this.startLeft = parseFloat(this.getComputedStyleValue('left'));\r\n this.startTop = parseFloat(this.getComputedStyleValue('top'));\r\n\r\n // Prevent text selection during resize\r\n document.body.classList.add('no-select');\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.activeHandle) return;\r\n\r\n const dx = event.clientX - this.startX;\r\n const dy = event.clientY - this.startY;\r\n\r\n let newWidth = this.startWidth;\r\n let newHeight = this.startHeight;\r\n let newLeft = this.startLeft;\r\n let newTop = this.startTop;\r\n\r\n const minWidth = 150;\r\n const minHeight = 100;\r\n\r\n // Horizontal resize\r\n if (this.activeHandle.includes('e')) {\r\n newWidth = Math.max(this.startWidth + dx, minWidth);\r\n }\r\n if (this.activeHandle.includes('w')) {\r\n newWidth = Math.max(this.startWidth - dx, minWidth);\r\n newLeft = this.startLeft + (this.startWidth - newWidth);\r\n }\r\n\r\n // Vertical resize\r\n if (this.activeHandle.includes('s')) {\r\n newHeight = Math.max(this.startHeight + dy, minHeight);\r\n }\r\n if (this.activeHandle.includes('n')) {\r\n newHeight = Math.max(this.startHeight - dy, minHeight);\r\n newTop = this.startTop + (this.startHeight - newHeight);\r\n }\r\n\r\n // Apply changes\r\n this.renderer.setStyle(this.el.nativeElement, 'width', `${newWidth}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${newLeft}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${newTop}px`);\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (this.activeHandle) {\r\n this.activeHandle = null;\r\n document.body.classList.remove('no-select');\r\n }\r\n }\r\n\r\n private getComputedStyleValue(property: string): string {\r\n return getComputedStyle(this.el.nativeElement).getPropertyValue(property) || '0';\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Renderer2, RendererFactory2, signal } from '@angular/core';\r\nimport { OverlayContainer } from '@angular/cdk/overlay';\r\nimport { DoohbotThemeConfig } from '../../model/theme-config.model';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'auto';\r\n\r\n// const DEFAULT_THEME_CONFIG: DoohbotThemeConfig = {\r\n// fontFamily: \"'Roboto', Arial, sans-serif\",\r\n// primaryColor: '#2800ff',\r\n// secondaryColor: '#08dacf',\r\n// backgroundColor: '#f8f9fa, #1a1717',\r\n// chatInputColor: '#f8f9fa, #1a1717',\r\n// textAltColor: '#000000, #ffffff',\r\n// buttonColor: '#000000, #ffffff',\r\n// textColor: '#333, #f5f5f5',\r\n// secondaryTextColor: '#858585, #a1a1a1',\r\n// hintTextColor: '#858585, #a1a1a1',\r\n// userMessageColor: '#2800ff',\r\n// botMessageColor: '#e9ecef, #333',\r\n// userTextColor: '#fff',\r\n// botTextColor: '#333, #fff',\r\n// borderColor: '#ccc, #444',\r\n// borderShadowColor: '0 4px 16px rgba(0, 0, 0, 0.25), 0 4px 16px rgba(0, 0, 0, 0.75)',\r\n// borderTopColor: '#dddddd00, #44444400',\r\n// typingIndicatorColor: '#999, #bbb',\r\n// white: '#ffffff',\r\n// black: '#000000',\r\n// grey: '#6c757d, #9ca3af',\r\n// red: '#ff0000',\r\n// lightRed: '#f28b8b',\r\n// };\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService implements OnDestroy {\r\n private renderer: Renderer2;\r\n private _theme = signal<ThemeMode>('auto');\r\n public theme = this._theme.asReadonly();\r\n\r\n private _activeTheme = signal<'light-theme' | 'dark-theme'>('light-theme');\r\n public activeTheme = this._activeTheme.asReadonly();\r\n\r\n private observer: MutationObserver | null = null;\r\n // private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\r\n\r\n constructor(\r\n rendererFactory: RendererFactory2,\r\n private overlay: OverlayContainer,\r\n ) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n // Initialize theme from local storage or default to auto\r\n const savedTheme = localStorage.getItem('theme') as ThemeMode;\r\n this.setTheme(savedTheme || 'auto');\r\n }\r\n\r\n setTheme(mode: ThemeMode): void {\r\n this._theme.set(mode);\r\n localStorage.setItem('theme', mode);\r\n this.updateActiveTheme(mode);\r\n }\r\n\r\n private updateActiveTheme(mode: ThemeMode) {\r\n this.cleanupObservers();\r\n\r\n if (mode === 'auto') {\r\n this.handleAutoTheme();\r\n } else {\r\n const themeToApply = mode === 'dark' ? 'dark-theme' : 'light-theme';\r\n this._activeTheme.set(themeToApply);\r\n this.applyThemeToGlobal(themeToApply);\r\n }\r\n }\r\n\r\n private handleAutoTheme() {\r\n // Initial detection\r\n this.detectAndApplyParentTheme();\r\n\r\n // Watch for changes in parent\r\n this.observer = new MutationObserver(() => {\r\n this.detectAndApplyParentTheme();\r\n });\r\n\r\n this.observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n this.observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n\r\n // Also listen to system preference as a fallback or if parent doesn't specify\r\n // const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n // this.mediaQueryListener = (e) => {\r\n // // Re-run detection which prioritizes parent classes but falls back to system\r\n // this.detectAndApplyParentTheme();\r\n // };\r\n // mediaQuery.addEventListener('change', this.mediaQueryListener);\r\n }\r\n\r\n private detectAndApplyParentTheme() {\r\n const isDark = this.isParentDark();\r\n const newTheme = isDark ? 'dark-theme' : 'light-theme';\r\n\r\n // Only update if changed to avoid unnecessary DOM updates\r\n if (this._activeTheme() !== newTheme) {\r\n this._activeTheme.set(newTheme);\r\n this.applyThemeToGlobal(newTheme);\r\n }\r\n }\r\n\r\n private isParentDark(): boolean {\r\n const body = document.body;\r\n const html = document.documentElement;\r\n\r\n // Check for common class names\r\n const darkClasses = ['dark', 'dark-theme', 'dark-mode', 'night-mode'];\r\n const hasDarkClass = (el: HTMLElement) => darkClasses.some((c) => el.classList.contains(c));\r\n\r\n if (hasDarkClass(body) || hasDarkClass(html)) return true;\r\n\r\n // Check for data-theme attribute\r\n if (body.getAttribute('data-theme') === 'dark' || html.getAttribute('data-theme') === 'dark')\r\n return true;\r\n\r\n // Check for Bootstrap 5.3+ data-bs-theme\r\n if (\r\n body.getAttribute('data-bs-theme') === 'dark' ||\r\n html.getAttribute('data-bs-theme') === 'dark'\r\n ) {\r\n return true;\r\n }\r\n\r\n // Fallback to system preference\r\n // return window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n return false;\r\n }\r\n\r\n private applyThemeToGlobal(theme: 'light-theme' | 'dark-theme') {\r\n // We do NOT touch document.body anymore to avoid conflicts\r\n const overlayContainer = this.overlay.getContainerElement();\r\n\r\n // Only apply to overlay container (for menus/dialogs)\r\n // The main chat window handles its own theme via the host binding in doohbot.component.ts\r\n this.renderer.removeClass(overlayContainer, 'light-theme');\r\n this.renderer.removeClass(overlayContainer, 'dark-theme');\r\n this.renderer.addClass(overlayContainer, theme);\r\n }\r\n\r\n private cleanupObservers() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n // if (this.mediaQueryListener) {\r\n // window\r\n // .matchMedia('(prefers-color-scheme: dark)')\r\n // .removeEventListener('change', this.mediaQueryListener);\r\n // this.mediaQueryListener = null;\r\n // }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanupObservers();\r\n }\r\n\r\n public applyCssVariables(element: HTMLElement, config: DoohbotThemeConfig | undefined) {\r\n if (!config) return;\r\n\r\n //! Made for popout windows where we need to apply styles to a specific element\r\n // const activeConfig = config || DEFAULT_THEME_CONFIG;\r\n\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n\r\n const applyColor = (input: string | undefined, variableName: string) => {\r\n if (input) {\r\n const { light, dark } = this.parseColor(input);\r\n const colorToUse = isDark ? dark : light;\r\n element.style.setProperty(`--${variableName}`, colorToUse);\r\n } else {\r\n element.style.removeProperty(`--${variableName}`);\r\n }\r\n };\r\n\r\n applyColor(config.fontFamily, 'font-family');\r\n applyColor(config.primaryColor, 'primary-color');\r\n applyColor(config.secondaryColor, 'secondary-color');\r\n applyColor(config.backgroundColor, 'background-color');\r\n applyColor(config.chatInputColor, 'chat-input-color');\r\n applyColor(config.textAltColor, 'text-alt-color');\r\n applyColor(config.buttonColor, 'button-color');\r\n applyColor(config.textColor, 'text-color');\r\n applyColor(config.secondaryTextColor, 'secondary-text-color');\r\n applyColor(config.hintTextColor, 'hint-text-color');\r\n applyColor(config.userMessageColor, 'user-message-color');\r\n applyColor(config.botMessageColor, 'bot-message-color');\r\n applyColor(config.userTextColor, 'user-text-color');\r\n applyColor(config.botTextColor, 'bot-text-color');\r\n applyColor(config.borderColor, 'border-color');\r\n applyColor(config.borderShadowColor, 'border-shadow-color');\r\n applyColor(config.borderTopColor, 'border-top-color');\r\n applyColor(config.typingIndicatorColor, 'typing-indicator-color');\r\n applyColor(config.white, 'white');\r\n applyColor(config.black, 'black');\r\n applyColor(config.grey, 'grey');\r\n applyColor(config.red, 'red');\r\n applyColor(config.lightRed, 'light-red');\r\n }\r\n\r\n private parseColor(input: string): { light: string; dark: string } {\r\n const parts = input.split(',').map((p) => p.trim());\r\n if (parts.length === 1) {\r\n return { light: parts[0], dark: parts[0] };\r\n } else if (parts.length >= 2) {\r\n return { light: parts[0], dark: parts[1] };\r\n }\r\n return { light: '', dark: '' };\r\n }\r\n}\r\n","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nexport interface DialogData {\r\n title: string;\r\n message: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n icon?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-dialog',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, MatButtonModule, MatIconModule],\r\n templateUrl: './dialog.component.html',\r\n styleUrls: ['./dialog.component.scss'],\r\n})\r\nexport class DialogComponent {\r\n constructor(\r\n public dialogRef: MatDialogRef<DialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n ) {\r\n // Set defaults\r\n this.data.confirmText = this.data.confirmText || 'Confirm';\r\n this.data.cancelText = this.data.cancelText || 'Cancel';\r\n this.data.confirmButtonColor = this.data.confirmButtonColor || 'warn';\r\n this.data.icon = this.data.icon || 'warning';\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n onConfirm(): void {\r\n this.dialogRef.close(true);\r\n }\r\n}\r\n","<div class=\"dialog-container\">\r\n <div class=\"dialog-header\">\r\n <mat-icon class=\"dialog-icon\" [class.warn-icon]=\"data.confirmButtonColor === 'warn'\">\r\n {{ data.icon }}\r\n </mat-icon>\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n </div>\r\n\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button class=\"cancel-btn\" (click)=\"onCancel()\" type=\"button\">\r\n {{ data.cancelText }}\r\n </button>\r\n <button\r\n mat-raised-button\r\n class=\"confirm-btn\"\r\n [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n [class.primary-btn]=\"data.confirmButtonColor === 'primary'\"\r\n [class.accent-btn]=\"data.confirmButtonColor === 'accent'\"\r\n (click)=\"onConfirm()\"\r\n type=\"button\"\r\n >\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Observable } from 'rxjs';\r\nimport { DialogComponent, DialogData } from './dialog.component';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DialogService {\r\n constructor(private dialog: MatDialog) { }\r\n\r\n /**\r\n * Opens a confirmation dialog with customizable options\r\n * @param data Configuration for the dialog\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n open(data: DialogData): Observable<boolean> {\r\n const dialogRef = this.dialog.open(DialogComponent, {\r\n width: '400px',\r\n data: data,\r\n disableClose: false,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n });\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n\r\n /**\r\n * Convenience method for delete confirmation dialogs\r\n * @param itemName Name of the item being deleted\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n confirmDelete(itemName: string = 'this item'): Observable<boolean> {\r\n return this.open({\r\n title: 'Confirm Delete',\r\n message: `Are you sure you want to delete ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_forever',\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n OnChanges,\r\n SimpleChanges,\r\n Output,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { ChatSession, ChatSessionGroup } from '../../model/chat-session.model';\r\nimport { DialogService } from '../../shared/dialog/dialog.service';\r\n\r\n@Component({\r\n selector: 'app-chat-history-sidebar',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './chat-history-sidebar.component.html',\r\n styleUrls: ['./chat-history-sidebar.component.scss'],\r\n})\r\nexport class ChatHistorySidebarComponent implements OnInit, OnChanges {\r\n @Input() sessions: ChatSession[] = [];\r\n @Input() isOpen: boolean = false;\r\n @Input() userName: string = 'User';\r\n\r\n @Output() sessionSelected = new EventEmitter<ChatSession>();\r\n @Output() sessionDeleted = new EventEmitter<string>();\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n chatHistory: ChatSessionGroup[] = [];\r\n\r\n constructor(private dialogService: DialogService) {}\r\n\r\n ngOnInit(): void {\r\n this.chatHistory = this.groupedSessions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['sessions']) {\r\n this.chatHistory = this.groupedSessions();\r\n }\r\n }\r\n\r\n groupedSessions(): ChatSessionGroup[] {\r\n const now = new Date();\r\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const yesterday = new Date(today);\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n const weekAgo = new Date(today);\r\n weekAgo.setDate(weekAgo.getDate() - 7);\r\n\r\n const groups: ChatSessionGroup[] = [\r\n { label: 'Today', sessions: [] },\r\n { label: 'Yesterday', sessions: [] },\r\n { label: 'This Week', sessions: [] },\r\n { label: 'Older', sessions: [] },\r\n ];\r\n\r\n // Sort sessions by timestamp (newest first)\r\n const sortedSessions = [...this.sessions].sort(\r\n (a, b) => b.timestamp.getTime() - a.timestamp.getTime(),\r\n );\r\n\r\n sortedSessions.forEach((session) => {\r\n const sessionDate = new Date(session.timestamp);\r\n const sessionDayStart = new Date(\r\n sessionDate.getFullYear(),\r\n sessionDate.getMonth(),\r\n sessionDate.getDate(),\r\n );\r\n\r\n if (sessionDayStart.getTime() === today.getTime()) {\r\n groups[0].sessions.push(session);\r\n } else if (sessionDayStart.getTime() === yesterday.getTime()) {\r\n groups[1].sessions.push(session);\r\n } else if (sessionDayStart.getTime() >= weekAgo.getTime()) {\r\n groups[2].sessions.push(session);\r\n } else {\r\n groups[3].sessions.push(session);\r\n }\r\n });\r\n\r\n // Filter out empty groups\r\n return groups.filter((g) => g.sessions.length > 0);\r\n }\r\n\r\n onSessionClick(session: ChatSession): void {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n onDeleteClick(event: Event, sessionId: string): void {\r\n event.stopPropagation();\r\n this.dialogService.confirmDelete('this conversation').subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.sessionDeleted.emit(sessionId);\r\n this.chatHistory = this.groupedSessions();\r\n }\r\n });\r\n }\r\n\r\n onClose(): void {\r\n this.closed.emit();\r\n }\r\n\r\n formatTime(date: Date): string {\r\n return new Date(date).toLocaleTimeString('en-US', {\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n });\r\n }\r\n\r\n formatDate(date: Date): string {\r\n return new Date(date).toLocaleDateString('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n }\r\n}\r\n","<div class=\"history-sidebar\" [class.open]=\"isOpen\">\r\n <div class=\"sidebar-header\">\r\n <h3>{{ userName }}'s Chat History</h3>\r\n <button class=\"close-btn\" (click)=\"onClose()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sidebar-content\">\r\n <div *ngIf=\"sessions.length === 0\" class=\"empty-state\">\r\n <mat-icon>history</mat-icon>\r\n <p>No chat history yet</p>\r\n <span>Start a conversation to see it here</span>\r\n </div>\r\n\r\n <div *ngFor=\"let group of chatHistory\" class=\"session-group\">\r\n <div class=\"group-label\">{{ group.label }}</div>\r\n <div class=\"session-list\">\r\n <div\r\n *ngFor=\"let session of group.sessions\"\r\n class=\"session-item\"\r\n (click)=\"onSessionClick(session)\"\r\n >\r\n <div class=\"session-content\">\r\n <div class=\"session-title\">{{ session.title }}</div>\r\n <div class=\"session-time\">\r\n {{ formatTime(session.timestamp) }} · {{ formatDate(session.timestamp) }}\r\n </div>\r\n </div>\r\n <button\r\n class=\"delete-btn\"\r\n (click)=\"onDeleteClick($event, session.id)\"\r\n title=\"Delete conversation\"\r\n >\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n TrackByFunction,\r\n OnDestroy,\r\n OnInit,\r\n SimpleChanges,\r\n OnChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { Chips } from '../../shared/chips/chips.component';\r\nimport { MessageListComponent } from '../message-list/message-list.component';\r\nimport { MessageInputComponent } from '../message-input/message-input.component';\r\nimport { SnackBar } from '../../shared/snackbar/snackbar.component';\r\nimport { DraggableDialogDirective } from '../../directives/draggable/draggable-dialog.directive';\r\nimport { ResizableDialogDirective } from '../../directives/resizable/resizable-dialog.directive';\r\nimport { Message } from '../../model/message';\r\nimport { ChatSession } from '../../model/chat-session.model';\r\nimport { ThemeService } from '../../core/services/theme.service';\r\nimport { inject } from '@angular/core';\r\n\r\nimport { ChatHistorySidebarComponent } from '../chat-history-sidebar/chat-history-sidebar.component';\r\nimport { DropdownMenu } from '../../shared/dropdown-menu/dropdown-menu.component';\r\nimport { MenuItem } from '../../shared/menu-item/menu-item.component';\r\nimport { PopoutWindowDirective } from '../../directives/popout/popout.directive';\r\nimport { DoohbotThemeConfig } from '../../model/theme-config.model';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n Chips,\r\n MessageListComponent,\r\n MessageInputComponent,\r\n SnackBar,\r\n DraggableDialogDirective,\r\n ResizableDialogDirective,\r\n ChatHistorySidebarComponent,\r\n FormsModule,\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n})\r\nexport class ChatWindowComponent implements OnInit, OnDestroy, OnChanges {\r\n @Input() isChatOpen: boolean = false;\r\n @Input() enableDrag: boolean = false;\r\n @Input() enableResize: boolean = false;\r\n @Input() isFullScreen: boolean = false;\r\n @Input() isAuthenticated: boolean = false;\r\n @Input() appTitle: string = '';\r\n @Input() appLogoUrl: string = '';\r\n @Input() appTextLogoUrl: string = '';\r\n @Input() appHeaderLogoUrl: string = '';\r\n @Input() moreIcon: string = 'more_vert';\r\n @Input() minimizeIcon: string = 'minimize';\r\n @Input() messages: Message[] = [];\r\n @Input() isBotTyping: boolean = false;\r\n @Input() appSubtitle: string = '';\r\n @Input() welcomeDesc: string = '';\r\n @Input() predefinedMessages: string[] = [];\r\n @Input() botAvatarUrl: string = '';\r\n @Input() userAvatarUrl: string = '';\r\n @Input() userName: string = '';\r\n @Input() trackByMessageId: TrackByFunction<Message> = (index, item) => item.id ?? index;\r\n @Input() hintText: string = '';\r\n @Input() sendIcon: string = '';\r\n @Input() messageError: string | null = null;\r\n @Input() showSuggestionChips: boolean = false;\r\n @Input() isHistorySidebarOpen: boolean = false;\r\n @Input() chatSessions: ChatSession[] = [];\r\n @Input() chatHistoryUserName: string = 'User';\r\n @Input() isGuestUser: boolean = false;\r\n @Input() isGuestMode: boolean = false;\r\n @Input() isLoggingIn: boolean = false;\r\n @Input() authError: string | null = null;\r\n @Input() authSuccess: string | null = null;\r\n @Input() themeConfig: DoohbotThemeConfig | undefined;\r\n\r\n @Output() toggleChat = new EventEmitter<void>();\r\n @Output() toggleFullScreen = new EventEmitter<void>();\r\n @Output() toggleHistorySidebar = new EventEmitter<void>();\r\n @Output() openSettings = new EventEmitter<void>();\r\n @Output() suggestionClick = new EventEmitter<string>();\r\n @Output() send = new EventEmitter<string>();\r\n @Output() clearMessageError = new EventEmitter<void>();\r\n @Output() clearChat = new EventEmitter<void>();\r\n @Output() sessionSelected = new EventEmitter<ChatSession>();\r\n @Output() sessionDeleted = new EventEmitter<string>();\r\n @Output() continueAsGuest = new EventEmitter<void>();\r\n @Output() loginClick = new EventEmitter<void>();\r\n @Output() loginSubmit = new EventEmitter<{ username: string; password: string }>();\r\n @Output() logout = new EventEmitter<void>();\r\n\r\n public themeService = inject(ThemeService);\r\n\r\n // Login form state\r\n public loginUsername = '';\r\n public loginPassword = '';\r\n public showLoginForm = false;\r\n public showPassword = false;\r\n\r\n togglePasswordVisibility() {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n onToggleChat() {\r\n this.toggleChat.emit();\r\n }\r\n\r\n onToggleHistorySidebar() {\r\n console.log('History button clicked!');\r\n this.toggleHistorySidebar.emit();\r\n }\r\n\r\n onLoginClick() {\r\n this.loginClick.emit();\r\n this.showLoginForm = true;\r\n }\r\n\r\n onLoginSubmit() {\r\n if (this.loginUsername && this.loginPassword) {\r\n this.loginSubmit.emit({\r\n username: this.loginUsername,\r\n password: this.loginPassword,\r\n });\r\n }\r\n }\r\n\r\n onCancelLogin() {\r\n this.showLoginForm = false;\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onOpenSettings() {\r\n this.openSettings.emit();\r\n }\r\n\r\n onSuggestionClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n onSend(text: string) {\r\n this.send.emit(text);\r\n }\r\n\r\n onClearMessageError() {\r\n this.messageError = null;\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearAuthError() {\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearChat() {\r\n this.clearChat.emit();\r\n }\r\n\r\n onLogout() {\r\n this.logout.emit();\r\n }\r\n\r\n onSessionSelected(session: ChatSession) {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n onSessionDeleted(sessionId: string) {\r\n this.sessionDeleted.emit(sessionId);\r\n }\r\n\r\n onContinueAsGuest() {\r\n this.continueAsGuest.emit();\r\n }\r\n\r\n onPopoutShown(win: Window) {\r\n // Apply theme classes\r\n const activeTheme = this.themeService.activeTheme();\r\n console.log('Popout shown, applying theme:', activeTheme);\r\n\r\n const body = win.document.body;\r\n // We cannot use renderer easily on another document without custom renderer factory,\r\n // but native DOM manipulation is fine here since it's a separate window object.\r\n body.classList.remove('light-theme', 'dark-theme');\r\n body.classList.add(activeTheme);\r\n\r\n // Apply CSS variables\r\n this.themeService.applyCssVariables(body, this.themeConfig);\r\n }\r\n\r\n ngOnInit() {\r\n // Initialization logic if needed\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n //? Handle authentication status changes\r\n if (changes['isAuthenticated'] && this.isAuthenticated) {\r\n this.showLoginForm = false;\r\n }\r\n }\r\n\r\n ngOnDestroy() {}\r\n}\r\n","<div\r\n *ngIf=\"isChatOpen\"\r\n draggableDialog\r\n [enableDrag]=\"enableDrag\"\r\n [dragHandle]=\"'.chat-header'\"\r\n resizableDialog\r\n [enableResize]=\"enableResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n>\r\n <!-- chat window -->\r\n <div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img\r\n class=\"chat-logo\"\r\n style=\"width: 150px; height: 50px; margin-left: 0px\"\r\n [src]=\"appHeaderLogoUrl\"\r\n alt=\"Text-Logo\"\r\n />\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- New Chat Button -->\r\n <!-- <button class=\"header-button\" (click)=\"createNewChat()\">\r\n <mat-icon>add</mat-icon>\r\n </button> -->\r\n\r\n <!-- <app-dropdown-menu>\r\n <span trigger>☰</span>\r\n\r\n <app-menu-item (selected)=\"onToggleFullScreen()\"> My Profile </app-menu-item>\r\n\r\n <app-menu-item> Settings </app-menu-item>\r\n\r\n <app-menu-item> Logout </app-menu-item>\r\n </app-dropdown-menu> -->\r\n\r\n <!-- History Button -->\r\n <button\r\n class=\"header-button\"\r\n *ngIf=\"isAuthenticated\"\r\n (click)=\"onToggleHistorySidebar()\"\r\n title=\"Chat History\"\r\n >\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n\r\n <!-- settings Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu\">\r\n <mat-icon>{{ moreIcon }}</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>{{ minimizeIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <!-- <popout-window\r\n #popout\r\n [windowTitle]=\"appTitle || 'Chat'\"\r\n [windowWidth]=\"400\"\r\n [windowHeight]=\"620\"\r\n (shown)=\"onPopoutShown($event)\"\r\n > -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [sessions]=\"chatSessions\"\r\n [isOpen]=\"isHistorySidebarOpen\"\r\n [userName]=\"chatHistoryUserName\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (closed)=\"onToggleHistorySidebar()\"\r\n >\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen\">\r\n <!-- Messages / Welcome Screen -->\r\n <app-message-list\r\n *ngIf=\"!showLoginForm\"\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isGuestMode]=\"isGuestMode\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n (loginClick)=\"onLoginClick()\"\r\n (continueAsGuest)=\"onContinueAsGuest()\"\r\n ></app-message-list>\r\n\r\n <!-- SUGGESTED CHIPS: Show only if last bot message was fallback AND user is authenticated -->\r\n <app-chips\r\n *ngIf=\"showSuggestionChips && (isAuthenticated || isGuestMode)\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Chat Input: Only show when authenticated or guest mode -->\r\n <app-message-input\r\n *ngIf=\"isAuthenticated || isGuestMode\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n [sendIcon]=\"sendIcon\"\r\n (send)=\"onSend($event)\"\r\n ></app-message-input>\r\n\r\n <!-- Login Form -->\r\n\r\n <form\r\n *ngIf=\"showLoginForm && !isAuthenticated\"\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n #loginForm=\"ngForm\"\r\n >\r\n <h3 class=\"login-title\">Login to Doohbot</h3>\r\n\r\n <div class=\"login-fields\">\r\n <!-- Username Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Username</label>\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n #username=\"ngModel\"\r\n placeholder=\"Enter your username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n <span\r\n class=\"error-text\"\r\n *ngIf=\"username.invalid && (username.dirty || username.touched)\"\r\n >\r\n Username is required\r\n </span>\r\n </div>\r\n\r\n <!-- Password Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Password</label>\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n #password=\"ngModel\"\r\n placeholder=\"Enter your password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n <span\r\n class=\"error-text\"\r\n *ngIf=\"password.invalid && (password.dirty || password.touched)\"\r\n >\r\n Password is required\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button type=\"button\" (click)=\"onCancelLogin()\" class=\"auth-btn secondary\">Cancel</button>\r\n\r\n <button\r\n type=\"submit\"\r\n class=\"auth-btn primary\"\r\n [disabled]=\"loginForm.invalid || isLoggingIn\"\r\n >\r\n {{ isLoggingIn ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n </form>\r\n\r\n <!-- Auth error snackbar (login/logout errors only) -->\r\n <app-snackbar\r\n *ngIf=\"authError\"\r\n [message]=\"authError\"\r\n (closed)=\"onClearAuthError()\"\r\n ></app-snackbar>\r\n\r\n <!-- footer -->\r\n <div class=\"terms-conditions\">\r\n <a href=\"#\">Terms and Conditions</a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- </popout-window> -->\r\n</div>\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Change Theme -->\r\n <div class=\"theme-selector\">\r\n <!-- Auto Theme (inherits from parent app) -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'auto'\"\r\n (click)=\"themeService.setTheme('auto')\"\r\n >\r\n <mat-icon>brightness_auto</mat-icon>\r\n </button>\r\n\r\n <!-- Light Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'light'\"\r\n (click)=\"themeService.setTheme('light')\"\r\n >\r\n <mat-icon>light_mode</mat-icon>\r\n </button>\r\n\r\n <!-- Dark Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'dark'\"\r\n (click)=\"themeService.setTheme('dark')\"\r\n >\r\n <mat-icon>dark_mode</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Popout Button -->\r\n <!-- <button mat-menu-item (click)=\"popout.popOut()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>open_in_new</mat-icon>\r\n <span>Popout Widget</span>\r\n </button> -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>clear_all</mat-icon>\r\n <span>Clear Chat</span>\r\n </button>\r\n\r\n <!-- Logout -->\r\n <button\r\n mat-menu-item\r\n *ngIf=\"isAuthenticated\"\r\n (click)=\"onLogout()\"\r\n style=\"display: flex; align-items: center\"\r\n >\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n</mat-menu>\r\n","import { Directive, ElementRef, Input, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appFullscreen]',\r\n standalone: true,\r\n})\r\nexport class FullscreenDirective {\r\n private isFullScreen = false;\r\n private preFullscreenState: {\r\n width: string;\r\n height: string;\r\n left: string;\r\n top: string;\r\n } | null = null;\r\n\r\n @Input() fullscreenTarget: string = '.chat-window';\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n public toggle(): void {\r\n const targetEl = this.el.nativeElement.querySelector(this.fullscreenTarget);\r\n if (!targetEl) return;\r\n\r\n if (!this.isFullScreen) {\r\n this.preFullscreenState = {\r\n width: targetEl.style.width,\r\n height: targetEl.style.height,\r\n left: targetEl.style.left,\r\n top: targetEl.style.top,\r\n };\r\n\r\n targetEl.style.width = '';\r\n targetEl.style.height = '';\r\n targetEl.style.left = '';\r\n targetEl.style.top = '';\r\n targetEl.style.transform = '';\r\n\r\n this.isFullScreen = true;\r\n } else {\r\n this.isFullScreen = false;\r\n\r\n if (this.preFullscreenState) {\r\n targetEl.style.width = this.preFullscreenState.width || '400px';\r\n targetEl.style.height = this.preFullscreenState.height || '500px';\r\n targetEl.style.left = this.preFullscreenState.left || 'auto';\r\n targetEl.style.top = this.preFullscreenState.top || 'auto';\r\n targetEl.style.transform = 'none';\r\n }\r\n }\r\n }\r\n\r\n public getFullscreenState(): boolean {\r\n return this.isFullScreen;\r\n }\r\n}\r\n","// export const environment = {\r\n// staging: false,\r\n// development: false,\r\n// production: true,\r\n// chatApiUrl: 'https://api.production.com',\r\n// apiKey: '',\r\n// };\r\nexport const environment = {\r\n config: 'const/app-const.json',\r\n production: false,\r\n apiBaseUrl: '',\r\n loginEndpoint: '',\r\n apiSegment: 'api/v1/',\r\n};\r\n","import { Injectable } from '@angular/core';\r\nimport { environment } from './environments/environment';\r\nimport { environment as environmentprod } from './environments/environment';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AppConst {\r\n static data: any;\r\n\r\n constructor() {}\r\n\r\n async load(): Promise<any> {\r\n const filePath = `../assets/${environment.production ? environmentprod.config : environment.config}?t=${new Date().getTime()}`;\r\n const response = await fetch(filePath);\r\n\r\n console.error('============================ AppConst ============================', filePath);\r\n if (response.ok) {\r\n try {\r\n AppConst.data = await response.json();\r\n console.error(\r\n '============================ AppConst ============================',\r\n AppConst.data,\r\n );\r\n // Override apiBaseUrl if present in environment\r\n // if (environment.apiBaseUrl) {\r\n // AppConst.data.apiBaseUrl = environment.apiBaseUrl;\r\n // }\r\n // // Override loginEndpoint if present in environment\r\n // if (environment.loginEndpoint) {\r\n // AppConst.data.loginEndpoint = environment.loginEndpoint;\r\n // }\r\n } catch (error: any) {\r\n console.error('============================ ERROR ============================');\r\n console.error(`Could not find file ${filePath}.\\nMESSAGE: ${error.message}`);\r\n console.error('============================ ERROR ============================');\r\n }\r\n\r\n if (AppConst.data && !Object.keys(AppConst.data).length) {\r\n console.error('============================ ERROR ============================');\r\n console.error(`No data found in file ${filePath}`);\r\n console.error('============================ ERROR ============================');\r\n }\r\n } else {\r\n console.error('============================ ERROR ============================');\r\n console.error(\r\n `Failed to load file ${filePath}.\\nMESSAGE: Request failed with ${response.status} / ${response.statusText}`,\r\n );\r\n console.error('============================ ERROR ============================');\r\n }\r\n }\r\n}\r\n","import { ChatIntent } from './message';\r\n\r\nexport const CHAT_INTENTS: ChatIntent[] = [\r\n {\r\n patterns: ['hello', 'hi', 'hey', 'greetings', 'good morning', 'good afternoon', 'good evening'],\r\n response: '👋Hello! How can I help you today?',\r\n },\r\n {\r\n patterns: ['how are you', 'how are you doing'],\r\n response: \"I'm just a bot, but I'm doing great! How about you?\",\r\n },\r\n {\r\n patterns: ['help', 'support', 'problem', 'about', 'issue', 'question', 'assist', 'Contact'],\r\n response: 'Sure! Please tell me your issue, and I will try to assist you.',\r\n },\r\n {\r\n patterns: ['bye', 'goodbye', 'see you', 'thanks', 'thank you', 'bye bye', 'see you later'],\r\n response: 'Goodbye! Have a nice day!',\r\n },\r\n {\r\n patterns: ['news and updates', 'updates', 'news', 'new'],\r\n response: 'Stay tuned for the latest news and updates from our team!',\r\n },\r\n];\r\n","import { InjectionToken } from '@angular/core';\r\nimport { environment } from '../core/environments/environment.prod';\r\n\r\n/**\r\n * Configuration for Doohbot API integration\r\n */\r\nexport interface DoohbotApiConfig {\r\n /**\r\n * Backend API endpoint URL\r\n * Example: 'https://api.example.com/chat'\r\n */\r\n apiUrl: string;\r\n\r\n /**\r\n * Optional API key for authentication\r\n */\r\n apiKey?: string;\r\n\r\n /**\r\n * Request timeout in milliseconds\r\n * @default 30000 (30 seconds)\r\n */\r\n timeout?: number;\r\n\r\n /**\r\n * Enable API mode (true) or use local intent matching (false)\r\n * @default false\r\n */\r\n enableApi?: boolean;\r\n\r\n /**\r\n * Include message history in API requests\r\n * @default false\r\n */\r\n includeHistory?: boolean;\r\n\r\n /**\r\n * Maximum number of history messages to include in requests\r\n * @default 10\r\n */\r\n maxHistoryMessages?: number;\r\n\r\n /**\r\n * Custom headers to include in API requests\r\n */\r\n customHeaders?: Record<string, string>;\r\n\r\n /**\r\n * Enable retry on failure\r\n * @default true\r\n */\r\n enableRetry?: boolean;\r\n\r\n /**\r\n * Number of retry attempts\r\n * @default 2\r\n */\r\n retryAttempts?: number;\r\n\r\n /**\r\n * Delay between retries in milliseconds\r\n * @default 1000\r\n */\r\n retryDelay?: number;\r\n}\r\n\r\n/**\r\n * Injection token for providing Doohbot API configuration\r\n */\r\nexport const DOOHBOT_API_CONFIG = new InjectionToken<DoohbotApiConfig>('DOOHBOT_API_CONFIG', {\r\n providedIn: 'root',\r\n factory: () => ({\r\n apiUrl: '',\r\n timeout: 30000,\r\n enableApi: false,\r\n includeHistory: false,\r\n maxHistoryMessages: 10,\r\n enableRetry: true,\r\n retryAttempts: 2,\r\n retryDelay: 1000,\r\n }),\r\n});\r\n","import { Injectable, signal, computed, effect } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\n\r\nimport { ChatContext } from '../../model/chat-context.model';\r\n\r\nexport interface ContextChangeEvent {\r\n previous: ChatContext | null;\r\n current: ChatContext;\r\n contextKey: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TenantContextService {\r\n // Current context state\r\n private platformTenant = signal<string>('');\r\n private subTenant = signal<string>('');\r\n private agent = signal<string>('');\r\n\r\n // Computed context object\r\n public currentContext = computed<ChatContext>(() => ({\r\n platformTenant: this.platformTenant(),\r\n subTenant: this.subTenant(),\r\n agent: this.agent(),\r\n }));\r\n\r\n // Computed unique context key for storage\r\n public contextKey = computed<string>(() => {\r\n const pt = this.platformTenant() || 'default';\r\n const st = this.subTenant() || 'default';\r\n const ag = this.agent() || 'default';\r\n return `${pt}_${st}_${ag}`;\r\n });\r\n\r\n // Observable for context changes\r\n private contextChangeSubject = new Subject<ContextChangeEvent>();\r\n public contextChange$ = this.contextChangeSubject.asObservable();\r\n\r\n private previousContext: ChatContext | null = null;\r\n\r\n constructor() {\r\n // Effect to emit context changes\r\n effect(() => {\r\n const current = this.currentContext();\r\n const key = this.contextKey();\r\n\r\n // Only emit if context actually changed\r\n if (this.hasContextChanged(current)) {\r\n this.contextChangeSubject.next({\r\n previous: this.previousContext,\r\n current: current,\r\n contextKey: key,\r\n });\r\n this.previousContext = { ...current };\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the complete context\r\n */\r\n public setContext(context: Partial<ChatContext>): void {\r\n if (context.platformTenant !== undefined) {\r\n this.platformTenant.set(context.platformTenant);\r\n }\r\n if (context.subTenant !== undefined) {\r\n this.subTenant.set(context.subTenant);\r\n }\r\n if (context.agent !== undefined) {\r\n this.agent.set(context.agent);\r\n }\r\n }\r\n\r\n /**\r\n * Update individual context properties\r\n */\r\n public setPlatformTenant(platformTenant: string): void {\r\n this.platformTenant.set(platformTenant);\r\n }\r\n\r\n public setSubTenant(subTenant: string): void {\r\n this.subTenant.set(subTenant);\r\n }\r\n\r\n public setAgent(agent: string): void {\r\n this.agent.set(agent);\r\n }\r\n\r\n /**\r\n * Get current context values\r\n */\r\n public getPlatformTenant(): string {\r\n return this.platformTenant();\r\n }\r\n\r\n public getSubTenant(): string {\r\n return this.subTenant();\r\n }\r\n\r\n public getAgent(): string {\r\n return this.agent();\r\n }\r\n\r\n public getContextKey(): string {\r\n return this.contextKey();\r\n }\r\n\r\n public getContext(): ChatContext {\r\n return this.currentContext();\r\n }\r\n\r\n /**\r\n * Check if context has changed\r\n */\r\n private hasContextChanged(current: ChatContext): boolean {\r\n if (!this.previousContext) {\r\n // First time initialization - only emit if we have valid values\r\n return current.platformTenant !== '' || current.subTenant !== '' || current.agent !== '';\r\n }\r\n\r\n return (\r\n this.previousContext.platformTenant !== current.platformTenant ||\r\n this.previousContext.subTenant !== current.subTenant ||\r\n this.previousContext.agent !== current.agent\r\n );\r\n }\r\n\r\n /**\r\n * Reset context to default\r\n */\r\n public resetContext(): void {\r\n this.platformTenant.set('');\r\n this.subTenant.set('');\r\n this.agent.set('');\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, throwError, timer } from 'rxjs';\r\nimport { catchError, retry, timeout, map } from 'rxjs/operators';\r\nimport { DOOHBOT_API_CONFIG, DoohbotApiConfig } from '../../model/api-config.model';\r\nimport { ChatApiRequest, ChatApiResponse, ChatApiError } from '../../model/api-request.model';\r\nimport { Message } from '../../model/message';\r\nimport { TenantContextService } from './tenant-context.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatbotApiService {\r\n private http = inject(HttpClient);\r\n private tenantContext = inject(TenantContextService);\r\n private config = inject(DOOHBOT_API_CONFIG);\r\n\r\n /**\r\n * Send a chat message to the API\r\n * @param message User's message text\r\n * @param history Optional message history for context\r\n * @returns Observable of the API response\r\n */\r\n sendMessage(message: string, history?: Message[]): Observable<ChatApiResponse> {\r\n if (!this.config.apiUrl) {\r\n return throwError(\r\n () =>\r\n ({\r\n message: 'API URL not configured',\r\n code: 'CONFIG_ERROR',\r\n }) as ChatApiError,\r\n );\r\n }\r\n\r\n // Build request payload with tenant context\r\n const request = this.buildRequest(message, history);\r\n\r\n // Build headers\r\n const headers = this.buildHeaders();\r\n\r\n // Configure timeout\r\n const timeoutMs = this.config.timeout || 30000;\r\n\r\n // Make HTTP request\r\n return this.http.post<ChatApiResponse>(this.config.apiUrl, request, { headers }).pipe(\r\n timeout(timeoutMs),\r\n this.applyRetryStrategy(),\r\n map((response) => this.validateResponse(response)),\r\n catchError((error) => this.handleError(error)),\r\n );\r\n }\r\n\r\n /**\r\n * Build request payload with current tenant context\r\n */\r\n private buildRequest(message: string, history?: Message[]): ChatApiRequest {\r\n const context = this.tenantContext.getContext();\r\n\r\n const request: ChatApiRequest = {\r\n message,\r\n platformTenant: context.platformTenant,\r\n subTenant: context.subTenant,\r\n agent: context.agent,\r\n timestamp: new Date().toISOString(),\r\n };\r\n\r\n // Include history if enabled and provided\r\n if (this.config.includeHistory && history && history.length > 0) {\r\n const maxMessages = this.config.maxHistoryMessages || 10;\r\n request.history = history.slice(-maxMessages);\r\n }\r\n\r\n return request;\r\n }\r\n\r\n /**\r\n * Build HTTP headers\r\n */\r\n private buildHeaders(): HttpHeaders {\r\n let headers = new HttpHeaders({\r\n 'Content-Type': 'application/json',\r\n });\r\n\r\n // Add API key if provided\r\n if (this.config.apiKey) {\r\n headers = headers.set('Authorization', `Bearer ${this.config.apiKey}`);\r\n }\r\n\r\n // Add custom headers if provided\r\n if (this.config.customHeaders) {\r\n Object.entries(this.config.customHeaders).forEach(([key, value]) => {\r\n headers = headers.set(key, value);\r\n });\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Apply retry strategy based on configuration\r\n */\r\n private applyRetryStrategy() {\r\n return (source: Observable<ChatApiResponse>) => {\r\n if (!this.config.enableRetry) {\r\n return source;\r\n }\r\n\r\n const retryAttempts = this.config.retryAttempts || 2;\r\n const retryDelay = this.config.retryDelay || 1000;\r\n\r\n return source.pipe(\r\n retry({\r\n count: retryAttempts,\r\n delay: (error, retryCount) => {\r\n // Only retry on network errors or 5xx server errors\r\n if (this.shouldRetry(error)) {\r\n console.warn(`Retrying API request (attempt ${retryCount}/${retryAttempts})...`);\r\n return timer(retryDelay * retryCount);\r\n }\r\n // Don't retry on client errors (4xx)\r\n return throwError(() => error);\r\n },\r\n }),\r\n );\r\n };\r\n }\r\n\r\n /**\r\n * Determine if error should trigger a retry\r\n */\r\n private shouldRetry(error: any): boolean {\r\n if (error instanceof HttpErrorResponse) {\r\n // Retry on network errors or 5xx server errors\r\n return error.status === 0 || error.status >= 500;\r\n }\r\n // Retry on timeout errors\r\n if (error.name === 'TimeoutError') {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Validate API response\r\n */\r\n private validateResponse(response: ChatApiResponse): ChatApiResponse {\r\n if (!response || !response.reply) {\r\n throw {\r\n message: 'Invalid API response: missing reply field',\r\n code: 'INVALID_RESPONSE',\r\n } as ChatApiError;\r\n }\r\n return response;\r\n }\r\n\r\n /**\r\n * Handle API errors\r\n */\r\n private handleError(error: any): Observable<never> {\r\n let apiError: ChatApiError;\r\n\r\n if (error instanceof HttpErrorResponse) {\r\n // HTTP error\r\n apiError = {\r\n message: error.error?.message || error.message || 'API request failed',\r\n code: error.error?.code || 'HTTP_ERROR',\r\n statusCode: error.status,\r\n details: error.error,\r\n };\r\n } else if (error.name === 'TimeoutError') {\r\n // Timeout error\r\n apiError = {\r\n message: 'Request timeout - please try again',\r\n code: 'TIMEOUT',\r\n statusCode: 408,\r\n };\r\n } else {\r\n // Other errors\r\n apiError = {\r\n message: error.message || 'Unknown error occurred',\r\n code: error.code || 'UNKNOWN_ERROR',\r\n details: error,\r\n };\r\n }\r\n\r\n console.error('Chatbot API Error:', apiError);\r\n return throwError(() => apiError);\r\n }\r\n\r\n /**\r\n * Check if API is enabled\r\n */\r\n isApiEnabled(): boolean {\r\n return this.config.enableApi === true && !!this.config.apiUrl;\r\n }\r\n\r\n /**\r\n * Get current API configuration\r\n */\r\n getConfig(): DoohbotApiConfig {\r\n return { ...this.config };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Message } from '../../model/message';\r\nimport { ChatSession } from '../../model/chat-session.model';\r\nimport { Observable, of } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatHistoryService {\r\n private readonly STORAGE_PREFIX = 'doohbot_sessions_';\r\n private readonly LEGACY_PREFIX = 'doohbot_history_';\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Create a new chat session\r\n */\r\n createSession(contextKey: string, userId: string): ChatSession {\r\n const session: ChatSession = {\r\n id: this.generateSessionId(),\r\n timestamp: new Date(),\r\n title: 'New Conversation',\r\n messages: [],\r\n contextKey,\r\n userId,\r\n };\r\n return session;\r\n }\r\n\r\n /**\r\n * Check if user is a guest/anonymous user who shouldn't have chat history\r\n */\r\n private isGuestUser(userId: string): boolean {\r\n const guestUserIds = ['anonymous', 'guest', 'default', ''];\r\n return guestUserIds.includes(userId.toLowerCase());\r\n }\r\n\r\n /**\r\n * Save a message to a specific session\r\n */\r\n saveMessageToSession(session: ChatSession, message: Message): Observable<void> {\r\n // Don't save history for guest users\r\n if (this.isGuestUser(session.userId)) {\r\n return of(void 0);\r\n }\r\n\r\n // Update title from first user message if still default\r\n if (session.title === 'New Conversation' && message.sender === 'user') {\r\n session.title = this.generateTitle(message.text);\r\n }\r\n\r\n session.messages.push(message);\r\n return this.saveSession(session);\r\n }\r\n\r\n /**\r\n * Save entire session\r\n */\r\n saveSession(session: ChatSession): Observable<void> {\r\n // Don't save history for guest users\r\n if (this.isGuestUser(session.userId)) {\r\n return of(void 0);\r\n }\r\n\r\n const key = this.getSessionStorageKey(session.contextKey, session.userId);\r\n const sessions = this.loadAllSessionsSync(session.contextKey, session.userId);\r\n\r\n const existingIndex = sessions.findIndex((s) => s.id === session.id);\r\n if (existingIndex >= 0) {\r\n sessions[existingIndex] = session;\r\n } else {\r\n sessions.push(session);\r\n }\r\n\r\n localStorage.setItem(key, JSON.stringify(sessions));\r\n return of(void 0);\r\n }\r\n\r\n /**\r\n * Load all sessions for a context and user\r\n */\r\n loadAllSessions(contextKey: string, userId: string): Observable<ChatSession[]> {\r\n return of(this.loadAllSessionsSync(contextKey, userId));\r\n }\r\n\r\n /**\r\n * Load all sessions synchronously (for internal use)\r\n */\r\n private loadAllSessionsSync(contextKey: string, userId: string): ChatSession[] {\r\n // Don't load history for guest users\r\n if (this.isGuestUser(userId)) {\r\n return [];\r\n }\r\n\r\n const key = this.getSessionStorageKey(contextKey, userId);\r\n const stored = localStorage.getItem(key);\r\n\r\n if (stored) {\r\n try {\r\n const sessions = JSON.parse(stored);\r\n // Restore Date objects\r\n return sessions.map((s: any) => ({\r\n ...s,\r\n timestamp: new Date(s.timestamp),\r\n messages: s.messages.map((m: any) => ({\r\n ...m,\r\n timestamp: m.timestamp ? new Date(m.timestamp) : undefined,\r\n })),\r\n }));\r\n } catch (e) {\r\n console.error('Failed to parse sessions', e);\r\n return [];\r\n }\r\n }\r\n\r\n // Try to migrate from legacy format\r\n return this.migrateLegacyData(contextKey, userId);\r\n }\r\n\r\n /**\r\n * Load a specific session\r\n */\r\n loadSession(\r\n sessionId: string,\r\n contextKey: string,\r\n userId: string,\r\n ): Observable<ChatSession | null> {\r\n const sessions = this.loadAllSessionsSync(contextKey, userId);\r\n const session = sessions.find((s) => s.id === sessionId);\r\n return of(session || null);\r\n }\r\n\r\n /**\r\n * Delete a session\r\n */\r\n deleteSession(sessionId: string, contextKey: string, userId: string): Observable<void> {\r\n const key = this.getSessionStorageKey(contextKey, userId);\r\n const sessions = this.loadAllSessionsSync(contextKey, userId);\r\n const filtered = sessions.filter((s) => s.id !== sessionId);\r\n\r\n localStorage.setItem(key, JSON.stringify(filtered));\r\n return of(void 0);\r\n }\r\n\r\n /**\r\n * Clear all sessions for a context and user\r\n */\r\n clearAllSessions(contextKey: string, userId: string): Observable<void> {\r\n const key = this.getSessionStorageKey(contextKey, userId);\r\n localStorage.removeItem(key);\r\n return of(void 0);\r\n }\r\n\r\n /**\r\n * Generate a unique session ID for a session\r\n */\r\n private generateSessionId(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return `session_${crypto.randomUUID()}`;\r\n }\r\n // Fallback\r\n return `session_${Date.now()}_${this.generateRandomString(16)}`;\r\n }\r\n\r\n private generateRandomString(length: number): string {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let result = '';\r\n const randomArray = new Uint8Array(length);\r\n crypto.getRandomValues(randomArray);\r\n for (let i = 0; i < length; i++) {\r\n result += chars[randomArray[i] % chars.length];\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Generate a title from the first message\r\n */\r\n private generateTitle(text: string): string {\r\n const maxLength = 30;\r\n if (text.length <= maxLength) {\r\n return text;\r\n }\r\n return text.substring(0, maxLength) + '...';\r\n }\r\n\r\n /**\r\n * Get storage key for sessions\r\n */\r\n private getSessionStorageKey(contextKey: string, userId: string): string {\r\n return `${this.STORAGE_PREFIX}${contextKey}_${userId}`;\r\n }\r\n\r\n /**\r\n * Migrate legacy flat message history to session format\r\n */\r\n private migrateLegacyData(contextKey: string, userId: string): ChatSession[] {\r\n const legacyKey = `${this.LEGACY_PREFIX}${contextKey}_${userId}`;\r\n const stored = localStorage.getItem(legacyKey);\r\n\r\n if (!stored) {\r\n return [];\r\n }\r\n\r\n try {\r\n const messages = JSON.parse(stored);\r\n if (messages.length === 0) {\r\n return [];\r\n }\r\n\r\n // Create a single session from legacy messages\r\n const session: ChatSession = {\r\n id: this.generateSessionId(),\r\n timestamp: messages[0].timestamp ? new Date(messages[0].timestamp) : new Date(),\r\n title: 'Migrated Conversation',\r\n messages: messages.map((m: any) => ({\r\n ...m,\r\n timestamp: m.timestamp ? new Date(m.timestamp) : undefined,\r\n })),\r\n contextKey,\r\n userId,\r\n };\r\n\r\n // Save as new format\r\n this.saveSession(session).subscribe();\r\n\r\n // Remove legacy data\r\n localStorage.removeItem(legacyKey);\r\n\r\n return [session];\r\n } catch (e) {\r\n console.error('Failed to migrate legacy data', e);\r\n return [];\r\n }\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, delay, retry, map, catchError, of } from 'rxjs';\r\nimport { AppConst } from '../app-const';\r\nimport { environment } from '../environments/environment.prod';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpService {\r\n // @BlockUI() blockUI!: NgBlockUI;\r\n\r\n apiUrl: string;\r\n\r\n constructor(private http: HttpClient) {\r\n this.apiUrl = `${AppConst?.data?.apiBaseUrl}${AppConst?.data?.apiSegment}`;\r\n // this.apiUrl = `${environment.apiBaseUrl}${environment.apiSegment}`;\r\n\r\n console.log('HttpService: Initialized', this.apiUrl);\r\n }\r\n\r\n get(\r\n url: string,\r\n param?: object,\r\n nestedParam = false,\r\n showLoader = false,\r\n refresh = true,\r\n ): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n\r\n // this.blockUI.start();\r\n\r\n // }\r\n\r\n let params = {};\r\n\r\n if (nestedParam) {\r\n this.buildHttpParams(params, param, '');\r\n } else {\r\n params = param as HttpParams;\r\n }\r\n\r\n return this.http.get(`${this.apiUrl}${url}`, { params: params, withCredentials: true }).pipe(\r\n delay(100),\r\n\r\n retry(0),\r\n\r\n map((response) => this.returnResponse(response, showLoader)),\r\n\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n\r\n // this.blockUI.stop();\r\n\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n private buildHttpParams(params: any, data: any, currentPath: string) {\r\n Object.keys(data).forEach((key) => {\r\n if (data[key] instanceof Object && !(data[key] instanceof Array)) {\r\n this.buildHttpParams(params, data[key], `${currentPath}${key}.`);\r\n } else {\r\n params[`${currentPath}${key}`] = data[key];\r\n }\r\n });\r\n }\r\n\r\n post(url: string, param?: object, showLoader = false): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n\r\n // this.blockUI.start();\r\n\r\n // }\r\n\r\n return this.http.post(`${this.apiUrl}${url}`, param as HttpParams).pipe(\r\n delay(100),\r\n\r\n retry(0),\r\n\r\n map((response: any) => this.returnResponse(response, showLoader)),\r\n\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n\r\n // this.blockUI.stop();\r\n\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n private returnResponse(value: any, showLoader: boolean = true): any {\r\n // if (showLoader && this.blockUI.isActive) {\r\n\r\n // this.blockUI.reset();\r\n\r\n // }\r\n\r\n return value;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpService } from './http.service';\r\nimport { AuthResult } from '../models/auth-result.model';\r\nimport { ApiResponse } from '../models/api-response.model';\r\nimport { LoginRequest } from '../models/login-request.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AccountService {\r\n constructor(private http: HttpService) {}\r\n\r\n login(param?: LoginRequest, showLoader = false): Observable<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/login', param, showLoader);\r\n }\r\n\r\n logout(refreshToken: string, showLoader = false): Observable<ApiResponse<any>> {\r\n return this.http.post('auth/logout', { refresh_token: refreshToken }, showLoader);\r\n }\r\n\r\n startChat(param?: object, showLoader = false): Observable<ApiResponse<any>> {\r\n return this.http.post('chat/ask', param, showLoader);\r\n }\r\n\r\n getChatHistory(param?: object, showLoader = false): Observable<ApiResponse<any>> {\r\n return this.http.get('chat/history', param, showLoader);\r\n }\r\n\r\n deleteHistory(param?: object, showLoader = false): Observable<ApiResponse<any>> {\r\n return this.http.post('chat/history', param, showLoader);\r\n }\r\n\r\n refreshLogin(param?: object, showLoader = false): Observable<ApiResponse<AuthResult>> {\r\n return this.http.post('Account/RefreshToken', param, showLoader);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CryptoHelperService {\r\n private encoder = new TextEncoder();\r\n private decoder = new TextDecoder();\r\n private secretKey = ''; // Will be set by AuthService\r\n\r\n setSecretKey(key: string) {\r\n this.secretKey = key;\r\n }\r\n\r\n private async getKey() {\r\n const salt = this.encoder.encode('fixed_salt'); // Keep constant\r\n const baseKey = await crypto.subtle.importKey(\r\n 'raw',\r\n this.encoder.encode(this.secretKey),\r\n 'PBKDF2',\r\n false,\r\n ['deriveKey'],\r\n );\r\n\r\n return crypto.subtle.deriveKey(\r\n {\r\n name: 'PBKDF2',\r\n salt,\r\n iterations: 100000,\r\n hash: 'SHA-256',\r\n },\r\n baseKey,\r\n { name: 'AES-GCM', length: 256 },\r\n false,\r\n ['encrypt', 'decrypt'],\r\n );\r\n }\r\n\r\n async encrypt(value: string): Promise<string | null> {\r\n if (!value) return null;\r\n\r\n const key = await this.getKey();\r\n const iv = crypto.getRandomValues(new Uint8Array(12));\r\n\r\n const encrypted = await crypto.subtle.encrypt(\r\n { name: 'AES-GCM', iv },\r\n key,\r\n this.encoder.encode(value),\r\n );\r\n\r\n const merged = new Uint8Array(iv.length + encrypted.byteLength);\r\n merged.set(iv, 0);\r\n merged.set(new Uint8Array(encrypted), iv.length);\r\n\r\n return btoa(String.fromCharCode(...merged));\r\n }\r\n\r\n async decrypt(value: string): Promise<string | null> {\r\n if (!value) return null;\r\n\r\n const raw = Uint8Array.from(atob(value), (c) => c.charCodeAt(0));\r\n\r\n const iv = raw.slice(0, 12);\r\n const data = raw.slice(12);\r\n\r\n const key = await this.getKey();\r\n\r\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, data);\r\n\r\n return this.decoder.decode(decrypted);\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { AppConst } from '../app-const';\r\nimport { map, Observable } from 'rxjs';\r\nimport { AuthResult } from '../models/auth-result.model';\r\nimport * as CryptoJS from 'crypto-js';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { Router } from '@angular/router';\r\nimport { CryptoHelperService } from '../helpers/crypto-helper.service';\r\n\r\n//!! inherit Window storageEventAdded for duplicate tab detection\r\ndeclare global {\r\n interface Window {\r\n storageEventAdded?: boolean;\r\n tabCLoseEventAdded?: boolean;\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService {\r\n apiUrl: string;\r\n storageKey: string;\r\n secretKey: string;\r\n companyCode: string;\r\n jwtHelper: JwtHelperService = new JwtHelperService();\r\n\r\n constructor(\r\n private router: Router,\r\n private http: HttpClient,\r\n private cryptoHelper: CryptoHelperService,\r\n // private cacheService: NgxCacheService,\r\n // private snackBar: MatSnackBar,\r\n ) {\r\n this.apiUrl = `${AppConst?.data?.apiBaseUrl}${AppConst?.data?.apiSegment}`;\r\n this.storageKey = AppConst?.data?.storageKey;\r\n this.secretKey = AppConst?.data?.secretKey;\r\n this.companyCode = AppConst?.data?.companyCode;\r\n this.cryptoHelper.setSecretKey(this.secretKey);\r\n }\r\n\r\n logout(): Observable<boolean> {\r\n const url = `${this.apiUrl}Account/Logout`;\r\n return this.http.post(url, {}).pipe(\r\n map((response: any) => {\r\n if (response && response.success) {\r\n this.clearAuth();\r\n // this.redirectOut();\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }),\r\n );\r\n }\r\n\r\n // redirectIn() {\r\n // let redirectUrl = this.getCurrentNavigationUrl();\r\n // redirectUrl = redirectUrl || AppConst?.data?.redirectUrl || '/login';\r\n // this.router.navigate([redirectUrl], { replaceUrl: true });\r\n // }\r\n\r\n // redirectOut() {\r\n // this.router.navigate(['/login'], { replaceUrl: true });\r\n // }\r\n\r\n // Utility\r\n setSession(session: AuthResult) {\r\n const user = this.jwtHelper.decodeToken(session.access_token);\r\n this.setLocalStorage('access_token', session.access_token);\r\n this.setLocalStorage('refresh_token', session.refresh_token);\r\n this.setLocalStorage('user_id', Number(user?.user_id));\r\n this.setLocalStorage('username', user?.username);\r\n this.setLocalStorage('roles', Number(user?.roles));\r\n this.setLocalStorage('permissions', Number(user?.permissions));\r\n this.setLocalStorage('company_id', user?.company_id);\r\n this.setLocalStorage('office_id', user?.office_id);\r\n }\r\n\r\n setLocalStorage(key: string, value: any) {\r\n const data = localStorage.getItem(this.storageKey);\r\n if (data) {\r\n let dataDec = this.decrypt(data);\r\n let dataJson = JSON.parse(dataDec ?? '{}');\r\n dataJson = Object.assign(dataJson, { [key]: value });\r\n localStorage.setItem(this.storageKey, this.encrypt(JSON.stringify(dataJson)));\r\n } else {\r\n let dataNew = Object.assign({}, { [key]: value });\r\n let dataEnc = this.encrypt(JSON.stringify(dataNew));\r\n localStorage.setItem(this.storageKey, dataEnc);\r\n }\r\n }\r\n\r\n getLocalStorage(key: string) {\r\n const data = localStorage.getItem(this.storageKey);\r\n if (data) {\r\n let dataDec = this.decrypt(data);\r\n let dataJson = JSON.parse(dataDec ?? '{}');\r\n return dataJson![key] || null;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n isAuthenticated(): boolean {\r\n let token = this.getLocalStorage('access_token');\r\n if (token && !this.isTokenExpired()) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n isTokenExpired(): boolean {\r\n let token = (this.getLocalStorage('access_token') ?? '') as string;\r\n if (token) {\r\n return this.jwtHelper.isTokenExpired(token);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n encrypt(value: string): any {\r\n if (value) {\r\n return CryptoJS.AES.encrypt(value, this.secretKey);\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n decrypt(value: string) {\r\n if (value) {\r\n let bytes = CryptoJS.AES.decrypt(value, this.secretKey);\r\n let decryptedText = bytes.toString(CryptoJS.enc.Utf8);\r\n return decryptedText;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n clearAuth() {\r\n this.clearSession();\r\n this.clearStorage();\r\n this.clearCache();\r\n }\r\n\r\n clearSession() {\r\n sessionStorage.clear();\r\n }\r\n\r\n clearTabInfo() {\r\n localStorage.removeItem('tabs');\r\n }\r\n\r\n clearStorage() {\r\n localStorage.clear();\r\n }\r\n\r\n clearCache() {\r\n // this.cacheService.clearCache();\r\n }\r\n\r\n getUserId() {\r\n return this.getLocalStorage('user_id') || 0;\r\n }\r\n}\r\n","import { Injectable, signal, inject } from '@angular/core';\r\nimport { Message } from '../../model/message';\r\nimport { ChatSession } from '../../model/chat-session.model';\r\nimport { CHAT_INTENTS } from '../../model/doohbot.intents';\r\nimport { ChatApiError } from '../../model/api-request.model';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { ChatbotApiService } from '../../core/services/doohbot-api.service';\r\nimport { UserContext } from '../../core/models/user-context.model';\r\nimport { ChatHistoryService } from '../../core/services/chat-history.service';\r\nimport { AccountService } from '../../core/services/account.service';\r\nimport { AuthService } from '../../core/services/auth.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MessageService {\r\n // Context-aware message storage\r\n private currentContextKey = signal<string>('default');\r\n\r\n // Public messages signal for current context\r\n public messages = signal<Message[]>([]);\r\n public audioUnlocked = false;\r\n\r\n // Active session\r\n private activeSession: ChatSession | null = null;\r\n\r\n // API service (optional)\r\n private apiService = inject(ChatbotApiService, { optional: true });\r\n private chatHistoryService = inject(ChatHistoryService);\r\n\r\n // User context for backend proxy mode\r\n private userContext?: UserContext;\r\n\r\n // API state signals\r\n public isLoadingApi = signal<boolean>(false);\r\n public apiError = signal<ChatApiError | null>(null);\r\n public isBotTyping = signal<boolean>(false);\r\n public isGuestMode = signal<boolean>(false);\r\n\r\n constructor() {\r\n // Start with empty messages - no auto-load\r\n }\r\n\r\n setGuestMode(isGuest: boolean) {\r\n this.isGuestMode.set(isGuest);\r\n }\r\n\r\n /**\r\n * Switch to a new context\r\n */\r\n public switchContext(contextKey: string): void {\r\n this.currentContextKey.set(contextKey);\r\n // Start fresh - don't auto-load\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Start a new chat session\r\n */\r\n public startNewSession(): void {\r\n const contextKey = this.currentContextKey();\r\n const userId = this.userContext?.userId || 'anonymous';\r\n\r\n this.activeSession = this.chatHistoryService.createSession(contextKey, userId);\r\n this.messages.set([]);\r\n }\r\n\r\n /**\r\n * Load an existing session\r\n */\r\n public loadSession(session: ChatSession): void {\r\n this.activeSession = session;\r\n this.messages.set([...session.messages]);\r\n }\r\n\r\n /**\r\n * Get current context key\r\n */\r\n public getCurrentContextKey(): string {\r\n return this.currentContextKey();\r\n }\r\n\r\n /**\r\n * Set user context for backend proxy mode\r\n */\r\n public setUserContext(context: UserContext): void {\r\n this.userContext = context;\r\n // Start fresh when user changes - don't auto-load\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Get current user context\r\n */\r\n public getUserContext(): UserContext | undefined {\r\n return this.userContext;\r\n }\r\n\r\n /**\r\n * Get active session\r\n */\r\n public getActiveSession(): ChatSession | null {\r\n return this.activeSession;\r\n }\r\n\r\n /**\r\n * Clear messages for current session and start new one\r\n */\r\n clearMessages(): void {\r\n this.messages.set([]);\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Add message to current session\r\n */\r\n public addMessage(message: Message): void {\r\n const newMessage = { ...message, timestamp: new Date() };\r\n\r\n // Update current messages signal\r\n this.messages.update((msgs) => [...msgs, newMessage]);\r\n\r\n // Save to active session\r\n if (this.activeSession) {\r\n console.log('Saving message to session:', this.activeSession.id);\r\n this.chatHistoryService.saveMessageToSession(this.activeSession, newMessage).subscribe(() => {\r\n console.log('Message saved, session title:', this.activeSession?.title);\r\n });\r\n } else {\r\n console.warn('No active session to save message to!');\r\n }\r\n\r\n if (message.sender === 'bot') {\r\n this.playBotSound();\r\n }\r\n }\r\n\r\n /**\r\n * Get bot reply - supports both API and local modes\r\n */\r\n async getBotReply(userText: string): Promise<string> {\r\n // If in guest mode, force local logic\r\n if (this.isGuestMode()) {\r\n return this.getBotReplyLocal(userText);\r\n }\r\n\r\n // Get auth service to check if user is authenticated\r\n const authService = inject(AuthService, { optional: true });\r\n const isAuthenticated = authService?.isAuthenticated() || false;\r\n\r\n // Call API if user is authenticated\r\n if (isAuthenticated) {\r\n return this.getBotReplyFromApi(userText);\r\n }\r\n\r\n // Fall back to local intent matching\r\n return this.getBotReplyLocal(userText);\r\n }\r\n\r\n /**\r\n * Get bot reply from API\r\n */\r\n private async getBotReplyFromApi(userText: string): Promise<string> {\r\n // Inject AccountService dynamically\r\n const accountService = inject(AccountService, { optional: true });\r\n\r\n if (!accountService) {\r\n console.error('AccountService not available, falling back to local');\r\n return this.getBotReplyLocal(userText);\r\n }\r\n\r\n try {\r\n this.isLoadingApi.set(true);\r\n this.apiError.set(null);\r\n\r\n // Call chat API endpoint\r\n const response = await firstValueFrom(accountService.startChat({ message: userText }));\r\n\r\n this.isLoadingApi.set(false);\r\n\r\n if (response && response.success && response.data) {\r\n return response.data.reply || response.data.message || this.getFallbackReply();\r\n }\r\n\r\n return this.getFallbackReply();\r\n } catch (error) {\r\n this.isLoadingApi.set(false);\r\n const apiError = error as ChatApiError;\r\n this.apiError.set(apiError);\r\n console.error('API error, falling back to local mode:', apiError);\r\n\r\n // Fallback to local mode on API error\r\n return this.getBotReplyLocal(userText);\r\n }\r\n }\r\n\r\n /**\r\n * Get bot reply using local intent matching\r\n */\r\n private getBotReplyLocal(userText: string): string {\r\n const text = userText.toLowerCase();\r\n for (const intent of CHAT_INTENTS) {\r\n if (intent.patterns.some((pattern) => text.includes(pattern))) {\r\n return intent.response;\r\n }\r\n }\r\n return this.getFallbackReply();\r\n }\r\n\r\n /**\r\n * Process a user message: add it, get bot reply, and add bot reply\r\n */\r\n public async processUserMessage(text: string): Promise<void> {\r\n this.addMessage({\r\n sender: 'user',\r\n text: text,\r\n id: Date.now().toString(),\r\n timestamp: new Date(),\r\n });\r\n\r\n this.isBotTyping.set(true);\r\n\r\n const minDelay = 1000;\r\n const start = Date.now();\r\n\r\n try {\r\n const botReply = await this.getBotReply(text);\r\n\r\n // Ensure minimum delay\r\n const elapsed = Date.now() - start;\r\n if (elapsed < minDelay) {\r\n await new Promise((resolve) => setTimeout(resolve, minDelay - elapsed));\r\n }\r\n\r\n const isFallback = botReply === this.getFallbackReply();\r\n this.addMessage({\r\n sender: 'bot',\r\n text: botReply,\r\n id: Date.now().toString(),\r\n showSuggestions: isFallback,\r\n });\r\n } catch (error) {\r\n console.error('Error getting bot reply:', error);\r\n this.addMessage({\r\n sender: 'bot',\r\n text: this.getFallbackReply(),\r\n id: Date.now().toString(),\r\n showSuggestions: true,\r\n });\r\n } finally {\r\n this.isBotTyping.set(false);\r\n }\r\n }\r\n\r\n getFallbackReply(): string {\r\n return \"I'm sorry 😔, I didn't understand that.\";\r\n }\r\n\r\n isFallbackIntent(userText: string): boolean {\r\n const text = userText.toLowerCase();\r\n return !CHAT_INTENTS.some((intent) =>\r\n intent.patterns.some((pattern) => text.includes(pattern)),\r\n );\r\n }\r\n\r\n public unlockAudio(): void {\r\n if (this.audioUnlocked) return;\r\n const audio = new Audio();\r\n audio.volume = 1.0;\r\n audio\r\n .play()\r\n .then(() => (this.audioUnlocked = true))\r\n .catch(() => {});\r\n }\r\n\r\n public playBotSound(): void {\r\n if (!this.audioUnlocked) return;\r\n try {\r\n const audio = new Audio('assets/bot.mp3');\r\n audio.play();\r\n } catch (error) {\r\n console.error('Error playing bot sound:', error);\r\n }\r\n }\r\n}\r\n","import { Injectable, inject, signal, computed } from '@angular/core';\r\nimport { Observable, firstValueFrom } from 'rxjs';\r\nimport { MessageService } from '../../components/message-input/messaging.service';\r\nimport { ChatHistoryService } from './chat-history.service';\r\nimport { AccountService } from './account.service';\r\nimport { AuthService } from './auth.service';\r\nimport { TenantContextService } from './tenant-context.service';\r\nimport { ChatSession } from '../../model/chat-session.model';\r\nimport { LoginRequest } from '../models/login-request.model';\r\nimport { UserContext } from '../models/user-context.model';\r\n\r\n/**\r\n * ChatFacadeService - High-level orchestration service\r\n *\r\n * Coordinates operations between multiple services to provide simplified,\r\n * high-level operations for the chat component. This facade encapsulates\r\n * complex interactions and provides a clean API for common chat operations.\r\n *\r\n * Responsibilities:\r\n * - Session management (load, delete, switch sessions)\r\n * - Authentication orchestration\r\n * - Message operations coordination\r\n * - Context management\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatFacadeService {\r\n private messageService = inject(MessageService);\r\n private chatHistoryService = inject(ChatHistoryService);\r\n private accountService = inject(AccountService);\r\n private authService = inject(AuthService);\r\n private tenantContextService = inject(TenantContextService);\r\n\r\n // Chat State\r\n public messages = this.messageService.messages;\r\n public isBotTyping = this.messageService.isBotTyping;\r\n public chatSessions = signal<ChatSession[]>([]);\r\n public isAuthenticated = signal(false);\r\n public isGuestMode = signal(false);\r\n public messageError = signal<string | null>(null);\r\n\r\n // API / Auth State\r\n apiError = signal<string | null>(null);\r\n authError = signal<string | null>(null);\r\n authSuccess = signal<string | null>(null);\r\n isLoggingIn = signal<boolean>(false);\r\n\r\n constructor() {\r\n // Set initial authentication status\r\n this.isAuthenticated.set(this.authService.isAuthenticated());\r\n\r\n // Check if we should default to guest mode (missing API config)\r\n if (!this.authService.apiUrl || !this.authService.companyCode) {\r\n console.log('ChatFacade: No API config detected, defaulting to Guest Mode');\r\n this.isGuestMode.set(true);\r\n }\r\n }\r\n\r\n /**\r\n * Get logged-in user's name from auth token\r\n */\r\n getLoggedInUserName(): string {\r\n const username = this.authService.getLocalStorage('username');\r\n return username || 'User';\r\n }\r\n\r\n // ============================================================================\r\n // SESSION MANAGEMENT\r\n // ============================================================================\r\n\r\n /**\r\n * Load all chat sessions for a specific user and context\r\n */\r\n loadUserSessions(contextKey: string, userId: string): void {\r\n this.chatHistoryService.loadAllSessions(contextKey, userId).subscribe((sessions) => {\r\n this.chatSessions.set(sessions);\r\n console.log(`Loaded ${sessions.length} sessions for context: ${contextKey}, user: ${userId}`);\r\n });\r\n }\r\n\r\n /**\r\n * Delete a specific session\r\n */\r\n deleteSession(sessionId: string, contextKey: string, userId: string): Observable<void> {\r\n return new Observable((observer) => {\r\n this.chatHistoryService.deleteSession(sessionId, contextKey, userId).subscribe({\r\n next: () => {\r\n // Reload sessions after deletion\r\n this.loadUserSessions(contextKey, userId);\r\n\r\n // If deleted session is currently active, start a new one\r\n const activeSession = this.messageService.getActiveSession();\r\n if (activeSession?.id === sessionId) {\r\n this.messageService.startNewSession();\r\n }\r\n\r\n observer.next();\r\n observer.complete();\r\n },\r\n error: (err) => observer.error(err),\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Load a specific session into the message service\r\n */\r\n loadSession(session: ChatSession): void {\r\n this.messageService.loadSession(session);\r\n console.log('Loaded session:', session.title);\r\n }\r\n\r\n /**\r\n * Start a new chat session\r\n */\r\n startNewSession(): void {\r\n this.messageService.startNewSession();\r\n }\r\n\r\n // ============================================================================\r\n // MESSAGE OPERATIONS\r\n // ============================================================================\r\n\r\n /**\r\n * Send a message with validation\r\n */\r\n async sendMessage(text: string, maxLength: number = 1000): Promise<void> {\r\n const trimmedText = text.trim();\r\n this.messageError.set(null);\r\n\r\n if (!trimmedText) {\r\n return;\r\n }\r\n\r\n if (trimmedText.length > maxLength) {\r\n this.messageError.set(`Message exceeds maximum length of ${maxLength} characters.`);\r\n setTimeout(() => {\r\n this.messageError.set(null);\r\n }, 5000);\r\n return;\r\n }\r\n\r\n // Delegate to MessageService\r\n await this.messageService.processUserMessage(trimmedText);\r\n }\r\n\r\n /**\r\n * Clear the current chat and start a new session\r\n */\r\n clearCurrentChat(contextKey: string, userId: string): void {\r\n this.messageService.clearMessages();\r\n // Refresh sessions list after clearing\r\n this.loadUserSessions(contextKey, userId);\r\n }\r\n\r\n /**\r\n * Clear message error\r\n */\r\n clearMessageError(): void {\r\n this.messageError.set(null);\r\n this.authError.set(null);\r\n this.authSuccess.set(null);\r\n }\r\n\r\n // ============================================================================\r\n // AUTHENTICATION\r\n // ============================================================================\r\n\r\n /**\r\n * Enable guest mode explicitly\r\n */\r\n enableGuestMode(): void {\r\n this.isGuestMode.set(true);\r\n this.messageService.setGuestMode(true);\r\n }\r\n\r\n /**\r\n * Disable guest mode explicitly\r\n */\r\n disableGuestMode(): void {\r\n this.isGuestMode.set(false);\r\n this.messageService.setGuestMode(false);\r\n }\r\n\r\n /**\r\n * Authenticate user with credentials\r\n */\r\n async login(credentials: LoginRequest, silent: boolean = false): Promise<boolean> {\r\n this.isLoggingIn.set(true);\r\n if (!silent) {\r\n this.authError.set(null);\r\n this.authSuccess.set(null);\r\n }\r\n\r\n try {\r\n const response = await firstValueFrom(this.accountService.login(credentials));\r\n console.log('>>>>>>>>>>>Login response<<<<<<<<<<:', response);\r\n console.log('>>>>>>>>>>Credentials used<<<<<<<<:', credentials);\r\n if (response && response.success) {\r\n console.log('Login response (success):', response);\r\n this.isAuthenticated.set(true);\r\n this.disableGuestMode(); // Ensure guest mode is off\r\n if (!silent) {\r\n this.authSuccess.set('Login successful!');\r\n }\r\n this.isLoggingIn.set(false);\r\n return true;\r\n } else {\r\n this.isAuthenticated.set(false);\r\n if (!silent) {\r\n this.authError.set('Login failed. Please check your credentials.');\r\n }\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n console.error('Login failed:', error);\r\n this.isAuthenticated.set(false);\r\n if (!silent) {\r\n this.authError.set('An error occurred during login.');\r\n }\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Check if user is authenticated\r\n */\r\n checkAuthentication(): boolean {\r\n return this.authService.isAuthenticated();\r\n }\r\n\r\n /**\r\n * Logout the current user\r\n */\r\n async logout(): Promise<void> {\r\n try {\r\n // Get refresh token from auth service\r\n const refreshToken = this.authService.getLocalStorage('refresh_token');\r\n\r\n if (!refreshToken) {\r\n console.warn('No refresh token found, clearing local state only');\r\n this.clearAuthState();\r\n return;\r\n }\r\n\r\n // Call the backend logout endpoint with refresh token\r\n const response = await firstValueFrom(this.accountService.logout(refreshToken));\r\n\r\n if (response && response.success) {\r\n this.clearAuthState();\r\n console.log('User logged out successfully');\r\n } else {\r\n throw new Error('Logout failed');\r\n }\r\n } catch (error) {\r\n console.error('Logout failed:', error);\r\n // Even if backend logout fails, clear local state\r\n this.clearAuthState();\r\n this.authError.set('Logout completed with errors.');\r\n setTimeout(() => {\r\n this.authError.set(null);\r\n }, 5000);\r\n }\r\n }\r\n\r\n /**\r\n * Clear authentication state and reset UI\r\n */\r\n private clearAuthState(): void {\r\n // Clear auth storage via AuthService\r\n this.authService.clearAuth();\r\n\r\n // Update authentication state\r\n this.isAuthenticated.set(false);\r\n this.isGuestMode.set(false);\r\n\r\n // Clear messages and start new session\r\n this.messageService.clearMessages();\r\n this.messageService.startNewSession();\r\n\r\n // Clear sessions\r\n this.chatSessions.set([]);\r\n\r\n // Show success message\r\n this.authSuccess.set('Logged out successfully!');\r\n\r\n // Clear success message after 3 seconds\r\n setTimeout(() => {\r\n this.authSuccess.set(null);\r\n }, 3000);\r\n }\r\n\r\n // ============================================================================\r\n // CONTEXT MANAGEMENT\r\n // ============================================================================\r\n\r\n /**\r\n * Update tenant context (platformTenant, subTenant, agent)\r\n */\r\n updateTenantContext(platformTenant: string, subTenant: string, agent: string): void {\r\n this.tenantContextService.setContext({\r\n platformTenant: platformTenant || '',\r\n subTenant: subTenant || '',\r\n agent: agent || '',\r\n });\r\n\r\n // Sync message service with new context\r\n const contextKey = this.tenantContextService.contextKey();\r\n console.log('>>>>>ChatFacade: Switching context to', contextKey);\r\n this.messageService.switchContext(contextKey);\r\n }\r\n\r\n /**\r\n * Handle user context changes (for backend proxy mode)\r\n */\r\n handleUserContextChange(userContext: UserContext): void {\r\n this.messageService.setUserContext(userContext);\r\n console.log('>>>>ChatFacade: User context updated', userContext.userName);\r\n }\r\n\r\n /**\r\n * Get current context key\r\n */\r\n getCurrentContextKey(): string {\r\n return this.tenantContextService.contextKey();\r\n }\r\n\r\n /**\r\n * Subscribe to context changes\r\n */\r\n subscribeToContextChanges(callback: (contextKey: string) => void): () => void {\r\n const subscription = this.tenantContextService.contextChange$.subscribe((event) => {\r\n // Sync message service with new context\r\n this.messageService.switchContext(event.contextKey);\r\n callback(event.contextKey);\r\n });\r\n\r\n // Return cleanup function\r\n return () => subscription.unsubscribe();\r\n }\r\n\r\n // ============================================================================\r\n // COMPUTED STATE\r\n // ============================================================================\r\n\r\n /**\r\n * Determine if suggestion chips should be shown\r\n */\r\n showSuggestionChips = computed(() => {\r\n const msgs = this.messages();\r\n if (msgs.length === 0) return false;\r\n const lastBotMsg = [...msgs].reverse().find((m) => m.sender === 'bot');\r\n return lastBotMsg?.showSuggestions === true;\r\n });\r\n}\r\n","import { Injectable, signal, computed, effect } from '@angular/core';\r\nimport { Message } from '../../model/message';\r\n\r\n/**\r\n * ChatUIStateService - Centralized UI state management\r\n * \r\n * Manages all UI-related state for the chat component including:\r\n * - Chat window open/close state\r\n * - History sidebar visibility\r\n * - Unread message tracking\r\n * - Fullscreen state\r\n * \r\n * This service uses Angular signals for reactive state management,\r\n * allowing components to subscribe to state changes efficiently.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatUIStateService {\r\n // ============================================================================\r\n // UI STATE SIGNALS\r\n // ============================================================================\r\n\r\n /**\r\n * Whether the chat window is currently open\r\n */\r\n public isChatOpen = signal(false);\r\n\r\n /**\r\n * Whether the history sidebar is currently open\r\n */\r\n public isHistorySidebarOpen = signal(false);\r\n\r\n /**\r\n * Whether the chat is in fullscreen mode\r\n */\r\n public isFullScreen = signal(false);\r\n\r\n /**\r\n * ID of the last message that was read by the user\r\n */\r\n private lastReadMessageId = signal<string | null>(null);\r\n\r\n /**\r\n * Reference to current messages (injected from outside)\r\n */\r\n private messagesSignal = signal<Message[]>([]);\r\n\r\n // ============================================================================\r\n // COMPUTED SIGNALS\r\n // ============================================================================\r\n\r\n /**\r\n * Computed number of unread bot messages\r\n */\r\n public unreadCount = computed(() => {\r\n if (this.isChatOpen()) {\r\n return 0; // No unread when chat is open\r\n }\r\n\r\n const messages = this.messagesSignal();\r\n if (messages.length === 0) return 0;\r\n\r\n const lastReadId = this.lastReadMessageId();\r\n let lastReadIndex = -1;\r\n\r\n if (lastReadId !== null) {\r\n lastReadIndex = messages.findIndex((msg) => msg.id === lastReadId);\r\n }\r\n\r\n // Count unread bot messages after last read position\r\n const unreadBotMessages = messages\r\n .slice(lastReadIndex + 1)\r\n .filter((msg) => msg.sender === 'bot');\r\n\r\n return unreadBotMessages.length;\r\n });\r\n\r\n // ============================================================================\r\n // EFFECTS\r\n // ============================================================================\r\n\r\n /**\r\n * Effect to automatically mark messages as read when chat is opened\r\n */\r\n public markAsReadEffect = effect(\r\n () => {\r\n const isOpen = this.isChatOpen();\r\n const msgs = this.messagesSignal();\r\n\r\n if (isOpen && msgs.length > 0) {\r\n const lastMessage = msgs[msgs.length - 1];\r\n if (lastMessage?.id) {\r\n const currentLastRead = this.lastReadMessageId();\r\n if (lastMessage.id !== currentLastRead) {\r\n this.lastReadMessageId.set(lastMessage.id);\r\n }\r\n }\r\n }\r\n },\r\n { allowSignalWrites: true }\r\n );\r\n\r\n // ============================================================================\r\n // PUBLIC METHODS\r\n // ============================================================================\r\n\r\n /**\r\n * Set the messages signal reference from an external source\r\n * This allows the UI state service to track messages from MessageService\r\n */\r\n setMessagesSignal(messagesSignal: any): void {\r\n this.messagesSignal = messagesSignal;\r\n }\r\n\r\n /**\r\n * Toggle the chat window open/close state\r\n */\r\n toggleChat(): void {\r\n const currentlyOpen = this.isChatOpen();\r\n this.isChatOpen.update((open) => !open);\r\n\r\n // Mark messages as read when opening chat\r\n if (!currentlyOpen) {\r\n const messages = this.messagesSignal();\r\n if (messages.length > 0) {\r\n const lastMessage = messages[messages.length - 1];\r\n this.lastReadMessageId.set(lastMessage.id ?? null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the history sidebar open/close state\r\n */\r\n toggleHistorySidebar(): void {\r\n this.isHistorySidebarOpen.update((open) => !open);\r\n }\r\n\r\n /**\r\n * Close the chat window\r\n */\r\n closeChat(): void {\r\n this.isChatOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the chat window\r\n */\r\n openChat(): void {\r\n this.isChatOpen.set(true);\r\n }\r\n\r\n /**\r\n * Close the history sidebar\r\n */\r\n closeHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the history sidebar\r\n */\r\n openHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(true);\r\n }\r\n\r\n /**\r\n * Toggle fullscreen mode\r\n */\r\n toggleFullscreen(): void {\r\n this.isFullScreen.update((fs) => !fs);\r\n }\r\n\r\n /**\r\n * Set fullscreen state\r\n */\r\n setFullscreen(isFullscreen: boolean): void {\r\n this.isFullScreen.set(isFullscreen);\r\n }\r\n\r\n /**\r\n * Manually mark messages as read up to a specific message ID\r\n */\r\n markMessagesAsRead(messageId: string): void {\r\n this.lastReadMessageId.set(messageId);\r\n }\r\n\r\n /**\r\n * Reset last read message ID\r\n */\r\n resetLastRead(): void {\r\n this.lastReadMessageId.set(null);\r\n }\r\n\r\n /**\r\n * Get the last read message ID\r\n */\r\n getLastReadMessageId(): string | null {\r\n return this.lastReadMessageId();\r\n }\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\nimport { DoohbotApiConfig } from '../../model/api-config.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DoohbotConfigService {\r\n private _config = signal<DoohbotApiConfig | null>(null);\r\n\r\n /**\r\n * Get the current configuration reactive signal\r\n */\r\n public getConfig = this._config.asReadonly();\r\n\r\n /**\r\n * Update the configuration\r\n * @param config The new configuration object\r\n */\r\n public setConfig(config: DoohbotApiConfig): void {\r\n this._config.set(config);\r\n }\r\n}\r\n","//projects\\doohbot\\src\\lib\\constant\\utf8.ts\r\nexport const appEmoji = {\r\n waveHand: '\\u{1F44B}',\r\n robotFace: '\\u{1F916}',\r\n partyPopper: '\\u{1F389}',\r\n thinkingFace: '\\u{1F914}',\r\n thumbsUp: '\\u{1F44D}',\r\n thumbsDown: '\\u{1F44E}',\r\n redHeart: '\\u{2764}\\u{FE0F}',\r\n};\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n provideAppInitializer,\r\n Renderer2,\r\n SimpleChanges,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DoohbotInput } from './inputs/doohbot-input';\r\nimport { PredefinedMessages } from './helpers/predefined_messages';\r\nimport { ChatButtonComponent } from './components/chat-button/chat-button.component';\r\nimport { ChatWindowComponent } from './components/chat-window/chat-window.component';\r\nimport { DoohbotApiConfig } from './model/api-config.model';\r\nimport { UserContext } from './core/models/user-context.model';\r\nimport { DoohbotThemeConfig } from './model/theme-config.model';\r\nimport { FullscreenDirective } from './directives/fullscreen/fullscreen.directive';\r\nimport { ChatSession } from './model/chat-session.model';\r\nimport { appConst } from './constant/constant';\r\nimport { AppConst } from './core/app-const';\r\nimport { LoginRequest } from './core/models/login-request.model';\r\nimport { ThemeService } from './core/services/theme.service';\r\nimport { ChatFacadeService } from './core/services/chat-facade.service';\r\nimport { ChatUIStateService } from './core/services/chat-ui-state.service';\r\nimport { DoohbotConfigService } from './core/services/doohbot-config.service';\r\nimport { appEmoji } from './constant/utf8';\r\nimport { bootstrapApplication } from '@angular/platform-browser';\r\nimport { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\r\nimport { AuthInterceptor } from './core/interceptors/auth.interceptor';\r\n\r\n@Component({\r\n selector: 'app-doohbot',\r\n standalone: true,\r\n imports: [CommonModule, ChatButtonComponent, ChatWindowComponent, FullscreenDirective],\r\n templateUrl: './doohbot.component.html',\r\n styleUrls: ['./doohbot.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // providers: [\r\n // AppConst,\r\n // {\r\n // provide: APP_INITIALIZER,\r\n // useFactory: (appConst: AppConst) => () => appConst.load(),\r\n // deps: [AppConst],\r\n // multi: true,\r\n // },\r\n // ],\r\n})\r\nexport class Doohbot extends DoohbotInput implements OnDestroy {\r\n // ============================================================================\r\n // INPUTS\r\n // ============================================================================\r\n\r\n @Input() config: DoohbotInput = new DoohbotInput();\r\n @Input() platformTenant!: string;\r\n @Input() subTenant!: string;\r\n @Input() agent!: string;\r\n @Input() buttonStyle: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom' = 'fab';\r\n @Input() enableDrag: boolean = false;\r\n @Input() enableResize: boolean = false;\r\n @Input() apiConfig?: DoohbotApiConfig;\r\n @Input() userContext?: UserContext;\r\n @Input() themeConfig: DoohbotThemeConfig | undefined;\r\n\r\n appEmoji = appEmoji;\r\n\r\n // ============================================================================\r\n // FACADE SERVICES\r\n // ============================================================================\r\n\r\n private chatFacade = inject(ChatFacadeService);\r\n private uiState = inject(ChatUIStateService);\r\n private themeService = inject(ThemeService);\r\n private configService = inject(DoohbotConfigService);\r\n\r\n // ============================================================================\r\n // EXPOSED STATE FROM FACADES\r\n // ============================================================================\r\n\r\n // UI State\r\n public isChatOpen = this.uiState.isChatOpen;\r\n public isHistorySidebarOpen = this.uiState.isHistorySidebarOpen;\r\n public unreadCount = this.uiState.unreadCount;\r\n public isFullScreen = this.uiState.isFullScreen;\r\n\r\n // Chat Facade State\r\n public isAuthenticated = this.chatFacade.isAuthenticated;\r\n public messages = this.chatFacade.messages;\r\n public isBotTyping = this.chatFacade.isBotTyping;\r\n public chatSessions = this.chatFacade.chatSessions;\r\n public messageError = this.chatFacade.messageError;\r\n public showSuggestionChips = this.chatFacade.showSuggestionChips;\r\n public isGuestMode = this.chatFacade.isGuestMode;\r\n public isLoggingIn = this.chatFacade.isLoggingIn;\r\n public authError = this.chatFacade.authError;\r\n public authSuccess = this.chatFacade.authSuccess;\r\n\r\n // ============================================================================\r\n // COMPONENT-SPECIFIC STATE\r\n // ============================================================================\r\n\r\n public userName = 'User';\r\n public predefinedMessages: string[] = PredefinedMessages;\r\n public maxMessageLength = 1000;\r\n\r\n // Context cleanup\r\n private contextCleanup?: () => void;\r\n\r\n /**\r\n * Check if current user is a guest user\r\n */\r\n public isGuestUser = computed(() => {\r\n const userId = this.userContext?.userId || 'anonymous';\r\n return this.checkIfGuestUser(userId);\r\n });\r\n\r\n /**\r\n * Helper method to check if a user ID belongs to a guest user\r\n */\r\n private checkIfGuestUser(userId: string): boolean {\r\n const guestUserIds = ['anonymous', 'guest', 'default', ''];\r\n return guestUserIds.includes(userId.toLowerCase());\r\n }\r\n\r\n // ============================================================================\r\n // VIEW CHILDREN\r\n // ============================================================================\r\n\r\n @ViewChild(ChatWindowComponent, { read: ElementRef }) chatWindowRef!: ElementRef;\r\n @ViewChild(FullscreenDirective) fullscreenDirective!: FullscreenDirective;\r\n\r\n // ============================================================================\r\n // CONSTRUCTOR\r\n // ============================================================================\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private renderer: Renderer2,\r\n ) {\r\n super();\r\n\r\n // Setup messages signal ref for UI state service\r\n this.uiState.setMessagesSignal(this.chatFacade.messages);\r\n\r\n // Theme management effect\r\n effect(() => {\r\n const activeTheme = this.themeService.activeTheme();\r\n const host = this.elementRef.nativeElement;\r\n this.renderer.removeClass(host, 'light-theme');\r\n this.renderer.removeClass(host, 'dark-theme');\r\n this.renderer.addClass(host, activeTheme);\r\n this.themeService.applyCssVariables(host, this.themeConfig);\r\n });\r\n\r\n // Update userName when authentication status changes\r\n effect(() => {\r\n const isAuth = this.chatFacade.isAuthenticated();\r\n if (isAuth) {\r\n const loggedInName = this.chatFacade.getLoggedInUserName();\r\n if (loggedInName !== 'User') {\r\n this.userName = loggedInName;\r\n console.log('Updated userName from auth token:', this.userName);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // LIFECYCLE HOOKS\r\n // ============================================================================\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Handle user context changes\r\n if (changes['userContext'] && this.userContext) {\r\n this.chatFacade.handleUserContextChange(this.userContext);\r\n this.userName = this.userContext.userName || this.config.username || 'User';\r\n\r\n // Update configuration service if apiConfig is present\r\n if (this.apiConfig) {\r\n this.configService.setConfig(this.apiConfig);\r\n }\r\n\r\n // Reset UI state and re-authenticate\r\n this.uiState.closeChat();\r\n // Close history sidebar when user is switched\r\n this.uiState.closeHistorySidebar();\r\n // this.performLogin();\r\n\r\n // Load sessions for new user\r\n this.loadUserSessions();\r\n }\r\n\r\n // Handle config changes\r\n if (changes['config']) {\r\n this.userAvatarUrl = this.config.userAvatarUrl || appConst.USER_AVATAR;\r\n if (!this.userName || this.userName === 'User') {\r\n this.userName = this.config.username || 'User';\r\n }\r\n }\r\n\r\n // Handle apiConfig changes directly\r\n if (changes['apiConfig'] && this.apiConfig) {\r\n this.configService.setConfig(this.apiConfig);\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n // Initialize theme\r\n this.themeService.applyCssVariables(this.elementRef.nativeElement, this.themeConfig);\r\n\r\n // Set user avatar and name\r\n this.userAvatarUrl = this.config.userAvatarUrl || appConst.USER_AVATAR;\r\n this.userName = this.userContext?.userName || this.config.username || 'User';\r\n\r\n // Initialize tenant context\r\n this.chatFacade.updateTenantContext(\r\n this.platformTenant || '',\r\n this.subTenant || '',\r\n this.agent || '',\r\n );\r\n\r\n // Start new session\r\n this.chatFacade.startNewSession();\r\n\r\n // Load user sessions\r\n this.loadUserSessions();\r\n\r\n // Subscribe to context changes\r\n this.contextCleanup = this.chatFacade.subscribeToContextChanges((contextKey) => {\r\n this.uiState.resetLastRead();\r\n });\r\n\r\n // Perform authentication\r\n if (!this.chatFacade.checkAuthentication()) {\r\n this.performLogin();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up subscriptions\r\n if (this.contextCleanup) {\r\n this.contextCleanup();\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // AUTHENTICATION\r\n // ============================================================================\r\n\r\n private performLogin(): void {\r\n const credentials: LoginRequest = {\r\n username: this.config.username || AppConst.data?.username,\r\n password: this.config.password || AppConst.data?.password,\r\n };\r\n\r\n console.log('performLogin:', credentials.username, credentials.password);\r\n this.chatFacade.login(credentials, true);\r\n }\r\n\r\n performLoginWithCredentials(credentials: LoginRequest): void {\r\n this.chatFacade.login(credentials, false);\r\n }\r\n\r\n continueAsGuest(): void {\r\n this.chatFacade.enableGuestMode();\r\n }\r\n\r\n disableGuestMode(): void {\r\n this.chatFacade.disableGuestMode();\r\n }\r\n\r\n performLogout(): void {\r\n this.chatFacade.logout();\r\n }\r\n\r\n // ============================================================================\r\n // CHAT OPERATIONS\r\n // ============================================================================\r\n\r\n toggleChat(): void {\r\n this.uiState.toggleChat();\r\n }\r\n\r\n async sendMessage(text: string): Promise<void> {\r\n await this.chatFacade.sendMessage(text, this.maxMessageLength);\r\n }\r\n\r\n clearChat(): void {\r\n const contextKey = this.chatFacade.getCurrentContextKey();\r\n const userId = this.userContext?.userId || 'anonymous';\r\n this.chatFacade.clearCurrentChat(contextKey, userId);\r\n }\r\n\r\n clearMessageError(): void {\r\n this.chatFacade.clearMessageError();\r\n }\r\n\r\n // ============================================================================\r\n // SESSION MANAGEMENT\r\n // ============================================================================\r\n\r\n toggleHistorySidebar(): void {\r\n this.uiState.toggleHistorySidebar();\r\n }\r\n\r\n loadChatSession(session: ChatSession): void {\r\n this.chatFacade.loadSession(session);\r\n this.uiState.closeHistorySidebar();\r\n }\r\n\r\n deleteSession(sessionId: string): void {\r\n const contextKey = this.chatFacade.getCurrentContextKey();\r\n const userId = this.userContext?.userId || 'anonymous';\r\n this.chatFacade.deleteSession(sessionId, contextKey, userId).subscribe();\r\n }\r\n\r\n private loadUserSessions(): void {\r\n const contextKey = this.chatFacade.getCurrentContextKey();\r\n const userId = this.userContext?.userId || 'anonymous';\r\n this.chatFacade.loadUserSessions(contextKey, userId);\r\n }\r\n\r\n // ============================================================================\r\n // FULLSCREEN\r\n // ============================================================================\r\n\r\n toggleFullScreen(): void {\r\n if (this.fullscreenDirective) {\r\n this.fullscreenDirective.toggle();\r\n const isFullscreen = this.fullscreenDirective.getFullscreenState();\r\n this.uiState.setFullscreen(isFullscreen);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS\r\n // ============================================================================\r\n\r\n trackByMessageId(index: number, item: any): string {\r\n return item.id || index.toString();\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// INITIALIZATION\r\n// ============================================================================\r\n\r\n// export function initializeApp() {\r\n// const appConst = inject(AppConst);\r\n// return appConst.load(); // Returns a Promise\r\n// }\r\n\r\n// bootstrapApplication(Doohbot, {\r\n// providers: [\r\n// provideHttpClient(withInterceptorsFromDi()),\r\n// AppConst,\r\n// provideAppInitializer(initializeApp),\r\n// {\r\n// provide: HTTP_INTERCEPTORS,\r\n// useClass: AuthInterceptor,\r\n// multi: true,\r\n// },\r\n// ],\r\n// });\r\n","<app-chat-button\r\n [buttonStyle]=\"buttonStyle\"\r\n [isChatOpen]=\"isChatOpen()\"\r\n [unreadCount]=\"unreadCount()\"\r\n [chatIcon]=\"chatIcon ?? ''\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n (toggle)=\"toggleChat()\"\r\n></app-chat-button>\r\n\r\n<app-chat-window\r\n *ngIf=\"isChatOpen()\"\r\n appFullscreen\r\n [isChatOpen]=\"isChatOpen()\"\r\n [enableDrag]=\"enableDrag\"\r\n [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen()\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n [appHeaderLogoUrl]=\"appHeaderLogoUrl ?? ''\"\r\n [moreIcon]=\"moreIcon ?? ''\"\r\n [minimizeIcon]=\"minimizeIcon ?? ''\"\r\n [messages]=\"messages()\"\r\n [isBotTyping]=\"isBotTyping()\"\r\n [isAuthenticated]=\"isAuthenticated()\"\r\n [appSubtitle]=\"appSubtitle ?? ''\"\r\n [welcomeDesc]=\"welcomeDesc ?? ''\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl ?? ''\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [hintText]=\"hintText ?? ''\"\r\n [sendIcon]=\"sendIcon ?? ''\"\r\n [messageError]=\"messageError()\"\r\n [showSuggestionChips]=\"showSuggestionChips()\"\r\n [isHistorySidebarOpen]=\"isHistorySidebarOpen()\"\r\n [chatSessions]=\"chatSessions()\"\r\n [chatHistoryUserName]=\"userName\"\r\n [isGuestUser]=\"isGuestUser()\"\r\n [isGuestMode]=\"isGuestMode()\"\r\n [isLoggingIn]=\"isLoggingIn()\"\r\n [authError]=\"authError()\"\r\n [authSuccess]=\"authSuccess()\"\r\n (toggleChat)=\"toggleChat()\"\r\n (continueAsGuest)=\"continueAsGuest()\"\r\n (loginClick)=\"disableGuestMode()\"\r\n (loginSubmit)=\"performLoginWithCredentials($event)\"\r\n (toggleFullScreen)=\"toggleFullScreen()\"\r\n (toggleHistorySidebar)=\"toggleHistorySidebar()\"\r\n (sessionSelected)=\"loadChatSession($event)\"\r\n (sessionDeleted)=\"deleteSession($event)\"\r\n (suggestionClick)=\"sendMessage($event)\"\r\n (send)=\"sendMessage($event)\"\r\n (clearMessageError)=\"clearMessageError()\"\r\n (clearChat)=\"clearChat()\"\r\n (logout)=\"performLogout()\"\r\n></app-chat-window>\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const DOOHBOT_API_URL = new InjectionToken<string>('DOOHBOT_API_URL');\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-menu-item',\r\n imports: [],\r\n templateUrl: './menu-item.component.html',\r\n styleUrl: './menu-item.component.scss',\r\n})\r\nexport class MenuItem {\r\n @Input() href = '#';\r\n @Output() selected = new EventEmitter<void>();\r\n\r\n onClick(event: Event): void {\r\n // Optional: prevent default if used for actions, not navigation\r\n // event.preventDefault();\r\n\r\n this.selected.emit();\r\n }\r\n}\r\n","<li>\r\n <a [href]=\"href\" (click)=\"onClick($event)\">\r\n <ng-content></ng-content>\r\n </a>\r\n</li>\r\n","import {\r\n AfterContentInit,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n QueryList,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { MenuItem } from '../menu-item/menu-item.component';\r\n\r\n@Component({\r\n selector: 'app-dropdown-menu',\r\n imports: [],\r\n templateUrl: './dropdown-menu.component.html',\r\n styleUrl: './dropdown-menu.component.scss',\r\n})\r\nexport class DropdownMenu implements AfterContentInit {\r\n @ViewChild('details') detailsRef!: ElementRef<HTMLDetailsElement>;\r\n\r\n @ContentChildren(MenuItem) menuItems!: QueryList<MenuItem>;\r\n\r\n ngAfterContentInit() {\r\n // Subscribe to all menu item selections\r\n this.menuItems.forEach((item) => {\r\n item.selected.subscribe(() => {\r\n this.close();\r\n });\r\n });\r\n }\r\n\r\n close(): void {\r\n this.detailsRef.nativeElement.open = false;\r\n }\r\n}\r\n","<details class=\"dropdown-menu\" #details>\r\n <summary role=\"button\" class=\"dropdown-trigger\">\r\n <ng-content select=\"[trigger]\"></ng-content>\r\n </summary>\r\n <ul class=\"dropdown-list\">\r\n <ng-content></ng-content>\r\n </ul>\r\n</details>\r\n\r\n<!-- ussage example:\r\n<app-dropdown-menu>\r\n <span trigger>☰ Menu</span>\r\n\r\n <app-menu-item href=\"/profile\" (selected)=\"doSomething('profile')\">\r\n My Profile\r\n </app-menu-item>\r\n \r\n <app-menu-item href=\"/settings\" (selected)=\"doSomething('settings')\">\r\n Settings\r\n </app-menu-item>\r\n \r\n <app-menu-item href=\"#\" (selected)=\"logout()\">\r\n Logout\r\n </app-menu-item>\r\n</app-dropdown-menu> -->\r\n\r\n<!-- \r\n Note: The above usage example is commented out to avoid rendering issues.\r\n It demonstrates how to use the DropdownMenu component with MenuItem components as options.\r\n-->\r\n","import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, tap } from 'rxjs';\r\nimport { AuthService } from '../services/auth.service';\r\nimport { DoohbotConfigService } from '../services/doohbot-config.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n constructor(\r\n private auth: AuthService,\r\n private configService: DoohbotConfigService,\r\n ) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const config = this.configService.getConfig(); // Get the current config value\r\n\r\n // Only intercept requests directed to the configured API URL\r\n if (!config?.apiUrl || !req.url.startsWith(config.apiUrl)) {\r\n return next.handle(req);\r\n }\r\n\r\n const authReq = this.getRequestWithHeaders(req);\r\n return this.sendRequest(authReq, next);\r\n }\r\n\r\n sendRequest(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n return next.handle(req).pipe(\r\n tap((event: any) => {\r\n // if (event instanceof HttpResponse) {\r\n // this.ngxCache.setHttpResponse(req.urlWithParams\r\n // .replace('refresh=true', '')\r\n // .replace('refresh=false', '')\r\n // .replace('refresh=undefined', ''), event, AppConst.data.timeToLeave || 60);\r\n // }\r\n }),\r\n );\r\n }\r\n\r\n getRequestWithHeaders(req: HttpRequest<any>): any {\r\n let headers = req.headers;\r\n const token = this.auth.getLocalStorage('access_token') ?? '';\r\n\r\n if (token != '') {\r\n headers = headers.set('Authorization', `Bearer ${token}`);\r\n }\r\n\r\n return req.clone({ headers });\r\n }\r\n}\r\n","import {\r\n APP_INITIALIZER,\r\n EnvironmentProviders,\r\n inject,\r\n makeEnvironmentProviders,\r\n} from '@angular/core';\r\nimport { AppConst } from './core/app-const';\r\nimport { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\r\nimport { AuthInterceptor } from './core/interceptors/auth.interceptor';\r\n\r\nexport function initializeDoohbotApp(): () => Promise<any> {\r\n return () => {\r\n const appConst = inject(AppConst);\r\n return appConst.load();\r\n };\r\n}\r\n\r\nexport function provideDoohbot(): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n AppConst,\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: initializeDoohbotApp,\r\n multi: true,\r\n },\r\n provideHttpClient(withInterceptorsFromDi()),\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthInterceptor,\r\n multi: true,\r\n },\r\n ]);\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nexport abstract class StorageService {\r\n abstract getItem(key: string): string | null;\r\n abstract setItem(key: string, value: string): void;\r\n abstract removeItem(key: string): void;\r\n abstract clear(): void;\r\n abstract get length(): number;\r\n abstract key(index: number): string | null;\r\n abstract getAllKeys(): string[];\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class LocalStorageService extends StorageService {\r\n getItem(key: string): string | null {\r\n return localStorage.getItem(key);\r\n }\r\n\r\n setItem(key: string, value: string): void {\r\n localStorage.setItem(key, value);\r\n }\r\n\r\n removeItem(key: string): void {\r\n localStorage.removeItem(key);\r\n }\r\n\r\n clear(): void {\r\n localStorage.clear();\r\n }\r\n\r\n get length(): number {\r\n return localStorage.length;\r\n }\r\n\r\n key(index: number): string | null {\r\n return localStorage.key(index);\r\n }\r\n\r\n getAllKeys(): string[] {\r\n return Object.keys(localStorage);\r\n }\r\n}\r\n\r\n// Provide LocalStorageService as the default implementation of StorageService\r\nexport function provideStorage() {\r\n return {\r\n provide: StorageService,\r\n useClass: LocalStorageService,\r\n };\r\n}\r\n","import {\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Input,\r\n EventEmitter,\r\n OnDestroy,\r\n Output,\r\n Renderer2,\r\n ViewChild,\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'popout-window',\r\n template: `\r\n <div #innerWrapper style=\"width: 100%; height: 100%; overflow: auto;\">\r\n <ng-content></ng-content>\r\n </div>\r\n `,\r\n})\r\nexport class PopoutWindowDirective implements OnDestroy {\r\n @ViewChild('innerWrapper') private innerWrapper!: ElementRef;\r\n\r\n @Input() windowWidth: number = 400;\r\n @Input() windowHeight: number = 400;\r\n @Input() windowLeft: number = 200;\r\n @Input() windowTop: number = 200;\r\n @Input() windowTitle: string = 'Popout Window';\r\n @Input() windowStyle: string = '';\r\n @Input() windowStyleUrl: string = '';\r\n @Input() suppressCloneStyles = false;\r\n @Input() get isPoppedOut(): boolean {\r\n return this.isOut;\r\n }\r\n @Output() closed: EventEmitter<boolean> = new EventEmitter();\r\n @Output() shown: EventEmitter<Window> = new EventEmitter();\r\n\r\n private popoutWindow: Window | null = null;\r\n private isOut = false;\r\n private observer: MutationObserver | undefined;\r\n\r\n @HostListener('window:beforeunload')\r\n public beforeunloadHandler(): void {\r\n this.close();\r\n }\r\n\r\n constructor(\r\n private renderer2: Renderer2,\r\n private elementRef: ElementRef,\r\n ) {}\r\n\r\n ngOnDestroy(): void {\r\n this.observer?.disconnect();\r\n this.close();\r\n }\r\n\r\n private close(): void {\r\n if (this.popoutWindow) {\r\n this.popoutWindow.close();\r\n this.popoutWindow = null;\r\n this.isOut = false;\r\n this.closed.next(true);\r\n }\r\n }\r\n\r\n public popIn(): void {\r\n if (this.elementRef.nativeElement && this.innerWrapper.nativeElement) {\r\n this.renderer2.appendChild(this.elementRef.nativeElement, this.innerWrapper.nativeElement);\r\n this.close();\r\n }\r\n }\r\n\r\n public popOut(): void {\r\n if (!this.popoutWindow) {\r\n const elmRect = this.innerWrapper.nativeElement.getBoundingClientRect();\r\n\r\n const navHeight = window.outerHeight - window.innerHeight;\r\n const navWidth = window.outerWidth - window.innerWidth;\r\n\r\n const winLeft = this.windowLeft || window.screenX + navWidth + elmRect.left;\r\n const winTop = this.windowTop || window.screenY + navHeight + elmRect.top - 60;\r\n\r\n this.popoutWindow = window.open(\r\n '',\r\n `popoutWindow${Date.now()}`,\r\n `width=${this.windowWidth > 99 ? this.windowWidth : elmRect.width},\r\n height=${this.windowHeight > 99 ? this.windowHeight : elmRect.height + 1},\r\n left=${winLeft},\r\n top=${winTop}`,\r\n );\r\n\r\n if (!this.popoutWindow) {\r\n console.error('Popup blocked or failed to open');\r\n return;\r\n }\r\n\r\n this.popoutWindow.document.title = this.windowTitle\r\n ? this.windowTitle\r\n : window.document.title;\r\n this.popoutWindow.document.body.style.margin = '0';\r\n\r\n if (!this.suppressCloneStyles) {\r\n document.head.querySelectorAll('style').forEach((node) => {\r\n this.popoutWindow?.document.head.appendChild(node.cloneNode(true));\r\n });\r\n\r\n this.observeStyleChanges();\r\n\r\n document.head.querySelectorAll('link[rel=\"stylesheet\"]').forEach((node) => {\r\n this.popoutWindow?.document.head.insertAdjacentHTML(\r\n 'beforeend',\r\n `<link rel=\"stylesheet\" type=\"${(node as HTMLLinkElement).type}\" href=\"${(node as HTMLLinkElement).href}\">`,\r\n );\r\n });\r\n\r\n // Safe check for document.fonts\r\n const doc: any = document;\r\n const targetDoc: any = this.popoutWindow.document;\r\n if (doc.fonts && targetDoc.fonts) {\r\n doc.fonts.forEach((node: any) => {\r\n targetDoc.fonts.add(node);\r\n });\r\n }\r\n }\r\n\r\n if (this.windowStyleUrl) {\r\n this.popoutWindow.document.head.insertAdjacentHTML(\r\n 'beforeend',\r\n `<link rel=\"stylesheet\" type=\"text/css\" href=\"${window.location.origin}/${this.windowStyleUrl}\">`,\r\n );\r\n }\r\n\r\n if (this.windowStyle) {\r\n this.popoutWindow.document.head.insertAdjacentHTML(\r\n 'beforeend',\r\n `<style>${this.windowStyle}</style>`,\r\n );\r\n }\r\n\r\n this.renderer2.appendChild(this.popoutWindow.document.body, this.innerWrapper.nativeElement);\r\n this.isOut = true;\r\n this.shown.emit(this.popoutWindow);\r\n\r\n this.popoutWindow.addEventListener('unload', () => {\r\n this.popIn();\r\n });\r\n } else {\r\n this.popoutWindow.focus();\r\n }\r\n }\r\n\r\n private observeStyleChanges(): void {\r\n const docHead = document.querySelector('head');\r\n if (!docHead) return;\r\n\r\n this.observer?.disconnect();\r\n this.observer = new MutationObserver((mutations: MutationRecord[]) => {\r\n mutations.forEach((mutation: MutationRecord) => {\r\n mutation.addedNodes.forEach((node: Node) => {\r\n if (node.nodeName === 'STYLE' && this.popoutWindow) {\r\n this.popoutWindow.document.head.appendChild(node.cloneNode(true));\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.observer.observe(docHead, { childList: true });\r\n }\r\n}\r\n","/*\r\n * Public API Surface of chatbot\r\n */\r\n\r\n// Main component\r\nexport * from './lib/doohbot.component';\r\n\r\nexport * from './lib/inputs/doohbot-input';\r\nexport * from './lib/model/api-config.model';\r\nexport * from './lib/core/models/user-context.model';\r\nexport * from './lib/constant/constant';\r\nexport * from './lib/model/token';\r\nexport * from './lib/model/tenant-config.model';\r\nexport * from './lib/model/chat-session.model';\r\nexport * from './lib/model/chat-context.model';\r\nexport * from './lib/model/theme-config.model';\r\nexport * from './lib/components/chat-window/chat-window.component';\r\nexport * from './lib/components/message-list/message-list.component';\r\nexport * from './lib/shared/dialog/dialog.component';\r\nexport * from './lib/shared/dialog/dialog.service';\r\nexport * from './lib/shared/chips/chips.component';\r\nexport * from './lib/shared/snackbar/snackbar.component';\r\nexport * from './lib/shared/dropdown-menu/dropdown-menu.component';\r\nexport * from './lib/shared/menu-item/menu-item.component';\r\nexport * from './lib/doohbot-initializer';\r\n\r\n// Services\r\nexport * from './lib/core/services/doohbot-api.service';\r\nexport * from './lib/core/services/auth.service';\r\nexport * from './lib/core/services/account.service';\r\nexport * from './lib/core/services/theme.service';\r\nexport * from './lib/core/services/chat-facade.service';\r\nexport * from './lib/core/services/chat-history.service';\r\nexport * from './lib/core/services/storage.service';\r\n\r\n// Helpers\r\nexport * from './lib/helpers/predefined_messages';\r\n\r\n// Components\r\nexport * from './lib/components/chat-button/chat-button.component';\r\nexport * from './lib/components/chat-window/chat-window.component';\r\nexport * from './lib/components/message-list/message-list.component';\r\nexport * from './lib/components/message-input/message-input.component';\r\nexport * from './lib/components/chat-history-sidebar/chat-history-sidebar.component';\r\n\r\n// Directives\r\nexport * from './lib/directives/fullscreen/fullscreen.directive';\r\nexport * from './lib/directives/popout/popout.directive';\r\nexport * from './lib/directives/draggable/draggable-dialog.directive';\r\nexport * from './lib/directives/resizable/resizable-dialog.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i1.DialogService","i2","environmentprod","retry","map","catchError","i1.HttpService","i3.CryptoHelperService","i1.AuthService","i2.DoohbotConfigService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"aakash58-chatbot.mjs","sources":["../../../projects/doohbot/src/lib/constant/constant.ts","../../../projects/doohbot/src/lib/constant/utf8.ts","../../../projects/doohbot/src/lib/core/environments/environment.ts","../../../projects/doohbot/src/lib/core/utils/logger.service.ts","../../../projects/doohbot/src/lib/core/app-const.ts","../../../projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts","../../../projects/doohbot/src/lib/core/auth/token-storage.service.ts","../../../projects/doohbot/src/lib/core/auth/auth.service.ts","../../../projects/doohbot/src/lib/core/interceptors/auth.interceptor.ts","../../../projects/doohbot/src/lib/core/services/theme.service.ts","../../../projects/doohbot/src/lib/predefined_messages.ts","../../../projects/doohbot/src/lib/doohbot-input.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.html","../../../projects/doohbot/src/lib/shared/chips/chips.component.ts","../../../projects/doohbot/src/lib/shared/chips/chips.component.html","../../../projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.ts","../../../projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.html","../../../projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.ts","../../../projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.html","../../../projects/doohbot/src/lib/shared/dialog/dialog.component.ts","../../../projects/doohbot/src/lib/shared/dialog/dialog.component.html","../../../projects/doohbot/src/lib/shared/dialog/dialog.service.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.html","../../../projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.directive.ts","../../../projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.directive.ts","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts","../../../projects/doohbot/src/lib/shared/snackbar/snackbar.component.html","../../../projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.ts","../../../projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.html","../../../projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.directive.ts","../../../projects/doohbot/src/lib/core/http/http.service.ts","../../../projects/doohbot/src/lib/core/http/http-stream.service.ts","../../../projects/doohbot/src/lib/app/chat/services/chat-api.service.ts","../../../projects/doohbot/src/lib/core/auth/account-api.service.ts","../../../projects/doohbot/src/lib/app/chat/chat-helper.service.ts","../../../projects/doohbot/src/lib/app/chat/services/chat-context.service.ts","../../../projects/doohbot/src/lib/app/chat/services/chat-audio.service.ts","../../../projects/doohbot/src/lib/core/models/doohbot-config.model.ts","../../../projects/doohbot/src/lib/app/chat/chat.service.ts","../../../projects/doohbot/src/lib/core/services/tenant-context.service.ts","../../../projects/doohbot/src/lib/core/utils/error-handler.util.ts","../../../projects/doohbot/src/lib/app/chat/chat-facade.service.ts","../../../projects/doohbot/src/lib/app/chat/chat-ui-state.service.ts","../../../projects/doohbot/src/lib/doohbot.component.ts","../../../projects/doohbot/src/lib/doohbot.component.html","../../../projects/doohbot/src/lib/core/models/api-config.model.ts","../../../projects/doohbot/src/lib/shared/menu-item/menu-item.component.ts","../../../projects/doohbot/src/lib/shared/menu-item/menu-item.component.html","../../../projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.ts","../../../projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.html","../../../projects/doohbot/src/public-api.ts","../../../projects/doohbot/src/aakash58-chatbot.ts"],"sourcesContent":["export const appConst = {\r\n //LIVE ASSETS\r\n // APP_LOGO: 'https://iili.io/f3qSQJn.md.png',\r\n // USER_AVATAR: 'https://iili.io/KpEYoCP.png',\r\n // BOT_AVATAR: 'https://iili.io/KpER0Ge.png',\r\n\r\n // ==================\r\n\r\n //png ASSETS\r\n // APP_LOGO: 'assets/logo.svg',\r\n // APP_TEXT_LOGO: 'assets/title.svg',\r\n // APP_HEADER_LOGO: 'assets/header_logo.svg',\r\n // USER_AVATAR: 'assets/profile.png',\r\n // BOT_AVATAR: 'assets/bot.png',\r\n\r\n // ==================\r\n\r\n // base64_ASSETS\r\n APP_LOGO:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUwIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDE1MCAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc2XzE0MzgpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzZfMTQzOCkiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc2XzE0MzgpIi8+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSI2LjAwMzA2IiB5MT0iNiIgeDI9IjE0Mi45NzIiIHkyPSIxNDMuMjI2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8yMzc2XzE0MzgiIHgxPSIxNDMuMjI3IiB5MT0iNzYuODA0NiIgeDI9IjI2LjAwMSIgeTI9IjEyMi45NjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzIzNzZfMTQzOCIgeDE9IjU4LjI1NDEiIHkxPSI1OC4xNjciIHgyPSI1My45MTE3IiB5Mj0iMTMyLjk1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzIzNzZfMTQzOCI+CjxwYXRoIGQ9Ik02IDZIMTEzLjIyN0MxMjkuNzk1IDYgMTQzLjIyNyAxOS40MzE1IDE0My4yMjcgMzZWMTEyLjk3NUMxNDMuMjI3IDEyOS41NDQgMTI5Ljc5NSAxNDIuOTc1IDExMy4yMjcgMTQyLjk3NUg2VjZaIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=',\r\n APP_TEXT_LOGO:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDc3IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgNDc3IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNDUzLjkzMiA4Ny4wMjZDNDUyLjI0OSA4Ny4wMjYgNDUxLjI4NyA4Ni40MjUgNDUwLjA4NSA4NS4yMjI5TDQ0My43MTQgNzkuODEzNkM0NDIuNTEyIDc4LjYxMTUgNDQxLjkxMSA3Ny4yODkyIDQ0MS45MTEgNzUuNDg2MVY0MC44NjYySDQzMy42MTdWMzIuNDUxNkw0NDkuMTI0IDE1LjAyMTVINDUzLjIxMVYzMS4yNDk2SDQ3MC42NDFWNDAuODY2Mkg0NTMuMjExVjc2LjY4ODJINDcxLjAwMlY4Ny4wMjZINDUzLjkzMloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTM3NS44MTkgODcuMDE4N0MzNzQuNjE3IDg3LjAxODcgMzczLjA1NCA4Ni42NTggMzcxLjQ5MiA4NS4wOTUzTDM2Ni4yMDIgNzkuODA2MkMzNjUuMTIgNzguNjA0MSAzNjQuNjQgNzcuMDQxNCAzNjQuNjQgNzUuNTk4OVY0Mi42NjE5QzM2NC42NCA0MC45NzkgMzY1LjI0MSAzOS41MzY1IDM2Ni4yMDIgMzguNDU0N0wzNzEuNDkyIDMzLjE2NTVDMzcyLjkzNCAzMS43MjMgMzc0LjQ5NyAzMS4yNDIyIDM3NS44MTkgMzEuMjQyMkg0MTAuNjhDNDEyLjM2MyAzMS4yNDIyIDQxMy42ODUgMzEuODQzMiA0MTQuODg3IDMzLjA0NTNMNDIwLjI5NiAzOC4zMzQ0QzQyMS42MTkgMzkuNjU2NyA0MjIuMSA0MC45NzkgNDIyLjEgNDIuNjYxOVY3NS41OTg5QzQyMi4xIDc3LjI4MTggNDIxLjYxOSA3OC42MDQxIDQyMC4yOTYgNzkuOTI2NEw0MTQuODg3IDg1LjIxNTVDNDEzLjY4NSA4Ni40MTc2IDQxMi4zNjMgODcuMDE4NyA0MTAuNjggODcuMDE4N0gzNzUuODE5Wk0zNzUuOTM5IDc2LjgwMUg0MTAuOFY0MS40NTk5SDM3NS45MzlWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzQ5LjY0NCAzOC40NTYxQzM1MC44NDYgMzkuNzc4NCAzNTEuNDQ3IDQxLjEwMDcgMzUxLjQ0NyA0Mi43ODM2Vjc1LjYwMDRDMzUxLjQ0NyA3Ny4yODMzIDM1MC44NDYgNzguNjA1NiAzNDkuNjQ0IDc5LjkyNzlMMzQ0LjIzNCA4NS4yMTdDMzQzLjAzMiA4Ni41MzkzIDM0MS40NyA4Ny4wMjAxIDMzOS45MDcgODcuMDIwMUgzMTQuOTAzQzMxMi42MTkgODcuMDIwMSAzMTEuMjk3IDg2LjQxOTEgMzA5LjQ5NCA4NC40OTU4TDMwNi4xMjggODAuODg5NVY4Ny4wMjAxSDI5NC45NDlWNkgzMDYuMTI4VjM3LjM3NDNMMzA5LjQ5NCAzMy44ODgyQzMxMS40MTcgMzEuODQ0NyAzMTIuNjE5IDMxLjM2MzkgMzE0LjkwMyAzMS4zNjM5SDMzOS45MDdDMzQxLjU5IDMxLjM2MzkgMzQzLjAzMiAzMS44NDQ3IDM0NC4yMzQgMzMuMDQ2OEwzNDkuNjQ0IDM4LjQ1NjFaTTM0MC4xNDcgNzYuODAyNVY0MS40NjEzSDMwNi4xMjhWNzYuODAyNUgzNDAuMTQ3WiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMjc2LjUxMiAzOC40NTYxQzI3Ny43MTQgMzkuNzc4NCAyNzguMzE1IDQxLjEwMDcgMjc4LjMxNSA0Mi43ODM2Vjg3LjAyMDFIMjY3LjAxNlY0MS40NjEzSDIzMi44NzZWODcuMDIwMUgyMjEuNjk3VjZIMjMyLjg3NlYzNy40OTQ1TDIzNi4zNjIgMzMuODg4MkMyMzguNDA2IDMxLjg0NDcgMjM5LjQ4OCAzMS4zNjM5IDI0MS43NzIgMzEuMzYzOUgyNjYuNzc1QzI2OC40NTggMzEuMzYzOSAyNjkuOTAxIDMxLjg0NDcgMjcxLjEwMyAzMy4wNDY4TDI3Ni41MTIgMzguNDU2MVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTE2MC4wNTUgODcuMDE4N0MxNTguODUzIDg3LjAxODcgMTU3LjI5IDg2LjY1OCAxNTUuNzI3IDg1LjA5NTNMMTUwLjQzOCA3OS44MDYyQzE0OS4zNTYgNzguNjA0MSAxNDguODc1IDc3LjA0MTQgMTQ4Ljg3NSA3NS41OTg5VjQyLjY2MTlDMTQ4Ljg3NSA0MC45NzkgMTQ5LjQ3NyAzOS41MzY1IDE1MC40MzggMzguNDU0N0wxNTUuNzI3IDMzLjE2NTVDMTU3LjE3IDMxLjcyMyAxNTguNzMzIDMxLjI0MjIgMTYwLjA1NSAzMS4yNDIySDE5NC45MTZDMTk2LjU5OCAzMS4yNDIyIDE5Ny45MjEgMzEuODQzMiAxOTkuMTIzIDMzLjA0NTNMMjA0LjUzMiAzOC4zMzQ0QzIwNS44NTUgMzkuNjU2NyAyMDYuMzM1IDQwLjk3OSAyMDYuMzM1IDQyLjY2MTlWNzUuNTk4OUMyMDYuMzM1IDc3LjI4MTggMjA1Ljg1NSA3OC42MDQxIDIwNC41MzIgNzkuOTI2NEwxOTkuMTIzIDg1LjIxNTVDMTk3LjkyMSA4Ni40MTc2IDE5Ni41OTggODcuMDE4NyAxOTQuOTE2IDg3LjAxODdIMTYwLjA1NVpNMTYwLjE3NSA3Ni44MDFIMTk1LjAzNlY0MS40NTk5SDE2MC4xNzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNODguOTE0OCA4Ny4wMTg3Qzg3LjcxMjcgODcuMDE4NyA4Ni4xNSA4Ni42NTggODQuNTg3MyA4NS4wOTUzTDc5LjI5ODEgNzkuODA2MkM3OC4yMTYyIDc4LjYwNDEgNzcuNzM1NCA3Ny4wNDE0IDc3LjczNTQgNzUuNTk4OVY0Mi42NjE5Qzc3LjczNTQgNDAuOTc5IDc4LjMzNjQgMzkuNTM2NSA3OS4yOTgxIDM4LjQ1NDdMODQuNTg3MyAzMy4xNjU1Qzg2LjAyOTggMzEuNzIzIDg3LjU5MjUgMzEuMjQyMiA4OC45MTQ4IDMxLjI0MjJIMTIzLjc3NUMxMjUuNDU4IDMxLjI0MjIgMTI2Ljc4MSAzMS44NDMyIDEyNy45ODMgMzMuMDQ1M0wxMzMuMzkyIDM4LjMzNDRDMTM0LjcxNCAzOS42NTY3IDEzNS4xOTUgNDAuOTc5IDEzNS4xOTUgNDIuNjYxOVY3NS41OTg5QzEzNS4xOTUgNzcuMjgxOCAxMzQuNzE0IDc4LjYwNDEgMTMzLjM5MiA3OS45MjY0TDEyNy45ODMgODUuMjE1NUMxMjYuNzgxIDg2LjQxNzYgMTI1LjQ1OCA4Ny4wMTg3IDEyMy43NzUgODcuMDE4N0g4OC45MTQ4Wk04OS4wMzUgNzYuODAxSDEyMy44OTZWNDEuNDU5OUg4OS4wMzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNNTEuMTk4NiA2SDYyLjM3OFY4Ny4wMjAxSDUxLjE5ODZWODAuODg5NUw0Ny44MzI3IDg0LjQ5NThDNDYuMDI5NiA4Ni40MTkxIDQ0LjcwNzMgODcuMDIwMSA0Mi40MjMzIDg3LjAyMDFIMTcuNDE5OUMxNS44NTcxIDg3LjAyMDEgMTQuMjk0NCA4Ni41MzkzIDEzLjA5MjMgODUuMjE3TDcuODAzMTQgNzkuOTI3OUM2LjQ4MDg0IDc4LjYwNTYgNiA3Ny4yODMzIDYgNzUuNjAwNFY0Mi43ODM2QzYgNDEuMTAwNyA2LjQ4MDg0IDM5Ljc3ODQgNy44MDMxNCAzOC40NTYxTDEzLjA5MjMgMzMuMDQ2OEMxNC4yOTQ0IDMxLjg0NDcgMTUuNzM2OSAzMS4zNjM5IDE3LjQxOTkgMzEuMzYzOUg0Mi40MjMzQzQ0LjcwNzMgMzEuMzYzOSA0NS45MDk0IDMxLjg0NDcgNDcuODMyNyAzMy44ODgyTDUxLjE5ODYgMzcuMzc0M1Y2Wk0xNy4xNzk0IDc2LjgwMjVINTEuMTk4NlY0MS40NjEzSDE3LjE3OTRWNzYuODAyNVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTIxLjgzMyA1OC4xNTYySDI3LjQyMTNWNjMuNzQ0NUgyMS44MzNWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTMxLjE0NiA1OC4xNTYySDM2LjczNDNWNjMuNzQ0NUgzMS4xNDZWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTQwLjQ1ODUgNTguMTU2Mkg0Ni4wNDY4VjYzLjc0NDVINDAuNDU4NVY1OC4xNTYyWiIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzg3LjA4MiIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iNDAwLjcxMyIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzkzLjE5MiIgY3k9IjkuOTE4MjgiIHJ4PSIzLjcwNTQxIiByeT0iMy43MDUzOSIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzgwLjIyNCAyOS4zNjkxQzM4MC4yMjQgMjguMTAyNCAzODEuNTUxIDI3LjAzMjQgMzgzLjkxMyAyNi4xMzY2QzM4Ni4yNzUgMjUuMjQwOSAzODkuNDc5IDI0LjczNzcgMzkyLjgxOSAyNC43Mzc3QzM5Ni4xNiAyNC43Mzc3IDM5OS4zNjMgMjUuMjQwOSA0MDEuNzI1IDI2LjEzNjZDNDA0LjA4OCAyNy4wMzI0IDQwNS4yMzQgMjguMTAyNCA0MDUuMjM0IDI5LjM2OTFIMzkyLjcyOUgzODAuMjI0WiIgZmlsbD0iIzI4MDBGRiIvPgo8cmVjdCB4PSIzOTEuMzQiIHk9IjEwLjg0MzgiIHdpZHRoPSIzLjcwNTQxIiBoZWlnaHQ9IjE1Ljc0NzkiIGZpbGw9IiMyODAwRkYiLz4KPC9zdmc+Cg==',\r\n APP_HEADER_LOGO:\r\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjYzIiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDY2MyAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc0XzE1NDYpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYpIi8+CjwvZz4KPHBhdGggZD0iTTYzMi40MzggNTguMDA3OEg2NDkuODY3VjY3LjYyNEg2MzIuNDM4VjEwMy40NDZINjUwLjIyOVYxMTMuNzg0SDYzMy4xNThDNjMxLjQ3NiAxMTMuNzg0IDYzMC41MTQgMTEzLjE4MiA2MjkuMzEyIDExMS45OEw2MjIuOTQgMTA2LjU3MUM2MjEuNzM5IDEwNS4zNjkgNjIxLjEzOCAxMDQuMDQ3IDYyMS4xMzggMTAyLjI0NFY2Ny42MjRINjEyLjg0NFY1OS4yMDlMNjI4LjM1MSA0MS43NzkzSDYzMi40MzhWNTguMDA3OFpNMjQxLjYwNCAxMTMuNzc4SDIzMC40MjVWMTA3LjY0N0wyMjcuMDYgMTExLjI1NEMyMjUuMjU2IDExMy4xNzcgMjIzLjkzMyAxMTMuNzc4IDIyMS42NDkgMTEzLjc3OEgxOTYuNjQ2QzE5NS4wODQgMTEzLjc3OCAxOTMuNTIxIDExMy4yOTcgMTkyLjMxOSAxMTEuOTc1TDE4Ny4wMjkgMTA2LjY4NkMxODUuNzA3IDEwNS4zNjMgMTg1LjIyNyAxMDQuMDQxIDE4NS4yMjcgMTAyLjM1OFY2OS41NDFDMTg1LjIyNyA2Ny44NTg0IDE4NS43MDcgNjYuNTM2IDE4Ny4wMjkgNjUuMjEzOUwxOTIuMzE5IDU5LjgwNDdDMTkzLjUyMSA1OC42MDI3IDE5NC45NjQgNTguMTIyMSAxOTYuNjQ2IDU4LjEyMjFIMjIxLjY0OUMyMjMuOTMzIDU4LjEyMjEgMjI1LjEzNiA1OC42MDMgMjI3LjA2IDYwLjY0NjVMMjMwLjQyNSA2NC4xMzE4VjMyLjc1NzhIMjQxLjYwNFYxMTMuNzc4Wk00MTIuMTAzIDY0LjI1Mkw0MTUuNTg5IDYwLjY0NjVDNDE3LjYzMiA1OC42MDMgNDE4LjcxNCA1OC4xMjIxIDQyMC45OTggNTguMTIyMUg0NDYuMDAyQzQ0Ny42ODUgNTguMTIyMSA0NDkuMTI3IDU4LjYwMjcgNDUwLjMyOSA1OS44MDQ3TDQ1NS43MzggNjUuMjEzOUM0NTYuOTQgNjYuNTM2IDQ1Ny41NDIgNjcuODU4MyA0NTcuNTQyIDY5LjU0MVYxMTMuNzc4SDQ0Ni4yNDJWNjguMjE4OEg0MTIuMTAzVjExMy43NzhINDAwLjkyNFYzMi43NTc4SDQxMi4xMDNWNjQuMjUyWk00ODUuMzU0IDY0LjEzMThMNDg4LjcyMSA2MC42NDY1QzQ5MC42NDQgNTguNjAzIDQ5MS44NDYgNTguMTIyMSA0OTQuMTMgNTguMTIyMUg1MTkuMTM0QzUyMC44MTcgNTguMTIyMSA1MjIuMjU5IDU4LjYwMjcgNTIzLjQ2MSA1OS44MDQ3TDUyOC44NyA2NS4yMTM5QzUzMC4wNzIgNjYuNTM2IDUzMC42NzQgNjcuODU4MyA1MzAuNjc0IDY5LjU0MVYxMDIuMzU4QzUzMC42NzQgMTA0LjA0MSA1MzAuMDcyIDEwNS4zNjMgNTI4Ljg3IDEwNi42ODZMNTIzLjQ2MSAxMTEuOTc1QzUyMi4yNTkgMTEzLjI5NyA1MjAuNjk2IDExMy43NzggNTE5LjEzNCAxMTMuNzc4SDQ5NC4xM0M0OTEuODQ2IDExMy43NzggNDkwLjUyNCAxMTMuMTc3IDQ4OC43MjEgMTExLjI1NEw0ODUuMzU0IDEwNy42NDdWMTEzLjc3OEg0NzQuMTc2VjMyLjc1NzhINDg1LjM1NFY2NC4xMzE4Wk0zMDMuMDAyIDU4QzMwNC42ODUgNTggMzA2LjAwNyA1OC42MDA5IDMwNy4yMDkgNTkuODAyN0wzMTIuNjE5IDY1LjA5MThDMzEzLjk0MSA2Ni40MTQxIDMxNC40MjIgNjcuNzM3IDMxNC40MjIgNjkuNDE5OVYxMDIuMzU2QzMxNC40MjIgMTA0LjAzOSAzMTMuOTQxIDEwNS4zNjIgMzEyLjYxOSAxMDYuNjg1TDMwNy4yMDkgMTExLjk3NEMzMDYuMDA3IDExMy4xNzYgMzA0LjY4NSAxMTMuNzc2IDMwMy4wMDIgMTEzLjc3NkgyNjguMTQyQzI2Ni45NCAxMTMuNzc2IDI2NS4zNzYgMTEzLjQxNiAyNjMuODEzIDExMS44NTRMMjU4LjUyNCAxMDYuNTY0QzI1Ny40NDMgMTA1LjM2MiAyNTYuOTYyIDEwMy43OTkgMjU2Ljk2MiAxMDIuMzU2VjY5LjQxOTlDMjU2Ljk2MiA2Ny43MzcyIDI1Ny41NjMgNjYuMjk0NyAyNTguNTI0IDY1LjIxMjlMMjYzLjgxMyA1OS45MjI5QzI2NS4yNTYgNTguNDgwNCAyNjYuODE5IDU4IDI2OC4xNDIgNThIMzAzLjAwMlpNMzc0LjE0MyA1OEMzNzUuODI1IDU4LjAwMDEgMzc3LjE0OCA1OC42MDA4IDM3OC4zNSA1OS44MDI3TDM4My43NTkgNjUuMDkxOEMzODUuMDgxIDY2LjQxNDEgMzg1LjU2MiA2Ny43MzcgMzg1LjU2MiA2OS40MTk5VjEwMi4zNTZDMzg1LjU2MiAxMDQuMDM5IDM4NS4wODEgMTA1LjM2MiAzODMuNzU5IDEwNi42ODVMMzc4LjM1IDExMS45NzRDMzc3LjE0OCAxMTMuMTc2IDM3NS44MjUgMTEzLjc3NiAzNzQuMTQzIDExMy43NzZIMzM5LjI4MUMzMzguMDc5IDExMy43NzYgMzM2LjUxNyAxMTMuNDE2IDMzNC45NTQgMTExLjg1NEwzMjkuNjY1IDEwNi41NjRDMzI4LjU4MyAxMDUuMzYyIDMyOC4xMDMgMTAzLjc5OSAzMjguMTAzIDEwMi4zNTZWNjkuNDE5OUMzMjguMTAzIDY3LjczNzEgMzI4LjcwMyA2Ni4yOTQ4IDMyOS42NjUgNjUuMjEyOUwzMzQuOTU0IDU5LjkyMjlDMzM2LjM5NiA1OC40ODA3IDMzNy45NTkgNTguMDAwMSAzMzkuMjgxIDU4SDM3NC4xNDNaTTU4OS45MDYgNThDNTkxLjU4OSA1OCA1OTIuOTExIDU4LjYwMDkgNTk0LjExMyA1OS44MDI3TDU5OS41MjMgNjUuMDkxOEM2MDAuODQ2IDY2LjQxNDEgNjAxLjMyNiA2Ny43MzcgNjAxLjMyNiA2OS40MTk5VjEwMi4zNTZDNjAxLjMyNiAxMDQuMDM5IDYwMC44NDYgMTA1LjM2MiA1OTkuNTIzIDEwNi42ODVMNTk0LjExMyAxMTEuOTc0QzU5Mi45MTEgMTEzLjE3NiA1OTEuNTg5IDExMy43NzYgNTg5LjkwNiAxMTMuNzc2SDU1NS4wNDZDNTUzLjg0NCAxMTMuNzc2IDU1Mi4yOCAxMTMuNDE2IDU1MC43MTggMTExLjg1NEw1NDUuNDI5IDEwNi41NjRDNTQ0LjM0NyAxMDUuMzYyIDU0My44NjYgMTAzLjc5OSA1NDMuODY2IDEwMi4zNTZWNjkuNDE5OUM1NDMuODY2IDY3LjczNzIgNTQ0LjQ2NyA2Ni4yOTQ3IDU0NS40MjkgNjUuMjEyOUw1NTAuNzE4IDU5LjkyMjlDNTUyLjE2IDU4LjQ4MDQgNTUzLjcyNCA1OCA1NTUuMDQ2IDU4SDU4OS45MDZaTTE5Ni40MDYgMTAzLjU2MUgyMzAuNDI1VjY4LjIxODhIMTk2LjQwNlYxMDMuNTYxWk00ODUuMzU0IDEwMy41NjFINTE5LjM3NFY2OC4yMTg4SDQ4NS4zNTRWMTAzLjU2MVpNMjY4LjI2MiAxMDMuNTU5SDMwMy4xMjJWNjguMjE3OEgyNjguMjYyVjEwMy41NTlaTTMzOS40MDEgMTAzLjU1OUgzNzQuMjYzVjY4LjIxNzhIMzM5LjQwMVYxMDMuNTU5Wk01NTUuMTY2IDEwMy41NTlINTkwLjAyNlY2OC4yMTc4SDU1NS4xNjZWMTAzLjU1OVpNMjA2LjY0NyA5MC41MDJIMjAxLjA2Vjg0LjkxNDFIMjA2LjY0N1Y5MC41MDJaTTIxNS45NjEgOTAuNTAySDIxMC4zNzNWODQuOTE0MUgyMTUuOTYxVjkwLjUwMlpNMjI1LjI3MyA5MC41MDJIMjE5LjY4NlY4NC45MTQxSDIyNS4yNzNWOTAuNTAyWk01NjYuMzA5IDgyLjExODJDNTY4LjQ2IDgyLjExODIgNTcwLjIwNCA4My44NjI2IDU3MC4yMDQgODYuMDEzN0M1NzAuMjA0IDg4LjE2NDYgNTY4LjQ2IDg5LjkwODIgNTY2LjMwOSA4OS45MDgyQzU2NC4xNTggODkuOTA4MSA1NjIuNDE0IDg4LjE2NDUgNTYyLjQxNCA4Ni4wMTM3QzU2Mi40MTQgODMuODYyNyA1NjQuMTU4IDgyLjExODMgNTY2LjMwOSA4Mi4xMTgyWk01NzkuOTM5IDgyLjExODJDNTgyLjA5MSA4Mi4xMTgyIDU4My44MzQgODMuODYyNiA1ODMuODM0IDg2LjAxMzdDNTgzLjgzNCA4OC4xNjQ2IDU4Mi4wOSA4OS45MDgyIDU3OS45MzkgODkuOTA4MkM1NzcuNzg4IDg5LjkwODIgNTc2LjA0NSA4OC4xNjQ2IDU3Ni4wNDUgODYuMDEzN0M1NzYuMDQ1IDgzLjg2MjYgNTc3Ljc4OCA4Mi4xMTgyIDU3OS45MzkgODIuMTE4MlpNNTcyLjQxOSAzMi45NzA3QzU3NC40NjUgMzIuOTcwNyA1NzYuMTI0IDM0LjYyOTUgNTc2LjEyNCAzNi42NzU4QzU3Ni4xMjQgMzguMDQ3IDU3NS4zNzkgMzkuMjQzIDU3NC4yNzEgMzkuODgzOFY1MS41NzIzQzU3Ni43ODUgNTEuNzQzNCA1NzkuMTIxIDUyLjIwMDMgNTgwLjk1MiA1Mi44OTQ1QzU4My4zMTQgNTMuNzkwMiA1ODQuNDYxIDU0Ljg2MDQgNTg0LjQ2MSA1Ni4xMjdINTU5LjQ1QzU1OS40NTEgNTQuODYwNCA1NjAuNzc4IDUzLjc5MDIgNTYzLjE0IDUyLjg5NDVDNTY1LjE1IDUyLjEzMjEgNTY3Ljc3MSA1MS42NTU2IDU3MC41NjYgNTEuNTMwM1YzOS44ODQ4QzU2OS40NTkgMzkuMjQ0IDU2OC43MTQgMzguMDQ3MiA1NjguNzE0IDM2LjY3NThDNTY4LjcxNCAzNC42Mjk1IDU3MC4zNzMgMzIuOTcwNyA1NzIuNDE5IDMyLjk3MDdaIiBmaWxsPSIjMjgwMEZGIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iNi4wMDMwNiIgeTE9IjYiIHgyPSIxNDIuOTcyIiB5Mj0iMTQzLjIyNiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfMjM3NF8xNTQ2IiB4MT0iMTQzLjIyNyIgeTE9Ijc2LjgwNDYiIHgyPSIyNi4wMDEiIHkyPSIxMjIuOTY0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYiIHgxPSI1OC4yNTQxIiB5MT0iNTguMTY3IiB4Mj0iNTMuOTExNyIgeTI9IjEzMi45NTEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMzc0XzE1NDYiPgo8cGF0aCBkPSJNNiA2SDExMy4yMjdDMTI5Ljc5NSA2IDE0My4yMjcgMTkuNDMxNSAxNDMuMjI3IDM2VjExMi45NzVDMTQzLjIyNyAxMjkuNTQ0IDEyOS43OTUgMTQyLjk3NSAxMTMuMjI3IDE0Mi45NzVINlY2WiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K',\r\n USER_AVATAR:\r\n 'data:image/png;base64,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',\r\n BOT_AVATAR:\r\n 'data:image/png;base64,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',\r\n};\r\n","export const appEmoji = {\r\n waveHand: '\\u{1F44B}',\r\n robotFace: '\\u{1F916}',\r\n partyPopper: '\\u{1F389}',\r\n thinkingFace: '\\u{1F914}',\r\n thumbsUp: '\\u{1F44D}',\r\n thumbsDown: '\\u{1F44E}',\r\n redHeart: '\\u{2764}\\u{FE0F}',\r\n};\r\n","// export const environment = {\r\n// staging: false,\r\n// development: false,\r\n// production: true,\r\n// chatApiUrl: 'https://api.production.com',\r\n// apiKey: '',\r\n// };\r\nexport const environment = {\r\n config: 'const/app-const.json',\r\n production: false,\r\n apiBaseUrl: '',\r\n loginEndpoint: '',\r\n apiSegment: 'api/v1/',\r\n};\r\n","import { isDevMode } from '@angular/core';\r\n\r\nclass Logger {\r\n private static prefix = '[Doohbot]';\r\n\r\n // 🎨 Color styles\r\n private static styles = {\r\n log: 'color:#2196f3; font-weight:500',\r\n info: 'color:#4caf50; font-weight:500',\r\n warn: 'color:#ff9800; font-weight:600',\r\n error: 'color:#f44336; font-weight:700',\r\n debug: 'color:#9c27b0; font-weight:500',\r\n };\r\n\r\n private static canLog(): boolean {\r\n return isDevMode();\r\n }\r\n\r\n static log(message: string, ...args: any[]): void {\r\n if (!this.canLog()) return;\r\n console.log(`%c${this.prefix} ${message}`, this.styles.log, ...args);\r\n }\r\n\r\n static info(message: string, ...args: any[]): void {\r\n if (!this.canLog()) return;\r\n console.info(`%c${this.prefix} ${message}`, this.styles.info, ...args);\r\n }\r\n\r\n static warn(message: string, ...args: any[]): void {\r\n if (!this.canLog()) return;\r\n console.warn(`%c${this.prefix} ${message}`, this.styles.warn, ...args);\r\n }\r\n\r\n static error(message: string, ...args: any[]): void {\r\n if (!this.canLog()) return;\r\n console.error(`%c${this.prefix} ${message}`, this.styles.error, ...args);\r\n }\r\n\r\n static debug(message: string, ...args: any[]): void {\r\n if (!this.canLog()) return;\r\n console.debug(`%c${this.prefix} ${message}`, this.styles.debug, ...args);\r\n }\r\n}\r\n\r\nexport default Logger;\r\n","import { Injectable } from '@angular/core';\r\nimport { environment } from './environments/environment';\r\nimport { environment as environmentprod } from './environments/environment';\r\nimport { ReplaySubject } from 'rxjs';\r\nimport logger from './utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AppConst {\r\n static data: any;\r\n public config$ = new ReplaySubject<any>(1);\r\n\r\n constructor() {}\r\n\r\n async load(): Promise<any> {\r\n const filePath = `./assets/${environment.production ? environmentprod.config : environment.config}?t=${new Date().getTime()}`;\r\n const response = await fetch(filePath);\r\n\r\n if (!response.ok) {\r\n logger.error('============================ ERROR ============================');\r\n logger.error(`Could not find file ${filePath}`);\r\n logger.error('============================ ERROR ============================');\r\n }\r\n\r\n logger.error('============================ AppConst ============================', filePath);\r\n if (response.ok) {\r\n try {\r\n AppConst.data = await response.json();\r\n this.config$.next(AppConst.data);\r\n logger.error(\r\n '============================ AppConst ============================',\r\n AppConst.data,\r\n );\r\n // Override apiBaseUrl if present in environment\r\n // if (environment.apiBaseUrl) {\r\n // AppConst.data.apiBaseUrl = environment.apiBaseUrl;\r\n // }\r\n // // Override loginEndpoint if present in environment\r\n // if (environment.loginEndpoint) {\r\n // AppConst.data.loginEndpoint = environment.loginEndpoint;\r\n // }\r\n } catch (error: any) {\r\n logger.error('============================ ERROR ============================');\r\n logger.error(`Could not find file ${filePath}.\\nMESSAGE: ${error.message}`);\r\n logger.error('============================ ERROR ============================');\r\n }\r\n\r\n if (AppConst.data && !Object.keys(AppConst.data).length) {\r\n logger.error('============================ ERROR ============================');\r\n logger.error(`No data found in file ${filePath}`);\r\n logger.error('============================ ERROR ============================');\r\n }\r\n } else {\r\n logger.error('============================ ERROR ============================');\r\n logger.error(\r\n `Failed to load file ${filePath}.\\nMESSAGE: Request failed with ${response.status} / ${response.statusText}`,\r\n );\r\n logger.error('============================ ERROR ============================');\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CryptoHelperService {\r\n private encoder = new TextEncoder();\r\n private decoder = new TextDecoder();\r\n private secretKey = ''; // Will be set by AuthService\r\n\r\n setSecretKey(key: string) {\r\n this.secretKey = key;\r\n }\r\n\r\n private async getKey() {\r\n const salt = this.encoder.encode('fixed_salt'); // Keep constant\r\n const baseKey = await crypto.subtle.importKey(\r\n 'raw',\r\n this.encoder.encode(this.secretKey),\r\n 'PBKDF2',\r\n false,\r\n ['deriveKey'],\r\n );\r\n\r\n return crypto.subtle.deriveKey(\r\n {\r\n name: 'PBKDF2',\r\n salt,\r\n iterations: 100000,\r\n hash: 'SHA-256',\r\n },\r\n baseKey,\r\n { name: 'AES-GCM', length: 256 },\r\n false,\r\n ['encrypt', 'decrypt'],\r\n );\r\n }\r\n\r\n async encrypt(value: string): Promise<string | null> {\r\n if (!value) return null;\r\n\r\n const key = await this.getKey();\r\n const iv = crypto.getRandomValues(new Uint8Array(12));\r\n\r\n const encrypted = await crypto.subtle.encrypt(\r\n { name: 'AES-GCM', iv },\r\n key,\r\n this.encoder.encode(value),\r\n );\r\n\r\n const merged = new Uint8Array(iv.length + encrypted.byteLength);\r\n merged.set(iv, 0);\r\n merged.set(new Uint8Array(encrypted), iv.length);\r\n\r\n return btoa(String.fromCharCode(...merged));\r\n }\r\n\r\n async decrypt(value: string): Promise<string | null> {\r\n if (!value) return null;\r\n\r\n const raw = Uint8Array.from(atob(value), (c) => c.charCodeAt(0));\r\n\r\n const iv = raw.slice(0, 12);\r\n const data = raw.slice(12);\r\n\r\n const key = await this.getKey();\r\n\r\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, data);\r\n\r\n return this.decoder.decode(decrypted);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport * as CryptoJS from 'crypto-js';\r\nimport { AppConst } from '../app-const';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TokenStorageService {\r\n private readonly STORAGE_VERSION = '1.0';\r\n private storageKey: string;\r\n private secretKey: string;\r\n\r\n constructor() {\r\n this.storageKey = AppConst?.data?.storageKey || 'doohbot_storage';\r\n this.secretKey = AppConst?.data?.secretKey || 'doohbot_secret';\r\n }\r\n\r\n set(key: string, value: any): void {\r\n const data = localStorage.getItem(this.storageKey);\r\n let dataJson: any = {};\r\n if (data) {\r\n const dataDec = this.decrypt(data);\r\n if (dataDec) {\r\n dataJson = JSON.parse(dataDec);\r\n }\r\n }\r\n dataJson = Object.assign(dataJson, { [key]: value });\r\n localStorage.setItem(this.storageKey, this.encrypt(JSON.stringify(dataJson)));\r\n }\r\n\r\n get(key: string): any {\r\n const data = localStorage.getItem(this.storageKey);\r\n if (data) {\r\n const dataDec = this.decrypt(data);\r\n if (dataDec) {\r\n try {\r\n const dataJson = JSON.parse(dataDec);\r\n return dataJson![key] || null;\r\n } catch (e) {\r\n console.error(\r\n '[TokenStorage] Failed to parse decrypted data, clearing corrupt storage',\r\n e,\r\n );\r\n this.clear();\r\n return null;\r\n }\r\n } else {\r\n // Decrypt failed, auto-clear corrupt storage\r\n console.error('[TokenStorage] Decrypt failed, clearing corrupt storage');\r\n this.clear();\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Check if storage is valid (can be decrypted) without side effects\r\n */\r\n isValid(): boolean {\r\n const data = localStorage.getItem(this.storageKey);\r\n if (!data) return false;\r\n const decrypted = this.decrypt(data);\r\n return decrypted !== null && decrypted !== '';\r\n }\r\n\r\n clear(): void {\r\n localStorage.removeItem(this.storageKey);\r\n }\r\n\r\n private encrypt(value: string): string {\r\n return CryptoJS.AES.encrypt(value, this.secretKey).toString();\r\n }\r\n\r\n private decrypt(value: string): string | null {\r\n try {\r\n const bytes = CryptoJS.AES.decrypt(value, this.secretKey);\r\n const decrypted = bytes.toString(CryptoJS.enc.Utf8);\r\n return decrypted || null;\r\n } catch (e) {\r\n console.error('[TokenStorage] Decryption error:', e);\r\n return null;\r\n }\r\n }\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { AppConst } from '../app-const';\r\nimport { BehaviorSubject, map, Observable, catchError, of, tap } from 'rxjs';\r\nimport { AuthResult } from './models/auth-result.model';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { CryptoHelperService } from '../helpers/crypto-helper.service';\r\nimport { TokenStorageService } from './token-storage.service';\r\nimport logger from '../utils/logger.service';\r\nimport { AuthStatus } from '../types/auth-status.type';\r\n\r\n//! inherit Window storageEventAdded for duplicate tab detection\r\ndeclare global {\r\n interface Window {\r\n storageEventAdded?: boolean;\r\n tabCLoseEventAdded?: boolean;\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthService {\r\n apiUrl: string;\r\n storageKey: string;\r\n secretKey: string;\r\n companyCode: string;\r\n jwtHelper: JwtHelperService = new JwtHelperService();\r\n\r\n // Reactive Authentication State\r\n private authStatusSubject = new BehaviorSubject<AuthStatus>('unknown');\r\n public authStatus$ = this.authStatusSubject.asObservable();\r\n\r\n // Session timers\r\n private refreshTimer?: any;\r\n private readonly REFRESH_THRESHOLD_MS = 5 * 60 * 1000; // 5 minutes before expiry\r\n\r\n //! Refresh retry tracking\r\n private refreshRetries = 0;\r\n private readonly MAX_REFRESH_RETRIES = 3;\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private cryptoHelper: CryptoHelperService,\r\n private tokenStorage: TokenStorageService,\r\n // private cacheService: NgxCacheService,\r\n // private snackBar: MatSnackBar,\r\n ) {\r\n this.apiUrl = `${AppConst?.data?.apiBaseUrl}${AppConst?.data?.apiSegment}`;\r\n this.storageKey = AppConst?.data?.storageKey;\r\n this.secretKey = AppConst?.data?.secretKey;\r\n this.companyCode = AppConst?.data?.companyCode;\r\n this.cryptoHelper.setSecretKey(this.secretKey);\r\n }\r\n\r\n // Add getters for backward compatibility if needed, but preferably use authStatus$\r\n public get authStatus(): AuthStatus {\r\n return this.authStatusSubject.value;\r\n }\r\n\r\n logout(): Observable<boolean> {\r\n const url = `${this.apiUrl}Account/Logout`;\r\n return this.http.post(url, {}).pipe(\r\n map((response: any) => {\r\n if (response && response.success) {\r\n this.clearAuth();\r\n // this.redirectOut();\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }),\r\n );\r\n }\r\n\r\n // redirectIn() {\r\n // let redirectUrl = this.getCurrentNavigationUrl();\r\n // redirectUrl = redirectUrl || AppConst?.data?.redirectUrl || '/login';\r\n // this.router.navigate([redirectUrl], { replaceUrl: true });\r\n // }\r\n\r\n // redirectOut() {\r\n // this.router.navigate(['/login'], { replaceUrl: true });\r\n // }\r\n\r\n // Utility\r\n setSession(session: AuthResult) {\r\n const user = this.jwtHelper.decodeToken(session.access_token);\r\n this.tokenStorage.set('access_token', session.access_token);\r\n this.tokenStorage.set('refresh_token', session.refresh_token);\r\n this.tokenStorage.set('user_id', user?.user_id);\r\n this.tokenStorage.set('username', user?.username);\r\n this.tokenStorage.set('roles', user?.roles);\r\n this.tokenStorage.set('permissions', user?.permissions);\r\n this.tokenStorage.set('organization_id', user?.organization_id);\r\n this.tokenStorage.set('company_id', user?.company_id);\r\n this.tokenStorage.set('office_id', user?.office_id);\r\n\r\n // Reset refresh retries on successful session\r\n this.refreshRetries = 0;\r\n\r\n // Notify subscribers\r\n this.authStatusSubject.next('authenticated');\r\n this.scheduleProactiveRefresh();\r\n }\r\n\r\n /**\r\n * Schedules a proactive refresh of the access token if it is near expiration.\r\n * If the token is already expired, it will trigger a refresh immediately.\r\n * If the token is not near expiration, it will schedule a refresh just before the expiration.\r\n * The refresh is done using the refresh token stored in local storage.\r\n * If the refresh token is not available, it will not trigger a refresh.\r\n * If the refresh fails, it will log an error but not retry.\r\n */\r\n private scheduleProactiveRefresh() {\r\n if (this.refreshTimer) {\r\n clearTimeout(this.refreshTimer);\r\n }\r\n\r\n const token = this.tokenStorage.get('access_token');\r\n if (!token) return;\r\n\r\n const expiryTime = this.jwtHelper.getTokenExpirationDate(token)?.getTime();\r\n if (!expiryTime) return;\r\n\r\n const now = Date.now();\r\n const delay = expiryTime - now - this.REFRESH_THRESHOLD_MS;\r\n\r\n if (delay > 0) {\r\n logger.log(`[Auth] Scheduling proactive refresh in ${Math.round(delay / 1000)}s`);\r\n this.refreshTimer = setTimeout(() => {\r\n logger.log('[Auth] Running proactive refresh');\r\n this.refreshToken().subscribe({\r\n error: (err) => logger.error('[Auth] Proactive refresh failed:', err),\r\n });\r\n }, delay);\r\n } else if (this.getRefreshToken()) {\r\n this.refreshToken().subscribe();\r\n }\r\n }\r\n\r\n getOrganizationId(): string | null {\r\n logger.debug('>>>>>>>>>>getOrganizationId<<<<<<<:', this.tokenStorage.get('organization_id'));\r\n return this.tokenStorage.get('organization_id');\r\n }\r\n\r\n getRefreshToken(): string | null {\r\n logger.debug('>>>>>>>>>>getRefreshToken<<<<<<<:', this.tokenStorage.get('refresh_token'));\r\n return this.tokenStorage.get('refresh_token');\r\n }\r\n\r\n refreshToken(): Observable<AuthResult> {\r\n const refreshToken = this.getRefreshToken();\r\n if (!refreshToken) {\r\n throw new Error('No refresh token available');\r\n }\r\n\r\n const url = `${this.apiUrl}auth/refresh`;\r\n return this.http.post<any>(url, { refresh_token: refreshToken }).pipe(\r\n tap((response: any) => {\r\n if (response && response.success && response.data) {\r\n this.setSession(response.data);\r\n }\r\n }),\r\n map((response: any) => {\r\n if (response && response.success && response.data) {\r\n return response.data as AuthResult;\r\n } else {\r\n this.clearAuth();\r\n throw new Error('Token refresh failed');\r\n }\r\n }),\r\n );\r\n }\r\n\r\n //TODO: --Done\r\n // if expired, check if refresh token exists\r\n // if yes, refresh\r\n // save the auth result\r\n\r\n isAuthenticated(): boolean {\r\n const token = this.tokenStorage.get('access_token');\r\n return !!token && !this.isTokenExpired();\r\n }\r\n\r\n isTokenExpired(): boolean {\r\n let token = (this.tokenStorage.get('access_token') ?? '') as string;\r\n if (token) {\r\n return this.jwtHelper.isTokenExpired(token);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n /**\r\n * Validate stored token on app startup\r\n */\r\n validateStoredToken(): Observable<AuthStatus> {\r\n const accessToken = this.tokenStorage.get('access_token');\r\n\r\n // 1. No token at all\r\n if (!accessToken) {\r\n this.authStatusSubject.next('unauthenticated');\r\n return of('unauthenticated');\r\n }\r\n\r\n // 2. Token valid\r\n if (!this.isTokenExpired()) {\r\n this.authStatusSubject.next('authenticated');\r\n this.scheduleProactiveRefresh();\r\n return of('authenticated');\r\n }\r\n\r\n // 3. Token expired -> try refresh\r\n const refreshToken = this.getRefreshToken();\r\n if (!refreshToken) {\r\n this.clearAuth();\r\n this.authStatusSubject.next('unauthenticated');\r\n return of('unauthenticated');\r\n }\r\n\r\n this.authStatusSubject.next('expired');\r\n return this.refreshToken().pipe(\r\n map(() => {\r\n this.authStatusSubject.next('authenticated');\r\n return 'authenticated' as AuthStatus;\r\n }),\r\n catchError((err) => {\r\n logger.error('[Auth] Initial refresh failed:', err);\r\n this.clearAuth();\r\n this.authStatusSubject.next('unauthenticated');\r\n return of('unauthenticated' as AuthStatus);\r\n }),\r\n );\r\n }\r\n\r\n getUserId() {\r\n return this.tokenStorage.get('user_id') || 0;\r\n }\r\n\r\n get licenseKey(): string {\r\n return this.tokenStorage.get('license_key') || AppConst.data?.licenseKey || '';\r\n }\r\n\r\n get isFederated(): boolean {\r\n return this.licenseKey.startsWith('doohbot_lic_');\r\n }\r\n\r\n setLicenseKey(key: string) {\r\n this.tokenStorage.set('license_key', key);\r\n }\r\n\r\n //! clear local storage\r\n /**\r\n * Clear all authentication related data from local storage, session storage, cache, and tokens.\r\n * This method is called when the user logs out.\r\n */\r\n clearAuth() {\r\n const userId = this.getUserId();\r\n logger.log('[Auth] Clearing auth', { userId });\r\n\r\n this.clearSession();\r\n this.clearStorage();\r\n this.clearCache();\r\n this.clearLocalStorage();\r\n\r\n // Reset refresh retries\r\n this.refreshRetries = 0;\r\n\r\n if (this.refreshTimer) {\r\n clearTimeout(this.refreshTimer);\r\n }\r\n\r\n // ENSURE authStatus$ emits unauthenticated\r\n this.authStatusSubject.next('unauthenticated');\r\n\r\n logger.log('[Auth] Auth cleared successfully');\r\n }\r\n\r\n clearSession() {\r\n sessionStorage.clear();\r\n }\r\n\r\n clearTabInfo() {\r\n localStorage.removeItem('tabs');\r\n }\r\n\r\n clearStorage() {\r\n this.tokenStorage.clear();\r\n }\r\n clearLocalStorage() {\r\n localStorage.clear();\r\n }\r\n\r\n clearCache() {\r\n // this.cacheService.clear();\r\n }\r\n}\r\n","import {\r\n HttpErrorResponse,\r\n HttpEvent,\r\n HttpHandler,\r\n HttpInterceptor,\r\n HttpRequest,\r\n} from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, catchError, filter, Observable, switchMap, take, throwError } from 'rxjs';\r\nimport { AuthService } from '../auth/auth.service';\r\nimport { TokenStorageService } from '../auth/token-storage.service';\r\nimport { Injector } from '@angular/core';\r\nimport { AppConst } from '../app-const';\r\nimport logger from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n private isRefreshing = false;\r\n private clearingAuth = false; // Prevent multiple clearAuth calls\r\n private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);\r\n\r\n constructor(\r\n private tokenStorage: TokenStorageService,\r\n private injector: Injector,\r\n ) {}\r\n\r\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n const authReq = this.getRequestWithHeaders(req);\r\n\r\n return next.handle(authReq).pipe(\r\n catchError((error) => {\r\n // Handle 401 Unauthorized errors\r\n if (\r\n error instanceof HttpErrorResponse &&\r\n error.status === 401 &&\r\n !authReq.url.includes('auth/login') && // Don't retry login\r\n !authReq.url.includes('auth/refresh') // Don't retry refresh itself\r\n ) {\r\n logger.error('[AuthInterceptor] 401 Unauthorized:', {\r\n url: authReq.url,\r\n userId: this.tokenStorage.get('user_id'),\r\n });\r\n return this.handle401Error(authReq, next);\r\n }\r\n return throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n private handle401Error(request: HttpRequest<any>, next: HttpHandler) {\r\n // If already clearing, don't retry\r\n if (this.clearingAuth) {\r\n logger.log('[AuthInterceptor] Already clearing auth, rejecting request');\r\n return throwError(() => new Error('Authentication cleared'));\r\n }\r\n\r\n if (!this.isRefreshing) {\r\n this.isRefreshing = true;\r\n this.refreshTokenSubject.next(null);\r\n\r\n const authService = this.injector.get(AuthService);\r\n return authService.refreshToken().pipe(\r\n switchMap((token: any) => {\r\n this.isRefreshing = false;\r\n this.refreshTokenSubject.next(token.access_token);\r\n // Retry the original request with the new token\r\n return next.handle(this.getRequestWithHeaders(request));\r\n }),\r\n catchError((err) => {\r\n this.isRefreshing = false;\r\n // Refresh failed - logout user (only once)\r\n if (!this.clearingAuth) {\r\n this.clearingAuth = true;\r\n const authService = this.injector.get(AuthService);\r\n authService.clearAuth();\r\n this.clearingAuth = false;\r\n }\r\n return throwError(() => err);\r\n }),\r\n );\r\n } else {\r\n // Wait while getting new token\r\n return this.refreshTokenSubject.pipe(\r\n filter((token) => token != null),\r\n take(1),\r\n switchMap((jwt) => {\r\n // Rewrite with new token and retry\r\n return next.handle(this.getRequestWithHeaders(request));\r\n }),\r\n );\r\n }\r\n }\r\n\r\n getRequestWithHeaders(req: HttpRequest<any>): HttpRequest<any> {\r\n let headers = req.headers;\r\n // Get fresh token from new storage service\r\n const token = this.tokenStorage.get('access_token') ?? '';\r\n const licenseKey = this.tokenStorage.get('license_key') || AppConst.data?.licenseKey || '';\r\n\r\n if (token != '') {\r\n headers = headers.set('authorization', `Bearer ${token}`);\r\n }\r\n\r\n if (licenseKey) {\r\n headers = headers.set('x-license-key', licenseKey);\r\n }\r\n\r\n return req.clone({ headers });\r\n }\r\n}\r\n","import { Injectable, OnDestroy, Renderer2, RendererFactory2, signal } from '@angular/core';\r\nimport { OverlayContainer } from '@angular/cdk/overlay';\r\nimport { DoohbotThemeConfig } from '../models/theme-config.model';\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'auto';\r\n\r\n// const DEFAULT_THEME_CONFIG: DoohbotThemeConfig = {\r\n// fontFamily: \"'Roboto', Arial, sans-serif\",\r\n// primaryColor: '#2800ff',\r\n// secondaryColor: '#08dacf',\r\n// backgroundColor: '#f8f9fa, #1a1717',\r\n// chatInputColor: '#f8f9fa, #1a1717',\r\n// textAltColor: '#000000, #ffffff',\r\n// buttonColor: '#000000, #ffffff',\r\n// textColor: '#333, #f5f5f5',\r\n// secondaryTextColor: '#858585, #a1a1a1',\r\n// hintTextColor: '#858585, #a1a1a1',\r\n// userMessageColor: '#2800ff',\r\n// botMessageColor: '#e9ecef, #333',\r\n// userTextColor: '#fff',\r\n// botTextColor: '#333, #fff',\r\n// borderColor: '#ccc, #444',\r\n// borderShadowColor: '0 4px 16px rgba(0, 0, 0, 0.25), 0 4px 16px rgba(0, 0, 0, 0.75)',\r\n// borderTopColor: '#dddddd00, #44444400',\r\n// typingIndicatorColor: '#999, #bbb',\r\n// white: '#ffffff',\r\n// black: '#000000',\r\n// grey: '#6c757d, #9ca3af',\r\n// red: '#ff0000',\r\n// lightRed: '#f28b8b',\r\n// };\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService implements OnDestroy {\r\n private renderer: Renderer2;\r\n private _theme = signal<ThemeMode>('auto');\r\n public theme = this._theme.asReadonly();\r\n\r\n private _activeTheme = signal<'light-theme' | 'dark-theme'>('light-theme');\r\n public activeTheme = this._activeTheme.asReadonly();\r\n\r\n private observer: MutationObserver | null = null;\r\n // private mediaQueryListener: ((e: MediaQueryListEvent) => void) | null = null;\r\n\r\n constructor(\r\n rendererFactory: RendererFactory2,\r\n private overlay: OverlayContainer,\r\n ) {\r\n this.renderer = rendererFactory.createRenderer(null, null);\r\n // Initialize theme from local storage or default to auto\r\n const savedTheme = localStorage.getItem('theme') as ThemeMode;\r\n this.setTheme(savedTheme || 'auto');\r\n }\r\n\r\n setTheme(mode: ThemeMode): void {\r\n this._theme.set(mode);\r\n localStorage.setItem('theme', mode);\r\n this.updateActiveTheme(mode);\r\n }\r\n\r\n private updateActiveTheme(mode: ThemeMode) {\r\n this.cleanupObservers();\r\n\r\n if (mode === 'auto') {\r\n this.handleAutoTheme();\r\n } else {\r\n const themeToApply = mode === 'dark' ? 'dark-theme' : 'light-theme';\r\n this._activeTheme.set(themeToApply);\r\n this.applyThemeToGlobal(themeToApply);\r\n }\r\n }\r\n\r\n private handleAutoTheme() {\r\n // Initial detection\r\n this.detectAndApplyParentTheme();\r\n\r\n // Watch for changes in parent\r\n this.observer = new MutationObserver(() => {\r\n this.detectAndApplyParentTheme();\r\n });\r\n\r\n this.observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n this.observer.observe(document.body, {\r\n attributes: true,\r\n attributeFilter: ['class', 'data-theme'],\r\n });\r\n\r\n // Also listen to system preference as a fallback or if parent doesn't specify\r\n // const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\r\n // this.mediaQueryListener = (e) => {\r\n // // Re-run detection which prioritizes parent classes but falls back to system\r\n // this.detectAndApplyParentTheme();\r\n // };\r\n // mediaQuery.addEventListener('change', this.mediaQueryListener);\r\n }\r\n\r\n private detectAndApplyParentTheme() {\r\n const isDark = this.isParentDark();\r\n const newTheme = isDark ? 'dark-theme' : 'light-theme';\r\n\r\n // Only update if changed to avoid unnecessary DOM updates\r\n if (this._activeTheme() !== newTheme) {\r\n this._activeTheme.set(newTheme);\r\n this.applyThemeToGlobal(newTheme);\r\n }\r\n }\r\n\r\n private isParentDark(): boolean {\r\n const body = document.body;\r\n const html = document.documentElement;\r\n\r\n // Check for common class names\r\n const darkClasses = ['dark', 'dark-theme', 'dark-mode', 'night-mode'];\r\n const hasDarkClass = (el: HTMLElement) => darkClasses.some((c) => el.classList.contains(c));\r\n\r\n if (hasDarkClass(body) || hasDarkClass(html)) return true;\r\n\r\n // Check for data-theme attribute\r\n if (body.getAttribute('data-theme') === 'dark' || html.getAttribute('data-theme') === 'dark')\r\n return true;\r\n\r\n // Check for Bootstrap 5.3+ data-bs-theme\r\n if (\r\n body.getAttribute('data-bs-theme') === 'dark' ||\r\n html.getAttribute('data-bs-theme') === 'dark'\r\n ) {\r\n return true;\r\n }\r\n\r\n // Fallback to system preference\r\n // return window.matchMedia('(prefers-color-scheme: dark)').matches;\r\n return false;\r\n }\r\n\r\n private applyThemeToGlobal(theme: 'light-theme' | 'dark-theme') {\r\n // We do NOT touch document.body anymore to avoid conflicts\r\n const overlayContainer = this.overlay.getContainerElement();\r\n\r\n // Only apply to overlay container (for menus/dialogs)\r\n // The main chat window handles its own theme via the host binding in doohbot.component.ts\r\n this.renderer.removeClass(overlayContainer, 'light-theme');\r\n this.renderer.removeClass(overlayContainer, 'dark-theme');\r\n this.renderer.addClass(overlayContainer, theme);\r\n }\r\n\r\n private cleanupObservers() {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = null;\r\n }\r\n // if (this.mediaQueryListener) {\r\n // window\r\n // .matchMedia('(prefers-color-scheme: dark)')\r\n // .removeEventListener('change', this.mediaQueryListener);\r\n // this.mediaQueryListener = null;\r\n // }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanupObservers();\r\n }\r\n\r\n public applyCssVariables(element: HTMLElement, config: DoohbotThemeConfig | undefined) {\r\n if (!config) return;\r\n\r\n //! Made for popout windows where we need to apply styles to a specific element\r\n // const activeConfig = config || DEFAULT_THEME_CONFIG;\r\n\r\n const isDark = this._activeTheme() === 'dark-theme';\r\n\r\n const applyColor = (input: string | undefined, variableName: string) => {\r\n if (input) {\r\n const { light, dark } = this.parseColor(input);\r\n const colorToUse = isDark ? dark : light;\r\n element.style.setProperty(`--${variableName}`, colorToUse);\r\n } else {\r\n element.style.removeProperty(`--${variableName}`);\r\n }\r\n };\r\n\r\n applyColor(config.fontFamily, 'font-family');\r\n applyColor(config.primaryColor, 'primary-color');\r\n applyColor(config.secondaryColor, 'secondary-color');\r\n applyColor(config.backgroundColor, 'background-color');\r\n applyColor(config.chatInputColor, 'chat-input-color');\r\n applyColor(config.textAltColor, 'text-alt-color');\r\n applyColor(config.buttonColor, 'button-color');\r\n applyColor(config.textColor, 'text-color');\r\n applyColor(config.secondaryTextColor, 'secondary-text-color');\r\n applyColor(config.hintTextColor, 'hint-text-color');\r\n applyColor(config.userMessageColor, 'user-message-color');\r\n applyColor(config.botMessageColor, 'bot-message-color');\r\n applyColor(config.userTextColor, 'user-text-color');\r\n applyColor(config.botTextColor, 'bot-text-color');\r\n applyColor(config.borderColor, 'border-color');\r\n applyColor(config.borderShadowColor, 'border-shadow-color');\r\n applyColor(config.borderTopColor, 'border-top-color');\r\n applyColor(config.typingIndicatorColor, 'typing-indicator-color');\r\n applyColor(config.white, 'white');\r\n applyColor(config.black, 'black');\r\n applyColor(config.grey, 'grey');\r\n applyColor(config.red, 'red');\r\n applyColor(config.lightRed, 'light-red');\r\n }\r\n\r\n private parseColor(input: string): { light: string; dark: string } {\r\n const parts = input.split(',').map((p) => p.trim());\r\n if (parts.length === 1) {\r\n return { light: parts[0], dark: parts[0] };\r\n } else if (parts.length >= 2) {\r\n return { light: parts[0], dark: parts[1] };\r\n }\r\n return { light: '', dark: '' };\r\n }\r\n}\r\n","export const PredefinedMessages = ['Hello!', 'I need help', 'Contact support', 'News and Updates'];\r\nexport const SuggestedMessages = [\r\n 'Hi! How can I help?',\r\n 'Check your activity?',\r\n 'Need account help?',\r\n 'Quick tips to start.',\r\n];\r\n","import { appConst } from './constant/constant';\r\n\r\nexport class DoohbotInput {\r\n username = '';\r\n password = '';\r\n authToken?: string;\r\n licenseKey?: string = '';\r\n\r\n DOOHBOT_API_URL?: string;\r\n\r\n // inputs\r\n userAvatarUrl: string = appConst.USER_AVATAR;\r\n\r\n // Application Constants Text\r\n readonly appTitle? = 'DoohBot';\r\n readonly appSubtitle? = 'Welcome to DoohBot';\r\n readonly welcomeDesc? =\r\n 'We provide a powerful live chat platform to help businesses connect with their customers, offer support, and increase sales through real-time conversations.';\r\n readonly chatIcon? = 'chat';\r\n readonly sendIcon? = 'send';\r\n readonly closeIcon? = 'close';\r\n readonly clear? = 'clear_all';\r\n readonly minimizeIcon? = 'remove';\r\n readonly moreIcon? = 'more_vert';\r\n readonly fullscreenIcon? = 'fullscreen';\r\n readonly fullscreenExitIcon? = 'fullscreen_exit';\r\n readonly hintText? = 'Please Enter Here';\r\n readonly errorMessage? = 'The message you submitted was too long.';\r\n\r\n // Application Constants Images\r\n readonly appLogoUrl? = appConst.APP_LOGO;\r\n readonly appTextLogoUrl? = appConst.APP_TEXT_LOGO;\r\n readonly appHeaderLogoUrl? = appConst.APP_HEADER_LOGO;\r\n readonly botAvatarUrl? = appConst.BOT_AVATAR;\r\n}\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule, NgIf } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-chat-button',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, NgIf],\r\n templateUrl: './chat-button.component.html',\r\n styleUrls: ['./chat-button.component.scss'],\r\n})\r\nexport class ChatButtonComponent {\r\n @Input() buttonStyle: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom' = 'fab';\r\n @Input() isChatOpen: boolean = false;\r\n @Input() unreadCount: number = 0;\r\n @Input() chatIcon: string = 'chat';\r\n @Input() appTitle: string = 'Chat';\r\n @Input() appLogoUrl: string = '';\r\n @Input() appTextLogoUrl: string = '';\r\n\r\n @Output() toggle = new EventEmitter<void>();\r\n\r\n get isSidebar(): boolean {\r\n return this.buttonStyle.startsWith('sidebar');\r\n }\r\n\r\n get sidebarPosition(): 'top' | 'center' | 'bottom' {\r\n if (!this.isSidebar) return 'center';\r\n if (this.buttonStyle === 'sidebar') return 'center';\r\n return this.buttonStyle.split('-')[1] as 'top' | 'center' | 'bottom';\r\n }\r\n\r\n onToggle() {\r\n this.toggle.emit();\r\n }\r\n}\r\n","<!-- fab -->\r\n<button class=\"chat-fab\" (click)=\"onToggle()\" *ngIf=\"buttonStyle === 'fab' && !isChatOpen\">\r\n <!-- <mat-icon>{{ chatIcon }}</mat-icon> -->\r\n <img style=\"width: 30px; height: 30px\" [src]=\"appLogoUrl\" />\r\n <!-- <div class=\"chat-logo\"></div> -->\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n\r\n<!-- sidebar button -->\r\n<button\r\n class=\"chat-sidebar\"\r\n (click)=\"onToggle()\"\r\n *ngIf=\"isSidebar && !isChatOpen\"\r\n [ngClass]=\"sidebarPosition\"\r\n>\r\n <!-- <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2> -->\r\n <img style=\"transform: rotate(-90deg); width: 100px; height: 45px\" [src]=\"appTextLogoUrl\" />\r\n\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-chips',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './chips.component.html',\r\n styleUrls: ['./chips.component.scss'],\r\n})\r\nexport class Chips {\r\n @Input() messages: string[] = []; // messages array\r\n @Input() disabled = false;\r\n @Output() chipClick = new EventEmitter<string>(); // emit clicked chip\r\n\r\n onChipClick(msg: string) {\r\n if (this.disabled) return;\r\n this.chipClick.emit(msg);\r\n }\r\n}\r\n","@if (messages.length > 0) {\r\n <div class=\"predefined-chips\">\r\n @for (msg of messages; track msg) {\r\n <button class=\"chip\" (click)=\"onChipClick(msg)\">\r\n {{ msg }}\r\n </button>\r\n }\r\n </div>\r\n}\r\n","import {\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n TrackByFunction,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule, NgIf } from '@angular/common';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { Chips } from '../../../../shared/chips/chips.component';\r\n\r\n@Component({\r\n selector: 'app-message-list',\r\n standalone: true,\r\n imports: [CommonModule, Chips, NgIf],\r\n templateUrl: './message-list.component.html',\r\n styleUrls: ['./message-list.component.scss'],\r\n})\r\nexport class MessageListComponent implements AfterViewInit, OnDestroy {\r\n @Input() messages: Message[] = [];\r\n @Input() isBotTyping: boolean = false;\r\n @Input() appLogoUrl: string = '';\r\n @Input() appSubtitle: string = '';\r\n @Input() welcomeDesc: string = '';\r\n @Input() predefinedMessages: string[] = [];\r\n @Input() botAvatarUrl: string = '';\r\n @Input() userAvatarUrl: string = '';\r\n @Input() userName: string = '';\r\n @Input() isAuthenticated: boolean = false;\r\n\r\n @Input() trackByMessageId: TrackByFunction<Message> = (index, item) => item.id ?? index;\r\n\r\n @Output() suggestionClick = new EventEmitter<string>();\r\n @Output() loginClick = new EventEmitter<void>();\r\n\r\n @ViewChild('chatMessages') private chatMessagesContainer!: ElementRef;\r\n private mutationObserver!: MutationObserver;\r\n\r\n appEmoji = {\r\n waveHand: '\\u{1F44B}',\r\n };\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.chatMessagesContainer) return;\r\n\r\n this.mutationObserver = new MutationObserver(() => this.scrollToBottom());\r\n\r\n this.mutationObserver.observe(this.chatMessagesContainer.nativeElement, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n this.scrollToBottom();\r\n }\r\n\r\n private scrollToBottom(): void {\r\n if (!this.chatMessagesContainer) {\r\n return;\r\n }\r\n const container = this.chatMessagesContainer.nativeElement;\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: 'smooth',\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.mutationObserver) {\r\n this.mutationObserver.disconnect();\r\n }\r\n }\r\n\r\n onPredefinedClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n}\r\n","<div #chatMessages class=\"chat-messages\">\r\n <!-- Welcome Screen -->\r\n <div class=\"welcome-screen\" *ngIf=\"messages.length === 0 && !isBotTyping\">\r\n <img [src]=\"appLogoUrl\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 0px\" />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n <div class=\"marquee-container\" *ngIf=\"userName && isAuthenticated\">\r\n <h2 class=\"welcome-greeting marquee-text\">\r\n Hi, {{ userName }}!\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n </div>\r\n\r\n <h3>{{ appSubtitle }}</h3>\r\n <p>{{ welcomeDesc }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n <app-chips\r\n *ngIf=\"isAuthenticated\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onPredefinedClick($event)\"\r\n ></app-chips>\r\n\r\n <div *ngIf=\"!isAuthenticated\" class=\"auth-buttons-container\" style=\"margin-top: 20px\">\r\n <button (click)=\"loginClick.emit()\" class=\"auth-btn primary\">Login</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Chat Messages -->\r\n <div\r\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\r\n class=\"message-wrapper\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n <!-- Bot Avatar -->\r\n <img\r\n *ngIf=\"message.sender === 'bot'\"\r\n class=\"bot-avatar\"\r\n [src]=\"botAvatarUrl\"\r\n alt=\"Bot Avatar\"\r\n />\r\n\r\n <!-- Message Bubble -->\r\n <div\r\n class=\"message\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n {{ message.text }}\r\n <!-- Show time below message -->\r\n <div *ngIf=\"message.sender === 'bot'\" class=\"message-time\">\r\n {{ message.timestamp | date: 'shortTime' }}\r\n </div>\r\n </div>\r\n\r\n <!-- User Avatar -->\r\n <div class=\"user-avatar-container\" *ngIf=\"message.sender === 'user'\">\r\n <img class=\"user-avatar\" [src]=\"userAvatarUrl\" alt=\"User Avatar\" />\r\n <!-- <span class=\"user-name\" *ngIf=\"userName\">{{ userName }}</span> -->\r\n </div>\r\n </div>\r\n\r\n <!-- Typing Indicator -->\r\n <div class=\"message-wrapper bot\" *ngIf=\"isBotTyping\">\r\n <img class=\"bot-avatar\" [src]=\"botAvatarUrl\" alt=\"Bot Avatar\" />\r\n <div class=\"message bot\">\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-message-input',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule],\r\n templateUrl: './message-input.component.html',\r\n styleUrls: ['./message-input.component.scss'],\r\n})\r\nexport class MessageInputComponent {\r\n @Input() isBotTyping: boolean = false;\r\n @Input() hintText: string = 'Type a message...';\r\n @Input() sendIcon: string = 'send';\r\n\r\n @Output() send = new EventEmitter<string>();\r\n\r\n onSend(text: string) {\r\n if (text.trim()) {\r\n this.send.emit(text);\r\n }\r\n }\r\n}\r\n","<!-- Chat Input -->\r\n<div class=\"chat-input\">\r\n <div class=\"input-wrapper\">\r\n <input #messageInput type=\"text\" [disabled]=\"isBotTyping\"\r\n (keydown.enter)=\"onSend(messageInput.value); messageInput.value = ''\" [placeholder]=\"hintText\" />\r\n\r\n <button [disabled]=\"isBotTyping\" (click)=\"onSend(messageInput.value); messageInput.value = ''\">\r\n <mat-icon>{{ sendIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n</div>","import { Component, Inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nexport interface DialogData {\r\n title: string;\r\n message: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n confirmButtonColor?: 'primary' | 'accent' | 'warn';\r\n icon?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'app-dialog',\r\n standalone: true,\r\n imports: [CommonModule, MatDialogModule, MatButtonModule, MatIconModule],\r\n templateUrl: './dialog.component.html',\r\n styleUrls: ['./dialog.component.scss'],\r\n})\r\nexport class DialogComponent {\r\n constructor(\r\n public dialogRef: MatDialogRef<DialogComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: DialogData,\r\n ) {\r\n // Set defaults\r\n this.data.confirmText = this.data.confirmText || 'Confirm';\r\n this.data.cancelText = this.data.cancelText || 'Cancel';\r\n this.data.confirmButtonColor = this.data.confirmButtonColor || 'warn';\r\n this.data.icon = this.data.icon || 'warning';\r\n }\r\n\r\n onCancel(): void {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n onConfirm(): void {\r\n this.dialogRef.close(true);\r\n }\r\n}\r\n","<div class=\"dialog-container\">\r\n <div class=\"dialog-header\">\r\n <mat-icon class=\"dialog-icon\" [class.warn-icon]=\"data.confirmButtonColor === 'warn'\">\r\n {{ data.icon }}\r\n </mat-icon>\r\n <h2 mat-dialog-title>{{ data.title }}</h2>\r\n </div>\r\n\r\n <mat-dialog-content>\r\n <p class=\"dialog-message\">{{ data.message }}</p>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button class=\"cancel-btn\" (click)=\"onCancel()\" type=\"button\">\r\n {{ data.cancelText }}\r\n </button>\r\n <button\r\n mat-raised-button\r\n class=\"confirm-btn\"\r\n [class.warn-btn]=\"data.confirmButtonColor === 'warn'\"\r\n [class.primary-btn]=\"data.confirmButtonColor === 'primary'\"\r\n [class.accent-btn]=\"data.confirmButtonColor === 'accent'\"\r\n (click)=\"onConfirm()\"\r\n type=\"button\"\r\n >\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Observable } from 'rxjs';\r\nimport { DialogComponent, DialogData } from './dialog.component';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DialogService {\r\n constructor(private dialog: MatDialog) { }\r\n\r\n /**\r\n * Opens a confirmation dialog with customizable options\r\n * @param data Configuration for the dialog\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n open(data: DialogData): Observable<boolean> {\r\n const dialogRef = this.dialog.open(DialogComponent, {\r\n width: '400px',\r\n data: data,\r\n disableClose: false,\r\n autoFocus: true,\r\n restoreFocus: true,\r\n });\r\n\r\n return dialogRef.afterClosed();\r\n }\r\n\r\n /**\r\n * Convenience method for delete confirmation dialogs\r\n * @param itemName Name of the item being deleted\r\n * @returns Observable that emits true if confirmed, false if cancelled\r\n */\r\n confirmDelete(itemName: string = 'this item'): Observable<boolean> {\r\n return this.open({\r\n title: 'Confirm Delete',\r\n message: `Are you sure you want to delete ${itemName}? This action cannot be undone.`,\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel',\r\n confirmButtonColor: 'warn',\r\n icon: 'delete_forever',\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n OnChanges,\r\n SimpleChanges,\r\n Output,\r\n} from '@angular/core';\r\nimport { CommonModule, NgIf } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { DialogService } from '../../../../shared/dialog/dialog.service';\r\nimport { ChatSession, ChatSessionGroup } from '../../model/chat-session.model';\r\n\r\n@Component({\r\n selector: 'app-chat-history-sidebar',\r\n standalone: true,\r\n imports: [CommonModule, MatIconModule, NgIf],\r\n templateUrl: './chat-history-sidebar.component.html',\r\n styleUrls: ['./chat-history-sidebar.component.scss'],\r\n})\r\nexport class ChatHistorySidebarComponent implements OnInit, OnChanges {\r\n @Input() sessions: ChatSession[] = [];\r\n @Input() isOpen: boolean = false;\r\n @Input() userName: string = 'User';\r\n @Input() isLoading: boolean = false;\r\n @Input() hasMoreSessions: boolean = false;\r\n @Input() isLoadingMore: boolean = false;\r\n\r\n @Output() sessionSelected = new EventEmitter<ChatSession>();\r\n @Output() sessionDeleted = new EventEmitter<string>();\r\n @Output() closed = new EventEmitter<void>();\r\n @Output() loadMore = new EventEmitter<void>();\r\n @Output() refresh = new EventEmitter<void>();\r\n\r\n chatHistory: ChatSessionGroup[] = [];\r\n\r\n constructor(private dialogService: DialogService) {}\r\n\r\n ngOnInit(): void {\r\n this.chatHistory = this.groupedSessions();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['sessions']) {\r\n this.chatHistory = this.groupedSessions();\r\n }\r\n }\r\n\r\n groupedSessions(): ChatSessionGroup[] {\r\n const now = new Date();\r\n const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\r\n const yesterday = new Date(today);\r\n yesterday.setDate(yesterday.getDate() - 1);\r\n const weekAgo = new Date(today);\r\n weekAgo.setDate(weekAgo.getDate() - 7);\r\n\r\n const groups: ChatSessionGroup[] = [\r\n { label: 'Today', sessions: [] },\r\n { label: 'Yesterday', sessions: [] },\r\n { label: 'This Week', sessions: [] },\r\n { label: 'Older', sessions: [] },\r\n ];\r\n\r\n // Sort sessions by timestamp (newest first)\r\n const sortedSessions = [...this.sessions].sort(\r\n (a, b) => b.timestamp.getTime() - a.timestamp.getTime(),\r\n );\r\n\r\n sortedSessions.forEach((session) => {\r\n const sessionDate = new Date(session.timestamp);\r\n const sessionDayStart = new Date(\r\n sessionDate.getFullYear(),\r\n sessionDate.getMonth(),\r\n sessionDate.getDate(),\r\n );\r\n\r\n if (sessionDayStart.getTime() === today.getTime()) {\r\n groups[0].sessions.push(session);\r\n } else if (sessionDayStart.getTime() === yesterday.getTime()) {\r\n groups[1].sessions.push(session);\r\n } else if (sessionDayStart.getTime() >= weekAgo.getTime()) {\r\n groups[2].sessions.push(session);\r\n } else {\r\n groups[3].sessions.push(session);\r\n }\r\n });\r\n\r\n // Filter out empty groups\r\n return groups.filter((g) => g.sessions.length > 0);\r\n }\r\n\r\n onSessionClick(session: ChatSession): void {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n onDeleteClick(event: Event, sessionId: string): void {\r\n event.stopPropagation();\r\n this.dialogService.confirmDelete('this conversation').subscribe((confirmed) => {\r\n if (confirmed) {\r\n this.sessionDeleted.emit(sessionId);\r\n this.chatHistory = this.groupedSessions();\r\n }\r\n });\r\n }\r\n\r\n onClose(): void {\r\n this.closed.emit();\r\n }\r\n\r\n formatTime(date: Date): string {\r\n return new Date(date).toLocaleTimeString('en-US', {\r\n hour: 'numeric',\r\n minute: '2-digit',\r\n hour12: true,\r\n });\r\n }\r\n\r\n formatDate(date: Date): string {\r\n return new Date(date).toLocaleDateString('en-US', {\r\n month: 'short',\r\n day: 'numeric',\r\n });\r\n }\r\n\r\n /**\r\n * Handle scroll event for infinite scroll\r\n */\r\n onScroll(event: Event): void {\r\n const element = event.target as HTMLElement;\r\n const scrollTop = element.scrollTop;\r\n const scrollHeight = element.scrollHeight;\r\n const clientHeight = element.clientHeight;\r\n\r\n // Check if scrolled near bottom (within 100px)\r\n const scrollBottom = scrollHeight - scrollTop - clientHeight;\r\n if (scrollBottom < 100 && this.hasMoreSessions && !this.isLoadingMore && !this.isLoading) {\r\n this.loadMore.emit();\r\n }\r\n }\r\n\r\n /**\r\n * Handle manual refresh\r\n */\r\n onRefresh(): void {\r\n this.refresh.emit();\r\n }\r\n}\r\n","<div class=\"history-sidebar\" [class.open]=\"isOpen\">\r\n <div class=\"sidebar-header\">\r\n <div class=\"marquee-container\" style=\"flex: 1; margin-right: 10px\">\r\n <h3 class=\"marquee-text\">{{ userName }}'s Chat History</h3>\r\n </div>\r\n <button class=\"refresh-btn\" (click)=\"onRefresh()\" title=\"Refresh history\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <button class=\"close-btn\" (click)=\"onClose()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div class=\"sidebar-content\" (scroll)=\"onScroll($event)\">\r\n <div *ngIf=\"isLoading\" class=\"loader-container\">\r\n <div class=\"loader\"></div>\r\n <p>Loading history...</p>\r\n </div>\r\n\r\n <div *ngIf=\"!isLoading && sessions.length === 0\" class=\"empty-state\">\r\n <mat-icon>history</mat-icon>\r\n <p>No chat history yet</p>\r\n <span>Start a conversation to see it here</span>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!isLoading\">\r\n <div *ngFor=\"let group of chatHistory\" class=\"session-group\">\r\n <div class=\"group-label\">{{ group.label }}</div>\r\n <div class=\"session-list\">\r\n <div\r\n *ngFor=\"let session of group.sessions\"\r\n class=\"session-item\"\r\n (click)=\"onSessionClick(session)\"\r\n >\r\n <div class=\"session-content\">\r\n <div class=\"session-title\">{{ session.title }}</div>\r\n <div class=\"session-time\">\r\n {{ formatTime(session.timestamp) }} · {{ formatDate(session.timestamp) }}\r\n </div>\r\n </div>\r\n <button\r\n class=\"delete-btn\"\r\n (click)=\"onDeleteClick($event, session.id)\"\r\n title=\"Delete conversation\"\r\n >\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Loading more indicator -->\r\n <div *ngIf=\"isLoadingMore\" class=\"loading-more\">\r\n <div class=\"loader-small\"></div>\r\n <p>Loading more...</p>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Directive, ElementRef, HostListener, Input, OnInit, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[draggableDialog]',\r\n standalone: true,\r\n})\r\nexport class DraggableDialogDirective implements OnInit {\r\n private isDragging = false;\r\n private startX = 0;\r\n private startY = 0;\r\n private offsetX = 0;\r\n private offsetY = 0;\r\n\r\n @Input('dragHandle') dragHandleSelector: string | undefined;\r\n @Input() enableDrag = false;\r\n\r\n private dragHandle: HTMLElement | undefined;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n ngOnInit() {\r\n if (!this.enableDrag) {\r\n this.el.nativeElement.removeAttribute('draggableDialog');\r\n return;\r\n }\r\n\r\n if (this.dragHandleSelector) {\r\n this.dragHandle = this.el.nativeElement.querySelector(this.dragHandleSelector);\r\n } else {\r\n this.dragHandle = this.el.nativeElement; // fallback\r\n }\r\n if (this.dragHandle) {\r\n this.renderer.setStyle(this.dragHandle, 'cursor', 'move');\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n if (!this.dragHandle || event.target !== this.dragHandle) return;\r\n\r\n this.isDragging = true;\r\n this.startX = event.clientX - this.offsetX;\r\n this.startY = event.clientY - this.offsetY;\r\n\r\n event.preventDefault();\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.isDragging) return;\r\n\r\n this.offsetX = event.clientX - this.startX;\r\n this.offsetY = event.clientY - this.startY;\r\n\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'transform',\r\n `translate(${this.offsetX}px, ${this.offsetY}px)`,\r\n );\r\n }\r\n\r\n @HostListener('document:mouseup', [])\r\n onMouseUp() {\r\n this.isDragging = false;\r\n }\r\n}\r\n","// resizable-dialog.directive.ts\r\nimport {\r\n Directive,\r\n ElementRef,\r\n Renderer2,\r\n OnInit,\r\n OnDestroy,\r\n HostListener,\r\n Input,\r\n} from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[resizableDialog]',\r\n standalone: true,\r\n})\r\nexport class ResizableDialogDirective implements OnInit, OnDestroy {\r\n private resizeHandles: HTMLElement[] = [];\r\n private activeHandle: string | null = null;\r\n private startX = 0;\r\n private startY = 0;\r\n private startWidth = 0;\r\n private startHeight = 0;\r\n private startLeft = 0;\r\n private startTop = 0;\r\n\r\n @Input() enableResize = false;\r\n\r\n // Define resize directions\r\n private directions = ['n', 's', 'e', 'w', 'ne', 'nw', 'se', 'sw'];\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n ) { }\r\n\r\n ngOnInit() {\r\n if (!this.enableResize) {\r\n this.el.nativeElement.removeAttribute('resizableDialog');\r\n return;\r\n }\r\n\r\n this.setStyle();\r\n this.createResizeHandles();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.removeResizeHandles();\r\n }\r\n\r\n private setStyle() {\r\n const element = this.el.nativeElement;\r\n this.renderer.setStyle(element, 'position', 'absolute');\r\n this.renderer.setStyle(element, 'overflow', 'hidden');\r\n this.renderer.setStyle(element, 'boxSizing', 'border-box');\r\n }\r\n\r\n private createResizeHandles() {\r\n this.directions.forEach((dir) => {\r\n const handle = this.renderer.createElement('div');\r\n this.renderer.setAttribute(handle, 'data-dir', dir);\r\n this.renderer.setStyle(handle, 'position', 'absolute');\r\n this.renderer.setStyle(handle, 'background', 'transparent');\r\n this.renderer.setStyle(handle, 'zIndex', '10');\r\n this.renderer.setStyle(handle, 'userSelect', 'none');\r\n\r\n // Set size and position based on direction\r\n if (dir.includes('e') || dir.includes('w')) {\r\n this.renderer.setStyle(handle, 'width', '10px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('e') ? 'e-resize' : 'w-resize');\r\n this.renderer.setStyle(handle, 'top', '0');\r\n this.renderer.setStyle(handle, 'bottom', '0');\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '0' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '0' : null);\r\n }\r\n if (dir.includes('n') || dir.includes('s')) {\r\n this.renderer.setStyle(handle, 'height', '10px');\r\n this.renderer.setStyle(handle, 'cursor', dir.includes('s') ? 's-resize' : 'n-resize');\r\n this.renderer.setStyle(handle, 'left', '0');\r\n this.renderer.setStyle(handle, 'right', '0');\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '0' : null);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '0' : null);\r\n }\r\n if (dir === 'ne' || dir === 'nw' || dir === 'se' || dir === 'sw') {\r\n this.renderer.setStyle(handle, 'width', '12px');\r\n this.renderer.setStyle(handle, 'height', '12px');\r\n this.renderer.setStyle(handle, 'borderRadius', '50%');\r\n this.renderer.setStyle(handle, 'cursor', `${dir}-resize`);\r\n this.renderer.setStyle(handle, 'top', dir.includes('n') ? '0' : null);\r\n this.renderer.setStyle(handle, 'bottom', dir.includes('s') ? '0' : null);\r\n this.renderer.setStyle(handle, 'left', dir.includes('w') ? '0' : null);\r\n this.renderer.setStyle(handle, 'right', dir.includes('e') ? '0' : null);\r\n }\r\n\r\n this.renderer.appendChild(this.el.nativeElement, handle);\r\n this.resizeHandles.push(handle);\r\n });\r\n }\r\n\r\n private removeResizeHandles() {\r\n this.resizeHandles.forEach((handle) => {\r\n this.renderer.removeChild(this.el.nativeElement, handle);\r\n });\r\n this.resizeHandles = [];\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n const target = event.target as HTMLElement;\r\n const dir = target.getAttribute('data-dir');\r\n if (!dir) return;\r\n\r\n event.preventDefault();\r\n\r\n this.activeHandle = dir;\r\n const rect = this.el.nativeElement.getBoundingClientRect();\r\n\r\n this.startX = event.clientX;\r\n this.startY = event.clientY;\r\n this.startWidth = parseFloat(this.getComputedStyleValue('width'));\r\n this.startHeight = parseFloat(this.getComputedStyleValue('height'));\r\n this.startLeft = parseFloat(this.getComputedStyleValue('left'));\r\n this.startTop = parseFloat(this.getComputedStyleValue('top'));\r\n\r\n // Prevent text selection during resize\r\n document.body.classList.add('no-select');\r\n }\r\n\r\n @HostListener('document:mousemove', ['$event'])\r\n onMouseMove(event: MouseEvent) {\r\n if (!this.activeHandle) return;\r\n\r\n const dx = event.clientX - this.startX;\r\n const dy = event.clientY - this.startY;\r\n\r\n let newWidth = this.startWidth;\r\n let newHeight = this.startHeight;\r\n let newLeft = this.startLeft;\r\n let newTop = this.startTop;\r\n\r\n const minWidth = 150;\r\n const minHeight = 100;\r\n\r\n // Horizontal resize\r\n if (this.activeHandle.includes('e')) {\r\n newWidth = Math.max(this.startWidth + dx, minWidth);\r\n }\r\n if (this.activeHandle.includes('w')) {\r\n newWidth = Math.max(this.startWidth - dx, minWidth);\r\n newLeft = this.startLeft + (this.startWidth - newWidth);\r\n }\r\n\r\n // Vertical resize\r\n if (this.activeHandle.includes('s')) {\r\n newHeight = Math.max(this.startHeight + dy, minHeight);\r\n }\r\n if (this.activeHandle.includes('n')) {\r\n newHeight = Math.max(this.startHeight - dy, minHeight);\r\n newTop = this.startTop + (this.startHeight - newHeight);\r\n }\r\n\r\n // Apply changes\r\n this.renderer.setStyle(this.el.nativeElement, 'width', `${newWidth}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'height', `${newHeight}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'left', `${newLeft}px`);\r\n this.renderer.setStyle(this.el.nativeElement, 'top', `${newTop}px`);\r\n }\r\n\r\n @HostListener('document:mouseup')\r\n onMouseUp() {\r\n if (this.activeHandle) {\r\n this.activeHandle = null;\r\n document.body.classList.remove('no-select');\r\n }\r\n }\r\n\r\n private getComputedStyleValue(property: string): string {\r\n return getComputedStyle(this.el.nativeElement).getPropertyValue(property) || '0';\r\n }\r\n}\r\n","import { Component, Input, OnInit, OnDestroy, Output, EventEmitter } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'app-snackbar',\r\n templateUrl: './snackbar.component.html',\r\n styleUrls: ['./snackbar.component.scss'],\r\n standalone: true,\r\n imports: [MatIconModule],\r\n})\r\nexport class SnackBar implements OnInit, OnDestroy {\r\n @Input() message: string | null = null;\r\n @Input() autoDismiss: boolean = true;\r\n @Input() dismissDelay: number = 5000;\r\n @Input() show: boolean = false;\r\n\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n public timeoutId: number | null = null;\r\n\r\n ngOnInit() {\r\n if (this.autoDismiss) {\r\n this.timeoutId = setTimeout(() => {\r\n this.close();\r\n }, this.dismissDelay) as any;\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.clearTimeout();\r\n }\r\n\r\n close() {\r\n this.show = false;\r\n this.message = null;\r\n this.closed.emit();\r\n }\r\n public clearTimeout() {\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n }\r\n }\r\n}\r\n","<div class=\"message-error\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">warning</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n TrackByFunction,\r\n OnDestroy,\r\n OnInit,\r\n SimpleChanges,\r\n OnChanges,\r\n} from '@angular/core';\r\nimport { CommonModule, NgIf } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MessageListComponent } from '../message-list/message-list.component';\r\nimport { MessageInputComponent } from '../message-input/message-input.component';\r\nimport { inject } from '@angular/core';\r\nimport { ChatHistorySidebarComponent } from '../chat-history-sidebar/chat-history-sidebar.component';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { AuthService } from '../../../../core/auth/auth.service';\r\nimport { DraggableDialogDirective } from '../../../../core/directives/draggable/draggable-dialog.directive';\r\nimport { ResizableDialogDirective } from '../../../../core/directives/resizable/resizable-dialog.directive';\r\nimport { Message } from '../../../../core/models/message';\r\nimport { DoohbotThemeConfig } from '../../../../core/models/theme-config.model';\r\nimport { ThemeService } from '../../../../core/services/theme.service';\r\nimport logger from '../../../../core/utils/logger.service';\r\nimport { Chips } from '../../../../shared/chips/chips.component';\r\nimport { SnackBar } from '../../../../shared/snackbar/snackbar.component';\r\nimport { ChatSession } from '../../model/chat-session.model';\r\n\r\n@Component({\r\n selector: 'app-chat-window',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n Chips,\r\n MessageListComponent,\r\n MessageInputComponent,\r\n SnackBar,\r\n DraggableDialogDirective,\r\n ResizableDialogDirective,\r\n ChatHistorySidebarComponent,\r\n FormsModule,\r\n NgIf,\r\n ],\r\n templateUrl: './chat-window.component.html',\r\n styleUrls: ['./chat-window.component.scss'],\r\n})\r\nexport class ChatWindowComponent implements OnInit, OnDestroy, OnChanges {\r\n @Input() isChatOpen: boolean = false;\r\n @Input() enableDrag: boolean = false;\r\n @Input() enableResize: boolean = false;\r\n @Input() isFullScreen: boolean = false;\r\n @Input() isAuthenticated: boolean = false;\r\n @Input() appTitle: string = '';\r\n @Input() appLogoUrl: string = '';\r\n @Input() appTextLogoUrl: string = '';\r\n @Input() appHeaderLogoUrl: string = '';\r\n @Input() moreIcon: string = 'more_vert';\r\n @Input() minimizeIcon: string = 'minimize';\r\n @Input() messages: Message[] = [];\r\n @Input() isBotTyping: boolean = false;\r\n @Input() appSubtitle: string = '';\r\n @Input() welcomeDesc: string = '';\r\n @Input() predefinedMessages: string[] = [];\r\n @Input() suggestedMessages: string[] = [];\r\n @Input() botAvatarUrl: string = '';\r\n @Input() userAvatarUrl: string = '';\r\n @Input() userName: string = '';\r\n @Input() trackByMessageId: TrackByFunction<Message> = (index, item) => item.id ?? index;\r\n @Input() hintText: string = '';\r\n @Input() sendIcon: string = '';\r\n @Input() messageError: string | null = null;\r\n @Input() showSuggestionChips: boolean = false;\r\n @Input() isHistorySidebarOpen: boolean = false;\r\n @Input() chatSessions: ChatSession[] = [];\r\n @Input() chatHistoryUserName: string = 'User';\r\n\r\n @Input() isLoggingIn: boolean = false;\r\n @Input() authError: string | null = null;\r\n @Input() authSuccess: string | null = null;\r\n @Input() isLoadingSessions: boolean = false;\r\n @Input() hasMoreSessions: boolean = false;\r\n @Input() isLoadingMoreSessions: boolean = false;\r\n @Input() themeConfig: DoohbotThemeConfig | undefined;\r\n\r\n @Output() toggleChat = new EventEmitter<void>();\r\n @Output() toggleFullScreen = new EventEmitter<void>();\r\n @Output() toggleHistorySidebar = new EventEmitter<void>();\r\n @Output() openSettings = new EventEmitter<void>();\r\n @Output() suggestionClick = new EventEmitter<string>();\r\n @Output() send = new EventEmitter<string>();\r\n @Output() clearMessageError = new EventEmitter<void>();\r\n @Output() clearChat = new EventEmitter<void>();\r\n @Output() sessionSelected = new EventEmitter<ChatSession>();\r\n @Output() sessionDeleted = new EventEmitter<string>();\r\n @Output() loadMoreSessions = new EventEmitter<void>();\r\n @Output() refreshSessions = new EventEmitter<void>();\r\n\r\n // @Output() loginClick = new EventEmitter<void>();\r\n @Output() loginSubmit = new EventEmitter<{ username: string; password: string }>();\r\n @Output() logout = new EventEmitter<void>();\r\n\r\n public themeService = inject(ThemeService);\r\n public authService = inject(AuthService);\r\n\r\n // Login form state\r\n public loginUsername = '';\r\n public loginPassword = '';\r\n public showLoginForm = false;\r\n public showPassword = false;\r\n\r\n togglePasswordVisibility() {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n onToggleChat() {\r\n this.toggleChat.emit();\r\n }\r\n\r\n onToggleHistorySidebar() {\r\n logger.log('History button clicked!');\r\n this.toggleHistorySidebar.emit();\r\n }\r\n\r\n onLoginClick() {\r\n // this.loginClick.emit();\r\n this.showLoginForm = true;\r\n }\r\n\r\n onLoginSubmit() {\r\n if (this.loginUsername && this.loginPassword) {\r\n this.loginSubmit.emit({\r\n username: this.loginUsername,\r\n password: this.loginPassword,\r\n });\r\n }\r\n }\r\n\r\n onCancelLogin() {\r\n this.showLoginForm = false;\r\n }\r\n\r\n onToggleFullScreen() {\r\n this.toggleFullScreen.emit();\r\n }\r\n\r\n onOpenSettings() {\r\n this.openSettings.emit();\r\n }\r\n\r\n onSuggestionClick(text: string) {\r\n this.suggestionClick.emit(text);\r\n }\r\n\r\n onSend(text: string) {\r\n this.send.emit(text);\r\n }\r\n\r\n onClearMessageError() {\r\n this.messageError = null;\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearAuthError() {\r\n this.clearMessageError.emit();\r\n }\r\n\r\n onClearChat() {\r\n this.clearChat.emit();\r\n }\r\n\r\n onLogout() {\r\n this.logout.emit();\r\n }\r\n\r\n onSessionSelected(session: ChatSession) {\r\n this.sessionSelected.emit(session);\r\n }\r\n\r\n onSessionDeleted(sessionId: string) {\r\n this.sessionDeleted.emit(sessionId);\r\n }\r\n\r\n onPopoutShown(win: Window) {\r\n // Apply theme classes\r\n const activeTheme = this.themeService.activeTheme();\r\n logger.log('Popout shown, applying theme:', activeTheme);\r\n\r\n const body = win.document.body;\r\n // We cannot use renderer easily on another document without custom renderer factory,\r\n // but native DOM manipulation is fine here since it's a separate window object.\r\n body.classList.remove('light-theme', 'dark-theme');\r\n body.classList.add(activeTheme);\r\n\r\n // Apply CSS variables\r\n this.themeService.applyCssVariables(body, this.themeConfig);\r\n }\r\n\r\n ngOnInit() {\r\n // Initialization logic if needed\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n //? Handle authentication status changes\r\n if (changes['isAuthenticated'] && this.isAuthenticated) {\r\n this.showLoginForm = false;\r\n }\r\n }\r\n\r\n ngOnDestroy() {}\r\n}\r\n","<div\r\n *ngIf=\"isChatOpen\"\r\n draggableDialog\r\n [enableDrag]=\"enableDrag\"\r\n [dragHandle]=\"'.chat-header'\"\r\n resizableDialog\r\n [enableResize]=\"enableResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n>\r\n <!-- chat window -->\r\n <div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img\r\n class=\"chat-logo\"\r\n style=\"width: 150px; height: 50px; margin-left: 0px\"\r\n [src]=\"appHeaderLogoUrl\"\r\n alt=\"Text-Logo\"\r\n />\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- New Chat Button -->\r\n <!-- <button class=\"header-button\" (click)=\"createNewChat()\">\r\n <mat-icon>add</mat-icon>\r\n </button> -->\r\n\r\n <!-- <app-dropdown-menu>\r\n <span trigger>☰</span>\r\n\r\n <app-menu-item (selected)=\"onToggleFullScreen()\"> My Profile </app-menu-item>\r\n\r\n <app-menu-item> Settings </app-menu-item>\r\n\r\n <app-menu-item> Logout </app-menu-item>\r\n </app-dropdown-menu> -->\r\n\r\n <!-- History Button -->\r\n <button\r\n class=\"header-button\"\r\n *ngIf=\"isAuthenticated\"\r\n (click)=\"onToggleHistorySidebar()\"\r\n title=\"Chat History\"\r\n >\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n\r\n <!-- settings Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu\">\r\n <mat-icon>{{ moreIcon }}</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>{{ minimizeIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <!-- <popout-window\r\n #popout\r\n [windowTitle]=\"appTitle || 'Chat'\"\r\n [windowWidth]=\"400\"\r\n [windowHeight]=\"620\"\r\n (shown)=\"onPopoutShown($event)\"\r\n > -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [sessions]=\"chatSessions\"\r\n [isOpen]=\"isHistorySidebarOpen\"\r\n [userName]=\"chatHistoryUserName\"\r\n [isLoading]=\"isLoadingSessions\"\r\n [hasMoreSessions]=\"hasMoreSessions\"\r\n [isLoadingMore]=\"isLoadingMoreSessions\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (loadMore)=\"loadMoreSessions.emit()\"\r\n (refresh)=\"refreshSessions.emit()\"\r\n (closed)=\"onToggleHistorySidebar()\"\r\n >\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen\">\r\n <!-- Messages / Welcome Screen -->\r\n <app-message-list\r\n *ngIf=\"!showLoginForm\"\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n (loginClick)=\"onLoginClick()\"\r\n ></app-message-list>\r\n\r\n <app-chips\r\n *ngIf=\"showSuggestionChips && isAuthenticated\"\r\n [messages]=\"suggestedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Chat Input: Only show when authenticated -->\r\n <app-message-input\r\n *ngIf=\"isAuthenticated\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n [sendIcon]=\"sendIcon\"\r\n (send)=\"onSend($event)\"\r\n ></app-message-input>\r\n\r\n <!-- Login Form -->\r\n\r\n <form\r\n *ngIf=\"showLoginForm && !isAuthenticated\"\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n #loginForm=\"ngForm\"\r\n >\r\n <h3 class=\"login-title\">Login to Doohbot</h3>\r\n\r\n <div class=\"login-fields\">\r\n <!-- Username Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Username</label>\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n #username=\"ngModel\"\r\n placeholder=\"Enter your username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n <span\r\n class=\"error-text\"\r\n *ngIf=\"username.invalid && (username.dirty || username.touched)\"\r\n >\r\n Username is required\r\n </span>\r\n </div>\r\n\r\n <!-- Password Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Password</label>\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n #password=\"ngModel\"\r\n placeholder=\"Enter your password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n <span\r\n class=\"error-text\"\r\n *ngIf=\"password.invalid && (password.dirty || password.touched)\"\r\n >\r\n Password is required\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button type=\"button\" (click)=\"onCancelLogin()\" class=\"auth-btn secondary\">Cancel</button>\r\n\r\n <button\r\n type=\"submit\"\r\n class=\"auth-btn primary\"\r\n [disabled]=\"loginForm.invalid || isLoggingIn\"\r\n >\r\n {{ isLoggingIn ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n </form>\r\n\r\n <!-- Auth error snackbar (login/logout errors only) -->\r\n <app-snackbar\r\n *ngIf=\"authError\"\r\n [message]=\"authError\"\r\n (closed)=\"onClearAuthError()\"\r\n ></app-snackbar>\r\n\r\n <!-- footer -->\r\n <div class=\"terms-conditions\">\r\n <a href=\"#\">Terms and Conditions</a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- </popout-window> -->\r\n</div>\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Change Theme -->\r\n <div class=\"theme-selector\">\r\n <!-- Auto Theme (inherits from parent app) -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'auto'\"\r\n (click)=\"themeService.setTheme('auto')\"\r\n >\r\n <mat-icon>brightness_auto</mat-icon>\r\n </button>\r\n\r\n <!-- Light Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'light'\"\r\n (click)=\"themeService.setTheme('light')\"\r\n >\r\n <mat-icon>light_mode</mat-icon>\r\n </button>\r\n\r\n <!-- Dark Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'dark'\"\r\n (click)=\"themeService.setTheme('dark')\"\r\n >\r\n <mat-icon>dark_mode</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Popout Button -->\r\n <!-- <button mat-menu-item (click)=\"popout.popOut()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>open_in_new</mat-icon>\r\n <span>Popout Widget</span>\r\n </button> -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>clear_all</mat-icon>\r\n <span>Clear Chat</span>\r\n </button>\r\n\r\n <!-- Logout -->\r\n <button\r\n mat-menu-item\r\n *ngIf=\"isAuthenticated\"\r\n (click)=\"onLogout()\"\r\n style=\"display: flex; align-items: center\"\r\n >\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n</mat-menu>\r\n","import { Directive, ElementRef, Input, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appFullscreen]',\r\n standalone: true,\r\n})\r\nexport class FullscreenDirective {\r\n private isFullScreen = false;\r\n private preFullscreenState: {\r\n width: string;\r\n height: string;\r\n left: string;\r\n top: string;\r\n } | null = null;\r\n\r\n @Input() fullscreenTarget: string = '.chat-window';\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private renderer: Renderer2,\r\n ) {}\r\n\r\n public toggle(): void {\r\n const targetEl = this.el.nativeElement.querySelector(this.fullscreenTarget);\r\n if (!targetEl) return;\r\n\r\n if (!this.isFullScreen) {\r\n this.preFullscreenState = {\r\n width: targetEl.style.width,\r\n height: targetEl.style.height,\r\n left: targetEl.style.left,\r\n top: targetEl.style.top,\r\n };\r\n\r\n targetEl.style.width = '';\r\n targetEl.style.height = '';\r\n targetEl.style.left = '';\r\n targetEl.style.top = '';\r\n targetEl.style.transform = '';\r\n\r\n this.isFullScreen = true;\r\n } else {\r\n this.isFullScreen = false;\r\n\r\n if (this.preFullscreenState) {\r\n targetEl.style.width = this.preFullscreenState.width || '400px';\r\n targetEl.style.height = this.preFullscreenState.height || '500px';\r\n targetEl.style.left = this.preFullscreenState.left || 'auto';\r\n targetEl.style.top = this.preFullscreenState.top || 'auto';\r\n targetEl.style.transform = 'none';\r\n }\r\n }\r\n }\r\n\r\n public getFullscreenState(): boolean {\r\n return this.isFullScreen;\r\n }\r\n}\r\n","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, delay, retry, map, catchError, of } from 'rxjs';\r\nimport { AppConst } from '../app-const';\r\nimport logger from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpService {\r\n // @BlockUI() blockUI!: NgBlockUI;\r\n\r\n apiUrl: string;\r\n\r\n constructor(private http: HttpClient) {\r\n this.apiUrl = `${AppConst?.data?.apiBaseUrl}${AppConst?.data?.apiSegment}`;\r\n logger.log('HttpService: Initialized', this.apiUrl);\r\n }\r\n\r\n get(\r\n url: string,\r\n param?: object,\r\n nestedParam = false,\r\n showLoader = false,\r\n refresh = true,\r\n ): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n\r\n // this.blockUI.start();\r\n\r\n // }\r\n\r\n let params = {};\r\n\r\n if (nestedParam) {\r\n this.buildHttpParams(params, param, '');\r\n } else {\r\n params = param as HttpParams;\r\n }\r\n\r\n return this.http.get(`${this.apiUrl}${url}`, { params: params, withCredentials: true }).pipe(\r\n delay(100),\r\n\r\n retry(0),\r\n\r\n map((response) => this.returnResponse(response, showLoader)),\r\n\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n\r\n // this.blockUI.stop();\r\n\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n private buildHttpParams(params: any, data: any, currentPath: string) {\r\n Object.keys(data).forEach((key) => {\r\n if (data[key] instanceof Object && !(data[key] instanceof Array)) {\r\n this.buildHttpParams(params, data[key], `${currentPath}${key}.`);\r\n } else {\r\n params[`${currentPath}${key}`] = data[key];\r\n }\r\n });\r\n }\r\n\r\n post(url: string, param?: object, showLoader = false): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n // this.blockUI.start();\r\n // }\r\n\r\n return this.http.post(`${this.apiUrl}${url}`, param as HttpParams).pipe(\r\n delay(100),\r\n retry(0),\r\n map((response: any) => this.returnResponse(response, showLoader)),\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n // this.blockUI.stop();\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n patch(url: string, param?: object, showLoader = false): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n // this.blockUI.start();\r\n // }\r\n\r\n return this.http.patch(`${this.apiUrl}${url}`, param as HttpParams).pipe(\r\n delay(100),\r\n retry(0),\r\n map((response: any) => this.returnResponse(response, showLoader)),\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n // this.blockUI.stop();\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n delete(url: string, param?: object, showLoader = false): Observable<any> {\r\n // if (showLoader && !this.blockUI.isActive) {\r\n // this.blockUI.start();\r\n // }\r\n\r\n let params = {};\r\n params = param as HttpParams;\r\n\r\n return this.http.delete(`${this.apiUrl}${url}`, { params: params }).pipe(\r\n delay(100),\r\n retry(0),\r\n map((response: any) => this.returnResponse(response, showLoader)),\r\n catchError((error) => {\r\n // if (this.blockUI.isActive) {\r\n // this.blockUI.stop();\r\n // }\r\n\r\n return of(error);\r\n }),\r\n );\r\n }\r\n\r\n private returnResponse(value: any, showLoader: boolean = true): any {\r\n // if (showLoader && this.blockUI.isActive) {\r\n // this.blockUI.reset();\r\n // }\r\n return value;\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { TokenStorageService } from '../auth/token-storage.service';\r\nimport { AppConst } from '../app-const';\r\nimport { ChatStreamResponse } from '../../app/chat/model/chat-stream-response.model';\r\nimport logger from '../utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class HttpStreamService {\r\n private abortController: AbortController | null = null;\r\n\r\n constructor(\r\n private ngZone: NgZone,\r\n private tokenStorage: TokenStorageService,\r\n ) {}\r\n\r\n /**\r\n * Creates a POST-based HTTP streaming connection using fetch()\r\n */\r\n createHttpStream(\r\n url: string,\r\n body: any,\r\n headers?: Record<string, string>,\r\n ): Observable<ChatStreamResponse> {\r\n this.close(); // Abort any previous stream\r\n\r\n return new Observable<ChatStreamResponse>((observer) => {\r\n this.abortController = new AbortController();\r\n\r\n const token = this.tokenStorage.get('access_token') ?? '';\r\n const licenseKey = this.tokenStorage.get('license_key') || AppConst.data?.licenseKey || '';\r\n\r\n const requestHeaders: Record<string, string> = {\r\n authorization: `Bearer ${token}`,\r\n 'x-license-key': licenseKey,\r\n 'content-type': 'application/json',\r\n accept: 'text/event-stream',\r\n 'cache-control': 'no-cache',\r\n ...headers,\r\n };\r\n\r\n fetch(url, {\r\n method: 'POST',\r\n headers: requestHeaders,\r\n body: JSON.stringify(body),\r\n signal: this.abortController.signal,\r\n })\r\n .then(async (response) => {\r\n if (!response.ok) {\r\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\r\n try {\r\n const errorBody = await response.text();\r\n errorMessage += ` - Body: ${errorBody}`;\r\n } catch (e) {\r\n // ignore\r\n }\r\n throw new Error(errorMessage);\r\n }\r\n\r\n if (!response.body) {\r\n throw new Error('Streaming not supported by browser or backend');\r\n }\r\n\r\n const reader = response.body.getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n const readStream = async () => {\r\n try {\r\n const { done, value } = await reader.read();\r\n if (done) {\r\n this.ngZone.run(() => observer.complete());\r\n return;\r\n }\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || '';\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data: ')) {\r\n const dataStr = line.substring(6).trim();\r\n\r\n if (dataStr === '[DONE]') {\r\n this.ngZone.run(() => observer.complete());\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(dataStr);\r\n this.ngZone.run(() =>\r\n observer.next({\r\n content: parsed.content ?? parsed.message ?? '',\r\n type: parsed.type ?? 'chunk',\r\n id: parsed.id ?? '',\r\n created_at: parsed.created_at ?? '',\r\n sources: parsed.sources ?? [],\r\n error: parsed.error,\r\n }),\r\n );\r\n } catch (e) {\r\n logger.warn('Failed to parse SSE data:', dataStr, e);\r\n }\r\n }\r\n }\r\n\r\n readStream(); // Continue\r\n } catch (err) {\r\n this.ngZone.run(() => observer.error(err));\r\n }\r\n };\r\n\r\n readStream();\r\n })\r\n .catch((err) => {\r\n this.ngZone.run(() => observer.error(err));\r\n });\r\n\r\n // Cleanup on unsubscribe\r\n return () => this.close();\r\n });\r\n }\r\n\r\n close(): void {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n this.abortController = null;\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ChatHistoryData, ChatHistoryRequest } from '../model/chat-history.model';\r\nimport { AppConst } from '../../../core/app-const';\r\nimport { HttpStreamService } from '../../../core/http/http-stream.service';\r\nimport { HttpService } from '../../../core/http/http.service';\r\nimport { ApiResponse } from '../../../core/models/api-response.model';\r\nimport logger from '../../../core/utils/logger.service';\r\nimport { ChatRequest } from '../model/chat-request.model';\r\nimport { ChatResponse } from '../model/chat-response.model';\r\nimport { ChatStreamResponse } from '../model/chat-stream-response.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatApiService {\r\n apiUrl: string;\r\n\r\n constructor(\r\n private http: HttpService,\r\n private httpStreamService: HttpStreamService,\r\n ) {\r\n this.apiUrl = `${AppConst?.data?.apiBaseUrl}${AppConst?.data?.apiSegment}`;\r\n logger.log('ChatApiService: Initialized', this.apiUrl);\r\n }\r\n\r\n /**\r\n * Send chat message and get full response\r\n */\r\n sendMessage(request?: ChatRequest, showLoader = false): Observable<ApiResponse<ChatResponse>> {\r\n return this.http.post('chats/ask', request, showLoader);\r\n }\r\n\r\n /**\r\n * Send chat message and get streaming response\r\n */\r\n sendMessageStream(request: ChatRequest): Observable<ChatStreamResponse> {\r\n return this.httpStreamService.createHttpStream(`${this.apiUrl}chats/stream`, request);\r\n }\r\n\r\n getChatHistory(\r\n request: ChatHistoryRequest,\r\n showLoader = false,\r\n ): Observable<ApiResponse<ChatHistoryData>> {\r\n return this.http.post('chats/sessions/history', request, showLoader);\r\n }\r\n\r\n deleteChatSession(chatSessionId: string, showLoader = false): Observable<ApiResponse<any>> {\r\n return this.http.delete(`chats/sessions/${chatSessionId}`, undefined, showLoader);\r\n }\r\n\r\n updateChatTitle(\r\n chatSessionId: string,\r\n title: string,\r\n showLoader = false,\r\n ): Observable<ApiResponse<any>> {\r\n return this.http.patch(`chats/sessions/${chatSessionId}/title`, { title }, showLoader);\r\n }\r\n\r\n deleteHistory(request?: object, showLoader = false): Observable<ApiResponse<any>> {\r\n return this.http.delete('chats/sessions', request, showLoader);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { HttpService } from '../http/http.service';\r\nimport { AuthResult } from './models/auth-result.model';\r\nimport { ApiResponse } from '../models/api-response.model';\r\nimport { LoginRequest } from './models/login-request.model';\r\nimport { FederatedLoginRequest } from './models/federated-login-request.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AccountService {\r\n constructor(\r\n private http: HttpService,\r\n // private httpStream: HttpStreamService,\r\n ) {}\r\n\r\n login(param?: LoginRequest, showLoader = false): Observable<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/login', param, showLoader);\r\n }\r\n\r\n federateLogin(\r\n param?: FederatedLoginRequest,\r\n showLoader = false,\r\n ): Observable<ApiResponse<AuthResult>> {\r\n //TODO: get license key\r\n // const licenseKey = this.tokenStorage.get('license_key') || AppConst.data?.licenseKey || '';\r\n\r\n // if (licenseKey) {\r\n // headers = headers.set('x-license-key', licenseKey);\r\n // }\r\n // create custom header x-license-key and send to login\r\n return this.http.post('auth/federated/login', param, showLoader);\r\n }\r\n\r\n refreshLogin(param?: object, showLoader = false): Observable<ApiResponse<AuthResult>> {\r\n return this.http.post('auth/refresh', param, showLoader);\r\n }\r\n\r\n logout(refreshToken: string, showLoader = false): Observable<ApiResponse<any>> {\r\n return this.http.post('auth/logout', { refresh_token: refreshToken }, showLoader);\r\n }\r\n}\r\n","import { ChatApiService } from './services/chat-api.service';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { ChatSession } from './model/chat-session.model';\r\nimport { Observable, of, map, catchError } from 'rxjs';\r\nimport { AccountService } from '../../core/auth/account-api.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { Message } from '../../core/models/message';\r\nimport logger from '../../core/utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatHelperService {\r\n private readonly STORAGE_PREFIX = 'doohbot_sessions_';\r\n private readonly LEGACY_PREFIX = 'doohbot_history_';\r\n\r\n private accountService = inject(AccountService);\r\n private authService = inject(AuthService);\r\n private chatApiService = inject(ChatApiService);\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Create a new chat session\r\n */\r\n createSession(contextKey: string, userId: string): ChatSession {\r\n const session: ChatSession = {\r\n id: this.generateSessionId(),\r\n timestamp: new Date(),\r\n title: 'New Conversation',\r\n messages: [],\r\n contextKey,\r\n userId,\r\n };\r\n return session;\r\n }\r\n\r\n /**\r\n * Check if user is a guest/anonymous user who shouldn't have chat history\r\n */\r\n // private isGuestUser(userId: string): boolean {\r\n // const guestUserIds = ['anonymous', 'guest', 'default', ''];\r\n // return guestUserIds.includes(userId.toLowerCase());\r\n // }\r\n\r\n /**\r\n * Save a message to a specific session\r\n */\r\n saveMessageToSession(session: ChatSession, message: Message): Observable<void> {\r\n // Don't save history for guest users\r\n // if (this.isGuestUser(session.userId)) {\r\n // return of(void 0);\r\n // }\r\n\r\n // Update title from first user message if still default\r\n if (session.title === 'New Conversation' && message.sender === 'user') {\r\n session.title = this.generateTitle(message.text);\r\n }\r\n\r\n session.messages.push(message);\r\n return this.saveSession(session);\r\n }\r\n\r\n /**\r\n * Save entire session\r\n */\r\n saveSession(session: ChatSession): Observable<void> {\r\n // Don't save history for guest users\r\n // if (this.isGuestUser(session.userId)) {\r\n // return of(void 0);\r\n // }\r\n\r\n const key = this.getSessionStorageKey(session.contextKey, session.userId);\r\n const sessions = this.loadAllSessionsSync(session.contextKey, session.userId);\r\n\r\n const existingIndex = sessions.findIndex((s) => s.id === session.id);\r\n if (existingIndex >= 0) {\r\n sessions[existingIndex] = session;\r\n } else {\r\n sessions.push(session);\r\n }\r\n\r\n localStorage.setItem(key, JSON.stringify(sessions));\r\n return of(void 0);\r\n }\r\n\r\n /**\r\n * Load all sessions for a context and user with pagination\r\n */\r\n loadAllSessions(\r\n contextKey: string,\r\n userId: string,\r\n limit: number = 50,\r\n offset: number = 0,\r\n ): Observable<{ sessions: ChatSession[]; hasMore: boolean }> {\r\n logger.log(\r\n `Fetching chat sessions for context: ${contextKey}, user: ${userId}, limit: ${limit}, offset: ${offset}`,\r\n );\r\n\r\n if (this.authService.isAuthenticated()) {\r\n return this.loadRemoteSessions(contextKey, userId, limit, offset);\r\n }\r\n\r\n // Guest users don't have history\r\n logger.log('Not authenticated, guest users have no history');\r\n return of({ sessions: [], hasMore: false });\r\n }\r\n\r\n /**\r\n * Load history from the API with pagination\r\n */\r\n private loadRemoteSessions(\r\n contextKey: string,\r\n userId: string,\r\n limit: number = 50,\r\n offset: number = 0,\r\n ): Observable<{ sessions: ChatSession[]; hasMore: boolean }> {\r\n logger.log(`Loading remote history with limit: ${limit}, offset: ${offset}`);\r\n\r\n return this.chatApiService.getChatHistory({ limit, offset }).pipe(\r\n map((response) => {\r\n if (response && response.success && response.data && response.data.sessions) {\r\n const remoteSessions = response.data.sessions.map((session: any) =>\r\n this.mapSessionResponseToSession(session, contextKey, userId),\r\n );\r\n\r\n // Determine if there are more results based on total vs current page\r\n const hasMore =\r\n response.data.offset + response.data.sessions.length < response.data.total;\r\n\r\n logger.log(\r\n `Loaded ${remoteSessions.length} remote sessions. Total: ${response.data.total}, HasMore: ${hasMore}`,\r\n );\r\n return { sessions: remoteSessions, hasMore };\r\n }\r\n\r\n return { sessions: [], hasMore: false };\r\n }),\r\n catchError((err) => {\r\n logger.error('Failed to load remote history:', err);\r\n return of({ sessions: [], hasMore: false });\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Map API session response to ChatSession model\r\n */\r\n private mapSessionResponseToSession(\r\n sessionResponse: any,\r\n contextKey: string,\r\n userId: string,\r\n ): ChatSession {\r\n const timestamp = new Date(sessionResponse.created_at);\r\n logger.log('Mapping session response:', sessionResponse);\r\n\r\n // Map messages from the session\r\n const messages: Message[] = sessionResponse.messages.map((msg: any) => ({\r\n id: msg.chat_message_id,\r\n sender: msg.role === 'user' ? 'user' : 'bot',\r\n text: msg.content,\r\n timestamp: new Date(msg.created_at),\r\n }));\r\n\r\n return {\r\n id: sessionResponse.chat_session_id,\r\n timestamp: timestamp,\r\n title: sessionResponse.title || 'Previous Conversation',\r\n contextKey: contextKey,\r\n userId: userId,\r\n messages: messages,\r\n };\r\n }\r\n\r\n /**\r\n * Load all sessions synchronously (for internal use)\r\n */\r\n private loadAllSessionsSync(contextKey: string, userId: string): ChatSession[] {\r\n // Don't load history for guest users\r\n // if (this.isGuestUser(userId)) {\r\n // return [];\r\n // }\r\n\r\n const key = this.getSessionStorageKey(contextKey, userId);\r\n const stored = localStorage.getItem(key);\r\n\r\n if (stored) {\r\n try {\r\n const sessions = JSON.parse(stored);\r\n // Restore Date objects\r\n return sessions.map((s: any) => ({\r\n ...s,\r\n timestamp: new Date(s.timestamp),\r\n messages: s.messages.map((m: any) => ({\r\n ...m,\r\n timestamp: m.timestamp ? new Date(m.timestamp) : undefined,\r\n })),\r\n }));\r\n } catch (e) {\r\n console.error('Failed to parse sessions', e);\r\n return [];\r\n }\r\n }\r\n\r\n // Try to migrate from legacy format\r\n return this.migrateLegacyData(contextKey, userId);\r\n }\r\n\r\n /**\r\n * Load a specific session\r\n */\r\n loadSession(\r\n sessionId: string,\r\n contextKey: string,\r\n userId: string,\r\n ): Observable<ChatSession | null> {\r\n const sessions = this.loadAllSessionsSync(contextKey, userId);\r\n const session = sessions.find((s) => s.id === sessionId);\r\n return of(session || null);\r\n }\r\n\r\n /**\r\n * Delete a session\r\n */\r\n deleteSession(sessionId: string, contextKey: string, userId: string): Observable<void> {\r\n const key = this.getSessionStorageKey(contextKey, userId);\r\n const sessions = this.loadAllSessionsSync(contextKey, userId);\r\n const filtered = sessions.filter((s) => s.id !== sessionId);\r\n\r\n localStorage.setItem(key, JSON.stringify(filtered));\r\n return of(void 0);\r\n }\r\n\r\n /**\r\n * Update a session's ID while maintaining its position in the list\r\n * Useful for mapping local UUIDs to backend chat_history_ids\r\n */\r\n updateSessionId(\r\n oldId: string,\r\n newId: string,\r\n contextKey: string,\r\n userId: string,\r\n ): Observable<ChatSession | null> {\r\n const key = this.getSessionStorageKey(contextKey, userId);\r\n const sessions = this.loadAllSessionsSync(contextKey, userId);\r\n const sessionIndex = sessions.findIndex((s) => s.id === oldId);\r\n\r\n if (sessionIndex >= 0) {\r\n const session = sessions[sessionIndex];\r\n session.id = newId;\r\n // Also update message IDs if they were based on old ID\r\n session.messages.forEach((m) => {\r\n if (m.id.startsWith(oldId)) {\r\n m.id = m.id.replace(oldId, newId);\r\n }\r\n });\r\n\r\n localStorage.setItem(key, JSON.stringify(sessions));\r\n return of(session);\r\n }\r\n\r\n return of(null);\r\n }\r\n\r\n /**\r\n * Clear all sessions for a context and user\r\n */\r\n clearAllSessions(contextKey: string, userId: string): Observable<void> {\r\n const key = this.getSessionStorageKey(contextKey, userId);\r\n localStorage.removeItem(key);\r\n return of(void 0);\r\n }\r\n\r\n /**\r\n * Generate a unique session ID for a session\r\n */\r\n private generateSessionId(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return `session_${crypto.randomUUID()}`;\r\n }\r\n // Fallback\r\n return `session_${Date.now()}_${this.generateRandomString(16)}`;\r\n }\r\n\r\n private generateRandomString(length: number): string {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n let result = '';\r\n const randomArray = new Uint8Array(length);\r\n crypto.getRandomValues(randomArray);\r\n for (let i = 0; i < length; i++) {\r\n result += chars[randomArray[i] % chars.length];\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Generate a title from the first message\r\n */\r\n private generateTitle(text: string): string {\r\n const maxLength = 30;\r\n if (text.length <= maxLength) {\r\n return text;\r\n }\r\n return text.substring(0, maxLength) + '...';\r\n }\r\n\r\n /**\r\n * Get storage key for sessions\r\n */\r\n private getSessionStorageKey(contextKey: string, userId: string): string {\r\n return `${this.STORAGE_PREFIX}${contextKey}_${userId}`;\r\n }\r\n\r\n /**\r\n * Migrate legacy flat message history to session format\r\n */\r\n private migrateLegacyData(contextKey: string, userId: string): ChatSession[] {\r\n const legacyKey = `${this.LEGACY_PREFIX}${contextKey}_${userId}`;\r\n const stored = localStorage.getItem(legacyKey);\r\n\r\n if (!stored) {\r\n return [];\r\n }\r\n\r\n try {\r\n const messages = JSON.parse(stored);\r\n if (messages.length === 0) {\r\n return [];\r\n }\r\n\r\n // Create a single session from legacy messages\r\n const session: ChatSession = {\r\n id: this.generateSessionId(),\r\n timestamp: messages[0].timestamp ? new Date(messages[0].timestamp) : new Date(),\r\n title: 'Migrated Conversation',\r\n messages: messages.map((m: any) => ({\r\n ...m,\r\n timestamp: m.timestamp ? new Date(m.timestamp) : undefined,\r\n })),\r\n contextKey,\r\n userId,\r\n };\r\n\r\n // Save as new format\r\n this.saveSession(session).subscribe();\r\n\r\n // Remove legacy data\r\n localStorage.removeItem(legacyKey);\r\n\r\n return [session];\r\n } catch (e) {\r\n console.error('Failed to migrate legacy data', e);\r\n return [];\r\n }\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { UserContext } from '../../../../public-api';\r\nimport { AuthService } from '../../../core/auth/auth.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatContextService {\r\n private authService = inject(AuthService, { optional: true });\r\n\r\n // User context for backend proxy mode\r\n private userContext?: UserContext;\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Check if user is authenticated\r\n */\r\n isAuthenticated(): boolean {\r\n return this.authService?.isAuthenticated() || false;\r\n }\r\n\r\n /**\r\n * Get organization ID from auth service\r\n */\r\n getOrganizationId(): string {\r\n return this.authService?.getOrganizationId() || '';\r\n }\r\n\r\n /**\r\n * Set user context\r\n */\r\n public setUserContext(context: UserContext): void {\r\n this.userContext = context;\r\n }\r\n\r\n /**\r\n * Get user context\r\n */\r\n public getUserContext(): UserContext | undefined {\r\n return this.userContext;\r\n }\r\n\r\n /**\r\n * Get current user ID\r\n */\r\n public getUserId(): string {\r\n return this.userContext?.userId || 'anonymous';\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport logger from '../../../core/utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatAudioService {\r\n private audioUnlocked = false;\r\n\r\n constructor() { }\r\n\r\n /**\r\n * Unlock audio playback (required for autoplay in browsers)\r\n */\r\n public unlockAudio(): void {\r\n if (this.audioUnlocked) return;\r\n const audio = new Audio();\r\n audio.volume = 1.0;\r\n audio\r\n .play()\r\n .then(() => (this.audioUnlocked = true))\r\n .catch(() => { });\r\n }\r\n\r\n /**\r\n * Play bot message sound\r\n */\r\n public playBotSound(): void {\r\n if (!this.audioUnlocked) return;\r\n try {\r\n const audio = new Audio('assets/bot.mp3');\r\n audio.play();\r\n } catch (error) {\r\n logger.error('Error playing bot sound:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Check if audio is unlocked\r\n */\r\n public isAudioUnlocked(): boolean {\r\n return this.audioUnlocked;\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { AuthMode } from '../types/auth-mode.type';\r\nimport { TenantResolutionStrategy } from '../types/tenant-resolution-strategy.type';\r\nimport { PromptMode } from '../types/prompt-mode.type';\r\n\r\n/**\r\n * Callback function to dynamically resolve tenant context\r\n */\r\nexport interface TenantContextResolver {\r\n /**\r\n * Resolve tenant context from your application's auth state\r\n * @returns Tenant context object or Promise\r\n */\r\n resolve: () => TenantContext | Promise<TenantContext>;\r\n}\r\n\r\n/**\r\n * Tenant context structure\r\n */\r\nexport interface TenantContext {\r\n platformTenant: string;\r\n subTenant: string;\r\n agent: string;\r\n}\r\n\r\n/**\r\n * Advanced configuration for DoohBot package\r\n * Supports both simple and complex use cases\r\n */\r\nexport interface DoohbotAdvancedConfig {\r\n /**\r\n * Authentication mode\r\n * - 'manual': You provide platformTenant, subTenant, agent manually\r\n * - 'auto': Package reads from your auth service via resolver\r\n * @default 'manual'\r\n */\r\n authMode?: AuthMode;\r\n\r\n /**\r\n * Tenant resolution strategy\r\n * - 'static': Use fixed values provided via inputs\r\n * - 'dynamic': Automatically update when auth state changes\r\n * - 'callback': Use custom resolver function\r\n * @default 'static'\r\n */\r\n tenantResolution?: TenantResolutionStrategy;\r\n\r\n /**\r\n * Custom resolver for tenant context (used when tenantResolution = 'callback')\r\n */\r\n tenantContextResolver?: TenantContextResolver;\r\n\r\n /**\r\n * Auto-configure from localStorage key\r\n * If provided, package will read auth data from localStorage\r\n * Example: 'auth_user' or 'saas_session'\r\n */\r\n autoConfigFromStorage?: string;\r\n\r\n /**\r\n * Enable multi-tenant mode\r\n * Allows switching between different tenant contexts\r\n * @default false\r\n */\r\n enableMultiTenant?: boolean;\r\n\r\n /**\r\n * Persist chat history per tenant\r\n * @default true\r\n */\r\n persistChatPerTenant?: boolean;\r\n\r\n /**\r\n * Custom authentication header name\r\n * @default 'Authorization'\r\n */\r\n authHeaderName?: string;\r\n\r\n /**\r\n * Custom authentication header format\r\n * Use {token} as placeholder\r\n * @default 'Bearer {token}'\r\n */\r\n authHeaderFormat?: string;\r\n\r\n /**\r\n * Enable role-based features\r\n * Shows/hides features based on user permissions\r\n * @default false\r\n */\r\n enableRoleBasedFeatures?: boolean;\r\n\r\n /**\r\n * User permissions (for role-based features)\r\n */\r\n userPermissions?: string[];\r\n\r\n /**\r\n * Callback when authentication fails\r\n */\r\n onAuthFailure?: (error: any) => void;\r\n\r\n /**\r\n * Callback when tenant context changes\r\n */\r\n onTenantChange?: (context: TenantContext) => void;\r\n\r\n /**\r\n * Enable debug mode (logs configuration and requests)\r\n * @default false\r\n */\r\n debugMode?: boolean;\r\n\r\n /**\r\n * Prompt mode for chat responses\r\n * @default 'markdown'\r\n */\r\n promptMode?: PromptMode;\r\n}\r\n\r\n/**\r\n * Injection token for advanced configuration\r\n */\r\nexport const DOOHBOT_ADVANCED_CONFIG = new InjectionToken<DoohbotAdvancedConfig>(\r\n 'DOOHBOT_ADVANCED_CONFIG',\r\n {\r\n providedIn: 'root',\r\n factory: () => ({\r\n authMode: 'manual',\r\n tenantResolution: 'static',\r\n enableMultiTenant: false,\r\n persistChatPerTenant: true,\r\n authHeaderName: 'Authorization',\r\n authHeaderFormat: 'Bearer {token}',\r\n enableRoleBasedFeatures: false,\r\n debugMode: false,\r\n }),\r\n },\r\n);\r\n","import { Injectable, signal, inject, computed } from '@angular/core';\r\nimport { Subscription, firstValueFrom, Subject, lastValueFrom } from 'rxjs';\r\nimport { ChatSession } from './model/chat-session.model';\r\nimport { ChatHelperService } from './chat-helper.service';\r\n\r\n// Extracted Services\r\nimport { ChatApiService } from './services/chat-api.service';\r\nimport { ChatContextService } from './services/chat-context.service';\r\nimport { ChatAudioService } from './services/chat-audio.service';\r\nimport { UserContext } from '../../../public-api';\r\nimport { ChatApiError } from '../../core/models/api-request.model';\r\nimport { DOOHBOT_ADVANCED_CONFIG } from '../../core/models/doohbot-config.model';\r\nimport { Message } from '../../core/models/message';\r\nimport { MessageRole } from '../../core/types/message-role.type';\r\nimport { PromptMode } from '../../core/types/prompt-mode.type';\r\nimport logger from '../../core/utils/logger.service';\r\nimport { ChatRequest } from './model/chat-request.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatService {\r\n // Dependencies\r\n private chatHelperService = inject(ChatHelperService);\r\n private apiService = inject(ChatApiService);\r\n private contextService = inject(ChatContextService);\r\n private audioService = inject(ChatAudioService);\r\n private config = inject(DOOHBOT_ADVANCED_CONFIG, { optional: true });\r\n\r\n // Context-aware message storage\r\n private currentContextKey = signal<string>('default');\r\n\r\n // Public messages signal for current context\r\n public messages = signal<Message[]>([]);\r\n\r\n // Active session\r\n private activeSession: ChatSession | null = null;\r\n\r\n // UI state signals (Keep these here as they are relevant to the Chat UI state)\r\n public isLoadingApi = signal<boolean>(false);\r\n public apiError = signal<ChatApiError | null>(null);\r\n public isBotTyping = signal<boolean>(false);\r\n public promptMode = signal<PromptMode>('markdown');\r\n public useStreamChat = signal<boolean>(false);\r\n\r\n messagesStream: Array<{ role: MessageRole; content: string }> = [];\r\n currentResponse = '';\r\n\r\n private streamSubscription?: Subscription;\r\n\r\n getFallbackReply(): string {\r\n return \"I'm sorry 😔, I didn't understand that.\";\r\n }\r\n\r\n getFallbackError(): string {\r\n return 'Something went wrong. Please try again.';\r\n }\r\n\r\n constructor() {\r\n logger.log('ChatService: Initialized');\r\n\r\n // Initialize prompt mode from config if available\r\n if (this.config?.promptMode) {\r\n this.promptMode.set(this.config.promptMode);\r\n }\r\n }\r\n\r\n //! ==================== STATE MANAGEMENT ====================\r\n\r\n /**\r\n * Switch to a new context\r\n */\r\n public switchContext(contextKey: string): void {\r\n if (this.currentContextKey() === contextKey) {\r\n return;\r\n }\r\n this.currentContextKey.set(contextKey);\r\n // Start fresh - don't auto-load\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Start a new chat session\r\n */\r\n public startNewSession(): void {\r\n const contextKey = this.currentContextKey();\r\n const userId = this.contextService.getUserId();\r\n\r\n this.activeSession = this.chatHelperService.createSession(contextKey, userId);\r\n this.messages.set([]);\r\n }\r\n\r\n /**\r\n * Load an existing session\r\n */\r\n public loadSession(session: ChatSession): void {\r\n this.activeSession = session;\r\n this.messages.set([...session.messages]);\r\n }\r\n\r\n /**\r\n * Get current context key\r\n */\r\n public getCurrentContextKey(): string {\r\n return this.currentContextKey();\r\n }\r\n\r\n /**\r\n * Set user context for backend proxy mode\r\n */\r\n public setUserContext(context: UserContext): void {\r\n const currentUser = this.contextService.getUserContext();\r\n if (currentUser?.userId === context.userId) {\r\n logger.log('UserContext changed but userId is the same, skipping session reset');\r\n return;\r\n }\r\n this.contextService.setUserContext(context);\r\n // Start fresh when user changes - don't auto-load\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Get current user context\r\n */\r\n public getUserContext(): UserContext | undefined {\r\n return this.contextService.getUserContext();\r\n }\r\n\r\n /**\r\n * Get active session\r\n */\r\n public getActiveSession(): ChatSession | null {\r\n return this.activeSession;\r\n }\r\n\r\n /**\r\n * Clear messages for current session and start new one\r\n */\r\n clearMessages(): void {\r\n this.messages.set([]);\r\n this.startNewSession();\r\n }\r\n\r\n /**\r\n * Add message to current session\r\n */\r\n public addMessage(message: Message): void {\r\n const newMessage = { ...message, timestamp: new Date() };\r\n\r\n // Update current messages signal\r\n this.messages.update((msgs) => [...msgs, newMessage]);\r\n\r\n // Save to active session\r\n if (this.activeSession) {\r\n logger.log('Saving message to session:', this.activeSession.id);\r\n this.chatHelperService.saveMessageToSession(this.activeSession, newMessage).subscribe(() => {\r\n logger.log('Message saved, session title:', this.activeSession?.title);\r\n });\r\n } else {\r\n logger.warn('No active session to save message to!');\r\n }\r\n\r\n if (message.sender === 'bot') {\r\n this.audioService.playBotSound();\r\n }\r\n }\r\n\r\n //! ==================== MESSAGE PROCESSING ====================\r\n\r\n /**\r\n * Process a user message: add it, get bot reply, and add bot reply\r\n */\r\n public async sendMessage(text: string): Promise<void> {\r\n this.addMessage({\r\n sender: 'user',\r\n text: text,\r\n id: Date.now().toString(),\r\n timestamp: new Date(),\r\n });\r\n\r\n this.isBotTyping.set(true);\r\n\r\n const minDelay = 1000;\r\n const start = Date.now();\r\n\r\n try {\r\n const response = await this.getBotReply(text);\r\n\r\n // Ensure minimum delay\r\n const elapsed = Date.now() - start;\r\n if (elapsed < minDelay) {\r\n await new Promise((resolve) => setTimeout(resolve, minDelay - elapsed));\r\n }\r\n\r\n const isFallback = response === this.getFallbackReply();\r\n this.addMessage({\r\n sender: 'bot',\r\n text: response,\r\n id: Date.now().toString(),\r\n showSuggestions: true, //! Don't show suggestions for fallback reply\r\n });\r\n } finally {\r\n this.isBotTyping.set(false);\r\n }\r\n }\r\n\r\n /**\r\n * Call chat API to get bot reply\r\n */\r\n async getBotReply(userText: string): Promise<string> {\r\n logger.log('Requesting bot reply for:', userText);\r\n\r\n // Check if user is authenticated\r\n const isAuthenticated = this.contextService.isAuthenticated();\r\n\r\n // Call API if user is authenticated\r\n if (isAuthenticated) {\r\n logger.log('User authenticated, fetching reply from API');\r\n return this.getBotReplyFromApi(userText);\r\n }\r\n\r\n logger.log('User not authenticated, return fallback error');\r\n return this.getFallbackError();\r\n }\r\n\r\n /**\r\n * Get bot reply from API\r\n */\r\n private async getBotReplyFromApi(userText: string): Promise<string> {\r\n try {\r\n this.isLoadingApi.set(true);\r\n this.apiError.set(null);\r\n\r\n const organizationId = this.contextService.getOrganizationId();\r\n\r\n const request: ChatRequest = {\r\n question: userText,\r\n temperature: 0.7,\r\n organization_id: organizationId,\r\n prompt_mode: this.promptMode(),\r\n };\r\n\r\n //TODO: Support continuing chat --DONE\r\n // Add chat_session_id if we have one (to continue conversation)\r\n if (this.activeSession && !this.activeSession.id.startsWith('session_')) {\r\n request.chat_session_id = this.activeSession.id;\r\n logger.log('>>>> conversation continued', this.activeSession.id);\r\n } else {\r\n logger.log('>>>> new conversation started');\r\n }\r\n\r\n logger.log('Sending API request to chat endpoint:', request);\r\n\r\n //! Call chat API endpoint\r\n let response;\r\n if (this.useStreamChat()) {\r\n logger.log('>>>>Using Stream Chat Endpoint<<<<');\r\n\r\n this.currentResponse = ''; // Reset before new stream\r\n\r\n // Create a subject to track stream completion\r\n const streamComplete$ = new Subject<string>();\r\n\r\n this.streamSubscription = this.apiService.sendMessageStream(request).subscribe({\r\n next: (chunk) => {\r\n this.currentResponse += chunk.content || '';\r\n },\r\n error: (error) => {\r\n console.error('Chat error:', error);\r\n this.messagesStream.push({\r\n role: 'assistant',\r\n content: 'Sorry, an error occurred. Please try again.',\r\n });\r\n this.isLoadingApi.set(false);\r\n streamComplete$.error(error);\r\n },\r\n complete: () => {\r\n if (this.currentResponse.trim()) {\r\n this.messagesStream.push({\r\n role: 'assistant',\r\n content: this.currentResponse,\r\n });\r\n }\r\n this.isLoadingApi.set(false);\r\n const response = this.currentResponse;\r\n this.currentResponse = '';\r\n streamComplete$.next(response);\r\n streamComplete$.complete();\r\n },\r\n });\r\n\r\n // Wait for the stream to complete and return the accumulated response\r\n return await lastValueFrom(streamComplete$);\r\n } else {\r\n logger.log('>>>>Using Standard Chat Endpoint<<<<');\r\n response = await firstValueFrom(this.apiService.sendMessage(request, true));\r\n this.isLoadingApi.set(false);\r\n\r\n if (response && response.success && response.data) {\r\n // Handle chat_history_id mapping if it's a new session\r\n const responseId = response.data.id;\r\n if (responseId && this.activeSession && this.activeSession.id.startsWith('session_')) {\r\n const oldId = this.activeSession.id;\r\n const contextKey = this.currentContextKey();\r\n const userId = this.contextService.getUserId();\r\n\r\n logger.log(`Mapping local session ${oldId} to backend ID ${responseId} `);\r\n this.chatHelperService\r\n .updateSessionId(oldId, responseId, contextKey, userId)\r\n .subscribe((updatedSession) => {\r\n if (updatedSession) {\r\n this.activeSession = updatedSession;\r\n }\r\n });\r\n }\r\n\r\n const reply = response.data.content || this.getFallbackError();\r\n\r\n logger.log('Received API response:', reply);\r\n return reply;\r\n }\r\n }\r\n\r\n return this.getFallbackError();\r\n } catch (error) {\r\n this.isLoadingApi.set(false);\r\n const apiError = error as ChatApiError;\r\n this.apiError.set(apiError);\r\n logger.error('API error:', apiError);\r\n\r\n return this.getFallbackError();\r\n }\r\n }\r\n\r\n cancelStream(): void {\r\n if (this.streamSubscription) {\r\n this.streamSubscription.unsubscribe();\r\n this.streamSubscription = undefined;\r\n\r\n if (this.currentResponse) {\r\n this.messagesStream.push({\r\n role: 'assistant',\r\n content: this.currentResponse,\r\n });\r\n }\r\n\r\n this.isLoadingApi.set(false);\r\n this.currentResponse = '';\r\n }\r\n }\r\n\r\n //! ==================== AUDIO ====================\r\n\r\n public unlockAudio(): void {\r\n this.audioService.unlockAudio();\r\n }\r\n}\r\n","import { Injectable, signal, computed, effect } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { ChatContext } from '../../app/chat/model/chat-context.model';\r\n\r\nexport interface ContextChangeEvent {\r\n previous: ChatContext | null;\r\n current: ChatContext;\r\n contextKey: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TenantContextService {\r\n // Current context state\r\n private platformTenant = signal<string>('');\r\n private subTenant = signal<string>('');\r\n private agent = signal<string>('');\r\n\r\n // Computed context object\r\n public currentContext = computed<ChatContext>(() => ({\r\n platformTenant: this.platformTenant(),\r\n subTenant: this.subTenant(),\r\n agent: this.agent(),\r\n }));\r\n\r\n // Computed unique context key for storage\r\n public contextKey = computed<string>(() => {\r\n const pt = this.platformTenant() || 'default';\r\n const st = this.subTenant() || 'default';\r\n const ag = this.agent() || 'default';\r\n return `${pt}_${st}_${ag}`;\r\n });\r\n\r\n // Observable for context changes\r\n private contextChangeSubject = new Subject<ContextChangeEvent>();\r\n public contextChange$ = this.contextChangeSubject.asObservable();\r\n\r\n private previousContext: ChatContext | null = null;\r\n\r\n constructor() {\r\n // Effect to emit context changes\r\n effect(() => {\r\n const current = this.currentContext();\r\n const key = this.contextKey();\r\n\r\n // Only emit if context actually changed\r\n if (this.hasContextChanged(current)) {\r\n this.contextChangeSubject.next({\r\n previous: this.previousContext,\r\n current: current,\r\n contextKey: key,\r\n });\r\n this.previousContext = { ...current };\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Update the complete context\r\n */\r\n public setContext(context: Partial<ChatContext>): void {\r\n if (context.platformTenant !== undefined) {\r\n this.platformTenant.set(context.platformTenant);\r\n }\r\n if (context.subTenant !== undefined) {\r\n this.subTenant.set(context.subTenant);\r\n }\r\n if (context.agent !== undefined) {\r\n this.agent.set(context.agent);\r\n }\r\n }\r\n\r\n /**\r\n * Update individual context properties\r\n */\r\n public setPlatformTenant(platformTenant: string): void {\r\n this.platformTenant.set(platformTenant);\r\n }\r\n\r\n public setSubTenant(subTenant: string): void {\r\n this.subTenant.set(subTenant);\r\n }\r\n\r\n public setAgent(agent: string): void {\r\n this.agent.set(agent);\r\n }\r\n\r\n /**\r\n * Get current context values\r\n */\r\n public getPlatformTenant(): string {\r\n return this.platformTenant();\r\n }\r\n\r\n public getSubTenant(): string {\r\n return this.subTenant();\r\n }\r\n\r\n public getAgent(): string {\r\n return this.agent();\r\n }\r\n\r\n public getContextKey(): string {\r\n return this.contextKey();\r\n }\r\n\r\n public getContext(): ChatContext {\r\n return this.currentContext();\r\n }\r\n\r\n /**\r\n * Check if context has changed\r\n */\r\n private hasContextChanged(current: ChatContext): boolean {\r\n if (!this.previousContext) {\r\n // First time initialization - only emit if we have valid values\r\n return current.platformTenant !== '' || current.subTenant !== '' || current.agent !== '';\r\n }\r\n\r\n return (\r\n this.previousContext.platformTenant !== current.platformTenant ||\r\n this.previousContext.subTenant !== current.subTenant ||\r\n this.previousContext.agent !== current.agent\r\n );\r\n }\r\n\r\n /**\r\n * Reset context to default\r\n */\r\n public resetContext(): void {\r\n this.platformTenant.set('');\r\n this.subTenant.set('');\r\n this.agent.set('');\r\n }\r\n}\r\n","import { HttpErrorResponse } from '@angular/common/http';\r\n\r\nexport class ErrorHandlerUtil {\r\n /**\r\n * Maps an error to a user-friendly message\r\n */\r\n public static handleError(error: any): string {\r\n if (error instanceof HttpErrorResponse) {\r\n switch (error.status) {\r\n case 401:\r\n return 'Unauthorized. Please check your credentials.';\r\n case 403:\r\n return 'Forbidden. You do not have permission to perform this action.';\r\n case 404:\r\n return 'The requested resource was not found.';\r\n case 429:\r\n return 'Too many requests. Please try again later.';\r\n case 500:\r\n return 'Internal server error. Please try again later.';\r\n default:\r\n return error.error?.message || 'An unexpected error occurred.';\r\n }\r\n }\r\n\r\n if (error instanceof Error) {\r\n return error.message;\r\n }\r\n\r\n return 'An unexpected error occurred.';\r\n }\r\n}\r\n","import { ChatHelperService } from './chat-helper.service';\r\nimport { Injectable, inject, signal, computed } from '@angular/core';\r\nimport { Observable, firstValueFrom } from 'rxjs';\r\nimport { ChatService } from './chat.service';\r\nimport { ChatSession } from './model/chat-session.model';\r\nimport { UserContext } from '../../../public-api';\r\nimport { AppConst } from '../../core/app-const';\r\nimport { AccountService } from '../../core/auth/account-api.service';\r\nimport { AuthService } from '../../core/auth/auth.service';\r\nimport { FederatedLoginRequest } from '../../core/auth/models/federated-login-request.model';\r\nimport { LoginRequest } from '../../core/auth/models/login-request.model';\r\nimport { TokenStorageService } from '../../core/auth/token-storage.service';\r\nimport { TenantContextService } from '../../core/services/tenant-context.service';\r\nimport { ErrorHandlerUtil } from '../../core/utils/error-handler.util';\r\nimport logger from '../../core/utils/logger.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatFacadeService {\r\n private chatService = inject(ChatService);\r\n private chatHelperService = inject(ChatHelperService);\r\n private accountService = inject(AccountService);\r\n private authService = inject(AuthService);\r\n private tenantContextService = inject(TenantContextService);\r\n private tokenStorage = inject(TokenStorageService);\r\n // private appConst = inject(AppConst);\r\n\r\n // Chat State\r\n public messages = this.chatService.messages;\r\n public isBotTyping = this.chatService.isBotTyping;\r\n public chatSessions = signal<ChatSession[]>([]);\r\n // public isAuthenticated = signal(false);\r\n\r\n public messageError = signal<string | null>(null);\r\n\r\n // API / Auth State\r\n apiError = signal<string | null>(null);\r\n authError = signal<string | null>(null);\r\n public authSuccess = signal<string | null>(null);\r\n public isLoggingIn = signal<boolean>(false);\r\n public isLoadingSessions = signal<boolean>(false);\r\n\r\n // Pagination & Caching State\r\n private historyOffset = signal<number>(0);\r\n private isCacheValid = signal<boolean>(false);\r\n public hasMoreHistory = signal<boolean>(true);\r\n public isLoadingMore = signal<boolean>(false);\r\n // public isInitialized = signal<boolean>(false);\r\n\r\n constructor() {\r\n // Sync with AuthService reactive state\r\n // this.authService.authStateSubject.subscribe((isAuthenticated) => {\r\n // this.isAuthenticated.set(isAuthenticated);\r\n // if (!isAuthenticated) {\r\n // // Clear all chat state atomically when logged out\r\n // this.clearChatStateAtomic();\r\n // }\r\n // });\r\n }\r\n\r\n /**\r\n * Atomically clear all chat-related state\r\n * Ensures no race conditions or partial state\r\n */\r\n private clearChatStateAtomic(): void {\r\n logger.log('[ChatFacade] Clearing chat state atomically');\r\n\r\n // Clear messages\r\n this.chatService.clearMessages();\r\n\r\n // Cancel any ongoing streams\r\n this.chatService.cancelStream();\r\n\r\n // Reset typing indicators\r\n this.chatService.isBotTyping.set(false);\r\n\r\n // Clear sessions\r\n this.chatSessions.set([]);\r\n\r\n // Reset pagination\r\n this.historyOffset.set(0);\r\n this.hasMoreHistory.set(true);\r\n this.isCacheValid.set(false);\r\n\r\n // Clear errors\r\n this.messageError.set(null);\r\n this.authError.set(null);\r\n this.apiError.set(null);\r\n\r\n logger.log('[ChatFacade] Chat state cleared');\r\n }\r\n\r\n /**\r\n * Attempts a silent login using either configuration or encrypted local storage.\r\n * If stored credentials are found, it logs in the user and sets the authentication state.\r\n * If no stored credentials are found, it logs a message indicating no stored credentials were found.\r\n * @private\r\n */\r\n private trySilentLogin(): void {\r\n // Prioritize credentials from configuration (i.e. appconst.json)\r\n let username = AppConst?.data?.username;\r\n let password = AppConst?.data?.password;\r\n let source = 'config';\r\n\r\n // Fallback to encrypted local storage\r\n if (!username || !password) {\r\n username = this.tokenStorage.get('username');\r\n password = this.tokenStorage.get('password');\r\n source = 'storage';\r\n }\r\n\r\n if (username && password) {\r\n logger.info(`[ChatFacade] Attempting silent login (${source}) for user: ${username}`);\r\n this.login({ username, password }, true);\r\n logger.info('[ChatFacade] No stored credentials found');\r\n }\r\n }\r\n\r\n /**\r\n * Get logged-in user's name from auth token\r\n */\r\n getLoggedInUserName(): string {\r\n const username = this.tokenStorage.get('username');\r\n return username || 'User';\r\n }\r\n\r\n //! ==================== SESSION MANAGEMENT ============================\r\n\r\n /**\r\n * Load all chat sessions for a specific user and context\r\n * Uses cache if valid, otherwise fetches from API\r\n */\r\n loadUserSessions(contextKey: string, userId: string, forceRefresh: boolean = false): void {\r\n // Check cache validity\r\n if (this.isCacheValid() && !forceRefresh && this.chatSessions().length > 0) {\r\n logger.log('Using cached sessions, skipping API call');\r\n return;\r\n }\r\n\r\n logger.log(`Fetching chat sessions for context: ${contextKey}, user: ${userId}...`);\r\n this.isLoadingSessions.set(true);\r\n this.historyOffset.set(0); // Reset offset\r\n\r\n this.chatHelperService.loadAllSessions(contextKey, userId, 50, 0).subscribe({\r\n next: (result) => {\r\n this.chatSessions.set(result.sessions);\r\n this.hasMoreHistory.set(result.hasMore);\r\n this.historyOffset.set(50); // Set to next offset\r\n this.isCacheValid.set(true); // Mark cache as valid\r\n logger.log(\r\n `Successfully loaded ${result.sessions.length} sessions. HasMore: ${result.hasMore}`,\r\n );\r\n this.isLoadingSessions.set(false);\r\n },\r\n error: (err) => {\r\n logger.error(`Failed to load sessions:`, err);\r\n this.isLoadingSessions.set(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Load more sessions (for infinite scroll)\r\n */\r\n loadMoreSessions(contextKey: string, userId: string): void {\r\n if (!this.hasMoreHistory() || this.isLoadingMore()) {\r\n logger.log('No more sessions to load or already loading');\r\n return;\r\n }\r\n\r\n const currentOffset = this.historyOffset();\r\n logger.log(`Loading more sessions from offset: ${currentOffset}`);\r\n this.isLoadingMore.set(true);\r\n\r\n this.chatHelperService.loadAllSessions(contextKey, userId, 50, currentOffset).subscribe({\r\n next: (result) => {\r\n // Append new sessions to existing ones\r\n const updatedSessions = [...this.chatSessions(), ...result.sessions];\r\n this.chatSessions.set(updatedSessions);\r\n this.hasMoreHistory.set(result.hasMore);\r\n this.historyOffset.set(currentOffset + 50); // Increment offset\r\n logger.log(\r\n `Loaded ${result.sessions.length} more sessions. Total: ${updatedSessions.length}. HasMore: ${result.hasMore}`,\r\n );\r\n this.isLoadingMore.set(false);\r\n },\r\n error: (err) => {\r\n logger.error(`Failed to load more sessions:`, err);\r\n this.isLoadingMore.set(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Invalidate cache (call on message send, session delete, logout)\r\n */\r\n invalidateCache(): void {\r\n logger.log('Invalidating history cache');\r\n this.isCacheValid.set(false);\r\n this.historyOffset.set(0);\r\n this.hasMoreHistory.set(true);\r\n }\r\n\r\n /**\r\n * Delete a specific session\r\n */\r\n deleteSession(sessionId: string, contextKey: string, userId: string): Observable<void> {\r\n logger.log(`Requesting deletion of session: ${sessionId}`);\r\n return new Observable((observer) => {\r\n this.chatHelperService.deleteSession(sessionId, contextKey, userId).subscribe({\r\n next: () => {\r\n logger.log(`Session ${sessionId} deleted successfully. Reloading sessions...`);\r\n // Reload sessions after deletion\r\n this.loadUserSessions(contextKey, userId);\r\n\r\n // If deleted session is currently active, start a new one\r\n const activeSession = this.chatService.getActiveSession();\r\n if (activeSession?.id === sessionId) {\r\n logger.log('Active session was deleted, starting a new one.');\r\n this.chatService.startNewSession();\r\n }\r\n\r\n observer.next();\r\n observer.complete();\r\n },\r\n error: (err) => {\r\n logger.error(`Failed to delete session ${sessionId}:`, err);\r\n observer.error(err);\r\n },\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Load a specific session into the message service\r\n */\r\n loadSession(session: ChatSession): void {\r\n this.chatService.loadSession(session);\r\n logger.log('Loaded session:', session.title);\r\n }\r\n\r\n /**\r\n * Start a new chat session\r\n */\r\n startNewSession(): void {\r\n this.chatService.startNewSession();\r\n }\r\n\r\n //! ======================= MESSAGE OPERATIONS ===========================\r\n\r\n /**\r\n * Send a message with validation\r\n */\r\n async sendMessage(text: string, maxLength: number = 1000): Promise<void> {\r\n const trimmedText = text.trim();\r\n this.messageError.set(null);\r\n\r\n if (!trimmedText) {\r\n return;\r\n }\r\n\r\n if (trimmedText.length > maxLength) {\r\n this.messageError.set(`Message exceeds maximum length of ${maxLength} characters.`);\r\n setTimeout(() => {\r\n this.messageError.set(null);\r\n }, 5000);\r\n return;\r\n }\r\n\r\n // Delegate to ChatService\r\n await this.chatService.sendMessage(trimmedText);\r\n }\r\n\r\n /**\r\n * Clear the current chat and start a new session\r\n */\r\n clearCurrentChat(contextKey: string, userId: string): void {\r\n this.chatService.clearMessages();\r\n // Refresh sessions list after clearing\r\n this.loadUserSessions(contextKey, userId);\r\n }\r\n\r\n /**\r\n * Clear message error\r\n */\r\n clearMessageError(): void {\r\n this.messageError.set(null);\r\n this.authError.set(null);\r\n this.authSuccess.set(null);\r\n }\r\n\r\n //! ====================== AUTHENTICATION OPERATIONS =============================\r\n\r\n /**\r\n * Authenticate user with federated credentials\r\n */\r\n async federatedLogin(\r\n credentials: FederatedLoginRequest,\r\n silent: boolean = false,\r\n ): Promise<boolean> {\r\n logger.log('>>>>>>>Attempting federated login...');\r\n this.isLoggingIn.set(true);\r\n if (!silent) {\r\n this.authError.set(null);\r\n this.authSuccess.set(null);\r\n }\r\n\r\n try {\r\n const response = await firstValueFrom(this.accountService.federateLogin(credentials));\r\n logger.log('>>>>>>>>>>>Federated Login response<<<<<<<<<<:', response);\r\n if (response && response.success && response.data) {\r\n // Map federated result to something AuthService can handle\r\n // Federated result: { access_token: string, remember_me: boolean }\r\n const authResult = {\r\n access_token: response.data.access_token,\r\n refresh_token: credentials.rememberMe ? response.data.refresh_token : '',\r\n };\r\n\r\n this.authService.setSession(authResult);\r\n // this.authService.authStateSubject.next(true); // Handled automatically by authState$\r\n\r\n logger.log('Federated login successful, authenticated state set to true');\r\n if (!silent) {\r\n this.authSuccess.set('Login successful!');\r\n }\r\n this.isLoggingIn.set(false);\r\n return true;\r\n } else {\r\n if (!silent) {\r\n this.authError.set('Federated login failed.');\r\n }\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n logger.error('Federated login failed:', error);\r\n if (!silent) {\r\n this.authError.set('An error occurred during federated login.');\r\n }\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Authenticate user with credentials\r\n */\r\n async login(credentials: LoginRequest, silent: boolean = false): Promise<boolean> {\r\n this.isLoggingIn.set(true);\r\n if (!silent) {\r\n this.authError.set(null);\r\n this.authSuccess.set(null);\r\n }\r\n\r\n try {\r\n const response = await firstValueFrom(this.accountService.login(credentials));\r\n logger.log('>>>>>>>>>>>Login response<<<<<<<<<<:', response);\r\n logger.log('>>>>>>>>>>Credentials used<<<<<<<<:', credentials);\r\n if (response && response.success && response.data) {\r\n logger.log('Login response (success):', response);\r\n this.authService.setSession(response.data);\r\n // this.authService.authStateSubject.next(true); // Handled automatically by authState$\r\n\r\n logger.log('Login successful, authenticated state set to true');\r\n if (!silent) {\r\n this.authSuccess.set('Login successful!');\r\n }\r\n this.isLoggingIn.set(false);\r\n return true;\r\n } else {\r\n if (!silent) {\r\n this.authError.set('Login failed. Please check your credentials.');\r\n }\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n } catch (error) {\r\n logger.error('Login failed:', error);\r\n if (!silent) {\r\n this.authError.set(ErrorHandlerUtil.handleError(error));\r\n }\r\n this.isLoggingIn.set(false);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Check if user is authenticated\r\n */\r\n checkAuthentication(): boolean {\r\n return this.authService.isAuthenticated();\r\n }\r\n\r\n /**\r\n * Logout the current user\r\n */\r\n async logout(): Promise<void> {\r\n try {\r\n // Get refresh token from token storage\r\n const refreshToken = this.tokenStorage.get('refresh_token');\r\n\r\n if (!refreshToken) {\r\n logger.warn('No refresh token found, clearing local state only');\r\n this.clearAuthState();\r\n return;\r\n }\r\n\r\n // Call the backend logout endpoint with refresh token\r\n const response = await firstValueFrom(this.accountService.logout(refreshToken));\r\n\r\n if (response && response.success) {\r\n this.clearAuthState();\r\n logger.log('User logged out successfully');\r\n } else {\r\n throw new Error('Logout failed');\r\n }\r\n } catch (error) {\r\n logger.error('Logout failed:', error);\r\n // Even if backend logout fails, clear local state\r\n this.clearAuthState();\r\n this.authError.set(ErrorHandlerUtil.handleError(error));\r\n setTimeout(() => {\r\n this.authError.set(null);\r\n }, 5000);\r\n }\r\n }\r\n\r\n /**\r\n * Clear authentication state and reset UI\r\n */\r\n private clearAuthState(): void {\r\n // Clear auth storage via AuthService\r\n this.authService.clearAuth();\r\n\r\n // Update authentication state\r\n // this.isAuthenticated.set(false); // Handled automatically by authState$\r\n\r\n // Clear messages and start new session\r\n this.chatService.clearMessages();\r\n this.chatService.startNewSession();\r\n\r\n // Clear sessions\r\n this.chatSessions.set([]);\r\n\r\n // Show success message\r\n this.authSuccess.set('Logged out successfully!');\r\n\r\n // Clear success message after 3 seconds\r\n setTimeout(() => {\r\n this.authSuccess.set(null);\r\n }, 3000);\r\n }\r\n\r\n //! ========================== CONTEXT MANAGEMENT ==========================\r\n\r\n /**\r\n * Update tenant context (platformTenant, subTenant, agent)\r\n */\r\n updateTenantContext(platformTenant: string, subTenant: string, agent: string): void {\r\n this.tenantContextService.setContext({\r\n platformTenant: platformTenant || '',\r\n subTenant: subTenant || '',\r\n agent: agent || '',\r\n });\r\n\r\n // Sync message service with new context\r\n const contextKey = this.tenantContextService.contextKey();\r\n logger.log('>>>>>ChatFacade: Switching context to', contextKey);\r\n this.chatService.switchContext(contextKey);\r\n }\r\n\r\n /**\r\n * Handle user context changes (for backend proxy mode)\r\n */\r\n handleUserContextChange(userContext: UserContext): void {\r\n this.chatService.setUserContext(userContext);\r\n logger.log('>>>>ChatFacade: User context updated', userContext.userName);\r\n }\r\n\r\n /**\r\n * Get current context key\r\n */\r\n getCurrentContextKey(): string {\r\n return this.tenantContextService.contextKey();\r\n }\r\n\r\n /**\r\n * Subscribe to context changes\r\n */\r\n subscribeToContextChanges(callback: (contextKey: string) => void): () => void {\r\n const subscription = this.tenantContextService.contextChange$.subscribe((event) => {\r\n // Sync message service with new context\r\n this.chatService.switchContext(event.contextKey);\r\n callback(event.contextKey);\r\n });\r\n\r\n // Return cleanup function\r\n return () => subscription.unsubscribe();\r\n }\r\n\r\n /**\r\n * Get current context key\r\n */\r\n cancelStream(): void {\r\n return this.chatService.cancelStream();\r\n }\r\n\r\n //! ====================== COMPUTED STATES =======================\r\n\r\n /**\r\n * Determine if suggestion chips should be shown\r\n */\r\n showSuggestionChips = computed(() => {\r\n const msgs = this.messages();\r\n if (msgs.length === 0) return false;\r\n const lastBotMsg = [...msgs].reverse().find((m) => m.sender === 'bot');\r\n return lastBotMsg?.showSuggestions === true;\r\n });\r\n}\r\n","import { Injectable, signal, computed, effect } from '@angular/core';\r\nimport { Message } from '../../core/models/message';\r\n\r\n/**\r\n * ChatUIStateService - Centralized UI state management\r\n *\r\n * Manages all UI-related state for the chat component including:\r\n * - Chat window open/close state\r\n * - History sidebar visibility\r\n * - Unread message tracking\r\n * - Fullscreen state\r\n *\r\n * This service uses Angular signals for reactive state management,\r\n * allowing components to subscribe to state changes efficiently.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ChatUIStateService {\r\n //! ===================== UI STATE SIGNALS============================\r\n\r\n /**\r\n * Whether the chat window is currently open\r\n */\r\n public isChatOpen = signal(false);\r\n\r\n /**\r\n * Whether the history sidebar is currently open\r\n */\r\n public isHistorySidebarOpen = signal(false);\r\n\r\n /**\r\n * Whether the chat is in fullscreen mode\r\n */\r\n public isFullScreen = signal(false);\r\n\r\n /**\r\n * ID of the last message that was read by the user\r\n */\r\n private lastReadMessageId = signal<string | null>(null);\r\n\r\n /**\r\n * Reference to current messages (injected from outside)\r\n */\r\n private messagesSignal = signal<Message[]>([]);\r\n\r\n //! ===================== COMPUTED SIGNALS ======================\r\n\r\n /**\r\n * Computed number of unread bot messages\r\n */\r\n public unreadCount = computed(() => {\r\n if (this.isChatOpen()) {\r\n return 0; // No unread when chat is open\r\n }\r\n\r\n const messages = this.messagesSignal();\r\n if (messages.length === 0) return 0;\r\n\r\n const lastReadId = this.lastReadMessageId();\r\n let lastReadIndex = -1;\r\n\r\n if (lastReadId !== null) {\r\n lastReadIndex = messages.findIndex((msg) => msg.id === lastReadId);\r\n }\r\n\r\n // Count unread bot messages after last read position\r\n const unreadBotMessages = messages\r\n .slice(lastReadIndex + 1)\r\n .filter((msg) => msg.sender === 'bot');\r\n\r\n return unreadBotMessages.length;\r\n });\r\n\r\n //! ===================== EFFECTS ========================\r\n\r\n /**\r\n * Effect to automatically mark messages as read when chat is opened\r\n */\r\n public markAsReadEffect = effect(\r\n () => {\r\n const isOpen = this.isChatOpen();\r\n const msgs = this.messagesSignal();\r\n\r\n if (isOpen && msgs.length > 0) {\r\n const lastMessage = msgs[msgs.length - 1];\r\n if (lastMessage?.id) {\r\n const currentLastRead = this.lastReadMessageId();\r\n if (lastMessage.id !== currentLastRead) {\r\n this.lastReadMessageId.set(lastMessage.id);\r\n }\r\n }\r\n }\r\n },\r\n // { allowSignalWrites: true }, // TODO: Figure out why this doesn't work\r\n );\r\n\r\n //! =================== PUBLIC METHODS ===========================\r\n\r\n /**\r\n * Set the messages signal reference from an external source\r\n * This allows the UI state service to track messages from MessageService\r\n */\r\n setMessagesSignal(messagesSignal: any): void {\r\n this.messagesSignal = messagesSignal;\r\n }\r\n\r\n /**\r\n * Toggle the chat window open/close state\r\n */\r\n toggleChat(): void {\r\n const currentlyOpen = this.isChatOpen();\r\n this.isChatOpen.update((open) => !open);\r\n\r\n // Mark messages as read when opening chat\r\n if (!currentlyOpen) {\r\n const messages = this.messagesSignal();\r\n if (messages.length > 0) {\r\n const lastMessage = messages[messages.length - 1];\r\n this.lastReadMessageId.set(lastMessage.id ?? null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Toggle the history sidebar open/close state\r\n */\r\n toggleHistorySidebar(): void {\r\n this.isHistorySidebarOpen.update((open) => !open);\r\n }\r\n\r\n /**\r\n * Close the chat window\r\n */\r\n closeChat(): void {\r\n this.isChatOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the chat window\r\n */\r\n openChat(): void {\r\n this.isChatOpen.set(true);\r\n }\r\n\r\n /**\r\n * Close the history sidebar\r\n */\r\n closeHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(false);\r\n }\r\n\r\n /**\r\n * Open the history sidebar\r\n */\r\n openHistorySidebar(): void {\r\n this.isHistorySidebarOpen.set(true);\r\n }\r\n\r\n /**\r\n * Toggle fullscreen mode\r\n */\r\n toggleFullscreen(): void {\r\n this.isFullScreen.update((fs) => !fs);\r\n }\r\n\r\n /**\r\n * Set fullscreen state\r\n */\r\n setFullscreen(isFullscreen: boolean): void {\r\n this.isFullScreen.set(isFullscreen);\r\n }\r\n\r\n /**\r\n * Manually mark messages as read up to a specific message ID\r\n */\r\n markMessagesAsRead(messageId: string): void {\r\n this.lastReadMessageId.set(messageId);\r\n }\r\n\r\n /**\r\n * Reset last read message ID\r\n */\r\n resetLastRead(): void {\r\n this.lastReadMessageId.set(null);\r\n }\r\n\r\n /**\r\n * Get the last read message ID\r\n */\r\n getLastReadMessageId(): string | null {\r\n return this.lastReadMessageId();\r\n }\r\n}\r\n","import { CommonModule, NgIf } from '@angular/common';\r\nimport { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n provideAppInitializer,\r\n Renderer2,\r\n SimpleChanges,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { bootstrapApplication } from '@angular/platform-browser';\r\nimport { appConst } from './constant/constant';\r\nimport { appEmoji } from './constant/utf8';\r\nimport { AppConst } from './core/app-const';\r\nimport { AuthInterceptor } from './core/interceptors/auth.interceptor';\r\nimport { LoginRequest } from './core/auth/models/login-request.model';\r\nimport { UserContext } from './core/models/user-context.model';\r\nimport { AuthService } from './core/auth/auth.service';\r\nimport logger from './core/utils/logger.service';\r\nimport { ThemeService } from './core/services/theme.service';\r\nimport { PredefinedMessages, SuggestedMessages } from './predefined_messages';\r\nimport { DoohbotInput } from './doohbot-input';\r\nimport { DoohbotApiConfig } from './core/models/api-config.model';\r\nimport { DoohbotThemeConfig } from './core/models/theme-config.model';\r\nimport { FederatedLoginRequest } from './core/auth/models/federated-login-request.model';\r\nimport { ChatButtonComponent } from './app/chat/components/chat-button/chat-button.component';\r\nimport { ChatWindowComponent } from './app/chat/components/chat-window/chat-window.component';\r\nimport { FullscreenDirective } from './core/directives/fullscreen/fullscreen.directive';\r\nimport { ChatFacadeService } from './app/chat/chat-facade.service';\r\nimport { ChatUIStateService } from './app/chat/chat-ui-state.service';\r\nimport { ChatSession } from './app/chat/model/chat-session.model';\r\nimport { AuthStatus } from './core/types/auth-status.type';\r\n\r\n@Component({\r\n selector: 'app-doohbot',\r\n standalone: true,\r\n imports: [CommonModule, ChatButtonComponent, ChatWindowComponent, FullscreenDirective, NgIf],\r\n templateUrl: './doohbot.component.html',\r\n styleUrls: ['./doohbot.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // providers: [\r\n // AppConst,\r\n // {\r\n // provide: APP_INITIALIZER,\r\n // useFactory: (appConst: AppConst) => () => appConst.load(),\r\n // deps: [AppConst],\r\n // multi: true,\r\n // },\r\n // ],\r\n})\r\nexport class Doohbot extends DoohbotInput implements OnInit, OnDestroy {\r\n //! ======================= INPUTS ==========================\r\n\r\n @Input() config: DoohbotInput = new DoohbotInput();\r\n @Input() platformTenant!: string;\r\n @Input() subTenant!: string;\r\n @Input() agent!: string;\r\n @Input() buttonStyle: 'fab' | 'sidebar' | 'sidebar-top' | 'sidebar-bottom' = 'fab';\r\n @Input() enableDrag: boolean = false;\r\n @Input() enableResize: boolean = false;\r\n @Input() apiConfig?: DoohbotApiConfig;\r\n @Input() userContext?: UserContext;\r\n @Input() themeConfig: DoohbotThemeConfig | undefined;\r\n\r\n appEmoji = appEmoji;\r\n\r\n //! ==================== FACADE SERVICES ======================\r\n\r\n private chatFacade = inject(ChatFacadeService);\r\n private uiState = inject(ChatUIStateService);\r\n private themeService = inject(ThemeService);\r\n private authService = inject(AuthService);\r\n\r\n //! ========================= EXPOSED STATE FROM FACADES ============================\r\n\r\n // UI State signals\r\n public isChatOpen = this.uiState.isChatOpen;\r\n public isHistorySidebarOpen = this.uiState.isHistorySidebarOpen;\r\n public isFullScreen = this.uiState.isFullScreen;\r\n public unreadCount = this.uiState.unreadCount;\r\n\r\n // Chat State signals\r\n public messages = this.chatFacade.messages;\r\n public isBotTyping = this.chatFacade.isBotTyping;\r\n public messageError = this.chatFacade.messageError;\r\n public showSuggestionChips = this.chatFacade.showSuggestionChips;\r\n public chatSessions = this.chatFacade.chatSessions;\r\n public hasMoreHistory = this.chatFacade.hasMoreHistory;\r\n public isLoadingMore = this.chatFacade.isLoadingMore;\r\n public isLoadingSessions = this.chatFacade.isLoadingSessions;\r\n\r\n // Auth State signals\r\n // public isAuthenticated = this.chatFacade.isAuthenticated;\r\n\r\n public isLoggingIn = this.chatFacade.isLoggingIn;\r\n public authError = this.chatFacade.authError;\r\n public authSuccess = this.chatFacade.authSuccess;\r\n\r\n //! ======================= COMPONENT-SPECIFIC STATE =====================\r\n\r\n public userName = 'User';\r\n public predefinedMessages: string[] = PredefinedMessages;\r\n public suggestedMessages: string[] = SuggestedMessages;\r\n\r\n public maxMessageLength = 1000;\r\n\r\n // Context cleanup\r\n private contextCleanup?: () => void;\r\n\r\n isAuthenticated = false;\r\n authStatus: AuthStatus = 'unknown';\r\n\r\n //! ========================= VIEW CHILDREN ======================\r\n\r\n @ViewChild(ChatWindowComponent, { read: ElementRef }) chatWindowRef!: ElementRef;\r\n @ViewChild(FullscreenDirective) fullscreenDirective!: FullscreenDirective;\r\n\r\n //! ======================= CONSTRUCTOR ========================\r\n\r\n constructor(\r\n private elementRef: ElementRef,\r\n private renderer: Renderer2,\r\n ) {\r\n super();\r\n\r\n // Setup messages signal ref for UI state service\r\n this.uiState.setMessagesSignal(this.chatFacade.messages);\r\n\r\n // Theme management effect\r\n effect(() => {\r\n const activeTheme = this.themeService.activeTheme();\r\n const host = this.elementRef.nativeElement;\r\n this.renderer.removeClass(host, 'light-theme');\r\n this.renderer.removeClass(host, 'dark-theme');\r\n this.renderer.addClass(host, activeTheme);\r\n this.renderer.addClass(host, activeTheme);\r\n });\r\n }\r\n\r\n //! ====================== LIFECYCLE HOOKS =====================\r\n\r\n ngOnInit() {\r\n logger.log('Initializing Doohbot component...');\r\n\r\n // 1. Run validation once on startup\r\n this.authService.validateStoredToken().subscribe();\r\n\r\n // 2. React to auth status changes\r\n this.authService.authStatus$.subscribe((status) => {\r\n this.authStatus = status;\r\n this.isAuthenticated = status === 'authenticated';\r\n\r\n if (status === 'authenticated') {\r\n this.initializeUI();\r\n }\r\n });\r\n }\r\n\r\n private initializeUI() {\r\n // Apply theme\r\n this.themeService.applyCssVariables(this.elementRef.nativeElement, this.themeConfig);\r\n\r\n // Set user metadata\r\n this.userAvatarUrl = this.config.userAvatarUrl || appConst.USER_AVATAR;\r\n this.updateUserName();\r\n\r\n // Initialize tenant context\r\n this.chatFacade.updateTenantContext(\r\n this.platformTenant || '',\r\n this.subTenant || '',\r\n this.agent || '',\r\n );\r\n\r\n // Start new session\r\n this.chatFacade.startNewSession();\r\n\r\n // Subscribe to context changes if not already\r\n if (!this.contextCleanup) {\r\n this.contextCleanup = this.chatFacade.subscribeToContextChanges(() => {\r\n this.uiState.resetLastRead();\r\n });\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Handle user context changes\r\n if (changes['userContext'] && this.userContext) {\r\n this.chatFacade.handleUserContextChange(this.userContext);\r\n this.updateUserName();\r\n\r\n // Reset UI state and re-authenticate\r\n this.uiState.closeChat();\r\n this.uiState.closeHistorySidebar();\r\n }\r\n\r\n // Handle config changes\r\n if (changes['config']) {\r\n this.userAvatarUrl = this.config.userAvatarUrl || appConst.USER_AVATAR;\r\n this.updateUserName();\r\n\r\n if (this.config.licenseKey) {\r\n this.authService.setLicenseKey(this.config.licenseKey);\r\n }\r\n }\r\n }\r\n\r\n //! ====================== AUTHENTICATION ==================\r\n // Logic moved to ChatFacadeService.initialize()\r\n\r\n onNormalLogin(credentials: LoginRequest): void {\r\n this.chatFacade.login(credentials, false);\r\n }\r\n\r\n performLogout(): void {\r\n // Invalidate history cache before logout\r\n this.chatFacade.invalidateCache();\r\n this.chatFacade.logout();\r\n }\r\n\r\n //! ====================== CHAT OPERATIONS =====================\r\n\r\n toggleChat(): void {\r\n this.uiState.toggleChat();\r\n }\r\n\r\n async sendMessage(text: string): Promise<void> {\r\n await this.chatFacade.sendMessage(text, this.maxMessageLength);\r\n // Invalidate cache after sending message\r\n this.chatFacade.invalidateCache();\r\n }\r\n\r\n clearChat(): void {\r\n const contextKey = this.chatFacade.getCurrentContextKey();\r\n const userId = this.userContext?.userId || 'anonymous';\r\n this.chatFacade.clearCurrentChat(contextKey, userId);\r\n }\r\n\r\n clearMessageError(): void {\r\n this.chatFacade.clearMessageError();\r\n }\r\n\r\n //! ===================== SESSION MANAGEMENT =======================\r\n\r\n toggleHistorySidebar(): void {\r\n const isNowOpen = !this.uiState.isHistorySidebarOpen();\r\n if (isNowOpen) {\r\n // Only load if not already cached\r\n this.loadUserSessions();\r\n }\r\n this.uiState.toggleHistorySidebar();\r\n }\r\n\r\n loadChatSession(session: ChatSession): void {\r\n this.chatFacade.loadSession(session);\r\n this.uiState.closeHistorySidebar();\r\n }\r\n\r\n deleteSession(sessionId: string): void {\r\n logger.log(`Deleting session: ${sessionId}`);\r\n const contextKey = this.chatFacade.getCurrentContextKey();\r\n const userId = this.userContext?.userId || this.authService.getUserId() || 'anonymous';\r\n this.chatFacade.deleteSession(sessionId, contextKey, userId.toString()).subscribe(() => {\r\n // Invalidate cache after deletion\r\n this.chatFacade.invalidateCache();\r\n });\r\n }\r\n\r\n private loadUserSessions(): void {\r\n const contextKey = this.chatFacade.getCurrentContextKey();\r\n const userId = this.userContext?.userId || this.authService.getUserId() || 'anonymous';\r\n logger.log(`Initiating loadUserSessions for user: ${userId}`);\r\n this.chatFacade.loadUserSessions(contextKey, userId.toString());\r\n }\r\n\r\n /**\r\n * Load more sessions for infinite scroll\r\n */\r\n loadMoreHistory(): void {\r\n const contextKey = this.chatFacade.getCurrentContextKey();\r\n const userId = this.userContext?.userId || this.authService.getUserId() || 'anonymous';\r\n logger.log(`Loading more sessions for user: ${userId}`);\r\n this.chatFacade.loadMoreSessions(contextKey, userId.toString());\r\n }\r\n\r\n /**\r\n * Manually refresh history\r\n */\r\n refreshHistory(): void {\r\n const contextKey = this.chatFacade.getCurrentContextKey();\r\n const userId = this.userContext?.userId || this.authService.getUserId() || 'anonymous';\r\n logger.log(`Refreshing sessions for user: ${userId}`);\r\n this.chatFacade.invalidateCache();\r\n this.chatFacade.loadUserSessions(contextKey, userId.toString(), true); // force refresh\r\n }\r\n\r\n //! ======================== FULLSCREEN =====================\r\n\r\n toggleFullScreen(): void {\r\n if (this.fullscreenDirective) {\r\n this.fullscreenDirective.toggle();\r\n const isFullscreen = this.fullscreenDirective.getFullscreenState();\r\n this.uiState.setFullscreen(isFullscreen);\r\n }\r\n }\r\n\r\n //! ================== UTILITY METHODS =======================\r\n\r\n trackByMessageId(index: number, item: any): string {\r\n return item.id || index.toString();\r\n }\r\n\r\n /**\r\n * Resolve and update the username from all available sources\r\n */\r\n private updateUserName(): void {\r\n const loggedInName = this.chatFacade.getLoggedInUserName();\r\n const contextName = this.userContext?.userName;\r\n const configName = this.config.username;\r\n\r\n if (contextName) {\r\n this.userName = contextName;\r\n } else if (configName) {\r\n this.userName = configName;\r\n } else if (loggedInName && loggedInName !== 'User') {\r\n this.userName = loggedInName;\r\n } else {\r\n this.userName = 'User';\r\n }\r\n\r\n logger.log('Resolved userName:', this.userName);\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up subscriptions\r\n if (this.contextCleanup) {\r\n this.contextCleanup();\r\n }\r\n\r\n this.chatFacade.cancelStream();\r\n }\r\n}\r\n\r\n//! ================== INITIALIZATION =======================\r\n\r\nexport function initializeApp() {\r\n const appConst = inject(AppConst);\r\n return appConst.load(); // Returns a Promise\r\n}\r\n\r\nbootstrapApplication(Doohbot, {\r\n providers: [\r\n provideHttpClient(withInterceptorsFromDi()),\r\n AppConst,\r\n provideAppInitializer(initializeApp),\r\n {\r\n provide: HTTP_INTERCEPTORS,\r\n useClass: AuthInterceptor,\r\n multi: true,\r\n },\r\n ],\r\n});\r\n","<app-chat-button\r\n [buttonStyle]=\"buttonStyle\"\r\n [isChatOpen]=\"isChatOpen()\"\r\n [unreadCount]=\"unreadCount()\"\r\n [chatIcon]=\"chatIcon ?? ''\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n (toggle)=\"toggleChat()\"\r\n></app-chat-button>\r\n\r\n<app-chat-window\r\n *ngIf=\"isChatOpen()\"\r\n appFullscreen\r\n [isChatOpen]=\"isChatOpen()\"\r\n [enableDrag]=\"enableDrag\"\r\n [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen()\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n [appHeaderLogoUrl]=\"appHeaderLogoUrl ?? ''\"\r\n [moreIcon]=\"moreIcon ?? ''\"\r\n [minimizeIcon]=\"minimizeIcon ?? ''\"\r\n [messages]=\"messages()\"\r\n [isBotTyping]=\"isBotTyping()\"\r\n [appSubtitle]=\"appSubtitle ?? ''\"\r\n [welcomeDesc]=\"welcomeDesc ?? ''\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [suggestedMessages]=\"suggestedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl ?? ''\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [hintText]=\"hintText ?? ''\"\r\n [sendIcon]=\"sendIcon ?? ''\"\r\n [messageError]=\"messageError()\"\r\n [showSuggestionChips]=\"showSuggestionChips()\"\r\n [isHistorySidebarOpen]=\"isHistorySidebarOpen()\"\r\n [chatSessions]=\"chatSessions()\"\r\n [isLoadingSessions]=\"isLoadingSessions()\"\r\n [hasMoreSessions]=\"hasMoreHistory()\"\r\n [isLoadingMoreSessions]=\"isLoadingMore()\"\r\n [chatHistoryUserName]=\"userName\"\r\n [isLoggingIn]=\"isLoggingIn()\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [authError]=\"authError()\"\r\n [authSuccess]=\"authSuccess()\"\r\n (toggleChat)=\"toggleChat()\"\r\n (loginSubmit)=\"onNormalLogin($event)\"\r\n (toggleFullScreen)=\"toggleFullScreen()\"\r\n (toggleHistorySidebar)=\"toggleHistorySidebar()\"\r\n (sessionSelected)=\"loadChatSession($event)\"\r\n (sessionDeleted)=\"deleteSession($event)\"\r\n (loadMoreSessions)=\"loadMoreHistory()\"\r\n (refreshSessions)=\"refreshHistory()\"\r\n (suggestionClick)=\"sendMessage($event)\"\r\n (send)=\"sendMessage($event)\"\r\n (clearMessageError)=\"clearMessageError()\"\r\n (clearChat)=\"clearChat()\"\r\n (logout)=\"performLogout()\"\r\n></app-chat-window>\r\n\r\n<!-- Skeleton Loader while auth is unknown or refreshing -->\r\n<div\r\n *ngIf=\"isChatOpen() && (authStatus === 'unknown' || authStatus === 'expired')\"\r\n class=\"auth-loading-skeleton\"\r\n>\r\n <div class=\"skeleton-header\"></div>\r\n <div class=\"skeleton-messages\"></div>\r\n <div class=\"skeleton-input\"></div>\r\n</div>\r\n","import { InjectionToken } from '@angular/core';\r\nimport { environment } from '../environments/environment.prod';\r\n\r\n/**\r\n * Configuration for Doohbot API integration\r\n */\r\nexport interface DoohbotApiConfig {\r\n /**\r\n * Backend API endpoint URL\r\n * Example: 'https://api.example.com/chat'\r\n */\r\n apiUrl: string;\r\n\r\n /**\r\n * Optional API key for authentication\r\n */\r\n apiKey?: string;\r\n\r\n /**\r\n * Request timeout in milliseconds\r\n * @default 30000 (30 seconds)\r\n */\r\n timeout?: number; // no need\r\n\r\n /**\r\n * Enable API mode (true) or use local intent matching (false)\r\n * @default false\r\n */\r\n enableApi?: boolean; // no need\r\n\r\n /**\r\n * Include message history in API requests\r\n * @default false\r\n */\r\n includeHistory?: boolean; // no need\r\n\r\n /**\r\n * Maximum number of history messages to include in requests\r\n * @default 10\r\n */\r\n maxHistoryMessages?: number; // no need\r\n\r\n /**\r\n * Custom headers to include in API requests\r\n */\r\n customHeaders?: Record<string, string>;\r\n\r\n /**\r\n * Enable retry on failure\r\n * @default true\r\n */\r\n enableRetry?: boolean;\r\n\r\n /**\r\n * Number of retry attempts\r\n * @default 2\r\n */\r\n retryAttempts?: number;\r\n\r\n /**\r\n * Delay between retries in milliseconds\r\n * @default 1000\r\n */\r\n retryDelay?: number;\r\n}\r\n\r\n/**\r\n * Injection token for providing Doohbot API configuration\r\n */\r\nexport const DOOHBOT_API_CONFIG = new InjectionToken<DoohbotApiConfig>('DOOHBOT_API_CONFIG', {\r\n providedIn: 'root',\r\n factory: () => ({\r\n apiUrl: '',\r\n timeout: 30000,\r\n enableApi: false,\r\n includeHistory: false,\r\n maxHistoryMessages: 10,\r\n enableRetry: true,\r\n retryAttempts: 2,\r\n retryDelay: 1000,\r\n }),\r\n});\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-menu-item',\r\n imports: [],\r\n templateUrl: './menu-item.component.html',\r\n styleUrl: './menu-item.component.scss',\r\n})\r\nexport class MenuItem {\r\n @Input() href = '#';\r\n @Output() selected = new EventEmitter<void>();\r\n\r\n onClick(event: Event): void {\r\n // Optional: prevent default if used for actions, not navigation\r\n // event.preventDefault();\r\n\r\n this.selected.emit();\r\n }\r\n}\r\n","<li>\r\n <a [href]=\"href\" (click)=\"onClick($event)\">\r\n <ng-content></ng-content>\r\n </a>\r\n</li>\r\n","import {\r\n AfterContentInit,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n QueryList,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { MenuItem } from '../menu-item/menu-item.component';\r\n\r\n@Component({\r\n selector: 'app-dropdown-menu',\r\n imports: [],\r\n templateUrl: './dropdown-menu.component.html',\r\n styleUrl: './dropdown-menu.component.scss',\r\n})\r\nexport class DropdownMenu implements AfterContentInit {\r\n @ViewChild('details') detailsRef!: ElementRef<HTMLDetailsElement>;\r\n\r\n @ContentChildren(MenuItem) menuItems!: QueryList<MenuItem>;\r\n\r\n ngAfterContentInit() {\r\n // Subscribe to all menu item selections\r\n this.menuItems.forEach((item) => {\r\n item.selected.subscribe(() => {\r\n this.close();\r\n });\r\n });\r\n }\r\n\r\n close(): void {\r\n this.detailsRef.nativeElement.open = false;\r\n }\r\n}\r\n","<details class=\"dropdown-menu\" #details>\r\n <summary role=\"button\" class=\"dropdown-trigger\">\r\n <ng-content select=\"[trigger]\"></ng-content>\r\n </summary>\r\n <ul class=\"dropdown-list\">\r\n <ng-content></ng-content>\r\n </ul>\r\n</details>\r\n\r\n<!-- ussage example:\r\n<app-dropdown-menu>\r\n <span trigger>☰ Menu</span>\r\n\r\n <app-menu-item href=\"/profile\" (selected)=\"doSomething('profile')\">\r\n My Profile\r\n </app-menu-item>\r\n \r\n <app-menu-item href=\"/settings\" (selected)=\"doSomething('settings')\">\r\n Settings\r\n </app-menu-item>\r\n \r\n <app-menu-item href=\"#\" (selected)=\"logout()\">\r\n Logout\r\n </app-menu-item>\r\n</app-dropdown-menu> -->\r\n\r\n<!-- \r\n Note: The above usage example is commented out to avoid rendering issues.\r\n It demonstrates how to use the DropdownMenu component with MenuItem components as options.\r\n-->\r\n","// /*\r\n// * Public API Surface of chatbot\r\n// */\r\n\r\n// // Main component\r\nexport * from './lib/doohbot.component';\r\n\r\nexport * from './lib/doohbot-input';\r\nexport * from './lib/core/models/api-config.model';\r\nexport * from './lib/core/models/user-context.model';\r\nexport * from './lib/constant/constant';\r\n// // export * from './lib/model/token';\r\nexport * from './lib/core/models/tenant-config.model';\r\nexport * from './lib/core/models/theme-config.model';\r\n// export * from './lib/components/chat-window/chat-window.component';\r\n// export * from './lib/components/message-list/message-list.component';\r\nexport * from './lib/shared/dialog/dialog.component';\r\nexport * from './lib/shared/dialog/dialog.service';\r\nexport * from './lib/shared/chips/chips.component';\r\nexport * from './lib/shared/snackbar/snackbar.component';\r\nexport * from './lib/shared/dropdown-menu/dropdown-menu.component';\r\nexport * from './lib/shared/menu-item/menu-item.component';\r\n// // export * from './lib/doohbot-initializer';\r\n\r\n// // Services\r\n// export * from './lib/core/services/doohbot-api.service';\r\n// export * from './lib/core/auth/auth.service';\r\n// export * from './lib/core/auth/account-api.service';\r\n// export * from './lib/core/services/theme.service';\r\n// export * from './lib/core/chat/chat-facade.service';\r\n// export * from './lib/core/chat/chat-helper.service';\r\n// export * from './lib/core/services/storage.service';\r\n\r\n// // Helpers\r\n// export * from './lib/predefined_messages';\r\n\r\n// // Components\r\n// export * from './lib/components/chat-button/chat-button.component';\r\n// export * from './lib/components/chat-window/chat-window.component';\r\n// export * from './lib/components/message-list/message-list.component';\r\n// export * from './lib/components/message-input/message-input.component';\r\n// export * from './lib/components/chat-history-sidebar/chat-history-sidebar.component';\r\n\r\n// // Directives\r\n// export * from './lib/directives/fullscreen/fullscreen.directive';\r\n// export * from './lib/directives/popout/popout.directive';\r\n// export * from './lib/directives/draggable/draggable-dialog.directive';\r\n// export * from './lib/directives/resizable/resizable-dialog.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["environmentprod","logger","i2.CryptoHelperService","i3.TokenStorageService","i1.TokenStorageService","i1","i1.DialogService","i2","i3","i1.HttpService","i2.HttpStreamService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAO,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;AAkBtB,IAAA,QAAQ,EACN,4tEAA4tE;AAC9tE,IAAA,aAAa,EACX,o5KAAo5K;AACt5K,IAAA,eAAe,EACb,g+OAAg+O;AACl+O,IAAA,WAAW,EACT,43GAA43G;AAC93G,IAAA,UAAU,EACR,43IAA43I;;;AC3Bz3I,MAAM,QAAQ,GAAG;AACtB,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,WAAW,EAAE,WAAW;AACxB,IAAA,YAAY,EAAE,WAAW;AACzB,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,QAAQ,EAAE,kBAAkB;CAC7B;;ACRD;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,WAAW,GAAG;AACzB,IAAA,MAAM,EAAE,sBAAsB;AAC9B,IAAA,UAAU,EAAE,KAAK;AACjB,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,UAAU,EAAE,SAAS;CACtB;;ACXD,MAAM,MAAM,CAAA;AACF,IAAA,OAAO,MAAM,GAAG,WAAW;;IAG3B,OAAO,MAAM,GAAG;AACtB,QAAA,GAAG,EAAE,gCAAgC;AACrC,QAAA,IAAI,EAAE,gCAAgC;AACtC,QAAA,IAAI,EAAE,gCAAgC;AACtC,QAAA,KAAK,EAAE,gCAAgC;AACvC,QAAA,KAAK,EAAE,gCAAgC;KACxC;AAEO,IAAA,OAAO,MAAM,GAAA;QACnB,OAAO,SAAS,EAAE;IACpB;AAEA,IAAA,OAAO,GAAG,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;QACpB,OAAO,CAAC,GAAG,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACtE;AAEA,IAAA,OAAO,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;AACzC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;QACpB,OAAO,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IACxE;AAEA,IAAA,OAAO,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;AACzC,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;QACpB,OAAO,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IACxE;AAEA,IAAA,OAAO,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;QACpB,OAAO,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;IAC1E;AAEA,IAAA,OAAO,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE;QACpB,OAAO,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC;IAC1E;;;MChCW,QAAQ,CAAA;IACnB,OAAO,IAAI;AACJ,IAAA,OAAO,GAAG,IAAI,aAAa,CAAM,CAAC,CAAC;AAE1C,IAAA,WAAA,GAAA,EAAe;AAEf,IAAA,MAAM,IAAI,GAAA;QACR,MAAM,QAAQ,GAAG,CAAA,SAAA,EAAY,WAAW,CAAC,UAAU,GAAGA,WAAe,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAA,GAAA,EAAM,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA,CAAE;AAC7H,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC;AAEtC,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,YAAAC,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC;AAC/E,YAAAA,MAAM,CAAC,KAAK,CAAC,uBAAuB,QAAQ,CAAA,CAAE,CAAC;AAC/C,YAAAA,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC;QACjF;AAEA,QAAAA,MAAM,CAAC,KAAK,CAAC,oEAAoE,EAAE,QAAQ,CAAC;AAC5F,QAAA,IAAI,QAAQ,CAAC,EAAE,EAAE;AACf,YAAA,IAAI;gBACF,QAAQ,CAAC,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;gBACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAChCA,MAAM,CAAC,KAAK,CACV,oEAAoE,EACpE,QAAQ,CAAC,IAAI,CACd;;;;;;;;;YASH;YAAE,OAAO,KAAU,EAAE;AACnB,gBAAAA,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC;gBAC/EA,MAAM,CAAC,KAAK,CAAC,CAAA,oBAAA,EAAuB,QAAQ,CAAA,YAAA,EAAe,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC;AAC3E,gBAAAA,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC;YACjF;AAEA,YAAA,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;AACvD,gBAAAA,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC;AAC/E,gBAAAA,MAAM,CAAC,KAAK,CAAC,yBAAyB,QAAQ,CAAA,CAAE,CAAC;AACjD,gBAAAA,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC;YACjF;QACF;aAAO;AACL,YAAAA,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC;AAC/E,YAAAA,MAAM,CAAC,KAAK,CACV,CAAA,oBAAA,EAAuB,QAAQ,CAAA,gCAAA,EAAmC,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,UAAU,CAAA,CAAE,CAC7G;AACD,YAAAA,MAAM,CAAC,KAAK,CAAC,iEAAiE,CAAC;QACjF;IACF;wGAnDW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAR,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,QAAQ,cAFP,MAAM,EAAA,CAAA;;4FAEP,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAHpB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCHY,mBAAmB,CAAA;AACtB,IAAA,OAAO,GAAG,IAAI,WAAW,EAAE;AAC3B,IAAA,OAAO,GAAG,IAAI,WAAW,EAAE;AAC3B,IAAA,SAAS,GAAG,EAAE,CAAC;AAEvB,IAAA,YAAY,CAAC,GAAW,EAAA;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG;IACtB;AAEQ,IAAA,MAAM,MAAM,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AAC/C,QAAA,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAC3C,KAAK,EACL,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EACnC,QAAQ,EACR,KAAK,EACL,CAAC,WAAW,CAAC,CACd;AAED,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAC5B;AACE,YAAA,IAAI,EAAE,QAAQ;YACd,IAAI;AACJ,YAAA,UAAU,EAAE,MAAM;AAClB,YAAA,IAAI,EAAE,SAAS;SAChB,EACD,OAAO,EACP,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAChC,KAAK,EACL,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB;IACH;IAEA,MAAM,OAAO,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AAEvB,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;AAC/B,QAAA,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;AAErD,QAAA,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAC3C,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EACvB,GAAG,EACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAC3B;AAED,QAAA,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC;AAC/D,QAAA,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AACjB,QAAA,MAAM,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;QAEhD,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,CAAC;IAC7C;IAEA,MAAM,OAAO,CAAC,KAAa,EAAA;AACzB,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;QAEvB,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAEhE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;AAE1B,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;QAE/B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC;QAEjF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;IACvC;wGAjEW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCGY,mBAAmB,CAAA;IACb,eAAe,GAAG,KAAK;AAChC,IAAA,UAAU;AACV,IAAA,SAAS;AAEjB,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,UAAU,GAAG,QAAQ,EAAE,IAAI,EAAE,UAAU,IAAI,iBAAiB;QACjE,IAAI,CAAC,SAAS,GAAG,QAAQ,EAAE,IAAI,EAAE,SAAS,IAAI,gBAAgB;IAChE;IAEA,GAAG,CAAC,GAAW,EAAE,KAAU,EAAA;QACzB,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAClD,IAAI,QAAQ,GAAQ,EAAE;QACtB,IAAI,IAAI,EAAE;YACR,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAClC,IAAI,OAAO,EAAE;AACX,gBAAA,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAChC;QACF;AACA,QAAA,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC;AACpD,QAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/E;AAEA,IAAA,GAAG,CAAC,GAAW,EAAA;QACb,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAClD,IAAI,IAAI,EAAE;YACR,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAClC,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACpC,oBAAA,OAAO,QAAS,CAAC,GAAG,CAAC,IAAI,IAAI;gBAC/B;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CACX,yEAAyE,EACzE,CAAC,CACF;oBACD,IAAI,CAAC,KAAK,EAAE;AACZ,oBAAA,OAAO,IAAI;gBACb;YACF;iBAAO;;AAEL,gBAAA,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC;gBACxE,IAAI,CAAC,KAAK,EAAE;YACd;QACF;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;IACH,OAAO,GAAA;QACL,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AAClD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AACpC,QAAA,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,EAAE;IAC/C;IAEA,KAAK,GAAA;AACH,QAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;IAC1C;AAEQ,IAAA,OAAO,CAAC,KAAa,EAAA;AAC3B,QAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;IAC/D;AAEQ,IAAA,OAAO,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;AACzD,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACnD,OAAO,SAAS,IAAI,IAAI;QAC1B;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,CAAC,CAAC;AACpD,YAAA,OAAO,IAAI;QACb;IACF;wGA3EW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCgBY,WAAW,CAAA;AAoBZ,IAAA,IAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AArBV,IAAA,MAAM;AACN,IAAA,UAAU;AACV,IAAA,SAAS;AACT,IAAA,WAAW;AACX,IAAA,SAAS,GAAqB,IAAI,gBAAgB,EAAE;;AAG5C,IAAA,iBAAiB,GAAG,IAAI,eAAe,CAAa,SAAS,CAAC;AAC/D,IAAA,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;;AAGlD,IAAA,YAAY;IACH,oBAAoB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;;IAG9C,cAAc,GAAG,CAAC;IACT,mBAAmB,GAAG,CAAC;AAExC,IAAA,WAAA,CACU,IAAgB,EAChB,YAAiC,EACjC,YAAiC,EAAA;QAFjC,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,YAAY,GAAZ,YAAY;AAIpB,QAAA,IAAI,CAAC,MAAM,GAAG,CAAA,EAAG,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAA,EAAG,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE;QAC1E,IAAI,CAAC,UAAU,GAAG,QAAQ,EAAE,IAAI,EAAE,UAAU;QAC5C,IAAI,CAAC,SAAS,GAAG,QAAQ,EAAE,IAAI,EAAE,SAAS;QAC1C,IAAI,CAAC,WAAW,GAAG,QAAQ,EAAE,IAAI,EAAE,WAAW;QAC9C,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;IAChD;;AAGA,IAAA,IAAW,UAAU,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,KAAK;IACrC;IAEA,MAAM,GAAA;AACJ,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,gBAAgB;AAC1C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CACjC,GAAG,CAAC,CAAC,QAAa,KAAI;AACpB,YAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE;gBAChC,IAAI,CAAC,SAAS,EAAE;;AAEhB,gBAAA,OAAO,IAAI;YACb;iBAAO;AACL,gBAAA,OAAO,KAAK;YACd;QACF,CAAC,CAAC,CACH;IACH;;;;;;;;;;AAaA,IAAA,UAAU,CAAC,OAAmB,EAAA;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC;QAC7D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC;QAC3D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,aAAa,CAAC;QAC7D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;QAC/C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;QACjD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC;QAC3C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC;QACvD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,eAAe,CAAC;QAC/D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC;QACrD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC;;AAGnD,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC;;AAGvB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,wBAAwB,EAAE;IACjC;AAEA;;;;;;;AAOG;IACK,wBAAwB,GAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QACjC;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC;AACnD,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE;AAC1E,QAAA,IAAI,CAAC,UAAU;YAAE;AAEjB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,MAAM,KAAK,GAAG,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,oBAAoB;AAE1D,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,YAAAA,MAAM,CAAC,GAAG,CAAC,CAAA,uCAAA,EAA0C,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC;AACjF,YAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;AAClC,gBAAAA,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC;AAC9C,gBAAA,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC;AAC5B,oBAAA,KAAK,EAAE,CAAC,GAAG,KAAKA,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC;AACtE,iBAAA,CAAC;YACJ,CAAC,EAAE,KAAK,CAAC;QACX;AAAO,aAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AACjC,YAAA,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,EAAE;QACjC;IACF;IAEA,iBAAiB,GAAA;AACf,QAAAA,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC7F,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACjD;IAEA,eAAe,GAAA;AACb,QAAAA,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC;IAC/C;IAEA,YAAY,GAAA;AACV,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE;QAC3C,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;QAC/C;AAEA,QAAA,MAAM,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,MAAM,cAAc;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAM,GAAG,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,CACnE,GAAG,CAAC,CAAC,QAAa,KAAI;YACpB,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;AACjD,gBAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChC;AACF,QAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,QAAa,KAAI;YACpB,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;gBACjD,OAAO,QAAQ,CAAC,IAAkB;YACpC;iBAAO;gBACL,IAAI,CAAC,SAAS,EAAE;AAChB,gBAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;YACzC;QACF,CAAC,CAAC,CACH;IACH;;;;;IAOA,eAAe,GAAA;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC;QACnD,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;IAC1C;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAW;QACnE,IAAI,KAAK,EAAE;YACT,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC;QAC7C;aAAO;AACL,YAAA,OAAO,IAAI;QACb;IACF;AAEA;;AAEG;IACH,mBAAmB,GAAA;QACjB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC;;QAGzD,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAC9C,YAAA,OAAO,EAAE,CAAC,iBAAiB,CAAC;QAC9B;;AAGA,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AAC1B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC;YAC5C,IAAI,CAAC,wBAAwB,EAAE;AAC/B,YAAA,OAAO,EAAE,CAAC,eAAe,CAAC;QAC5B;;AAGA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE;QAC3C,IAAI,CAAC,YAAY,EAAE;YACjB,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAC9C,YAAA,OAAO,EAAE,CAAC,iBAAiB,CAAC;QAC9B;AAEA,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;QACtC,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAC7B,GAAG,CAAC,MAAK;AACP,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC;AAC5C,YAAA,OAAO,eAA6B;AACtC,QAAA,CAAC,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,KAAI;AACjB,YAAAA,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC;YACnD,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAC9C,YAAA,OAAO,EAAE,CAAC,iBAA+B,CAAC;QAC5C,CAAC,CAAC,CACH;IACH;IAEA,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;IAC9C;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE;IAChF;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC;IACnD;AAEA,IAAA,aAAa,CAAC,GAAW,EAAA;QACvB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC;IAC3C;;AAGA;;;AAGG;IACH,SAAS,GAAA;AACP,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE;QAC/BA,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,CAAC;QAE9C,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,CAAC,iBAAiB,EAAE;;AAGxB,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC;AAEvB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;QACjC;;AAGA,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAE9C,QAAAA,MAAM,CAAC,GAAG,CAAC,kCAAkC,CAAC;IAChD;IAEA,YAAY,GAAA;QACV,cAAc,CAAC,KAAK,EAAE;IACxB;IAEA,YAAY,GAAA;AACV,QAAA,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC;IACjC;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;IAC3B;IACA,iBAAiB,GAAA;QACf,YAAY,CAAC,KAAK,EAAE;IACtB;IAEA,UAAU,GAAA;;IAEV;wGAlRW,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCHY,eAAe,CAAA;AAMhB,IAAA,YAAA;AACA,IAAA,QAAA;IANF,YAAY,GAAG,KAAK;AACpB,IAAA,YAAY,GAAG,KAAK,CAAC;AACrB,IAAA,mBAAmB,GAAyB,IAAI,eAAe,CAAM,IAAI,CAAC;IAElF,WAAA,CACU,YAAiC,EACjC,QAAkB,EAAA;QADlB,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,QAAQ,GAAR,QAAQ;IACf;IAEH,SAAS,CAAC,GAAqB,EAAE,IAAiB,EAAA;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC;AAE/C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAC9B,UAAU,CAAC,CAAC,KAAK,KAAI;;YAEnB,IACE,KAAK,YAAY,iBAAiB;gBAClC,KAAK,CAAC,MAAM,KAAK,GAAG;gBACpB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;gBACnC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;cACrC;AACA,gBAAAF,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE;oBAClD,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AACzC,iBAAA,CAAC;gBACF,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC;YAC3C;AACA,YAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;QAChC,CAAC,CAAC,CACH;IACH;IAEQ,cAAc,CAAC,OAAyB,EAAE,IAAiB,EAAA;;AAEjE,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAAA,MAAM,CAAC,GAAG,CAAC,4DAA4D,CAAC;YACxE,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9D;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;YAEnC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;AAClD,YAAA,OAAO,WAAW,CAAC,YAAY,EAAE,CAAC,IAAI,CACpC,SAAS,CAAC,CAAC,KAAU,KAAI;AACvB,gBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;gBACzB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;;gBAEjD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACzD,YAAA,CAAC,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,KAAI;AACjB,gBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;;AAEzB,gBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;oBACxB,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;oBAClD,WAAW,CAAC,SAAS,EAAE;AACvB,oBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;gBAC3B;AACA,gBAAA,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC,CACH;QACH;aAAO;;AAEL,YAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAClC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,EAChC,IAAI,CAAC,CAAC,CAAC,EACP,SAAS,CAAC,CAAC,GAAG,KAAI;;gBAEhB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACzD,CAAC,CAAC,CACH;QACH;IACF;AAEA,IAAA,qBAAqB,CAAC,GAAqB,EAAA;AACzC,QAAA,IAAI,OAAO,GAAG,GAAG,CAAC,OAAO;;AAEzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE;AACzD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE;AAE1F,QAAA,IAAI,KAAK,IAAI,EAAE,EAAE;YACf,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAC;QAC3D;QAEA,IAAI,UAAU,EAAE;YACd,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC;QACpD;QAEA,OAAO,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAC/B;wGA5FW,eAAe,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAG,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACXD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MAKa,YAAY,CAAA;AAab,IAAA,OAAA;AAZF,IAAA,QAAQ;AACR,IAAA,MAAM,GAAG,MAAM,CAAY,MAAM,kDAAC;AACnC,IAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAE/B,IAAA,YAAY,GAAG,MAAM,CAA+B,aAAa,wDAAC;AACnE,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;IAE3C,QAAQ,GAA4B,IAAI;;IAGhD,WAAA,CACE,eAAiC,EACzB,OAAyB,EAAA;QAAzB,IAAA,CAAA,OAAO,GAAP,OAAO;QAEf,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC;;QAE1D,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAc;AAC7D,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,MAAM,CAAC;IACrC;AAEA,IAAA,QAAQ,CAAC,IAAe,EAAA;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;IAC9B;AAEQ,IAAA,iBAAiB,CAAC,IAAe,EAAA;QACvC,IAAI,CAAC,gBAAgB,EAAE;AAEvB,QAAA,IAAI,IAAI,KAAK,MAAM,EAAE;YACnB,IAAI,CAAC,eAAe,EAAE;QACxB;aAAO;AACL,YAAA,MAAM,YAAY,GAAG,IAAI,KAAK,MAAM,GAAG,YAAY,GAAG,aAAa;AACnE,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;AACnC,YAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;QACvC;IACF;IAEQ,eAAe,GAAA;;QAErB,IAAI,CAAC,yBAAyB,EAAE;;AAGhC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAK;YACxC,IAAI,CAAC,yBAAyB,EAAE;AAClC,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;AAC9C,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;AACzC,SAAA,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;AACnC,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;AACzC,SAAA,CAAC;;;;;;;;IASJ;IAEQ,yBAAyB,GAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;QAClC,MAAM,QAAQ,GAAG,MAAM,GAAG,YAAY,GAAG,aAAa;;AAGtD,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,QAAQ,EAAE;AACpC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/B,YAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;QACnC;IACF;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;AAC1B,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe;;QAGrC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC;QACrE,MAAM,YAAY,GAAG,CAAC,EAAe,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE3F,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI;;AAGzD,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,MAAM;AAC1F,YAAA,OAAO,IAAI;;AAGb,QAAA,IACE,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM;YAC7C,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,KAAK,MAAM,EAC7C;AACA,YAAA,OAAO,IAAI;QACb;;;AAIA,QAAA,OAAO,KAAK;IACd;AAEQ,IAAA,kBAAkB,CAAC,KAAmC,EAAA;;QAE5D,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;;;QAI3D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,gBAAgB,EAAE,aAAa,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,gBAAgB,EAAE,YAAY,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC;IACjD;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACtB;;;;;;;IAOF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEO,iBAAiB,CAAC,OAAoB,EAAE,MAAsC,EAAA;AACnF,QAAA,IAAI,CAAC,MAAM;YAAE;;;QAKb,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,YAAY;AAEnD,QAAA,MAAM,UAAU,GAAG,CAAC,KAAyB,EAAE,YAAoB,KAAI;YACrE,IAAI,KAAK,EAAE;AACT,gBAAA,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;gBAC9C,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK;gBACxC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA,EAAA,EAAK,YAAY,CAAA,CAAE,EAAE,UAAU,CAAC;YAC5D;iBAAO;gBACL,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA,EAAA,EAAK,YAAY,CAAA,CAAE,CAAC;YACnD;AACF,QAAA,CAAC;AAED,QAAA,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC;AAC5C,QAAA,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC;AAChD,QAAA,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC;AACpD,QAAA,UAAU,CAAC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;AACtD,QAAA,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACrD,QAAA,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;AACjD,QAAA,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC;AAC9C,QAAA,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC;AAC1C,QAAA,UAAU,CAAC,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;AAC7D,QAAA,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC;AACnD,QAAA,UAAU,CAAC,MAAM,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;AACzD,QAAA,UAAU,CAAC,MAAM,CAAC,eAAe,EAAE,mBAAmB,CAAC;AACvD,QAAA,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC;AACnD,QAAA,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,gBAAgB,CAAC;AACjD,QAAA,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC;AAC9C,QAAA,UAAU,CAAC,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;AAC3D,QAAA,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACrD,QAAA,UAAU,CAAC,MAAM,CAAC,oBAAoB,EAAE,wBAAwB,CAAC;AACjE,QAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;AACjC,QAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;AACjC,QAAA,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;AAC/B,QAAA,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;AAC7B,QAAA,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC1C;AAEQ,IAAA,UAAU,CAAC,KAAa,EAAA;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AACnD,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtB,YAAA,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;QAC5C;AAAO,aAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;AAC5B,YAAA,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;QAC5C;QACA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;IAChC;wGAvLW,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,gBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AClCM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,CAAC;AAC3F,MAAM,iBAAiB,GAAG;IAC/B,qBAAqB;IACrB,sBAAsB;IACtB,oBAAoB;IACpB,sBAAsB;CACvB;;MCJY,YAAY,CAAA;IACvB,QAAQ,GAAG,EAAE;IACb,QAAQ,GAAG,EAAE;AACb,IAAA,SAAS;IACT,UAAU,GAAY,EAAE;AAExB,IAAA,eAAe;;AAGf,IAAA,aAAa,GAAW,QAAQ,CAAC,WAAW;;IAGnC,QAAQ,GAAI,SAAS;IACrB,WAAW,GAAI,oBAAoB;IACnC,WAAW,GAClB,8JAA8J;IACvJ,QAAQ,GAAI,MAAM;IAClB,QAAQ,GAAI,MAAM;IAClB,SAAS,GAAI,OAAO;IACpB,KAAK,GAAI,WAAW;IACpB,YAAY,GAAI,QAAQ;IACxB,QAAQ,GAAI,WAAW;IACvB,cAAc,GAAI,YAAY;IAC9B,kBAAkB,GAAI,iBAAiB;IACvC,QAAQ,GAAI,mBAAmB;IAC/B,YAAY,GAAI,yCAAyC;;AAGzD,IAAA,UAAU,GAAI,QAAQ,CAAC,QAAQ;AAC/B,IAAA,cAAc,GAAI,QAAQ,CAAC,aAAa;AACxC,IAAA,gBAAgB,GAAI,QAAQ,CAAC,eAAe;AAC5C,IAAA,YAAY,GAAI,QAAQ,CAAC,UAAU;AAC7C;;MCvBY,mBAAmB,CAAA;IACrB,WAAW,GAAyD,KAAK;IACzE,UAAU,GAAY,KAAK;IAC3B,WAAW,GAAW,CAAC;IACvB,QAAQ,GAAW,MAAM;IACzB,QAAQ,GAAW,MAAM;IACzB,UAAU,GAAW,EAAE;IACvB,cAAc,GAAW,EAAE;AAE1B,IAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AAE3C,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC;IAC/C;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,QAAQ;AACpC,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;AAAE,YAAA,OAAO,QAAQ;QACnD,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAgC;IACtE;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;wGAvBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXhC,o6BAwBA,EAAA,MAAA,EAAA,CAAA,0hDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjBY,YAAY,oOAAE,aAAa,EAAA,CAAA,EAAA,CAAA;;4FAI1B,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,EAAA,QAAA,EAAA,o6BAAA,EAAA,MAAA,EAAA,CAAA,0hDAAA,CAAA,EAAA;;sBAK3C;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;;MEVU,KAAK,CAAA;AACP,IAAA,QAAQ,GAAa,EAAE,CAAC;IACxB,QAAQ,GAAG,KAAK;AACf,IAAA,SAAS,GAAG,IAAI,YAAY,EAAU,CAAC;AAEjD,IAAA,WAAW,CAAC,GAAW,EAAA;QACrB,IAAI,IAAI,CAAC,QAAQ;YAAE;AACnB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1B;wGARW,KAAK,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAL,KAAK,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECVlB,kPASA,EAAA,MAAA,EAAA,CAAA,waAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHY,YAAY,EAAA,CAAA,EAAA,CAAA;;4FAIX,KAAK,EAAA,UAAA,EAAA,CAAA;kBAPjB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,kPAAA,EAAA,MAAA,EAAA,CAAA,waAAA,CAAA,EAAA;;sBAKtB;;sBACA;;sBACA;;;MESU,oBAAoB,CAAA;IACtB,QAAQ,GAAc,EAAE;IACxB,WAAW,GAAY,KAAK;IAC5B,UAAU,GAAW,EAAE;IACvB,WAAW,GAAW,EAAE;IACxB,WAAW,GAAW,EAAE;IACxB,kBAAkB,GAAa,EAAE;IACjC,YAAY,GAAW,EAAE;IACzB,aAAa,GAAW,EAAE;IAC1B,QAAQ,GAAW,EAAE;IACrB,eAAe,GAAY,KAAK;AAEhC,IAAA,gBAAgB,GAA6B,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,KAAK;AAE7E,IAAA,eAAe,GAAG,IAAI,YAAY,EAAU;AAC5C,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AAEZ,IAAA,qBAAqB;AAChD,IAAA,gBAAgB;AAExB,IAAA,QAAQ,GAAG;AACT,QAAA,QAAQ,EAAE,WAAW;KACtB;IAED,eAAe,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE;AAEjC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAEzE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,aAAa,EAAE;AACtE,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;AACd,SAAA,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;YAC/B;QACF;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,aAAa;QAC1D,SAAS,CAAC,QAAQ,CAAC;YACjB,GAAG,EAAE,SAAS,CAAC,YAAY;AAC3B,YAAA,QAAQ,EAAE,QAAQ;AACnB,SAAA,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE;QACpC;IACF;AAEA,IAAA,iBAAiB,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC;wGAxDW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,uBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtBjC,0nFA4EA,EAAA,MAAA,EAAA,CAAA,krHAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1DY,YAAY,oQAAE,KAAK,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA;;4FAIlB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAPhC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,EAAA,QAAA,EAAA,0nFAAA,EAAA,MAAA,EAAA,CAAA,krHAAA,CAAA,EAAA;;sBAKnC;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBAEA;;sBACA;;sBAEA,SAAS;uBAAC,cAAc;;;ME5Bd,qBAAqB,CAAA;IACrB,WAAW,GAAY,KAAK;IAC5B,QAAQ,GAAW,mBAAmB;IACtC,QAAQ,GAAW,MAAM;AAExB,IAAA,IAAI,GAAG,IAAI,YAAY,EAAU;AAE3C,IAAA,MAAM,CAAC,IAAY,EAAA;AACf,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AACb,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACxB;IACJ;wGAXS,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXlC,yeAUM,EAAA,MAAA,EAAA,CAAA,g1BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHQ,YAAY,8BAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAI5B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,yeAAA,EAAA,MAAA,EAAA,CAAA,g1BAAA,CAAA,EAAA;;sBAKrC;;sBACA;;sBACA;;sBAEA;;;MEMQ,eAAe,CAAA;AAEjB,IAAA,SAAA;AACyB,IAAA,IAAA;IAFlC,WAAA,CACS,SAAwC,EACf,IAAgB,EAAA;QADzC,IAAA,CAAA,SAAS,GAAT,SAAS;QACgB,IAAA,CAAA,IAAI,GAAJ,IAAI;;AAGpC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,SAAS;AAC1D,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,QAAQ;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,MAAM;AACrE,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS;IAC9C;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;IAC7B;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5B;AAlBW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,gDAGhB,eAAe,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAHd,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtB5B,y+BA6BA,EAAA,MAAA,EAAA,CAAA,20DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDXY,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,8DAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,iOAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAI5D,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;+BACE,YAAY,EAAA,UAAA,EACV,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,y+BAAA,EAAA,MAAA,EAAA,CAAA,20DAAA,CAAA,EAAA;;0BAOrE,MAAM;2BAAC,eAAe;;;MEjBd,aAAa,CAAA;AACF,IAAA,MAAA;AAApB,IAAA,WAAA,CAAoB,MAAiB,EAAA;QAAjB,IAAA,CAAA,MAAM,GAAN,MAAM;IAAe;AAEzC;;;;AAIG;AACH,IAAA,IAAI,CAAC,IAAgB,EAAA;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;AAChD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,YAAY,EAAE,IAAI;AACrB,SAAA,CAAC;AAEF,QAAA,OAAO,SAAS,CAAC,WAAW,EAAE;IAClC;AAEA;;;;AAIG;IACH,aAAa,CAAC,WAAmB,WAAW,EAAA;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC;AACb,YAAA,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE,CAAA,gCAAA,EAAmC,QAAQ,CAAA,+BAAA,CAAiC;AACrF,YAAA,WAAW,EAAE,QAAQ;AACrB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,kBAAkB,EAAE,MAAM;AAC1B,YAAA,IAAI,EAAE,gBAAgB;AACzB,SAAA,CAAC;IACN;wGAlCS,aAAa,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFV,MAAM,EAAA,CAAA;;4FAET,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA;;;MCcY,2BAA2B,CAAA;AAgBlB,IAAA,aAAA;IAfX,QAAQ,GAAkB,EAAE;IAC5B,MAAM,GAAY,KAAK;IACvB,QAAQ,GAAW,MAAM;IACzB,SAAS,GAAY,KAAK;IAC1B,eAAe,GAAY,KAAK;IAChC,aAAa,GAAY,KAAK;AAE7B,IAAA,eAAe,GAAG,IAAI,YAAY,EAAe;AACjD,IAAA,cAAc,GAAG,IAAI,YAAY,EAAU;AAC3C,IAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AACjC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AACnC,IAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;IAE5C,WAAW,GAAuB,EAAE;AAEpC,IAAA,WAAA,CAAoB,aAA4B,EAAA;QAA5B,IAAA,CAAA,aAAa,GAAb,aAAa;IAAkB;IAEnD,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE;IAC3C;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE;AACvB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE;QAC3C;IACF;IAEA,eAAe,GAAA;AACb,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;AACxE,QAAA,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QACjC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC1C,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAEtC,QAAA,MAAM,MAAM,GAAuB;AACjC,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;AAChC,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;AACpC,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;AACpC,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;SACjC;;AAGD,QAAA,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CACxD;AAED,QAAA,cAAc,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YACjC,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAC/C,MAAM,eAAe,GAAG,IAAI,IAAI,CAC9B,WAAW,CAAC,WAAW,EAAE,EACzB,WAAW,CAAC,QAAQ,EAAE,EACtB,WAAW,CAAC,OAAO,EAAE,CACtB;YAED,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE;gBACjD,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;iBAAO,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,SAAS,CAAC,OAAO,EAAE,EAAE;gBAC5D,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;iBAAO,IAAI,eAAe,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE;gBACzD,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;iBAAO;gBACL,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YAClC;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD;AAEA,IAAA,cAAc,CAAC,OAAoB,EAAA;AACjC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;IAEA,aAAa,CAAC,KAAY,EAAE,SAAiB,EAAA;QAC3C,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,KAAI;YAC5E,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;AACnC,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE;YAC3C;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEA,IAAA,UAAU,CAAC,IAAU,EAAA;QACnB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;AAChD,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,MAAM,EAAE,IAAI;AACb,SAAA,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,IAAU,EAAA;QACnB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;AAChD,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,GAAG,EAAE,SAAS;AACf,SAAA,CAAC;IACJ;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAAY,EAAA;AACnB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,MAAqB;AAC3C,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;AACnC,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;AACzC,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY;;AAGzC,QAAA,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY;AAC5D,QAAA,IAAI,YAAY,GAAG,GAAG,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACxF,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QACtB;IACF;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;IACrB;wGA7HW,2BAA2B,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,aAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrBxC,6rEA2DA,EAAA,MAAA,EAAA,CAAA,i9HAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1CY,YAAY,mQAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAI1B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;+BACE,0BAA0B,EAAA,UAAA,EACxB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,aAAa,EAAE,IAAI,CAAC,EAAA,QAAA,EAAA,6rEAAA,EAAA,MAAA,EAAA,CAAA,i9HAAA,CAAA,EAAA;;sBAK3C;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;;ME3BU,wBAAwB,CAAA;AAazB,IAAA,EAAA;AACA,IAAA,QAAA;IAbF,UAAU,GAAG,KAAK;IAClB,MAAM,GAAG,CAAC;IACV,MAAM,GAAG,CAAC;IACV,OAAO,GAAG,CAAC;IACX,OAAO,GAAG,CAAC;AAEE,IAAA,kBAAkB;IAC9B,UAAU,GAAG,KAAK;AAEnB,IAAA,UAAU;IAElB,WAAA,CACU,EAAc,EACd,QAAmB,EAAA;QADnB,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,QAAQ,GAAR,QAAQ;IACd;IAEJ,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,iBAAiB,CAAC;YACxD;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC;QAChF;aAAO;YACL,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;QAC1C;AACA,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;QAC3D;IACF;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU;YAAE;AAE1D,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QAC1C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QAE1C,KAAK,CAAC,cAAc,EAAE;IACxB;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;QAEtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;QAC1C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;QAE1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CACpB,IAAI,CAAC,EAAE,CAAC,aAAa,EACrB,WAAW,EACX,CAAA,UAAA,EAAa,IAAI,CAAC,OAAO,CAAA,IAAA,EAAO,IAAI,CAAC,OAAO,CAAA,GAAA,CAAK,CAClD;IACH;IAGA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;IACzB;wGA7DW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,kBAAA,EAAA,CAAA,YAAA,EAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAQE,KAAK;uBAAC,YAAY;;sBAClB;;sBAyBA,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;sBAWpC,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;;sBAc7C,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,kBAAkB,EAAE,EAAE;;;AChEtC;MAea,wBAAwB,CAAA;AAgBzB,IAAA,EAAA;AACA,IAAA,QAAA;IAhBF,aAAa,GAAkB,EAAE;IACjC,YAAY,GAAkB,IAAI;IAClC,MAAM,GAAG,CAAC;IACV,MAAM,GAAG,CAAC;IACV,UAAU,GAAG,CAAC;IACd,WAAW,GAAG,CAAC;IACf,SAAS,GAAG,CAAC;IACb,QAAQ,GAAG,CAAC;IAEX,YAAY,GAAG,KAAK;;AAGrB,IAAA,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAEjE,WAAA,CACU,EAA2B,EAC3B,QAAmB,EAAA;QADnB,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,QAAQ,GAAR,QAAQ;IACd;IAEJ,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,iBAAiB,CAAC;YACxD;QACF;QAEA,IAAI,CAAC,QAAQ,EAAE;QACf,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,mBAAmB,EAAE;IAC5B;IAEQ,QAAQ,GAAA;AACd,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa;QACrC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,CAAC;IAC5D;IAEQ,mBAAmB,GAAA;QACzB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;YACjD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC;YAC3D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC;;AAGpD,YAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;gBAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC;gBACrF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC;gBAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC;gBAC7C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;gBACvE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;YACxE;AACA,YAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC1C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,UAAU,CAAC;gBACrF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC;gBAC3C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC;gBAC5C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;gBACxE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;YACvE;AACA,YAAA,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;gBAChE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;gBAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC;AACrD,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAA,EAAG,GAAG,CAAA,OAAA,CAAS,CAAC;gBACzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;gBACrE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;gBACxE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;gBACtE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;YACzE;AAEA,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;AACxD,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;AACjC,QAAA,CAAC,CAAC;IACJ;IAEQ,mBAAmB,GAAA;QACzB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,KAAI;AACpC,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC;AAC1D,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,GAAG,EAAE;IACzB;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;AAC3B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;AAC3C,QAAA,IAAI,CAAC,GAAG;YAAE;QAEV,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,IAAI,CAAC,YAAY,GAAG,GAAG;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,qBAAqB,EAAE;AAE1D,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACjE,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC/D,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;;QAG7D,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;IAC1C;AAGA,IAAA,WAAW,CAAC,KAAiB,EAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;QAExB,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;QACtC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM;AAEtC,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,UAAU;AAC9B,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,WAAW;AAChC,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS;AAC5B,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,QAAQ;QAE1B,MAAM,QAAQ,GAAG,GAAG;QACpB,MAAM,SAAS,GAAG,GAAG;;QAGrB,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,EAAE,QAAQ,CAAC;QACrD;QACA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,EAAE,QAAQ,CAAC;AACnD,YAAA,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC;QACzD;;QAGA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,EAAE,SAAS,CAAC;QACxD;QACA,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACnC,YAAA,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,EAAE,SAAS,CAAC;AACtD,YAAA,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QACzD;;AAGA,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAA,EAAA,CAAI,CAAC;AACvE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAA,EAAA,CAAI,CAAC;AACzE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA,EAAA,CAAI,CAAC;AACrE,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,MAAM,CAAA,EAAA,CAAI,CAAC;IACrE;IAGA,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;YACxB,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7C;IACF;AAEQ,IAAA,qBAAqB,CAAC,QAAgB,EAAA;AAC5C,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,GAAG;IAClF;wGAlKW,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAWE;;sBAgFA,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;sBAsBpC,YAAY;uBAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC;;sBAwC7C,YAAY;uBAAC,kBAAkB;;;MC7JrB,QAAQ,CAAA;IACV,OAAO,GAAkB,IAAI;IAC7B,WAAW,GAAY,IAAI;IAC3B,YAAY,GAAW,IAAI;IAC3B,IAAI,GAAY,KAAK;AAEpB,IAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;IAEpC,SAAS,GAAkB,IAAI;IAEtC,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAK;gBAC/B,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,CAAC,EAAE,IAAI,CAAC,YAAY,CAAQ;QAC9B;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK;AACjB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IACO,YAAY,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;AAC5B,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;IACF;wGAhCW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECVrB,qRAOA,EAAA,MAAA,EAAA,CAAA,8hCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDCY,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAEZ,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAPpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EAGZ,IAAI,EAAA,OAAA,EACP,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,qRAAA,EAAA,MAAA,EAAA,CAAA,8hCAAA,CAAA,EAAA;;sBAGvB;;sBACA;;sBACA;;sBACA;;sBAEA;;;MEkCU,mBAAmB,CAAA;IACrB,UAAU,GAAY,KAAK;IAC3B,UAAU,GAAY,KAAK;IAC3B,YAAY,GAAY,KAAK;IAC7B,YAAY,GAAY,KAAK;IAC7B,eAAe,GAAY,KAAK;IAChC,QAAQ,GAAW,EAAE;IACrB,UAAU,GAAW,EAAE;IACvB,cAAc,GAAW,EAAE;IAC3B,gBAAgB,GAAW,EAAE;IAC7B,QAAQ,GAAW,WAAW;IAC9B,YAAY,GAAW,UAAU;IACjC,QAAQ,GAAc,EAAE;IACxB,WAAW,GAAY,KAAK;IAC5B,WAAW,GAAW,EAAE;IACxB,WAAW,GAAW,EAAE;IACxB,kBAAkB,GAAa,EAAE;IACjC,iBAAiB,GAAa,EAAE;IAChC,YAAY,GAAW,EAAE;IACzB,aAAa,GAAW,EAAE;IAC1B,QAAQ,GAAW,EAAE;AACrB,IAAA,gBAAgB,GAA6B,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,EAAE,IAAI,KAAK;IAC9E,QAAQ,GAAW,EAAE;IACrB,QAAQ,GAAW,EAAE;IACrB,YAAY,GAAkB,IAAI;IAClC,mBAAmB,GAAY,KAAK;IACpC,oBAAoB,GAAY,KAAK;IACrC,YAAY,GAAkB,EAAE;IAChC,mBAAmB,GAAW,MAAM;IAEpC,WAAW,GAAY,KAAK;IAC5B,SAAS,GAAkB,IAAI;IAC/B,WAAW,GAAkB,IAAI;IACjC,iBAAiB,GAAY,KAAK;IAClC,eAAe,GAAY,KAAK;IAChC,qBAAqB,GAAY,KAAK;AACtC,IAAA,WAAW;AAEV,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AACrC,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAQ;AAC3C,IAAA,oBAAoB,GAAG,IAAI,YAAY,EAAQ;AAC/C,IAAA,YAAY,GAAG,IAAI,YAAY,EAAQ;AACvC,IAAA,eAAe,GAAG,IAAI,YAAY,EAAU;AAC5C,IAAA,IAAI,GAAG,IAAI,YAAY,EAAU;AACjC,IAAA,iBAAiB,GAAG,IAAI,YAAY,EAAQ;AAC5C,IAAA,SAAS,GAAG,IAAI,YAAY,EAAQ;AACpC,IAAA,eAAe,GAAG,IAAI,YAAY,EAAe;AACjD,IAAA,cAAc,GAAG,IAAI,YAAY,EAAU;AAC3C,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAQ;AAC3C,IAAA,eAAe,GAAG,IAAI,YAAY,EAAQ;;AAG1C,IAAA,WAAW,GAAG,IAAI,YAAY,EAA0C;AACxE,IAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AAEpC,IAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;IAGjC,aAAa,GAAG,EAAE;IAClB,aAAa,GAAG,EAAE;IAClB,aAAa,GAAG,KAAK;IACrB,YAAY,GAAG,KAAK;IAE3B,wBAAwB,GAAA;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY;IACxC;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEA,sBAAsB,GAAA;AACpB,QAAAJ,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC;AACrC,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE;IAClC;IAEA,YAAY,GAAA;;AAEV,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;IAC3B;IAEA,aAAa,GAAA;QACX,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;AAC5C,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;gBACpB,QAAQ,EAAE,IAAI,CAAC,aAAa;gBAC5B,QAAQ,EAAE,IAAI,CAAC,aAAa;AAC7B,aAAA,CAAC;QACJ;IACF;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;IAC5B;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;IAC9B;IAEA,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;AAEA,IAAA,iBAAiB,CAAC,IAAY,EAAA;AAC5B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC;AAEA,IAAA,MAAM,CAAC,IAAY,EAAA;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACtB;IAEA,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;IAC/B;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;IAC/B;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;IACvB;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,OAAoB,EAAA;AACpC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IACpC;AAEA,IAAA,gBAAgB,CAAC,SAAiB,EAAA;AAChC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;IACrC;AAEA,IAAA,aAAa,CAAC,GAAW,EAAA;;QAEvB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AACnD,QAAAA,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,WAAW,CAAC;AAExD,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI;;;QAG9B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC;AAClD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC;;QAG/B,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC;IAC7D;IAEA,QAAQ,GAAA;;IAER;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;;QAEhC,IAAI,OAAO,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE;AACtD,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC5B;IACF;AAEA,IAAA,WAAW,KAAI;wGAlKJ,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClDhC,2oSAyRA,EAAA,MAAA,EAAA,CAAA,ksLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDvPI,YAAY,oIACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAM,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,KAAK,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,oBAAoB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,qBAAqB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,QAAQ,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,cAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,wBAAwB,oGACxB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAC3B,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAMF,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBApB/B,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,KAAK;wBACL,oBAAoB;wBACpB,qBAAqB;wBACrB,QAAQ;wBACR,wBAAwB;wBACxB,wBAAwB;wBACxB,2BAA2B;wBAC3B,WAAW;wBACX,IAAI;AACL,qBAAA,EAAA,QAAA,EAAA,2oSAAA,EAAA,MAAA,EAAA,CAAA,ksLAAA,CAAA,EAAA;;sBAKA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAGA;;sBACA;;;MEjGU,mBAAmB,CAAA;AAYpB,IAAA,EAAA;AACA,IAAA,QAAA;IAZF,YAAY,GAAG,KAAK;IACpB,kBAAkB,GAKf,IAAI;IAEN,gBAAgB,GAAW,cAAc;IAElD,WAAA,CACU,EAAc,EACd,QAAmB,EAAA;QADnB,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,QAAQ,GAAR,QAAQ;IACf;IAEI,MAAM,GAAA;AACX,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC3E,QAAA,IAAI,CAAC,QAAQ;YAAE;AAEf,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,kBAAkB,GAAG;AACxB,gBAAA,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK;AAC3B,gBAAA,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;AAC7B,gBAAA,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;AACzB,gBAAA,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG;aACxB;AAED,YAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;AACzB,YAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;AAC1B,YAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE;AACxB,YAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;AACvB,YAAA,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE;AAE7B,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AAEzB,YAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,gBAAA,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,IAAI,OAAO;AAC/D,gBAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,IAAI,OAAO;AACjE,gBAAA,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,IAAI,MAAM;AAC5D,gBAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,MAAM;AAC1D,gBAAA,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM;YACnC;QACF;IACF;IAEO,kBAAkB,GAAA;QACvB,OAAO,IAAI,CAAC,YAAY;IAC1B;wGAlDW,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAnB,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAJ/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAUE;;;MCNU,WAAW,CAAA;AAKF,IAAA,IAAA;;AAFpB,IAAA,MAAM;AAEN,IAAA,WAAA,CAAoB,IAAgB,EAAA;QAAhB,IAAA,CAAA,IAAI,GAAJ,IAAI;AACtB,QAAA,IAAI,CAAC,MAAM,GAAG,CAAA,EAAG,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAA,EAAG,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE;QAC1EP,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,MAAM,CAAC;IACrD;AAEA,IAAA,GAAG,CACD,GAAW,EACX,KAAc,EACd,WAAW,GAAG,KAAK,EACnB,UAAU,GAAG,KAAK,EAClB,OAAO,GAAG,IAAI,EAAA;;;;QAQd,IAAI,MAAM,GAAG,EAAE;QAEf,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACzC;aAAO;YACL,MAAM,GAAG,KAAmB;QAC9B;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC1F,KAAK,CAAC,GAAG,CAAC,EAEV,KAAK,CAAC,CAAC,CAAC,EAER,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,EAE5D,UAAU,CAAC,CAAC,KAAK,KAAI;;;;AAOnB,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH;IACH;AAEQ,IAAA,eAAe,CAAC,MAAW,EAAE,IAAS,EAAE,WAAmB,EAAA;QACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;AAChC,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,EAAE;AAChE,gBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,WAAW,CAAA,EAAG,GAAG,CAAA,CAAA,CAAG,CAAC;YAClE;iBAAO;AACL,gBAAA,MAAM,CAAC,CAAA,EAAG,WAAW,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;YAC5C;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,CAAC,GAAW,EAAE,KAAc,EAAE,UAAU,GAAG,KAAK,EAAA;;;;QAKlD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAmB,CAAC,CAAC,IAAI,CACrE,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,EACjE,UAAU,CAAC,CAAC,KAAK,KAAI;;;;AAKnB,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH;IACH;AAEA,IAAA,KAAK,CAAC,GAAW,EAAE,KAAc,EAAE,UAAU,GAAG,KAAK,EAAA;;;;QAKnD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,EAAE,KAAmB,CAAC,CAAC,IAAI,CACtE,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,EACjE,UAAU,CAAC,CAAC,KAAK,KAAI;;;;AAKnB,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH;IACH;AAEA,IAAA,MAAM,CAAC,GAAW,EAAE,KAAc,EAAE,UAAU,GAAG,KAAK,EAAA;;;;QAKpD,IAAI,MAAM,GAAG,EAAE;QACf,MAAM,GAAG,KAAmB;QAE5B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAG,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CACtE,KAAK,CAAC,GAAG,CAAC,EACV,KAAK,CAAC,CAAC,CAAC,EACR,GAAG,CAAC,CAAC,QAAa,KAAK,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,EACjE,UAAU,CAAC,CAAC,KAAK,KAAI;;;;AAKnB,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;QAClB,CAAC,CAAC,CACH;IACH;AAEQ,IAAA,cAAc,CAAC,KAAU,EAAE,UAAA,GAAsB,IAAI,EAAA;;;;AAI3D,QAAA,OAAO,KAAK;IACd;wGA7HW,WAAW,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCEY,iBAAiB,CAAA;AAIlB,IAAA,MAAA;AACA,IAAA,YAAA;IAJF,eAAe,GAA2B,IAAI;IAEtD,WAAA,CACU,MAAc,EACd,YAAiC,EAAA;QADjC,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,YAAY,GAAZ,YAAY;IACnB;AAEH;;AAEG;AACH,IAAA,gBAAgB,CACd,GAAW,EACX,IAAS,EACT,OAAgC,EAAA;AAEhC,QAAA,IAAI,CAAC,KAAK,EAAE,CAAC;AAEb,QAAA,OAAO,IAAI,UAAU,CAAqB,CAAC,QAAQ,KAAI;AACrD,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE;AAE5C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE;AACzD,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE;AAE1F,YAAA,MAAM,cAAc,GAA2B;gBAC7C,aAAa,EAAE,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE;AAChC,gBAAA,eAAe,EAAE,UAAU;AAC3B,gBAAA,cAAc,EAAE,kBAAkB;AAClC,gBAAA,MAAM,EAAE,mBAAmB;AAC3B,gBAAA,eAAe,EAAE,UAAU;AAC3B,gBAAA,GAAG,OAAO;aACX;YAED,KAAK,CAAC,GAAG,EAAE;AACT,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,OAAO,EAAE,cAAc;AACvB,gBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAC1B,gBAAA,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM;aACpC;AACE,iBAAA,IAAI,CAAC,OAAO,QAAQ,KAAI;AACvB,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;oBAChB,IAAI,YAAY,GAAG,CAAA,KAAA,EAAQ,QAAQ,CAAC,MAAM,CAAA,EAAA,EAAK,QAAQ,CAAC,UAAU,CAAA,CAAE;AACpE,oBAAA,IAAI;AACF,wBAAA,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;AACvC,wBAAA,YAAY,IAAI,CAAA,SAAA,EAAY,SAAS,CAAA,CAAE;oBACzC;oBAAE,OAAO,CAAC,EAAE;;oBAEZ;AACA,oBAAA,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC;gBAC/B;AAEA,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AAClB,oBAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC;gBAClE;gBAEA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;AACxC,gBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;gBACjC,IAAI,MAAM,GAAG,EAAE;AAEf,gBAAA,MAAM,UAAU,GAAG,YAAW;AAC5B,oBAAA,IAAI;wBACF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;wBAC3C,IAAI,IAAI,EAAE;AACR,4BAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;4BAC1C;wBACF;AAEA,wBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;wBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAChC,wBAAA,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;AAE1B,wBAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,4BAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gCAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAExC,gCAAA,IAAI,OAAO,KAAK,QAAQ,EAAE;AACxB,oCAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;oCAC1C;gCACF;AAEA,gCAAA,IAAI;oCACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;oCAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MACd,QAAQ,CAAC,IAAI,CAAC;wCACZ,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE;AAC/C,wCAAA,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,OAAO;AAC5B,wCAAA,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE;AACnB,wCAAA,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;AACnC,wCAAA,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;wCAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;AACpB,qCAAA,CAAC,CACH;gCACH;gCAAE,OAAO,CAAC,EAAE;oCACVA,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,OAAO,EAAE,CAAC,CAAC;gCACtD;4BACF;wBACF;wBAEA,UAAU,EAAE,CAAC;oBACf;oBAAE,OAAO,GAAG,EAAE;AACZ,wBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC5C;AACF,gBAAA,CAAC;AAED,gBAAA,UAAU,EAAE;AACd,YAAA,CAAC;AACA,iBAAA,KAAK,CAAC,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5C,YAAA,CAAC,CAAC;;AAGJ,YAAA,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE;AAC3B,QAAA,CAAC,CAAC;IACJ;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE;AAC5B,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC7B;IACF;wGAxHW,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAAG,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCMY,cAAc,CAAA;AAIf,IAAA,IAAA;AACA,IAAA,iBAAA;AAJV,IAAA,MAAM;IAEN,WAAA,CACU,IAAiB,EACjB,iBAAoC,EAAA;QADpC,IAAA,CAAA,IAAI,GAAJ,IAAI;QACJ,IAAA,CAAA,iBAAiB,GAAjB,iBAAiB;AAEzB,QAAA,IAAI,CAAC,MAAM,GAAG,CAAA,EAAG,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAA,EAAG,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE;QAC1EH,MAAM,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,MAAM,CAAC;IACxD;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,OAAqB,EAAE,UAAU,GAAG,KAAK,EAAA;AACnD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC;IACzD;AAEA;;AAEG;AACH,IAAA,iBAAiB,CAAC,OAAoB,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,YAAA,CAAc,EAAE,OAAO,CAAC;IACvF;AAEA,IAAA,cAAc,CACZ,OAA2B,EAC3B,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,OAAO,EAAE,UAAU,CAAC;IACtE;AAEA,IAAA,iBAAiB,CAAC,aAAqB,EAAE,UAAU,GAAG,KAAK,EAAA;AACzD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,eAAA,EAAkB,aAAa,CAAA,CAAE,EAAE,SAAS,EAAE,UAAU,CAAC;IACnF;AAEA,IAAA,eAAe,CACb,aAAqB,EACrB,KAAa,EACb,UAAU,GAAG,KAAK,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,eAAA,EAAkB,aAAa,CAAA,MAAA,CAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,CAAC;IACxF;AAEA,IAAA,aAAa,CAAC,OAAgB,EAAE,UAAU,GAAG,KAAK,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,EAAE,UAAU,CAAC;IAChE;wGA9CW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAQ,WAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,iBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCHY,cAAc,CAAA;AAEf,IAAA,IAAA;AADV,IAAA,WAAA,CACU,IAAiB,EAAA;QAAjB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAEX;AAEH,IAAA,KAAK,CAAC,KAAoB,EAAE,UAAU,GAAG,KAAK,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,UAAU,CAAC;IACxD;AAEA,IAAA,aAAa,CACX,KAA6B,EAC7B,UAAU,GAAG,KAAK,EAAA;;;;;;;AASlB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,UAAU,CAAC;IAClE;AAEA,IAAA,YAAY,CAAC,KAAc,EAAE,UAAU,GAAG,KAAK,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC;IAC1D;AAEA,IAAA,MAAM,CAAC,YAAoB,EAAE,UAAU,GAAG,KAAK,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,UAAU,CAAC;IACnF;wGA9BW,cAAc,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAD,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;4FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCEY,iBAAiB,CAAA;IACX,cAAc,GAAG,mBAAmB;IACpC,aAAa,GAAG,kBAAkB;AAE3C,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAE/C,IAAA,WAAA,GAAA,EAAe;AAEf;;AAEG;IACH,aAAa,CAAC,UAAkB,EAAE,MAAc,EAAA;AAC9C,QAAA,MAAM,OAAO,GAAgB;AAC3B,YAAA,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE;YAC5B,SAAS,EAAE,IAAI,IAAI,EAAE;AACrB,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,QAAQ,EAAE,EAAE;YACZ,UAAU;YACV,MAAM;SACP;AACD,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;;;;;AAMH;;AAEG;IACH,oBAAoB,CAAC,OAAoB,EAAE,OAAgB,EAAA;;;;;;AAOzD,QAAA,IAAI,OAAO,CAAC,KAAK,KAAK,kBAAkB,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE;YACrE,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD;AAEA,QAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;AAC9B,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IAClC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,OAAoB,EAAA;;;;;AAM9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC;AACzE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC;AAE7E,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;AACpE,QAAA,IAAI,aAAa,IAAI,CAAC,EAAE;AACtB,YAAA,QAAQ,CAAC,aAAa,CAAC,GAAG,OAAO;QACnC;aAAO;AACL,YAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACxB;AAEA,QAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACnD,QAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACnB;AAEA;;AAEG;IACH,eAAe,CACb,UAAkB,EAClB,MAAc,EACd,KAAA,GAAgB,EAAE,EAClB,MAAA,GAAiB,CAAC,EAAA;AAElB,QAAAR,MAAM,CAAC,GAAG,CACR,CAAA,oCAAA,EAAuC,UAAU,CAAA,QAAA,EAAW,MAAM,CAAA,SAAA,EAAY,KAAK,CAAA,UAAA,EAAa,MAAM,CAAA,CAAE,CACzG;AAED,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE;AACtC,YAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;QACnE;;AAGA,QAAAA,MAAM,CAAC,GAAG,CAAC,gDAAgD,CAAC;AAC5D,QAAA,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7C;AAEA;;AAEG;IACK,kBAAkB,CACxB,UAAkB,EAClB,MAAc,EACd,KAAA,GAAgB,EAAE,EAClB,MAAA,GAAiB,CAAC,EAAA;QAElBA,MAAM,CAAC,GAAG,CAAC,CAAA,mCAAA,EAAsC,KAAK,CAAA,UAAA,EAAa,MAAM,CAAA,CAAE,CAAC;QAE5E,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAC/D,GAAG,CAAC,CAAC,QAAQ,KAAI;AACf,YAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAC3E,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAY,KAC7D,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAC9D;;gBAGD,MAAM,OAAO,GACX,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK;AAE5E,gBAAAA,MAAM,CAAC,GAAG,CACR,CAAA,OAAA,EAAU,cAAc,CAAC,MAAM,CAAA,yBAAA,EAA4B,QAAQ,CAAC,IAAI,CAAC,KAAK,cAAc,OAAO,CAAA,CAAE,CACtG;AACD,gBAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE;YAC9C;YAEA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;AACzC,QAAA,CAAC,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,KAAI;AACjB,YAAAA,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC;AACnD,YAAA,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7C,CAAC,CAAC,CACH;IACH;AAEA;;AAEG;AACK,IAAA,2BAA2B,CACjC,eAAoB,EACpB,UAAkB,EAClB,MAAc,EAAA;QAEd,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;AACtD,QAAAA,MAAM,CAAC,GAAG,CAAC,2BAA2B,EAAE,eAAe,CAAC;;AAGxD,QAAA,MAAM,QAAQ,GAAc,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAQ,MAAM;YACtE,EAAE,EAAE,GAAG,CAAC,eAAe;AACvB,YAAA,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK;YAC5C,IAAI,EAAE,GAAG,CAAC,OAAO;AACjB,YAAA,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;AACpC,SAAA,CAAC,CAAC;QAEH,OAAO;YACL,EAAE,EAAE,eAAe,CAAC,eAAe;AACnC,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,KAAK,EAAE,eAAe,CAAC,KAAK,IAAI,uBAAuB;AACvD,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,QAAQ,EAAE,QAAQ;SACnB;IACH;AAEA;;AAEG;IACK,mBAAmB,CAAC,UAAkB,EAAE,MAAc,EAAA;;;;;QAM5D,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC;QACzD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;QAExC,IAAI,MAAM,EAAE;AACV,YAAA,IAAI;gBACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;;gBAEnC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,MAAM;AAC/B,oBAAA,GAAG,CAAC;AACJ,oBAAA,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAChC,oBAAA,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,MAAM;AACpC,wBAAA,GAAG,CAAC;AACJ,wBAAA,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS;AAC3D,qBAAA,CAAC,CAAC;AACJ,iBAAA,CAAC,CAAC;YACL;YAAE,OAAO,CAAC,EAAE;AACV,gBAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC;AAC5C,gBAAA,OAAO,EAAE;YACX;QACF;;QAGA,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC;IACnD;AAEA;;AAEG;AACH,IAAA,WAAW,CACT,SAAiB,EACjB,UAAkB,EAClB,MAAc,EAAA;QAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC;AAC7D,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;AACxD,QAAA,OAAO,EAAE,CAAC,OAAO,IAAI,IAAI,CAAC;IAC5B;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,SAAiB,EAAE,UAAkB,EAAE,MAAc,EAAA;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC;AAC7D,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC;AAE3D,QAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACnD,QAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACnB;AAEA;;;AAGG;AACH,IAAA,eAAe,CACb,KAAa,EACb,KAAa,EACb,UAAkB,EAClB,MAAc,EAAA;QAEd,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,CAAC;AAC7D,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC;AAE9D,QAAA,IAAI,YAAY,IAAI,CAAC,EAAE;AACrB,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC;AACtC,YAAA,OAAO,CAAC,EAAE,GAAG,KAAK;;YAElB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;gBAC7B,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC1B,oBAAA,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;gBACnC;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACnD,YAAA,OAAO,EAAE,CAAC,OAAO,CAAC;QACpB;AAEA,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC;IACjB;AAEA;;AAEG;IACH,gBAAgB,CAAC,UAAkB,EAAE,MAAc,EAAA;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC;AACzD,QAAA,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;AAC5B,QAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACnB;AAEA;;AAEG;IACK,iBAAiB,GAAA;QACvB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE;AACtD,YAAA,OAAO,WAAW,MAAM,CAAC,UAAU,EAAE,EAAE;QACzC;;AAEA,QAAA,OAAO,CAAA,QAAA,EAAW,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE;IACjE;AAEQ,IAAA,oBAAoB,CAAC,MAAc,EAAA;QACzC,MAAM,KAAK,GAAG,gEAAgE;QAC9E,IAAI,MAAM,GAAG,EAAE;AACf,QAAA,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC;AAC1C,QAAA,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC;AACnC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/B,YAAA,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QAChD;AACA,QAAA,OAAO,MAAM;IACf;AAEA;;AAEG;AACK,IAAA,aAAa,CAAC,IAAY,EAAA;QAChC,MAAM,SAAS,GAAG,EAAE;AACpB,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE;AAC5B,YAAA,OAAO,IAAI;QACb;QACA,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK;IAC7C;AAEA;;AAEG;IACK,oBAAoB,CAAC,UAAkB,EAAE,MAAc,EAAA;QAC7D,OAAO,CAAA,EAAG,IAAI,CAAC,cAAc,GAAG,UAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE;IACxD;AAEA;;AAEG;IACK,iBAAiB,CAAC,UAAkB,EAAE,MAAc,EAAA;QAC1D,MAAM,SAAS,GAAG,CAAA,EAAG,IAAI,CAAC,aAAa,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE;QAChE,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC;QAE9C,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AACnC,YAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,gBAAA,OAAO,EAAE;YACX;;AAGA,YAAA,MAAM,OAAO,GAAgB;AAC3B,gBAAA,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE;gBAC5B,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE;AAC/E,gBAAA,KAAK,EAAE,uBAAuB;gBAC9B,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,MAAM;AAClC,oBAAA,GAAG,CAAC;AACJ,oBAAA,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS;AAC3D,iBAAA,CAAC,CAAC;gBACH,UAAU;gBACV,MAAM;aACP;;YAGD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE;;AAGrC,YAAA,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC;YAElC,OAAO,CAAC,OAAO,CAAC;QAClB;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC,CAAC;AACjD,YAAA,OAAO,EAAE;QACX;IACF;wGAtVW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCJY,kBAAkB,CAAA;IACrB,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAGrD,IAAA,WAAW;AAEnB,IAAA,WAAA,GAAA,EAAe;AAEf;;AAEG;IACH,eAAe,GAAA;QACb,OAAO,IAAI,CAAC,WAAW,EAAE,eAAe,EAAE,IAAI,KAAK;IACrD;AAEA;;AAEG;IACH,iBAAiB,GAAA;QACf,OAAO,IAAI,CAAC,WAAW,EAAE,iBAAiB,EAAE,IAAI,EAAE;IACpD;AAEA;;AAEG;AACI,IAAA,cAAc,CAAC,OAAoB,EAAA;AACxC,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO;IAC5B;AAEA;;AAEG;IACI,cAAc,GAAA;QACnB,OAAO,IAAI,CAAC,WAAW;IACzB;AAEA;;AAEG;IACI,SAAS,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,WAAW;IAChD;wGAzCW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCAY,gBAAgB,CAAA;IACjB,aAAa,GAAG,KAAK;AAE7B,IAAA,WAAA,GAAA,EAAgB;AAEhB;;AAEG;IACI,WAAW,GAAA;QACd,IAAI,IAAI,CAAC,aAAa;YAAE;AACxB,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;AACzB,QAAA,KAAK,CAAC,MAAM,GAAG,GAAG;QAClB;AACK,aAAA,IAAI;aACJ,IAAI,CAAC,OAAO,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AACtC,aAAA,KAAK,CAAC,MAAK,EAAG,CAAC,CAAC;IACzB;AAEA;;AAEG;IACI,YAAY,GAAA;QACf,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;AACzB,QAAA,IAAI;AACA,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,gBAAgB,CAAC;YACzC,KAAK,CAAC,IAAI,EAAE;QAChB;QAAE,OAAO,KAAK,EAAE;AACZ,YAAAA,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;QACnD;IACJ;AAEA;;AAEG;IACI,eAAe,GAAA;QAClB,OAAO,IAAI,CAAC,aAAa;IAC7B;wGApCS,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFb,MAAM,EAAA,CAAA;;4FAET,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,UAAU,EAAE,MAAM;AACrB,iBAAA;;;ACmHD;;AAEG;AACI,MAAM,uBAAuB,GAAG,IAAI,cAAc,CACvD,yBAAyB,EACzB;AACE,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,OAAO;AACd,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,gBAAgB,EAAE,QAAQ;AAC1B,QAAA,iBAAiB,EAAE,KAAK;AACxB,QAAA,oBAAoB,EAAE,IAAI;AAC1B,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,gBAAgB,EAAE,gBAAgB;AAClC,QAAA,uBAAuB,EAAE,KAAK;AAC9B,QAAA,SAAS,EAAE,KAAK;KACjB,CAAC;AACH,CAAA,CACF;;MCrHY,WAAW,CAAA;;AAEd,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC7C,IAAA,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC;AACnC,IAAA,cAAc,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC3C,IAAA,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACvC,MAAM,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;AAG5D,IAAA,iBAAiB,GAAG,MAAM,CAAS,SAAS,6DAAC;;AAG9C,IAAA,QAAQ,GAAG,MAAM,CAAY,EAAE,oDAAC;;IAG/B,aAAa,GAAuB,IAAI;;AAGzC,IAAA,YAAY,GAAG,MAAM,CAAU,KAAK,wDAAC;AACrC,IAAA,QAAQ,GAAG,MAAM,CAAsB,IAAI,oDAAC;AAC5C,IAAA,WAAW,GAAG,MAAM,CAAU,KAAK,uDAAC;AACpC,IAAA,UAAU,GAAG,MAAM,CAAa,UAAU,sDAAC;AAC3C,IAAA,aAAa,GAAG,MAAM,CAAU,KAAK,yDAAC;IAE7C,cAAc,GAAkD,EAAE;IAClE,eAAe,GAAG,EAAE;AAEZ,IAAA,kBAAkB;IAE1B,gBAAgB,GAAA;AACd,QAAA,OAAO,yCAAyC;IAClD;IAEA,gBAAgB,GAAA;AACd,QAAA,OAAO,yCAAyC;IAClD;AAEA,IAAA,WAAA,GAAA;AACE,QAAAA,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC;;AAGtC,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE;YAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAC7C;IACF;;AAIA;;AAEG;AACI,IAAA,aAAa,CAAC,UAAkB,EAAA;AACrC,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,UAAU,EAAE;YAC3C;QACF;AACA,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC;;QAEtC,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA;;AAEG;IACI,eAAe,GAAA;AACpB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;AAE9C,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC;AAC7E,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IACvB;AAEA;;AAEG;AACI,IAAA,WAAW,CAAC,OAAoB,EAAA;AACrC,QAAA,IAAI,CAAC,aAAa,GAAG,OAAO;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1C;AAEA;;AAEG;IACI,oBAAoB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,iBAAiB,EAAE;IACjC;AAEA;;AAEG;AACI,IAAA,cAAc,CAAC,OAAoB,EAAA;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE;QACxD,IAAI,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE;AAC1C,YAAAA,MAAM,CAAC,GAAG,CAAC,oEAAoE,CAAC;YAChF;QACF;AACA,QAAA,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC;;QAE3C,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA;;AAEG;IACI,cAAc,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE;IAC7C;AAEA;;AAEG;IACI,gBAAgB,GAAA;QACrB,OAAO,IAAI,CAAC,aAAa;IAC3B;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA;;AAEG;AACI,IAAA,UAAU,CAAC,OAAgB,EAAA;AAChC,QAAA,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE;;AAGxD,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC;;AAGrD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtBA,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;AAC/D,YAAA,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,SAAS,CAAC,MAAK;gBACzFA,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC;AACxE,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAAA,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC;QACtD;AAEA,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE;AAC5B,YAAA,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;QAClC;IACF;;AAIA;;AAEG;IACI,MAAM,WAAW,CAAC,IAAY,EAAA;QACnC,IAAI,CAAC,UAAU,CAAC;AACd,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;YACzB,SAAS,EAAE,IAAI,IAAI,EAAE;AACtB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAE1B,MAAM,QAAQ,GAAG,IAAI;AACrB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;AAExB,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;;YAG7C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;AAClC,YAAA,IAAI,OAAO,GAAG,QAAQ,EAAE;AACtB,gBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC;YACzE;YAEA,MAAM,UAAU,GAAG,QAAQ,KAAK,IAAI,CAAC,gBAAgB,EAAE;YACvD,IAAI,CAAC,UAAU,CAAC;AACd,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;gBACzB,eAAe,EAAE,IAAI;AACtB,aAAA,CAAC;QACJ;gBAAU;AACR,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B;IACF;AAEA;;AAEG;IACH,MAAM,WAAW,CAAC,QAAgB,EAAA;AAChC,QAAAA,MAAM,CAAC,GAAG,CAAC,2BAA2B,EAAE,QAAQ,CAAC;;QAGjD,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE;;QAG7D,IAAI,eAAe,EAAE;AACnB,YAAAA,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC;AACzD,YAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;QAC1C;AAEA,QAAAA,MAAM,CAAC,GAAG,CAAC,+CAA+C,CAAC;AAC3D,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;IAChC;AAEA;;AAEG;IACK,MAAM,kBAAkB,CAAC,QAAgB,EAAA;AAC/C,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAEvB,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE;AAE9D,YAAA,MAAM,OAAO,GAAgB;AAC3B,gBAAA,QAAQ,EAAE,QAAQ;AAClB,gBAAA,WAAW,EAAE,GAAG;AAChB,gBAAA,eAAe,EAAE,cAAc;AAC/B,gBAAA,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE;aAC/B;;;AAID,YAAA,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;gBACvE,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE;gBAC/CA,MAAM,CAAC,GAAG,CAAC,6BAA6B,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAClE;iBAAO;AACL,gBAAAA,MAAM,CAAC,GAAG,CAAC,+BAA+B,CAAC;YAC7C;AAEA,YAAAA,MAAM,CAAC,GAAG,CAAC,uCAAuC,EAAE,OAAO,CAAC;;AAG5D,YAAA,IAAI,QAAQ;AACZ,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,gBAAAA,MAAM,CAAC,GAAG,CAAC,oCAAoC,CAAC;AAEhD,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;;AAG1B,gBAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAU;AAE7C,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AAC7E,oBAAA,IAAI,EAAE,CAAC,KAAK,KAAI;wBACd,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE;oBAC7C,CAAC;AACD,oBAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,wBAAA,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;AACnC,wBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACvB,4BAAA,IAAI,EAAE,WAAW;AACjB,4BAAA,OAAO,EAAE,6CAA6C;AACvD,yBAAA,CAAC;AACF,wBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,wBAAA,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;oBAC9B,CAAC;oBACD,QAAQ,EAAE,MAAK;AACb,wBAAA,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE;AAC/B,4BAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACvB,gCAAA,IAAI,EAAE,WAAW;gCACjB,OAAO,EAAE,IAAI,CAAC,eAAe;AAC9B,6BAAA,CAAC;wBACJ;AACA,wBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,wBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe;AACrC,wBAAA,IAAI,CAAC,eAAe,GAAG,EAAE;AACzB,wBAAA,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;wBAC9B,eAAe,CAAC,QAAQ,EAAE;oBAC5B,CAAC;AACF,iBAAA,CAAC;;AAGF,gBAAA,OAAO,MAAM,aAAa,CAAC,eAAe,CAAC;YAC7C;iBAAO;AACL,gBAAAA,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC;AAClD,gBAAA,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC3E,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;gBAE5B,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;;AAEjD,oBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE;AACnC,oBAAA,IAAI,UAAU,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;AACpF,wBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE;AACnC,wBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;wBAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE;wBAE9CA,MAAM,CAAC,GAAG,CAAC,CAAA,sBAAA,EAAyB,KAAK,CAAA,eAAA,EAAkB,UAAU,CAAA,CAAA,CAAG,CAAC;AACzE,wBAAA,IAAI,CAAC;6BACF,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM;AACrD,6BAAA,SAAS,CAAC,CAAC,cAAc,KAAI;4BAC5B,IAAI,cAAc,EAAE;AAClB,gCAAA,IAAI,CAAC,aAAa,GAAG,cAAc;4BACrC;AACF,wBAAA,CAAC,CAAC;oBACN;AAEA,oBAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAE9D,oBAAAA,MAAM,CAAC,GAAG,CAAC,wBAAwB,EAAE,KAAK,CAAC;AAC3C,oBAAA,OAAO,KAAK;gBACd;YACF;AAEA,YAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;QAChC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B,MAAM,QAAQ,GAAG,KAAqB;AACtC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,YAAAA,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC;AAEpC,YAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;QAChC;IACF;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,YAAA,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;AAEnC,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;AACvB,oBAAA,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,IAAI,CAAC,eAAe;AAC9B,iBAAA,CAAC;YACJ;AAEA,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE;QAC3B;IACF;;IAIO,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;IACjC;wGA9UW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAX,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAW,cAFV,MAAM,EAAA,CAAA;;4FAEP,WAAW,EAAA,UAAA,EAAA,CAAA;kBAHvB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCPY,oBAAoB,CAAA;;AAEvB,IAAA,cAAc,GAAG,MAAM,CAAS,EAAE,0DAAC;AACnC,IAAA,SAAS,GAAG,MAAM,CAAS,EAAE,qDAAC;AAC9B,IAAA,KAAK,GAAG,MAAM,CAAS,EAAE,iDAAC;;AAG3B,IAAA,cAAc,GAAG,QAAQ,CAAc,OAAO;AACnD,QAAA,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE;AACrC,QAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;AAC3B,QAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACpB,KAAA,CAAC,0DAAC;;AAGI,IAAA,UAAU,GAAG,QAAQ,CAAS,MAAK;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,SAAS;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,SAAS;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,SAAS;AACpC,QAAA,OAAO,GAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,EAAE;AAC5B,IAAA,CAAC,sDAAC;;AAGM,IAAA,oBAAoB,GAAG,IAAI,OAAO,EAAsB;AACzD,IAAA,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,EAAE;IAExD,eAAe,GAAuB,IAAI;AAElD,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;AACrC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;;AAG7B,YAAA,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;AACnC,gBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;oBAC7B,QAAQ,EAAE,IAAI,CAAC,eAAe;AAC9B,oBAAA,OAAO,EAAE,OAAO;AAChB,oBAAA,UAAU,EAAE,GAAG;AAChB,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE,GAAG,OAAO,EAAE;YACvC;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACI,IAAA,UAAU,CAAC,OAA6B,EAAA;AAC7C,QAAA,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE;YACxC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC;QACjD;AACA,QAAA,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE;YACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;QACvC;AACA,QAAA,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE;YAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;QAC/B;IACF;AAEA;;AAEG;AACI,IAAA,iBAAiB,CAAC,cAAsB,EAAA;AAC7C,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC;IACzC;AAEO,IAAA,YAAY,CAAC,SAAiB,EAAA;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;IAC/B;AAEO,IAAA,QAAQ,CAAC,KAAa,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;AAEA;;AAEG;IACI,iBAAiB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE;IAC9B;IAEO,YAAY,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE;IACzB;IAEO,QAAQ,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE;IACrB;IAEO,aAAa,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE;IAC1B;IAEO,UAAU,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE;IAC9B;AAEA;;AAEG;AACK,IAAA,iBAAiB,CAAC,OAAoB,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;;AAEzB,YAAA,OAAO,OAAO,CAAC,cAAc,KAAK,EAAE,IAAI,OAAO,CAAC,SAAS,KAAK,EAAE,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE;QAC1F;QAEA,QACE,IAAI,CAAC,eAAe,CAAC,cAAc,KAAK,OAAO,CAAC,cAAc;AAC9D,YAAA,IAAI,CAAC,eAAe,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS;YACpD,IAAI,CAAC,eAAe,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;IAEhD;AAEA;;AAEG;IACI,YAAY,GAAA;AACjB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;IACpB;wGAzHW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAApB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA;;4FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;MCVY,gBAAgB,CAAA;AAC3B;;AAEG;IACI,OAAO,WAAW,CAAC,KAAU,EAAA;AAClC,QAAA,IAAI,KAAK,YAAY,iBAAiB,EAAE;AACtC,YAAA,QAAQ,KAAK,CAAC,MAAM;AAClB,gBAAA,KAAK,GAAG;AACN,oBAAA,OAAO,8CAA8C;AACvD,gBAAA,KAAK,GAAG;AACN,oBAAA,OAAO,+DAA+D;AACxE,gBAAA,KAAK,GAAG;AACN,oBAAA,OAAO,uCAAuC;AAChD,gBAAA,KAAK,GAAG;AACN,oBAAA,OAAO,4CAA4C;AACrD,gBAAA,KAAK,GAAG;AACN,oBAAA,OAAO,gDAAgD;AACzD,gBAAA;AACE,oBAAA,OAAO,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,+BAA+B;;QAEpE;AAEA,QAAA,IAAI,KAAK,YAAY,KAAK,EAAE;YAC1B,OAAO,KAAK,CAAC,OAAO;QACtB;AAEA,QAAA,OAAO,+BAA+B;IACxC;AACD;;MCXY,iBAAiB,CAAA;AACpB,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC7C,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AACjC,IAAA,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACnD,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;;;AAI3C,IAAA,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ;AACpC,IAAA,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW;AAC1C,IAAA,YAAY,GAAG,MAAM,CAAgB,EAAE,wDAAC;;AAGxC,IAAA,YAAY,GAAG,MAAM,CAAgB,IAAI,wDAAC;;AAGjD,IAAA,QAAQ,GAAG,MAAM,CAAgB,IAAI,oDAAC;AACtC,IAAA,SAAS,GAAG,MAAM,CAAgB,IAAI,qDAAC;AAChC,IAAA,WAAW,GAAG,MAAM,CAAgB,IAAI,uDAAC;AACzC,IAAA,WAAW,GAAG,MAAM,CAAU,KAAK,uDAAC;AACpC,IAAA,iBAAiB,GAAG,MAAM,CAAU,KAAK,6DAAC;;AAGzC,IAAA,aAAa,GAAG,MAAM,CAAS,CAAC,yDAAC;AACjC,IAAA,YAAY,GAAG,MAAM,CAAU,KAAK,wDAAC;AACtC,IAAA,cAAc,GAAG,MAAM,CAAU,IAAI,0DAAC;AACtC,IAAA,aAAa,GAAG,MAAM,CAAU,KAAK,yDAAC;;AAG7C,IAAA,WAAA,GAAA;;;;;;;;;IASA;AAEA;;;AAGG;IACK,oBAAoB,GAAA;AAC1B,QAAAA,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC;;AAGzD,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;;AAGhC,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;;QAG/B,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;;AAGvC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;;AAGzB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;;AAG5B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AAEvB,QAAAA,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC;IAC/C;AAEA;;;;;AAKG;IACK,cAAc,GAAA;;AAEpB,QAAA,IAAI,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,QAAQ;AACvC,QAAA,IAAI,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,QAAQ;QACvC,IAAI,MAAM,GAAG,QAAQ;;AAGrB,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE;YAC1B,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;YAC5C,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;YAC5C,MAAM,GAAG,SAAS;QACpB;AAEA,QAAA,IAAI,QAAQ,IAAI,QAAQ,EAAE;YACxBA,MAAM,CAAC,IAAI,CAAC,CAAA,sCAAA,EAAyC,MAAM,CAAA,YAAA,EAAe,QAAQ,CAAA,CAAE,CAAC;YACrF,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,IAAI,CAAC;AACxC,YAAAA,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC;QACzD;IACF;AAEA;;AAEG;IACH,mBAAmB,GAAA;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;QAClD,OAAO,QAAQ,IAAI,MAAM;IAC3B;;AAIA;;;AAGG;AACH,IAAA,gBAAgB,CAAC,UAAkB,EAAE,MAAc,EAAE,eAAwB,KAAK,EAAA;;AAEhF,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1E,YAAAA,MAAM,CAAC,GAAG,CAAC,0CAA0C,CAAC;YACtD;QACF;QAEAA,MAAM,CAAC,GAAG,CAAC,CAAA,oCAAA,EAAuC,UAAU,CAAA,QAAA,EAAW,MAAM,CAAA,GAAA,CAAK,CAAC;AACnF,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE1B,QAAA,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1E,YAAA,IAAI,EAAE,CAAC,MAAM,KAAI;gBACf,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACtC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBACvC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,gBAAAA,MAAM,CAAC,GAAG,CACR,CAAA,oBAAA,EAAuB,MAAM,CAAC,QAAQ,CAAC,MAAM,uBAAuB,MAAM,CAAC,OAAO,CAAA,CAAE,CACrF;AACD,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;YACnC,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAAA,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC;AAC7C,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;YACnC,CAAC;AACF,SAAA,CAAC;IACJ;AAEA;;AAEG;IACH,gBAAgB,CAAC,UAAkB,EAAE,MAAc,EAAA;QACjD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AAClD,YAAAA,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC;YACzD;QACF;AAEA,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,QAAAA,MAAM,CAAC,GAAG,CAAC,sCAAsC,aAAa,CAAA,CAAE,CAAC;AACjE,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAE5B,QAAA,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC,SAAS,CAAC;AACtF,YAAA,IAAI,EAAE,CAAC,MAAM,KAAI;;AAEf,gBAAA,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;AACpE,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC;gBACtC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;gBACvC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;AAC3C,gBAAAA,MAAM,CAAC,GAAG,CACR,UAAU,MAAM,CAAC,QAAQ,CAAC,MAAM,0BAA0B,eAAe,CAAC,MAAM,CAAA,WAAA,EAAc,MAAM,CAAC,OAAO,CAAA,CAAE,CAC/G;AACD,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;YAC/B,CAAC;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAAA,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC;AAClD,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;YAC/B,CAAC;AACF,SAAA,CAAC;IACJ;AAEA;;AAEG;IACH,eAAe,GAAA;AACb,QAAAA,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC;AACxC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,SAAiB,EAAE,UAAkB,EAAE,MAAc,EAAA;AACjE,QAAAA,MAAM,CAAC,GAAG,CAAC,mCAAmC,SAAS,CAAA,CAAE,CAAC;AAC1D,QAAA,OAAO,IAAI,UAAU,CAAC,CAAC,QAAQ,KAAI;AACjC,YAAA,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC;gBAC5E,IAAI,EAAE,MAAK;AACT,oBAAAA,MAAM,CAAC,GAAG,CAAC,WAAW,SAAS,CAAA,4CAAA,CAA8C,CAAC;;AAE9E,oBAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC;;oBAGzC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE;AACzD,oBAAA,IAAI,aAAa,EAAE,EAAE,KAAK,SAAS,EAAE;AACnC,wBAAAA,MAAM,CAAC,GAAG,CAAC,iDAAiD,CAAC;AAC7D,wBAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;oBACpC;oBAEA,QAAQ,CAAC,IAAI,EAAE;oBACf,QAAQ,CAAC,QAAQ,EAAE;gBACrB,CAAC;AACD,gBAAA,KAAK,EAAE,CAAC,GAAG,KAAI;oBACbA,MAAM,CAAC,KAAK,CAAC,CAAA,yBAAA,EAA4B,SAAS,CAAA,CAAA,CAAG,EAAE,GAAG,CAAC;AAC3D,oBAAA,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;gBACrB,CAAC;AACF,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,OAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC;QACrCA,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,KAAK,CAAC;IAC9C;AAEA;;AAEG;IACH,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;IACpC;;AAIA;;AAEG;AACH,IAAA,MAAM,WAAW,CAAC,IAAY,EAAE,YAAoB,IAAI,EAAA;AACtD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAE3B,IAAI,CAAC,WAAW,EAAE;YAChB;QACF;AAEA,QAAA,IAAI,WAAW,CAAC,MAAM,GAAG,SAAS,EAAE;YAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA,kCAAA,EAAqC,SAAS,CAAA,YAAA,CAAc,CAAC;YACnF,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC7B,CAAC,EAAE,IAAI,CAAC;YACR;QACF;;QAGA,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC;IACjD;AAEA;;AAEG;IACH,gBAAgB,CAAC,UAAkB,EAAE,MAAc,EAAA;AACjD,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;;AAEhC,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC;IAC3C;AAEA;;AAEG;IACH,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5B;;AAIA;;AAEG;AACH,IAAA,MAAM,cAAc,CAClB,WAAkC,EAClC,SAAkB,KAAK,EAAA;AAEvB,QAAAA,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC;AAClD,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC5B;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;AACrF,YAAAA,MAAM,CAAC,GAAG,CAAC,gDAAgD,EAAE,QAAQ,CAAC;YACtE,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;;;AAGjD,gBAAA,MAAM,UAAU,GAAG;AACjB,oBAAA,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY;AACxC,oBAAA,aAAa,EAAE,WAAW,CAAC,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE;iBACzE;AAED,gBAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC;;AAGvC,gBAAAA,MAAM,CAAC,GAAG,CAAC,6DAA6D,CAAC;gBACzE,IAAI,CAAC,MAAM,EAAE;AACX,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC;gBAC3C;AACA,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,gBAAA,OAAO,IAAI;YACb;iBAAO;gBACL,IAAI,CAAC,MAAM,EAAE;AACX,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,yBAAyB,CAAC;gBAC/C;AACA,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,gBAAA,OAAO,KAAK;YACd;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAAA,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC;YAC9C,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,2CAA2C,CAAC;YACjE;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;AACH,IAAA,MAAM,KAAK,CAAC,WAAyB,EAAE,SAAkB,KAAK,EAAA;AAC5D,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC5B;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC7E,YAAAA,MAAM,CAAC,GAAG,CAAC,sCAAsC,EAAE,QAAQ,CAAC;AAC5D,YAAAA,MAAM,CAAC,GAAG,CAAC,qCAAqC,EAAE,WAAW,CAAC;YAC9D,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;AACjD,gBAAAA,MAAM,CAAC,GAAG,CAAC,2BAA2B,EAAE,QAAQ,CAAC;gBACjD,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;;AAG1C,gBAAAA,MAAM,CAAC,GAAG,CAAC,mDAAmD,CAAC;gBAC/D,IAAI,CAAC,MAAM,EAAE;AACX,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC;gBAC3C;AACA,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,gBAAA,OAAO,IAAI;YACb;iBAAO;gBACL,IAAI,CAAC,MAAM,EAAE;AACX,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,8CAA8C,CAAC;gBACpE;AACA,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,gBAAA,OAAO,KAAK;YACd;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAAA,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC;YACpC,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACzD;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,YAAA,OAAO,KAAK;QACd;IACF;AAEA;;AAEG;IACH,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;IAC3C;AAEA;;AAEG;AACH,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,IAAI;;YAEF,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC;YAE3D,IAAI,CAAC,YAAY,EAAE;AACjB,gBAAAA,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC;gBAChE,IAAI,CAAC,cAAc,EAAE;gBACrB;YACF;;AAGA,YAAA,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;AAE/E,YAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE;gBAChC,IAAI,CAAC,cAAc,EAAE;AACrB,gBAAAA,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC;YAC5C;iBAAO;AACL,gBAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC;YAClC;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAAA,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC;;YAErC,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACvD,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B,CAAC,EAAE,IAAI,CAAC;QACV;IACF;AAEA;;AAEG;IACK,cAAc,GAAA;;AAEpB,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;;;;AAM5B,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;;AAGlC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;;AAGzB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,0BAA0B,CAAC;;QAGhD,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC5B,CAAC,EAAE,IAAI,CAAC;IACV;;AAIA;;AAEG;AACH,IAAA,mBAAmB,CAAC,cAAsB,EAAE,SAAiB,EAAE,KAAa,EAAA;AAC1E,QAAA,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC;YACnC,cAAc,EAAE,cAAc,IAAI,EAAE;YACpC,SAAS,EAAE,SAAS,IAAI,EAAE;YAC1B,KAAK,EAAE,KAAK,IAAI,EAAE;AACnB,SAAA,CAAC;;QAGF,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE;AACzD,QAAAA,MAAM,CAAC,GAAG,CAAC,uCAAuC,EAAE,UAAU,CAAC;AAC/D,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC;IAC5C;AAEA;;AAEG;AACH,IAAA,uBAAuB,CAAC,WAAwB,EAAA;AAC9C,QAAA,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC;QAC5CA,MAAM,CAAC,GAAG,CAAC,sCAAsC,EAAE,WAAW,CAAC,QAAQ,CAAC;IAC1E;AAEA;;AAEG;IACH,oBAAoB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE;IAC/C;AAEA;;AAEG;AACH,IAAA,yBAAyB,CAAC,QAAsC,EAAA;AAC9D,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;;YAEhF,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC;AAChD,YAAA,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;AAC5B,QAAA,CAAC,CAAC;;AAGF,QAAA,OAAO,MAAM,YAAY,CAAC,WAAW,EAAE;IACzC;AAEA;;AAEG;IACH,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;IACxC;;AAIA;;AAEG;AACH,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAClC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QACnC,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC;AACtE,QAAA,OAAO,UAAU,EAAE,eAAe,KAAK,IAAI;AAC7C,IAAA,CAAC,+DAAC;wGAnfS,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA;;4FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACfD;;;;;;;;;;;AAWG;MAIU,kBAAkB,CAAA;;AAG7B;;AAEG;AACI,IAAA,UAAU,GAAG,MAAM,CAAC,KAAK,sDAAC;AAEjC;;AAEG;AACI,IAAA,oBAAoB,GAAG,MAAM,CAAC,KAAK,gEAAC;AAE3C;;AAEG;AACI,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAEnC;;AAEG;AACK,IAAA,iBAAiB,GAAG,MAAM,CAAgB,IAAI,6DAAC;AAEvD;;AAEG;AACK,IAAA,cAAc,GAAG,MAAM,CAAY,EAAE,0DAAC;;AAI9C;;AAEG;AACI,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACjC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACrB,OAAO,CAAC,CAAC;QACX;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AAEnC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC3C,QAAA,IAAI,aAAa,GAAG,CAAC,CAAC;AAEtB,QAAA,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,YAAA,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,UAAU,CAAC;QACpE;;QAGA,MAAM,iBAAiB,GAAG;AACvB,aAAA,KAAK,CAAC,aAAa,GAAG,CAAC;AACvB,aAAA,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC;QAExC,OAAO,iBAAiB,CAAC,MAAM;AACjC,IAAA,CAAC,uDAAC;;AAIF;;AAEG;AACI,IAAA,gBAAgB,GAAG,MAAM,CAC9B,MAAK;AACH,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;AAChC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;QAElC,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AACzC,YAAA,IAAI,WAAW,EAAE,EAAE,EAAE;AACnB,gBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAChD,gBAAA,IAAI,WAAW,CAAC,EAAE,KAAK,eAAe,EAAE;oBACtC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5C;YACF;QACF;AACF,IAAA,CAAC,4DAEF;;AAID;;;AAGG;AACH,IAAA,iBAAiB,CAAC,cAAmB,EAAA;AACnC,QAAA,IAAI,CAAC,cAAc,GAAG,cAAc;IACtC;AAEA;;AAEG;IACH,UAAU,GAAA;AACR,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE;AACvC,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;;QAGvC,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,YAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACjD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,IAAI,CAAC;YACpD;QACF;IACF;AAEA;;AAEG;IACH,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;IACnD;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;IAC5B;AAEA;;AAEG;IACH,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;AAEA;;AAEG;IACH,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;IACtC;AAEA;;AAEG;IACH,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;IACrC;AAEA;;AAEG;IACH,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IACvC;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,YAAqB,EAAA;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;IACrC;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,SAAiB,EAAA;AAClC,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;IAClC;AAEA;;AAEG;IACH,oBAAoB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,iBAAiB,EAAE;IACjC;wGA9KW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACwCK,MAAO,OAAQ,SAAQ,YAAY,CAAA;AAsE7B,IAAA,UAAA;AACA,IAAA,QAAA;;AApED,IAAA,MAAM,GAAiB,IAAI,YAAY,EAAE;AACzC,IAAA,cAAc;AACd,IAAA,SAAS;AACT,IAAA,KAAK;IACL,WAAW,GAAyD,KAAK;IACzE,UAAU,GAAY,KAAK;IAC3B,YAAY,GAAY,KAAK;AAC7B,IAAA,SAAS;AACT,IAAA,WAAW;AACX,IAAA,WAAW;IAEpB,QAAQ,GAAG,QAAQ;;AAIX,IAAA,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACtC,IAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACpC,IAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;;;AAKlC,IAAA,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU;AACpC,IAAA,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB;AACxD,IAAA,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;AACxC,IAAA,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW;;AAGtC,IAAA,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ;AACnC,IAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW;AACzC,IAAA,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY;AAC3C,IAAA,mBAAmB,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB;AACzD,IAAA,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY;AAC3C,IAAA,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc;AAC/C,IAAA,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAC7C,IAAA,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB;;;AAKrD,IAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW;AACzC,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS;AACrC,IAAA,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW;;IAIzC,QAAQ,GAAG,MAAM;IACjB,kBAAkB,GAAa,kBAAkB;IACjD,iBAAiB,GAAa,iBAAiB;IAE/C,gBAAgB,GAAG,IAAI;;AAGtB,IAAA,cAAc;IAEtB,eAAe,GAAG,KAAK;IACvB,UAAU,GAAe,SAAS;;AAIoB,IAAA,aAAa;AACnC,IAAA,mBAAmB;;IAInD,WAAA,CACU,UAAsB,EACtB,QAAmB,EAAA;AAE3B,QAAA,KAAK,EAAE;QAHC,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,QAAQ,GAAR,QAAQ;;QAKhB,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;;QAGxD,MAAM,CAAC,MAAK;YACV,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AACnD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;YAC1C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;AAC3C,QAAA,CAAC,CAAC;IACJ;;IAIA,QAAQ,GAAA;AACN,QAAAA,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC;;QAG/C,IAAI,CAAC,WAAW,CAAC,mBAAmB,EAAE,CAAC,SAAS,EAAE;;QAGlD,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AAChD,YAAA,IAAI,CAAC,UAAU,GAAG,MAAM;AACxB,YAAA,IAAI,CAAC,eAAe,GAAG,MAAM,KAAK,eAAe;AAEjD,YAAA,IAAI,MAAM,KAAK,eAAe,EAAE;gBAC9B,IAAI,CAAC,YAAY,EAAE;YACrB;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,YAAY,GAAA;;AAElB,QAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC;;AAGpF,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,WAAW;QACtE,IAAI,CAAC,cAAc,EAAE;;QAGrB,IAAI,CAAC,UAAU,CAAC,mBAAmB,CACjC,IAAI,CAAC,cAAc,IAAI,EAAE,EACzB,IAAI,CAAC,SAAS,IAAI,EAAE,EACpB,IAAI,CAAC,KAAK,IAAI,EAAE,CACjB;;AAGD,QAAA,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;;AAGjC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC,MAAK;AACnE,gBAAA,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;AAC9B,YAAA,CAAC,CAAC;QACJ;IACF;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;;QAEhC,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YAC9C,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,WAAW,CAAC;YACzD,IAAI,CAAC,cAAc,EAAE;;AAGrB,YAAA,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;AACxB,YAAA,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;QACpC;;AAGA,QAAA,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,QAAQ,CAAC,WAAW;YACtE,IAAI,CAAC,cAAc,EAAE;AAErB,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC1B,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;YACxD;QACF;IACF;;;AAKA,IAAA,aAAa,CAAC,WAAyB,EAAA;QACrC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;IAC3C;IAEA,aAAa,GAAA;;AAEX,QAAA,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AACjC,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;IAC1B;;IAIA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;IAC3B;IAEA,MAAM,WAAW,CAAC,IAAY,EAAA;AAC5B,QAAA,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC;;AAE9D,QAAA,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;IACnC;IAEA,SAAS,GAAA;QACP,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,WAAW;QACtD,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC;IACtD;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE;IACrC;;IAIA,oBAAoB,GAAA;QAClB,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE;QACtD,IAAI,SAAS,EAAE;;YAEb,IAAI,CAAC,gBAAgB,EAAE;QACzB;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE;IACrC;AAEA,IAAA,eAAe,CAAC,OAAoB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC;AACpC,QAAA,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;IACpC;AAEA,IAAA,aAAa,CAAC,SAAiB,EAAA;AAC7B,QAAAA,MAAM,CAAC,GAAG,CAAC,qBAAqB,SAAS,CAAA,CAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE;AACzD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,WAAW;AACtF,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC,MAAK;;AAErF,YAAA,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AACnC,QAAA,CAAC,CAAC;IACJ;IAEQ,gBAAgB,GAAA;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE;AACzD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,WAAW;AACtF,QAAAA,MAAM,CAAC,GAAG,CAAC,yCAAyC,MAAM,CAAA,CAAE,CAAC;AAC7D,QAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACjE;AAEA;;AAEG;IACH,eAAe,GAAA;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE;AACzD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,WAAW;AACtF,QAAAA,MAAM,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAA,CAAE,CAAC;AACvD,QAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACjE;AAEA;;AAEG;IACH,cAAc,GAAA;QACZ,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE;AACzD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,WAAW;AACtF,QAAAA,MAAM,CAAC,GAAG,CAAC,iCAAiC,MAAM,CAAA,CAAE,CAAC;AACrD,QAAA,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AACjC,QAAA,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;IACxE;;IAIA,gBAAgB,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;YACjC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,EAAE;AAClE,YAAA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC;QAC1C;IACF;;IAIA,gBAAgB,CAAC,KAAa,EAAE,IAAS,EAAA;QACvC,OAAO,IAAI,CAAC,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE;IACpC;AAEA;;AAEG;IACK,cAAc,GAAA;QACpB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE;AAC1D,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ;AAC9C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;QAEvC,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,QAAQ,GAAG,WAAW;QAC7B;aAAO,IAAI,UAAU,EAAE;AACrB,YAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;QAC5B;AAAO,aAAA,IAAI,YAAY,IAAI,YAAY,KAAK,MAAM,EAAE;AAClD,YAAA,IAAI,CAAC,QAAQ,GAAG,YAAY;QAC9B;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,GAAG,MAAM;QACxB;QAEAA,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAAC;IACjD;IAEA,WAAW,GAAA;;AAET,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,EAAE;QACvB;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;IAChC;wGAjSW,OAAO,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAgEP,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAAU,UAAU,mEACvC,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1HhC,2qFAwEA,EAAA,MAAA,EAAA,CAAA,8uEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7BY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAI,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,s4BAAE,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAc1E,OAAO,EAAA,UAAA,EAAA,CAAA;kBAjBnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,cACX,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,IAAI,CAAC,EAAA,eAAA,EAG3E,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,2qFAAA,EAAA,MAAA,EAAA,CAAA,8uEAAA,CAAA,EAAA;;sBAc9C;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAoDA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,mBAAmB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;;sBACnD,SAAS;uBAAC,mBAAmB;;AAmOhC;SAEgB,aAAa,GAAA;AAC3B,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,IAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB;AAEA,oBAAoB,CAAC,OAAO,EAAE;AAC5B,IAAA,SAAS,EAAE;QACT,iBAAiB,CAAC,sBAAsB,EAAE,CAAC;QAC3C,QAAQ;QACR,qBAAqB,CAAC,aAAa,CAAC;AACpC,QAAA;AACE,YAAA,OAAO,EAAE,iBAAiB;AAC1B,YAAA,QAAQ,EAAE,eAAe;AACzB,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA;AACF,KAAA;AACF,CAAA,CAAC;;AE7SF;;AAEG;MACU,kBAAkB,GAAG,IAAI,cAAc,CAAmB,oBAAoB,EAAE;AAC3F,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,OAAO;AACd,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,SAAS,EAAE,KAAK;AAChB,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,kBAAkB,EAAE,EAAE;AACtB,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,aAAa,EAAE,CAAC;AAChB,QAAA,UAAU,EAAE,IAAI;KACjB,CAAC;AACH,CAAA;;MCzEY,QAAQ,CAAA;IACV,IAAI,GAAG,GAAG;AACT,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AAE7C,IAAA,OAAO,CAAC,KAAY,EAAA;;;AAIlB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACtB;wGATW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,QAAQ,sICRrB,mHAKA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FDGa,QAAQ,EAAA,UAAA,EAAA,CAAA;kBANpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,WAChB,EAAE,EAAA,QAAA,EAAA,mHAAA,EAAA;;sBAKV;;sBACA;;;MEMU,YAAY,CAAA;AACD,IAAA,UAAU;AAEL,IAAA,SAAS;IAEpC,kBAAkB,GAAA;;QAEhB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AAC9B,YAAA,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAK;gBAC3B,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,KAAK;IAC5C;wGAhBW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAGN,QAAQ,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnB3B,05BA8BA,EAAA,MAAA,EAAA,CAAA,gvBAAA,CAAA,EAAA,CAAA;;4FDda,YAAY,EAAA,UAAA,EAAA,CAAA;kBANxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,WACpB,EAAE,EAAA,QAAA,EAAA,05BAAA,EAAA,MAAA,EAAA,CAAA,gvBAAA,CAAA,EAAA;;sBAKV,SAAS;uBAAC,SAAS;;sBAEnB,eAAe;uBAAC,QAAQ;;;AEnB3B;AACA;AACA;AAEA;AAkBA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AC/CA;;AAEG;;;;"}
|