From 1cbc3c4cf0e135f3d33e051ba166bdcdd92e2b70 Mon Sep 17 00:00:00 2001 From: winchen Date: Tue, 30 Jun 2026 10:13:48 +0700 Subject: [PATCH] Initial Web IM deployment --- .gitignore | 9 + AGENTS.md | 3 + README.md | 58 + SESSION_HANDOFF.md | 299 + WEB_DEPLOYMENT.md | 277 + babel.config.js | 3 + deploy/im-web-8023.nginx.conf | 33 + dist/api/add_contact.php | 95 + dist/api/contacts.php | 71 + dist/api/conversation_actions.php | 990 + dist/api/im_web_bootstrap.php | 348 + dist/api/media_download.php | 58 + dist/api/message_action.php | 288 + dist/api/message_detail.php | 387 + dist/api/messages.php | 900 + dist/api/platform_config.php | 39 + dist/api/profile.php | 321 + dist/api/send_message.php | 411 + dist/api/update_alias.php | 61 + dist/config/runtime-config.js | 11 + dist/css/app.0d8c504a.css | 2778 ++ dist/img/5IuOieu9PF8MJtp43kD2kCkdLVjVwDp7.ico | Bin 0 -> 32038 bytes dist/index.html | 1 + dist/js/app.3d85aa5a.js | 9020 ++++++ dist/js/app.3d85aa5a.js.map | 1 + dist/js/chunk-vendors.fa6d4264.js | 24384 ++++++++++++++++ dist/js/chunk-vendors.fa6d4264.js.map | 1 + legacy/imClient.legacy.js | 651 + package.json | 27 + public/api/add_contact.php | 95 + public/api/contacts.php | 71 + public/api/conversation_actions.php | 990 + public/api/im_web_bootstrap.php | 348 + public/api/media_download.php | 58 + public/api/message_action.php | 288 + public/api/message_detail.php | 387 + public/api/messages.php | 900 + public/api/platform_config.php | 39 + public/api/profile.php | 321 + public/api/send_message.php | 411 + public/api/update_alias.php | 61 + public/config/runtime-config.js | 11 + .../img/5IuOieu9PF8MJtp43kD2kCkdLVjVwDp7.ico | Bin 0 -> 32038 bytes public/index.html | 14 + src/App.vue | 27 + src/components/ChatShell.vue | 34 + src/components/LoginView.vue | 677 + src/components/chat/ChatPanel.vue | 1067 + src/components/chat/MessageComposer.vue | 223 + src/components/chat/MessageList.vue | 757 + src/components/contacts/ContactPanel.vue | 111 + src/components/favorites/FavoriteList.vue | 79 + src/components/favorites/FavoritePanel.vue | 202 + src/components/sidebar/ContactList.vue | 103 + src/components/sidebar/ConversationList.vue | 525 + src/components/sidebar/NavigationRail.vue | 724 + src/config.js | 34 + src/main.js | 6 + src/services/httpImClient.js | 1036 + src/services/imClient.js | 17 + src/services/longConnectionImClient.js | 236 + src/stores/contacts.js | 233 + src/stores/conversations.js | 1227 + src/stores/navigation.js | 18 + src/stores/session.js | 190 + src/styles/base.css | 2755 ++ vue.config.js | 51 + 67 files changed, 55851 insertions(+) create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 README.md create mode 100644 SESSION_HANDOFF.md create mode 100644 WEB_DEPLOYMENT.md create mode 100644 babel.config.js create mode 100644 deploy/im-web-8023.nginx.conf create mode 100644 dist/api/add_contact.php create mode 100644 dist/api/contacts.php create mode 100644 dist/api/conversation_actions.php create mode 100644 dist/api/im_web_bootstrap.php create mode 100644 dist/api/media_download.php create mode 100644 dist/api/message_action.php create mode 100644 dist/api/message_detail.php create mode 100644 dist/api/messages.php create mode 100644 dist/api/platform_config.php create mode 100644 dist/api/profile.php create mode 100644 dist/api/send_message.php create mode 100644 dist/api/update_alias.php create mode 100644 dist/config/runtime-config.js create mode 100644 dist/css/app.0d8c504a.css create mode 100644 dist/img/5IuOieu9PF8MJtp43kD2kCkdLVjVwDp7.ico create mode 100644 dist/index.html create mode 100644 dist/js/app.3d85aa5a.js create mode 100644 dist/js/app.3d85aa5a.js.map create mode 100644 dist/js/chunk-vendors.fa6d4264.js create mode 100644 dist/js/chunk-vendors.fa6d4264.js.map create mode 100644 legacy/imClient.legacy.js create mode 100644 package.json create mode 100644 public/api/add_contact.php create mode 100644 public/api/contacts.php create mode 100644 public/api/conversation_actions.php create mode 100644 public/api/im_web_bootstrap.php create mode 100644 public/api/media_download.php create mode 100644 public/api/message_action.php create mode 100644 public/api/message_detail.php create mode 100644 public/api/messages.php create mode 100644 public/api/platform_config.php create mode 100644 public/api/profile.php create mode 100644 public/api/send_message.php create mode 100644 public/api/update_alias.php create mode 100644 public/config/runtime-config.js create mode 100644 public/img/5IuOieu9PF8MJtp43kD2kCkdLVjVwDp7.ico create mode 100644 public/index.html create mode 100644 src/App.vue create mode 100644 src/components/ChatShell.vue create mode 100644 src/components/LoginView.vue create mode 100644 src/components/chat/ChatPanel.vue create mode 100644 src/components/chat/MessageComposer.vue create mode 100644 src/components/chat/MessageList.vue create mode 100644 src/components/contacts/ContactPanel.vue create mode 100644 src/components/favorites/FavoriteList.vue create mode 100644 src/components/favorites/FavoritePanel.vue create mode 100644 src/components/sidebar/ContactList.vue create mode 100644 src/components/sidebar/ConversationList.vue create mode 100644 src/components/sidebar/NavigationRail.vue create mode 100644 src/config.js create mode 100644 src/main.js create mode 100644 src/services/httpImClient.js create mode 100644 src/services/imClient.js create mode 100644 src/services/longConnectionImClient.js create mode 100644 src/stores/contacts.js create mode 100644 src/stores/conversations.js create mode 100644 src/stores/navigation.js create mode 100644 src/stores/session.js create mode 100644 src/styles/base.css create mode 100644 vue.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dc1565e --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +node_modules/ +.deploy/ +.DS_Store +npm-debug.log* +yarn-debug.log* +yarn-error.log* +*.local +.env +.env.* diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..d9fca6e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,3 @@ +# JC Web IM 开发记录 + +- 业务操作的成功、失败、保存结果提示,不要使用几秒后自动消失的 toast / popup。优先放在当前表单、按钮附近或弹窗内部,以常驻文字显示;在用户再次编辑、切换或关闭当前界面时再清除。 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e615f9d --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +# 绿地信通 Web IM + +这是从零重写的 Web IM 前端,UI 和状态管理独立于原 `vue-chat`,底层通过授权的 WildFire Web SDK 连接既有 IM 服务。 + +## 当前工作范围 + +- 当前工作是在 `jc-web-im` 目录新写 Web 版 IM 客户端。 +- 不要默认回到仓库根目录老 `src/` 客户端里继续改,除非明确需要兼容或参考旧实现。 +- 中断恢复时优先阅读 `/var/www/im-web/SESSION_HANDOFF.md`。 + +## 服务地址 + +- App Server: `http://52.76.146.193:8888` +- IM route: `http://52.76.146.193:80/route` +- WebSocket: `ws://52.76.146.193:8083/ws` +- HTTPS/WSS 当前未启用为默认连接方式。 + +远端部署路径: + +- App Server: `/opt/app-server` +- IM Server: `/opt/im-server` + +## 运行 + +```bash +cd /var/www/im-web/jc-web-im +npm run serve +``` + +开发访问地址: + +```text +http://localhost:8023 +http://10.0.0.120:8023 +``` + +## 构建 + +```bash +npm run build +``` + +## 部署 + +生产部署请看 [WEB_DEPLOYMENT.md](./WEB_DEPLOYMENT.md)。当前 Web 版需要 Nginx 托管静态文件,并通过 PHP-FPM 运行 `dist/api/*.php` 代理接口。 + +## 连接方式 + +`src/services/imClient.js` 是唯一的 IM 适配层。上层 UI 只调用这里的方法: + +- `loginWithPassword` +- `loginWithCode` +- `connect` +- `getConversationList` +- `getMessages` +- `sendTextMessage` + +后续如果替换 SDK 或自研协议,只改这个适配层,不需要改 UI 组件。 diff --git a/SESSION_HANDOFF.md b/SESSION_HANDOFF.md new file mode 100644 index 0000000..2e5adb0 --- /dev/null +++ b/SESSION_HANDOFF.md @@ -0,0 +1,299 @@ +# JC Web IM Session Handoff + +Updated: 2026-05-02 03:18:54 UTC + +## Current Goal + +Continue the Web IM version under: + +```text +/var/www/jc-im/jc-web-im +``` + +The current focus is the contact list and contact detail flow: + +- Load contacts quickly. +- Avoid duplicate contact rows. +- Show contact detail fields correctly. +- Allow editing the friend alias / remark name. + +Important user instruction: + +- Do not modify `app-server` code. +- Local config may be adjusted to fit the local test environment. +- Web-side code and PHP proxy code may be changed as needed. + +## Runtime Services + +Current local runtime: + +```text +im-server: /opt/im-server +app-server: /opt/app-server +web source: /var/www/jc-im/jc-web-im +web dist: /var/www/jc-im/jc-web-im/dist +``` + +PM2 process names: + +```text +jc-im-server +jc-app-server +``` + +Useful checks: + +```bash +pm2 list +curl -s http://127.0.0.1:18000/api/version +curl -s http://127.0.0.1:18888/ +curl -I http://127.0.0.1:8023/ +``` + +Important ports: + +```text +18000 im-server HTTP/API +18080 im-server admin +1883 im-server long connection/MQTT +18888 app-server +8023 Web IM Nginx +``` + +## App Server Status + +Remote `app-server` was previously pulled from: + +```text +ubuntu@18.138.246.10:/opt/app-server +``` + +It is a colleague-modified deployment and is no longer started from a jar. It runs from exploded classes/lib, equivalent to: + +```bash +java -Dfile.encoding=UTF-8 -Xms256m -Xmx1024m \ + -classpath classes:lib/* cn.wildfirechat.app.Application +``` + +Do not change its code unless the user explicitly reverses that instruction. + +Current local config was preserved/adapted under: + +```text +/opt/app-server/config/application.properties +``` + +Known important setting: + +```properties +AppCode=676d5adc3ee049b4aeb69f440305c953 +``` + +Redis was configured locally to accept the password expected by this app-server: + +```text +Mjfg2U@YZdLx&wmH +``` + +Be careful: other Redis clients may need auth if they reconnect. + +## Contact List Architecture + +The Web version currently uses PHP proxy endpoints under: + +```text +/var/www/jc-im/jc-web-im/public/api +``` + +Build copies them to: + +```text +/var/www/jc-im/jc-web-im/dist/api +``` + +Current PHP APIs: + +```text +contacts.php +update_alias.php +add_contact.php +send_message.php +messages.php +im_web_bootstrap.php +``` + +The PHP proxy exists because the browser must not directly carry the `im-server` admin secret. + +Admin config is in: + +```text +public/api/im_web_bootstrap.php +``` + +Current values: + +```php +const IM_ADMIN_URL = 'http://127.0.0.1:18080'; +const IM_ADMIN_SECRET = '123456'; +``` + +### Contact List API + +Endpoint: + +```text +POST /api/contacts.php +``` + +Payload: + +```json +{"userId":"当前登录用户ID"} +``` + +Current logic: + +1. Calls `im-server` admin `/admin/friend/list`. +2. Calls `/admin/user/batch_get_infos`. +3. Calls `/admin/friend/get_alias` for each friend. +4. Returns unique contacts with `uid`, `displayName`, `mobile`, `portrait`, `address`, `alias`. + +This was verified to be fast locally, around milliseconds rather than the old 8-10 seconds. + +### Remark / Alias Update API + +Endpoint: + +```text +POST /api/update_alias.php +``` + +Payload: + +```json +{"userId":"当前登录用户ID","targetId":"联系人ID","alias":"备注名"} +``` + +Current logic: + +1. Validates `userId`, `targetId`. +2. Allows empty alias to clear remark. +3. Limits alias to 32 UTF-8 characters. +4. Calls `im-server` admin `/admin/friend/set_alias`. + +Verified manually: + +- Setting alias to `测试备注` succeeded. +- `contacts.php` returned the new alias. +- Test alias was then cleared back to empty. + +## Frontend Changes Completed + +Files touched for contact details and alias editing: + +```text +src/config.js +src/services/httpImClient.js +src/stores/contacts.js +src/components/contacts/ContactPanel.vue +src/styles/base.css +public/api/update_alias.php +``` + +Important behavior now: + +- `contactsApi` defaults to `/api/contacts.php` in production. +- `updateAliasApi` defaults to `/api/update_alias.php` in production. +- `HttpImClient.getServerContactList()` maps `address` and `alias`. +- `HttpImClient.updateContactAlias()` posts to the PHP proxy. +- `contacts.updateContactAlias()` updates local contact state immediately after successful save. +- Contact detail display is: + - avatar / portrait + - remark name from `t_friend._alias`; if empty, show `未设置` + - username from `_display_name` + - mobile from `_mobile` + - address from `_address`; if empty, show `未知` +- A `✏️` button appears next to the remark name. Clicking it opens a modal to edit the remark. + +## Build / Deploy Status + +Last successful build: + +```bash +cd /var/www/jc-im/jc-web-im +npm run build +``` + +Build output included: + +```text +dist/js/app.28165923.js +dist/css/app.08b643a5.css +dist/api/update_alias.php +``` + +Build warnings were only webpack asset-size warnings for `chunk-vendors`, not functional errors. + +Syntax checks passed: + +```bash +php -l jc-web-im/public/api/update_alias.php +php -l jc-web-im/dist/api/update_alias.php +``` + +## Deployment Documentation + +Deployment doc has been added: + +```text +/var/www/jc-im/jc-web-im/WEB_DEPLOYMENT.md +``` + +README links to it: + +```text +/var/www/jc-im/jc-web-im/README.md +``` + +Key deployment note: + +- Production needs Nginx + PHP-FPM. +- PHP minimum recommended version: 7.4. +- PHP recommended versions: 8.1 / 8.2 / 8.3. +- Required PHP extensions: `curl`, `mbstring`. +- Nginx root should point to `/var/www/jc-im/jc-web-im/dist`. +- `18080` admin port should not be exposed publicly. + +## Known Current Test User Data + +Recent contact list test used: + +```text +current userId: 58f71e6245e145409e69b30216c6ebad +``` + +Contacts returned: + +```text +FireRobot +571356e9237c460698329c1653d6fd63 用户5050 183019202118 +55737875bf7a4d089102cbba03b1a8b8 用户8592 18301902118 +``` + +Both human contacts had empty alias after the manual test was restored. + +## Suggested Next Steps + +Good continuation points: + +1. Open the Web page on port `8023` and manually confirm the alias edit modal in the browser. +2. Check whether the contact header should also show the `✏️` edit control or only the profile card should show it. +3. Continue message send/sync polish if contact flow is accepted. +4. Consider optimizing `contacts.php` alias loading if a user has many friends, because it currently calls `get_alias` once per friend. + +## Do Not Forget + +- Do not modify `/opt/app-server` code. +- If changing PHP proxy admin secret or admin URL, update source under `public/api` and rebuild. +- If editing runtime config after build, check both `public/config/runtime-config.js` and `dist/config/runtime-config.js` depending on whether the change should survive future builds. +- The current workspace is `/var/www/jc-im`, not the old `/var/www/im-web`. diff --git a/WEB_DEPLOYMENT.md b/WEB_DEPLOYMENT.md new file mode 100644 index 0000000..fbf9a46 --- /dev/null +++ b/WEB_DEPLOYMENT.md @@ -0,0 +1,277 @@ +# Web 版部署说明 + +本文档说明 `jc-web-im` 的生产部署方式。当前 Web 版由两部分组成: + +- Vue 构建后的静态文件,部署到 Web 根目录。 +- `dist/api/*.php` PHP 代理接口,负责安全调用本机 `im-server` / `app-server` 相关接口。 + +浏览器不能直接携带 `im-server` admin secret 访问 `18080`,所以联系人列表、备注名修改、消息发送等功能通过 PHP 代理完成。 + +## 目录 + +```text +/var/www/jc-im/jc-web-im +├── public/api/ # PHP 代理源码,构建时复制到 dist/api +├── public/config/ # 运行时配置 +├── src/ # Vue 前端源码 +├── deploy/ # Nginx 示例配置 +└── dist/ # npm run build 后的生产目录 +``` + +生产环境建议让 Nginx 的 `root` 指向: + +```text +/var/www/jc-im/jc-web-im/dist +``` + +## 依赖 + +服务器需要安装: + +- Nginx +- PHP-FPM +- PHP 扩展:`curl`、`mbstring` +- Node.js / npm,仅构建时需要 + +PHP 版本: + +- 最低建议:PHP 7.4 +- 推荐:PHP 8.1 / 8.2 / 8.3 + +当前 PHP 代理代码使用 `curl_*`、`random_int`、`Throwable`、`mb_strlen` 等能力,部署前请确认 `curl` 和 `mbstring` 扩展可用。 + +## 后端服务要求 + +Web 版依赖以下服务正常运行: + +```text +app-server: http://127.0.0.1:18888 +im-server HTTP/API: http://127.0.0.1:18000 +im-server admin: http://127.0.0.1:18080 +``` + +`im-server admin` 的地址和密钥在: + +```text +public/api/im_web_bootstrap.php +``` + +默认配置: + +```php +const IM_ADMIN_URL = 'http://127.0.0.1:18080'; +const IM_ADMIN_SECRET = '123456'; +``` + +如果生产环境 admin 端口或 secret 不同,需要同步修改该文件后重新构建。 + +## 构建 + +在项目目录执行: + +```bash +cd /var/www/jc-im/jc-web-im +npm run build +``` + +构建完成后,生产文件位于: + +```text +/var/www/jc-im/jc-web-im/dist +``` + +## 运行时配置 + +运行时配置文件: + +```text +dist/config/runtime-config.js +``` + +示例: + +```js +window.JC_WEB_IM_CONFIG = { + appServer: 'http://your-domain:18888', + registerConfigApi: 'http://your-domain:8024/api/register-config', + imServerHost: 'your-domain', + imRoutePort: 18000, + useWss: false, + wsPath: '/ws', + sdkMode: 'custom-ws' +}; +``` + +常用字段说明: + +| 字段 | 说明 | +| --- | --- | +| `appServer` | Web 登录、验证码等 App Server 地址 | +| `registerConfigApi` | 注册配置接口地址 | +| `imServerHost` | IM HTTP/API 和 WebSocket 使用的主机名 | +| `imRoutePort` | IM route/API 端口,当前为 `18000` | +| `useWss` | 是否使用 WSS | +| `wsPath` | WebSocket 路径 | +| `sdkMode` | 当前使用 `custom-ws` | + +联系人相关 PHP 代理默认使用同源地址: + +```text +/api/contacts.php +/api/update_alias.php +/api/add_contact.php +/api/send_message.php +/api/messages.php +``` + +通常不需要在 `runtime-config.js` 里单独配置这些地址。 + +## Nginx 示例 + +根据实际 PHP-FPM socket 调整 `fastcgi_pass`,例如 PHP 8.3: + +```nginx +server { + listen 8023; + listen [::]:8023; + server_name your-domain _; + + root /var/www/jc-im/jc-web-im/dist; + index index.html; + client_max_body_size 100m; + + location = / { + try_files /index.html =404; + expires -1; + add_header Cache-Control "no-store"; + } + + location = /index.html { + expires -1; + add_header Cache-Control "no-store"; + } + + location = /config/runtime-config.js { + expires -1; + add_header Cache-Control "no-store"; + } + + location ~ ^/api/.+\.php$ { + include snippets/fastcgi-php.conf; + fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/jc-im/jc-web-im/dist/:/tmp/"; + fastcgi_pass unix:/run/php/php8.3-fpm.sock; + expires -1; + add_header Cache-Control "no-store"; + } + + location / { + etag on; + try_files $uri $uri/ /index.html; + expires 12h; + } +} +``` + +启用配置后检查并重载: + +```bash +sudo nginx -t +sudo systemctl reload nginx +``` + +## 防火墙建议 + +生产环境建议: + +- 对外开放 Web 端口,例如 `80` / `443` / `8023`。 +- `18888` 如需浏览器直接访问 app-server,需要对外开放。 +- `18000` 如 WebSocket/route 需要浏览器直连,需要对外开放。 +- `18080` admin 端口不要对公网开放,只允许本机 PHP 代理访问。 + +## 验证 + +检查 PHP 语法: + +```bash +php -l /var/www/jc-im/jc-web-im/dist/api/contacts.php +php -l /var/www/jc-im/jc-web-im/dist/api/update_alias.php +``` + +检查 Web 页面: + +```bash +curl -I http://127.0.0.1:8023/ +``` + +检查联系人接口: + +```bash +curl -s -H 'Content-Type: application/json' \ + --data '{"userId":"你的用户ID"}' \ + http://127.0.0.1:8023/api/contacts.php +``` + +成功时返回: + +```json +{ + "code": 0, + "message": "success", + "result": { + "contacts": [] + } +} +``` + +检查备注名修改接口: + +```bash +curl -s -H 'Content-Type: application/json' \ + --data '{"userId":"你的用户ID","targetId":"联系人ID","alias":"测试备注"}' \ + http://127.0.0.1:8023/api/update_alias.php +``` + +成功时返回: + +```json +{ + "code": 0, + "message": "success", + "result": { + "contact": { + "uid": "联系人ID", + "alias": "测试备注" + } + } +} +``` + +## 常见问题 + +### 页面能打开,但联系人加载失败 + +优先检查: + +- PHP-FPM 是否运行。 +- Nginx 的 PHP location 是否命中 `/api/*.php`。 +- `curl` 扩展是否启用。 +- `public/api/im_web_bootstrap.php` 中 `IM_ADMIN_URL` 和 `IM_ADMIN_SECRET` 是否匹配当前 `im-server`。 +- `im-server` 的 `18080` admin 接口是否在本机可访问。 + +### 修改备注名无效 + +检查: + +- `dist/api/update_alias.php` 是否存在。 +- Nginx 是否允许执行 `dist/api/*.php`。 +- `im-server` 是否提供 `/admin/friend/set_alias`。 +- 当前登录用户和目标联系人是否确实是好友关系。 + +### 部署后仍是旧前端 + +检查: + +- Nginx `root` 是否指向新的 `dist` 目录。 +- 是否执行过 `npm run build`。 +- 浏览器是否缓存了旧资源。`index.html` 和 `runtime-config.js` 应配置为 `no-store`。 + diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..916db64 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['@vue/cli-plugin-babel/preset'] +}; diff --git a/deploy/im-web-8023.nginx.conf b/deploy/im-web-8023.nginx.conf new file mode 100644 index 0000000..e9a544f --- /dev/null +++ b/deploy/im-web-8023.nginx.conf @@ -0,0 +1,33 @@ +server { + listen 8023; + listen [::]:8023; + server_name winchen.ezpay.asia 10.0.0.120 _; + + root /var/www/im-web; + index index.html; + client_max_body_size 100m; + + location = / { + try_files /index.html =404; + expires -1; + add_header Cache-Control "no-store"; + } + + location = /index.html { + expires -1; + add_header Cache-Control "no-store"; + } + + location ~ ^/api/.+\.php$ { + include snippets/fastcgi-php.conf; + fastcgi_param PHP_ADMIN_VALUE "open_basedir=/var/www/im-web/:/tmp/"; + fastcgi_pass unix:/run/php/php8.3-fpm.sock; + expires -1; + } + + location / { + etag on; + try_files $uri $uri/ /index.html; + expires 12h; + } +} diff --git a/dist/api/add_contact.php b/dist/api/add_contact.php new file mode 100644 index 0000000..6afd503 --- /dev/null +++ b/dist/api/add_contact.php @@ -0,0 +1,95 @@ + $uid, + 'name' => (string)($user['name'] ?? $uid), + 'displayName' => (string)($user['displayName'] ?? $user['name'] ?? $uid), + 'mobile' => (string)($user['mobile'] ?? ''), + 'portrait' => (string)($user['portrait'] ?? ''), + 'alias' => '', + ]; +} + +try { + $target = tryImUserInfo(['userId' => $keyword]); + if (!$target && preg_match('/^\+?\d{5,32}$/', $keyword)) { + $target = tryImUserInfo(['mobile' => $keyword]); + } + if (!$target) { + $target = tryImUserInfo(['name' => $keyword]); + } + + if (!$target) { + respond(404, '没有找到该用户'); + } + + $contact = normalizeUserInfo($target); + if ($contact['uid'] === '') { + respond(404, '没有找到该用户'); + } + if ($contact['uid'] === $userId) { + respond(400, '不能添加自己为联系人'); + } + + $friendResult = requireImSuccess( + imAdminPost('/admin/friend/list', ['userId' => $userId]), + '好友列表检查失败' + ); + $friendIds = array_values(array_filter($friendResult['list'] ?? [], 'is_string')); + if (in_array($contact['uid'], $friendIds, true)) { + respond(409, '该用户已经是联系人', ['contact' => $contact]); + } + + requireImSuccess( + imAdminPost('/admin/friend/status', [ + 'userId' => $userId, + 'friendUid' => $contact['uid'], + 'status' => 0, + ]), + '添加联系人失败' + ); + requireImSuccess( + imAdminPost('/admin/friend/status', [ + 'userId' => $contact['uid'], + 'friendUid' => $userId, + 'status' => 0, + ]), + '添加联系人失败' + ); + + respond(0, 'success', ['contact' => $contact, 'reason' => $reason]); +} catch (Throwable $error) { + respond(500, $error->getMessage() ?: '添加联系人服务暂不可用'); +} diff --git a/dist/api/contacts.php b/dist/api/contacts.php new file mode 100644 index 0000000..31cd0f1 --- /dev/null +++ b/dist/api/contacts.php @@ -0,0 +1,71 @@ + $userId]), + '联系人加载失败' + ); + $friendIds = array_values(array_unique(array_filter(array_map(static function ($uid): string { + return trim((string)$uid); + }, $friendResult['list'] ?? [])))); + if (!$friendIds) { + respond(0, 'success', ['contacts' => []]); + } + + $usersResult = requireImSuccess( + imAdminPost('/admin/user/batch_get_infos', ['list' => $friendIds]), + '联系人资料加载失败' + ); + try { + ensureWebImAppTables(); + $remarkMap = fetchWebUserRemarkMap(imAppDb(), $userId, $friendIds); + } catch (Throwable) { + $remarkMap = []; + } + + $contactsByUid = []; + foreach (array_values(array_filter($usersResult['userInfos'] ?? [], 'is_array')) as $user) { + $uid = (string)($user['userId'] ?? ''); + if ($uid === '' || isset($contactsByUid[$uid])) { + continue; + } + $alias = ''; + try { + $aliasResult = requireImSuccess( + imAdminPost('/admin/friend/get_alias', ['operator' => $userId, 'targetId' => $uid]), + '联系人备注加载失败' + ); + $alias = trim((string)($aliasResult['alias'] ?? '')); + } catch (Throwable $error) { + $alias = ''; + } + if ($alias === '') { + $alias = $remarkMap[$uid] ?? ''; + } + $contactsByUid[$uid] = [ + 'uid' => $uid, + 'name' => (string)($user['name'] ?? $uid), + 'displayName' => (string)($user['displayName'] ?? $user['name'] ?? $uid), + 'mobile' => (string)($user['mobile'] ?? ''), + 'portrait' => (string)($user['portrait'] ?? ''), + 'address' => (string)($user['address'] ?? ''), + 'alias' => $alias, + ]; + } + + respond(0, 'success', ['contacts' => array_values($contactsByUid)]); +} catch (Throwable $error) { + respond(500, $error->getMessage() ?: '联系人服务暂不可用'); +} diff --git a/dist/api/conversation_actions.php b/dist/api/conversation_actions.php new file mode 100644 index 0000000..c9679dd --- /dev/null +++ b/dist/api/conversation_actions.php @@ -0,0 +1,990 @@ +prepare( + 'select `_uid` from `t_user` where `_uid` = ? or `_mobile` = ? or `_name` = ? limit 1' + ); + $statement->execute([$value, $value, $value]); + $uid = $statement->fetchColumn(); + if (is_string($uid) && $uid !== '') { + $resolved[] = $uid; + } + } + + return array_values(array_unique($resolved)); +} + +function webGroupConversation(array $group, string $role = 'member'): array +{ + $name = (string)($group['name'] ?? $group['_name'] ?? $group['group_id'] ?? $group['_gid'] ?? ''); + $groupId = (string)($group['group_id'] ?? $group['_gid'] ?? ''); + $category = (string)($group['category'] ?? 'group'); + $title = $name !== '' ? $name : $groupId; + $updatedAt = (int)($group['updated_at_ms'] ?? $group['_dt'] ?? webImNowMs()); + + return [ + 'id' => 'group-' . $groupId, + 'type' => $category === 'channel' ? 'channel' : 'group', + 'target' => $groupId, + 'title' => $title, + 'subtitle' => $category === 'channel' ? '公告群' : '群组', + 'unread' => 0, + 'avatarText' => mb_strtoupper(mb_substr($title, 0, 1, 'UTF-8'), 'UTF-8'), + 'updatedAt' => $updatedAt, + 'role' => $role, + 'raw' => [ + 'type' => 'group', + 'target' => $groupId, + 'line' => 0, + 'category' => $category, + 'role' => $role, + ], + ]; +} + +function fetchWebGroup(PDO $db, string $groupKey): ?array +{ + $statement = $db->prepare( + 'select * from `t_web_groups`' + . ' where `deleted` = 0 and (`group_id` = ? or `name` = ?)' + . ' order by (`group_id` = ?) desc limit 1' + ); + $statement->execute([$groupKey, $groupKey, $groupKey]); + $group = $statement->fetch(); + + return is_array($group) ? $group : null; +} + +function fetchWebGroupRole(PDO $db, string $groupId, string $userId): string +{ + $statement = $db->prepare( + 'select `role` from `t_web_group_members`' + . ' where `group_id` = ? and `user_id` = ? and `status` = 0 limit 1' + ); + $statement->execute([$groupId, $userId]); + $role = $statement->fetchColumn(); + + return is_string($role) && $role !== '' ? $role : 'member'; +} + +function fetchWebGroupMember(PDO $db, string $groupId, string $userId): array +{ + $statement = $db->prepare( + 'select * from `t_web_group_members`' + . ' where `group_id` = ? and `user_id` = ? and `status` = 0 limit 1' + ); + $statement->execute([$groupId, $userId]); + $member = $statement->fetch(); + + return is_array($member) ? $member : []; +} + +function requireWebGroupMember(PDO $db, string $groupId, string $userId): array +{ + $member = fetchWebGroupMember($db, $groupId, $userId); + if (!$member) { + respond(403, '你不在该群组中'); + } + + return $member; +} + +function requireWebGroupRole(PDO $db, string $groupId, string $userId, array $roles): array +{ + $member = requireWebGroupMember($db, $groupId, $userId); + if (!in_array((string)$member['role'], $roles, true)) { + respond(403, '没有群组管理权限'); + } + + return $member; +} + +function upsertWebGroupMember(PDO $db, string $groupId, string $userId, string $role): void +{ + $now = webImNowMs(); + $statement = $db->prepare( + 'insert into `t_web_group_members`' + . ' (`group_id`, `user_id`, `role`, `joined_at_ms`, `updated_at_ms`, `status`)' + . ' values (?, ?, ?, ?, ?, 0)' + . ' on duplicate key update' + . ' `role` = if(`role` = "owner", `role`, values(`role`)),' + . ' `updated_at_ms` = values(`updated_at_ms`),' + . ' `status` = 0' + ); + $statement->execute([$groupId, $userId, $role, $now, $now]); +} + +function createNativeGroup(string $operator, string $groupId, string $name, string $category, array $members): array +{ + $nativeMembers = []; + foreach ($members as $memberId) { + $nativeMembers[] = [ + 'member_id' => $memberId, + 'type' => $memberId === $operator ? 2 : 0, + ]; + } + + return requireImSuccess(imAdminPost('/admin/group/create', [ + 'operator' => $operator, + 'group' => [ + 'group_info' => [ + 'target_id' => $groupId, + 'name' => $name, + 'owner' => $operator, + 'type' => 0, + 'mute' => $category === 'channel' ? 1 : 0, + 'join_type' => 0, + 'searchable' => 1, + 'history_message' => 1, + 'extra' => json_encode(['webCategory' => $category], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), + ], + 'members' => $nativeMembers, + ], + 'to_lines' => [0], + ]), '原生群组创建失败'); +} + +function addNativeGroupMember(string $operator, string $groupId, string $userId): void +{ + requireImSuccess(imAdminPost('/admin/group/member/add', [ + 'operator' => $operator, + 'group_id' => $groupId, + 'members' => [ + ['member_id' => $userId, 'type' => 0], + ], + 'to_lines' => [0], + ]), '加入原生群组失败'); +} + +function removeNativeGroupMember(string $operator, string $groupId, array $userIds): void +{ + if (!$userIds) { + return; + } + + requireImSuccess(imAdminPost('/admin/group/member/del', [ + 'operator' => $operator, + 'group_id' => $groupId, + 'members' => array_values($userIds), + 'to_lines' => [0], + ]), '移除原生成员失败'); +} + +function dismissNativeGroup(string $operator, string $groupId): void +{ + requireImSuccess(imAdminPost('/admin/group/del', [ + 'operator' => $operator, + 'group_id' => $groupId, + 'to_lines' => [0], + ]), '解散原生群组失败'); +} + +function transferNativeGroup(string $operator, string $groupId, string $newOwner): void +{ + requireImSuccess(imAdminPost('/admin/group/transfer', [ + 'operator' => $operator, + 'group_id' => $groupId, + 'new_owner' => $newOwner, + 'to_lines' => [0], + ]), '转让原生群组失败'); +} + +function sendWebGroupWelcomeMessage(PDO $appDb, string $groupId, string $senderId, string $welcomeText): void +{ + $text = trim($welcomeText); + if ($text === '') { + return; + } + + $now = webImNowMs(); + $messageUid = webImMessageUid(); + $statement = $appDb->prepare( + 'insert into `t_web_group_messages`' + . ' (`message_uid`, `group_id`, `sender_uid`, `text`, `created_at_ms`, `edited_at_ms`, `recalled`)' + . ' values (?, ?, ?, ?, ?, 0, 0)' + ); + $statement->execute([$messageUid, $groupId, $senderId, $text, $now]); + $update = $appDb->prepare('update `t_web_groups` set `updated_at_ms` = ? where `group_id` = ?'); + $update->execute([$now, $groupId]); + + try { + requireImSuccess(imAdminPost('/admin/message/send', [ + 'sender' => $senderId, + 'conv' => [ + 'type' => 1, + 'target' => $groupId, + 'line' => 0, + ], + 'payload' => [ + 'type' => 1, + 'searchableContent' => $text, + 'pushContent' => $text, + 'content' => $text, + 'persistFlag' => 3, + ], + 'userMessage' => true, + ]), '欢迎词发送失败'); + } catch (Throwable) { + } +} + +function createWebGroupAction(PDO $imDb, PDO $appDb, string $userId, array $payload, string $category): array +{ + $name = trim((string)($payload['name'] ?? '')); + $announcement = trim((string)($payload['announcement'] ?? '')); + $welcomeText = trim((string)($payload['welcomeText'] ?? '')); + if ($name === '') { + respond(400, $category === 'channel' ? '请输入公告群名称' : '请输入群组名称'); + } + + $memberIds = resolveWebUserIds($imDb, webActionList($payload['memberIds'] ?? [])); + $memberIds[] = $userId; + $memberIds = array_values(array_unique(array_filter($memberIds))); + if ($category === 'group' && count($memberIds) < 2) { + respond(400, '请选择至少一位联系人'); + } + + $groupId = 'webg_' . bin2hex(random_bytes(8)); + $now = webImNowMs(); + $nativeStatus = 'pending'; + $nativeGroupId = ''; + $nativeError = ''; + + try { + $nativeResult = createNativeGroup($userId, $groupId, $name, $category, $memberIds); + $nativeGroupId = (string)($nativeResult['group_id'] ?? $nativeResult['groupId'] ?? $groupId); + $nativeStatus = 'ok'; + } catch (Throwable $error) { + $nativeStatus = 'fallback'; + $nativeError = mb_substr($error->getMessage() ?: '原生群组创建失败', 0, 255, 'UTF-8'); + } + + $statement = $appDb->prepare( + 'insert into `t_web_groups`' + . ' (`group_id`, `category`, `name`, `portrait`, `owner_uid`, `join_mode`, `announcement`,' + . ' `welcome_text`, `native_group_id`, `native_status`, `native_error`, `created_by`, `created_at_ms`, `updated_at_ms`, `deleted`)' + . ' values (?, ?, ?, "", ?, "open", ?, ?, ?, ?, ?, ?, ?, ?, 0)' + ); + $statement->execute([ + $groupId, + $category, + $name, + $userId, + $announcement, + $welcomeText, + $nativeGroupId, + $nativeStatus, + $nativeError, + $userId, + $now, + $now, + ]); + + foreach ($memberIds as $memberId) { + upsertWebGroupMember($appDb, $groupId, $memberId, $memberId === $userId ? 'owner' : 'member'); + } + sendWebGroupWelcomeMessage($appDb, $groupId, $userId, $welcomeText); + + $group = fetchWebGroup($appDb, $groupId); + return [ + 'group' => $group, + 'conversation' => webGroupConversation($group ?: [ + 'group_id' => $groupId, + 'category' => $category, + 'name' => $name, + 'updated_at_ms' => $now, + ], 'owner'), + 'nativeStatus' => $nativeStatus, + 'nativeError' => $nativeError, + ]; +} + +function fetchWebUserMap(PDO $imDb, array $userIds, string $ownerId = ''): array +{ + $userIds = webActionList($userIds); + if (!$userIds) { + return []; + } + + $statement = $imDb->prepare( + 'select `_uid`, `_name`, `_display_name`, `_mobile`, `_portrait` from `t_user`' + . ' where `_uid` in (' . appPlaceholders($userIds) . ')' + ); + $statement->execute($userIds); + + $users = []; + foreach ($statement->fetchAll() as $row) { + $uid = (string)$row['_uid']; + $displayName = trim((string)($row['_display_name'] ?? '')) + ?: trim((string)($row['_name'] ?? '')) + ?: trim((string)($row['_mobile'] ?? '')) + ?: $uid; + $users[$uid] = [ + 'uid' => $uid, + 'name' => (string)($row['_name'] ?? ''), + 'displayName' => $displayName, + 'mobile' => (string)($row['_mobile'] ?? ''), + 'portrait' => (string)($row['_portrait'] ?? ''), + 'contactAlias' => '', + 'friendAlias' => '', + 'remarkAlias' => '', + 'isContact' => false, + ]; + } + + if ($ownerId !== '') { + $aliasStatement = $imDb->prepare( + 'select `_friend_uid`, `_alias` from `t_friend` where `_uid` = ?' + . ' and `_friend_uid` in (' . appPlaceholders($userIds) . ')' + ); + $aliasStatement->execute(array_merge([$ownerId], $userIds)); + foreach ($aliasStatement->fetchAll() as $row) { + $friendUid = (string)$row['_friend_uid']; + if (!isset($users[$friendUid])) { + continue; + } + $users[$friendUid]['isContact'] = true; + $users[$friendUid]['friendAlias'] = trim((string)($row['_alias'] ?? '')); + } + + $remarkMap = fetchWebUserRemarkMap(imAppDb(), $ownerId, $userIds); + foreach ($remarkMap as $targetUid => $alias) { + if (!isset($users[$targetUid])) { + continue; + } + $users[$targetUid]['remarkAlias'] = $alias; + } + + foreach ($users as $uid => $user) { + $friendAlias = trim((string)($user['friendAlias'] ?? '')); + $remarkAlias = trim((string)($user['remarkAlias'] ?? '')); + $users[$uid]['contactAlias'] = $friendAlias !== '' ? $friendAlias : $remarkAlias; + } + } + + return $users; +} + +function currentMuteSetting(PDO $appDb, string $groupId): array +{ + $statement = $appDb->prepare('select * from `t_web_group_mute_rules` where `group_id` = ? limit 1'); + $statement->execute([$groupId]); + $row = $statement->fetch(); + if (!is_array($row)) { + return [ + 'mode' => 'off', + 'scheduleType' => 'once', + 'startsAtMs' => 0, + 'endsAtMs' => 0, + 'dailyStart' => '', + 'dailyEnd' => '', + 'enabled' => false, + ]; + } + + return [ + 'mode' => (string)$row['mode'], + 'scheduleType' => (string)$row['schedule_type'], + 'startsAtMs' => (int)$row['starts_at_ms'], + 'endsAtMs' => (int)$row['ends_at_ms'], + 'dailyStart' => (string)$row['daily_start'], + 'dailyEnd' => (string)$row['daily_end'], + 'enabled' => (bool)$row['enabled'], + ]; +} + +function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array +{ + $group = fetchWebGroup($appDb, $groupId); + if (!$group) { + respond(404, '没有找到该群组'); + } + $member = fetchWebGroupMember($appDb, $groupId, $userId); + if (!$member) { + respond(403, '你不在该群组中'); + } + + $ownerId = (string)$group['owner_uid']; + $users = fetchWebUserMap($imDb, [$ownerId, $userId], $userId); + $owner = $users[$ownerId] ?? ['uid' => $ownerId, 'displayName' => $ownerId, 'contactAlias' => '']; + $me = $users[$userId] ?? ['uid' => $userId, 'displayName' => $userId]; + $myAlias = (string)($member['alias'] ?? ''); + + return [ + 'group' => [ + 'groupId' => (string)$group['group_id'], + 'name' => (string)$group['name'], + 'category' => (string)$group['category'], + 'announcement' => (string)($group['announcement'] ?? ''), + 'welcomeText' => (string)($group['welcome_text'] ?? ''), + 'ownerUid' => $ownerId, + 'ownerName' => (string)($owner['contactAlias'] ?? '') !== '' ? (string)$owner['contactAlias'] : (string)$owner['displayName'], + 'myRole' => (string)$member['role'], + 'myAlias' => $myAlias, + 'myDisplayName' => $myAlias !== '' ? $myAlias : (string)$me['displayName'], + 'muteSetting' => currentMuteSetting($appDb, (string)$group['group_id']), + ], + ]; +} + +function groupMembersAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array +{ + if (!fetchWebGroupMember($appDb, $groupId, $userId)) { + respond(403, '你不在该群组中'); + } + + $statement = $appDb->prepare( + 'select `user_id`, `role`, `alias`, `joined_at_ms` from `t_web_group_members`' + . ' where `group_id` = ? and `status` = 0 order by (`role` = "owner") desc, `joined_at_ms` asc' + ); + $statement->execute([$groupId]); + $members = $statement->fetchAll(); + $users = fetchWebUserMap($imDb, array_column($members, 'user_id'), $userId); + + return [ + 'members' => array_map(static function (array $member) use ($users): array { + $uid = (string)$member['user_id']; + $user = $users[$uid] ?? [ + 'uid' => $uid, + 'displayName' => $uid, + 'mobile' => '', + 'portrait' => '', + 'contactAlias' => '', + 'friendAlias' => '', + 'remarkAlias' => '', + 'isContact' => false, + ]; + $alias = trim((string)($member['alias'] ?? '')); + $contactAlias = trim((string)($user['contactAlias'] ?? '')); + return [ + 'uid' => $uid, + 'role' => (string)$member['role'], + 'alias' => $alias, + 'contactAlias' => $contactAlias, + 'friendAlias' => trim((string)($user['friendAlias'] ?? '')), + 'remarkAlias' => trim((string)($user['remarkAlias'] ?? '')), + 'isContact' => (bool)($user['isContact'] ?? false), + 'displayName' => $contactAlias !== '' ? $contactAlias : ($alias !== '' ? $alias : (string)$user['displayName']), + 'rawDisplayName' => (string)$user['displayName'], + 'groupDisplayName' => $alias, + 'mobile' => (string)($user['mobile'] ?? ''), + 'portrait' => (string)($user['portrait'] ?? ''), + ]; + }, $members), + ]; +} + +function updateGroupAliasAction(PDO $appDb, string $userId, string $groupId, string $alias): array +{ + if (mb_strlen($alias, 'UTF-8') > 64) { + respond(400, '本群昵称过长'); + } + if (!fetchWebGroupMember($appDb, $groupId, $userId)) { + respond(403, '你不在该群组中'); + } + + $now = webImNowMs(); + $statement = $appDb->prepare( + 'update `t_web_group_members` set `alias` = ?, `updated_at_ms` = ?' + . ' where `group_id` = ? and `user_id` = ? and `status` = 0' + ); + $statement->execute([$alias, $now, $groupId, $userId]); + + return ['alias' => $alias]; +} + +function leaveGroupAction(PDO $appDb, string $userId, string $groupId): array +{ + $group = fetchWebGroup($appDb, $groupId); + if (!$group) { + respond(404, '没有找到该群组'); + } + $member = fetchWebGroupMember($appDb, $groupId, $userId); + if (!$member) { + respond(403, '你不在该群组中'); + } + + $now = webImNowMs(); + $statement = $appDb->prepare( + 'update `t_web_group_members` set `status` = 1, `updated_at_ms` = ?' + . ' where `group_id` = ? and `user_id` = ?' + ); + $statement->execute([$now, $groupId, $userId]); + $groupUpdate = $appDb->prepare('update `t_web_groups` set `updated_at_ms` = ? where `group_id` = ?'); + $groupUpdate->execute([$now, $groupId]); + + try { + requireImSuccess(imAdminPost('/admin/group/member/quit', [ + 'operator' => $userId, + 'group_id' => $groupId, + 'to_lines' => [0], + ]), '退出原生群组失败'); + } catch (Throwable) { + } + + return ['groupId' => $groupId]; +} + +function dismissGroupAction(PDO $appDb, string $userId, string $groupId): array +{ + $group = fetchWebGroup($appDb, $groupId); + if (!$group) { + respond(404, '没有找到该群组'); + } + requireWebGroupRole($appDb, $groupId, $userId, ['owner']); + + $now = webImNowMs(); + $update = $appDb->prepare('update `t_web_groups` set `deleted` = 1, `updated_at_ms` = ? where `group_id` = ?'); + $update->execute([$now, $groupId]); + $memberUpdate = $appDb->prepare('update `t_web_group_members` set `status` = 1, `updated_at_ms` = ? where `group_id` = ?'); + $memberUpdate->execute([$now, $groupId]); + + try { + dismissNativeGroup($userId, $groupId); + } catch (Throwable) { + } + + return ['groupId' => $groupId]; +} + +function transferGroupAction(PDO $appDb, string $userId, string $groupId, string $targetUserId): array +{ + if ($targetUserId === '' || $targetUserId === $userId) { + respond(400, '请选择新的群主'); + } + $group = fetchWebGroup($appDb, $groupId); + if (!$group) { + respond(404, '没有找到该群组'); + } + requireWebGroupRole($appDb, $groupId, $userId, ['owner']); + $target = requireWebGroupMember($appDb, $groupId, $targetUserId); + if ((string)$target['role'] === 'owner') { + respond(400, '该成员已经是群主'); + } + + $now = webImNowMs(); + $appDb->beginTransaction(); + try { + $groupUpdate = $appDb->prepare('update `t_web_groups` set `owner_uid` = ?, `updated_at_ms` = ? where `group_id` = ?'); + $groupUpdate->execute([$targetUserId, $now, $groupId]); + $oldOwnerUpdate = $appDb->prepare( + 'update `t_web_group_members` set `role` = "member", `updated_at_ms` = ?' + . ' where `group_id` = ? and `user_id` = ?' + ); + $oldOwnerUpdate->execute([$now, $groupId, $userId]); + $newOwnerUpdate = $appDb->prepare( + 'update `t_web_group_members` set `role` = "owner", `updated_at_ms` = ?' + . ' where `group_id` = ? and `user_id` = ?' + ); + $newOwnerUpdate->execute([$now, $groupId, $targetUserId]); + $appDb->commit(); + } catch (Throwable $error) { + $appDb->rollBack(); + throw $error; + } + + try { + transferNativeGroup($userId, $groupId, $targetUserId); + } catch (Throwable) { + } + + return ['groupId' => $groupId, 'newOwner' => $targetUserId]; +} + +function setGroupAdminsAction(PDO $appDb, string $userId, string $groupId, array $adminIds): array +{ + requireWebGroupRole($appDb, $groupId, $userId, ['owner']); + $adminIds = array_values(array_unique(array_filter(array_map('strval', $adminIds), static fn(string $uid): bool => $uid !== $userId))); + $now = webImNowMs(); + + $reset = $appDb->prepare( + 'update `t_web_group_members` set `role` = "member", `updated_at_ms` = ?' + . ' where `group_id` = ? and `role` = "admin" and `status` = 0' + ); + $reset->execute([$now, $groupId]); + + if ($adminIds) { + $update = $appDb->prepare( + 'update `t_web_group_members` set `role` = "admin", `updated_at_ms` = ?' + . ' where `group_id` = ? and `user_id` in (' . appPlaceholders($adminIds) . ')' + . ' and `role` <> "owner" and `status` = 0' + ); + $update->execute(array_merge([$now, $groupId], $adminIds)); + } + + return ['adminIds' => $adminIds]; +} + +function updateGroupProfileAction(PDO $appDb, string $userId, string $groupId, array $payload): array +{ + requireWebGroupRole($appDb, $groupId, $userId, ['owner', 'admin']); + $name = trim((string)($payload['name'] ?? '')); + $announcement = trim((string)($payload['announcement'] ?? '')); + $welcomeText = trim((string)($payload['welcomeText'] ?? '')); + if ($name === '') { + respond(400, '请输入群名称'); + } + if (mb_strlen($name, 'UTF-8') > 128) { + respond(400, '群名称过长'); + } + + $now = webImNowMs(); + $statement = $appDb->prepare( + 'update `t_web_groups` set `name` = ?, `announcement` = ?, `welcome_text` = ?, `updated_at_ms` = ?' + . ' where `group_id` = ? and `deleted` = 0' + ); + $statement->execute([$name, $announcement, $welcomeText, $now, $groupId]); + + return [ + 'groupId' => $groupId, + 'name' => $name, + 'announcement' => $announcement, + 'welcomeText' => $welcomeText, + 'updatedAt' => $now, + ]; +} + +function kickGroupMembersAction(PDO $appDb, string $userId, string $groupId, array $targetIds): array +{ + $operator = requireWebGroupRole($appDb, $groupId, $userId, ['owner', 'admin']); + $operatorRole = (string)$operator['role']; + $targetIds = array_values(array_unique(array_filter(array_map('strval', $targetIds), static fn(string $uid): bool => $uid !== ''))); + $targetIds = array_values(array_filter($targetIds, static fn(string $uid): bool => $uid !== $userId)); + if (!$targetIds) { + respond(400, '请选择要移除的群员'); + } + + $statement = $appDb->prepare( + 'select `user_id`, `role` from `t_web_group_members`' + . ' where `group_id` = ? and `user_id` in (' . appPlaceholders($targetIds) . ') and `status` = 0' + ); + $statement->execute(array_merge([$groupId], $targetIds)); + $targets = $statement->fetchAll(); + if (!$targets) { + respond(400, '没有可移除的群员'); + } + + $allowedIds = []; + foreach ($targets as $target) { + $role = (string)$target['role']; + if ($role === 'owner') { + continue; + } + if ($operatorRole === 'admin' && $role !== 'member') { + continue; + } + $allowedIds[] = (string)$target['user_id']; + } + if (!$allowedIds) { + respond(403, '没有可移除的群员'); + } + + $now = webImNowMs(); + $update = $appDb->prepare( + 'update `t_web_group_members` set `status` = 2, `updated_at_ms` = ?' + . ' where `group_id` = ? and `user_id` in (' . appPlaceholders($allowedIds) . ')' + ); + $update->execute(array_merge([$now, $groupId], $allowedIds)); + + try { + removeNativeGroupMember($userId, $groupId, $allowedIds); + } catch (Throwable) { + } + + return ['removedIds' => $allowedIds]; +} + +function updateMuteSettingAction(PDO $appDb, string $userId, string $groupId, array $payload): array +{ + requireWebGroupRole($appDb, $groupId, $userId, ['owner', 'admin']); + $mode = trim((string)($payload['mode'] ?? 'off')); + $allowedModes = ['off', 'all_include_admins', 'all_except_admins']; + if (!in_array($mode, $allowedModes, true)) { + respond(400, '禁言模式不正确'); + } + $scheduleType = trim((string)($payload['scheduleType'] ?? 'once')); + if (!in_array($scheduleType, ['manual', 'once', 'daily'], true)) { + respond(400, '禁言时段类型不正确'); + } + + $startsAtMs = max(0, (int)($payload['startsAtMs'] ?? 0)); + $endsAtMs = max(0, (int)($payload['endsAtMs'] ?? 0)); + $dailyStart = trim((string)($payload['dailyStart'] ?? '')); + $dailyEnd = trim((string)($payload['dailyEnd'] ?? '')); + $enabled = $mode !== 'off'; + if ($enabled && $scheduleType === 'once' && ($startsAtMs <= 0 || $endsAtMs <= $startsAtMs)) { + respond(400, '请设置有效的单次禁言时段'); + } + if ($enabled && $scheduleType === 'daily' && (!preg_match('/^\d{2}:\d{2}$/', $dailyStart) || !preg_match('/^\d{2}:\d{2}$/', $dailyEnd))) { + respond(400, '请设置有效的每日禁言时段'); + } + + $now = webImNowMs(); + $statement = $appDb->prepare( + 'insert into `t_web_group_mute_rules`' + . ' (`group_id`, `mode`, `schedule_type`, `starts_at_ms`, `ends_at_ms`, `daily_start`, `daily_end`, `enabled`, `created_by`, `updated_at_ms`)' + . ' values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' + . ' on duplicate key update' + . ' `mode` = values(`mode`),' + . ' `schedule_type` = values(`schedule_type`),' + . ' `starts_at_ms` = values(`starts_at_ms`),' + . ' `ends_at_ms` = values(`ends_at_ms`),' + . ' `daily_start` = values(`daily_start`),' + . ' `daily_end` = values(`daily_end`),' + . ' `enabled` = values(`enabled`),' + . ' `created_by` = values(`created_by`),' + . ' `updated_at_ms` = values(`updated_at_ms`)' + ); + $statement->execute([$groupId, $mode, $scheduleType, $startsAtMs, $endsAtMs, $dailyStart, $dailyEnd, $enabled ? 1 : 0, $userId, $now]); + + return ['muteSetting' => currentMuteSetting($appDb, $groupId)]; +} + +function joinWebGroupAction(PDO $appDb, string $userId, string $groupKey): array +{ + if ($groupKey === '') { + respond(400, '请输入群组ID或群名称'); + } + + $group = fetchWebGroup($appDb, $groupKey); + if (!$group) { + try { + $native = requireImSuccess(imAdminPost('/admin/group/get_info', ['groupId' => $groupKey]), '群组不存在'); + $now = webImNowMs(); + $statement = $appDb->prepare( + 'insert into `t_web_groups`' + . ' (`group_id`, `category`, `name`, `portrait`, `owner_uid`, `join_mode`, `announcement`,' + . ' `native_group_id`, `native_status`, `created_by`, `created_at_ms`, `updated_at_ms`, `deleted`)' + . ' values (?, "group", ?, ?, ?, "open", "", ?, "ok", ?, ?, ?, 0)' + . ' on duplicate key update `updated_at_ms` = values(`updated_at_ms`)' + ); + $statement->execute([ + $groupKey, + (string)($native['name'] ?? $groupKey), + (string)($native['portrait'] ?? ''), + (string)($native['owner'] ?? ''), + $groupKey, + $userId, + $now, + $now, + ]); + $group = fetchWebGroup($appDb, $groupKey); + } catch (Throwable) { + respond(404, '没有找到该群组'); + } + } + + $groupId = (string)$group['group_id']; + upsertWebGroupMember($appDb, $groupId, $userId, 'member'); + try { + addNativeGroupMember((string)($group['owner_uid'] ?: $userId), $groupId, $userId); + } catch (Throwable $error) { + // Web membership is authoritative for this web build; native group sync is best-effort. + } + + $role = fetchWebGroupRole($appDb, $groupId, $userId); + return [ + 'group' => fetchWebGroup($appDb, $groupId), + 'conversation' => webGroupConversation($group, $role), + ]; +} + +function sendBroadcastAction(PDO $imDb, PDO $appDb, string $userId, array $payload): array +{ + $text = trim((string)($payload['text'] ?? '')); + if ($text === '') { + respond(400, '请输入群发内容'); + } + + $targetIds = resolveWebUserIds($imDb, webActionList($payload['targetIds'] ?? [])); + $targetIds = array_values(array_filter(array_unique($targetIds), static fn(string $uid): bool => $uid !== $userId)); + if (!$targetIds) { + respond(400, '请选择群发对象'); + } + + $results = []; + foreach ($targetIds as $targetId) { + try { + $result = requireImSuccess(imAdminPost('/admin/message/send', [ + 'sender' => $userId, + 'conv' => [ + 'type' => 0, + 'target' => $targetId, + 'line' => 0, + ], + 'payload' => [ + 'type' => 1, + 'searchableContent' => $text, + 'pushContent' => $text, + 'content' => $text, + 'persistFlag' => 3, + ], + 'userMessage' => true, + ]), '发送失败'); + $results[] = [ + 'targetId' => $targetId, + 'ok' => true, + 'messageUid' => isset($result['messageUid']) ? (string)$result['messageUid'] : '', + ]; + } catch (Throwable $error) { + $results[] = [ + 'targetId' => $targetId, + 'ok' => false, + 'error' => $error->getMessage() ?: '发送失败', + ]; + } + } + + $successCount = count(array_filter($results, static fn(array $item): bool => !empty($item['ok']))); + $failedCount = count($results) - $successCount; + $now = webImNowMs(); + $statement = $appDb->prepare( + 'insert into `t_web_broadcast_logs`' + . ' (`sender_uid`, `target_count`, `success_count`, `failed_count`, `text`, `target_json`, `result_json`, `created_at_ms`)' + . ' values (?, ?, ?, ?, ?, ?, ?, ?)' + ); + $statement->execute([ + $userId, + count($targetIds), + $successCount, + $failedCount, + $text, + json_encode($targetIds, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), + json_encode($results, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), + $now, + ]); + + return [ + 'targetCount' => count($targetIds), + 'successCount' => $successCount, + 'failedCount' => $failedCount, + 'results' => $results, + ]; +} + +$payload = readJsonPayload(); +$action = trim((string)($payload['action'] ?? '')); +$userId = trim((string)($payload['userId'] ?? '')); + +if ($userId === '') { + respond(400, '缺少当前用户ID'); +} + +try { + ensureWebImAppTables(); + $imDb = imDb(); + $appDb = imAppDb(); + + if ($action === 'create_group') { + respond(0, 'success', createWebGroupAction($imDb, $appDb, $userId, $payload, 'group')); + } + if ($action === 'create_channel') { + respond(0, 'success', createWebGroupAction($imDb, $appDb, $userId, $payload, 'channel')); + } + if ($action === 'join_group') { + respond(0, 'success', joinWebGroupAction($appDb, $userId, trim((string)($payload['groupKey'] ?? '')))); + } + if ($action === 'group_detail') { + respond(0, 'success', groupDetailAction($imDb, $appDb, $userId, trim((string)($payload['groupId'] ?? '')))); + } + if ($action === 'group_members') { + respond(0, 'success', groupMembersAction($imDb, $appDb, $userId, trim((string)($payload['groupId'] ?? '')))); + } + if ($action === 'update_group_alias') { + respond(0, 'success', updateGroupAliasAction( + $appDb, + $userId, + trim((string)($payload['groupId'] ?? '')), + trim((string)($payload['alias'] ?? '')) + )); + } + if ($action === 'leave_group') { + respond(0, 'success', leaveGroupAction($appDb, $userId, trim((string)($payload['groupId'] ?? '')))); + } + if ($action === 'dismiss_group') { + respond(0, 'success', dismissGroupAction($appDb, $userId, trim((string)($payload['groupId'] ?? '')))); + } + if ($action === 'transfer_group') { + respond(0, 'success', transferGroupAction( + $appDb, + $userId, + trim((string)($payload['groupId'] ?? '')), + trim((string)($payload['targetUserId'] ?? '')) + )); + } + if ($action === 'set_group_admins') { + respond(0, 'success', setGroupAdminsAction( + $appDb, + $userId, + trim((string)($payload['groupId'] ?? '')), + is_array($payload['adminIds'] ?? null) ? $payload['adminIds'] : [] + )); + } + if ($action === 'update_group_profile') { + respond(0, 'success', updateGroupProfileAction( + $appDb, + $userId, + trim((string)($payload['groupId'] ?? '')), + $payload + )); + } + if ($action === 'kick_group_members') { + respond(0, 'success', kickGroupMembersAction( + $appDb, + $userId, + trim((string)($payload['groupId'] ?? '')), + is_array($payload['targetIds'] ?? null) ? $payload['targetIds'] : [] + )); + } + if ($action === 'update_mute_setting') { + respond(0, 'success', updateMuteSettingAction( + $appDb, + $userId, + trim((string)($payload['groupId'] ?? '')), + $payload + )); + } + if ($action === 'broadcast') { + $result = sendBroadcastAction($imDb, $appDb, $userId, $payload); + if ((int)$result['successCount'] <= 0) { + respond(500, '群发失败', $result); + } + respond(0, 'success', $result); + } + + respond(400, '未知操作'); +} catch (Throwable $error) { + respond(500, $error->getMessage() ?: '会话操作失败'); +} diff --git a/dist/api/im_web_bootstrap.php b/dist/api/im_web_bootstrap.php new file mode 100644 index 0000000..e76c090 --- /dev/null +++ b/dist/api/im_web_bootstrap.php @@ -0,0 +1,348 @@ + $code, + 'message' => $message, + 'result' => $result, + ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + exit; +} + +function readJsonPayload(): array +{ + $payload = json_decode(file_get_contents('php://input') ?: '[]', true); + return is_array($payload) ? $payload : []; +} + +function imAdminPost(string $path, array $payload): array +{ + $nonce = (string)random_int(1, 1000000); + $timestamp = (string)((int)floor(microtime(true) * 1000)); + $sign = sha1($nonce . '|' . IM_ADMIN_SECRET . '|' . $timestamp); + $body = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + + $curl = curl_init(IM_ADMIN_URL . $path); + if ($curl === false) { + throw new RuntimeException('IM admin client init failed'); + } + + curl_setopt_array($curl, [ + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => $body, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_0, + CURLOPT_CONNECTTIMEOUT_MS => 1000, + CURLOPT_TIMEOUT_MS => 4000, + CURLOPT_FRESH_CONNECT => true, + CURLOPT_FORBID_REUSE => true, + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json; charset=utf-8', + 'Connection: close', + 'nonce: ' . $nonce, + 'timestamp: ' . $timestamp, + 'sign: ' . $sign, + ], + ]); + + $responseBody = curl_exec($curl); + $curlError = curl_error($curl); + curl_close($curl); + + if ($responseBody === false || $responseBody === '') { + throw new RuntimeException($curlError ?: 'IM admin request failed'); + } + + $data = json_decode($responseBody, true); + if (!is_array($data)) { + throw new RuntimeException('Invalid IM admin response'); + } + + return $data; +} + +function requireImSuccess(array $response, string $fallbackMessage): array +{ + if (($response['code'] ?? -1) !== 0) { + throw new RuntimeException((string)($response['msg'] ?? $response['message'] ?? $fallbackMessage)); + } + + return is_array($response['result'] ?? null) ? $response['result'] : []; +} + +function imDb(): PDO +{ + static $pdo = null; + if ($pdo instanceof PDO) { + return $pdo; + } + + $pdo = new PDO(IM_DB_DSN, IM_DB_USER, IM_DB_PASSWORD, [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]); + + return $pdo; +} + +function imAppDb(): PDO +{ + static $pdo = null; + if ($pdo instanceof PDO) { + return $pdo; + } + + $pdo = new PDO(IM_APP_DB_DSN, IM_APP_DB_USER, IM_APP_DB_PASSWORD, [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]); + + return $pdo; +} + +function ensureWebImAppTables(): void +{ + static $ensured = false; + if ($ensured) { + return; + } + $ensured = true; + + $db = imAppDb(); + $db->exec( + "create table if not exists `t_web_groups` ( + `id` bigint unsigned not null auto_increment, + `group_id` varchar(64) not null, + `category` varchar(20) not null default 'group', + `name` varchar(128) not null, + `portrait` varchar(1024) not null default '', + `owner_uid` varchar(64) not null, + `join_mode` varchar(20) not null default 'open', + `announcement` text null, + `native_group_id` varchar(64) not null default '', + `native_status` varchar(32) not null default 'pending', + `native_error` varchar(255) not null default '', + `created_by` varchar(64) not null, + `created_at_ms` bigint not null, + `updated_at_ms` bigint not null, + `deleted` tinyint not null default 0, + primary key (`id`), + unique key `uk_t_web_groups_group_id` (`group_id`), + key `idx_t_web_groups_owner` (`owner_uid`), + key `idx_t_web_groups_category` (`category`) + ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci" + ); + try { + $db->exec("alter table `t_web_groups` add column `welcome_text` text null after `announcement`"); + } catch (Throwable) { + } + $db->exec( + "create table if not exists `t_web_group_members` ( + `id` bigint unsigned not null auto_increment, + `group_id` varchar(64) not null, + `user_id` varchar(64) not null, + `role` varchar(20) not null default 'member', + `alias` varchar(128) not null default '', + `joined_at_ms` bigint not null, + `updated_at_ms` bigint not null, + `status` tinyint not null default 0, + primary key (`id`), + unique key `uk_t_web_group_members_gid_uid` (`group_id`, `user_id`), + key `idx_t_web_group_members_user` (`user_id`) + ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci" + ); + $db->exec( + "create table if not exists `t_web_group_messages` ( + `id` bigint unsigned not null auto_increment, + `message_uid` varchar(64) not null, + `group_id` varchar(64) not null, + `sender_uid` varchar(64) not null, + `text` text not null, + `created_at_ms` bigint not null, + `edited_at_ms` bigint not null default 0, + `recalled` tinyint not null default 0, + primary key (`id`), + unique key `uk_t_web_group_messages_uid` (`message_uid`), + key `idx_t_web_group_messages_group_time` (`group_id`, `created_at_ms`), + key `idx_t_web_group_messages_sender` (`sender_uid`) + ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci" + ); + $db->exec( + "create table if not exists `t_web_message_attachments` ( + `id` bigint unsigned not null auto_increment, + `message_uid` varchar(64) not null, + `conversation_type` varchar(16) not null default 'single', + `target_id` varchar(128) not null default '', + `sender_uid` varchar(64) not null default '', + `attachment_type` varchar(16) not null, + `url` varchar(1024) not null, + `name` varchar(255) not null default '', + `mime` varchar(128) not null default '', + `size_bytes` bigint not null default 0, + `created_at_ms` bigint not null, + primary key (`id`), + unique key `uk_t_web_message_attachments_uid` (`message_uid`), + key `idx_t_web_message_attachments_target` (`conversation_type`, `target_id`, `created_at_ms`) + ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci" + ); + $db->exec( + "create table if not exists `t_web_group_reads` ( + `id` bigint unsigned not null auto_increment, + `group_id` varchar(64) not null, + `user_id` varchar(64) not null, + `read_at_ms` bigint not null default 0, + `updated_at_ms` bigint not null, + primary key (`id`), + unique key `uk_t_web_group_reads_gid_uid` (`group_id`, `user_id`) + ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci" + ); + $db->exec( + "create table if not exists `t_web_group_mute_rules` ( + `id` bigint unsigned not null auto_increment, + `group_id` varchar(64) not null, + `mode` varchar(32) not null default 'off', + `schedule_type` varchar(16) not null default 'once', + `starts_at_ms` bigint not null default 0, + `ends_at_ms` bigint not null default 0, + `daily_start` varchar(8) not null default '', + `daily_end` varchar(8) not null default '', + `enabled` tinyint not null default 0, + `created_by` varchar(64) not null default '', + `updated_at_ms` bigint not null, + primary key (`id`), + unique key `uk_t_web_group_mute_rules_group` (`group_id`) + ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci" + ); + $db->exec( + "create table if not exists `t_web_broadcast_logs` ( + `id` bigint unsigned not null auto_increment, + `sender_uid` varchar(64) not null, + `target_count` int not null default 0, + `success_count` int not null default 0, + `failed_count` int not null default 0, + `text` text not null, + `target_json` text null, + `result_json` text null, + `created_at_ms` bigint not null, + primary key (`id`), + key `idx_t_web_broadcast_logs_sender_time` (`sender_uid`, `created_at_ms`) + ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci" + ); + $db->exec( + "create table if not exists `t_web_user_remarks` ( + `id` bigint unsigned not null auto_increment, + `owner_uid` varchar(64) not null, + `target_uid` varchar(64) not null, + `alias` varchar(128) not null default '', + `created_at_ms` bigint not null, + `updated_at_ms` bigint not null, + primary key (`id`), + unique key `uk_t_web_user_remarks_owner_target` (`owner_uid`, `target_uid`), + key `idx_t_web_user_remarks_target` (`target_uid`) + ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_unicode_ci" + ); +} + +function webImPlaceholders(array $values): string +{ + return implode(',', array_fill(0, count($values), '?')); +} + +function fetchWebUserRemarkMap(PDO $db, string $ownerId, array $targetIds): array +{ + $targetIds = array_values(array_unique(array_filter(array_map(static function ($targetId): string { + return trim((string)$targetId); + }, $targetIds)))); + if ($ownerId === '' || !$targetIds) { + return []; + } + + $statement = $db->prepare( + 'select `target_uid`, `alias` from `t_web_user_remarks`' + . ' where `owner_uid` = ? and `target_uid` in (' . webImPlaceholders($targetIds) . ')' + ); + $statement->execute(array_merge([$ownerId], $targetIds)); + + $remarks = []; + foreach ($statement->fetchAll() as $row) { + $remarks[(string)$row['target_uid']] = trim((string)($row['alias'] ?? '')); + } + + return $remarks; +} + +function saveWebUserRemark(PDO $db, string $ownerId, string $targetId, string $alias): void +{ + if ($ownerId === '' || $targetId === '') { + return; + } + + if ($alias === '') { + $delete = $db->prepare('delete from `t_web_user_remarks` where `owner_uid` = ? and `target_uid` = ?'); + $delete->execute([$ownerId, $targetId]); + return; + } + + $now = webImNowMs(); + $statement = $db->prepare( + 'insert into `t_web_user_remarks` (`owner_uid`, `target_uid`, `alias`, `created_at_ms`, `updated_at_ms`)' + . ' values (?, ?, ?, ?, ?)' + . ' on duplicate key update `alias` = values(`alias`), `updated_at_ms` = values(`updated_at_ms`)' + ); + $statement->execute([$ownerId, $targetId, $alias, $now, $now]); +} + +function webImNowMs(): int +{ + return (int)floor(microtime(true) * 1000); +} + +function webImMessageUid(): string +{ + $timestampPart = (webImNowMs() - 1514736000000) << 21; + return (string)($timestampPart | random_int(1, 0x1FFFFF)); +} + +function javaStringHashCode(string $value): int +{ + $hash = 0; + $length = strlen($value); + for ($i = 0; $i < $length; $i++) { + $hash = (31 * $hash + ord($value[$i])) & 0xFFFFFFFF; + if ($hash >= 0x80000000) { + $hash -= 0x100000000; + } + } + + return $hash; +} + +function imUserMessagesTable(string $userId): string +{ + return 't_user_messages_' . (abs(javaStringHashCode($userId)) % 128); +} + +function imMessageTable(string $messageId): string +{ + $timestamp = ((int)$messageId >> 21) + 1514736000000; + $date = (new DateTimeImmutable('@' . (int)floor($timestamp / 1000))) + ->setTimezone(new DateTimeZone(IM_DB_TIMEZONE)); + $year = (int)$date->format('Y'); + $month = (int)$date->format('n') - 1; + + return 't_messages_' . (($year % 3) * 12 + $month); +} diff --git a/dist/api/media_download.php b/dist/api/media_download.php new file mode 100644 index 0000000..f6b820f --- /dev/null +++ b/dist/api/media_download.php @@ -0,0 +1,58 @@ +prepare( + 'select `_uid` from `t_user` where `_uid` = ? or `_mobile` = ? or `_name` = ? limit 1' + ); + $statement->execute([$value, $value, $value]); + $uid = $statement->fetchColumn(); + + return is_string($uid) && $uid !== '' ? $uid : $value; +} + +function messageTimestampMs(string $messageUid): int +{ + return (((int)$messageUid) >> 21) + 1514736000000; +} + +function nowTimestampMs(): int +{ + return (int)floor(microtime(true) * 1000); +} + +function recallLimitMinutes(): float +{ + $statement = imAppDb()->prepare( + 'select `conf_value` from `system_conf`' + . ' where `conf_name` = ? and `is_valid` = 1 limit 1' + ); + $statement->execute(['RetractMessage']); + $value = trim((string)($statement->fetchColumn() ?: '0')); + + if ($value === '' || !is_numeric($value)) { + return 0.0; + } + + return max(0.0, (float)$value); +} + +function assertRecallWithinLimit(string $messageUid): void +{ + $limitMinutes = recallLimitMinutes(); + if ($limitMinutes <= 0) { + return; + } + + $messageAgeMs = nowTimestampMs() - messageTimestampMs($messageUid); + $limitMs = (int)round($limitMinutes * 60 * 1000); + if ($messageAgeMs > $limitMs) { + throw new UserActionException('已超过可撤回时间'); + } +} + +function fetchActionMessageRow(string $messageUid): array +{ + $table = imMessageTable($messageUid); + $statement = imDb()->prepare( + 'select `_mid`, `_from`, `_content_type`, `_searchable_key` from `' . $table . '` where `_mid` = ? limit 1' + ); + $statement->execute([$messageUid]); + $row = $statement->fetch(); + + return is_array($row) ? $row : []; +} + +function ensureMessageEditsTable(): void +{ + imDb()->exec( + 'create table if not exists `t_web_message_edits` (' + . '`message_uid` varchar(32) not null,' + . '`editor_uid` varchar(64) not null,' + . '`edited_text` text null,' + . '`edited_at_ms` bigint not null,' + . '`created_at` datetime not null default current_timestamp,' + . '`updated_at` datetime null default current_timestamp on update current_timestamp,' + . 'primary key (`message_uid`),' + . 'key `idx_editor_uid` (`editor_uid`),' + . 'key `idx_edited_at_ms` (`edited_at_ms`)' + . ') engine=InnoDB default charset=utf8mb4' + ); +} + +function editTextMessage(string $operatorId, string $messageUid, string $text): array +{ + $row = fetchActionMessageRow($messageUid); + if (!$row) { + return editWebGroupMessage($operatorId, $messageUid, $text); + } + if ((string)$row['_from'] !== $operatorId) { + throw new UserActionException('只能编辑自己发送的消息'); + } + if ((int)$row['_content_type'] !== 1) { + throw new UserActionException('只能编辑文字消息'); + } + + $editedAt = nowTimestampMs(); + $table = imMessageTable($messageUid); + $update = imDb()->prepare('update `' . $table . '` set `_searchable_key` = ? where `_mid` = ?'); + $update->execute([$text, $messageUid]); + + ensureMessageEditsTable(); + $upsert = imDb()->prepare( + 'insert into `t_web_message_edits` (`message_uid`, `editor_uid`, `edited_text`, `edited_at_ms`)' + . ' values (?, ?, ?, ?)' + . ' on duplicate key update' + . ' `editor_uid` = values(`editor_uid`),' + . ' `edited_text` = values(`edited_text`),' + . ' `edited_at_ms` = values(`edited_at_ms`),' + . ' `updated_at` = current_timestamp' + ); + $upsert->execute([$messageUid, $operatorId, $text, $editedAt]); + + return [ + 'messageUid' => $messageUid, + 'text' => $text, + 'editedAt' => $editedAt, + ]; +} + +function fetchWebGroupActionMessage(string $messageUid): array +{ + ensureWebImAppTables(); + $statement = imAppDb()->prepare( + 'select m.*, g.`category` from `t_web_group_messages` m' + . ' join `t_web_groups` g on g.`group_id` = m.`group_id` and g.`deleted` = 0' + . ' where m.`message_uid` = ? limit 1' + ); + $statement->execute([$messageUid]); + $row = $statement->fetch(); + + return is_array($row) ? $row : []; +} + +function editWebGroupMessage(string $operatorId, string $messageUid, string $text): array +{ + $row = fetchWebGroupActionMessage($messageUid); + if (!$row) { + throw new UserActionException('消息不存在'); + } + if ((string)$row['sender_uid'] !== $operatorId) { + throw new UserActionException('只能编辑自己发送的消息'); + } + if ((int)($row['recalled'] ?? 0) !== 0) { + throw new UserActionException('已撤回的消息请重新编辑发送'); + } + + $editedAt = nowTimestampMs(); + $update = imAppDb()->prepare( + 'update `t_web_group_messages` set `text` = ?, `edited_at_ms` = ? where `message_uid` = ?' + ); + $update->execute([$text, $editedAt, $messageUid]); + $groupUpdate = imAppDb()->prepare('update `t_web_groups` set `updated_at_ms` = ? where `group_id` = ?'); + $groupUpdate->execute([$editedAt, (string)$row['group_id']]); + + return [ + 'messageUid' => $messageUid, + 'text' => $text, + 'editedAt' => $editedAt, + ]; +} + +function webGroupMemberRoleForAction(string $groupId, string $userId): string +{ + $statement = imAppDb()->prepare( + 'select `role` from `t_web_group_members`' + . ' where `group_id` = ? and `user_id` = ? and `status` = 0 limit 1' + ); + $statement->execute([$groupId, $userId]); + $role = $statement->fetchColumn(); + + return is_string($role) ? $role : ''; +} + +function recallWebGroupMessage(string $operatorId, string $messageUid): bool +{ + $row = fetchWebGroupActionMessage($messageUid); + if (!$row) { + return false; + } + $isSender = (string)$row['sender_uid'] === $operatorId; + if (!$isSender) { + $role = webGroupMemberRoleForAction((string)$row['group_id'], $operatorId); + if (!in_array($role, ['owner', 'admin'], true)) { + throw new UserActionException('只有群主或管理员可以撤回他人消息'); + } + } + assertRecallWithinLimit($messageUid); + + $now = nowTimestampMs(); + $update = imAppDb()->prepare( + 'update `t_web_group_messages` set `recalled` = 1 where `message_uid` = ?' + ); + $update->execute([$messageUid]); + $groupUpdate = imAppDb()->prepare('update `t_web_groups` set `updated_at_ms` = ? where `group_id` = ?'); + $groupUpdate->execute([$now, (string)$row['group_id']]); + + return true; +} + +$payload = readJsonPayload(); +$action = trim((string)($payload['action'] ?? '')); +$userId = trim((string)($payload['userId'] ?? '')); +$messageUidText = trim((string)($payload['messageUid'] ?? '')); +$messageUid = ctype_digit($messageUidText) ? (int)$messageUidText : 0; + +if ($action === '' || $messageUid <= 0) { + respond(400, '缺少操作类型或消息ID'); +} + +try { + if ($action === 'recall') { + if ($userId === '') { + respond(400, '缺少操作者ID'); + } + $userId = resolveActionUserId($userId); + $row = fetchActionMessageRow($messageUidText); + if (!$row && recallWebGroupMessage($userId, $messageUidText)) { + respond(0, 'success', [ + 'messageUid' => (string)$messageUid, + 'action' => $action, + ]); + } + if (!$row) { + throw new UserActionException('消息不存在'); + } + assertRecallWithinLimit($messageUidText); + requireImSuccess(imAdminPost('/admin/message/recall', [ + 'operator' => $userId, + 'messageUid' => $messageUid, + 'userRecall' => true, + 'isUserRecall' => true, + ]), '撤回失败'); + + respond(0, 'success', [ + 'messageUid' => (string)$messageUid, + 'action' => $action, + ]); + } + + if ($action === 'edit') { + if ($userId === '') { + respond(400, '缺少操作者ID'); + } + $text = trim((string)($payload['text'] ?? '')); + if ($text === '') { + respond(400, '编辑内容不能为空'); + } + if (mb_strlen($text, 'UTF-8') > 5000) { + respond(400, '编辑内容过长'); + } + + $userId = resolveActionUserId($userId); + respond(0, 'success', [ + 'message' => editTextMessage($userId, $messageUidText, $text), + 'action' => $action, + ]); + } + + if ($action === 'delete') { + requireImSuccess(imAdminPost('/admin/message/delete', [ + 'messageUid' => $messageUid, + ]), '删除失败'); + + respond(0, 'success', [ + 'messageUid' => (string)$messageUid, + 'action' => $action, + ]); + } + + respond(400, '不支持的消息操作'); +} catch (Throwable $error) { + respond($error instanceof UserActionException ? 400 : 500, $error->getMessage() ?: '消息操作失败'); +} diff --git a/dist/api/message_detail.php b/dist/api/message_detail.php new file mode 100644 index 0000000..bc82d46 --- /dev/null +++ b/dist/api/message_detail.php @@ -0,0 +1,387 @@ + 0) { + return ($id >> 21) + 1514736000000; + } + + if ($datetime !== null && $datetime !== '') { + $date = DateTimeImmutable::createFromFormat( + 'Y-m-d H:i:s', + $datetime, + new DateTimeZone(IM_DB_TIMEZONE) + ); + if ($date instanceof DateTimeImmutable) { + return $date->getTimestamp() * 1000; + } + } + + return 0; +} + +function detailResolveUserId(PDO $db, string $value): string +{ + if ($value === '') { + return ''; + } + + $statement = $db->prepare( + 'select `_uid` from `t_user` where `_uid` = ? or `_mobile` = ? or `_name` = ? limit 1' + ); + $statement->execute([$value, $value, $value]); + $uid = $statement->fetchColumn(); + + return is_string($uid) && $uid !== '' ? $uid : $value; +} + +function detailConversationType(mixed $value): string +{ + $type = strtolower(trim((string)$value)); + return in_array($type, ['1', 'group', 'channel'], true) ? 'group' : 'single'; +} + +function detailDeliveryMap(PDO $db, array $userIds): array +{ + $userIds = array_values(array_unique(array_filter(array_map('strval', $userIds)))); + if (!$userIds) { + return []; + } + + $statement = $db->prepare( + 'select `_uid`, max(`_dt`) as `_dt` from `t_delivery_report`' + . ' where `_uid` in (' . detailPlaceholders($userIds) . ') group by `_uid`' + ); + $statement->execute($userIds); + + $items = []; + foreach ($statement->fetchAll() as $row) { + $items[(string)$row['_uid']] = (int)$row['_dt']; + } + + return $items; +} + +function detailReadAt(PDO $db, string $readerId, array $targets): int +{ + $targets = array_values(array_unique(array_filter(array_map('strval', $targets)))); + if ($readerId === '' || !$targets) { + return 0; + } + + $statement = $db->prepare( + 'select max(`_dt`) from `t_read_report`' + . ' where `_uid` = ? and `_type` = 0 and `_line` = 0' + . ' and `_target` in (' . detailPlaceholders($targets) . ')' + ); + $statement->execute(array_merge([$readerId], $targets)); + $value = $statement->fetchColumn(); + + return is_numeric($value) ? (int)$value : 0; +} + +function detailSingleMessageVisible(PDO $db, string $userId, string $targetId, string $messageUid): bool +{ + $table = imUserMessagesTable($userId); + $conversationKeys = [$userId . '|' . $targetId, $targetId . '|' . $userId]; + $statement = $db->prepare( + 'select 1 from `' . $table . '`' + . ' where `_uid` = ? and `_mid` = ? and `_type` = 0 and `_line` = 0' + . ' and `_target` in (' . detailPlaceholders($conversationKeys) . ') limit 1' + ); + $statement->execute(array_merge([$userId, $messageUid], $conversationKeys)); + + return (bool)$statement->fetchColumn(); +} + +function detailUserMap(PDO $imDb, PDO $appDb, array $userIds, string $ownerId, string $groupId = ''): array +{ + $userIds = array_values(array_unique(array_filter(array_map('strval', $userIds)))); + if (!$userIds) { + return []; + } + + $statement = $imDb->prepare( + 'select `_uid`, `_name`, `_display_name`, `_mobile`, `_portrait` from `t_user`' + . ' where `_uid` in (' . detailPlaceholders($userIds) . ')' + ); + $statement->execute($userIds); + + $users = []; + foreach ($statement->fetchAll() as $row) { + $uid = (string)$row['_uid']; + $rawName = trim((string)($row['_display_name'] ?? '')) + ?: trim((string)($row['_name'] ?? '')) + ?: trim((string)($row['_mobile'] ?? '')) + ?: $uid; + $users[$uid] = [ + 'uid' => $uid, + 'rawName' => $rawName, + 'mobile' => (string)($row['_mobile'] ?? ''), + 'portrait' => (string)($row['_portrait'] ?? ''), + 'contactAlias' => '', + 'remarkAlias' => '', + 'groupAlias' => '', + 'role' => '', + 'displayName' => $rawName, + ]; + } + + if ($ownerId !== '') { + $aliasStatement = $imDb->prepare( + 'select `_friend_uid`, `_alias` from `t_friend` where `_uid` = ?' + . ' and `_friend_uid` in (' . detailPlaceholders($userIds) . ')' + ); + $aliasStatement->execute(array_merge([$ownerId], $userIds)); + foreach ($aliasStatement->fetchAll() as $row) { + $uid = (string)$row['_friend_uid']; + if (isset($users[$uid])) { + $users[$uid]['contactAlias'] = trim((string)($row['_alias'] ?? '')); + } + } + + try { + $remarkMap = fetchWebUserRemarkMap($appDb, $ownerId, $userIds); + } catch (Throwable) { + $remarkMap = []; + } + foreach ($remarkMap as $uid => $alias) { + if (isset($users[$uid])) { + $users[$uid]['remarkAlias'] = trim((string)$alias); + } + } + } + + if ($groupId !== '') { + $memberStatement = $appDb->prepare( + 'select `user_id`, `alias`, `role` from `t_web_group_members`' + . ' where `group_id` = ? and `user_id` in (' . detailPlaceholders($userIds) . ')' + ); + $memberStatement->execute(array_merge([$groupId], $userIds)); + foreach ($memberStatement->fetchAll() as $row) { + $uid = (string)$row['user_id']; + if (isset($users[$uid])) { + $users[$uid]['groupAlias'] = trim((string)($row['alias'] ?? '')); + $users[$uid]['role'] = (string)($row['role'] ?? ''); + } + } + } + + foreach ($users as $uid => $user) { + $alias = (string)$user['contactAlias'] !== '' + ? (string)$user['contactAlias'] + : ((string)$user['remarkAlias'] !== '' ? (string)$user['remarkAlias'] : (string)$user['groupAlias']); + $users[$uid]['displayName'] = $alias !== '' ? $alias : (string)$user['rawName']; + } + + foreach ($userIds as $uid) { + if (!isset($users[$uid])) { + $users[$uid] = [ + 'uid' => $uid, + 'rawName' => $uid, + 'mobile' => '', + 'portrait' => '', + 'contactAlias' => '', + 'remarkAlias' => '', + 'groupAlias' => '', + 'role' => '', + 'displayName' => $uid, + ]; + } + } + + return $users; +} + +function detailMember(array $user, int $time = 0): array +{ + return [ + 'uid' => (string)$user['uid'], + 'name' => (string)$user['displayName'], + 'rawName' => (string)$user['rawName'], + 'mobile' => (string)($user['mobile'] ?? ''), + 'portrait' => (string)($user['portrait'] ?? ''), + 'role' => (string)($user['role'] ?? ''), + 'time' => $time, + ]; +} + +function singleDetail(PDO $imDb, string $userId, string $targetId, string $messageUid): array +{ + if (!preg_match('/^\d+$/', $messageUid)) { + respond(400, '缺少可查询的消息ID'); + } + + $table = imMessageTable($messageUid); + $statement = $imDb->prepare( + 'select `_mid`, `_from`, `_target`, `_dt`, `_content_type`, `_searchable_key`, `_to`' + . ' from `' . $table . '` where `_mid` = ? limit 1' + ); + $statement->execute([$messageUid]); + $message = $statement->fetch(); + if (!is_array($message)) { + respond(404, '没有找到该消息'); + } + + $senderId = (string)$message['_from']; + if (!detailSingleMessageVisible($imDb, $userId, $targetId, $messageUid)) { + respond(403, '没有权限查看该消息'); + } + + $receiverId = $senderId === $userId ? $targetId : $userId; + if ($senderId !== $userId && $senderId !== $targetId) { + respond(403, '没有权限查看该消息'); + } + + $sentAt = detailTimestampMs((string)($message['_dt'] ?? ''), $messageUid); + $targets = [$senderId, $senderId . '|' . $receiverId, $receiverId . '|' . $senderId]; + $deliveredRaw = detailDeliveryMap($imDb, [$receiverId])[$receiverId] ?? 0; + $readRaw = detailReadAt($imDb, $receiverId, $targets); + $users = detailUserMap($imDb, imAppDb(), [$senderId, $receiverId], $userId); + + return [ + 'messageUid' => $messageUid, + 'conversationType' => 'single', + 'sentAt' => $sentAt, + 'sender' => detailMember($users[$senderId]), + 'receiver' => detailMember($users[$receiverId]), + 'deliveredAt' => $deliveredRaw >= $sentAt ? $deliveredRaw : 0, + 'readAt' => $readRaw >= $sentAt ? $readRaw : 0, + ]; +} + +function groupDetail(PDO $imDb, PDO $appDb, string $userId, string $groupId, string $messageUid): array +{ + ensureWebImAppTables(); + if (!preg_match('/^\d+$/', $messageUid)) { + respond(400, '缺少可查询的消息ID'); + } + + $myMember = $appDb->prepare( + 'select `role` from `t_web_group_members` where `group_id` = ? and `user_id` = ? and `status` = 0 limit 1' + ); + $myMember->execute([$groupId, $userId]); + if (!$myMember->fetchColumn()) { + respond(403, '你不在该群组中'); + } + + $messageStatement = $appDb->prepare( + 'select `message_uid`, `group_id`, `sender_uid`, `created_at_ms`, `edited_at_ms`, `recalled`' + . ' from `t_web_group_messages` where `group_id` = ? and `message_uid` = ? limit 1' + ); + $messageStatement->execute([$groupId, $messageUid]); + $message = $messageStatement->fetch(); + if (!is_array($message)) { + respond(404, '没有找到该群消息'); + } + + $sentAt = (int)$message['created_at_ms']; + $editedAt = (int)($message['edited_at_ms'] ?? 0); + $activityAt = max($sentAt, $editedAt); + $senderId = (string)$message['sender_uid']; + + $memberStatement = $appDb->prepare( + 'select `user_id`, `role`, `alias`, `joined_at_ms` from `t_web_group_members`' + . ' where `group_id` = ? and `status` = 0 and `joined_at_ms` <= ?' + . ' order by (`role` = "owner") desc, (`role` = "admin") desc, `joined_at_ms` asc' + ); + $memberStatement->execute([$groupId, $sentAt]); + $members = array_values(array_filter($memberStatement->fetchAll(), static function (array $member) use ($senderId): bool { + return (string)$member['user_id'] !== $senderId; + })); + + $memberIds = array_values(array_unique(array_map(static fn(array $member): string => (string)$member['user_id'], $members))); + $users = detailUserMap($imDb, $appDb, array_merge([$senderId], $memberIds), $userId, $groupId); + $deliveryMap = detailDeliveryMap($imDb, $memberIds); + + $readMap = []; + if ($memberIds) { + $readStatement = $appDb->prepare( + 'select `user_id`, `read_at_ms` from `t_web_group_reads`' + . ' where `group_id` = ? and `user_id` in (' . detailPlaceholders($memberIds) . ')' + ); + $readStatement->execute(array_merge([$groupId], $memberIds)); + foreach ($readStatement->fetchAll() as $row) { + $readMap[(string)$row['user_id']] = (int)$row['read_at_ms']; + } + } + + $read = []; + $unread = []; + $undelivered = []; + foreach ($memberIds as $uid) { + $readAt = (int)($readMap[$uid] ?? 0); + $deliveredAt = (int)($deliveryMap[$uid] ?? 0); + $member = detailMember($users[$uid], $readAt >= $activityAt ? $readAt : ($deliveredAt >= $sentAt ? $deliveredAt : 0)); + if ($readAt >= $activityAt) { + $read[] = $member; + } elseif ($deliveredAt >= $sentAt) { + $unread[] = $member; + } else { + $undelivered[] = $member; + } + } + + return [ + 'messageUid' => $messageUid, + 'conversationType' => 'group', + 'groupId' => $groupId, + 'sentAt' => $sentAt, + 'editedAt' => $editedAt, + 'recalled' => (bool)$message['recalled'], + 'sender' => detailMember($users[$senderId] ?? ['uid' => $senderId, 'displayName' => $senderId, 'rawName' => $senderId]), + 'group' => [ + 'read' => $read, + 'unread' => $unread, + 'undelivered' => $undelivered, + 'counts' => [ + 'read' => count($read), + 'unread' => count($unread), + 'undelivered' => count($undelivered), + 'total' => count($memberIds), + ], + ], + ]; +} + +$payload = readJsonPayload(); +$userId = trim((string)($payload['userId'] ?? '')); +$target = trim((string)($payload['target'] ?? '')); +$messageUid = trim((string)($payload['messageUid'] ?? $payload['messageId'] ?? '')); +$conversationType = detailConversationType($payload['conversationType'] ?? $payload['type'] ?? 'single'); + +if ($userId === '') { + respond(400, '缺少用户ID'); +} +if ($target === '') { + respond(400, '缺少会话对象'); +} +if ($messageUid === '') { + respond(400, '缺少消息ID'); +} + +try { + $imDb = imDb(); + $appDb = imAppDb(); + $userId = detailResolveUserId($imDb, $userId); + if ($conversationType === 'group') { + respond(0, 'success', ['detail' => groupDetail($imDb, $appDb, $userId, $target, $messageUid)]); + } + + $targetId = detailResolveUserId($imDb, $target); + respond(0, 'success', ['detail' => singleDetail($imDb, $userId, $targetId, $messageUid)]); +} catch (Throwable $error) { + respond(500, $error->getMessage() ?: '消息详情加载失败'); +} diff --git a/dist/api/messages.php b/dist/api/messages.php new file mode 100644 index 0000000..4525f44 --- /dev/null +++ b/dist/api/messages.php @@ -0,0 +1,900 @@ + 0) { + return ($id >> 21) + 1514736000000; + } + + if ($datetime !== null && $datetime !== '') { + $date = DateTimeImmutable::createFromFormat( + 'Y-m-d H:i:s', + $datetime, + new DateTimeZone(IM_DB_TIMEZONE) + ); + if ($date instanceof DateTimeImmutable) { + return $date->getTimestamp() * 1000; + } + } + + return (int)floor(microtime(true) * 1000); +} + +function nowMs(): int +{ + return (int)floor(microtime(true) * 1000); +} + +function markUserDelivered(PDO $db, string $userId, int $timestamp): void +{ + if ($userId === '' || $timestamp <= 0) { + return; + } + + $statement = $db->prepare( + 'insert into `t_delivery_report` (`_uid`, `_dt`) values (?, ?)' + . ' on duplicate key update `_dt` = if(`_dt` < values(`_dt`), values(`_dt`), `_dt`)' + ); + $statement->execute([$userId, $timestamp]); +} + +function markConversationRead(PDO $db, string $userId, string $targetId, int $timestamp): void +{ + if ($userId === '' || $targetId === '' || $timestamp <= 0) { + return; + } + + $statement = $db->prepare( + 'select `id`, `_dt` from `t_read_report`' + . ' where `_uid` = ? and `_type` = 0 and `_line` = 0 and `_target` = ?' + . ' order by `_dt` desc limit 1' + ); + $statement->execute([$userId, $targetId]); + $row = $statement->fetch(); + + if ($row) { + if ($timestamp > (int)$row['_dt']) { + $update = $db->prepare('update `t_read_report` set `_dt` = ? where `id` = ?'); + $update->execute([$timestamp, (int)$row['id']]); + } + return; + } + + $insert = $db->prepare( + 'insert into `t_read_report` (`_uid`, `_type`, `_line`, `_target`, `_dt`) values (?, 0, 0, ?, ?)' + ); + $insert->execute([$userId, $targetId, $timestamp]); +} + +function resolveUserId(PDO $db, string $value): string +{ + if ($value === '') { + return ''; + } + + $statement = $db->prepare( + 'select `_uid` from `t_user` where `_uid` = ? or `_mobile` = ? or `_name` = ? limit 1' + ); + $statement->execute([$value, $value, $value]); + $uid = $statement->fetchColumn(); + + return is_string($uid) && $uid !== '' ? $uid : $value; +} + +function peerFromConversationTarget(string $userId, string $target): string +{ + $parts = array_values(array_filter(explode('|', $target), static fn($part) => $part !== '')); + if (count($parts) < 2) { + return $target !== $userId ? $target : ''; + } + + return $parts[0] === $userId ? $parts[1] : $parts[0]; +} + +function fetchMessageRows(PDO $db, array $messageIds): array +{ + $messageIds = array_values(array_unique(array_filter(array_map('strval', $messageIds)))); + if (!$messageIds) { + return []; + } + + $idsByTable = []; + foreach ($messageIds as $messageId) { + $idsByTable[imMessageTable($messageId)][] = $messageId; + } + + $messages = []; + foreach ($idsByTable as $table => $ids) { + $sql = 'select `_mid`, `_from`, `_type`, `_target`, `_line`, `_searchable_key`, `_dt`, `_content_type`, `_to`' + . ' from `' . $table . '` where `_mid` in (' . placeholders($ids) . ')'; + $statement = $db->prepare($sql); + $statement->execute($ids); + foreach ($statement->fetchAll() as $row) { + $messages[(string)$row['_mid']] = $row; + } + } + + return $messages; +} + +function fetchMessageEditMap(PDO $db, array $messageIds): array +{ + $messageIds = array_values(array_unique(array_filter(array_map('strval', $messageIds)))); + if (!$messageIds) { + return []; + } + + try { + $statement = $db->prepare( + 'select `message_uid`, `edited_at_ms` from `t_web_message_edits`' + . ' where `message_uid` in (' . placeholders($messageIds) . ')' + ); + $statement->execute($messageIds); + } catch (Throwable) { + return []; + } + + $edits = []; + foreach ($statement->fetchAll() as $row) { + $edits[(string)$row['message_uid']] = [ + 'editedAt' => (int)$row['edited_at_ms'], + ]; + } + + return $edits; +} + +function normalizeAttachmentRow(array $row): array +{ + return [ + 'type' => (string)$row['attachment_type'], + 'url' => (string)$row['url'], + 'name' => (string)($row['name'] ?? ''), + 'mime' => (string)($row['mime'] ?? ''), + 'size' => (int)($row['size_bytes'] ?? 0), + ]; +} + +function fetchAttachmentMap(PDO $appDb, array $messageIds): array +{ + $messageIds = array_values(array_unique(array_filter(array_map('strval', $messageIds)))); + if (!$messageIds) { + return []; + } + + ensureWebImAppTables(); + $statement = $appDb->prepare( + 'select `message_uid`, `attachment_type`, `url`, `name`, `mime`, `size_bytes`' + . ' from `t_web_message_attachments`' + . ' where `message_uid` in (' . placeholders($messageIds) . ')' + ); + $statement->execute($messageIds); + + $attachments = []; + foreach ($statement->fetchAll() as $row) { + $attachments[(string)$row['message_uid']] = normalizeAttachmentRow($row); + } + + return $attachments; +} + +function attachmentFallbackText(?array $attachment): string +{ + if (!$attachment) { + return ''; + } + if ((string)$attachment['type'] === 'image') { + return '[图片]'; + } + + return '[文件] ' . ((string)($attachment['name'] ?? '') ?: '文件'); +} + +function attachmentDisplayText(string $text, ?array $attachment): string +{ + if (!$attachment) { + return $text; + } + + return $text === attachmentFallbackText($attachment) ? '' : $text; +} + +function messagePreviewText(?array $message): string +{ + if (!$message) { + return ''; + } + $attachment = is_array($message['attachment'] ?? null) ? $message['attachment'] : null; + if ($attachment) { + $text = trim((string)($message['text'] ?? '')); + return $text !== '' ? $text : attachmentFallbackText($attachment); + } + + return (string)($message['text'] ?? ''); +} + +function fetchUserInfoMap(PDO $db, array $userIds, string $ownerId = ''): array +{ + $userIds = array_values(array_unique(array_filter(array_map('strval', $userIds)))); + if (!$userIds) { + return []; + } + + $statement = $db->prepare( + 'select `_uid`, `_name`, `_display_name`, `_mobile`, `_portrait`, `_address` from `t_user`' + . ' where `_uid` in (' . placeholders($userIds) . ')' + ); + $statement->execute($userIds); + + $users = []; + foreach ($statement->fetchAll() as $row) { + $row['_is_friend'] = false; + $row['_alias'] = ''; + $row['_friend_alias'] = ''; + $row['_remark_alias'] = ''; + $users[(string)$row['_uid']] = $row; + } + + if ($ownerId !== '') { + $aliasStatement = $db->prepare( + 'select `_friend_uid`, `_alias` from `t_friend` where `_uid` = ?' + . ' and `_friend_uid` in (' . placeholders($userIds) . ')' + ); + $aliasStatement->execute(array_merge([$ownerId], $userIds)); + foreach ($aliasStatement->fetchAll() as $row) { + $friendUid = (string)$row['_friend_uid']; + if (!isset($users[$friendUid])) { + continue; + } + $users[$friendUid]['_is_friend'] = true; + $users[$friendUid]['_friend_alias'] = trim((string)($row['_alias'] ?? '')); + } + + try { + ensureWebImAppTables(); + $remarkMap = fetchWebUserRemarkMap(imAppDb(), $ownerId, $userIds); + } catch (Throwable) { + $remarkMap = []; + } + foreach ($remarkMap as $targetUid => $alias) { + if (!isset($users[$targetUid])) { + continue; + } + $users[$targetUid]['_remark_alias'] = $alias; + } + + foreach ($users as $uid => $user) { + $friendAlias = trim((string)($user['_friend_alias'] ?? '')); + $remarkAlias = trim((string)($user['_remark_alias'] ?? '')); + $users[$uid]['_alias'] = $friendAlias !== '' ? $friendAlias : $remarkAlias; + } + } + + return $users; +} + +function userTitle(array $users, string $userId): string +{ + $user = $users[$userId] ?? null; + if (!$user) { + return $userId; + } + + return (string)($user['_alias'] ?? '') + ?: (string)($user['_display_name'] ?? '') + ?: (string)($user['_name'] ?? '') + ?: (string)($user['_mobile'] ?? '') + ?: $userId; +} + +function loadPeerReceiptState(PDO $db, string $currentUserId, string $peerId): array +{ + $deliveryStatement = $db->prepare('select `_dt` from `t_delivery_report` where `_uid` = ? limit 1'); + $deliveryStatement->execute([$peerId]); + $deliveredAt = $deliveryStatement->fetchColumn(); + + $readTargets = array_values(array_unique([ + $currentUserId, + $currentUserId . '|' . $peerId, + $peerId . '|' . $currentUserId, + ])); + $readStatement = $db->prepare( + 'select max(`_dt`) from `t_read_report`' + . ' where `_uid` = ? and `_type` = 0 and `_line` = 0' + . ' and `_target` in (' . placeholders($readTargets) . ')' + ); + $readStatement->execute(array_merge([$peerId], $readTargets)); + $readAt = $readStatement->fetchColumn(); + + return [ + 'deliveredAt' => is_numeric($deliveredAt) ? (int)$deliveredAt : 0, + 'readAt' => is_numeric($readAt) ? (int)$readAt : 0, + ]; +} + +function loadOwnReadStateMap(PDO $db, string $userId, array $peerIds): array +{ + $peerIds = array_values(array_unique(array_filter(array_map('strval', $peerIds)))); + if (!$peerIds) { + return []; + } + + $statement = $db->prepare( + 'select `_target`, max(`_dt`) as `_read_at` from `t_read_report`' + . ' where `_uid` = ? and `_type` = 0 and `_line` = 0' + . ' and `_target` in (' . placeholders($peerIds) . ')' + . ' group by `_target`' + ); + $statement->execute(array_merge([$userId], $peerIds)); + + $readAtByPeer = []; + foreach ($statement->fetchAll() as $row) { + $readAtByPeer[(string)$row['_target']] = (int)$row['_read_at']; + } + + return $readAtByPeer; +} + +function outgoingDeliveryStatus(int $timestamp, array $receiptState): string +{ + $readAt = (int)($receiptState['readAt'] ?? 0); + if ($readAt > 0 && $timestamp <= $readAt) { + return 'read'; + } + + $deliveredAt = (int)($receiptState['deliveredAt'] ?? 0); + if ($deliveredAt > 0 && $timestamp <= $deliveredAt) { + return 'delivered'; + } + + return 'sent'; +} + +function messageActivityTimestamp(int $timestamp, array $editState = []): int +{ + return max($timestamp, (int)($editState['editedAt'] ?? 0)); +} + +function normalizeConversationType(mixed $value): string +{ + $type = strtolower(trim((string)$value)); + if (in_array($type, ['1', 'group', 'channel'], true)) { + return 'group'; + } + + return 'single'; +} + +function isWebGroupTarget(PDO $appDb, string $targetId): bool +{ + if ($targetId === '') { + return false; + } + + ensureWebImAppTables(); + $statement = $appDb->prepare('select 1 from `t_web_groups` where `group_id` = ? and `deleted` = 0 limit 1'); + $statement->execute([$targetId]); + + return (bool)$statement->fetchColumn(); +} + +function markWebGroupRead(PDO $appDb, string $userId, string $groupId, int $timestamp): void +{ + if ($userId === '' || $groupId === '' || $timestamp <= 0) { + return; + } + + $now = nowMs(); + $statement = $appDb->prepare( + 'insert into `t_web_group_reads` (`group_id`, `user_id`, `read_at_ms`, `updated_at_ms`)' + . ' values (?, ?, ?, ?)' + . ' on duplicate key update' + . ' `read_at_ms` = if(`read_at_ms` < values(`read_at_ms`), values(`read_at_ms`), `read_at_ms`),' + . ' `updated_at_ms` = values(`updated_at_ms`)' + ); + $statement->execute([$groupId, $userId, $timestamp, $now]); +} + +function webGroupRole(PDO $appDb, string $userId, string $groupId): string +{ + $statement = $appDb->prepare( + 'select `role` from `t_web_group_members`' + . ' where `group_id` = ? and `user_id` = ? and `status` = 0 limit 1' + ); + $statement->execute([$groupId, $userId]); + $role = $statement->fetchColumn(); + + return is_string($role) && $role !== '' ? $role : ''; +} + +function formatWebGroupMessage( + array $row, + string $currentUserId, + array $group, + ?array $attachment = null, + array $users = [] +): array +{ + $groupId = (string)$row['group_id']; + $from = (string)$row['sender_uid']; + $senderUser = $users[$from] ?? []; + $senderAlias = trim((string)($row['sender_alias'] ?? '')); + $senderContactAlias = trim((string)($senderUser['_alias'] ?? '')); + $senderFriendAlias = trim((string)($senderUser['_friend_alias'] ?? '')); + $senderRemarkAlias = trim((string)($senderUser['_remark_alias'] ?? '')); + $senderRawName = trim((string)($senderUser['_display_name'] ?? '')) + ?: trim((string)($senderUser['_name'] ?? '')) + ?: trim((string)($senderUser['_mobile'] ?? '')) + ?: $from; + $senderName = $senderContactAlias + ?: $senderAlias + ?: $senderRawName; + $senderRole = (string)($row['sender_role'] ?? 'member'); + if (!in_array($senderRole, ['owner', 'admin'], true)) { + $senderRole = 'member'; + } + $timestamp = (int)$row['created_at_ms']; + $editedAt = (int)($row['edited_at_ms'] ?? 0); + $activityTimestamp = max($timestamp, $editedAt); + $direction = $from === $currentUserId ? 'out' : 'in'; + + $messageType = $attachment ? (string)$attachment['type'] : 'text'; + $contentType = $messageType === 'image' ? 3 : ($messageType === 'file' ? 5 : 1); + return [ + 'id' => (string)$row['message_uid'], + 'messageUid' => (string)$row['message_uid'], + 'conversationId' => 'group-' . $groupId, + 'from' => $from, + 'senderRole' => $senderRole, + 'senderName' => $senderName, + 'senderPortrait' => (string)($senderUser['_portrait'] ?? ''), + 'senderProfile' => [ + 'uid' => $from, + 'displayName' => $senderName, + 'rawName' => $senderRawName, + 'contactAlias' => $senderContactAlias, + 'friendAlias' => $senderFriendAlias, + 'remarkAlias' => $senderRemarkAlias, + 'groupAlias' => $senderAlias, + 'isContact' => (bool)($senderUser['_is_friend'] ?? false), + 'mobile' => (string)($senderUser['_mobile'] ?? ''), + 'address' => (string)($senderUser['_address'] ?? ''), + 'portrait' => (string)($senderUser['_portrait'] ?? ''), + 'role' => $senderRole, + ], + 'to' => $groupId, + 'target' => $groupId, + 'direction' => $direction, + 'type' => $messageType, + 'contentType' => $contentType, + 'text' => attachmentDisplayText((string)$row['text'], $attachment), + 'attachment' => $attachment, + 'status' => $direction === 'out' ? 'sent' : 'sent', + 'deliveryStatus' => $direction === 'out' ? 'sent' : '', + 'recalled' => false, + 'recallStatus' => '', + 'editedAt' => $editedAt, + 'timestamp' => $timestamp, + 'activityTimestamp' => $activityTimestamp, + 'displayTimestamp' => $timestamp, + 'conversationType' => (string)($group['category'] ?? 'group'), + ]; +} + +function loadWebGroupMessages(PDO $appDb, string $userId, string $groupId, int $limit, bool $markRead): array +{ + ensureWebImAppTables(); + $role = webGroupRole($appDb, $userId, $groupId); + if ($role === '') { + return []; + } + + $groupStatement = $appDb->prepare('select * from `t_web_groups` where `group_id` = ? and `deleted` = 0 limit 1'); + $groupStatement->execute([$groupId]); + $group = $groupStatement->fetch(); + if (!$group) { + return []; + } + + $statement = $appDb->prepare( + 'select msg.*,' + . ' coalesce(sender_member.`role`, if(g.`owner_uid` = msg.`sender_uid`, "owner", "member")) as `sender_role`,' + . ' coalesce(sender_member.`alias`, "") as `sender_alias`' + . ' from `t_web_group_messages` msg' + . ' join `t_web_groups` g on g.`group_id` = msg.`group_id` and g.`deleted` = 0' + . ' left join `t_web_group_members` sender_member' + . ' on sender_member.`group_id` = msg.`group_id`' + . ' and sender_member.`user_id` = msg.`sender_uid`' + . ' and sender_member.`status` = 0' + . ' where msg.`group_id` = ? and msg.`recalled` = 0' + . ' order by msg.`created_at_ms` desc, msg.`id` desc limit ' . $limit + ); + $statement->execute([$groupId]); + $rows = array_reverse($statement->fetchAll()); + $attachmentMap = fetchAttachmentMap($appDb, array_column($rows, 'message_uid')); + $users = fetchUserInfoMap(imDb(), array_column($rows, 'sender_uid'), $userId); + + $readTimestamp = 0; + $messages = []; + foreach ($rows as $row) { + $messageId = (string)$row['message_uid']; + $message = formatWebGroupMessage($row, $userId, $group, $attachmentMap[$messageId] ?? null, $users); + $readTimestamp = max($readTimestamp, (int)$message['activityTimestamp']); + $messages[] = $message; + } + + if ($markRead) { + markWebGroupRead($appDb, $userId, $groupId, $readTimestamp); + } + + return $messages; +} + +function loadWebGroupConversations(PDO $appDb, string $userId, int $limit): array +{ + ensureWebImAppTables(); + $statement = $appDb->prepare( + 'select g.*, m.`role`' + . ' from `t_web_groups` g' + . ' join `t_web_group_members` m on m.`group_id` = g.`group_id` and m.`status` = 0' + . ' where g.`deleted` = 0 and m.`user_id` = ?' + . ' order by g.`updated_at_ms` desc limit ' . min(max($limit, 50), 100) + ); + $statement->execute([$userId]); + $groups = $statement->fetchAll(); + if (!$groups) { + return []; + } + + $lastMessageStatement = $appDb->prepare( + 'select * from `t_web_group_messages`' + . ' where `group_id` = ? and `recalled` = 0' + . ' order by greatest(`created_at_ms`, `edited_at_ms`) desc, `id` desc limit 1' + ); + $readStatement = $appDb->prepare( + 'select `read_at_ms` from `t_web_group_reads` where `group_id` = ? and `user_id` = ? limit 1' + ); + $lastAttachmentStatement = $appDb->prepare( + 'select `attachment_type`, `url`, `name`, `mime`, `size_bytes`' + . ' from `t_web_message_attachments` where `message_uid` = ? limit 1' + ); + $unreadStatement = $appDb->prepare( + 'select count(*) from `t_web_group_messages`' + . ' where `group_id` = ? and `sender_uid` <> ? and `recalled` = 0' + . ' and greatest(`created_at_ms`, `edited_at_ms`) > ?' + ); + $memberCountStatement = $appDb->prepare( + 'select count(*) from `t_web_group_members` where `group_id` = ? and `status` = 0' + ); + + $conversations = []; + foreach ($groups as $group) { + $groupId = (string)$group['group_id']; + $lastMessageStatement->execute([$groupId]); + $lastMessage = $lastMessageStatement->fetch(); + $readStatement->execute([$groupId, $userId]); + $readAt = (int)($readStatement->fetchColumn() ?: 0); + $unreadStatement->execute([$groupId, $userId, $readAt]); + $unread = (int)$unreadStatement->fetchColumn(); + $memberCountStatement->execute([$groupId]); + $memberCount = (int)$memberCountStatement->fetchColumn(); + + $title = (string)$group['name']; + $category = (string)$group['category']; + $isChannel = $category === 'channel'; + $lastAttachment = null; + if ($lastMessage) { + $lastAttachmentStatement->execute([(string)$lastMessage['message_uid']]); + $lastAttachmentRow = $lastAttachmentStatement->fetch(); + $lastAttachment = $lastAttachmentRow ? normalizeAttachmentRow($lastAttachmentRow) : null; + } + $subtitle = $lastMessage + ? (messagePreviewText([ + 'text' => attachmentDisplayText((string)$lastMessage['text'], $lastAttachment), + 'attachment' => $lastAttachment, + ]) ?: (string)$lastMessage['text']) + : ($isChannel ? '公告群' : ($memberCount > 0 ? $memberCount . ' 位成员' : '群组')); + $updatedAt = $lastMessage + ? max((int)$lastMessage['created_at_ms'], (int)($lastMessage['edited_at_ms'] ?? 0)) + : (int)$group['updated_at_ms']; + + $conversations[] = [ + 'id' => 'group-' . $groupId, + 'type' => $isChannel ? 'channel' : 'group', + 'target' => $groupId, + 'title' => $title, + 'subtitle' => $subtitle, + 'unread' => $unread, + 'avatarText' => mb_strtoupper(mb_substr($title, 0, 1, 'UTF-8'), 'UTF-8'), + 'updatedAt' => $updatedAt, + 'role' => (string)$group['role'], + 'memberCount' => $memberCount, + 'raw' => [ + 'type' => 'group', + 'target' => $groupId, + 'line' => 0, + 'category' => $category, + 'role' => (string)$group['role'], + ], + ]; + } + + return $conversations; +} + +function isRecallMessage(array $row): bool +{ + return (int)($row['_content_type'] ?? 0) === 80; +} + +function shouldDisplayMessageForUser(array $row, string $currentUserId): bool +{ + if (!isRecallMessage($row)) { + return true; + } + + return (string)$row['_from'] === $currentUserId; +} + +function formatMessage( + array $row, + string $currentUserId, + string $peerId, + array $receiptState = [], + array $editState = [], + ?array $attachment = null +): array +{ + $messageId = (string)$row['_mid']; + $from = (string)$row['_from']; + $contentType = (int)($row['_content_type'] ?? 0); + $isRecalled = $contentType === 80; + $text = (string)($row['_searchable_key'] ?? ''); + $timestamp = timestampMs((string)($row['_dt'] ?? ''), $messageId); + $direction = $from === $currentUserId ? 'out' : 'in'; + $messageType = $attachment ? (string)$attachment['type'] : (($contentType === 1 || $isRecalled) ? 'text' : 'unknown'); + $messageText = $text !== '' ? $text : ($isRecalled || $attachment ? '' : '[暂不支持的消息类型]'); + $messageText = attachmentDisplayText($messageText, $attachment); + $editedAt = (int)($editState['editedAt'] ?? 0); + $activityTimestamp = messageActivityTimestamp($timestamp, $editState); + $deliveryStatus = $direction === 'out' && !$isRecalled + ? outgoingDeliveryStatus($activityTimestamp, $receiptState) + : ''; + + return [ + 'id' => $messageId, + 'messageUid' => $messageId, + 'conversationId' => 'single-' . $peerId, + 'from' => $from, + 'to' => $from === $currentUserId ? $peerId : $currentUserId, + 'target' => $peerId, + 'direction' => $direction, + 'type' => $messageType, + 'contentType' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : 5) : $contentType, + 'text' => $messageText, + 'attachment' => $attachment, + 'status' => $isRecalled && $direction === 'out' ? 'recalled' : ($direction === 'out' ? $deliveryStatus : 'sent'), + 'deliveryStatus' => $deliveryStatus, + 'recalled' => $isRecalled, + 'recallStatus' => $isRecalled ? '已撤回' : '', + 'editedAt' => $editedAt, + 'timestamp' => $timestamp, + 'activityTimestamp' => $activityTimestamp, + 'displayTimestamp' => $timestamp, + ]; +} + +function loadConversationMessages(PDO $db, string $userId, string $targetId, int $limit, bool $markRead): array +{ + $table = imUserMessagesTable($userId); + $conversationKeys = [$userId . '|' . $targetId, $targetId . '|' . $userId]; + $scanLimit = min(max($limit * 4, $limit), 400); + $statement = $db->prepare( + 'select `_mid`, `_dt` from `' . $table . '`' + . ' where `_uid` = ? and `_type` = 0 and `_line` = 0' + . ' and `_target` in (?, ?)' + . ' order by `_mid` desc limit ' . $scanLimit + ); + $statement->execute([$userId, $conversationKeys[0], $conversationKeys[1]]); + $userRows = $statement->fetchAll(); + $messageRows = fetchMessageRows($db, array_column($userRows, '_mid')); + $editMap = fetchMessageEditMap($db, array_column($userRows, '_mid')); + $attachmentMap = fetchAttachmentMap(imAppDb(), array_column($userRows, '_mid')); + $receiptState = loadPeerReceiptState($db, $userId, $targetId); + + $messages = []; + $seenMessageIds = []; + $readTimestamp = 0; + foreach ($userRows as $userRow) { + $messageId = (string)$userRow['_mid']; + if (isset($seenMessageIds[$messageId]) || !isset($messageRows[$messageId])) { + continue; + } + $seenMessageIds[$messageId] = true; + if (!shouldDisplayMessageForUser($messageRows[$messageId], $userId)) { + continue; + } + $message = formatMessage( + $messageRows[$messageId], + $userId, + $targetId, + $receiptState, + $editMap[$messageId] ?? [], + $attachmentMap[$messageId] ?? null + ); + $messages[] = $message; + $readTimestamp = max($readTimestamp, (int)$message['activityTimestamp']); + if (count($messages) >= $limit) { + break; + } + } + $messages = array_reverse($messages); + + if ($markRead) { + markConversationRead($db, $userId, $targetId, $readTimestamp); + } + + return $messages; +} + +function loadRecentConversations(PDO $db, string $userId, int $limit): array +{ + $table = imUserMessagesTable($userId); + $scanLimit = min(max($limit * 20, 200), 1000); + $statement = $db->prepare( + 'select `_mid`, `_target`, `_dt` from `' . $table . '`' + . ' where `_uid` = ? and `_type` = 0 and `_line` = 0' + . ' order by `_mid` desc limit ' . $scanLimit + ); + $statement->execute([$userId]); + + $scanRows = $statement->fetchAll(); + $messageRows = fetchMessageRows($db, array_column($scanRows, '_mid')); + $editMap = fetchMessageEditMap($db, array_column($scanRows, '_mid')); + $attachmentMap = fetchAttachmentMap(imAppDb(), array_column($scanRows, '_mid')); + $latestByPeer = []; + foreach ($scanRows as $row) { + $messageId = (string)$row['_mid']; + $message = $messageRows[$messageId] ?? null; + $peerId = peerFromConversationTarget($userId, (string)$row['_target']); + if ($peerId === '' || !$message) { + continue; + } + if (!shouldDisplayMessageForUser($message, $userId)) { + continue; + } + $activityTimestamp = messageActivityTimestamp( + timestampMs((string)($message['_dt'] ?? ''), $messageId), + $editMap[$messageId] ?? [] + ); + if (!isset($latestByPeer[$peerId]) || $activityTimestamp > (int)($latestByPeer[$peerId]['_activity_at'] ?? 0)) { + $row['_activity_at'] = $activityTimestamp; + $latestByPeer[$peerId] = $row; + } + } + uasort($latestByPeer, static fn($a, $b) => (int)($b['_activity_at'] ?? 0) <=> (int)($a['_activity_at'] ?? 0)); + $latestByPeer = array_slice($latestByPeer, 0, $limit, true); + + $users = fetchUserInfoMap($db, array_keys($latestByPeer), $userId); + $readAtByPeer = loadOwnReadStateMap($db, $userId, array_keys($latestByPeer)); + $unreadByPeer = []; + $seenUnreadMessageIds = []; + + foreach ($scanRows as $row) { + $messageId = (string)$row['_mid']; + if (isset($seenUnreadMessageIds[$messageId])) { + continue; + } + $seenUnreadMessageIds[$messageId] = true; + $peerId = peerFromConversationTarget($userId, (string)$row['_target']); + $message = $messageRows[$messageId] ?? null; + if ($peerId === '' || !$message || !isset($latestByPeer[$peerId])) { + continue; + } + if ((string)$message['_from'] === $userId) { + continue; + } + if (isRecallMessage($message)) { + continue; + } + $timestamp = timestampMs((string)($message['_dt'] ?? ''), $messageId); + $activityTimestamp = messageActivityTimestamp($timestamp, $editMap[$messageId] ?? []); + if ($activityTimestamp > (int)($readAtByPeer[$peerId] ?? 0)) { + $unreadByPeer[$peerId] = (int)($unreadByPeer[$peerId] ?? 0) + 1; + } + } + + $conversations = []; + + foreach ($latestByPeer as $peerId => $userRow) { + $messageId = (string)$userRow['_mid']; + $message = isset($messageRows[$messageId]) + ? formatMessage($messageRows[$messageId], $userId, $peerId, [], $editMap[$messageId] ?? [], $attachmentMap[$messageId] ?? null) + : null; + $title = userTitle($users, $peerId); + $conversations[] = [ + 'id' => 'single-' . $peerId, + 'type' => 'single', + 'target' => $peerId, + 'title' => $title, + 'subtitle' => $message ? (messagePreviewText($message) !== '' ? messagePreviewText($message) : (empty($message['recalled']) ? '' : '已撤回')) : '', + 'unread' => (int)($unreadByPeer[$peerId] ?? 0), + 'portrait' => (string)($users[$peerId]['_portrait'] ?? ''), + 'avatarText' => mb_strtoupper(mb_substr($title, 0, 1, 'UTF-8'), 'UTF-8'), + 'updatedAt' => $message ? $message['activityTimestamp'] : timestampMs((string)($userRow['_dt'] ?? ''), $messageId), + 'raw' => ['type' => 'single', 'target' => $peerId, 'line' => 0], + ]; + } + + try { + $conversations = array_merge($conversations, loadWebGroupConversations(imAppDb(), $userId, $limit)); + } catch (Throwable) { + // Keep single-chat sync available if appdata group metadata is temporarily unavailable. + } + + usort($conversations, static fn($a, $b) => $b['updatedAt'] <=> $a['updatedAt']); + + return array_slice($conversations, 0, $limit); +} + +$payload = readJsonPayload(); +$userId = trim((string)($payload['userId'] ?? '')); +$target = trim((string)($payload['target'] ?? '')); +$limit = clampLimit($payload['limit'] ?? 50, 50, 100); +$markRead = payloadBool($payload['markRead'] ?? false); +$conversationType = normalizeConversationType($payload['conversationType'] ?? $payload['type'] ?? 0); + +if ($userId === '') { + respond(400, '缺少用户ID'); +} + +try { + $db = imDb(); + $userId = resolveUserId($db, $userId); + markUserDelivered($db, $userId, nowMs()); + + if ($target !== '') { + $targetId = resolveUserId($db, $target); + if ($conversationType === 'group' || isWebGroupTarget(imAppDb(), $target)) { + respond(0, 'success', [ + 'messages' => loadWebGroupMessages(imAppDb(), $userId, $target, $limit, $markRead), + ]); + } + respond(0, 'success', [ + 'messages' => loadConversationMessages($db, $userId, $targetId, $limit, $markRead), + ]); + } + + respond(0, 'success', [ + 'conversations' => loadRecentConversations($db, $userId, $limit), + ]); +} catch (Throwable $error) { + respond(500, $error->getMessage() ?: '消息同步失败'); +} diff --git a/dist/api/platform_config.php b/dist/api/platform_config.php new file mode 100644 index 0000000..4af4665 --- /dev/null +++ b/dist/api/platform_config.php @@ -0,0 +1,39 @@ +prepare( + 'select `conf_name`, `conf_value`, `updated_at` from `system_conf` where `conf_name` in (?, ?)' + ); + $statement->execute(['PlatformName', 'sys_logo']); + + $config = []; + $updatedAtValues = []; + foreach ($statement->fetchAll() as $row) { + $config[(string)$row['conf_name']] = trim((string)($row['conf_value'] ?? '')); + $updatedAtValues[] = (string)($row['updated_at'] ?? ''); + } + + $platformName = $config['PlatformName'] ?? ''; + $logo = $config['sys_logo'] ?? ''; + $version = implode('|', array_values(array_filter($updatedAtValues ?? []))); + + respond(0, 'success', [ + 'platformName' => $platformName !== '' ? $platformName : $defaultName, + 'logo' => $logo !== '' ? $logo : $defaultLogo, + 'version' => $version, + ]); +} catch (Throwable $error) { + respond(500, $error->getMessage() ?: '平台配置加载失败', [ + 'platformName' => $defaultName, + 'logo' => $defaultLogo, + ]); +} diff --git a/dist/api/profile.php b/dist/api/profile.php new file mode 100644 index 0000000..687afe9 --- /dev/null +++ b/dist/api/profile.php @@ -0,0 +1,321 @@ + $uid, + 'userId' => $uid, + 'name' => (string)($user['name'] ?? $user['_name'] ?? ''), + 'displayName' => (string)($user['displayName'] ?? $user['_display_name'] ?? $user['name'] ?? $user['_name'] ?? $uid), + 'mobile' => (string)($user['mobile'] ?? $user['_mobile'] ?? ''), + 'portrait' => (string)($user['portrait'] ?? $user['_portrait'] ?? ''), + 'address' => (string)($user['address'] ?? $user['_address'] ?? ''), + ]; +} + +function tryProfileUserInfo(array $payload): ?array +{ + try { + $result = requireImSuccess(imAdminPost('/admin/user/get_info', $payload), '用户资料加载失败'); + return $result ?: null; + } catch (Throwable) { + return null; + } +} + +function loadProfileUserFromDb(string $identity): ?array +{ + $statement = imDb()->prepare( + 'select `_uid`, `_name`, `_display_name`, `_mobile`, `_portrait`, `_address`' + . ' from `t_user` where `_uid` = ? or `_mobile` = ? or `_name` = ?' + . ' order by case when `_uid` = ? then 0 when `_mobile` = ? then 1 when `_name` = ? then 2 else 3 end' + . ' limit 1' + ); + $statement->execute([$identity, $identity, $identity, $identity, $identity, $identity]); + $row = $statement->fetch(); + return $row ? normalizeProfileUser($row) : null; +} + +function mergeProfileUser(array $primary, ?array $fallback): array +{ + if (!$fallback) { + return $primary; + } + + $fallback = normalizeProfileUser($fallback); + foreach (['name', 'displayName', 'mobile', 'portrait', 'address'] as $key) { + if ((string)($primary[$key] ?? '') === '' && (string)($fallback[$key] ?? '') !== '') { + $primary[$key] = (string)$fallback[$key]; + } + } + + return $primary; +} + +function persistProfileUserToDb(string $userId, string $displayName, string $portrait): void +{ + if ($portrait !== '') { + $statement = imDb()->prepare( + 'update `t_user` set `_display_name` = ?, `_portrait` = ?, `_dt` = ? where `_uid` = ? limit 1' + ); + $statement->execute([$displayName, $portrait, webImNowMs(), $userId]); + return; + } + + $statement = imDb()->prepare( + 'update `t_user` set `_display_name` = ?, `_dt` = ? where `_uid` = ? limit 1' + ); + $statement->execute([$displayName, webImNowMs(), $userId]); +} + +function loadProfileUser(string $identity, bool $preferMobile = true): array +{ + $identity = trim($identity); + if ($identity === '') { + respond(400, '缺少用户ID'); + } + + $dbUser = loadProfileUserFromDb($identity); + if ($dbUser) { + $fallback = null; + if ((string)($dbUser['portrait'] ?? '') === '') { + $fallback = tryProfileUserInfo(['userId' => $dbUser['userId']]); + if (!$fallback && (string)($dbUser['mobile'] ?? '') !== '') { + $fallback = tryProfileUserInfo(['mobile' => $dbUser['mobile']]); + } + if (!$fallback && (string)($dbUser['name'] ?? '') !== '') { + $fallback = tryProfileUserInfo(['name' => $dbUser['name']]); + } + } + + return mergeProfileUser($dbUser, $fallback); + } + + $user = null; + if ($preferMobile && preg_match('/^\+?\d{5,32}$/', $identity)) { + $user = tryProfileUserInfo(['mobile' => $identity]); + } + if (!$user) { + $user = tryProfileUserInfo(['userId' => $identity]); + } + if (!$user) { + $user = tryProfileUserInfo(['name' => $identity]); + } + if (!$user) { + respond(404, '用户资料不存在'); + } + + return normalizeProfileUser($user); +} + +function readProfileJavaSerializedString(string $data, int $offset): ?array +{ + if ($offset + 3 > strlen($data) || ord($data[$offset]) !== 0x74) { + return null; + } + + $length = (ord($data[$offset + 1]) << 8) | ord($data[$offset + 2]); + $start = $offset + 3; + if ($start + $length > strlen($data)) { + return null; + } + + return [substr($data, $start, $length), $start + $length]; +} + +function profileSessionUserId(string $sessionData): string +{ + $marker = "\x74\x00\x06userId"; + $offset = strpos($sessionData, $marker); + if ($offset === false) { + return ''; + } + + $decoded = readProfileJavaSerializedString($sessionData, $offset + strlen($marker)); + $userId = is_array($decoded) ? (string)$decoded[0] : ''; + if (!preg_match('/^[A-Za-z0-9_:@.+-]{1,128}$/', $userId)) { + return ''; + } + + return $userId; +} + +function requireProfileUpdateAuth(string $targetUserId): void +{ + $authToken = trim((string)($_SERVER['HTTP_AUTHTOKEN'] ?? $_SERVER['HTTP_AUTH_TOKEN'] ?? '')); + if ($authToken === '') { + respond(401, '请重新登录后再修改资料'); + } + + $statement = imAppDb()->prepare('select `session_data` from `shiro_session` where `session_id` = ? limit 1'); + $statement->execute([$authToken]); + $row = $statement->fetch(); + if (!$row) { + respond(401, '登录状态已失效,请重新登录'); + } + + $sessionUserId = profileSessionUserId((string)$row['session_data']); + if ($sessionUserId === '' || $sessionUserId !== $targetUserId) { + respond(403, '只能修改自己的资料'); + } +} + +function profileUploadedFileExtension(string $fileName, string $mime): string +{ + $extension = strtolower((string)pathinfo($fileName, PATHINFO_EXTENSION)); + $extension = preg_replace('/[^a-z0-9]/', '', $extension) ?: ''; + if ($extension === 'jpeg') { + $extension = 'jpg'; + } + + $allowedExtensions = ['jpg', 'png', 'gif', 'webp', 'bmp', 'ico']; + if (in_array($extension, $allowedExtensions, true)) { + return $extension; + } + + return match ($mime) { + 'image/jpeg' => 'jpg', + 'image/png' => 'png', + 'image/gif' => 'gif', + 'image/webp' => 'webp', + 'image/bmp', 'image/x-ms-bmp' => 'bmp', + 'image/x-icon', 'image/vnd.microsoft.icon' => 'ico', + default => 'jpg', + }; +} + +function profilePublicMediaBaseUrl(): string +{ + $isHttps = (string)($_SERVER['HTTPS'] ?? '') !== '' && strtolower((string)$_SERVER['HTTPS']) !== 'off'; + $scheme = $isHttps ? 'https' : 'http'; + $host = (string)($_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? '127.0.0.1'); + $host = trim(preg_replace('/:\d+$/', '', $host) ?: '127.0.0.1'); + + return $scheme . '://' . $host . ':' . IM_LOCAL_MEDIA_PUBLIC_PORT; +} + +function uploadProfilePortrait(array $file): string +{ + if (($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) { + throw new RuntimeException('头像上传失败'); + } + if (($file['size'] ?? 0) <= 0 || ($file['size'] ?? 0) > 5 * 1024 * 1024) { + throw new RuntimeException('头像不能超过5MB'); + } + + $tmpName = (string)($file['tmp_name'] ?? ''); + $mime = mime_content_type($tmpName) ?: ''; + if (!str_starts_with($mime, 'image/')) { + throw new RuntimeException('头像必须是图片文件'); + } + + if (!is_dir(IM_LOCAL_MEDIA_ROOT) || !is_writable(IM_LOCAL_MEDIA_ROOT)) { + throw new RuntimeException('头像存储目录不可写'); + } + + $datePath = 'fs/' . PROFILE_PORTRAIT_MEDIA_TYPE . '/' . date('Y/m/d/H/i/s'); + $targetDir = rtrim(IM_LOCAL_MEDIA_ROOT, '/') . '/' . $datePath; + if (!is_dir($targetDir) && !mkdir($targetDir, 0775, true)) { + throw new RuntimeException('头像存储目录创建失败'); + } + + $extension = profileUploadedFileExtension((string)($file['name'] ?? 'avatar.jpg'), $mime); + $targetName = bin2hex(random_bytes(12)) . '.' . $extension; + $targetPath = $targetDir . '/' . $targetName; + if (!move_uploaded_file($tmpName, $targetPath)) { + throw new RuntimeException('头像文件保存失败'); + } + @chmod($targetPath, 0644); + + return profilePublicMediaBaseUrl() . '/' . $datePath . '/' . $targetName; +} + +try { + $contentType = (string)($_SERVER['CONTENT_TYPE'] ?? ''); + $isMultipart = stripos($contentType, 'multipart/form-data') !== false; + $payload = $isMultipart ? [] : readJsonPayload(); + $action = $isMultipart + ? profileRequestValue('action', 'update') + : trim((string)($payload['action'] ?? 'get')); + $userId = $isMultipart + ? profileRequestValue('userId') + : trim((string)($payload['userId'] ?? $_GET['userId'] ?? '')); + + $currentProfile = loadProfileUser($userId); + + if ($action === 'get') { + respond(0, 'success', ['profile' => $currentProfile]); + } + + if ($action !== 'update') { + respond(400, '不支持的资料操作'); + } + requireProfileUpdateAuth((string)$currentProfile['userId']); + + $displayName = $isMultipart + ? profileRequestValue('displayName') + : trim((string)($payload['displayName'] ?? '')); + if ($displayName === '') { + respond(400, '昵称不能为空'); + } + if (mb_strlen($displayName, 'UTF-8') > 64) { + respond(400, '昵称不能超过64个字'); + } + + $portrait = ''; + if (!empty($_FILES['portraitFile']) && ($_FILES['portraitFile']['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_NO_FILE) { + $portrait = uploadProfilePortrait($_FILES['portraitFile']); + } + + $flag = PROFILE_DISPLAY_NAME_FLAG; + $userInfo = [ + 'userId' => $currentProfile['userId'], + 'displayName' => $displayName, + ]; + if ($portrait !== '') { + $flag |= PROFILE_PORTRAIT_FLAG; + $userInfo['portrait'] = $portrait; + } + + requireImSuccess( + imAdminPost('/admin/user/update', [ + 'flag' => $flag, + 'userInfo' => $userInfo, + ]), + '用户资料保存失败' + ); + persistProfileUserToDb($currentProfile['userId'], $displayName, $portrait); + + $updatedProfile = loadProfileUser($currentProfile['userId'], false); + if ($portrait === '' && (string)$updatedProfile['portrait'] === '' && (string)($currentProfile['portrait'] ?? '') !== '') { + $updatedProfile['portrait'] = (string)$currentProfile['portrait']; + } + if ($portrait !== '' && (string)$updatedProfile['portrait'] === '') { + $updatedProfile['portrait'] = $portrait; + } + if ((string)$updatedProfile['displayName'] === '') { + $updatedProfile['displayName'] = $displayName; + } + + respond(0, 'success', ['profile' => $updatedProfile]); +} catch (Throwable $error) { + respond(500, $error->getMessage() ?: '用户资料服务暂不可用'); +} diff --git a/dist/api/send_message.php b/dist/api/send_message.php new file mode 100644 index 0000000..292e858 --- /dev/null +++ b/dist/api/send_message.php @@ -0,0 +1,411 @@ +setTimezone(new DateTimeZone(IM_DB_TIMEZONE)); + $currentMinutes = ((int)$now->format('H')) * 60 + (int)$now->format('i'); + [$startHour, $startMinute] = array_map('intval', explode(':', $dailyStart)); + [$endHour, $endMinute] = array_map('intval', explode(':', $dailyEnd)); + $startMinutes = $startHour * 60 + $startMinute; + $endMinutes = $endHour * 60 + $endMinute; + if ($startMinutes === $endMinutes) { + return true; + } + if ($startMinutes < $endMinutes) { + return $currentMinutes >= $startMinutes && $currentMinutes < $endMinutes; + } + + return $currentMinutes >= $startMinutes || $currentMinutes < $endMinutes; +} + +function isGroupMutedForSender(PDO $appDb, string $groupId, string $role, int $nowMs): bool +{ + if ($role === 'owner') { + return false; + } + + $statement = $appDb->prepare('select * from `t_web_group_mute_rules` where `group_id` = ? and `enabled` = 1 limit 1'); + $statement->execute([$groupId]); + $rule = $statement->fetch(); + if (!is_array($rule)) { + return false; + } + + $mode = (string)$rule['mode']; + if ($mode === 'off') { + return false; + } + if ($mode === 'all_except_admins' && $role === 'admin') { + return false; + } + if (!in_array($mode, ['all_include_admins', 'all_except_admins'], true)) { + return false; + } + + $scheduleType = (string)$rule['schedule_type']; + if ($scheduleType === 'manual') { + return true; + } + if ($scheduleType === 'daily') { + return isDailyMuteActive((string)$rule['daily_start'], (string)$rule['daily_end'], $nowMs); + } + + $startsAtMs = (int)$rule['starts_at_ms']; + $endsAtMs = (int)$rule['ends_at_ms']; + return $startsAtMs > 0 && $endsAtMs > $startsAtMs && $nowMs >= $startsAtMs && $nowMs < $endsAtMs; +} + +function messageRequestValue(array $payload, string $key, string $default = ''): string +{ + return trim((string)($_POST[$key] ?? $payload[$key] ?? $default)); +} + +function safeUploadName(string $fileName): string +{ + $name = basename(str_replace('\\', '/', $fileName)); + $name = preg_replace('/[^\p{L}\p{N}._ -]+/u', '_', $name) ?: 'file'; + $name = trim($name, " .\t\n\r\0\x0B"); + + return $name !== '' ? mb_substr($name, 0, 180, 'UTF-8') : 'file'; +} + +function uploadExtension(string $fileName, string $mime, string $attachmentType): string +{ + $extension = strtolower((string)pathinfo($fileName, PATHINFO_EXTENSION)); + $extension = preg_replace('/[^a-z0-9]/', '', $extension) ?: ''; + if ($extension === 'jpeg') { + $extension = 'jpg'; + } + + if ($attachmentType === 'image') { + if (in_array($extension, ['jpg', 'png', 'gif', 'webp', 'bmp', 'svg', 'avif', 'heic', 'heif'], true)) { + return $extension; + } + return match ($mime) { + 'image/jpeg' => 'jpg', + 'image/png' => 'png', + 'image/gif' => 'gif', + 'image/webp' => 'webp', + 'image/bmp', 'image/x-ms-bmp' => 'bmp', + 'image/svg+xml' => 'svg', + 'image/avif' => 'avif', + 'image/heic' => 'heic', + 'image/heif' => 'heif', + default => 'jpg', + }; + } + + if ($extension !== '') { + return $extension; + } + + return 'bin'; +} + +function detectedUploadMime(string $tmpName): string +{ + $mime = mime_content_type($tmpName) ?: ''; + if ($mime !== '' && $mime !== 'application/octet-stream') { + return $mime; + } + + $imageInfo = @getimagesize($tmpName); + if (is_array($imageInfo) && !empty($imageInfo['mime'])) { + return (string)$imageInfo['mime']; + } + + return $mime !== '' ? $mime : 'application/octet-stream'; +} + +function normalizedImageUploadMime(string $tmpName, string $mime): string +{ + if (str_starts_with($mime, 'image/')) { + return $mime; + } + + $imageInfo = @getimagesize($tmpName); + $imageMime = is_array($imageInfo) ? (string)($imageInfo['mime'] ?? '') : ''; + if ($imageMime !== '' && str_starts_with($imageMime, 'image/')) { + return $imageMime; + } + + throw new RuntimeException('请选择图片文件'); +} + +function mediaPublicBaseUrl(): string +{ + $isHttps = (string)($_SERVER['HTTPS'] ?? '') !== '' && strtolower((string)$_SERVER['HTTPS']) !== 'off'; + $scheme = $isHttps ? 'https' : 'http'; + $host = trim(preg_replace('/:\d+$/', '', (string)($_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? '127.0.0.1')) ?: '127.0.0.1'); + + return $scheme . '://' . $host . ':' . WEB_MEDIA_PUBLIC_PORT; +} + +function saveMessageAttachmentFile(array $file, string $attachmentType): array +{ + if (($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) { + throw new RuntimeException('文件上传失败'); + } + $size = (int)($file['size'] ?? 0); + $maxSize = $attachmentType === 'image' ? WEB_IMAGE_MAX_BYTES : WEB_FILE_MAX_BYTES; + if ($size <= 0 || $size > $maxSize) { + throw new RuntimeException($attachmentType === 'image' ? '图片不能超过10MB' : '文件不能超过50MB'); + } + if (!is_dir(WEB_MEDIA_ROOT) || !is_writable(WEB_MEDIA_ROOT)) { + throw new RuntimeException('媒体存储目录不可写'); + } + + $tmpName = (string)($file['tmp_name'] ?? ''); + if ($tmpName === '' || !is_uploaded_file($tmpName)) { + throw new RuntimeException('文件上传失败'); + } + $mime = detectedUploadMime($tmpName); + if ($attachmentType === 'image') { + $mime = normalizedImageUploadMime($tmpName, $mime); + } + + $mediaType = $attachmentType === 'image' ? WEB_MEDIA_TYPE_IMAGE : WEB_MEDIA_TYPE_FILE; + $datePath = 'fs/' . $mediaType . '/' . date('Y/m/d/H/i/s'); + $targetDir = rtrim(WEB_MEDIA_ROOT, '/') . '/' . $datePath; + if (!is_dir($targetDir) && !mkdir($targetDir, 0775, true)) { + throw new RuntimeException('媒体存储目录创建失败'); + } + + $originalName = safeUploadName((string)($file['name'] ?? ($attachmentType === 'image' ? 'image.jpg' : 'file'))); + $extension = uploadExtension($originalName, $mime, $attachmentType); + $targetName = bin2hex(random_bytes(12)) . '.' . $extension; + $targetPath = $targetDir . '/' . $targetName; + if (!move_uploaded_file($tmpName, $targetPath)) { + throw new RuntimeException('文件保存失败'); + } + @chmod($targetPath, 0644); + + return [ + 'type' => $attachmentType, + 'url' => mediaPublicBaseUrl() . '/' . $datePath . '/' . $targetName, + 'name' => $originalName, + 'mime' => $mime, + 'size' => $size, + 'mediaType' => $mediaType, + ]; +} + +function storeMessageAttachment( + PDO $appDb, + string $messageUid, + string $conversationType, + string $target, + string $sender, + array $attachment, + int $timestamp +): void { + if ($messageUid === '' || empty($attachment['url'])) { + return; + } + + $statement = $appDb->prepare( + 'insert into `t_web_message_attachments`' + . ' (`message_uid`, `conversation_type`, `target_id`, `sender_uid`, `attachment_type`, `url`, `name`, `mime`, `size_bytes`, `created_at_ms`)' + . ' values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' + . ' on duplicate key update' + . ' `attachment_type` = values(`attachment_type`),' + . ' `url` = values(`url`),' + . ' `name` = values(`name`),' + . ' `mime` = values(`mime`),' + . ' `size_bytes` = values(`size_bytes`)' + ); + $statement->execute([ + $messageUid, + $conversationType, + $target, + $sender, + (string)$attachment['type'], + (string)$attachment['url'], + (string)$attachment['name'], + (string)$attachment['mime'], + (int)$attachment['size'], + $timestamp, + ]); +} + +function attachmentFromRequest(string $messageType): ?array +{ + if (!in_array($messageType, ['image', 'file'], true)) { + return null; + } + + $attachmentFile = $_FILES['attachment'] ?? $_FILES['file'] ?? null; + if (!is_array($attachmentFile)) { + respond(400, '缺少上传文件'); + } + + return saveMessageAttachmentFile($attachmentFile, $messageType); +} + +$contentTypeHeader = (string)($_SERVER['CONTENT_TYPE'] ?? ''); +$isMultipart = stripos($contentTypeHeader, 'multipart/form-data') !== false; +$payload = $isMultipart ? [] : readJsonPayload(); +$sender = messageRequestValue($payload, 'sender'); +$target = messageRequestValue($payload, 'target'); +$text = messageRequestValue($payload, 'text'); +$messageType = messageRequestValue($payload, 'messageType', 'text'); +$conversationType = $_POST['conversationType'] ?? $_POST['type'] ?? $payload['conversationType'] ?? $payload['type'] ?? 0; +$isGroupConversation = in_array((string)$conversationType, ['1', 'group', 'channel'], true); +$attachment = null; + +if ($sender === '' || $target === '' || ($text === '' && !in_array($messageType, ['image', 'file'], true))) { + respond(400, '缺少发送者、接收者或消息内容'); +} + +try { + if ($isGroupConversation) { + ensureWebImAppTables(); + $appDb = imAppDb(); + $memberStatement = $appDb->prepare( + 'select g.`group_id`, g.`category`, g.`owner_uid`, m.`role`' + . ' from `t_web_groups` g' + . ' join `t_web_group_members` m on m.`group_id` = g.`group_id` and m.`status` = 0' + . ' where g.`deleted` = 0 and g.`group_id` = ? and m.`user_id` = ?' + . ' limit 1' + ); + $memberStatement->execute([$target, $sender]); + $group = $memberStatement->fetch(); + if (!$group) { + respond(403, '你不在该群组中'); + } + $category = (string)($group['category'] ?? 'group'); + $role = (string)($group['role'] ?? 'member'); + if ($category === 'channel' && !in_array($role, ['owner', 'admin'], true)) { + respond(403, '公告群仅管理员可发言'); + } + + $now = webImNowMs(); + if ($category !== 'channel' && isGroupMutedForSender($appDb, $target, $role, $now)) { + respond(403, '当前群组处于禁言时段'); + } + $attachment = attachmentFromRequest($messageType); + $messageUid = webImMessageUid(); + $insert = $appDb->prepare( + 'insert into `t_web_group_messages`' + . ' (`message_uid`, `group_id`, `sender_uid`, `text`, `created_at_ms`, `edited_at_ms`, `recalled`)' + . ' values (?, ?, ?, ?, ?, 0, 0)' + ); + $insert->execute([$messageUid, $target, $sender, $text, $now]); + if ($attachment) { + storeMessageAttachment($appDb, $messageUid, 'group', $target, $sender, $attachment, $now); + } + $updateGroup = $appDb->prepare('update `t_web_groups` set `updated_at_ms` = ? where `group_id` = ?'); + $updateGroup->execute([$now, $target]); + + $nativeError = ''; + try { + $pushContent = $text !== '' + ? $text + : ($attachment + ? ((string)$attachment['type'] === 'image' ? '[图片]' : '[文件] ' . (string)$attachment['name']) + : $text); + $payloadBody = [ + 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : 5) : 1, + 'searchableContent' => $pushContent, + 'pushContent' => $pushContent, + 'content' => $text, + 'persistFlag' => 3, + ]; + if ($attachment) { + $payloadBody['mediaType'] = (int)$attachment['mediaType']; + $payloadBody['remoteMediaUrl'] = (string)$attachment['url']; + $payloadBody['extra'] = json_encode([ + 'name' => (string)$attachment['name'], + 'mime' => (string)$attachment['mime'], + 'size' => (int)$attachment['size'], + ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + } + requireImSuccess(imAdminPost('/admin/message/send', [ + 'sender' => $sender, + 'conv' => [ + 'type' => 1, + 'target' => $target, + 'line' => 0, + ], + 'payload' => $payloadBody, + 'userMessage' => true, + ]), '原生群消息发送失败'); + } catch (Throwable $error) { + $nativeError = $error->getMessage() ?: '原生群消息发送失败'; + } + + respond(0, 'success', [ + 'messageUid' => $messageUid, + 'timestamp' => $now, + 'senderRole' => $role, + 'attachment' => $attachment, + 'nativeError' => $nativeError, + ]); + } + + $attachment = attachmentFromRequest($messageType); + $pushContent = $text !== '' + ? $text + : ($attachment + ? ((string)$attachment['type'] === 'image' ? '[图片]' : '[文件] ' . (string)$attachment['name']) + : $text); + $payloadBody = [ + 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : 5) : 1, + 'searchableContent' => $pushContent, + 'pushContent' => $pushContent, + 'content' => $text, + 'persistFlag' => 3, + ]; + if ($attachment) { + $payloadBody['mediaType'] = (int)$attachment['mediaType']; + $payloadBody['remoteMediaUrl'] = (string)$attachment['url']; + $payloadBody['extra'] = json_encode([ + 'name' => (string)$attachment['name'], + 'mime' => (string)$attachment['mime'], + 'size' => (int)$attachment['size'], + ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + } + + $result = requireImSuccess(imAdminPost('/admin/message/send', [ + 'sender' => $sender, + 'conv' => [ + 'type' => 0, + 'target' => $target, + 'line' => 0, + ], + 'payload' => $payloadBody, + 'userMessage' => true, + ]), '发送失败'); + + $messageUid = isset($result['messageUid']) ? (string)$result['messageUid'] : ''; + $timestamp = (int)($result['timestamp'] ?? webImNowMs()); + if ($attachment && $messageUid !== '') { + ensureWebImAppTables(); + storeMessageAttachment(imAppDb(), $messageUid, 'single', $target, $sender, $attachment, $timestamp); + } + + respond(0, 'success', [ + 'messageUid' => $messageUid !== '' ? $messageUid : null, + 'timestamp' => $timestamp, + 'attachment' => $attachment, + ]); +} catch (Throwable $error) { + respond(500, $error->getMessage() ?: '发送失败'); +} diff --git a/dist/api/update_alias.php b/dist/api/update_alias.php new file mode 100644 index 0000000..87506ca --- /dev/null +++ b/dist/api/update_alias.php @@ -0,0 +1,61 @@ + 32) { + respond(400, '备注名不能超过32个字'); +} + +try { + ensureWebImAppTables(); + $imDb = imDb(); + $exists = $imDb->prepare('select 1 from `t_user` where `_uid` = ? limit 1'); + $exists->execute([$targetId]); + if (!$exists->fetchColumn()) { + respond(404, '没有找到该用户'); + } + + $friend = $imDb->prepare('select 1 from `t_friend` where `_uid` = ? and `_friend_uid` = ? limit 1'); + $friend->execute([$userId, $targetId]); + $isContact = (bool)$friend->fetchColumn(); + + if ($isContact) { + requireImSuccess( + imAdminPost('/admin/friend/set_alias', [ + 'operator' => $userId, + 'targetId' => $targetId, + 'alias' => $alias, + ]), + '备注名修改失败' + ); + } + saveWebUserRemark(imAppDb(), $userId, $targetId, $alias); + + respond(0, 'success', [ + 'contact' => [ + 'uid' => $targetId, + 'alias' => $alias, + 'isContact' => $isContact, + ], + ]); +} catch (Throwable $error) { + respond(500, $error->getMessage() ?: '备注名服务暂不可用'); +} diff --git a/dist/config/runtime-config.js b/dist/config/runtime-config.js new file mode 100644 index 0000000..800e977 --- /dev/null +++ b/dist/config/runtime-config.js @@ -0,0 +1,11 @@ +window.JC_WEB_IM_CONFIG = { + adminServer: 'http://winchen.ezpay.asia:8024', + appServer: 'http://winchen.ezpay.asia:18888', + platformConfigApi: '/api/platform_config.php', + registerConfigApi: 'http://winchen.ezpay.asia:8024/api/register-config', + imServerHost: 'winchen.ezpay.asia', + imRoutePort: 18000, + useWss: false, + wsPath: '/ws', + sdkMode: 'http' +}; diff --git a/dist/css/app.0d8c504a.css b/dist/css/app.0d8c504a.css new file mode 100644 index 0000000..3868b83 --- /dev/null +++ b/dist/css/app.0d8c504a.css @@ -0,0 +1,2778 @@ +:root { + color-scheme: light; + --bg: #f4f6f8; + --panel: #ffffff; + --panel-soft: #f8fafc; + --line: #d9e0e7; + --text: #18212f; + --muted: #6a7584; + --primary: #177d72; + --primary-strong: #0f625a; + --accent: #d84e3f; + --bubble-in: #ffffff; + --bubble-out: #dff4ef; + --rail: #202a33; +} + +* { + box-sizing: border-box; +} + +html, +body, +#app { + width: 100%; + height: 100%; + overflow: hidden; +} + +body { + margin: 0; + min-width: 320px; + background: var(--bg); + color: var(--text); + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +button, +input, +textarea { + font: inherit; +} + +button { + cursor: pointer; +} + +.login-page { + min-height: 100vh; + display: grid; + place-items: center; + padding: 24px; + background: linear-gradient(135deg, #eef6f3 0%, #f7f3ee 55%, #eef2f7 100%); +} + +.login-panel { + width: min(420px, 100%); + padding: 32px; + background: var(--panel); + border: 1px solid var(--line); + border-radius: 8px; + box-shadow: 0 18px 48px rgba(30, 40, 50, 0.12); +} + +.brand-lockup { + display: flex; + align-items: center; + gap: 14px; + margin-bottom: 28px; +} + +.brand-mark, +.rail-avatar, +.conversation-avatar { + display: grid; + place-items: center; + flex: 0 0 auto; +} + +.image-avatar { + -o-object-fit: cover; + object-fit: cover; +} + +.brand-mark { + width: 48px; + height: 48px; + border-radius: 8px; + -o-object-fit: contain; + object-fit: contain; + background: #fff; +} + +.brand-lockup h1, +.list-header h2, +.chat-header h2 { + margin: 0; + font-size: 20px; +} + +.brand-lockup p, +.list-header p, +.chat-header p { + margin: 4px 0 0; + color: var(--muted); + font-size: 13px; +} + +.login-form { + display: grid; + gap: 16px; +} + +.login-tabs, +.code-row, +.phone-row, +.captcha-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; +} + +.login-tabs button, +.code-action { + height: 38px; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; + color: var(--text); +} + +.login-tabs button.active { + border-color: var(--primary); + background: #e8f4f2; + color: var(--primary-strong); + font-weight: 700; +} + +.code-row { + grid-template-columns: minmax(0, 1fr) 112px; +} + +.captcha-row { + grid-template-columns: minmax(0, 1fr) 112px; +} + +.phone-row { + grid-template-columns: 86px minmax(0, 1fr); +} + +.country-code-field { + height: 42px; + display: grid; + grid-template-columns: 24px minmax(0, 1fr); + align-items: center; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; + color: var(--text); + overflow: hidden; +} + +.country-code-field:focus-within { + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12); +} + +.country-code-field span { + display: grid; + place-items: center; + color: var(--muted); + font-weight: 700; +} + +.code-action:disabled { + cursor: not-allowed; + opacity: 0.55; +} + +.login-form label { + display: grid; + gap: 8px; + color: var(--muted); + font-size: 13px; +} + +.label-row { + min-height: 18px; + display: grid; + grid-template-columns: 86px minmax(0, 1fr); + align-items: center; + gap: 8px; +} + +.field-error-badge { + min-height: 28px; + display: grid; + place-items: center; + padding: 4px 10px; + border-radius: 2px; + background: var(--accent); + color: #fff; + font-weight: 700; + line-height: 1.2; + text-align: center; +} + +.login-form input, +.login-form select, +.modal-panel input, +.modal-panel textarea, +.search-box input, +.message-composer textarea { + width: 100%; + border: 1px solid var(--line); + border-radius: 6px; + outline: none; + background: #fff; + color: var(--text); +} + +.login-form input, +.login-form select, +.modal-panel input, +.search-box input { + height: 42px; + padding: 0 12px; +} + +.modal-panel textarea { + min-height: 92px; + resize: vertical; + padding: 10px 12px; + line-height: 1.5; +} + +.login-form .country-code-field input { + height: 40px; + padding: 0 10px 0 0; + border: 0; + border-radius: 0; +} + +.login-form .country-code-field input:focus { + border-color: transparent; + box-shadow: none; +} + +.login-form input:focus, +.login-form select:focus, +.modal-panel input:focus, +.modal-panel textarea:focus, +.search-box input:focus, +.message-composer textarea:focus { + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12); +} + +.login-form input.captcha-input-valid { + border-color: var(--primary); + background: var(--primary); + color: #fff; + font-weight: 700; +} + +.login-form input.captcha-input-valid::-moz-placeholder { + color: rgba(255, 255, 255, 0.75); +} + +.login-form input.captcha-input-valid::placeholder { + color: rgba(255, 255, 255, 0.75); +} + +.login-form input.captcha-input-invalid { + border-color: var(--accent); + color: var(--accent); + box-shadow: 0 0 0 3px rgba(216, 78, 63, 0.12); +} + +.login-form input.field-input-error { + border-color: var(--accent); + color: var(--accent); + box-shadow: 0 0 0 3px rgba(216, 78, 63, 0.12); +} + +.login-form input.field-input-error::-moz-placeholder { + color: rgba(216, 78, 63, 0.78); +} + +.login-form input.field-input-error::placeholder { + color: rgba(216, 78, 63, 0.78); +} + +.captcha-button { + width: 112px; + height: 42px; + padding: 0; + border: 1px solid var(--line); + border-radius: 6px; + background: #f7fbfa; + overflow: hidden; +} + +.captcha-button img { + display: block; + width: 100%; + height: 100%; + -o-object-fit: contain; + object-fit: contain; +} + +.primary-action, +.primary-inline-action, +.send-button { + border: 0; + border-radius: 6px; + background: var(--primary); + color: #fff; + font-weight: 700; +} + +.primary-action { + height: 44px; +} + +.primary-action:hover, +.primary-inline-action:hover, +.send-button:hover { + background: var(--primary-strong); +} + +.primary-action:disabled, +.primary-inline-action:disabled, +.send-button:disabled { + cursor: not-allowed; + opacity: 0.55; +} + +.ghost-action { + width: 100%; + height: 40px; + margin-top: 12px; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; + color: var(--text); +} + +.ghost-inline-action, +.primary-inline-action, +.danger-inline-action { + height: 38px; + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0 16px; + border-radius: 6px; + font-weight: 700; + line-height: 1; +} + +.ghost-inline-action { + border: 1px solid var(--line); + background: #fff; + color: var(--text); +} + +.ghost-inline-action:hover { + background: #edf2f5; +} + +.danger-inline-action { + border: 1px solid #ef4444; + background: #fff; + color: #b91c1c; +} + +.danger-inline-action:hover { + background: #fee2e2; +} + +.form-error { + margin: 0; + color: var(--accent); + font-size: 13px; +} + +.form-info { + margin: 0; + color: var(--muted); + font-size: 13px; +} + +.app-shell { + height: 100dvh; + min-height: 0; + display: grid; + grid-template-columns: 64px minmax(260px, 340px) minmax(0, 1fr); + overflow: hidden; + background: var(--panel); +} + +.navigation-rail { + min-height: 0; + display: flex; + flex-direction: column; + align-items: center; + gap: 14px; + padding: 16px 10px; + background: var(--rail); +} + +.rail-avatar { + width: 40px; + height: 40px; + border-radius: 8px; + background: #e9f7f4; + color: var(--primary-strong); + font-weight: 800; + overflow: hidden; +} + +.rail-avatar-button { + position: relative; + border: 0; + padding: 0; + cursor: pointer; +} + +.rail-avatar-button::after { + content: "+"; + position: absolute; + right: -2px; + bottom: -2px; + width: 15px; + height: 15px; + display: grid; + place-items: center; + border: 1px solid var(--rail); + border-radius: 50%; + background: var(--primary); + color: #fff; + font-size: 11px; + font-weight: 800; + line-height: 1; +} + +.rail-avatar-button:hover, +.rail-avatar-button:focus-visible { + box-shadow: 0 0 0 3px rgba(47, 196, 178, 0.28); +} + +.rail-avatar img { + width: 100%; + height: 100%; + -o-object-fit: cover; + object-fit: cover; +} + +.rail-button, +.icon-button { + display: grid; + place-items: center; + border: 0; + border-radius: 6px; + background: transparent; +} + +.rail-button { + width: 40px; + height: 40px; + color: #dbe5ea; + font-size: 18px; +} + +.rail-button svg { + width: 22px; + height: 22px; + fill: none; + stroke: currentColor; + stroke-width: 1.8; + stroke-linecap: round; + stroke-linejoin: round; +} + +.rail-button.active, +.rail-button:hover { + background: rgba(255, 255, 255, 0.12); +} + +.rail-logout-button:hover { + background: rgba(239, 68, 68, 0.2); + color: #fecaca; +} + +.rail-spacer { + flex: 1; +} + +.conversation-list { + position: relative; + min-height: 0; + display: grid; + grid-template-rows: 72px auto minmax(0, 1fr); + border-right: 1px solid var(--line); + background: var(--panel-soft); + overflow: hidden; +} + +.modal-backdrop { + position: absolute; + inset: 0; + z-index: 5; + display: grid; + place-items: start center; + padding: 88px 16px 16px; + background: rgba(24, 33, 47, 0.28); +} + +.modal-panel { + width: min(100%, 308px); + display: grid; + gap: 14px; + padding: 16px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18); +} + +.modal-panel header, +.modal-actions { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.modal-panel header strong { + font-size: 16px; +} + +.modal-panel label { + display: grid; + gap: 8px; + color: var(--muted); + font-size: 13px; +} + +.settings-backdrop { + z-index: 24; + place-items: center; + padding: 24px 16px; +} + +.settings-panel { + width: min(620px, calc(100vw - 32px)); + max-height: calc(100dvh - 48px); + display: grid; + gap: 14px; + overflow: auto; + padding: 16px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18); +} + +.settings-panel header, +.settings-password-form footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.settings-panel header strong { + font-size: 16px; +} + +.settings-layout { + display: grid; + grid-template-columns: 170px minmax(0, 1fr); + gap: 14px; +} + +.settings-menu { + display: grid; + align-content: start; + gap: 8px; +} + +.settings-menu button { + min-height: 46px; + display: grid; + gap: 2px; + justify-items: start; + padding: 8px 10px; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; + color: var(--text); + text-align: left; +} + +.settings-menu button.active, +.settings-menu button:hover { + border-color: var(--primary); + background: #e8f4f2; + color: var(--primary-strong); +} + +.settings-menu button span { + font-weight: 700; +} + +.settings-menu button small { + color: var(--muted); + font-size: 11px; +} + +.settings-password-form, +.settings-placeholder { + min-height: 250px; + display: grid; + align-content: start; + gap: 12px; +} + +.settings-password-form h3, +.settings-placeholder h3 { + margin: 0; + font-size: 16px; +} + +.settings-password-form label { + display: grid; + gap: 8px; + color: var(--muted); + font-size: 13px; +} + +.settings-password-form input { + width: 100%; + height: 42px; + padding: 0 12px; + border: 1px solid var(--line); + border-radius: 6px; + outline: none; + background: #fff; + color: var(--text); +} + +.settings-password-form input:focus { + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12); +} + +.settings-password-form footer { + margin-top: 4px; + justify-content: flex-end; + flex-wrap: wrap; +} + +.settings-password-form footer .inline-save-status { + margin-right: auto; +} + +.settings-placeholder { + place-items: center; + border: 1px dashed var(--line); + border-radius: 8px; + color: var(--muted); + text-align: center; +} + +.settings-placeholder p { + margin: 0; +} + +.profile-edit-panel { + width: min(100%, 360px); +} + +.profile-avatar-field { + display: grid; + justify-items: center; + gap: 10px; +} + +.profile-avatar-field input[type="file"] { + position: absolute; + inline-size: 1px; + block-size: 1px; + opacity: 0; + pointer-events: none; +} + +.profile-avatar-preview { + width: 88px; + height: 88px; + display: grid; + place-items: center; + overflow: hidden; + padding: 0; + border: 0; + border-radius: 8px; + background: #dce8f2; + color: #24435c; + cursor: default; + font-size: 30px; + font-weight: 800; +} + +.profile-avatar-preview.clickable { + cursor: zoom-in; +} + +.profile-avatar-preview.clickable:hover { + box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.16); +} + +.profile-avatar-preview img { + width: 100%; + height: 100%; + -o-object-fit: cover; + object-fit: cover; +} + +.profile-avatar-change-button { + min-width: 96px; +} + +.avatar-preview-backdrop { + z-index: 32; + place-items: center; + padding: 24px 16px; +} + +.avatar-preview-dialog { + width: min(520px, calc(100vw - 32px)); + max-height: calc(100dvh - 48px); + display: grid; + gap: 12px; + padding: 14px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18); +} + +.avatar-preview-dialog header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.avatar-preview-actions { + display: flex; + align-items: center; + gap: 6px; +} + +.avatar-preview-actions button { + min-width: 34px; + height: 34px; + display: inline-flex; + align-items: center; + justify-content: center; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; + color: var(--text); + font-weight: 700; +} + +.avatar-preview-actions .icon-button { + border: 0; + color: var(--muted); +} + +.avatar-preview-stage { + height: min(430px, calc(100dvh - 160px)); + min-height: 260px; + display: grid; + place-items: center; + overflow: hidden; + border-radius: 8px; + background: #101820; + cursor: zoom-in; + touch-action: none; +} + +.avatar-preview-stage.dragging { + cursor: grabbing; +} + +.avatar-preview-stage img { + max-width: min(100%, 430px); + max-height: 100%; + border-radius: 8px; + -o-object-fit: contain; + object-fit: contain; + transform-origin: center center; + transition: transform 0.08s ease-out; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + pointer-events: none; +} + +.avatar-preview-stage.dragging img { + transition: none; +} + +.avatar-cropper-backdrop { + z-index: 30; + place-items: center; + padding: 24px 16px; +} + +.avatar-cropper-panel { + width: min(720px, calc(100vw - 32px)); + max-height: calc(100dvh - 48px); + overflow: auto; +} + +.avatar-cropper-header-actions { + display: flex; + align-items: center; + gap: 8px; +} + +.avatar-cropper-layout { + display: grid; + grid-template-columns: minmax(0, 1fr) 190px; + gap: 14px; +} + +.avatar-cropper-stage { + position: relative; + height: 360px; + min-height: 360px; + overflow: hidden; + border: 1px dashed #b8ccd7; + border-radius: 8px; + background: #0f1b24; + touch-action: none; + cursor: grab; +} + +.avatar-cropper-stage.dragging { + cursor: grabbing; +} + +.avatar-cropper-stage canvas { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + display: block; +} + +.avatar-cropper-box { + position: absolute; + left: 50%; + top: 50%; + width: 74%; + aspect-ratio: 1; + max-width: calc(100% - 44px); + max-height: calc(100% - 44px); + transform: translate(-50%, -50%); + border: 2px dashed var(--primary); + border-radius: 8px; + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.72); + pointer-events: none; +} + +.avatar-cropper-mask { + position: absolute; + inset: 0; + pointer-events: none; +} + +.avatar-cropper-placeholder { + position: absolute; + inset: 0; + display: grid; + place-items: center; + color: #d9e8ee; + font-size: 13px; + pointer-events: none; +} + +.avatar-cropper-controls { + min-width: 0; + display: grid; + align-content: start; + gap: 12px; +} + +.avatar-cropper-tools { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px; +} + +.avatar-cropper-tools button { + min-height: 34px; + padding: 0 10px; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; + color: var(--text); + font-weight: 700; +} + +.avatar-cropper-tools button:hover { + border-color: var(--primary); + color: var(--primary-strong); +} + +.avatar-cropper-preview { + width: 108px; + height: 108px; + justify-self: center; + overflow: hidden; + border: 1px solid var(--line); + border-radius: 8px; + background: #eef4f7; +} + +.avatar-cropper-preview canvas { + width: 100%; + height: 100%; + display: block; +} + +.avatar-cropper-controls footer { + display: flex; + align-items: center; + justify-content: flex-end; + flex-wrap: wrap; + gap: 8px; +} + +.avatar-cropper-controls footer .inline-save-status { + flex: 1 1 100%; +} + +.modal-actions { + justify-content: flex-end; +} + +.list-header, +.chat-header { + display: flex; + align-items: center; + justify-content: space-between; + min-height: 72px; + padding: 16px 18px; + border-bottom: 1px solid var(--line); +} + +.icon-button { + width: 34px; + height: 34px; + color: var(--muted); + font-size: 20px; +} + +.icon-button:hover { + background: #edf2f5; + color: var(--text); +} + +.search-box { + padding: 12px 14px; +} + +.sidebar-scroll { + min-height: 0; + overflow: auto; + overscroll-behavior: contain; +} + +.conversation-item { + width: 100%; + display: grid; + grid-template-columns: 42px minmax(0, 1fr) auto; + align-items: center; + gap: 10px; + padding: 12px 14px; + border: 0; + border-top: 1px solid rgba(217, 224, 231, 0.7); + background: transparent; + color: inherit; + text-align: left; +} + +.conversation-item.active, +.conversation-item:hover { + background: #eaf3f1; +} + +.favorite-item { + width: 100%; + display: grid; + grid-template-columns: 32px minmax(0, 1fr) auto; + align-items: center; + gap: 10px; + padding: 12px 14px; + border: 0; + border-top: 1px solid rgba(217, 224, 231, 0.7); + background: transparent; + color: inherit; + text-align: left; +} + +.favorite-item.active, +.favorite-item:hover { + background: #eaf3f1; +} + +.favorite-item-icon { + width: 32px; + height: 32px; + display: grid; + place-items: center; + border-radius: 6px; + background: #fff7df; + color: #c79520; + font-size: 16px; +} + +.favorite-item-main { + min-width: 0; + display: grid; + gap: 4px; +} + +.favorite-item-main strong, +.favorite-item-main small { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.favorite-item-main strong { + font-size: 14px; +} + +.favorite-item-main small, +.favorite-item time { + color: var(--muted); + font-size: 12px; +} + +.favorite-panel { + min-width: 0; + min-height: 0; + display: grid; + grid-template-rows: auto minmax(0, 1fr); + background: #eef3f6; +} + +.favorite-detail { + min-height: 0; + display: grid; + align-content: start; + gap: 16px; + padding: 28px; + overflow: auto; +} + +.favorite-detail-message { + width: min(680px, 100%); + display: grid; + grid-template-columns: auto minmax(0, 1fr); + gap: 10px 12px; + padding: 18px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 8px 24px rgba(24, 33, 47, 0.08); +} + +.favorite-detail-message.recalled { + border-color: #f1c7c1; + background: #fff7f6; +} + +.favorite-detail-star { + color: #c79520; + font-size: 18px; + line-height: 1.4; +} + +.favorite-detail-body { + min-width: 0; + display: grid; + gap: 10px; +} + +.favorite-detail-message p { + margin: 0; + white-space: pre-wrap; + overflow-wrap: anywhere; + line-height: 1.55; +} + +.favorite-detail-message time { + grid-column: 2; + color: var(--muted); + font-size: 12px; +} + +.favorite-detail-image { + width: min(420px, 100%); + display: block; + overflow: hidden; + border: 1px solid #b9ded8; + border-radius: 8px; + background: #fff; +} + +.favorite-detail-image img { + display: block; + width: 100%; + max-height: 360px; + -o-object-fit: contain; + object-fit: contain; + background: #f8fbfc; +} + +.favorite-detail-file { + width: min(360px, 100%); +} + +.favorite-detail-actions { + width: min(680px, 100%); + display: flex; + align-items: center; + justify-content: flex-end; + gap: 8px; +} + +.favorite-detail-actions .inline-save-status { + margin-right: auto; +} + +.empty-list, +.empty-chat { + display: grid; + place-items: center; + align-content: center; + gap: 8px; + color: var(--muted); + text-align: center; +} + +.empty-list { + min-height: 180px; + padding: 24px; +} + +.empty-chat { + min-height: 0; + padding: 24px; +} + +.empty-list strong, +.empty-chat strong { + color: var(--text); +} + +.conversation-avatar { + width: 42px; + height: 42px; + border-radius: 8px; + background: #dce8f2; + color: #24435c; + font-weight: 700; +} + +.conversation-copy { + min-width: 0; + display: grid; + gap: 4px; +} + +.conversation-copy strong, +.conversation-copy small { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.conversation-copy small { + color: var(--muted); +} + +.unread-badge { + justify-self: end; + min-width: 20px; + height: 20px; + padding: 0 6px; + border-radius: 999px; + background: #ef4444; + color: #fff; + font-size: 12px; + font-weight: 800; + line-height: 20px; + text-align: center; + box-shadow: 0 0 0 2px #f7fafc; +} + +.chat-panel { + position: relative; + min-width: 0; + min-height: 0; + height: 100%; + display: grid; + grid-template-rows: 72px minmax(0, 1fr) auto auto; + overflow: hidden; + background: #eef2f5; +} + +.contact-panel { + min-width: 0; + min-height: 0; + height: 100%; + display: grid; + grid-template-rows: 72px minmax(0, 1fr); + overflow: auto; + background: #eef2f5; +} + +.contact-profile { + align-self: start; + width: min(520px, calc(100% - 48px)); + margin: 48px auto; + display: grid; + justify-items: center; + gap: 18px; + padding: 32px; + background: var(--panel); + border: 1px solid var(--line); + border-radius: 8px; +} + +.profile-avatar { + width: 76px; + height: 76px; + display: grid; + place-items: center; + border-radius: 8px; + background: #dce8f2; + color: #24435c; + font-size: 28px; + font-weight: 800; +} + +.profile-main { + text-align: center; +} + +.remark-row { + min-width: 0; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; +} + +.profile-main h3 { + margin: 0; + font-size: 22px; + overflow-wrap: anywhere; +} + +.remark-edit-button { + width: 32px; + height: 32px; + flex: 0 0 auto; + font-size: 16px; +} + +.profile-main p { + margin: 6px 0 0; + color: var(--muted); +} + +.profile-fields { + width: 100%; + display: grid; + gap: 12px; + margin: 0; +} + +.profile-fields div { + display: grid; + grid-template-columns: 80px minmax(0, 1fr); + gap: 12px; + padding: 10px 0; + border-top: 1px solid var(--line); +} + +.profile-fields dt { + color: var(--muted); +} + +.profile-fields dd { + margin: 0; + overflow-wrap: anywhere; +} + +.profile-action { + width: 160px; +} + +.contact-panel .contact-modal-backdrop { + position: fixed; +} + +.header-actions { + display: flex; + gap: 8px; +} + +.chat-header-actions { + position: relative; +} + +.chat-title-button { + display: grid; + grid-template-columns: 38px minmax(0, 1fr); + align-items: center; + gap: 10px; + max-width: min(460px, 52vw); + padding: 0; + border: 0; + background: transparent; + color: var(--text); + text-align: left; +} + +.chat-title-avatar { + width: 38px; + height: 38px; + display: grid; + place-items: center; + border-radius: 8px; + background: #dce8f2; + color: #24435c; + font-size: 16px; + font-weight: 800; +} + +.chat-title-copy { + min-width: 0; +} + +.chat-title-button h2 { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.chat-title-button:hover h2 { + color: var(--primary-strong); +} + +.chat-more-menu { + top: 38px; + width: 150px; +} + +.action-menu-anchor { + position: relative; +} + +.quick-action-menu { + position: absolute; + top: 40px; + right: 0; + z-index: 7; + width: 168px; + display: grid; + padding: 6px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 14px 34px rgba(24, 33, 47, 0.16); +} + +.quick-action-menu button { + height: 34px; + padding: 0 10px; + border: 0; + border-radius: 6px; + background: transparent; + color: var(--text); + text-align: left; +} + +.quick-action-menu button:hover { + background: #edf2f5; +} + +.quick-action-menu.chat-more-menu { + top: 38px; + width: 150px; +} + +.conversation-action-panel { + width: min(100%, 340px); + max-height: calc(100dvh - 116px); + overflow: auto; +} + +.contact-picker { + display: grid; + gap: 10px; +} + +.contact-picker > input { + width: 100%; + height: 38px; + padding: 0 10px; + border: 1px solid var(--line); + border-radius: 6px; + outline: none; +} + +.contact-picker-list { + max-height: 220px; + overflow: auto; + display: grid; + gap: 6px; + padding-right: 2px; +} + +.contact-picker-row { + width: 100%; + min-height: 48px; + display: grid; + grid-template-columns: 22px 36px minmax(0, 1fr); + align-items: center; + gap: 8px; + padding: 6px; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; + color: var(--text); + text-align: left; +} + +.contact-picker-row:hover, +.contact-picker-row.selected { + border-color: #9fd4cc; + background: #edf8f5; +} + +.contact-picker-row .conversation-avatar { + width: 36px; + height: 36px; + border-radius: 6px; + font-size: 13px; +} + +.contact-check { + width: 20px; + height: 20px; + display: grid; + place-items: center; + border: 1px solid var(--line); + border-radius: 4px; + color: var(--primary-strong); + font-size: 13px; + font-weight: 800; +} + +.contact-picker-copy { + min-width: 0; + display: grid; + gap: 2px; +} + +.contact-picker-copy strong, +.contact-picker-copy small { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.contact-picker-copy small { + color: var(--muted); + font-size: 12px; +} + +.contact-picker-empty { + min-height: 64px; + display: grid; + place-items: center; + color: var(--muted); + border: 1px dashed var(--line); + border-radius: 6px; +} + +.group-dialog { + width: min(420px, calc(100% - 32px)); + max-height: calc(100dvh - 116px); + display: grid; + gap: 16px; + padding: 18px; + overflow: auto; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18); +} + +.group-dialog header, +.group-dialog footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.group-dialog h3 { + margin: 0; + font-size: 18px; +} + +.single-profile-dialog { + width: min(420px, calc(100% - 32px)); +} + +.single-profile-summary { + display: grid; + justify-items: center; + gap: 10px; +} + +.single-profile-summary strong { + max-width: 100%; + overflow-wrap: anywhere; + font-size: 18px; +} + +.single-profile-footer { + align-items: center; + justify-content: flex-end; +} + +.single-profile-footer .inline-save-status { + margin-right: auto; +} + +.message-detail-dialog { + width: min(560px, calc(100% - 32px)); +} + +.message-detail-meta div { + grid-template-columns: 88px minmax(0, 1fr); +} + +.message-detail-muted { + color: var(--muted); +} + +.message-detail-summary { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.message-detail-summary span { + min-height: 30px; + display: inline-flex; + align-items: center; + gap: 4px; + padding: 0 10px; + border: 1px solid var(--line); + border-radius: 6px; + background: #f8fbfb; + color: var(--muted); + font-size: 13px; +} + +.message-detail-summary strong { + color: var(--text); +} + +.message-detail-groups { + display: grid; + gap: 14px; +} + +.message-detail-section { + display: grid; + gap: 8px; +} + +.message-detail-section header { + min-height: 28px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + border-bottom: 1px solid var(--line); +} + +.message-detail-section header strong { + font-size: 14px; +} + +.message-detail-section header span { + color: var(--muted); + font-size: 12px; +} + +.message-detail-member-list { + display: grid; + overflow: hidden; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; +} + +.message-detail-member-row { + display: grid; + grid-template-columns: 34px minmax(0, 1fr) auto auto; + align-items: center; + gap: 8px; + min-height: 48px; + padding: 7px 8px; + border-top: 1px solid var(--line); +} + +.message-detail-member-row:first-child { + border-top: 0; +} + +.message-detail-member-row .conversation-avatar { + width: 34px; + height: 34px; + border-radius: 6px; + font-size: 13px; +} + +.message-detail-member-main { + min-width: 0; + display: grid; + gap: 2px; +} + +.message-detail-member-main strong, +.message-detail-member-main small { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.message-detail-member-main strong { + font-size: 13px; +} + +.message-detail-member-main small, +.message-detail-member-time { + color: var(--muted); + font-size: 12px; +} + +.message-detail-member-time { + white-space: nowrap; +} + +.message-detail-role { + min-height: 22px; + display: inline-flex; + align-items: center; + padding: 0 7px; + border: 1px solid #c7d9e5; + border-radius: 6px; + color: #416272; + font-size: 12px; + white-space: nowrap; +} + +.group-dialog label { + display: grid; + gap: 8px; + color: var(--muted); + font-size: 13px; +} + +.group-dialog input { + width: 100%; + height: 42px; + padding: 0 12px; + border: 1px solid var(--line); + border-radius: 6px; + outline: none; +} + +.group-dialog textarea, +.group-dialog select { + width: 100%; + border: 1px solid var(--line); + border-radius: 6px; + outline: none; + background: #fff; + color: var(--text); +} + +.group-dialog textarea { + min-height: 86px; + resize: vertical; + padding: 10px 12px; + line-height: 1.5; +} + +.group-dialog select { + height: 42px; + padding: 0 10px; +} + +.group-dialog input:focus { + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12); +} + +.group-dialog textarea:focus, +.group-dialog select:focus { + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12); +} + +.group-profile { + display: grid; + gap: 10px; + margin: 0; +} + +.group-profile div { + display: grid; + grid-template-columns: 78px minmax(0, 1fr); + gap: 12px; + padding: 10px 0; + border-top: 1px solid var(--line); +} + +.group-profile dt { + color: var(--muted); +} + +.group-profile dd { + margin: 0; + overflow-wrap: anywhere; +} + +.group-loading { + min-height: 96px; + display: grid; + place-items: center; + color: var(--muted); +} + +.group-member-list { + display: grid; + gap: 8px; +} + +.group-member-row { + display: grid; + grid-template-columns: 42px minmax(0, 1fr); + align-items: center; + gap: 10px; + min-height: 54px; + padding: 8px; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; +} + +.group-member-row.selectable { + cursor: pointer; +} + +.group-member-row.with-check { + grid-template-columns: 24px 42px minmax(0, 1fr); +} + +.group-member-row.selectable:hover, +.group-member-row.selectable.selected { + border-color: #9fd4cc; + background: #edf8f5; +} + +.group-member-row input[type="checkbox"] { + justify-self: center; + width: 16px; + height: 16px; +} + +.group-member-row span:last-child { + min-width: 0; + display: grid; + gap: 3px; +} + +.group-member-row strong, +.group-member-row small { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.group-member-row small { + color: var(--muted); + font-size: 12px; +} + +.group-management-dialog { + width: min(520px, calc(100% - 32px)); +} + +.group-management-tabs { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.group-management-tabs button { + height: 34px; + padding: 0 10px; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; + color: var(--text); +} + +.group-management-tabs button.active, +.group-management-tabs button:hover { + border-color: var(--primary); + background: #e8f4f2; + color: var(--primary-strong); + font-weight: 700; +} + +.group-manage-section { + display: grid; + gap: 14px; +} + +.group-manage-section footer { + justify-content: flex-end; +} + +.mute-save-footer { + align-items: center; + gap: 10px; +} + +.inline-save-status { + color: var(--primary-strong); + font-size: 13px; +} + +.inline-save-status.error { + color: var(--accent); +} + +.mute-time-grid { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 10px; +} + +.message-list { + min-height: 0; + overflow: auto; + overscroll-behavior: contain; + padding: 24px; +} + +.message-row { + display: flex; + align-items: flex-end; + gap: 8px; + margin-bottom: 14px; +} + +.message-row.out { + justify-content: flex-end; +} + +.message-sender-avatar { + width: 34px; + height: 34px; + flex: 0 0 auto; + display: grid; + place-items: center; + overflow: hidden; + padding: 0; + border: 0; + border-radius: 8px; + background: #dce8f2; + color: #24435c; + font-size: 14px; + font-weight: 800; +} + +.message-sender-avatar img { + width: 100%; + height: 100%; + -o-object-fit: cover; + object-fit: cover; +} + +.message-stack { + max-width: min(68%, 720px); + display: grid; + justify-items: start; + gap: 4px; +} + +.message-row.out .message-stack { + justify-items: end; +} + +.message-sender-name { + min-height: 18px; + max-width: 100%; + padding: 0; + border: 0; + background: transparent; + color: var(--muted); + font-size: 12px; + font-weight: 700; + text-align: left; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.message-sender-name:hover { + color: var(--primary-strong); +} + +.message-sender-role { + margin-left: 4px; + color: var(--primary-strong); + font-size: 11px; +} + +.message-row.selected .message-bubble { + box-shadow: 0 0 0 2px rgba(24, 138, 121, 0.26); +} + +.message-row.attention .message-bubble { + animation: message-attention 1.4s ease-in-out 2; + box-shadow: 0 0 0 3px rgba(24, 138, 121, 0.3); +} + +@keyframes message-attention { + 0%, + 100% { + box-shadow: 0 0 0 2px rgba(24, 138, 121, 0.16); + } + + 45% { + box-shadow: 0 0 0 5px rgba(24, 138, 121, 0.36); + } +} + +.message-select { + width: 24px; + height: 24px; + display: grid; + place-items: center; +} + +.message-select input { + width: 16px; + height: 16px; +} + +.message-bubble { + position: relative; + max-width: min(68%, 720px); + padding: 10px 12px 8px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--bubble-in); + box-shadow: 0 2px 8px rgba(30, 40, 50, 0.05); +} + +.message-stack .message-bubble { + max-width: 100%; +} + +.message-row.out .message-bubble { + background: var(--bubble-out); + border-color: #bfe4dc; +} + +.message-bubble:hover { + border-color: #9fd4cc; +} + +.message-bubble.role-bubble-owner, +.message-bubble.role-bubble-admin { + overflow: hidden; +} + +.message-bubble.role-bubble-owner::after, +.message-bubble.role-bubble-admin::after { + content: ""; + position: absolute; + top: 0; + right: 0; + width: 0; + height: 0; + border-top: 16px solid #d79d22; + border-left: 16px solid transparent; +} + +.message-bubble.role-bubble-admin::after { + border-top-color: #178a79; +} + +.message-bubble p { + margin: 0; + line-height: 1.5; + white-space: pre-wrap; + overflow-wrap: anywhere; +} + +.message-image { + padding: 0; + border: 0; + display: block; + max-width: min(280px, 62vw); + overflow: hidden; + border-radius: 6px; + background: #edf2f5; + cursor: zoom-in; +} + +.message-image + p, +.message-file + p { + margin-top: 8px; +} + +.message-image img { + display: block; + max-width: 100%; + max-height: 320px; + -o-object-fit: contain; + object-fit: contain; +} + +.image-viewer-backdrop { + position: fixed; + inset: 0; + z-index: 80; + display: grid; + place-items: center; + padding: 24px; + background: rgba(12, 18, 26, 0.58); +} + +.image-viewer-dialog { + width: min(880px, calc(100vw - 48px)); + height: min(640px, calc(100vh - 48px)); + min-width: 360px; + min-height: 280px; + max-width: calc(100vw - 48px); + max-height: calc(100vh - 48px); + display: grid; + grid-template-rows: 52px minmax(0, 1fr); + overflow: hidden; + resize: both; + border: 1px solid rgba(255, 255, 255, 0.18); + border-radius: 8px; + background: #101820; + box-shadow: 0 24px 70px rgba(0, 0, 0, 0.36); +} + +.image-viewer-toolbar { + min-width: 0; + display: flex; + align-items: center; + justify-content: flex-end; + gap: 8px; + padding: 8px 10px; + border-bottom: 1px solid rgba(255, 255, 255, 0.12); + background: rgba(24, 33, 47, 0.94); +} + +.image-viewer-title { + min-width: 0; + flex: 1; + overflow: hidden; + color: #f8fafc; + font-size: 13px; + font-weight: 700; + text-overflow: ellipsis; + white-space: nowrap; +} + +.image-viewer-toolbar button { + width: 36px; + height: 36px; + display: grid; + place-items: center; + border: 0; + border-radius: 6px; + background: transparent; + color: #f8fafc; + font-size: 17px; + font-weight: 700; + line-height: 1; +} + +.image-viewer-toolbar button:hover { + background: rgba(255, 255, 255, 0.14); +} + +.image-viewer-stage { + min-width: 0; + min-height: 0; + display: grid; + place-items: center; + overflow: hidden; + background: #0c121a; + cursor: default; + touch-action: none; +} + +.image-viewer-stage.zoomed { + cursor: grab; +} + +.image-viewer-stage.dragging { + cursor: grabbing; +} + +.image-viewer-img { + max-width: calc(100% - 32px); + max-height: calc(100% - 32px); + -o-object-fit: contain; + object-fit: contain; + transform-origin: center center; + transition: transform 0.08s ease-out; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + pointer-events: none; +} + +.image-viewer-stage.dragging .image-viewer-img { + transition: none; +} + +.sender-profile-backdrop { + position: fixed; + inset: 0; + z-index: 84; + display: grid; + place-items: center; + padding: 24px; + background: rgba(24, 33, 47, 0.32); +} + +.sender-profile-dialog { + width: min(380px, calc(100vw - 32px)); + display: grid; + gap: 16px; + padding: 18px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18); +} + +.sender-profile-dialog header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.sender-profile-main { + display: grid; + justify-items: center; + gap: 8px; + text-align: center; +} + +.sender-profile-main strong { + max-width: 100%; + overflow-wrap: anywhere; + font-size: 18px; +} + +.sender-profile-main span { + color: var(--primary-strong); + font-size: 12px; + font-weight: 700; +} + +.sender-profile-fields { + display: grid; + gap: 8px; + margin: 0; +} + +.sender-profile-fields div { + display: grid; + grid-template-columns: 72px minmax(0, 1fr); + gap: 10px; + padding-top: 8px; + border-top: 1px solid var(--line); +} + +.sender-profile-fields dt { + color: var(--muted); +} + +.sender-profile-fields dd { + margin: 0; + overflow-wrap: anywhere; +} + +.sender-profile-alias { + display: grid; + gap: 8px; + color: var(--muted); + font-size: 13px; +} + +.sender-profile-alias input { + width: 100%; + height: 40px; + padding: 0 12px; + border: 1px solid var(--line); + border-radius: 6px; + outline: none; + background: #fff; + color: var(--text); +} + +.sender-profile-alias input:focus { + border-color: var(--primary); + box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12); +} + +.sender-profile-actions { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 8px; +} + +.sender-profile-actions .inline-save-status { + margin-right: auto; +} + +@media (max-width: 480px) { + .image-viewer-backdrop { + padding: 12px; + } + + .image-viewer-dialog { + width: calc(100vw - 24px); + height: min(560px, calc(100vh - 24px)); + min-width: 280px; + min-height: 240px; + max-width: calc(100vw - 24px); + max-height: calc(100vh - 24px); + } + + .image-viewer-toolbar { + gap: 4px; + padding: 6px; + } + + .image-viewer-toolbar button { + width: 32px; + height: 32px; + font-size: 15px; + } + + .message-detail-member-row { + grid-template-columns: 34px minmax(0, 1fr); + } + + .message-detail-member-time, + .message-detail-role { + grid-column: 2; + justify-self: start; + } + + .avatar-cropper-panel { + width: calc(100vw - 24px); + max-height: calc(100dvh - 24px); + } + + .avatar-cropper-layout { + grid-template-columns: minmax(0, 1fr); + } + + .avatar-cropper-stage { + height: 300px; + min-height: 300px; + } + + .avatar-cropper-controls { + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + } + + .avatar-cropper-tools { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .avatar-cropper-preview { + width: 82px; + height: 82px; + } + + .avatar-cropper-controls footer { + grid-column: 1 / -1; + } + + .settings-panel { + width: calc(100vw - 24px); + max-height: calc(100dvh - 24px); + } + + .settings-layout { + grid-template-columns: minmax(0, 1fr); + } + + .settings-menu { + grid-auto-flow: column; + grid-auto-columns: minmax(120px, 1fr); + overflow-x: auto; + padding-bottom: 2px; + } + + .settings-password-form footer .inline-save-status { + flex: 1 1 100%; + } +} + +.message-file { + width: min(280px, 62vw); + display: grid; + grid-template-columns: 38px minmax(0, 1fr); + align-items: center; + gap: 10px; + padding: 10px; + border: 1px solid #d6e2e7; + border-radius: 6px; + background: #f8fbfc; + color: var(--text); + text-decoration: none; +} + +.message-file:hover { + border-color: #9fd4cc; + background: #edf8f5; +} + +.message-file-icon { + width: 38px; + height: 38px; + display: grid; + place-items: center; + border-radius: 6px; + background: #e3eff2; + color: var(--primary-strong); + font-size: 18px; + font-weight: 800; +} + +.message-file-main { + min-width: 0; + display: grid; + gap: 3px; +} + +.message-file-main strong, +.message-file-main small { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.message-file-main strong { + font-size: 13px; +} + +.message-file-main small { + color: var(--muted); + font-size: 11px; +} + +.message-bubble time { + display: flex; + align-items: center; + justify-content: flex-end; + flex-wrap: wrap; + gap: 4px; + margin-top: 4px; + color: var(--muted); + font-size: 11px; + text-align: right; +} + +.recall-mark { + margin-right: auto; + color: #d93025; + font-size: 11px; + font-weight: 700; + line-height: 1; +} + +.edit-mark { + color: #7a8792; + font-size: 11px; + font-weight: 600; + line-height: 1; +} + +.delivery-mark { + display: inline-flex; + align-items: center; + justify-content: flex-end; + min-width: 14px; + color: #8f9aa3; + font-size: 14px; + font-weight: 800; + letter-spacing: 0; + line-height: 1; +} + +.delivery-mark-delivered, +.delivery-mark-read { + min-width: 19px; +} + +.delivery-mark-read { + color: #1aa66a; +} + +.favorite-mark { + color: #c79520; + font-size: 12px; + line-height: 1; +} + +.delivery-check { + display: inline-block; +} + +.delivery-check-second { + margin-left: -5px; +} + +.delivery-error { + color: #c0392b; +} + +.message-context-menu { + position: fixed; + z-index: 30; + width: 136px; + padding: 6px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 16px 40px rgba(24, 33, 47, 0.18); +} + +.message-context-menu button { + width: 100%; + min-height: 32px; + padding: 0 10px; + border: 0; + border-radius: 6px; + background: transparent; + color: var(--text); + text-align: left; +} + +.message-context-menu button:hover { + background: #eaf3f1; +} + +.selection-toolbar { + min-height: 42px; + display: flex; + align-items: center; + gap: 8px; + padding: 8px 16px; + border-top: 1px solid var(--line); + background: #f7fafc; +} + +.selection-toolbar span { + flex: 1; + color: var(--muted); + font-size: 13px; +} + +.selection-toolbar button { + min-height: 30px; + padding: 0 10px; + border-radius: 6px; +} + +.forward-dialog, +.edit-dialog { + width: min(100%, 340px); + max-height: min(520px, calc(100vh - 130px)); + display: grid; + gap: 4px; + padding: 14px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18); + overflow: auto; +} + +.forward-dialog header, +.edit-dialog header, +.forward-target { + display: flex; + align-items: center; + gap: 10px; +} + +.forward-dialog header, +.edit-dialog header { + justify-content: space-between; + margin-bottom: 6px; +} + +.forward-dialog h3, +.edit-dialog h3 { + margin: 0; + font-size: 16px; +} + +.edit-dialog { + width: min(100%, 420px); + gap: 12px; +} + +.edit-dialog textarea { + width: 100%; + min-height: 132px; + resize: vertical; + border-radius: 8px; + border: 1px solid var(--line); + padding: 10px; + background: #f9fbfc; + color: var(--text); + line-height: 1.5; +} + +.edit-dialog textarea:focus { + border-color: var(--accent); + outline: 0; + box-shadow: 0 0 0 3px rgba(24, 138, 121, 0.14); +} + +.edit-dialog footer { + display: flex; + justify-content: flex-end; + gap: 8px; +} + +.edit-dialog footer button { + min-height: 34px; + padding: 0 14px; + border-radius: 8px; +} + +.forward-target { + min-height: 52px; + padding: 6px; + border: 0; + border-radius: 8px; + background: transparent; + color: var(--text); + text-align: left; +} + +.forward-target:hover { + background: #eaf3f1; +} + +.chat-toast { + position: absolute; + left: 50%; + bottom: 132px; + z-index: 20; + transform: translateX(-50%); + padding: 8px 12px; + border-radius: 8px; + background: rgba(35, 45, 58, 0.92); + color: #fff; + font-size: 13px; + pointer-events: none; +} + +.chat-toast.error { + background: rgba(192, 57, 43, 0.94); +} + +.message-composer { + position: relative; + min-height: 0; + border-top: 1px solid var(--line); + background: var(--panel); +} + +.message-composer::after { + content: ""; + position: absolute; + inset: 6px; + z-index: 4; + border: 2px dashed transparent; + border-radius: 8px; + pointer-events: none; + transition: border-color 0.12s ease, background-color 0.12s ease; +} + +.message-composer.drop-active::after { + border-color: var(--primary); + background: rgba(23, 125, 114, 0.08); +} + +.quote-preview { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 16px 0; + color: var(--muted); + font-size: 13px; +} + +.quote-preview span { + min-width: 0; + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + border-left: 3px solid var(--accent); + padding-left: 8px; +} + +.quote-preview strong { + margin-right: 6px; + color: var(--text); +} + +.quote-preview button { + width: 26px; + height: 26px; + border: 0; + border-radius: 6px; + background: transparent; + color: var(--muted); + font-size: 18px; +} + +.quote-preview button:hover { + background: #edf2f5; +} + +.composer-tools { + position: relative; + display: flex; + gap: 4px; + padding: 8px 16px 0; +} + +.composer-tools input[type="file"] { + display: none; +} + +.composer-tools button { + width: 32px; + height: 32px; + border: 0; + border-radius: 6px; + background: transparent; + color: var(--muted); + font-size: 18px; +} + +.composer-tools button:hover { + background: #edf2f5; +} + +.emoji-picker { + position: absolute; + left: 16px; + bottom: 38px; + z-index: 12; + width: 256px; + display: grid; + grid-template-columns: repeat(8, 1fr); + gap: 2px; + padding: 8px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 14px 34px rgba(24, 33, 47, 0.16); +} + +.emoji-picker button { + width: 28px; + height: 28px; + border-radius: 6px; + font-size: 17px; +} + +.message-composer textarea { + display: block; + min-height: 86px; + max-height: 180px; + padding: 12px 16px; + border: 0; + border-radius: 0; + resize: none; + box-shadow: none; +} + +.composer-footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 0 16px 14px; + color: var(--muted); + font-size: 12px; +} + +.send-button { + min-width: 72px; + height: 34px; +} + +@media (max-width: 760px) { + .app-shell { + grid-template-columns: 56px minmax(0, 1fr); + } + + .conversation-list { + display: none; + } + + .message-bubble { + max-width: 86%; + } +} + diff --git a/dist/img/5IuOieu9PF8MJtp43kD2kCkdLVjVwDp7.ico b/dist/img/5IuOieu9PF8MJtp43kD2kCkdLVjVwDp7.ico new file mode 100644 index 0000000000000000000000000000000000000000..2990f6ef4427b97d40f1ad17c459b0be568c9480 GIT binary patch literal 32038 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 literal 0 HcmV?d00001 diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 0000000..3f0fa2c --- /dev/null +++ b/dist/index.html @@ -0,0 +1 @@ +Web IM
\ No newline at end of file diff --git a/dist/js/app.3d85aa5a.js b/dist/js/app.3d85aa5a.js new file mode 100644 index 0000000..c1621df --- /dev/null +++ b/dist/js/app.3d85aa5a.js @@ -0,0 +1,9020 @@ +/******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 6: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _ChatShell_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(922); + + + +const __exports__ = _ChatShell_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 138: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_App_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_App_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2534); + + +/***/ }), + +/***/ 262: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4546); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7987); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1857); +/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3865); + +const _hoisted_1 = { + class: "contact-panel" +}; +const _hoisted_2 = { + class: "chat-header" +}; +const _hoisted_3 = { + class: "contact-profile" +}; +const _hoisted_4 = ["src"]; +const _hoisted_5 = { + key: 1, + class: "profile-avatar" +}; +const _hoisted_6 = { + class: "profile-main" +}; +const _hoisted_7 = { + class: "remark-row" +}; +const _hoisted_8 = { + class: "profile-fields" +}; +const _hoisted_9 = { + key: 0, + class: "form-error" +}; +const _hoisted_10 = { + class: "modal-actions" +}; +const _hoisted_11 = ["disabled"]; +const _hoisted_12 = ["disabled"]; +const _hoisted_13 = { + key: 1, + class: "empty-chat" +}; + + +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'ContactPanel', + setup(__props) { + const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_0__/* .useContactStore */ .p)(); + const contact = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .computed */ .EW)(() => contacts.activeContact); + const remarkName = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .computed */ .EW)(() => contact.value?.alias || '未设置'); + const username = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .computed */ .EW)(() => contact.value?.rawUser?.displayName || contact.value?.rawUser?.name || contact.value?.uid || ''); + const mobile = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .computed */ .EW)(() => contact.value?.rawUser?.mobile || '未知'); + const address = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .computed */ .EW)(() => contact.value?.rawUser?.address || '未知'); + const editingAlias = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .ref */ .KR)(false); + const aliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .ref */ .KR)(''); + const aliasSaving = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .ref */ .KR)(false); + const aliasError = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .ref */ .KR)(''); + (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .watch */ .wB)(contact, () => { + editingAlias.value = false; + aliasError.value = ''; + }); + function openAliasEditor() { + aliasDraft.value = contact.value?.alias || ''; + aliasError.value = ''; + editingAlias.value = true; + } + function closeAliasEditor() { + if (aliasSaving.value) { + return; + } + editingAlias.value = false; + aliasError.value = ''; + } + async function submitAlias() { + if (!contact.value) { + return; + } + aliasSaving.value = true; + aliasError.value = ''; + const ok = await contacts.updateContactAlias(contact.value.uid, aliasDraft.value); + aliasSaving.value = false; + if (ok) { + editingAlias.value = false; + return; + } + aliasError.value = contacts.actionError || '备注名修改失败'; + } + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("section", _hoisted_1, [contact.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_1__/* .Fragment */ .FK, { + key: 0 + }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("header", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("h2", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(remarkName.value), 1), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(username.value), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", _hoisted_3, [contact.value.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "profile-avatar image-avatar", + src: contact.value.portrait, + alt: "" + }, null, 8, _hoisted_4)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("div", _hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(contact.value.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", _hoisted_6, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("h3", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(remarkName.value), 1), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button remark-edit-button", + title: "编辑备注名", + onClick: openAliasEditor + }, "✏️")])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dl", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [_cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dt", null, "用户名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(username.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [_cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dt", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(mobile.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [_cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dt", null, "地区", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(address.value), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", { + class: "primary-action profile-action", + onClick: _cache[0] || (_cache[0] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .unref */ .R1)(contacts).openChat(contact.value)) + }, "发消息")]), editingAlias.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("div", { + key: 0, + class: "modal-backdrop contact-modal-backdrop", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .withModifiers */ .D$)(closeAliasEditor, ["self"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("form", { + class: "modal-panel", + onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .withModifiers */ .D$)(submitAlias, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("header", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("strong", null, "编辑备注名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeAliasEditor + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("label", null, [_cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("span", null, "备注名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => aliasDraft.value = $event), + maxlength: "32", + autocomplete: "off", + autofocus: "" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_4__/* .vModelText */ .Jo, aliasDraft.value, void 0, { + trim: true + }]])]), aliasError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("p", _hoisted_9, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(aliasError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "ghost-inline-action", + disabled: aliasSaving.value, + onClick: closeAliasEditor + }, "取消", 8, _hoisted_11), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", { + type: "submit", + class: "primary-inline-action", + disabled: aliasSaving.value + }, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(aliasSaving.value ? '保存中' : '保存'), 9, _hoisted_12)])], 32)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createCommentVNode */ .Q3)("", true)], 64)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("div", _hoisted_13, _cache[7] || (_cache[7] = [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("strong", null, "选择一个联系人", -1), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("span", null, "好友列表同步完成后,可以在左侧查看资料", -1)])))]); + }; + } +}); + +/***/ }), + +/***/ 542: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5513); +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4912); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(793); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9130); +/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(8937); +/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(8636); +/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(4546); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(1857); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(7987); +/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(3865); + + + + + + + + +const _hoisted_1 = ["data-message-key", "onClick"]; +const _hoisted_2 = { + key: 0, + class: "message-select" +}; +const _hoisted_3 = ["checked", "onChange"]; +const _hoisted_4 = ["title", "onClick"]; +const _hoisted_5 = ["src"]; +const _hoisted_6 = { + key: 1 +}; +const _hoisted_7 = { + class: "message-stack" +}; +const _hoisted_8 = ["onClick"]; +const _hoisted_9 = { + key: 0, + class: "message-sender-role" +}; +const _hoisted_10 = ["onContextmenu"]; +const _hoisted_11 = ["onClick"]; +const _hoisted_12 = ["src", "alt"]; +const _hoisted_13 = ["href"]; +const _hoisted_14 = { + class: "message-file-main" +}; +const _hoisted_15 = { + key: 2 +}; +const _hoisted_16 = { + key: 0, + class: "recall-mark" +}; +const _hoisted_17 = { + key: 1, + class: "edit-mark" +}; +const _hoisted_18 = { + key: 2, + class: "favorite-mark", + title: "已收藏", + "aria-label": "已收藏" +}; +const _hoisted_19 = ["title", "aria-label"]; +const _hoisted_20 = { + key: 0, + class: "delivery-check delivery-check-second" +}; +const _hoisted_21 = { + key: 4, + class: "delivery-error" +}; +const _hoisted_22 = ["onClick"]; +const _hoisted_23 = { + class: "image-viewer-toolbar" +}; +const _hoisted_24 = { + class: "image-viewer-title" +}; +const _hoisted_25 = ["src", "alt"]; +const _hoisted_26 = { + class: "sender-profile-main" +}; +const _hoisted_27 = ["src"]; +const _hoisted_28 = { + key: 1, + class: "profile-avatar" +}; +const _hoisted_29 = { + key: 2 +}; +const _hoisted_30 = { + class: "sender-profile-fields" +}; +const _hoisted_31 = { + class: "sender-profile-alias" +}; +const _hoisted_32 = ["disabled"]; +const _hoisted_33 = { + class: "sender-profile-actions" +}; +const _hoisted_34 = { + key: 0, + class: "inline-save-status" +}; +const _hoisted_35 = { + key: 1, + class: "inline-save-status error" +}; +const _hoisted_36 = ["disabled"]; +const _hoisted_37 = ["disabled"]; + + +const IMAGE_MIN_SCALE = 0.5; +const IMAGE_MAX_SCALE = 6; +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'MessageList', + props: { + messages: { + type: Array, + default: () => [] + }, + selectionMode: { + type: Boolean, + default: false + }, + selectedMessageIds: { + type: Array, + default: () => [] + }, + favoriteMessageIds: { + type: Array, + default: () => [] + }, + attentionMessageId: { + type: String, + default: '' + }, + canRecallOthers: { + type: Boolean, + default: false + } + }, + emits: ['message-action', 'toggle-select', 'sender-profile-updated'], + setup(__props, { + emit: __emit + }) { + const props = __props; + const emit = __emit; + const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_7__/* .useContactStore */ .p)(); + const listEl = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(null); + const viewerStage = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(null); + const contextMenu = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .reactive */ .Kh)({ + visible: false, + x: 0, + y: 0, + message: null + }); + const imageViewer = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .reactive */ .Kh)({ + visible: false, + url: '', + name: '', + scale: 1, + rotation: 0, + offsetX: 0, + offsetY: 0, + dragging: false, + dragStartX: 0, + dragStartY: 0, + dragOffsetX: 0, + dragOffsetY: 0 + }); + const senderProfile = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .reactive */ .Kh)({ + visible: false, + uid: '', + displayName: '', + rawName: '', + mobile: '', + address: '', + portrait: '', + avatarText: '', + role: '', + roleLabel: '', + contactAlias: '', + groupAlias: '', + isContact: false, + aliasDraft: '', + saving: false, + adding: false, + notice: '', + error: '' + }); + const imageViewerStyle = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => ({ + transform: `translate3d(${imageViewer.offsetX}px, ${imageViewer.offsetY}px, 0) scale(${imageViewer.scale}) rotate(${imageViewer.rotation}deg)` + })); + const menuItems = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => { + if (!contextMenu.message) { + return []; + } + const isOwnMessage = contextMenu.message.direction === 'out'; + if (isRecalledMessage(contextMenu.message)) { + return [...(isOwnMessage ? [{ + action: 'edit', + label: '编辑' + }] : []), { + action: 'copy', + label: '复制' + }, { + action: 'delete', + label: '删除' + }, { + action: 'detail', + label: '详情' + }]; + } + const favoriteLabel = isFavorite(contextMenu.message) ? '取消收藏' : '收藏'; + const items = [{ + action: 'copy', + label: '复制' + }, { + action: 'delete', + label: '删除' + }, { + action: 'forward', + label: '转发' + }, { + action: 'favorite', + label: favoriteLabel + }, { + action: 'quote', + label: '引用' + }, { + action: 'select', + label: '多选' + }, { + action: 'detail', + label: '详情' + }]; + if (isOwnMessage) { + items.unshift({ + action: 'edit', + label: '编辑' + }); + items.push({ + action: 'recall', + label: '撤回' + }); + } else if (props.canRecallOthers) { + items.push({ + action: 'recall', + label: '撤回' + }); + } + return items; + }); + function scrollToBottom() { + (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .nextTick */ .dY)(() => { + if (listEl.value) { + listEl.value.scrollTop = listEl.value.scrollHeight; + } + }); + } + function scrollToMessage(messageId) { + (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .nextTick */ .dY)(() => { + if (!listEl.value || !messageId) { + return; + } + const row = Array.from(listEl.value.querySelectorAll('.message-row')).find(element => element.dataset.messageKey === messageId); + if (row) { + row.scrollIntoView({ + block: 'center', + behavior: 'smooth' + }); + } + }); + } + (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .watch */ .wB)(() => props.messages.map(message => `${message.id}:${message.status}:${message.deliveryStatus || ''}:${message.messageUid || ''}:${message.recalled ? '1' : ''}`).join('|'), scrollToBottom, { + immediate: true + }); + (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .watch */ .wB)(() => props.attentionMessageId, scrollToMessage); + (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .onMounted */ .sV)(() => { + document.addEventListener('click', closeMenu); + document.addEventListener('keydown', closeMenuOnEscape); + document.addEventListener('pointermove', moveImageDrag); + document.addEventListener('pointerup', stopImageDrag); + }); + (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .onBeforeUnmount */ .xo)(() => { + document.removeEventListener('click', closeMenu); + document.removeEventListener('keydown', closeMenuOnEscape); + document.removeEventListener('pointermove', moveImageDrag); + document.removeEventListener('pointerup', stopImageDrag); + }); + function messageIdentity(message) { + return String(message.messageUid || message.id || ''); + } + function canOpenMessageMenu(message) { + return message && message.status !== 'failed' && message.status !== 'sending'; + } + function isSelected(message) { + return props.selectedMessageIds.includes(messageIdentity(message)); + } + function isFavorite(message) { + return props.favoriteMessageIds.includes(messageIdentity(message)); + } + function isAttention(message) { + return props.attentionMessageId === messageIdentity(message); + } + function isRecallNotice(message) { + return message.direction === 'out' && (message.recalled || message.status === 'recalled'); + } + function isRecalledMessage(message) { + return message.recalled || message.status === 'recalled'; + } + function isImageMessage(message) { + return message?.type === 'image' && message?.attachment?.url; + } + function isFileMessage(message) { + return message?.type === 'file' && message?.attachment?.url; + } + function isGroupMessage(message) { + return ['group', 'channel'].includes(message?.conversationType || ''); + } + function showGroupSender(message) { + return isGroupMessage(message) && message?.direction === 'in'; + } + function senderRoleLabel(message) { + const role = message?.senderProfile?.role || message?.senderRole || ''; + if (role === 'owner') { + return '群主'; + } + if (role === 'admin') { + return '管理员'; + } + return ''; + } + function groupSenderName(message) { + return message?.senderName || message?.senderProfile?.displayName || message?.from || '未知用户'; + } + function groupSenderAvatarText(message) { + return String(groupSenderName(message) || '?').slice(0, 1).toUpperCase(); + } + function openSenderProfile(message) { + const profile = message?.senderProfile || {}; + const uid = profile.uid || message?.from || ''; + const cachedContact = contacts.contacts.find(contact => String(contact.uid || contact.id || '') === uid) || null; + const cachedAlias = String(cachedContact?.alias || '').trim(); + const contactAlias = String(profile.contactAlias || cachedAlias || profile.remarkAlias || '').trim(); + const groupAlias = String(profile.groupAlias || '').trim(); + const rawName = profile.rawName || cachedContact?.rawUser?.displayName || cachedContact?.rawUser?.name || cachedContact?.title || groupSenderName(message); + const displayName = contactAlias || groupAlias || rawName || uid; + senderProfile.visible = true; + senderProfile.uid = uid; + senderProfile.displayName = displayName; + senderProfile.rawName = rawName || ''; + senderProfile.mobile = profile.mobile || cachedContact?.rawUser?.mobile || ''; + senderProfile.address = profile.address || cachedContact?.address || cachedContact?.rawUser?.address || ''; + senderProfile.portrait = profile.portrait || cachedContact?.portrait || message?.senderPortrait || ''; + senderProfile.avatarText = String(displayName || senderProfile.uid || '?').slice(0, 1).toUpperCase(); + senderProfile.role = profile.role || message?.senderRole || ''; + senderProfile.roleLabel = senderRoleLabel(message); + senderProfile.contactAlias = contactAlias; + senderProfile.groupAlias = groupAlias; + senderProfile.isContact = Boolean(profile.isContact || cachedContact); + senderProfile.aliasDraft = contactAlias; + senderProfile.saving = false; + senderProfile.adding = false; + senderProfile.notice = ''; + senderProfile.error = ''; + closeMenu(); + } + function closeSenderProfile() { + if (senderProfile.saving || senderProfile.adding) { + return; + } + senderProfile.visible = false; + } + async function addSenderAsContact() { + if (!senderProfile.uid || senderProfile.adding || senderProfile.saving) { + return; + } + senderProfile.adding = true; + senderProfile.notice = ''; + senderProfile.error = ''; + const ok = await contacts.addContact(senderProfile.uid); + if (ok || String(contacts.actionError || '').includes('已经是联系人')) { + senderProfile.isContact = true; + const alias = senderProfile.aliasDraft.trim(); + let aliasSaved = false; + if (alias) { + aliasSaved = await contacts.updateContactAlias(senderProfile.uid, alias); + if (aliasSaved) { + senderProfile.contactAlias = alias; + senderProfile.displayName = alias; + senderProfile.avatarText = String(alias || senderProfile.uid || '?').slice(0, 1).toUpperCase(); + } + } + await contacts.refreshContacts({ + force: true + }).catch(() => {}); + if (alias && !aliasSaved) { + senderProfile.notice = ''; + senderProfile.error = contacts.actionError ? `已添加为好友,但${contacts.actionError}` : '已添加为好友,但备注名同步失败'; + } else { + senderProfile.notice = alias ? '已添加为好友,备注名已保存' : ok ? '已添加为好友' : '已是好友'; + } + emit('sender-profile-updated', { + userId: senderProfile.uid + }); + } else { + senderProfile.error = contacts.actionError || '添加好友失败'; + } + senderProfile.adding = false; + } + async function saveSenderAlias() { + if (!senderProfile.uid || senderProfile.saving || senderProfile.adding) { + return; + } + senderProfile.saving = true; + senderProfile.notice = ''; + senderProfile.error = ''; + const ok = await contacts.updateContactAlias(senderProfile.uid, senderProfile.aliasDraft); + if (ok) { + await contacts.refreshContacts({ + force: true + }).catch(() => {}); + const alias = senderProfile.aliasDraft.trim(); + senderProfile.contactAlias = alias; + senderProfile.displayName = alias || senderProfile.groupAlias || senderProfile.rawName || senderProfile.uid; + senderProfile.avatarText = String(senderProfile.displayName || senderProfile.uid || '?').slice(0, 1).toUpperCase(); + senderProfile.notice = '备注名已保存'; + emit('sender-profile-updated', { + userId: senderProfile.uid + }); + } else { + senderProfile.error = contacts.actionError || '备注名修改失败'; + } + senderProfile.saving = false; + } + function roleBubbleClass(message) { + const role = message?.senderRole || ''; + if (role === 'owner') { + return 'role-bubble-owner'; + } + if (role === 'admin') { + return 'role-bubble-admin'; + } + return ''; + } + function formatFileSize(size) { + const bytes = Number(size || 0); + if (bytes >= 1024 * 1024) { + return `${(bytes / 1024 / 1024).toFixed(bytes >= 10 * 1024 * 1024 ? 0 : 1)} MB`; + } + if (bytes >= 1024) { + return `${(bytes / 1024).toFixed(bytes >= 10 * 1024 ? 0 : 1)} KB`; + } + return bytes > 0 ? `${bytes} B` : ''; + } + function handleMessageClick(message) { + if (props.selectionMode) { + emit('toggle-select', message); + } + } + function handleImageClick(message) { + if (props.selectionMode) { + emit('toggle-select', message); + return; + } + openImageViewer(message); + } + function openImageViewer(message) { + const attachment = message?.attachment || {}; + if (!attachment.url) { + return; + } + closeMenu(); + imageViewer.visible = true; + imageViewer.url = attachment.url; + imageViewer.name = attachment.name || 'image'; + resetImageViewer(); + } + function closeImageViewer() { + imageViewer.visible = false; + imageViewer.dragging = false; + } + function resetImageViewer() { + imageViewer.scale = 1; + imageViewer.rotation = 0; + imageViewer.offsetX = 0; + imageViewer.offsetY = 0; + } + function clampImageScale(value) { + return Math.min(IMAGE_MAX_SCALE, Math.max(IMAGE_MIN_SCALE, Number(value.toFixed(2)))); + } + function setImageScale(value, originX = null, originY = null) { + const previousScale = imageViewer.scale; + const nextScale = clampImageScale(value); + if (nextScale === previousScale) { + return; + } + if (originX !== null && originY !== null && viewerStage.value) { + const rect = viewerStage.value.getBoundingClientRect(); + const centerX = rect.left + rect.width / 2; + const centerY = rect.top + rect.height / 2; + const ratio = nextScale / previousScale - 1; + imageViewer.offsetX -= (originX - centerX - imageViewer.offsetX) * ratio; + imageViewer.offsetY -= (originY - centerY - imageViewer.offsetY) * ratio; + } + imageViewer.scale = nextScale; + if (nextScale <= 1) { + imageViewer.offsetX = 0; + imageViewer.offsetY = 0; + } + } + function zoomImage(delta) { + setImageScale(imageViewer.scale + delta); + } + function rotateImage() { + imageViewer.rotation = (imageViewer.rotation + 90) % 360; + } + function handleImageWheel(event) { + const factor = event.deltaY < 0 ? 1.12 : 1 / 1.12; + setImageScale(imageViewer.scale * factor, event.clientX, event.clientY); + } + function startImageDrag(event) { + if (!imageViewer.visible || imageViewer.scale <= 1) { + return; + } + imageViewer.dragging = true; + imageViewer.dragStartX = event.clientX; + imageViewer.dragStartY = event.clientY; + imageViewer.dragOffsetX = imageViewer.offsetX; + imageViewer.dragOffsetY = imageViewer.offsetY; + } + function moveImageDrag(event) { + if (!imageViewer.dragging) { + return; + } + imageViewer.offsetX = imageViewer.dragOffsetX + event.clientX - imageViewer.dragStartX; + imageViewer.offsetY = imageViewer.dragOffsetY + event.clientY - imageViewer.dragStartY; + } + function stopImageDrag() { + imageViewer.dragging = false; + } + function saveViewerImage() { + if (!imageViewer.url) { + return; + } + const downloadUrl = new URL('/api/media_download.php', window.location.origin); + downloadUrl.searchParams.set('url', imageViewer.url); + downloadUrl.searchParams.set('name', imageViewer.name || 'image'); + const link = document.createElement('a'); + link.href = downloadUrl.toString(); + link.download = imageViewer.name || 'image'; + document.body.appendChild(link); + link.click(); + link.remove(); + } + function openMenu(event, message) { + if (!canOpenMessageMenu(message)) { + closeMenu(); + return; + } + contextMenu.visible = true; + contextMenu.message = message; + contextMenu.x = Math.min(event.clientX, window.innerWidth - 148); + contextMenu.y = Math.min(event.clientY, window.innerHeight - 352); + } + function closeMenu() { + contextMenu.visible = false; + contextMenu.message = null; + } + function closeMenuOnEscape(event) { + if (event.key === 'Escape') { + if (senderProfile.visible) { + closeSenderProfile(); + } + if (imageViewer.visible) { + closeImageViewer(); + } + closeMenu(); + } + } + function chooseMenuAction(action) { + if (contextMenu.message) { + emit('message-action', { + action, + message: contextMenu.message + }); + } + closeMenu(); + } + function formatTime(timestamp) { + return new Intl.DateTimeFormat('zh-CN', { + hour: '2-digit', + minute: '2-digit', + hour12: false, + timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone + }).format(timestamp); + } + function deliveryState(message) { + if (message.direction !== 'out' || message.status === 'failed' || message.status === 'recalled' || message.recalled) { + return ''; + } + const state = message.deliveryStatus || message.status; + if (state === 'read') { + return 'read'; + } + if (state === 'delivered') { + return 'delivered'; + } + if (state === 'sent') { + return 'sent'; + } + return ''; + } + function deliveryTitle(message) { + const state = deliveryState(message); + if (state === 'read') { + return '对方已读'; + } + if (state === 'delivered') { + return '已送达对方'; + } + if (state === 'sent') { + return '已送出'; + } + return ''; + } + function failureText(message) { + if (message.status === 'failed') { + if (message.errorCode) { + return message.error ? `失败:${message.error}(${message.errorCode})` : `失败:${message.errorCode}`; + } + return message.error ? `失败:${message.error}` : '失败'; + } + return ''; + } + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("div", { + ref_key: "listEl", + ref: listEl, + class: "message-list" + }, [((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_9__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .renderList */ .pI)(__props.messages, message => { + return (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("article", { + key: message.id, + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)(["message-row", [message.direction, { + selected: isSelected(message), + attention: isAttention(message), + recalled: message.recalled || message.status === 'recalled' + }]]), + "data-message-key": messageIdentity(message), + onClick: $event => handleMessageClick(message) + }, [__props.selectionMode ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + type: "checkbox", + checked: isSelected(message), + onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(() => {}, ["stop"])), + onChange: $event => emit('toggle-select', message) + }, null, 40, _hoisted_3)])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), showGroupSender(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: 1, + type: "button", + class: "message-sender-avatar", + title: groupSenderName(message), + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)($event => openSenderProfile(message), ["stop"]) + }, [message.senderPortrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("img", { + key: 0, + src: message.senderPortrait, + alt: "" + }, null, 8, _hoisted_5)) : ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_6, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(groupSenderAvatarText(message)), 1))], 8, _hoisted_4)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_7, [showGroupSender(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: 0, + type: "button", + class: "message-sender-name", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)($event => openSenderProfile(message), ["stop"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createTextVNode */ .eW)((0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(groupSenderName(message)) + " ", 1), senderRoleLabel(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_9, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderRoleLabel(message)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)], 8, _hoisted_8)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)(["message-bubble", roleBubbleClass(message)]), + onContextmenu: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)($event => openMenu($event, message), ["prevent"]) + }, [isImageMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: 0, + type: "button", + class: "message-image", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)($event => handleImageClick(message), ["stop"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("img", { + src: message.attachment.url, + alt: message.attachment.name || '图片' + }, null, 8, _hoisted_12)], 8, _hoisted_11)) : isFileMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("a", { + key: 1, + class: "message-file", + href: message.attachment.url, + target: "_blank", + rel: "noreferrer", + download: "" + }, [_cache[7] || (_cache[7] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", { + class: "message-file-icon" + }, "▤", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(message.attachment.name || '文件'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(formatFileSize(message.attachment.size)), 1)])], 8, _hoisted_13)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), message.text ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("p", _hoisted_15, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(message.text), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("time", null, [isRecallNotice(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(message.recallStatus || '已撤回'), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(formatTime(message.displayTimestamp || message.timestamp)), 1), message.editedAt ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_17, "【edit " + (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(formatTime(message.editedAt)) + "】", 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), isFavorite(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_18, "★")) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), deliveryState(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", { + key: 3, + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)(["delivery-mark", `delivery-mark-${deliveryState(message)}`]), + title: deliveryTitle(message), + "aria-label": deliveryTitle(message) + }, [_cache[8] || (_cache[8] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", { + class: "delivery-check" + }, "✓", -1)), deliveryState(message) !== 'sent' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_20, "✓")) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)], 10, _hoisted_19)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), message.status === 'failed' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(failureText(message)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)])], 42, _hoisted_10)])], 10, _hoisted_1); + }), 128)), contextMenu.visible ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("div", { + key: 0, + class: "message-context-menu", + style: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeStyle */ .Tr)({ + left: `${contextMenu.x}px`, + top: `${contextMenu.y}px` + }), + onClick: _cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(() => {}, ["stop"])) + }, [((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_9__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .renderList */ .pI)(menuItems.value, item => { + return (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: item.action, + type: "button", + onClick: $event => chooseMenuAction(item.action) + }, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(item.label), 9, _hoisted_22); + }), 128))], 4)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createBlock */ .Wv)(vue__WEBPACK_IMPORTED_MODULE_9__/* .Teleport */ .Im, { + to: "body" + }, [imageViewer.visible ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("div", { + key: 0, + class: "image-viewer-backdrop", + onClick: closeImageViewer + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", { + class: "image-viewer-dialog", + onClick: _cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(() => {}, ["stop"])) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_23, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", _hoisted_24, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(imageViewer.name || '图片'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "缩小", + "aria-label": "缩小", + onClick: _cache[2] || (_cache[2] = $event => zoomImage(-0.25)) + }, "−"), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "放大", + "aria-label": "放大", + onClick: _cache[3] || (_cache[3] = $event => zoomImage(0.25)) + }, "+"), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "还原", + "aria-label": "还原", + onClick: resetImageViewer + }, "1:1"), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "旋转", + "aria-label": "旋转", + onClick: rotateImage + }, "⟳"), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "保存", + "aria-label": "保存", + onClick: saveViewerImage + }, "⇩"), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "关闭", + "aria-label": "关闭", + onClick: closeImageViewer + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", { + ref_key: "viewerStage", + ref: viewerStage, + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)(["image-viewer-stage", { + dragging: imageViewer.dragging, + zoomed: imageViewer.scale > 1 + }]), + onWheel: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(handleImageWheel, ["prevent"]), + onPointerdown: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(startImageDrag, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("img", { + class: "image-viewer-img", + src: imageViewer.url, + alt: imageViewer.name || '图片', + style: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeStyle */ .Tr)(imageViewerStyle.value), + draggable: "false" + }, null, 12, _hoisted_25)], 34)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)])), ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createBlock */ .Wv)(vue__WEBPACK_IMPORTED_MODULE_9__/* .Teleport */ .Im, { + to: "body" + }, [senderProfile.visible ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("div", { + key: 0, + class: "sender-profile-backdrop", + onClick: closeSenderProfile + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("section", { + class: "sender-profile-dialog", + onClick: _cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(() => {}, ["stop"])) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("header", null, [_cache[9] || (_cache[9] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("strong", null, "用户资料", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeSenderProfile + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_26, [senderProfile.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "profile-avatar image-avatar", + src: senderProfile.portrait, + alt: "" + }, null, 8, _hoisted_27)) : ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("div", _hoisted_28, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.displayName || senderProfile.uid), 1), senderProfile.roleLabel ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_29, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.roleLabel), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("dl", _hoisted_30, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", null, [_cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("dt", null, "用户ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.uid || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", null, [_cache[11] || (_cache[11] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("dt", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.rawName || senderProfile.displayName || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", null, [_cache[12] || (_cache[12] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("dt", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.mobile || '未知'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", null, [_cache[13] || (_cache[13] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("dt", null, "地区", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.address || '未知'), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("label", _hoisted_31, [_cache[14] || (_cache[14] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "备注名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[5] || (_cache[5] = $event => senderProfile.aliasDraft = $event), + maxlength: "32", + autocomplete: "off", + placeholder: "可给群员设置备注", + disabled: senderProfile.saving || senderProfile.adding + }, null, 8, _hoisted_32), [[vue__WEBPACK_IMPORTED_MODULE_11__/* .vModelText */ .Jo, senderProfile.aliasDraft, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("footer", _hoisted_33, [senderProfile.notice ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_34, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.notice), 1)) : senderProfile.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_35, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.error), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), !senderProfile.isContact ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: 2, + type: "button", + class: "ghost-inline-action", + disabled: senderProfile.adding || senderProfile.saving || !senderProfile.uid, + onClick: addSenderAsContact + }, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.adding ? '添加中...' : '添加为好友'), 9, _hoisted_36)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "primary-inline-action", + disabled: senderProfile.saving || senderProfile.adding || !senderProfile.uid, + onClick: saveSenderAlias + }, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(senderProfile.saving ? '保存中...' : '保存备注'), 9, _hoisted_37)])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)]))], 512); + }; + } +}); + +/***/ }), + +/***/ 901: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_ContactList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_ContactList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3121); + + +/***/ }), + +/***/ 922: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_ChatShell_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_ChatShell_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8446); + + +/***/ }), + +/***/ 1050: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ l: function() { return /* binding */ useNavigationStore; } +/* harmony export */ }); +/* harmony import */ var pinia__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9776); + +const useNavigationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_0__/* .defineStore */ .nY)('navigation', { + state: () => ({ + section: 'messages' + }), + actions: { + showMessages() { + this.section = 'messages'; + }, + showContacts() { + this.section = 'contacts'; + }, + showFavorites() { + this.section = 'favorites'; + } + } +}); + +/***/ }), + +/***/ 1362: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4912); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(4546); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7987); +/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3842); +/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1050); + + + +const _hoisted_1 = { + class: "favorite-panel" +}; +const _hoisted_2 = { + class: "chat-header" +}; +const _hoisted_3 = { + class: "favorite-detail" +}; +const _hoisted_4 = { + class: "favorite-detail-body" +}; +const _hoisted_5 = { + key: 0, + class: "recall-mark" +}; +const _hoisted_6 = ["href"]; +const _hoisted_7 = ["src", "alt"]; +const _hoisted_8 = ["href"]; +const _hoisted_9 = { + class: "message-file-main" +}; +const _hoisted_10 = { + key: 3 +}; +const _hoisted_11 = { + class: "favorite-detail-actions" +}; +const _hoisted_12 = { + key: 0, + class: "inline-save-status" +}; +const _hoisted_13 = { + key: 1, + class: "inline-save-status error" +}; +const _hoisted_14 = { + key: 1, + class: "empty-chat" +}; + + + +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'FavoritePanel', + setup(__props) { + const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_2__/* .useConversationStore */ .w)(); + const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_3__/* .useNavigationStore */ .l)(); + const favorite = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .computed */ .EW)(() => conversations.activeFavorite); + const notice = (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .ref */ .KR)(''); + const error = (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .ref */ .KR)(''); + function clearFeedback() { + notice.value = ''; + error.value = ''; + } + function favoriteTitle(item) { + if (item.conversationTitle) { + return item.conversationTitle; + } + const conversation = conversations.conversations.find(entry => entry.id === item.conversationId); + return conversation?.title || item.conversationId || '未知会话'; + } + function favoriteText(item) { + return item.text || ''; + } + function isImageFavorite(item) { + return item?.type === 'image' && item?.attachment?.url; + } + function isFileFavorite(item) { + return item?.type === 'file' && item?.attachment?.url; + } + function favoriteCopyText(item) { + if (!item) { + return ''; + } + if (item.text) { + return item.text; + } + if (item.recalled) { + return item.recallStatus || '已撤回'; + } + if (isImageFavorite(item)) { + return item.attachment.url; + } + if (isFileFavorite(item)) { + return `${item.attachment.name || '文件'} ${item.attachment.url}`.trim(); + } + return item.preview || ''; + } + function formatFileSize(size) { + const bytes = Number(size || 0); + if (bytes >= 1024 * 1024) { + return `${(bytes / 1024 / 1024).toFixed(bytes >= 10 * 1024 * 1024 ? 0 : 1)} MB`; + } + if (bytes >= 1024) { + return `${(bytes / 1024).toFixed(bytes >= 10 * 1024 ? 0 : 1)} KB`; + } + return bytes > 0 ? `${bytes} B` : ''; + } + function formatFavoriteTime(timestamp) { + const value = Number(timestamp || 0); + if (!value) { + return ''; + } + return new Intl.DateTimeFormat('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + hour12: false + }).format(value); + } + async function copyFavorite() { + clearFeedback(); + const text = favoriteCopyText(favorite.value || {}).trim(); + if (!text) { + error.value = '没有可复制的文字内容'; + return; + } + try { + await writeClipboard(text); + notice.value = '已复制'; + } catch (copyError) { + error.value = '复制失败'; + } + } + async function writeClipboard(text) { + if (navigator.clipboard?.writeText) { + await navigator.clipboard.writeText(text); + return; + } + const element = document.createElement('textarea'); + element.value = text; + element.setAttribute('readonly', 'readonly'); + element.style.position = 'fixed'; + element.style.left = '-9999px'; + document.body.appendChild(element); + element.select(); + document.execCommand('copy'); + document.body.removeChild(element); + } + function openConversation() { + clearFeedback(); + const item = favorite.value; + if (!item?.conversationId) { + error.value = '缺少原会话信息'; + return; + } + const conversation = conversations.conversations.find(entry => entry.id === item.conversationId); + if (!conversation) { + error.value = '原会话暂未加载,请刷新会话后再试'; + conversations.refreshRemoteConversations(); + return; + } + navigation.showMessages(); + conversations.setActiveConversation(item.conversationId); + window.setTimeout(() => { + conversations.focusMessage({ + id: item.id || item.key, + messageUid: item.messageUid || item.key + }); + }, 450); + } + function removeFavorite() { + clearFeedback(); + const key = favorite.value?.key || ''; + if (!key) { + return; + } + conversations.removeFavorite(key); + notice.value = '已取消收藏'; + } + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("section", _hoisted_1, [favorite.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_4__/* .Fragment */ .FK, { + key: 0 + }, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("header", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("div", null, [_cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("h2", null, "收藏详情", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(favoriteTitle(favorite.value)), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("div", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .normalizeClass */ .C4)(["favorite-detail-message", { + recalled: favorite.value.recalled + }]) + }, [_cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("span", { + class: "favorite-detail-star" + }, "★", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("div", _hoisted_4, [favorite.value.recalled ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("span", _hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(favorite.value.recallStatus || '已撤回'), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createCommentVNode */ .Q3)("", true), isImageFavorite(favorite.value) ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("a", { + key: 1, + class: "favorite-detail-image", + href: favorite.value.attachment.url, + target: "_blank", + rel: "noreferrer" + }, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("img", { + src: favorite.value.attachment.url, + alt: favorite.value.attachment.name || '图片' + }, null, 8, _hoisted_7)], 8, _hoisted_6)) : isFileFavorite(favorite.value) ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("a", { + key: 2, + class: "message-file favorite-detail-file", + href: favorite.value.attachment.url, + target: "_blank", + rel: "noreferrer", + download: "" + }, [_cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("span", { + class: "message-file-icon" + }, "▤", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("span", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(favorite.value.attachment.name || '文件'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(formatFileSize(favorite.value.attachment.size)), 1)])], 8, _hoisted_8)) : (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createCommentVNode */ .Q3)("", true), favoriteText(favorite.value) ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("p", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(favoriteText(favorite.value)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("time", null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(formatFavoriteTime(favorite.value.timestamp)), 1)], 2), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("div", _hoisted_11, [notice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("span", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(notice.value), 1)) : error.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("span", _hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(error.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "ghost-inline-action", + onClick: copyFavorite + }, "复制"), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "ghost-inline-action", + onClick: openConversation + }, "打开原会话"), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "danger-inline-action", + onClick: removeFavorite + }, "取消收藏")])])], 64)) : ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("div", _hoisted_14, _cache[3] || (_cache[3] = [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("strong", null, "暂无收藏消息", -1), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("span", null, "右键消息气泡选择“收藏”后,会显示在这里", -1)])))]); + }; + } +}); + +/***/ }), + +/***/ 1509: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3741); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4912); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(793); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8438); +/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(6768); +/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(2409); +/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(9488); +/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(6591); +/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(5412); +/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(9214); +/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(4546); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(1857); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(7987); +/* harmony import */ var _MessageList_vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(8888); +/* harmony import */ var _MessageComposer_vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(2390); +/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(6151); +/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(3842); +/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(3865); +/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(4834); + + + + + + + + + + + + +const _hoisted_1 = { + class: "chat-panel" +}; +const _hoisted_2 = { + class: "chat-header" +}; +const _hoisted_3 = ["src"]; +const _hoisted_4 = { + key: 1, + class: "chat-title-avatar" +}; +const _hoisted_5 = { + class: "chat-title-copy" +}; +const _hoisted_6 = ["src"]; +const _hoisted_7 = { + key: 1, + class: "chat-title-avatar" +}; +const _hoisted_8 = { + class: "chat-title-copy" +}; +const _hoisted_9 = { + key: 2 +}; +const _hoisted_10 = { + class: "header-actions chat-header-actions" +}; +const _hoisted_11 = { + key: 0, + class: "empty-chat" +}; +const _hoisted_12 = { + key: 2, + class: "selection-toolbar" +}; +const _hoisted_13 = { + class: "forward-dialog" +}; +const _hoisted_14 = ["onClick"]; +const _hoisted_15 = { + class: "conversation-avatar" +}; +const _hoisted_16 = { + type: "submit" +}; +const _hoisted_17 = { + class: "group-dialog message-detail-dialog" +}; +const _hoisted_18 = { + key: 0, + class: "group-loading" +}; +const _hoisted_19 = { + class: "group-profile message-detail-meta" +}; +const _hoisted_20 = { + key: 0 +}; +const _hoisted_21 = { + key: 0, + class: "inline-save-status error" +}; +const _hoisted_22 = { + class: "message-detail-summary" +}; +const _hoisted_23 = { + class: "message-detail-groups" +}; +const _hoisted_24 = { + class: "message-detail-section" +}; +const _hoisted_25 = { + key: 0, + class: "message-detail-member-list" +}; +const _hoisted_26 = ["src"]; +const _hoisted_27 = { + key: 1, + class: "conversation-avatar" +}; +const _hoisted_28 = { + class: "message-detail-member-main" +}; +const _hoisted_29 = { + class: "message-detail-member-time" +}; +const _hoisted_30 = { + key: 2, + class: "message-detail-role" +}; +const _hoisted_31 = { + key: 1, + class: "contact-picker-empty" +}; +const _hoisted_32 = { + class: "message-detail-section" +}; +const _hoisted_33 = { + key: 0, + class: "message-detail-member-list" +}; +const _hoisted_34 = ["src"]; +const _hoisted_35 = { + key: 1, + class: "conversation-avatar" +}; +const _hoisted_36 = { + class: "message-detail-member-main" +}; +const _hoisted_37 = { + class: "message-detail-member-time" +}; +const _hoisted_38 = { + key: 2, + class: "message-detail-role" +}; +const _hoisted_39 = { + key: 1, + class: "contact-picker-empty" +}; +const _hoisted_40 = { + class: "message-detail-section" +}; +const _hoisted_41 = { + key: 0, + class: "message-detail-member-list" +}; +const _hoisted_42 = ["src"]; +const _hoisted_43 = { + key: 1, + class: "conversation-avatar" +}; +const _hoisted_44 = { + class: "message-detail-member-main" +}; +const _hoisted_45 = { + key: 2, + class: "message-detail-role" +}; +const _hoisted_46 = { + key: 1, + class: "contact-picker-empty" +}; +const _hoisted_47 = { + class: "group-dialog single-profile-dialog" +}; +const _hoisted_48 = { + class: "single-profile-summary" +}; +const _hoisted_49 = ["src"]; +const _hoisted_50 = { + key: 1, + class: "profile-avatar" +}; +const _hoisted_51 = { + class: "group-profile" +}; +const _hoisted_52 = { + class: "single-profile-footer" +}; +const _hoisted_53 = { + key: 0, + class: "inline-save-status" +}; +const _hoisted_54 = { + key: 1, + class: "inline-save-status error" +}; +const _hoisted_55 = ["disabled"]; +const _hoisted_56 = ["disabled"]; +const _hoisted_57 = { + key: 0, + class: "group-dialog" +}; +const _hoisted_58 = { + key: 0, + class: "group-loading" +}; +const _hoisted_59 = { + key: 1, + class: "group-profile" +}; +const _hoisted_60 = ["disabled"]; +const _hoisted_61 = ["disabled"]; +const _hoisted_62 = ["disabled"]; +const _hoisted_63 = { + key: 1, + class: "group-dialog" +}; +const _hoisted_64 = { + key: 0, + class: "group-loading" +}; +const _hoisted_65 = { + key: 1, + class: "group-member-list" +}; +const _hoisted_66 = ["src"]; +const _hoisted_67 = { + key: 1, + class: "conversation-avatar" +}; +const _hoisted_68 = { + key: 0, + class: "contact-picker-empty" +}; +const _hoisted_69 = ["disabled"]; +const _hoisted_70 = { + key: 3, + class: "group-dialog" +}; +const _hoisted_71 = { + key: 0, + class: "group-loading" +}; +const _hoisted_72 = { + key: 1, + class: "group-member-list" +}; +const _hoisted_73 = ["onClick"]; +const _hoisted_74 = ["src"]; +const _hoisted_75 = { + key: 1, + class: "conversation-avatar" +}; +const _hoisted_76 = { + key: 0, + class: "contact-picker-empty" +}; +const _hoisted_77 = ["disabled"]; +const _hoisted_78 = { + key: 4, + class: "group-dialog group-management-dialog" +}; +const _hoisted_79 = { + class: "group-management-tabs" +}; +const _hoisted_80 = { + key: 0, + class: "group-loading" +}; +const _hoisted_81 = { + key: 1, + class: "group-manage-section" +}; +const _hoisted_82 = { + class: "group-member-list" +}; +const _hoisted_83 = ["checked", "onChange"]; +const _hoisted_84 = ["src"]; +const _hoisted_85 = { + key: 1, + class: "conversation-avatar" +}; +const _hoisted_86 = { + key: 0, + class: "contact-picker-empty" +}; +const _hoisted_87 = { + key: 2, + class: "group-manage-section" +}; +const _hoisted_88 = { + key: 3, + class: "group-manage-section" +}; +const _hoisted_89 = { + class: "group-member-list" +}; +const _hoisted_90 = ["checked", "onChange"]; +const _hoisted_91 = ["src"]; +const _hoisted_92 = { + key: 1, + class: "conversation-avatar" +}; +const _hoisted_93 = { + key: 0, + class: "contact-picker-empty" +}; +const _hoisted_94 = ["disabled"]; +const _hoisted_95 = { + key: 4, + class: "group-manage-section" +}; +const _hoisted_96 = { + key: 0, + class: "mute-time-grid" +}; +const _hoisted_97 = { + key: 1, + class: "mute-time-grid" +}; +const _hoisted_98 = { + class: "mute-save-footer" +}; +const _hoisted_99 = { + key: 0, + class: "inline-save-status" +}; +const _hoisted_100 = { + key: 1, + class: "inline-save-status error" +}; +const _hoisted_101 = ["disabled"]; + + + + + + + +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'ChatPanel', + setup(__props) { + const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_14__/* .useConversationStore */ .w)(); + const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_15__/* .useContactStore */ .p)(); + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_16__/* .useSessionStore */ .B)(); + const activeConversation = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => conversations.activeConversation); + const groupMenuOpen = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(false); + const singleProfileOpen = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(false); + const singleAliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(''); + const singleProfileSaving = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(false); + const singleProfileNotice = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(''); + const singleProfileError = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(''); + const groupPanel = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(''); + const groupBusy = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(false); + const groupDetail = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(null); + const groupMembers = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)([]); + const groupAliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(''); + const manageSection = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(''); + const selectedAdminIds = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)([]); + const selectedKickIds = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)([]); + const transferTargetId = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(''); + const profileDraft = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)({ + name: '', + announcement: '', + welcomeText: '' + }); + const muteDraft = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)({ + mode: 'off', + scheduleType: 'once', + startsAtLocal: '', + endsAtLocal: '', + dailyStart: '09:00', + dailyEnd: '18:00' + }); + const muteSaveNotice = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(''); + const muteSaveError = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .ref */ .KR)(''); + const singlePeerId = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => { + if (!activeConversation.value || isGroupConversation.value) { + return ''; + } + return String(activeConversation.value.target || activeConversation.value.raw?.target || activeConversation.value.id?.replace(/^single-/, '') || ''); + }); + const singleContact = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => { + const peerId = singlePeerId.value; + if (!peerId) { + return null; + } + return contacts.contacts.find(contact => String(contact.uid || contact.id || '') === peerId) || null; + }); + const singleProfile = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => { + const contact = singleContact.value; + const conversation = activeConversation.value || {}; + const rawUser = contact?.rawUser || {}; + const displayName = contact?.alias || rawUser.displayName || rawUser.name || contact?.title || conversation.title || singlePeerId.value || '未知用户'; + const rawName = rawUser.displayName || rawUser.name || contact?.title || conversation.title || ''; + return { + uid: singlePeerId.value, + displayName, + rawName, + mobile: rawUser.mobile || conversation.raw?.mobile || '', + address: rawUser.address || conversation.raw?.address || '', + portrait: contact?.portrait || conversation.portrait || '', + avatarText: String(displayName || '?').slice(0, 1).toUpperCase(), + alias: contact?.alias || '' + }; + }); + const isGroupConversation = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => { + return ['group', 'channel'].includes(activeConversation.value?.type) || activeConversation.value?.raw?.type === 'group'; + }); + const currentGroupRole = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => { + return groupDetail.value?.myRole || activeConversation.value?.role || activeConversation.value?.raw?.role || ''; + }); + const isGroupOwner = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => currentGroupRole.value === 'owner'); + const canManageGroup = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => ['owner', 'admin'].includes(currentGroupRole.value)); + const adminCandidateMembers = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => groupMembers.value.filter(member => member.role !== 'owner')); + const transferableMembers = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => groupMembers.value.filter(member => member.role !== 'owner')); + const messageDetail = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => conversations.messageDetail || null); + const messageDetailGroup = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => messageDetail.value?.group || null); + const isMessageDetailGroup = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => { + return messageDetail.value?.conversationType === 'group' || Boolean(messageDetail.value?.group); + }); + const messageDetailCounts = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => { + return messageDetailGroup.value?.counts || { + read: 0, + unread: 0, + undelivered: 0, + total: 0 + }; + }); + const kickCandidateMembers = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => { + return groupMembers.value.filter(member => { + if (member.uid === session.userId || member.role === 'owner') { + return false; + } + if (currentGroupRole.value === 'admin') { + return member.role === 'member'; + } + return currentGroupRole.value === 'owner'; + }); + }); + const statusText = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .computed */ .EW)(() => { + if (activeConversation.value?.type === 'channel' && !conversations.canSendActiveConversation) { + return '公告群,仅管理员可发言'; + } + return session.connectionStatusText || (session.connected ? '已连接' : '未连接'); + }); + function formatDetailTime(value) { + const timestamp = Number(value || 0); + if (!timestamp) { + return '暂无'; + } + return new Intl.DateTimeFormat('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false, + timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone + }).format(timestamp); + } + function detailMemberName(member) { + return member?.name || member?.displayName || member?.rawName || member?.uid || '-'; + } + function detailMemberAvatar(member) { + return String(detailMemberName(member) || '?').slice(0, 1).toUpperCase(); + } + function detailRoleLabel(role) { + if (role === 'owner') { + return '群主'; + } + if (role === 'admin') { + return '管理员'; + } + return ''; + } + function closeGroupMenu() { + groupMenuOpen.value = false; + } + function toggleGroupMenu() { + if (!isGroupConversation.value) { + return; + } + groupMenuOpen.value = !groupMenuOpen.value; + } + async function openSingleProfile() { + if (!activeConversation.value || isGroupConversation.value) { + return; + } + closeGroupMenu(); + singleProfileNotice.value = ''; + singleProfileError.value = ''; + singleAliasDraft.value = singleProfile.value.alias || ''; + singleProfileOpen.value = true; + contacts.refreshContacts().then(() => { + if (singleProfileOpen.value) { + singleAliasDraft.value = singleProfile.value.alias || ''; + } + }).catch(() => {}); + } + function closeSingleProfile() { + if (singleProfileSaving.value) { + return; + } + singleProfileOpen.value = false; + singleProfileNotice.value = ''; + singleProfileError.value = ''; + } + async function saveSingleAlias() { + const peerId = singleProfile.value.uid; + if (!peerId || singleProfileSaving.value) { + return; + } + singleProfileSaving.value = true; + singleProfileNotice.value = ''; + singleProfileError.value = ''; + try { + const ok = await contacts.updateContactAlias(peerId, singleAliasDraft.value); + if (!ok) { + singleProfileError.value = contacts.actionError || '备注名修改失败'; + return; + } + await contacts.refreshContacts({ + force: true + }).catch(() => {}); + const refreshedContact = contacts.contacts.find(contact => String(contact.uid || contact.id || '') === peerId) || singleContact.value; + const nextTitle = refreshedContact?.title || singleAliasDraft.value || singleProfile.value.rawName || singleProfile.value.displayName || peerId; + conversations.upsertConversation({ + ...activeConversation.value, + title: nextTitle, + portrait: refreshedContact?.portrait || activeConversation.value?.portrait || '', + avatarText: String(nextTitle || '?').slice(0, 1).toUpperCase(), + raw: { + ...(activeConversation.value?.raw || {}), + target: peerId, + mobile: refreshedContact?.rawUser?.mobile || activeConversation.value?.raw?.mobile || '', + address: refreshedContact?.rawUser?.address || activeConversation.value?.raw?.address || '', + alias: refreshedContact?.alias || singleAliasDraft.value + } + }); + singleAliasDraft.value = refreshedContact?.alias || singleAliasDraft.value; + singleProfileNotice.value = '备注名已保存'; + } catch (error) { + singleProfileError.value = error.message || '备注名修改失败'; + } finally { + singleProfileSaving.value = false; + } + } + function handleSenderProfileUpdated() { + contacts.refreshContacts({ + force: true + }).catch(() => {}); + conversations.syncActiveMessages({ + allowReadReceipt: true + }); + if (groupPanel.value === 'members') { + loadGroupMembers(); + } + } + function closeGroupPanel() { + groupPanel.value = ''; + groupBusy.value = false; + clearMuteSaveFeedback(); + } + async function loadGroupDetail() { + if (!session.userId || !activeConversation.value?.target) { + return null; + } + groupBusy.value = true; + try { + groupDetail.value = await _services_imClient__WEBPACK_IMPORTED_MODULE_13__/* .imClient */ .wD.getGroupDetail(session.userId, activeConversation.value.target); + return groupDetail.value; + } catch (error) { + conversations.setActionError(error.message || '群资料加载失败'); + return null; + } finally { + groupBusy.value = false; + } + } + async function openGroupOverview() { + if (!isGroupConversation.value) { + return; + } + closeGroupMenu(); + groupPanel.value = 'overview'; + await loadGroupDetail(); + } + async function openGroupMembers() { + closeGroupMenu(); + groupPanel.value = 'members'; + await loadGroupMembers(); + } + async function loadGroupMembers() { + groupBusy.value = true; + try { + groupMembers.value = await _services_imClient__WEBPACK_IMPORTED_MODULE_13__/* .imClient */ .wD.getGroupMembers(session.userId, activeConversation.value.target); + selectedAdminIds.value = groupMembers.value.filter(member => member.role === 'admin').map(member => member.uid); + return groupMembers.value; + } catch (error) { + conversations.setActionError(error.message || '群员加载失败'); + return []; + } finally { + groupBusy.value = false; + } + } + async function openGroupAlias() { + closeGroupMenu(); + groupPanel.value = 'alias'; + const detail = await loadGroupDetail(); + groupAliasDraft.value = detail?.myAlias || ''; + } + function msToLocalInput(value) { + const timestamp = Number(value || 0); + if (!timestamp) { + return ''; + } + const date = new Date(timestamp); + const local = new Date(date.getTime() - date.getTimezoneOffset() * 60000); + return local.toISOString().slice(0, 16); + } + function localInputToMs(value) { + return value ? new Date(value).getTime() : 0; + } + function prepareManagementDrafts() { + clearMuteSaveFeedback(); + profileDraft.value = { + name: groupDetail.value?.name || activeConversation.value?.title || '', + announcement: groupDetail.value?.announcement || '', + welcomeText: groupDetail.value?.welcomeText || '' + }; + const setting = groupDetail.value?.muteSetting || {}; + muteDraft.value = { + mode: setting.mode || 'off', + scheduleType: setting.scheduleType || 'once', + startsAtLocal: msToLocalInput(setting.startsAtMs), + endsAtLocal: msToLocalInput(setting.endsAtMs), + dailyStart: setting.dailyStart || '09:00', + dailyEnd: setting.dailyEnd || '18:00' + }; + } + function clearMuteSaveFeedback() { + muteSaveNotice.value = ''; + muteSaveError.value = ''; + } + async function openGroupManage() { + if (!canManageGroup.value) { + return; + } + closeGroupMenu(); + groupPanel.value = 'manage'; + manageSection.value = isGroupOwner.value ? 'admins' : 'profile'; + await loadGroupDetail(); + prepareManagementDrafts(); + await loadGroupMembers(); + } + async function openTransferGroup() { + groupPanel.value = 'transfer'; + transferTargetId.value = ''; + await loadGroupMembers(); + } + async function saveGroupAlias() { + if (!activeConversation.value?.target || groupBusy.value) { + return; + } + groupBusy.value = true; + try { + const alias = await _services_imClient__WEBPACK_IMPORTED_MODULE_13__/* .imClient */ .wD.updateGroupAlias(session.userId, activeConversation.value.target, groupAliasDraft.value); + groupDetail.value = { + ...(groupDetail.value || {}), + myAlias: alias + }; + conversations.setActionNotice('本群昵称已保存'); + closeGroupPanel(); + } catch (error) { + conversations.setActionError(error.message || '本群昵称保存失败'); + } finally { + groupBusy.value = false; + } + } + function toggleAdmin(userId) { + const selected = new Set(selectedAdminIds.value); + if (selected.has(userId)) { + selected.delete(userId); + } else { + selected.add(userId); + } + selectedAdminIds.value = Array.from(selected); + } + function toggleKick(userId) { + const selected = new Set(selectedKickIds.value); + if (selected.has(userId)) { + selected.delete(userId); + } else { + selected.add(userId); + } + selectedKickIds.value = Array.from(selected); + } + async function saveGroupAdmins() { + if (!activeConversation.value?.target || groupBusy.value) { + return; + } + groupBusy.value = true; + try { + await _services_imClient__WEBPACK_IMPORTED_MODULE_13__/* .imClient */ .wD.setGroupAdmins(session.userId, activeConversation.value.target, selectedAdminIds.value); + groupMembers.value = groupMembers.value.map(member => { + if (member.role === 'owner') { + return member; + } + return { + ...member, + role: selectedAdminIds.value.includes(member.uid) ? 'admin' : 'member' + }; + }); + conversations.setActionNotice('管理员已更新'); + } catch (error) { + conversations.setActionError(error.message || '管理员设置失败'); + } finally { + groupBusy.value = false; + } + } + async function saveGroupProfile() { + if (!activeConversation.value?.target || groupBusy.value) { + return; + } + groupBusy.value = true; + try { + const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_13__/* .imClient */ .wD.updateGroupProfile(session.userId, activeConversation.value.target, profileDraft.value); + groupDetail.value = { + ...(groupDetail.value || {}), + name: result.name, + announcement: result.announcement, + welcomeText: result.welcomeText + }; + conversations.upsertConversation({ + ...activeConversation.value, + title: result.name, + avatarText: String(result.name || '?').slice(0, 1).toUpperCase(), + updatedAt: Number(result.updatedAt || Date.now()) + }); + conversations.setActionNotice('群资料已保存'); + } catch (error) { + conversations.setActionError(error.message || '群资料保存失败'); + } finally { + groupBusy.value = false; + } + } + async function kickSelectedMembers() { + if (!selectedKickIds.value.length || groupBusy.value) { + return; + } + if (!window.confirm('确认将所选成员移出群组?')) { + return; + } + groupBusy.value = true; + try { + const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_13__/* .imClient */ .wD.kickGroupMembers(session.userId, activeConversation.value.target, selectedKickIds.value); + const removed = new Set(result.removedIds || selectedKickIds.value); + groupMembers.value = groupMembers.value.filter(member => !removed.has(member.uid)); + selectedKickIds.value = []; + conversations.setActionNotice('已移出群组'); + } catch (error) { + conversations.setActionError(error.message || '踢人失败'); + } finally { + groupBusy.value = false; + } + } + async function saveMuteSetting() { + if (!activeConversation.value?.target || groupBusy.value) { + return; + } + clearMuteSaveFeedback(); + groupBusy.value = true; + try { + const setting = await _services_imClient__WEBPACK_IMPORTED_MODULE_13__/* .imClient */ .wD.updateGroupMuteSetting(session.userId, activeConversation.value.target, { + mode: muteDraft.value.mode, + scheduleType: muteDraft.value.scheduleType, + startsAtMs: localInputToMs(muteDraft.value.startsAtLocal), + endsAtMs: localInputToMs(muteDraft.value.endsAtLocal), + dailyStart: muteDraft.value.dailyStart, + dailyEnd: muteDraft.value.dailyEnd + }); + groupDetail.value = { + ...(groupDetail.value || {}), + muteSetting: setting + }; + muteSaveNotice.value = '禁言设置已保存'; + } catch (error) { + muteSaveError.value = error.message || '禁言设置保存失败'; + } finally { + groupBusy.value = false; + } + } + async function leaveCurrentGroup() { + if (!activeConversation.value || groupBusy.value) { + return; + } + if (!window.confirm('确认退出该群组?')) { + return; + } + groupBusy.value = true; + const ok = await conversations.leaveGroup(activeConversation.value); + groupBusy.value = false; + if (ok) { + closeGroupPanel(); + } + } + async function dismissCurrentGroup() { + if (!activeConversation.value || groupBusy.value) { + return; + } + if (!window.confirm('确认解散该群组?所有成员都将不可继续使用该群。')) { + return; + } + groupBusy.value = true; + const ok = await conversations.dismissGroup(activeConversation.value); + groupBusy.value = false; + if (ok) { + closeGroupPanel(); + } + } + async function transferCurrentGroup() { + if (!activeConversation.value?.target || !transferTargetId.value || groupBusy.value) { + return; + } + if (!window.confirm('确认将群主转让给该成员?')) { + return; + } + groupBusy.value = true; + try { + await _services_imClient__WEBPACK_IMPORTED_MODULE_13__/* .imClient */ .wD.transferGroup(session.userId, activeConversation.value.target, transferTargetId.value); + groupDetail.value = { + ...(groupDetail.value || {}), + myRole: 'member' + }; + activeConversation.value.role = 'member'; + if (activeConversation.value.raw) { + activeConversation.value.raw.role = 'member'; + } + conversations.setActionNotice('群组已转让'); + closeGroupPanel(); + conversations.refreshRemoteConversations(); + } catch (error) { + conversations.setActionError(error.message || '转让群组失败'); + } finally { + groupBusy.value = false; + } + } + function memberAvatar(member) { + return String(member.displayName || member.uid || '?').slice(0, 1).toUpperCase(); + } + document.addEventListener('click', closeGroupMenu); + (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .onBeforeUnmount */ .xo)(() => { + document.removeEventListener('click', closeGroupMenu); + }); + (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .watch */ .wB)(() => activeConversation.value?.id, () => { + closeGroupMenu(); + closeSingleProfile(); + closeGroupPanel(); + groupDetail.value = null; + groupMembers.value = []; + groupAliasDraft.value = ''; + selectedAdminIds.value = []; + selectedKickIds.value = []; + transferTargetId.value = ''; + manageSection.value = ''; + }); + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("section", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [isGroupConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("button", { + key: 0, + type: "button", + class: "chat-title-button", + onClick: openGroupOverview + }, [activeConversation.value?.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "chat-title-avatar image-avatar", + src: activeConversation.value.portrait, + alt: "" + }, null, 8, _hoisted_3)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_4, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(activeConversation.value?.avatarText || '?'), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h2", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(activeConversation.value?.title || '未选择会话'), 1)])])) : activeConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("button", { + key: 1, + type: "button", + class: "chat-title-button", + onClick: openSingleProfile + }, [singleProfile.value.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "chat-title-avatar image-avatar", + src: singleProfile.value.portrait, + alt: "" + }, null, 8, _hoisted_6)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_7, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(singleProfile.value.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h2", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(activeConversation.value?.title || '未选择会话'), 1)])])) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("h2", _hoisted_9, "未选择会话")), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(statusText.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", _hoisted_10, [_cache[29] || (_cache[29] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + class: "icon-button", + title: "搜索" + }, "⌕", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + class: "icon-button", + title: "更多", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_20__/* .withModifiers */ .D$)(toggleGroupMenu, ["stop"]) + }, "⋯"), groupMenuOpen.value && isGroupConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: 0, + class: "quick-action-menu chat-more-menu", + onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_20__/* .withModifiers */ .D$)(() => {}, ["stop"])) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: openGroupMembers + }, "查看群员"), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: openGroupAlias + }, "我在本群的昵称"), canManageGroup.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("button", { + key: 0, + type: "button", + onClick: openGroupManage + }, "群组管理")) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)])]), !activeConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_11, _cache[30] || (_cache[30] = [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, "选择一个会话", -1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "真实会话同步完成后,可以在左侧打开聊天", -1)]))) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createBlock */ .Wv)(_MessageList_vue__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .A, { + key: 1, + messages: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).activeMessages, + "selection-mode": (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).selectionMode, + "selected-message-ids": (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).selectedMessageIds, + "favorite-message-ids": (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).favoriteMessageIds, + "attention-message-id": (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).attentionMessageId, + "can-recall-others": canManageGroup.value && isGroupConversation.value, + onMessageAction: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).handleMessageAction, + onToggleSelect: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).toggleSelectedMessage, + onSenderProfileUpdated: handleSenderProfileUpdated + }, null, 8, ["messages", "selection-mode", "selected-message-ids", "favorite-message-ids", "attention-message-id", "can-recall-others", "onMessageAction", "onToggleSelect"])), (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).selectionMode ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "已选 " + (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).selectedMessageIds.length) + " 条", 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: _cache[1] || (_cache[1] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).copySelectedMessages && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).copySelectedMessages(...args)) + }, "复制"), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: _cache[2] || (_cache[2] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).deleteSelectedMessages && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).deleteSelectedMessages(...args)) + }, "删除"), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: _cache[3] || (_cache[3] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).startForwardSelectedMessages && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).startForwardSelectedMessages(...args)) + }, "转发"), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: _cache[4] || (_cache[4] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).clearSelection && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).clearSelection(...args)) + }, "取消")])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createVNode */ .bF)(_MessageComposer_vue__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .A, { + disabled: !activeConversation.value || !(0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(session).isAuthenticated || !(0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).canSendActiveConversation, + "quote-message": (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).quotedMessage, + onCancelQuote: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelQuote, + onSend: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).sendText, + onSendAttachment: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).sendAttachment + }, null, 8, ["disabled", "quote-message", "onCancelQuote", "onSend", "onSendAttachment"]), (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).forwardingMessages.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: 3, + class: "modal-backdrop", + onClick: _cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_20__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelForward && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelForward(...args), ["self"])) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("section", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[31] || (_cache[31] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h3", null, "转发给", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: _cache[5] || (_cache[5] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelForward && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelForward(...args)) + }, "×")]), ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .renderList */ .pI)((0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).conversations, item => { + return (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("button", { + key: item.id, + type: "button", + class: "forward-target", + onClick: $event => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).completeForward(item.id) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", _hoisted_15, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(item.avatarText), 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(item.title), 1)], 8, _hoisted_14); + }), 128))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).editingMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: 4, + class: "modal-backdrop", + onClick: _cache[11] || (_cache[11] = (0,vue__WEBPACK_IMPORTED_MODULE_20__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelEditMessage(...args), ["self"])) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("form", { + class: "edit-dialog", + onSubmit: _cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_20__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).completeEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).completeEditMessage(...args), ["prevent"])) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h3", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).editingMode === 'resend' ? '重新编辑' : '编辑消息'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: _cache[7] || (_cache[7] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelEditMessage(...args)) + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("textarea", { + "onUpdate:modelValue": _cache[8] || (_cache[8] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).editingText = $event), + maxlength: "5000", + rows: "5", + autofocus: "" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelText */ .Jo, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).editingText]]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: _cache[9] || (_cache[9] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).cancelEditMessage(...args)) + }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).editingMode === 'resend' ? '发送' : '保存'), 1)])], 32)])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).messageDetailOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: 5, + class: "modal-backdrop", + onClick: _cache[13] || (_cache[13] = (0,vue__WEBPACK_IMPORTED_MODULE_20__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).closeMessageDetail && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).closeMessageDetail(...args), ["self"])) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("section", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[32] || (_cache[32] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h3", null, "消息详情", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: _cache[12] || (_cache[12] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).closeMessageDetail && (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).closeMessageDetail(...args)) + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).messageDetailLoading ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_18, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, { + key: 1 + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dl", _hoisted_19, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[33] || (_cache[33] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "发送时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(formatDetailTime(messageDetail.value?.sentAt)), 1)]), messageDetail.value?.editedAt ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_20, [_cache[34] || (_cache[34] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "编辑时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(formatDetailTime(messageDetail.value.editedAt)), 1)])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[35] || (_cache[35] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "发送人", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailMemberName(messageDetail.value?.sender)), 1)]), !isMessageDetailGroup.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, { + key: 1 + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[36] || (_cache[36] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "接收人", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailMemberName(messageDetail.value?.receiver)), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[37] || (_cache[37] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "送达时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .normalizeClass */ .C4)({ + 'message-detail-muted': !messageDetail.value?.deliveredAt + }) + }, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(messageDetail.value?.deliveredAt ? formatDetailTime(messageDetail.value.deliveredAt) : '未送达'), 3)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[38] || (_cache[38] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "已读时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .normalizeClass */ .C4)({ + 'message-detail-muted': !messageDetail.value?.readAt + }) + }, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(messageDetail.value?.readAt ? formatDetailTime(messageDetail.value.readAt) : '未读'), 3)])], 64)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).messageDetailError ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).messageDetailError), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), isMessageDetailGroup.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, { + key: 1 + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, [_cache[39] || (_cache[39] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createTextVNode */ .eW)("已读 ")), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(messageDetailCounts.value.read || 0), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, [_cache[40] || (_cache[40] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createTextVNode */ .eW)("未读 ")), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(messageDetailCounts.value.unread || 0), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, [_cache[41] || (_cache[41] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createTextVNode */ .eW)("未送达 ")), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(messageDetailCounts.value.undelivered || 0), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, [_cache[42] || (_cache[42] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createTextVNode */ .eW)("成员 ")), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(messageDetailCounts.value.total || 0), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", _hoisted_23, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("section", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[43] || (_cache[43] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, "已读", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(messageDetailCounts.value.read || 0) + " 人", 1)]), messageDetailGroup.value?.read?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_25, [((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .renderList */ .pI)(messageDetailGroup.value.read, member => { + return (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: `read-${member.uid}`, + class: "message-detail-member-row" + }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "conversation-avatar image-avatar", + src: member.portrait, + alt: "" + }, null, 8, _hoisted_26)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_27, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailMemberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", _hoisted_28, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailMemberName(member)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.uid), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", _hoisted_29, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(formatDetailTime(member.time)), 1), detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_30, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailRoleLabel(member.role)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)]); + }), 128))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_31, "暂无已读成员"))]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("section", _hoisted_32, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[44] || (_cache[44] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, "未读", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(messageDetailCounts.value.unread || 0) + " 人", 1)]), messageDetailGroup.value?.unread?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_33, [((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .renderList */ .pI)(messageDetailGroup.value.unread, member => { + return (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: `unread-${member.uid}`, + class: "message-detail-member-row" + }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "conversation-avatar image-avatar", + src: member.portrait, + alt: "" + }, null, 8, _hoisted_34)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_35, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailMemberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", _hoisted_36, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailMemberName(member)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.uid), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", _hoisted_37, "送达 " + (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(formatDetailTime(member.time)), 1), detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_38, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailRoleLabel(member.role)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)]); + }), 128))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_39, "暂无未读成员"))]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("section", _hoisted_40, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[45] || (_cache[45] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, "未送达", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(messageDetailCounts.value.undelivered || 0) + " 人", 1)]), messageDetailGroup.value?.undelivered?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_41, [((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .renderList */ .pI)(messageDetailGroup.value.undelivered, member => { + return (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: `undelivered-${member.uid}`, + class: "message-detail-member-row" + }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "conversation-avatar image-avatar", + src: member.portrait, + alt: "" + }, null, 8, _hoisted_42)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_43, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailMemberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", _hoisted_44, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailMemberName(member)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.uid), 1)]), _cache[46] || (_cache[46] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", { + class: "message-detail-member-time message-detail-muted" + }, "未送达", -1)), detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_45, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(detailRoleLabel(member.role)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)]); + }), 128))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_46, "暂无未送达成员"))])])], 64)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)], 64))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), singleProfileOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: 6, + class: "modal-backdrop", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_20__/* .withModifiers */ .D$)(closeSingleProfile, ["self"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("section", _hoisted_47, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[47] || (_cache[47] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h3", null, "联系人资料", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeSingleProfile + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", _hoisted_48, [singleProfile.value.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "profile-avatar image-avatar", + src: singleProfile.value.portrait, + alt: "" + }, null, 8, _hoisted_49)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_50, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(singleProfile.value.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(singleProfile.value.displayName), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dl", _hoisted_51, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[48] || (_cache[48] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "用户ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(singleProfile.value.uid || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[49] || (_cache[49] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(singleProfile.value.rawName || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[50] || (_cache[50] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(singleProfile.value.mobile || '未知'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[51] || (_cache[51] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "地区", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(singleProfile.value.address || '未知'), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[52] || (_cache[52] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "备注名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[14] || (_cache[14] = $event => singleAliasDraft.value = $event), + maxlength: "32", + autocomplete: "off", + placeholder: "留空使用对方昵称" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelText */ .Jo, singleAliasDraft.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("footer", _hoisted_52, [singleProfileNotice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_53, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(singleProfileNotice.value), 1)) : singleProfileError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_54, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(singleProfileError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "ghost-inline-action", + disabled: singleProfileSaving.value, + onClick: closeSingleProfile + }, "取消", 8, _hoisted_55), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "primary-inline-action", + disabled: singleProfileSaving.value || !singleProfile.value.uid, + onClick: saveSingleAlias + }, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(singleProfileSaving.value ? '保存中...' : '保存备注'), 9, _hoisted_56)])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), groupPanel.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: 7, + class: "modal-backdrop", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_20__/* .withModifiers */ .D$)(closeGroupPanel, ["self"]) + }, [groupPanel.value === 'overview' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("section", _hoisted_57, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[53] || (_cache[53] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h3", null, "群概况", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeGroupPanel + }, "×")]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_58, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("dl", _hoisted_59, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[54] || (_cache[54] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "群名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(groupDetail.value?.name || activeConversation.value?.title || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[55] || (_cache[55] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "群ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(groupDetail.value?.groupId || activeConversation.value?.target || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[56] || (_cache[56] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "群说明", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(groupDetail.value?.announcement || '未设置'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", null, [_cache[57] || (_cache[57] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dt", null, "群主昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(groupDetail.value?.ownerName || '-'), 1)])])), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("footer", null, [isGroupOwner.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, { + key: 0 + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "danger-inline-action", + disabled: groupBusy.value, + onClick: dismissCurrentGroup + }, "解散群组", 8, _hoisted_60), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "primary-inline-action", + disabled: groupBusy.value, + onClick: openTransferGroup + }, "转让群组", 8, _hoisted_61)], 64)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("button", { + key: 1, + type: "button", + class: "danger-inline-action", + disabled: groupBusy.value, + onClick: leaveCurrentGroup + }, "退出群组", 8, _hoisted_62))])])) : groupPanel.value === 'members' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("section", _hoisted_63, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[58] || (_cache[58] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h3", null, "群员", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeGroupPanel + }, "×")]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_64, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_65, [((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .renderList */ .pI)(groupMembers.value, member => { + return (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: member.uid, + class: "group-member-row" + }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "conversation-avatar image-avatar", + src: member.portrait, + alt: "" + }, null, 8, _hoisted_66)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_67, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.role === 'owner' ? '群主' : member.rawDisplayName), 1)])]); + }), 128)), !groupMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_68, "暂无群员")) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)]))])) : groupPanel.value === 'alias' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("form", { + key: 2, + class: "group-dialog", + onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_20__/* .withModifiers */ .D$)(saveGroupAlias, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[59] || (_cache[59] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h3", null, "我在本群的昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeGroupPanel + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[60] || (_cache[60] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[15] || (_cache[15] = $event => groupAliasDraft.value = $event), + maxlength: "64", + autocomplete: "off", + placeholder: "留空使用个人昵称" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelText */ .Jo, groupAliasDraft.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "ghost-inline-action", + onClick: closeGroupPanel + }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + class: "primary-inline-action", + disabled: groupBusy.value + }, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(groupBusy.value ? '保存中...' : '保存'), 9, _hoisted_69)])], 32)) : groupPanel.value === 'transfer' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("section", _hoisted_70, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[61] || (_cache[61] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h3", null, "转让群组", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeGroupPanel + }, "×")]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_71, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_72, [((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .renderList */ .pI)(transferableMembers.value, member => { + return (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("button", { + key: member.uid, + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .normalizeClass */ .C4)(["group-member-row selectable", { + selected: transferTargetId.value === member.uid + }]), + onClick: $event => transferTargetId.value = member.uid + }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "conversation-avatar image-avatar", + src: member.portrait, + alt: "" + }, null, 8, _hoisted_74)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_75, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.rawDisplayName), 1)])], 10, _hoisted_73); + }), 128)), !transferableMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_76, "暂无可转让成员")) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)])), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "ghost-inline-action", + onClick: closeGroupPanel + }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "primary-inline-action", + disabled: groupBusy.value || !transferTargetId.value, + onClick: transferCurrentGroup + }, "确认转让", 8, _hoisted_77)])])) : groupPanel.value === 'manage' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("section", _hoisted_78, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("header", null, [_cache[62] || (_cache[62] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("h3", null, "群组管理", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeGroupPanel + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("nav", _hoisted_79, [isGroupOwner.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("button", { + key: 0, + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .normalizeClass */ .C4)({ + active: manageSection.value === 'admins' + }), + onClick: _cache[16] || (_cache[16] = $event => manageSection.value = 'admins') + }, "管理员设置", 2)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .normalizeClass */ .C4)({ + active: manageSection.value === 'profile' + }), + onClick: _cache[17] || (_cache[17] = $event => manageSection.value = 'profile') + }, "修改群资料", 2), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .normalizeClass */ .C4)({ + active: manageSection.value === 'kick' + }), + onClick: _cache[18] || (_cache[18] = $event => manageSection.value = 'kick') + }, "踢人", 2), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .normalizeClass */ .C4)({ + active: manageSection.value === 'mute' + }), + onClick: _cache[19] || (_cache[19] = $event => manageSection.value = 'mute') + }, "禁言设置", 2)]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_80, "正在加载")) : manageSection.value === 'admins' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("section", _hoisted_81, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", _hoisted_82, [((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .renderList */ .pI)(adminCandidateMembers.value, member => { + return (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("label", { + key: member.uid, + class: "group-member-row selectable with-check" + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("input", { + type: "checkbox", + checked: selectedAdminIds.value.includes(member.uid), + onChange: $event => toggleAdmin(member.uid) + }, null, 40, _hoisted_83), member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "conversation-avatar image-avatar", + src: member.portrait, + alt: "" + }, null, 8, _hoisted_84)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_85, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.rawDisplayName), 1)])]); + }), 128)), !adminCandidateMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_86, "暂无可设置成员")) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "primary-inline-action", + onClick: saveGroupAdmins + }, "保存管理员")])])) : manageSection.value === 'profile' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("section", _hoisted_87, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[63] || (_cache[63] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "群名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[20] || (_cache[20] = $event => profileDraft.value.name = $event), + maxlength: "128", + autocomplete: "off" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelText */ .Jo, profileDraft.value.name, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[64] || (_cache[64] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "群说明", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("textarea", { + "onUpdate:modelValue": _cache[21] || (_cache[21] = $event => profileDraft.value.announcement = $event), + maxlength: "1000", + rows: "3" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelText */ .Jo, profileDraft.value.announcement, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[65] || (_cache[65] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "欢迎词", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("textarea", { + "onUpdate:modelValue": _cache[22] || (_cache[22] = $event => profileDraft.value.welcomeText = $event), + maxlength: "1000", + rows: "3" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelText */ .Jo, profileDraft.value.welcomeText, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "primary-inline-action", + onClick: saveGroupProfile + }, "保存资料")])])) : manageSection.value === 'kick' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("section", _hoisted_88, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("div", _hoisted_89, [((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_17__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .renderList */ .pI)(kickCandidateMembers.value, member => { + return (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("label", { + key: member.uid, + class: "group-member-row selectable with-check" + }, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("input", { + type: "checkbox", + checked: selectedKickIds.value.includes(member.uid), + onChange: $event => toggleKick(member.uid) + }, null, 40, _hoisted_90), member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "conversation-avatar image-avatar", + src: member.portrait, + alt: "" + }, null, 8, _hoisted_91)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_92, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(member.role === 'admin' ? '管理员' : member.rawDisplayName), 1)])]); + }), 128)), !kickCandidateMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_93, "暂无可移除成员")) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "danger-inline-action", + disabled: !selectedKickIds.value.length, + onClick: kickSelectedMembers + }, "移出群组", 8, _hoisted_94)])])) : manageSection.value === 'mute' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("section", _hoisted_95, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[67] || (_cache[67] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "禁言模式", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("select", { + "onUpdate:modelValue": _cache[23] || (_cache[23] = $event => muteDraft.value.mode = $event), + onChange: clearMuteSaveFeedback + }, _cache[66] || (_cache[66] = [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("option", { + value: "off" + }, "关闭禁言", -1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("option", { + value: "all_include_admins" + }, "全体禁言包含管理员", -1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("option", { + value: "all_except_admins" + }, "除管理员外全体禁言", -1)]), 544), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelSelect */ .u1, muteDraft.value.mode]])]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[69] || (_cache[69] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "时段类型", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("select", { + "onUpdate:modelValue": _cache[24] || (_cache[24] = $event => muteDraft.value.scheduleType = $event), + onChange: clearMuteSaveFeedback + }, _cache[68] || (_cache[68] = [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("option", { + value: "manual" + }, "立即禁言直到管理解除", -1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("option", { + value: "once" + }, "单次", -1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("option", { + value: "daily" + }, "每天固定时段", -1)]), 544), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelSelect */ .u1, muteDraft.value.scheduleType]])]), muteDraft.value.mode !== 'off' && muteDraft.value.scheduleType === 'once' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_96, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[70] || (_cache[70] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "开始", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[25] || (_cache[25] = $event => muteDraft.value.startsAtLocal = $event), + type: "datetime-local", + onInput: clearMuteSaveFeedback + }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelText */ .Jo, muteDraft.value.startsAtLocal]])]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[71] || (_cache[71] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "结束", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[26] || (_cache[26] = $event => muteDraft.value.endsAtLocal = $event), + type: "datetime-local", + onInput: clearMuteSaveFeedback + }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelText */ .Jo, muteDraft.value.endsAtLocal]])])])) : muteDraft.value.mode !== 'off' && muteDraft.value.scheduleType === 'daily' ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_97, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[72] || (_cache[72] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "开始", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[27] || (_cache[27] = $event => muteDraft.value.dailyStart = $event), + type: "time", + onInput: clearMuteSaveFeedback + }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelText */ .Jo, muteDraft.value.dailyStart]])]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("label", null, [_cache[73] || (_cache[73] = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "结束", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[28] || (_cache[28] = $event => muteDraft.value.dailyEnd = $event), + type: "time", + onInput: clearMuteSaveFeedback + }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_20__/* .vModelText */ .Jo, muteDraft.value.dailyEnd]])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("footer", _hoisted_98, [muteSaveNotice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_99, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(muteSaveNotice.value), 1)) : muteSaveError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_100, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(muteSaveError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "primary-inline-action", + disabled: groupBusy.value, + onClick: saveMuteSetting + }, "保存禁言", 8, _hoisted_101)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).actionNotice || (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).actionError ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", { + key: 8, + class: (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .normalizeClass */ .C4)(["chat-toast", { + error: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).actionError + }]) + }, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).actionError || (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).actionNotice), 3)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)]); + }; + } +}); + +/***/ }), + +/***/ 1648: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3741); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(680); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(793); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(4546); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1857); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7987); + + + + + +const _hoisted_1 = { + key: 0, + class: "quote-preview" +}; +const _hoisted_2 = { + class: "composer-tools" +}; +const _hoisted_3 = ["disabled"]; +const _hoisted_4 = ["disabled"]; +const _hoisted_5 = ["disabled"]; +const _hoisted_6 = ["onClick"]; +const _hoisted_7 = ["disabled", "onKeydown"]; +const _hoisted_8 = { + class: "composer-footer" +}; +const _hoisted_9 = ["disabled"]; + +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'MessageComposer', + props: { + disabled: { + type: Boolean, + default: false + }, + quoteMessage: { + type: Object, + default: null + } + }, + emits: ['send', 'send-attachment', 'cancel-quote'], + setup(__props, { + emit: __emit + }) { + const props = __props; + const emit = __emit; + const text = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .ref */ .KR)(''); + const emojiOpen = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .ref */ .KR)(false); + const dropActive = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .ref */ .KR)(false); + const textareaEl = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .ref */ .KR)(null); + const imageInput = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .ref */ .KR)(null); + const fileInput = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .ref */ .KR)(null); + let dragDepth = 0; + const emojiList = ['😀', '😄', '😂', '😊', '😍', '😘', '😎', '😢', '😡', '👍', '🙏', '👏', '💪', '🎉', '❤️', '🔥', '🌹', '☕', '✅', '⭐', '💰', '🎁', '🤝', '👌']; + function submit() { + const value = text.value.trim(); + if (!value) { + return; + } + emit('send', value); + text.value = ''; + emojiOpen.value = false; + } + function toggleEmojiPicker() { + emojiOpen.value = !emojiOpen.value; + } + function insertEmoji(emoji) { + const element = textareaEl.value; + if (!element) { + text.value += emoji; + return; + } + const start = element.selectionStart ?? text.value.length; + const end = element.selectionEnd ?? text.value.length; + text.value = `${text.value.slice(0, start)}${emoji}${text.value.slice(end)}`; + requestAnimationFrame(() => { + element.focus(); + const cursor = start + emoji.length; + element.setSelectionRange(cursor, cursor); + }); + } + function chooseImage() { + imageInput.value?.click(); + } + function chooseFile() { + fileInput.value?.click(); + } + function attachmentTypeForFile(file, fallbackType = 'file') { + if (file?.type?.startsWith('image/')) { + return 'image'; + } + return fallbackType === 'image' ? 'image' : 'file'; + } + function emitFiles(files, fallbackType = 'file') { + if (props.disabled) { + return; + } + const validFiles = Array.from(files || []).filter(file => file instanceof File && file.size > 0); + if (!validFiles.length) { + return; + } + const caption = text.value.trim(); + validFiles.forEach((file, index) => { + emit('send-attachment', { + type: attachmentTypeForFile(file, fallbackType), + file, + text: index === 0 ? caption : '' + }); + }); + text.value = ''; + emojiOpen.value = false; + } + function selectAttachment(event, type) { + const input = event.target; + const files = input.files ? Array.from(input.files) : []; + input.value = ''; + if (!files.length || props.disabled) { + return; + } + emitFiles(files, type); + } + function hasDraggedFiles(event) { + const types = Array.from(event.dataTransfer?.types || []); + return types.includes('Files'); + } + function handleDragEnter(event) { + if (props.disabled || !hasDraggedFiles(event)) { + return; + } + dragDepth += 1; + dropActive.value = true; + event.dataTransfer.dropEffect = 'copy'; + } + function handleDragOver(event) { + if (props.disabled || !hasDraggedFiles(event)) { + return; + } + dropActive.value = true; + event.dataTransfer.dropEffect = 'copy'; + } + function handleDragLeave() { + dragDepth = Math.max(0, dragDepth - 1); + if (dragDepth === 0) { + dropActive.value = false; + } + } + function filesFromDataTransfer(dataTransfer) { + const items = Array.from(dataTransfer?.items || []); + const files = items.filter(item => item.kind === 'file' && !item.webkitGetAsEntry?.()?.isDirectory).map(item => item.getAsFile()).filter(Boolean); + if (files.length) { + return files; + } + return Array.from(dataTransfer?.files || []); + } + function handleDrop(event) { + dragDepth = 0; + dropActive.value = false; + if (props.disabled) { + return; + } + emitFiles(filesFromDataTransfer(event.dataTransfer)); + } + function imageFilesFromClipboard(clipboardData) { + return Array.from(clipboardData?.items || []).filter(item => item.kind === 'file' && item.type.startsWith('image/')).map(item => item.getAsFile()).filter(Boolean); + } + function handlePaste(event) { + if (props.disabled) { + return; + } + const imageFiles = imageFilesFromClipboard(event.clipboardData); + if (!imageFiles.length) { + return; + } + event.preventDefault(); + emitFiles(imageFiles, 'image'); + } + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementBlock */ .CE)("form", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .normalizeClass */ .C4)(["message-composer", { + 'drop-active': dropActive.value + }]), + onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withModifiers */ .D$)(submit, ["prevent"]), + onDragenter: (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withModifiers */ .D$)(handleDragEnter, ["prevent"]), + onDragover: (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withModifiers */ .D$)(handleDragOver, ["prevent"]), + onDragleave: (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withModifiers */ .D$)(handleDragLeave, ["prevent"]), + onDrop: (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withModifiers */ .D$)(handleDrop, ["prevent"]), + onPaste: handlePaste + }, [__props.quoteMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_5__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementBlock */ .CE)("div", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("span", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("strong", null, "引用", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createTextVNode */ .eW)(" " + (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(__props.quoteMessage.quoteText || __props.quoteMessage.text), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "取消引用", + onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('cancel-quote')) + }, "×")])) : (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("div", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "表情", + disabled: __props.disabled, + onClick: toggleEmojiPicker + }, "☺", 8, _hoisted_3), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "图片", + disabled: __props.disabled, + onClick: chooseImage + }, "▧", 8, _hoisted_4), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "文件", + disabled: __props.disabled, + onClick: chooseFile + }, "▤", 8, _hoisted_5), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("input", { + ref_key: "imageInput", + ref: imageInput, + type: "file", + accept: "image/*", + multiple: "", + onChange: _cache[1] || (_cache[1] = $event => selectAttachment($event, 'image')) + }, null, 544), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("input", { + ref_key: "fileInput", + ref: fileInput, + type: "file", + multiple: "", + onChange: _cache[2] || (_cache[2] = $event => selectAttachment($event, 'file')) + }, null, 544), emojiOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_5__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementBlock */ .CE)("div", { + key: 0, + class: "emoji-picker", + onClick: _cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withModifiers */ .D$)(() => {}, ["stop"])) + }, [((0,vue__WEBPACK_IMPORTED_MODULE_5__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_5__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .renderList */ .pI)(emojiList, emoji => { + return (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("button", { + key: emoji, + type: "button", + onClick: $event => insertEmoji(emoji) + }, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(emoji), 9, _hoisted_6); + }), 64))])) : (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("textarea", { + ref_key: "textareaEl", + ref: textareaEl, + "onUpdate:modelValue": _cache[4] || (_cache[4] = $event => text.value = $event), + disabled: __props.disabled, + placeholder: "输入消息", + rows: "3", + onKeydown: (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withKeys */ .jR)((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withModifiers */ .D$)(submit, ["exact", "prevent"]), ["enter"]) + }, null, 40, _hoisted_7), [[vue__WEBPACK_IMPORTED_MODULE_7__/* .vModelText */ .Jo, text.value]]), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("div", _hoisted_8, [_cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("span", null, "Enter 发送,Shift + Enter 换行", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .createElementVNode */ .Lk)("button", { + class: "send-button", + disabled: __props.disabled || !text.value.trim() + }, "发送", 8, _hoisted_9)])], 34); + }; + } +}); + +/***/ }), + +/***/ 1920: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _NavigationRail_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5399); + + + +const __exports__ = _NavigationRail_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 2122: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FavoriteList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FavoriteList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5326); + + +/***/ }), + +/***/ 2390: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _MessageComposer_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6804); + + + +const __exports__ = _MessageComposer_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 2534: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7987); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(4187); +/* harmony import */ var _components_LoginView_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6942); +/* harmony import */ var _components_ChatShell_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4834); +/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(3842); + + + + + + +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'App', + setup(__props) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_2__/* .useSessionStore */ .B)(); + const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_3__/* .useConversationStore */ .w)(); + (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .onMounted */ .sV)(() => { + session.restore(); + }); + (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .watch */ .wB)(() => session.userId, userId => { + if (userId && session.isAuthenticated) { + conversations.bootstrapDemoData(); + return; + } + conversations.clearUserState(); + }); + return (_ctx, _cache) => { + return !(0,vue__WEBPACK_IMPORTED_MODULE_5__/* .unref */ .R1)(session).isAuthenticated ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createBlock */ .Wv)(_components_LoginView_vue__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A, { + key: 0 + })) : ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createBlock */ .Wv)(_components_ChatShell_vue__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, { + key: 1 + })); + }; + } +}); + +/***/ }), + +/***/ 2699: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _ContactList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(901); + + + +const __exports__ = _ContactList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 2857: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_ChatPanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_ChatPanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1509); + + +/***/ }), + +/***/ 3063: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ Y: function() { return /* binding */ HttpImClient; } +/* harmony export */ }); +/* unused harmony export imClient */ +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5513); +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3741); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4912); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(680); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(793); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(6071); +/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(8438); +/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(6768); +/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(2409); +/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(9488); +/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(6591); +/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(5412); +/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(9214); +/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_13__); +/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(9130); +/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_14__); +/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(8937); +/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_15__); +/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(8636); +/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_16__); +/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(4062); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(9397); + + + + + + + + + + + + + + + + + + + +const LOCAL_MESSAGE_STORAGE_KEY = 'qmt-web-im-local-messages-v2'; +const LOCAL_HIDDEN_MESSAGE_STORAGE_KEY = 'qmt-web-im-hidden-messages-v1'; +const LOCAL_RECALLED_MESSAGE_STORAGE_KEY = 'qmt-web-im-recalled-messages-v1'; +function scopedStorageKey(baseKey, userId = '') { + const scope = `${_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.appServer || ''}:${userId || 'anonymous'}`; + return `${baseKey}:${encodeURIComponent(scope)}`; +} +function randomId() { + if (window.crypto && window.crypto.randomUUID) { + return window.crypto.randomUUID().replaceAll('-', ''); + } + return `${Date.now()}${Math.random().toString(16).slice(2)}`; +} +function readLocalMessages(userId) { + try { + return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId)) || '{}'); + } catch (error) { + return {}; + } +} +function readMessageSet(storageKey, userId) { + try { + return JSON.parse(localStorage.getItem(scopedStorageKey(storageKey, userId)) || '{}'); + } catch (error) { + return {}; + } +} +function writeMessageSet(storageKey, messagesByConversation, userId) { + localStorage.setItem(scopedStorageKey(storageKey, userId), JSON.stringify(messagesByConversation)); +} +function messageKeys(message) { + return [message?.id, message?.messageUid].filter(Boolean).map(value => String(value)); +} +function hasStoredMessage(storageKey, conversationId, message, userId) { + const stored = readMessageSet(storageKey, userId); + const ids = new Set(stored[conversationId] || []); + return messageKeys(message).some(id => ids.has(id)); +} +function storeMessageKeys(storageKey, conversationId, messages, userId) { + const stored = readMessageSet(storageKey, userId); + const ids = new Set(stored[conversationId] || []); + messages.forEach(message => { + messageKeys(message).forEach(id => ids.add(id)); + }); + stored[conversationId] = Array.from(ids); + writeMessageSet(storageKey, stored, userId); +} +function withRecalledState(message) { + return { + ...message, + status: 'recalled', + deliveryStatus: '', + recalled: true, + recallStatus: '已撤回' + }; +} +function applyLocalMessageState(conversationId, messages, userId) { + return messages.filter(message => !hasStoredMessage(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversationId, message, userId)).map(message => { + const isRecalled = Boolean(message.recalled) || message.status === 'recalled' || hasStoredMessage(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversationId, message, userId); + if (!isRecalled) { + return message; + } + return withRecalledState(message); + }); +} +function writeLocalMessages(messagesByConversation, userId) { + localStorage.setItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId), JSON.stringify(messagesByConversation)); +} +function saveLocalMessage(message, userId) { + const messagesByConversation = readLocalMessages(userId); + messagesByConversation[message.conversationId] = messagesByConversation[message.conversationId] || []; + const index = messagesByConversation[message.conversationId].findIndex(item => item.id === message.id); + if (index >= 0) { + messagesByConversation[message.conversationId].splice(index, 1, message); + } else { + messagesByConversation[message.conversationId].push(message); + } + writeLocalMessages(messagesByConversation, userId); +} +function mergeSyncedMessages(localMessages, remoteMessages, conversationId, userId) { + const visibleLocalMessages = applyLocalMessageState(conversationId, localMessages, userId); + const localByKey = new Map(); + visibleLocalMessages.forEach(message => { + messageKeys(message).forEach(key => { + if (!localByKey.has(key)) { + localByKey.set(key, message); + } + }); + }); + const visibleRemoteMessages = applyLocalMessageState(conversationId, remoteMessages, userId).map(remoteMessage => { + if (!remoteMessage.recalled || String(remoteMessage.text || '').trim()) { + return remoteMessage; + } + const localMessage = messageKeys(remoteMessage).map(key => localByKey.get(key)).find(message => message?.text && message.text !== '你撤回了一条消息'); + return localMessage ? { + ...remoteMessage, + text: localMessage.text + } : remoteMessage; + }); + const remoteKeys = new Set(); + visibleRemoteMessages.forEach(message => { + messageKeys(message).forEach(key => remoteKeys.add(key)); + }); + const now = Date.now(); + function hasRemoteMatch(localMessage) { + if (localMessage.messageUid && remoteKeys.has(localMessage.messageUid)) { + return true; + } + return visibleRemoteMessages.some(remoteMessage => { + return remoteMessage.direction === localMessage.direction && remoteMessage.text === localMessage.text && Math.abs(Number(remoteMessage.timestamp || 0) - Number(localMessage.timestamp || 0)) < 15000; + }); + } + const pendingLocalMessages = visibleLocalMessages.filter(message => { + if (message.status === 'recalled' || message.recalled) { + return message.direction === 'out' && !hasRemoteMatch(message); + } + if (message.direction !== 'out') { + return false; + } + if (message.status === 'sent' && message.messageUid) { + return !hasRemoteMatch(message); + } + if (message.status === 'sent') { + return !hasRemoteMatch(message) && now - Number(message.timestamp || 0) < 30000; + } + return message.status === 'sending' || message.status === 'failed'; + }); + return [...visibleRemoteMessages, ...pendingLocalMessages].sort((a, b) => { + return Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0); + }); +} +function getTitle(value, fallback) { + return value || fallback || ''; +} +function getUniqueEquipment(mobile, fallback) { + const allowedDevices = { + '18301902119': '67072d37062c4f31b1165073552933ba', + '18301902116': '1777479418113eeea8e236edce', + '18301902118': 'de89fb2f2a61480a8c381f6c16e28bd8', + '18301902117': 'd117f480faa64145b6162107b1b49617' + }; + return allowedDevices[mobile] || localStorage.getItem('uniqueEquipment') || fallback; +} +function canUseLocalLoginFallback(response) { + const message = response.data?.message || ''; + return false && 0; +} +class HttpImClient { + constructor() { + this.listeners = new Map(); + this.connected = false; + this.currentUser = null; + } + getClientId() { + let clientId = localStorage.getItem(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.clientIdStorageKey); + if (!clientId) { + clientId = randomId(); + localStorage.setItem(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.clientIdStorageKey, clientId); + } + return clientId; + } + restoreClientId(clientId) { + if (clientId) { + localStorage.setItem(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.clientIdStorageKey, clientId); + } + } + getSdkVersion() { + return 'HTTP'; + } + async ensureSdk() { + return true; + } + async loginWithPassword(mobile, password) { + const url = `${_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.appServer}/login_pwd`; + const deviceId = getUniqueEquipment(mobile, this.getClientId()); + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(url, { + mobile, + password, + platform: _config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.platform, + clientId: deviceId, + uniqueEquipment: deviceId + }, { + withCredentials: false + }); + this.persistAppToken(url, response); + if (response.data?.code !== 0) { + if (canUseLocalLoginFallback(response)) { + return { + userId: mobile, + token: `local-device-pending-${Date.now()}`, + displayName: mobile, + localOnly: true + }; + } + throw new Error(response.data?.message || '登录失败'); + } + return response.data.result; + } + async requestAuthCode(mobile) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(`${_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.appServer}/send_code`, { + mobile + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '验证码发送失败'); + } + return response.data.result; + } + async loginWithCode(mobile, code) { + const url = `${_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.appServer}/login`; + const deviceId = getUniqueEquipment(mobile, this.getClientId()); + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(url, { + mobile, + code, + platform: _config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.platform, + clientId: deviceId, + uniqueEquipment: deviceId + }, { + withCredentials: false + }); + this.persistAppToken(url, response); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '登录失败'); + } + return response.data.result; + } + async registerWithPhone(mobile, code) { + const url = `${_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.appServer}/register`; + const deviceId = getUniqueEquipment(mobile, this.getClientId()); + try { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(url, { + mobile, + code, + platform: _config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.platform, + clientId: deviceId, + uniqueEquipment: deviceId + }, { + withCredentials: false + }); + this.persistAppToken(url, response); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '注册失败'); + } + return response.data.result; + } catch (error) { + const status = error.response?.status; + if (status === 404 || status === 405) { + return this.loginWithCode(mobile, code); + } + throw error; + } + } + connect(userId, token) { + this.currentUser = { + userId, + token + }; + this.connected = true; + this.emit('connectionStatusChanged', { + connected: true, + statusText: '已连接' + }); + this.refreshConversationList(); + } + disconnect() { + this.connected = false; + this.currentUser = null; + this.emit('connectionStatusChanged', { + connected: false, + statusText: '未连接' + }); + } + getConversationList() { + return []; + } + refreshConversationList() { + const conversations = this.getConversationList(); + if (conversations.length) { + this.emit('conversationsChanged', conversations); + } + if (this.currentUser?.userId) { + this.fetchRemoteConversations().then(remoteConversations => { + this.emit('conversationsChanged', remoteConversations); + }).catch(() => {}); + } + return conversations; + } + async fetchRemoteConversations(limit = 50) { + if (!this.currentUser?.userId) { + return []; + } + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.messagesApi, { + userId: this.currentUser.userId, + limit + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '会话同步失败'); + } + return (response.data?.result?.conversations || []).map(conversation => ({ + ...conversation, + updatedAt: Number(conversation.updatedAt || Date.now()), + avatarText: conversation.avatarText || String(conversation.title || conversation.target || '?').slice(0, 1).toUpperCase(), + raw: conversation.raw || { + type: 'single', + target: conversation.target, + line: 0 + } + })); + } + getMessages(conversation) { + if (!conversation?.id) { + return []; + } + const userId = this.currentUser?.userId || ''; + return applyLocalMessageState(conversation.id, readLocalMessages(userId)[conversation.id] || [], userId); + } + async fetchRemoteMessages(conversation, limit = 50, options = {}) { + if (!conversation?.id || !this.currentUser?.userId) { + return []; + } + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.messagesApi, { + userId: this.currentUser.userId, + target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''), + limit, + conversationType: conversation.type || conversation.raw?.type || 0, + markRead: Boolean(options.markRead) + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '消息同步失败'); + } + const messages = (response.data?.result?.messages || []).map(message => ({ + ...message, + displayTimestamp: message.displayTimestamp || message.timestamp, + conversationId: conversation.id + })); + const userId = this.currentUser?.userId || ''; + const messagesByConversation = readLocalMessages(userId); + messagesByConversation[conversation.id] = mergeSyncedMessages(messagesByConversation[conversation.id] || [], messages, conversation.id, userId); + writeLocalMessages(messagesByConversation, userId); + return messagesByConversation[conversation.id]; + } + hideMessages(conversation, messages) { + const items = Array.isArray(messages) ? messages : [messages]; + if (!conversation?.id || !items.length) { + return; + } + const userId = this.currentUser?.userId || ''; + storeMessageKeys(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversation.id, items, userId); + const messagesByConversation = readLocalMessages(userId); + messagesByConversation[conversation.id] = applyLocalMessageState(conversation.id, messagesByConversation[conversation.id] || [], userId); + writeLocalMessages(messagesByConversation, userId); + } + markMessagesRecalled(conversation, messages) { + const items = Array.isArray(messages) ? messages : [messages]; + if (!conversation?.id || !items.length) { + return; + } + const userId = this.currentUser?.userId || ''; + storeMessageKeys(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversation.id, items, userId); + const messagesByConversation = readLocalMessages(userId); + messagesByConversation[conversation.id] = applyLocalMessageState(conversation.id, messagesByConversation[conversation.id] || [], userId); + writeLocalMessages(messagesByConversation, userId); + } + async recallMessage(conversation, message) { + const messageUid = String(message?.messageUid || message?.id || '').trim(); + if (!/^\d+$/.test(messageUid)) { + throw new Error('缺少可撤回的消息ID'); + } + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.messageActionApi, { + action: 'recall', + userId: this.currentUser?.userId || message.from || '', + messageUid + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '撤回失败'); + } + this.markMessagesRecalled(conversation, [message]); + return response.data.result; + } + async editMessage(conversation, message, text) { + const messageUid = String(message?.messageUid || message?.id || '').trim(); + if (!/^\d+$/.test(messageUid)) { + throw new Error('缺少可编辑的消息ID'); + } + const nextText = String(text || '').trim(); + if (!nextText) { + throw new Error('编辑内容不能为空'); + } + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.messageActionApi, { + action: 'edit', + userId: this.currentUser?.userId || message.from || '', + messageUid, + text: nextText + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '编辑失败'); + } + const result = response.data?.result?.message || {}; + const editedMessage = { + ...message, + text: result.text || nextText, + status: 'delivered', + deliveryStatus: 'delivered', + editedAt: Number(result.editedAt || Date.now()), + activityTimestamp: Number(result.editedAt || Date.now()) + }; + saveLocalMessage(editedMessage, this.currentUser?.userId || ''); + this.emit('messageStatusChanged', editedMessage); + return editedMessage; + } + async getMessageDetail(conversation, message) { + const messageUid = String(message?.messageUid || message?.id || '').trim(); + if (!messageUid) { + throw new Error('缺少消息ID'); + } + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.messageDetailApi, { + userId: this.currentUser?.userId || '', + target: conversation?.target || conversation?.raw?.target || conversation?.id?.replace(/^single-/, '') || '', + conversationType: conversation?.type || conversation?.raw?.type || 'single', + messageUid + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '消息详情加载失败'); + } + return response.data?.result?.detail || null; + } + async sendTextMessage(conversation, text, initialMessage = null) { + const senderRole = conversation?.role || conversation?.raw?.role || ''; + const message = initialMessage || { + id: randomId(), + conversationId: conversation.id, + from: this.currentUser?.userId || 'me', + senderRole, + direction: 'out', + type: 'text', + text, + status: 'sending', + deliveryStatus: 'sending', + timestamp: Date.now() + }; + saveLocalMessage(message, this.currentUser?.userId || ''); + if (!initialMessage) { + this.emit('messageSent', message); + } + try { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.sendMessageApi, { + sender: this.currentUser?.userId || '', + target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''), + conversationType: conversation.type || conversation.raw?.type || 0, + text + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '发送失败'); + } + const sentMessage = { + ...message, + status: 'sent', + deliveryStatus: 'sent', + messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '', + senderRole: response.data?.result?.senderRole || message.senderRole || '', + serverTimestamp: Number(response.data?.result?.timestamp || 0) || null, + timestamp: message.timestamp, + displayTimestamp: message.displayTimestamp || message.timestamp + }; + saveLocalMessage(sentMessage, this.currentUser?.userId || ''); + this.emit('messageStatusChanged', sentMessage); + return sentMessage; + } catch (error) { + const failedMessage = { + ...message, + status: 'failed', + deliveryStatus: '', + error: error.response?.data?.message || error.message || '发送失败' + }; + saveLocalMessage(failedMessage, this.currentUser?.userId || ''); + this.emit('messageStatusChanged', failedMessage); + return failedMessage; + } + } + async sendAttachmentMessage(conversation, { + type, + file, + text = '' + }, initialMessage = null) { + const senderRole = conversation?.role || conversation?.raw?.role || ''; + const message = initialMessage || { + id: randomId(), + conversationId: conversation.id, + from: this.currentUser?.userId || 'me', + senderRole, + direction: 'out', + type, + text, + attachment: { + type, + name: file?.name || (type === 'image' ? '图片' : '文件'), + mime: file?.type || '', + size: file?.size || 0, + url: type === 'image' && file ? URL.createObjectURL(file) : '' + }, + status: 'sending', + deliveryStatus: 'sending', + timestamp: Date.now() + }; + saveLocalMessage(message, this.currentUser?.userId || ''); + if (!initialMessage) { + this.emit('messageSent', message); + } + try { + const formData = new FormData(); + formData.append('sender', this.currentUser?.userId || ''); + formData.append('target', conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, '')); + formData.append('conversationType', conversation.type || conversation.raw?.type || 0); + formData.append('messageType', type); + formData.append('text', text || ''); + formData.append('attachment', file); + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.sendMessageApi, formData, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '发送失败'); + } + const sentMessage = { + ...message, + status: 'sent', + deliveryStatus: 'sent', + messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '', + senderRole: response.data?.result?.senderRole || message.senderRole || '', + attachment: response.data?.result?.attachment || message.attachment, + serverTimestamp: Number(response.data?.result?.timestamp || 0) || null, + timestamp: message.timestamp, + displayTimestamp: message.displayTimestamp || message.timestamp + }; + saveLocalMessage(sentMessage, this.currentUser?.userId || ''); + this.emit('messageStatusChanged', sentMessage); + return sentMessage; + } catch (error) { + const failedMessage = { + ...message, + status: 'failed', + deliveryStatus: '', + error: error.response?.data?.message || error.message || '发送失败' + }; + saveLocalMessage(failedMessage, this.currentUser?.userId || ''); + this.emit('messageStatusChanged', failedMessage); + return failedMessage; + } + } + getContactList() { + return []; + } + async getServerContactList(userId) { + if (!userId) { + return []; + } + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.contactsApi, { + userId + }, { + withCredentials: false, + headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.contactsApi) + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '联系人加载失败'); + } + return (response.data?.result?.contacts || []).map(item => { + return this.mapContact(item.uid, { + alias: item.alias + }, { + uid: item.uid, + displayName: item.displayName, + name: item.name, + mobile: item.mobile, + portrait: item.portrait, + address: item.address, + friendAlias: item.alias + }); + }).sort((a, b) => a.title.localeCompare(b.title, 'zh-CN')); + } + async addContact(userId, keyword, reason = '') { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.addContactApi, { + userId, + keyword, + reason + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '添加联系人失败'); + } + const item = response.data?.result?.contact; + if (!item?.uid) { + return null; + } + return this.mapContact(item.uid, { + alias: item.alias + }, { + uid: item.uid, + displayName: item.displayName, + name: item.name, + mobile: item.mobile, + portrait: item.portrait, + address: item.address, + friendAlias: item.alias + }); + } + normalizeConversation(conversation) { + const title = getTitle(conversation?.title, conversation?.target || ''); + return { + ...conversation, + id: conversation?.id || `${conversation?.type === 'single' ? 'single' : 'group'}-${conversation?.target}`, + target: conversation?.target || conversation?.raw?.target || '', + title, + subtitle: conversation?.subtitle || '', + unread: Number(conversation?.unread || 0), + portrait: conversation?.portrait || '', + avatarText: conversation?.avatarText || title.slice(0, 1).toUpperCase(), + updatedAt: Number(conversation?.updatedAt || Date.now()), + raw: conversation?.raw || { + type: conversation?.type === 'single' ? 'single' : 'group', + target: conversation?.target || '', + line: 0 + } + }; + } + async createGroup(userId, { + name, + memberIds = [], + announcement = '', + welcomeText = '', + channel = false + }) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: channel ? 'create_channel' : 'create_group', + userId, + name, + memberIds, + announcement, + welcomeText + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || (channel ? '创建公告群失败' : '创建群组失败')); + } + return this.normalizeConversation(response.data?.result?.conversation || {}); + } + async joinGroup(userId, groupKey) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'join_group', + userId, + groupKey + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '加入群组失败'); + } + return this.normalizeConversation(response.data?.result?.conversation || {}); + } + async broadcastMessage(userId, targetIds, text) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'broadcast', + userId, + targetIds, + text + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '群发失败'); + } + return response.data?.result || {}; + } + async getGroupDetail(userId, groupId) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'group_detail', + userId, + groupId + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '群资料加载失败'); + } + return response.data?.result?.group || null; + } + async getGroupMembers(userId, groupId) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'group_members', + userId, + groupId + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '群员加载失败'); + } + return response.data?.result?.members || []; + } + async updateGroupAlias(userId, groupId, alias) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'update_group_alias', + userId, + groupId, + alias + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '本群昵称保存失败'); + } + return response.data?.result?.alias || ''; + } + async leaveGroup(userId, groupId) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'leave_group', + userId, + groupId + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '退出群组失败'); + } + return response.data?.result || {}; + } + async dismissGroup(userId, groupId) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'dismiss_group', + userId, + groupId + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '解散群组失败'); + } + return response.data?.result || {}; + } + async transferGroup(userId, groupId, targetUserId) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'transfer_group', + userId, + groupId, + targetUserId + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '转让群组失败'); + } + return response.data?.result || {}; + } + async setGroupAdmins(userId, groupId, adminIds) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'set_group_admins', + userId, + groupId, + adminIds + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '管理员设置失败'); + } + return response.data?.result || {}; + } + async updateGroupProfile(userId, groupId, { + name, + announcement, + welcomeText + }) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'update_group_profile', + userId, + groupId, + name, + announcement, + welcomeText + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '群资料保存失败'); + } + return response.data?.result || {}; + } + async kickGroupMembers(userId, groupId, targetIds) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'kick_group_members', + userId, + groupId, + targetIds + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '踢人失败'); + } + return response.data?.result || {}; + } + async updateGroupMuteSetting(userId, groupId, setting) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.conversationActionsApi, { + action: 'update_mute_setting', + userId, + groupId, + ...setting + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '禁言设置保存失败'); + } + return response.data?.result?.muteSetting || null; + } + async updateContactAlias(userId, targetId, alias) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.updateAliasApi, { + userId, + targetId, + alias + }, { + withCredentials: false, + headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.updateAliasApi) + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '备注名修改失败'); + } + return response.data?.result?.contact?.alias || ''; + } + async getProfile(userId) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.profileApi, { + action: 'get', + userId + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '用户资料加载失败'); + } + return response.data?.result?.profile || null; + } + async updateProfile(userId, { + displayName, + portraitFile + }) { + const formData = new FormData(); + formData.append('action', 'update'); + formData.append('userId', userId); + formData.append('displayName', displayName); + if (portraitFile) { + formData.append('portraitFile', portraitFile); + } + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.profileApi, formData, { + withCredentials: false, + headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.appServer) + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '用户资料保存失败'); + } + return response.data?.result?.profile || null; + } + async changePassword({ + oldPassword, + newPassword + }) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.changePasswordApi, { + oldPassword, + newPassword + }, { + withCredentials: false, + headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.changePasswordApi) + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || response.data?.msg || '密码修改失败'); + } + return true; + } + async resetPasswordWithCode({ + mobile, + resetCode, + newPassword + }) { + const response = await axios__WEBPACK_IMPORTED_MODULE_18__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.resetPasswordApi, { + mobile, + resetCode, + newPassword + }, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || response.data?.msg || '密码设置失败'); + } + return true; + } + refreshContactList() { + const contacts = this.getContactList(); + this.emit('contactsChanged', contacts); + return contacts; + } + createSingleConversation(userId, userInfo = null) { + const title = getTitle(userInfo?.title || userInfo?.displayName || userInfo?.name, userId); + return { + id: `single-${userId}`, + type: 'single', + target: userId, + title, + subtitle: '', + unread: 0, + portrait: userInfo?.portrait || '', + avatarText: title.slice(0, 1).toUpperCase(), + updatedAt: Date.now(), + raw: { + type: 'single', + target: userId, + line: 0 + } + }; + } + mapContact(userId, friend, userInfo) { + const title = getTitle(userInfo?.friendAlias || friend?.alias || userInfo?.displayName || userInfo?.name, userId); + return { + id: userId, + uid: userId, + title, + subtitle: userInfo?.mobile || userInfo?.name || userId, + portrait: userInfo?.portrait || '', + address: userInfo?.address || '', + avatarText: title.slice(0, 1).toUpperCase(), + alias: friend?.alias || userInfo?.friendAlias || '', + rawFriend: friend, + rawUser: userInfo + }; + } + on(eventName, handler) { + if (!this.listeners.has(eventName)) { + this.listeners.set(eventName, new Set()); + } + this.listeners.get(eventName).add(handler); + return () => this.off(eventName, handler); + } + off(eventName, handler) { + this.listeners.get(eventName)?.delete(handler); + } + emit(eventName, payload) { + this.listeners.get(eventName)?.forEach(handler => handler(payload)); + } + persistAppToken(url, response) { + const appToken = response.headers?.authtoken || response.headers?.authToken; + if (appToken) { + localStorage.setItem(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.authTokenStoragePrefix + this.getUrlHost(url), appToken); + } + } + getAppAuthHeaders(url) { + const host = this.getUrlHost(url); + if (!host) { + return {}; + } + const token = localStorage.getItem(_config__WEBPACK_IMPORTED_MODULE_17__/* .appConfig */ .U.authTokenStoragePrefix + host); + return token ? { + authToken: token + } : {}; + } + getUrlHost(url) { + try { + return new URL(url, window.location.origin).host; + } catch (error) { + return ''; + } + } +} +const imClient = new HttpImClient(); + +/***/ }), + +/***/ 3121: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3741); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(4546); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7987); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1857); +/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3865); + + + +const _hoisted_1 = { + class: "conversation-list" +}; +const _hoisted_2 = { + class: "list-header" +}; +const _hoisted_3 = { + class: "header-actions" +}; +const _hoisted_4 = { + class: "search-box" +}; +const _hoisted_5 = { + class: "sidebar-scroll" +}; +const _hoisted_6 = ["onClick"]; +const _hoisted_7 = ["src"]; +const _hoisted_8 = { + key: 1, + class: "conversation-avatar" +}; +const _hoisted_9 = { + class: "conversation-copy" +}; +const _hoisted_10 = { + key: 0, + class: "empty-list" +}; +const _hoisted_11 = { + key: 0, + class: "form-error" +}; +const _hoisted_12 = { + key: 1, + class: "form-info" +}; +const _hoisted_13 = { + class: "modal-actions" +}; +const _hoisted_14 = ["disabled"]; + + +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'ContactList', + setup(__props) { + const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_2__/* .useContactStore */ .p)(); + const keyword = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .ref */ .KR)(''); + const addingContact = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .ref */ .KR)(false); + const addKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .ref */ .KR)(''); + const filteredContacts = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .computed */ .EW)(() => { + const value = keyword.value.toLowerCase(); + if (!value) { + return contacts.contacts; + } + return contacts.contacts.filter(item => { + return item.title.toLowerCase().includes(value) || item.subtitle.toLowerCase().includes(value) || item.uid.toLowerCase().includes(value); + }); + }); + function openAddContact() { + contacts.actionError = ''; + contacts.actionInfo = ''; + addKeyword.value = ''; + addingContact.value = true; + } + function closeAddContact() { + addingContact.value = false; + } + async function submitAddContact() { + const added = await contacts.addContact(addKeyword.value); + if (added) { + window.setTimeout(() => { + addingContact.value = false; + }, 500); + } + } + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("aside", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("header", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("div", null, [_cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("h2", null, "联系人", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).contacts.length) + " 位好友", 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("button", { + class: "icon-button", + title: "添加联系人", + onClick: openAddContact + }, "+"), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("button", { + class: "icon-button", + title: "刷新", + onClick: _cache[0] || (_cache[0] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).refreshContacts({ + force: true + })) + }, "↻")])]), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("div", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => keyword.value = $event), + placeholder: "搜索联系人" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_6__/* .vModelText */ .Jo, keyword.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("div", _hoisted_5, [((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_4__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .renderList */ .pI)(filteredContacts.value, item => { + return (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("button", { + key: item.id, + class: (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .normalizeClass */ .C4)(["conversation-item", { + active: item.id === (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).activeId + }]), + onClick: $event => (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).setActiveContact(item.id) + }, [item.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "conversation-avatar image-avatar", + src: item.portrait, + alt: "" + }, null, 8, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("span", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(item.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("span", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(item.title), 1), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(item.subtitle), 1)])], 10, _hoisted_6); + }), 128)), !filteredContacts.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("div", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).loading ? '正在加载' : '暂无联系人'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).loading ? '请稍候' : '好友同步完成后会显示在这里'), 1)])) : (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createCommentVNode */ .Q3)("", true)]), addingContact.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("div", { + key: 0, + class: "modal-backdrop", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(closeAddContact, ["self"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("form", { + class: "modal-panel", + onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(submitAddContact, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("header", null, [_cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("strong", null, "添加联系人", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeAddContact + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("label", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("span", null, "用户ID / 手机号 / 用户名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => addKeyword.value = $event), + autocomplete: "off", + placeholder: "请输入要添加的联系人" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_6__/* .vModelText */ .Jo, addKeyword.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).actionError ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("p", _hoisted_11, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).actionError), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).actionInfo ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("p", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).actionInfo), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("div", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "ghost-inline-action", + onClick: closeAddContact + }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("button", { + class: "primary-inline-action", + disabled: (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).loading || !addKeyword.value + }, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(contacts).loading ? '添加中...' : '添加'), 9, _hoisted_14)])], 32)])) : (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createCommentVNode */ .Q3)("", true)]); + }; + } +}); + +/***/ }), + +/***/ 3842: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ w: function() { return /* binding */ useConversationStore; } +/* harmony export */ }); +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5513); +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3741); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4912); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_esnext_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9791); +/* harmony import */ var core_js_modules_esnext_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(680); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(793); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var core_js_modules_esnext_iterator_reduce_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5729); +/* harmony import */ var core_js_modules_esnext_iterator_reduce_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_reduce_js__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(6071); +/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(8438); +/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(6768); +/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(2409); +/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(9488); +/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(6591); +/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__); +/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(5412); +/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_14__); +/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(9214); +/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_15__); +/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(9130); +/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_16__); +/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(8937); +/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_17__); +/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(8636); +/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_18__); +/* harmony import */ var pinia__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(9776); +/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(6151); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(9397); +/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(4834); + + + + + + + + + + + + + + + + + + + + + + + +const LOCAL_CONVERSATION_STORAGE_KEY = 'qmt-web-im-local-conversations-v2'; +const LOCAL_FAVORITE_MESSAGES_KEY = 'qmt-web-im-favorite-messages-v1'; +function scopedStorageKey(baseKey) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_21__/* .useSessionStore */ .B)(); + const scope = `${_config__WEBPACK_IMPORTED_MODULE_20__/* .appConfig */ .U.appServer || ''}:${session.userId || 'anonymous'}`; + return `${baseKey}:${encodeURIComponent(scope)}`; +} +function readFavoriteMessages() { + try { + return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY)) || '[]'); + } catch (error) { + return []; + } +} +function writeFavoriteMessages(messages) { + localStorage.setItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY), JSON.stringify(messages)); +} +function readLocalConversations() { + try { + return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY)) || '[]'); + } catch (error) { + return []; + } +} +function writeLocalConversations(conversations) { + localStorage.setItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY), JSON.stringify(conversations)); +} +function randomId() { + if (window.crypto && window.crypto.randomUUID) { + return window.crypto.randomUUID().replaceAll('-', ''); + } + return `${Date.now()}${Math.random().toString(16).slice(2)}`; +} +function messageKey(message) { + return message.id || message.messageUid; +} +function messageStableKey(message) { + return String(message?.messageUid || message?.id || ''); +} +function messageActivityTimestamp(message) { + return Number(message?.activityTimestamp || message?.editedAt || message?.displayTimestamp || message?.timestamp || 0); +} +function isRecalledMessage(message) { + return Boolean(message?.recalled) || message?.status === 'recalled'; +} +function attachmentLabel(message) { + const attachment = message?.attachment; + if (!attachment) { + return ''; + } + if (attachment.type === 'image') { + return '[图片]'; + } + return `[文件] ${attachment.name || '文件'}`; +} +function messagePreviewText(message) { + if (isRecalledMessage(message)) { + return `[${message?.recallStatus || '已撤回'}]`; + } + const text = String(message?.text || '').replace(/\s+/g, ' ').trim(); + return text || attachmentLabel(message); +} +function quotePrefix(message) { + const text = messagePreviewText(message); + return text.length > 48 ? `${text.slice(0, 48)}...` : text; +} +async function writeClipboard(text) { + if (navigator.clipboard?.writeText) { + await navigator.clipboard.writeText(text); + return; + } + const element = document.createElement('textarea'); + element.value = text; + element.setAttribute('readonly', 'readonly'); + element.style.position = 'fixed'; + element.style.left = '-9999px'; + document.body.appendChild(element); + element.select(); + document.execCommand('copy'); + document.body.removeChild(element); +} +function isSameMessage(left, right) { + if (left.messageUid && right.messageUid && left.messageUid === right.messageUid) { + return true; + } + if (left.id && right.id && left.id === right.id) { + return true; + } + return left.direction === right.direction && left.text === right.text && (left.type || 'text') === (right.type || 'text') && Math.abs(Number(left.displayTimestamp || left.timestamp || 0) - Number(right.displayTimestamp || right.timestamp || 0)) < 15000; +} +function hasExactMessage(messages, message) { + return messages.some(item => { + if (item.id && message.id && item.id === message.id) { + return true; + } + return item.messageUid && message.messageUid && item.messageUid === message.messageUid; + }); +} +function shouldUseMessagePolling() { + return imClient.shouldUseMessagePolling ? imClient.shouldUseMessagePolling() : true; +} +function canMarkReadNow(options = {}) { + if (typeof document === 'undefined') { + return false; + } + if (document.visibilityState !== 'visible') { + return false; + } + if (options.userAction) { + return true; + } + return true; +} +function mergeVisibleMessages(currentMessages, syncedMessages) { + const merged = [...syncedMessages]; + currentMessages.forEach(currentMessage => { + const exists = merged.some(message => isSameMessage(message, currentMessage)); + const shouldKeepLocal = currentMessage.status === 'sending' || currentMessage.status === 'failed' || currentMessage.direction === 'out' && currentMessage.status === 'sent' && Date.now() - Number(currentMessage.timestamp || 0) < 30000; + if (!exists && shouldKeepLocal) { + merged.push(currentMessage); + } + }); + return merged.filter((message, index, messages) => { + const key = messageKey(message); + return messages.findIndex(item => messageKey(item) === key) === index; + }).sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0)); +} +function incomingEditedMessages(previousMessages, nextMessages) { + const previousByKey = new Map(); + (previousMessages || []).forEach(message => { + const key = messageStableKey(message); + if (key) { + previousByKey.set(key, message); + } + }); + return (nextMessages || []).filter(message => { + if (message.direction !== 'in') { + return false; + } + const editedAt = Number(message.editedAt || 0); + if (editedAt <= 0) { + return false; + } + const previous = previousByKey.get(messageStableKey(message)); + return previous && editedAt > Number(previous.editedAt || 0); + }); +} +let notificationAudioContext = null; +function playNotificationSound() { + if (typeof window === 'undefined') { + return; + } + try { + const AudioContext = window.AudioContext || window.webkitAudioContext; + if (!AudioContext) { + return; + } + notificationAudioContext = notificationAudioContext || new AudioContext(); + if (notificationAudioContext.state === 'suspended') { + notificationAudioContext.resume().catch(() => {}); + } + const oscillator = notificationAudioContext.createOscillator(); + const gain = notificationAudioContext.createGain(); + const startAt = notificationAudioContext.currentTime; + oscillator.type = 'sine'; + oscillator.frequency.setValueAtTime(880, startAt); + oscillator.frequency.setValueAtTime(660, startAt + 0.1); + gain.gain.setValueAtTime(0.0001, startAt); + gain.gain.exponentialRampToValueAtTime(0.12, startAt + 0.02); + gain.gain.exponentialRampToValueAtTime(0.0001, startAt + 0.22); + oscillator.connect(gain); + gain.connect(notificationAudioContext.destination); + oscillator.start(startAt); + oscillator.stop(startAt + 0.24); + } catch (error) { + // Notification sound is best-effort; browsers may block audio until user interaction. + } +} +const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_22__/* .defineStore */ .nY)('conversations', { + state: () => ({ + activeId: '', + conversations: [], + messagesByConversation: {}, + visibleMessagesByConversation: {}, + eventsBound: false, + usingDemoData: false, + loading: false, + syncTimer: null, + conversationSyncTimer: null, + readPresenceEventsBound: false, + syncInFlight: false, + pendingReadReceiptConversationId: '', + conversationSyncInFlight: false, + syncAfterSendTimer: null, + optimisticMessagesByConversation: {}, + quotedMessage: null, + forwardingMessages: [], + editingMessage: null, + editingText: '', + editingMode: '', + messageDetailOpen: false, + messageDetailLoading: false, + messageDetailError: '', + messageDetail: null, + attentionMessageId: '', + attentionMessageTimer: null, + selectionMode: false, + selectedMessageIds: [], + favoriteMessages: [], + activeFavoriteKey: '', + actionNotice: '', + actionError: '' + }), + getters: { + activeConversation(state) { + return state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null; + }, + activeMessages(state) { + return state.visibleMessagesByConversation[state.activeId] || []; + }, + totalUnread(state) { + return state.conversations.reduce((sum, item) => sum + Number(item.unread || 0), 0); + }, + canSendActiveConversation(state) { + const conversation = state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null; + if (!conversation) { + return false; + } + if (conversation.type !== 'channel') { + return true; + } + return ['owner', 'admin'].includes(conversation.role || conversation.raw?.role || ''); + }, + favoriteMessageIds(state) { + return state.favoriteMessages.map(message => message.key); + }, + activeFavorite(state) { + return state.favoriteMessages.find(message => message.key === state.activeFavoriteKey) || state.favoriteMessages[0] || null; + }, + selectedMessages(state) { + const selectedIds = new Set(state.selectedMessageIds); + return (state.visibleMessagesByConversation[state.activeId] || []).filter(message => selectedIds.has(messageStableKey(message))); + } + }, + actions: { + bootstrapDemoData() { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_21__/* .useSessionStore */ .B)(); + this.bindImEvents(); + this.usingDemoData = false; + if (!session.userId) { + this.clearUserState(); + return; + } + this.loadScopedLocalState(); + this.startMessageSync(); + }, + loadScopedLocalState() { + this.conversations = readLocalConversations(); + this.favoriteMessages = readFavoriteMessages(); + this.activeFavoriteKey = this.favoriteMessages[0]?.key || ''; + this.activeId = this.conversations[0]?.id || ''; + this.messagesByConversation = {}; + this.visibleMessagesByConversation = {}; + this.optimisticMessagesByConversation = {}; + this.quotedMessage = null; + this.forwardingMessages = []; + this.editingMessage = null; + this.editingText = ''; + this.editingMode = ''; + this.messageDetailOpen = false; + this.messageDetailLoading = false; + this.messageDetailError = ''; + this.messageDetail = null; + this.selectionMode = false; + this.selectedMessageIds = []; + if (this.activeId) { + this.loadActiveMessages({ + allowReadReceipt: true + }); + } + }, + clearUserState() { + window.clearInterval(this.syncTimer); + window.clearInterval(this.conversationSyncTimer); + window.clearTimeout(this.syncAfterSendTimer); + window.clearTimeout(this.attentionMessageTimer); + this.syncTimer = null; + this.conversationSyncTimer = null; + this.syncAfterSendTimer = null; + this.attentionMessageTimer = null; + this.syncInFlight = false; + this.conversationSyncInFlight = false; + this.pendingReadReceiptConversationId = ''; + this.activeId = ''; + this.conversations = []; + this.messagesByConversation = {}; + this.visibleMessagesByConversation = {}; + this.optimisticMessagesByConversation = {}; + this.quotedMessage = null; + this.forwardingMessages = []; + this.editingMessage = null; + this.editingText = ''; + this.editingMode = ''; + this.messageDetailOpen = false; + this.messageDetailLoading = false; + this.messageDetailError = ''; + this.messageDetail = null; + this.attentionMessageId = ''; + this.selectionMode = false; + this.selectedMessageIds = []; + this.favoriteMessages = []; + this.activeFavoriteKey = ''; + this.actionNotice = ''; + this.actionError = ''; + }, + bindImEvents() { + if (this.eventsBound) { + return; + } + this.eventsBound = true; + _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.on('messageSent', message => { + this.appendMessage(message.conversationId, message); + }); + _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.on('messageReceived', message => { + this.appendMessage(message.conversationId, message); + if (message.conversationId === this.activeId) { + this.syncActiveMessages({ + allowReadReceipt: true + }); + } + }); + _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.on('messageStatusChanged', message => { + this.replaceMessage(message.conversationId, message); + }); + _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.on('conversationsChanged', remoteConversations => { + this.usingDemoData = false; + this.applyRemoteConversations(remoteConversations); + }); + }, + setActiveConversation(id) { + this.activeId = id; + const conversation = this.conversations.find(item => item.id === id); + if (conversation) { + conversation.unread = 0; + } + this.loadActiveMessages({ + allowReadReceipt: true, + userAction: true + }); + }, + sendText(text) { + const conversation = this.activeConversation; + if (!conversation || !text.trim()) { + return; + } + let value = text.trim(); + if (this.quotedMessage) { + value = `引用:${quotePrefix(this.quotedMessage)}\n${value}`; + this.quotedMessage = null; + } + const message = { + id: randomId(), + conversationId: conversation.id, + from: 'me', + direction: 'out', + type: 'text', + text: value, + status: 'sending', + deliveryStatus: 'sending', + timestamp: Date.now(), + displayTimestamp: Date.now() + }; + this.appendVisibleMessage(conversation.id, message); + this.appendMessage(conversation.id, message); + _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.sendTextMessage(conversation, value, message); + conversation.subtitle = value; + conversation.updatedAt = Date.now(); + writeLocalConversations(this.conversations); + window.clearTimeout(this.syncAfterSendTimer); + this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 250); + }, + sendAttachment({ + type, + file, + text = '' + }) { + const conversation = this.activeConversation; + if (!conversation || !file || !['image', 'file'].includes(type)) { + return; + } + let value = text.trim(); + if (this.quotedMessage) { + value = `引用:${quotePrefix(this.quotedMessage)}\n${value}`.trim(); + this.quotedMessage = null; + } + const now = Date.now(); + const message = { + id: randomId(), + conversationId: conversation.id, + from: 'me', + senderRole: conversation.role || conversation.raw?.role || '', + direction: 'out', + type, + text: value, + attachment: { + type, + name: file.name || (type === 'image' ? '图片' : '文件'), + mime: file.type || '', + size: file.size || 0, + url: type === 'image' ? URL.createObjectURL(file) : '' + }, + status: 'sending', + deliveryStatus: 'sending', + timestamp: now, + displayTimestamp: now + }; + this.appendVisibleMessage(conversation.id, message); + this.appendMessage(conversation.id, message); + _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.sendAttachmentMessage(conversation, { + type, + file, + text: value + }, message); + conversation.subtitle = messagePreviewText(message); + conversation.updatedAt = now; + writeLocalConversations(this.conversations); + window.clearTimeout(this.syncAfterSendTimer); + this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 350); + }, + async sendTextToConversation(conversation, text) { + if (!conversation || !text.trim()) { + return null; + } + const value = text.trim(); + const message = { + id: randomId(), + conversationId: conversation.id, + from: 'me', + direction: 'out', + type: 'text', + text: value, + status: 'sending', + deliveryStatus: 'sending', + timestamp: Date.now(), + displayTimestamp: Date.now() + }; + this.appendMessage(conversation.id, message); + const sentMessage = await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.sendTextMessage(conversation, value, message); + this.replaceMessage(conversation.id, sentMessage); + return sentMessage; + }, + upsertConversation(conversation) { + const index = this.conversations.findIndex(item => item.id === conversation.id); + if (index >= 0) { + this.conversations.splice(index, 1, { + ...this.conversations[index], + ...conversation + }); + } else { + this.conversations.unshift(conversation); + } + this.usingDemoData = false; + writeLocalConversations(this.conversations); + }, + removeConversation(conversationId) { + this.conversations = this.conversations.filter(conversation => conversation.id !== conversationId); + const { + [conversationId]: removedMessages, + ...messagesByConversation + } = this.messagesByConversation; + const { + [conversationId]: removedVisibleMessages, + ...visibleMessagesByConversation + } = this.visibleMessagesByConversation; + const { + [conversationId]: removedOptimisticMessages, + ...optimisticMessagesByConversation + } = this.optimisticMessagesByConversation; + void removedMessages; + void removedVisibleMessages; + void removedOptimisticMessages; + this.messagesByConversation = messagesByConversation; + this.visibleMessagesByConversation = visibleMessagesByConversation; + this.optimisticMessagesByConversation = optimisticMessagesByConversation; + if (this.activeId === conversationId) { + this.activeId = this.conversations[0]?.id || ''; + } + writeLocalConversations(this.conversations); + if (this.activeId) { + this.loadActiveMessages(); + } + }, + applyRemoteConversations(remoteConversations) { + const remote = Array.isArray(remoteConversations) ? remoteConversations : []; + if (!remote.length && this.conversations.length) { + return; + } + const merged = new Map(); + this.conversations.forEach(conversation => { + merged.set(conversation.id, conversation); + }); + remote.forEach(conversation => { + const unread = conversation.id === this.activeId && canMarkReadNow() ? 0 : Number(conversation.unread || 0); + merged.set(conversation.id, { + ...(merged.get(conversation.id) || {}), + ...conversation, + unread + }); + }); + this.conversations = Array.from(merged.values()).sort((a, b) => Number(b.updatedAt || 0) - Number(a.updatedAt || 0)).slice(0, 100); + if (!this.conversations.length) { + this.activeId = ''; + this.messagesByConversation = {}; + this.visibleMessagesByConversation = {}; + this.optimisticMessagesByConversation = {}; + writeLocalConversations(this.conversations); + return; + } + if (!this.conversations.find(item => item.id === this.activeId)) { + this.activeId = this.conversations[0].id; + } + writeLocalConversations(this.conversations); + this.loadActiveMessages(); + }, + appendMessage(conversationId, message) { + if (!this.messagesByConversation[conversationId]) { + this.messagesByConversation = { + ...this.messagesByConversation, + [conversationId]: [] + }; + } + if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent')) { + this.keepOptimisticMessage(conversationId, message); + } + if (!hasExactMessage(this.messagesByConversation[conversationId], message)) { + this.messagesByConversation = { + ...this.messagesByConversation, + [conversationId]: [...this.messagesByConversation[conversationId], message] + }; + } + this.updateConversationFromMessage(conversationId, message); + this.syncVisibleMessages(conversationId); + writeLocalConversations(this.conversations); + }, + removeMessages(conversationId, messages) { + const ids = new Set(messages.flatMap(message => [message.id, message.messageUid].filter(Boolean).map(String))); + const filterMessages = list => (list || []).filter(message => { + return ![message.id, message.messageUid].filter(Boolean).some(id => ids.has(String(id))); + }); + this.messagesByConversation = { + ...this.messagesByConversation, + [conversationId]: filterMessages(this.messagesByConversation[conversationId]) + }; + this.visibleMessagesByConversation = { + ...this.visibleMessagesByConversation, + [conversationId]: filterMessages(this.visibleMessagesByConversation[conversationId]) + }; + this.optimisticMessagesByConversation = { + ...this.optimisticMessagesByConversation, + [conversationId]: filterMessages(this.optimisticMessagesByConversation[conversationId]) + }; + this.selectedMessageIds = this.selectedMessageIds.filter(id => !ids.has(String(id))); + }, + replaceLocalMessage(conversationId, targetMessage, nextMessage) { + const keys = new Set([targetMessage.id, targetMessage.messageUid].filter(Boolean).map(String)); + const replaceInList = list => (list || []).map(message => { + const matched = [message.id, message.messageUid].filter(Boolean).some(id => keys.has(String(id))); + return matched ? { + ...message, + ...nextMessage + } : message; + }); + this.messagesByConversation = { + ...this.messagesByConversation, + [conversationId]: replaceInList(this.messagesByConversation[conversationId]) + }; + this.visibleMessagesByConversation = { + ...this.visibleMessagesByConversation, + [conversationId]: replaceInList(this.visibleMessagesByConversation[conversationId]) + }; + }, + updateConversationFromMessage(conversationId, message) { + const conversation = this.conversations.find(item => item.id === conversationId); + if (!conversation) { + return; + } + conversation.subtitle = message.text || conversation.subtitle || ''; + conversation.updatedAt = messageActivityTimestamp(message) || Date.now(); + if (message.direction === 'in') { + conversation.unread = conversationId === this.activeId ? 0 : Number(conversation.unread || 0) + 1; + } + this.conversations = [...this.conversations].sort((a, b) => Number(b.updatedAt || 0) - Number(a.updatedAt || 0)); + }, + appendVisibleMessage(conversationId, message) { + const messages = this.visibleMessagesByConversation[conversationId] || []; + this.visibleMessagesByConversation = { + ...this.visibleMessagesByConversation, + [conversationId]: [...messages.filter(item => item.id !== message.id), message].sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0)) + }; + }, + replaceMessage(conversationId, message) { + if (!this.messagesByConversation[conversationId]) { + this.messagesByConversation = { + ...this.messagesByConversation, + [conversationId]: [] + }; + } + if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent' || message.status === 'failed')) { + this.keepOptimisticMessage(conversationId, message); + } + const index = this.messagesByConversation[conversationId].findIndex(item => item.id === message.id); + if (index >= 0) { + const messages = [...this.messagesByConversation[conversationId]]; + messages.splice(index, 1, message); + this.messagesByConversation = { + ...this.messagesByConversation, + [conversationId]: messages + }; + } else { + this.messagesByConversation = { + ...this.messagesByConversation, + [conversationId]: [...this.messagesByConversation[conversationId], message] + }; + } + this.syncVisibleMessages(conversationId); + }, + syncVisibleMessages(conversationId) { + this.visibleMessagesByConversation = { + ...this.visibleMessagesByConversation, + [conversationId]: mergeVisibleMessages(this.optimisticMessagesByConversation[conversationId] || [], this.messagesByConversation[conversationId] || []) + }; + }, + keepOptimisticMessage(conversationId, message) { + if (!this.optimisticMessagesByConversation[conversationId]) { + this.optimisticMessagesByConversation = { + ...this.optimisticMessagesByConversation, + [conversationId]: [] + }; + } + const messages = this.optimisticMessagesByConversation[conversationId]; + const index = messages.findIndex(item => item.id === message.id); + let nextMessages; + if (index >= 0) { + nextMessages = [...messages]; + nextMessages.splice(index, 1, message); + } else { + nextMessages = [...messages, message]; + } + this.optimisticMessagesByConversation = { + ...this.optimisticMessagesByConversation, + [conversationId]: nextMessages + }; + }, + pruneOptimisticMessages(conversationId, syncedMessages) { + const messages = this.optimisticMessagesByConversation[conversationId] || []; + if (!messages.length) { + return; + } + this.optimisticMessagesByConversation = { + ...this.optimisticMessagesByConversation, + [conversationId]: messages.filter(message => { + const remoteMatched = syncedMessages.some(syncedMessage => { + return syncedMessage.id !== message.id && isSameMessage(syncedMessage, message); + }); + if (remoteMatched && message.status !== 'failed') { + return false; + } + return Date.now() - Number(message.displayTimestamp || message.timestamp || 0) < 30000 || message.status === 'failed'; + }) + }; + }, + loadActiveMessages(options = {}) { + const syncOptions = typeof options === 'boolean' ? { + allowReadReceipt: options + } : options; + const conversation = this.activeConversation; + if (!conversation) { + return; + } + this.loading = true; + const messages = _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.getMessages(conversation, 30); + this.pruneOptimisticMessages(conversation.id, messages); + this.messagesByConversation = { + ...this.messagesByConversation, + [conversation.id]: mergeVisibleMessages(this.messagesByConversation[conversation.id] || [], messages) + }; + this.syncVisibleMessages(conversation.id); + this.loading = false; + this.syncActiveMessages(syncOptions); + }, + async syncActiveMessages(options = {}) { + const conversation = this.activeConversation; + if (!conversation) { + return; + } + const wantsReadReceipt = Boolean(options.allowReadReceipt); + const explicitReadReceipt = wantsReadReceipt && canMarkReadNow({ + userAction: Boolean(options.userAction) + }); + const pollingReadReceipt = canMarkReadNow(); + const markRead = explicitReadReceipt || pollingReadReceipt; + if (this.syncInFlight) { + if (wantsReadReceipt) { + this.pendingReadReceiptConversationId = conversation.id; + } + return; + } + this.syncInFlight = true; + const syncedConversationId = conversation.id; + const previousMessages = this.messagesByConversation[syncedConversationId] || []; + try { + const messages = await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.fetchRemoteMessages(conversation, 50, { + markRead + }); + const editedIncomingMessages = incomingEditedMessages(previousMessages, messages); + this.pruneOptimisticMessages(syncedConversationId, messages); + this.messagesByConversation = { + ...this.messagesByConversation, + [syncedConversationId]: mergeVisibleMessages(this.messagesByConversation[syncedConversationId] || [], messages) + }; + this.syncVisibleMessages(syncedConversationId); + if (editedIncomingMessages.length && syncedConversationId === this.activeId) { + this.focusMessage(editedIncomingMessages.sort((a, b) => messageActivityTimestamp(b) - messageActivityTimestamp(a))[0]); + playNotificationSound(); + } + const latest = messages.reduce((latestMessage, message) => { + if (!latestMessage || messageActivityTimestamp(message) > messageActivityTimestamp(latestMessage)) { + return message; + } + return latestMessage; + }, null); + if (latest) { + conversation.subtitle = messagePreviewText(latest); + conversation.updatedAt = messageActivityTimestamp(latest); + writeLocalConversations(this.conversations); + } + } catch (error) { + // Keep the local view usable if a polling request misses. + } finally { + this.syncInFlight = false; + if (this.pendingReadReceiptConversationId === this.activeId && canMarkReadNow()) { + this.pendingReadReceiptConversationId = ''; + window.setTimeout(() => this.syncActiveMessages({ + allowReadReceipt: true + }), 0); + } + } + }, + startMessageSync() { + this.bindReadPresenceEvents(); + if (!this.syncTimer) { + this.syncTimer = window.setInterval(() => { + this.syncActiveMessages(); + }, Math.max(250, _config__WEBPACK_IMPORTED_MODULE_20__/* .appConfig */ .U.syncIntervalMs)); + } + if (!this.conversationSyncTimer) { + this.conversationSyncTimer = window.setInterval(() => { + this.refreshRemoteConversations(); + }, 2000); + this.refreshRemoteConversations(); + } + }, + bindReadPresenceEvents() { + if (this.readPresenceEventsBound || typeof window === 'undefined' || typeof document === 'undefined') { + return; + } + this.readPresenceEventsBound = true; + const syncWhenReadable = () => { + if (canMarkReadNow()) { + this.syncActiveMessages({ + allowReadReceipt: true + }); + } + }; + window.addEventListener('focus', syncWhenReadable); + document.addEventListener('visibilitychange', syncWhenReadable); + }, + async refreshRemoteConversations() { + this.bindImEvents(); + this.usingDemoData = false; + if (this.conversationSyncInFlight) { + return; + } + this.conversationSyncInFlight = true; + try { + const remoteConversations = await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.fetchRemoteConversations(50); + this.applyRemoteConversations(remoteConversations); + } catch (error) { + _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.refreshConversationList(); + } finally { + this.conversationSyncInFlight = false; + } + }, + setActionNotice(message) { + this.actionNotice = message; + this.actionError = ''; + window.clearTimeout(this.actionNoticeTimer); + this.actionNoticeTimer = window.setTimeout(() => { + this.actionNotice = ''; + }, 1800); + }, + setActionError(message) { + this.actionError = message; + this.actionNotice = ''; + window.clearTimeout(this.actionErrorTimer); + this.actionErrorTimer = window.setTimeout(() => { + this.actionError = ''; + }, 2400); + }, + focusMessage(message) { + const key = messageStableKey(message); + if (!key) { + return; + } + this.attentionMessageId = key; + window.clearTimeout(this.attentionMessageTimer); + this.attentionMessageTimer = window.setTimeout(() => { + if (this.attentionMessageId === key) { + this.attentionMessageId = ''; + } + }, 2800); + }, + async handleMessageAction({ + action, + message + }) { + if (!message) { + return; + } + if (action === 'copy') { + await this.copyMessages([message]); + } else if (action === 'edit') { + this.startEditMessage(message); + } else if (action === 'delete') { + this.deleteMessages([message]); + } else if (action === 'forward') { + this.startForward([message]); + } else if (action === 'favorite') { + this.toggleFavorite(message); + } else if (action === 'detail') { + await this.openMessageDetail(message); + } else if (action === 'quote') { + this.quoteMessage(message); + } else if (action === 'select') { + this.enterSelectionMode(message); + } else if (action === 'recall') { + await this.recallMessage(message); + } + }, + async openMessageDetail(message) { + const conversation = this.activeConversation; + if (!conversation || !message) { + return; + } + const key = messageStableKey(message); + this.messageDetailOpen = true; + this.messageDetailLoading = true; + this.messageDetailError = ''; + this.messageDetail = { + messageUid: key, + conversationType: conversation.type || conversation.raw?.type || 'single', + sentAt: Number(message.displayTimestamp || message.timestamp || 0), + editedAt: Number(message.editedAt || 0), + recalled: isRecalledMessage(message), + localOnly: true, + sender: { + uid: message.from || '', + name: message.senderName || message.from || '' + } + }; + try { + if (!/^\d+$/.test(key)) { + this.messageDetailError = '本地临时消息暂无送达/已读详情'; + return; + } + const detail = await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.getMessageDetail(conversation, message); + this.messageDetail = detail || this.messageDetail; + } catch (error) { + this.messageDetailError = error.message || '消息详情加载失败'; + } finally { + this.messageDetailLoading = false; + } + }, + closeMessageDetail() { + this.messageDetailOpen = false; + this.messageDetailLoading = false; + this.messageDetailError = ''; + this.messageDetail = null; + }, + async copyMessages(messages) { + const text = messages.map(message => message.text || '').join('\n'); + if (!text.trim()) { + return; + } + try { + await writeClipboard(text); + this.setActionNotice(messages.length > 1 ? '已复制所选消息' : '已复制'); + } catch (error) { + this.setActionError('复制失败'); + } + }, + deleteMessages(messages) { + const conversation = this.activeConversation; + if (!conversation || !messages.length) { + return; + } + _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.hideMessages(conversation, messages); + this.removeMessages(conversation.id, messages); + if (!this.selectedMessageIds.length) { + this.selectionMode = false; + } + this.setActionNotice(messages.length > 1 ? '已删除所选消息' : '已删除'); + }, + toggleFavorite(message) { + const key = messageStableKey(message); + if (!key) { + return; + } + const index = this.favoriteMessages.findIndex(item => item.key === key); + if (index >= 0) { + this.favoriteMessages.splice(index, 1); + if (this.activeFavoriteKey === key) { + this.activeFavoriteKey = this.favoriteMessages[0]?.key || ''; + } + this.setActionNotice('已取消收藏'); + } else { + const conversation = this.conversations.find(item => item.id === message.conversationId) || {}; + this.favoriteMessages.unshift({ + key, + id: message.id, + messageUid: message.messageUid, + conversationId: message.conversationId, + conversationTitle: conversation.title || message.conversationTitle || '', + type: message.type || 'text', + text: message.text || '', + preview: messagePreviewText(message), + senderName: message.senderName || message.from || '', + timestamp: Number(message.displayTimestamp || message.timestamp || Date.now()), + editedAt: Number(message.editedAt || 0), + recalled: isRecalledMessage(message), + recallStatus: message.recallStatus || (isRecalledMessage(message) ? '已撤回' : ''), + attachment: message.attachment ? { + ...message.attachment + } : null + }); + this.activeFavoriteKey = key; + this.setActionNotice('已收藏'); + } + this.favoriteMessages = this.favoriteMessages.slice(0, 200); + writeFavoriteMessages(this.favoriteMessages); + }, + setActiveFavorite(key) { + this.activeFavoriteKey = String(key || ''); + }, + removeFavorite(key) { + const value = String(key || ''); + if (!value) { + return; + } + this.favoriteMessages = this.favoriteMessages.filter(message => message.key !== value); + if (this.activeFavoriteKey === value) { + this.activeFavoriteKey = this.favoriteMessages[0]?.key || ''; + } + writeFavoriteMessages(this.favoriteMessages); + }, + quoteMessage(message) { + this.quotedMessage = { + ...message, + quoteText: quotePrefix(message) + }; + this.setActionNotice('已引用,输入后发送'); + }, + cancelQuote() { + this.quotedMessage = null; + }, + enterSelectionMode(message = null) { + this.selectionMode = true; + if (message) { + const key = messageStableKey(message); + this.selectedMessageIds = key ? [key] : []; + } + }, + toggleSelectedMessage(message) { + const key = messageStableKey(message); + if (!key) { + return; + } + const selected = new Set(this.selectedMessageIds); + if (selected.has(key)) { + selected.delete(key); + } else { + selected.add(key); + } + this.selectedMessageIds = Array.from(selected); + this.selectionMode = this.selectedMessageIds.length > 0; + }, + clearSelection() { + this.selectionMode = false; + this.selectedMessageIds = []; + }, + copySelectedMessages() { + return this.copyMessages(this.selectedMessages); + }, + deleteSelectedMessages() { + this.deleteMessages(this.selectedMessages); + }, + startForward(messages) { + this.forwardingMessages = messages.filter(message => message?.text); + if (!this.forwardingMessages.length) { + this.setActionError('没有可转发的消息'); + } + }, + startForwardSelectedMessages() { + this.startForward(this.selectedMessages); + }, + cancelForward() { + this.forwardingMessages = []; + }, + startEditMessage(message) { + const isResend = isRecalledMessage(message); + if (!isResend && !message?.text) { + this.setActionError('没有可编辑的文字内容'); + return; + } + this.editingMessage = message; + this.editingText = message.text || ''; + this.editingMode = isResend ? 'resend' : 'edit'; + }, + cancelEditMessage() { + this.editingMessage = null; + this.editingText = ''; + this.editingMode = ''; + }, + async completeEditMessage() { + const conversation = this.activeConversation; + const message = this.editingMessage; + const text = this.editingText.trim(); + const isResend = this.editingMode === 'resend' || isRecalledMessage(message); + if (!conversation || !message) { + this.cancelEditMessage(); + return; + } + if (!text) { + this.setActionError('编辑内容不能为空'); + return; + } + if (!isResend && text === String(message.text || '').trim()) { + this.cancelEditMessage(); + return; + } + try { + if (isResend) { + await this.sendTextToConversation(conversation, text); + this.cancelEditMessage(); + this.setActionNotice('已重新发送'); + return; + } + const editedMessage = await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.editMessage(conversation, message, text); + this.replaceLocalMessage(conversation.id, message, editedMessage); + if (messageActivityTimestamp(editedMessage) >= Number(conversation.updatedAt || 0)) { + conversation.subtitle = editedMessage.text; + conversation.updatedAt = messageActivityTimestamp(editedMessage); + writeLocalConversations(this.conversations); + } + this.cancelEditMessage(); + this.setActionNotice('已编辑'); + } catch (error) { + this.setActionError(error.message || '编辑失败'); + } + }, + async completeForward(targetConversationId) { + const target = this.conversations.find(conversation => conversation.id === targetConversationId); + if (!target || !this.forwardingMessages.length) { + return; + } + const text = this.forwardingMessages.map(message => `转发:${message.text || ''}`).join('\n\n'); + try { + await this.sendTextToConversation(target, text); + this.forwardingMessages = []; + this.clearSelection(); + this.setActionNotice('已转发'); + } catch (error) { + this.setActionError(error.message || '转发失败'); + } + }, + async recallMessage(message) { + const conversation = this.activeConversation; + if (!conversation) { + return; + } + try { + await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.recallMessage(conversation, message); + if (message.direction !== 'out') { + this.removeMessages(conversation.id, [message]); + this.setActionNotice('已撤回'); + this.syncActiveMessages(); + return; + } + this.replaceLocalMessage(conversation.id, message, { + status: 'recalled', + deliveryStatus: '', + recalled: true, + recallStatus: '已撤回' + }); + this.setActionNotice('已撤回'); + } catch (error) { + this.setActionError(error.message || '撤回失败'); + } + }, + async createGroup(options = {}) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_21__/* .useSessionStore */ .B)(); + if (!session.userId) { + this.setActionError('请先登录'); + return false; + } + try { + const conversation = await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.createGroup(session.userId, options); + this.upsertConversation(conversation); + this.setActiveConversation(conversation.id); + this.setActionNotice(options.channel ? '公告群已创建' : '群组已创建'); + this.refreshRemoteConversations(); + return true; + } catch (error) { + this.setActionError(error.message || (options.channel ? '创建公告群失败' : '创建群组失败')); + return false; + } + }, + async joinGroup(groupKey) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_21__/* .useSessionStore */ .B)(); + if (!session.userId) { + this.setActionError('请先登录'); + return false; + } + try { + const conversation = await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.joinGroup(session.userId, groupKey); + this.upsertConversation(conversation); + this.setActiveConversation(conversation.id); + this.setActionNotice('已加入群组'); + this.refreshRemoteConversations(); + return true; + } catch (error) { + this.setActionError(error.message || '加入群组失败'); + return false; + } + }, + async broadcastMessage(targetIds, text) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_21__/* .useSessionStore */ .B)(); + if (!session.userId) { + this.setActionError('请先登录'); + return false; + } + try { + const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.broadcastMessage(session.userId, targetIds, text); + const successCount = Number(result.successCount || 0); + const failedCount = Number(result.failedCount || 0); + this.setActionNotice(failedCount > 0 ? `已群发 ${successCount} 条,失败 ${failedCount} 条` : `已群发 ${successCount} 条`); + this.refreshRemoteConversations(); + return true; + } catch (error) { + this.setActionError(error.message || '群发失败'); + return false; + } + }, + async leaveGroup(conversation) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_21__/* .useSessionStore */ .B)(); + if (!session.userId || !conversation?.target) { + this.setActionError('缺少群组信息'); + return false; + } + try { + await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.leaveGroup(session.userId, conversation.target); + this.removeConversation(conversation.id); + this.setActionNotice('已退出群组'); + this.refreshRemoteConversations(); + return true; + } catch (error) { + this.setActionError(error.message || '退出群组失败'); + return false; + } + }, + async dismissGroup(conversation) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_21__/* .useSessionStore */ .B)(); + if (!session.userId || !conversation?.target) { + this.setActionError('缺少群组信息'); + return false; + } + try { + await _services_imClient__WEBPACK_IMPORTED_MODULE_19__/* .imClient */ .wD.dismissGroup(session.userId, conversation.target); + this.removeConversation(conversation.id); + this.setActionNotice('群组已解散'); + this.refreshRemoteConversations(); + return true; + } catch (error) { + this.setActionError(error.message || '解散群组失败'); + return false; + } + } + } +}); + +/***/ }), + +/***/ 3865: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ p: function() { return /* binding */ useContactStore; } +/* harmony export */ }); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4912); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(680); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(793); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var pinia__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(9776); +/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6151); +/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3842); +/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1050); +/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(4834); + + + + + + + + + +const CONTACT_CACHE_MS = 15000; +function normalizeContacts(contacts) { + const unique = new Map(); + contacts.forEach(contact => { + const uid = String(contact.uid || contact.id || '').trim(); + if (!uid) { + return; + } + const normalized = { + ...contact, + id: String(contact.id || uid), + uid + }; + unique.set(uid, { + ...(unique.get(uid) || {}), + ...normalized + }); + }); + return Array.from(unique.values()).sort((a, b) => a.title.localeCompare(b.title, 'zh-CN')); +} +const useContactStore = (0,pinia__WEBPACK_IMPORTED_MODULE_8__/* .defineStore */ .nY)('contacts', { + state: () => ({ + contacts: [], + activeId: '', + loading: false, + eventsBound: false, + refreshSerial: 0, + refreshPromise: null, + loadedForUserId: '', + loadedAt: 0, + actionError: '', + actionInfo: '' + }), + getters: { + activeContact(state) { + return state.contacts.find(item => item.id === state.activeId) || state.contacts[0] || null; + } + }, + actions: { + bindImEvents() { + if (this.eventsBound) { + return; + } + this.eventsBound = true; + _services_imClient__WEBPACK_IMPORTED_MODULE_4__/* .imClient */ .wD.on('contactsChanged', contacts => { + if (!contacts.length && this.contacts.length) { + return; + } + this.contacts = normalizeContacts(contacts); + if (!this.contacts.find(item => item.id === this.activeId)) { + this.activeId = this.contacts[0]?.id || ''; + } + }); + }, + async refreshContacts(options = {}) { + this.bindImEvents(); + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_7__/* .useSessionStore */ .B)(); + const requestUserId = session.userId; + const force = Boolean(options.force); + if (!requestUserId) { + this.clearContacts(); + return []; + } + if (!force && this.contacts.length && this.loadedForUserId === requestUserId && Date.now() - this.loadedAt < CONTACT_CACHE_MS) { + return this.contacts; + } + if (this.refreshPromise && !force) { + return this.refreshPromise; + } + const serial = this.refreshSerial + 1; + this.refreshSerial = serial; + this.loading = true; + this.refreshPromise = (async () => { + this.contacts = normalizeContacts(_services_imClient__WEBPACK_IMPORTED_MODULE_4__/* .imClient */ .wD.refreshContactList()); + if (!this.contacts.find(item => item.id === this.activeId)) { + this.activeId = this.contacts[0]?.id || ''; + } + if (!this.contacts.length || force) { + const serverContacts = await _services_imClient__WEBPACK_IMPORTED_MODULE_4__/* .imClient */ .wD.getServerContactList(requestUserId); + if (serial !== this.refreshSerial || (0,_stores_session__WEBPACK_IMPORTED_MODULE_7__/* .useSessionStore */ .B)().userId !== requestUserId) { + return this.contacts; + } + this.contacts = normalizeContacts(serverContacts); + this.loadedForUserId = requestUserId; + this.loadedAt = Date.now(); + if (!this.contacts.find(item => item.id === this.activeId)) { + this.activeId = this.contacts[0]?.id || ''; + } + } + window.setTimeout(() => { + if (serial !== this.refreshSerial || (0,_stores_session__WEBPACK_IMPORTED_MODULE_7__/* .useSessionStore */ .B)().userId !== requestUserId) { + return; + } + const latest = _services_imClient__WEBPACK_IMPORTED_MODULE_4__/* .imClient */ .wD.getContactList(false); + if (latest.length || !this.contacts.length) { + this.contacts = normalizeContacts(latest); + this.loadedForUserId = requestUserId; + this.loadedAt = Date.now(); + if (!this.contacts.find(item => item.id === this.activeId)) { + this.activeId = this.contacts[0]?.id || ''; + } + } + }, 1200); + return this.contacts; + })(); + try { + return await this.refreshPromise; + } finally { + if (serial === this.refreshSerial) { + this.loading = false; + this.refreshPromise = null; + } + } + }, + async addContact(keyword) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_7__/* .useSessionStore */ .B)(); + const value = String(keyword || '').trim(); + this.actionError = ''; + this.actionInfo = ''; + if (!session.userId) { + this.actionError = '请先登录'; + return false; + } + if (!value) { + this.actionError = '请输入用户ID、手机号或用户名'; + return false; + } + this.loading = true; + try { + const contact = await _services_imClient__WEBPACK_IMPORTED_MODULE_4__/* .imClient */ .wD.addContact(session.userId, value, '添加联系人'); + if (contact) { + this.contacts = normalizeContacts([...this.contacts, contact]); + this.activeId = contact.id; + } + this.actionInfo = '联系人已添加'; + await this.refreshContacts({ + force: true + }); + return true; + } catch (error) { + this.actionError = error.message || '添加联系人失败'; + return false; + } finally { + this.loading = false; + } + }, + async updateContactAlias(contactId, alias) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_7__/* .useSessionStore */ .B)(); + const targetId = String(contactId || '').trim(); + const nextAlias = String(alias || '').trim(); + this.actionError = ''; + this.actionInfo = ''; + if (!session.userId) { + this.actionError = '请先登录'; + return false; + } + if (!targetId) { + this.actionError = '缺少联系人ID'; + return false; + } + try { + const savedAlias = await _services_imClient__WEBPACK_IMPORTED_MODULE_4__/* .imClient */ .wD.updateContactAlias(session.userId, targetId, nextAlias); + this.contacts = normalizeContacts(this.contacts.map(item => { + if (item.uid !== targetId && item.id !== targetId) { + return item; + } + const rawUser = { + ...(item.rawUser || {}), + friendAlias: savedAlias + }; + const rawFriend = { + ...(item.rawFriend || {}), + alias: savedAlias + }; + const title = savedAlias || rawUser.displayName || rawUser.name || item.uid; + return { + ...item, + title, + avatarText: title.slice(0, 1).toUpperCase(), + alias: savedAlias, + rawFriend, + rawUser + }; + })); + this.loadedAt = Date.now(); + this.actionInfo = '备注名已修改'; + return true; + } catch (error) { + this.actionError = error.message || '备注名修改失败'; + return false; + } + }, + clearContacts() { + this.refreshSerial += 1; + this.contacts = []; + this.activeId = ''; + this.loading = false; + this.refreshPromise = null; + this.loadedForUserId = ''; + this.loadedAt = 0; + this.actionError = ''; + this.actionInfo = ''; + }, + setActiveContact(id) { + this.activeId = id; + }, + openChat(contact) { + if (!contact) { + return; + } + const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_5__/* .useConversationStore */ .w)(); + const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_6__/* .useNavigationStore */ .l)(); + const conversation = _services_imClient__WEBPACK_IMPORTED_MODULE_4__/* .imClient */ .wD.createSingleConversation(contact.uid, contact); + conversations.upsertConversation(conversation); + conversations.setActiveConversation(conversation.id); + navigation.showMessages(); + } + } +}); + +/***/ }), + +/***/ 3974: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _FavoritePanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5582); + + + +const __exports__ = _FavoritePanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 4834: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ B: function() { return /* binding */ useSessionStore; } +/* harmony export */ }); +/* harmony import */ var pinia__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9776); +/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6151); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9397); + + + +const STORAGE_KEY = 'qmt-web-im-session'; +function normalizeStoredPortrait(portrait) { + return portrait || ''; +} +function nextProfilePortrait(profilePortrait, currentPortrait) { + return normalizeStoredPortrait(profilePortrait) || normalizeStoredPortrait(currentPortrait); +} +const useSessionStore = (0,pinia__WEBPACK_IMPORTED_MODULE_2__/* .defineStore */ .nY)('session', { + state: () => ({ + isAuthenticated: false, + connecting: false, + connected: false, + connectionStatusText: '未连接', + userId: '', + token: '', + displayName: '', + portrait: '', + error: '', + sdkVersion: '', + eventsBound: false + }), + actions: { + restore() { + const raw = localStorage.getItem(STORAGE_KEY); + if (!raw) { + return; + } + try { + const session = JSON.parse(raw); + if (session.appServer !== _config__WEBPACK_IMPORTED_MODULE_1__/* .appConfig */ .U.appServer) { + localStorage.removeItem(STORAGE_KEY); + return; + } + if (session.userId && session.token) { + if (!session.clientId) { + localStorage.removeItem(STORAGE_KEY); + return; + } + this.userId = session.userId; + this.token = session.token; + this.displayName = session.displayName || session.userId; + this.portrait = normalizeStoredPortrait(session.portrait); + this.isAuthenticated = true; + _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.restoreClientId(session.clientId); + if (session.localOnly) { + this.connectionStatusText = '本地调试登录'; + } + this.connect(); + this.refreshProfile(); + } + } catch (error) { + localStorage.removeItem(STORAGE_KEY); + } + }, + async loginWithPassword(mobile, password) { + this.error = ''; + this.connecting = true; + try { + const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.loginWithPassword(mobile, password); + this.applyLoginResult(result); + await this.connect(); + } catch (error) { + this.error = error.message || '登录失败'; + } finally { + this.connecting = false; + } + }, + async loginWithCode(mobile, code) { + this.error = ''; + this.connecting = true; + try { + const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.loginWithCode(mobile, code); + this.applyLoginResult(result); + await this.connect(); + } catch (error) { + this.error = error.message || '登录失败'; + } finally { + this.connecting = false; + } + }, + async registerWithPhone(mobile, code) { + this.error = ''; + this.connecting = true; + try { + return await _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.registerWithPhone(mobile, code); + } catch (error) { + this.error = error.message || '注册失败'; + return null; + } finally { + this.connecting = false; + } + }, + applyLoginResult(result) { + this.userId = result.userId || result.uid || result.id || ''; + this.token = result.token || result.imToken || ''; + this.displayName = result.displayName || result.userName || result.name || this.userId; + this.portrait = normalizeStoredPortrait(result.portrait); + this.isAuthenticated = Boolean(this.userId && this.token); + if (result.localOnly) { + this.connectionStatusText = '本地调试登录'; + } + this.persistSession(Boolean(result.localOnly)); + }, + persistSession(localOnly = false) { + localStorage.setItem(STORAGE_KEY, JSON.stringify({ + userId: this.userId, + token: this.token, + displayName: this.displayName, + portrait: this.portrait, + clientId: _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.getClientId(), + localOnly, + appServer: _config__WEBPACK_IMPORTED_MODULE_1__/* .appConfig */ .U.appServer + })); + }, + applyProfile(profile) { + if (!profile) { + return; + } + this.userId = profile.userId || profile.uid || this.userId; + this.displayName = profile.displayName || profile.name || this.displayName || this.userId; + this.portrait = nextProfilePortrait(profile.portrait, this.portrait); + this.persistSession(); + }, + async refreshProfile() { + if (!this.userId) { + return null; + } + try { + const profile = await _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.getProfile(this.userId); + this.applyProfile(profile); + return profile; + } catch (error) { + return null; + } + }, + async saveProfile({ + displayName, + portraitFile + }) { + if (!this.userId) { + throw new Error('请先登录'); + } + const profile = await _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.updateProfile(this.userId, { + displayName, + portraitFile + }); + this.applyProfile(profile); + return profile; + }, + async changePassword({ + oldPassword, + newPassword + }) { + if (!this.userId) { + throw new Error('请先登录'); + } + await _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.changePassword({ + oldPassword, + newPassword + }); + return true; + }, + async resetPasswordWithCode({ + mobile, + resetCode, + newPassword + }) { + await _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.resetPasswordWithCode({ + mobile, + resetCode, + newPassword + }); + return true; + }, + async connect() { + if (!this.userId || !this.token) { + return; + } + await _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.ensureSdk(); + this.sdkVersion = _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.getSdkVersion(); + this.bindImEvents(); + await _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.connect(this.userId, this.token); + }, + bindImEvents() { + if (this.eventsBound) { + return; + } + this.eventsBound = true; + _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.on('connectionStatusChanged', status => { + this.connected = status.connected; + this.connectionStatusText = status.statusText || (status.connected ? '已连接' : '未连接'); + }); + }, + logout() { + _services_imClient__WEBPACK_IMPORTED_MODULE_0__/* .imClient */ .wD.disconnect(); + localStorage.removeItem(STORAGE_KEY); + this.$reset(); + } + } +}); + +/***/ }), + +/***/ 5161: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ E: function() { return /* binding */ LongConnectionImClient; } +/* harmony export */ }); +/* harmony import */ var core_js_modules_es_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2952); +/* harmony import */ var core_js_modules_es_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_buffer_detached_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_es_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6665); +/* harmony import */ var core_js_modules_es_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_buffer_transfer_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_es_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1961); +/* harmony import */ var core_js_modules_es_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_buffer_transfer_to_fixed_length_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(3741); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(680); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(793); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(9397); +/* harmony import */ var _httpImClient__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(3063); + + + + + + + + + +const HEARTBEAT_INTERVAL_MS = 25000; +const RECONNECT_MIN_MS = 1000; +const RECONNECT_MAX_MS = 15000; +function buildWsUrl() { + if (_config__WEBPACK_IMPORTED_MODULE_7__/* .appConfig */ .U.wsUrl) { + return _config__WEBPACK_IMPORTED_MODULE_7__/* .appConfig */ .U.wsUrl; + } + const protocol = _config__WEBPACK_IMPORTED_MODULE_7__/* .appConfig */ .U.useWss ? 'wss' : 'ws'; + const host = _config__WEBPACK_IMPORTED_MODULE_7__/* .appConfig */ .U.imServerHost || window.location.hostname; + const port = _config__WEBPACK_IMPORTED_MODULE_7__/* .appConfig */ .U.imRoutePort ? `:${_config__WEBPACK_IMPORTED_MODULE_7__/* .appConfig */ .U.imRoutePort}` : ''; + const path = _config__WEBPACK_IMPORTED_MODULE_7__/* .appConfig */ .U.wsPath?.startsWith('/') ? _config__WEBPACK_IMPORTED_MODULE_7__/* .appConfig */ .U.wsPath : `/${_config__WEBPACK_IMPORTED_MODULE_7__/* .appConfig */ .U.wsPath || 'ws'}`; + return `${protocol}://${host}${port}${path}`; +} +function normalizeConversationId(payload) { + const target = payload.target || payload.to || payload.receiver || payload.conversationTarget || payload.from || payload.sender; + return payload.conversationId || (target ? `single-${target}` : ''); +} +function normalizeIncomingMessage(payload, currentUserId) { + const item = payload.message || payload; + const from = item.from || item.sender || item.fromUser || ''; + const target = item.target || item.to || item.receiver || ''; + const direction = from && String(from) === String(currentUserId) ? 'out' : 'in'; + const conversationId = item.conversationId || normalizeConversationId({ + ...item, + target: direction === 'out' ? target : from + }); + if (!conversationId) { + return null; + } + const status = item.status || item.deliveryStatus || 'sent'; + return { + id: item.id || item.messageId || item.messageUid || `${Date.now()}${Math.random().toString(16).slice(2)}`, + messageUid: item.messageUid || item.uid || item.messageId || '', + conversationId, + from, + target, + direction, + type: item.type || 'text', + text: item.text || item.content || item.searchableContent || '', + status, + deliveryStatus: item.deliveryStatus || (direction === 'out' ? status : ''), + timestamp: Number(item.timestamp || item.serverTimestamp || Date.now()), + displayTimestamp: Number(item.displayTimestamp || item.timestamp || item.serverTimestamp || Date.now()), + raw: item + }; +} +class LongConnectionImClient extends _httpImClient__WEBPACK_IMPORTED_MODULE_8__/* .HttpImClient */ .Y { + constructor() { + super(); + this.socket = null; + this.wsUrl = buildWsUrl(); + this.heartbeatTimer = null; + this.reconnectTimer = null; + this.reconnectAttempts = 0; + this.manualClose = false; + } + getSdkVersion() { + return 'JC-LC/0.1'; + } + shouldUseMessagePolling() { + return !this.connected; + } + async ensureSdk() { + if (typeof WebSocket === 'undefined') { + throw new Error('当前浏览器不支持 WebSocket 长连接'); + } + return true; + } + connect(userId, token) { + this.currentUser = { + userId, + token + }; + this.manualClose = false; + this.openSocket(); + } + disconnect() { + this.manualClose = true; + this.clearReconnectTimer(); + this.clearHeartbeatTimer(); + if (this.socket) { + this.socket.close(); + this.socket = null; + } + super.disconnect(); + } + openSocket() { + if (this.socket?.readyState === WebSocket.OPEN) { + this.sendAuthFrame(); + return; + } + if (this.socket?.readyState === WebSocket.CONNECTING) { + return; + } + this.emit('connectionStatusChanged', { + connected: false, + statusText: '长连接连接中' + }); + try { + this.socket = new WebSocket(this.wsUrl); + this.socket.binaryType = 'arraybuffer'; + } catch (error) { + this.emit('connectionStatusChanged', { + connected: false, + statusText: '长连接创建失败,使用HTTP补偿' + }); + this.scheduleReconnect(); + return; + } + this.socket.onopen = () => { + this.connected = true; + this.reconnectAttempts = 0; + this.emit('connectionStatusChanged', { + connected: true, + statusText: '长连接已连接' + }); + this.sendAuthFrame(); + this.startHeartbeat(); + this.refreshConversationList(); + }; + this.socket.onmessage = event => { + this.handleFrame(event.data); + }; + this.socket.onerror = () => { + this.emit('connectionStatusChanged', { + connected: false, + statusText: '长连接异常,使用HTTP补偿' + }); + }; + this.socket.onclose = () => { + this.connected = false; + this.clearHeartbeatTimer(); + this.socket = null; + if (this.manualClose) { + return; + } + this.emit('connectionStatusChanged', { + connected: false, + statusText: '长连接重连中' + }); + this.scheduleReconnect(); + }; + } + sendAuthFrame() { + this.sendFrame({ + type: 'auth', + userId: this.currentUser?.userId || '', + token: this.currentUser?.token || '', + clientId: this.getClientId(), + platform: _config__WEBPACK_IMPORTED_MODULE_7__/* .appConfig */ .U.platform, + timestamp: Date.now() + }); + } + sendFrame(frame) { + if (this.socket?.readyState !== WebSocket.OPEN) { + return false; + } + this.socket.send(JSON.stringify(frame)); + return true; + } + handleFrame(rawData) { + if (rawData instanceof ArrayBuffer) { + this.emit('rawFrameReceived', rawData); + return; + } + let payload; + try { + payload = typeof rawData === 'string' ? JSON.parse(rawData) : rawData; + } catch (error) { + return; + } + const type = payload.type || payload.event || payload.cmd || ''; + if (type === 'pong' || type === 'auth_ok' || type === 'connected') { + return; + } + if (type === 'contactsChanged') { + this.emit('contactsChanged', payload.contacts || []); + return; + } + if (type === 'conversationsChanged') { + this.emit('conversationsChanged', payload.conversations || []); + return; + } + if (type === 'messages' && Array.isArray(payload.messages)) { + payload.messages.map(message => normalizeIncomingMessage(message, this.currentUser?.userId)).filter(Boolean).forEach(message => this.emit('messageReceived', message)); + return; + } + const message = normalizeIncomingMessage(payload, this.currentUser?.userId); + if (message) { + this.emit(message.direction === 'out' ? 'messageStatusChanged' : 'messageReceived', message); + } + } + startHeartbeat() { + this.clearHeartbeatTimer(); + this.heartbeatTimer = window.setInterval(() => { + this.sendFrame({ + type: 'ping', + timestamp: Date.now() + }); + }, HEARTBEAT_INTERVAL_MS); + } + clearHeartbeatTimer() { + if (this.heartbeatTimer) { + window.clearInterval(this.heartbeatTimer); + this.heartbeatTimer = null; + } + } + scheduleReconnect() { + this.clearReconnectTimer(); + const delay = Math.min(RECONNECT_MAX_MS, RECONNECT_MIN_MS * 2 ** this.reconnectAttempts); + this.reconnectAttempts += 1; + this.reconnectTimer = window.setTimeout(() => { + this.openSocket(); + }, delay); + } + clearReconnectTimer() { + if (this.reconnectTimer) { + window.clearTimeout(this.reconnectTimer); + this.reconnectTimer = null; + } + } +} + +/***/ }), + +/***/ 5242: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_ConversationList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_ConversationList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8838); + + +/***/ }), + +/***/ 5282: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_MessageList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_MessageList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(542); + + +/***/ }), + +/***/ 5326: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4912); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(4546); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7987); +/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3842); + + + +const _hoisted_1 = { + class: "conversation-list favorite-list" +}; +const _hoisted_2 = { + class: "list-header" +}; +const _hoisted_3 = { + class: "sidebar-scroll" +}; +const _hoisted_4 = ["onClick"]; +const _hoisted_5 = { + class: "favorite-item-main" +}; +const _hoisted_6 = { + key: 0, + class: "empty-list" +}; + + +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'FavoriteList', + setup(__props) { + const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_2__/* .useConversationStore */ .w)(); + const activeKey = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .computed */ .EW)(() => conversations.activeFavorite?.key || ''); + function favoriteTitle(item) { + if (item.conversationTitle) { + return item.conversationTitle; + } + const conversation = conversations.conversations.find(entry => entry.id === item.conversationId); + return conversation?.title || item.conversationId || '未知会话'; + } + function favoritePreview(item) { + if (item.recalled) { + return `[${item.recallStatus || '已撤回'}]`; + } + if (item.preview) { + return item.preview; + } + if (item.text) { + return item.text; + } + if (item.type === 'image') { + return '[图片]'; + } + if (item.type === 'file') { + return `[文件] ${item.attachment?.name || '文件'}`; + } + return '(无文字内容)'; + } + function formatFavoriteTime(timestamp) { + const value = Number(timestamp || 0); + if (!value) { + return ''; + } + return new Intl.DateTimeFormat('zh-CN', { + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + hour12: false + }).format(value); + } + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("aside", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("header", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", null, [_cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("h2", null, "收藏", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_5__/* .unref */ .R1)(conversations).favoriteMessages.length) + " 条消息", 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", _hoisted_3, [((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_3__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .renderList */ .pI)((0,vue__WEBPACK_IMPORTED_MODULE_5__/* .unref */ .R1)(conversations).favoriteMessages, item => { + return (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("button", { + key: item.key, + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .normalizeClass */ .C4)(["favorite-item", { + active: activeKey.value === item.key + }]), + onClick: $event => (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .unref */ .R1)(conversations).setActiveFavorite(item.key) + }, [_cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", { + class: "favorite-item-icon" + }, "★", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(favoriteTitle(item)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(favoritePreview(item)), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("time", null, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(formatFavoriteTime(item.timestamp)), 1)], 10, _hoisted_4); + }), 128)), !(0,vue__WEBPACK_IMPORTED_MODULE_5__/* .unref */ .R1)(conversations).favoriteMessages.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("div", _hoisted_6, " 暂无收藏消息 ")) : (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createCommentVNode */ .Q3)("", true)])]); + }; + } +}); + +/***/ }), + +/***/ 5399: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_NavigationRail_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_NavigationRail_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8691); + + +/***/ }), + +/***/ 5582: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FavoritePanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_FavoritePanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1362); + + +/***/ }), + +/***/ 6024: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _App_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(138); + + + +const __exports__ = _App_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 6151: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ wD: function() { return /* binding */ imClient; } +/* harmony export */ }); +/* unused harmony export WildfireImClient */ +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9397); +/* harmony import */ var _httpImClient__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3063); +/* harmony import */ var _longConnectionImClient__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5161); + + + +class UnsupportedWildfireImClient { + constructor() { + throw new Error('当前本地社区版 Web 客户端未启用 WildFire Web SDK'); + } +} +const imClient = _config__WEBPACK_IMPORTED_MODULE_0__/* .appConfig */ .U.sdkMode === 'wildfire' ? new UnsupportedWildfireImClient() : _config__WEBPACK_IMPORTED_MODULE_0__/* .appConfig */ .U.sdkMode === 'custom-ws' || _config__WEBPACK_IMPORTED_MODULE_0__/* .appConfig */ .U.sdkMode === 'long' ? new _longConnectionImClient__WEBPACK_IMPORTED_MODULE_2__/* .LongConnectionImClient */ .E() : new _httpImClient__WEBPACK_IMPORTED_MODULE_1__/* .HttpImClient */ .Y(); + + +/***/ }), + +/***/ 6277: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _ChatPanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2857); + + + +const __exports__ = _ChatPanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 6804: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_MessageComposer_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_MessageComposer_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1648); + + +/***/ }), + +/***/ 6942: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _LoginView_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8658); + + + +const __exports__ = _LoginView_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 8048: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _ConversationList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5242); + + + +const __exports__ = _ConversationList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 8218: +/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) { + +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1857); +/* harmony import */ var pinia__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9776); +/* harmony import */ var _App_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6024); + + + + +(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createApp */ .Ef)(_App_vue__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A).use((0,pinia__WEBPACK_IMPORTED_MODULE_2__/* .createPinia */ .Ey)()).mount('#app'); + +/***/ }), + +/***/ 8314: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _ContactPanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8322); + + + +const __exports__ = _ContactPanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 8322: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_ContactPanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_ContactPanel_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(262); + + +/***/ }), + +/***/ 8446: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(7987); +/* harmony import */ var _sidebar_NavigationRail_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1920); +/* harmony import */ var _sidebar_ConversationList_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8048); +/* harmony import */ var _sidebar_ContactList_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2699); +/* harmony import */ var _chat_ChatPanel_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6277); +/* harmony import */ var _contacts_ContactPanel_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8314); +/* harmony import */ var _favorites_FavoriteList_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(8624); +/* harmony import */ var _favorites_FavoritePanel_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(3974); +/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(3842); +/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(1050); +/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(3865); + +const _hoisted_1 = { + class: "app-shell" +}; + + + + + + + + + + + +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'ChatShell', + setup(__props) { + const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_7__/* .useConversationStore */ .w)(); + const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_8__/* .useNavigationStore */ .l)(); + const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_9__/* .useContactStore */ .p)(); + (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .onMounted */ .sV)(() => { + conversations.refreshRemoteConversations(); + contacts.refreshContacts(); + }); + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .createElementBlock */ .CE)("main", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_10__/* .createVNode */ .bF)(_sidebar_NavigationRail_vue__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A), (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .unref */ .R1)(navigation).section === 'messages' ? ((0,vue__WEBPACK_IMPORTED_MODULE_10__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .createBlock */ .Wv)(_sidebar_ConversationList_vue__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, { + key: 0 + })) : (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .unref */ .R1)(navigation).section === 'favorites' ? ((0,vue__WEBPACK_IMPORTED_MODULE_10__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .createBlock */ .Wv)(_favorites_FavoriteList_vue__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A, { + key: 1 + })) : ((0,vue__WEBPACK_IMPORTED_MODULE_10__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .createBlock */ .Wv)(_sidebar_ContactList_vue__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A, { + key: 2 + })), (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .unref */ .R1)(navigation).section === 'messages' ? ((0,vue__WEBPACK_IMPORTED_MODULE_10__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .createBlock */ .Wv)(_chat_ChatPanel_vue__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A, { + key: 3 + })) : (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .unref */ .R1)(navigation).section === 'favorites' ? ((0,vue__WEBPACK_IMPORTED_MODULE_10__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .createBlock */ .Wv)(_favorites_FavoritePanel_vue__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, { + key: 4 + })) : ((0,vue__WEBPACK_IMPORTED_MODULE_10__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .createBlock */ .Wv)(_contacts_ContactPanel_vue__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .A, { + key: 5 + }))]); + }; + } +}); + +/***/ }), + +/***/ 8624: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _FavoriteList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2122); + + + +const __exports__ = _FavoriteList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 8658: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* reexport safe */ _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_LoginView_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__.A; } +/* harmony export */ }); +/* harmony import */ var _im_web_node_modules_thread_loader_dist_cjs_js_im_web_node_modules_babel_loader_lib_index_js_clonedRuleSet_40_use_1_im_web_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_LoginView_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(9502); + + +/***/ }), + +/***/ 8691: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4912); +/* harmony import */ var core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9130); +/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8937); +/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8636); +/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(7987); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(4546); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(1857); +/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(4834); +/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1050); +/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(3865); + + + + + + +const _hoisted_1 = { + class: "navigation-rail" +}; +const _hoisted_2 = ["src"]; +const _hoisted_3 = { + key: 1 +}; +const _hoisted_4 = { + class: "settings-panel" +}; +const _hoisted_5 = { + class: "settings-layout" +}; +const _hoisted_6 = { + class: "settings-menu", + "aria-label": "设置菜单" +}; +const _hoisted_7 = ["onClick"]; +const _hoisted_8 = { + key: 0 +}; +const _hoisted_9 = { + key: 0, + class: "inline-save-status" +}; +const _hoisted_10 = { + key: 1, + class: "inline-save-status error" +}; +const _hoisted_11 = ["disabled"]; +const _hoisted_12 = { + key: 1, + class: "settings-placeholder" +}; +const _hoisted_13 = { + class: "profile-avatar-field" +}; +const _hoisted_14 = ["src"]; +const _hoisted_15 = { + key: 1 +}; +const _hoisted_16 = ["value"]; +const _hoisted_17 = { + class: "modal-actions" +}; +const _hoisted_18 = { + key: 0, + class: "inline-save-status" +}; +const _hoisted_19 = { + key: 1, + class: "inline-save-status error" +}; +const _hoisted_20 = ["disabled"]; +const _hoisted_21 = { + class: "avatar-preview-dialog" +}; +const _hoisted_22 = { + class: "avatar-preview-actions" +}; +const _hoisted_23 = ["src"]; +const _hoisted_24 = { + class: "modal-panel avatar-cropper-panel" +}; +const _hoisted_25 = { + class: "avatar-cropper-header-actions" +}; +const _hoisted_26 = ["disabled"]; +const _hoisted_27 = { + class: "avatar-cropper-layout" +}; +const _hoisted_28 = { + key: 0, + class: "avatar-cropper-placeholder" +}; +const _hoisted_29 = { + class: "avatar-cropper-controls" +}; +const _hoisted_30 = { + class: "avatar-cropper-tools" +}; +const _hoisted_31 = { + class: "avatar-cropper-preview" +}; +const _hoisted_32 = { + key: 0, + class: "inline-save-status error" +}; +const _hoisted_33 = ["disabled"]; +const _hoisted_34 = ["disabled"]; + + + + +const CROP_OUTPUT_SIZE = 512; +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'NavigationRail', + setup(__props) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_5__/* .useSessionStore */ .B)(); + const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_6__/* .useNavigationStore */ .l)(); + const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_7__/* .useContactStore */ .p)(); + const settingsItems = [{ + key: 'notifications', + label: '通知设置' + }, { + key: 'password', + label: '更改密码' + }, { + key: 'wallet', + label: '钱包管理' + }, { + key: 'language', + label: '切换语言' + }, { + key: 'feedback', + label: '问题反馈' + }]; + const initials = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .computed */ .EW)(() => (session.displayName || session.userId || 'Q').slice(0, 1).toUpperCase()); + const settingsOpen = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(false); + const settingsSection = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)('password'); + const passwordSaving = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(false); + const settingsNotice = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(''); + const settingsError = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(''); + const profileOpen = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(false); + const profileSaving = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(false); + const profileNotice = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(''); + const profileError = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(''); + const profileFile = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(null); + const profilePreview = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(''); + const portraitInput = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(null); + const cropperCanvas = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(null); + const cropperPreviewCanvas = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(null); + const profileDraft = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)({ + displayName: '' + }); + const passwordDraft = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .reactive */ .Kh)({ + oldPassword: '', + newPassword: '', + confirmPassword: '' + }); + const currentAvatarUrl = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .computed */ .EW)(() => profilePreview.value || session.portrait || ''); + const activeSettingsItem = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .computed */ .EW)(() => settingsItems.find(item => item.key === settingsSection.value) || settingsItems[0]); + const avatarPreviewViewer = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .reactive */ .Kh)({ + open: false, + url: '', + scale: 1, + offsetX: 0, + offsetY: 0, + dragging: false, + dragStartX: 0, + dragStartY: 0, + dragOffsetX: 0, + dragOffsetY: 0 + }); + const avatarCropper = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .reactive */ .Kh)({ + open: false, + loaded: false, + busy: false, + error: '', + objectUrl: '', + fileName: 'avatar.jpg', + image: null, + baseScale: 1, + scale: 1, + rotation: 0, + offsetX: 0, + offsetY: 0, + dragging: false, + dragStartX: 0, + dragStartY: 0, + dragOffsetX: 0, + dragOffsetY: 0 + }); + const avatarPreviewStyle = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .computed */ .EW)(() => ({ + transform: `translate3d(${avatarPreviewViewer.offsetX}px, ${avatarPreviewViewer.offsetY}px, 0) scale(${avatarPreviewViewer.scale})` + })); + (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .onMounted */ .sV)(() => { + session.refreshProfile(); + window.addEventListener('resize', drawAvatarCropper); + }); + (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .onBeforeUnmount */ .xo)(() => { + revokeProfilePreview(); + closeAvatarCropper(); + window.removeEventListener('resize', drawAvatarCropper); + }); + function showContacts() { + navigation.showContacts(); + contacts.refreshContacts(); + } + function clearProfileFeedback() { + profileNotice.value = ''; + profileError.value = ''; + } + function clearSettingsFeedback() { + settingsNotice.value = ''; + settingsError.value = ''; + } + function resetPasswordDraft() { + passwordDraft.oldPassword = ''; + passwordDraft.newPassword = ''; + passwordDraft.confirmPassword = ''; + } + function openSettings() { + settingsOpen.value = true; + settingsSection.value = 'password'; + clearSettingsFeedback(); + } + function closeSettings() { + if (passwordSaving.value) { + return; + } + settingsOpen.value = false; + clearSettingsFeedback(); + resetPasswordDraft(); + } + function selectSettingsSection(section) { + settingsSection.value = section; + clearSettingsFeedback(); + } + function revokeProfilePreview() { + if (profilePreview.value) { + URL.revokeObjectURL(profilePreview.value); + profilePreview.value = ''; + } + } + function revokeCropperObjectUrl() { + if (avatarCropper.objectUrl) { + URL.revokeObjectURL(avatarCropper.objectUrl); + avatarCropper.objectUrl = ''; + } + } + async function openProfileEditor() { + profileOpen.value = true; + clearProfileFeedback(); + profileDraft.value.displayName = session.displayName || session.userId || ''; + const profile = await session.refreshProfile(); + if (profileOpen.value && profile) { + profileDraft.value.displayName = session.displayName || session.userId || ''; + } + } + function closeProfileEditor() { + profileOpen.value = false; + profileFile.value = null; + clearProfileFeedback(); + revokeProfilePreview(); + closeAvatarPreview(); + closeAvatarCropper(); + } + function selectPortrait(event) { + const file = event.target.files?.[0] || null; + event.target.value = ''; + clearProfileFeedback(); + if (file) { + openAvatarCropper(file); + } + } + function choosePortraitFile() { + portraitInput.value?.click(); + } + function openAvatarPreview() { + if (!currentAvatarUrl.value) { + return; + } + avatarPreviewViewer.open = true; + avatarPreviewViewer.url = currentAvatarUrl.value; + resetAvatarPreview(); + } + function closeAvatarPreview() { + avatarPreviewViewer.open = false; + avatarPreviewViewer.dragging = false; + } + function resetAvatarPreview() { + avatarPreviewViewer.scale = 1; + avatarPreviewViewer.offsetX = 0; + avatarPreviewViewer.offsetY = 0; + } + function zoomAvatarPreview(factor) { + avatarPreviewViewer.scale = Math.max(0.5, Math.min(6, Number((avatarPreviewViewer.scale * factor).toFixed(2)))); + if (avatarPreviewViewer.scale <= 1) { + avatarPreviewViewer.offsetX = 0; + avatarPreviewViewer.offsetY = 0; + } + } + function handleAvatarPreviewWheel(event) { + zoomAvatarPreview(event.deltaY < 0 ? 1.12 : 1 / 1.12); + } + function startAvatarPreviewDrag(event) { + if (avatarPreviewViewer.scale <= 1) { + return; + } + avatarPreviewViewer.dragging = true; + avatarPreviewViewer.dragStartX = event.clientX; + avatarPreviewViewer.dragStartY = event.clientY; + avatarPreviewViewer.dragOffsetX = avatarPreviewViewer.offsetX; + avatarPreviewViewer.dragOffsetY = avatarPreviewViewer.offsetY; + event.currentTarget.setPointerCapture?.(event.pointerId); + } + function moveAvatarPreviewDrag(event) { + if (!avatarPreviewViewer.dragging) { + return; + } + avatarPreviewViewer.offsetX = avatarPreviewViewer.dragOffsetX + event.clientX - avatarPreviewViewer.dragStartX; + avatarPreviewViewer.offsetY = avatarPreviewViewer.dragOffsetY + event.clientY - avatarPreviewViewer.dragStartY; + } + function stopAvatarPreviewDrag() { + avatarPreviewViewer.dragging = false; + } + function dropPortrait(event) { + const file = Array.from(event.dataTransfer?.files || []).find(item => item.type.startsWith('image/')); + if (file) { + clearProfileFeedback(); + openAvatarCropper(file); + } + } + function cropperStageSize() { + const canvas = cropperCanvas.value; + const rect = canvas?.getBoundingClientRect(); + const width = Math.max(280, Math.round(rect?.width || 360)); + const height = Math.max(280, Math.round(rect?.height || 360)); + return { + width, + height + }; + } + function cropperBoxSize() { + const { + width, + height + } = cropperStageSize(); + return Math.round(Math.min(width, height) * 0.74); + } + function rotatedImageSize() { + const image = avatarCropper.image; + if (!image) { + return { + width: 1, + height: 1 + }; + } + const quarterTurn = Math.abs(avatarCropper.rotation % 180) === 90; + return { + width: quarterTurn ? image.naturalHeight : image.naturalWidth, + height: quarterTurn ? image.naturalWidth : image.naturalHeight + }; + } + function clampCropperOffset() { + const cropSize = cropperBoxSize(); + const rotated = rotatedImageSize(); + const scaledWidth = rotated.width * avatarCropper.scale; + const scaledHeight = rotated.height * avatarCropper.scale; + const maxX = Math.max(0, (scaledWidth - cropSize) / 2); + const maxY = Math.max(0, (scaledHeight - cropSize) / 2); + avatarCropper.offsetX = Math.max(-maxX, Math.min(maxX, avatarCropper.offsetX)); + avatarCropper.offsetY = Math.max(-maxY, Math.min(maxY, avatarCropper.offsetY)); + } + function updateCropperBaseScale() { + const cropSize = cropperBoxSize(); + const rotated = rotatedImageSize(); + avatarCropper.baseScale = Math.max(cropSize / rotated.width, cropSize / rotated.height); + avatarCropper.scale = Math.max(avatarCropper.baseScale, avatarCropper.scale || avatarCropper.baseScale); + } + function drawCanvasImage(canvas, width, height, outputScale = 1, cropOnly = false) { + const image = avatarCropper.image; + if (!canvas || !image) { + return; + } + const dpr = cropOnly ? 1 : window.devicePixelRatio || 1; + canvas.width = Math.round(width * dpr); + canvas.height = Math.round(height * dpr); + const context = canvas.getContext('2d'); + context.setTransform(dpr, 0, 0, dpr, 0, 0); + context.clearRect(0, 0, width, height); + context.fillStyle = '#eef4f7'; + context.fillRect(0, 0, width, height); + context.save(); + context.translate(width / 2 + avatarCropper.offsetX * outputScale, height / 2 + avatarCropper.offsetY * outputScale); + context.rotate(avatarCropper.rotation * Math.PI / 180); + context.scale(avatarCropper.scale * outputScale, avatarCropper.scale * outputScale); + context.drawImage(image, -image.naturalWidth / 2, -image.naturalHeight / 2); + context.restore(); + if (!cropOnly) { + const cropSize = cropperBoxSize(); + context.save(); + context.fillStyle = 'rgba(10, 18, 30, 0.42)'; + context.beginPath(); + context.rect(0, 0, width, height); + context.rect((width - cropSize) / 2, (height - cropSize) / 2, cropSize, cropSize); + context.fill('evenodd'); + context.restore(); + } + } + function drawAvatarCropper() { + if (!avatarCropper.open || !avatarCropper.loaded) { + return; + } + clampCropperOffset(); + const { + width, + height + } = cropperStageSize(); + drawCanvasImage(cropperCanvas.value, width, height); + const previewCanvas = cropperPreviewCanvas.value; + if (previewCanvas) { + drawCanvasImage(previewCanvas, 108, 108, 108 / cropperBoxSize(), true); + } + } + function resetCropperTransform() { + if (!avatarCropper.image) { + return; + } + avatarCropper.rotation = 0; + avatarCropper.offsetX = 0; + avatarCropper.offsetY = 0; + updateCropperBaseScale(); + avatarCropper.scale = avatarCropper.baseScale; + drawAvatarCropper(); + } + function openAvatarCropper(file) { + if (!file.type.startsWith('image/')) { + profileError.value = '请选择图片文件'; + return; + } + if (file.size > 8 * 1024 * 1024) { + profileError.value = '头像图片不能超过8MB'; + return; + } + closeAvatarCropper(); + avatarCropper.open = true; + avatarCropper.loaded = false; + avatarCropper.error = ''; + avatarCropper.fileName = file.name || 'avatar.jpg'; + avatarCropper.objectUrl = URL.createObjectURL(file); + const image = new Image(); + image.onload = () => { + avatarCropper.image = image; + avatarCropper.loaded = true; + (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .nextTick */ .dY)(resetCropperTransform); + }; + image.onerror = () => { + avatarCropper.error = '图片加载失败'; + avatarCropper.loaded = false; + }; + image.src = avatarCropper.objectUrl; + } + function closeAvatarCropper() { + avatarCropper.open = false; + avatarCropper.loaded = false; + avatarCropper.busy = false; + avatarCropper.error = ''; + avatarCropper.image = null; + avatarCropper.dragging = false; + revokeCropperObjectUrl(); + } + function zoomCropper(factor) { + if (!avatarCropper.loaded) { + return; + } + updateCropperBaseScale(); + avatarCropper.scale = Math.max(avatarCropper.baseScale, Math.min(avatarCropper.baseScale * 6, avatarCropper.scale * factor)); + drawAvatarCropper(); + } + function rotateCropper(degrees) { + if (!avatarCropper.loaded) { + return; + } + avatarCropper.rotation = (avatarCropper.rotation + degrees + 360) % 360; + updateCropperBaseScale(); + clampCropperOffset(); + drawAvatarCropper(); + } + function handleCropperWheel(event) { + zoomCropper(event.deltaY < 0 ? 1.08 : 1 / 1.08); + } + function startCropperDrag(event) { + if (!avatarCropper.loaded) { + return; + } + avatarCropper.dragging = true; + avatarCropper.dragStartX = event.clientX; + avatarCropper.dragStartY = event.clientY; + avatarCropper.dragOffsetX = avatarCropper.offsetX; + avatarCropper.dragOffsetY = avatarCropper.offsetY; + event.currentTarget.setPointerCapture?.(event.pointerId); + } + function moveCropperDrag(event) { + if (!avatarCropper.dragging) { + return; + } + avatarCropper.offsetX = avatarCropper.dragOffsetX + event.clientX - avatarCropper.dragStartX; + avatarCropper.offsetY = avatarCropper.dragOffsetY + event.clientY - avatarCropper.dragStartY; + drawAvatarCropper(); + } + function stopCropperDrag() { + avatarCropper.dragging = false; + } + function canvasToBlob(canvas, type = 'image/jpeg', quality = 0.9) { + return new Promise((resolve, reject) => { + canvas.toBlob(blob => { + if (blob) { + resolve(blob); + } else { + reject(new Error('头像裁切失败')); + } + }, type, quality); + }); + } + async function confirmAvatarCrop() { + if (!avatarCropper.loaded || avatarCropper.busy) { + return; + } + avatarCropper.busy = true; + avatarCropper.error = ''; + try { + const outputCanvas = document.createElement('canvas'); + drawCanvasImage(outputCanvas, CROP_OUTPUT_SIZE, CROP_OUTPUT_SIZE, CROP_OUTPUT_SIZE / cropperBoxSize(), true); + const blob = await canvasToBlob(outputCanvas); + const fileName = avatarCropper.fileName.replace(/\.[^.]+$/, '') || 'avatar'; + const croppedFile = new File([blob], `${fileName}.jpg`, { + type: 'image/jpeg' + }); + profileFile.value = croppedFile; + revokeProfilePreview(); + profilePreview.value = URL.createObjectURL(croppedFile); + closeAvatarCropper(); + } catch (error) { + avatarCropper.error = error.message || '头像裁切失败'; + } finally { + avatarCropper.busy = false; + } + } + async function saveProfile() { + if (profileSaving.value || !profileDraft.value.displayName) { + return; + } + clearProfileFeedback(); + profileSaving.value = true; + try { + await session.saveProfile({ + displayName: profileDraft.value.displayName, + portraitFile: profileFile.value + }); + profileFile.value = null; + revokeProfilePreview(); + profileNotice.value = '资料已保存'; + contacts.refreshContacts({ + force: true + }); + } catch (error) { + profileError.value = error.message || '资料保存失败'; + } finally { + profileSaving.value = false; + } + } + async function savePassword() { + if (passwordSaving.value) { + return; + } + clearSettingsFeedback(); + const oldPassword = passwordDraft.oldPassword; + const newPassword = passwordDraft.newPassword; + const confirmPassword = passwordDraft.confirmPassword; + if (!oldPassword || !newPassword || !confirmPassword) { + settingsError.value = '请填写完整密码'; + return; + } + if (newPassword !== confirmPassword) { + settingsError.value = '两次输入的新密码不一致'; + return; + } + if (oldPassword === newPassword) { + settingsError.value = '新密码不能和当前密码相同'; + return; + } + passwordSaving.value = true; + try { + await session.changePassword({ + oldPassword, + newPassword + }); + resetPasswordDraft(); + settingsNotice.value = '密码已更新'; + } catch (error) { + settingsError.value = error.message || '密码修改失败'; + } finally { + passwordSaving.value = false; + } + } + function logout() { + closeSettings(); + contacts.clearContacts(); + session.logout(); + } + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_8__/* .Fragment */ .FK, null, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("aside", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "rail-avatar rail-avatar-button", + title: "编辑个人资料", + onClick: openProfileEditor + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .unref */ .R1)(session).portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("img", { + key: 0, + src: (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .unref */ .R1)(session).portrait, + alt: "" + }, null, 8, _hoisted_2)) : ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("span", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(initials.value), 1))]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)(["rail-button", { + active: (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .unref */ .R1)(navigation).section === 'messages' + }]), + title: "消息", + onClick: _cache[0] || (_cache[0] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .unref */ .R1)(navigation).showMessages && (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .unref */ .R1)(navigation).showMessages(...args)) + }, "💬", 2), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)(["rail-button", { + active: (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .unref */ .R1)(navigation).section === 'contacts' + }]), + title: "联系人", + onClick: showContacts + }, "👥", 2), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)(["rail-button", { + active: (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .unref */ .R1)(navigation).section === 'favorites' + }]), + title: "收藏", + onClick: _cache[1] || (_cache[1] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .unref */ .R1)(navigation).showFavorites && (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .unref */ .R1)(navigation).showFavorites(...args)) + }, "☆", 2), _cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", { + class: "rail-spacer" + }, null, -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + class: "rail-button", + title: "设置", + "aria-label": "设置", + onClick: openSettings + }, _cache[13] || (_cache[13] = [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("svg", { + viewBox: "0 0 24 24", + "aria-hidden": "true" + }, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("path", { + d: "M12 8.2a3.8 3.8 0 1 1 0 7.6 3.8 3.8 0 0 1 0-7.6Z" + }), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("path", { + d: "M19.4 13.6a7.8 7.8 0 0 0 .1-1.6l1.7-1.3-1.7-3-2 .8a8 8 0 0 0-1.4-.8L15.8 5h-3.5l-.3 2.1a8 8 0 0 0-1.5.8l-1.9-.8-1.8 3 1.7 1.3a7.8 7.8 0 0 0 0 1.6l-1.7 1.3 1.8 3 1.9-.8c.5.4 1 .7 1.5.8l.3 2.1h3.5l.3-2.1c.5-.2 1-.5 1.4-.8l2 .8 1.7-3-1.8-1.3Z" + })], -1)])), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + class: "rail-button rail-logout-button", + title: "退出登录", + "aria-label": "退出登录", + onClick: logout + }, _cache[14] || (_cache[14] = [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createStaticVNode */ .Fv)("", 1)]))]), settingsOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("div", { + key: 0, + class: "modal-backdrop settings-backdrop", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(closeSettings, ["self"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("section", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("header", null, [_cache[16] || (_cache[16] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("strong", null, "设置", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeSettings + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("nav", _hoisted_6, [((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_8__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .renderList */ .pI)(settingsItems, item => { + return (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + key: item.key, + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)({ + active: settingsSection.value === item.key + }), + onClick: $event => selectSettingsSection(item.key) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(item.label), 1), item.key !== 'password' ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("small", _hoisted_8, "稍后开放")) : (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createCommentVNode */ .Q3)("", true)], 10, _hoisted_7); + }), 64))]), settingsSection.value === 'password' ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("form", { + key: 0, + class: "settings-password-form", + onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(savePassword, ["prevent"]) + }, [_cache[20] || (_cache[20] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("h3", null, "更改密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("label", null, [_cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("span", null, "当前密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => passwordDraft.oldPassword = $event), + type: "password", + autocomplete: "current-password" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_11__/* .vModelText */ .Jo, passwordDraft.oldPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("label", null, [_cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("span", null, "新密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[3] || (_cache[3] = $event => passwordDraft.newPassword = $event), + type: "password", + autocomplete: "new-password" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_11__/* .vModelText */ .Jo, passwordDraft.newPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("label", null, [_cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("span", null, "确认新密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[4] || (_cache[4] = $event => passwordDraft.confirmPassword = $event), + type: "password", + autocomplete: "new-password" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_11__/* .vModelText */ .Jo, passwordDraft.confirmPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("footer", null, [settingsNotice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("span", _hoisted_9, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(settingsNotice.value), 1)) : settingsError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("span", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(settingsError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "submit", + class: "primary-inline-action", + disabled: passwordSaving.value + }, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(passwordSaving.value ? '保存中...' : '保存密码'), 9, _hoisted_11)])], 32)) : ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("section", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("h3", null, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(activeSettingsItem.value?.label || '设置'), 1), _cache[21] || (_cache[21] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("p", null, "该功能稍后开放。", -1))]))])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createCommentVNode */ .Q3)("", true), profileOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("div", { + key: 1, + class: "modal-backdrop", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(closeProfileEditor, ["self"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("form", { + class: "modal-panel profile-edit-panel", + onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(saveProfile, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("header", null, [_cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("strong", null, "个人资料", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeProfileEditor + }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)(["profile-avatar-preview", { + clickable: currentAvatarUrl.value + }]), + title: "预览头像", + onClick: openAvatarPreview + }, [currentAvatarUrl.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("img", { + key: 0, + src: currentAvatarUrl.value, + alt: "" + }, null, 8, _hoisted_14)) : ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("span", _hoisted_15, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(initials.value), 1))], 2), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "primary-inline-action profile-avatar-change-button", + onClick: choosePortraitFile + }, "更换头像"), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("input", { + ref_key: "portraitInput", + ref: portraitInput, + type: "file", + accept: "image/*", + onChange: selectPortrait + }, null, 544)]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("label", null, [_cache[23] || (_cache[23] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("span", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[5] || (_cache[5] = $event => profileDraft.value.displayName = $event), + maxlength: "64", + autocomplete: "off" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_11__/* .vModelText */ .Jo, profileDraft.value.displayName, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("label", null, [_cache[24] || (_cache[24] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("span", null, "用户ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("input", { + value: (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .unref */ .R1)(session).userId, + readonly: "" + }, null, 8, _hoisted_16)]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "ghost-inline-action", + onClick: closeProfileEditor + }, "取消"), profileNotice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("span", _hoisted_18, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(profileNotice.value), 1)) : profileError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("span", _hoisted_19, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(profileError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + class: "primary-inline-action", + disabled: profileSaving.value || !profileDraft.value.displayName + }, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(profileSaving.value ? '保存中...' : '保存'), 9, _hoisted_20)])], 32)])) : (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createCommentVNode */ .Q3)("", true), avatarPreviewViewer.open ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("div", { + key: 2, + class: "modal-backdrop avatar-preview-backdrop", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(closeAvatarPreview, ["self"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("section", _hoisted_21, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("header", null, [_cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("strong", null, "头像预览", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "缩小", + onClick: _cache[6] || (_cache[6] = $event => zoomAvatarPreview(1 / 1.16)) + }, "−"), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "放大", + onClick: _cache[7] || (_cache[7] = $event => zoomAvatarPreview(1.16)) + }, "+"), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "还原", + onClick: resetAvatarPreview + }, "1:1"), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeAvatarPreview + }, "×")])]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)(["avatar-preview-stage", { + dragging: avatarPreviewViewer.dragging + }]), + onWheel: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(handleAvatarPreviewWheel, ["prevent"]), + onPointerdown: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(startAvatarPreviewDrag, ["prevent"]), + onPointermove: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(moveAvatarPreviewDrag, ["prevent"]), + onPointerup: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(stopAvatarPreviewDrag, ["prevent"]), + onPointerleave: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(stopAvatarPreviewDrag, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("img", { + src: avatarPreviewViewer.url, + alt: "头像预览", + style: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeStyle */ .Tr)(avatarPreviewStyle.value), + draggable: "false" + }, null, 12, _hoisted_23)], 34)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createCommentVNode */ .Q3)("", true), avatarCropper.open ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("div", { + key: 3, + class: "modal-backdrop avatar-cropper-backdrop", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(closeAvatarCropper, ["self"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("section", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("header", null, [_cache[26] || (_cache[26] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("strong", null, "头像预裁切", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", _hoisted_25, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "primary-inline-action", + disabled: avatarCropper.busy, + onClick: choosePortraitFile + }, "上传", 8, _hoisted_26), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeAvatarCropper + }, "×")])]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", _hoisted_27, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .normalizeClass */ .C4)(["avatar-cropper-stage", { + dragging: avatarCropper.dragging + }]), + onWheel: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(handleCropperWheel, ["prevent"]), + onPointerdown: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(startCropperDrag, ["prevent"]), + onPointermove: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(moveCropperDrag, ["prevent"]), + onPointerup: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(stopCropperDrag, ["prevent"]), + onPointerleave: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(stopCropperDrag, ["prevent"]), + onDragover: _cache[8] || (_cache[8] = (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(() => {}, ["prevent"])), + onDrop: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .withModifiers */ .D$)(dropPortrait, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("canvas", { + ref_key: "cropperCanvas", + ref: cropperCanvas + }, null, 512), _cache[27] || (_cache[27] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", { + class: "avatar-cropper-mask", + "aria-hidden": "true" + }, null, -1)), _cache[28] || (_cache[28] = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", { + class: "avatar-cropper-box", + "aria-hidden": "true" + }, null, -1)), !avatarCropper.loaded ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("div", _hoisted_28, "图片加载中")) : (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createCommentVNode */ .Q3)("", true)], 34), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("aside", _hoisted_29, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", _hoisted_30, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "左旋90度", + onClick: _cache[9] || (_cache[9] = $event => rotateCropper(-90)) + }, "↶90°"), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "右旋90度", + onClick: _cache[10] || (_cache[10] = $event => rotateCropper(90)) + }, "↷90°"), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "放大", + onClick: _cache[11] || (_cache[11] = $event => zoomCropper(1.12)) + }, "+"), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "缩小", + onClick: _cache[12] || (_cache[12] = $event => zoomCropper(1 / 1.12)) + }, "−"), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + title: "重置", + onClick: resetCropperTransform + }, "重置")]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("div", _hoisted_31, [(0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("canvas", { + ref_key: "cropperPreviewCanvas", + ref: cropperPreviewCanvas + }, null, 512)]), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("footer", null, [avatarCropper.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementBlock */ .CE)("span", _hoisted_32, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(avatarCropper.error), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "ghost-inline-action", + disabled: avatarCropper.busy, + onClick: closeAvatarCropper + }, "取消", 8, _hoisted_33), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "primary-inline-action", + disabled: avatarCropper.busy || !avatarCropper.loaded, + onClick: confirmAvatarCrop + }, (0,vue__WEBPACK_IMPORTED_MODULE_10__/* .toDisplayString */ .v_)(avatarCropper.busy ? '处理中...' : '确认裁切'), 9, _hoisted_34)])])])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .createCommentVNode */ .Q3)("", true)], 64); + }; + } +}); + +/***/ }), + +/***/ 8838: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3741); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_esnext_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9791); +/* harmony import */ var core_js_modules_esnext_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(680); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(793); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(6071); +/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(8438); +/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(6768); +/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(2409); +/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(9488); +/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(6591); +/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(5412); +/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(9214); +/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(4546); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(7987); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(1857); +/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(3842); +/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(3865); + + + + + + + + + + + + + + +const _hoisted_1 = { + class: "conversation-list" +}; +const _hoisted_2 = { + class: "list-header" +}; +const _hoisted_3 = { + class: "header-actions action-menu-anchor" +}; +const _hoisted_4 = { + class: "search-box" +}; +const _hoisted_5 = { + class: "sidebar-scroll" +}; +const _hoisted_6 = ["onClick"]; +const _hoisted_7 = ["src"]; +const _hoisted_8 = { + key: 1, + class: "conversation-avatar" +}; +const _hoisted_9 = { + class: "conversation-copy" +}; +const _hoisted_10 = ["aria-label"]; +const _hoisted_11 = { + key: 0, + class: "empty-list" +}; +const _hoisted_12 = { + key: 1, + class: "empty-list" +}; +const _hoisted_13 = { + key: 0 +}; +const _hoisted_14 = { + key: 2 +}; +const _hoisted_15 = { + key: 5, + class: "form-error" +}; +const _hoisted_16 = { + key: 6, + class: "form-info" +}; +const _hoisted_17 = { + class: "modal-actions" +}; +const _hoisted_18 = ["disabled"]; + + + +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'ConversationList', + setup(__props) { + const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_13__/* .useConversationStore */ .w)(); + const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_14__/* .useContactStore */ .p)(); + const actionMenuOpen = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(false); + const activeAction = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const actionBusy = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(false); + const searchKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const addKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const groupName = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const groupAnnouncement = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const groupWelcomeText = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const joinGroupKey = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const broadcastText = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const channelName = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const channelAnnouncement = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const contactKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)(''); + const selectedContactIds = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .ref */ .KR)([]); + const actionTitles = { + addContact: '添加联系人', + createGroup: '新建群组', + joinGroup: '加入群组', + broadcast: '群发助手', + createChannel: '创建频道/公告群' + }; + const submitLabels = { + addContact: '添加', + createGroup: '创建', + joinGroup: '加入', + broadcast: '发送', + createChannel: '创建' + }; + const actionTitle = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => actionTitles[activeAction.value] || ''); + const submitLabel = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => submitLabels[activeAction.value] || '确定'); + const modalError = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => contacts.actionError || conversations.actionError); + const modalInfo = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => contacts.actionInfo || conversations.actionNotice); + const normalizedSearchKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => searchKeyword.value.trim().toLowerCase()); + const contactsByUid = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => { + const map = new Map(); + contacts.contacts.forEach(contact => { + const uid = String(contact.uid || contact.id || ''); + if (uid) { + map.set(uid, contact); + } + }); + return map; + }); + const filteredConversationItems = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => { + const keyword = normalizedSearchKeyword.value; + if (!keyword) { + return conversations.conversations.map(item => conversationResult(item)); + } + const conversationResults = conversations.conversations.filter(item => matchesConversation(item, keyword, contactForConversation(item))).map(item => conversationResult(item)); + const conversationTargets = new Set(conversations.conversations.filter(item => item.type === 'single').map(item => conversationTarget(item))); + const contactResults = contacts.contacts.filter(item => !conversationTargets.has(String(item.uid || item.id || ''))).filter(item => matchesContact(item, keyword)).map(item => contactResult(item)); + return [...conversationResults, ...contactResults]; + }); + const filteredContacts = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => { + const keyword = contactKeyword.value.toLowerCase(); + if (!keyword) { + return contacts.contacts; + } + return contacts.contacts.filter(item => { + return String(item.title || '').toLowerCase().includes(keyword) || String(item.subtitle || '').toLowerCase().includes(keyword) || String(item.uid || '').toLowerCase().includes(keyword); + }); + }); + const submitDisabled = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => { + if (activeAction.value === 'addContact') { + return !addKeyword.value; + } + if (activeAction.value === 'createGroup') { + return !groupName.value || !selectedContactIds.value.length; + } + if (activeAction.value === 'joinGroup') { + return !joinGroupKey.value; + } + if (activeAction.value === 'broadcast') { + return !broadcastText.value || !selectedContactIds.value.length; + } + if (activeAction.value === 'createChannel') { + return !channelName.value; + } + return true; + }); + (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .onMounted */ .sV)(() => { + contacts.refreshContacts().catch(() => {}); + }); + const ContactPicker = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .defineComponent */ .pM)({ + name: 'ContactPicker', + props: { + contacts: { + type: Array, + default: () => [] + }, + selectedIds: { + type: Array, + default: () => [] + }, + keyword: { + type: String, + default: '' + }, + emptyText: { + type: String, + default: '暂无联系人' + } + }, + emits: ['toggle', 'update:keyword'], + setup(props, { + emit + }) { + return () => (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('div', { + class: 'contact-picker' + }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('input', { + value: props.keyword, + placeholder: '搜索联系人', + onInput: event => emit('update:keyword', event.target.value) + }), (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('div', { + class: 'contact-picker-list' + }, props.contacts.length ? props.contacts.map(contact => (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('button', { + key: contact.uid, + type: 'button', + class: ['contact-picker-row', { + selected: props.selectedIds.includes(contact.uid) + }], + onClick: () => emit('toggle', contact.uid) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('span', { + class: 'contact-check' + }, props.selectedIds.includes(contact.uid) ? '✓' : ''), contact.portrait ? (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('img', { + class: 'conversation-avatar image-avatar', + src: contact.portrait, + alt: '' + }) : (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('span', { + class: 'conversation-avatar' + }, contact.avatarText), (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('span', { + class: 'contact-picker-copy' + }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('strong', contact.title), (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('small', contact.subtitle)])])) : [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('div', { + class: 'contact-picker-empty' + }, props.emptyText)])]); + } + }); + function searchableValues(...values) { + return values.flatMap(value => { + if (Array.isArray(value)) { + return value; + } + if (value && typeof value === 'object') { + return Object.values(value); + } + return [value]; + }).map(value => String(value || '').toLowerCase()).filter(Boolean); + } + function matchesKeyword(values, keyword) { + const compactKeyword = keyword.replace(/[^\p{L}\p{N}]+/gu, ''); + return searchableValues(values).some(value => { + if (value.includes(keyword)) { + return true; + } + if (!compactKeyword) { + return false; + } + return value.replace(/[^\p{L}\p{N}]+/gu, '').includes(compactKeyword); + }); + } + function conversationTarget(item) { + if (item.type !== 'single') { + return String(item.target || item.raw?.target || item.id || ''); + } + return String(item.target || item.raw?.target || item.id.replace(/^single-/, '') || ''); + } + function contactForConversation(item) { + const target = conversationTarget(item); + return target ? contactsByUid.value.get(target) || null : null; + } + function matchesConversation(item, keyword, contact = null) { + return matchesKeyword([item.title, item.subtitle, item.target, item.id, item.type, item.raw?.target, item.raw?.groupId, item.raw?.group_id, item.raw?.owner_uid, item.raw?.name, item.raw?.displayName, item.raw?.mobile, item.raw?.friendAlias, item.raw?.alias, contact?.title, contact?.subtitle, contact?.uid, contact?.id, contact?.alias, contact?.address, contact?.rawUser, contact?.rawFriend], keyword); + } + function matchesContact(item, keyword) { + return matchesKeyword([item.title, item.subtitle, item.uid, item.id, item.alias, item.address, item.rawUser, item.rawFriend], keyword); + } + function conversationResult(item) { + return { + ...item, + resultKind: 'conversation', + resultKey: `conversation-${item.id}` + }; + } + function contactResult(contact) { + return { + id: contact.id, + resultKind: 'contact', + resultKey: `contact-${contact.uid || contact.id}`, + contact, + title: contact.title, + subtitle: contact.subtitle, + portrait: contact.portrait, + avatarText: contact.avatarText, + unread: 0 + }; + } + function isListItemActive(item) { + if (item.resultKind === 'conversation') { + return item.id === conversations.activeId; + } + return `single-${item.contact?.uid || item.id}` === conversations.activeId; + } + function selectListItem(item) { + if (item.resultKind === 'contact') { + contacts.openChat(item.contact); + return; + } + conversations.setActiveConversation(item.id); + } + function clearStoreMessages() { + contacts.actionError = ''; + contacts.actionInfo = ''; + conversations.actionError = ''; + conversations.actionNotice = ''; + } + function resetActionFields() { + addKeyword.value = ''; + groupName.value = ''; + groupAnnouncement.value = ''; + groupWelcomeText.value = ''; + joinGroupKey.value = ''; + broadcastText.value = ''; + channelName.value = ''; + channelAnnouncement.value = ''; + contactKeyword.value = ''; + selectedContactIds.value = []; + clearStoreMessages(); + } + function toggleActionMenu() { + actionMenuOpen.value = !actionMenuOpen.value; + } + function closeActionMenu() { + actionMenuOpen.value = false; + } + function openAction(action) { + resetActionFields(); + activeAction.value = action; + actionMenuOpen.value = false; + if (['createGroup', 'broadcast', 'createChannel'].includes(action)) { + contacts.refreshContacts({ + force: true + }); + } + } + function closeActionModal() { + activeAction.value = ''; + actionBusy.value = false; + resetActionFields(); + } + function toggleContact(contactId) { + const selected = new Set(selectedContactIds.value); + if (selected.has(contactId)) { + selected.delete(contactId); + } else { + selected.add(contactId); + } + selectedContactIds.value = Array.from(selected); + } + async function submitAction() { + if (submitDisabled.value || actionBusy.value) { + return; + } + actionBusy.value = true; + clearStoreMessages(); + try { + let ok = false; + if (activeAction.value === 'addContact') { + ok = await contacts.addContact(addKeyword.value); + if (ok && contacts.activeContact) { + contacts.openChat(contacts.activeContact); + } + } else if (activeAction.value === 'createGroup') { + ok = await conversations.createGroup({ + name: groupName.value, + announcement: groupAnnouncement.value, + welcomeText: groupWelcomeText.value, + memberIds: selectedContactIds.value + }); + } else if (activeAction.value === 'joinGroup') { + ok = await conversations.joinGroup(joinGroupKey.value); + } else if (activeAction.value === 'broadcast') { + ok = await conversations.broadcastMessage(selectedContactIds.value, broadcastText.value); + } else if (activeAction.value === 'createChannel') { + ok = await conversations.createGroup({ + name: channelName.value, + memberIds: selectedContactIds.value, + announcement: channelAnnouncement.value, + channel: true + }); + } + if (ok) { + window.setTimeout(closeActionModal, 450); + } + } finally { + actionBusy.value = false; + } + } + document.addEventListener('click', closeActionMenu); + (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .onBeforeUnmount */ .xo)(() => { + document.removeEventListener('click', closeActionMenu); + }); + function formatUnread(value) { + const count = Number(value || 0); + return count > 99 ? '99+' : String(count); + } + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("aside", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h2", null, "消息", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_15__/* .unref */ .R1)(conversations).totalUnread) + " 条未读", 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", { + class: "icon-button", + title: "新建会话", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .withModifiers */ .D$)(toggleActionMenu, ["stop"]) + }, "+"), actionMenuOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", { + key: 0, + class: "quick-action-menu", + onClick: _cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .withModifiers */ .D$)(() => {}, ["stop"])) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: _cache[0] || (_cache[0] = $event => openAction('addContact')) + }, "添加联系人"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: _cache[1] || (_cache[1] = $event => openAction('createGroup')) + }, "新建群组"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: _cache[2] || (_cache[2] = $event => openAction('joinGroup')) + }, "加入群组"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: _cache[3] || (_cache[3] = $event => openAction('broadcast')) + }, "群发助手"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", { + type: "button", + onClick: _cache[4] || (_cache[4] = $event => openAction('createChannel')) + }, "创建频道/公告群")])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[6] || (_cache[6] = $event => searchKeyword.value = $event), + placeholder: "搜索会话、联系人" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_18__/* .vModelText */ .Jo, searchKeyword.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", _hoisted_5, [((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .renderList */ .pI)(filteredConversationItems.value, item => { + return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("button", { + key: item.resultKey, + class: (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .normalizeClass */ .C4)(["conversation-item", { + active: isListItemActive(item) + }]), + onClick: $event => selectListItem(item) + }, [item.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", { + key: 0, + class: "conversation-avatar image-avatar", + src: item.portrait, + alt: "" + }, null, 8, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .toDisplayString */ .v_)(item.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .toDisplayString */ .v_)(item.title), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .toDisplayString */ .v_)(item.subtitle), 1)]), Number(item.unread || 0) > 0 ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", { + key: 2, + class: "unread-badge", + "aria-label": `${item.unread} 条未读消息` + }, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .toDisplayString */ .v_)(formatUnread(item.unread)), 9, _hoisted_10)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)], 10, _hoisted_6); + }), 128)), !filteredConversationItems.value.length && searchKeyword.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_11, _cache[19] || (_cache[19] = [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, "没有匹配结果", -1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "换个关键词再试试", -1)]))) : !(0,vue__WEBPACK_IMPORTED_MODULE_15__/* .unref */ .R1)(conversations).conversations.length && !(0,vue__WEBPACK_IMPORTED_MODULE_15__/* .unref */ .R1)(conversations).usingDemoData ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_12, _cache[20] || (_cache[20] = [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, "暂无会话", -1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "收到或发起消息后会出现在这里", -1)]))) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)]), activeAction.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", { + key: 0, + class: "modal-backdrop", + onClick: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .withModifiers */ .D$)(closeActionModal, ["self"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("form", { + class: "modal-panel conversation-action-panel", + onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .withModifiers */ .D$)(submitAction, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .toDisplayString */ .v_)(actionTitle.value), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "icon-button", + title: "关闭", + onClick: closeActionModal + }, "×")]), activeAction.value === 'addContact' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("label", _hoisted_13, [_cache[21] || (_cache[21] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "用户ID / 手机号 / 用户名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[7] || (_cache[7] = $event => addKeyword.value = $event), + autocomplete: "off", + placeholder: "请输入要添加的联系人" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_18__/* .vModelText */ .Jo, addKeyword.value, void 0, { + trim: true + }]])])) : activeAction.value === 'createGroup' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, { + key: 1 + }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "群组名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[8] || (_cache[8] = $event => groupName.value = $event), + maxlength: "64", + autocomplete: "off", + placeholder: "请输入群组名称" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_18__/* .vModelText */ .Jo, groupName.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[23] || (_cache[23] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "群说明", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("textarea", { + "onUpdate:modelValue": _cache[9] || (_cache[9] = $event => groupAnnouncement.value = $event), + maxlength: "1000", + rows: "3", + placeholder: "可选" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_18__/* .vModelText */ .Jo, groupAnnouncement.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[24] || (_cache[24] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "欢迎词", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("textarea", { + "onUpdate:modelValue": _cache[10] || (_cache[10] = $event => groupWelcomeText.value = $event), + maxlength: "1000", + rows: "3", + placeholder: "群组创建后自动发送" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_18__/* .vModelText */ .Jo, groupWelcomeText.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createVNode */ .bF)((0,vue__WEBPACK_IMPORTED_MODULE_15__/* .unref */ .R1)(ContactPicker), { + contacts: filteredContacts.value, + "selected-ids": selectedContactIds.value, + keyword: contactKeyword.value, + "empty-text": "暂无可选联系人", + "onUpdate:keyword": _cache[11] || (_cache[11] = $event => contactKeyword.value = $event), + onToggle: toggleContact + }, null, 8, ["contacts", "selected-ids", "keyword"])], 64)) : activeAction.value === 'joinGroup' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("label", _hoisted_14, [_cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "群组ID / 群名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[12] || (_cache[12] = $event => joinGroupKey.value = $event), + autocomplete: "off", + placeholder: "请输入群组ID或群名称" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_18__/* .vModelText */ .Jo, joinGroupKey.value, void 0, { + trim: true + }]])])) : activeAction.value === 'broadcast' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, { + key: 3 + }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[26] || (_cache[26] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "群发内容", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("textarea", { + "onUpdate:modelValue": _cache[13] || (_cache[13] = $event => broadcastText.value = $event), + maxlength: "2000", + rows: "4", + placeholder: "输入要群发的文字" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_18__/* .vModelText */ .Jo, broadcastText.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createVNode */ .bF)((0,vue__WEBPACK_IMPORTED_MODULE_15__/* .unref */ .R1)(ContactPicker), { + contacts: filteredContacts.value, + "selected-ids": selectedContactIds.value, + keyword: contactKeyword.value, + "empty-text": "暂无可选联系人", + "onUpdate:keyword": _cache[14] || (_cache[14] = $event => contactKeyword.value = $event), + onToggle: toggleContact + }, null, 8, ["contacts", "selected-ids", "keyword"])], 64)) : activeAction.value === 'createChannel' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, { + key: 4 + }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[27] || (_cache[27] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "频道/公告群名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[15] || (_cache[15] = $event => channelName.value = $event), + maxlength: "64", + autocomplete: "off", + placeholder: "请输入名称" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_18__/* .vModelText */ .Jo, channelName.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[28] || (_cache[28] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "公告说明", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("textarea", { + "onUpdate:modelValue": _cache[16] || (_cache[16] = $event => channelAnnouncement.value = $event), + maxlength: "1000", + rows: "3", + placeholder: "可选" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_18__/* .vModelText */ .Jo, channelAnnouncement.value, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createVNode */ .bF)((0,vue__WEBPACK_IMPORTED_MODULE_15__/* .unref */ .R1)(ContactPicker), { + contacts: filteredContacts.value, + "selected-ids": selectedContactIds.value, + keyword: contactKeyword.value, + "empty-text": "暂无可选联系人", + "onUpdate:keyword": _cache[17] || (_cache[17] = $event => contactKeyword.value = $event), + onToggle: toggleContact + }, null, 8, ["contacts", "selected-ids", "keyword"])], 64)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), modalError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("p", _hoisted_15, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .toDisplayString */ .v_)(modalError.value), 1)) : modalInfo.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("p", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .toDisplayString */ .v_)(modalInfo.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "ghost-inline-action", + onClick: closeActionModal + }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", { + class: "primary-inline-action", + disabled: actionBusy.value || submitDisabled.value + }, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .toDisplayString */ .v_)(actionBusy.value ? '处理中...' : submitLabel.value), 9, _hoisted_18)])], 32)])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)]); + }; + } +}); + +/***/ }), + +/***/ 8888: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var _MessageList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5282); + + + +const __exports__ = _MessageList_vue_vue_type_script_setup_true_lang_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A; + +/* harmony default export */ __webpack_exports__.A = (__exports__); + +/***/ }), + +/***/ 9397: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ U: function() { return /* binding */ appConfig; } +/* harmony export */ }); +const currentHost = window.location.hostname || '127.0.0.1'; +const runtimeConfig = window.JC_WEB_IM_CONFIG || {}; +const appServerOrigin = `${window.location.protocol}//${currentHost}:18888`; +const adminServerOrigin = `${window.location.protocol}//${currentHost}:8024`; +const appConfig = { + appName: 'Web IM', + adminServer: runtimeConfig.adminServer || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_ADMIN_SERVER || adminServerOrigin, + appServer: runtimeConfig.appServer || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_APP_SERVER || appServerOrigin, + platformConfigApi: runtimeConfig.platformConfigApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_PLATFORM_CONFIG_API || ( false ? 0 : '/api/platform_config.php'), + registerConfigApi: runtimeConfig.registerConfigApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_REGISTER_CONFIG_API || `${adminServerOrigin}/api/register-config`, + registerPhoneExistsApi: runtimeConfig.registerPhoneExistsApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_REGISTER_PHONE_EXISTS_API || `${adminServerOrigin}/api/register-phone-exists`, + contactsApi: runtimeConfig.contactsApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_CONTACTS_API || ( false ? 0 : '/api/contacts.php'), + updateAliasApi: runtimeConfig.updateAliasApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_UPDATE_ALIAS_API || ( false ? 0 : '/api/update_alias.php'), + addContactApi: runtimeConfig.addContactApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_ADD_CONTACT_API || ( false ? 0 : '/api/add_contact.php'), + conversationActionsApi: runtimeConfig.conversationActionsApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_CONVERSATION_ACTIONS_API || ( false ? 0 : '/api/conversation_actions.php'), + sendMessageApi: runtimeConfig.sendMessageApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_SEND_MESSAGE_API || ( false ? 0 : '/api/send_message.php'), + messageActionApi: runtimeConfig.messageActionApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_MESSAGE_ACTION_API || ( false ? 0 : '/api/message_action.php'), + messageDetailApi: runtimeConfig.messageDetailApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_MESSAGE_DETAIL_API || ( false ? 0 : '/api/message_detail.php'), + messagesApi: runtimeConfig.messagesApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_MESSAGES_API || ( false ? 0 : '/api/messages.php'), + profileApi: runtimeConfig.profileApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_PROFILE_API || ( false ? 0 : '/api/profile.php'), + changePasswordApi: runtimeConfig.changePasswordApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_CHANGE_PASSWORD_API || `${appServerOrigin}/change_pwd`, + resetPasswordApi: runtimeConfig.resetPasswordApi || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_RESET_PASSWORD_API || `${appServerOrigin}/reset_pwd`, + imServerHost: runtimeConfig.imServerHost || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_IM_SERVER_HOST || currentHost, + imRoutePort: Number(runtimeConfig.imRoutePort || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_IM_ROUTE_PORT || 18000), + useWss: runtimeConfig.useWss ?? ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_USE_WSS === 'true', + wsPath: runtimeConfig.wsPath || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_WS_PATH || '/ws', + wsUrl: runtimeConfig.wsUrl || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_WS_URL || '', + sdkMode: runtimeConfig.sdkMode || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_IM_MODE || 'http', + syncIntervalMs: Number(runtimeConfig.syncIntervalMs || ({"NODE_ENV":"production","BASE_URL":""}).VUE_APP_SYNC_INTERVAL_MS || 300), + platform: 5, + clientIdStorageKey: 'qmt-web-im-client-id', + authTokenStoragePrefix: 'qmt-web-im-auth-token-' +}; + +/***/ }), + +/***/ 9502: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6071); +/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9130); +/* harmony import */ var core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_delete_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8937); +/* harmony import */ var core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_has_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8636); +/* harmony import */ var core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_url_search_params_size_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(4187); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(4546); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(1857); +/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(7987); +/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(4062); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(9397); +/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(4834); +/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(6151); + + + + + + +const _hoisted_1 = { + class: "login-page" +}; +const _hoisted_2 = { + class: "login-panel" +}; +const _hoisted_3 = { + class: "brand-lockup" +}; +const _hoisted_4 = ["src", "alt"]; +const _hoisted_5 = { + class: "login-tabs" +}; +const _hoisted_6 = { + key: 0 +}; +const _hoisted_7 = { + key: 1 +}; +const _hoisted_8 = { + class: "code-row" +}; +const _hoisted_9 = ["disabled"]; +const _hoisted_10 = ["disabled"]; +const _hoisted_11 = { + key: 2, + class: "form-error" +}; +const _hoisted_12 = { + key: 3, + class: "form-info" +}; +const _hoisted_13 = ["onClick"]; +const _hoisted_14 = { + key: 0 +}; +const _hoisted_15 = { + class: "label-row" +}; +const _hoisted_16 = { + key: 0, + class: "field-error-badge" +}; +const _hoisted_17 = { + class: "phone-row" +}; +const _hoisted_18 = { + class: "country-code-field" +}; +const _hoisted_19 = { + key: 1 +}; +const _hoisted_20 = { + key: 0, + class: "code-row" +}; +const _hoisted_21 = ["disabled"]; +const _hoisted_22 = { + key: 1, + class: "captcha-row" +}; +const _hoisted_23 = ["src"]; +const _hoisted_24 = { + key: 2 +}; +const _hoisted_25 = { + key: 3 +}; +const _hoisted_26 = { + class: "code-row" +}; +const _hoisted_27 = { + key: 4 +}; +const _hoisted_28 = { + key: 5 +}; +const _hoisted_29 = { + class: "phone-row" +}; +const _hoisted_30 = ["value"]; +const _hoisted_31 = { + key: 6 +}; +const _hoisted_32 = { + class: "captcha-row" +}; +const _hoisted_33 = ["src"]; +const _hoisted_34 = { + key: 7 +}; +const _hoisted_35 = { + key: 8 +}; +const _hoisted_36 = ["disabled"]; +const _hoisted_37 = { + key: 9, + class: "form-error" +}; +const _hoisted_38 = { + key: 10, + class: "form-info" +}; +const _hoisted_39 = ["value"]; +const _hoisted_40 = ["disabled"]; +const _hoisted_41 = { + key: 0, + class: "form-error" +}; +const _hoisted_42 = { + key: 1, + class: "form-info" +}; + + + + + +const pendingRegistrationStorageKey = 'qmt-web-im-pending-registration'; +const defaultPlatformLogo = '/img/5IuOieu9PF8MJtp43kD2kCkdLVjVwDp7.ico'; +const emailRegisterEnabled = false; +/* harmony default export */ __webpack_exports__.A = ({ + __name: 'LoginView', + setup(__props) { + const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_6__/* .useSessionStore */ .B)(); + const view = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)('login'); + const mode = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)('code'); + const mobile = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(''); + const password = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(''); + const code = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)('66666'); + const sendingCode = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(false); + const info = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(''); + const defaultPlatformName = _config__WEBPACK_IMPORTED_MODULE_5__/* .appConfig */ .U.appName; + const platformName = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(defaultPlatformName); + const platformLogo = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(defaultPlatformLogo); + const registerType = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)('phone'); + const registerMethods = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)({ + phone: true, + email: false, + username: false + }); + const mobileRealVerify = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(false); + const registerPhoneError = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(''); + const phoneCaptcha = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(''); + const phoneCaptchaImage = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(''); + const usernameCaptcha = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(''); + const usernameCaptchaImage = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(''); + const settingRegisterPassword = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(false); + const pendingRegistration = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .reactive */ .Kh)({ + mobile: '', + result: null, + resetCode: '' + }); + const registerForm = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .reactive */ .Kh)({ + phoneCountryCode: '86', + phone: '', + code: '', + email: '', + emailCode: '', + username: '', + usernamePhoneCountryCode: '+86', + usernamePhone: '', + usernameCode: '', + password: '', + confirmPassword: '' + }); + const registerPasswordForm = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .reactive */ .Kh)({ + password: '', + confirmPassword: '' + }); + const countryCodeOptions = [{ + value: '+86', + label: '+86' + }, { + value: '+852', + label: '+852' + }, { + value: '+853', + label: '+853' + }, { + value: '+886', + label: '+886' + }, { + value: '+1', + label: '+1' + }, { + value: '+44', + label: '+44' + }, { + value: '+60', + label: '+60' + }, { + value: '+63', + label: '+63' + }, { + value: '+65', + label: '+65' + }, { + value: '+66', + label: '+66' + }, { + value: '+81', + label: '+81' + }, { + value: '+82', + label: '+82' + }]; + const registerMethodOptions = [{ + key: 'phone', + label: '手机号注册' + }, { + key: 'email', + label: '邮箱注册' + }, { + key: 'username', + label: '用户名注册' + }]; + const canSubmit = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => { + if (mode.value === 'password') { + return mobile.value.length >= 5 && password.value.length >= 1; + } + return mobile.value.length >= 5 && code.value.length >= 1; + }); + const visibleRegisterMethods = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => { + const enabled = registerMethodOptions.filter(item => item.key !== 'email' && registerMethods.value[item.key]); + return enabled.length ? enabled : [registerMethodOptions[0]]; + }); + const canRegisterSubmit = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => { + if (registerType.value === 'phone') { + return registerForm.phone.length >= 5 && (mobileRealVerify.value ? registerForm.code.length >= 1 : phoneCaptchaMatched.value); + } + if (registerType.value === 'email') { + return false; + } + return registerForm.username.length >= 3 && registerForm.usernamePhone.length >= 5 && usernameCaptchaMatched.value && registerForm.password.length >= 1 && registerForm.password === registerForm.confirmPassword; + }); + const canSetRegisterPassword = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => { + return pendingRegistration.mobile && pendingRegistration.resetCode && registerPasswordForm.password.length >= 1 && registerPasswordForm.password === registerPasswordForm.confirmPassword; + }); + const phoneCaptchaStatus = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => getCaptchaStatus(registerForm.code, phoneCaptcha.value)); + const phoneCaptchaMatched = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => phoneCaptchaStatus.value === 'valid'); + const phoneCaptchaClass = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => getCaptchaClass(phoneCaptchaStatus.value)); + const usernameCaptchaStatus = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => { + return getCaptchaStatus(registerForm.usernameCode, usernameCaptcha.value); + }); + const usernameCaptchaMatched = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => usernameCaptchaStatus.value === 'valid'); + const usernameCaptchaClass = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .computed */ .EW)(() => getCaptchaClass(usernameCaptchaStatus.value)); + (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .watch */ .wB)(visibleRegisterMethods, methods => { + if (!methods.some(item => item.key === registerType.value)) { + registerType.value = methods[0]?.key || 'phone'; + } + }); + (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .onMounted */ .sV)(() => { + loadPlatformConfig(); + loadRegisterConfig(); + restorePendingRegistration(); + }); + async function requestCode() { + info.value = ''; + sendingCode.value = true; + try { + await _services_imClient__WEBPACK_IMPORTED_MODULE_7__/* .imClient */ .wD.requestAuthCode(mobile.value); + info.value = '验证码已发送;本地测试也可以直接使用 66666'; + } catch (error) { + session.error = error.message || '验证码发送失败'; + } finally { + sendingCode.value = false; + } + } + async function requestRegisterCode() { + info.value = ''; + sendingCode.value = true; + try { + await _services_imClient__WEBPACK_IMPORTED_MODULE_7__/* .imClient */ .wD.requestAuthCode(formatPhoneForApi(registerForm.phoneCountryCode, registerForm.phone)); + info.value = '验证码已发送;本地测试也可以直接使用 66666'; + } catch (error) { + session.error = error.message || '验证码发送失败'; + } finally { + sendingCode.value = false; + } + } + function submit() { + if (mode.value === 'password') { + session.loginWithPassword(mobile.value, password.value); + return; + } + session.loginWithCode(mobile.value, code.value); + } + function normalizeUsernameCaptchaInput() { + registerForm.usernameCode = registerForm.usernameCode.replace(/\D/g, '').slice(0, 6); + } + function normalizePhoneCaptchaInput() { + registerForm.code = registerForm.code.replace(/\D/g, '').slice(0, 6); + } + function normalizeRegisterCountryCode() { + registerForm.phoneCountryCode = registerForm.phoneCountryCode.replace(/\D/g, '').slice(0, 6); + } + function showPhoneCaptcha() { + phoneCaptcha.value = randomDigits(6); + phoneCaptchaImage.value = renderCaptchaImage(phoneCaptcha.value); + registerForm.code = ''; + } + function showUsernameCaptcha() { + usernameCaptcha.value = randomDigits(6); + usernameCaptchaImage.value = renderCaptchaImage(usernameCaptcha.value); + registerForm.usernameCode = ''; + } + function getCaptchaStatus(inputValue, captchaValue) { + if (inputValue.length < 6) { + return ''; + } + return captchaValue && inputValue === captchaValue ? 'valid' : 'invalid'; + } + function getCaptchaClass(status) { + return { + 'captcha-input-valid': status === 'valid', + 'captcha-input-invalid': status === 'invalid' + }; + } + function randomDigits(length) { + let value = ''; + for (let index = 0; index < length; index += 1) { + value += Math.floor(Math.random() * 10); + } + return value; + } + function renderCaptchaImage(text) { + const width = 112; + const height = 42; + const canvas = document.createElement('canvas'); + canvas.width = width; + canvas.height = height; + const context = canvas.getContext('2d'); + context.fillStyle = '#f7fbfa'; + context.fillRect(0, 0, width, height); + for (let index = 0; index < 11; index += 1) { + context.beginPath(); + context.moveTo(Math.random() * width, Math.random() * height); + context.lineTo(Math.random() * width, Math.random() * height); + context.strokeStyle = `rgba(${25 + Math.random() * 60}, ${55 + Math.random() * 70}, ${55 + Math.random() * 70}, 0.82)`; + context.lineWidth = 1.4; + context.stroke(); + } + context.font = '700 23px Arial, sans-serif'; + context.textBaseline = 'middle'; + context.textAlign = 'center'; + for (let index = 0; index < text.length; index += 1) { + context.fillStyle = index % 2 === 0 ? '#153f3b' : '#1b6760'; + context.fillText(text[index], 14 + index * 17, height / 2 + 1); + } + for (let index = 0; index < 70; index += 1) { + context.fillStyle = `rgba(20, 70, 65, ${0.12 + Math.random() * 0.2})`; + context.fillRect(Math.random() * width, Math.random() * height, 1.2, 1.2); + } + return canvas.toDataURL('image/png'); + } + async function submitRegister() { + session.error = ''; + info.value = ''; + if (registerType.value === 'phone') { + clearRegisterPhoneError(); + if (!mobileRealVerify.value && !phoneCaptchaMatched.value) { + session.error = '请输入正确的验证码'; + return; + } + const formattedPhone = formatPhoneForApi(registerForm.phoneCountryCode, registerForm.phone); + const phoneExists = await isRegisterPhoneExists(formattedPhone); + if (phoneExists === null) { + return; + } + if (phoneExists) { + registerPhoneError.value = '该手机号已经注册过'; + return; + } + const loginCode = mobileRealVerify.value ? registerForm.code : '66666'; + const result = await session.registerWithPhone(formattedPhone, loginCode); + if (!result) { + return; + } + if (!result.resetCode) { + session.error = '注册成功,但没有收到设置密码凭证'; + return; + } + setPendingRegistration(formattedPhone, result); + registerPasswordForm.password = ''; + registerPasswordForm.confirmPassword = ''; + view.value = 'setPassword'; + return; + } + if (registerType.value === 'email') { + session.error = '邮箱注册已暂时关闭,请使用手机号注册'; + return; + } + session.error = registerType.value === 'email' ? '邮箱注册接口还未接入,请先使用手机号注册' : '用户名注册接口还未接入,请先使用手机号注册'; + } + async function submitRegisterPassword() { + session.error = ''; + info.value = ''; + if (!pendingRegistration.mobile || !pendingRegistration.resetCode) { + session.error = '注册状态已失效,请重新注册'; + return; + } + if (!registerPasswordForm.password || !registerPasswordForm.confirmPassword) { + session.error = '请填写完整密码'; + return; + } + if (registerPasswordForm.password !== registerPasswordForm.confirmPassword) { + session.error = '两次输入的密码不一致'; + return; + } + settingRegisterPassword.value = true; + try { + await session.resetPasswordWithCode({ + mobile: pendingRegistration.mobile, + resetCode: pendingRegistration.resetCode, + newPassword: registerPasswordForm.password + }); + await session.loginWithPassword(pendingRegistration.mobile, registerPasswordForm.password); + if (!session.error) { + clearPendingRegistration(); + } + } catch (error) { + session.error = error.message || '密码设置失败'; + } finally { + settingRegisterPassword.value = false; + } + } + function formatPhoneForApi(countryCode, phone) { + const digits = String(countryCode || '86').replace(/\D/g, '') || '86'; + const normalizedCode = `+${digits}`; + const normalizedPhone = String(phone || '').replace(/\s/g, ''); + if (normalizedCode === '+86') { + return normalizedPhone; + } + return `${normalizedCode}${normalizedPhone}`; + } + async function loadRegisterConfig() { + try { + const response = await axios__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .A.get(_config__WEBPACK_IMPORTED_MODULE_5__/* .appConfig */ .U.registerConfigApi, { + withCredentials: false + }); + const methods = response.data?.data?.methods; + if (methods) { + registerMethods.value = { + phone: Boolean(methods.phone), + email: emailRegisterEnabled && Boolean(methods.email), + username: Boolean(methods.username) + }; + } + mobileRealVerify.value = Boolean(response.data?.data?.mobile_real_verify); + } catch (error) { + registerMethods.value = { + phone: true, + email: false, + username: false + }; + mobileRealVerify.value = false; + } + } + async function loadPlatformConfig() { + try { + const response = await axios__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .A.get(_config__WEBPACK_IMPORTED_MODULE_5__/* .appConfig */ .U.platformConfigApi, { + withCredentials: false + }); + if (response.data?.code !== 0) { + throw new Error(response.data?.message || '平台配置加载失败'); + } + const config = response.data?.result || {}; + const name = String(config.platformName || '').trim(); + const logo = String(config.logoUrl || config.logo || '').trim(); + const version = String(config.version || '').trim(); + platformName.value = name || defaultPlatformName; + platformLogo.value = resolveBrandLogo(logo, version); + } catch (error) { + platformName.value = defaultPlatformName; + platformLogo.value = defaultPlatformLogo; + } + applyDocumentBrand(); + } + function resolveBrandLogo(value, version = '') { + const logo = String(value || '').trim(); + if (!logo) { + return defaultPlatformLogo; + } + if (/^(https?:|data:|blob:)/i.test(logo)) { + return appendBrandVersion(logo, version); + } + if (logo.startsWith('//')) { + return appendBrandVersion(`${window.location.protocol}${logo}`, version); + } + const base = logo.startsWith('/') ? _config__WEBPACK_IMPORTED_MODULE_5__/* .appConfig */ .U.adminServer : `${_config__WEBPACK_IMPORTED_MODULE_5__/* .appConfig */ .U.adminServer}/`; + return appendBrandVersion(new URL(logo, base).toString(), version); + } + function appendBrandVersion(url, version) { + if (!version || /^(data:|blob:)/i.test(url)) { + return url; + } + const parsed = new URL(url, window.location.href); + parsed.searchParams.set('v', version); + return parsed.toString(); + } + function applyDocumentBrand() { + if (typeof document === 'undefined') { + return; + } + document.title = platformName.value || defaultPlatformName; + let icon = document.querySelector('link[rel="icon"]'); + if (!icon) { + icon = document.createElement('link'); + icon.setAttribute('rel', 'icon'); + document.head.appendChild(icon); + } + icon.setAttribute('href', platformLogo.value || defaultPlatformLogo); + } + function handleBrandLogoError() { + if (platformLogo.value !== defaultPlatformLogo) { + platformLogo.value = defaultPlatformLogo; + applyDocumentBrand(); + } + } + async function isRegisterPhoneExists(phone) { + try { + const response = await axios__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_5__/* .appConfig */ .U.registerPhoneExistsApi, { + mobile: phone + }, { + withCredentials: false + }); + return Boolean(response.data?.data?.exists); + } catch (error) { + session.error = error.response?.data?.msg || error.message || '手机号检查失败,请稍后重试'; + return null; + } + } + function clearRegisterPhoneError() { + registerPhoneError.value = ''; + } + function clearPendingRegistration() { + pendingRegistration.mobile = ''; + pendingRegistration.result = null; + pendingRegistration.resetCode = ''; + registerPasswordForm.password = ''; + registerPasswordForm.confirmPassword = ''; + sessionStorage.removeItem(pendingRegistrationStorageKey); + } + function setPendingRegistration(phone, result) { + pendingRegistration.mobile = phone; + pendingRegistration.result = result; + pendingRegistration.resetCode = String(result.resetCode || ''); + sessionStorage.setItem(pendingRegistrationStorageKey, JSON.stringify({ + appServer: _config__WEBPACK_IMPORTED_MODULE_5__/* .appConfig */ .U.appServer, + mobile: pendingRegistration.mobile, + resetCode: pendingRegistration.resetCode, + result + })); + } + function restorePendingRegistration() { + try { + const pending = JSON.parse(sessionStorage.getItem(pendingRegistrationStorageKey) || 'null'); + if (!pending || pending.appServer !== _config__WEBPACK_IMPORTED_MODULE_5__/* .appConfig */ .U.appServer || !pending.mobile || !pending.resetCode) { + return; + } + pendingRegistration.mobile = pending.mobile; + pendingRegistration.result = pending.result || null; + pendingRegistration.resetCode = String(pending.resetCode || ''); + registerPasswordForm.password = ''; + registerPasswordForm.confirmPassword = ''; + view.value = 'setPassword'; + } catch (error) { + sessionStorage.removeItem(pendingRegistrationStorageKey); + } + } + function openRegister() { + session.error = ''; + info.value = ''; + clearRegisterPhoneError(); + clearPendingRegistration(); + registerForm.phone = registerForm.phone || mobile.value; + registerForm.code = ''; + phoneCaptcha.value = ''; + phoneCaptchaImage.value = ''; + view.value = 'register'; + loadRegisterConfig(); + } + function backToLogin() { + session.error = ''; + info.value = ''; + clearRegisterPhoneError(); + clearPendingRegistration(); + view.value = 'login'; + } + return (_ctx, _cache) => { + return (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("main", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("section", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("img", { + class: "brand-mark", + src: platformLogo.value, + alt: `${platformName.value} 图标`, + onError: handleBrandLogoError + }, null, 40, _hoisted_4), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", null, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("h1", null, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)(platformName.value), 1), _cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("p", null, "连接既有授权 IM 服务的新版 Web 客户端", -1))])]), view.value === 'login' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("form", { + key: 0, + class: "login-form", + onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)(submit, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .normalizeClass */ .C4)({ + active: mode.value === 'code' + }), + onClick: _cache[0] || (_cache[0] = $event => mode.value = 'code') + }, "验证码登录", 2), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .normalizeClass */ .C4)({ + active: mode.value === 'password' + }), + onClick: _cache[1] || (_cache[1] = $event => mode.value = 'password') + }, "密码登录", 2)]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("label", null, [_cache[20] || (_cache[20] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => mobile.value = $event), + autocomplete: "username", + inputmode: "tel", + placeholder: "请输入手机号" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, mobile.value, void 0, { + trim: true + }]])]), mode.value === 'password' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_6, [_cache[21] || (_cache[21] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[3] || (_cache[3] = $event => password.value = $event), + autocomplete: "current-password", + type: "password", + placeholder: "请输入密码" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, password.value]])])) : ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_7, [_cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "验证码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[4] || (_cache[4] = $event => code.value = $event), + autocomplete: "one-time-code", + inputmode: "numeric", + placeholder: "本地测试请输入 66666" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, code.value, void 0, { + trim: true + }]]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "code-action", + disabled: sendingCode.value || mobile.value.length < 5, + onClick: requestCode + }, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)(sendingCode.value ? '发送中' : '发送验证码'), 9, _hoisted_9)])])), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + class: "primary-action", + disabled: (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).connecting || !canSubmit.value + }, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).connecting ? '登录中...' : '登录'), 9, _hoisted_10), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).error ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("p", _hoisted_11, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).error), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), info.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("p", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)(info.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)], 32)) : view.value === 'register' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("form", { + key: 1, + class: "login-form", + onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)(submitRegister, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", { + class: "login-tabs register-tabs", + style: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .normalizeStyle */ .Tr)({ + gridTemplateColumns: `repeat(${visibleRegisterMethods.value.length || 1}, minmax(0, 1fr))` + }) + }, [((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_9__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .renderList */ .pI)(visibleRegisterMethods.value, item => { + return (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: item.key, + type: "button", + class: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .normalizeClass */ .C4)({ + active: registerType.value === item.key + }), + onClick: $event => registerType.value = item.key + }, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)(item.label), 11, _hoisted_13); + }), 128))], 4), registerType.value === 'phone' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", _hoisted_15, [_cache[23] || (_cache[23] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "手机号", -1)), registerPhoneError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("span", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)(registerPhoneError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_18, [_cache[24] || (_cache[24] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "+", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[5] || (_cache[5] = $event => registerForm.phoneCountryCode = $event), + "aria-label": "手机号国码", + autocomplete: "tel-country-code", + inputmode: "numeric", + maxlength: "6", + onInput: normalizeRegisterCountryCode + }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.phoneCountryCode, void 0, { + trim: true + }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[6] || (_cache[6] = $event => registerForm.phone = $event), + class: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .normalizeClass */ .C4)({ + 'field-input-error': registerPhoneError.value + }), + autocomplete: "tel", + inputmode: "tel", + placeholder: "请输入手机号", + onInput: clearRegisterPhoneError + }, null, 34), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.phone, void 0, { + trim: true + }]])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), registerType.value === 'phone' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_19, [_cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "验证码", -1)), mobileRealVerify.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("div", _hoisted_20, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[7] || (_cache[7] = $event => registerForm.code = $event), + autocomplete: "one-time-code", + inputmode: "numeric", + placeholder: "请输入短信验证码" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.code, void 0, { + trim: true + }]]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "code-action", + disabled: sendingCode.value || registerForm.phone.length < 5, + onClick: requestRegisterCode + }, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)(sendingCode.value ? '发送中' : '发送验证码'), 9, _hoisted_21)])) : ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("div", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[8] || (_cache[8] = $event => registerForm.code = $event), + class: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .normalizeClass */ .C4)(phoneCaptchaClass.value), + autocomplete: "off", + inputmode: "numeric", + maxlength: "6", + placeholder: "请输入验证码", + onInput: normalizePhoneCaptchaInput + }, null, 34), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.code, void 0, { + trim: true + }]]), !phoneCaptchaImage.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: 0, + type: "button", + class: "code-action", + onClick: showPhoneCaptcha + }, " 发送验证码 ")) : ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: 1, + type: "button", + class: "captcha-button", + title: "点击更换验证码", + onClick: showPhoneCaptcha + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("img", { + src: phoneCaptchaImage.value, + alt: "6位数字验证码" + }, null, 8, _hoisted_23)]))]))])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), emailRegisterEnabled && registerType.value === 'email' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_24, [_cache[26] || (_cache[26] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "邮箱", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[9] || (_cache[9] = $event => registerForm.email = $event), + autocomplete: "email", + inputmode: "email", + placeholder: "请输入邮箱" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.email, void 0, { + trim: true + }]])])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), emailRegisterEnabled && registerType.value === 'email' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_25, [_cache[28] || (_cache[28] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "邮箱验证码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_26, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[10] || (_cache[10] = $event => registerForm.emailCode = $event), + autocomplete: "one-time-code", + inputmode: "numeric", + placeholder: "请输入验证码" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.emailCode, void 0, { + trim: true + }]]), _cache[27] || (_cache[27] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + type: "button", + class: "code-action", + disabled: "" + }, "发送验证码", -1))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), registerType.value === 'username' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_27, [_cache[29] || (_cache[29] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "用户名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[11] || (_cache[11] = $event => registerForm.username = $event), + autocomplete: "username", + placeholder: "请输入用户名" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.username, void 0, { + trim: true + }]])])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), registerType.value === 'username' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_28, [_cache[30] || (_cache[30] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_29, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("select", { + "onUpdate:modelValue": _cache[12] || (_cache[12] = $event => registerForm.usernamePhoneCountryCode = $event), + "aria-label": "用户名注册手机号国码" + }, [((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_9__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .renderList */ .pI)(countryCodeOptions, item => { + return (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("option", { + key: item.value, + value: item.value + }, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)(item.label), 9, _hoisted_30); + }), 64))], 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelSelect */ .u1, registerForm.usernamePhoneCountryCode]]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[13] || (_cache[13] = $event => registerForm.usernamePhone = $event), + autocomplete: "tel", + inputmode: "tel", + placeholder: "请输入手机号" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.usernamePhone, void 0, { + trim: true + }]])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), registerType.value === 'username' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_31, [_cache[31] || (_cache[31] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "验证码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("div", _hoisted_32, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[14] || (_cache[14] = $event => registerForm.usernameCode = $event), + class: (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .normalizeClass */ .C4)(usernameCaptchaClass.value), + autocomplete: "off", + inputmode: "numeric", + maxlength: "6", + placeholder: "请输入验证码", + onInput: normalizeUsernameCaptchaInput + }, null, 34), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.usernameCode, void 0, { + trim: true + }]]), !usernameCaptchaImage.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: 0, + type: "button", + class: "code-action", + onClick: showUsernameCaptcha + }, " 显示验证码 ")) : ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: 1, + type: "button", + class: "captcha-button", + title: "点击更换验证码", + onClick: showUsernameCaptcha + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("img", { + src: usernameCaptchaImage.value, + alt: "6位数字验证码" + }, null, 8, _hoisted_33)]))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), registerType.value === 'username' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_34, [_cache[32] || (_cache[32] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[15] || (_cache[15] = $event => registerForm.password = $event), + autocomplete: "new-password", + type: "password", + placeholder: "请输入密码" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.password]])])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), registerType.value === 'username' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("label", _hoisted_35, [_cache[33] || (_cache[33] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "确认密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[16] || (_cache[16] = $event => registerForm.confirmPassword = $event), + autocomplete: "new-password", + type: "password", + placeholder: "请再次输入密码" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerForm.confirmPassword]])])) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + class: "primary-action", + disabled: (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).connecting || !canRegisterSubmit.value + }, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).connecting ? '注册中...' : '注册'), 9, _hoisted_36), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).error ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("p", _hoisted_37, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).error), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), info.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("p", _hoisted_38, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)(info.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)], 32)) : ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("form", { + key: 2, + class: "login-form", + onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)(submitRegisterPassword, ["prevent"]) + }, [(0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("label", null, [_cache[34] || (_cache[34] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + value: pendingRegistration.mobile, + autocomplete: "username", + readonly: "" + }, null, 8, _hoisted_39)]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("label", null, [_cache[35] || (_cache[35] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "登录密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[17] || (_cache[17] = $event => registerPasswordForm.password = $event), + autocomplete: "new-password", + type: "password", + placeholder: "请输入登录密码" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerPasswordForm.password]])]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("label", null, [_cache[36] || (_cache[36] = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("span", null, "确认密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("input", { + "onUpdate:modelValue": _cache[18] || (_cache[18] = $event => registerPasswordForm.confirmPassword = $event), + autocomplete: "new-password", + type: "password", + placeholder: "请再次输入密码" + }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, registerPasswordForm.confirmPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementVNode */ .Lk)("button", { + class: "primary-action", + disabled: (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).connecting || settingRegisterPassword.value || !canSetRegisterPassword.value + }, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)(settingRegisterPassword.value || (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).connecting ? '保存中...' : '保存并进入'), 9, _hoisted_40), (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).error ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("p", _hoisted_41, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(session).error), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true), info.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("p", _hoisted_42, (0,vue__WEBPACK_IMPORTED_MODULE_11__/* .toDisplayString */ .v_)(info.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)], 32)), view.value === 'login' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: 3, + class: "ghost-action", + type: "button", + onClick: openRegister + }, " 新用户注册 ")) : view.value === 'register' ? ((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createElementBlock */ .CE)("button", { + key: 4, + class: "ghost-action", + type: "button", + onClick: backToLogin + }, " 返回登录 ")) : (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .createCommentVNode */ .Q3)("", true)])]); + }; + } +}); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ !function() { +/******/ var deferred = []; +/******/ __webpack_require__.O = function(result, chunkIds, fn, priority) { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var chunkIds = deferred[i][0]; +/******/ var fn = deferred[i][1]; +/******/ var priority = deferred[i][2]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/compat get default export */ +/******/ !function() { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function() { return module['default']; } : +/******/ function() { return module; }; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ !function() { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ !function() { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ !function() { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 524: 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; }; +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = function(parentChunkLoadingFunction, data) { +/******/ var chunkIds = data[0]; +/******/ var moreModules = data[1]; +/******/ var runtime = data[2]; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunkjc_web_im"] = self["webpackChunkjc_web_im"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ }(); +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module depends on other loaded chunks and execution need to be delayed +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(8218); }) +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ +/******/ })() +; +//# sourceMappingURL=app.3d85aa5a.js.map \ No newline at end of file diff --git a/dist/js/app.3d85aa5a.js.map b/dist/js/app.3d85aa5a.js.map new file mode 100644 index 0000000..4c3bcf6 --- /dev/null +++ b/dist/js/app.3d85aa5a.js.map @@ -0,0 +1 @@ +{"version":3,"file":"js/app.3d85aa5a.js","mappings":";;;;;;;;AAAuE;AACL;;AAElE,oBAAoB,kGAAM;;AAE1B,sDAAe;;;;;;;;;;;ACL0Q;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC+D9O;AACS;;;;IAEpD,MAAMI,QAAQ,GAAGD,0EAAe,CAAC,CAAC;IAClC,MAAME,OAAO,GAAGL,uDAAQ,CAAC,MAAMI,QAAQ,CAACE,aAAa,CAAC;IACtD,MAAMC,UAAU,GAAGP,uDAAQ,CAAC,MAAMK,OAAO,CAACG,KAAK,EAAEC,KAAK,IAAI,KAAK,CAAC;IAChE,MAAMC,QAAQ,GAAGV,uDAAQ,CAAC,MAAMK,OAAO,CAACG,KAAK,EAAEG,OAAO,EAAEC,WAAW,IAAIP,OAAO,CAACG,KAAK,EAAEG,OAAO,EAAEE,IAAI,IAAIR,OAAO,CAACG,KAAK,EAAEM,GAAG,IAAI,EAAE,CAAC;IAChI,MAAMC,MAAM,GAAGf,uDAAQ,CAAC,MAAMK,OAAO,CAACG,KAAK,EAAEG,OAAO,EAAEI,MAAM,IAAI,IAAI,CAAC;IACrE,MAAMC,OAAO,GAAGhB,uDAAQ,CAAC,MAAMK,OAAO,CAACG,KAAK,EAAEG,OAAO,EAAEK,OAAO,IAAI,IAAI,CAAC;IACvE,MAAMC,YAAY,GAAGhB,kDAAG,CAAC,KAAK,CAAC;IAC/B,MAAMiB,UAAU,GAAGjB,kDAAG,CAAC,EAAE,CAAC;IAC1B,MAAMkB,WAAW,GAAGlB,kDAAG,CAAC,KAAK,CAAC;IAC9B,MAAMmB,UAAU,GAAGnB,kDAAG,CAAC,EAAE,CAAC;IAE1BC,oDAAK,CAACG,OAAO,EAAE,MAAM;MACnBY,YAAY,CAACT,KAAK,GAAG,KAAK;MAC1BY,UAAU,CAACZ,KAAK,GAAG,EAAE;IACvB,CAAC,CAAC;IAEF,SAASa,eAAeA,CAAA,EAAG;MACzBH,UAAU,CAACV,KAAK,GAAGH,OAAO,CAACG,KAAK,EAAEC,KAAK,IAAI,EAAE;MAC7CW,UAAU,CAACZ,KAAK,GAAG,EAAE;MACrBS,YAAY,CAACT,KAAK,GAAG,IAAI;IAC3B;IAEA,SAASc,gBAAgBA,CAAA,EAAG;MAC1B,IAAIH,WAAW,CAACX,KAAK,EAAE;QACrB;MACF;MACAS,YAAY,CAACT,KAAK,GAAG,KAAK;MAC1BY,UAAU,CAACZ,KAAK,GAAG,EAAE;IACvB;IAEA,eAAee,WAAWA,CAAA,EAAG;MAC3B,IAAI,CAAClB,OAAO,CAACG,KAAK,EAAE;QAClB;MACF;MACAW,WAAW,CAACX,KAAK,GAAG,IAAI;MACxBY,UAAU,CAACZ,KAAK,GAAG,EAAE;MACrB,MAAMgB,EAAE,GAAG,MAAMpB,QAAQ,CAACqB,kBAAkB,CAACpB,OAAO,CAACG,KAAK,CAACM,GAAG,EAAEI,UAAU,CAACV,KAAK,CAAC;MACjFW,WAAW,CAACX,KAAK,GAAG,KAAK;MACzB,IAAIgB,EAAE,EAAE;QACNP,YAAY,CAACT,KAAK,GAAG,KAAK;QAC1B;MACF;MACAY,UAAU,CAACZ,KAAK,GAAGJ,QAAQ,CAACsB,WAAW,IAAI,SAAS;IACtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACsG2F;AACvC;AAuCpD,MAAMK,eAAe,GAAG,GAAG;AAC3B,MAAMC,eAAe,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAtCzB,MAAMC,KAAK,GAAGC,OAyBZ;IAEF,MAAMC,IAAI,GAAGC,MAA0E;IACvF,MAAMhC,QAAQ,GAAGD,0EAAe,CAAC,CAAC;IAClC,MAAMkC,MAAM,GAAGpC,kDAAG,CAAC,IAAI,CAAC;IACxB,MAAMqC,WAAW,GAAGrC,kDAAG,CAAC,IAAI,CAAC;IAC7B,MAAMsC,WAAW,GAAGT,uDAAQ,CAAC;MAC3BU,OAAO,EAAE,KAAK;MACdC,CAAC,EAAE,CAAC;MACJC,CAAC,EAAE,CAAC;MACJC,OAAO,EAAE;IACX,CAAC,CAAC;IAGF,MAAMC,WAAW,GAAGd,uDAAQ,CAAC;MAC3BU,OAAO,EAAE,KAAK;MACdK,GAAG,EAAE,EAAE;MACPhC,IAAI,EAAE,EAAE;MACRiC,KAAK,EAAE,CAAC;MACRC,QAAQ,EAAE,CAAC;MACXC,OAAO,EAAE,CAAC;MACVC,OAAO,EAAE,CAAC;MACVC,QAAQ,EAAE,KAAK;MACfC,UAAU,EAAE,CAAC;MACbC,UAAU,EAAE,CAAC;MACbC,WAAW,EAAE,CAAC;MACdC,WAAW,EAAE;IACf,CAAC,CAAC;IACF,MAAMC,aAAa,GAAGzB,uDAAQ,CAAC;MAC7BU,OAAO,EAAE,KAAK;MACd1B,GAAG,EAAE,EAAE;MACPF,WAAW,EAAE,EAAE;MACf4C,OAAO,EAAE,EAAE;MACXzC,MAAM,EAAE,EAAE;MACVC,OAAO,EAAE,EAAE;MACXyC,QAAQ,EAAE,EAAE;MACZC,UAAU,EAAE,EAAE;MACdC,IAAI,EAAE,EAAE;MACRC,SAAS,EAAE,EAAE;MACbC,YAAY,EAAE,EAAE;MAChBC,UAAU,EAAE,EAAE;MACdC,SAAS,EAAE,KAAK;MAChB7C,UAAU,EAAE,EAAE;MACd8C,MAAM,EAAE,KAAK;MACbC,MAAM,EAAE,KAAK;MACbC,MAAM,EAAE,EAAE;MACVC,KAAK,EAAE;IACT,CAAC,CAAC;IAEF,MAAMC,gBAAgB,GAAGpE,uDAAQ,CAAC,OAAO;MACvCqE,SAAS,EAAE,eAAezB,WAAW,CAACI,OAAO,OAAOJ,WAAW,CAACK,OAAO,gBAAgBL,WAAW,CAACE,KAAK,YAAYF,WAAW,CAACG,QAAQ;IAC1I,CAAC,CAAC,CAAC;IAEH,MAAMuB,SAAS,GAAGtE,uDAAQ,CAAC,MAAM;MAC/B,IAAI,CAACuC,WAAW,CAACI,OAAO,EAAE;QACxB,OAAO,EAAE;MACX;MACA,MAAM4B,YAAY,GAAGhC,WAAW,CAACI,OAAO,CAAC6B,SAAS,KAAK,KAAK;MAC5D,IAAIC,iBAAiB,CAAClC,WAAW,CAACI,OAAO,CAAC,EAAE;QAC1C,OAAO,CACL,IAAI4B,YAAY,GAAG,CAAC;UAAEG,MAAM,EAAE,MAAM;UAAEC,KAAK,EAAE;QAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAC1D;UAAED,MAAM,EAAE,MAAM;UAAEC,KAAK,EAAE;QAAK,CAAC,EAC/B;UAAED,MAAM,EAAE,QAAQ;UAAEC,KAAK,EAAE;QAAK,CAAC,EACjC;UAAED,MAAM,EAAE,QAAQ;UAAEC,KAAK,EAAE;QAAK,EACjC;MACH;MACA,MAAMC,aAAa,GAAGC,UAAU,CAACtC,WAAW,CAACI,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI;MACrE,MAAMmC,KAAK,GAAG,CACZ;QAAEJ,MAAM,EAAE,MAAM;QAAEC,KAAK,EAAE;MAAK,CAAC,EAC/B;QAAED,MAAM,EAAE,QAAQ;QAAEC,KAAK,EAAE;MAAK,CAAC,EACjC;QAAED,MAAM,EAAE,SAAS;QAAEC,KAAK,EAAE;MAAK,CAAC,EAClC;QAAED,MAAM,EAAE,UAAU;QAAEC,KAAK,EAAEC;MAAc,CAAC,EAC5C;QAAEF,MAAM,EAAE,OAAO;QAAEC,KAAK,EAAE;MAAK,CAAC,EAChC;QAAED,MAAM,EAAE,QAAQ;QAAEC,KAAK,EAAE;MAAK,CAAC,EACjC;QAAED,MAAM,EAAE,QAAQ;QAAEC,KAAK,EAAE;MAAK,EACjC;MACD,IAAIJ,YAAY,EAAE;QAChBO,KAAK,CAACC,OAAO,CAAC;UAAEL,MAAM,EAAE,MAAM;UAAEC,KAAK,EAAE;QAAK,CAAC,CAAC;QAC9CG,KAAK,CAACE,IAAI,CAAC;UAAEN,MAAM,EAAE,QAAQ;UAAEC,KAAK,EAAE;QAAK,CAAC,CAAC;MAC/C,CAAC,MAAM,IAAI1C,KAAK,CAACgD,eAAe,EAAE;QAChCH,KAAK,CAACE,IAAI,CAAC;UAAEN,MAAM,EAAE,QAAQ;UAAEC,KAAK,EAAE;QAAK,CAAC,CAAC;MAC/C;MACA,OAAOG,KAAK;IACd,CAAC,CAAC;IAEF,SAASI,cAAcA,CAAA,EAAG;MACxBvD,uDAAQ,CAAC,MAAM;QACb,IAAIU,MAAM,CAAC7B,KAAK,EAAE;UAChB6B,MAAM,CAAC7B,KAAK,CAAC2E,SAAS,GAAG9C,MAAM,CAAC7B,KAAK,CAAC4E,YAAY;QACpD;MACF,CAAC,CAAC;IACJ;IAEA,SAASC,eAAeA,CAACC,SAAS,EAAE;MAClC3D,uDAAQ,CAAC,MAAM;QACb,IAAI,CAACU,MAAM,CAAC7B,KAAK,IAAI,CAAC8E,SAAS,EAAE;UAC/B;QACF;QACA,MAAMC,GAAG,GAAGC,KAAK,CAACC,IAAI,CAACpD,MAAM,CAAC7B,KAAK,CAACkF,gBAAgB,CAAC,cAAc,CAAC,EACjEC,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,OAAO,CAACC,UAAU,KAAKR,SAAS,CAAC;QAC5D,IAAIC,GAAG,EAAE;UACPA,GAAG,CAACQ,cAAc,CAAC;YAAEC,KAAK,EAAE,QAAQ;YAAEC,QAAQ,EAAE;UAAS,CAAC,CAAC;QAC7D;MACF,CAAC,CAAC;IACJ;IAEA/F,oDAAK,CACH,MAAM+B,KAAK,CAACiE,QAAQ,CAACC,GAAG,CAACxD,OAAO,IAAI,GAAGA,OAAO,CAACyD,EAAE,IAAIzD,OAAO,CAAC0D,MAAM,IAAI1D,OAAO,CAAC2D,cAAc,IAAI,EAAE,IAAI3D,OAAO,CAAC4D,UAAU,IAAI,EAAE,IAAI5D,OAAO,CAAC6D,QAAQ,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,EAC3KvB,cAAc,EACd;MAAEwB,SAAS,EAAE;IAAK,CACpB,CAAC;IAEDxG,oDAAK,CACH,MAAM+B,KAAK,CAAC0E,kBAAkB,EAC9BtB,eACF,CAAC;IAEDxD,wDAAS,CAAC,MAAM;MACd+E,QAAQ,CAACC,gBAAgB,CAAC,OAAO,EAAEC,SAAS,CAAC;MAC7CF,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEE,iBAAiB,CAAC;MACvDH,QAAQ,CAACC,gBAAgB,CAAC,aAAa,EAAEG,aAAa,CAAC;MACvDJ,QAAQ,CAACC,gBAAgB,CAAC,WAAW,EAAEI,aAAa,CAAC;IACvD,CAAC,CAAC;IAEFrF,8DAAe,CAAC,MAAM;MACpBgF,QAAQ,CAACM,mBAAmB,CAAC,OAAO,EAAEJ,SAAS,CAAC;MAChDF,QAAQ,CAACM,mBAAmB,CAAC,SAAS,EAAEH,iBAAiB,CAAC;MAC1DH,QAAQ,CAACM,mBAAmB,CAAC,aAAa,EAAEF,aAAa,CAAC;MAC1DJ,QAAQ,CAACM,mBAAmB,CAAC,WAAW,EAAED,aAAa,CAAC;IAC1D,CAAC,CAAC;IAEF,SAASE,eAAeA,CAACxE,OAAO,EAAE;MAChC,OAAOyE,MAAM,CAACzE,OAAO,CAAC4D,UAAU,IAAI5D,OAAO,CAACyD,EAAE,IAAI,EAAE,CAAC;IACvD;IAEA,SAASiB,kBAAkBA,CAAC1E,OAAO,EAAE;MACnC,OAAOA,OAAO,IAAIA,OAAO,CAAC0D,MAAM,KAAK,QAAQ,IAAI1D,OAAO,CAAC0D,MAAM,KAAK,SAAS;IAC/E;IAEA,SAASiB,UAAUA,CAAC3E,OAAO,EAAE;MAC3B,OAAOV,KAAK,CAACsF,kBAAkB,CAACC,QAAQ,CAACL,eAAe,CAACxE,OAAO,CAAC,CAAC;IACpE;IAEA,SAASkC,UAAUA,CAAClC,OAAO,EAAE;MAC3B,OAAOV,KAAK,CAACwF,kBAAkB,CAACD,QAAQ,CAACL,eAAe,CAACxE,OAAO,CAAC,CAAC;IACpE;IAEA,SAAS+E,WAAWA,CAAC/E,OAAO,EAAE;MAC5B,OAAOV,KAAK,CAAC0E,kBAAkB,KAAKQ,eAAe,CAACxE,OAAO,CAAC;IAC9D;IAEA,SAASgF,cAAcA,CAAChF,OAAO,EAAE;MAC/B,OAAOA,OAAO,CAAC6B,SAAS,KAAK,KAAK,KAAK7B,OAAO,CAAC6D,QAAQ,IAAI7D,OAAO,CAAC0D,MAAM,KAAK,UAAU,CAAC;IAC3F;IAEA,SAAS5B,iBAAiBA,CAAC9B,OAAO,EAAE;MAClC,OAAOA,OAAO,CAAC6D,QAAQ,IAAI7D,OAAO,CAAC0D,MAAM,KAAK,UAAU;IAC1D;IAEA,SAASuB,cAAcA,CAACjF,OAAO,EAAE;MAC/B,OAAOA,OAAO,EAAEkF,IAAI,KAAK,OAAO,IAAIlF,OAAO,EAAEmF,UAAU,EAAEjF,GAAG;IAC9D;IAEA,SAASkF,aAAaA,CAACpF,OAAO,EAAE;MAC9B,OAAOA,OAAO,EAAEkF,IAAI,KAAK,MAAM,IAAIlF,OAAO,EAAEmF,UAAU,EAAEjF,GAAG;IAC7D;IAEA,SAASmF,cAAcA,CAACrF,OAAO,EAAE;MAC/B,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC6E,QAAQ,CAAC7E,OAAO,EAAEsF,gBAAgB,IAAI,EAAE,CAAC;IACvE;IAEA,SAASC,eAAeA,CAACvF,OAAO,EAAE;MAChC,OAAOqF,cAAc,CAACrF,OAAO,CAAC,IAAIA,OAAO,EAAE6B,SAAS,KAAK,IAAI;IAC/D;IAEA,SAAS2D,eAAeA,CAACxF,OAAO,EAAE;MAChC,MAAMgB,IAAI,GAAGhB,OAAO,EAAEY,aAAa,EAAEI,IAAI,IAAIhB,OAAO,EAAEyF,UAAU,IAAI,EAAE;MACtE,IAAIzE,IAAI,KAAK,OAAO,EAAE;QACpB,OAAO,IAAI;MACb;MACA,IAAIA,IAAI,KAAK,OAAO,EAAE;QACpB,OAAO,KAAK;MACd;MACA,OAAO,EAAE;IACX;IAEA,SAAS0E,eAAeA,CAAC1F,OAAO,EAAE;MAChC,OAAOA,OAAO,EAAE2F,UAAU,IAAI3F,OAAO,EAAEY,aAAa,EAAE3C,WAAW,IAAI+B,OAAO,EAAE8C,IAAI,IAAI,MAAM;IAC9F;IAEA,SAAS8C,qBAAqBA,CAAC5F,OAAO,EAAE;MACtC,OAAOyE,MAAM,CAACiB,eAAe,CAAC1F,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC6F,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAC1E;IAEA,SAASC,iBAAiBA,CAAC/F,OAAO,EAAE;MAClC,MAAMgG,OAAO,GAAGhG,OAAO,EAAEY,aAAa,IAAI,CAAC,CAAC;MAC5C,MAAMzC,GAAG,GAAG6H,OAAO,CAAC7H,GAAG,IAAI6B,OAAO,EAAE8C,IAAI,IAAI,EAAE;MAC9C,MAAMmD,aAAa,GAAGxI,QAAQ,CAACA,QAAQ,CAACuF,IAAI,CAACtF,OAAO,IAAI+G,MAAM,CAAC/G,OAAO,CAACS,GAAG,IAAIT,OAAO,CAAC+F,EAAE,IAAI,EAAE,CAAC,KAAKtF,GAAG,CAAC,IAAI,IAAI;MAChH,MAAM+H,WAAW,GAAGzB,MAAM,CAACwB,aAAa,EAAEnI,KAAK,IAAI,EAAE,CAAC,CAACqI,IAAI,CAAC,CAAC;MAC7D,MAAMjF,YAAY,GAAGuD,MAAM,CAACuB,OAAO,CAAC9E,YAAY,IAAIgF,WAAW,IAAIF,OAAO,CAACI,WAAW,IAAI,EAAE,CAAC,CAACD,IAAI,CAAC,CAAC;MACpG,MAAMhF,UAAU,GAAGsD,MAAM,CAACuB,OAAO,CAAC7E,UAAU,IAAI,EAAE,CAAC,CAACgF,IAAI,CAAC,CAAC;MAC1D,MAAMtF,OAAO,GAAGmF,OAAO,CAACnF,OAAM,IACzBoF,aAAa,EAAEjI,OAAO,EAAEC,WAAU,IAClCgI,aAAa,EAAEjI,OAAO,EAAEE,IAAG,IAC3B+H,aAAa,EAAEI,KAAI,IACnBX,eAAe,CAAC1F,OAAO,CAAC;MAC7B,MAAM/B,WAAW,GAAGiD,YAAY,IAAIC,UAAU,IAAIN,OAAO,IAAI1C,GAAG;MAChEyC,aAAa,CAACf,OAAO,GAAG,IAAI;MAC5Be,aAAa,CAACzC,GAAG,GAAGA,GAAG;MACvByC,aAAa,CAAC3C,WAAW,GAAGA,WAAW;MACvC2C,aAAa,CAACC,OAAO,GAAGA,OAAO,IAAI,EAAE;MACrCD,aAAa,CAACxC,MAAM,GAAG4H,OAAO,CAAC5H,MAAM,IAAI6H,aAAa,EAAEjI,OAAO,EAAEI,MAAM,IAAI,EAAE;MAC7EwC,aAAa,CAACvC,OAAO,GAAG2H,OAAO,CAAC3H,OAAO,IAAI4H,aAAa,EAAE5H,OAAO,IAAI4H,aAAa,EAAEjI,OAAO,EAAEK,OAAO,IAAI,EAAE;MAC1GuC,aAAa,CAACE,QAAQ,GAAGkF,OAAO,CAAClF,QAAQ,IAAImF,aAAa,EAAEnF,QAAQ,IAAId,OAAO,EAAEsG,cAAc,IAAI,EAAE;MACrG1F,aAAa,CAACG,UAAU,GAAG0D,MAAM,CAACxG,WAAW,IAAI2C,aAAa,CAACzC,GAAG,IAAI,GAAG,CAAC,CAAC0H,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;MACpGlF,aAAa,CAACI,IAAI,GAAGgF,OAAO,CAAChF,IAAI,IAAIhB,OAAO,EAAEyF,UAAU,IAAI,EAAE;MAC9D7E,aAAa,CAACK,SAAS,GAAGuE,eAAe,CAACxF,OAAO,CAAC;MAClDY,aAAa,CAACM,YAAY,GAAGA,YAAY;MACzCN,aAAa,CAACO,UAAU,GAAGA,UAAU;MACrCP,aAAa,CAACQ,SAAS,GAAGmF,OAAO,CAACP,OAAO,CAAC5E,SAAS,IAAI6E,aAAa,CAAC;MACrErF,aAAa,CAACrC,UAAU,GAAG2C,YAAY;MACvCN,aAAa,CAACS,MAAM,GAAG,KAAK;MAC5BT,aAAa,CAACU,MAAM,GAAG,KAAK;MAC5BV,aAAa,CAACW,MAAM,GAAG,EAAE;MACzBX,aAAa,CAACY,KAAK,GAAG,EAAE;MACxB2C,SAAS,CAAC,CAAC;IACb;IAEA,SAASqC,kBAAkBA,CAAA,EAAG;MAC5B,IAAI5F,aAAa,CAACS,MAAM,IAAIT,aAAa,CAACU,MAAM,EAAE;QAChD;MACF;MACAV,aAAa,CAACf,OAAO,GAAG,KAAK;IAC/B;IAEA,eAAe4G,kBAAkBA,CAAA,EAAG;MAClC,IAAI,CAAC7F,aAAa,CAACzC,GAAG,IAAIyC,aAAa,CAACU,MAAM,IAAIV,aAAa,CAACS,MAAM,EAAE;QACtE;MACF;MACAT,aAAa,CAACU,MAAM,GAAG,IAAI;MAC3BV,aAAa,CAACW,MAAM,GAAG,EAAE;MACzBX,aAAa,CAACY,KAAK,GAAG,EAAE;MACxB,MAAM3C,EAAE,GAAG,MAAMpB,QAAQ,CAACiJ,UAAU,CAAC9F,aAAa,CAACzC,GAAG,CAAC;MACvD,IAAIU,EAAE,IAAI4F,MAAM,CAAChH,QAAQ,CAACsB,WAAW,IAAI,EAAE,CAAC,CAAC8F,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAC/DjE,aAAa,CAACQ,SAAS,GAAG,IAAI;QAC9B,MAAMtD,KAAK,GAAG8C,aAAa,CAACrC,UAAU,CAAC4H,IAAI,CAAC,CAAC;QAC7C,IAAIQ,UAAU,GAAG,KAAK;QACtB,IAAI7I,KAAK,EAAE;UACT6I,UAAU,GAAG,MAAMlJ,QAAQ,CAACqB,kBAAkB,CAAC8B,aAAa,CAACzC,GAAG,EAAEL,KAAK,CAAC;UACxE,IAAI6I,UAAU,EAAE;YACd/F,aAAa,CAACM,YAAY,GAAGpD,KAAK;YAClC8C,aAAa,CAAC3C,WAAW,GAAGH,KAAK;YACjC8C,aAAa,CAACG,UAAU,GAAG0D,MAAM,CAAC3G,KAAK,IAAI8C,aAAa,CAACzC,GAAG,IAAI,GAAG,CAAC,CAAC0H,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;UAChG;QACF;QACA,MAAMrI,QAAQ,CAACmJ,eAAe,CAAC;UAAEC,KAAK,EAAE;QAAK,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,IAAIhJ,KAAK,IAAI,CAAC6I,UAAU,EAAE;UACxB/F,aAAa,CAACW,MAAM,GAAG,EAAE;UACzBX,aAAa,CAACY,KAAK,GAAG/D,QAAQ,CAACsB,WAAU,GACrC,WAAWtB,QAAQ,CAACsB,WAAW,EAAC,GAChC,iBAAiB;QACvB,CAAC,MAAM;UACL6B,aAAa,CAACW,MAAM,GAAGzD,KAAK,GAAG,eAAe,GAAIe,EAAE,GAAG,QAAQ,GAAG,MAAO;QAC3E;QACAW,IAAI,CAAC,wBAAwB,EAAE;UAAEuH,MAAM,EAAEnG,aAAa,CAACzC;QAAI,CAAC,CAAC;MAC/D,CAAC,MAAM;QACLyC,aAAa,CAACY,KAAK,GAAG/D,QAAQ,CAACsB,WAAW,IAAI,QAAQ;MACxD;MACA6B,aAAa,CAACU,MAAM,GAAG,KAAK;IAC9B;IAEA,eAAe0F,eAAeA,CAAA,EAAG;MAC/B,IAAI,CAACpG,aAAa,CAACzC,GAAG,IAAIyC,aAAa,CAACS,MAAM,IAAIT,aAAa,CAACU,MAAM,EAAE;QACtE;MACF;MACAV,aAAa,CAACS,MAAM,GAAG,IAAI;MAC3BT,aAAa,CAACW,MAAM,GAAG,EAAE;MACzBX,aAAa,CAACY,KAAK,GAAG,EAAE;MACxB,MAAM3C,EAAE,GAAG,MAAMpB,QAAQ,CAACqB,kBAAkB,CAAC8B,aAAa,CAACzC,GAAG,EAAEyC,aAAa,CAACrC,UAAU,CAAC;MACzF,IAAIM,EAAE,EAAE;QACN,MAAMpB,QAAQ,CAACmJ,eAAe,CAAC;UAAEC,KAAK,EAAE;QAAK,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,MAAMhJ,KAAK,GAAG8C,aAAa,CAACrC,UAAU,CAAC4H,IAAI,CAAC,CAAC;QAC7CvF,aAAa,CAACM,YAAY,GAAGpD,KAAK;QAClC8C,aAAa,CAAC3C,WAAW,GAAGH,KAAK,IAAI8C,aAAa,CAACO,UAAU,IAAIP,aAAa,CAACC,OAAO,IAAID,aAAa,CAACzC,GAAG;QAC3GyC,aAAa,CAACG,UAAU,GAAG0D,MAAM,CAAC7D,aAAa,CAAC3C,WAAW,IAAI2C,aAAa,CAACzC,GAAG,IAAI,GAAG,CAAC,CAAC0H,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;QAClHlF,aAAa,CAACW,MAAM,GAAG,QAAQ;QAC/B/B,IAAI,CAAC,wBAAwB,EAAE;UAAEuH,MAAM,EAAEnG,aAAa,CAACzC;QAAI,CAAC,CAAC;MAC/D,CAAC,MAAM;QACLyC,aAAa,CAACY,KAAK,GAAG/D,QAAQ,CAACsB,WAAW,IAAI,SAAS;MACzD;MACA6B,aAAa,CAACS,MAAM,GAAG,KAAK;IAC9B;IAEA,SAAS4F,eAAeA,CAACjH,OAAO,EAAE;MAChC,MAAMgB,IAAI,GAAGhB,OAAO,EAAEyF,UAAU,IAAI,EAAE;MACtC,IAAIzE,IAAI,KAAK,OAAO,EAAE;QACpB,OAAO,mBAAmB;MAC5B;MACA,IAAIA,IAAI,KAAK,OAAO,EAAE;QACpB,OAAO,mBAAmB;MAC5B;MACA,OAAO,EAAE;IACX;IAEA,SAASkG,cAAcA,CAACC,IAAI,EAAE;MAC5B,MAAMC,KAAK,GAAGC,MAAM,CAACF,IAAI,IAAI,CAAC,CAAC;MAC/B,IAAIC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE;QACxB,OAAO,GAAG,CAACA,KAAK,GAAG,IAAI,GAAG,IAAI,EAAEE,OAAO,CAACF,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK;MACjF;MACA,IAAIA,KAAK,IAAI,IAAI,EAAE;QACjB,OAAO,GAAG,CAACA,KAAK,GAAG,IAAI,EAAEE,OAAO,CAACF,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK;MACnE;MACA,OAAOA,KAAK,GAAG,CAAC,GAAG,GAAGA,KAAK,IAAI,GAAG,EAAE;IACtC;IAEA,SAASG,kBAAkBA,CAACvH,OAAO,EAAE;MACnC,IAAIV,KAAK,CAACkI,aAAa,EAAE;QACvBhI,IAAI,CAAC,eAAe,EAAEQ,OAAO,CAAC;MAChC;IACF;IAEA,SAASyH,gBAAgBA,CAACzH,OAAO,EAAE;MACjC,IAAIV,KAAK,CAACkI,aAAa,EAAE;QACvBhI,IAAI,CAAC,eAAe,EAAEQ,OAAO,CAAC;QAC9B;MACF;MACA0H,eAAe,CAAC1H,OAAO,CAAC;IAC1B;IAEA,SAAS0H,eAAeA,CAAC1H,OAAO,EAAE;MAChC,MAAMmF,UAAU,GAAGnF,OAAO,EAAEmF,UAAU,IAAI,CAAC,CAAC;MAC5C,IAAI,CAACA,UAAU,CAACjF,GAAG,EAAE;QACnB;MACF;MACAiE,SAAS,CAAC,CAAC;MACXlE,WAAW,CAACJ,OAAO,GAAG,IAAI;MAC1BI,WAAW,CAACC,GAAG,GAAGiF,UAAU,CAACjF,GAAG;MAChCD,WAAW,CAAC/B,IAAI,GAAGiH,UAAU,CAACjH,IAAI,IAAI,OAAO;MAC7CyJ,gBAAgB,CAAC,CAAC;IACpB;IAEA,SAASC,gBAAgBA,CAAA,EAAG;MAC1B3H,WAAW,CAACJ,OAAO,GAAG,KAAK;MAC3BI,WAAW,CAACM,QAAQ,GAAG,KAAK;IAC9B;IAEA,SAASoH,gBAAgBA,CAAA,EAAG;MAC1B1H,WAAW,CAACE,KAAK,GAAG,CAAC;MACrBF,WAAW,CAACG,QAAQ,GAAG,CAAC;MACxBH,WAAW,CAACI,OAAO,GAAG,CAAC;MACvBJ,WAAW,CAACK,OAAO,GAAG,CAAC;IACzB;IAEA,SAASuH,eAAeA,CAAChK,KAAK,EAAE;MAC9B,OAAOiK,IAAI,CAACC,GAAG,CAAC1I,eAAe,EAAEyI,IAAI,CAACE,GAAG,CAAC5I,eAAe,EAAEiI,MAAM,CAACxJ,KAAK,CAACyJ,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF;IAEA,SAASW,aAAaA,CAACpK,KAAK,EAAEqK,OAAO,GAAG,IAAI,EAAEC,OAAO,GAAG,IAAI,EAAE;MAC5D,MAAMC,aAAa,GAAGnI,WAAW,CAACE,KAAK;MACvC,MAAMkI,SAAS,GAAGR,eAAe,CAAChK,KAAK,CAAC;MACxC,IAAIwK,SAAS,KAAKD,aAAa,EAAE;QAC/B;MACF;MAEA,IAAIF,OAAO,KAAK,IAAI,IAAIC,OAAO,KAAK,IAAI,IAAIxI,WAAW,CAAC9B,KAAK,EAAE;QAC7D,MAAMyK,IAAI,GAAG3I,WAAW,CAAC9B,KAAK,CAAC0K,qBAAqB,CAAC,CAAC;QACtD,MAAMC,OAAO,GAAGF,IAAI,CAACG,IAAI,GAAGH,IAAI,CAACI,KAAK,GAAG,CAAC;QAC1C,MAAMC,OAAO,GAAGL,IAAI,CAACM,GAAG,GAAGN,IAAI,CAACO,MAAM,GAAG,CAAC;QAC1C,MAAMC,KAAK,GAAGT,SAAS,GAAGD,aAAa,GAAG,CAAC;QAC3CnI,WAAW,CAACI,OAAO,IAAI,CAAC6H,OAAO,GAAGM,OAAO,GAAGvI,WAAW,CAACI,OAAO,IAAIyI,KAAK;QACxE7I,WAAW,CAACK,OAAO,IAAI,CAAC6H,OAAO,GAAGQ,OAAO,GAAG1I,WAAW,CAACK,OAAO,IAAIwI,KAAK;MAC1E;MAEA7I,WAAW,CAACE,KAAK,GAAGkI,SAAS;MAC7B,IAAIA,SAAS,IAAI,CAAC,EAAE;QAClBpI,WAAW,CAACI,OAAO,GAAG,CAAC;QACvBJ,WAAW,CAACK,OAAO,GAAG,CAAC;MACzB;IACF;IAEA,SAASyI,SAASA,CAACC,KAAK,EAAE;MACxBf,aAAa,CAAChI,WAAW,CAACE,KAAK,GAAG6I,KAAK,CAAC;IAC1C;IAEA,SAASC,WAAWA,CAAA,EAAG;MACrBhJ,WAAW,CAACG,QAAQ,GAAG,CAACH,WAAW,CAACG,QAAQ,GAAG,EAAE,IAAI,GAAG;IAC1D;IAEA,SAAS8I,gBAAgBA,CAACC,KAAK,EAAE;MAC/B,MAAMC,MAAM,GAAGD,KAAK,CAACE,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI;MACjDpB,aAAa,CAAChI,WAAW,CAACE,KAAK,GAAGiJ,MAAM,EAAED,KAAK,CAACG,OAAO,EAAEH,KAAK,CAACI,OAAO,CAAC;IACzE;IAEA,SAASC,cAAcA,CAACL,KAAK,EAAE;MAC7B,IAAI,CAAClJ,WAAW,CAACJ,OAAO,IAAII,WAAW,CAACE,KAAK,IAAI,CAAC,EAAE;QAClD;MACF;MACAF,WAAW,CAACM,QAAQ,GAAG,IAAI;MAC3BN,WAAW,CAACO,UAAU,GAAG2I,KAAK,CAACG,OAAO;MACtCrJ,WAAW,CAACQ,UAAU,GAAG0I,KAAK,CAACI,OAAO;MACtCtJ,WAAW,CAACS,WAAW,GAAGT,WAAW,CAACI,OAAO;MAC7CJ,WAAW,CAACU,WAAW,GAAGV,WAAW,CAACK,OAAO;IAC/C;IAEA,SAAS+D,aAAaA,CAAC8E,KAAK,EAAE;MAC5B,IAAI,CAAClJ,WAAW,CAACM,QAAQ,EAAE;QACzB;MACF;MACAN,WAAW,CAACI,OAAO,GAAGJ,WAAW,CAACS,WAAW,GAAGyI,KAAK,CAACG,OAAO,GAAGrJ,WAAW,CAACO,UAAU;MACtFP,WAAW,CAACK,OAAO,GAAGL,WAAW,CAACU,WAAW,GAAGwI,KAAK,CAACI,OAAO,GAAGtJ,WAAW,CAACQ,UAAU;IACxF;IAEA,SAAS6D,aAAaA,CAAA,EAAG;MACvBrE,WAAW,CAACM,QAAQ,GAAG,KAAK;IAC9B;IAEA,SAASkJ,eAAeA,CAAA,EAAG;MACzB,IAAI,CAACxJ,WAAW,CAACC,GAAG,EAAE;QACpB;MACF;MACA,MAAMwJ,WAAW,GAAG,IAAIC,GAAG,CAAC,yBAAyB,EAAEC,MAAM,CAACC,QAAQ,CAACC,MAAM,CAAC;MAC9EJ,WAAW,CAACK,YAAY,CAACC,GAAG,CAAC,KAAK,EAAE/J,WAAW,CAACC,GAAG,CAAC;MACpDwJ,WAAW,CAACK,YAAY,CAACC,GAAG,CAAC,MAAM,EAAE/J,WAAW,CAAC/B,IAAI,IAAI,OAAO,CAAC;MAEjE,MAAM+L,IAAI,GAAGhG,QAAQ,CAACiG,aAAa,CAAC,GAAG,CAAC;MACxCD,IAAI,CAACE,IAAI,GAAGT,WAAW,CAACU,QAAQ,CAAC,CAAC;MAClCH,IAAI,CAACI,QAAQ,GAAGpK,WAAW,CAAC/B,IAAI,IAAI,OAAO;MAC3C+F,QAAQ,CAACqG,IAAI,CAACC,WAAW,CAACN,IAAI,CAAC;MAC/BA,IAAI,CAACO,KAAK,CAAC,CAAC;MACZP,IAAI,CAACQ,MAAM,CAAC,CAAC;IACf;IAEA,SAASC,QAAQA,CAACvB,KAAK,EAAEnJ,OAAO,EAAE;MAChC,IAAI,CAAC0E,kBAAkB,CAAC1E,OAAO,CAAC,EAAE;QAChCmE,SAAS,CAAC,CAAC;QACX;MACF;MACAvE,WAAW,CAACC,OAAO,GAAG,IAAI;MAC1BD,WAAW,CAACI,OAAO,GAAGA,OAAO;MAC7BJ,WAAW,CAACE,CAAC,GAAGgI,IAAI,CAACC,GAAG,CAACoB,KAAK,CAACG,OAAO,EAAEM,MAAM,CAACe,UAAU,GAAG,GAAG,CAAC;MAChE/K,WAAW,CAACG,CAAC,GAAG+H,IAAI,CAACC,GAAG,CAACoB,KAAK,CAACI,OAAO,EAAEK,MAAM,CAACgB,WAAW,GAAG,GAAG,CAAC;IACnE;IAEA,SAASzG,SAASA,CAAA,EAAG;MACnBvE,WAAW,CAACC,OAAO,GAAG,KAAK;MAC3BD,WAAW,CAACI,OAAO,GAAG,IAAI;IAC5B;IAEA,SAASoE,iBAAiBA,CAAC+E,KAAK,EAAE;MAChC,IAAIA,KAAK,CAAC0B,GAAG,KAAK,QAAQ,EAAE;QAC1B,IAAIjK,aAAa,CAACf,OAAO,EAAE;UACzB2G,kBAAkB,CAAC,CAAC;QACtB;QACA,IAAIvG,WAAW,CAACJ,OAAO,EAAE;UACvB+H,gBAAgB,CAAC,CAAC;QACpB;QACAzD,SAAS,CAAC,CAAC;MACb;IACF;IAEA,SAAS2G,gBAAgBA,CAAC/I,MAAM,EAAE;MAChC,IAAInC,WAAW,CAACI,OAAO,EAAE;QACvBR,IAAI,CAAC,gBAAgB,EAAE;UAAEuC,MAAM;UAAE/B,OAAO,EAAEJ,WAAW,CAACI;QAAQ,CAAC,CAAC;MAClE;MACAmE,SAAS,CAAC,CAAC;IACb;IAEA,SAAS4G,UAAUA,CAACC,SAAS,EAAE;MAC7B,OAAO,IAAIC,IAAI,CAACC,cAAc,CAAC,OAAO,EAAE;QACtCC,IAAI,EAAE,SAAS;QACfC,MAAM,EAAE,SAAS;QACjBC,MAAM,EAAE,KAAK;QACbC,QAAQ,EAAEL,IAAI,CAACC,cAAc,CAAC,CAAC,CAACK,eAAe,CAAC,CAAC,CAACD;MACpD,CAAC,CAAC,CAACE,MAAM,CAACR,SAAS,CAAC;IACtB;IAEA,SAASS,aAAaA,CAACzL,OAAO,EAAE;MAC9B,IAAIA,OAAO,CAAC6B,SAAS,KAAK,KAAK,IAAI7B,OAAO,CAAC0D,MAAM,KAAK,QAAQ,IAAI1D,OAAO,CAAC0D,MAAM,KAAK,UAAU,IAAI1D,OAAO,CAAC6D,QAAQ,EAAE;QACnH,OAAO,EAAE;MACX;MAEA,MAAM6H,KAAK,GAAG1L,OAAO,CAAC2D,cAAc,IAAI3D,OAAO,CAAC0D,MAAM;MACtD,IAAIgI,KAAK,KAAK,MAAM,EAAE;QACpB,OAAO,MAAM;MACf;MACA,IAAIA,KAAK,KAAK,WAAW,EAAE;QACzB,OAAO,WAAW;MACpB;MACA,IAAIA,KAAK,KAAK,MAAM,EAAE;QACpB,OAAO,MAAM;MACf;MACA,OAAO,EAAE;IACX;IAEA,SAASC,aAAaA,CAAC3L,OAAO,EAAE;MAC9B,MAAM0L,KAAK,GAAGD,aAAa,CAACzL,OAAO,CAAC;MACpC,IAAI0L,KAAK,KAAK,MAAM,EAAE;QACpB,OAAO,MAAM;MACf;MACA,IAAIA,KAAK,KAAK,WAAW,EAAE;QACzB,OAAO,OAAO;MAChB;MACA,IAAIA,KAAK,KAAK,MAAM,EAAE;QACpB,OAAO,KAAK;MACd;MACA,OAAO,EAAE;IACX;IAEA,SAASE,WAAWA,CAAC5L,OAAO,EAAE;MAC5B,IAAIA,OAAO,CAAC0D,MAAM,KAAK,QAAQ,EAAE;QAC/B,IAAI1D,OAAO,CAAC6L,SAAS,EAAE;UACrB,OAAO7L,OAAO,CAACwB,KAAK,GAAG,MAAMxB,OAAO,CAACwB,KAAK,IAAIxB,OAAO,CAAC6L,SAAS,GAAG,GAAG,MAAM7L,OAAO,CAAC6L,SAAS,EAAE;QAChG;QACA,OAAO7L,OAAO,CAACwB,KAAK,GAAG,MAAMxB,OAAO,CAACwB,KAAK,EAAE,GAAG,IAAI;MACrD;MACA,OAAO,EAAE;IACX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnvBmT;;;;;;;;;;;ACAX;;;;;;;;;;;ACApQ;AAE7B,MAAMuK,kBAAkB,GAAGD,4DAAW,CAAC,YAAY,EAAE;EAC1DJ,KAAK,EAAEA,CAAA,MAAO;IACZM,OAAO,EAAE;EACX,CAAC,CAAC;EACFC,OAAO,EAAE;IACPC,YAAYA,CAAA,EAAG;MACb,IAAI,CAACF,OAAO,GAAG,UAAU;IAC3B,CAAC;IACDG,YAAYA,CAAA,EAAG;MACb,IAAI,CAACH,OAAO,GAAG,UAAU;IAC3B,CAAC;IACDI,aAAaA,CAAA,EAAG;MACd,IAAI,CAACJ,OAAO,GAAG,WAAW;IAC5B;EACF;AACF,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACyCkC;AAC0B;AACL;;;;IAEzD,MAAMM,aAAa,GAAGD,oFAAoB,CAAC,CAAC;IAC5C,MAAME,UAAU,GAAGR,+EAAkB,CAAC,CAAC;IACvC,MAAMS,QAAQ,GAAGnP,uDAAQ,CAAC,MAAMiP,aAAa,CAACG,cAAc,CAAC;IAC7D,MAAMlL,MAAM,GAAGjE,kDAAG,CAAC,EAAE,CAAC;IACtB,MAAMkE,KAAK,GAAGlE,kDAAG,CAAC,EAAE,CAAC;IAErB,SAASoP,aAAaA,CAAA,EAAG;MACvBnL,MAAM,CAAC1D,KAAK,GAAG,EAAE;MACjB2D,KAAK,CAAC3D,KAAK,GAAG,EAAE;IAClB;IAEA,SAAS8O,aAAaA,CAACC,IAAI,EAAE;MAC3B,IAAIA,IAAI,CAACC,iBAAiB,EAAE;QAC1B,OAAOD,IAAI,CAACC,iBAAiB;MAC/B;MACA,MAAMC,YAAY,GAAGR,aAAa,CAACA,aAAa,CAACtJ,IAAI,CAAC+J,KAAK,IAAIA,KAAK,CAACtJ,EAAE,KAAKmJ,IAAI,CAACI,cAAc,CAAC;MAChG,OAAOF,YAAY,EAAEzG,KAAK,IAAIuG,IAAI,CAACI,cAAc,IAAI,MAAM;IAC7D;IAEA,SAASC,YAAYA,CAACL,IAAI,EAAE;MAC1B,OAAOA,IAAI,CAACM,IAAI,IAAI,EAAE;IACxB;IAEA,SAASC,eAAeA,CAACP,IAAI,EAAE;MAC7B,OAAOA,IAAI,EAAE1H,IAAI,KAAK,OAAO,IAAI0H,IAAI,EAAEzH,UAAU,EAAEjF,GAAG;IACxD;IAEA,SAASkN,cAAcA,CAACR,IAAI,EAAE;MAC5B,OAAOA,IAAI,EAAE1H,IAAI,KAAK,MAAM,IAAI0H,IAAI,EAAEzH,UAAU,EAAEjF,GAAG;IACvD;IAEA,SAASmN,gBAAgBA,CAACT,IAAI,EAAE;MAC9B,IAAI,CAACA,IAAI,EAAE;QACT,OAAO,EAAE;MACX;MACA,IAAIA,IAAI,CAACM,IAAI,EAAE;QACb,OAAON,IAAI,CAACM,IAAI;MAClB;MACA,IAAIN,IAAI,CAAC/I,QAAQ,EAAE;QACjB,OAAO+I,IAAI,CAACU,YAAY,IAAI,KAAK;MACnC;MACA,IAAIH,eAAe,CAACP,IAAI,CAAC,EAAE;QACzB,OAAOA,IAAI,CAACzH,UAAU,CAACjF,GAAG;MAC5B;MACA,IAAIkN,cAAc,CAACR,IAAI,CAAC,EAAE;QACxB,OAAO,GAAGA,IAAI,CAACzH,UAAU,CAACjH,IAAI,IAAI,IAAI,IAAI0O,IAAI,CAACzH,UAAU,CAACjF,GAAG,EAAE,CAACiG,IAAI,CAAC,CAAC;MACxE;MACA,OAAOyG,IAAI,CAACW,OAAO,IAAI,EAAE;IAC3B;IAEA,SAASrG,cAAcA,CAACC,IAAI,EAAE;MAC5B,MAAMC,KAAK,GAAGC,MAAM,CAACF,IAAI,IAAI,CAAC,CAAC;MAC/B,IAAIC,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE;QACxB,OAAO,GAAG,CAACA,KAAK,GAAG,IAAI,GAAG,IAAI,EAAEE,OAAO,CAACF,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK;MACjF;MACA,IAAIA,KAAK,IAAI,IAAI,EAAE;QACjB,OAAO,GAAG,CAACA,KAAK,GAAG,IAAI,EAAEE,OAAO,CAACF,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK;MACnE;MACA,OAAOA,KAAK,GAAG,CAAC,GAAG,GAAGA,KAAK,IAAI,GAAG,EAAE;IACtC;IAEA,SAASoG,kBAAkBA,CAACxC,SAAS,EAAE;MACrC,MAAMnN,KAAK,GAAGwJ,MAAM,CAAC2D,SAAS,IAAI,CAAC,CAAC;MACpC,IAAI,CAACnN,KAAK,EAAE;QACV,OAAO,EAAE;MACX;MACA,OAAO,IAAIoN,IAAI,CAACC,cAAc,CAAC,OAAO,EAAE;QACtCuC,IAAI,EAAE,SAAS;QACfC,KAAK,EAAE,SAAS;QAChBC,GAAG,EAAE,SAAS;QACdxC,IAAI,EAAE,SAAS;QACfC,MAAM,EAAE,SAAS;QACjBC,MAAM,EAAE;MACV,CAAC,CAAC,CAACG,MAAM,CAAC3N,KAAK,CAAC;IAClB;IAEA,eAAe+P,YAAYA,CAAA,EAAG;MAC5BlB,aAAa,CAAC,CAAC;MACf,MAAMQ,IAAI,GAAGG,gBAAgB,CAACb,QAAQ,CAAC3O,KAAK,IAAI,CAAC,CAAC,CAAC,CAACsI,IAAI,CAAC,CAAC;MAC1D,IAAI,CAAC+G,IAAI,EAAE;QACT1L,KAAK,CAAC3D,KAAK,GAAG,YAAY;QAC1B;MACF;MACA,IAAI;QACF,MAAMgQ,cAAc,CAACX,IAAI,CAAC;QAC1B3L,MAAM,CAAC1D,KAAK,GAAG,KAAK;MACtB,CAAC,CAAC,OAAOiQ,SAAS,EAAE;QAClBtM,KAAK,CAAC3D,KAAK,GAAG,MAAM;MACtB;IACF;IAEA,eAAegQ,cAAcA,CAACX,IAAI,EAAE;MAClC,IAAIa,SAAS,CAACC,SAAS,EAAEC,SAAS,EAAE;QAClC,MAAMF,SAAS,CAACC,SAAS,CAACC,SAAS,CAACf,IAAI,CAAC;QACzC;MACF;MACA,MAAMjK,OAAO,GAAGgB,QAAQ,CAACiG,aAAa,CAAC,UAAU,CAAC;MAClDjH,OAAO,CAACpF,KAAK,GAAGqP,IAAI;MACpBjK,OAAO,CAACiL,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC;MAC5CjL,OAAO,CAACkL,KAAK,CAACC,QAAQ,GAAG,OAAO;MAChCnL,OAAO,CAACkL,KAAK,CAAC1F,IAAI,GAAG,SAAS;MAC9BxE,QAAQ,CAACqG,IAAI,CAACC,WAAW,CAACtH,OAAO,CAAC;MAClCA,OAAO,CAACoL,MAAM,CAAC,CAAC;MAChBpK,QAAQ,CAACqK,WAAW,CAAC,MAAM,CAAC;MAC5BrK,QAAQ,CAACqG,IAAI,CAACiE,WAAW,CAACtL,OAAO,CAAC;IACpC;IAEA,SAASuL,gBAAgBA,CAAA,EAAG;MAC1B9B,aAAa,CAAC,CAAC;MACf,MAAME,IAAI,GAAGJ,QAAQ,CAAC3O,KAAK;MAC3B,IAAI,CAAC+O,IAAI,EAAEI,cAAc,EAAE;QACzBxL,KAAK,CAAC3D,KAAK,GAAG,SAAS;QACvB;MACF;MACA,MAAMiP,YAAY,GAAGR,aAAa,CAACA,aAAa,CAACtJ,IAAI,CAAC+J,KAAK,IAAIA,KAAK,CAACtJ,EAAE,KAAKmJ,IAAI,CAACI,cAAc,CAAC;MAChG,IAAI,CAACF,YAAY,EAAE;QACjBtL,KAAK,CAAC3D,KAAK,GAAG,kBAAkB;QAChCyO,aAAa,CAACmC,0BAA0B,CAAC,CAAC;QAC1C;MACF;MACAlC,UAAU,CAACL,YAAY,CAAC,CAAC;MACzBI,aAAa,CAACoC,qBAAqB,CAAC9B,IAAI,CAACI,cAAc,CAAC;MACxDpD,MAAM,CAAC+E,UAAU,CAAC,MAAM;QACtBrC,aAAa,CAACsC,YAAY,CAAC;UACzBnL,EAAE,EAAEmJ,IAAI,CAACnJ,EAAE,IAAImJ,IAAI,CAAC/B,GAAG;UACvBjH,UAAU,EAAEgJ,IAAI,CAAChJ,UAAU,IAAIgJ,IAAI,CAAC/B;QACtC,CAAC,CAAC;MACJ,CAAC,EAAE,GAAG,CAAC;IACT;IAEA,SAASgE,cAAcA,CAAA,EAAG;MACxBnC,aAAa,CAAC,CAAC;MACf,MAAM7B,GAAG,GAAG2B,QAAQ,CAAC3O,KAAK,EAAEgN,GAAG,IAAI,EAAE;MACrC,IAAI,CAACA,GAAG,EAAE;QACR;MACF;MACAyB,aAAa,CAACuC,cAAc,CAAChE,GAAG,CAAC;MACjCtJ,MAAM,CAAC1D,KAAK,GAAG,OAAO;IACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACkS4D;AAChB;AACQ;AACL;AACe;AACV;AACD;;;;IAEnD,MAAMyO,aAAa,GAAGD,qFAAoB,CAAC,CAAC;IAC5C,MAAM5O,QAAQ,GAAGD,2EAAe,CAAC,CAAC;IAClC,MAAM0R,OAAO,GAAGD,0EAAe,CAAC,CAAC;IACjC,MAAME,kBAAkB,GAAG9R,wDAAQ,CAAC,MAAMiP,aAAa,CAAC6C,kBAAkB,CAAC;IAC3E,MAAMC,aAAa,GAAG9R,mDAAG,CAAC,KAAK,CAAC;IAChC,MAAM+R,iBAAiB,GAAG/R,mDAAG,CAAC,KAAK,CAAC;IACpC,MAAMgS,gBAAgB,GAAGhS,mDAAG,CAAC,EAAE,CAAC;IAChC,MAAMiS,mBAAmB,GAAGjS,mDAAG,CAAC,KAAK,CAAC;IACtC,MAAMkS,mBAAmB,GAAGlS,mDAAG,CAAC,EAAE,CAAC;IACnC,MAAMmS,kBAAkB,GAAGnS,mDAAG,CAAC,EAAE,CAAC;IAClC,MAAMoS,UAAU,GAAGpS,mDAAG,CAAC,EAAE,CAAC;IAC1B,MAAMqS,SAAS,GAAGrS,mDAAG,CAAC,KAAK,CAAC;IAC5B,MAAMsS,WAAW,GAAGtS,mDAAG,CAAC,IAAI,CAAC;IAC7B,MAAMuS,YAAY,GAAGvS,mDAAG,CAAC,EAAE,CAAC;IAC5B,MAAMwS,eAAe,GAAGxS,mDAAG,CAAC,EAAE,CAAC;IAC/B,MAAMyS,aAAa,GAAGzS,mDAAG,CAAC,EAAE,CAAC;IAC7B,MAAM0S,gBAAgB,GAAG1S,mDAAG,CAAC,EAAE,CAAC;IAChC,MAAM2S,eAAe,GAAG3S,mDAAG,CAAC,EAAE,CAAC;IAC/B,MAAM4S,gBAAgB,GAAG5S,mDAAG,CAAC,EAAE,CAAC;IAChC,MAAM6S,YAAY,GAAG7S,mDAAG,CAAC;MACvBY,IAAI,EAAE,EAAE;MACRkS,YAAY,EAAE,EAAE;MAChBC,WAAW,EAAE;IACf,CAAC,CAAC;IACF,MAAMC,SAAS,GAAGhT,mDAAG,CAAC;MACpBiT,IAAI,EAAE,KAAK;MACXC,YAAY,EAAE,MAAM;MACpBC,aAAa,EAAE,EAAE;MACjBC,WAAW,EAAE,EAAE;MACfC,UAAU,EAAE,OAAO;MACnBC,QAAQ,EAAE;IACZ,CAAC,CAAC;IACF,MAAMC,cAAc,GAAGvT,mDAAG,CAAC,EAAE,CAAC;IAC9B,MAAMwT,aAAa,GAAGxT,mDAAG,CAAC,EAAE,CAAC;IAC7B,MAAMyT,YAAY,GAAG1T,wDAAQ,CAAC,MAAM;MAClC,IAAI,CAAC8R,kBAAkB,CAACtR,KAAK,IAAImT,mBAAmB,CAACnT,KAAK,EAAE;QAC1D,OAAO,EAAE;MACX;MACA,OAAO4G,MAAM,CAAC0K,kBAAkB,CAACtR,KAAK,CAACoT,MAAM,IAAI9B,kBAAkB,CAACtR,KAAK,CAACqT,GAAG,EAAED,MAAM,IAAI9B,kBAAkB,CAACtR,KAAK,CAAC4F,EAAE,EAAE0N,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IACtJ,CAAC,CAAC;IACF,MAAMC,aAAa,GAAG/T,wDAAQ,CAAC,MAAM;MACnC,MAAMgU,MAAM,GAAGN,YAAY,CAAClT,KAAK;MACjC,IAAI,CAACwT,MAAM,EAAE;QACX,OAAO,IAAI;MACb;MACA,OAAO5T,QAAQ,CAACA,QAAQ,CAACuF,IAAI,CAACtF,OAAO,IAAI+G,MAAM,CAAC/G,OAAO,CAACS,GAAG,IAAIT,OAAO,CAAC+F,EAAE,IAAI,EAAE,CAAC,KAAK4N,MAAM,CAAC,IAAI,IAAI;IACtG,CAAC,CAAC;IACF,MAAMC,aAAa,GAAGjU,wDAAQ,CAAC,MAAM;MACnC,MAAMK,OAAO,GAAG0T,aAAa,CAACvT,KAAK;MACnC,MAAMiP,YAAY,GAAGqC,kBAAkB,CAACtR,KAAK,IAAI,CAAC,CAAC;MACnD,MAAMG,OAAO,GAAGN,OAAO,EAAEM,OAAO,IAAI,CAAC,CAAC;MACtC,MAAMC,WAAW,GAAGP,OAAO,EAAEI,KAAI,IAC5BE,OAAO,CAACC,WAAU,IAClBD,OAAO,CAACE,IAAG,IACXR,OAAO,EAAE2I,KAAI,IACbyG,YAAY,CAACzG,KAAI,IACjB0K,YAAY,CAAClT,KAAI,IACjB,MAAM;MACX,MAAMgD,OAAO,GAAG7C,OAAO,CAACC,WAAW,IAAID,OAAO,CAACE,IAAI,IAAIR,OAAO,EAAE2I,KAAK,IAAIyG,YAAY,CAACzG,KAAK,IAAI,EAAE;MAEjG,OAAO;QACLlI,GAAG,EAAE4S,YAAY,CAAClT,KAAK;QACvBI,WAAW;QACX4C,OAAO;QACPzC,MAAM,EAAEJ,OAAO,CAACI,MAAM,IAAI0O,YAAY,CAACoE,GAAG,EAAE9S,MAAM,IAAI,EAAE;QACxDC,OAAO,EAAEL,OAAO,CAACK,OAAO,IAAIyO,YAAY,CAACoE,GAAG,EAAE7S,OAAO,IAAI,EAAE;QAC3DyC,QAAQ,EAAEpD,OAAO,EAAEoD,QAAQ,IAAIgM,YAAY,CAAChM,QAAQ,IAAI,EAAE;QAC1DC,UAAU,EAAE0D,MAAM,CAACxG,WAAW,IAAI,GAAG,CAAC,CAAC4H,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;QAChEhI,KAAK,EAAEJ,OAAO,EAAEI,KAAK,IAAI;MAC3B,CAAC;IACH,CAAC,CAAC;IACF,MAAMkT,mBAAmB,GAAG3T,wDAAQ,CAAC,MAAM;MACzC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAACwH,QAAQ,CAACsK,kBAAkB,CAACtR,KAAK,EAAEqH,IAAI,KAC9DiK,kBAAkB,CAACtR,KAAK,EAAEqT,GAAG,EAAEhM,IAAI,KAAK,OAAO;IACtD,CAAC,CAAC;IACF,MAAMqM,gBAAgB,GAAGlU,wDAAQ,CAAC,MAAM;MACtC,OAAOuS,WAAW,CAAC/R,KAAK,EAAE2T,MAAM,IAAIrC,kBAAkB,CAACtR,KAAK,EAAEmD,IAAI,IAAImO,kBAAkB,CAACtR,KAAK,EAAEqT,GAAG,EAAElQ,IAAI,IAAI,EAAE;IACjH,CAAC,CAAC;IACF,MAAMyQ,YAAY,GAAGpU,wDAAQ,CAAC,MAAMkU,gBAAgB,CAAC1T,KAAK,KAAK,OAAO,CAAC;IACvE,MAAM6T,cAAc,GAAGrU,wDAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAACwH,QAAQ,CAAC0M,gBAAgB,CAAC1T,KAAK,CAAC,CAAC;IAC1F,MAAM8T,qBAAqB,GAAGtU,wDAAQ,CAAC,MAAMwS,YAAY,CAAChS,KAAK,CAAC+T,MAAM,CAACC,MAAM,IAAIA,MAAM,CAAC7Q,IAAI,KAAK,OAAO,CAAC,CAAC;IAC1G,MAAM8Q,mBAAmB,GAAGzU,wDAAQ,CAAC,MAAMwS,YAAY,CAAChS,KAAK,CAAC+T,MAAM,CAACC,MAAM,IAAIA,MAAM,CAAC7Q,IAAI,KAAK,OAAO,CAAC,CAAC;IACxG,MAAM+Q,aAAa,GAAG1U,wDAAQ,CAAC,MAAMiP,aAAa,CAACyF,aAAa,IAAI,IAAI,CAAC;IACzE,MAAMC,kBAAkB,GAAG3U,wDAAQ,CAAC,MAAM0U,aAAa,CAAClU,KAAK,EAAEoU,KAAK,IAAI,IAAI,CAAC;IAC7E,MAAMC,oBAAoB,GAAG7U,wDAAQ,CAAC,MAAM;MAC1C,OAAO0U,aAAa,CAAClU,KAAK,EAAEyH,gBAAgB,KAAK,OAAO,IAAIiB,OAAO,CAACwL,aAAa,CAAClU,KAAK,EAAEoU,KAAK,CAAC;IACjG,CAAC,CAAC;IACF,MAAME,mBAAmB,GAAG9U,wDAAQ,CAAC,MAAM;MACzC,OAAO2U,kBAAkB,CAACnU,KAAK,EAAEuU,MAAM,IAAI;QACzCC,IAAI,EAAE,CAAC;QACPC,MAAM,EAAE,CAAC;QACTC,WAAW,EAAE,CAAC;QACdC,KAAK,EAAE;MACT,CAAC;IACH,CAAC,CAAC;IACF,MAAMC,oBAAoB,GAAGpV,wDAAQ,CAAC,MAAM;MAC1C,OAAOwS,YAAY,CAAChS,KAAK,CAAC+T,MAAM,CAACC,MAAM,IAAI;QACzC,IAAIA,MAAM,CAAC1T,GAAG,KAAK+Q,OAAO,CAACnI,MAAM,IAAI8K,MAAM,CAAC7Q,IAAI,KAAK,OAAO,EAAE;UAC5D,OAAO,KAAK;QACd;QACA,IAAIuQ,gBAAgB,CAAC1T,KAAK,KAAK,OAAO,EAAE;UACtC,OAAOgU,MAAM,CAAC7Q,IAAI,KAAK,QAAQ;QACjC;QACA,OAAOuQ,gBAAgB,CAAC1T,KAAK,KAAK,OAAO;MAC3C,CAAC,CAAC;IACJ,CAAC,CAAC;IACF,MAAM6U,UAAU,GAAGrV,wDAAQ,CAAC,MAAM;MAChC,IAAI8R,kBAAkB,CAACtR,KAAK,EAAEqH,IAAI,KAAK,SAAS,IAAI,CAACoH,aAAa,CAACqG,yBAAyB,EAAE;QAC5F,OAAO,aAAa;MACtB;MACA,OAAOzD,OAAO,CAAC0D,oBAAoB,KAAK1D,OAAO,CAAC2D,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5E,CAAC,CAAC;IAEF,SAASC,gBAAgBA,CAACjV,KAAK,EAAE;MAC/B,MAAMmN,SAAS,GAAG3D,MAAM,CAACxJ,KAAK,IAAI,CAAC,CAAC;MACpC,IAAI,CAACmN,SAAS,EAAE;QACd,OAAO,IAAI;MACb;MACA,OAAO,IAAIC,IAAI,CAACC,cAAc,CAAC,OAAO,EAAE;QACtCuC,IAAI,EAAE,SAAS;QACfC,KAAK,EAAE,SAAS;QAChBC,GAAG,EAAE,SAAS;QACdxC,IAAI,EAAE,SAAS;QACfC,MAAM,EAAE,SAAS;QACjB2H,MAAM,EAAE,SAAS;QACjB1H,MAAM,EAAE,KAAK;QACbC,QAAQ,EAAEL,IAAI,CAACC,cAAc,CAAC,CAAC,CAACK,eAAe,CAAC,CAAC,CAACD;MACpD,CAAC,CAAC,CAACE,MAAM,CAACR,SAAS,CAAC;IACtB;IAEA,SAASgI,gBAAgBA,CAACnB,MAAM,EAAE;MAChC,OAAOA,MAAM,EAAE3T,IAAI,IAAI2T,MAAM,EAAE5T,WAAW,IAAI4T,MAAM,EAAEhR,OAAO,IAAIgR,MAAM,EAAE1T,GAAG,IAAI,GAAG;IACrF;IAEA,SAAS8U,kBAAkBA,CAACpB,MAAM,EAAE;MAClC,OAAOpN,MAAM,CAACuO,gBAAgB,CAACnB,MAAM,CAAC,IAAI,GAAG,CAAC,CAAChM,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAC1E;IAEA,SAASoN,eAAeA,CAAClS,IAAI,EAAE;MAC7B,IAAIA,IAAI,KAAK,OAAO,EAAE;QACpB,OAAO,IAAI;MACb;MACA,IAAIA,IAAI,KAAK,OAAO,EAAE;QACpB,OAAO,KAAK;MACd;MACA,OAAO,EAAE;IACX;IAEA,SAASmS,cAAcA,CAAA,EAAG;MACxB/D,aAAa,CAACvR,KAAK,GAAG,KAAK;IAC7B;IAEA,SAASuV,eAAeA,CAAA,EAAG;MACzB,IAAI,CAACpC,mBAAmB,CAACnT,KAAK,EAAE;QAC9B;MACF;MACAuR,aAAa,CAACvR,KAAK,GAAG,CAACuR,aAAa,CAACvR,KAAK;IAC5C;IAEA,eAAewV,iBAAiBA,CAAA,EAAG;MACjC,IAAI,CAAClE,kBAAkB,CAACtR,KAAK,IAAImT,mBAAmB,CAACnT,KAAK,EAAE;QAC1D;MACF;MACAsV,cAAc,CAAC,CAAC;MAChB3D,mBAAmB,CAAC3R,KAAK,GAAG,EAAE;MAC9B4R,kBAAkB,CAAC5R,KAAK,GAAG,EAAE;MAC7ByR,gBAAgB,CAACzR,KAAK,GAAGyT,aAAa,CAACzT,KAAK,CAACC,KAAK,IAAI,EAAE;MACxDuR,iBAAiB,CAACxR,KAAK,GAAG,IAAI;MAC9BJ,QAAQ,CAACmJ,eAAe,CAAC,CAAC,CAAC0M,IAAI,CAAC,MAAM;QACpC,IAAIjE,iBAAiB,CAACxR,KAAK,EAAE;UAC3ByR,gBAAgB,CAACzR,KAAK,GAAGyT,aAAa,CAACzT,KAAK,CAACC,KAAK,IAAI,EAAE;QAC1D;MACF,CAAC,CAAC,CAACgJ,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpB;IAEA,SAASyM,kBAAkBA,CAAA,EAAG;MAC5B,IAAIhE,mBAAmB,CAAC1R,KAAK,EAAE;QAC7B;MACF;MACAwR,iBAAiB,CAACxR,KAAK,GAAG,KAAK;MAC/B2R,mBAAmB,CAAC3R,KAAK,GAAG,EAAE;MAC9B4R,kBAAkB,CAAC5R,KAAK,GAAG,EAAE;IAC/B;IAEA,eAAe2V,eAAeA,CAAA,EAAG;MAC/B,MAAMnC,MAAM,GAAGC,aAAa,CAACzT,KAAK,CAACM,GAAG;MACtC,IAAI,CAACkT,MAAM,IAAI9B,mBAAmB,CAAC1R,KAAK,EAAE;QACxC;MACF;MACA0R,mBAAmB,CAAC1R,KAAK,GAAG,IAAI;MAChC2R,mBAAmB,CAAC3R,KAAK,GAAG,EAAE;MAC9B4R,kBAAkB,CAAC5R,KAAK,GAAG,EAAE;MAC7B,IAAI;QACF,MAAMgB,EAAE,GAAG,MAAMpB,QAAQ,CAACqB,kBAAkB,CAACuS,MAAM,EAAE/B,gBAAgB,CAACzR,KAAK,CAAC;QAC5E,IAAI,CAACgB,EAAE,EAAE;UACP4Q,kBAAkB,CAAC5R,KAAK,GAAGJ,QAAQ,CAACsB,WAAW,IAAI,SAAS;UAC5D;QACF;QACA,MAAMtB,QAAQ,CAACmJ,eAAe,CAAC;UAAEC,KAAK,EAAE;QAAK,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/D,MAAM2M,gBAAgB,GAAGhW,QAAQ,CAACA,QAAQ,CAACuF,IAAI,CAACtF,OAAO,IAAI+G,MAAM,CAAC/G,OAAO,CAACS,GAAG,IAAIT,OAAO,CAAC+F,EAAE,IAAI,EAAE,CAAC,KAAK4N,MAAM,CAAC,IAAID,aAAa,CAACvT,KAAK;QACrI,MAAM6V,SAAS,GAAGD,gBAAgB,EAAEpN,KAAI,IAClCiJ,gBAAgB,CAACzR,KAAK,IAAIyT,aAAa,CAACzT,KAAK,CAACgD,OAAO,IAAIyQ,aAAa,CAACzT,KAAK,CAACI,WAAW,IAAIoT,MAAO;QACzG/E,aAAa,CAACqH,kBAAkB,CAAC;UAC/B,GAAGxE,kBAAkB,CAACtR,KAAK;UAC3BwI,KAAK,EAAEqN,SAAS;UAChB5S,QAAQ,EAAE2S,gBAAgB,EAAE3S,QAAQ,IAAIqO,kBAAkB,CAACtR,KAAK,EAAEiD,QAAQ,IAAI,EAAE;UAChFC,UAAU,EAAE0D,MAAM,CAACiP,SAAS,IAAI,GAAG,CAAC,CAAC7N,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;UAC9DoL,GAAG,EAAE;YACH,IAAI/B,kBAAkB,CAACtR,KAAK,EAAEqT,GAAG,IAAI,CAAC,CAAC,CAAC;YACxCD,MAAM,EAAEI,MAAM;YACdjT,MAAM,EAAEqV,gBAAgB,EAAEzV,OAAO,EAAEI,MAAM,IAAI+Q,kBAAkB,CAACtR,KAAK,EAAEqT,GAAG,EAAE9S,MAAM,IAAI,EAAE;YACxFC,OAAO,EAAEoV,gBAAgB,EAAEzV,OAAO,EAAEK,OAAO,IAAI8Q,kBAAkB,CAACtR,KAAK,EAAEqT,GAAG,EAAE7S,OAAO,IAAI,EAAE;YAC3FP,KAAK,EAAE2V,gBAAgB,EAAE3V,KAAK,IAAIwR,gBAAgB,CAACzR;UACrD;QACF,CAAC,CAAC;QACFyR,gBAAgB,CAACzR,KAAK,GAAG4V,gBAAgB,EAAE3V,KAAK,IAAIwR,gBAAgB,CAACzR,KAAK;QAC1E2R,mBAAmB,CAAC3R,KAAK,GAAG,QAAQ;MACtC,CAAC,CAAC,OAAO2D,KAAK,EAAE;QACdiO,kBAAkB,CAAC5R,KAAK,GAAG2D,KAAK,CAACxB,OAAO,IAAI,SAAS;MACvD,CAAC,SAAS;QACRuP,mBAAmB,CAAC1R,KAAK,GAAG,KAAK;MACnC;IACF;IAEA,SAAS+V,0BAA0BA,CAAA,EAAG;MACpCnW,QAAQ,CAACmJ,eAAe,CAAC;QAAEC,KAAK,EAAE;MAAK,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;MACzDwF,aAAa,CAACuH,kBAAkB,CAAC;QAAEC,gBAAgB,EAAE;MAAK,CAAC,CAAC;MAC5D,IAAIpE,UAAU,CAAC7R,KAAK,KAAK,SAAS,EAAE;QAClCkW,gBAAgB,CAAC,CAAC;MACpB;IACF;IAEA,SAASC,eAAeA,CAAA,EAAG;MACzBtE,UAAU,CAAC7R,KAAK,GAAG,EAAE;MACrB8R,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACvBoW,qBAAqB,CAAC,CAAC;IACzB;IAEA,eAAeC,eAAeA,CAAA,EAAG;MAC/B,IAAI,CAAChF,OAAO,CAACnI,MAAM,IAAI,CAACoI,kBAAkB,CAACtR,KAAK,EAAEoT,MAAM,EAAE;QACxD,OAAO,IAAI;MACb;MACAtB,SAAS,CAAC9R,KAAK,GAAG,IAAI;MACtB,IAAI;QACF+R,WAAW,CAAC/R,KAAK,GAAG,MAAMmR,mEAAQ,CAACmF,cAAc,CAACjF,OAAO,CAACnI,MAAM,EAAEoI,kBAAkB,CAACtR,KAAK,CAACoT,MAAM,CAAC;QAClG,OAAOrB,WAAW,CAAC/R,KAAK;MAC1B,CAAC,CAAC,OAAO2D,KAAK,EAAE;QACd8K,aAAa,CAAC8H,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,SAAS,CAAC;QACxD,OAAO,IAAI;MACb,CAAC,SAAS;QACR2P,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACzB;IACF;IAEA,eAAewW,iBAAiBA,CAAA,EAAG;MACjC,IAAI,CAACrD,mBAAmB,CAACnT,KAAK,EAAE;QAC9B;MACF;MACAsV,cAAc,CAAC,CAAC;MAChBzD,UAAU,CAAC7R,KAAK,GAAG,UAAU;MAC7B,MAAMqW,eAAe,CAAC,CAAC;IACzB;IAEA,eAAeI,gBAAgBA,CAAA,EAAG;MAChCnB,cAAc,CAAC,CAAC;MAChBzD,UAAU,CAAC7R,KAAK,GAAG,SAAS;MAC5B,MAAMkW,gBAAgB,CAAC,CAAC;IAC1B;IAEA,eAAeA,gBAAgBA,CAAA,EAAG;MAChCpE,SAAS,CAAC9R,KAAK,GAAG,IAAI;MACtB,IAAI;QACFgS,YAAY,CAAChS,KAAK,GAAG,MAAMmR,mEAAQ,CAACuF,eAAe,CAACrF,OAAO,CAACnI,MAAM,EAAEoI,kBAAkB,CAACtR,KAAK,CAACoT,MAAM,CAAC;QACpGjB,gBAAgB,CAACnS,KAAK,GAAGgS,YAAY,CAAChS,KAAI,CACvC+T,MAAM,CAACC,MAAM,IAAIA,MAAM,CAAC7Q,IAAI,KAAK,OAAO,EACxCwC,GAAG,CAACqO,MAAM,IAAIA,MAAM,CAAC1T,GAAG,CAAC;QAC5B,OAAO0R,YAAY,CAAChS,KAAK;MAC3B,CAAC,CAAC,OAAO2D,KAAK,EAAE;QACd8K,aAAa,CAAC8H,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,QAAQ,CAAC;QACvD,OAAO,EAAE;MACX,CAAC,SAAS;QACR2P,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACzB;IACF;IAEA,eAAe2W,cAAcA,CAAA,EAAG;MAC9BrB,cAAc,CAAC,CAAC;MAChBzD,UAAU,CAAC7R,KAAK,GAAG,OAAO;MAC1B,MAAM4W,MAAM,GAAG,MAAMP,eAAe,CAAC,CAAC;MACtCpE,eAAe,CAACjS,KAAK,GAAG4W,MAAM,EAAEC,OAAO,IAAI,EAAE;IAC/C;IAEA,SAASC,cAAcA,CAAC9W,KAAK,EAAE;MAC7B,MAAMmN,SAAS,GAAG3D,MAAM,CAACxJ,KAAK,IAAI,CAAC,CAAC;MACpC,IAAI,CAACmN,SAAS,EAAE;QACd,OAAO,EAAE;MACX;MACA,MAAM4J,IAAI,GAAG,IAAIC,IAAI,CAAC7J,SAAS,CAAC;MAChC,MAAM8J,KAAK,GAAG,IAAID,IAAI,CAACD,IAAI,CAACG,OAAO,CAAC,CAAC,GAAGH,IAAI,CAACI,iBAAiB,CAAC,CAAC,GAAG,KAAK,CAAC;MACzE,OAAOF,KAAK,CAACG,WAAW,CAAC,CAAC,CAACpP,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;IACzC;IAEA,SAASqP,cAAcA,CAACrX,KAAK,EAAE;MAC7B,OAAOA,KAAK,GAAG,IAAIgX,IAAI,CAAChX,KAAK,CAAC,CAACkX,OAAO,CAAC,CAAC,GAAG,CAAC;IAC9C;IAEA,SAASI,uBAAuBA,CAAA,EAAG;MACjClB,qBAAqB,CAAC,CAAC;MACvB9D,YAAY,CAACtS,KAAK,GAAG;QACnBK,IAAI,EAAE0R,WAAW,CAAC/R,KAAK,EAAEK,IAAI,IAAIiR,kBAAkB,CAACtR,KAAK,EAAEwI,KAAK,IAAI,EAAE;QACtE+J,YAAY,EAAER,WAAW,CAAC/R,KAAK,EAAEuS,YAAY,IAAI,EAAE;QACnDC,WAAW,EAAET,WAAW,CAAC/R,KAAK,EAAEwS,WAAW,IAAI;MACjD,CAAC;MACD,MAAM+E,OAAO,GAAGxF,WAAW,CAAC/R,KAAK,EAAEwX,WAAW,IAAI,CAAC,CAAC;MACpD/E,SAAS,CAACzS,KAAK,GAAG;QAChB0S,IAAI,EAAE6E,OAAO,CAAC7E,IAAI,IAAI,KAAK;QAC3BC,YAAY,EAAE4E,OAAO,CAAC5E,YAAY,IAAI,MAAM;QAC5CC,aAAa,EAAEkE,cAAc,CAACS,OAAO,CAACE,UAAU,CAAC;QACjD5E,WAAW,EAAEiE,cAAc,CAACS,OAAO,CAACG,QAAQ,CAAC;QAC7C5E,UAAU,EAAEyE,OAAO,CAACzE,UAAU,IAAI,OAAO;QACzCC,QAAQ,EAAEwE,OAAO,CAACxE,QAAQ,IAAI;MAChC,CAAC;IACH;IAEA,SAASqD,qBAAqBA,CAAA,EAAG;MAC/BpD,cAAc,CAAChT,KAAK,GAAG,EAAE;MACzBiT,aAAa,CAACjT,KAAK,GAAG,EAAE;IAC1B;IAEA,eAAe2X,eAAeA,CAAA,EAAG;MAC/B,IAAI,CAAC9D,cAAc,CAAC7T,KAAK,EAAE;QACzB;MACF;MACAsV,cAAc,CAAC,CAAC;MAChBzD,UAAU,CAAC7R,KAAK,GAAG,QAAQ;MAC3BkS,aAAa,CAAClS,KAAK,GAAG4T,YAAY,CAAC5T,KAAK,GAAG,QAAQ,GAAG,SAAS;MAC/D,MAAMqW,eAAe,CAAC,CAAC;MACvBiB,uBAAuB,CAAC,CAAC;MACzB,MAAMpB,gBAAgB,CAAC,CAAC;IAC1B;IAEA,eAAe0B,iBAAiBA,CAAA,EAAG;MACjC/F,UAAU,CAAC7R,KAAK,GAAG,UAAU;MAC7BqS,gBAAgB,CAACrS,KAAK,GAAG,EAAE;MAC3B,MAAMkW,gBAAgB,CAAC,CAAC;IAC1B;IAEA,eAAe2B,cAAcA,CAAA,EAAG;MAC9B,IAAI,CAACvG,kBAAkB,CAACtR,KAAK,EAAEoT,MAAM,IAAItB,SAAS,CAAC9R,KAAK,EAAE;QACxD;MACF;MACA8R,SAAS,CAAC9R,KAAK,GAAG,IAAI;MACtB,IAAI;QACF,MAAMC,KAAK,GAAG,MAAMkR,mEAAQ,CAAC2G,gBAAgB,CAACzG,OAAO,CAACnI,MAAM,EAAEoI,kBAAkB,CAACtR,KAAK,CAACoT,MAAM,EAAEnB,eAAe,CAACjS,KAAK,CAAC;QACrH+R,WAAW,CAAC/R,KAAK,GAAG;UAClB,IAAI+R,WAAW,CAAC/R,KAAK,IAAI,CAAC,CAAC,CAAC;UAC5B6W,OAAO,EAAE5W;QACX,CAAC;QACDwO,aAAa,CAACsJ,eAAe,CAAC,SAAS,CAAC;QACxC5B,eAAe,CAAC,CAAC;MACnB,CAAC,CAAC,OAAOxS,KAAK,EAAE;QACd8K,aAAa,CAAC8H,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,UAAU,CAAC;MAC3D,CAAC,SAAS;QACR2P,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACzB;IACF;IAEA,SAASgY,WAAWA,CAAC9O,MAAM,EAAE;MAC3B,MAAM+O,QAAQ,GAAG,IAAIC,GAAG,CAAC/F,gBAAgB,CAACnS,KAAK,CAAC;MAChD,IAAIiY,QAAQ,CAACE,GAAG,CAACjP,MAAM,CAAC,EAAE;QACxB+O,QAAQ,CAACG,MAAM,CAAClP,MAAM,CAAC;MACzB,CAAC,MAAM;QACL+O,QAAQ,CAACI,GAAG,CAACnP,MAAM,CAAC;MACtB;MACAiJ,gBAAgB,CAACnS,KAAK,GAAGgF,KAAK,CAACC,IAAI,CAACgT,QAAQ,CAAC;IAC/C;IAEA,SAASK,UAAUA,CAACpP,MAAM,EAAE;MAC1B,MAAM+O,QAAQ,GAAG,IAAIC,GAAG,CAAC9F,eAAe,CAACpS,KAAK,CAAC;MAC/C,IAAIiY,QAAQ,CAACE,GAAG,CAACjP,MAAM,CAAC,EAAE;QACxB+O,QAAQ,CAACG,MAAM,CAAClP,MAAM,CAAC;MACzB,CAAC,MAAM;QACL+O,QAAQ,CAACI,GAAG,CAACnP,MAAM,CAAC;MACtB;MACAkJ,eAAe,CAACpS,KAAK,GAAGgF,KAAK,CAACC,IAAI,CAACgT,QAAQ,CAAC;IAC9C;IAEA,eAAeM,eAAeA,CAAA,EAAG;MAC/B,IAAI,CAACjH,kBAAkB,CAACtR,KAAK,EAAEoT,MAAM,IAAItB,SAAS,CAAC9R,KAAK,EAAE;QACxD;MACF;MACA8R,SAAS,CAAC9R,KAAK,GAAG,IAAI;MACtB,IAAI;QACF,MAAMmR,mEAAQ,CAACqH,cAAc,CAACnH,OAAO,CAACnI,MAAM,EAAEoI,kBAAkB,CAACtR,KAAK,CAACoT,MAAM,EAAEjB,gBAAgB,CAACnS,KAAK,CAAC;QACtGgS,YAAY,CAAChS,KAAK,GAAGgS,YAAY,CAAChS,KAAK,CAAC2F,GAAG,CAACqO,MAAM,IAAI;UACpD,IAAIA,MAAM,CAAC7Q,IAAI,KAAK,OAAO,EAAE;YAC3B,OAAO6Q,MAAM;UACf;UACA,OAAO;YACL,GAAGA,MAAM;YACT7Q,IAAI,EAAEgP,gBAAgB,CAACnS,KAAK,CAACgH,QAAQ,CAACgN,MAAM,CAAC1T,GAAG,CAAC,GAAG,OAAO,GAAG;UAChE,CAAC;QACH,CAAC,CAAC;QACFmO,aAAa,CAACsJ,eAAe,CAAC,QAAQ,CAAC;MACzC,CAAC,CAAC,OAAOpU,KAAK,EAAE;QACd8K,aAAa,CAAC8H,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,SAAS,CAAC;MAC1D,CAAC,SAAS;QACR2P,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACzB;IACF;IAEA,eAAeyY,gBAAgBA,CAAA,EAAG;MAChC,IAAI,CAACnH,kBAAkB,CAACtR,KAAK,EAAEoT,MAAM,IAAItB,SAAS,CAAC9R,KAAK,EAAE;QACxD;MACF;MACA8R,SAAS,CAAC9R,KAAK,GAAG,IAAI;MACtB,IAAI;QACF,MAAM0Y,MAAM,GAAG,MAAMvH,mEAAQ,CAACwH,kBAAkB,CAACtH,OAAO,CAACnI,MAAM,EAAEoI,kBAAkB,CAACtR,KAAK,CAACoT,MAAM,EAAEd,YAAY,CAACtS,KAAK,CAAC;QACrH+R,WAAW,CAAC/R,KAAK,GAAG;UAClB,IAAI+R,WAAW,CAAC/R,KAAK,IAAI,CAAC,CAAC,CAAC;UAC5BK,IAAI,EAAEqY,MAAM,CAACrY,IAAI;UACjBkS,YAAY,EAAEmG,MAAM,CAACnG,YAAY;UACjCC,WAAW,EAAEkG,MAAM,CAAClG;QACtB,CAAC;QACD/D,aAAa,CAACqH,kBAAkB,CAAC;UAC/B,GAAGxE,kBAAkB,CAACtR,KAAK;UAC3BwI,KAAK,EAAEkQ,MAAM,CAACrY,IAAI;UAClB6C,UAAU,EAAE0D,MAAM,CAAC8R,MAAM,CAACrY,IAAI,IAAI,GAAG,CAAC,CAAC2H,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;UAChE2Q,SAAS,EAAEpP,MAAM,CAACkP,MAAM,CAACE,SAAS,IAAI5B,IAAI,CAAC6B,GAAG,CAAC,CAAC;QAClD,CAAC,CAAC;QACFpK,aAAa,CAACsJ,eAAe,CAAC,QAAQ,CAAC;MACzC,CAAC,CAAC,OAAOpU,KAAK,EAAE;QACd8K,aAAa,CAAC8H,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,SAAS,CAAC;MAC1D,CAAC,SAAS;QACR2P,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACzB;IACF;IAEA,eAAe8Y,mBAAmBA,CAAA,EAAG;MACnC,IAAI,CAAC1G,eAAe,CAACpS,KAAK,CAAC+Y,MAAM,IAAIjH,SAAS,CAAC9R,KAAK,EAAE;QACpD;MACF;MACA,IAAI,CAAC+L,MAAM,CAACiN,OAAO,CAAC,cAAc,CAAC,EAAE;QACnC;MACF;MACAlH,SAAS,CAAC9R,KAAK,GAAG,IAAI;MACtB,IAAI;QACF,MAAM0Y,MAAM,GAAG,MAAMvH,mEAAQ,CAAC8H,gBAAgB,CAAC5H,OAAO,CAACnI,MAAM,EAAEoI,kBAAkB,CAACtR,KAAK,CAACoT,MAAM,EAAEhB,eAAe,CAACpS,KAAK,CAAC;QACtH,MAAMkZ,OAAO,GAAG,IAAIhB,GAAG,CAACQ,MAAM,CAACS,UAAU,IAAI/G,eAAe,CAACpS,KAAK,CAAC;QACnEgS,YAAY,CAAChS,KAAK,GAAGgS,YAAY,CAAChS,KAAK,CAAC+T,MAAM,CAACC,MAAM,IAAI,CAACkF,OAAO,CAACf,GAAG,CAACnE,MAAM,CAAC1T,GAAG,CAAC,CAAC;QAClF8R,eAAe,CAACpS,KAAK,GAAG,EAAE;QAC1ByO,aAAa,CAACsJ,eAAe,CAAC,OAAO,CAAC;MACxC,CAAC,CAAC,OAAOpU,KAAK,EAAE;QACd8K,aAAa,CAAC8H,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,MAAM,CAAC;MACvD,CAAC,SAAS;QACR2P,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACzB;IACF;IAEA,eAAeoZ,eAAeA,CAAA,EAAG;MAC/B,IAAI,CAAC9H,kBAAkB,CAACtR,KAAK,EAAEoT,MAAM,IAAItB,SAAS,CAAC9R,KAAK,EAAE;QACxD;MACF;MACAoW,qBAAqB,CAAC,CAAC;MACvBtE,SAAS,CAAC9R,KAAK,GAAG,IAAI;MACtB,IAAI;QACF,MAAMuX,OAAO,GAAG,MAAMpG,mEAAQ,CAACkI,sBAAsB,CAAChI,OAAO,CAACnI,MAAM,EAAEoI,kBAAkB,CAACtR,KAAK,CAACoT,MAAM,EAAE;UACrGV,IAAI,EAAED,SAAS,CAACzS,KAAK,CAAC0S,IAAI;UAC1BC,YAAY,EAAEF,SAAS,CAACzS,KAAK,CAAC2S,YAAY;UAC1C8E,UAAU,EAAEJ,cAAc,CAAC5E,SAAS,CAACzS,KAAK,CAAC4S,aAAa,CAAC;UACzD8E,QAAQ,EAAEL,cAAc,CAAC5E,SAAS,CAACzS,KAAK,CAAC6S,WAAW,CAAC;UACrDC,UAAU,EAAEL,SAAS,CAACzS,KAAK,CAAC8S,UAAU;UACtCC,QAAQ,EAAEN,SAAS,CAACzS,KAAK,CAAC+S;QAC5B,CAAC,CAAC;QACFhB,WAAW,CAAC/R,KAAK,GAAG;UAClB,IAAI+R,WAAW,CAAC/R,KAAK,IAAI,CAAC,CAAC,CAAC;UAC5BwX,WAAW,EAAED;QACf,CAAC;QACDvE,cAAc,CAAChT,KAAK,GAAG,SAAS;MAClC,CAAC,CAAC,OAAO2D,KAAK,EAAE;QACdsP,aAAa,CAACjT,KAAK,GAAG2D,KAAK,CAACxB,OAAO,IAAI,UAAU;MACnD,CAAC,SAAS;QACR2P,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACzB;IACF;IAEA,eAAesZ,iBAAiBA,CAAA,EAAG;MACjC,IAAI,CAAChI,kBAAkB,CAACtR,KAAK,IAAI8R,SAAS,CAAC9R,KAAK,EAAE;QAChD;MACF;MACA,IAAI,CAAC+L,MAAM,CAACiN,OAAO,CAAC,UAAU,CAAC,EAAE;QAC/B;MACF;MACAlH,SAAS,CAAC9R,KAAK,GAAG,IAAI;MACtB,MAAMgB,EAAE,GAAG,MAAMyN,aAAa,CAAC8K,UAAU,CAACjI,kBAAkB,CAACtR,KAAK,CAAC;MACnE8R,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACvB,IAAIgB,EAAE,EAAE;QACNmV,eAAe,CAAC,CAAC;MACnB;IACF;IAEA,eAAeqD,mBAAmBA,CAAA,EAAG;MACnC,IAAI,CAAClI,kBAAkB,CAACtR,KAAK,IAAI8R,SAAS,CAAC9R,KAAK,EAAE;QAChD;MACF;MACA,IAAI,CAAC+L,MAAM,CAACiN,OAAO,CAAC,yBAAyB,CAAC,EAAE;QAC9C;MACF;MACAlH,SAAS,CAAC9R,KAAK,GAAG,IAAI;MACtB,MAAMgB,EAAE,GAAG,MAAMyN,aAAa,CAACgL,YAAY,CAACnI,kBAAkB,CAACtR,KAAK,CAAC;MACrE8R,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACvB,IAAIgB,EAAE,EAAE;QACNmV,eAAe,CAAC,CAAC;MACnB;IACF;IAEA,eAAeuD,oBAAoBA,CAAA,EAAG;MACpC,IAAI,CAACpI,kBAAkB,CAACtR,KAAK,EAAEoT,MAAM,IAAI,CAACf,gBAAgB,CAACrS,KAAK,IAAI8R,SAAS,CAAC9R,KAAK,EAAE;QACnF;MACF;MACA,IAAI,CAAC+L,MAAM,CAACiN,OAAO,CAAC,cAAc,CAAC,EAAE;QACnC;MACF;MACAlH,SAAS,CAAC9R,KAAK,GAAG,IAAI;MACtB,IAAI;QACF,MAAMmR,mEAAQ,CAACwI,aAAa,CAACtI,OAAO,CAACnI,MAAM,EAAEoI,kBAAkB,CAACtR,KAAK,CAACoT,MAAM,EAAEf,gBAAgB,CAACrS,KAAK,CAAC;QACrG+R,WAAW,CAAC/R,KAAK,GAAG;UAClB,IAAI+R,WAAW,CAAC/R,KAAK,IAAI,CAAC,CAAC,CAAC;UAC5B2T,MAAM,EAAE;QACV,CAAC;QACDrC,kBAAkB,CAACtR,KAAK,CAACmD,IAAI,GAAG,QAAQ;QACxC,IAAImO,kBAAkB,CAACtR,KAAK,CAACqT,GAAG,EAAE;UAChC/B,kBAAkB,CAACtR,KAAK,CAACqT,GAAG,CAAClQ,IAAI,GAAG,QAAQ;QAC9C;QACAsL,aAAa,CAACsJ,eAAe,CAAC,OAAO,CAAC;QACtC5B,eAAe,CAAC,CAAC;QACjB1H,aAAa,CAACmC,0BAA0B,CAAC,CAAC;MAC5C,CAAC,CAAC,OAAOjN,KAAK,EAAE;QACd8K,aAAa,CAAC8H,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,QAAQ,CAAC;MACzD,CAAC,SAAS;QACR2P,SAAS,CAAC9R,KAAK,GAAG,KAAK;MACzB;IACF;IAEA,SAAS4Z,YAAYA,CAAC5F,MAAM,EAAE;MAC5B,OAAOpN,MAAM,CAACoN,MAAM,CAAC5T,WAAW,IAAI4T,MAAM,CAAC1T,GAAG,IAAI,GAAG,CAAC,CAAC0H,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAClF;IAEA7B,QAAQ,CAACC,gBAAgB,CAAC,OAAO,EAAEiP,cAAc,CAAC;IAClDlU,+DAAe,CAAC,MAAM;MACpBgF,QAAQ,CAACM,mBAAmB,CAAC,OAAO,EAAE4O,cAAc,CAAC;IACvD,CAAC,CAAC;IAEF5V,qDAAK,CACH,MAAM4R,kBAAkB,CAACtR,KAAK,EAAE4F,EAAE,EAClC,MAAM;MACJ0P,cAAc,CAAC,CAAC;MAChBI,kBAAkB,CAAC,CAAC;MACpBS,eAAe,CAAC,CAAC;MACjBpE,WAAW,CAAC/R,KAAK,GAAG,IAAI;MACxBgS,YAAY,CAAChS,KAAK,GAAG,EAAE;MACvBiS,eAAe,CAACjS,KAAK,GAAG,EAAE;MAC1BmS,gBAAgB,CAACnS,KAAK,GAAG,EAAE;MAC3BoS,eAAe,CAACpS,KAAK,GAAG,EAAE;MAC1BqS,gBAAgB,CAACrS,KAAK,GAAG,EAAE;MAC3BkS,aAAa,CAAClS,KAAK,GAAG,EAAE;IAC1B,CACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACt/ByB;;;;;;;;;;;;;;;;;IAE1B,MAAMyB,KAAK,GAAGC,OASZ;IAEF,MAAMC,IAAI,GAAGC,MAAwD;IACrE,MAAMyN,IAAI,GAAG5P,kDAAG,CAAC,EAAE,CAAC;IACpB,MAAMoa,SAAS,GAAGpa,kDAAG,CAAC,KAAK,CAAC;IAC5B,MAAMqa,UAAU,GAAGra,kDAAG,CAAC,KAAK,CAAC;IAC7B,MAAMsa,UAAU,GAAGta,kDAAG,CAAC,IAAI,CAAC;IAC5B,MAAMua,UAAU,GAAGva,kDAAG,CAAC,IAAI,CAAC;IAC5B,MAAMwa,SAAS,GAAGxa,kDAAG,CAAC,IAAI,CAAC;IAC3B,IAAIya,SAAS,GAAG,CAAC;IACjB,MAAMC,SAAS,GAAG,CAChB,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAC9C,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAG,CAC3C;IAED,SAASC,MAAMA,CAAA,EAAG;MAChB,MAAMpa,KAAK,GAAGqP,IAAI,CAACrP,KAAK,CAACsI,IAAI,CAAC,CAAC;MAC/B,IAAI,CAACtI,KAAK,EAAE;QACV;MACF;MACA2B,IAAI,CAAC,MAAM,EAAE3B,KAAK,CAAC;MACnBqP,IAAI,CAACrP,KAAK,GAAG,EAAE;MACf6Z,SAAS,CAAC7Z,KAAK,GAAG,KAAK;IACzB;IAEA,SAASqa,iBAAiBA,CAAA,EAAG;MAC3BR,SAAS,CAAC7Z,KAAK,GAAG,CAAC6Z,SAAS,CAAC7Z,KAAK;IACpC;IAEA,SAASsa,WAAWA,CAACC,KAAK,EAAE;MAC1B,MAAMnV,OAAO,GAAG2U,UAAU,CAAC/Z,KAAK;MAChC,IAAI,CAACoF,OAAO,EAAE;QACZiK,IAAI,CAACrP,KAAK,IAAIua,KAAK;QACnB;MACF;MACA,MAAMC,KAAK,GAAGpV,OAAO,CAACqV,cAAc,IAAIpL,IAAI,CAACrP,KAAK,CAAC+Y,MAAM;MACzD,MAAM2B,GAAG,GAAGtV,OAAO,CAACuV,YAAY,IAAItL,IAAI,CAACrP,KAAK,CAAC+Y,MAAM;MACrD1J,IAAI,CAACrP,KAAK,GAAG,GAAGqP,IAAI,CAACrP,KAAK,CAACgI,KAAK,CAAC,CAAC,EAAEwS,KAAK,CAAC,GAAGD,KAAK,GAAGlL,IAAI,CAACrP,KAAK,CAACgI,KAAK,CAAC0S,GAAG,CAAC,EAAE;MAC5EE,qBAAqB,CAAC,MAAM;QAC1BxV,OAAO,CAACyV,KAAK,CAAC,CAAC;QACf,MAAMC,MAAM,GAAGN,KAAK,GAAGD,KAAK,CAACxB,MAAM;QACnC3T,OAAO,CAAC2V,iBAAiB,CAACD,MAAM,EAAEA,MAAM,CAAC;MAC3C,CAAC,CAAC;IACJ;IAEA,SAASE,WAAWA,CAAA,EAAG;MACrBhB,UAAU,CAACha,KAAK,EAAE2M,KAAK,CAAC,CAAC;IAC3B;IAEA,SAASsO,UAAUA,CAAA,EAAG;MACpBhB,SAAS,CAACja,KAAK,EAAE2M,KAAK,CAAC,CAAC;IAC1B;IAEA,SAASuO,qBAAqBA,CAACC,IAAI,EAAEC,YAAY,GAAG,MAAM,EAAE;MAC1D,IAAID,IAAI,EAAE9T,IAAI,EAAEgU,UAAU,CAAC,QAAQ,CAAC,EAAE;QACpC,OAAO,OAAO;MAChB;MACA,OAAOD,YAAY,KAAK,OAAO,GAAG,OAAO,GAAG,MAAM;IACpD;IAEA,SAASE,SAASA,CAACC,KAAK,EAAEH,YAAY,GAAG,MAAM,EAAE;MAC/C,IAAI3Z,KAAK,CAAC+Z,QAAQ,EAAE;QAClB;MACF;MACA,MAAMC,UAAU,GAAGzW,KAAK,CAACC,IAAI,CAACsW,KAAK,IAAI,EAAE,CAAC,CAACxH,MAAM,CAACoH,IAAI,IAAIA,IAAI,YAAYO,IAAI,IAAIP,IAAI,CAAC7R,IAAI,GAAG,CAAC,CAAC;MAChG,IAAI,CAACmS,UAAU,CAAC1C,MAAM,EAAE;QACtB;MACF;MAEA,MAAM4C,OAAO,GAAGtM,IAAI,CAACrP,KAAK,CAACsI,IAAI,CAAC,CAAC;MACjCmT,UAAU,CAACG,OAAO,CAAC,CAACT,IAAI,EAAEU,KAAK,KAAK;QAClCla,IAAI,CAAC,iBAAiB,EAAE;UACtB0F,IAAI,EAAE6T,qBAAqB,CAACC,IAAI,EAAEC,YAAY,CAAC;UAC/CD,IAAI;UACJ9L,IAAI,EAAEwM,KAAK,KAAK,CAAC,GAAGF,OAAO,GAAG;QAChC,CAAC,CAAC;MACJ,CAAC,CAAC;MACFtM,IAAI,CAACrP,KAAK,GAAG,EAAE;MACf6Z,SAAS,CAAC7Z,KAAK,GAAG,KAAK;IACzB;IAEA,SAAS8b,gBAAgBA,CAACxQ,KAAK,EAAEjE,IAAI,EAAE;MACrC,MAAM0U,KAAK,GAAGzQ,KAAK,CAAC8H,MAAM;MAC1B,MAAMmI,KAAK,GAAGQ,KAAK,CAACR,KAAK,GAAGvW,KAAK,CAACC,IAAI,CAAC8W,KAAK,CAACR,KAAK,CAAC,GAAG,EAAE;MACxDQ,KAAK,CAAC/b,KAAK,GAAG,EAAE;MAChB,IAAI,CAACub,KAAK,CAACxC,MAAM,IAAItX,KAAK,CAAC+Z,QAAQ,EAAE;QACnC;MACF;MACAF,SAAS,CAACC,KAAK,EAAElU,IAAI,CAAC;IACxB;IAEA,SAAS2U,eAAeA,CAAC1Q,KAAK,EAAE;MAC9B,MAAM2Q,KAAK,GAAGjX,KAAK,CAACC,IAAI,CAACqG,KAAK,CAAC4Q,YAAY,EAAED,KAAK,IAAI,EAAE,CAAC;MACzD,OAAOA,KAAK,CAACjV,QAAQ,CAAC,OAAO,CAAC;IAChC;IAEA,SAASmV,eAAeA,CAAC7Q,KAAK,EAAE;MAC9B,IAAI7J,KAAK,CAAC+Z,QAAQ,IAAI,CAACQ,eAAe,CAAC1Q,KAAK,CAAC,EAAE;QAC7C;MACF;MACA4O,SAAS,IAAI,CAAC;MACdJ,UAAU,CAAC9Z,KAAK,GAAG,IAAI;MACvBsL,KAAK,CAAC4Q,YAAY,CAACE,UAAU,GAAG,MAAM;IACxC;IAEA,SAASC,cAAcA,CAAC/Q,KAAK,EAAE;MAC7B,IAAI7J,KAAK,CAAC+Z,QAAQ,IAAI,CAACQ,eAAe,CAAC1Q,KAAK,CAAC,EAAE;QAC7C;MACF;MACAwO,UAAU,CAAC9Z,KAAK,GAAG,IAAI;MACvBsL,KAAK,CAAC4Q,YAAY,CAACE,UAAU,GAAG,MAAM;IACxC;IAEA,SAASE,eAAeA,CAAA,EAAG;MACzBpC,SAAS,GAAGjQ,IAAI,CAACE,GAAG,CAAC,CAAC,EAAE+P,SAAS,GAAG,CAAC,CAAC;MACtC,IAAIA,SAAS,KAAK,CAAC,EAAE;QACnBJ,UAAU,CAAC9Z,KAAK,GAAG,KAAK;MAC1B;IACF;IAEA,SAASuc,qBAAqBA,CAACL,YAAY,EAAE;MAC3C,MAAM5X,KAAK,GAAGU,KAAK,CAACC,IAAI,CAACiX,YAAY,EAAE5X,KAAK,IAAI,EAAE,CAAC;MACnD,MAAMiX,KAAK,GAAGjX,KAAI,CACfyP,MAAM,CAAChF,IAAI,IAAIA,IAAI,CAACyN,IAAI,KAAK,MAAM,IAAI,CAACzN,IAAI,CAAC0N,gBAAgB,GAAG,CAAC,EAAEC,WAAW,EAC9E/W,GAAG,CAACoJ,IAAI,IAAIA,IAAI,CAAC4N,SAAS,CAAC,CAAC,EAC5B5I,MAAM,CAACrL,OAAO,CAAC;MAClB,IAAI6S,KAAK,CAACxC,MAAM,EAAE;QAChB,OAAOwC,KAAK;MACd;MACA,OAAOvW,KAAK,CAACC,IAAI,CAACiX,YAAY,EAAEX,KAAK,IAAI,EAAE,CAAC;IAC9C;IAEA,SAASqB,UAAUA,CAACtR,KAAK,EAAE;MACzB4O,SAAS,GAAG,CAAC;MACbJ,UAAU,CAAC9Z,KAAK,GAAG,KAAK;MACxB,IAAIyB,KAAK,CAAC+Z,QAAQ,EAAE;QAClB;MACF;MACAF,SAAS,CAACiB,qBAAqB,CAACjR,KAAK,CAAC4Q,YAAY,CAAC,CAAC;IACtD;IAEA,SAASW,uBAAuBA,CAACC,aAAa,EAAE;MAC9C,OAAO9X,KAAK,CAACC,IAAI,CAAC6X,aAAa,EAAExY,KAAK,IAAI,EAAE,EACzCyP,MAAM,CAAChF,IAAI,IAAIA,IAAI,CAACyN,IAAI,KAAK,MAAM,IAAIzN,IAAI,CAAC1H,IAAI,CAACgU,UAAU,CAAC,QAAQ,CAAC,EACrE1V,GAAG,CAACoJ,IAAI,IAAIA,IAAI,CAAC4N,SAAS,CAAC,CAAC,EAC5B5I,MAAM,CAACrL,OAAO,CAAC;IACpB;IAEA,SAASqU,WAAWA,CAACzR,KAAK,EAAE;MAC1B,IAAI7J,KAAK,CAAC+Z,QAAQ,EAAE;QAClB;MACF;MACA,MAAMwB,UAAU,GAAGH,uBAAuB,CAACvR,KAAK,CAACwR,aAAa,CAAC;MAC/D,IAAI,CAACE,UAAU,CAACjE,MAAM,EAAE;QACtB;MACF;MACAzN,KAAK,CAAC2R,cAAc,CAAC,CAAC;MACtB3B,SAAS,CAAC0B,UAAU,EAAE,OAAO,CAAC;IAChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7N4E;AACL;;AAEvE,oBAAoB,uGAAM;;AAE1B,sDAAe;;;;;;;;;;;ACLqS;;;;;;;;ACAvO;AACL;;AAExE,oBAAoB,wGAAM;;AAE1B,sDAAe;;;;;;;;;;;;;;ACCwB;AACY;AACA;AACA;AACW;;;;IAE9D,MAAM3L,OAAO,GAAGD,yEAAe,CAAC,CAAC;IACjC,MAAM3C,aAAa,GAAGD,oFAAoB,CAAC,CAAC;IAE5CnN,wDAAS,CAAC,MAAM;MACdgQ,OAAO,CAAC+L,OAAO,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF1d,oDAAK,CAAC,MAAM2R,OAAO,CAACnI,MAAM,EAAEA,MAAM,IAAI;MACpC,IAAIA,MAAM,IAAImI,OAAO,CAACgM,eAAe,EAAE;QACrC5O,aAAa,CAAC6O,iBAAiB,CAAC,CAAC;QACjC;MACF;MACA7O,aAAa,CAAC8O,cAAc,CAAC,CAAC;IAChC,CAAC,CAAC;;;;;;;;;;;;;;;;;ACzBuE;AACL;;AAEpE,oBAAoB,oGAAM;;AAE1B,sDAAe;;;;;;;;;;;ACLkS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACAvR;AACW;AAErC,MAAMG,yBAAyB,GAAG,8BAA8B;AAChE,MAAMC,gCAAgC,GAAG,+BAA+B;AACxE,MAAMC,kCAAkC,GAAG,iCAAiC;AAE5E,SAASC,gBAAgBA,CAACC,OAAO,EAAE5U,MAAM,GAAG,EAAE,EAAE;EAC9C,MAAM6U,KAAK,GAAG,GAAGN,wDAAS,CAACO,SAAS,IAAI,EAAE,IAAI9U,MAAM,IAAI,WAAW,EAAE;EACrE,OAAO,GAAG4U,OAAO,IAAIG,kBAAkB,CAACF,KAAK,CAAC,EAAE;AAClD;AAEA,SAASG,QAAQA,CAAA,EAAG;EAClB,IAAInS,MAAM,CAACoS,MAAM,IAAIpS,MAAM,CAACoS,MAAM,CAACC,UAAU,EAAE;IAC7C,OAAOrS,MAAM,CAACoS,MAAM,CAACC,UAAU,CAAC,CAAC,CAACC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;EACvD;EACA,OAAO,GAAGrH,IAAI,CAAC6B,GAAG,CAAC,CAAC,GAAG5O,IAAI,CAACqU,MAAM,CAAC,CAAC,CAAC/R,QAAQ,CAAC,EAAE,CAAC,CAACvE,KAAK,CAAC,CAAC,CAAC,EAAE;AAC9D;AAEA,SAASuW,iBAAiBA,CAACrV,MAAM,EAAE;EACjC,IAAI;IACF,OAAOsV,IAAI,CAACC,KAAK,CAACC,YAAY,CAACC,OAAO,CAACd,gBAAgB,CAACH,yBAAyB,EAAExU,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC;EACtG,CAAC,CAAC,OAAOvF,KAAK,EAAE;IACd,OAAO,CAAC,CAAC;EACX;AACF;AAEA,SAASib,cAAcA,CAACC,UAAU,EAAE3V,MAAM,EAAE;EAC1C,IAAI;IACF,OAAOsV,IAAI,CAACC,KAAK,CAACC,YAAY,CAACC,OAAO,CAACd,gBAAgB,CAACgB,UAAU,EAAE3V,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC;EACvF,CAAC,CAAC,OAAOvF,KAAK,EAAE;IACd,OAAO,CAAC,CAAC;EACX;AACF;AAEA,SAASmb,eAAeA,CAACD,UAAU,EAAEE,sBAAsB,EAAE7V,MAAM,EAAE;EACnEwV,YAAY,CAACM,OAAO,CAACnB,gBAAgB,CAACgB,UAAU,EAAE3V,MAAM,CAAC,EAAEsV,IAAI,CAACS,SAAS,CAACF,sBAAsB,CAAC,CAAC;AACpG;AAEA,SAASG,WAAWA,CAAC/c,OAAO,EAAE;EAC5B,OAAO,CAACA,OAAO,EAAEyD,EAAE,EAAEzD,OAAO,EAAE4D,UAAU,CAAC,CACtCgO,MAAM,CAACrL,OAAO,CAAC,CACf/C,GAAG,CAAC3F,KAAK,IAAI4G,MAAM,CAAC5G,KAAK,CAAC,CAAC;AAChC;AAEA,SAASmf,gBAAgBA,CAACN,UAAU,EAAE1P,cAAc,EAAEhN,OAAO,EAAE+G,MAAM,EAAE;EACrE,MAAMkW,MAAM,GAAGR,cAAc,CAACC,UAAU,EAAE3V,MAAM,CAAC;EACjD,MAAMmW,GAAG,GAAG,IAAInH,GAAG,CAACkH,MAAM,CAACjQ,cAAc,CAAC,IAAI,EAAE,CAAC;EACjD,OAAO+P,WAAW,CAAC/c,OAAO,CAAC,CAACmd,IAAI,CAAC1Z,EAAE,IAAIyZ,GAAG,CAAClH,GAAG,CAACvS,EAAE,CAAC,CAAC;AACrD;AAEA,SAAS2Z,gBAAgBA,CAACV,UAAU,EAAE1P,cAAc,EAAEzJ,QAAQ,EAAEwD,MAAM,EAAE;EACtE,MAAMkW,MAAM,GAAGR,cAAc,CAACC,UAAU,EAAE3V,MAAM,CAAC;EACjD,MAAMmW,GAAG,GAAG,IAAInH,GAAG,CAACkH,MAAM,CAACjQ,cAAc,CAAC,IAAI,EAAE,CAAC;EACjDzJ,QAAQ,CAACkW,OAAO,CAACzZ,OAAO,IAAI;IAC1B+c,WAAW,CAAC/c,OAAO,CAAC,CAACyZ,OAAO,CAAChW,EAAE,IAAIyZ,GAAG,CAAChH,GAAG,CAACzS,EAAE,CAAC,CAAC;EACjD,CAAC,CAAC;EACFwZ,MAAM,CAACjQ,cAAc,CAAC,GAAGnK,KAAK,CAACC,IAAI,CAACoa,GAAG,CAAC;EACxCP,eAAe,CAACD,UAAU,EAAEO,MAAM,EAAElW,MAAM,CAAC;AAC7C;AAEA,SAASsW,iBAAiBA,CAACrd,OAAO,EAAE;EAClC,OAAO;IACL,GAAGA,OAAO;IACV0D,MAAM,EAAE,UAAU;IAClBC,cAAc,EAAE,EAAE;IAClBE,QAAQ,EAAE,IAAI;IACdyJ,YAAY,EAAE;EAChB,CAAC;AACH;AAEA,SAASgQ,sBAAsBA,CAACtQ,cAAc,EAAEzJ,QAAQ,EAAEwD,MAAM,EAAE;EAChE,OAAOxD,QAAQ,CACZqO,MAAM,CAAC5R,OAAO,IAAI,CAACgd,gBAAgB,CAACxB,gCAAgC,EAAExO,cAAc,EAAEhN,OAAO,EAAE+G,MAAM,CAAC,CAAC,CACvGvD,GAAG,CAACxD,OAAO,IAAI;IACd,MAAMud,UAAU,GAAGhX,OAAO,CAACvG,OAAO,CAAC6D,QAAQ,CAAC,IACvC7D,OAAO,CAAC0D,MAAM,KAAK,UAAU,IAC7BsZ,gBAAgB,CAACvB,kCAAkC,EAAEzO,cAAc,EAAEhN,OAAO,EAAE+G,MAAM,CAAC;IAC1F,IAAI,CAACwW,UAAU,EAAE;MACf,OAAOvd,OAAO;IAChB;IACA,OAAOqd,iBAAiB,CAACrd,OAAO,CAAC;EACnC,CAAC,CAAC;AACN;AAEA,SAASwd,kBAAkBA,CAACZ,sBAAsB,EAAE7V,MAAM,EAAE;EAC1DwV,YAAY,CAACM,OAAO,CAACnB,gBAAgB,CAACH,yBAAyB,EAAExU,MAAM,CAAC,EAAEsV,IAAI,CAACS,SAAS,CAACF,sBAAsB,CAAC,CAAC;AACnH;AAEA,SAASa,gBAAgBA,CAACzd,OAAO,EAAE+G,MAAM,EAAE;EACzC,MAAM6V,sBAAsB,GAAGR,iBAAiB,CAACrV,MAAM,CAAC;EACxD6V,sBAAsB,CAAC5c,OAAO,CAACgN,cAAc,CAAC,GAAG4P,sBAAsB,CAAC5c,OAAO,CAACgN,cAAc,CAAC,IAAI,EAAE;EACrG,MAAM0M,KAAK,GAAGkD,sBAAsB,CAAC5c,OAAO,CAACgN,cAAc,CAAC,CAAC0Q,SAAS,CAAC9Q,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKzD,OAAO,CAACyD,EAAE,CAAC;EACtG,IAAIiW,KAAK,IAAI,CAAC,EAAE;IACdkD,sBAAsB,CAAC5c,OAAO,CAACgN,cAAc,CAAC,CAAC2Q,MAAM,CAACjE,KAAK,EAAE,CAAC,EAAE1Z,OAAO,CAAC;EAC1E,CAAC,MAAM;IACL4c,sBAAsB,CAAC5c,OAAO,CAACgN,cAAc,CAAC,CAAC3K,IAAI,CAACrC,OAAO,CAAC;EAC9D;EACAwd,kBAAkB,CAACZ,sBAAsB,EAAE7V,MAAM,CAAC;AACpD;AAEA,SAAS6W,mBAAmBA,CAACC,aAAa,EAAEC,cAAc,EAAE9Q,cAAc,EAAEjG,MAAM,EAAE;EAClF,MAAMgX,oBAAoB,GAAGT,sBAAsB,CAACtQ,cAAc,EAAE6Q,aAAa,EAAE9W,MAAM,CAAC;EAC1F,MAAMiX,UAAU,GAAG,IAAIC,GAAG,CAAC,CAAC;EAC5BF,oBAAoB,CAACtE,OAAO,CAACzZ,OAAO,IAAI;IACtC+c,WAAW,CAAC/c,OAAO,CAAC,CAACyZ,OAAO,CAAC5O,GAAG,IAAI;MAClC,IAAI,CAACmT,UAAU,CAAChI,GAAG,CAACnL,GAAG,CAAC,EAAE;QACxBmT,UAAU,CAAChU,GAAG,CAACa,GAAG,EAAE7K,OAAO,CAAC;MAC9B;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,MAAMke,qBAAqB,GAAGZ,sBAAsB,CAACtQ,cAAc,EAAE8Q,cAAc,EAAE/W,MAAM,CAAC,CAACvD,GAAG,CAAC2a,aAAa,IAAI;IAChH,IAAI,CAACA,aAAa,CAACta,QAAQ,IAAIY,MAAM,CAAC0Z,aAAa,CAACjR,IAAI,IAAI,EAAE,CAAC,CAAC/G,IAAI,CAAC,CAAC,EAAE;MACtE,OAAOgY,aAAa;IACtB;IACA,MAAMC,YAAY,GAAGrB,WAAW,CAACoB,aAAa,CAAC,CAC5C3a,GAAG,CAACqH,GAAG,IAAImT,UAAU,CAACK,GAAG,CAACxT,GAAG,CAAC,CAAC,CAC/B7H,IAAI,CAAChD,OAAO,IAAIA,OAAO,EAAEkN,IAAI,IAAIlN,OAAO,CAACkN,IAAI,KAAK,UAAU,CAAC;IAChE,OAAOkR,YAAY,GAAG;MAAE,GAAGD,aAAa;MAAEjR,IAAI,EAAEkR,YAAY,CAAClR;IAAK,CAAC,GAAGiR,aAAa;EACrF,CAAC,CAAC;EACF,MAAMG,UAAU,GAAG,IAAIvI,GAAG,CAAC,CAAC;EAC5BmI,qBAAqB,CAACzE,OAAO,CAACzZ,OAAO,IAAI;IACvC+c,WAAW,CAAC/c,OAAO,CAAC,CAACyZ,OAAO,CAAC5O,GAAG,IAAIyT,UAAU,CAACpI,GAAG,CAACrL,GAAG,CAAC,CAAC;EAC1D,CAAC,CAAC;EACF,MAAM6L,GAAG,GAAG7B,IAAI,CAAC6B,GAAG,CAAC,CAAC;EAEtB,SAAS6H,cAAcA,CAACH,YAAY,EAAE;IACpC,IAAIA,YAAY,CAACxa,UAAU,IAAI0a,UAAU,CAACtI,GAAG,CAACoI,YAAY,CAACxa,UAAU,CAAC,EAAE;MACtE,OAAO,IAAI;IACb;IACA,OAAOsa,qBAAqB,CAACf,IAAI,CAACgB,aAAa,IAAI;MACjD,OAAOA,aAAa,CAACtc,SAAS,KAAKuc,YAAY,CAACvc,SAAS,IACpDsc,aAAa,CAACjR,IAAI,KAAKkR,YAAY,CAAClR,IAAI,IACxCpF,IAAI,CAAC0W,GAAG,CAACnX,MAAM,CAAC8W,aAAa,CAACnT,SAAS,IAAI,CAAC,CAAC,GAAG3D,MAAM,CAAC+W,YAAY,CAACpT,SAAS,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK;IACnG,CAAC,CAAC;EACJ;EAEA,MAAMyT,oBAAoB,GAAGV,oBAAoB,CAACnM,MAAM,CAAC5R,OAAO,IAAI;IAClE,IAAIA,OAAO,CAAC0D,MAAM,KAAK,UAAU,IAAI1D,OAAO,CAAC6D,QAAQ,EAAE;MACrD,OAAO7D,OAAO,CAAC6B,SAAS,KAAK,KAAK,IAAI,CAAC0c,cAAc,CAACve,OAAO,CAAC;IAChE;IACA,IAAIA,OAAO,CAAC6B,SAAS,KAAK,KAAK,EAAE;MAC/B,OAAO,KAAK;IACd;IACA,IAAI7B,OAAO,CAAC0D,MAAM,KAAK,MAAM,IAAI1D,OAAO,CAAC4D,UAAU,EAAE;MACnD,OAAO,CAAC2a,cAAc,CAACve,OAAO,CAAC;IACjC;IACA,IAAIA,OAAO,CAAC0D,MAAM,KAAK,MAAM,EAAE;MAC7B,OAAO,CAAC6a,cAAc,CAACve,OAAO,CAAC,IAAI0W,GAAG,GAAGrP,MAAM,CAACrH,OAAO,CAACgL,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK;IACjF;IACA,OAAOhL,OAAO,CAAC0D,MAAM,KAAK,SAAS,IAAI1D,OAAO,CAAC0D,MAAM,KAAK,QAAQ;EACpE,CAAC,CAAC;EAEF,OAAO,CAAC,GAAGwa,qBAAqB,EAAE,GAAGO,oBAAoB,CAAC,CAACC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;IACxE,OAAOvX,MAAM,CAACsX,CAAC,CAACE,gBAAgB,IAAIF,CAAC,CAAC3T,SAAS,IAAI,CAAC,CAAC,GAAG3D,MAAM,CAACuX,CAAC,CAACC,gBAAgB,IAAID,CAAC,CAAC5T,SAAS,IAAI,CAAC,CAAC;EACxG,CAAC,CAAC;AACJ;AAEA,SAAS8T,QAAQA,CAACjhB,KAAK,EAAEkhB,QAAQ,EAAE;EACjC,OAAOlhB,KAAK,IAAIkhB,QAAQ,IAAI,EAAE;AAChC;AAEA,SAASC,kBAAkBA,CAAC5gB,MAAM,EAAE2gB,QAAQ,EAAE;EAC5C,MAAME,cAAc,GAAG;IACrB,aAAa,EAAE,kCAAkC;IACjD,aAAa,EAAE,4BAA4B;IAC3C,aAAa,EAAE,kCAAkC;IACjD,aAAa,EAAE;EACjB,CAAC;EACD,OAAOA,cAAc,CAAC7gB,MAAM,CAAC,IAAIme,YAAY,CAACC,OAAO,CAAC,iBAAiB,CAAC,IAAIuC,QAAQ;AACtF;AAEA,SAASG,wBAAwBA,CAACC,QAAQ,EAAE;EAC1C,MAAMnf,OAAO,GAAGmf,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,EAAE;EAC5C,OAAOqf,MAAsC,IAAIrf,CAA2B;AAC9E;AAEO,MAAMwf,YAAY,CAAC;EACxBC,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACC,SAAS,GAAG,IAAIzB,GAAG,CAAC,CAAC;IAC1B,IAAI,CAACpL,SAAS,GAAG,KAAK;IACtB,IAAI,CAAC8M,WAAW,GAAG,IAAI;EACzB;EAEAC,WAAWA,CAAA,EAAG;IACZ,IAAIC,QAAQ,GAAGtD,YAAY,CAACC,OAAO,CAAClB,wDAAS,CAACwE,kBAAkB,CAAC;IACjE,IAAI,CAACD,QAAQ,EAAE;MACbA,QAAQ,GAAG9D,QAAQ,CAAC,CAAC;MACrBQ,YAAY,CAACM,OAAO,CAACvB,wDAAS,CAACwE,kBAAkB,EAAED,QAAQ,CAAC;IAC9D;IACA,OAAOA,QAAQ;EACjB;EAEAE,eAAeA,CAACF,QAAQ,EAAE;IACxB,IAAIA,QAAQ,EAAE;MACZtD,YAAY,CAACM,OAAO,CAACvB,wDAAS,CAACwE,kBAAkB,EAAED,QAAQ,CAAC;IAC9D;EACF;EAEAG,aAAaA,CAAA,EAAG;IACd,OAAO,MAAM;EACf;EAEA,MAAMC,SAASA,CAAA,EAAG;IAChB,OAAO,IAAI;EACb;EAEA,MAAMC,iBAAiBA,CAAC9hB,MAAM,EAAE+hB,QAAQ,EAAE;IACxC,MAAMjgB,GAAG,GAAG,GAAGob,wDAAS,CAACO,SAAS,YAAY;IAC9C,MAAMuE,QAAQ,GAAGpB,kBAAkB,CAAC5gB,MAAM,EAAE,IAAI,CAACwhB,WAAW,CAAC,CAAC,CAAC;IAC/D,MAAMT,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAACngB,GAAG,EAAE;MACrC9B,MAAM;MACN+hB,QAAQ;MACRG,QAAQ,EAAEhF,wDAAS,CAACgF,QAAQ;MAC5BT,QAAQ,EAAEO,QAAQ;MAClBG,eAAe,EAAEH;IACnB,CAAC,EAAE;MAAEI,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAI,CAACC,eAAe,CAACvgB,GAAG,EAAEif,QAAQ,CAAC;IACnC,IAAIA,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,IAAIxB,wBAAwB,CAACC,QAAQ,CAAC,EAAE;QACtC,OAAO;UACLpY,MAAM,EAAE3I,MAAM;UACduiB,KAAK,EAAE,wBAAwB9L,IAAI,CAAC6B,GAAG,CAAC,CAAC,EAAE;UAC3CzY,WAAW,EAAEG,MAAM;UACnBwiB,SAAS,EAAE;QACb,CAAC;MACH;MACA,MAAM,IAAIC,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,MAAM,CAAC;IACnD;IACA,OAAOmf,QAAQ,CAACC,IAAI,CAAC7I,MAAM;EAC7B;EAEA,MAAMuK,eAAeA,CAAC1iB,MAAM,EAAE;IAC5B,MAAM+gB,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC,GAAG/E,wDAAS,CAACO,SAAS,YAAY,EAAE;MAAEzd;IAAO,CAAC,EAAE;MAAEoiB,eAAe,EAAE;IAAM,CAAC,CAAC;IAC7G,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,SAAS,CAAC;IACtD;IACA,OAAOmf,QAAQ,CAACC,IAAI,CAAC7I,MAAM;EAC7B;EAEA,MAAMwK,aAAaA,CAAC3iB,MAAM,EAAEsiB,IAAI,EAAE;IAChC,MAAMxgB,GAAG,GAAG,GAAGob,wDAAS,CAACO,SAAS,QAAQ;IAC1C,MAAMuE,QAAQ,GAAGpB,kBAAkB,CAAC5gB,MAAM,EAAE,IAAI,CAACwhB,WAAW,CAAC,CAAC,CAAC;IAC/D,MAAMT,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAACngB,GAAG,EAAE;MACrC9B,MAAM;MACNsiB,IAAI;MACJJ,QAAQ,EAAEhF,wDAAS,CAACgF,QAAQ;MAC5BT,QAAQ,EAAEO,QAAQ;MAClBG,eAAe,EAAEH;IACnB,CAAC,EAAE;MAAEI,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAI,CAACC,eAAe,CAACvgB,GAAG,EAAEif,QAAQ,CAAC;IACnC,IAAIA,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,MAAM,CAAC;IACnD;IACA,OAAOmf,QAAQ,CAACC,IAAI,CAAC7I,MAAM;EAC7B;EAEA,MAAMyK,iBAAiBA,CAAC5iB,MAAM,EAAEsiB,IAAI,EAAE;IACpC,MAAMxgB,GAAG,GAAG,GAAGob,wDAAS,CAACO,SAAS,WAAW;IAC7C,MAAMuE,QAAQ,GAAGpB,kBAAkB,CAAC5gB,MAAM,EAAE,IAAI,CAACwhB,WAAW,CAAC,CAAC,CAAC;IAE/D,IAAI;MACF,MAAMT,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAACngB,GAAG,EAAE;QACrC9B,MAAM;QACNsiB,IAAI;QACJJ,QAAQ,EAAEhF,wDAAS,CAACgF,QAAQ;QAC5BT,QAAQ,EAAEO,QAAQ;QAClBG,eAAe,EAAEH;MACnB,CAAC,EAAE;QAAEI,eAAe,EAAE;MAAM,CAAC,CAAC;MAE9B,IAAI,CAACC,eAAe,CAACvgB,GAAG,EAAEif,QAAQ,CAAC;MACnC,IAAIA,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;QAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,MAAM,CAAC;MACnD;MACA,OAAOmf,QAAQ,CAACC,IAAI,CAAC7I,MAAM;IAC7B,CAAC,CAAC,OAAO/U,KAAK,EAAE;MACd,MAAMkC,MAAM,GAAGlC,KAAK,CAAC2d,QAAQ,EAAEzb,MAAM;MACrC,IAAIA,MAAM,KAAK,GAAG,IAAIA,MAAM,KAAK,GAAG,EAAE;QACpC,OAAO,IAAI,CAACqd,aAAa,CAAC3iB,MAAM,EAAEsiB,IAAI,CAAC;MACzC;MACA,MAAMlf,KAAK;IACb;EACF;EAEAyf,OAAOA,CAACla,MAAM,EAAE4Z,KAAK,EAAE;IACrB,IAAI,CAAChB,WAAW,GAAG;MAAE5Y,MAAM;MAAE4Z;IAAM,CAAC;IACpC,IAAI,CAAC9N,SAAS,GAAG,IAAI;IACrB,IAAI,CAACrT,IAAI,CAAC,yBAAyB,EAAE;MAAEqT,SAAS,EAAE,IAAI;MAAEH,UAAU,EAAE;IAAM,CAAC,CAAC;IAC5E,IAAI,CAACwO,uBAAuB,CAAC,CAAC;EAChC;EAEAC,UAAUA,CAAA,EAAG;IACX,IAAI,CAACtO,SAAS,GAAG,KAAK;IACtB,IAAI,CAAC8M,WAAW,GAAG,IAAI;IACvB,IAAI,CAACngB,IAAI,CAAC,yBAAyB,EAAE;MAAEqT,SAAS,EAAE,KAAK;MAAEH,UAAU,EAAE;IAAM,CAAC,CAAC;EAC/E;EAEA0O,mBAAmBA,CAAA,EAAG;IACpB,OAAO,EAAE;EACX;EAEAF,uBAAuBA,CAAA,EAAG;IACxB,MAAM5U,aAAa,GAAG,IAAI,CAAC8U,mBAAmB,CAAC,CAAC;IAChD,IAAI9U,aAAa,CAACsK,MAAM,EAAE;MACxB,IAAI,CAACpX,IAAI,CAAC,sBAAsB,EAAE8M,aAAa,CAAC;IAClD;IACA,IAAI,IAAI,CAACqT,WAAW,EAAE5Y,MAAM,EAAE;MAC5B,IAAI,CAACsa,wBAAwB,CAAC,CAAC,CAAC/N,IAAI,CAACgO,mBAAmB,IAAI;QAC1D,IAAI,CAAC9hB,IAAI,CAAC,sBAAsB,EAAE8hB,mBAAmB,CAAC;MACxD,CAAC,CAAC,CAACxa,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpB;IACA,OAAOwF,aAAa;EACtB;EAEA,MAAM+U,wBAAwBA,CAACE,KAAK,GAAG,EAAE,EAAE;IACzC,IAAI,CAAC,IAAI,CAAC5B,WAAW,EAAE5Y,MAAM,EAAE;MAC7B,OAAO,EAAE;IACX;IACA,MAAMoY,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkG,WAAW,EAAE;MACvDza,MAAM,EAAE,IAAI,CAAC4Y,WAAW,CAAC5Y,MAAM;MAC/Bwa;IACF,CAAC,EAAE;MAAEf,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,QAAQ,CAAC;IACrD;IAEA,OAAO,CAACmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEjK,aAAa,IAAI,EAAE,EAAE9I,GAAG,CAACsJ,YAAY,KAAK;MACvE,GAAGA,YAAY;MACf2J,SAAS,EAAEpP,MAAM,CAACyF,YAAY,CAAC2J,SAAS,IAAI5B,IAAI,CAAC6B,GAAG,CAAC,CAAC,CAAC;MACvD3V,UAAU,EAAE+L,YAAY,CAAC/L,UAAU,IAAI0D,MAAM,CAACqI,YAAY,CAACzG,KAAK,IAAIyG,YAAY,CAACmE,MAAM,IAAI,GAAG,CAAC,CAACpL,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;MACzHoL,GAAG,EAAEpE,YAAY,CAACoE,GAAG,IAAI;QAAEhM,IAAI,EAAE,QAAQ;QAAE+L,MAAM,EAAEnE,YAAY,CAACmE,MAAM;QAAEwQ,IAAI,EAAE;MAAE;IAClF,CAAC,CAAC,CAAC;EACL;EAEAC,WAAWA,CAAC5U,YAAY,EAAE;IACxB,IAAI,CAACA,YAAY,EAAErJ,EAAE,EAAE;MACrB,OAAO,EAAE;IACX;IACA,MAAMsD,MAAM,GAAG,IAAI,CAAC4Y,WAAW,EAAE5Y,MAAM,IAAI,EAAE;IAC7C,OAAOuW,sBAAsB,CAACxQ,YAAY,CAACrJ,EAAE,EAAE2Y,iBAAiB,CAACrV,MAAM,CAAC,CAAC+F,YAAY,CAACrJ,EAAE,CAAC,IAAI,EAAE,EAAEsD,MAAM,CAAC;EAC1G;EAEA,MAAM4a,mBAAmBA,CAAC7U,YAAY,EAAEyU,KAAK,GAAG,EAAE,EAAEK,OAAO,GAAG,CAAC,CAAC,EAAE;IAChE,IAAI,CAAC9U,YAAY,EAAErJ,EAAE,IAAI,CAAC,IAAI,CAACkc,WAAW,EAAE5Y,MAAM,EAAE;MAClD,OAAO,EAAE;IACX;IACA,MAAMoY,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkG,WAAW,EAAE;MACvDza,MAAM,EAAE,IAAI,CAAC4Y,WAAW,CAAC5Y,MAAM;MAC/BkK,MAAM,EAAEnE,YAAY,CAACmE,MAAM,IAAInE,YAAY,CAACoE,GAAG,EAAED,MAAM,IAAInE,YAAY,CAACrJ,EAAE,CAAC0N,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;MAClGoQ,KAAK;MACLjc,gBAAgB,EAAEwH,YAAY,CAAC5H,IAAI,IAAI4H,YAAY,CAACoE,GAAG,EAAEhM,IAAI,IAAI,CAAC;MAClE2c,QAAQ,EAAEtb,OAAO,CAACqb,OAAO,CAACC,QAAQ;IACpC,CAAC,EAAE;MAAErB,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,QAAQ,CAAC;IACrD;IAEA,MAAMuD,QAAQ,GAAG,CAAC4b,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEhT,QAAQ,IAAI,EAAE,EAAEC,GAAG,CAACxD,OAAO,KAAK;MACvE,GAAGA,OAAO;MACV6e,gBAAgB,EAAE7e,OAAO,CAAC6e,gBAAgB,IAAI7e,OAAO,CAACgL,SAAS;MAC/DgC,cAAc,EAAEF,YAAY,CAACrJ;IAC/B,CAAC,CAAC,CAAC;IACH,MAAMsD,MAAM,GAAG,IAAI,CAAC4Y,WAAW,EAAE5Y,MAAM,IAAI,EAAE;IAC7C,MAAM6V,sBAAsB,GAAGR,iBAAiB,CAACrV,MAAM,CAAC;IACxD6V,sBAAsB,CAAC9P,YAAY,CAACrJ,EAAE,CAAC,GAAGma,mBAAmB,CAAChB,sBAAsB,CAAC9P,YAAY,CAACrJ,EAAE,CAAC,IAAI,EAAE,EAAEF,QAAQ,EAAEuJ,YAAY,CAACrJ,EAAE,EAAEsD,MAAM,CAAC;IAC/IyW,kBAAkB,CAACZ,sBAAsB,EAAE7V,MAAM,CAAC;IAClD,OAAO6V,sBAAsB,CAAC9P,YAAY,CAACrJ,EAAE,CAAC;EAChD;EAEAqe,YAAYA,CAAChV,YAAY,EAAEvJ,QAAQ,EAAE;IACnC,MAAMpB,KAAK,GAAGU,KAAK,CAACkf,OAAO,CAACxe,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC;IAC7D,IAAI,CAACuJ,YAAY,EAAErJ,EAAE,IAAI,CAACtB,KAAK,CAACyU,MAAM,EAAE;MACtC;IACF;IACA,MAAM7P,MAAM,GAAG,IAAI,CAAC4Y,WAAW,EAAE5Y,MAAM,IAAI,EAAE;IAC7CqW,gBAAgB,CAAC5B,gCAAgC,EAAE1O,YAAY,CAACrJ,EAAE,EAAEtB,KAAK,EAAE4E,MAAM,CAAC;IAClF,MAAM6V,sBAAsB,GAAGR,iBAAiB,CAACrV,MAAM,CAAC;IACxD6V,sBAAsB,CAAC9P,YAAY,CAACrJ,EAAE,CAAC,GAAG6Z,sBAAsB,CAC9DxQ,YAAY,CAACrJ,EAAE,EACfmZ,sBAAsB,CAAC9P,YAAY,CAACrJ,EAAE,CAAC,IAAI,EAAE,EAC7CsD,MACF,CAAC;IACDyW,kBAAkB,CAACZ,sBAAsB,EAAE7V,MAAM,CAAC;EACpD;EAEAib,oBAAoBA,CAAClV,YAAY,EAAEvJ,QAAQ,EAAE;IAC3C,MAAMpB,KAAK,GAAGU,KAAK,CAACkf,OAAO,CAACxe,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC;IAC7D,IAAI,CAACuJ,YAAY,EAAErJ,EAAE,IAAI,CAACtB,KAAK,CAACyU,MAAM,EAAE;MACtC;IACF;IACA,MAAM7P,MAAM,GAAG,IAAI,CAAC4Y,WAAW,EAAE5Y,MAAM,IAAI,EAAE;IAC7CqW,gBAAgB,CAAC3B,kCAAkC,EAAE3O,YAAY,CAACrJ,EAAE,EAAEtB,KAAK,EAAE4E,MAAM,CAAC;IACpF,MAAM6V,sBAAsB,GAAGR,iBAAiB,CAACrV,MAAM,CAAC;IACxD6V,sBAAsB,CAAC9P,YAAY,CAACrJ,EAAE,CAAC,GAAG6Z,sBAAsB,CAC9DxQ,YAAY,CAACrJ,EAAE,EACfmZ,sBAAsB,CAAC9P,YAAY,CAACrJ,EAAE,CAAC,IAAI,EAAE,EAC7CsD,MACF,CAAC;IACDyW,kBAAkB,CAACZ,sBAAsB,EAAE7V,MAAM,CAAC;EACpD;EAEA,MAAMkb,aAAaA,CAACnV,YAAY,EAAE9M,OAAO,EAAE;IACzC,MAAM4D,UAAU,GAAGa,MAAM,CAACzE,OAAO,EAAE4D,UAAU,IAAI5D,OAAO,EAAEyD,EAAE,IAAI,EAAE,CAAC,CAAC0C,IAAI,CAAC,CAAC;IAC1E,IAAI,CAAC,OAAO,CAAC+b,IAAI,CAACte,UAAU,CAAC,EAAE;MAC7B,MAAM,IAAIid,KAAK,CAAC,YAAY,CAAC;IAC/B;IAEA,MAAM1B,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAAC6G,gBAAgB,EAAE;MAC5DpgB,MAAM,EAAE,QAAQ;MAChBgF,MAAM,EAAE,IAAI,CAAC4Y,WAAW,EAAE5Y,MAAM,IAAI/G,OAAO,CAAC8C,IAAI,IAAI,EAAE;MACtDc;IACF,CAAC,EAAE;MAAE4c,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,MAAM,CAAC;IACnD;IACA,IAAI,CAACgiB,oBAAoB,CAAClV,YAAY,EAAE,CAAC9M,OAAO,CAAC,CAAC;IAClD,OAAOmf,QAAQ,CAACC,IAAI,CAAC7I,MAAM;EAC7B;EAEA,MAAM6L,WAAWA,CAACtV,YAAY,EAAE9M,OAAO,EAAEkN,IAAI,EAAE;IAC7C,MAAMtJ,UAAU,GAAGa,MAAM,CAACzE,OAAO,EAAE4D,UAAU,IAAI5D,OAAO,EAAEyD,EAAE,IAAI,EAAE,CAAC,CAAC0C,IAAI,CAAC,CAAC;IAC1E,IAAI,CAAC,OAAO,CAAC+b,IAAI,CAACte,UAAU,CAAC,EAAE;MAC7B,MAAM,IAAIid,KAAK,CAAC,YAAY,CAAC;IAC/B;IACA,MAAMwB,QAAQ,GAAG5d,MAAM,CAACyI,IAAI,IAAI,EAAE,CAAC,CAAC/G,IAAI,CAAC,CAAC;IAC1C,IAAI,CAACkc,QAAQ,EAAE;MACb,MAAM,IAAIxB,KAAK,CAAC,UAAU,CAAC;IAC7B;IAEA,MAAM1B,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAAC6G,gBAAgB,EAAE;MAC5DpgB,MAAM,EAAE,MAAM;MACdgF,MAAM,EAAE,IAAI,CAAC4Y,WAAW,EAAE5Y,MAAM,IAAI/G,OAAO,CAAC8C,IAAI,IAAI,EAAE;MACtDc,UAAU;MACVsJ,IAAI,EAAEmV;IACR,CAAC,EAAE;MAAE7B,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,MAAM,CAAC;IACnD;IAEA,MAAMuW,MAAM,GAAG4I,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEvW,OAAO,IAAI,CAAC,CAAC;IACnD,MAAMsiB,aAAa,GAAG;MACpB,GAAGtiB,OAAO;MACVkN,IAAI,EAAEqJ,MAAM,CAACrJ,IAAI,IAAImV,QAAQ;MAC7B3e,MAAM,EAAE,WAAW;MACnBC,cAAc,EAAE,WAAW;MAC3B4e,QAAQ,EAAElb,MAAM,CAACkP,MAAM,CAACgM,QAAQ,IAAI1N,IAAI,CAAC6B,GAAG,CAAC,CAAC,CAAC;MAC/C8L,iBAAiB,EAAEnb,MAAM,CAACkP,MAAM,CAACgM,QAAQ,IAAI1N,IAAI,CAAC6B,GAAG,CAAC,CAAC;IACzD,CAAC;IACD+G,gBAAgB,CAAC6E,aAAa,EAAE,IAAI,CAAC3C,WAAW,EAAE5Y,MAAM,IAAI,EAAE,CAAC;IAC/D,IAAI,CAACvH,IAAI,CAAC,sBAAsB,EAAE8iB,aAAa,CAAC;IAChD,OAAOA,aAAa;EACtB;EAEA,MAAMG,gBAAgBA,CAAC3V,YAAY,EAAE9M,OAAO,EAAE;IAC5C,MAAM4D,UAAU,GAAGa,MAAM,CAACzE,OAAO,EAAE4D,UAAU,IAAI5D,OAAO,EAAEyD,EAAE,IAAI,EAAE,CAAC,CAAC0C,IAAI,CAAC,CAAC;IAC1E,IAAI,CAACvC,UAAU,EAAE;MACf,MAAM,IAAIid,KAAK,CAAC,QAAQ,CAAC;IAC3B;IACA,MAAM1B,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACoH,gBAAgB,EAAE;MAC5D3b,MAAM,EAAE,IAAI,CAAC4Y,WAAW,EAAE5Y,MAAM,IAAI,EAAE;MACtCkK,MAAM,EAAEnE,YAAY,EAAEmE,MAAM,IAAInE,YAAY,EAAEoE,GAAG,EAAED,MAAM,IAAInE,YAAY,EAAErJ,EAAE,EAAE0N,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,EAAE;MAC5G7L,gBAAgB,EAAEwH,YAAY,EAAE5H,IAAI,IAAI4H,YAAY,EAAEoE,GAAG,EAAEhM,IAAI,IAAI,QAAQ;MAC3EtB;IACF,CAAC,EAAE;MAAE4c,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,UAAU,CAAC;IACvD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAE9B,MAAM,IAAI,IAAI;EAC9C;EAEA,MAAMkO,eAAeA,CAAC7V,YAAY,EAAEI,IAAI,EAAE0V,cAAc,GAAG,IAAI,EAAE;IAC/D,MAAMnd,UAAU,GAAGqH,YAAY,EAAE9L,IAAI,IAAI8L,YAAY,EAAEoE,GAAG,EAAElQ,IAAI,IAAI,EAAE;IACtE,MAAMhB,OAAO,GAAG4iB,cAAc,IAAI;MAChCnf,EAAE,EAAEsY,QAAQ,CAAC,CAAC;MACd/O,cAAc,EAAEF,YAAY,CAACrJ,EAAE;MAC/BX,IAAI,EAAE,IAAI,CAAC6c,WAAW,EAAE5Y,MAAM,IAAI,IAAI;MACtCtB,UAAU;MACV5D,SAAS,EAAE,KAAK;MAChBqD,IAAI,EAAE,MAAM;MACZgI,IAAI;MACJxJ,MAAM,EAAE,SAAS;MACjBC,cAAc,EAAE,SAAS;MACzBqH,SAAS,EAAE6J,IAAI,CAAC6B,GAAG,CAAC;IACtB,CAAC;IACD+G,gBAAgB,CAACzd,OAAO,EAAE,IAAI,CAAC2f,WAAW,EAAE5Y,MAAM,IAAI,EAAE,CAAC;IACzD,IAAI,CAAC6b,cAAc,EAAE;MACnB,IAAI,CAACpjB,IAAI,CAAC,aAAa,EAAEQ,OAAO,CAAC;IACnC;IAEA,IAAI;MACF,MAAMmf,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACuH,cAAc,EAAE;QAC1DC,MAAM,EAAE,IAAI,CAACnD,WAAW,EAAE5Y,MAAM,IAAI,EAAE;QACtCkK,MAAM,EAAEnE,YAAY,CAACmE,MAAM,IAAInE,YAAY,CAACoE,GAAG,EAAED,MAAM,IAAInE,YAAY,CAACrJ,EAAE,CAAC0N,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAClG7L,gBAAgB,EAAEwH,YAAY,CAAC5H,IAAI,IAAI4H,YAAY,CAACoE,GAAG,EAAEhM,IAAI,IAAI,CAAC;QAClEgI;MACF,CAAC,EAAE;QAAEsT,eAAe,EAAE;MAAM,CAAC,CAAC;MAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;QAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,MAAM,CAAC;MACnD;MAEA,MAAM+iB,WAAW,GAAG;QAClB,GAAG/iB,OAAO;QACV0D,MAAM,EAAE,MAAM;QACdC,cAAc,EAAE,MAAM;QACtBC,UAAU,EAAEub,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAE3S,UAAU,GAAGa,MAAM,CAAC0a,QAAQ,CAACC,IAAI,CAAC7I,MAAM,CAAC3S,UAAU,CAAC,GAAG,EAAE;QAC5F6B,UAAU,EAAE0Z,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAE9Q,UAAU,IAAIzF,OAAO,CAACyF,UAAU,IAAI,EAAE;QACzEud,eAAe,EAAE3b,MAAM,CAAC8X,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEvL,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI;QACtEA,SAAS,EAAEhL,OAAO,CAACgL,SAAS;QAC5B6T,gBAAgB,EAAE7e,OAAO,CAAC6e,gBAAgB,IAAI7e,OAAO,CAACgL;MACxD,CAAC;MACDyS,gBAAgB,CAACsF,WAAW,EAAE,IAAI,CAACpD,WAAW,EAAE5Y,MAAM,IAAI,EAAE,CAAC;MAC7D,IAAI,CAACvH,IAAI,CAAC,sBAAsB,EAAEujB,WAAW,CAAC;MAC9C,OAAOA,WAAW;IACpB,CAAC,CAAC,OAAOvhB,KAAK,EAAE;MACd,MAAMyhB,aAAa,GAAG;QACpB,GAAGjjB,OAAO;QACV0D,MAAM,EAAE,QAAQ;QAChBC,cAAc,EAAE,EAAE;QAClBnC,KAAK,EAAEA,KAAK,CAAC2d,QAAQ,EAAEC,IAAI,EAAEpf,OAAO,IAAIwB,KAAK,CAACxB,OAAO,IAAI;MAC3D,CAAC;MACDyd,gBAAgB,CAACwF,aAAa,EAAE,IAAI,CAACtD,WAAW,EAAE5Y,MAAM,IAAI,EAAE,CAAC;MAC/D,IAAI,CAACvH,IAAI,CAAC,sBAAsB,EAAEyjB,aAAa,CAAC;MAChD,OAAOA,aAAa;IACtB;EACF;EAEA,MAAMC,qBAAqBA,CAACpW,YAAY,EAAE;IAAE5H,IAAI;IAAE8T,IAAI;IAAE9L,IAAI,GAAG;EAAG,CAAC,EAAE0V,cAAc,GAAG,IAAI,EAAE;IAC1F,MAAMnd,UAAU,GAAGqH,YAAY,EAAE9L,IAAI,IAAI8L,YAAY,EAAEoE,GAAG,EAAElQ,IAAI,IAAI,EAAE;IACtE,MAAMhB,OAAO,GAAG4iB,cAAc,IAAI;MAChCnf,EAAE,EAAEsY,QAAQ,CAAC,CAAC;MACd/O,cAAc,EAAEF,YAAY,CAACrJ,EAAE;MAC/BX,IAAI,EAAE,IAAI,CAAC6c,WAAW,EAAE5Y,MAAM,IAAI,IAAI;MACtCtB,UAAU;MACV5D,SAAS,EAAE,KAAK;MAChBqD,IAAI;MACJgI,IAAI;MACJ/H,UAAU,EAAE;QACVD,IAAI;QACJhH,IAAI,EAAE8a,IAAI,EAAE9a,IAAI,KAAKgH,IAAI,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;QACpDie,IAAI,EAAEnK,IAAI,EAAE9T,IAAI,IAAI,EAAE;QACtBiC,IAAI,EAAE6R,IAAI,EAAE7R,IAAI,IAAI,CAAC;QACrBjH,GAAG,EAAEgF,IAAI,KAAK,OAAO,IAAI8T,IAAI,GAAGrP,GAAG,CAACyZ,eAAe,CAACpK,IAAI,CAAC,GAAG;MAC9D,CAAC;MACDtV,MAAM,EAAE,SAAS;MACjBC,cAAc,EAAE,SAAS;MACzBqH,SAAS,EAAE6J,IAAI,CAAC6B,GAAG,CAAC;IACtB,CAAC;IACD+G,gBAAgB,CAACzd,OAAO,EAAE,IAAI,CAAC2f,WAAW,EAAE5Y,MAAM,IAAI,EAAE,CAAC;IACzD,IAAI,CAAC6b,cAAc,EAAE;MACnB,IAAI,CAACpjB,IAAI,CAAC,aAAa,EAAEQ,OAAO,CAAC;IACnC;IAEA,IAAI;MACF,MAAMqjB,QAAQ,GAAG,IAAIC,QAAQ,CAAC,CAAC;MAC/BD,QAAQ,CAACE,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC5D,WAAW,EAAE5Y,MAAM,IAAI,EAAE,CAAC;MACzDsc,QAAQ,CAACE,MAAM,CAAC,QAAQ,EAAEzW,YAAY,CAACmE,MAAM,IAAInE,YAAY,CAACoE,GAAG,EAAED,MAAM,IAAInE,YAAY,CAACrJ,EAAE,CAAC0N,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;MACrHkS,QAAQ,CAACE,MAAM,CAAC,kBAAkB,EAAEzW,YAAY,CAAC5H,IAAI,IAAI4H,YAAY,CAACoE,GAAG,EAAEhM,IAAI,IAAI,CAAC,CAAC;MACrFme,QAAQ,CAACE,MAAM,CAAC,aAAa,EAAEre,IAAI,CAAC;MACpCme,QAAQ,CAACE,MAAM,CAAC,MAAM,EAAErW,IAAI,IAAI,EAAE,CAAC;MACnCmW,QAAQ,CAACE,MAAM,CAAC,YAAY,EAAEvK,IAAI,CAAC;MAEnC,MAAMmG,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACuH,cAAc,EAAEQ,QAAQ,EAAE;QACpE7C,eAAe,EAAE;MACnB,CAAC,CAAC;MAEF,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;QAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,MAAM,CAAC;MACnD;MAEA,MAAM+iB,WAAW,GAAG;QAClB,GAAG/iB,OAAO;QACV0D,MAAM,EAAE,MAAM;QACdC,cAAc,EAAE,MAAM;QACtBC,UAAU,EAAEub,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAE3S,UAAU,GAAGa,MAAM,CAAC0a,QAAQ,CAACC,IAAI,CAAC7I,MAAM,CAAC3S,UAAU,CAAC,GAAG,EAAE;QAC5F6B,UAAU,EAAE0Z,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAE9Q,UAAU,IAAIzF,OAAO,CAACyF,UAAU,IAAI,EAAE;QACzEN,UAAU,EAAEga,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEpR,UAAU,IAAInF,OAAO,CAACmF,UAAU;QACnE6d,eAAe,EAAE3b,MAAM,CAAC8X,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEvL,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI;QACtEA,SAAS,EAAEhL,OAAO,CAACgL,SAAS;QAC5B6T,gBAAgB,EAAE7e,OAAO,CAAC6e,gBAAgB,IAAI7e,OAAO,CAACgL;MACxD,CAAC;MACDyS,gBAAgB,CAACsF,WAAW,EAAE,IAAI,CAACpD,WAAW,EAAE5Y,MAAM,IAAI,EAAE,CAAC;MAC7D,IAAI,CAACvH,IAAI,CAAC,sBAAsB,EAAEujB,WAAW,CAAC;MAC9C,OAAOA,WAAW;IACpB,CAAC,CAAC,OAAOvhB,KAAK,EAAE;MACd,MAAMyhB,aAAa,GAAG;QACpB,GAAGjjB,OAAO;QACV0D,MAAM,EAAE,QAAQ;QAChBC,cAAc,EAAE,EAAE;QAClBnC,KAAK,EAAEA,KAAK,CAAC2d,QAAQ,EAAEC,IAAI,EAAEpf,OAAO,IAAIwB,KAAK,CAACxB,OAAO,IAAI;MAC3D,CAAC;MACDyd,gBAAgB,CAACwF,aAAa,EAAE,IAAI,CAACtD,WAAW,EAAE5Y,MAAM,IAAI,EAAE,CAAC;MAC/D,IAAI,CAACvH,IAAI,CAAC,sBAAsB,EAAEyjB,aAAa,CAAC;MAChD,OAAOA,aAAa;IACtB;EACF;EAEAO,cAAcA,CAAA,EAAG;IACf,OAAO,EAAE;EACX;EAEA,MAAMC,oBAAoBA,CAAC1c,MAAM,EAAE;IACjC,IAAI,CAACA,MAAM,EAAE;MACX,OAAO,EAAE;IACX;IACA,MAAMoY,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACoI,WAAW,EAAE;MAAE3c;IAAO,CAAC,EAAE;MACnEyZ,eAAe,EAAE,KAAK;MACtBmD,OAAO,EAAE,IAAI,CAACC,iBAAiB,CAACtI,wDAAS,CAACoI,WAAW;IACvD,CAAC,CAAC;IACF,IAAIvE,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,SAAS,CAAC;IACtD;IACA,OAAO,CAACmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAE9Y,QAAQ,IAAI,EAAE,EAAE+F,GAAG,CAACoJ,IAAI,IAAI;MACzD,OAAO,IAAI,CAACiX,UAAU,CAACjX,IAAI,CAACzO,GAAG,EAAE;QAAEL,KAAK,EAAE8O,IAAI,CAAC9O;MAAM,CAAC,EAAE;QACtDK,GAAG,EAAEyO,IAAI,CAACzO,GAAG;QACbF,WAAW,EAAE2O,IAAI,CAAC3O,WAAW;QAC7BC,IAAI,EAAE0O,IAAI,CAAC1O,IAAI;QACfE,MAAM,EAAEwO,IAAI,CAACxO,MAAM;QACnB0C,QAAQ,EAAE8L,IAAI,CAAC9L,QAAQ;QACvBzC,OAAO,EAAEuO,IAAI,CAACvO,OAAO;QACrBylB,WAAW,EAAElX,IAAI,CAAC9O;MACpB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC4gB,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACtY,KAAK,CAAC0d,aAAa,CAACnF,CAAC,CAACvY,KAAK,EAAE,OAAO,CAAC,CAAC;EAC5D;EAEA,MAAMK,UAAUA,CAACK,MAAM,EAAEid,OAAO,EAAEC,MAAM,GAAG,EAAE,EAAE;IAC7C,MAAM9E,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAAC4I,aAAa,EAAE;MACzDnd,MAAM;MACNid,OAAO;MACPC;IACF,CAAC,EAAE;MAAEzD,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,SAAS,CAAC;IACtD;IAEA,MAAM4M,IAAI,GAAGuS,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAE7Y,OAAO;IAC3C,IAAI,CAACkP,IAAI,EAAEzO,GAAG,EAAE;MACd,OAAO,IAAI;IACb;IAEA,OAAO,IAAI,CAAC0lB,UAAU,CAACjX,IAAI,CAACzO,GAAG,EAAE;MAAEL,KAAK,EAAE8O,IAAI,CAAC9O;IAAM,CAAC,EAAE;MACtDK,GAAG,EAAEyO,IAAI,CAACzO,GAAG;MACbF,WAAW,EAAE2O,IAAI,CAAC3O,WAAW;MAC7BC,IAAI,EAAE0O,IAAI,CAAC1O,IAAI;MACfE,MAAM,EAAEwO,IAAI,CAACxO,MAAM;MACnB0C,QAAQ,EAAE8L,IAAI,CAAC9L,QAAQ;MACvBzC,OAAO,EAAEuO,IAAI,CAACvO,OAAO;MACrBylB,WAAW,EAAElX,IAAI,CAAC9O;IACpB,CAAC,CAAC;EACJ;EAEAqmB,qBAAqBA,CAACrX,YAAY,EAAE;IAClC,MAAMzG,KAAK,GAAGyY,QAAQ,CAAChS,YAAY,EAAEzG,KAAK,EAAEyG,YAAY,EAAEmE,MAAM,IAAI,EAAE,CAAC;IACvE,OAAO;MACL,GAAGnE,YAAY;MACfrJ,EAAE,EAAEqJ,YAAY,EAAErJ,EAAE,IAAI,GAAGqJ,YAAY,EAAE5H,IAAI,KAAK,QAAQ,GAAG,QAAQ,GAAG,OAAO,IAAI4H,YAAY,EAAEmE,MAAM,EAAE;MACzGA,MAAM,EAAEnE,YAAY,EAAEmE,MAAM,IAAInE,YAAY,EAAEoE,GAAG,EAAED,MAAM,IAAI,EAAE;MAC/D5K,KAAK;MACL+d,QAAQ,EAAEtX,YAAY,EAAEsX,QAAQ,IAAI,EAAE;MACtC9R,MAAM,EAAEjL,MAAM,CAACyF,YAAY,EAAEwF,MAAM,IAAI,CAAC,CAAC;MACzCxR,QAAQ,EAAEgM,YAAY,EAAEhM,QAAQ,IAAI,EAAE;MACtCC,UAAU,EAAE+L,YAAY,EAAE/L,UAAU,IAAIsF,KAAK,CAACR,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;MACvE2Q,SAAS,EAAEpP,MAAM,CAACyF,YAAY,EAAE2J,SAAS,IAAI5B,IAAI,CAAC6B,GAAG,CAAC,CAAC,CAAC;MACxDxF,GAAG,EAAEpE,YAAY,EAAEoE,GAAG,IAAI;QACxBhM,IAAI,EAAE4H,YAAY,EAAE5H,IAAI,KAAK,QAAQ,GAAG,QAAQ,GAAG,OAAO;QAC1D+L,MAAM,EAAEnE,YAAY,EAAEmE,MAAM,IAAI,EAAE;QAClCwQ,IAAI,EAAE;MACR;IACF,CAAC;EACH;EAEA,MAAM4C,WAAWA,CAACtd,MAAM,EAAE;IAAE7I,IAAI;IAAEomB,SAAS,GAAG,EAAE;IAAElU,YAAY,GAAG,EAAE;IAAEC,WAAW,GAAG,EAAE;IAAEkU,OAAO,GAAG;EAAM,CAAC,EAAE;IACxG,MAAMpF,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAEwiB,OAAO,GAAG,gBAAgB,GAAG,cAAc;MACnDxd,MAAM;MACN7I,IAAI;MACJomB,SAAS;MACTlU,YAAY;MACZC;IACF,CAAC,EAAE;MAAEmQ,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,KAAKukB,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;IAC7E;IAEA,OAAO,IAAI,CAACJ,qBAAqB,CAAChF,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEzJ,YAAY,IAAI,CAAC,CAAC,CAAC;EAC9E;EAEA,MAAM2X,SAASA,CAAC1d,MAAM,EAAE2d,QAAQ,EAAE;IAChC,MAAMvF,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,YAAY;MACpBgF,MAAM;MACN2d;IACF,CAAC,EAAE;MAAElE,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,QAAQ,CAAC;IACrD;IAEA,OAAO,IAAI,CAACmkB,qBAAqB,CAAChF,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEzJ,YAAY,IAAI,CAAC,CAAC,CAAC;EAC9E;EAEA,MAAM6X,gBAAgBA,CAAC5d,MAAM,EAAE6d,SAAS,EAAE1X,IAAI,EAAE;IAC9C,MAAMiS,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,WAAW;MACnBgF,MAAM;MACN6d,SAAS;MACT1X;IACF,CAAC,EAAE;MAAEsT,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,MAAM,CAAC;IACnD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,IAAI,CAAC,CAAC;EACpC;EAEA,MAAMpC,cAAcA,CAACpN,MAAM,EAAE8d,OAAO,EAAE;IACpC,MAAM1F,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,cAAc;MACtBgF,MAAM;MACN8d;IACF,CAAC,EAAE;MAAErE,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,SAAS,CAAC;IACtD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEtE,KAAK,IAAI,IAAI;EAC7C;EAEA,MAAMsC,eAAeA,CAACxN,MAAM,EAAE8d,OAAO,EAAE;IACrC,MAAM1F,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,eAAe;MACvBgF,MAAM;MACN8d;IACF,CAAC,EAAE;MAAErE,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,QAAQ,CAAC;IACrD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEuO,OAAO,IAAI,EAAE;EAC7C;EAEA,MAAMnP,gBAAgBA,CAAC5O,MAAM,EAAE8d,OAAO,EAAE/mB,KAAK,EAAE;IAC7C,MAAMqhB,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,oBAAoB;MAC5BgF,MAAM;MACN8d,OAAO;MACP/mB;IACF,CAAC,EAAE;MAAE0iB,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,UAAU,CAAC;IACvD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEzY,KAAK,IAAI,EAAE;EAC3C;EAEA,MAAMsZ,UAAUA,CAACrQ,MAAM,EAAE8d,OAAO,EAAE;IAChC,MAAM1F,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,aAAa;MACrBgF,MAAM;MACN8d;IACF,CAAC,EAAE;MAAErE,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,QAAQ,CAAC;IACrD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,IAAI,CAAC,CAAC;EACpC;EAEA,MAAMe,YAAYA,CAACvQ,MAAM,EAAE8d,OAAO,EAAE;IAClC,MAAM1F,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,eAAe;MACvBgF,MAAM;MACN8d;IACF,CAAC,EAAE;MAAErE,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,QAAQ,CAAC;IACrD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,IAAI,CAAC,CAAC;EACpC;EAEA,MAAMiB,aAAaA,CAACzQ,MAAM,EAAE8d,OAAO,EAAEE,YAAY,EAAE;IACjD,MAAM5F,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,gBAAgB;MACxBgF,MAAM;MACN8d,OAAO;MACPE;IACF,CAAC,EAAE;MAAEvE,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,QAAQ,CAAC;IACrD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,IAAI,CAAC,CAAC;EACpC;EAEA,MAAMF,cAAcA,CAACtP,MAAM,EAAE8d,OAAO,EAAEG,QAAQ,EAAE;IAC9C,MAAM7F,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,kBAAkB;MAC1BgF,MAAM;MACN8d,OAAO;MACPG;IACF,CAAC,EAAE;MAAExE,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,SAAS,CAAC;IACtD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,IAAI,CAAC,CAAC;EACpC;EAEA,MAAMC,kBAAkBA,CAACzP,MAAM,EAAE8d,OAAO,EAAE;IAAE3mB,IAAI;IAAEkS,YAAY;IAAEC;EAAY,CAAC,EAAE;IAC7E,MAAM8O,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,sBAAsB;MAC9BgF,MAAM;MACN8d,OAAO;MACP3mB,IAAI;MACJkS,YAAY;MACZC;IACF,CAAC,EAAE;MAAEmQ,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,SAAS,CAAC;IACtD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,IAAI,CAAC,CAAC;EACpC;EAEA,MAAMO,gBAAgBA,CAAC/P,MAAM,EAAE8d,OAAO,EAAED,SAAS,EAAE;IACjD,MAAMzF,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,oBAAoB;MAC5BgF,MAAM;MACN8d,OAAO;MACPD;IACF,CAAC,EAAE;MAAEpE,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,MAAM,CAAC;IACnD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,IAAI,CAAC,CAAC;EACpC;EAEA,MAAMW,sBAAsBA,CAACnQ,MAAM,EAAE8d,OAAO,EAAEzP,OAAO,EAAE;IACrD,MAAM+J,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACkJ,sBAAsB,EAAE;MAClEziB,MAAM,EAAE,qBAAqB;MAC7BgF,MAAM;MACN8d,OAAO;MACP,GAAGzP;IACL,CAAC,EAAE;MAAEoL,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,UAAU,CAAC;IACvD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAElB,WAAW,IAAI,IAAI;EACnD;EAEA,MAAMvW,kBAAkBA,CAACiI,MAAM,EAAEke,QAAQ,EAAEnnB,KAAK,EAAE;IAChD,MAAMqhB,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAAC4J,cAAc,EAAE;MAC1Dne,MAAM;MACNke,QAAQ;MACRnnB;IACF,CAAC,EAAE;MACD0iB,eAAe,EAAE,KAAK;MACtBmD,OAAO,EAAE,IAAI,CAACC,iBAAiB,CAACtI,wDAAS,CAAC4J,cAAc;IAC1D,CAAC,CAAC;IAEF,IAAI/F,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,SAAS,CAAC;IACtD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAE7Y,OAAO,EAAEI,KAAK,IAAI,EAAE;EACpD;EAEA,MAAMqnB,UAAUA,CAACpe,MAAM,EAAE;IACvB,MAAMoY,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAAC8J,UAAU,EAAE;MACtDrjB,MAAM,EAAE,KAAK;MACbgF;IACF,CAAC,EAAE;MAAEyZ,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,UAAU,CAAC;IACvD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEvQ,OAAO,IAAI,IAAI;EAC/C;EAEA,MAAMqf,aAAaA,CAACte,MAAM,EAAE;IAAE9I,WAAW;IAAEqnB;EAAa,CAAC,EAAE;IACzD,MAAMjC,QAAQ,GAAG,IAAIC,QAAQ,CAAC,CAAC;IAC/BD,QAAQ,CAACE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACnCF,QAAQ,CAACE,MAAM,CAAC,QAAQ,EAAExc,MAAM,CAAC;IACjCsc,QAAQ,CAACE,MAAM,CAAC,aAAa,EAAEtlB,WAAW,CAAC;IAC3C,IAAIqnB,YAAY,EAAE;MAChBjC,QAAQ,CAACE,MAAM,CAAC,cAAc,EAAE+B,YAAY,CAAC;IAC/C;IAEA,MAAMnG,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAAC8J,UAAU,EAAE/B,QAAQ,EAAE;MAChE7C,eAAe,EAAE,KAAK;MACtBmD,OAAO,EAAE,IAAI,CAACC,iBAAiB,CAACtI,wDAAS,CAACO,SAAS;IACrD,CAAC,CAAC;IAEF,IAAIsD,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,UAAU,CAAC;IACvD;IAEA,OAAOmf,QAAQ,CAACC,IAAI,EAAE7I,MAAM,EAAEvQ,OAAO,IAAI,IAAI;EAC/C;EAEA,MAAMuf,cAAcA,CAAC;IAAEC,WAAW;IAAEC;EAAY,CAAC,EAAE;IACjD,MAAMtG,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACoK,iBAAiB,EAAE;MAC7DF,WAAW;MACXC;IACF,CAAC,EAAE;MACDjF,eAAe,EAAE,KAAK;MACtBmD,OAAO,EAAE,IAAI,CAACC,iBAAiB,CAACtI,wDAAS,CAACoK,iBAAiB;IAC7D,CAAC,CAAC;IAEF,IAAIvG,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAImf,QAAQ,CAACC,IAAI,EAAEuG,GAAG,IAAI,QAAQ,CAAC;IAC3E;IAEA,OAAO,IAAI;EACb;EAEA,MAAMC,qBAAqBA,CAAC;IAAExnB,MAAM;IAAEynB,SAAS;IAAEJ;EAAY,CAAC,EAAE;IAC9D,MAAMtG,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,wDAAS,CAACwK,gBAAgB,EAAE;MAC5D1nB,MAAM;MACNynB,SAAS;MACTJ;IACF,CAAC,EAAE;MAAEjF,eAAe,EAAE;IAAM,CAAC,CAAC;IAE9B,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;MAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAImf,QAAQ,CAACC,IAAI,EAAEuG,GAAG,IAAI,QAAQ,CAAC;IAC3E;IAEA,OAAO,IAAI;EACb;EAEAI,kBAAkBA,CAAA,EAAG;IACnB,MAAMtoB,QAAQ,GAAG,IAAI,CAAC+lB,cAAc,CAAC,CAAC;IACtC,IAAI,CAAChkB,IAAI,CAAC,iBAAiB,EAAE/B,QAAQ,CAAC;IACtC,OAAOA,QAAQ;EACjB;EAEAuoB,wBAAwBA,CAACjf,MAAM,EAAEkf,QAAQ,GAAG,IAAI,EAAE;IAChD,MAAM5f,KAAK,GAAGyY,QAAQ,CAACmH,QAAQ,EAAE5f,KAAK,IAAI4f,QAAQ,EAAEhoB,WAAW,IAAIgoB,QAAQ,EAAE/nB,IAAI,EAAE6I,MAAM,CAAC;IAC1F,OAAO;MACLtD,EAAE,EAAE,UAAUsD,MAAM,EAAE;MACtB7B,IAAI,EAAE,QAAQ;MACd+L,MAAM,EAAElK,MAAM;MACdV,KAAK;MACL+d,QAAQ,EAAE,EAAE;MACZ9R,MAAM,EAAE,CAAC;MACTxR,QAAQ,EAAEmlB,QAAQ,EAAEnlB,QAAQ,IAAI,EAAE;MAClCC,UAAU,EAAEsF,KAAK,CAACR,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;MAC3C2Q,SAAS,EAAE5B,IAAI,CAAC6B,GAAG,CAAC,CAAC;MACrBxF,GAAG,EAAE;QAAEhM,IAAI,EAAE,QAAQ;QAAE+L,MAAM,EAAElK,MAAM;QAAE0a,IAAI,EAAE;MAAE;IACjD,CAAC;EACH;EAEAoC,UAAUA,CAAC9c,MAAM,EAAEmf,MAAM,EAAED,QAAQ,EAAE;IACnC,MAAM5f,KAAK,GAAGyY,QAAQ,CAACmH,QAAQ,EAAEnC,WAAW,IAAIoC,MAAM,EAAEpoB,KAAK,IAAImoB,QAAQ,EAAEhoB,WAAW,IAAIgoB,QAAQ,EAAE/nB,IAAI,EAAE6I,MAAM,CAAC;IACjH,OAAO;MACLtD,EAAE,EAAEsD,MAAM;MACV5I,GAAG,EAAE4I,MAAM;MACXV,KAAK;MACL+d,QAAQ,EAAE6B,QAAQ,EAAE7nB,MAAM,IAAI6nB,QAAQ,EAAE/nB,IAAI,IAAI6I,MAAM;MACtDjG,QAAQ,EAAEmlB,QAAQ,EAAEnlB,QAAQ,IAAI,EAAE;MAClCzC,OAAO,EAAE4nB,QAAQ,EAAE5nB,OAAO,IAAI,EAAE;MAChC0C,UAAU,EAAEsF,KAAK,CAACR,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;MAC3ChI,KAAK,EAAEooB,MAAM,EAAEpoB,KAAK,IAAImoB,QAAQ,EAAEnC,WAAW,IAAI,EAAE;MACnDqC,SAAS,EAAED,MAAM;MACjBloB,OAAO,EAAEioB;IACX,CAAC;EACH;EAEAG,EAAEA,CAACC,SAAS,EAAEC,OAAO,EAAE;IACrB,IAAI,CAAC,IAAI,CAAC5G,SAAS,CAAC1J,GAAG,CAACqQ,SAAS,CAAC,EAAE;MAClC,IAAI,CAAC3G,SAAS,CAAC1V,GAAG,CAACqc,SAAS,EAAE,IAAItQ,GAAG,CAAC,CAAC,CAAC;IAC1C;IACA,IAAI,CAAC2J,SAAS,CAACrB,GAAG,CAACgI,SAAS,CAAC,CAACnQ,GAAG,CAACoQ,OAAO,CAAC;IAC1C,OAAO,MAAM,IAAI,CAACC,GAAG,CAACF,SAAS,EAAEC,OAAO,CAAC;EAC3C;EAEAC,GAAGA,CAACF,SAAS,EAAEC,OAAO,EAAE;IACtB,IAAI,CAAC5G,SAAS,CAACrB,GAAG,CAACgI,SAAS,CAAC,EAAEpQ,MAAM,CAACqQ,OAAO,CAAC;EAChD;EAEA9mB,IAAIA,CAAC6mB,SAAS,EAAEG,OAAO,EAAE;IACvB,IAAI,CAAC9G,SAAS,CAACrB,GAAG,CAACgI,SAAS,CAAC,EAAE5M,OAAO,CAAC6M,OAAO,IAAIA,OAAO,CAACE,OAAO,CAAC,CAAC;EACrE;EAEA/F,eAAeA,CAACvgB,GAAG,EAAEif,QAAQ,EAAE;IAC7B,MAAMsH,QAAQ,GAAGtH,QAAQ,CAACwE,OAAO,EAAE+C,SAAS,IAAIvH,QAAQ,CAACwE,OAAO,EAAEgD,SAAS;IAC3E,IAAIF,QAAQ,EAAE;MACZlK,YAAY,CAACM,OAAO,CAACvB,wDAAS,CAACsL,sBAAsB,GAAG,IAAI,CAACC,UAAU,CAAC3mB,GAAG,CAAC,EAAEumB,QAAQ,CAAC;IACzF;EACF;EAEA7C,iBAAiBA,CAAC1jB,GAAG,EAAE;IACrB,MAAM4mB,IAAI,GAAG,IAAI,CAACD,UAAU,CAAC3mB,GAAG,CAAC;IACjC,IAAI,CAAC4mB,IAAI,EAAE;MACT,OAAO,CAAC,CAAC;IACX;IACA,MAAMnG,KAAK,GAAGpE,YAAY,CAACC,OAAO,CAAClB,wDAAS,CAACsL,sBAAsB,GAAGE,IAAI,CAAC;IAC3E,OAAOnG,KAAK,GAAG;MAAEgG,SAAS,EAAEhG;IAAM,CAAC,GAAG,CAAC,CAAC;EAC1C;EAEAkG,UAAUA,CAAC3mB,GAAG,EAAE;IACd,IAAI;MACF,OAAO,IAAIyJ,GAAG,CAACzJ,GAAG,EAAE0J,MAAM,CAACC,QAAQ,CAACC,MAAM,CAAC,CAACgd,IAAI;IAClD,CAAC,CAAC,OAAOtlB,KAAK,EAAE;MACd,OAAO,EAAE;IACX;EACF;AACF;AAEO,MAAMwN,QAAQ,GAAG,IAAIwQ,YAAY,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC58BN;AACgB;;;;IAEpD,MAAM/hB,QAAQ,GAAGD,0EAAe,CAAC,CAAC;IAClC,MAAMwmB,OAAO,GAAG1mB,kDAAG,CAAC,EAAE,CAAC;IACvB,MAAMypB,aAAa,GAAGzpB,kDAAG,CAAC,KAAK,CAAC;IAChC,MAAM0pB,UAAU,GAAG1pB,kDAAG,CAAC,EAAE,CAAC;IAE1B,MAAM2pB,gBAAgB,GAAG5pB,uDAAQ,CAAC,MAAM;MACtC,MAAMQ,KAAK,GAAGmmB,OAAO,CAACnmB,KAAK,CAACqpB,WAAW,CAAC,CAAC;MACzC,IAAI,CAACrpB,KAAK,EAAE;QACV,OAAOJ,QAAQ,CAACA,QAAQ;MAC1B;MACA,OAAOA,QAAQ,CAACA,QAAQ,CAACmU,MAAM,CAAChF,IAAI,IAAI;QACtC,OAAOA,IAAI,CAACvG,KAAK,CAAC6gB,WAAW,CAAC,CAAC,CAACriB,QAAQ,CAAChH,KAAK,KACzC+O,IAAI,CAACwX,QAAQ,CAAC8C,WAAW,CAAC,CAAC,CAACriB,QAAQ,CAAChH,KAAK,KAC1C+O,IAAI,CAACzO,GAAG,CAAC+oB,WAAW,CAAC,CAAC,CAACriB,QAAQ,CAAChH,KAAK,CAAC;MAC7C,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,SAASspB,cAAcA,CAAA,EAAG;MACxB1pB,QAAQ,CAACsB,WAAW,GAAG,EAAE;MACzBtB,QAAQ,CAAC2pB,UAAU,GAAG,EAAE;MACxBJ,UAAU,CAACnpB,KAAK,GAAG,EAAE;MACrBkpB,aAAa,CAAClpB,KAAK,GAAG,IAAI;IAC5B;IAEA,SAASwpB,eAAeA,CAAA,EAAG;MACzBN,aAAa,CAAClpB,KAAK,GAAG,KAAK;IAC7B;IAEA,eAAeypB,gBAAgBA,CAAA,EAAG;MAChC,MAAMC,KAAK,GAAG,MAAM9pB,QAAQ,CAACiJ,UAAU,CAACsgB,UAAU,CAACnpB,KAAK,CAAC;MACzD,IAAI0pB,KAAK,EAAE;QACT3d,MAAM,CAAC+E,UAAU,CAAC,MAAM;UACtBoY,aAAa,CAAClpB,KAAK,GAAG,KAAK;QAC7B,CAAC,EAAE,GAAG,CAAC;MACT;IACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrGoC;AACW;AACV;AACc;AAEnD,MAAM2pB,8BAA8B,GAAG,mCAAmC;AAC1E,MAAMC,2BAA2B,GAAG,iCAAiC;AAErE,SAAS/L,gBAAgBA,CAACC,OAAO,EAAE;EACjC,MAAMzM,OAAO,GAAGD,0EAAe,CAAC,CAAC;EACjC,MAAM2M,KAAK,GAAG,GAAGN,wDAAS,CAACO,SAAS,IAAI,EAAE,IAAI3M,OAAO,CAACnI,MAAM,IAAI,WAAW,EAAE;EAC7E,OAAO,GAAG4U,OAAO,IAAIG,kBAAkB,CAACF,KAAK,CAAC,EAAE;AAClD;AAEA,SAAS8L,oBAAoBA,CAAA,EAAG;EAC9B,IAAI;IACF,OAAOrL,IAAI,CAACC,KAAK,CAACC,YAAY,CAACC,OAAO,CAACd,gBAAgB,CAAC+L,2BAA2B,CAAC,CAAC,IAAI,IAAI,CAAC;EAChG,CAAC,CAAC,OAAOjmB,KAAK,EAAE;IACd,OAAO,EAAE;EACX;AACF;AAEA,SAASmmB,qBAAqBA,CAACpkB,QAAQ,EAAE;EACvCgZ,YAAY,CAACM,OAAO,CAACnB,gBAAgB,CAAC+L,2BAA2B,CAAC,EAAEpL,IAAI,CAACS,SAAS,CAACvZ,QAAQ,CAAC,CAAC;AAC/F;AAEA,SAASqkB,sBAAsBA,CAAA,EAAG;EAChC,IAAI;IACF,OAAOvL,IAAI,CAACC,KAAK,CAACC,YAAY,CAACC,OAAO,CAACd,gBAAgB,CAAC8L,8BAA8B,CAAC,CAAC,IAAI,IAAI,CAAC;EACnG,CAAC,CAAC,OAAOhmB,KAAK,EAAE;IACd,OAAO,EAAE;EACX;AACF;AAEA,SAASqmB,uBAAuBA,CAACvb,aAAa,EAAE;EAC9CiQ,YAAY,CAACM,OAAO,CAACnB,gBAAgB,CAAC8L,8BAA8B,CAAC,EAAEnL,IAAI,CAACS,SAAS,CAACxQ,aAAa,CAAC,CAAC;AACvG;AAEA,SAASyP,QAAQA,CAAA,EAAG;EAClB,IAAInS,MAAM,CAACoS,MAAM,IAAIpS,MAAM,CAACoS,MAAM,CAACC,UAAU,EAAE;IAC7C,OAAOrS,MAAM,CAACoS,MAAM,CAACC,UAAU,CAAC,CAAC,CAACC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;EACvD;EACA,OAAO,GAAGrH,IAAI,CAAC6B,GAAG,CAAC,CAAC,GAAG5O,IAAI,CAACqU,MAAM,CAAC,CAAC,CAAC/R,QAAQ,CAAC,EAAE,CAAC,CAACvE,KAAK,CAAC,CAAC,CAAC,EAAE;AAC9D;AAEA,SAAS1C,UAAUA,CAACnD,OAAO,EAAE;EAC3B,OAAOA,OAAO,CAACyD,EAAE,IAAIzD,OAAO,CAAC4D,UAAU;AACzC;AAEA,SAASkkB,gBAAgBA,CAAC9nB,OAAO,EAAE;EACjC,OAAOyE,MAAM,CAACzE,OAAO,EAAE4D,UAAU,IAAI5D,OAAO,EAAEyD,EAAE,IAAI,EAAE,CAAC;AACzD;AAEA,SAASskB,wBAAwBA,CAAC/nB,OAAO,EAAE;EACzC,OAAOqH,MAAM,CAACrH,OAAO,EAAEwiB,iBAAiB,IAAIxiB,OAAO,EAAEuiB,QAAQ,IAAIviB,OAAO,EAAE6e,gBAAgB,IAAI7e,OAAO,EAAEgL,SAAS,IAAI,CAAC,CAAC;AACxH;AAEA,SAASlJ,iBAAiBA,CAAC9B,OAAO,EAAE;EAClC,OAAOuG,OAAO,CAACvG,OAAO,EAAE6D,QAAQ,CAAC,IAAI7D,OAAO,EAAE0D,MAAM,KAAK,UAAU;AACrE;AAEA,SAASskB,eAAeA,CAAChoB,OAAO,EAAE;EAChC,MAAMmF,UAAU,GAAGnF,OAAO,EAAEmF,UAAU;EACtC,IAAI,CAACA,UAAU,EAAE;IACf,OAAO,EAAE;EACX;EACA,IAAIA,UAAU,CAACD,IAAI,KAAK,OAAO,EAAE;IAC/B,OAAO,MAAM;EACf;EACA,OAAO,QAAQC,UAAU,CAACjH,IAAI,IAAI,IAAI,EAAE;AAC1C;AAEA,SAAS+pB,kBAAkBA,CAACjoB,OAAO,EAAE;EACnC,IAAI8B,iBAAiB,CAAC9B,OAAO,CAAC,EAAE;IAC9B,OAAO,IAAIA,OAAO,EAAEsN,YAAY,IAAI,KAAK,GAAG;EAC9C;EACA,MAAMJ,IAAI,GAAGzI,MAAM,CAACzE,OAAO,EAAEkN,IAAI,IAAI,EAAE,CAAC,CAACiE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAChL,IAAI,CAAC,CAAC;EACpE,OAAO+G,IAAI,IAAI8a,eAAe,CAAChoB,OAAO,CAAC;AACzC;AAEA,SAASkoB,WAAWA,CAACloB,OAAO,EAAE;EAC5B,MAAMkN,IAAI,GAAG+a,kBAAkB,CAACjoB,OAAO,CAAC;EACxC,OAAOkN,IAAI,CAAC0J,MAAM,GAAG,EAAE,GAAG,GAAG1J,IAAI,CAACrH,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAGqH,IAAI;AAC5D;AAEA,eAAeW,cAAcA,CAACX,IAAI,EAAE;EAClC,IAAIa,SAAS,CAACC,SAAS,EAAEC,SAAS,EAAE;IAClC,MAAMF,SAAS,CAACC,SAAS,CAACC,SAAS,CAACf,IAAI,CAAC;IACzC;EACF;EACA,MAAMjK,OAAO,GAAGgB,QAAQ,CAACiG,aAAa,CAAC,UAAU,CAAC;EAClDjH,OAAO,CAACpF,KAAK,GAAGqP,IAAI;EACpBjK,OAAO,CAACiL,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC;EAC5CjL,OAAO,CAACkL,KAAK,CAACC,QAAQ,GAAG,OAAO;EAChCnL,OAAO,CAACkL,KAAK,CAAC1F,IAAI,GAAG,SAAS;EAC9BxE,QAAQ,CAACqG,IAAI,CAACC,WAAW,CAACtH,OAAO,CAAC;EAClCA,OAAO,CAACoL,MAAM,CAAC,CAAC;EAChBpK,QAAQ,CAACqK,WAAW,CAAC,MAAM,CAAC;EAC5BrK,QAAQ,CAACqG,IAAI,CAACiE,WAAW,CAACtL,OAAO,CAAC;AACpC;AAEA,SAASklB,aAAaA,CAAC1f,IAAI,EAAE2f,KAAK,EAAE;EAClC,IAAI3f,IAAI,CAAC7E,UAAU,IAAIwkB,KAAK,CAACxkB,UAAU,IAAI6E,IAAI,CAAC7E,UAAU,KAAKwkB,KAAK,CAACxkB,UAAU,EAAE;IAC/E,OAAO,IAAI;EACb;EACA,IAAI6E,IAAI,CAAChF,EAAE,IAAI2kB,KAAK,CAAC3kB,EAAE,IAAIgF,IAAI,CAAChF,EAAE,KAAK2kB,KAAK,CAAC3kB,EAAE,EAAE;IAC/C,OAAO,IAAI;EACb;EACA,OAAOgF,IAAI,CAAC5G,SAAS,KAAKumB,KAAK,CAACvmB,SAAS,IACpC4G,IAAI,CAACyE,IAAI,KAAKkb,KAAK,CAAClb,IAAI,IACxB,CAACzE,IAAI,CAACvD,IAAI,IAAI,MAAM,OAAOkjB,KAAK,CAACljB,IAAI,IAAI,MAAM,CAAC,IAChD4C,IAAI,CAAC0W,GAAG,CAACnX,MAAM,CAACoB,IAAI,CAACoW,gBAAgB,IAAIpW,IAAI,CAACuC,SAAS,IAAI,CAAC,CAAC,GAAG3D,MAAM,CAAC+gB,KAAK,CAACvJ,gBAAgB,IAAIuJ,KAAK,CAACpd,SAAS,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK;AACtI;AAEA,SAASqd,eAAeA,CAAC9kB,QAAQ,EAAEvD,OAAO,EAAE;EAC1C,OAAOuD,QAAQ,CAAC4Z,IAAI,CAACvQ,IAAI,IAAI;IAC3B,IAAIA,IAAI,CAACnJ,EAAE,IAAIzD,OAAO,CAACyD,EAAE,IAAImJ,IAAI,CAACnJ,EAAE,KAAKzD,OAAO,CAACyD,EAAE,EAAE;MACnD,OAAO,IAAI;IACb;IACA,OAAOmJ,IAAI,CAAChJ,UAAU,IAAI5D,OAAO,CAAC4D,UAAU,IAAIgJ,IAAI,CAAChJ,UAAU,KAAK5D,OAAO,CAAC4D,UAAU;EACxF,CAAC,CAAC;AACJ;AAEA,SAAS0kB,uBAAuBA,CAAA,EAAG;EACjC,OAAOtZ,QAAQ,CAACsZ,uBAAuB,GAAGtZ,QAAQ,CAACsZ,uBAAuB,CAAC,CAAC,GAAG,IAAI;AACrF;AAEA,SAASC,cAAcA,CAAC3G,OAAO,GAAG,CAAC,CAAC,EAAE;EACpC,IAAI,OAAO3d,QAAQ,KAAK,WAAW,EAAE;IACnC,OAAO,KAAK;EACd;EACA,IAAIA,QAAQ,CAACukB,eAAe,KAAK,SAAS,EAAE;IAC1C,OAAO,KAAK;EACd;EACA,IAAI5G,OAAO,CAAC6G,UAAU,EAAE;IACtB,OAAO,IAAI;EACb;EACA,OAAO,IAAI;AACb;AAEA,SAASC,oBAAoBA,CAACC,eAAe,EAAEC,cAAc,EAAE;EAC7D,MAAMC,MAAM,GAAG,CAAC,GAAGD,cAAc,CAAC;EAClCD,eAAe,CAAClP,OAAO,CAACqP,cAAc,IAAI;IACxC,MAAMC,MAAM,GAAGF,MAAM,CAAC1L,IAAI,CAACnd,OAAO,IAAImoB,aAAa,CAACnoB,OAAO,EAAE8oB,cAAc,CAAC,CAAC;IAC7E,MAAME,eAAe,GAAGF,cAAc,CAACplB,MAAM,KAAK,SAAS,IACtDolB,cAAc,CAACplB,MAAM,KAAK,QAAQ,IACjColB,cAAc,CAACjnB,SAAS,KAAK,KAAK,IACjCinB,cAAc,CAACplB,MAAM,KAAK,MAAM,IAChCmR,IAAI,CAAC6B,GAAG,CAAC,CAAC,GAAGrP,MAAM,CAACyhB,cAAc,CAAC9d,SAAS,IAAI,CAAC,CAAC,GAAG,KAAM;IAClE,IAAI,CAAC+d,MAAM,IAAIC,eAAe,EAAE;MAC9BH,MAAM,CAACxmB,IAAI,CAACymB,cAAc,CAAC;IAC7B;EACF,CAAC,CAAC;EAEF,OAAOD,MAAM,CACVjX,MAAM,CAAC,CAAC5R,OAAO,EAAE0Z,KAAK,EAAEnW,QAAQ,KAAK;IACpC,MAAMsH,GAAG,GAAG1H,UAAU,CAACnD,OAAO,CAAC;IAC/B,OAAOuD,QAAQ,CAACma,SAAS,CAAC9Q,IAAI,IAAIzJ,UAAU,CAACyJ,IAAI,CAAC,KAAK/B,GAAG,CAAC,KAAK6O,KAAK;EACvE,CAAC,CAAC,CACDgF,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKvX,MAAM,CAACsX,CAAC,CAACE,gBAAgB,IAAIF,CAAC,CAAC3T,SAAS,IAAI,CAAC,CAAC,GAAG3D,MAAM,CAACuX,CAAC,CAACC,gBAAgB,IAAID,CAAC,CAAC5T,SAAS,IAAI,CAAC,CAAC,CAAC;AACpH;AAEA,SAASie,sBAAsBA,CAACC,gBAAgB,EAAEC,YAAY,EAAE;EAC9D,MAAMC,aAAa,GAAG,IAAInL,GAAG,CAAC,CAAC;EAC/B,CAACiL,gBAAgB,IAAI,EAAE,EAAEzP,OAAO,CAACzZ,OAAO,IAAI;IAC1C,MAAM6K,GAAG,GAAGid,gBAAgB,CAAC9nB,OAAO,CAAC;IACrC,IAAI6K,GAAG,EAAE;MACPue,aAAa,CAACpf,GAAG,CAACa,GAAG,EAAE7K,OAAO,CAAC;IACjC;EACF,CAAC,CAAC;EAEF,OAAO,CAACmpB,YAAY,IAAI,EAAE,EAAEvX,MAAM,CAAC5R,OAAO,IAAI;IAC5C,IAAIA,OAAO,CAAC6B,SAAS,KAAK,IAAI,EAAE;MAC9B,OAAO,KAAK;IACd;IACA,MAAM0gB,QAAQ,GAAGlb,MAAM,CAACrH,OAAO,CAACuiB,QAAQ,IAAI,CAAC,CAAC;IAC9C,IAAIA,QAAQ,IAAI,CAAC,EAAE;MACjB,OAAO,KAAK;IACd;IACA,MAAM8G,QAAQ,GAAGD,aAAa,CAAC/K,GAAG,CAACyJ,gBAAgB,CAAC9nB,OAAO,CAAC,CAAC;IAC7D,OAAOqpB,QAAQ,IAAI9G,QAAQ,GAAGlb,MAAM,CAACgiB,QAAQ,CAAC9G,QAAQ,IAAI,CAAC,CAAC;EAC9D,CAAC,CAAC;AACJ;AAEA,IAAI+G,wBAAwB,GAAG,IAAI;AAEnC,SAASC,qBAAqBA,CAAA,EAAG;EAC/B,IAAI,OAAO3f,MAAM,KAAK,WAAW,EAAE;IACjC;EACF;EACA,IAAI;IACF,MAAM4f,YAAY,GAAG5f,MAAM,CAAC4f,YAAY,IAAI5f,MAAM,CAAC6f,kBAAkB;IACrE,IAAI,CAACD,YAAY,EAAE;MACjB;IACF;IACAF,wBAAwB,GAAGA,wBAAwB,IAAI,IAAIE,YAAY,CAAC,CAAC;IACzE,IAAIF,wBAAwB,CAAC5d,KAAK,KAAK,WAAW,EAAE;MAClD4d,wBAAwB,CAACI,MAAM,CAAC,CAAC,CAAC5iB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACnD;IACA,MAAM6iB,UAAU,GAAGL,wBAAwB,CAACM,gBAAgB,CAAC,CAAC;IAC9D,MAAMC,IAAI,GAAGP,wBAAwB,CAACQ,UAAU,CAAC,CAAC;IAClD,MAAMC,OAAO,GAAGT,wBAAwB,CAACU,WAAW;IACpDL,UAAU,CAACzkB,IAAI,GAAG,MAAM;IACxBykB,UAAU,CAACM,SAAS,CAACC,cAAc,CAAC,GAAG,EAAEH,OAAO,CAAC;IACjDJ,UAAU,CAACM,SAAS,CAACC,cAAc,CAAC,GAAG,EAAEH,OAAO,GAAG,GAAG,CAAC;IACvDF,IAAI,CAACA,IAAI,CAACK,cAAc,CAAC,MAAM,EAAEH,OAAO,CAAC;IACzCF,IAAI,CAACA,IAAI,CAACM,4BAA4B,CAAC,IAAI,EAAEJ,OAAO,GAAG,IAAI,CAAC;IAC5DF,IAAI,CAACA,IAAI,CAACM,4BAA4B,CAAC,MAAM,EAAEJ,OAAO,GAAG,IAAI,CAAC;IAC9DJ,UAAU,CAAC1I,OAAO,CAAC4I,IAAI,CAAC;IACxBA,IAAI,CAAC5I,OAAO,CAACqI,wBAAwB,CAACc,WAAW,CAAC;IAClDT,UAAU,CAACtR,KAAK,CAAC0R,OAAO,CAAC;IACzBJ,UAAU,CAACU,IAAI,CAACN,OAAO,GAAG,IAAI,CAAC;EACjC,CAAC,CAAC,OAAOvoB,KAAK,EAAE;IACd;EAAA;AAEJ;AAEO,MAAM6K,oBAAoB,GAAGP,6DAAW,CAAC,eAAe,EAAE;EAC/DJ,KAAK,EAAEA,CAAA,MAAO;IACZ4e,QAAQ,EAAE,EAAE;IACZhe,aAAa,EAAE,EAAE;IACjBsQ,sBAAsB,EAAE,CAAC,CAAC;IAC1B2N,6BAA6B,EAAE,CAAC,CAAC;IACjCC,WAAW,EAAE,KAAK;IAClBC,aAAa,EAAE,KAAK;IACpBC,OAAO,EAAE,KAAK;IACdC,SAAS,EAAE,IAAI;IACfC,qBAAqB,EAAE,IAAI;IAC3BC,uBAAuB,EAAE,KAAK;IAC9BC,YAAY,EAAE,KAAK;IACnBC,gCAAgC,EAAE,EAAE;IACpCC,wBAAwB,EAAE,KAAK;IAC/BC,kBAAkB,EAAE,IAAI;IACxBC,gCAAgC,EAAE,CAAC,CAAC;IACpCC,aAAa,EAAE,IAAI;IACnBC,kBAAkB,EAAE,EAAE;IACtBC,cAAc,EAAE,IAAI;IACpBC,WAAW,EAAE,EAAE;IACfC,WAAW,EAAE,EAAE;IACfC,iBAAiB,EAAE,KAAK;IACxBC,oBAAoB,EAAE,KAAK;IAC3BC,kBAAkB,EAAE,EAAE;IACtB3Z,aAAa,EAAE,IAAI;IACnB/N,kBAAkB,EAAE,EAAE;IACtB2nB,qBAAqB,EAAE,IAAI;IAC3BnkB,aAAa,EAAE,KAAK;IACpB5C,kBAAkB,EAAE,EAAE;IACtBgnB,gBAAgB,EAAE,EAAE;IACpBC,iBAAiB,EAAE,EAAE;IACrBC,YAAY,EAAE,EAAE;IAChB/sB,WAAW,EAAE;EACf,CAAC,CAAC;EACFgtB,OAAO,EAAE;IACP5c,kBAAkBA,CAACzD,KAAK,EAAE;MACxB,OAAOA,KAAK,CAACY,aAAa,CAACtJ,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKiI,KAAK,CAAC4e,QAAQ,CAAC,IAAI5e,KAAK,CAACY,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI;IACvG,CAAC;IACD0f,cAAcA,CAACtgB,KAAK,EAAE;MACpB,OAAOA,KAAK,CAAC6e,6BAA6B,CAAC7e,KAAK,CAAC4e,QAAQ,CAAC,IAAI,EAAE;IAClE,CAAC;IACD2B,WAAWA,CAACvgB,KAAK,EAAE;MACjB,OAAOA,KAAK,CAACY,aAAa,CAAC4f,MAAM,CAAC,CAACC,GAAG,EAAEvf,IAAI,KAAKuf,GAAG,GAAG9kB,MAAM,CAACuF,IAAI,CAAC0F,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC;IACDK,yBAAyBA,CAACjH,KAAK,EAAE;MAC/B,MAAMoB,YAAY,GAAGpB,KAAK,CAACY,aAAa,CAACtJ,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKiI,KAAK,CAAC4e,QAAQ,CAAC,IAAI5e,KAAK,CAACY,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI;MACnH,IAAI,CAACQ,YAAY,EAAE;QACjB,OAAO,KAAK;MACd;MACA,IAAIA,YAAY,CAAC5H,IAAI,KAAK,SAAS,EAAE;QACnC,OAAO,IAAI;MACb;MACA,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAACL,QAAQ,CAACiI,YAAY,CAAC9L,IAAI,IAAI8L,YAAY,CAACoE,GAAG,EAAElQ,IAAI,IAAI,EAAE,CAAC;IACvF,CAAC;IACD8D,kBAAkBA,CAAC4G,KAAK,EAAE;MACxB,OAAOA,KAAK,CAACkgB,gBAAgB,CAACpoB,GAAG,CAACxD,OAAO,IAAIA,OAAO,CAAC6K,GAAG,CAAC;IAC3D,CAAC;IACD4B,cAAcA,CAACf,KAAK,EAAE;MACpB,OAAOA,KAAK,CAACkgB,gBAAgB,CAAC5oB,IAAI,CAAChD,OAAO,IAAIA,OAAO,CAAC6K,GAAG,KAAKa,KAAK,CAACmgB,iBAAiB,CAAC,IACjFngB,KAAK,CAACkgB,gBAAgB,CAAC,CAAC,CAAC,IACzB,IAAI;IACX,CAAC;IACDQ,gBAAgBA,CAAC1gB,KAAK,EAAE;MACtB,MAAM2gB,WAAW,GAAG,IAAItW,GAAG,CAACrK,KAAK,CAAC9G,kBAAkB,CAAC;MACrD,OAAO,CAAC8G,KAAK,CAAC6e,6BAA6B,CAAC7e,KAAK,CAAC4e,QAAQ,CAAC,IAAI,EAAE,EAC9D1Y,MAAM,CAAC5R,OAAO,IAAIqsB,WAAW,CAACrW,GAAG,CAAC8R,gBAAgB,CAAC9nB,OAAO,CAAC,CAAC,CAAC;IAClE;EACF,CAAC;EACDiM,OAAO,EAAE;IACPkP,iBAAiBA,CAAA,EAAG;MAClB,MAAMjM,OAAO,GAAGD,0EAAe,CAAC,CAAC;MACjC,IAAI,CAACqd,YAAY,CAAC,CAAC;MACnB,IAAI,CAAC7B,aAAa,GAAG,KAAK;MAC1B,IAAI,CAACvb,OAAO,CAACnI,MAAM,EAAE;QACnB,IAAI,CAACqU,cAAc,CAAC,CAAC;QACrB;MACF;MACA,IAAI,CAACmR,oBAAoB,CAAC,CAAC;MAC3B,IAAI,CAACC,gBAAgB,CAAC,CAAC;IACzB,CAAC;IACDD,oBAAoBA,CAAA,EAAG;MACrB,IAAI,CAACjgB,aAAa,GAAGsb,sBAAsB,CAAC,CAAC;MAC7C,IAAI,CAACgE,gBAAgB,GAAGlE,oBAAoB,CAAC,CAAC;MAC9C,IAAI,CAACmE,iBAAiB,GAAG,IAAI,CAACD,gBAAgB,CAAC,CAAC,CAAC,EAAE/gB,GAAG,IAAI,EAAE;MAC5D,IAAI,CAACyf,QAAQ,GAAG,IAAI,CAAChe,aAAa,CAAC,CAAC,CAAC,EAAE7I,EAAE,IAAI,EAAE;MAC/C,IAAI,CAACmZ,sBAAsB,GAAG,CAAC,CAAC;MAChC,IAAI,CAAC2N,6BAA6B,GAAG,CAAC,CAAC;MACvC,IAAI,CAACW,gCAAgC,GAAG,CAAC,CAAC;MAC1C,IAAI,CAACC,aAAa,GAAG,IAAI;MACzB,IAAI,CAACC,kBAAkB,GAAG,EAAE;MAC5B,IAAI,CAACC,cAAc,GAAG,IAAI;MAC1B,IAAI,CAACC,WAAW,GAAG,EAAE;MACrB,IAAI,CAACC,WAAW,GAAG,EAAE;MACrB,IAAI,CAACC,iBAAiB,GAAG,KAAK;MAC9B,IAAI,CAACC,oBAAoB,GAAG,KAAK;MACjC,IAAI,CAACC,kBAAkB,GAAG,EAAE;MAC5B,IAAI,CAAC3Z,aAAa,GAAG,IAAI;MACzB,IAAI,CAACvK,aAAa,GAAG,KAAK;MAC1B,IAAI,CAAC5C,kBAAkB,GAAG,EAAE;MAC5B,IAAI,IAAI,CAAC0lB,QAAQ,EAAE;QACjB,IAAI,CAACmC,kBAAkB,CAAC;UAAE3Y,gBAAgB,EAAE;QAAK,CAAC,CAAC;MACrD;IACF,CAAC;IACDsH,cAAcA,CAAA,EAAG;MACfxR,MAAM,CAAC8iB,aAAa,CAAC,IAAI,CAAC/B,SAAS,CAAC;MACpC/gB,MAAM,CAAC8iB,aAAa,CAAC,IAAI,CAAC9B,qBAAqB,CAAC;MAChDhhB,MAAM,CAAC+iB,YAAY,CAAC,IAAI,CAAC1B,kBAAkB,CAAC;MAC5CrhB,MAAM,CAAC+iB,YAAY,CAAC,IAAI,CAAChB,qBAAqB,CAAC;MAC/C,IAAI,CAAChB,SAAS,GAAG,IAAI;MACrB,IAAI,CAACC,qBAAqB,GAAG,IAAI;MACjC,IAAI,CAACK,kBAAkB,GAAG,IAAI;MAC9B,IAAI,CAACU,qBAAqB,GAAG,IAAI;MACjC,IAAI,CAACb,YAAY,GAAG,KAAK;MACzB,IAAI,CAACE,wBAAwB,GAAG,KAAK;MACrC,IAAI,CAACD,gCAAgC,GAAG,EAAE;MAC1C,IAAI,CAACT,QAAQ,GAAG,EAAE;MAClB,IAAI,CAAChe,aAAa,GAAG,EAAE;MACvB,IAAI,CAACsQ,sBAAsB,GAAG,CAAC,CAAC;MAChC,IAAI,CAAC2N,6BAA6B,GAAG,CAAC,CAAC;MACvC,IAAI,CAACW,gCAAgC,GAAG,CAAC,CAAC;MAC1C,IAAI,CAACC,aAAa,GAAG,IAAI;MACzB,IAAI,CAACC,kBAAkB,GAAG,EAAE;MAC5B,IAAI,CAACC,cAAc,GAAG,IAAI;MAC1B,IAAI,CAACC,WAAW,GAAG,EAAE;MACrB,IAAI,CAACC,WAAW,GAAG,EAAE;MACrB,IAAI,CAACC,iBAAiB,GAAG,KAAK;MAC9B,IAAI,CAACC,oBAAoB,GAAG,KAAK;MACjC,IAAI,CAACC,kBAAkB,GAAG,EAAE;MAC5B,IAAI,CAAC3Z,aAAa,GAAG,IAAI;MACzB,IAAI,CAAC/N,kBAAkB,GAAG,EAAE;MAC5B,IAAI,CAACwD,aAAa,GAAG,KAAK;MAC1B,IAAI,CAAC5C,kBAAkB,GAAG,EAAE;MAC5B,IAAI,CAACgnB,gBAAgB,GAAG,EAAE;MAC1B,IAAI,CAACC,iBAAiB,GAAG,EAAE;MAC3B,IAAI,CAACC,YAAY,GAAG,EAAE;MACtB,IAAI,CAAC/sB,WAAW,GAAG,EAAE;IACvB,CAAC;IACDutB,YAAYA,CAAA,EAAG;MACb,IAAI,IAAI,CAAC9B,WAAW,EAAE;QACpB;MACF;MACA,IAAI,CAACA,WAAW,GAAG,IAAI;MACvBxb,mEAAQ,CAACoX,EAAE,CAAC,aAAa,EAAEpmB,OAAO,IAAI;QACpC,IAAI,CAAC4sB,aAAa,CAAC5sB,OAAO,CAACgN,cAAc,EAAEhN,OAAO,CAAC;MACrD,CAAC,CAAC;MACFgP,mEAAQ,CAACoX,EAAE,CAAC,iBAAiB,EAAEpmB,OAAO,IAAI;QACxC,IAAI,CAAC4sB,aAAa,CAAC5sB,OAAO,CAACgN,cAAc,EAAEhN,OAAO,CAAC;QACnD,IAAIA,OAAO,CAACgN,cAAc,KAAK,IAAI,CAACsd,QAAQ,EAAE;UAC5C,IAAI,CAACzW,kBAAkB,CAAC;YAAEC,gBAAgB,EAAE;UAAK,CAAC,CAAC;QACrD;MACF,CAAC,CAAC;MACF9E,mEAAQ,CAACoX,EAAE,CAAC,sBAAsB,EAAEpmB,OAAO,IAAI;QAC7C,IAAI,CAAC6sB,cAAc,CAAC7sB,OAAO,CAACgN,cAAc,EAAEhN,OAAO,CAAC;MACtD,CAAC,CAAC;MACFgP,mEAAQ,CAACoX,EAAE,CAAC,sBAAsB,EAAE9E,mBAAmB,IAAI;QACzD,IAAI,CAACmJ,aAAa,GAAG,KAAK;QAC1B,IAAI,CAACqC,wBAAwB,CAACxL,mBAAmB,CAAC;MACpD,CAAC,CAAC;IACJ,CAAC;IACD5S,qBAAqBA,CAACjL,EAAE,EAAE;MACxB,IAAI,CAAC6mB,QAAQ,GAAG7mB,EAAE;MAClB,MAAMqJ,YAAY,GAAG,IAAI,CAACR,aAAa,CAACtJ,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKA,EAAE,CAAC;MACpE,IAAIqJ,YAAY,EAAE;QAChBA,YAAY,CAACwF,MAAM,GAAG,CAAC;MACzB;MACA,IAAI,CAACma,kBAAkB,CAAC;QAAE3Y,gBAAgB,EAAE,IAAI;QAAE2U,UAAU,EAAE;MAAK,CAAC,CAAC;IACvE,CAAC;IACDsE,QAAQA,CAAC7f,IAAI,EAAE;MACb,MAAMJ,YAAY,GAAG,IAAI,CAACqC,kBAAkB;MAC5C,IAAI,CAACrC,YAAY,IAAI,CAACI,IAAI,CAAC/G,IAAI,CAAC,CAAC,EAAE;QACjC;MACF;MACA,IAAItI,KAAK,GAAGqP,IAAI,CAAC/G,IAAI,CAAC,CAAC;MACvB,IAAI,IAAI,CAACglB,aAAa,EAAE;QACtBttB,KAAK,GAAG,MAAMqqB,WAAW,CAAC,IAAI,CAACiD,aAAa,CAAC,KAAKttB,KAAK,EAAE;QACzD,IAAI,CAACstB,aAAa,GAAG,IAAI;MAC3B;MACA,MAAMnrB,OAAO,GAAG;QACdyD,EAAE,EAAEsY,QAAQ,CAAC,CAAC;QACd/O,cAAc,EAAEF,YAAY,CAACrJ,EAAE;QAC/BX,IAAI,EAAE,IAAI;QACVjB,SAAS,EAAE,KAAK;QAChBqD,IAAI,EAAE,MAAM;QACZgI,IAAI,EAAErP,KAAK;QACX6F,MAAM,EAAE,SAAS;QACjBC,cAAc,EAAE,SAAS;QACzBqH,SAAS,EAAE6J,IAAI,CAAC6B,GAAG,CAAC,CAAC;QACrBmI,gBAAgB,EAAEhK,IAAI,CAAC6B,GAAG,CAAC;MAC7B,CAAC;MACD,IAAI,CAACsW,oBAAoB,CAAClgB,YAAY,CAACrJ,EAAE,EAAEzD,OAAO,CAAC;MACnD,IAAI,CAAC4sB,aAAa,CAAC9f,YAAY,CAACrJ,EAAE,EAAEzD,OAAO,CAAC;MAC5CgP,mEAAQ,CAAC2T,eAAe,CAAC7V,YAAY,EAAEjP,KAAK,EAAEmC,OAAO,CAAC;MACtD8M,YAAY,CAACsX,QAAQ,GAAGvmB,KAAK;MAC7BiP,YAAY,CAAC2J,SAAS,GAAG5B,IAAI,CAAC6B,GAAG,CAAC,CAAC;MACnCmR,uBAAuB,CAAC,IAAI,CAACvb,aAAa,CAAC;MAC3C1C,MAAM,CAAC+iB,YAAY,CAAC,IAAI,CAAC1B,kBAAkB,CAAC;MAC5C,IAAI,CAACA,kBAAkB,GAAGrhB,MAAM,CAAC+E,UAAU,CAAC,MAAM,IAAI,CAACkF,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC;IACnF,CAAC;IACDoZ,cAAcA,CAAC;MAAE/nB,IAAI;MAAE8T,IAAI;MAAE9L,IAAI,GAAG;IAAG,CAAC,EAAE;MACxC,MAAMJ,YAAY,GAAG,IAAI,CAACqC,kBAAkB;MAC5C,IAAI,CAACrC,YAAY,IAAI,CAACkM,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAACnU,QAAQ,CAACK,IAAI,CAAC,EAAE;QAC/D;MACF;MACA,IAAIrH,KAAK,GAAGqP,IAAI,CAAC/G,IAAI,CAAC,CAAC;MACvB,IAAI,IAAI,CAACglB,aAAa,EAAE;QACtBttB,KAAK,GAAG,MAAMqqB,WAAW,CAAC,IAAI,CAACiD,aAAa,CAAC,KAAKttB,KAAK,EAAE,CAACsI,IAAI,CAAC,CAAC;QAChE,IAAI,CAACglB,aAAa,GAAG,IAAI;MAC3B;MACA,MAAMzU,GAAG,GAAG7B,IAAI,CAAC6B,GAAG,CAAC,CAAC;MACtB,MAAM1W,OAAO,GAAG;QACdyD,EAAE,EAAEsY,QAAQ,CAAC,CAAC;QACd/O,cAAc,EAAEF,YAAY,CAACrJ,EAAE;QAC/BX,IAAI,EAAE,IAAI;QACV2C,UAAU,EAAEqH,YAAY,CAAC9L,IAAI,IAAI8L,YAAY,CAACoE,GAAG,EAAElQ,IAAI,IAAI,EAAE;QAC7Da,SAAS,EAAE,KAAK;QAChBqD,IAAI;QACJgI,IAAI,EAAErP,KAAK;QACXsH,UAAU,EAAE;UACVD,IAAI;UACJhH,IAAI,EAAE8a,IAAI,CAAC9a,IAAI,KAAKgH,IAAI,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;UACnDie,IAAI,EAAEnK,IAAI,CAAC9T,IAAI,IAAI,EAAE;UACrBiC,IAAI,EAAE6R,IAAI,CAAC7R,IAAI,IAAI,CAAC;UACpBjH,GAAG,EAAEgF,IAAI,KAAK,OAAO,GAAGyE,GAAG,CAACyZ,eAAe,CAACpK,IAAI,CAAC,GAAG;QACtD,CAAC;QACDtV,MAAM,EAAE,SAAS;QACjBC,cAAc,EAAE,SAAS;QACzBqH,SAAS,EAAE0L,GAAG;QACdmI,gBAAgB,EAAEnI;MACpB,CAAC;MACD,IAAI,CAACsW,oBAAoB,CAAClgB,YAAY,CAACrJ,EAAE,EAAEzD,OAAO,CAAC;MACnD,IAAI,CAAC4sB,aAAa,CAAC9f,YAAY,CAACrJ,EAAE,EAAEzD,OAAO,CAAC;MAC5CgP,mEAAQ,CAACkU,qBAAqB,CAACpW,YAAY,EAAE;QAAE5H,IAAI;QAAE8T,IAAI;QAAE9L,IAAI,EAAErP;MAAM,CAAC,EAAEmC,OAAO,CAAC;MAClF8M,YAAY,CAACsX,QAAQ,GAAG6D,kBAAkB,CAACjoB,OAAO,CAAC;MACnD8M,YAAY,CAAC2J,SAAS,GAAGC,GAAG;MAC5BmR,uBAAuB,CAAC,IAAI,CAACvb,aAAa,CAAC;MAC3C1C,MAAM,CAAC+iB,YAAY,CAAC,IAAI,CAAC1B,kBAAkB,CAAC;MAC5C,IAAI,CAACA,kBAAkB,GAAGrhB,MAAM,CAAC+E,UAAU,CAAC,MAAM,IAAI,CAACkF,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC;IACnF,CAAC;IACD,MAAMqZ,sBAAsBA,CAACpgB,YAAY,EAAEI,IAAI,EAAE;MAC/C,IAAI,CAACJ,YAAY,IAAI,CAACI,IAAI,CAAC/G,IAAI,CAAC,CAAC,EAAE;QACjC,OAAO,IAAI;MACb;MACA,MAAMtI,KAAK,GAAGqP,IAAI,CAAC/G,IAAI,CAAC,CAAC;MACzB,MAAMnG,OAAO,GAAG;QACdyD,EAAE,EAAEsY,QAAQ,CAAC,CAAC;QACd/O,cAAc,EAAEF,YAAY,CAACrJ,EAAE;QAC/BX,IAAI,EAAE,IAAI;QACVjB,SAAS,EAAE,KAAK;QAChBqD,IAAI,EAAE,MAAM;QACZgI,IAAI,EAAErP,KAAK;QACX6F,MAAM,EAAE,SAAS;QACjBC,cAAc,EAAE,SAAS;QACzBqH,SAAS,EAAE6J,IAAI,CAAC6B,GAAG,CAAC,CAAC;QACrBmI,gBAAgB,EAAEhK,IAAI,CAAC6B,GAAG,CAAC;MAC7B,CAAC;MACD,IAAI,CAACkW,aAAa,CAAC9f,YAAY,CAACrJ,EAAE,EAAEzD,OAAO,CAAC;MAC5C,MAAM+iB,WAAW,GAAG,MAAM/T,mEAAQ,CAAC2T,eAAe,CAAC7V,YAAY,EAAEjP,KAAK,EAAEmC,OAAO,CAAC;MAChF,IAAI,CAAC6sB,cAAc,CAAC/f,YAAY,CAACrJ,EAAE,EAAEsf,WAAW,CAAC;MACjD,OAAOA,WAAW;IACpB,CAAC;IACDpP,kBAAkBA,CAAC7G,YAAY,EAAE;MAC/B,MAAM4M,KAAK,GAAG,IAAI,CAACpN,aAAa,CAACoR,SAAS,CAAC9Q,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKqJ,YAAY,CAACrJ,EAAE,CAAC;MAC/E,IAAIiW,KAAK,IAAI,CAAC,EAAE;QACd,IAAI,CAACpN,aAAa,CAACqR,MAAM,CAACjE,KAAK,EAAE,CAAC,EAAE;UAClC,GAAG,IAAI,CAACpN,aAAa,CAACoN,KAAK,CAAC;UAC5B,GAAG5M;QACL,CAAC,CAAC;MACJ,CAAC,MAAM;QACL,IAAI,CAACR,aAAa,CAAClK,OAAO,CAAC0K,YAAY,CAAC;MAC1C;MACA,IAAI,CAAC2d,aAAa,GAAG,KAAK;MAC1B5C,uBAAuB,CAAC,IAAI,CAACvb,aAAa,CAAC;IAC7C,CAAC;IACD6gB,kBAAkBA,CAACngB,cAAc,EAAE;MACjC,IAAI,CAACV,aAAa,GAAG,IAAI,CAACA,aAAa,CAACsF,MAAM,CAAC9E,YAAY,IAAIA,YAAY,CAACrJ,EAAE,KAAKuJ,cAAc,CAAC;MAClG,MAAM;QACJ,CAACA,cAAc,GAAGogB,eAAe;QACjC,GAAGxQ;MACL,CAAC,GAAG,IAAI,CAACA,sBAAsB;MAC/B,MAAM;QACJ,CAAC5P,cAAc,GAAGqgB,sBAAsB;QACxC,GAAG9C;MACL,CAAC,GAAG,IAAI,CAACA,6BAA6B;MACtC,MAAM;QACJ,CAACvd,cAAc,GAAGsgB,yBAAyB;QAC3C,GAAGpC;MACL,CAAC,GAAG,IAAI,CAACA,gCAAgC;MACzC,KAAKkC,eAAe;MACpB,KAAKC,sBAAsB;MAC3B,KAAKC,yBAAyB;MAC9B,IAAI,CAAC1Q,sBAAsB,GAAGA,sBAAsB;MACpD,IAAI,CAAC2N,6BAA6B,GAAGA,6BAA6B;MAClE,IAAI,CAACW,gCAAgC,GAAGA,gCAAgC;MACxE,IAAI,IAAI,CAACZ,QAAQ,KAAKtd,cAAc,EAAE;QACpC,IAAI,CAACsd,QAAQ,GAAG,IAAI,CAAChe,aAAa,CAAC,CAAC,CAAC,EAAE7I,EAAE,IAAI,EAAE;MACjD;MACAokB,uBAAuB,CAAC,IAAI,CAACvb,aAAa,CAAC;MAC3C,IAAI,IAAI,CAACge,QAAQ,EAAE;QACjB,IAAI,CAACmC,kBAAkB,CAAC,CAAC;MAC3B;IACF,CAAC;IACDK,wBAAwBA,CAACxL,mBAAmB,EAAE;MAC5C,MAAMiM,MAAM,GAAG1qB,KAAK,CAACkf,OAAO,CAACT,mBAAmB,CAAC,GAAGA,mBAAmB,GAAG,EAAE;MAC5E,IAAI,CAACiM,MAAM,CAAC3W,MAAM,IAAI,IAAI,CAACtK,aAAa,CAACsK,MAAM,EAAE;QAC/C;MACF;MAEA,MAAMiS,MAAM,GAAG,IAAI5K,GAAG,CAAC,CAAC;MACxB,IAAI,CAAC3R,aAAa,CAACmN,OAAO,CAAC3M,YAAY,IAAI;QACzC+b,MAAM,CAAC7e,GAAG,CAAC8C,YAAY,CAACrJ,EAAE,EAAEqJ,YAAY,CAAC;MAC3C,CAAC,CAAC;MACFygB,MAAM,CAAC9T,OAAO,CAAC3M,YAAY,IAAI;QAC7B,MAAMwF,MAAM,GAAGxF,YAAY,CAACrJ,EAAE,KAAK,IAAI,CAAC6mB,QAAQ,IAAI/B,cAAc,CAAC,CAAC,GAAG,CAAC,GAAGlhB,MAAM,CAACyF,YAAY,CAACwF,MAAM,IAAI,CAAC,CAAC;QAC3GuW,MAAM,CAAC7e,GAAG,CAAC8C,YAAY,CAACrJ,EAAE,EAAE;UAC1B,IAAIolB,MAAM,CAACxK,GAAG,CAACvR,YAAY,CAACrJ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;UACtC,GAAGqJ,YAAY;UACfwF;QACF,CAAC,CAAC;MACJ,CAAC,CAAC;MAEF,IAAI,CAAChG,aAAa,GAAGzJ,KAAK,CAACC,IAAI,CAAC+lB,MAAM,CAAC2E,MAAM,CAAC,CAAC,CAAC,CAC7C9O,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKvX,MAAM,CAACuX,CAAC,CAACnI,SAAS,IAAI,CAAC,CAAC,GAAGpP,MAAM,CAACsX,CAAC,CAAClI,SAAS,IAAI,CAAC,CAAC,CAAC,CACnE5Q,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;MAEhB,IAAI,CAAC,IAAI,CAACyG,aAAa,CAACsK,MAAM,EAAE;QAC9B,IAAI,CAAC0T,QAAQ,GAAG,EAAE;QAClB,IAAI,CAAC1N,sBAAsB,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC2N,6BAA6B,GAAG,CAAC,CAAC;QACvC,IAAI,CAACW,gCAAgC,GAAG,CAAC,CAAC;QAC1CrD,uBAAuB,CAAC,IAAI,CAACvb,aAAa,CAAC;QAC3C;MACF;MAEA,IAAI,CAAC,IAAI,CAACA,aAAa,CAACtJ,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAK,IAAI,CAAC6mB,QAAQ,CAAC,EAAE;QAC/D,IAAI,CAACA,QAAQ,GAAG,IAAI,CAAChe,aAAa,CAAC,CAAC,CAAC,CAAC7I,EAAE;MAC1C;MACAokB,uBAAuB,CAAC,IAAI,CAACvb,aAAa,CAAC;MAC3C,IAAI,CAACmgB,kBAAkB,CAAC,CAAC;IAC3B,CAAC;IACDG,aAAaA,CAAC5f,cAAc,EAAEhN,OAAO,EAAE;MACrC,IAAI,CAAC,IAAI,CAAC4c,sBAAsB,CAAC5P,cAAc,CAAC,EAAE;QAChD,IAAI,CAAC4P,sBAAsB,GAAG;UAC5B,GAAG,IAAI,CAACA,sBAAsB;UAC9B,CAAC5P,cAAc,GAAG;QACpB,CAAC;MACH;MACA,IAAIhN,OAAO,CAAC6B,SAAS,KAAK,KAAK,KAAK7B,OAAO,CAAC0D,MAAM,KAAK,SAAS,IAAI1D,OAAO,CAAC0D,MAAM,KAAK,MAAM,CAAC,EAAE;QAC9F,IAAI,CAAC+pB,qBAAqB,CAACzgB,cAAc,EAAEhN,OAAO,CAAC;MACrD;MACA,IAAI,CAACqoB,eAAe,CAAC,IAAI,CAACzL,sBAAsB,CAAC5P,cAAc,CAAC,EAAEhN,OAAO,CAAC,EAAE;QAC1E,IAAI,CAAC4c,sBAAsB,GAAG;UAC5B,GAAG,IAAI,CAACA,sBAAsB;UAC9B,CAAC5P,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC4P,sBAAsB,CAAC5P,cAAc,CAAC,EAAEhN,OAAO;QAC5E,CAAC;MACH;MACA,IAAI,CAAC0tB,6BAA6B,CAAC1gB,cAAc,EAAEhN,OAAO,CAAC;MAC3D,IAAI,CAAC2tB,mBAAmB,CAAC3gB,cAAc,CAAC;MACxC6a,uBAAuB,CAAC,IAAI,CAACvb,aAAa,CAAC;IAC7C,CAAC;IACDshB,cAAcA,CAAC5gB,cAAc,EAAEzJ,QAAQ,EAAE;MACvC,MAAM2Z,GAAG,GAAG,IAAInH,GAAG,CAACxS,QAAQ,CAACsqB,OAAO,CAAC7tB,OAAO,IAAI,CAACA,OAAO,CAACyD,EAAE,EAAEzD,OAAO,CAAC4D,UAAU,CAAC,CAACgO,MAAM,CAACrL,OAAO,CAAC,CAAC/C,GAAG,CAACiB,MAAM,CAAC,CAAC,CAAC;MAC9G,MAAMqpB,cAAc,GAAGC,IAAI,IAAI,CAACA,IAAI,IAAI,EAAE,EAAEnc,MAAM,CAAC5R,OAAO,IAAI;QAC5D,OAAO,CAAC,CAACA,OAAO,CAACyD,EAAE,EAAEzD,OAAO,CAAC4D,UAAU,CAAC,CAACgO,MAAM,CAACrL,OAAO,CAAC,CAAC4W,IAAI,CAAC1Z,EAAE,IAAIyZ,GAAG,CAAClH,GAAG,CAACvR,MAAM,CAAChB,EAAE,CAAC,CAAC,CAAC;MAC1F,CAAC,CAAC;MACF,IAAI,CAACmZ,sBAAsB,GAAG;QAC5B,GAAG,IAAI,CAACA,sBAAsB;QAC9B,CAAC5P,cAAc,GAAG8gB,cAAc,CAAC,IAAI,CAAClR,sBAAsB,CAAC5P,cAAc,CAAC;MAC9E,CAAC;MACD,IAAI,CAACud,6BAA6B,GAAG;QACnC,GAAG,IAAI,CAACA,6BAA6B;QACrC,CAACvd,cAAc,GAAG8gB,cAAc,CAAC,IAAI,CAACvD,6BAA6B,CAACvd,cAAc,CAAC;MACrF,CAAC;MACD,IAAI,CAACke,gCAAgC,GAAG;QACtC,GAAG,IAAI,CAACA,gCAAgC;QACxC,CAACle,cAAc,GAAG8gB,cAAc,CAAC,IAAI,CAAC5C,gCAAgC,CAACle,cAAc,CAAC;MACxF,CAAC;MACD,IAAI,CAACpI,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACgN,MAAM,CAACnO,EAAE,IAAI,CAACyZ,GAAG,CAAClH,GAAG,CAACvR,MAAM,CAAChB,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IACDuqB,mBAAmBA,CAAChhB,cAAc,EAAEihB,aAAa,EAAEC,WAAW,EAAE;MAC9D,MAAMC,IAAI,GAAG,IAAIpY,GAAG,CAAC,CAACkY,aAAa,CAACxqB,EAAE,EAAEwqB,aAAa,CAACrqB,UAAU,CAAC,CAACgO,MAAM,CAACrL,OAAO,CAAC,CAAC/C,GAAG,CAACiB,MAAM,CAAC,CAAC;MAC9F,MAAM2pB,aAAa,GAAGL,IAAI,IAAI,CAACA,IAAI,IAAI,EAAE,EAAEvqB,GAAG,CAACxD,OAAO,IAAI;QACxD,MAAMquB,OAAO,GAAG,CAACruB,OAAO,CAACyD,EAAE,EAAEzD,OAAO,CAAC4D,UAAU,CAAC,CAACgO,MAAM,CAACrL,OAAO,CAAC,CAAC4W,IAAI,CAAC1Z,EAAE,IAAI0qB,IAAI,CAACnY,GAAG,CAACvR,MAAM,CAAChB,EAAE,CAAC,CAAC,CAAC;QACjG,OAAO4qB,OAAO,GAAG;UAAE,GAAGruB,OAAO;UAAE,GAAGkuB;QAAY,CAAC,GAAGluB,OAAO;MAC3D,CAAC,CAAC;MACF,IAAI,CAAC4c,sBAAsB,GAAG;QAC5B,GAAG,IAAI,CAACA,sBAAsB;QAC9B,CAAC5P,cAAc,GAAGohB,aAAa,CAAC,IAAI,CAACxR,sBAAsB,CAAC5P,cAAc,CAAC;MAC7E,CAAC;MACD,IAAI,CAACud,6BAA6B,GAAG;QACnC,GAAG,IAAI,CAACA,6BAA6B;QACrC,CAACvd,cAAc,GAAGohB,aAAa,CAAC,IAAI,CAAC7D,6BAA6B,CAACvd,cAAc,CAAC;MACpF,CAAC;IACH,CAAC;IACD0gB,6BAA6BA,CAAC1gB,cAAc,EAAEhN,OAAO,EAAE;MACrD,MAAM8M,YAAY,GAAG,IAAI,CAACR,aAAa,CAACtJ,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKuJ,cAAc,CAAC;MAChF,IAAI,CAACF,YAAY,EAAE;QACjB;MACF;MAEAA,YAAY,CAACsX,QAAQ,GAAGpkB,OAAO,CAACkN,IAAI,IAAIJ,YAAY,CAACsX,QAAQ,IAAI,EAAE;MACnEtX,YAAY,CAAC2J,SAAS,GAAGsR,wBAAwB,CAAC/nB,OAAO,CAAC,IAAI6U,IAAI,CAAC6B,GAAG,CAAC,CAAC;MACxE,IAAI1W,OAAO,CAAC6B,SAAS,KAAK,IAAI,EAAE;QAC9BiL,YAAY,CAACwF,MAAM,GAAGtF,cAAc,KAAK,IAAI,CAACsd,QAAQ,GAAG,CAAC,GAAGjjB,MAAM,CAACyF,YAAY,CAACwF,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;MACnG;MACA,IAAI,CAAChG,aAAa,GAAG,CAAC,GAAG,IAAI,CAACA,aAAa,CAAC,CACzCoS,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKvX,MAAM,CAACuX,CAAC,CAACnI,SAAS,IAAI,CAAC,CAAC,GAAGpP,MAAM,CAACsX,CAAC,CAAClI,SAAS,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IACDuW,oBAAoBA,CAAChgB,cAAc,EAAEhN,OAAO,EAAE;MAC5C,MAAMuD,QAAQ,GAAG,IAAI,CAACgnB,6BAA6B,CAACvd,cAAc,CAAC,IAAI,EAAE;MACzE,IAAI,CAACud,6BAA6B,GAAG;QACnC,GAAG,IAAI,CAACA,6BAA6B;QACrC,CAACvd,cAAc,GAAG,CAAC,GAAGzJ,QAAQ,CAACqO,MAAM,CAAChF,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKzD,OAAO,CAACyD,EAAE,CAAC,EAAEzD,OAAO,CAAC,CAC5E0e,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKvX,MAAM,CAACsX,CAAC,CAACE,gBAAgB,IAAIF,CAAC,CAAC3T,SAAS,IAAI,CAAC,CAAC,GAAG3D,MAAM,CAACuX,CAAC,CAACC,gBAAgB,IAAID,CAAC,CAAC5T,SAAS,IAAI,CAAC,CAAC;MACnH,CAAC;IACH,CAAC;IACD6hB,cAAcA,CAAC7f,cAAc,EAAEhN,OAAO,EAAE;MACtC,IAAI,CAAC,IAAI,CAAC4c,sBAAsB,CAAC5P,cAAc,CAAC,EAAE;QAChD,IAAI,CAAC4P,sBAAsB,GAAG;UAC5B,GAAG,IAAI,CAACA,sBAAsB;UAC9B,CAAC5P,cAAc,GAAG;QACpB,CAAC;MACH;MACA,IAAIhN,OAAO,CAAC6B,SAAS,KAAK,KAAK,KAAK7B,OAAO,CAAC0D,MAAM,KAAK,SAAS,IAAI1D,OAAO,CAAC0D,MAAM,KAAK,MAAM,IAAI1D,OAAO,CAAC0D,MAAM,KAAK,QAAQ,CAAC,EAAE;QAC7H,IAAI,CAAC+pB,qBAAqB,CAACzgB,cAAc,EAAEhN,OAAO,CAAC;MACrD;MACA,MAAM0Z,KAAK,GAAG,IAAI,CAACkD,sBAAsB,CAAC5P,cAAc,CAAC,CAAC0Q,SAAS,CAAC9Q,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKzD,OAAO,CAACyD,EAAE,CAAC;MACnG,IAAIiW,KAAK,IAAI,CAAC,EAAE;QACd,MAAMnW,QAAQ,GAAG,CAAC,GAAG,IAAI,CAACqZ,sBAAsB,CAAC5P,cAAc,CAAC,CAAC;QACjEzJ,QAAQ,CAACoa,MAAM,CAACjE,KAAK,EAAE,CAAC,EAAE1Z,OAAO,CAAC;QAClC,IAAI,CAAC4c,sBAAsB,GAAG;UAC5B,GAAG,IAAI,CAACA,sBAAsB;UAC9B,CAAC5P,cAAc,GAAGzJ;QACpB,CAAC;MACH,CAAC,MAAM;QACL,IAAI,CAACqZ,sBAAsB,GAAG;UAC5B,GAAG,IAAI,CAACA,sBAAsB;UAC9B,CAAC5P,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC4P,sBAAsB,CAAC5P,cAAc,CAAC,EAAEhN,OAAO;QAC5E,CAAC;MACH;MACA,IAAI,CAAC2tB,mBAAmB,CAAC3gB,cAAc,CAAC;IAC1C,CAAC;IACD2gB,mBAAmBA,CAAC3gB,cAAc,EAAE;MAClC,IAAI,CAACud,6BAA6B,GAAG;QACnC,GAAG,IAAI,CAACA,6BAA6B;QACrC,CAACvd,cAAc,GAAG0b,oBAAoB,CACpC,IAAI,CAACwC,gCAAgC,CAACle,cAAc,CAAC,IAAI,EAAE,EAC3D,IAAI,CAAC4P,sBAAsB,CAAC5P,cAAc,CAAC,IAAI,EACjD;MACF,CAAC;IACH,CAAC;IACDygB,qBAAqBA,CAACzgB,cAAc,EAAEhN,OAAO,EAAE;MAC7C,IAAI,CAAC,IAAI,CAACkrB,gCAAgC,CAACle,cAAc,CAAC,EAAE;QAC1D,IAAI,CAACke,gCAAgC,GAAG;UACtC,GAAG,IAAI,CAACA,gCAAgC;UACxC,CAACle,cAAc,GAAG;QACpB,CAAC;MACH;MACA,MAAMzJ,QAAQ,GAAG,IAAI,CAAC2nB,gCAAgC,CAACle,cAAc,CAAC;MACtE,MAAM0M,KAAK,GAAGnW,QAAQ,CAACma,SAAS,CAAC9Q,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKzD,OAAO,CAACyD,EAAE,CAAC;MAChE,IAAI0lB,YAAY;MAChB,IAAIzP,KAAK,IAAI,CAAC,EAAE;QACdyP,YAAY,GAAG,CAAC,GAAG5lB,QAAQ,CAAC;QAC5B4lB,YAAY,CAACxL,MAAM,CAACjE,KAAK,EAAE,CAAC,EAAE1Z,OAAO,CAAC;MACxC,CAAC,MAAM;QACLmpB,YAAY,GAAG,CAAC,GAAG5lB,QAAQ,EAAEvD,OAAO,CAAC;MACvC;MACA,IAAI,CAACkrB,gCAAgC,GAAG;QACtC,GAAG,IAAI,CAACA,gCAAgC;QACxC,CAACle,cAAc,GAAGmc;MACpB,CAAC;IACH,CAAC;IACDmF,uBAAuBA,CAACthB,cAAc,EAAE4b,cAAc,EAAE;MACtD,MAAMrlB,QAAQ,GAAG,IAAI,CAAC2nB,gCAAgC,CAACle,cAAc,CAAC,IAAI,EAAE;MAC5E,IAAI,CAACzJ,QAAQ,CAACqT,MAAM,EAAE;QACpB;MACF;MACA,IAAI,CAACsU,gCAAgC,GAAG;QACtC,GAAG,IAAI,CAACA,gCAAgC;QACxC,CAACle,cAAc,GAAGzJ,QAAQ,CAACqO,MAAM,CAAC5R,OAAO,IAAI;UAC7C,MAAMuuB,aAAa,GAAG3F,cAAc,CAACzL,IAAI,CAACqR,aAAa,IAAI;YACzD,OAAOA,aAAa,CAAC/qB,EAAE,KAAKzD,OAAO,CAACyD,EAAE,IAAI0kB,aAAa,CAACqG,aAAa,EAAExuB,OAAO,CAAC;UACjF,CAAC,CAAC;UACF,IAAIuuB,aAAa,IAAIvuB,OAAO,CAAC0D,MAAM,KAAK,QAAQ,EAAE;YAChD,OAAO,KAAK;UACd;UACE,OAAOmR,IAAI,CAAC6B,GAAG,CAAC,CAAC,GAAGrP,MAAM,CAACrH,OAAO,CAAC6e,gBAAgB,IAAI7e,OAAO,CAACgL,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,IAAIhL,OAAO,CAAC0D,MAAM,KAAK,QAAQ;QACvH,CAAC;MACH,CAAC;IACH,CAAC;IACD+oB,kBAAkBA,CAAC7K,OAAO,GAAG,CAAC,CAAC,EAAE;MAC/B,MAAM6M,WAAW,GAAG,OAAO7M,OAAO,KAAK,SAAS,GAC5C;QAAE9N,gBAAgB,EAAE8N;MAAQ,CAAC,GAC7BA,OAAO;MACX,MAAM9U,YAAY,GAAG,IAAI,CAACqC,kBAAkB;MAC5C,IAAI,CAACrC,YAAY,EAAE;QACjB;MACF;MACA,IAAI,CAAC4d,OAAO,GAAG,IAAI;MACnB,MAAMnnB,QAAQ,GAAGyL,mEAAQ,CAAC0S,WAAW,CAAC5U,YAAY,EAAE,EAAE,CAAC;MACvD,IAAI,CAACwhB,uBAAuB,CAACxhB,YAAY,CAACrJ,EAAE,EAAEF,QAAQ,CAAC;MACvD,IAAI,CAACqZ,sBAAsB,GAAG;QAC5B,GAAG,IAAI,CAACA,sBAAsB;QAC9B,CAAC9P,YAAY,CAACrJ,EAAE,GAAGilB,oBAAoB,CAAC,IAAI,CAAC9L,sBAAsB,CAAC9P,YAAY,CAACrJ,EAAE,CAAC,IAAI,EAAE,EAAEF,QAAQ;MACtG,CAAC;MACD,IAAI,CAACoqB,mBAAmB,CAAC7gB,YAAY,CAACrJ,EAAE,CAAC;MACzC,IAAI,CAACinB,OAAO,GAAG,KAAK;MACpB,IAAI,CAAC7W,kBAAkB,CAAC4a,WAAW,CAAC;IACtC,CAAC;IACD,MAAM5a,kBAAkBA,CAAC+N,OAAO,GAAG,CAAC,CAAC,EAAE;MACrC,MAAM9U,YAAY,GAAG,IAAI,CAACqC,kBAAkB;MAC5C,IAAI,CAACrC,YAAY,EAAE;QACjB;MACF;MACA,MAAM4hB,gBAAgB,GAAGnoB,OAAO,CAACqb,OAAO,CAAC9N,gBAAgB,CAAC;MAC1D,MAAM6a,mBAAmB,GAAGD,gBAAgB,IAAInG,cAAc,CAAC;QAAEE,UAAU,EAAEliB,OAAO,CAACqb,OAAO,CAAC6G,UAAU;MAAE,CAAC,CAAC;MAC3G,MAAMmG,kBAAkB,GAAGrG,cAAc,CAAC,CAAC;MAC3C,MAAM1G,QAAQ,GAAG8M,mBAAmB,IAAIC,kBAAkB;MAE1D,IAAI,IAAI,CAAC9D,YAAY,EAAE;QACrB,IAAI4D,gBAAgB,EAAE;UACpB,IAAI,CAAC3D,gCAAgC,GAAGje,YAAY,CAACrJ,EAAE;QACzD;QACA;MACF;MACA,IAAI,CAACqnB,YAAY,GAAG,IAAI;MACxB,MAAM+D,oBAAoB,GAAG/hB,YAAY,CAACrJ,EAAE;MAC5C,MAAMylB,gBAAgB,GAAG,IAAI,CAACtM,sBAAsB,CAACiS,oBAAoB,CAAC,IAAI,EAAE;MAChF,IAAI;QACF,MAAMtrB,QAAQ,GAAG,MAAMyL,mEAAQ,CAAC2S,mBAAmB,CAAC7U,YAAY,EAAE,EAAE,EAAE;UACpE+U;QACF,CAAC,CAAC;QACF,MAAMiN,sBAAsB,GAAG7F,sBAAsB,CAACC,gBAAgB,EAAE3lB,QAAQ,CAAC;QACjF,IAAI,CAAC+qB,uBAAuB,CAACO,oBAAoB,EAAEtrB,QAAQ,CAAC;QAC5D,IAAI,CAACqZ,sBAAsB,GAAG;UAC5B,GAAG,IAAI,CAACA,sBAAsB;UAC9B,CAACiS,oBAAoB,GAAGnG,oBAAoB,CAAC,IAAI,CAAC9L,sBAAsB,CAACiS,oBAAoB,CAAC,IAAI,EAAE,EAAEtrB,QAAQ;QAChH,CAAC;QACD,IAAI,CAACoqB,mBAAmB,CAACkB,oBAAoB,CAAC;QAC9C,IAAIC,sBAAsB,CAAClY,MAAM,IAAIiY,oBAAoB,KAAK,IAAI,CAACvE,QAAQ,EAAE;UAC3E,IAAI,CAAC1b,YAAY,CAACkgB,sBAAsB,CAACpQ,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKmJ,wBAAwB,CAACnJ,CAAC,CAAC,GAAGmJ,wBAAwB,CAACpJ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;UACtH4K,qBAAqB,CAAC,CAAC;QACzB;QACA,MAAMwF,MAAM,GAAGxrB,QAAQ,CAAC2oB,MAAM,CAAC,CAAC8C,aAAa,EAAEhvB,OAAO,KAAK;UACzD,IAAI,CAACgvB,aAAa,IAAIjH,wBAAwB,CAAC/nB,OAAO,CAAC,GAAG+nB,wBAAwB,CAACiH,aAAa,CAAC,EAAE;YACjG,OAAOhvB,OAAO;UAChB;UACA,OAAOgvB,aAAa;QACtB,CAAC,EAAE,IAAI,CAAC;QACR,IAAID,MAAM,EAAE;UACVjiB,YAAY,CAACsX,QAAQ,GAAG6D,kBAAkB,CAAC8G,MAAM,CAAC;UAClDjiB,YAAY,CAAC2J,SAAS,GAAGsR,wBAAwB,CAACgH,MAAM,CAAC;UACzDlH,uBAAuB,CAAC,IAAI,CAACvb,aAAa,CAAC;QAC7C;MACF,CAAC,CAAC,OAAO9K,KAAK,EAAE;QACd;MAAA,CACD,SAAS;QACR,IAAI,CAACspB,YAAY,GAAG,KAAK;QACzB,IAAI,IAAI,CAACC,gCAAgC,KAAK,IAAI,CAACT,QAAQ,IAAI/B,cAAc,CAAC,CAAC,EAAE;UAC/E,IAAI,CAACwC,gCAAgC,GAAG,EAAE;UAC1CnhB,MAAM,CAAC+E,UAAU,CAAC,MAAM,IAAI,CAACkF,kBAAkB,CAAC;YAAEC,gBAAgB,EAAE;UAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF;MACF;IACF,CAAC;IACD0Y,gBAAgBA,CAAA,EAAG;MACjB,IAAI,CAACyC,sBAAsB,CAAC,CAAC;MAC7B,IAAI,CAAC,IAAI,CAACtE,SAAS,EAAE;QACnB,IAAI,CAACA,SAAS,GAAG/gB,MAAM,CAACslB,WAAW,CAAC,MAAM;UACxC,IAAI,CAACrb,kBAAkB,CAAC,CAAC;QAC3B,CAAC,EAAE/L,IAAI,CAACE,GAAG,CAAC,GAAG,EAAEsT,wDAAS,CAAC6T,cAAc,CAAC,CAAC;MAC7C;MACA,IAAI,CAAC,IAAI,CAACvE,qBAAqB,EAAE;QAC/B,IAAI,CAACA,qBAAqB,GAAGhhB,MAAM,CAACslB,WAAW,CAAC,MAAM;UACpD,IAAI,CAACzgB,0BAA0B,CAAC,CAAC;QACnC,CAAC,EAAE,IAAI,CAAC;QACR,IAAI,CAACA,0BAA0B,CAAC,CAAC;MACnC;IACF,CAAC;IACDwgB,sBAAsBA,CAAA,EAAG;MACvB,IAAI,IAAI,CAACpE,uBAAuB,IAAI,OAAOjhB,MAAM,KAAK,WAAW,IAAI,OAAO3F,QAAQ,KAAK,WAAW,EAAE;QACpG;MACF;MACA,IAAI,CAAC4mB,uBAAuB,GAAG,IAAI;MACnC,MAAMuE,gBAAgB,GAAGA,CAAA,KAAM;QAC7B,IAAI7G,cAAc,CAAC,CAAC,EAAE;UACpB,IAAI,CAAC1U,kBAAkB,CAAC;YAAEC,gBAAgB,EAAE;UAAK,CAAC,CAAC;QACrD;MACF,CAAC;MACDlK,MAAM,CAAC1F,gBAAgB,CAAC,OAAO,EAAEkrB,gBAAgB,CAAC;MAClDnrB,QAAQ,CAACC,gBAAgB,CAAC,kBAAkB,EAAEkrB,gBAAgB,CAAC;IACjE,CAAC;IACD,MAAM3gB,0BAA0BA,CAAA,EAAG;MACjC,IAAI,CAAC6d,YAAY,CAAC,CAAC;MACnB,IAAI,CAAC7B,aAAa,GAAG,KAAK;MAC1B,IAAI,IAAI,CAACO,wBAAwB,EAAE;QACjC;MACF;MACA,IAAI,CAACA,wBAAwB,GAAG,IAAI;MACpC,IAAI;QACF,MAAM1J,mBAAmB,GAAG,MAAMtS,mEAAQ,CAACqS,wBAAwB,CAAC,EAAE,CAAC;QACvE,IAAI,CAACyL,wBAAwB,CAACxL,mBAAmB,CAAC;MACpD,CAAC,CAAC,OAAO9f,KAAK,EAAE;QACdwN,mEAAQ,CAACkS,uBAAuB,CAAC,CAAC;MACpC,CAAC,SAAS;QACR,IAAI,CAAC8J,wBAAwB,GAAG,KAAK;MACvC;IACF,CAAC;IACDpV,eAAeA,CAAC5V,OAAO,EAAE;MACvB,IAAI,CAAC8rB,YAAY,GAAG9rB,OAAO;MAC3B,IAAI,CAACjB,WAAW,GAAG,EAAE;MACrB6K,MAAM,CAAC+iB,YAAY,CAAC,IAAI,CAAC0C,iBAAiB,CAAC;MAC3C,IAAI,CAACA,iBAAiB,GAAGzlB,MAAM,CAAC+E,UAAU,CAAC,MAAM;QAC/C,IAAI,CAACmd,YAAY,GAAG,EAAE;MACxB,CAAC,EAAE,IAAI,CAAC;IACV,CAAC;IACD1X,cAAcA,CAACpU,OAAO,EAAE;MACtB,IAAI,CAACjB,WAAW,GAAGiB,OAAO;MAC1B,IAAI,CAAC8rB,YAAY,GAAG,EAAE;MACtBliB,MAAM,CAAC+iB,YAAY,CAAC,IAAI,CAAC2C,gBAAgB,CAAC;MAC1C,IAAI,CAACA,gBAAgB,GAAG1lB,MAAM,CAAC+E,UAAU,CAAC,MAAM;QAC9C,IAAI,CAAC5P,WAAW,GAAG,EAAE;MACvB,CAAC,EAAE,IAAI,CAAC;IACV,CAAC;IACD6P,YAAYA,CAAC5O,OAAO,EAAE;MACpB,MAAM6K,GAAG,GAAGid,gBAAgB,CAAC9nB,OAAO,CAAC;MACrC,IAAI,CAAC6K,GAAG,EAAE;QACR;MACF;MACA,IAAI,CAAC7G,kBAAkB,GAAG6G,GAAG;MAC7BjB,MAAM,CAAC+iB,YAAY,CAAC,IAAI,CAAChB,qBAAqB,CAAC;MAC/C,IAAI,CAACA,qBAAqB,GAAG/hB,MAAM,CAAC+E,UAAU,CAAC,MAAM;QACnD,IAAI,IAAI,CAAC3K,kBAAkB,KAAK6G,GAAG,EAAE;UACnC,IAAI,CAAC7G,kBAAkB,GAAG,EAAE;QAC9B;MACF,CAAC,EAAE,IAAI,CAAC;IACV,CAAC;IACD,MAAMurB,mBAAmBA,CAAC;MAAExtB,MAAM;MAAE/B;IAAQ,CAAC,EAAE;MAC7C,IAAI,CAACA,OAAO,EAAE;QACZ;MACF;MACA,IAAI+B,MAAM,KAAK,MAAM,EAAE;QACrB,MAAM,IAAI,CAACytB,YAAY,CAAC,CAACxvB,OAAO,CAAC,CAAC;MACpC,CAAC,MAAM,IAAI+B,MAAM,KAAK,MAAM,EAAE;QAC5B,IAAI,CAAC0tB,gBAAgB,CAACzvB,OAAO,CAAC;MAChC,CAAC,MAAM,IAAI+B,MAAM,KAAK,QAAQ,EAAE;QAC9B,IAAI,CAAC2tB,cAAc,CAAC,CAAC1vB,OAAO,CAAC,CAAC;MAChC,CAAC,MAAM,IAAI+B,MAAM,KAAK,SAAS,EAAE;QAC/B,IAAI,CAAC4tB,YAAY,CAAC,CAAC3vB,OAAO,CAAC,CAAC;MAC9B,CAAC,MAAM,IAAI+B,MAAM,KAAK,UAAU,EAAE;QAChC,IAAI,CAAC6tB,cAAc,CAAC5vB,OAAO,CAAC;MAC9B,CAAC,MAAM,IAAI+B,MAAM,KAAK,QAAQ,EAAE;QAC9B,MAAM,IAAI,CAAC8tB,iBAAiB,CAAC7vB,OAAO,CAAC;MACvC,CAAC,MAAM,IAAI+B,MAAM,KAAK,OAAO,EAAE;QAC7B,IAAI,CAAC+tB,YAAY,CAAC9vB,OAAO,CAAC;MAC5B,CAAC,MAAM,IAAI+B,MAAM,KAAK,QAAQ,EAAE;QAC9B,IAAI,CAACguB,kBAAkB,CAAC/vB,OAAO,CAAC;MAClC,CAAC,MAAM,IAAI+B,MAAM,KAAK,QAAQ,EAAE;QAC9B,MAAM,IAAI,CAACkgB,aAAa,CAACjiB,OAAO,CAAC;MACnC;IACF,CAAC;IACD,MAAM6vB,iBAAiBA,CAAC7vB,OAAO,EAAE;MAC/B,MAAM8M,YAAY,GAAG,IAAI,CAACqC,kBAAkB;MAC5C,IAAI,CAACrC,YAAY,IAAI,CAAC9M,OAAO,EAAE;QAC7B;MACF;MACA,MAAM6K,GAAG,GAAGid,gBAAgB,CAAC9nB,OAAO,CAAC;MACrC,IAAI,CAACwrB,iBAAiB,GAAG,IAAI;MAC7B,IAAI,CAACC,oBAAoB,GAAG,IAAI;MAChC,IAAI,CAACC,kBAAkB,GAAG,EAAE;MAC5B,IAAI,CAAC3Z,aAAa,GAAG;QACnBnO,UAAU,EAAEiH,GAAG;QACfvF,gBAAgB,EAAEwH,YAAY,CAAC5H,IAAI,IAAI4H,YAAY,CAACoE,GAAG,EAAEhM,IAAI,IAAI,QAAQ;QACzE8qB,MAAM,EAAE3oB,MAAM,CAACrH,OAAO,CAAC6e,gBAAgB,IAAI7e,OAAO,CAACgL,SAAS,IAAI,CAAC,CAAC;QAClEuX,QAAQ,EAAElb,MAAM,CAACrH,OAAO,CAACuiB,QAAQ,IAAI,CAAC,CAAC;QACvC1e,QAAQ,EAAE/B,iBAAiB,CAAC9B,OAAO,CAAC;QACpC4gB,SAAS,EAAE,IAAI;QACfkC,MAAM,EAAE;UACN3kB,GAAG,EAAE6B,OAAO,CAAC8C,IAAI,IAAI,EAAE;UACvB5E,IAAI,EAAE8B,OAAO,CAAC2F,UAAU,IAAI3F,OAAO,CAAC8C,IAAI,IAAI;QAC9C;MACF,CAAC;MACD,IAAI;QACF,IAAI,CAAC,OAAO,CAACof,IAAI,CAACrX,GAAG,CAAC,EAAE;UACtB,IAAI,CAAC6gB,kBAAkB,GAAG,iBAAiB;UAC3C;QACF;QACA,MAAMjX,MAAM,GAAG,MAAMzF,mEAAQ,CAACyT,gBAAgB,CAAC3V,YAAY,EAAE9M,OAAO,CAAC;QACrE,IAAI,CAAC+R,aAAa,GAAG0C,MAAM,IAAI,IAAI,CAAC1C,aAAa;MACnD,CAAC,CAAC,OAAOvQ,KAAK,EAAE;QACd,IAAI,CAACkqB,kBAAkB,GAAGlqB,KAAK,CAACxB,OAAO,IAAI,UAAU;MACvD,CAAC,SAAS;QACR,IAAI,CAACyrB,oBAAoB,GAAG,KAAK;MACnC;IACF,CAAC;IACDwE,kBAAkBA,CAAA,EAAG;MACnB,IAAI,CAACzE,iBAAiB,GAAG,KAAK;MAC9B,IAAI,CAACC,oBAAoB,GAAG,KAAK;MACjC,IAAI,CAACC,kBAAkB,GAAG,EAAE;MAC5B,IAAI,CAAC3Z,aAAa,GAAG,IAAI;IAC3B,CAAC;IACD,MAAMyd,YAAYA,CAACjsB,QAAQ,EAAE;MAC3B,MAAM2J,IAAI,GAAG3J,QAAQ,CAACC,GAAG,CAACxD,OAAO,IAAIA,OAAO,CAACkN,IAAI,IAAI,EAAE,CAAC,CAACpJ,IAAI,CAAC,IAAI,CAAC;MACnE,IAAI,CAACoJ,IAAI,CAAC/G,IAAI,CAAC,CAAC,EAAE;QAChB;MACF;MACA,IAAI;QACF,MAAM0H,cAAc,CAACX,IAAI,CAAC;QAC1B,IAAI,CAAC0I,eAAe,CAACrS,QAAQ,CAACqT,MAAM,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC;MAC/D,CAAC,CAAC,OAAOpV,KAAK,EAAE;QACd,IAAI,CAAC4S,cAAc,CAAC,MAAM,CAAC;MAC7B;IACF,CAAC;IACDsb,cAAcA,CAACnsB,QAAQ,EAAE;MACvB,MAAMuJ,YAAY,GAAG,IAAI,CAACqC,kBAAkB;MAC5C,IAAI,CAACrC,YAAY,IAAI,CAACvJ,QAAQ,CAACqT,MAAM,EAAE;QACrC;MACF;MACA5H,mEAAQ,CAAC8S,YAAY,CAAChV,YAAY,EAAEvJ,QAAQ,CAAC;MAC7C,IAAI,CAACqqB,cAAc,CAAC9gB,YAAY,CAACrJ,EAAE,EAAEF,QAAQ,CAAC;MAC9C,IAAI,CAAC,IAAI,CAACqB,kBAAkB,CAACgS,MAAM,EAAE;QACnC,IAAI,CAACpP,aAAa,GAAG,KAAK;MAC5B;MACA,IAAI,CAACoO,eAAe,CAACrS,QAAQ,CAACqT,MAAM,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC;IAC/D,CAAC;IACDgZ,cAAcA,CAAC5vB,OAAO,EAAE;MACtB,MAAM6K,GAAG,GAAGid,gBAAgB,CAAC9nB,OAAO,CAAC;MACrC,IAAI,CAAC6K,GAAG,EAAE;QACR;MACF;MACA,MAAM6O,KAAK,GAAG,IAAI,CAACkS,gBAAgB,CAAClO,SAAS,CAAC9Q,IAAI,IAAIA,IAAI,CAAC/B,GAAG,KAAKA,GAAG,CAAC;MACvE,IAAI6O,KAAK,IAAI,CAAC,EAAE;QACd,IAAI,CAACkS,gBAAgB,CAACjO,MAAM,CAACjE,KAAK,EAAE,CAAC,CAAC;QACtC,IAAI,IAAI,CAACmS,iBAAiB,KAAKhhB,GAAG,EAAE;UAClC,IAAI,CAACghB,iBAAiB,GAAG,IAAI,CAACD,gBAAgB,CAAC,CAAC,CAAC,EAAE/gB,GAAG,IAAI,EAAE;QAC9D;QACA,IAAI,CAAC+K,eAAe,CAAC,OAAO,CAAC;MAC/B,CAAC,MAAM;QACL,MAAM9I,YAAY,GAAG,IAAI,CAACR,aAAa,CAACtJ,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKzD,OAAO,CAACgN,cAAc,CAAC,IAAI,CAAC,CAAC;QAC9F,IAAI,CAAC4e,gBAAgB,CAACxpB,OAAO,CAAC;UAC5ByI,GAAG;UACHpH,EAAE,EAAEzD,OAAO,CAACyD,EAAE;UACdG,UAAU,EAAE5D,OAAO,CAAC4D,UAAU;UAC9BoJ,cAAc,EAAEhN,OAAO,CAACgN,cAAc;UACtCH,iBAAiB,EAAEC,YAAY,CAACzG,KAAK,IAAIrG,OAAO,CAAC6M,iBAAiB,IAAI,EAAE;UACxE3H,IAAI,EAAElF,OAAO,CAACkF,IAAI,IAAI,MAAM;UAC5BgI,IAAI,EAAElN,OAAO,CAACkN,IAAI,IAAI,EAAE;UACxBK,OAAO,EAAE0a,kBAAkB,CAACjoB,OAAO,CAAC;UACpC2F,UAAU,EAAE3F,OAAO,CAAC2F,UAAU,IAAI3F,OAAO,CAAC8C,IAAI,IAAI,EAAE;UACpDkI,SAAS,EAAE3D,MAAM,CAACrH,OAAO,CAAC6e,gBAAgB,IAAI7e,OAAO,CAACgL,SAAS,IAAI6J,IAAI,CAAC6B,GAAG,CAAC,CAAC,CAAC;UAC9E6L,QAAQ,EAAElb,MAAM,CAACrH,OAAO,CAACuiB,QAAQ,IAAI,CAAC,CAAC;UACvC1e,QAAQ,EAAE/B,iBAAiB,CAAC9B,OAAO,CAAC;UACpCsN,YAAY,EAAEtN,OAAO,CAACsN,YAAY,KAAKxL,iBAAiB,CAAC9B,OAAO,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;UAC/EmF,UAAU,EAAEnF,OAAO,CAACmF,UAAU,GAAG;YAAE,GAAGnF,OAAO,CAACmF;UAAW,CAAC,GAAG;QAC/D,CAAC,CAAC;QACF,IAAI,CAAC0mB,iBAAiB,GAAGhhB,GAAG;QAC5B,IAAI,CAAC+K,eAAe,CAAC,KAAK,CAAC;MAC7B;MACA,IAAI,CAACgW,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAAC/lB,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;MAC3D8hB,qBAAqB,CAAC,IAAI,CAACiE,gBAAgB,CAAC;IAC9C,CAAC;IACDsE,iBAAiBA,CAACrlB,GAAG,EAAE;MACrB,IAAI,CAACghB,iBAAiB,GAAGpnB,MAAM,CAACoG,GAAG,IAAI,EAAE,CAAC;IAC5C,CAAC;IACDgE,cAAcA,CAAChE,GAAG,EAAE;MAClB,MAAMhN,KAAK,GAAG4G,MAAM,CAACoG,GAAG,IAAI,EAAE,CAAC;MAC/B,IAAI,CAAChN,KAAK,EAAE;QACV;MACF;MACA,IAAI,CAAC+tB,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACha,MAAM,CAAC5R,OAAO,IAAIA,OAAO,CAAC6K,GAAG,KAAKhN,KAAK,CAAC;MACtF,IAAI,IAAI,CAACguB,iBAAiB,KAAKhuB,KAAK,EAAE;QACpC,IAAI,CAACguB,iBAAiB,GAAG,IAAI,CAACD,gBAAgB,CAAC,CAAC,CAAC,EAAE/gB,GAAG,IAAI,EAAE;MAC9D;MACA8c,qBAAqB,CAAC,IAAI,CAACiE,gBAAgB,CAAC;IAC9C,CAAC;IACDkE,YAAYA,CAAC9vB,OAAO,EAAE;MACpB,IAAI,CAACmrB,aAAa,GAAG;QACnB,GAAGnrB,OAAO;QACVmwB,SAAS,EAAEjI,WAAW,CAACloB,OAAO;MAChC,CAAC;MACD,IAAI,CAAC4V,eAAe,CAAC,WAAW,CAAC;IACnC,CAAC;IACDwa,WAAWA,CAAA,EAAG;MACZ,IAAI,CAACjF,aAAa,GAAG,IAAI;IAC3B,CAAC;IACD4E,kBAAkBA,CAAC/vB,OAAO,GAAG,IAAI,EAAE;MACjC,IAAI,CAACwH,aAAa,GAAG,IAAI;MACzB,IAAIxH,OAAO,EAAE;QACX,MAAM6K,GAAG,GAAGid,gBAAgB,CAAC9nB,OAAO,CAAC;QACrC,IAAI,CAAC4E,kBAAkB,GAAGiG,GAAG,GAAG,CAACA,GAAG,CAAC,GAAG,EAAE;MAC5C;IACF,CAAC;IACDwlB,qBAAqBA,CAACrwB,OAAO,EAAE;MAC7B,MAAM6K,GAAG,GAAGid,gBAAgB,CAAC9nB,OAAO,CAAC;MACrC,IAAI,CAAC6K,GAAG,EAAE;QACR;MACF;MACA,MAAMiL,QAAQ,GAAG,IAAIC,GAAG,CAAC,IAAI,CAACnR,kBAAkB,CAAC;MACjD,IAAIkR,QAAQ,CAACE,GAAG,CAACnL,GAAG,CAAC,EAAE;QACrBiL,QAAQ,CAACG,MAAM,CAACpL,GAAG,CAAC;MACtB,CAAC,MAAM;QACLiL,QAAQ,CAACI,GAAG,CAACrL,GAAG,CAAC;MACnB;MACA,IAAI,CAACjG,kBAAkB,GAAG/B,KAAK,CAACC,IAAI,CAACgT,QAAQ,CAAC;MAC9C,IAAI,CAACtO,aAAa,GAAG,IAAI,CAAC5C,kBAAkB,CAACgS,MAAM,GAAG,CAAC;IACzD,CAAC;IACD0Z,cAAcA,CAAA,EAAG;MACf,IAAI,CAAC9oB,aAAa,GAAG,KAAK;MAC1B,IAAI,CAAC5C,kBAAkB,GAAG,EAAE;IAC9B,CAAC;IACD2rB,oBAAoBA,CAAA,EAAG;MACrB,OAAO,IAAI,CAACf,YAAY,CAAC,IAAI,CAACpD,gBAAgB,CAAC;IACjD,CAAC;IACDoE,sBAAsBA,CAAA,EAAG;MACvB,IAAI,CAACd,cAAc,CAAC,IAAI,CAACtD,gBAAgB,CAAC;IAC5C,CAAC;IACDuD,YAAYA,CAACpsB,QAAQ,EAAE;MACrB,IAAI,CAAC6nB,kBAAkB,GAAG7nB,QAAQ,CAACqO,MAAM,CAAC5R,OAAO,IAAIA,OAAO,EAAEkN,IAAI,CAAC;MACnE,IAAI,CAAC,IAAI,CAACke,kBAAkB,CAACxU,MAAM,EAAE;QACnC,IAAI,CAACxC,cAAc,CAAC,UAAU,CAAC;MACjC;IACF,CAAC;IACDqc,4BAA4BA,CAAA,EAAG;MAC7B,IAAI,CAACd,YAAY,CAAC,IAAI,CAACvD,gBAAgB,CAAC;IAC1C,CAAC;IACDsE,aAAaA,CAAA,EAAG;MACd,IAAI,CAACtF,kBAAkB,GAAG,EAAE;IAC9B,CAAC;IACDqE,gBAAgBA,CAACzvB,OAAO,EAAE;MACxB,MAAM2wB,QAAQ,GAAG7uB,iBAAiB,CAAC9B,OAAO,CAAC;MAC3C,IAAI,CAAC2wB,QAAQ,IAAI,CAAC3wB,OAAO,EAAEkN,IAAI,EAAE;QAC/B,IAAI,CAACkH,cAAc,CAAC,YAAY,CAAC;QACjC;MACF;MACA,IAAI,CAACiX,cAAc,GAAGrrB,OAAO;MAC7B,IAAI,CAACsrB,WAAW,GAAGtrB,OAAO,CAACkN,IAAI,IAAI,EAAE;MACrC,IAAI,CAACqe,WAAW,GAAGoF,QAAQ,GAAG,QAAQ,GAAG,MAAM;IACjD,CAAC;IACDC,iBAAiBA,CAAA,EAAG;MAClB,IAAI,CAACvF,cAAc,GAAG,IAAI;MAC1B,IAAI,CAACC,WAAW,GAAG,EAAE;MACrB,IAAI,CAACC,WAAW,GAAG,EAAE;IACvB,CAAC;IACD,MAAMsF,mBAAmBA,CAAA,EAAG;MAC1B,MAAM/jB,YAAY,GAAG,IAAI,CAACqC,kBAAkB;MAC5C,MAAMnP,OAAO,GAAG,IAAI,CAACqrB,cAAc;MACnC,MAAMne,IAAI,GAAG,IAAI,CAACoe,WAAW,CAACnlB,IAAI,CAAC,CAAC;MACpC,MAAMwqB,QAAQ,GAAG,IAAI,CAACpF,WAAW,KAAK,QAAQ,IAAIzpB,iBAAiB,CAAC9B,OAAO,CAAC;MAC5E,IAAI,CAAC8M,YAAY,IAAI,CAAC9M,OAAO,EAAE;QAC7B,IAAI,CAAC4wB,iBAAiB,CAAC,CAAC;QACxB;MACF;MACA,IAAI,CAAC1jB,IAAI,EAAE;QACT,IAAI,CAACkH,cAAc,CAAC,UAAU,CAAC;QAC/B;MACF;MACA,IAAI,CAACuc,QAAQ,IAAIzjB,IAAI,KAAKzI,MAAM,CAACzE,OAAO,CAACkN,IAAI,IAAI,EAAE,CAAC,CAAC/G,IAAI,CAAC,CAAC,EAAE;QAC3D,IAAI,CAACyqB,iBAAiB,CAAC,CAAC;QACxB;MACF;MACA,IAAI;QACF,IAAID,QAAQ,EAAE;UACZ,MAAM,IAAI,CAACzD,sBAAsB,CAACpgB,YAAY,EAAEI,IAAI,CAAC;UACrD,IAAI,CAAC0jB,iBAAiB,CAAC,CAAC;UACxB,IAAI,CAAChb,eAAe,CAAC,OAAO,CAAC;UAC7B;QACF;QACA,MAAM0M,aAAa,GAAG,MAAMtT,mEAAQ,CAACoT,WAAW,CAACtV,YAAY,EAAE9M,OAAO,EAAEkN,IAAI,CAAC;QAC7E,IAAI,CAAC8gB,mBAAmB,CAAClhB,YAAY,CAACrJ,EAAE,EAAEzD,OAAO,EAAEsiB,aAAa,CAAC;QACjE,IAAIyF,wBAAwB,CAACzF,aAAa,CAAC,IAAIjb,MAAM,CAACyF,YAAY,CAAC2J,SAAS,IAAI,CAAC,CAAC,EAAE;UAClF3J,YAAY,CAACsX,QAAQ,GAAG9B,aAAa,CAACpV,IAAI;UAC1CJ,YAAY,CAAC2J,SAAS,GAAGsR,wBAAwB,CAACzF,aAAa,CAAC;UAChEuF,uBAAuB,CAAC,IAAI,CAACvb,aAAa,CAAC;QAC7C;QACA,IAAI,CAACskB,iBAAiB,CAAC,CAAC;QACxB,IAAI,CAAChb,eAAe,CAAC,KAAK,CAAC;MAC7B,CAAC,CAAC,OAAOpU,KAAK,EAAE;QACd,IAAI,CAAC4S,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,MAAM,CAAC;MAC9C;IACF,CAAC;IACD,MAAM8wB,eAAeA,CAACC,oBAAoB,EAAE;MAC1C,MAAM9f,MAAM,GAAG,IAAI,CAAC3E,aAAa,CAACtJ,IAAI,CAAC8J,YAAY,IAAIA,YAAY,CAACrJ,EAAE,KAAKstB,oBAAoB,CAAC;MAChG,IAAI,CAAC9f,MAAM,IAAI,CAAC,IAAI,CAACma,kBAAkB,CAACxU,MAAM,EAAE;QAC9C;MACF;MACA,MAAM1J,IAAI,GAAG,IAAI,CAACke,kBAAkB,CACjC5nB,GAAG,CAACxD,OAAO,IAAI,MAAMA,OAAO,CAACkN,IAAI,IAAI,EAAE,EAAE,CAAC,CAC1CpJ,IAAI,CAAC,MAAM,CAAC;MACf,IAAI;QACF,MAAM,IAAI,CAACopB,sBAAsB,CAACjc,MAAM,EAAE/D,IAAI,CAAC;QAC/C,IAAI,CAACke,kBAAkB,GAAG,EAAE;QAC5B,IAAI,CAACkF,cAAc,CAAC,CAAC;QACrB,IAAI,CAAC1a,eAAe,CAAC,KAAK,CAAC;MAC7B,CAAC,CAAC,OAAOpU,KAAK,EAAE;QACd,IAAI,CAAC4S,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,MAAM,CAAC;MAC9C;IACF,CAAC;IACD,MAAMiiB,aAAaA,CAACjiB,OAAO,EAAE;MAC3B,MAAM8M,YAAY,GAAG,IAAI,CAACqC,kBAAkB;MAC5C,IAAI,CAACrC,YAAY,EAAE;QACjB;MACF;MACA,IAAI;QACF,MAAMkC,mEAAQ,CAACiT,aAAa,CAACnV,YAAY,EAAE9M,OAAO,CAAC;QACnD,IAAIA,OAAO,CAAC6B,SAAS,KAAK,KAAK,EAAE;UAC/B,IAAI,CAAC+rB,cAAc,CAAC9gB,YAAY,CAACrJ,EAAE,EAAE,CAACzD,OAAO,CAAC,CAAC;UAC/C,IAAI,CAAC4V,eAAe,CAAC,KAAK,CAAC;UAC3B,IAAI,CAAC/B,kBAAkB,CAAC,CAAC;UACzB;QACF;QACA,IAAI,CAACma,mBAAmB,CAAClhB,YAAY,CAACrJ,EAAE,EAAEzD,OAAO,EAAE;UACjD0D,MAAM,EAAE,UAAU;UAClBC,cAAc,EAAE,EAAE;UAClBE,QAAQ,EAAE,IAAI;UACdyJ,YAAY,EAAE;QAChB,CAAC,CAAC;QACF,IAAI,CAACsI,eAAe,CAAC,KAAK,CAAC;MAC7B,CAAC,CAAC,OAAOpU,KAAK,EAAE;QACd,IAAI,CAAC4S,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,MAAM,CAAC;MAC9C;IACF,CAAC;IACD,MAAMqkB,WAAWA,CAACzC,OAAO,GAAG,CAAC,CAAC,EAAE;MAC9B,MAAM1S,OAAO,GAAGD,0EAAe,CAAC,CAAC;MACjC,IAAI,CAACC,OAAO,CAACnI,MAAM,EAAE;QACnB,IAAI,CAACqN,cAAc,CAAC,MAAM,CAAC;QAC3B,OAAO,KAAK;MACd;MACA,IAAI;QACF,MAAMtH,YAAY,GAAG,MAAMkC,mEAAQ,CAACqV,WAAW,CAACnV,OAAO,CAACnI,MAAM,EAAE6a,OAAO,CAAC;QACxE,IAAI,CAACjO,kBAAkB,CAAC7G,YAAY,CAAC;QACrC,IAAI,CAAC4B,qBAAqB,CAAC5B,YAAY,CAACrJ,EAAE,CAAC;QAC3C,IAAI,CAACmS,eAAe,CAACgM,OAAO,CAAC2C,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;QAC1D,IAAI,CAAC9V,0BAA0B,CAAC,CAAC;QACjC,OAAO,IAAI;MACb,CAAC,CAAC,OAAOjN,KAAK,EAAE;QACd,IAAI,CAAC4S,cAAc,CAAC5S,KAAK,CAACxB,OAAO,KAAK4hB,OAAO,CAAC2C,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;QAC9E,OAAO,KAAK;MACd;IACF,CAAC;IACD,MAAME,SAASA,CAACC,QAAQ,EAAE;MACxB,MAAMxV,OAAO,GAAGD,0EAAe,CAAC,CAAC;MACjC,IAAI,CAACC,OAAO,CAACnI,MAAM,EAAE;QACnB,IAAI,CAACqN,cAAc,CAAC,MAAM,CAAC;QAC3B,OAAO,KAAK;MACd;MACA,IAAI;QACF,MAAMtH,YAAY,GAAG,MAAMkC,mEAAQ,CAACyV,SAAS,CAACvV,OAAO,CAACnI,MAAM,EAAE2d,QAAQ,CAAC;QACvE,IAAI,CAAC/Q,kBAAkB,CAAC7G,YAAY,CAAC;QACrC,IAAI,CAAC4B,qBAAqB,CAAC5B,YAAY,CAACrJ,EAAE,CAAC;QAC3C,IAAI,CAACmS,eAAe,CAAC,OAAO,CAAC;QAC7B,IAAI,CAACnH,0BAA0B,CAAC,CAAC;QACjC,OAAO,IAAI;MACb,CAAC,CAAC,OAAOjN,KAAK,EAAE;QACd,IAAI,CAAC4S,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,QAAQ,CAAC;QAC9C,OAAO,KAAK;MACd;IACF,CAAC;IACD,MAAM2kB,gBAAgBA,CAACC,SAAS,EAAE1X,IAAI,EAAE;MACtC,MAAMgC,OAAO,GAAGD,0EAAe,CAAC,CAAC;MACjC,IAAI,CAACC,OAAO,CAACnI,MAAM,EAAE;QACnB,IAAI,CAACqN,cAAc,CAAC,MAAM,CAAC;QAC3B,OAAO,KAAK;MACd;MACA,IAAI;QACF,MAAMmC,MAAM,GAAG,MAAMvH,mEAAQ,CAAC2V,gBAAgB,CAACzV,OAAO,CAACnI,MAAM,EAAE6d,SAAS,EAAE1X,IAAI,CAAC;QAC/E,MAAM8jB,YAAY,GAAG3pB,MAAM,CAACkP,MAAM,CAACya,YAAY,IAAI,CAAC,CAAC;QACrD,MAAMC,WAAW,GAAG5pB,MAAM,CAACkP,MAAM,CAAC0a,WAAW,IAAI,CAAC,CAAC;QACnD,IAAI,CAACrb,eAAe,CAACqb,WAAW,GAAG,CAAC,GAAG,OAAOD,YAAY,SAASC,WAAW,IAAI,GAAG,OAAOD,YAAY,IAAI,CAAC;QAC7G,IAAI,CAACviB,0BAA0B,CAAC,CAAC;QACjC,OAAO,IAAI;MACb,CAAC,CAAC,OAAOjN,KAAK,EAAE;QACd,IAAI,CAAC4S,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,MAAM,CAAC;QAC5C,OAAO,KAAK;MACd;IACF,CAAC;IACD,MAAMoX,UAAUA,CAACtK,YAAY,EAAE;MAC7B,MAAMoC,OAAO,GAAGD,0EAAe,CAAC,CAAC;MACjC,IAAI,CAACC,OAAO,CAACnI,MAAM,IAAI,CAAC+F,YAAY,EAAEmE,MAAM,EAAE;QAC5C,IAAI,CAACmD,cAAc,CAAC,QAAQ,CAAC;QAC7B,OAAO,KAAK;MACd;MACA,IAAI;QACF,MAAMpF,mEAAQ,CAACoI,UAAU,CAAClI,OAAO,CAACnI,MAAM,EAAE+F,YAAY,CAACmE,MAAM,CAAC;QAC9D,IAAI,CAACkc,kBAAkB,CAACrgB,YAAY,CAACrJ,EAAE,CAAC;QACxC,IAAI,CAACmS,eAAe,CAAC,OAAO,CAAC;QAC7B,IAAI,CAACnH,0BAA0B,CAAC,CAAC;QACjC,OAAO,IAAI;MACb,CAAC,CAAC,OAAOjN,KAAK,EAAE;QACd,IAAI,CAAC4S,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,QAAQ,CAAC;QAC9C,OAAO,KAAK;MACd;IACF,CAAC;IACD,MAAMsX,YAAYA,CAACxK,YAAY,EAAE;MAC/B,MAAMoC,OAAO,GAAGD,0EAAe,CAAC,CAAC;MACjC,IAAI,CAACC,OAAO,CAACnI,MAAM,IAAI,CAAC+F,YAAY,EAAEmE,MAAM,EAAE;QAC5C,IAAI,CAACmD,cAAc,CAAC,QAAQ,CAAC;QAC7B,OAAO,KAAK;MACd;MACA,IAAI;QACF,MAAMpF,mEAAQ,CAACsI,YAAY,CAACpI,OAAO,CAACnI,MAAM,EAAE+F,YAAY,CAACmE,MAAM,CAAC;QAChE,IAAI,CAACkc,kBAAkB,CAACrgB,YAAY,CAACrJ,EAAE,CAAC;QACxC,IAAI,CAACmS,eAAe,CAAC,OAAO,CAAC;QAC7B,IAAI,CAACnH,0BAA0B,CAAC,CAAC;QACjC,OAAO,IAAI;MACb,CAAC,CAAC,OAAOjN,KAAK,EAAE;QACd,IAAI,CAAC4S,cAAc,CAAC5S,KAAK,CAACxB,OAAO,IAAI,QAAQ,CAAC;QAC9C,OAAO,KAAK;MACd;IACF;EACF;AACF,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1sCkC;AACW;AACe;AACL;AACN;AAEnD,MAAMkxB,gBAAgB,GAAG,KAAK;AAE9B,SAASC,iBAAiBA,CAAC1zB,QAAQ,EAAE;EACnC,MAAM2zB,MAAM,GAAG,IAAInT,GAAG,CAAC,CAAC;EACxBxgB,QAAQ,CAACgc,OAAO,CAAC/b,OAAO,IAAI;IAC1B,MAAMS,GAAG,GAAGsG,MAAM,CAAC/G,OAAO,CAACS,GAAG,IAAIT,OAAO,CAAC+F,EAAE,IAAI,EAAE,CAAC,CAAC0C,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAChI,GAAG,EAAE;MACR;IACF;IACA,MAAMkzB,UAAU,GAAG;MACjB,GAAG3zB,OAAO;MACV+F,EAAE,EAAEgB,MAAM,CAAC/G,OAAO,CAAC+F,EAAE,IAAItF,GAAG,CAAC;MAC7BA;IACF,CAAC;IACDizB,MAAM,CAACpnB,GAAG,CAAC7L,GAAG,EAAE;MACd,IAAIizB,MAAM,CAAC/S,GAAG,CAAClgB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;MAC1B,GAAGkzB;IACL,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,OAAOxuB,KAAK,CAACC,IAAI,CAACsuB,MAAM,CAAC5D,MAAM,CAAC,CAAC,CAAC,CAAC9O,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACtY,KAAK,CAAC0d,aAAa,CAACnF,CAAC,CAACvY,KAAK,EAAE,OAAO,CAAC,CAAC;AAC5F;AAEO,MAAM7I,eAAe,GAAGsO,4DAAW,CAAC,UAAU,EAAE;EACrDJ,KAAK,EAAEA,CAAA,MAAO;IACZjO,QAAQ,EAAE,EAAE;IACZ6sB,QAAQ,EAAE,EAAE;IACZI,OAAO,EAAE,KAAK;IACdF,WAAW,EAAE,KAAK;IAClB8G,aAAa,EAAE,CAAC;IAChBC,cAAc,EAAE,IAAI;IACpBC,eAAe,EAAE,EAAE;IACnBC,QAAQ,EAAE,CAAC;IACX1yB,WAAW,EAAE,EAAE;IACfqoB,UAAU,EAAE;EACd,CAAC,CAAC;EACF2E,OAAO,EAAE;IACPpuB,aAAaA,CAAC+N,KAAK,EAAE;MACnB,OAAOA,KAAK,CAACjO,QAAQ,CAACuF,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAKiI,KAAK,CAAC4e,QAAQ,CAAC,IAAI5e,KAAK,CAACjO,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI;IAC7F;EACF,CAAC;EACDwO,OAAO,EAAE;IACPqgB,YAAYA,CAAA,EAAG;MACb,IAAI,IAAI,CAAC9B,WAAW,EAAE;QACpB;MACF;MACA,IAAI,CAACA,WAAW,GAAG,IAAI;MACvBxb,kEAAQ,CAACoX,EAAE,CAAC,iBAAiB,EAAE3oB,QAAQ,IAAI;QACzC,IAAI,CAACA,QAAQ,CAACmZ,MAAM,IAAI,IAAI,CAACnZ,QAAQ,CAACmZ,MAAM,EAAE;UAC5C;QACF;QACA,IAAI,CAACnZ,QAAQ,GAAG0zB,iBAAiB,CAAC1zB,QAAQ,CAAC;QAC3C,IAAI,CAAC,IAAI,CAACA,QAAQ,CAACuF,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAK,IAAI,CAAC6mB,QAAQ,CAAC,EAAE;UAC1D,IAAI,CAACA,QAAQ,GAAG,IAAI,CAAC7sB,QAAQ,CAAC,CAAC,CAAC,EAAEgG,EAAE,IAAI,EAAE;QAC5C;MACF,CAAC,CAAC;IACJ,CAAC;IACD,MAAMmD,eAAeA,CAACgb,OAAO,GAAG,CAAC,CAAC,EAAE;MAClC,IAAI,CAAC0K,YAAY,CAAC,CAAC;MACnB,MAAMpd,OAAO,GAAGD,yEAAe,CAAC,CAAC;MACjC,MAAMyiB,aAAa,GAAGxiB,OAAO,CAACnI,MAAM;MACpC,MAAMF,KAAK,GAAGN,OAAO,CAACqb,OAAO,CAAC/a,KAAK,CAAC;MACpC,IAAI,CAAC6qB,aAAa,EAAE;QAClB,IAAI,CAACC,aAAa,CAAC,CAAC;QACpB,OAAO,EAAE;MACX;MACA,IAAI,CAAC9qB,KAAK,IACL,IAAI,CAACpJ,QAAQ,CAACmZ,MAAM,IACpB,IAAI,CAAC4a,eAAe,KAAKE,aAAa,IACtC7c,IAAI,CAAC6B,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC+a,QAAQ,GAAGP,gBAAgB,EAChD;QACA,OAAO,IAAI,CAACzzB,QAAQ;MACtB;MACA,IAAI,IAAI,CAAC8zB,cAAc,IAAI,CAAC1qB,KAAK,EAAE;QACjC,OAAO,IAAI,CAAC0qB,cAAc;MAC5B;MACA,MAAMK,MAAM,GAAG,IAAI,CAACN,aAAa,GAAG,CAAC;MACrC,IAAI,CAACA,aAAa,GAAGM,MAAM;MAC3B,IAAI,CAAClH,OAAO,GAAG,IAAI;MAEnB,IAAI,CAAC6G,cAAc,GAAG,CAAC,YAAY;QACjC,IAAI,CAAC9zB,QAAQ,GAAG0zB,iBAAiB,CAACniB,kEAAQ,CAAC+W,kBAAkB,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,CAACtoB,QAAQ,CAACuF,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAK,IAAI,CAAC6mB,QAAQ,CAAC,EAAE;UAC1D,IAAI,CAACA,QAAQ,GAAG,IAAI,CAAC7sB,QAAQ,CAAC,CAAC,CAAC,EAAEgG,EAAE,IAAI,EAAE;QAC5C;QACA,IAAI,CAAC,IAAI,CAAChG,QAAQ,CAACmZ,MAAM,IAAI/P,KAAK,EAAE;UAClC,MAAMgrB,cAAc,GAAG,MAAM7iB,kEAAQ,CAACyU,oBAAoB,CAACiO,aAAa,CAAC;UACzE,IAAIE,MAAM,KAAK,IAAI,CAACN,aAAa,IAAIriB,yEAAe,CAAC,CAAC,CAAClI,MAAM,KAAK2qB,aAAa,EAAE;YAC/E,OAAO,IAAI,CAACj0B,QAAQ;UACtB;UACA,IAAI,CAACA,QAAQ,GAAG0zB,iBAAiB,CAACU,cAAc,CAAC;UACjD,IAAI,CAACL,eAAe,GAAGE,aAAa;UACpC,IAAI,CAACD,QAAQ,GAAG5c,IAAI,CAAC6B,GAAG,CAAC,CAAC;UAC1B,IAAI,CAAC,IAAI,CAACjZ,QAAQ,CAACuF,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAK,IAAI,CAAC6mB,QAAQ,CAAC,EAAE;YAC1D,IAAI,CAACA,QAAQ,GAAG,IAAI,CAAC7sB,QAAQ,CAAC,CAAC,CAAC,EAAEgG,EAAE,IAAI,EAAE;UAC5C;QACF;QACAmG,MAAM,CAAC+E,UAAU,CAAC,MAAM;UACtB,IAAIijB,MAAM,KAAK,IAAI,CAACN,aAAa,IAAIriB,yEAAe,CAAC,CAAC,CAAClI,MAAM,KAAK2qB,aAAa,EAAE;YAC/E;UACF;UACA,MAAM3C,MAAM,GAAG/f,kEAAQ,CAACwU,cAAc,CAAC,KAAK,CAAC;UAC7C,IAAIuL,MAAM,CAACnY,MAAM,IAAI,CAAC,IAAI,CAACnZ,QAAQ,CAACmZ,MAAM,EAAE;YAC1C,IAAI,CAACnZ,QAAQ,GAAG0zB,iBAAiB,CAACpC,MAAM,CAAC;YACzC,IAAI,CAACyC,eAAe,GAAGE,aAAa;YACpC,IAAI,CAACD,QAAQ,GAAG5c,IAAI,CAAC6B,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,IAAI,CAACjZ,QAAQ,CAACuF,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAACnJ,EAAE,KAAK,IAAI,CAAC6mB,QAAQ,CAAC,EAAE;cAC1D,IAAI,CAACA,QAAQ,GAAG,IAAI,CAAC7sB,QAAQ,CAAC,CAAC,CAAC,EAAEgG,EAAE,IAAI,EAAE;YAC5C;UACF;QACF,CAAC,EAAE,IAAI,CAAC;QACR,OAAO,IAAI,CAAChG,QAAQ;MACtB,CAAC,EAAE,CAAC;MAEJ,IAAI;QACF,OAAO,MAAM,IAAI,CAAC8zB,cAAc;MAClC,CAAC,SAAS;QACR,IAAIK,MAAM,KAAK,IAAI,CAACN,aAAa,EAAE;UACjC,IAAI,CAAC5G,OAAO,GAAG,KAAK;UACpB,IAAI,CAAC6G,cAAc,GAAG,IAAI;QAC5B;MACF;IACF,CAAC;IACD,MAAM7qB,UAAUA,CAACsd,OAAO,EAAE;MACxB,MAAM9U,OAAO,GAAGD,yEAAe,CAAC,CAAC;MACjC,MAAMpR,KAAK,GAAG4G,MAAM,CAACuf,OAAO,IAAI,EAAE,CAAC,CAAC7d,IAAI,CAAC,CAAC;MAC1C,IAAI,CAACpH,WAAW,GAAG,EAAE;MACrB,IAAI,CAACqoB,UAAU,GAAG,EAAE;MACpB,IAAI,CAAClY,OAAO,CAACnI,MAAM,EAAE;QACnB,IAAI,CAAChI,WAAW,GAAG,MAAM;QACzB,OAAO,KAAK;MACd;MACA,IAAI,CAAClB,KAAK,EAAE;QACV,IAAI,CAACkB,WAAW,GAAG,iBAAiB;QACpC,OAAO,KAAK;MACd;MAEA,IAAI,CAAC2rB,OAAO,GAAG,IAAI;MACnB,IAAI;QACF,MAAMhtB,OAAO,GAAG,MAAMsR,kEAAQ,CAACtI,UAAU,CAACwI,OAAO,CAACnI,MAAM,EAAElJ,KAAK,EAAE,OAAO,CAAC;QACzE,IAAIH,OAAO,EAAE;UACX,IAAI,CAACD,QAAQ,GAAG0zB,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC1zB,QAAQ,EAAEC,OAAO,CAAC,CAAC;UAC9D,IAAI,CAAC4sB,QAAQ,GAAG5sB,OAAO,CAAC+F,EAAE;QAC5B;QACA,IAAI,CAAC2jB,UAAU,GAAG,QAAQ;QAC1B,MAAM,IAAI,CAACxgB,eAAe,CAAC;UAAEC,KAAK,EAAE;QAAK,CAAC,CAAC;QAC3C,OAAO,IAAI;MACb,CAAC,CAAC,OAAOrF,KAAK,EAAE;QACd,IAAI,CAACzC,WAAW,GAAGyC,KAAK,CAACxB,OAAO,IAAI,SAAS;QAC7C,OAAO,KAAK;MACd,CAAC,SAAS;QACR,IAAI,CAAC0qB,OAAO,GAAG,KAAK;MACtB;IACF,CAAC;IACD,MAAM5rB,kBAAkBA,CAACgzB,SAAS,EAAEh0B,KAAK,EAAE;MACzC,MAAMoR,OAAO,GAAGD,yEAAe,CAAC,CAAC;MACjC,MAAMgW,QAAQ,GAAGxgB,MAAM,CAACqtB,SAAS,IAAI,EAAE,CAAC,CAAC3rB,IAAI,CAAC,CAAC;MAC/C,MAAM4rB,SAAS,GAAGttB,MAAM,CAAC3G,KAAK,IAAI,EAAE,CAAC,CAACqI,IAAI,CAAC,CAAC;MAC5C,IAAI,CAACpH,WAAW,GAAG,EAAE;MACrB,IAAI,CAACqoB,UAAU,GAAG,EAAE;MACpB,IAAI,CAAClY,OAAO,CAACnI,MAAM,EAAE;QACnB,IAAI,CAAChI,WAAW,GAAG,MAAM;QACzB,OAAO,KAAK;MACd;MACA,IAAI,CAACkmB,QAAQ,EAAE;QACb,IAAI,CAAClmB,WAAW,GAAG,SAAS;QAC5B,OAAO,KAAK;MACd;MAEA,IAAI;QACF,MAAMizB,UAAU,GAAG,MAAMhjB,kEAAQ,CAAClQ,kBAAkB,CAACoQ,OAAO,CAACnI,MAAM,EAAEke,QAAQ,EAAE8M,SAAS,CAAC;QACzF,IAAI,CAACt0B,QAAQ,GAAG0zB,iBAAiB,CAAC,IAAI,CAAC1zB,QAAQ,CAAC+F,GAAG,CAACoJ,IAAI,IAAI;UAC1D,IAAIA,IAAI,CAACzO,GAAG,KAAK8mB,QAAQ,IAAIrY,IAAI,CAACnJ,EAAE,KAAKwhB,QAAQ,EAAE;YACjD,OAAOrY,IAAI;UACb;UACA,MAAM5O,OAAO,GAAG;YACd,IAAI4O,IAAI,CAAC5O,OAAO,IAAI,CAAC,CAAC,CAAC;YACvB8lB,WAAW,EAAEkO;UACf,CAAC;UACD,MAAM7L,SAAS,GAAG;YAChB,IAAIvZ,IAAI,CAACuZ,SAAS,IAAI,CAAC,CAAC,CAAC;YACzBroB,KAAK,EAAEk0B;UACT,CAAC;UACD,MAAM3rB,KAAK,GAAG2rB,UAAU,IAAIh0B,OAAO,CAACC,WAAW,IAAID,OAAO,CAACE,IAAI,IAAI0O,IAAI,CAACzO,GAAG;UAC3E,OAAO;YACL,GAAGyO,IAAI;YACPvG,KAAK;YACLtF,UAAU,EAAEsF,KAAK,CAACR,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;YAC3ChI,KAAK,EAAEk0B,UAAU;YACjB7L,SAAS;YACTnoB;UACF,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAACyzB,QAAQ,GAAG5c,IAAI,CAAC6B,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC0Q,UAAU,GAAG,QAAQ;QAC1B,OAAO,IAAI;MACb,CAAC,CAAC,OAAO5lB,KAAK,EAAE;QACd,IAAI,CAACzC,WAAW,GAAGyC,KAAK,CAACxB,OAAO,IAAI,SAAS;QAC7C,OAAO,KAAK;MACd;IACF,CAAC;IACD2xB,aAAaA,CAAA,EAAG;MACd,IAAI,CAACL,aAAa,IAAI,CAAC;MACvB,IAAI,CAAC7zB,QAAQ,GAAG,EAAE;MAClB,IAAI,CAAC6sB,QAAQ,GAAG,EAAE;MAClB,IAAI,CAACI,OAAO,GAAG,KAAK;MACpB,IAAI,CAAC6G,cAAc,GAAG,IAAI;MAC1B,IAAI,CAACC,eAAe,GAAG,EAAE;MACzB,IAAI,CAACC,QAAQ,GAAG,CAAC;MACjB,IAAI,CAAC1yB,WAAW,GAAG,EAAE;MACrB,IAAI,CAACqoB,UAAU,GAAG,EAAE;IACtB,CAAC;IACD6K,gBAAgBA,CAACxuB,EAAE,EAAE;MACnB,IAAI,CAAC6mB,QAAQ,GAAG7mB,EAAE;IACpB,CAAC;IACDyuB,QAAQA,CAACx0B,OAAO,EAAE;MAChB,IAAI,CAACA,OAAO,EAAE;QACZ;MACF;MACA,MAAM4O,aAAa,GAAGD,oFAAoB,CAAC,CAAC;MAC5C,MAAME,UAAU,GAAGR,+EAAkB,CAAC,CAAC;MACvC,MAAMe,YAAY,GAAGkC,kEAAQ,CAACgX,wBAAwB,CAACtoB,OAAO,CAACS,GAAG,EAAET,OAAO,CAAC;MAC5E4O,aAAa,CAACqH,kBAAkB,CAAC7G,YAAY,CAAC;MAC9CR,aAAa,CAACoC,qBAAqB,CAAC5B,YAAY,CAACrJ,EAAE,CAAC;MACpD8I,UAAU,CAACL,YAAY,CAAC,CAAC;IAC3B;EACF;AACF,CAAC,CAAC;;;;;;;;ACxOyE;AACL;;AAEtE,oBAAoB,sGAAM;;AAE1B,sDAAe;;;;;;;;;;;;;ACLqB;AACW;AACV;AAErC,MAAMimB,WAAW,GAAG,oBAAoB;AAExC,SAASC,uBAAuBA,CAACtxB,QAAQ,EAAE;EACzC,OAAOA,QAAQ,IAAI,EAAE;AACvB;AAEA,SAASuxB,mBAAmBA,CAACC,eAAe,EAAEC,eAAe,EAAE;EAC7D,OAAOH,uBAAuB,CAACE,eAAe,CAAC,IAAIF,uBAAuB,CAACG,eAAe,CAAC;AAC7F;AAEO,MAAMtjB,eAAe,GAAGnD,4DAAW,CAAC,SAAS,EAAE;EACpDJ,KAAK,EAAEA,CAAA,MAAO;IACZwP,eAAe,EAAE,KAAK;IACtBsX,UAAU,EAAE,KAAK;IACjB3f,SAAS,EAAE,KAAK;IAChBD,oBAAoB,EAAE,KAAK;IAC3B7L,MAAM,EAAE,EAAE;IACV4Z,KAAK,EAAE,EAAE;IACT1iB,WAAW,EAAE,EAAE;IACf6C,QAAQ,EAAE,EAAE;IACZU,KAAK,EAAE,EAAE;IACTixB,UAAU,EAAE,EAAE;IACdjI,WAAW,EAAE;EACf,CAAC,CAAC;EACFve,OAAO,EAAE;IACPgP,OAAOA,CAAA,EAAG;MACR,MAAM/J,GAAG,GAAGqL,YAAY,CAACC,OAAO,CAAC2V,WAAW,CAAC;MAC7C,IAAI,CAACjhB,GAAG,EAAE;QACR;MACF;MACA,IAAI;QACF,MAAMhC,OAAO,GAAGmN,IAAI,CAACC,KAAK,CAACpL,GAAG,CAAC;QAC/B,IAAIhC,OAAO,CAAC2M,SAAS,KAAKP,uDAAS,CAACO,SAAS,EAAE;UAC7CU,YAAY,CAACmW,UAAU,CAACP,WAAW,CAAC;UACpC;QACF;QACA,IAAIjjB,OAAO,CAACnI,MAAM,IAAImI,OAAO,CAACyR,KAAK,EAAE;UACnC,IAAI,CAACzR,OAAO,CAAC2Q,QAAQ,EAAE;YACrBtD,YAAY,CAACmW,UAAU,CAACP,WAAW,CAAC;YACpC;UACF;UACA,IAAI,CAACprB,MAAM,GAAGmI,OAAO,CAACnI,MAAM;UAC5B,IAAI,CAAC4Z,KAAK,GAAGzR,OAAO,CAACyR,KAAK;UAC1B,IAAI,CAAC1iB,WAAW,GAAGiR,OAAO,CAACjR,WAAW,IAAIiR,OAAO,CAACnI,MAAM;UACxD,IAAI,CAACjG,QAAQ,GAAGsxB,uBAAuB,CAACljB,OAAO,CAACpO,QAAQ,CAAC;UACzD,IAAI,CAACoa,eAAe,GAAG,IAAI;UAC3BlM,kEAAQ,CAAC+Q,eAAe,CAAC7Q,OAAO,CAAC2Q,QAAQ,CAAC;UAC1C,IAAI3Q,OAAO,CAAC0R,SAAS,EAAE;YACrB,IAAI,CAAChO,oBAAoB,GAAG,QAAQ;UACtC;UACA,IAAI,CAACqO,OAAO,CAAC,CAAC;UACd,IAAI,CAAC0R,cAAc,CAAC,CAAC;QACvB;MACF,CAAC,CAAC,OAAOnxB,KAAK,EAAE;QACd+a,YAAY,CAACmW,UAAU,CAACP,WAAW,CAAC;MACtC;IACF,CAAC;IACD,MAAMjS,iBAAiBA,CAAC9hB,MAAM,EAAE+hB,QAAQ,EAAE;MACxC,IAAI,CAAC3e,KAAK,GAAG,EAAE;MACf,IAAI,CAACgxB,UAAU,GAAG,IAAI;MACtB,IAAI;QACF,MAAMjc,MAAM,GAAG,MAAMvH,kEAAQ,CAACkR,iBAAiB,CAAC9hB,MAAM,EAAE+hB,QAAQ,CAAC;QACjE,IAAI,CAACyS,gBAAgB,CAACrc,MAAM,CAAC;QAC7B,MAAM,IAAI,CAAC0K,OAAO,CAAC,CAAC;MACtB,CAAC,CAAC,OAAOzf,KAAK,EAAE;QACd,IAAI,CAACA,KAAK,GAAGA,KAAK,CAACxB,OAAO,IAAI,MAAM;MACtC,CAAC,SAAS;QACR,IAAI,CAACwyB,UAAU,GAAG,KAAK;MACzB;IACF,CAAC;IACD,MAAMzR,aAAaA,CAAC3iB,MAAM,EAAEsiB,IAAI,EAAE;MAChC,IAAI,CAAClf,KAAK,GAAG,EAAE;MACf,IAAI,CAACgxB,UAAU,GAAG,IAAI;MACtB,IAAI;QACF,MAAMjc,MAAM,GAAG,MAAMvH,kEAAQ,CAAC+R,aAAa,CAAC3iB,MAAM,EAAEsiB,IAAI,CAAC;QACzD,IAAI,CAACkS,gBAAgB,CAACrc,MAAM,CAAC;QAC7B,MAAM,IAAI,CAAC0K,OAAO,CAAC,CAAC;MACtB,CAAC,CAAC,OAAOzf,KAAK,EAAE;QACd,IAAI,CAACA,KAAK,GAAGA,KAAK,CAACxB,OAAO,IAAI,MAAM;MACtC,CAAC,SAAS;QACR,IAAI,CAACwyB,UAAU,GAAG,KAAK;MACzB;IACF,CAAC;IACD,MAAMxR,iBAAiBA,CAAC5iB,MAAM,EAAEsiB,IAAI,EAAE;MACpC,IAAI,CAAClf,KAAK,GAAG,EAAE;MACf,IAAI,CAACgxB,UAAU,GAAG,IAAI;MACtB,IAAI;QACF,OAAO,MAAMxjB,kEAAQ,CAACgS,iBAAiB,CAAC5iB,MAAM,EAAEsiB,IAAI,CAAC;MACvD,CAAC,CAAC,OAAOlf,KAAK,EAAE;QACd,IAAI,CAACA,KAAK,GAAGA,KAAK,CAACxB,OAAO,IAAI,MAAM;QACpC,OAAO,IAAI;MACb,CAAC,SAAS;QACR,IAAI,CAACwyB,UAAU,GAAG,KAAK;MACzB;IACF,CAAC;IACDI,gBAAgBA,CAACrc,MAAM,EAAE;MACvB,IAAI,CAACxP,MAAM,GAAGwP,MAAM,CAACxP,MAAM,IAAIwP,MAAM,CAACpY,GAAG,IAAIoY,MAAM,CAAC9S,EAAE,IAAI,EAAE;MAC5D,IAAI,CAACkd,KAAK,GAAGpK,MAAM,CAACoK,KAAK,IAAIpK,MAAM,CAACsc,OAAO,IAAI,EAAE;MACjD,IAAI,CAAC50B,WAAW,GAAGsY,MAAM,CAACtY,WAAW,IAAIsY,MAAM,CAACuc,QAAQ,IAAIvc,MAAM,CAACrY,IAAI,IAAI,IAAI,CAAC6I,MAAM;MACtF,IAAI,CAACjG,QAAQ,GAAGsxB,uBAAuB,CAAC7b,MAAM,CAACzV,QAAQ,CAAC;MACxD,IAAI,CAACoa,eAAe,GAAG3U,OAAO,CAAC,IAAI,CAACQ,MAAM,IAAI,IAAI,CAAC4Z,KAAK,CAAC;MACzD,IAAIpK,MAAM,CAACqK,SAAS,EAAE;QACpB,IAAI,CAAChO,oBAAoB,GAAG,QAAQ;MACtC;MACA,IAAI,CAACmgB,cAAc,CAACxsB,OAAO,CAACgQ,MAAM,CAACqK,SAAS,CAAC,CAAC;IAChD,CAAC;IACDmS,cAAcA,CAACnS,SAAS,GAAG,KAAK,EAAE;MAChCrE,YAAY,CAACM,OAAO,CAACsV,WAAW,EAAE9V,IAAI,CAACS,SAAS,CAAC;QAC/C/V,MAAM,EAAE,IAAI,CAACA,MAAM;QACnB4Z,KAAK,EAAE,IAAI,CAACA,KAAK;QACjB1iB,WAAW,EAAE,IAAI,CAACA,WAAW;QAC7B6C,QAAQ,EAAE,IAAI,CAACA,QAAQ;QACvB+e,QAAQ,EAAE7Q,kEAAQ,CAAC4Q,WAAW,CAAC,CAAC;QAChCgB,SAAS;QACT/E,SAAS,EAAEP,uDAAS,CAACO;MACvB,CAAC,CAAC,CAAC;IACL,CAAC;IACDmX,YAAYA,CAAChtB,OAAO,EAAE;MACpB,IAAI,CAACA,OAAO,EAAE;QACZ;MACF;MACA,IAAI,CAACe,MAAM,GAAGf,OAAO,CAACe,MAAM,IAAIf,OAAO,CAAC7H,GAAG,IAAI,IAAI,CAAC4I,MAAM;MAC1D,IAAI,CAAC9I,WAAW,GAAG+H,OAAO,CAAC/H,WAAW,IAAI+H,OAAO,CAAC9H,IAAI,IAAI,IAAI,CAACD,WAAW,IAAI,IAAI,CAAC8I,MAAM;MACzF,IAAI,CAACjG,QAAQ,GAAGuxB,mBAAmB,CAACrsB,OAAO,CAAClF,QAAQ,EAAE,IAAI,CAACA,QAAQ,CAAC;MACpE,IAAI,CAACiyB,cAAc,CAAC,CAAC;IACvB,CAAC;IACD,MAAMJ,cAAcA,CAAA,EAAG;MACrB,IAAI,CAAC,IAAI,CAAC5rB,MAAM,EAAE;QAChB,OAAO,IAAI;MACb;MACA,IAAI;QACF,MAAMf,OAAO,GAAG,MAAMgJ,kEAAQ,CAACmW,UAAU,CAAC,IAAI,CAACpe,MAAM,CAAC;QACtD,IAAI,CAACisB,YAAY,CAAChtB,OAAO,CAAC;QAC1B,OAAOA,OAAO;MAChB,CAAC,CAAC,OAAOxE,KAAK,EAAE;QACd,OAAO,IAAI;MACb;IACF,CAAC;IACD,MAAMyxB,WAAWA,CAAC;MAAEh1B,WAAW;MAAEqnB;IAAa,CAAC,EAAE;MAC/C,IAAI,CAAC,IAAI,CAACve,MAAM,EAAE;QAChB,MAAM,IAAI8Z,KAAK,CAAC,MAAM,CAAC;MACzB;MACA,MAAM7a,OAAO,GAAG,MAAMgJ,kEAAQ,CAACqW,aAAa,CAAC,IAAI,CAACte,MAAM,EAAE;QACxD9I,WAAW;QACXqnB;MACF,CAAC,CAAC;MACF,IAAI,CAAC0N,YAAY,CAAChtB,OAAO,CAAC;MAC1B,OAAOA,OAAO;IAChB,CAAC;IACD,MAAMuf,cAAcA,CAAC;MAAEC,WAAW;MAAEC;IAAY,CAAC,EAAE;MACjD,IAAI,CAAC,IAAI,CAAC1e,MAAM,EAAE;QAChB,MAAM,IAAI8Z,KAAK,CAAC,MAAM,CAAC;MACzB;MACA,MAAM7R,kEAAQ,CAACuW,cAAc,CAAC;QAAEC,WAAW;QAAEC;MAAY,CAAC,CAAC;MAC3D,OAAO,IAAI;IACb,CAAC;IACD,MAAMG,qBAAqBA,CAAC;MAAExnB,MAAM;MAAEynB,SAAS;MAAEJ;IAAY,CAAC,EAAE;MAC9D,MAAMzW,kEAAQ,CAAC4W,qBAAqB,CAAC;QAAExnB,MAAM;QAAEynB,SAAS;QAAEJ;MAAY,CAAC,CAAC;MACxE,OAAO,IAAI;IACb,CAAC;IACD,MAAMxE,OAAOA,CAAA,EAAG;MACd,IAAI,CAAC,IAAI,CAACla,MAAM,IAAI,CAAC,IAAI,CAAC4Z,KAAK,EAAE;QAC/B;MACF;MACA,MAAM3R,kEAAQ,CAACiR,SAAS,CAAC,CAAC;MAC1B,IAAI,CAACwS,UAAU,GAAGzjB,kEAAQ,CAACgR,aAAa,CAAC,CAAC;MAC1C,IAAI,CAACsM,YAAY,CAAC,CAAC;MACnB,MAAMtd,kEAAQ,CAACiS,OAAO,CAAC,IAAI,CAACla,MAAM,EAAE,IAAI,CAAC4Z,KAAK,CAAC;IACjD,CAAC;IACD2L,YAAYA,CAAA,EAAG;MACb,IAAI,IAAI,CAAC9B,WAAW,EAAE;QACpB;MACF;MACA,IAAI,CAACA,WAAW,GAAG,IAAI;MACvBxb,kEAAQ,CAACoX,EAAE,CAAC,yBAAyB,EAAE1iB,MAAM,IAAI;QAC/C,IAAI,CAACmP,SAAS,GAAGnP,MAAM,CAACmP,SAAS;QACjC,IAAI,CAACD,oBAAoB,GAAGlP,MAAM,CAACgP,UAAU,KAAKhP,MAAM,CAACmP,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;MACrF,CAAC,CAAC;IACJ,CAAC;IACDqgB,MAAMA,CAAA,EAAG;MACPlkB,kEAAQ,CAACmS,UAAU,CAAC,CAAC;MACrB5E,YAAY,CAACmW,UAAU,CAACP,WAAW,CAAC;MACpC,IAAI,CAACgB,MAAM,CAAC,CAAC;IACf;EACF;AACF,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7LmC;AACS;AAE9C,MAAMC,qBAAqB,GAAG,KAAK;AACnC,MAAMC,gBAAgB,GAAG,IAAI;AAC7B,MAAMC,gBAAgB,GAAG,KAAK;AAE9B,SAASC,UAAUA,CAAA,EAAG;EACpB,IAAIjY,uDAAS,CAACkY,KAAK,EAAE;IACnB,OAAOlY,uDAAS,CAACkY,KAAK;EACxB;EACA,MAAMC,QAAQ,GAAGnY,uDAAS,CAACoY,MAAM,GAAG,KAAK,GAAG,IAAI;EAChD,MAAM5M,IAAI,GAAGxL,uDAAS,CAACqY,YAAY,IAAI/pB,MAAM,CAACC,QAAQ,CAAC+pB,QAAQ;EAC/D,MAAMC,IAAI,GAAGvY,uDAAS,CAACwY,WAAW,GAAG,IAAIxY,uDAAS,CAACwY,WAAW,EAAE,GAAG,EAAE;EACrE,MAAMC,IAAI,GAAGzY,uDAAS,CAAC0Y,MAAM,EAAE9a,UAAU,CAAC,GAAG,CAAC,GAAGoC,uDAAS,CAAC0Y,MAAM,GAAG,IAAI1Y,uDAAS,CAAC0Y,MAAM,IAAI,IAAI,EAAE;EAClG,OAAO,GAAGP,QAAQ,MAAM3M,IAAI,GAAG+M,IAAI,GAAGE,IAAI,EAAE;AAC9C;AAEA,SAASE,uBAAuBA,CAACzN,OAAO,EAAE;EACxC,MAAMvV,MAAM,GAAGuV,OAAO,CAACvV,MAAM,IAAIuV,OAAO,CAAC0N,EAAE,IAAI1N,OAAO,CAAC2N,QAAQ,IAAI3N,OAAO,CAAC4N,kBAAkB,IAAI5N,OAAO,CAAC1jB,IAAI,IAAI0jB,OAAO,CAAC1D,MAAM;EAC/H,OAAO0D,OAAO,CAACxZ,cAAc,KAAKiE,MAAM,GAAG,UAAUA,MAAM,EAAE,GAAG,EAAE,CAAC;AACrE;AAEA,SAASojB,wBAAwBA,CAAC7N,OAAO,EAAE8N,aAAa,EAAE;EACxD,MAAM1nB,IAAI,GAAG4Z,OAAO,CAACxmB,OAAO,IAAIwmB,OAAO;EACvC,MAAM1jB,IAAI,GAAG8J,IAAI,CAAC9J,IAAI,IAAI8J,IAAI,CAACkW,MAAM,IAAIlW,IAAI,CAAC2nB,QAAQ,IAAI,EAAE;EAC5D,MAAMtjB,MAAM,GAAGrE,IAAI,CAACqE,MAAM,IAAIrE,IAAI,CAACsnB,EAAE,IAAItnB,IAAI,CAACunB,QAAQ,IAAI,EAAE;EAC5D,MAAMtyB,SAAS,GAAGiB,IAAI,IAAI2B,MAAM,CAAC3B,IAAI,CAAC,KAAK2B,MAAM,CAAC6vB,aAAa,CAAC,GAAG,KAAK,GAAG,IAAI;EAC/E,MAAMtnB,cAAc,GAAGJ,IAAI,CAACI,cAAc,IAAIinB,uBAAuB,CAAC;IACpE,GAAGrnB,IAAI;IACPqE,MAAM,EAAEpP,SAAS,KAAK,KAAK,GAAGoP,MAAM,GAAGnO;EACzC,CAAC,CAAC;EAEF,IAAI,CAACkK,cAAc,EAAE;IACnB,OAAO,IAAI;EACb;EAEA,MAAMtJ,MAAM,GAAGkJ,IAAI,CAAClJ,MAAM,IAAIkJ,IAAI,CAACjJ,cAAc,IAAI,MAAM;EAE3D,OAAO;IACLF,EAAE,EAAEmJ,IAAI,CAACnJ,EAAE,IAAImJ,IAAI,CAACjK,SAAS,IAAIiK,IAAI,CAAChJ,UAAU,IAAI,GAAGiR,IAAI,CAAC6B,GAAG,CAAC,CAAC,GAAG5O,IAAI,CAACqU,MAAM,CAAC,CAAC,CAAC/R,QAAQ,CAAC,EAAE,CAAC,CAACvE,KAAK,CAAC,CAAC,CAAC,EAAE;IACzGjC,UAAU,EAAEgJ,IAAI,CAAChJ,UAAU,IAAIgJ,IAAI,CAACzO,GAAG,IAAIyO,IAAI,CAACjK,SAAS,IAAI,EAAE;IAC/DqK,cAAc;IACdlK,IAAI;IACJmO,MAAM;IACNpP,SAAS;IACTqD,IAAI,EAAE0H,IAAI,CAAC1H,IAAI,IAAI,MAAM;IACzBgI,IAAI,EAAEN,IAAI,CAACM,IAAI,IAAIN,IAAI,CAAC4nB,OAAO,IAAI5nB,IAAI,CAAC6nB,iBAAiB,IAAI,EAAE;IAC/D/wB,MAAM;IACNC,cAAc,EAAEiJ,IAAI,CAACjJ,cAAc,KAAK9B,SAAS,KAAK,KAAK,GAAG6B,MAAM,GAAG,EAAE,CAAC;IAC1EsH,SAAS,EAAE3D,MAAM,CAACuF,IAAI,CAAC5B,SAAS,IAAI4B,IAAI,CAACoW,eAAe,IAAInO,IAAI,CAAC6B,GAAG,CAAC,CAAC,CAAC;IACvEmI,gBAAgB,EAAExX,MAAM,CAACuF,IAAI,CAACiS,gBAAgB,IAAIjS,IAAI,CAAC5B,SAAS,IAAI4B,IAAI,CAACoW,eAAe,IAAInO,IAAI,CAAC6B,GAAG,CAAC,CAAC,CAAC;IACvGxF,GAAG,EAAEtE;EACP,CAAC;AACH;AAEO,MAAM8nB,sBAAsB,SAASlV,gEAAY,CAAC;EACvDC,WAAWA,CAAA,EAAG;IACZ,KAAK,CAAC,CAAC;IACP,IAAI,CAACkV,MAAM,GAAG,IAAI;IAClB,IAAI,CAACnB,KAAK,GAAGD,UAAU,CAAC,CAAC;IACzB,IAAI,CAACqB,cAAc,GAAG,IAAI;IAC1B,IAAI,CAACC,cAAc,GAAG,IAAI;IAC1B,IAAI,CAACC,iBAAiB,GAAG,CAAC;IAC1B,IAAI,CAACC,WAAW,GAAG,KAAK;EAC1B;EAEA/U,aAAaA,CAAA,EAAG;IACd,OAAO,WAAW;EACpB;EAEAsI,uBAAuBA,CAAA,EAAG;IACxB,OAAO,CAAC,IAAI,CAACzV,SAAS;EACxB;EAEA,MAAMoN,SAASA,CAAA,EAAG;IAChB,IAAI,OAAO+U,SAAS,KAAK,WAAW,EAAE;MACpC,MAAM,IAAInU,KAAK,CAAC,wBAAwB,CAAC;IAC3C;IACA,OAAO,IAAI;EACb;EAEAI,OAAOA,CAACla,MAAM,EAAE4Z,KAAK,EAAE;IACrB,IAAI,CAAChB,WAAW,GAAG;MAAE5Y,MAAM;MAAE4Z;IAAM,CAAC;IACpC,IAAI,CAACoU,WAAW,GAAG,KAAK;IACxB,IAAI,CAACE,UAAU,CAAC,CAAC;EACnB;EAEA9T,UAAUA,CAAA,EAAG;IACX,IAAI,CAAC4T,WAAW,GAAG,IAAI;IACvB,IAAI,CAACG,mBAAmB,CAAC,CAAC;IAC1B,IAAI,CAACC,mBAAmB,CAAC,CAAC;IAC1B,IAAI,IAAI,CAACR,MAAM,EAAE;MACf,IAAI,CAACA,MAAM,CAACS,KAAK,CAAC,CAAC;MACnB,IAAI,CAACT,MAAM,GAAG,IAAI;IACpB;IACA,KAAK,CAACxT,UAAU,CAAC,CAAC;EACpB;EAEA8T,UAAUA,CAAA,EAAG;IACX,IAAI,IAAI,CAACN,MAAM,EAAEU,UAAU,KAAKL,SAAS,CAACM,IAAI,EAAE;MAC9C,IAAI,CAACC,aAAa,CAAC,CAAC;MACpB;IACF;IACA,IAAI,IAAI,CAACZ,MAAM,EAAEU,UAAU,KAAKL,SAAS,CAACQ,UAAU,EAAE;MACpD;IACF;IAEA,IAAI,CAACh2B,IAAI,CAAC,yBAAyB,EAAE;MAAEqT,SAAS,EAAE,KAAK;MAAEH,UAAU,EAAE;IAAS,CAAC,CAAC;IAEhF,IAAI;MACF,IAAI,CAACiiB,MAAM,GAAG,IAAIK,SAAS,CAAC,IAAI,CAACxB,KAAK,CAAC;MACvC,IAAI,CAACmB,MAAM,CAACc,UAAU,GAAG,aAAa;IACxC,CAAC,CAAC,OAAOj0B,KAAK,EAAE;MACd,IAAI,CAAChC,IAAI,CAAC,yBAAyB,EAAE;QAAEqT,SAAS,EAAE,KAAK;QAAEH,UAAU,EAAE;MAAmB,CAAC,CAAC;MAC1F,IAAI,CAACgjB,iBAAiB,CAAC,CAAC;MACxB;IACF;IAEA,IAAI,CAACf,MAAM,CAACgB,MAAM,GAAG,MAAM;MACzB,IAAI,CAAC9iB,SAAS,GAAG,IAAI;MACrB,IAAI,CAACiiB,iBAAiB,GAAG,CAAC;MAC1B,IAAI,CAACt1B,IAAI,CAAC,yBAAyB,EAAE;QAAEqT,SAAS,EAAE,IAAI;QAAEH,UAAU,EAAE;MAAS,CAAC,CAAC;MAC/E,IAAI,CAAC6iB,aAAa,CAAC,CAAC;MACpB,IAAI,CAACK,cAAc,CAAC,CAAC;MACrB,IAAI,CAAC1U,uBAAuB,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,CAACyT,MAAM,CAACkB,SAAS,GAAG1sB,KAAK,IAAI;MAC/B,IAAI,CAAC2sB,WAAW,CAAC3sB,KAAK,CAACiW,IAAI,CAAC;IAC9B,CAAC;IAED,IAAI,CAACuV,MAAM,CAACoB,OAAO,GAAG,MAAM;MAC1B,IAAI,CAACv2B,IAAI,CAAC,yBAAyB,EAAE;QAAEqT,SAAS,EAAE,KAAK;QAAEH,UAAU,EAAE;MAAiB,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,CAACiiB,MAAM,CAACqB,OAAO,GAAG,MAAM;MAC1B,IAAI,CAACnjB,SAAS,GAAG,KAAK;MACtB,IAAI,CAACsiB,mBAAmB,CAAC,CAAC;MAC1B,IAAI,CAACR,MAAM,GAAG,IAAI;MAClB,IAAI,IAAI,CAACI,WAAW,EAAE;QACpB;MACF;MACA,IAAI,CAACv1B,IAAI,CAAC,yBAAyB,EAAE;QAAEqT,SAAS,EAAE,KAAK;QAAEH,UAAU,EAAE;MAAS,CAAC,CAAC;MAChF,IAAI,CAACgjB,iBAAiB,CAAC,CAAC;IAC1B,CAAC;EACH;EAEAH,aAAaA,CAAA,EAAG;IACd,IAAI,CAACU,SAAS,CAAC;MACb/wB,IAAI,EAAE,MAAM;MACZ6B,MAAM,EAAE,IAAI,CAAC4Y,WAAW,EAAE5Y,MAAM,IAAI,EAAE;MACtC4Z,KAAK,EAAE,IAAI,CAAChB,WAAW,EAAEgB,KAAK,IAAI,EAAE;MACpCd,QAAQ,EAAE,IAAI,CAACD,WAAW,CAAC,CAAC;MAC5BU,QAAQ,EAAEhF,uDAAS,CAACgF,QAAQ;MAC5BtV,SAAS,EAAE6J,IAAI,CAAC6B,GAAG,CAAC;IACtB,CAAC,CAAC;EACJ;EAEAuf,SAASA,CAACC,KAAK,EAAE;IACf,IAAI,IAAI,CAACvB,MAAM,EAAEU,UAAU,KAAKL,SAAS,CAACM,IAAI,EAAE;MAC9C,OAAO,KAAK;IACd;IACA,IAAI,CAACX,MAAM,CAACwB,IAAI,CAAC9Z,IAAI,CAACS,SAAS,CAACoZ,KAAK,CAAC,CAAC;IACvC,OAAO,IAAI;EACb;EAEAJ,WAAWA,CAACM,OAAO,EAAE;IACnB,IAAIA,OAAO,YAAYC,WAAW,EAAE;MAClC,IAAI,CAAC72B,IAAI,CAAC,kBAAkB,EAAE42B,OAAO,CAAC;MACtC;IACF;IAEA,IAAI5P,OAAO;IACX,IAAI;MACFA,OAAO,GAAG,OAAO4P,OAAO,KAAK,QAAQ,GAAG/Z,IAAI,CAACC,KAAK,CAAC8Z,OAAO,CAAC,GAAGA,OAAO;IACvE,CAAC,CAAC,OAAO50B,KAAK,EAAE;MACd;IACF;IAEA,MAAM0D,IAAI,GAAGshB,OAAO,CAACthB,IAAI,IAAIshB,OAAO,CAACrd,KAAK,IAAIqd,OAAO,CAAC8P,GAAG,IAAI,EAAE;IAC/D,IAAIpxB,IAAI,KAAK,MAAM,IAAIA,IAAI,KAAK,SAAS,IAAIA,IAAI,KAAK,WAAW,EAAE;MACjE;IACF;IACA,IAAIA,IAAI,KAAK,iBAAiB,EAAE;MAC9B,IAAI,CAAC1F,IAAI,CAAC,iBAAiB,EAAEgnB,OAAO,CAAC/oB,QAAQ,IAAI,EAAE,CAAC;MACpD;IACF;IACA,IAAIyH,IAAI,KAAK,sBAAsB,EAAE;MACnC,IAAI,CAAC1F,IAAI,CAAC,sBAAsB,EAAEgnB,OAAO,CAACla,aAAa,IAAI,EAAE,CAAC;MAC9D;IACF;IACA,IAAIpH,IAAI,KAAK,UAAU,IAAIrC,KAAK,CAACkf,OAAO,CAACyE,OAAO,CAACjjB,QAAQ,CAAC,EAAE;MAC1DijB,OAAO,CAACjjB,QAAQ,CACbC,GAAG,CAACxD,OAAO,IAAIq0B,wBAAwB,CAACr0B,OAAO,EAAE,IAAI,CAAC2f,WAAW,EAAE5Y,MAAM,CAAC,CAAC,CAC3E6K,MAAM,CAACrL,OAAO,CAAC,CACfkT,OAAO,CAACzZ,OAAO,IAAI,IAAI,CAACR,IAAI,CAAC,iBAAiB,EAAEQ,OAAO,CAAC,CAAC;MAC5D;IACF;IAEA,MAAMA,OAAO,GAAGq0B,wBAAwB,CAAC7N,OAAO,EAAE,IAAI,CAAC7G,WAAW,EAAE5Y,MAAM,CAAC;IAC3E,IAAI/G,OAAO,EAAE;MACX,IAAI,CAACR,IAAI,CAACQ,OAAO,CAAC6B,SAAS,KAAK,KAAK,GAAG,sBAAsB,GAAG,iBAAiB,EAAE7B,OAAO,CAAC;IAC9F;EACF;EAEA41B,cAAcA,CAAA,EAAG;IACf,IAAI,CAACT,mBAAmB,CAAC,CAAC;IAC1B,IAAI,CAACP,cAAc,GAAGhrB,MAAM,CAACslB,WAAW,CAAC,MAAM;MAC7C,IAAI,CAAC+G,SAAS,CAAC;QAAE/wB,IAAI,EAAE,MAAM;QAAE8F,SAAS,EAAE6J,IAAI,CAAC6B,GAAG,CAAC;MAAE,CAAC,CAAC;IACzD,CAAC,EAAE0c,qBAAqB,CAAC;EAC3B;EAEA+B,mBAAmBA,CAAA,EAAG;IACpB,IAAI,IAAI,CAACP,cAAc,EAAE;MACvBhrB,MAAM,CAAC8iB,aAAa,CAAC,IAAI,CAACkI,cAAc,CAAC;MACzC,IAAI,CAACA,cAAc,GAAG,IAAI;IAC5B;EACF;EAEAc,iBAAiBA,CAAA,EAAG;IAClB,IAAI,CAACR,mBAAmB,CAAC,CAAC;IAC1B,MAAMqB,KAAK,GAAGzuB,IAAI,CAACC,GAAG,CAACurB,gBAAgB,EAAED,gBAAgB,GAAG,CAAC,IAAI,IAAI,CAACyB,iBAAiB,CAAC;IACxF,IAAI,CAACA,iBAAiB,IAAI,CAAC;IAC3B,IAAI,CAACD,cAAc,GAAGjrB,MAAM,CAAC+E,UAAU,CAAC,MAAM;MAC5C,IAAI,CAACsmB,UAAU,CAAC,CAAC;IACnB,CAAC,EAAEsB,KAAK,CAAC;EACX;EAEArB,mBAAmBA,CAAA,EAAG;IACpB,IAAI,IAAI,CAACL,cAAc,EAAE;MACvBjrB,MAAM,CAAC+iB,YAAY,CAAC,IAAI,CAACkI,cAAc,CAAC;MACxC,IAAI,CAACA,cAAc,GAAG,IAAI;IAC5B;EACF;AACF;;;;;;;;;;;AC3OwT;;;;;;;;;;;ACAL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACgCpR;AAC+B;;;;IAE9D,MAAMvoB,aAAa,GAAGD,oFAAoB,CAAC,CAAC;IAC5C,MAAMmqB,SAAS,GAAGn5B,uDAAQ,CAAC,MAAMiP,aAAa,CAACG,cAAc,EAAE5B,GAAG,IAAI,EAAE,CAAC;IAEzE,SAAS8B,aAAaA,CAACC,IAAI,EAAE;MAC3B,IAAIA,IAAI,CAACC,iBAAiB,EAAE;QAC1B,OAAOD,IAAI,CAACC,iBAAiB;MAC/B;MACA,MAAMC,YAAY,GAAGR,aAAa,CAACA,aAAa,CAACtJ,IAAI,CAAC+J,KAAK,IAAIA,KAAK,CAACtJ,EAAE,KAAKmJ,IAAI,CAACI,cAAc,CAAC;MAChG,OAAOF,YAAY,EAAEzG,KAAK,IAAIuG,IAAI,CAACI,cAAc,IAAI,MAAM;IAC7D;IAEA,SAASypB,eAAeA,CAAC7pB,IAAI,EAAE;MAC7B,IAAIA,IAAI,CAAC/I,QAAQ,EAAE;QACjB,OAAO,IAAI+I,IAAI,CAACU,YAAY,IAAI,KAAK,GAAG;MAC1C;MACA,IAAIV,IAAI,CAACW,OAAO,EAAE;QAChB,OAAOX,IAAI,CAACW,OAAO;MACrB;MACA,IAAIX,IAAI,CAACM,IAAI,EAAE;QACb,OAAON,IAAI,CAACM,IAAI;MAClB;MACA,IAAIN,IAAI,CAAC1H,IAAI,KAAK,OAAO,EAAE;QACzB,OAAO,MAAM;MACf;MACA,IAAI0H,IAAI,CAAC1H,IAAI,KAAK,MAAM,EAAE;QACxB,OAAO,QAAQ0H,IAAI,CAACzH,UAAU,EAAEjH,IAAI,IAAI,IAAI,EAAE;MAChD;MACA,OAAO,SAAS;IAClB;IAEA,SAASsP,kBAAkBA,CAACxC,SAAS,EAAE;MACrC,MAAMnN,KAAK,GAAGwJ,MAAM,CAAC2D,SAAS,IAAI,CAAC,CAAC;MACpC,IAAI,CAACnN,KAAK,EAAE;QACV,OAAO,EAAE;MACX;MACA,OAAO,IAAIoN,IAAI,CAACC,cAAc,CAAC,OAAO,EAAE;QACtCwC,KAAK,EAAE,SAAS;QAChBC,GAAG,EAAE,SAAS;QACdxC,IAAI,EAAE,SAAS;QACfC,MAAM,EAAE,SAAS;QACjBC,MAAM,EAAE;MACV,CAAC,CAAC,CAACG,MAAM,CAAC3N,KAAK,CAAC;IAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7EsT;;;;;;;;;;;ACAD;;;;;;;;ACApP;AACL;;AAE5D,oBAAoB,4FAAM;;AAE1B,sDAAe;;;;;;;;;;;;;;ACLsB;AACS;AACoB;AAElE,MAAM64B,2BAA2B,CAAC;EAChCjX,WAAWA,CAAA,EAAG;IACZ,MAAM,IAAIoB,KAAK,CAAC,qCAAqC,CAAC;EACxD;AACF;AAEO,MAAM7R,QAAQ,GAAGsM,uDAAS,CAACqb,OAAO,KAAK,UAAU,GACpD,IAAID,2BAA2B,CAAC,CAAC,GACjCpb,uDAAS,CAACqb,OAAO,KAAK,WAAW,IAAIrb,uDAAS,CAACqb,OAAO,KAAK,MAAM,GAC/D,IAAIjC,oFAAsB,CAAC,CAAC,GAC5B,IAAIlV,gEAAY,CAAC,CAAC;;;;;;;;;ACd+C;AACL;;AAElE,oBAAoB,kGAAM;;AAE1B,sDAAe;;;;;;;;;;;ACLwS;;;;;;;;ACAhP;AACL;;AAElE,oBAAoB,kGAAM;;AAE1B,sDAAe;;;;;;;;ACL+D;AACL;;AAEzE,oBAAoB,yGAAM;;AAE1B,sDAAe;;;;;;;;;;ACLiB;AACI;AACR;AACD;AAE3BqX,wDAAS,CAACE,yDAAG,CAAC,CAACC,GAAG,CAACF,4DAAW,CAAC,CAAC,CAAC,CAACG,KAAK,CAAC,MAAM,CAAC;;;;;;;;ACL2B;AACL;;AAErE,oBAAoB,qGAAM;;AAE1B,sDAAe;;;;;;;;;;;ACLqS;;;;;;;;;;;;;;;;;;;;;;;ACapR;AAC0B;AACI;AACV;AACP;AACU;AACC;AACE;AACI;AACL;AACL;;;;IAEpD,MAAM3qB,aAAa,GAAGD,oFAAoB,CAAC,CAAC;IAC5C,MAAME,UAAU,GAAGR,+EAAkB,CAAC,CAAC;IACvC,MAAMtO,QAAQ,GAAGD,0EAAe,CAAC,CAAC;IAElC0B,yDAAS,CAAC,MAAM;MACdoN,aAAa,CAACmC,0BAA0B,CAAC,CAAC;MAC1ChR,QAAQ,CAACmJ,eAAe,CAAC,CAAC;IAC5B,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AChCwE;AACL;;AAErE,oBAAoB,qGAAM;;AAE1B,sDAAe;;;;;;;;;;;ACLyR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACyMpN;AACjC;AACM;AACL;AAwEpD,MAAM6wB,gBAAgB,GAAG,GAAG;;;;IAtE5B,MAAMvoB,OAAO,GAAGD,yEAAe,CAAC,CAAC;IACjC,MAAM1C,UAAU,GAAGR,+EAAkB,CAAC,CAAC;IACvC,MAAMtO,QAAQ,GAAGD,0EAAe,CAAC,CAAC;IAClC,MAAMk6B,aAAa,GAAG,CACpB;MAAE7sB,GAAG,EAAE,eAAe;MAAE7I,KAAK,EAAE;IAAO,CAAC,EACvC;MAAE6I,GAAG,EAAE,UAAU;MAAE7I,KAAK,EAAE;IAAO,CAAC,EAClC;MAAE6I,GAAG,EAAE,QAAQ;MAAE7I,KAAK,EAAE;IAAO,CAAC,EAChC;MAAE6I,GAAG,EAAE,UAAU;MAAE7I,KAAK,EAAE;IAAO,CAAC,EAClC;MAAE6I,GAAG,EAAE,UAAU;MAAE7I,KAAK,EAAE;IAAO,EAClC;IACD,MAAM21B,QAAQ,GAAGt6B,uDAAQ,CAAC,MAAM,CAAC6R,OAAO,CAACjR,WAAW,IAAIiR,OAAO,CAACnI,MAAM,IAAI,GAAG,EAAElB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,CAAC;IACzG,MAAM8xB,YAAY,GAAGt6B,kDAAG,CAAC,KAAK,CAAC;IAC/B,MAAMu6B,eAAe,GAAGv6B,kDAAG,CAAC,UAAU,CAAC;IACvC,MAAMw6B,cAAc,GAAGx6B,kDAAG,CAAC,KAAK,CAAC;IACjC,MAAMy6B,cAAc,GAAGz6B,kDAAG,CAAC,EAAE,CAAC;IAC9B,MAAM06B,aAAa,GAAG16B,kDAAG,CAAC,EAAE,CAAC;IAC7B,MAAM26B,WAAW,GAAG36B,kDAAG,CAAC,KAAK,CAAC;IAC9B,MAAM46B,aAAa,GAAG56B,kDAAG,CAAC,KAAK,CAAC;IAChC,MAAM66B,aAAa,GAAG76B,kDAAG,CAAC,EAAE,CAAC;IAC7B,MAAM86B,YAAY,GAAG96B,kDAAG,CAAC,EAAE,CAAC;IAC5B,MAAM+6B,WAAW,GAAG/6B,kDAAG,CAAC,IAAI,CAAC;IAC7B,MAAMg7B,cAAc,GAAGh7B,kDAAG,CAAC,EAAE,CAAC;IAC9B,MAAMi7B,aAAa,GAAGj7B,kDAAG,CAAC,IAAI,CAAC;IAC/B,MAAMk7B,aAAa,GAAGl7B,kDAAG,CAAC,IAAI,CAAC;IAC/B,MAAMm7B,oBAAoB,GAAGn7B,kDAAG,CAAC,IAAI,CAAC;IACtC,MAAM6S,YAAY,GAAG7S,kDAAG,CAAC;MACvBW,WAAW,EAAE;IACf,CAAC,CAAC;IACF,MAAMy6B,aAAa,GAAGv5B,uDAAQ,CAAC;MAC7BqmB,WAAW,EAAE,EAAE;MACfC,WAAW,EAAE,EAAE;MACfkT,eAAe,EAAE;IACnB,CAAC,CAAC;IACF,MAAMC,gBAAgB,GAAGv7B,uDAAQ,CAAC,MAAMi7B,cAAc,CAACz6B,KAAK,IAAIqR,OAAO,CAACpO,QAAQ,IAAI,EAAE,CAAC;IACvF,MAAM+3B,kBAAkB,GAAGx7B,uDAAQ,CAAC,MAAMq6B,aAAa,CAAC10B,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAAC/B,GAAG,KAAKgtB,eAAe,CAACh6B,KAAK,CAAC,IAAI65B,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7H,MAAMoB,mBAAmB,GAAG35B,uDAAQ,CAAC;MACnC45B,IAAI,EAAE,KAAK;MACX74B,GAAG,EAAE,EAAE;MACPC,KAAK,EAAE,CAAC;MACRE,OAAO,EAAE,CAAC;MACVC,OAAO,EAAE,CAAC;MACVC,QAAQ,EAAE,KAAK;MACfC,UAAU,EAAE,CAAC;MACbC,UAAU,EAAE,CAAC;MACbC,WAAW,EAAE,CAAC;MACdC,WAAW,EAAE;IACf,CAAC,CAAC;IACF,MAAMq4B,aAAa,GAAG75B,uDAAQ,CAAC;MAC7B45B,IAAI,EAAE,KAAK;MACXE,MAAM,EAAE,KAAK;MACbC,IAAI,EAAE,KAAK;MACX13B,KAAK,EAAE,EAAE;MACT23B,SAAS,EAAE,EAAE;MACbC,QAAQ,EAAE,YAAY;MACtBC,KAAK,EAAE,IAAI;MACXC,SAAS,EAAE,CAAC;MACZn5B,KAAK,EAAE,CAAC;MACRC,QAAQ,EAAE,CAAC;MACXC,OAAO,EAAE,CAAC;MACVC,OAAO,EAAE,CAAC;MACVC,QAAQ,EAAE,KAAK;MACfC,UAAU,EAAE,CAAC;MACbC,UAAU,EAAE,CAAC;MACbC,WAAW,EAAE,CAAC;MACdC,WAAW,EAAE;IACf,CAAC,CAAC;IACF,MAAM44B,kBAAkB,GAAGl8B,uDAAQ,CAAC,OAAO;MACzCqE,SAAS,EAAE,eAAeo3B,mBAAmB,CAACz4B,OAAO,OAAOy4B,mBAAmB,CAACx4B,OAAO,gBAAgBw4B,mBAAmB,CAAC34B,KAAK;IAClI,CAAC,CAAC,CAAC;IAIHjB,wDAAS,CAAC,MAAM;MACdgQ,OAAO,CAACyjB,cAAc,CAAC,CAAC;MACxB/oB,MAAM,CAAC1F,gBAAgB,CAAC,QAAQ,EAAEs1B,iBAAiB,CAAC;IACtD,CAAC,CAAC;IAEFv6B,8DAAe,CAAC,MAAM;MACpBw6B,oBAAoB,CAAC,CAAC;MACtBC,kBAAkB,CAAC,CAAC;MACpB9vB,MAAM,CAACrF,mBAAmB,CAAC,QAAQ,EAAEi1B,iBAAiB,CAAC;IACzD,CAAC,CAAC;IAEF,SAASrtB,YAAYA,CAAA,EAAG;MACtBI,UAAU,CAACJ,YAAY,CAAC,CAAC;MACzB1O,QAAQ,CAACmJ,eAAe,CAAC,CAAC;IAC5B;IAEA,SAAS+yB,oBAAoBA,CAAA,EAAG;MAC9BxB,aAAa,CAACt6B,KAAK,GAAG,EAAE;MACxBu6B,YAAY,CAACv6B,KAAK,GAAG,EAAE;IACzB;IAEA,SAAS+7B,qBAAqBA,CAAA,EAAG;MAC/B7B,cAAc,CAACl6B,KAAK,GAAG,EAAE;MACzBm6B,aAAa,CAACn6B,KAAK,GAAG,EAAE;IAC1B;IAEA,SAASg8B,kBAAkBA,CAAA,EAAG;MAC5BnB,aAAa,CAAClT,WAAW,GAAG,EAAE;MAC9BkT,aAAa,CAACjT,WAAW,GAAG,EAAE;MAC9BiT,aAAa,CAACC,eAAe,GAAG,EAAE;IACpC;IAEA,SAASmB,YAAYA,CAAA,EAAG;MACtBlC,YAAY,CAAC/5B,KAAK,GAAG,IAAI;MACzBg6B,eAAe,CAACh6B,KAAK,GAAG,UAAU;MAClC+7B,qBAAqB,CAAC,CAAC;IACzB;IAEA,SAASG,aAAaA,CAAA,EAAG;MACvB,IAAIjC,cAAc,CAACj6B,KAAK,EAAE;QACxB;MACF;MACA+5B,YAAY,CAAC/5B,KAAK,GAAG,KAAK;MAC1B+7B,qBAAqB,CAAC,CAAC;MACvBC,kBAAkB,CAAC,CAAC;IACtB;IAEA,SAASG,qBAAqBA,CAAChuB,OAAO,EAAE;MACtC6rB,eAAe,CAACh6B,KAAK,GAAGmO,OAAO;MAC/B4tB,qBAAqB,CAAC,CAAC;IACzB;IAEA,SAASH,oBAAoBA,CAAA,EAAG;MAC9B,IAAInB,cAAc,CAACz6B,KAAK,EAAE;QACxB8L,GAAG,CAACswB,eAAe,CAAC3B,cAAc,CAACz6B,KAAK,CAAC;QACzCy6B,cAAc,CAACz6B,KAAK,GAAG,EAAE;MAC3B;IACF;IAEA,SAASq8B,sBAAsBA,CAAA,EAAG;MAChC,IAAIlB,aAAa,CAACG,SAAS,EAAE;QAC3BxvB,GAAG,CAACswB,eAAe,CAACjB,aAAa,CAACG,SAAS,CAAC;QAC5CH,aAAa,CAACG,SAAS,GAAG,EAAE;MAC9B;IACF;IAEA,eAAegB,iBAAiBA,CAAA,EAAG;MACjClC,WAAW,CAACp6B,KAAK,GAAG,IAAI;MACxB87B,oBAAoB,CAAC,CAAC;MACtBxpB,YAAY,CAACtS,KAAK,CAACI,WAAW,GAAGiR,OAAO,CAACjR,WAAW,IAAIiR,OAAO,CAACnI,MAAM,IAAI,EAAE;MAC5E,MAAMf,OAAO,GAAG,MAAMkJ,OAAO,CAACyjB,cAAc,CAAC,CAAC;MAC9C,IAAIsF,WAAW,CAACp6B,KAAK,IAAImI,OAAO,EAAE;QAChCmK,YAAY,CAACtS,KAAK,CAACI,WAAW,GAAGiR,OAAO,CAACjR,WAAW,IAAIiR,OAAO,CAACnI,MAAM,IAAI,EAAE;MAC9E;IACF;IAEA,SAASqzB,kBAAkBA,CAAA,EAAG;MAC5BnC,WAAW,CAACp6B,KAAK,GAAG,KAAK;MACzBw6B,WAAW,CAACx6B,KAAK,GAAG,IAAI;MACxB87B,oBAAoB,CAAC,CAAC;MACtBF,oBAAoB,CAAC,CAAC;MACtBY,kBAAkB,CAAC,CAAC;MACpBX,kBAAkB,CAAC,CAAC;IACtB;IAEA,SAASY,cAAcA,CAACnxB,KAAK,EAAE;MAC7B,MAAM6P,IAAI,GAAG7P,KAAK,CAAC8H,MAAM,CAACmI,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI;MAC5CjQ,KAAK,CAAC8H,MAAM,CAACpT,KAAK,GAAG,EAAE;MACvB87B,oBAAoB,CAAC,CAAC;MACtB,IAAI3gB,IAAI,EAAE;QACRuhB,iBAAiB,CAACvhB,IAAI,CAAC;MACzB;IACF;IAEA,SAASwhB,kBAAkBA,CAAA,EAAG;MAC5BjC,aAAa,CAAC16B,KAAK,EAAE2M,KAAK,CAAC,CAAC;IAC9B;IAEA,SAASiwB,iBAAiBA,CAAA,EAAG;MAC3B,IAAI,CAAC7B,gBAAgB,CAAC/6B,KAAK,EAAE;QAC3B;MACF;MACAi7B,mBAAmB,CAACC,IAAI,GAAG,IAAI;MAC/BD,mBAAmB,CAAC54B,GAAG,GAAG04B,gBAAgB,CAAC/6B,KAAK;MAChD68B,kBAAkB,CAAC,CAAC;IACtB;IAEA,SAASL,kBAAkBA,CAAA,EAAG;MAC5BvB,mBAAmB,CAACC,IAAI,GAAG,KAAK;MAChCD,mBAAmB,CAACv4B,QAAQ,GAAG,KAAK;IACtC;IAEA,SAASm6B,kBAAkBA,CAAA,EAAG;MAC5B5B,mBAAmB,CAAC34B,KAAK,GAAG,CAAC;MAC7B24B,mBAAmB,CAACz4B,OAAO,GAAG,CAAC;MAC/By4B,mBAAmB,CAACx4B,OAAO,GAAG,CAAC;IACjC;IAEA,SAASq6B,iBAAiBA,CAACvxB,MAAM,EAAE;MACjC0vB,mBAAmB,CAAC34B,KAAK,GAAG2H,IAAI,CAACE,GAAG,CAAC,GAAG,EAAEF,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEV,MAAM,CAAC,CAACyxB,mBAAmB,CAAC34B,KAAK,GAAGiJ,MAAM,EAAE9B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MAC/G,IAAIwxB,mBAAmB,CAAC34B,KAAK,IAAI,CAAC,EAAE;QAClC24B,mBAAmB,CAACz4B,OAAO,GAAG,CAAC;QAC/By4B,mBAAmB,CAACx4B,OAAO,GAAG,CAAC;MACjC;IACF;IAEA,SAASs6B,wBAAwBA,CAACzxB,KAAK,EAAE;MACvCwxB,iBAAiB,CAACxxB,KAAK,CAACE,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;IACvD;IAEA,SAASwxB,sBAAsBA,CAAC1xB,KAAK,EAAE;MACrC,IAAI2vB,mBAAmB,CAAC34B,KAAK,IAAI,CAAC,EAAE;QAClC;MACF;MACA24B,mBAAmB,CAACv4B,QAAQ,GAAG,IAAI;MACnCu4B,mBAAmB,CAACt4B,UAAU,GAAG2I,KAAK,CAACG,OAAO;MAC9CwvB,mBAAmB,CAACr4B,UAAU,GAAG0I,KAAK,CAACI,OAAO;MAC9CuvB,mBAAmB,CAACp4B,WAAW,GAAGo4B,mBAAmB,CAACz4B,OAAO;MAC7Dy4B,mBAAmB,CAACn4B,WAAW,GAAGm4B,mBAAmB,CAACx4B,OAAO;MAC7D6I,KAAK,CAAC2xB,aAAa,CAACC,iBAAiB,GAAG5xB,KAAK,CAAC6xB,SAAS,CAAC;IAC1D;IAEA,SAASC,qBAAqBA,CAAC9xB,KAAK,EAAE;MACpC,IAAI,CAAC2vB,mBAAmB,CAACv4B,QAAQ,EAAE;QACjC;MACF;MACAu4B,mBAAmB,CAACz4B,OAAO,GAAGy4B,mBAAmB,CAACp4B,WAAW,GAAGyI,KAAK,CAACG,OAAO,GAAGwvB,mBAAmB,CAACt4B,UAAU;MAC9Gs4B,mBAAmB,CAACx4B,OAAO,GAAGw4B,mBAAmB,CAACn4B,WAAW,GAAGwI,KAAK,CAACI,OAAO,GAAGuvB,mBAAmB,CAACr4B,UAAU;IAChH;IAEA,SAASy6B,qBAAqBA,CAAA,EAAG;MAC/BpC,mBAAmB,CAACv4B,QAAQ,GAAG,KAAK;IACtC;IAEA,SAAS46B,YAAYA,CAAChyB,KAAK,EAAE;MAC3B,MAAM6P,IAAI,GAAGnW,KAAK,CAACC,IAAI,CAACqG,KAAK,CAAC4Q,YAAY,EAAEX,KAAK,IAAI,EAAE,CAAC,CAACpW,IAAI,CAAC4J,IAAI,IAAIA,IAAI,CAAC1H,IAAI,CAACgU,UAAU,CAAC,QAAQ,CAAC,CAAC;MACrG,IAAIF,IAAI,EAAE;QACR2gB,oBAAoB,CAAC,CAAC;QACtBY,iBAAiB,CAACvhB,IAAI,CAAC;MACzB;IACF;IAEA,SAASoiB,gBAAgBA,CAAA,EAAG;MAC1B,MAAMC,MAAM,GAAG7C,aAAa,CAAC36B,KAAK;MAClC,MAAMyK,IAAI,GAAG+yB,MAAM,EAAE9yB,qBAAqB,CAAC,CAAC;MAC5C,MAAMG,KAAK,GAAGZ,IAAI,CAACE,GAAG,CAAC,GAAG,EAAEF,IAAI,CAACwzB,KAAK,CAAChzB,IAAI,EAAEI,KAAK,IAAI,GAAG,CAAC,CAAC;MAC3D,MAAMG,MAAM,GAAGf,IAAI,CAACE,GAAG,CAAC,GAAG,EAAEF,IAAI,CAACwzB,KAAK,CAAChzB,IAAI,EAAEO,MAAM,IAAI,GAAG,CAAC,CAAC;MAC7D,OAAO;QAAEH,KAAK;QAAEG;MAAO,CAAC;IAC1B;IAEA,SAAS0yB,cAAcA,CAAA,EAAG;MACxB,MAAM;QAAE7yB,KAAK;QAAEG;MAAO,CAAC,GAAGuyB,gBAAgB,CAAC,CAAC;MAC5C,OAAOtzB,IAAI,CAACwzB,KAAK,CAACxzB,IAAI,CAACC,GAAG,CAACW,KAAK,EAAEG,MAAM,CAAC,GAAG,IAAI,CAAC;IACnD;IAEA,SAAS2yB,gBAAgBA,CAAA,EAAG;MAC1B,MAAMnC,KAAK,GAAGL,aAAa,CAACK,KAAK;MACjC,IAAI,CAACA,KAAK,EAAE;QACV,OAAO;UAAE3wB,KAAK,EAAE,CAAC;UAAEG,MAAM,EAAE;QAAE,CAAC;MAChC;MACA,MAAM4yB,WAAW,GAAG3zB,IAAI,CAAC0W,GAAG,CAACwa,aAAa,CAAC54B,QAAQ,GAAG,GAAG,CAAC,KAAK,EAAE;MACjE,OAAO;QACLsI,KAAK,EAAE+yB,WAAW,GAAGpC,KAAK,CAACqC,aAAa,GAAGrC,KAAK,CAACsC,YAAY;QAC7D9yB,MAAM,EAAE4yB,WAAW,GAAGpC,KAAK,CAACsC,YAAY,GAAGtC,KAAK,CAACqC;MACnD,CAAC;IACH;IAEA,SAASE,kBAAkBA,CAAA,EAAG;MAC5B,MAAMC,QAAQ,GAAGN,cAAc,CAAC,CAAC;MACjC,MAAMO,OAAO,GAAGN,gBAAgB,CAAC,CAAC;MAClC,MAAMO,WAAW,GAAGD,OAAO,CAACpzB,KAAK,GAAGswB,aAAa,CAAC74B,KAAK;MACvD,MAAM67B,YAAY,GAAGF,OAAO,CAACjzB,MAAM,GAAGmwB,aAAa,CAAC74B,KAAK;MACzD,MAAM87B,IAAI,GAAGn0B,IAAI,CAACE,GAAG,CAAC,CAAC,EAAE,CAAC+zB,WAAW,GAAGF,QAAQ,IAAI,CAAC,CAAC;MACtD,MAAMK,IAAI,GAAGp0B,IAAI,CAACE,GAAG,CAAC,CAAC,EAAE,CAACg0B,YAAY,GAAGH,QAAQ,IAAI,CAAC,CAAC;MACvD7C,aAAa,CAAC34B,OAAO,GAAGyH,IAAI,CAACE,GAAG,CAAC,CAACi0B,IAAI,EAAEn0B,IAAI,CAACC,GAAG,CAACk0B,IAAI,EAAEjD,aAAa,CAAC34B,OAAO,CAAC,CAAC;MAC9E24B,aAAa,CAAC14B,OAAO,GAAGwH,IAAI,CAACE,GAAG,CAAC,CAACk0B,IAAI,EAAEp0B,IAAI,CAACC,GAAG,CAACm0B,IAAI,EAAElD,aAAa,CAAC14B,OAAO,CAAC,CAAC;IAChF;IAEA,SAAS67B,sBAAsBA,CAAA,EAAG;MAChC,MAAMN,QAAQ,GAAGN,cAAc,CAAC,CAAC;MACjC,MAAMO,OAAO,GAAGN,gBAAgB,CAAC,CAAC;MAClCxC,aAAa,CAACM,SAAS,GAAGxxB,IAAI,CAACE,GAAG,CAAC6zB,QAAQ,GAAGC,OAAO,CAACpzB,KAAK,EAAEmzB,QAAQ,GAAGC,OAAO,CAACjzB,MAAM,CAAC;MACvFmwB,aAAa,CAAC74B,KAAK,GAAG2H,IAAI,CAACE,GAAG,CAACgxB,aAAa,CAACM,SAAS,EAAEN,aAAa,CAAC74B,KAAK,IAAI64B,aAAa,CAACM,SAAS,CAAC;IACzG;IAEA,SAAS8C,eAAeA,CAACf,MAAM,EAAE3yB,KAAK,EAAEG,MAAM,EAAEwzB,WAAW,GAAG,CAAC,EAAEC,QAAQ,GAAG,KAAK,EAAE;MACjF,MAAMjD,KAAK,GAAGL,aAAa,CAACK,KAAK;MACjC,IAAI,CAACgC,MAAM,IAAI,CAAChC,KAAK,EAAE;QACrB;MACF;MAEA,MAAMkD,GAAG,GAAGD,QAAQ,GAAG,CAAC,GAAI1yB,MAAM,CAAC4yB,gBAAgB,IAAI,CAAE;MACzDnB,MAAM,CAAC3yB,KAAK,GAAGZ,IAAI,CAACwzB,KAAK,CAAC5yB,KAAK,GAAG6zB,GAAG,CAAC;MACtClB,MAAM,CAACxyB,MAAM,GAAGf,IAAI,CAACwzB,KAAK,CAACzyB,MAAM,GAAG0zB,GAAG,CAAC;MACxC,MAAME,OAAO,GAAGpB,MAAM,CAACqB,UAAU,CAAC,IAAI,CAAC;MACvCD,OAAO,CAACE,YAAY,CAACJ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAEA,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;MAC1CE,OAAO,CAACG,SAAS,CAAC,CAAC,EAAE,CAAC,EAAEl0B,KAAK,EAAEG,MAAM,CAAC;MACtC4zB,OAAO,CAACI,SAAS,GAAG,SAAS;MAC7BJ,OAAO,CAACK,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAEp0B,KAAK,EAAEG,MAAM,CAAC;MACrC4zB,OAAO,CAACM,IAAI,CAAC,CAAC;MACdN,OAAO,CAACO,SAAS,CAACt0B,KAAK,GAAG,CAAC,GAAGswB,aAAa,CAAC34B,OAAO,GAAGg8B,WAAW,EAAExzB,MAAM,GAAG,CAAC,GAAGmwB,aAAa,CAAC14B,OAAO,GAAG+7B,WAAW,CAAC;MACpHI,OAAO,CAACQ,MAAM,CAAEjE,aAAa,CAAC54B,QAAQ,GAAG0H,IAAI,CAACo1B,EAAE,GAAI,GAAG,CAAC;MACxDT,OAAO,CAACt8B,KAAK,CAAC64B,aAAa,CAAC74B,KAAK,GAAGk8B,WAAW,EAAErD,aAAa,CAAC74B,KAAK,GAAGk8B,WAAW,CAAC;MACnFI,OAAO,CAACU,SAAS,CAAC9D,KAAK,EAAE,CAACA,KAAK,CAACsC,YAAY,GAAG,CAAC,EAAE,CAACtC,KAAK,CAACqC,aAAa,GAAG,CAAC,CAAC;MAC3Ee,OAAO,CAACxhB,OAAO,CAAC,CAAC;MAEjB,IAAI,CAACqhB,QAAQ,EAAE;QACb,MAAMT,QAAQ,GAAGN,cAAc,CAAC,CAAC;QACjCkB,OAAO,CAACM,IAAI,CAAC,CAAC;QACdN,OAAO,CAACI,SAAS,GAAG,wBAAwB;QAC5CJ,OAAO,CAACW,SAAS,CAAC,CAAC;QACnBX,OAAO,CAACn0B,IAAI,CAAC,CAAC,EAAE,CAAC,EAAEI,KAAK,EAAEG,MAAM,CAAC;QACjC4zB,OAAO,CAACn0B,IAAI,CAAC,CAACI,KAAK,GAAGmzB,QAAQ,IAAI,CAAC,EAAE,CAAChzB,MAAM,GAAGgzB,QAAQ,IAAI,CAAC,EAAEA,QAAQ,EAAEA,QAAQ,CAAC;QACjFY,OAAO,CAACY,IAAI,CAAC,SAAS,CAAC;QACvBZ,OAAO,CAACxhB,OAAO,CAAC,CAAC;MACnB;IACF;IAEA,SAASue,iBAAiBA,CAAA,EAAG;MAC3B,IAAI,CAACR,aAAa,CAACD,IAAI,IAAI,CAACC,aAAa,CAACC,MAAM,EAAE;QAChD;MACF;MACA2C,kBAAkB,CAAC,CAAC;MACpB,MAAM;QAAElzB,KAAK;QAAEG;MAAO,CAAC,GAAGuyB,gBAAgB,CAAC,CAAC;MAC5CgB,eAAe,CAAC5D,aAAa,CAAC36B,KAAK,EAAE6K,KAAK,EAAEG,MAAM,CAAC;MACnD,MAAMy0B,aAAa,GAAG7E,oBAAoB,CAAC56B,KAAK;MAChD,IAAIy/B,aAAa,EAAE;QACjBlB,eAAe,CAACkB,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG/B,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC;MACxE;IACF;IAEA,SAASgC,qBAAqBA,CAAA,EAAG;MAC/B,IAAI,CAACvE,aAAa,CAACK,KAAK,EAAE;QACxB;MACF;MACAL,aAAa,CAAC54B,QAAQ,GAAG,CAAC;MAC1B44B,aAAa,CAAC34B,OAAO,GAAG,CAAC;MACzB24B,aAAa,CAAC14B,OAAO,GAAG,CAAC;MACzB67B,sBAAsB,CAAC,CAAC;MACxBnD,aAAa,CAAC74B,KAAK,GAAG64B,aAAa,CAACM,SAAS;MAC7CE,iBAAiB,CAAC,CAAC;IACrB;IAEA,SAASe,iBAAiBA,CAACvhB,IAAI,EAAE;MAC/B,IAAI,CAACA,IAAI,CAAC9T,IAAI,CAACgU,UAAU,CAAC,QAAQ,CAAC,EAAE;QACnCkf,YAAY,CAACv6B,KAAK,GAAG,SAAS;QAC9B;MACF;MACA,IAAImb,IAAI,CAAC7R,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE;QAC/BixB,YAAY,CAACv6B,KAAK,GAAG,aAAa;QAClC;MACF;MAEA67B,kBAAkB,CAAC,CAAC;MACpBV,aAAa,CAACD,IAAI,GAAG,IAAI;MACzBC,aAAa,CAACC,MAAM,GAAG,KAAK;MAC5BD,aAAa,CAACx3B,KAAK,GAAG,EAAE;MACxBw3B,aAAa,CAACI,QAAQ,GAAGpgB,IAAI,CAAC9a,IAAI,IAAI,YAAY;MAClD86B,aAAa,CAACG,SAAS,GAAGxvB,GAAG,CAACyZ,eAAe,CAACpK,IAAI,CAAC;MACnD,MAAMqgB,KAAK,GAAG,IAAImE,KAAK,CAAC,CAAC;MACzBnE,KAAK,CAACoE,MAAM,GAAG,MAAM;QACnBzE,aAAa,CAACK,KAAK,GAAGA,KAAK;QAC3BL,aAAa,CAACC,MAAM,GAAG,IAAI;QAC3Bj6B,uDAAQ,CAACu+B,qBAAqB,CAAC;MACjC,CAAC;MACDlE,KAAK,CAACtD,OAAO,GAAG,MAAM;QACpBiD,aAAa,CAACx3B,KAAK,GAAG,QAAQ;QAC9Bw3B,aAAa,CAACC,MAAM,GAAG,KAAK;MAC9B,CAAC;MACDI,KAAK,CAACqE,GAAG,GAAG1E,aAAa,CAACG,SAAS;IACrC;IAEA,SAASO,kBAAkBA,CAAA,EAAG;MAC5BV,aAAa,CAACD,IAAI,GAAG,KAAK;MAC1BC,aAAa,CAACC,MAAM,GAAG,KAAK;MAC5BD,aAAa,CAACE,IAAI,GAAG,KAAK;MAC1BF,aAAa,CAACx3B,KAAK,GAAG,EAAE;MACxBw3B,aAAa,CAACK,KAAK,GAAG,IAAI;MAC1BL,aAAa,CAACz4B,QAAQ,GAAG,KAAK;MAC9B25B,sBAAsB,CAAC,CAAC;IAC1B;IAEA,SAASyD,WAAWA,CAACv0B,MAAM,EAAE;MAC3B,IAAI,CAAC4vB,aAAa,CAACC,MAAM,EAAE;QACzB;MACF;MACAkD,sBAAsB,CAAC,CAAC;MACxBnD,aAAa,CAAC74B,KAAK,GAAG2H,IAAI,CAACE,GAAG,CAACgxB,aAAa,CAACM,SAAS,EAAExxB,IAAI,CAACC,GAAG,CAACixB,aAAa,CAACM,SAAS,GAAG,CAAC,EAAEN,aAAa,CAAC74B,KAAK,GAAGiJ,MAAM,CAAC,CAAC;MAC5HowB,iBAAiB,CAAC,CAAC;IACrB;IAEA,SAASoE,aAAaA,CAACC,OAAO,EAAE;MAC9B,IAAI,CAAC7E,aAAa,CAACC,MAAM,EAAE;QACzB;MACF;MACAD,aAAa,CAAC54B,QAAQ,GAAG,CAAC44B,aAAa,CAAC54B,QAAQ,GAAGy9B,OAAO,GAAG,GAAG,IAAI,GAAG;MACvE1B,sBAAsB,CAAC,CAAC;MACxBP,kBAAkB,CAAC,CAAC;MACpBpC,iBAAiB,CAAC,CAAC;IACrB;IAEA,SAASsE,kBAAkBA,CAAC30B,KAAK,EAAE;MACjCw0B,WAAW,CAACx0B,KAAK,CAACE,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;IACjD;IAEA,SAAS00B,gBAAgBA,CAAC50B,KAAK,EAAE;MAC/B,IAAI,CAAC6vB,aAAa,CAACC,MAAM,EAAE;QACzB;MACF;MACAD,aAAa,CAACz4B,QAAQ,GAAG,IAAI;MAC7By4B,aAAa,CAACx4B,UAAU,GAAG2I,KAAK,CAACG,OAAO;MACxC0vB,aAAa,CAACv4B,UAAU,GAAG0I,KAAK,CAACI,OAAO;MACxCyvB,aAAa,CAACt4B,WAAW,GAAGs4B,aAAa,CAAC34B,OAAO;MACjD24B,aAAa,CAACr4B,WAAW,GAAGq4B,aAAa,CAAC14B,OAAO;MACjD6I,KAAK,CAAC2xB,aAAa,CAACC,iBAAiB,GAAG5xB,KAAK,CAAC6xB,SAAS,CAAC;IAC1D;IAEA,SAASgD,eAAeA,CAAC70B,KAAK,EAAE;MAC9B,IAAI,CAAC6vB,aAAa,CAACz4B,QAAQ,EAAE;QAC3B;MACF;MACAy4B,aAAa,CAAC34B,OAAO,GAAG24B,aAAa,CAACt4B,WAAW,GAAGyI,KAAK,CAACG,OAAO,GAAG0vB,aAAa,CAACx4B,UAAU;MAC5Fw4B,aAAa,CAAC14B,OAAO,GAAG04B,aAAa,CAACr4B,WAAW,GAAGwI,KAAK,CAACI,OAAO,GAAGyvB,aAAa,CAACv4B,UAAU;MAC5F+4B,iBAAiB,CAAC,CAAC;IACrB;IAEA,SAASyE,eAAeA,CAAA,EAAG;MACzBjF,aAAa,CAACz4B,QAAQ,GAAG,KAAK;IAChC;IAEA,SAAS29B,YAAYA,CAAC7C,MAAM,EAAEn2B,IAAI,GAAG,YAAY,EAAEi5B,OAAO,GAAG,GAAG,EAAE;MAChE,OAAO,IAAIC,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;QACtCjD,MAAM,CAACkD,MAAM,CAACC,IAAI,IAAI;UACpB,IAAIA,IAAI,EAAE;YACRH,OAAO,CAACG,IAAI,CAAC;UACf,CAAC,MAAM;YACLF,MAAM,CAAC,IAAIzd,KAAK,CAAC,QAAQ,CAAC,CAAC;UAC7B;QACF,CAAC,EAAE3b,IAAI,EAAEi5B,OAAO,CAAC;MACnB,CAAC,CAAC;IACJ;IAEA,eAAeM,iBAAiBA,CAAA,EAAG;MACjC,IAAI,CAACzF,aAAa,CAACC,MAAM,IAAID,aAAa,CAACE,IAAI,EAAE;QAC/C;MACF;MACAF,aAAa,CAACE,IAAI,GAAG,IAAI;MACzBF,aAAa,CAACx3B,KAAK,GAAG,EAAE;MACxB,IAAI;QACF,MAAMk9B,YAAY,GAAGz6B,QAAQ,CAACiG,aAAa,CAAC,QAAQ,CAAC;QACrDkyB,eAAe,CAACsC,YAAY,EAAEjH,gBAAgB,EAAEA,gBAAgB,EAAEA,gBAAgB,GAAG8D,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC;QAC5G,MAAMiD,IAAI,GAAG,MAAMN,YAAY,CAACQ,YAAY,CAAC;QAC7C,MAAMtF,QAAQ,GAAGJ,aAAa,CAACI,QAAQ,CAACjoB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,QAAQ;QAC3E,MAAMwtB,WAAW,GAAG,IAAIplB,IAAI,CAAC,CAACilB,IAAI,CAAC,EAAE,GAAGpF,QAAQ,MAAM,EAAE;UAAEl0B,IAAI,EAAE;QAAa,CAAC,CAAC;QAC/EmzB,WAAW,CAACx6B,KAAK,GAAG8gC,WAAW;QAC/BlF,oBAAoB,CAAC,CAAC;QACtBnB,cAAc,CAACz6B,KAAK,GAAG8L,GAAG,CAACyZ,eAAe,CAACub,WAAW,CAAC;QACvDjF,kBAAkB,CAAC,CAAC;MACtB,CAAC,CAAC,OAAOl4B,KAAK,EAAE;QACdw3B,aAAa,CAACx3B,KAAK,GAAGA,KAAK,CAACxB,OAAO,IAAI,QAAQ;MACjD,CAAC,SAAS;QACRg5B,aAAa,CAACE,IAAI,GAAG,KAAK;MAC5B;IACF;IAEA,eAAejG,WAAWA,CAAA,EAAG;MAC3B,IAAIiF,aAAa,CAACr6B,KAAK,IAAI,CAACsS,YAAY,CAACtS,KAAK,CAACI,WAAW,EAAE;QAC1D;MACF;MACA07B,oBAAoB,CAAC,CAAC;MACtBzB,aAAa,CAACr6B,KAAK,GAAG,IAAI;MAC1B,IAAI;QACF,MAAMqR,OAAO,CAAC+jB,WAAW,CAAC;UACxBh1B,WAAW,EAAEkS,YAAY,CAACtS,KAAK,CAACI,WAAW;UAC3CqnB,YAAY,EAAE+S,WAAW,CAACx6B;QAC5B,CAAC,CAAC;QACFw6B,WAAW,CAACx6B,KAAK,GAAG,IAAI;QACxB47B,oBAAoB,CAAC,CAAC;QACtBtB,aAAa,CAACt6B,KAAK,GAAG,OAAO;QAC7BJ,QAAQ,CAACmJ,eAAe,CAAC;UAAEC,KAAK,EAAE;QAAK,CAAC,CAAC;MAC3C,CAAC,CAAC,OAAOrF,KAAK,EAAE;QACd42B,YAAY,CAACv6B,KAAK,GAAG2D,KAAK,CAACxB,OAAO,IAAI,QAAQ;MAChD,CAAC,SAAS;QACRk4B,aAAa,CAACr6B,KAAK,GAAG,KAAK;MAC7B;IACF;IAEA,eAAe+gC,YAAYA,CAAA,EAAG;MAC5B,IAAI9G,cAAc,CAACj6B,KAAK,EAAE;QACxB;MACF;MACA+7B,qBAAqB,CAAC,CAAC;MACvB,MAAMpU,WAAW,GAAGkT,aAAa,CAAClT,WAAW;MAC7C,MAAMC,WAAW,GAAGiT,aAAa,CAACjT,WAAW;MAC7C,MAAMkT,eAAe,GAAGD,aAAa,CAACC,eAAe;MACrD,IAAI,CAACnT,WAAW,IAAI,CAACC,WAAW,IAAI,CAACkT,eAAe,EAAE;QACpDX,aAAa,CAACn6B,KAAK,GAAG,SAAS;QAC/B;MACF;MACA,IAAI4nB,WAAW,KAAKkT,eAAe,EAAE;QACnCX,aAAa,CAACn6B,KAAK,GAAG,aAAa;QACnC;MACF;MACA,IAAI2nB,WAAW,KAAKC,WAAW,EAAE;QAC/BuS,aAAa,CAACn6B,KAAK,GAAG,cAAc;QACpC;MACF;MAEAi6B,cAAc,CAACj6B,KAAK,GAAG,IAAI;MAC3B,IAAI;QACF,MAAMqR,OAAO,CAACqW,cAAc,CAAC;UAAEC,WAAW;UAAEC;QAAY,CAAC,CAAC;QAC1DoU,kBAAkB,CAAC,CAAC;QACpB9B,cAAc,CAACl6B,KAAK,GAAG,OAAO;MAChC,CAAC,CAAC,OAAO2D,KAAK,EAAE;QACdw2B,aAAa,CAACn6B,KAAK,GAAG2D,KAAK,CAACxB,OAAO,IAAI,QAAQ;MACjD,CAAC,SAAS;QACR83B,cAAc,CAACj6B,KAAK,GAAG,KAAK;MAC9B;IACF;IAEA,SAASq1B,MAAMA,CAAA,EAAG;MAChB6G,aAAa,CAAC,CAAC;MACft8B,QAAQ,CAACk0B,aAAa,CAAC,CAAC;MACxBziB,OAAO,CAACgkB,MAAM,CAAC,CAAC;IAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5jBoF;AACtB;AACV;;;;IAEpD,MAAM5mB,aAAa,GAAGD,qFAAoB,CAAC,CAAC;IAC5C,MAAM5O,QAAQ,GAAGD,2EAAe,CAAC,CAAC;IAClC,MAAMuhC,cAAc,GAAGzhC,mDAAG,CAAC,KAAK,CAAC;IACjC,MAAM0hC,YAAY,GAAG1hC,mDAAG,CAAC,EAAE,CAAC;IAC5B,MAAM2hC,UAAU,GAAG3hC,mDAAG,CAAC,KAAK,CAAC;IAC7B,MAAM4hC,aAAa,GAAG5hC,mDAAG,CAAC,EAAE,CAAC;IAC7B,MAAM0pB,UAAU,GAAG1pB,mDAAG,CAAC,EAAE,CAAC;IAC1B,MAAM6hC,SAAS,GAAG7hC,mDAAG,CAAC,EAAE,CAAC;IACzB,MAAM8hC,iBAAiB,GAAG9hC,mDAAG,CAAC,EAAE,CAAC;IACjC,MAAM+hC,gBAAgB,GAAG/hC,mDAAG,CAAC,EAAE,CAAC;IAChC,MAAMgiC,YAAY,GAAGhiC,mDAAG,CAAC,EAAE,CAAC;IAC5B,MAAMiiC,aAAa,GAAGjiC,mDAAG,CAAC,EAAE,CAAC;IAC7B,MAAMkiC,WAAW,GAAGliC,mDAAG,CAAC,EAAE,CAAC;IAC3B,MAAMmiC,mBAAmB,GAAGniC,mDAAG,CAAC,EAAE,CAAC;IACnC,MAAMoiC,cAAc,GAAGpiC,mDAAG,CAAC,EAAE,CAAC;IAC9B,MAAMqiC,kBAAkB,GAAGriC,mDAAG,CAAC,EAAE,CAAC;IAElC,MAAMsiC,YAAY,GAAG;MACnBl5B,UAAU,EAAE,OAAO;MACnB2d,WAAW,EAAE,MAAM;MACnBI,SAAS,EAAE,MAAM;MACjBob,SAAS,EAAE,MAAM;MACjBC,aAAa,EAAE;IACjB,CAAC;IAED,MAAMC,YAAY,GAAG;MACnBr5B,UAAU,EAAE,IAAI;MAChB2d,WAAW,EAAE,IAAI;MACjBI,SAAS,EAAE,IAAI;MACfob,SAAS,EAAE,IAAI;MACfC,aAAa,EAAE;IACjB,CAAC;IAED,MAAME,WAAW,GAAG3iC,wDAAQ,CAAC,MAAMuiC,YAAY,CAACZ,YAAY,CAACnhC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1E,MAAMoiC,WAAW,GAAG5iC,wDAAQ,CAAC,MAAM0iC,YAAY,CAACf,YAAY,CAACnhC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC5E,MAAMqiC,UAAU,GAAG7iC,wDAAQ,CAAC,MAAMI,QAAQ,CAACsB,WAAW,IAAIuN,aAAa,CAACvN,WAAW,CAAC;IACpF,MAAMohC,SAAS,GAAG9iC,wDAAQ,CAAC,MAAMI,QAAQ,CAAC2pB,UAAU,IAAI9a,aAAa,CAACwf,YAAY,CAAC;IACnF,MAAMsU,uBAAuB,GAAG/iC,wDAAQ,CAAC,MAAM6hC,aAAa,CAACrhC,KAAK,CAACsI,IAAI,CAAC,CAAC,CAAC+gB,WAAW,CAAC,CAAC,CAAC;IACxF,MAAMmZ,aAAa,GAAGhjC,wDAAQ,CAAC,MAAM;MACnC,MAAMmG,GAAG,GAAG,IAAIya,GAAG,CAAC,CAAC;MACrBxgB,QAAQ,CAACA,QAAQ,CAACgc,OAAO,CAAC/b,OAAO,IAAI;QACnC,MAAMS,GAAG,GAAGsG,MAAM,CAAC/G,OAAO,CAACS,GAAG,IAAIT,OAAO,CAAC+F,EAAE,IAAI,EAAE,CAAC;QACnD,IAAItF,GAAG,EAAE;UACPqF,GAAG,CAACwG,GAAG,CAAC7L,GAAG,EAAET,OAAO,CAAC;QACvB;MACF,CAAC,CAAC;MACF,OAAO8F,GAAG;IACZ,CAAC,CAAC;IACF,MAAM88B,yBAAyB,GAAGjjC,wDAAQ,CAAC,MAAM;MAC/C,MAAM2mB,OAAO,GAAGoc,uBAAuB,CAACviC,KAAK;MAC7C,IAAI,CAACmmB,OAAO,EAAE;QACZ,OAAO1X,aAAa,CAACA,aAAa,CAAC9I,GAAG,CAACoJ,IAAI,IAAI2zB,kBAAkB,CAAC3zB,IAAI,CAAC,CAAC;MAC1E;MAEA,MAAM4zB,mBAAmB,GAAGl0B,aAAa,CAACA,aAAY,CACnDsF,MAAM,CAAChF,IAAI,IAAI6zB,mBAAmB,CAAC7zB,IAAI,EAAEoX,OAAO,EAAE0c,sBAAsB,CAAC9zB,IAAI,CAAC,CAAC,EAC/EpJ,GAAG,CAACoJ,IAAI,IAAI2zB,kBAAkB,CAAC3zB,IAAI,CAAC,CAAC;MACxC,MAAM+zB,mBAAmB,GAAG,IAAI5qB,GAAG,CAACzJ,aAAa,CAACA,aAAY,CAC3DsF,MAAM,CAAChF,IAAI,IAAIA,IAAI,CAAC1H,IAAI,KAAK,QAAQ,EACrC1B,GAAG,CAACoJ,IAAI,IAAIwnB,kBAAkB,CAACxnB,IAAI,CAAC,CAAC,CAAC;MACzC,MAAMg0B,cAAc,GAAGnjC,QAAQ,CAACA,QAAO,CACpCmU,MAAM,CAAChF,IAAI,IAAI,CAAC+zB,mBAAmB,CAAC3qB,GAAG,CAACvR,MAAM,CAACmI,IAAI,CAACzO,GAAG,IAAIyO,IAAI,CAACnJ,EAAE,IAAI,EAAE,CAAC,CAAC,EAC1EmO,MAAM,CAAChF,IAAI,IAAIi0B,cAAc,CAACj0B,IAAI,EAAEoX,OAAO,CAAC,EAC5CxgB,GAAG,CAACoJ,IAAI,IAAIk0B,aAAa,CAACl0B,IAAI,CAAC,CAAC;MAEnC,OAAO,CAAC,GAAG4zB,mBAAmB,EAAE,GAAGI,cAAc,CAAC;IACpD,CAAC,CAAC;IACF,MAAM3Z,gBAAgB,GAAG5pB,wDAAQ,CAAC,MAAM;MACtC,MAAM2mB,OAAO,GAAG0b,cAAc,CAAC7hC,KAAK,CAACqpB,WAAW,CAAC,CAAC;MAClD,IAAI,CAAClD,OAAO,EAAE;QACZ,OAAOvmB,QAAQ,CAACA,QAAQ;MAC1B;MACA,OAAOA,QAAQ,CAACA,QAAQ,CAACmU,MAAM,CAAChF,IAAI,IAAI;QACtC,OAAOnI,MAAM,CAACmI,IAAI,CAACvG,KAAK,IAAI,EAAE,CAAC,CAAC6gB,WAAW,CAAC,CAAC,CAACriB,QAAQ,CAACmf,OAAO,KACzDvf,MAAM,CAACmI,IAAI,CAACwX,QAAQ,IAAI,EAAE,CAAC,CAAC8C,WAAW,CAAC,CAAC,CAACriB,QAAQ,CAACmf,OAAO,KAC1Dvf,MAAM,CAACmI,IAAI,CAACzO,GAAG,IAAI,EAAE,CAAC,CAAC+oB,WAAW,CAAC,CAAC,CAACriB,QAAQ,CAACmf,OAAO,CAAC;MAC7D,CAAC,CAAC;IACJ,CAAC,CAAC;IACF,MAAM+c,cAAc,GAAG1jC,wDAAQ,CAAC,MAAM;MACpC,IAAI2hC,YAAY,CAACnhC,KAAK,KAAK,YAAY,EAAE;QACvC,OAAO,CAACmpB,UAAU,CAACnpB,KAAK;MAC1B;MACA,IAAImhC,YAAY,CAACnhC,KAAK,KAAK,aAAa,EAAE;QACxC,OAAO,CAACshC,SAAS,CAACthC,KAAK,IAAI,CAAC8hC,kBAAkB,CAAC9hC,KAAK,CAAC+Y,MAAM;MAC7D;MACA,IAAIooB,YAAY,CAACnhC,KAAK,KAAK,WAAW,EAAE;QACtC,OAAO,CAACyhC,YAAY,CAACzhC,KAAK;MAC5B;MACA,IAAImhC,YAAY,CAACnhC,KAAK,KAAK,WAAW,EAAE;QACtC,OAAO,CAAC0hC,aAAa,CAAC1hC,KAAK,IAAI,CAAC8hC,kBAAkB,CAAC9hC,KAAK,CAAC+Y,MAAM;MACjE;MACA,IAAIooB,YAAY,CAACnhC,KAAK,KAAK,eAAe,EAAE;QAC1C,OAAO,CAAC2hC,WAAW,CAAC3hC,KAAK;MAC3B;MACA,OAAO,IAAI;IACb,CAAC,CAAC;IAEFqB,yDAAS,CAAC,MAAM;MACdzB,QAAQ,CAACmJ,eAAe,CAAC,CAAC,CAACE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAMk6B,aAAa,GAAGnC,+DAAe,CAAC;MACpC3gC,IAAI,EAAE,eAAe;MACrBoB,KAAK,EAAE;QACL7B,QAAQ,EAAE;UACRyH,IAAI,EAAErC,KAAK;UACXo+B,OAAO,EAAEA,CAAA,KAAM;QACjB,CAAC;QACD5U,WAAW,EAAE;UACXnnB,IAAI,EAAErC,KAAK;UACXo+B,OAAO,EAAEA,CAAA,KAAM;QACjB,CAAC;QACDjd,OAAO,EAAE;UACP9e,IAAI,EAAET,MAAM;UACZw8B,OAAO,EAAE;QACX,CAAC;QACDC,SAAS,EAAE;UACTh8B,IAAI,EAAET,MAAM;UACZw8B,OAAO,EAAE;QACX;MACF,CAAC;MACDE,KAAK,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC;MACnCC,KAAKA,CAAC9hC,KAAK,EAAE;QAAEE;MAAK,CAAC,EAAE;QACrB,OAAO,MAAMs/B,uCAAC,CAAC,KAAK,EAAE;UAAEuC,KAAK,EAAE;QAAiB,CAAC,EAAE,CACjDvC,uCAAC,CAAC,OAAO,EAAE;UACTjhC,KAAK,EAAEyB,KAAK,CAAC0kB,OAAO;UACpBsd,WAAW,EAAE,OAAO;UACpBC,OAAO,EAAEp4B,KAAK,IAAI3J,IAAI,CAAC,gBAAgB,EAAE2J,KAAK,CAAC8H,MAAM,CAACpT,KAAK;QAC7D,CAAC,CAAC,EACFihC,uCAAC,CAAC,KAAK,EAAE;UAAEuC,KAAK,EAAE;QAAsB,CAAC,EAAE/hC,KAAK,CAAC7B,QAAQ,CAACmZ,MAAK,GAC3DtX,KAAK,CAAC7B,QAAQ,CAAC+F,GAAG,CAAC9F,OAAO,IAAIohC,uCAAC,CAAC,QAAQ,EAAE;UAC1Cj0B,GAAG,EAAEnN,OAAO,CAACS,GAAG;UAChB+G,IAAI,EAAE,QAAQ;UACdm8B,KAAK,EAAE,CAAC,oBAAoB,EAAE;YAAEvrB,QAAQ,EAAExW,KAAK,CAAC+sB,WAAW,CAACxnB,QAAQ,CAACnH,OAAO,CAACS,GAAG;UAAE,CAAC,CAAC;UACpFqjC,OAAO,EAAEA,CAAA,KAAMhiC,IAAI,CAAC,QAAQ,EAAE9B,OAAO,CAACS,GAAG;QAC3C,CAAC,EAAE,CACD2gC,uCAAC,CAAC,MAAM,EAAE;UAAEuC,KAAK,EAAE;QAAgB,CAAC,EAAE/hC,KAAK,CAAC+sB,WAAW,CAACxnB,QAAQ,CAACnH,OAAO,CAACS,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,EACzFT,OAAO,CAACoD,QAAO,GACXg+B,uCAAC,CAAC,KAAK,EAAE;UAAEuC,KAAK,EAAE,kCAAkC;UAAE3D,GAAG,EAAEhgC,OAAO,CAACoD,QAAQ;UAAE2gC,GAAG,EAAE;QAAG,CAAC,IACtF3C,uCAAC,CAAC,MAAM,EAAE;UAAEuC,KAAK,EAAE;QAAsB,CAAC,EAAE3jC,OAAO,CAACqD,UAAU,CAAC,EACnE+9B,uCAAC,CAAC,MAAM,EAAE;UAAEuC,KAAK,EAAE;QAAsB,CAAC,EAAE,CAC1CvC,uCAAC,CAAC,QAAQ,EAAEphC,OAAO,CAAC2I,KAAK,CAAC,EAC1By4B,uCAAC,CAAC,OAAO,EAAEphC,OAAO,CAAC0mB,QAAQ,EAC5B,EACF,CAAC,IACA,CAAC0a,uCAAC,CAAC,KAAK,EAAE;UAAEuC,KAAK,EAAE;QAAuB,CAAC,EAAE/hC,KAAK,CAAC4hC,SAAS,CAAC,CAAC,EACnE,CAAC;MACJ;IACF,CAAC,CAAC;IAEF,SAASQ,gBAAgBA,CAAC,GAAGlU,MAAM,EAAE;MACnC,OAAOA,MAAK,CACTK,OAAO,CAAChwB,KAAK,IAAI;QAChB,IAAIgF,KAAK,CAACkf,OAAO,CAAClkB,KAAK,CAAC,EAAE;UACxB,OAAOA,KAAK;QACd;QACA,IAAIA,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;UACtC,OAAO8jC,MAAM,CAACnU,MAAM,CAAC3vB,KAAK,CAAC;QAC7B;QACA,OAAO,CAACA,KAAK,CAAC;MAChB,CAAC,EACA2F,GAAG,CAAC3F,KAAK,IAAI4G,MAAM,CAAC5G,KAAK,IAAI,EAAE,CAAC,CAACqpB,WAAW,CAAC,CAAC,EAC9CtV,MAAM,CAACrL,OAAO,CAAC;IACpB;IAEA,SAASq7B,cAAcA,CAACpU,MAAM,EAAExJ,OAAO,EAAE;MACvC,MAAM6d,cAAc,GAAG7d,OAAO,CAAC7S,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;MAC9D,OAAOuwB,gBAAgB,CAAClU,MAAM,CAAC,CAACrQ,IAAI,CAACtf,KAAK,IAAI;QAC5C,IAAIA,KAAK,CAACgH,QAAQ,CAACmf,OAAO,CAAC,EAAE;UAC3B,OAAO,IAAI;QACb;QACA,IAAI,CAAC6d,cAAc,EAAE;UACnB,OAAO,KAAK;QACd;QACA,OAAOhkC,KAAK,CAACsT,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAACtM,QAAQ,CAACg9B,cAAc,CAAC;MACvE,CAAC,CAAC;IACJ;IAEA,SAASzN,kBAAkBA,CAACxnB,IAAI,EAAE;MAChC,IAAIA,IAAI,CAAC1H,IAAI,KAAK,QAAQ,EAAE;QAC1B,OAAOT,MAAM,CAACmI,IAAI,CAACqE,MAAM,IAAIrE,IAAI,CAACsE,GAAG,EAAED,MAAM,IAAIrE,IAAI,CAACnJ,EAAE,IAAI,EAAE,CAAC;MACjE;MACA,OAAOgB,MAAM,CAACmI,IAAI,CAACqE,MAAM,IAAIrE,IAAI,CAACsE,GAAG,EAAED,MAAM,IAAIrE,IAAI,CAACnJ,EAAE,CAAC0N,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IACzF;IAEA,SAASuvB,sBAAsBA,CAAC9zB,IAAI,EAAE;MACpC,MAAMqE,MAAM,GAAGmjB,kBAAkB,CAACxnB,IAAI,CAAC;MACvC,OAAOqE,MAAM,GAAGovB,aAAa,CAACxiC,KAAK,CAACwgB,GAAG,CAACpN,MAAM,CAAC,IAAI,IAAI,GAAG,IAAI;IAChE;IAEA,SAASwvB,mBAAmBA,CAAC7zB,IAAI,EAAEoX,OAAO,EAAEtmB,OAAO,GAAG,IAAI,EAAE;MAC1D,OAAOkkC,cAAc,CAAC,CACpBh1B,IAAI,CAACvG,KAAK,EACVuG,IAAI,CAACwX,QAAQ,EACbxX,IAAI,CAACqE,MAAM,EACXrE,IAAI,CAACnJ,EAAE,EACPmJ,IAAI,CAAC1H,IAAI,EACT0H,IAAI,CAACsE,GAAG,EAAED,MAAM,EAChBrE,IAAI,CAACsE,GAAG,EAAE2T,OAAO,EACjBjY,IAAI,CAACsE,GAAG,EAAE4wB,QAAQ,EAClBl1B,IAAI,CAACsE,GAAG,EAAE6wB,SAAS,EACnBn1B,IAAI,CAACsE,GAAG,EAAEhT,IAAI,EACd0O,IAAI,CAACsE,GAAG,EAAEjT,WAAW,EACrB2O,IAAI,CAACsE,GAAG,EAAE9S,MAAM,EAChBwO,IAAI,CAACsE,GAAG,EAAE4S,WAAW,EACrBlX,IAAI,CAACsE,GAAG,EAAEpT,KAAK,EACfJ,OAAO,EAAE2I,KAAK,EACd3I,OAAO,EAAE0mB,QAAQ,EACjB1mB,OAAO,EAAES,GAAG,EACZT,OAAO,EAAE+F,EAAE,EACX/F,OAAO,EAAEI,KAAK,EACdJ,OAAO,EAAEW,OAAO,EAChBX,OAAO,EAAEM,OAAO,EAChBN,OAAO,EAAEyoB,SAAQ,CAClB,EAAEnC,OAAO,CAAC;IACb;IAEA,SAAS6c,cAAcA,CAACj0B,IAAI,EAAEoX,OAAO,EAAE;MACrC,OAAO4d,cAAc,CAAC,CACpBh1B,IAAI,CAACvG,KAAK,EACVuG,IAAI,CAACwX,QAAQ,EACbxX,IAAI,CAACzO,GAAG,EACRyO,IAAI,CAACnJ,EAAE,EACPmJ,IAAI,CAAC9O,KAAK,EACV8O,IAAI,CAACvO,OAAO,EACZuO,IAAI,CAAC5O,OAAO,EACZ4O,IAAI,CAACuZ,SAAQ,CACd,EAAEnC,OAAO,CAAC;IACb;IAEA,SAASuc,kBAAkBA,CAAC3zB,IAAI,EAAE;MAChC,OAAO;QACL,GAAGA,IAAI;QACPo1B,UAAU,EAAE,cAAc;QAC1BC,SAAS,EAAE,gBAAgBr1B,IAAI,CAACnJ,EAAE;MACpC,CAAC;IACH;IAEA,SAASq9B,aAAaA,CAACpjC,OAAO,EAAE;MAC9B,OAAO;QACL+F,EAAE,EAAE/F,OAAO,CAAC+F,EAAE;QACdu+B,UAAU,EAAE,SAAS;QACrBC,SAAS,EAAE,WAAWvkC,OAAO,CAACS,GAAG,IAAIT,OAAO,CAAC+F,EAAE,EAAE;QACjD/F,OAAO;QACP2I,KAAK,EAAE3I,OAAO,CAAC2I,KAAK;QACpB+d,QAAQ,EAAE1mB,OAAO,CAAC0mB,QAAQ;QAC1BtjB,QAAQ,EAAEpD,OAAO,CAACoD,QAAQ;QAC1BC,UAAU,EAAErD,OAAO,CAACqD,UAAU;QAC9BuR,MAAM,EAAE;MACV,CAAC;IACH;IAEA,SAAS4vB,gBAAgBA,CAACt1B,IAAI,EAAE;MAC9B,IAAIA,IAAI,CAACo1B,UAAU,KAAK,cAAc,EAAE;QACtC,OAAOp1B,IAAI,CAACnJ,EAAE,KAAK6I,aAAa,CAACge,QAAQ;MAC3C;MACA,OAAO,UAAU1d,IAAI,CAAClP,OAAO,EAAES,GAAG,IAAIyO,IAAI,CAACnJ,EAAE,EAAE,KAAK6I,aAAa,CAACge,QAAQ;IAC5E;IAEA,SAAS6X,cAAcA,CAACv1B,IAAI,EAAE;MAC5B,IAAIA,IAAI,CAACo1B,UAAU,KAAK,SAAS,EAAE;QACjCvkC,QAAQ,CAACy0B,QAAQ,CAACtlB,IAAI,CAAClP,OAAO,CAAC;QAC/B;MACF;MACA4O,aAAa,CAACoC,qBAAqB,CAAC9B,IAAI,CAACnJ,EAAE,CAAC;IAC9C;IAEA,SAAS2+B,kBAAkBA,CAAA,EAAG;MAC5B3kC,QAAQ,CAACsB,WAAW,GAAG,EAAE;MACzBtB,QAAQ,CAAC2pB,UAAU,GAAG,EAAE;MACxB9a,aAAa,CAACvN,WAAW,GAAG,EAAE;MAC9BuN,aAAa,CAACwf,YAAY,GAAG,EAAE;IACjC;IAEA,SAASuW,iBAAiBA,CAAA,EAAG;MAC3Brb,UAAU,CAACnpB,KAAK,GAAG,EAAE;MACrBshC,SAAS,CAACthC,KAAK,GAAG,EAAE;MACpBuhC,iBAAiB,CAACvhC,KAAK,GAAG,EAAE;MAC5BwhC,gBAAgB,CAACxhC,KAAK,GAAG,EAAE;MAC3ByhC,YAAY,CAACzhC,KAAK,GAAG,EAAE;MACvB0hC,aAAa,CAAC1hC,KAAK,GAAG,EAAE;MACxB2hC,WAAW,CAAC3hC,KAAK,GAAG,EAAE;MACtB4hC,mBAAmB,CAAC5hC,KAAK,GAAG,EAAE;MAC9B6hC,cAAc,CAAC7hC,KAAK,GAAG,EAAE;MACzB8hC,kBAAkB,CAAC9hC,KAAK,GAAG,EAAE;MAC7BukC,kBAAkB,CAAC,CAAC;IACtB;IAEA,SAASE,gBAAgBA,CAAA,EAAG;MAC1BvD,cAAc,CAAClhC,KAAK,GAAG,CAACkhC,cAAc,CAAClhC,KAAK;IAC9C;IAEA,SAAS0kC,eAAeA,CAAA,EAAG;MACzBxD,cAAc,CAAClhC,KAAK,GAAG,KAAK;IAC9B;IAEA,SAAS2kC,UAAUA,CAACzgC,MAAM,EAAE;MAC1BsgC,iBAAiB,CAAC,CAAC;MACnBrD,YAAY,CAACnhC,KAAK,GAAGkE,MAAM;MAC3Bg9B,cAAc,CAAClhC,KAAK,GAAG,KAAK;MAC5B,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,eAAe,CAAC,CAACgH,QAAQ,CAAC9C,MAAM,CAAC,EAAE;QAClEtE,QAAQ,CAACmJ,eAAe,CAAC;UAAEC,KAAK,EAAE;QAAK,CAAC,CAAC;MAC3C;IACF;IAEA,SAAS47B,gBAAgBA,CAAA,EAAG;MAC1BzD,YAAY,CAACnhC,KAAK,GAAG,EAAE;MACvBohC,UAAU,CAACphC,KAAK,GAAG,KAAK;MACxBwkC,iBAAiB,CAAC,CAAC;IACrB;IAEA,SAASK,aAAaA,CAAC5Q,SAAS,EAAE;MAChC,MAAMhc,QAAQ,GAAG,IAAIC,GAAG,CAAC4pB,kBAAkB,CAAC9hC,KAAK,CAAC;MAClD,IAAIiY,QAAQ,CAACE,GAAG,CAAC8b,SAAS,CAAC,EAAE;QAC3Bhc,QAAQ,CAACG,MAAM,CAAC6b,SAAS,CAAC;MAC5B,CAAC,MAAM;QACLhc,QAAQ,CAACI,GAAG,CAAC4b,SAAS,CAAC;MACzB;MACA6N,kBAAkB,CAAC9hC,KAAK,GAAGgF,KAAK,CAACC,IAAI,CAACgT,QAAQ,CAAC;IACjD;IAEA,eAAe6sB,YAAYA,CAAA,EAAG;MAC5B,IAAI5B,cAAc,CAACljC,KAAK,IAAIohC,UAAU,CAACphC,KAAK,EAAE;QAC5C;MACF;MACAohC,UAAU,CAACphC,KAAK,GAAG,IAAI;MACvBukC,kBAAkB,CAAC,CAAC;MACpB,IAAI;QACF,IAAIvjC,EAAE,GAAG,KAAK;QACd,IAAImgC,YAAY,CAACnhC,KAAK,KAAK,YAAY,EAAE;UACvCgB,EAAE,GAAG,MAAMpB,QAAQ,CAACiJ,UAAU,CAACsgB,UAAU,CAACnpB,KAAK,CAAC;UAChD,IAAIgB,EAAE,IAAIpB,QAAQ,CAACE,aAAa,EAAE;YAChCF,QAAQ,CAACy0B,QAAQ,CAACz0B,QAAQ,CAACE,aAAa,CAAC;UAC3C;QACF,CAAC,MAAM,IAAIqhC,YAAY,CAACnhC,KAAK,KAAK,aAAa,EAAE;UAC/CgB,EAAE,GAAG,MAAMyN,aAAa,CAAC+X,WAAW,CAAC;YACnCnmB,IAAI,EAAEihC,SAAS,CAACthC,KAAK;YACrBuS,YAAY,EAAEgvB,iBAAiB,CAACvhC,KAAK;YACrCwS,WAAW,EAAEgvB,gBAAgB,CAACxhC,KAAK;YACnCymB,SAAS,EAAEqb,kBAAkB,CAAC9hC;UAChC,CAAC,CAAC;QACJ,CAAC,MAAM,IAAImhC,YAAY,CAACnhC,KAAK,KAAK,WAAW,EAAE;UAC7CgB,EAAE,GAAG,MAAMyN,aAAa,CAACmY,SAAS,CAAC6a,YAAY,CAACzhC,KAAK,CAAC;QACxD,CAAC,MAAM,IAAImhC,YAAY,CAACnhC,KAAK,KAAK,WAAW,EAAE;UAC7CgB,EAAE,GAAG,MAAMyN,aAAa,CAACqY,gBAAgB,CAACgb,kBAAkB,CAAC9hC,KAAK,EAAE0hC,aAAa,CAAC1hC,KAAK,CAAC;QAC1F,CAAC,MAAM,IAAImhC,YAAY,CAACnhC,KAAK,KAAK,eAAe,EAAE;UACjDgB,EAAE,GAAG,MAAMyN,aAAa,CAAC+X,WAAW,CAAC;YACnCnmB,IAAI,EAAEshC,WAAW,CAAC3hC,KAAK;YACvBymB,SAAS,EAAEqb,kBAAkB,CAAC9hC,KAAK;YACnCuS,YAAY,EAAEqvB,mBAAmB,CAAC5hC,KAAK;YACvC0mB,OAAO,EAAE;UACX,CAAC,CAAC;QACJ;QACA,IAAI1lB,EAAE,EAAE;UACN+K,MAAM,CAAC+E,UAAU,CAAC8zB,gBAAgB,EAAE,GAAG,CAAC;QAC1C;MACF,CAAC,SAAS;QACRxD,UAAU,CAACphC,KAAK,GAAG,KAAK;MAC1B;IACF;IAEAoG,QAAQ,CAACC,gBAAgB,CAAC,OAAO,EAAEq+B,eAAe,CAAC;IACnDtjC,+DAAe,CAAC,MAAM;MACpBgF,QAAQ,CAACM,mBAAmB,CAAC,OAAO,EAAEg+B,eAAe,CAAC;IACxD,CAAC,CAAC;IAEF,SAASK,YAAYA,CAAC/kC,KAAK,EAAE;MAC3B,MAAMglC,KAAK,GAAGx7B,MAAM,CAACxJ,KAAK,IAAI,CAAC,CAAC;MAChC,OAAOglC,KAAK,GAAG,EAAE,GAAG,KAAK,GAAGp+B,MAAM,CAACo+B,KAAK,CAAC;IAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3gByE;AACL;;AAEpE,oBAAoB,oGAAM;;AAE1B,sDAAe;;;;;;;;;;ACLf,MAAMC,WAAW,GAAGl5B,MAAM,CAACC,QAAQ,CAAC+pB,QAAQ,IAAI,WAAW;AAC3D,MAAMmP,aAAa,GAAGn5B,MAAM,CAACo5B,gBAAgB,IAAI,CAAC,CAAC;AACnD,MAAMC,eAAe,GAAG,GAAGr5B,MAAM,CAACC,QAAQ,CAAC4pB,QAAQ,KAAKqP,WAAW,QAAQ;AAC3E,MAAMI,iBAAiB,GAAG,GAAGt5B,MAAM,CAACC,QAAQ,CAAC4pB,QAAQ,KAAKqP,WAAW,OAAO;AAErE,MAAMxnB,SAAS,GAAG;EACvB6nB,OAAO,EAAE,QAAQ;EACjBC,WAAW,EAAEL,aAAa,CAACK,WAAW,IAAI/jB,yCAAW,CAACgkB,oBAAoB,IAAIH,iBAAiB;EAC/FrnB,SAAS,EAAEknB,aAAa,CAAClnB,SAAS,IAAIwD,yCAAW,CAACikB,kBAAkB,IAAIL,eAAe;EACvFM,iBAAiB,EAAER,aAAa,CAACQ,iBAAiB,IAAIlkB,yCAAW,CAACmkB,2BAA2B,KAAKnkB,MAAsC,GAAG,CAAgC,GAAG,0BAA0B,CAAC;EACzMokB,iBAAiB,EAAEV,aAAa,CAACU,iBAAiB,IAAIpkB,yCAAW,CAACqkB,2BAA2B,IAAI,GAAGR,iBAAiB,sBAAsB;EAC3IS,sBAAsB,EAAEZ,aAAa,CAACY,sBAAsB,IAAItkB,yCAAW,CAACukB,iCAAiC,IAAI,GAAGV,iBAAiB,4BAA4B;EACjKxf,WAAW,EAAEqf,aAAa,CAACrf,WAAW,IAAIrE,yCAAW,CAACwkB,oBAAoB,KAAKxkB,MAAsC,GAAG,CAAyB,GAAG,mBAAmB,CAAC;EACxK6F,cAAc,EAAE6d,aAAa,CAAC7d,cAAc,IAAI7F,yCAAW,CAACykB,wBAAwB,KAAKzkB,MAAsC,GAAG,CAA6B,GAAG,uBAAuB,CAAC;EAC1L6E,aAAa,EAAE6e,aAAa,CAAC7e,aAAa,IAAI7E,yCAAW,CAAC0kB,uBAAuB,KAAK1kB,MAAsC,GAAG,CAA4B,GAAG,sBAAsB,CAAC;EACrLmF,sBAAsB,EAAEue,aAAa,CAACve,sBAAsB,IAAInF,yCAAW,CAAC2kB,gCAAgC,KAAK3kB,MAAsC,GAAG,CAAqC,GAAG,+BAA+B,CAAC;EAClOwD,cAAc,EAAEkgB,aAAa,CAAClgB,cAAc,IAAIxD,yCAAW,CAAC4kB,wBAAwB,KAAK5kB,MAAsC,GAAG,CAA6B,GAAG,uBAAuB,CAAC;EAC1L8C,gBAAgB,EAAE4gB,aAAa,CAAC5gB,gBAAgB,IAAI9C,yCAAW,CAAC6kB,0BAA0B,KAAK7kB,MAAsC,GAAG,CAA+B,GAAG,yBAAyB,CAAC;EACpMqD,gBAAgB,EAAEqgB,aAAa,CAACrgB,gBAAgB,IAAIrD,yCAAW,CAAC8kB,0BAA0B,KAAK9kB,MAAsC,GAAG,CAA+B,GAAG,yBAAyB,CAAC;EACpMmC,WAAW,EAAEuhB,aAAa,CAACvhB,WAAW,IAAInC,yCAAW,CAAC+kB,oBAAoB,KAAK/kB,MAAsC,GAAG,CAAyB,GAAG,mBAAmB,CAAC;EACxK+F,UAAU,EAAE2d,aAAa,CAAC3d,UAAU,IAAI/F,yCAAW,CAACglB,mBAAmB,KAAKhlB,MAAsC,GAAG,CAAwB,GAAG,kBAAkB,CAAC;EACnKqG,iBAAiB,EAAEqd,aAAa,CAACrd,iBAAiB,IAAIrG,yCAAW,CAACilB,2BAA2B,IAAI,GAAGrB,eAAe,aAAa;EAChInd,gBAAgB,EAAEid,aAAa,CAACjd,gBAAgB,IAAIzG,yCAAW,CAACklB,0BAA0B,IAAI,GAAGtB,eAAe,YAAY;EAC5HtP,YAAY,EAAEoP,aAAa,CAACpP,YAAY,IAAItU,yCAAW,CAACmlB,sBAAsB,IAAI1B,WAAW;EAC7FhP,WAAW,EAAEzsB,MAAM,CAAC07B,aAAa,CAACjP,WAAW,IAAIzU,yCAAW,CAAColB,qBAAqB,IAAI,KAAK,CAAC;EAC5F/Q,MAAM,EAAEqP,aAAa,CAACrP,MAAM,IAAIrU,yCAAW,CAACqlB,eAAe,KAAK,MAAM;EACtE1Q,MAAM,EAAE+O,aAAa,CAAC/O,MAAM,IAAI3U,yCAAW,CAACslB,eAAe,IAAI,KAAK;EACpEnR,KAAK,EAAEuP,aAAa,CAACvP,KAAK,IAAInU,yCAAW,CAACulB,cAAc,IAAI,EAAE;EAC9DjO,OAAO,EAAEoM,aAAa,CAACpM,OAAO,IAAItX,yCAAW,CAACwlB,eAAe,IAAI,MAAM;EACvE1V,cAAc,EAAE9nB,MAAM,CAAC07B,aAAa,CAAC5T,cAAc,IAAI9P,yCAAW,CAACylB,wBAAwB,IAAI,GAAG,CAAC;EACnGxkB,QAAQ,EAAE,CAAC;EACXR,kBAAkB,EAAE,sBAAsB;EAC1C8G,sBAAsB,EAAE;AAC1B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACuKyB;AACsC;AAC3B;AACc;AACJ;AAU/C,MAAMme,6BAA6B,GAAG,iCAAiC;AAEvE,MAAMC,mBAAmB,GAAG,2CAA2C;AAIvE,MAAMC,oBAAoB,GAAG,KAAK;;;;IAdlC,MAAM/1B,OAAO,GAAGD,yEAAe,CAAC,CAAC;IACjC,MAAMi2B,IAAI,GAAG5nC,kDAAG,CAAC,OAAO,CAAC;IACzB,MAAMiT,IAAI,GAAGjT,kDAAG,CAAC,MAAM,CAAC;IACxB,MAAMc,MAAM,GAAGd,kDAAG,CAAC,EAAE,CAAC;IACtB,MAAM6iB,QAAQ,GAAG7iB,kDAAG,CAAC,EAAE,CAAC;IACxB,MAAMojB,IAAI,GAAGpjB,kDAAG,CAAC,OAAO,CAAC;IACzB,MAAM6nC,WAAW,GAAG7nC,kDAAG,CAAC,KAAK,CAAC;IAC9B,MAAM8nC,IAAI,GAAG9nC,kDAAG,CAAC,EAAE,CAAC;IAEpB,MAAM+nC,mBAAmB,GAAG/pB,uDAAS,CAAC6nB,OAAO;IAE7C,MAAMmC,YAAY,GAAGhoC,kDAAG,CAAC+nC,mBAAmB,CAAC;IAC7C,MAAME,YAAY,GAAGjoC,kDAAG,CAAC0nC,mBAAmB,CAAC;IAC7C,MAAMQ,YAAY,GAAGloC,kDAAG,CAAC,OAAO,CAAC;IAEjC,MAAMmoC,eAAe,GAAGnoC,kDAAG,CAAC;MAAEooC,KAAK,EAAE,IAAI;MAAEC,KAAK,EAAE,KAAK;MAAE5nC,QAAQ,EAAE;IAAM,CAAC,CAAC;IAC3E,MAAM6nC,gBAAgB,GAAGtoC,kDAAG,CAAC,KAAK,CAAC;IACnC,MAAMuoC,kBAAkB,GAAGvoC,kDAAG,CAAC,EAAE,CAAC;IAClC,MAAMwoC,YAAY,GAAGxoC,kDAAG,CAAC,EAAE,CAAC;IAC5B,MAAMyoC,iBAAiB,GAAGzoC,kDAAG,CAAC,EAAE,CAAC;IACjC,MAAM0oC,eAAe,GAAG1oC,kDAAG,CAAC,EAAE,CAAC;IAC/B,MAAM2oC,oBAAoB,GAAG3oC,kDAAG,CAAC,EAAE,CAAC;IACpC,MAAM4oC,uBAAuB,GAAG5oC,kDAAG,CAAC,KAAK,CAAC;IAC1C,MAAM6oC,mBAAmB,GAAGhnC,uDAAQ,CAAC;MACnCf,MAAM,EAAE,EAAE;MACVmY,MAAM,EAAE,IAAI;MACZsP,SAAS,EAAE;IACb,CAAC,CAAC;IACF,MAAMugB,YAAY,GAAGjnC,uDAAQ,CAAC;MAC5BknC,gBAAgB,EAAE,IAAI;MACtBX,KAAK,EAAE,EAAE;MACThlB,IAAI,EAAE,EAAE;MACRilB,KAAK,EAAE,EAAE;MACTW,SAAS,EAAE,EAAE;MACbvoC,QAAQ,EAAE,EAAE;MACZwoC,wBAAwB,EAAE,KAAK;MAC/BC,aAAa,EAAE,EAAE;MACjBC,YAAY,EAAE,EAAE;MAChBtmB,QAAQ,EAAE,EAAE;MACZwY,eAAe,EAAE;IACnB,CAAC,CAAC;IACF,MAAM+N,oBAAoB,GAAGvnC,uDAAQ,CAAC;MACpCghB,QAAQ,EAAE,EAAE;MACZwY,eAAe,EAAE;IACnB,CAAC,CAAC;IACF,MAAMgO,kBAAkB,GAAG,CACzB;MAAE9oC,KAAK,EAAE,KAAK;MAAEmE,KAAK,EAAE;IAAM,CAAC,EAC9B;MAAEnE,KAAK,EAAE,MAAM;MAAEmE,KAAK,EAAE;IAAO,CAAC,EAChC;MAAEnE,KAAK,EAAE,MAAM;MAAEmE,KAAK,EAAE;IAAO,CAAC,EAChC;MAAEnE,KAAK,EAAE,MAAM;MAAEmE,KAAK,EAAE;IAAO,CAAC,EAChC;MAAEnE,KAAK,EAAE,IAAI;MAAEmE,KAAK,EAAE;IAAK,CAAC,EAC5B;MAAEnE,KAAK,EAAE,KAAK;MAAEmE,KAAK,EAAE;IAAM,CAAC,EAC9B;MAAEnE,KAAK,EAAE,KAAK;MAAEmE,KAAK,EAAE;IAAM,CAAC,EAC9B;MAAEnE,KAAK,EAAE,KAAK;MAAEmE,KAAK,EAAE;IAAM,CAAC,EAC9B;MAAEnE,KAAK,EAAE,KAAK;MAAEmE,KAAK,EAAE;IAAM,CAAC,EAC9B;MAAEnE,KAAK,EAAE,KAAK;MAAEmE,KAAK,EAAE;IAAM,CAAC,EAC9B;MAAEnE,KAAK,EAAE,KAAK;MAAEmE,KAAK,EAAE;IAAM,CAAC,EAC9B;MAAEnE,KAAK,EAAE,KAAK;MAAEmE,KAAK,EAAE;IAAM,EAC9B;IACD,MAAM4kC,qBAAqB,GAAG,CAC5B;MAAE/7B,GAAG,EAAE,OAAO;MAAE7I,KAAK,EAAE;IAAQ,CAAC,EAChC;MAAE6I,GAAG,EAAE,OAAO;MAAE7I,KAAK,EAAE;IAAO,CAAC,EAC/B;MAAE6I,GAAG,EAAE,UAAU;MAAE7I,KAAK,EAAE;IAAQ,EACnC;IACD,MAAM6kC,SAAS,GAAGxpC,uDAAQ,CAAC,MAAM;MAC/B,IAAIkT,IAAI,CAAC1S,KAAK,KAAK,UAAU,EAAE;QAC7B,OAAOO,MAAM,CAACP,KAAK,CAAC+Y,MAAM,IAAI,CAAC,IAAIuJ,QAAQ,CAACtiB,KAAK,CAAC+Y,MAAM,IAAI,CAAC;MAC/D;MACA,OAAOxY,MAAM,CAACP,KAAK,CAAC+Y,MAAM,IAAI,CAAC,IAAI8J,IAAI,CAAC7iB,KAAK,CAAC+Y,MAAM,IAAI,CAAC;IAC3D,CAAC,CAAC;IACF,MAAMkwB,sBAAsB,GAAGzpC,uDAAQ,CAAC,MAAM;MAC5C,MAAM0pC,OAAO,GAAGH,qBAAqB,CAACh1B,MAAM,CAAChF,IAAI,IAAIA,IAAI,CAAC/B,GAAG,KAAK,OAAO,IAAI46B,eAAe,CAAC5nC,KAAK,CAAC+O,IAAI,CAAC/B,GAAG,CAAC,CAAC;MAC7G,OAAOk8B,OAAO,CAACnwB,MAAM,GAAGmwB,OAAO,GAAG,CAACH,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC;IACF,MAAMI,iBAAiB,GAAG3pC,uDAAQ,CAAC,MAAM;MACvC,IAAImoC,YAAY,CAAC3nC,KAAK,KAAK,OAAO,EAAE;QAClC,OAAOuoC,YAAY,CAACV,KAAK,CAAC9uB,MAAM,IAAI,MAC9BgvB,gBAAgB,CAAC/nC,KAAK,GAAGuoC,YAAY,CAAC1lB,IAAI,CAAC9J,MAAM,IAAI,CAAC,GAAGqwB,mBAAmB,CAACppC,KAAK,CAAC;MAC3F;MACA,IAAI2nC,YAAY,CAAC3nC,KAAK,KAAK,OAAO,EAAE;QAClC,OAAO,KAAK;MACd;MACA,OAAOuoC,YAAY,CAACroC,QAAQ,CAAC6Y,MAAM,IAAI,KAClCwvB,YAAY,CAACI,aAAa,CAAC5vB,MAAM,IAAI,KACrCswB,sBAAsB,CAACrpC,KAAI,IAC3BuoC,YAAY,CAACjmB,QAAQ,CAACvJ,MAAM,IAAI,KAChCwvB,YAAY,CAACjmB,QAAQ,KAAKimB,YAAY,CAACzN,eAAe;IAC7D,CAAC,CAAC;IACF,MAAMwO,sBAAsB,GAAG9pC,uDAAQ,CAAC,MAAM;MAC5C,OAAO8oC,mBAAmB,CAAC/nC,MAAK,IAC3B+nC,mBAAmB,CAACtgB,SAAQ,IAC5B6gB,oBAAoB,CAACvmB,QAAQ,CAACvJ,MAAM,IAAI,KACxC8vB,oBAAoB,CAACvmB,QAAQ,KAAKumB,oBAAoB,CAAC/N,eAAe;IAC7E,CAAC,CAAC;IACF,MAAMyO,kBAAkB,GAAG/pC,uDAAQ,CAAC,MAAMgqC,gBAAgB,CAACjB,YAAY,CAAC1lB,IAAI,EAAEolB,YAAY,CAACjoC,KAAK,CAAC,CAAC;IAClG,MAAMopC,mBAAmB,GAAG5pC,uDAAQ,CAAC,MAAM+pC,kBAAkB,CAACvpC,KAAK,KAAK,OAAO,CAAC;IAChF,MAAMypC,iBAAiB,GAAGjqC,uDAAQ,CAAC,MAAMkqC,eAAe,CAACH,kBAAkB,CAACvpC,KAAK,CAAC,CAAC;IACnF,MAAM2pC,qBAAqB,GAAGnqC,uDAAQ,CAAC,MAAM;MAC3C,OAAOgqC,gBAAgB,CAACjB,YAAY,CAACK,YAAY,EAAET,eAAe,CAACnoC,KAAK,CAAC;IAC3E,CAAC,CAAC;IACF,MAAMqpC,sBAAsB,GAAG7pC,uDAAQ,CAAC,MAAMmqC,qBAAqB,CAAC3pC,KAAK,KAAK,OAAO,CAAC;IACtF,MAAM4pC,oBAAoB,GAAGpqC,uDAAQ,CAAC,MAAMkqC,eAAe,CAACC,qBAAqB,CAAC3pC,KAAK,CAAC,CAAC;IAEzFN,oDAAK,CAACupC,sBAAsB,EAAEY,OAAO,IAAI;MACvC,IAAI,CAACA,OAAO,CAACvqB,IAAI,CAACvQ,IAAI,IAAIA,IAAI,CAAC/B,GAAG,KAAK26B,YAAY,CAAC3nC,KAAK,CAAC,EAAE;QAC1D2nC,YAAY,CAAC3nC,KAAK,GAAG6pC,OAAO,CAAC,CAAC,CAAC,EAAE78B,GAAG,IAAI,OAAO;MACjD;IACF,CAAC,CAAC;IAEF3L,wDAAS,CAAC,MAAM;MACdyoC,kBAAkB,CAAC,CAAC;MACpBC,kBAAkB,CAAC,CAAC;MACpBC,0BAA0B,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,eAAeC,WAAWA,CAAA,EAAG;MAC3B1C,IAAI,CAACvnC,KAAK,GAAG,EAAE;MACfsnC,WAAW,CAACtnC,KAAK,GAAG,IAAI;MACxB,IAAI;QACF,MAAMmR,kEAAQ,CAAC8R,eAAe,CAAC1iB,MAAM,CAACP,KAAK,CAAC;QAC5CunC,IAAI,CAACvnC,KAAK,GAAG,0BAA0B;MACzC,CAAC,CAAC,OAAO2D,KAAK,EAAE;QACd0N,OAAO,CAAC1N,KAAK,GAAGA,KAAK,CAACxB,OAAO,IAAI,SAAS;MAC5C,CAAC,SAAS;QACRmlC,WAAW,CAACtnC,KAAK,GAAG,KAAK;MAC3B;IACF;IAEA,eAAekqC,mBAAmBA,CAAA,EAAG;MACnC3C,IAAI,CAACvnC,KAAK,GAAG,EAAE;MACfsnC,WAAW,CAACtnC,KAAK,GAAG,IAAI;MACxB,IAAI;QACF,MAAMmR,kEAAQ,CAAC8R,eAAe,CAACknB,iBAAiB,CAAC5B,YAAY,CAACC,gBAAgB,EAAED,YAAY,CAACV,KAAK,CAAC,CAAC;QACpGN,IAAI,CAACvnC,KAAK,GAAG,0BAA0B;MACzC,CAAC,CAAC,OAAO2D,KAAK,EAAE;QACd0N,OAAO,CAAC1N,KAAK,GAAGA,KAAK,CAACxB,OAAO,IAAI,SAAS;MAC5C,CAAC,SAAS;QACRmlC,WAAW,CAACtnC,KAAK,GAAG,KAAK;MAC3B;IACF;IAEA,SAASoa,MAAMA,CAAA,EAAG;MAChB,IAAI1H,IAAI,CAAC1S,KAAK,KAAK,UAAU,EAAE;QAC7BqR,OAAO,CAACgR,iBAAiB,CAAC9hB,MAAM,CAACP,KAAK,EAAEsiB,QAAQ,CAACtiB,KAAK,CAAC;QACvD;MACF;MACAqR,OAAO,CAAC6R,aAAa,CAAC3iB,MAAM,CAACP,KAAK,EAAE6iB,IAAI,CAAC7iB,KAAK,CAAC;IACjD;IAEA,SAASoqC,6BAA6BA,CAAA,EAAG;MACvC7B,YAAY,CAACK,YAAY,GAAGL,YAAY,CAACK,YAAY,CAACt1B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAACtL,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACtF;IAEA,SAASqiC,0BAA0BA,CAAA,EAAG;MACpC9B,YAAY,CAAC1lB,IAAI,GAAG0lB,YAAY,CAAC1lB,IAAI,CAACvP,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAACtL,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACtE;IAEA,SAASsiC,4BAA4BA,CAAA,EAAG;MACtC/B,YAAY,CAACC,gBAAgB,GAAGD,YAAY,CAACC,gBAAgB,CAACl1B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAACtL,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9F;IAEA,SAASuiC,gBAAgBA,CAAA,EAAG;MAC1BtC,YAAY,CAACjoC,KAAK,GAAGwqC,YAAY,CAAC,CAAC,CAAC;MACpCtC,iBAAiB,CAACloC,KAAK,GAAGyqC,kBAAkB,CAACxC,YAAY,CAACjoC,KAAK,CAAC;MAChEuoC,YAAY,CAAC1lB,IAAI,GAAG,EAAE;IACxB;IAEA,SAAS6nB,mBAAmBA,CAAA,EAAG;MAC7BvC,eAAe,CAACnoC,KAAK,GAAGwqC,YAAY,CAAC,CAAC,CAAC;MACvCpC,oBAAoB,CAACpoC,KAAK,GAAGyqC,kBAAkB,CAACtC,eAAe,CAACnoC,KAAK,CAAC;MACtEuoC,YAAY,CAACK,YAAY,GAAG,EAAE;IAChC;IAEA,SAASY,gBAAgBA,CAACmB,UAAU,EAAEC,YAAY,EAAE;MAClD,IAAID,UAAU,CAAC5xB,MAAM,GAAG,CAAC,EAAE;QACzB,OAAO,EAAE;MACX;MACA,OAAO6xB,YAAY,IAAID,UAAU,KAAKC,YAAY,GAAG,OAAO,GAAG,SAAS;IAC1E;IAEA,SAASlB,eAAeA,CAAC7jC,MAAM,EAAE;MAC/B,OAAO;QACL,qBAAqB,EAAEA,MAAM,KAAK,OAAO;QACzC,uBAAuB,EAAEA,MAAM,KAAK;MACtC,CAAC;IACH;IAEA,SAAS2kC,YAAYA,CAACzxB,MAAM,EAAE;MAC5B,IAAI/Y,KAAK,GAAG,EAAE;MACd,KAAK,IAAI6b,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG9C,MAAM,EAAE8C,KAAK,IAAI,CAAC,EAAE;QAC9C7b,KAAK,IAAIiK,IAAI,CAAC4gC,KAAK,CAAC5gC,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;MACzC;MACA,OAAOte,KAAK;IACd;IAEA,SAASyqC,kBAAkBA,CAACp7B,IAAI,EAAE;MAChC,MAAMxE,KAAK,GAAG,GAAG;MACjB,MAAMG,MAAM,GAAG,EAAE;MACjB,MAAMwyB,MAAM,GAAGp3B,QAAQ,CAACiG,aAAa,CAAC,QAAQ,CAAC;MAC/CmxB,MAAM,CAAC3yB,KAAK,GAAGA,KAAK;MACpB2yB,MAAM,CAACxyB,MAAM,GAAGA,MAAM;MACtB,MAAM4zB,OAAO,GAAGpB,MAAM,CAACqB,UAAU,CAAC,IAAI,CAAC;MACvCD,OAAO,CAACI,SAAS,GAAG,SAAS;MAC7BJ,OAAO,CAACK,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAEp0B,KAAK,EAAEG,MAAM,CAAC;MAErC,KAAK,IAAI6Q,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG,EAAE,EAAEA,KAAK,IAAI,CAAC,EAAE;QAC1C+iB,OAAO,CAACW,SAAS,CAAC,CAAC;QACnBX,OAAO,CAACkM,MAAM,CAAC7gC,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAGzT,KAAK,EAAEZ,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAGtT,MAAM,CAAC;QAC7D4zB,OAAO,CAACmM,MAAM,CAAC9gC,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAGzT,KAAK,EAAEZ,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAGtT,MAAM,CAAC;QAC7D4zB,OAAO,CAACoM,WAAW,GAAG,QAAQ,EAAE,GAAG/gC,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,GAAGrU,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,GAAGrU,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAG,EAAE,SAAS;QACtHsgB,OAAO,CAACqM,SAAS,GAAG,GAAG;QACvBrM,OAAO,CAACsM,MAAM,CAAC,CAAC;MAClB;MAEAtM,OAAO,CAACuM,IAAI,GAAG,4BAA4B;MAC3CvM,OAAO,CAACwM,YAAY,GAAG,QAAQ;MAC/BxM,OAAO,CAACyM,SAAS,GAAG,QAAQ;MAC5B,KAAK,IAAIxvB,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGxM,IAAI,CAAC0J,MAAM,EAAE8C,KAAK,IAAI,CAAC,EAAE;QACnD+iB,OAAO,CAACI,SAAS,GAAGnjB,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,GAAG,SAAS;QAC3D+iB,OAAO,CAAC0M,QAAQ,CAACj8B,IAAI,CAACwM,KAAK,CAAC,EAAE,EAAE,GAAGA,KAAK,GAAG,EAAE,EAAE7Q,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;MAChE;MAEA,KAAK,IAAI6Q,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG,EAAE,EAAEA,KAAK,IAAI,CAAC,EAAE;QAC1C+iB,OAAO,CAACI,SAAS,GAAG,oBAAoB,IAAI,GAAG/0B,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAG,GAAG,GAAG;QACrEsgB,OAAO,CAACK,QAAQ,CAACh1B,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAGzT,KAAK,EAAEZ,IAAI,CAACqU,MAAM,CAAC,CAAC,GAAGtT,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC;MAC3E;MAEA,OAAOwyB,MAAM,CAAC+N,SAAS,CAAC,WAAW,CAAC;IACtC;IAEA,eAAeC,cAAcA,CAAA,EAAG;MAC9Bn6B,OAAO,CAAC1N,KAAK,GAAG,EAAE;MAClB4jC,IAAI,CAACvnC,KAAK,GAAG,EAAE;MACf,IAAI2nC,YAAY,CAAC3nC,KAAK,KAAK,OAAO,EAAE;QAClCyrC,uBAAuB,CAAC,CAAC;QACzB,IAAI,CAAC1D,gBAAgB,CAAC/nC,KAAK,IAAI,CAACopC,mBAAmB,CAACppC,KAAK,EAAE;UACzDqR,OAAO,CAAC1N,KAAK,GAAG,WAAW;UAC3B;QACF;QACA,MAAM+nC,cAAc,GAAGvB,iBAAiB,CAAC5B,YAAY,CAACC,gBAAgB,EAAED,YAAY,CAACV,KAAK,CAAC;QAC3F,MAAM8D,WAAW,GAAG,MAAMC,qBAAqB,CAACF,cAAc,CAAC;QAC/D,IAAIC,WAAW,KAAK,IAAI,EAAE;UACxB;QACF;QACA,IAAIA,WAAW,EAAE;UACf3D,kBAAkB,CAAChoC,KAAK,GAAG,WAAW;UACtC;QACF;QACA,MAAM6rC,SAAS,GAAG9D,gBAAgB,CAAC/nC,KAAK,GAAGuoC,YAAY,CAAC1lB,IAAI,GAAG,OAAO;QACtE,MAAMnK,MAAM,GAAG,MAAMrH,OAAO,CAAC8R,iBAAiB,CAACuoB,cAAc,EAAEG,SAAS,CAAC;QACzE,IAAI,CAACnzB,MAAM,EAAE;UACX;QACF;QACA,IAAI,CAACA,MAAM,CAACsP,SAAS,EAAE;UACrB3W,OAAO,CAAC1N,KAAK,GAAG,kBAAkB;UAClC;QACF;QACAmoC,sBAAsB,CAACJ,cAAc,EAAEhzB,MAAM,CAAC;QAC9CmwB,oBAAoB,CAACvmB,QAAQ,GAAG,EAAE;QAClCumB,oBAAoB,CAAC/N,eAAe,GAAG,EAAE;QACzCuM,IAAI,CAACrnC,KAAK,GAAG,aAAa;QAC1B;MACF;MACA,IAAI2nC,YAAY,CAAC3nC,KAAK,KAAK,OAAO,EAAE;QAClCqR,OAAO,CAAC1N,KAAK,GAAG,oBAAoB;QACpC;MACF;MACA0N,OAAO,CAAC1N,KAAK,GAAGgkC,YAAY,CAAC3nC,KAAK,KAAK,OAAM,GACzC,sBAAqB,GACrB,uBAAuB;IAC7B;IAEA,eAAe+rC,sBAAsBA,CAAA,EAAG;MACtC16B,OAAO,CAAC1N,KAAK,GAAG,EAAE;MAClB4jC,IAAI,CAACvnC,KAAK,GAAG,EAAE;MACf,IAAI,CAACsoC,mBAAmB,CAAC/nC,MAAM,IAAI,CAAC+nC,mBAAmB,CAACtgB,SAAS,EAAE;QACjE3W,OAAO,CAAC1N,KAAK,GAAG,eAAe;QAC/B;MACF;MACA,IAAI,CAACklC,oBAAoB,CAACvmB,QAAQ,IAAI,CAACumB,oBAAoB,CAAC/N,eAAe,EAAE;QAC3EzpB,OAAO,CAAC1N,KAAK,GAAG,SAAS;QACzB;MACF;MACA,IAAIklC,oBAAoB,CAACvmB,QAAQ,KAAKumB,oBAAoB,CAAC/N,eAAe,EAAE;QAC1EzpB,OAAO,CAAC1N,KAAK,GAAG,YAAY;QAC5B;MACF;MAEA0kC,uBAAuB,CAACroC,KAAK,GAAG,IAAI;MACpC,IAAI;QACF,MAAMqR,OAAO,CAAC0W,qBAAqB,CAAC;UAClCxnB,MAAM,EAAE+nC,mBAAmB,CAAC/nC,MAAM;UAClCynB,SAAS,EAAEsgB,mBAAmB,CAACtgB,SAAS;UACxCJ,WAAW,EAAEihB,oBAAoB,CAACvmB;QACpC,CAAC,CAAC;QACF,MAAMjR,OAAO,CAACgR,iBAAiB,CAACimB,mBAAmB,CAAC/nC,MAAM,EAAEsoC,oBAAoB,CAACvmB,QAAQ,CAAC;QAC1F,IAAI,CAACjR,OAAO,CAAC1N,KAAK,EAAE;UAClBqoC,wBAAwB,CAAC,CAAC;QAC5B;MACF,CAAC,CAAC,OAAOroC,KAAK,EAAE;QACd0N,OAAO,CAAC1N,KAAK,GAAGA,KAAK,CAACxB,OAAO,IAAI,QAAQ;MAC3C,CAAC,SAAS;QACRkmC,uBAAuB,CAACroC,KAAK,GAAG,KAAK;MACvC;IACF;IAEA,SAASmqC,iBAAiBA,CAAC8B,WAAW,EAAEpE,KAAK,EAAE;MAC7C,MAAMqE,MAAM,GAAGtlC,MAAM,CAACqlC,WAAW,IAAI,IAAI,CAAC,CAAC34B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI;MACrE,MAAM64B,cAAc,GAAG,IAAID,MAAM,EAAE;MACnC,MAAME,eAAe,GAAGxlC,MAAM,CAACihC,KAAK,IAAI,EAAE,CAAC,CAACv0B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;MAC9D,IAAI64B,cAAc,KAAK,KAAK,EAAE;QAC5B,OAAOC,eAAe;MACxB;MACA,OAAO,GAAGD,cAAc,GAAGC,eAAe,EAAE;IAC9C;IAEA,eAAerC,kBAAkBA,CAAA,EAAG;MAClC,IAAI;QACF,MAAMzoB,QAAQ,GAAG,MAAM9D,uDAAK,CAACgD,GAAG,CAAC/C,uDAAS,CAACmoB,iBAAiB,EAAE;UAAEjjB,eAAe,EAAE;QAAM,CAAC,CAAC;QACzF,MAAMknB,OAAO,GAAGvoB,QAAQ,CAACC,IAAI,EAAEA,IAAI,EAAEsoB,OAAO;QAC5C,IAAIA,OAAO,EAAE;UACXjC,eAAe,CAAC5nC,KAAK,GAAG;YACtB6nC,KAAK,EAAEn/B,OAAO,CAACmhC,OAAO,CAAChC,KAAK,CAAC;YAC7BC,KAAK,EAAEV,oBAAoB,IAAI1+B,OAAO,CAACmhC,OAAO,CAAC/B,KAAK,CAAC;YACrD5nC,QAAQ,EAAEwI,OAAO,CAACmhC,OAAO,CAAC3pC,QAAQ;UACpC,CAAC;QACH;QACA6nC,gBAAgB,CAAC/nC,KAAK,GAAG0I,OAAO,CAAC4Y,QAAQ,CAACC,IAAI,EAAEA,IAAI,EAAE8qB,kBAAkB,CAAC;MAC3E,CAAC,CAAC,OAAO1oC,KAAK,EAAE;QACdikC,eAAe,CAAC5nC,KAAK,GAAG;UAAE6nC,KAAK,EAAE,IAAI;UAAEC,KAAK,EAAE,KAAK;UAAE5nC,QAAQ,EAAE;QAAM,CAAC;QACtE6nC,gBAAgB,CAAC/nC,KAAK,GAAG,KAAK;MAChC;IACF;IAEA,eAAe8pC,kBAAkBA,CAAA,EAAG;MAClC,IAAI;QACF,MAAMxoB,QAAQ,GAAG,MAAM9D,uDAAK,CAACgD,GAAG,CAAC/C,uDAAS,CAACioB,iBAAiB,EAAE;UAAE/iB,eAAe,EAAE;QAAM,CAAC,CAAC;QACzF,IAAIrB,QAAQ,CAACC,IAAI,EAAEsB,IAAI,KAAK,CAAC,EAAE;UAC7B,MAAM,IAAIG,KAAK,CAAC1B,QAAQ,CAACC,IAAI,EAAEpf,OAAO,IAAI,UAAU,CAAC;QACvD;QACA,MAAMmqC,MAAM,GAAGhrB,QAAQ,CAACC,IAAI,EAAE7I,MAAM,IAAI,CAAC,CAAC;QAC1C,MAAMrY,IAAI,GAAGuG,MAAM,CAAC0lC,MAAM,CAAC7E,YAAY,IAAI,EAAE,CAAC,CAACn/B,IAAI,CAAC,CAAC;QACrD,MAAMikC,IAAI,GAAG3lC,MAAM,CAAC0lC,MAAM,CAACE,OAAO,IAAIF,MAAM,CAACC,IAAI,IAAI,EAAE,CAAC,CAACjkC,IAAI,CAAC,CAAC;QAC/D,MAAMmkC,OAAO,GAAG7lC,MAAM,CAAC0lC,MAAM,CAACG,OAAO,IAAI,EAAE,CAAC,CAACnkC,IAAI,CAAC,CAAC;QACnDm/B,YAAY,CAACznC,KAAK,GAAGK,IAAI,IAAImnC,mBAAmB;QAChDE,YAAY,CAAC1nC,KAAK,GAAG0sC,gBAAgB,CAACH,IAAI,EAAEE,OAAO,CAAC;MACtD,CAAC,CAAC,OAAO9oC,KAAK,EAAE;QACd8jC,YAAY,CAACznC,KAAK,GAAGwnC,mBAAmB;QACxCE,YAAY,CAAC1nC,KAAK,GAAGmnC,mBAAmB;MAC1C;MACAwF,kBAAkB,CAAC,CAAC;IACtB;IAEA,SAASD,gBAAgBA,CAAC1sC,KAAK,EAAEysC,OAAO,GAAG,EAAE,EAAE;MAC7C,MAAMF,IAAI,GAAG3lC,MAAM,CAAC5G,KAAK,IAAI,EAAE,CAAC,CAACsI,IAAI,CAAC,CAAC;MACvC,IAAI,CAACikC,IAAI,EAAE;QACT,OAAOpF,mBAAmB;MAC5B;MACA,IAAI,yBAAyB,CAAC9iB,IAAI,CAACkoB,IAAI,CAAC,EAAE;QACxC,OAAOK,kBAAkB,CAACL,IAAI,EAAEE,OAAO,CAAC;MAC1C;MACA,IAAIF,IAAI,CAAClxB,UAAU,CAAC,IAAI,CAAC,EAAE;QACzB,OAAOuxB,kBAAkB,CAAC,GAAG7gC,MAAM,CAACC,QAAQ,CAAC4pB,QAAQ,GAAG2W,IAAI,EAAE,EAAEE,OAAO,CAAC;MAC1E;MACA,MAAMI,IAAI,GAAGN,IAAI,CAAClxB,UAAU,CAAC,GAAG,CAAC,GAAGoC,uDAAS,CAAC8nB,WAAW,GAAG,GAAG9nB,uDAAS,CAAC8nB,WAAW,GAAG;MACvF,OAAOqH,kBAAkB,CAAC,IAAI9gC,GAAG,CAACygC,IAAI,EAAEM,IAAI,CAAC,CAACtgC,QAAQ,CAAC,CAAC,EAAEkgC,OAAO,CAAC;IACpE;IAEA,SAASG,kBAAkBA,CAACvqC,GAAG,EAAEoqC,OAAO,EAAE;MACxC,IAAI,CAACA,OAAO,IAAI,iBAAiB,CAACpoB,IAAI,CAAChiB,GAAG,CAAC,EAAE;QAC3C,OAAOA,GAAG;MACZ;MACA,MAAMyqC,MAAM,GAAG,IAAIhhC,GAAG,CAACzJ,GAAG,EAAE0J,MAAM,CAACC,QAAQ,CAACM,IAAI,CAAC;MACjDwgC,MAAM,CAAC5gC,YAAY,CAACC,GAAG,CAAC,GAAG,EAAEsgC,OAAO,CAAC;MACrC,OAAOK,MAAM,CAACvgC,QAAQ,CAAC,CAAC;IAC1B;IAEA,SAASogC,kBAAkBA,CAAA,EAAG;MAC5B,IAAI,OAAOvmC,QAAQ,KAAK,WAAW,EAAE;QACnC;MACF;MACAA,QAAQ,CAACoC,KAAK,GAAGi/B,YAAY,CAACznC,KAAK,IAAIwnC,mBAAmB;MAC1D,IAAIuF,IAAI,GAAG3mC,QAAQ,CAAC4mC,aAAa,CAAC,kBAAkB,CAAC;MACrD,IAAI,CAACD,IAAI,EAAE;QACTA,IAAI,GAAG3mC,QAAQ,CAACiG,aAAa,CAAC,MAAM,CAAC;QACrC0gC,IAAI,CAAC18B,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC;QAChCjK,QAAQ,CAAC6mC,IAAI,CAACvgC,WAAW,CAACqgC,IAAI,CAAC;MACjC;MACAA,IAAI,CAAC18B,YAAY,CAAC,MAAM,EAAEq3B,YAAY,CAAC1nC,KAAK,IAAImnC,mBAAmB,CAAC;IACtE;IAEA,SAAS+F,oBAAoBA,CAAA,EAAG;MAC9B,IAAIxF,YAAY,CAAC1nC,KAAK,KAAKmnC,mBAAmB,EAAE;QAC9CO,YAAY,CAAC1nC,KAAK,GAAGmnC,mBAAmB;QACxCwF,kBAAkB,CAAC,CAAC;MACtB;IACF;IAEA,eAAef,qBAAqBA,CAAC/D,KAAK,EAAE;MAC1C,IAAI;QACF,MAAMvmB,QAAQ,GAAG,MAAM9D,uDAAK,CAACgF,IAAI,CAAC/E,uDAAS,CAACqoB,sBAAsB,EAAE;UAAEvlC,MAAM,EAAEsnC;QAAM,CAAC,EAAE;UAAEllB,eAAe,EAAE;QAAM,CAAC,CAAC;QAClH,OAAOja,OAAO,CAAC4Y,QAAQ,CAACC,IAAI,EAAEA,IAAI,EAAE2J,MAAM,CAAC;MAC7C,CAAC,CAAC,OAAOvnB,KAAK,EAAE;QACd0N,OAAO,CAAC1N,KAAK,GAAGA,KAAK,CAAC2d,QAAQ,EAAEC,IAAI,EAAEuG,GAAG,IAAInkB,KAAK,CAACxB,OAAO,IAAI,eAAe;QAC7E,OAAO,IAAI;MACb;IACF;IAEA,SAASspC,uBAAuBA,CAAA,EAAG;MACjCzD,kBAAkB,CAAChoC,KAAK,GAAG,EAAE;IAC/B;IAEA,SAASgsC,wBAAwBA,CAAA,EAAG;MAClC1D,mBAAmB,CAAC/nC,MAAM,GAAG,EAAE;MAC/B+nC,mBAAmB,CAAC5vB,MAAM,GAAG,IAAI;MACjC4vB,mBAAmB,CAACtgB,SAAS,GAAG,EAAE;MAClC6gB,oBAAoB,CAACvmB,QAAQ,GAAG,EAAE;MAClCumB,oBAAoB,CAAC/N,eAAe,GAAG,EAAE;MACzCqS,cAAc,CAACtY,UAAU,CAACqS,6BAA6B,CAAC;IAC1D;IAEA,SAAS4E,sBAAsBA,CAACjE,KAAK,EAAEnvB,MAAM,EAAE;MAC7C4vB,mBAAmB,CAAC/nC,MAAM,GAAGsnC,KAAK;MAClCS,mBAAmB,CAAC5vB,MAAM,GAAGA,MAAM;MACnC4vB,mBAAmB,CAACtgB,SAAS,GAAGphB,MAAM,CAAC8R,MAAM,CAACsP,SAAS,IAAI,EAAE,CAAC;MAC9DmlB,cAAc,CAACnuB,OAAO,CAACkoB,6BAA6B,EAAE1oB,IAAI,CAACS,SAAS,CAAC;QACnEjB,SAAS,EAAEP,uDAAS,CAACO,SAAS;QAC9Bzd,MAAM,EAAE+nC,mBAAmB,CAAC/nC,MAAM;QAClCynB,SAAS,EAAEsgB,mBAAmB,CAACtgB,SAAS;QACxCtP;MACF,CAAC,CAAC,CAAC;IACL;IAEA,SAASsxB,0BAA0BA,CAAA,EAAG;MACpC,IAAI;QACF,MAAMoD,OAAO,GAAG5uB,IAAI,CAACC,KAAK,CAAC0uB,cAAc,CAACxuB,OAAO,CAACuoB,6BAA6B,CAAC,IAAI,MAAM,CAAC;QAC3F,IAAI,CAACkG,OAAO,IAAIA,OAAO,CAACpvB,SAAS,KAAKP,uDAAS,CAACO,SAAS,IAAI,CAACovB,OAAO,CAAC7sC,MAAM,IAAI,CAAC6sC,OAAO,CAACplB,SAAS,EAAE;UAClG;QACF;QACAsgB,mBAAmB,CAAC/nC,MAAM,GAAG6sC,OAAO,CAAC7sC,MAAM;QAC3C+nC,mBAAmB,CAAC5vB,MAAM,GAAG00B,OAAO,CAAC10B,MAAM,IAAI,IAAI;QACnD4vB,mBAAmB,CAACtgB,SAAS,GAAGphB,MAAM,CAACwmC,OAAO,CAACplB,SAAS,IAAI,EAAE,CAAC;QAC/D6gB,oBAAoB,CAACvmB,QAAQ,GAAG,EAAE;QAClCumB,oBAAoB,CAAC/N,eAAe,GAAG,EAAE;QACzCuM,IAAI,CAACrnC,KAAK,GAAG,aAAa;MAC5B,CAAC,CAAC,OAAO2D,KAAK,EAAE;QACdwpC,cAAc,CAACtY,UAAU,CAACqS,6BAA6B,CAAC;MAC1D;IACF;IAEA,SAASmG,YAAYA,CAAA,EAAG;MACtBh8B,OAAO,CAAC1N,KAAK,GAAG,EAAE;MAClB4jC,IAAI,CAACvnC,KAAK,GAAG,EAAE;MACfyrC,uBAAuB,CAAC,CAAC;MACzBO,wBAAwB,CAAC,CAAC;MAC1BzD,YAAY,CAACV,KAAK,GAAGU,YAAY,CAACV,KAAK,IAAItnC,MAAM,CAACP,KAAK;MACvDuoC,YAAY,CAAC1lB,IAAI,GAAG,EAAE;MACtBolB,YAAY,CAACjoC,KAAK,GAAG,EAAE;MACvBkoC,iBAAiB,CAACloC,KAAK,GAAG,EAAE;MAC5BqnC,IAAI,CAACrnC,KAAK,GAAG,UAAU;MACvB+pC,kBAAkB,CAAC,CAAC;IACtB;IAEA,SAASuD,WAAWA,CAAA,EAAG;MACrBj8B,OAAO,CAAC1N,KAAK,GAAG,EAAE;MAClB4jC,IAAI,CAACvnC,KAAK,GAAG,EAAE;MACfyrC,uBAAuB,CAAC,CAAC;MACzBO,wBAAwB,CAAC,CAAC;MAC1B3E,IAAI,CAACrnC,KAAK,GAAG,OAAO;IACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UCnqBA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA;WACA;WACA,kBAAkB,qBAAqB;WACvC,oHAAoH,iDAAiD;WACrK;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WC7BA;WACA;WACA;WACA,eAAe,4BAA4B;WAC3C,eAAe;WACf,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC;;;;;WCPD,8CAA8C;;;;;WCA9C;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA,8CAA8C;;WAE9C;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,iCAAiC,mCAAmC;WACpE;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;;;;;UElDA;UACA;UACA;UACA,+EAA+E,mCAAmC;UAClH","sources":["webpack://jc-web-im/./src/components/ChatShell.vue?4f5d","webpack://jc-web-im/./src/App.vue?c8ff","webpack://jc-web-im/./src/components/contacts/ContactPanel.vue","webpack://jc-web-im/./src/components/chat/MessageList.vue","webpack://jc-web-im/./src/components/sidebar/ContactList.vue?a882","webpack://jc-web-im/./src/components/ChatShell.vue?22c0","webpack://jc-web-im/./src/stores/navigation.js","webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue","webpack://jc-web-im/./src/components/chat/ChatPanel.vue","webpack://jc-web-im/./src/components/chat/MessageComposer.vue","webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue?b0a9","webpack://jc-web-im/./src/components/favorites/FavoriteList.vue?b67e","webpack://jc-web-im/./src/components/chat/MessageComposer.vue?4ff6","webpack://jc-web-im/./src/App.vue","webpack://jc-web-im/./src/components/sidebar/ContactList.vue?0735","webpack://jc-web-im/./src/components/chat/ChatPanel.vue?3fb9","webpack://jc-web-im/./src/services/httpImClient.js","webpack://jc-web-im/./src/components/sidebar/ContactList.vue","webpack://jc-web-im/./src/stores/conversations.js","webpack://jc-web-im/./src/stores/contacts.js","webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue?b854","webpack://jc-web-im/./src/stores/session.js","webpack://jc-web-im/./src/services/longConnectionImClient.js","webpack://jc-web-im/./src/components/sidebar/ConversationList.vue?f077","webpack://jc-web-im/./src/components/chat/MessageList.vue?9afc","webpack://jc-web-im/./src/components/favorites/FavoriteList.vue","webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue?97c1","webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue?7de6","webpack://jc-web-im/./src/App.vue?7685","webpack://jc-web-im/./src/services/imClient.js","webpack://jc-web-im/./src/components/chat/ChatPanel.vue?b114","webpack://jc-web-im/./src/components/chat/MessageComposer.vue?9b5f","webpack://jc-web-im/./src/components/LoginView.vue?3868","webpack://jc-web-im/./src/components/sidebar/ConversationList.vue?5317","webpack://jc-web-im/./src/main.js","webpack://jc-web-im/./src/components/contacts/ContactPanel.vue?f3c5","webpack://jc-web-im/./src/components/contacts/ContactPanel.vue?fc3d","webpack://jc-web-im/./src/components/ChatShell.vue","webpack://jc-web-im/./src/components/favorites/FavoriteList.vue?9902","webpack://jc-web-im/./src/components/LoginView.vue?68d6","webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue","webpack://jc-web-im/./src/components/sidebar/ConversationList.vue","webpack://jc-web-im/./src/components/chat/MessageList.vue?35d4","webpack://jc-web-im/./src/config.js","webpack://jc-web-im/./src/components/LoginView.vue","webpack://jc-web-im/webpack/bootstrap","webpack://jc-web-im/webpack/runtime/chunk loaded","webpack://jc-web-im/webpack/runtime/compat get default export","webpack://jc-web-im/webpack/runtime/define property getters","webpack://jc-web-im/webpack/runtime/global","webpack://jc-web-im/webpack/runtime/hasOwnProperty shorthand","webpack://jc-web-im/webpack/runtime/make namespace object","webpack://jc-web-im/webpack/runtime/jsonp chunk loading","webpack://jc-web-im/webpack/before-startup","webpack://jc-web-im/webpack/startup","webpack://jc-web-im/webpack/after-startup"],"sourcesContent":["import script from \"./ChatShell.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ChatShell.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","export { default } from \"-!../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./App.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./App.vue?vue&type=script&setup=true&lang=js\"","\n\n\n","\n\n\n","export { default } from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactList.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatShell.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatShell.vue?vue&type=script&setup=true&lang=js\"","import { defineStore } from 'pinia';\n\nexport const useNavigationStore = defineStore('navigation', {\n state: () => ({\n section: 'messages'\n }),\n actions: {\n showMessages() {\n this.section = 'messages';\n },\n showContacts() {\n this.section = 'contacts';\n },\n showFavorites() {\n this.section = 'favorites';\n }\n }\n});\n","\n\n\n","\n\n\n","\n\n\n","import script from \"./NavigationRail.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./NavigationRail.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","export { default } from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoriteList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoriteList.vue?vue&type=script&setup=true&lang=js\"","import script from \"./MessageComposer.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./MessageComposer.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","\n\n\n","import script from \"./ContactList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ContactList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","export { default } from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatPanel.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatPanel.vue?vue&type=script&setup=true&lang=js\"","import axios from 'axios';\nimport { appConfig } from '@/config';\n\nconst LOCAL_MESSAGE_STORAGE_KEY = 'qmt-web-im-local-messages-v2';\nconst LOCAL_HIDDEN_MESSAGE_STORAGE_KEY = 'qmt-web-im-hidden-messages-v1';\nconst LOCAL_RECALLED_MESSAGE_STORAGE_KEY = 'qmt-web-im-recalled-messages-v1';\n\nfunction scopedStorageKey(baseKey, userId = '') {\n const scope = `${appConfig.appServer || ''}:${userId || 'anonymous'}`;\n return `${baseKey}:${encodeURIComponent(scope)}`;\n}\n\nfunction randomId() {\n if (window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID().replaceAll('-', '');\n }\n return `${Date.now()}${Math.random().toString(16).slice(2)}`;\n}\n\nfunction readLocalMessages(userId) {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId)) || '{}');\n } catch (error) {\n return {};\n }\n}\n\nfunction readMessageSet(storageKey, userId) {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(storageKey, userId)) || '{}');\n } catch (error) {\n return {};\n }\n}\n\nfunction writeMessageSet(storageKey, messagesByConversation, userId) {\n localStorage.setItem(scopedStorageKey(storageKey, userId), JSON.stringify(messagesByConversation));\n}\n\nfunction messageKeys(message) {\n return [message?.id, message?.messageUid]\n .filter(Boolean)\n .map(value => String(value));\n}\n\nfunction hasStoredMessage(storageKey, conversationId, message, userId) {\n const stored = readMessageSet(storageKey, userId);\n const ids = new Set(stored[conversationId] || []);\n return messageKeys(message).some(id => ids.has(id));\n}\n\nfunction storeMessageKeys(storageKey, conversationId, messages, userId) {\n const stored = readMessageSet(storageKey, userId);\n const ids = new Set(stored[conversationId] || []);\n messages.forEach(message => {\n messageKeys(message).forEach(id => ids.add(id));\n });\n stored[conversationId] = Array.from(ids);\n writeMessageSet(storageKey, stored, userId);\n}\n\nfunction withRecalledState(message) {\n return {\n ...message,\n status: 'recalled',\n deliveryStatus: '',\n recalled: true,\n recallStatus: '已撤回'\n };\n}\n\nfunction applyLocalMessageState(conversationId, messages, userId) {\n return messages\n .filter(message => !hasStoredMessage(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversationId, message, userId))\n .map(message => {\n const isRecalled = Boolean(message.recalled)\n || message.status === 'recalled'\n || hasStoredMessage(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversationId, message, userId);\n if (!isRecalled) {\n return message;\n }\n return withRecalledState(message);\n });\n}\n\nfunction writeLocalMessages(messagesByConversation, userId) {\n localStorage.setItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId), JSON.stringify(messagesByConversation));\n}\n\nfunction saveLocalMessage(message, userId) {\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[message.conversationId] = messagesByConversation[message.conversationId] || [];\n const index = messagesByConversation[message.conversationId].findIndex(item => item.id === message.id);\n if (index >= 0) {\n messagesByConversation[message.conversationId].splice(index, 1, message);\n } else {\n messagesByConversation[message.conversationId].push(message);\n }\n writeLocalMessages(messagesByConversation, userId);\n}\n\nfunction mergeSyncedMessages(localMessages, remoteMessages, conversationId, userId) {\n const visibleLocalMessages = applyLocalMessageState(conversationId, localMessages, userId);\n const localByKey = new Map();\n visibleLocalMessages.forEach(message => {\n messageKeys(message).forEach(key => {\n if (!localByKey.has(key)) {\n localByKey.set(key, message);\n }\n });\n });\n\n const visibleRemoteMessages = applyLocalMessageState(conversationId, remoteMessages, userId).map(remoteMessage => {\n if (!remoteMessage.recalled || String(remoteMessage.text || '').trim()) {\n return remoteMessage;\n }\n const localMessage = messageKeys(remoteMessage)\n .map(key => localByKey.get(key))\n .find(message => message?.text && message.text !== '你撤回了一条消息');\n return localMessage ? { ...remoteMessage, text: localMessage.text } : remoteMessage;\n });\n const remoteKeys = new Set();\n visibleRemoteMessages.forEach(message => {\n messageKeys(message).forEach(key => remoteKeys.add(key));\n });\n const now = Date.now();\n\n function hasRemoteMatch(localMessage) {\n if (localMessage.messageUid && remoteKeys.has(localMessage.messageUid)) {\n return true;\n }\n return visibleRemoteMessages.some(remoteMessage => {\n return remoteMessage.direction === localMessage.direction\n && remoteMessage.text === localMessage.text\n && Math.abs(Number(remoteMessage.timestamp || 0) - Number(localMessage.timestamp || 0)) < 15000;\n });\n }\n\n const pendingLocalMessages = visibleLocalMessages.filter(message => {\n if (message.status === 'recalled' || message.recalled) {\n return message.direction === 'out' && !hasRemoteMatch(message);\n }\n if (message.direction !== 'out') {\n return false;\n }\n if (message.status === 'sent' && message.messageUid) {\n return !hasRemoteMatch(message);\n }\n if (message.status === 'sent') {\n return !hasRemoteMatch(message) && now - Number(message.timestamp || 0) < 30000;\n }\n return message.status === 'sending' || message.status === 'failed';\n });\n\n return [...visibleRemoteMessages, ...pendingLocalMessages].sort((a, b) => {\n return Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0);\n });\n}\n\nfunction getTitle(value, fallback) {\n return value || fallback || '';\n}\n\nfunction getUniqueEquipment(mobile, fallback) {\n const allowedDevices = {\n '18301902119': '67072d37062c4f31b1165073552933ba',\n '18301902116': '1777479418113eeea8e236edce',\n '18301902118': 'de89fb2f2a61480a8c381f6c16e28bd8',\n '18301902117': 'd117f480faa64145b6162107b1b49617'\n };\n return allowedDevices[mobile] || localStorage.getItem('uniqueEquipment') || fallback;\n}\n\nfunction canUseLocalLoginFallback(response) {\n const message = response.data?.message || '';\n return process.env.NODE_ENV === 'development' && message.includes('允许此设备登录');\n}\n\nexport class HttpImClient {\n constructor() {\n this.listeners = new Map();\n this.connected = false;\n this.currentUser = null;\n }\n\n getClientId() {\n let clientId = localStorage.getItem(appConfig.clientIdStorageKey);\n if (!clientId) {\n clientId = randomId();\n localStorage.setItem(appConfig.clientIdStorageKey, clientId);\n }\n return clientId;\n }\n\n restoreClientId(clientId) {\n if (clientId) {\n localStorage.setItem(appConfig.clientIdStorageKey, clientId);\n }\n }\n\n getSdkVersion() {\n return 'HTTP';\n }\n\n async ensureSdk() {\n return true;\n }\n\n async loginWithPassword(mobile, password) {\n const url = `${appConfig.appServer}/login_pwd`;\n const deviceId = getUniqueEquipment(mobile, this.getClientId());\n const response = await axios.post(url, {\n mobile,\n password,\n platform: appConfig.platform,\n clientId: deviceId,\n uniqueEquipment: deviceId\n }, { withCredentials: false });\n\n this.persistAppToken(url, response);\n if (response.data?.code !== 0) {\n if (canUseLocalLoginFallback(response)) {\n return {\n userId: mobile,\n token: `local-device-pending-${Date.now()}`,\n displayName: mobile,\n localOnly: true\n };\n }\n throw new Error(response.data?.message || '登录失败');\n }\n return response.data.result;\n }\n\n async requestAuthCode(mobile) {\n const response = await axios.post(`${appConfig.appServer}/send_code`, { mobile }, { withCredentials: false });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '验证码发送失败');\n }\n return response.data.result;\n }\n\n async loginWithCode(mobile, code) {\n const url = `${appConfig.appServer}/login`;\n const deviceId = getUniqueEquipment(mobile, this.getClientId());\n const response = await axios.post(url, {\n mobile,\n code,\n platform: appConfig.platform,\n clientId: deviceId,\n uniqueEquipment: deviceId\n }, { withCredentials: false });\n\n this.persistAppToken(url, response);\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '登录失败');\n }\n return response.data.result;\n }\n\n async registerWithPhone(mobile, code) {\n const url = `${appConfig.appServer}/register`;\n const deviceId = getUniqueEquipment(mobile, this.getClientId());\n\n try {\n const response = await axios.post(url, {\n mobile,\n code,\n platform: appConfig.platform,\n clientId: deviceId,\n uniqueEquipment: deviceId\n }, { withCredentials: false });\n\n this.persistAppToken(url, response);\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '注册失败');\n }\n return response.data.result;\n } catch (error) {\n const status = error.response?.status;\n if (status === 404 || status === 405) {\n return this.loginWithCode(mobile, code);\n }\n throw error;\n }\n }\n\n connect(userId, token) {\n this.currentUser = { userId, token };\n this.connected = true;\n this.emit('connectionStatusChanged', { connected: true, statusText: '已连接' });\n this.refreshConversationList();\n }\n\n disconnect() {\n this.connected = false;\n this.currentUser = null;\n this.emit('connectionStatusChanged', { connected: false, statusText: '未连接' });\n }\n\n getConversationList() {\n return [];\n }\n\n refreshConversationList() {\n const conversations = this.getConversationList();\n if (conversations.length) {\n this.emit('conversationsChanged', conversations);\n }\n if (this.currentUser?.userId) {\n this.fetchRemoteConversations().then(remoteConversations => {\n this.emit('conversationsChanged', remoteConversations);\n }).catch(() => {});\n }\n return conversations;\n }\n\n async fetchRemoteConversations(limit = 50) {\n if (!this.currentUser?.userId) {\n return [];\n }\n const response = await axios.post(appConfig.messagesApi, {\n userId: this.currentUser.userId,\n limit\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '会话同步失败');\n }\n\n return (response.data?.result?.conversations || []).map(conversation => ({\n ...conversation,\n updatedAt: Number(conversation.updatedAt || Date.now()),\n avatarText: conversation.avatarText || String(conversation.title || conversation.target || '?').slice(0, 1).toUpperCase(),\n raw: conversation.raw || { type: 'single', target: conversation.target, line: 0 }\n }));\n }\n\n getMessages(conversation) {\n if (!conversation?.id) {\n return [];\n }\n const userId = this.currentUser?.userId || '';\n return applyLocalMessageState(conversation.id, readLocalMessages(userId)[conversation.id] || [], userId);\n }\n\n async fetchRemoteMessages(conversation, limit = 50, options = {}) {\n if (!conversation?.id || !this.currentUser?.userId) {\n return [];\n }\n const response = await axios.post(appConfig.messagesApi, {\n userId: this.currentUser.userId,\n target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),\n limit,\n conversationType: conversation.type || conversation.raw?.type || 0,\n markRead: Boolean(options.markRead)\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '消息同步失败');\n }\n\n const messages = (response.data?.result?.messages || []).map(message => ({\n ...message,\n displayTimestamp: message.displayTimestamp || message.timestamp,\n conversationId: conversation.id\n }));\n const userId = this.currentUser?.userId || '';\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = mergeSyncedMessages(messagesByConversation[conversation.id] || [], messages, conversation.id, userId);\n writeLocalMessages(messagesByConversation, userId);\n return messagesByConversation[conversation.id];\n }\n\n hideMessages(conversation, messages) {\n const items = Array.isArray(messages) ? messages : [messages];\n if (!conversation?.id || !items.length) {\n return;\n }\n const userId = this.currentUser?.userId || '';\n storeMessageKeys(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversation.id, items, userId);\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = applyLocalMessageState(\n conversation.id,\n messagesByConversation[conversation.id] || [],\n userId\n );\n writeLocalMessages(messagesByConversation, userId);\n }\n\n markMessagesRecalled(conversation, messages) {\n const items = Array.isArray(messages) ? messages : [messages];\n if (!conversation?.id || !items.length) {\n return;\n }\n const userId = this.currentUser?.userId || '';\n storeMessageKeys(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversation.id, items, userId);\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = applyLocalMessageState(\n conversation.id,\n messagesByConversation[conversation.id] || [],\n userId\n );\n writeLocalMessages(messagesByConversation, userId);\n }\n\n async recallMessage(conversation, message) {\n const messageUid = String(message?.messageUid || message?.id || '').trim();\n if (!/^\\d+$/.test(messageUid)) {\n throw new Error('缺少可撤回的消息ID');\n }\n\n const response = await axios.post(appConfig.messageActionApi, {\n action: 'recall',\n userId: this.currentUser?.userId || message.from || '',\n messageUid\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '撤回失败');\n }\n this.markMessagesRecalled(conversation, [message]);\n return response.data.result;\n }\n\n async editMessage(conversation, message, text) {\n const messageUid = String(message?.messageUid || message?.id || '').trim();\n if (!/^\\d+$/.test(messageUid)) {\n throw new Error('缺少可编辑的消息ID');\n }\n const nextText = String(text || '').trim();\n if (!nextText) {\n throw new Error('编辑内容不能为空');\n }\n\n const response = await axios.post(appConfig.messageActionApi, {\n action: 'edit',\n userId: this.currentUser?.userId || message.from || '',\n messageUid,\n text: nextText\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '编辑失败');\n }\n\n const result = response.data?.result?.message || {};\n const editedMessage = {\n ...message,\n text: result.text || nextText,\n status: 'delivered',\n deliveryStatus: 'delivered',\n editedAt: Number(result.editedAt || Date.now()),\n activityTimestamp: Number(result.editedAt || Date.now())\n };\n saveLocalMessage(editedMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', editedMessage);\n return editedMessage;\n }\n\n async getMessageDetail(conversation, message) {\n const messageUid = String(message?.messageUid || message?.id || '').trim();\n if (!messageUid) {\n throw new Error('缺少消息ID');\n }\n const response = await axios.post(appConfig.messageDetailApi, {\n userId: this.currentUser?.userId || '',\n target: conversation?.target || conversation?.raw?.target || conversation?.id?.replace(/^single-/, '') || '',\n conversationType: conversation?.type || conversation?.raw?.type || 'single',\n messageUid\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '消息详情加载失败');\n }\n\n return response.data?.result?.detail || null;\n }\n\n async sendTextMessage(conversation, text, initialMessage = null) {\n const senderRole = conversation?.role || conversation?.raw?.role || '';\n const message = initialMessage || {\n id: randomId(),\n conversationId: conversation.id,\n from: this.currentUser?.userId || 'me',\n senderRole,\n direction: 'out',\n type: 'text',\n text,\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now()\n };\n saveLocalMessage(message, this.currentUser?.userId || '');\n if (!initialMessage) {\n this.emit('messageSent', message);\n }\n\n try {\n const response = await axios.post(appConfig.sendMessageApi, {\n sender: this.currentUser?.userId || '',\n target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),\n conversationType: conversation.type || conversation.raw?.type || 0,\n text\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '发送失败');\n }\n\n const sentMessage = {\n ...message,\n status: 'sent',\n deliveryStatus: 'sent',\n messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '',\n senderRole: response.data?.result?.senderRole || message.senderRole || '',\n serverTimestamp: Number(response.data?.result?.timestamp || 0) || null,\n timestamp: message.timestamp,\n displayTimestamp: message.displayTimestamp || message.timestamp\n };\n saveLocalMessage(sentMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', sentMessage);\n return sentMessage;\n } catch (error) {\n const failedMessage = {\n ...message,\n status: 'failed',\n deliveryStatus: '',\n error: error.response?.data?.message || error.message || '发送失败'\n };\n saveLocalMessage(failedMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', failedMessage);\n return failedMessage;\n }\n }\n\n async sendAttachmentMessage(conversation, { type, file, text = '' }, initialMessage = null) {\n const senderRole = conversation?.role || conversation?.raw?.role || '';\n const message = initialMessage || {\n id: randomId(),\n conversationId: conversation.id,\n from: this.currentUser?.userId || 'me',\n senderRole,\n direction: 'out',\n type,\n text,\n attachment: {\n type,\n name: file?.name || (type === 'image' ? '图片' : '文件'),\n mime: file?.type || '',\n size: file?.size || 0,\n url: type === 'image' && file ? URL.createObjectURL(file) : ''\n },\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now()\n };\n saveLocalMessage(message, this.currentUser?.userId || '');\n if (!initialMessage) {\n this.emit('messageSent', message);\n }\n\n try {\n const formData = new FormData();\n formData.append('sender', this.currentUser?.userId || '');\n formData.append('target', conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''));\n formData.append('conversationType', conversation.type || conversation.raw?.type || 0);\n formData.append('messageType', type);\n formData.append('text', text || '');\n formData.append('attachment', file);\n\n const response = await axios.post(appConfig.sendMessageApi, formData, {\n withCredentials: false\n });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '发送失败');\n }\n\n const sentMessage = {\n ...message,\n status: 'sent',\n deliveryStatus: 'sent',\n messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '',\n senderRole: response.data?.result?.senderRole || message.senderRole || '',\n attachment: response.data?.result?.attachment || message.attachment,\n serverTimestamp: Number(response.data?.result?.timestamp || 0) || null,\n timestamp: message.timestamp,\n displayTimestamp: message.displayTimestamp || message.timestamp\n };\n saveLocalMessage(sentMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', sentMessage);\n return sentMessage;\n } catch (error) {\n const failedMessage = {\n ...message,\n status: 'failed',\n deliveryStatus: '',\n error: error.response?.data?.message || error.message || '发送失败'\n };\n saveLocalMessage(failedMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', failedMessage);\n return failedMessage;\n }\n }\n\n getContactList() {\n return [];\n }\n\n async getServerContactList(userId) {\n if (!userId) {\n return [];\n }\n const response = await axios.post(appConfig.contactsApi, { userId }, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(appConfig.contactsApi)\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '联系人加载失败');\n }\n return (response.data?.result?.contacts || []).map(item => {\n return this.mapContact(item.uid, { alias: item.alias }, {\n uid: item.uid,\n displayName: item.displayName,\n name: item.name,\n mobile: item.mobile,\n portrait: item.portrait,\n address: item.address,\n friendAlias: item.alias\n });\n }).sort((a, b) => a.title.localeCompare(b.title, 'zh-CN'));\n }\n\n async addContact(userId, keyword, reason = '') {\n const response = await axios.post(appConfig.addContactApi, {\n userId,\n keyword,\n reason\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '添加联系人失败');\n }\n\n const item = response.data?.result?.contact;\n if (!item?.uid) {\n return null;\n }\n\n return this.mapContact(item.uid, { alias: item.alias }, {\n uid: item.uid,\n displayName: item.displayName,\n name: item.name,\n mobile: item.mobile,\n portrait: item.portrait,\n address: item.address,\n friendAlias: item.alias\n });\n }\n\n normalizeConversation(conversation) {\n const title = getTitle(conversation?.title, conversation?.target || '');\n return {\n ...conversation,\n id: conversation?.id || `${conversation?.type === 'single' ? 'single' : 'group'}-${conversation?.target}`,\n target: conversation?.target || conversation?.raw?.target || '',\n title,\n subtitle: conversation?.subtitle || '',\n unread: Number(conversation?.unread || 0),\n portrait: conversation?.portrait || '',\n avatarText: conversation?.avatarText || title.slice(0, 1).toUpperCase(),\n updatedAt: Number(conversation?.updatedAt || Date.now()),\n raw: conversation?.raw || {\n type: conversation?.type === 'single' ? 'single' : 'group',\n target: conversation?.target || '',\n line: 0\n }\n };\n }\n\n async createGroup(userId, { name, memberIds = [], announcement = '', welcomeText = '', channel = false }) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: channel ? 'create_channel' : 'create_group',\n userId,\n name,\n memberIds,\n announcement,\n welcomeText\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || (channel ? '创建公告群失败' : '创建群组失败'));\n }\n\n return this.normalizeConversation(response.data?.result?.conversation || {});\n }\n\n async joinGroup(userId, groupKey) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'join_group',\n userId,\n groupKey\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '加入群组失败');\n }\n\n return this.normalizeConversation(response.data?.result?.conversation || {});\n }\n\n async broadcastMessage(userId, targetIds, text) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'broadcast',\n userId,\n targetIds,\n text\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群发失败');\n }\n\n return response.data?.result || {};\n }\n\n async getGroupDetail(userId, groupId) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'group_detail',\n userId,\n groupId\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群资料加载失败');\n }\n\n return response.data?.result?.group || null;\n }\n\n async getGroupMembers(userId, groupId) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'group_members',\n userId,\n groupId\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群员加载失败');\n }\n\n return response.data?.result?.members || [];\n }\n\n async updateGroupAlias(userId, groupId, alias) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'update_group_alias',\n userId,\n groupId,\n alias\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '本群昵称保存失败');\n }\n\n return response.data?.result?.alias || '';\n }\n\n async leaveGroup(userId, groupId) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'leave_group',\n userId,\n groupId\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '退出群组失败');\n }\n\n return response.data?.result || {};\n }\n\n async dismissGroup(userId, groupId) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'dismiss_group',\n userId,\n groupId\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '解散群组失败');\n }\n\n return response.data?.result || {};\n }\n\n async transferGroup(userId, groupId, targetUserId) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'transfer_group',\n userId,\n groupId,\n targetUserId\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '转让群组失败');\n }\n\n return response.data?.result || {};\n }\n\n async setGroupAdmins(userId, groupId, adminIds) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'set_group_admins',\n userId,\n groupId,\n adminIds\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '管理员设置失败');\n }\n\n return response.data?.result || {};\n }\n\n async updateGroupProfile(userId, groupId, { name, announcement, welcomeText }) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'update_group_profile',\n userId,\n groupId,\n name,\n announcement,\n welcomeText\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群资料保存失败');\n }\n\n return response.data?.result || {};\n }\n\n async kickGroupMembers(userId, groupId, targetIds) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'kick_group_members',\n userId,\n groupId,\n targetIds\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '踢人失败');\n }\n\n return response.data?.result || {};\n }\n\n async updateGroupMuteSetting(userId, groupId, setting) {\n const response = await axios.post(appConfig.conversationActionsApi, {\n action: 'update_mute_setting',\n userId,\n groupId,\n ...setting\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '禁言设置保存失败');\n }\n\n return response.data?.result?.muteSetting || null;\n }\n\n async updateContactAlias(userId, targetId, alias) {\n const response = await axios.post(appConfig.updateAliasApi, {\n userId,\n targetId,\n alias\n }, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(appConfig.updateAliasApi)\n });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '备注名修改失败');\n }\n\n return response.data?.result?.contact?.alias || '';\n }\n\n async getProfile(userId) {\n const response = await axios.post(appConfig.profileApi, {\n action: 'get',\n userId\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '用户资料加载失败');\n }\n\n return response.data?.result?.profile || null;\n }\n\n async updateProfile(userId, { displayName, portraitFile }) {\n const formData = new FormData();\n formData.append('action', 'update');\n formData.append('userId', userId);\n formData.append('displayName', displayName);\n if (portraitFile) {\n formData.append('portraitFile', portraitFile);\n }\n\n const response = await axios.post(appConfig.profileApi, formData, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(appConfig.appServer)\n });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '用户资料保存失败');\n }\n\n return response.data?.result?.profile || null;\n }\n\n async changePassword({ oldPassword, newPassword }) {\n const response = await axios.post(appConfig.changePasswordApi, {\n oldPassword,\n newPassword\n }, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(appConfig.changePasswordApi)\n });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || response.data?.msg || '密码修改失败');\n }\n\n return true;\n }\n\n async resetPasswordWithCode({ mobile, resetCode, newPassword }) {\n const response = await axios.post(appConfig.resetPasswordApi, {\n mobile,\n resetCode,\n newPassword\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || response.data?.msg || '密码设置失败');\n }\n\n return true;\n }\n\n refreshContactList() {\n const contacts = this.getContactList();\n this.emit('contactsChanged', contacts);\n return contacts;\n }\n\n createSingleConversation(userId, userInfo = null) {\n const title = getTitle(userInfo?.title || userInfo?.displayName || userInfo?.name, userId);\n return {\n id: `single-${userId}`,\n type: 'single',\n target: userId,\n title,\n subtitle: '',\n unread: 0,\n portrait: userInfo?.portrait || '',\n avatarText: title.slice(0, 1).toUpperCase(),\n updatedAt: Date.now(),\n raw: { type: 'single', target: userId, line: 0 }\n };\n }\n\n mapContact(userId, friend, userInfo) {\n const title = getTitle(userInfo?.friendAlias || friend?.alias || userInfo?.displayName || userInfo?.name, userId);\n return {\n id: userId,\n uid: userId,\n title,\n subtitle: userInfo?.mobile || userInfo?.name || userId,\n portrait: userInfo?.portrait || '',\n address: userInfo?.address || '',\n avatarText: title.slice(0, 1).toUpperCase(),\n alias: friend?.alias || userInfo?.friendAlias || '',\n rawFriend: friend,\n rawUser: userInfo\n };\n }\n\n on(eventName, handler) {\n if (!this.listeners.has(eventName)) {\n this.listeners.set(eventName, new Set());\n }\n this.listeners.get(eventName).add(handler);\n return () => this.off(eventName, handler);\n }\n\n off(eventName, handler) {\n this.listeners.get(eventName)?.delete(handler);\n }\n\n emit(eventName, payload) {\n this.listeners.get(eventName)?.forEach(handler => handler(payload));\n }\n\n persistAppToken(url, response) {\n const appToken = response.headers?.authtoken || response.headers?.authToken;\n if (appToken) {\n localStorage.setItem(appConfig.authTokenStoragePrefix + this.getUrlHost(url), appToken);\n }\n }\n\n getAppAuthHeaders(url) {\n const host = this.getUrlHost(url);\n if (!host) {\n return {};\n }\n const token = localStorage.getItem(appConfig.authTokenStoragePrefix + host);\n return token ? { authToken: token } : {};\n }\n\n getUrlHost(url) {\n try {\n return new URL(url, window.location.origin).host;\n } catch (error) {\n return '';\n }\n }\n}\n\nexport const imClient = new HttpImClient();\n","\n\n\n","import { defineStore } from 'pinia';\nimport { imClient } from '@/services/imClient';\nimport { appConfig } from '@/config';\nimport { useSessionStore } from '@/stores/session';\n\nconst LOCAL_CONVERSATION_STORAGE_KEY = 'qmt-web-im-local-conversations-v2';\nconst LOCAL_FAVORITE_MESSAGES_KEY = 'qmt-web-im-favorite-messages-v1';\n\nfunction scopedStorageKey(baseKey) {\n const session = useSessionStore();\n const scope = `${appConfig.appServer || ''}:${session.userId || 'anonymous'}`;\n return `${baseKey}:${encodeURIComponent(scope)}`;\n}\n\nfunction readFavoriteMessages() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY)) || '[]');\n } catch (error) {\n return [];\n }\n}\n\nfunction writeFavoriteMessages(messages) {\n localStorage.setItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY), JSON.stringify(messages));\n}\n\nfunction readLocalConversations() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY)) || '[]');\n } catch (error) {\n return [];\n }\n}\n\nfunction writeLocalConversations(conversations) {\n localStorage.setItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY), JSON.stringify(conversations));\n}\n\nfunction randomId() {\n if (window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID().replaceAll('-', '');\n }\n return `${Date.now()}${Math.random().toString(16).slice(2)}`;\n}\n\nfunction messageKey(message) {\n return message.id || message.messageUid;\n}\n\nfunction messageStableKey(message) {\n return String(message?.messageUid || message?.id || '');\n}\n\nfunction messageActivityTimestamp(message) {\n return Number(message?.activityTimestamp || message?.editedAt || message?.displayTimestamp || message?.timestamp || 0);\n}\n\nfunction isRecalledMessage(message) {\n return Boolean(message?.recalled) || message?.status === 'recalled';\n}\n\nfunction attachmentLabel(message) {\n const attachment = message?.attachment;\n if (!attachment) {\n return '';\n }\n if (attachment.type === 'image') {\n return '[图片]';\n }\n return `[文件] ${attachment.name || '文件'}`;\n}\n\nfunction messagePreviewText(message) {\n if (isRecalledMessage(message)) {\n return `[${message?.recallStatus || '已撤回'}]`;\n }\n const text = String(message?.text || '').replace(/\\s+/g, ' ').trim();\n return text || attachmentLabel(message);\n}\n\nfunction quotePrefix(message) {\n const text = messagePreviewText(message);\n return text.length > 48 ? `${text.slice(0, 48)}...` : text;\n}\n\nasync function writeClipboard(text) {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n const element = document.createElement('textarea');\n element.value = text;\n element.setAttribute('readonly', 'readonly');\n element.style.position = 'fixed';\n element.style.left = '-9999px';\n document.body.appendChild(element);\n element.select();\n document.execCommand('copy');\n document.body.removeChild(element);\n}\n\nfunction isSameMessage(left, right) {\n if (left.messageUid && right.messageUid && left.messageUid === right.messageUid) {\n return true;\n }\n if (left.id && right.id && left.id === right.id) {\n return true;\n }\n return left.direction === right.direction\n && left.text === right.text\n && (left.type || 'text') === (right.type || 'text')\n && Math.abs(Number(left.displayTimestamp || left.timestamp || 0) - Number(right.displayTimestamp || right.timestamp || 0)) < 15000;\n}\n\nfunction hasExactMessage(messages, message) {\n return messages.some(item => {\n if (item.id && message.id && item.id === message.id) {\n return true;\n }\n return item.messageUid && message.messageUid && item.messageUid === message.messageUid;\n });\n}\n\nfunction shouldUseMessagePolling() {\n return imClient.shouldUseMessagePolling ? imClient.shouldUseMessagePolling() : true;\n}\n\nfunction canMarkReadNow(options = {}) {\n if (typeof document === 'undefined') {\n return false;\n }\n if (document.visibilityState !== 'visible') {\n return false;\n }\n if (options.userAction) {\n return true;\n }\n return true;\n}\n\nfunction mergeVisibleMessages(currentMessages, syncedMessages) {\n const merged = [...syncedMessages];\n currentMessages.forEach(currentMessage => {\n const exists = merged.some(message => isSameMessage(message, currentMessage));\n const shouldKeepLocal = currentMessage.status === 'sending'\n || currentMessage.status === 'failed'\n || (currentMessage.direction === 'out'\n && currentMessage.status === 'sent'\n && Date.now() - Number(currentMessage.timestamp || 0) < 30000);\n if (!exists && shouldKeepLocal) {\n merged.push(currentMessage);\n }\n });\n\n return merged\n .filter((message, index, messages) => {\n const key = messageKey(message);\n return messages.findIndex(item => messageKey(item) === key) === index;\n })\n .sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0));\n}\n\nfunction incomingEditedMessages(previousMessages, nextMessages) {\n const previousByKey = new Map();\n (previousMessages || []).forEach(message => {\n const key = messageStableKey(message);\n if (key) {\n previousByKey.set(key, message);\n }\n });\n\n return (nextMessages || []).filter(message => {\n if (message.direction !== 'in') {\n return false;\n }\n const editedAt = Number(message.editedAt || 0);\n if (editedAt <= 0) {\n return false;\n }\n const previous = previousByKey.get(messageStableKey(message));\n return previous && editedAt > Number(previous.editedAt || 0);\n });\n}\n\nlet notificationAudioContext = null;\n\nfunction playNotificationSound() {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (!AudioContext) {\n return;\n }\n notificationAudioContext = notificationAudioContext || new AudioContext();\n if (notificationAudioContext.state === 'suspended') {\n notificationAudioContext.resume().catch(() => {});\n }\n const oscillator = notificationAudioContext.createOscillator();\n const gain = notificationAudioContext.createGain();\n const startAt = notificationAudioContext.currentTime;\n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(880, startAt);\n oscillator.frequency.setValueAtTime(660, startAt + 0.1);\n gain.gain.setValueAtTime(0.0001, startAt);\n gain.gain.exponentialRampToValueAtTime(0.12, startAt + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, startAt + 0.22);\n oscillator.connect(gain);\n gain.connect(notificationAudioContext.destination);\n oscillator.start(startAt);\n oscillator.stop(startAt + 0.24);\n } catch (error) {\n // Notification sound is best-effort; browsers may block audio until user interaction.\n }\n}\n\nexport const useConversationStore = defineStore('conversations', {\n state: () => ({\n activeId: '',\n conversations: [],\n messagesByConversation: {},\n visibleMessagesByConversation: {},\n eventsBound: false,\n usingDemoData: false,\n loading: false,\n syncTimer: null,\n conversationSyncTimer: null,\n readPresenceEventsBound: false,\n syncInFlight: false,\n pendingReadReceiptConversationId: '',\n conversationSyncInFlight: false,\n syncAfterSendTimer: null,\n optimisticMessagesByConversation: {},\n quotedMessage: null,\n forwardingMessages: [],\n editingMessage: null,\n editingText: '',\n editingMode: '',\n messageDetailOpen: false,\n messageDetailLoading: false,\n messageDetailError: '',\n messageDetail: null,\n attentionMessageId: '',\n attentionMessageTimer: null,\n selectionMode: false,\n selectedMessageIds: [],\n favoriteMessages: [],\n activeFavoriteKey: '',\n actionNotice: '',\n actionError: ''\n }),\n getters: {\n activeConversation(state) {\n return state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null;\n },\n activeMessages(state) {\n return state.visibleMessagesByConversation[state.activeId] || [];\n },\n totalUnread(state) {\n return state.conversations.reduce((sum, item) => sum + Number(item.unread || 0), 0);\n },\n canSendActiveConversation(state) {\n const conversation = state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null;\n if (!conversation) {\n return false;\n }\n if (conversation.type !== 'channel') {\n return true;\n }\n return ['owner', 'admin'].includes(conversation.role || conversation.raw?.role || '');\n },\n favoriteMessageIds(state) {\n return state.favoriteMessages.map(message => message.key);\n },\n activeFavorite(state) {\n return state.favoriteMessages.find(message => message.key === state.activeFavoriteKey)\n || state.favoriteMessages[0]\n || null;\n },\n selectedMessages(state) {\n const selectedIds = new Set(state.selectedMessageIds);\n return (state.visibleMessagesByConversation[state.activeId] || [])\n .filter(message => selectedIds.has(messageStableKey(message)));\n }\n },\n actions: {\n bootstrapDemoData() {\n const session = useSessionStore();\n this.bindImEvents();\n this.usingDemoData = false;\n if (!session.userId) {\n this.clearUserState();\n return;\n }\n this.loadScopedLocalState();\n this.startMessageSync();\n },\n loadScopedLocalState() {\n this.conversations = readLocalConversations();\n this.favoriteMessages = readFavoriteMessages();\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n this.activeId = this.conversations[0]?.id || '';\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n this.quotedMessage = null;\n this.forwardingMessages = [];\n this.editingMessage = null;\n this.editingText = '';\n this.editingMode = '';\n this.messageDetailOpen = false;\n this.messageDetailLoading = false;\n this.messageDetailError = '';\n this.messageDetail = null;\n this.selectionMode = false;\n this.selectedMessageIds = [];\n if (this.activeId) {\n this.loadActiveMessages({ allowReadReceipt: true });\n }\n },\n clearUserState() {\n window.clearInterval(this.syncTimer);\n window.clearInterval(this.conversationSyncTimer);\n window.clearTimeout(this.syncAfterSendTimer);\n window.clearTimeout(this.attentionMessageTimer);\n this.syncTimer = null;\n this.conversationSyncTimer = null;\n this.syncAfterSendTimer = null;\n this.attentionMessageTimer = null;\n this.syncInFlight = false;\n this.conversationSyncInFlight = false;\n this.pendingReadReceiptConversationId = '';\n this.activeId = '';\n this.conversations = [];\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n this.quotedMessage = null;\n this.forwardingMessages = [];\n this.editingMessage = null;\n this.editingText = '';\n this.editingMode = '';\n this.messageDetailOpen = false;\n this.messageDetailLoading = false;\n this.messageDetailError = '';\n this.messageDetail = null;\n this.attentionMessageId = '';\n this.selectionMode = false;\n this.selectedMessageIds = [];\n this.favoriteMessages = [];\n this.activeFavoriteKey = '';\n this.actionNotice = '';\n this.actionError = '';\n },\n bindImEvents() {\n if (this.eventsBound) {\n return;\n }\n this.eventsBound = true;\n imClient.on('messageSent', message => {\n this.appendMessage(message.conversationId, message);\n });\n imClient.on('messageReceived', message => {\n this.appendMessage(message.conversationId, message);\n if (message.conversationId === this.activeId) {\n this.syncActiveMessages({ allowReadReceipt: true });\n }\n });\n imClient.on('messageStatusChanged', message => {\n this.replaceMessage(message.conversationId, message);\n });\n imClient.on('conversationsChanged', remoteConversations => {\n this.usingDemoData = false;\n this.applyRemoteConversations(remoteConversations);\n });\n },\n setActiveConversation(id) {\n this.activeId = id;\n const conversation = this.conversations.find(item => item.id === id);\n if (conversation) {\n conversation.unread = 0;\n }\n this.loadActiveMessages({ allowReadReceipt: true, userAction: true });\n },\n sendText(text) {\n const conversation = this.activeConversation;\n if (!conversation || !text.trim()) {\n return;\n }\n let value = text.trim();\n if (this.quotedMessage) {\n value = `引用:${quotePrefix(this.quotedMessage)}\\n${value}`;\n this.quotedMessage = null;\n }\n const message = {\n id: randomId(),\n conversationId: conversation.id,\n from: 'me',\n direction: 'out',\n type: 'text',\n text: value,\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now(),\n displayTimestamp: Date.now()\n };\n this.appendVisibleMessage(conversation.id, message);\n this.appendMessage(conversation.id, message);\n imClient.sendTextMessage(conversation, value, message);\n conversation.subtitle = value;\n conversation.updatedAt = Date.now();\n writeLocalConversations(this.conversations);\n window.clearTimeout(this.syncAfterSendTimer);\n this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 250);\n },\n sendAttachment({ type, file, text = '' }) {\n const conversation = this.activeConversation;\n if (!conversation || !file || !['image', 'file'].includes(type)) {\n return;\n }\n let value = text.trim();\n if (this.quotedMessage) {\n value = `引用:${quotePrefix(this.quotedMessage)}\\n${value}`.trim();\n this.quotedMessage = null;\n }\n const now = Date.now();\n const message = {\n id: randomId(),\n conversationId: conversation.id,\n from: 'me',\n senderRole: conversation.role || conversation.raw?.role || '',\n direction: 'out',\n type,\n text: value,\n attachment: {\n type,\n name: file.name || (type === 'image' ? '图片' : '文件'),\n mime: file.type || '',\n size: file.size || 0,\n url: type === 'image' ? URL.createObjectURL(file) : ''\n },\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: now,\n displayTimestamp: now\n };\n this.appendVisibleMessage(conversation.id, message);\n this.appendMessage(conversation.id, message);\n imClient.sendAttachmentMessage(conversation, { type, file, text: value }, message);\n conversation.subtitle = messagePreviewText(message);\n conversation.updatedAt = now;\n writeLocalConversations(this.conversations);\n window.clearTimeout(this.syncAfterSendTimer);\n this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 350);\n },\n async sendTextToConversation(conversation, text) {\n if (!conversation || !text.trim()) {\n return null;\n }\n const value = text.trim();\n const message = {\n id: randomId(),\n conversationId: conversation.id,\n from: 'me',\n direction: 'out',\n type: 'text',\n text: value,\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now(),\n displayTimestamp: Date.now()\n };\n this.appendMessage(conversation.id, message);\n const sentMessage = await imClient.sendTextMessage(conversation, value, message);\n this.replaceMessage(conversation.id, sentMessage);\n return sentMessage;\n },\n upsertConversation(conversation) {\n const index = this.conversations.findIndex(item => item.id === conversation.id);\n if (index >= 0) {\n this.conversations.splice(index, 1, {\n ...this.conversations[index],\n ...conversation\n });\n } else {\n this.conversations.unshift(conversation);\n }\n this.usingDemoData = false;\n writeLocalConversations(this.conversations);\n },\n removeConversation(conversationId) {\n this.conversations = this.conversations.filter(conversation => conversation.id !== conversationId);\n const {\n [conversationId]: removedMessages,\n ...messagesByConversation\n } = this.messagesByConversation;\n const {\n [conversationId]: removedVisibleMessages,\n ...visibleMessagesByConversation\n } = this.visibleMessagesByConversation;\n const {\n [conversationId]: removedOptimisticMessages,\n ...optimisticMessagesByConversation\n } = this.optimisticMessagesByConversation;\n void removedMessages;\n void removedVisibleMessages;\n void removedOptimisticMessages;\n this.messagesByConversation = messagesByConversation;\n this.visibleMessagesByConversation = visibleMessagesByConversation;\n this.optimisticMessagesByConversation = optimisticMessagesByConversation;\n if (this.activeId === conversationId) {\n this.activeId = this.conversations[0]?.id || '';\n }\n writeLocalConversations(this.conversations);\n if (this.activeId) {\n this.loadActiveMessages();\n }\n },\n applyRemoteConversations(remoteConversations) {\n const remote = Array.isArray(remoteConversations) ? remoteConversations : [];\n if (!remote.length && this.conversations.length) {\n return;\n }\n\n const merged = new Map();\n this.conversations.forEach(conversation => {\n merged.set(conversation.id, conversation);\n });\n remote.forEach(conversation => {\n const unread = conversation.id === this.activeId && canMarkReadNow() ? 0 : Number(conversation.unread || 0);\n merged.set(conversation.id, {\n ...(merged.get(conversation.id) || {}),\n ...conversation,\n unread\n });\n });\n\n this.conversations = Array.from(merged.values())\n .sort((a, b) => Number(b.updatedAt || 0) - Number(a.updatedAt || 0))\n .slice(0, 100);\n\n if (!this.conversations.length) {\n this.activeId = '';\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n writeLocalConversations(this.conversations);\n return;\n }\n\n if (!this.conversations.find(item => item.id === this.activeId)) {\n this.activeId = this.conversations[0].id;\n }\n writeLocalConversations(this.conversations);\n this.loadActiveMessages();\n },\n appendMessage(conversationId, message) {\n if (!this.messagesByConversation[conversationId]) {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: []\n };\n }\n if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent')) {\n this.keepOptimisticMessage(conversationId, message);\n }\n if (!hasExactMessage(this.messagesByConversation[conversationId], message)) {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: [...this.messagesByConversation[conversationId], message]\n };\n }\n this.updateConversationFromMessage(conversationId, message);\n this.syncVisibleMessages(conversationId);\n writeLocalConversations(this.conversations);\n },\n removeMessages(conversationId, messages) {\n const ids = new Set(messages.flatMap(message => [message.id, message.messageUid].filter(Boolean).map(String)));\n const filterMessages = list => (list || []).filter(message => {\n return ![message.id, message.messageUid].filter(Boolean).some(id => ids.has(String(id)));\n });\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: filterMessages(this.messagesByConversation[conversationId])\n };\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: filterMessages(this.visibleMessagesByConversation[conversationId])\n };\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: filterMessages(this.optimisticMessagesByConversation[conversationId])\n };\n this.selectedMessageIds = this.selectedMessageIds.filter(id => !ids.has(String(id)));\n },\n replaceLocalMessage(conversationId, targetMessage, nextMessage) {\n const keys = new Set([targetMessage.id, targetMessage.messageUid].filter(Boolean).map(String));\n const replaceInList = list => (list || []).map(message => {\n const matched = [message.id, message.messageUid].filter(Boolean).some(id => keys.has(String(id)));\n return matched ? { ...message, ...nextMessage } : message;\n });\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: replaceInList(this.messagesByConversation[conversationId])\n };\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: replaceInList(this.visibleMessagesByConversation[conversationId])\n };\n },\n updateConversationFromMessage(conversationId, message) {\n const conversation = this.conversations.find(item => item.id === conversationId);\n if (!conversation) {\n return;\n }\n\n conversation.subtitle = message.text || conversation.subtitle || '';\n conversation.updatedAt = messageActivityTimestamp(message) || Date.now();\n if (message.direction === 'in') {\n conversation.unread = conversationId === this.activeId ? 0 : Number(conversation.unread || 0) + 1;\n }\n this.conversations = [...this.conversations]\n .sort((a, b) => Number(b.updatedAt || 0) - Number(a.updatedAt || 0));\n },\n appendVisibleMessage(conversationId, message) {\n const messages = this.visibleMessagesByConversation[conversationId] || [];\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: [...messages.filter(item => item.id !== message.id), message]\n .sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0))\n };\n },\n replaceMessage(conversationId, message) {\n if (!this.messagesByConversation[conversationId]) {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: []\n };\n }\n if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent' || message.status === 'failed')) {\n this.keepOptimisticMessage(conversationId, message);\n }\n const index = this.messagesByConversation[conversationId].findIndex(item => item.id === message.id);\n if (index >= 0) {\n const messages = [...this.messagesByConversation[conversationId]];\n messages.splice(index, 1, message);\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: messages\n };\n } else {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: [...this.messagesByConversation[conversationId], message]\n };\n }\n this.syncVisibleMessages(conversationId);\n },\n syncVisibleMessages(conversationId) {\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: mergeVisibleMessages(\n this.optimisticMessagesByConversation[conversationId] || [],\n this.messagesByConversation[conversationId] || []\n )\n };\n },\n keepOptimisticMessage(conversationId, message) {\n if (!this.optimisticMessagesByConversation[conversationId]) {\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: []\n };\n }\n const messages = this.optimisticMessagesByConversation[conversationId];\n const index = messages.findIndex(item => item.id === message.id);\n let nextMessages;\n if (index >= 0) {\n nextMessages = [...messages];\n nextMessages.splice(index, 1, message);\n } else {\n nextMessages = [...messages, message];\n }\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: nextMessages\n };\n },\n pruneOptimisticMessages(conversationId, syncedMessages) {\n const messages = this.optimisticMessagesByConversation[conversationId] || [];\n if (!messages.length) {\n return;\n }\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: messages.filter(message => {\n const remoteMatched = syncedMessages.some(syncedMessage => {\n return syncedMessage.id !== message.id && isSameMessage(syncedMessage, message);\n });\n if (remoteMatched && message.status !== 'failed') {\n return false;\n }\n return Date.now() - Number(message.displayTimestamp || message.timestamp || 0) < 30000 || message.status === 'failed';\n })\n };\n },\n loadActiveMessages(options = {}) {\n const syncOptions = typeof options === 'boolean'\n ? { allowReadReceipt: options }\n : options;\n const conversation = this.activeConversation;\n if (!conversation) {\n return;\n }\n this.loading = true;\n const messages = imClient.getMessages(conversation, 30);\n this.pruneOptimisticMessages(conversation.id, messages);\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversation.id]: mergeVisibleMessages(this.messagesByConversation[conversation.id] || [], messages)\n };\n this.syncVisibleMessages(conversation.id);\n this.loading = false;\n this.syncActiveMessages(syncOptions);\n },\n async syncActiveMessages(options = {}) {\n const conversation = this.activeConversation;\n if (!conversation) {\n return;\n }\n const wantsReadReceipt = Boolean(options.allowReadReceipt);\n const explicitReadReceipt = wantsReadReceipt && canMarkReadNow({ userAction: Boolean(options.userAction) });\n const pollingReadReceipt = canMarkReadNow();\n const markRead = explicitReadReceipt || pollingReadReceipt;\n\n if (this.syncInFlight) {\n if (wantsReadReceipt) {\n this.pendingReadReceiptConversationId = conversation.id;\n }\n return;\n }\n this.syncInFlight = true;\n const syncedConversationId = conversation.id;\n const previousMessages = this.messagesByConversation[syncedConversationId] || [];\n try {\n const messages = await imClient.fetchRemoteMessages(conversation, 50, {\n markRead\n });\n const editedIncomingMessages = incomingEditedMessages(previousMessages, messages);\n this.pruneOptimisticMessages(syncedConversationId, messages);\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [syncedConversationId]: mergeVisibleMessages(this.messagesByConversation[syncedConversationId] || [], messages)\n };\n this.syncVisibleMessages(syncedConversationId);\n if (editedIncomingMessages.length && syncedConversationId === this.activeId) {\n this.focusMessage(editedIncomingMessages.sort((a, b) => messageActivityTimestamp(b) - messageActivityTimestamp(a))[0]);\n playNotificationSound();\n }\n const latest = messages.reduce((latestMessage, message) => {\n if (!latestMessage || messageActivityTimestamp(message) > messageActivityTimestamp(latestMessage)) {\n return message;\n }\n return latestMessage;\n }, null);\n if (latest) {\n conversation.subtitle = messagePreviewText(latest);\n conversation.updatedAt = messageActivityTimestamp(latest);\n writeLocalConversations(this.conversations);\n }\n } catch (error) {\n // Keep the local view usable if a polling request misses.\n } finally {\n this.syncInFlight = false;\n if (this.pendingReadReceiptConversationId === this.activeId && canMarkReadNow()) {\n this.pendingReadReceiptConversationId = '';\n window.setTimeout(() => this.syncActiveMessages({ allowReadReceipt: true }), 0);\n }\n }\n },\n startMessageSync() {\n this.bindReadPresenceEvents();\n if (!this.syncTimer) {\n this.syncTimer = window.setInterval(() => {\n this.syncActiveMessages();\n }, Math.max(250, appConfig.syncIntervalMs));\n }\n if (!this.conversationSyncTimer) {\n this.conversationSyncTimer = window.setInterval(() => {\n this.refreshRemoteConversations();\n }, 2000);\n this.refreshRemoteConversations();\n }\n },\n bindReadPresenceEvents() {\n if (this.readPresenceEventsBound || typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n this.readPresenceEventsBound = true;\n const syncWhenReadable = () => {\n if (canMarkReadNow()) {\n this.syncActiveMessages({ allowReadReceipt: true });\n }\n };\n window.addEventListener('focus', syncWhenReadable);\n document.addEventListener('visibilitychange', syncWhenReadable);\n },\n async refreshRemoteConversations() {\n this.bindImEvents();\n this.usingDemoData = false;\n if (this.conversationSyncInFlight) {\n return;\n }\n this.conversationSyncInFlight = true;\n try {\n const remoteConversations = await imClient.fetchRemoteConversations(50);\n this.applyRemoteConversations(remoteConversations);\n } catch (error) {\n imClient.refreshConversationList();\n } finally {\n this.conversationSyncInFlight = false;\n }\n },\n setActionNotice(message) {\n this.actionNotice = message;\n this.actionError = '';\n window.clearTimeout(this.actionNoticeTimer);\n this.actionNoticeTimer = window.setTimeout(() => {\n this.actionNotice = '';\n }, 1800);\n },\n setActionError(message) {\n this.actionError = message;\n this.actionNotice = '';\n window.clearTimeout(this.actionErrorTimer);\n this.actionErrorTimer = window.setTimeout(() => {\n this.actionError = '';\n }, 2400);\n },\n focusMessage(message) {\n const key = messageStableKey(message);\n if (!key) {\n return;\n }\n this.attentionMessageId = key;\n window.clearTimeout(this.attentionMessageTimer);\n this.attentionMessageTimer = window.setTimeout(() => {\n if (this.attentionMessageId === key) {\n this.attentionMessageId = '';\n }\n }, 2800);\n },\n async handleMessageAction({ action, message }) {\n if (!message) {\n return;\n }\n if (action === 'copy') {\n await this.copyMessages([message]);\n } else if (action === 'edit') {\n this.startEditMessage(message);\n } else if (action === 'delete') {\n this.deleteMessages([message]);\n } else if (action === 'forward') {\n this.startForward([message]);\n } else if (action === 'favorite') {\n this.toggleFavorite(message);\n } else if (action === 'detail') {\n await this.openMessageDetail(message);\n } else if (action === 'quote') {\n this.quoteMessage(message);\n } else if (action === 'select') {\n this.enterSelectionMode(message);\n } else if (action === 'recall') {\n await this.recallMessage(message);\n }\n },\n async openMessageDetail(message) {\n const conversation = this.activeConversation;\n if (!conversation || !message) {\n return;\n }\n const key = messageStableKey(message);\n this.messageDetailOpen = true;\n this.messageDetailLoading = true;\n this.messageDetailError = '';\n this.messageDetail = {\n messageUid: key,\n conversationType: conversation.type || conversation.raw?.type || 'single',\n sentAt: Number(message.displayTimestamp || message.timestamp || 0),\n editedAt: Number(message.editedAt || 0),\n recalled: isRecalledMessage(message),\n localOnly: true,\n sender: {\n uid: message.from || '',\n name: message.senderName || message.from || ''\n }\n };\n try {\n if (!/^\\d+$/.test(key)) {\n this.messageDetailError = '本地临时消息暂无送达/已读详情';\n return;\n }\n const detail = await imClient.getMessageDetail(conversation, message);\n this.messageDetail = detail || this.messageDetail;\n } catch (error) {\n this.messageDetailError = error.message || '消息详情加载失败';\n } finally {\n this.messageDetailLoading = false;\n }\n },\n closeMessageDetail() {\n this.messageDetailOpen = false;\n this.messageDetailLoading = false;\n this.messageDetailError = '';\n this.messageDetail = null;\n },\n async copyMessages(messages) {\n const text = messages.map(message => message.text || '').join('\\n');\n if (!text.trim()) {\n return;\n }\n try {\n await writeClipboard(text);\n this.setActionNotice(messages.length > 1 ? '已复制所选消息' : '已复制');\n } catch (error) {\n this.setActionError('复制失败');\n }\n },\n deleteMessages(messages) {\n const conversation = this.activeConversation;\n if (!conversation || !messages.length) {\n return;\n }\n imClient.hideMessages(conversation, messages);\n this.removeMessages(conversation.id, messages);\n if (!this.selectedMessageIds.length) {\n this.selectionMode = false;\n }\n this.setActionNotice(messages.length > 1 ? '已删除所选消息' : '已删除');\n },\n toggleFavorite(message) {\n const key = messageStableKey(message);\n if (!key) {\n return;\n }\n const index = this.favoriteMessages.findIndex(item => item.key === key);\n if (index >= 0) {\n this.favoriteMessages.splice(index, 1);\n if (this.activeFavoriteKey === key) {\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n }\n this.setActionNotice('已取消收藏');\n } else {\n const conversation = this.conversations.find(item => item.id === message.conversationId) || {};\n this.favoriteMessages.unshift({\n key,\n id: message.id,\n messageUid: message.messageUid,\n conversationId: message.conversationId,\n conversationTitle: conversation.title || message.conversationTitle || '',\n type: message.type || 'text',\n text: message.text || '',\n preview: messagePreviewText(message),\n senderName: message.senderName || message.from || '',\n timestamp: Number(message.displayTimestamp || message.timestamp || Date.now()),\n editedAt: Number(message.editedAt || 0),\n recalled: isRecalledMessage(message),\n recallStatus: message.recallStatus || (isRecalledMessage(message) ? '已撤回' : ''),\n attachment: message.attachment ? { ...message.attachment } : null\n });\n this.activeFavoriteKey = key;\n this.setActionNotice('已收藏');\n }\n this.favoriteMessages = this.favoriteMessages.slice(0, 200);\n writeFavoriteMessages(this.favoriteMessages);\n },\n setActiveFavorite(key) {\n this.activeFavoriteKey = String(key || '');\n },\n removeFavorite(key) {\n const value = String(key || '');\n if (!value) {\n return;\n }\n this.favoriteMessages = this.favoriteMessages.filter(message => message.key !== value);\n if (this.activeFavoriteKey === value) {\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n }\n writeFavoriteMessages(this.favoriteMessages);\n },\n quoteMessage(message) {\n this.quotedMessage = {\n ...message,\n quoteText: quotePrefix(message)\n };\n this.setActionNotice('已引用,输入后发送');\n },\n cancelQuote() {\n this.quotedMessage = null;\n },\n enterSelectionMode(message = null) {\n this.selectionMode = true;\n if (message) {\n const key = messageStableKey(message);\n this.selectedMessageIds = key ? [key] : [];\n }\n },\n toggleSelectedMessage(message) {\n const key = messageStableKey(message);\n if (!key) {\n return;\n }\n const selected = new Set(this.selectedMessageIds);\n if (selected.has(key)) {\n selected.delete(key);\n } else {\n selected.add(key);\n }\n this.selectedMessageIds = Array.from(selected);\n this.selectionMode = this.selectedMessageIds.length > 0;\n },\n clearSelection() {\n this.selectionMode = false;\n this.selectedMessageIds = [];\n },\n copySelectedMessages() {\n return this.copyMessages(this.selectedMessages);\n },\n deleteSelectedMessages() {\n this.deleteMessages(this.selectedMessages);\n },\n startForward(messages) {\n this.forwardingMessages = messages.filter(message => message?.text);\n if (!this.forwardingMessages.length) {\n this.setActionError('没有可转发的消息');\n }\n },\n startForwardSelectedMessages() {\n this.startForward(this.selectedMessages);\n },\n cancelForward() {\n this.forwardingMessages = [];\n },\n startEditMessage(message) {\n const isResend = isRecalledMessage(message);\n if (!isResend && !message?.text) {\n this.setActionError('没有可编辑的文字内容');\n return;\n }\n this.editingMessage = message;\n this.editingText = message.text || '';\n this.editingMode = isResend ? 'resend' : 'edit';\n },\n cancelEditMessage() {\n this.editingMessage = null;\n this.editingText = '';\n this.editingMode = '';\n },\n async completeEditMessage() {\n const conversation = this.activeConversation;\n const message = this.editingMessage;\n const text = this.editingText.trim();\n const isResend = this.editingMode === 'resend' || isRecalledMessage(message);\n if (!conversation || !message) {\n this.cancelEditMessage();\n return;\n }\n if (!text) {\n this.setActionError('编辑内容不能为空');\n return;\n }\n if (!isResend && text === String(message.text || '').trim()) {\n this.cancelEditMessage();\n return;\n }\n try {\n if (isResend) {\n await this.sendTextToConversation(conversation, text);\n this.cancelEditMessage();\n this.setActionNotice('已重新发送');\n return;\n }\n const editedMessage = await imClient.editMessage(conversation, message, text);\n this.replaceLocalMessage(conversation.id, message, editedMessage);\n if (messageActivityTimestamp(editedMessage) >= Number(conversation.updatedAt || 0)) {\n conversation.subtitle = editedMessage.text;\n conversation.updatedAt = messageActivityTimestamp(editedMessage);\n writeLocalConversations(this.conversations);\n }\n this.cancelEditMessage();\n this.setActionNotice('已编辑');\n } catch (error) {\n this.setActionError(error.message || '编辑失败');\n }\n },\n async completeForward(targetConversationId) {\n const target = this.conversations.find(conversation => conversation.id === targetConversationId);\n if (!target || !this.forwardingMessages.length) {\n return;\n }\n const text = this.forwardingMessages\n .map(message => `转发:${message.text || ''}`)\n .join('\\n\\n');\n try {\n await this.sendTextToConversation(target, text);\n this.forwardingMessages = [];\n this.clearSelection();\n this.setActionNotice('已转发');\n } catch (error) {\n this.setActionError(error.message || '转发失败');\n }\n },\n async recallMessage(message) {\n const conversation = this.activeConversation;\n if (!conversation) {\n return;\n }\n try {\n await imClient.recallMessage(conversation, message);\n if (message.direction !== 'out') {\n this.removeMessages(conversation.id, [message]);\n this.setActionNotice('已撤回');\n this.syncActiveMessages();\n return;\n }\n this.replaceLocalMessage(conversation.id, message, {\n status: 'recalled',\n deliveryStatus: '',\n recalled: true,\n recallStatus: '已撤回'\n });\n this.setActionNotice('已撤回');\n } catch (error) {\n this.setActionError(error.message || '撤回失败');\n }\n },\n async createGroup(options = {}) {\n const session = useSessionStore();\n if (!session.userId) {\n this.setActionError('请先登录');\n return false;\n }\n try {\n const conversation = await imClient.createGroup(session.userId, options);\n this.upsertConversation(conversation);\n this.setActiveConversation(conversation.id);\n this.setActionNotice(options.channel ? '公告群已创建' : '群组已创建');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || (options.channel ? '创建公告群失败' : '创建群组失败'));\n return false;\n }\n },\n async joinGroup(groupKey) {\n const session = useSessionStore();\n if (!session.userId) {\n this.setActionError('请先登录');\n return false;\n }\n try {\n const conversation = await imClient.joinGroup(session.userId, groupKey);\n this.upsertConversation(conversation);\n this.setActiveConversation(conversation.id);\n this.setActionNotice('已加入群组');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '加入群组失败');\n return false;\n }\n },\n async broadcastMessage(targetIds, text) {\n const session = useSessionStore();\n if (!session.userId) {\n this.setActionError('请先登录');\n return false;\n }\n try {\n const result = await imClient.broadcastMessage(session.userId, targetIds, text);\n const successCount = Number(result.successCount || 0);\n const failedCount = Number(result.failedCount || 0);\n this.setActionNotice(failedCount > 0 ? `已群发 ${successCount} 条,失败 ${failedCount} 条` : `已群发 ${successCount} 条`);\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '群发失败');\n return false;\n }\n },\n async leaveGroup(conversation) {\n const session = useSessionStore();\n if (!session.userId || !conversation?.target) {\n this.setActionError('缺少群组信息');\n return false;\n }\n try {\n await imClient.leaveGroup(session.userId, conversation.target);\n this.removeConversation(conversation.id);\n this.setActionNotice('已退出群组');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '退出群组失败');\n return false;\n }\n },\n async dismissGroup(conversation) {\n const session = useSessionStore();\n if (!session.userId || !conversation?.target) {\n this.setActionError('缺少群组信息');\n return false;\n }\n try {\n await imClient.dismissGroup(session.userId, conversation.target);\n this.removeConversation(conversation.id);\n this.setActionNotice('群组已解散');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '解散群组失败');\n return false;\n }\n }\n }\n});\n","import { defineStore } from 'pinia';\nimport { imClient } from '@/services/imClient';\nimport { useConversationStore } from '@/stores/conversations';\nimport { useNavigationStore } from '@/stores/navigation';\nimport { useSessionStore } from '@/stores/session';\n\nconst CONTACT_CACHE_MS = 15000;\n\nfunction normalizeContacts(contacts) {\n const unique = new Map();\n contacts.forEach(contact => {\n const uid = String(contact.uid || contact.id || '').trim();\n if (!uid) {\n return;\n }\n const normalized = {\n ...contact,\n id: String(contact.id || uid),\n uid\n };\n unique.set(uid, {\n ...(unique.get(uid) || {}),\n ...normalized\n });\n });\n return Array.from(unique.values()).sort((a, b) => a.title.localeCompare(b.title, 'zh-CN'));\n}\n\nexport const useContactStore = defineStore('contacts', {\n state: () => ({\n contacts: [],\n activeId: '',\n loading: false,\n eventsBound: false,\n refreshSerial: 0,\n refreshPromise: null,\n loadedForUserId: '',\n loadedAt: 0,\n actionError: '',\n actionInfo: ''\n }),\n getters: {\n activeContact(state) {\n return state.contacts.find(item => item.id === state.activeId) || state.contacts[0] || null;\n }\n },\n actions: {\n bindImEvents() {\n if (this.eventsBound) {\n return;\n }\n this.eventsBound = true;\n imClient.on('contactsChanged', contacts => {\n if (!contacts.length && this.contacts.length) {\n return;\n }\n this.contacts = normalizeContacts(contacts);\n if (!this.contacts.find(item => item.id === this.activeId)) {\n this.activeId = this.contacts[0]?.id || '';\n }\n });\n },\n async refreshContacts(options = {}) {\n this.bindImEvents();\n const session = useSessionStore();\n const requestUserId = session.userId;\n const force = Boolean(options.force);\n if (!requestUserId) {\n this.clearContacts();\n return [];\n }\n if (!force\n && this.contacts.length\n && this.loadedForUserId === requestUserId\n && Date.now() - this.loadedAt < CONTACT_CACHE_MS\n ) {\n return this.contacts;\n }\n if (this.refreshPromise && !force) {\n return this.refreshPromise;\n }\n const serial = this.refreshSerial + 1;\n this.refreshSerial = serial;\n this.loading = true;\n\n this.refreshPromise = (async () => {\n this.contacts = normalizeContacts(imClient.refreshContactList());\n if (!this.contacts.find(item => item.id === this.activeId)) {\n this.activeId = this.contacts[0]?.id || '';\n }\n if (!this.contacts.length || force) {\n const serverContacts = await imClient.getServerContactList(requestUserId);\n if (serial !== this.refreshSerial || useSessionStore().userId !== requestUserId) {\n return this.contacts;\n }\n this.contacts = normalizeContacts(serverContacts);\n this.loadedForUserId = requestUserId;\n this.loadedAt = Date.now();\n if (!this.contacts.find(item => item.id === this.activeId)) {\n this.activeId = this.contacts[0]?.id || '';\n }\n }\n window.setTimeout(() => {\n if (serial !== this.refreshSerial || useSessionStore().userId !== requestUserId) {\n return;\n }\n const latest = imClient.getContactList(false);\n if (latest.length || !this.contacts.length) {\n this.contacts = normalizeContacts(latest);\n this.loadedForUserId = requestUserId;\n this.loadedAt = Date.now();\n if (!this.contacts.find(item => item.id === this.activeId)) {\n this.activeId = this.contacts[0]?.id || '';\n }\n }\n }, 1200);\n return this.contacts;\n })();\n\n try {\n return await this.refreshPromise;\n } finally {\n if (serial === this.refreshSerial) {\n this.loading = false;\n this.refreshPromise = null;\n }\n }\n },\n async addContact(keyword) {\n const session = useSessionStore();\n const value = String(keyword || '').trim();\n this.actionError = '';\n this.actionInfo = '';\n if (!session.userId) {\n this.actionError = '请先登录';\n return false;\n }\n if (!value) {\n this.actionError = '请输入用户ID、手机号或用户名';\n return false;\n }\n\n this.loading = true;\n try {\n const contact = await imClient.addContact(session.userId, value, '添加联系人');\n if (contact) {\n this.contacts = normalizeContacts([...this.contacts, contact]);\n this.activeId = contact.id;\n }\n this.actionInfo = '联系人已添加';\n await this.refreshContacts({ force: true });\n return true;\n } catch (error) {\n this.actionError = error.message || '添加联系人失败';\n return false;\n } finally {\n this.loading = false;\n }\n },\n async updateContactAlias(contactId, alias) {\n const session = useSessionStore();\n const targetId = String(contactId || '').trim();\n const nextAlias = String(alias || '').trim();\n this.actionError = '';\n this.actionInfo = '';\n if (!session.userId) {\n this.actionError = '请先登录';\n return false;\n }\n if (!targetId) {\n this.actionError = '缺少联系人ID';\n return false;\n }\n\n try {\n const savedAlias = await imClient.updateContactAlias(session.userId, targetId, nextAlias);\n this.contacts = normalizeContacts(this.contacts.map(item => {\n if (item.uid !== targetId && item.id !== targetId) {\n return item;\n }\n const rawUser = {\n ...(item.rawUser || {}),\n friendAlias: savedAlias\n };\n const rawFriend = {\n ...(item.rawFriend || {}),\n alias: savedAlias\n };\n const title = savedAlias || rawUser.displayName || rawUser.name || item.uid;\n return {\n ...item,\n title,\n avatarText: title.slice(0, 1).toUpperCase(),\n alias: savedAlias,\n rawFriend,\n rawUser\n };\n }));\n this.loadedAt = Date.now();\n this.actionInfo = '备注名已修改';\n return true;\n } catch (error) {\n this.actionError = error.message || '备注名修改失败';\n return false;\n }\n },\n clearContacts() {\n this.refreshSerial += 1;\n this.contacts = [];\n this.activeId = '';\n this.loading = false;\n this.refreshPromise = null;\n this.loadedForUserId = '';\n this.loadedAt = 0;\n this.actionError = '';\n this.actionInfo = '';\n },\n setActiveContact(id) {\n this.activeId = id;\n },\n openChat(contact) {\n if (!contact) {\n return;\n }\n const conversations = useConversationStore();\n const navigation = useNavigationStore();\n const conversation = imClient.createSingleConversation(contact.uid, contact);\n conversations.upsertConversation(conversation);\n conversations.setActiveConversation(conversation.id);\n navigation.showMessages();\n }\n }\n});\n","import script from \"./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { defineStore } from 'pinia';\nimport { imClient } from '@/services/imClient';\nimport { appConfig } from '@/config';\n\nconst STORAGE_KEY = 'qmt-web-im-session';\n\nfunction normalizeStoredPortrait(portrait) {\n return portrait || '';\n}\n\nfunction nextProfilePortrait(profilePortrait, currentPortrait) {\n return normalizeStoredPortrait(profilePortrait) || normalizeStoredPortrait(currentPortrait);\n}\n\nexport const useSessionStore = defineStore('session', {\n state: () => ({\n isAuthenticated: false,\n connecting: false,\n connected: false,\n connectionStatusText: '未连接',\n userId: '',\n token: '',\n displayName: '',\n portrait: '',\n error: '',\n sdkVersion: '',\n eventsBound: false\n }),\n actions: {\n restore() {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) {\n return;\n }\n try {\n const session = JSON.parse(raw);\n if (session.appServer !== appConfig.appServer) {\n localStorage.removeItem(STORAGE_KEY);\n return;\n }\n if (session.userId && session.token) {\n if (!session.clientId) {\n localStorage.removeItem(STORAGE_KEY);\n return;\n }\n this.userId = session.userId;\n this.token = session.token;\n this.displayName = session.displayName || session.userId;\n this.portrait = normalizeStoredPortrait(session.portrait);\n this.isAuthenticated = true;\n imClient.restoreClientId(session.clientId);\n if (session.localOnly) {\n this.connectionStatusText = '本地调试登录';\n }\n this.connect();\n this.refreshProfile();\n }\n } catch (error) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n async loginWithPassword(mobile, password) {\n this.error = '';\n this.connecting = true;\n try {\n const result = await imClient.loginWithPassword(mobile, password);\n this.applyLoginResult(result);\n await this.connect();\n } catch (error) {\n this.error = error.message || '登录失败';\n } finally {\n this.connecting = false;\n }\n },\n async loginWithCode(mobile, code) {\n this.error = '';\n this.connecting = true;\n try {\n const result = await imClient.loginWithCode(mobile, code);\n this.applyLoginResult(result);\n await this.connect();\n } catch (error) {\n this.error = error.message || '登录失败';\n } finally {\n this.connecting = false;\n }\n },\n async registerWithPhone(mobile, code) {\n this.error = '';\n this.connecting = true;\n try {\n return await imClient.registerWithPhone(mobile, code);\n } catch (error) {\n this.error = error.message || '注册失败';\n return null;\n } finally {\n this.connecting = false;\n }\n },\n applyLoginResult(result) {\n this.userId = result.userId || result.uid || result.id || '';\n this.token = result.token || result.imToken || '';\n this.displayName = result.displayName || result.userName || result.name || this.userId;\n this.portrait = normalizeStoredPortrait(result.portrait);\n this.isAuthenticated = Boolean(this.userId && this.token);\n if (result.localOnly) {\n this.connectionStatusText = '本地调试登录';\n }\n this.persistSession(Boolean(result.localOnly));\n },\n persistSession(localOnly = false) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\n userId: this.userId,\n token: this.token,\n displayName: this.displayName,\n portrait: this.portrait,\n clientId: imClient.getClientId(),\n localOnly,\n appServer: appConfig.appServer\n }));\n },\n applyProfile(profile) {\n if (!profile) {\n return;\n }\n this.userId = profile.userId || profile.uid || this.userId;\n this.displayName = profile.displayName || profile.name || this.displayName || this.userId;\n this.portrait = nextProfilePortrait(profile.portrait, this.portrait);\n this.persistSession();\n },\n async refreshProfile() {\n if (!this.userId) {\n return null;\n }\n try {\n const profile = await imClient.getProfile(this.userId);\n this.applyProfile(profile);\n return profile;\n } catch (error) {\n return null;\n }\n },\n async saveProfile({ displayName, portraitFile }) {\n if (!this.userId) {\n throw new Error('请先登录');\n }\n const profile = await imClient.updateProfile(this.userId, {\n displayName,\n portraitFile\n });\n this.applyProfile(profile);\n return profile;\n },\n async changePassword({ oldPassword, newPassword }) {\n if (!this.userId) {\n throw new Error('请先登录');\n }\n await imClient.changePassword({ oldPassword, newPassword });\n return true;\n },\n async resetPasswordWithCode({ mobile, resetCode, newPassword }) {\n await imClient.resetPasswordWithCode({ mobile, resetCode, newPassword });\n return true;\n },\n async connect() {\n if (!this.userId || !this.token) {\n return;\n }\n await imClient.ensureSdk();\n this.sdkVersion = imClient.getSdkVersion();\n this.bindImEvents();\n await imClient.connect(this.userId, this.token);\n },\n bindImEvents() {\n if (this.eventsBound) {\n return;\n }\n this.eventsBound = true;\n imClient.on('connectionStatusChanged', status => {\n this.connected = status.connected;\n this.connectionStatusText = status.statusText || (status.connected ? '已连接' : '未连接');\n });\n },\n logout() {\n imClient.disconnect();\n localStorage.removeItem(STORAGE_KEY);\n this.$reset();\n }\n }\n});\n","import { appConfig } from '@/config';\nimport { HttpImClient } from './httpImClient';\n\nconst HEARTBEAT_INTERVAL_MS = 25000;\nconst RECONNECT_MIN_MS = 1000;\nconst RECONNECT_MAX_MS = 15000;\n\nfunction buildWsUrl() {\n if (appConfig.wsUrl) {\n return appConfig.wsUrl;\n }\n const protocol = appConfig.useWss ? 'wss' : 'ws';\n const host = appConfig.imServerHost || window.location.hostname;\n const port = appConfig.imRoutePort ? `:${appConfig.imRoutePort}` : '';\n const path = appConfig.wsPath?.startsWith('/') ? appConfig.wsPath : `/${appConfig.wsPath || 'ws'}`;\n return `${protocol}://${host}${port}${path}`;\n}\n\nfunction normalizeConversationId(payload) {\n const target = payload.target || payload.to || payload.receiver || payload.conversationTarget || payload.from || payload.sender;\n return payload.conversationId || (target ? `single-${target}` : '');\n}\n\nfunction normalizeIncomingMessage(payload, currentUserId) {\n const item = payload.message || payload;\n const from = item.from || item.sender || item.fromUser || '';\n const target = item.target || item.to || item.receiver || '';\n const direction = from && String(from) === String(currentUserId) ? 'out' : 'in';\n const conversationId = item.conversationId || normalizeConversationId({\n ...item,\n target: direction === 'out' ? target : from\n });\n\n if (!conversationId) {\n return null;\n }\n\n const status = item.status || item.deliveryStatus || 'sent';\n\n return {\n id: item.id || item.messageId || item.messageUid || `${Date.now()}${Math.random().toString(16).slice(2)}`,\n messageUid: item.messageUid || item.uid || item.messageId || '',\n conversationId,\n from,\n target,\n direction,\n type: item.type || 'text',\n text: item.text || item.content || item.searchableContent || '',\n status,\n deliveryStatus: item.deliveryStatus || (direction === 'out' ? status : ''),\n timestamp: Number(item.timestamp || item.serverTimestamp || Date.now()),\n displayTimestamp: Number(item.displayTimestamp || item.timestamp || item.serverTimestamp || Date.now()),\n raw: item\n };\n}\n\nexport class LongConnectionImClient extends HttpImClient {\n constructor() {\n super();\n this.socket = null;\n this.wsUrl = buildWsUrl();\n this.heartbeatTimer = null;\n this.reconnectTimer = null;\n this.reconnectAttempts = 0;\n this.manualClose = false;\n }\n\n getSdkVersion() {\n return 'JC-LC/0.1';\n }\n\n shouldUseMessagePolling() {\n return !this.connected;\n }\n\n async ensureSdk() {\n if (typeof WebSocket === 'undefined') {\n throw new Error('当前浏览器不支持 WebSocket 长连接');\n }\n return true;\n }\n\n connect(userId, token) {\n this.currentUser = { userId, token };\n this.manualClose = false;\n this.openSocket();\n }\n\n disconnect() {\n this.manualClose = true;\n this.clearReconnectTimer();\n this.clearHeartbeatTimer();\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n super.disconnect();\n }\n\n openSocket() {\n if (this.socket?.readyState === WebSocket.OPEN) {\n this.sendAuthFrame();\n return;\n }\n if (this.socket?.readyState === WebSocket.CONNECTING) {\n return;\n }\n\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接连接中' });\n\n try {\n this.socket = new WebSocket(this.wsUrl);\n this.socket.binaryType = 'arraybuffer';\n } catch (error) {\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接创建失败,使用HTTP补偿' });\n this.scheduleReconnect();\n return;\n }\n\n this.socket.onopen = () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.emit('connectionStatusChanged', { connected: true, statusText: '长连接已连接' });\n this.sendAuthFrame();\n this.startHeartbeat();\n this.refreshConversationList();\n };\n\n this.socket.onmessage = event => {\n this.handleFrame(event.data);\n };\n\n this.socket.onerror = () => {\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接异常,使用HTTP补偿' });\n };\n\n this.socket.onclose = () => {\n this.connected = false;\n this.clearHeartbeatTimer();\n this.socket = null;\n if (this.manualClose) {\n return;\n }\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接重连中' });\n this.scheduleReconnect();\n };\n }\n\n sendAuthFrame() {\n this.sendFrame({\n type: 'auth',\n userId: this.currentUser?.userId || '',\n token: this.currentUser?.token || '',\n clientId: this.getClientId(),\n platform: appConfig.platform,\n timestamp: Date.now()\n });\n }\n\n sendFrame(frame) {\n if (this.socket?.readyState !== WebSocket.OPEN) {\n return false;\n }\n this.socket.send(JSON.stringify(frame));\n return true;\n }\n\n handleFrame(rawData) {\n if (rawData instanceof ArrayBuffer) {\n this.emit('rawFrameReceived', rawData);\n return;\n }\n\n let payload;\n try {\n payload = typeof rawData === 'string' ? JSON.parse(rawData) : rawData;\n } catch (error) {\n return;\n }\n\n const type = payload.type || payload.event || payload.cmd || '';\n if (type === 'pong' || type === 'auth_ok' || type === 'connected') {\n return;\n }\n if (type === 'contactsChanged') {\n this.emit('contactsChanged', payload.contacts || []);\n return;\n }\n if (type === 'conversationsChanged') {\n this.emit('conversationsChanged', payload.conversations || []);\n return;\n }\n if (type === 'messages' && Array.isArray(payload.messages)) {\n payload.messages\n .map(message => normalizeIncomingMessage(message, this.currentUser?.userId))\n .filter(Boolean)\n .forEach(message => this.emit('messageReceived', message));\n return;\n }\n\n const message = normalizeIncomingMessage(payload, this.currentUser?.userId);\n if (message) {\n this.emit(message.direction === 'out' ? 'messageStatusChanged' : 'messageReceived', message);\n }\n }\n\n startHeartbeat() {\n this.clearHeartbeatTimer();\n this.heartbeatTimer = window.setInterval(() => {\n this.sendFrame({ type: 'ping', timestamp: Date.now() });\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n clearHeartbeatTimer() {\n if (this.heartbeatTimer) {\n window.clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n scheduleReconnect() {\n this.clearReconnectTimer();\n const delay = Math.min(RECONNECT_MAX_MS, RECONNECT_MIN_MS * 2 ** this.reconnectAttempts);\n this.reconnectAttempts += 1;\n this.reconnectTimer = window.setTimeout(() => {\n this.openSocket();\n }, delay);\n }\n\n clearReconnectTimer() {\n if (this.reconnectTimer) {\n window.clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n}\n","export { default } from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ConversationList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ConversationList.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageList.vue?vue&type=script&setup=true&lang=js\"","\n\n\n","export { default } from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./NavigationRail.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./NavigationRail.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"","import script from \"./App.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./App.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { appConfig } from '@/config';\nimport { HttpImClient } from './httpImClient';\nimport { LongConnectionImClient } from './longConnectionImClient';\n\nclass UnsupportedWildfireImClient {\n constructor() {\n throw new Error('当前本地社区版 Web 客户端未启用 WildFire Web SDK');\n }\n}\n\nexport const imClient = appConfig.sdkMode === 'wildfire'\n ? new UnsupportedWildfireImClient()\n : appConfig.sdkMode === 'custom-ws' || appConfig.sdkMode === 'long'\n ? new LongConnectionImClient()\n : new HttpImClient();\n\nexport { HttpImClient, LongConnectionImClient, UnsupportedWildfireImClient as WildfireImClient };\n","import script from \"./ChatPanel.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ChatPanel.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","export { default } from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageComposer.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageComposer.vue?vue&type=script&setup=true&lang=js\"","import script from \"./LoginView.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./LoginView.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ConversationList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ConversationList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { createApp } from 'vue';\nimport { createPinia } from 'pinia';\nimport App from './App.vue';\nimport './styles/base.css';\n\ncreateApp(App).use(createPinia()).mount('#app');\n","import script from \"./ContactPanel.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ContactPanel.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","export { default } from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactPanel.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactPanel.vue?vue&type=script&setup=true&lang=js\"","\n\n\n","import script from \"./FavoriteList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./FavoriteList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","export { default } from \"-!../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./LoginView.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../../im-web/node_modules/thread-loader/dist/cjs.js!../../../../im-web/node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../im-web/node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./LoginView.vue?vue&type=script&setup=true&lang=js\"","\n\n\n","\n\n\n","import script from \"./MessageList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./MessageList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","const currentHost = window.location.hostname || '127.0.0.1';\nconst runtimeConfig = window.JC_WEB_IM_CONFIG || {};\nconst appServerOrigin = `${window.location.protocol}//${currentHost}:18888`;\nconst adminServerOrigin = `${window.location.protocol}//${currentHost}:8024`;\n\nexport const appConfig = {\n appName: 'Web IM',\n adminServer: runtimeConfig.adminServer || process.env.VUE_APP_ADMIN_SERVER || adminServerOrigin,\n appServer: runtimeConfig.appServer || process.env.VUE_APP_APP_SERVER || appServerOrigin,\n platformConfigApi: runtimeConfig.platformConfigApi || process.env.VUE_APP_PLATFORM_CONFIG_API || (process.env.NODE_ENV === 'development' ? '/local-api/platform_config.php' : '/api/platform_config.php'),\n registerConfigApi: runtimeConfig.registerConfigApi || process.env.VUE_APP_REGISTER_CONFIG_API || `${adminServerOrigin}/api/register-config`,\n registerPhoneExistsApi: runtimeConfig.registerPhoneExistsApi || process.env.VUE_APP_REGISTER_PHONE_EXISTS_API || `${adminServerOrigin}/api/register-phone-exists`,\n contactsApi: runtimeConfig.contactsApi || process.env.VUE_APP_CONTACTS_API || (process.env.NODE_ENV === 'development' ? '/local-api/contacts.php' : '/api/contacts.php'),\n updateAliasApi: runtimeConfig.updateAliasApi || process.env.VUE_APP_UPDATE_ALIAS_API || (process.env.NODE_ENV === 'development' ? '/local-api/update_alias.php' : '/api/update_alias.php'),\n addContactApi: runtimeConfig.addContactApi || process.env.VUE_APP_ADD_CONTACT_API || (process.env.NODE_ENV === 'development' ? '/local-api/add_contact.php' : '/api/add_contact.php'),\n conversationActionsApi: runtimeConfig.conversationActionsApi || process.env.VUE_APP_CONVERSATION_ACTIONS_API || (process.env.NODE_ENV === 'development' ? '/local-api/conversation_actions.php' : '/api/conversation_actions.php'),\n sendMessageApi: runtimeConfig.sendMessageApi || process.env.VUE_APP_SEND_MESSAGE_API || (process.env.NODE_ENV === 'development' ? '/local-api/send_message.php' : '/api/send_message.php'),\n messageActionApi: runtimeConfig.messageActionApi || process.env.VUE_APP_MESSAGE_ACTION_API || (process.env.NODE_ENV === 'development' ? '/local-api/message_action.php' : '/api/message_action.php'),\n messageDetailApi: runtimeConfig.messageDetailApi || process.env.VUE_APP_MESSAGE_DETAIL_API || (process.env.NODE_ENV === 'development' ? '/local-api/message_detail.php' : '/api/message_detail.php'),\n messagesApi: runtimeConfig.messagesApi || process.env.VUE_APP_MESSAGES_API || (process.env.NODE_ENV === 'development' ? '/local-api/messages.php' : '/api/messages.php'),\n profileApi: runtimeConfig.profileApi || process.env.VUE_APP_PROFILE_API || (process.env.NODE_ENV === 'development' ? '/local-api/profile.php' : '/api/profile.php'),\n changePasswordApi: runtimeConfig.changePasswordApi || process.env.VUE_APP_CHANGE_PASSWORD_API || `${appServerOrigin}/change_pwd`,\n resetPasswordApi: runtimeConfig.resetPasswordApi || process.env.VUE_APP_RESET_PASSWORD_API || `${appServerOrigin}/reset_pwd`,\n imServerHost: runtimeConfig.imServerHost || process.env.VUE_APP_IM_SERVER_HOST || currentHost,\n imRoutePort: Number(runtimeConfig.imRoutePort || process.env.VUE_APP_IM_ROUTE_PORT || 18000),\n useWss: runtimeConfig.useWss ?? process.env.VUE_APP_USE_WSS === 'true',\n wsPath: runtimeConfig.wsPath || process.env.VUE_APP_WS_PATH || '/ws',\n wsUrl: runtimeConfig.wsUrl || process.env.VUE_APP_WS_URL || '',\n sdkMode: runtimeConfig.sdkMode || process.env.VUE_APP_IM_MODE || 'http',\n syncIntervalMs: Number(runtimeConfig.syncIntervalMs || process.env.VUE_APP_SYNC_INTERVAL_MS || 300),\n platform: 5,\n clientIdStorageKey: 'qmt-web-im-client-id',\n authTokenStoragePrefix: 'qmt-web-im-auth-token-'\n};\n","\n\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkjc_web_im\"] = self[\"webpackChunkjc_web_im\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(8218); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n",""],"names":["computed","ref","watch","useContactStore","contacts","contact","activeContact","remarkName","value","alias","username","rawUser","displayName","name","uid","mobile","address","editingAlias","aliasDraft","aliasSaving","aliasError","openAliasEditor","closeAliasEditor","submitAlias","ok","updateContactAlias","actionError","nextTick","onBeforeUnmount","onMounted","reactive","IMAGE_MIN_SCALE","IMAGE_MAX_SCALE","props","__props","emit","__emit","listEl","viewerStage","contextMenu","visible","x","y","message","imageViewer","url","scale","rotation","offsetX","offsetY","dragging","dragStartX","dragStartY","dragOffsetX","dragOffsetY","senderProfile","rawName","portrait","avatarText","role","roleLabel","contactAlias","groupAlias","isContact","saving","adding","notice","error","imageViewerStyle","transform","menuItems","isOwnMessage","direction","isRecalledMessage","action","label","favoriteLabel","isFavorite","items","unshift","push","canRecallOthers","scrollToBottom","scrollTop","scrollHeight","scrollToMessage","messageId","row","Array","from","querySelectorAll","find","element","dataset","messageKey","scrollIntoView","block","behavior","messages","map","id","status","deliveryStatus","messageUid","recalled","join","immediate","attentionMessageId","document","addEventListener","closeMenu","closeMenuOnEscape","moveImageDrag","stopImageDrag","removeEventListener","messageIdentity","String","canOpenMessageMenu","isSelected","selectedMessageIds","includes","favoriteMessageIds","isAttention","isRecallNotice","isImageMessage","type","attachment","isFileMessage","isGroupMessage","conversationType","showGroupSender","senderRoleLabel","senderRole","groupSenderName","senderName","groupSenderAvatarText","slice","toUpperCase","openSenderProfile","profile","cachedContact","cachedAlias","trim","remarkAlias","title","senderPortrait","Boolean","closeSenderProfile","addSenderAsContact","addContact","aliasSaved","refreshContacts","force","catch","userId","saveSenderAlias","roleBubbleClass","formatFileSize","size","bytes","Number","toFixed","handleMessageClick","selectionMode","handleImageClick","openImageViewer","resetImageViewer","closeImageViewer","clampImageScale","Math","min","max","setImageScale","originX","originY","previousScale","nextScale","rect","getBoundingClientRect","centerX","left","width","centerY","top","height","ratio","zoomImage","delta","rotateImage","handleImageWheel","event","factor","deltaY","clientX","clientY","startImageDrag","saveViewerImage","downloadUrl","URL","window","location","origin","searchParams","set","link","createElement","href","toString","download","body","appendChild","click","remove","openMenu","innerWidth","innerHeight","key","chooseMenuAction","formatTime","timestamp","Intl","DateTimeFormat","hour","minute","hour12","timeZone","resolvedOptions","format","deliveryState","state","deliveryTitle","failureText","errorCode","defineStore","useNavigationStore","section","actions","showMessages","showContacts","showFavorites","useConversationStore","conversations","navigation","favorite","activeFavorite","clearFeedback","favoriteTitle","item","conversationTitle","conversation","entry","conversationId","favoriteText","text","isImageFavorite","isFileFavorite","favoriteCopyText","recallStatus","preview","formatFavoriteTime","year","month","day","copyFavorite","writeClipboard","copyError","navigator","clipboard","writeText","setAttribute","style","position","select","execCommand","removeChild","openConversation","refreshRemoteConversations","setActiveConversation","setTimeout","focusMessage","removeFavorite","MessageList","MessageComposer","imClient","useSessionStore","session","activeConversation","groupMenuOpen","singleProfileOpen","singleAliasDraft","singleProfileSaving","singleProfileNotice","singleProfileError","groupPanel","groupBusy","groupDetail","groupMembers","groupAliasDraft","manageSection","selectedAdminIds","selectedKickIds","transferTargetId","profileDraft","announcement","welcomeText","muteDraft","mode","scheduleType","startsAtLocal","endsAtLocal","dailyStart","dailyEnd","muteSaveNotice","muteSaveError","singlePeerId","isGroupConversation","target","raw","replace","singleContact","peerId","singleProfile","currentGroupRole","myRole","isGroupOwner","canManageGroup","adminCandidateMembers","filter","member","transferableMembers","messageDetail","messageDetailGroup","group","isMessageDetailGroup","messageDetailCounts","counts","read","unread","undelivered","total","kickCandidateMembers","statusText","canSendActiveConversation","connectionStatusText","connected","formatDetailTime","second","detailMemberName","detailMemberAvatar","detailRoleLabel","closeGroupMenu","toggleGroupMenu","openSingleProfile","then","closeSingleProfile","saveSingleAlias","refreshedContact","nextTitle","upsertConversation","handleSenderProfileUpdated","syncActiveMessages","allowReadReceipt","loadGroupMembers","closeGroupPanel","clearMuteSaveFeedback","loadGroupDetail","getGroupDetail","setActionError","openGroupOverview","openGroupMembers","getGroupMembers","openGroupAlias","detail","myAlias","msToLocalInput","date","Date","local","getTime","getTimezoneOffset","toISOString","localInputToMs","prepareManagementDrafts","setting","muteSetting","startsAtMs","endsAtMs","openGroupManage","openTransferGroup","saveGroupAlias","updateGroupAlias","setActionNotice","toggleAdmin","selected","Set","has","delete","add","toggleKick","saveGroupAdmins","setGroupAdmins","saveGroupProfile","result","updateGroupProfile","updatedAt","now","kickSelectedMembers","length","confirm","kickGroupMembers","removed","removedIds","saveMuteSetting","updateGroupMuteSetting","leaveCurrentGroup","leaveGroup","dismissCurrentGroup","dismissGroup","transferCurrentGroup","transferGroup","memberAvatar","emojiOpen","dropActive","textareaEl","imageInput","fileInput","dragDepth","emojiList","submit","toggleEmojiPicker","insertEmoji","emoji","start","selectionStart","end","selectionEnd","requestAnimationFrame","focus","cursor","setSelectionRange","chooseImage","chooseFile","attachmentTypeForFile","file","fallbackType","startsWith","emitFiles","files","disabled","validFiles","File","caption","forEach","index","selectAttachment","input","hasDraggedFiles","types","dataTransfer","handleDragEnter","dropEffect","handleDragOver","handleDragLeave","filesFromDataTransfer","kind","webkitGetAsEntry","isDirectory","getAsFile","handleDrop","imageFilesFromClipboard","clipboardData","handlePaste","imageFiles","preventDefault","LoginView","ChatShell","restore","isAuthenticated","bootstrapDemoData","clearUserState","axios","appConfig","LOCAL_MESSAGE_STORAGE_KEY","LOCAL_HIDDEN_MESSAGE_STORAGE_KEY","LOCAL_RECALLED_MESSAGE_STORAGE_KEY","scopedStorageKey","baseKey","scope","appServer","encodeURIComponent","randomId","crypto","randomUUID","replaceAll","random","readLocalMessages","JSON","parse","localStorage","getItem","readMessageSet","storageKey","writeMessageSet","messagesByConversation","setItem","stringify","messageKeys","hasStoredMessage","stored","ids","some","storeMessageKeys","withRecalledState","applyLocalMessageState","isRecalled","writeLocalMessages","saveLocalMessage","findIndex","splice","mergeSyncedMessages","localMessages","remoteMessages","visibleLocalMessages","localByKey","Map","visibleRemoteMessages","remoteMessage","localMessage","get","remoteKeys","hasRemoteMatch","abs","pendingLocalMessages","sort","a","b","displayTimestamp","getTitle","fallback","getUniqueEquipment","allowedDevices","canUseLocalLoginFallback","response","data","process","env","NODE_ENV","HttpImClient","constructor","listeners","currentUser","getClientId","clientId","clientIdStorageKey","restoreClientId","getSdkVersion","ensureSdk","loginWithPassword","password","deviceId","post","platform","uniqueEquipment","withCredentials","persistAppToken","code","token","localOnly","Error","requestAuthCode","loginWithCode","registerWithPhone","connect","refreshConversationList","disconnect","getConversationList","fetchRemoteConversations","remoteConversations","limit","messagesApi","line","getMessages","fetchRemoteMessages","options","markRead","hideMessages","isArray","markMessagesRecalled","recallMessage","test","messageActionApi","editMessage","nextText","editedMessage","editedAt","activityTimestamp","getMessageDetail","messageDetailApi","sendTextMessage","initialMessage","sendMessageApi","sender","sentMessage","serverTimestamp","failedMessage","sendAttachmentMessage","mime","createObjectURL","formData","FormData","append","getContactList","getServerContactList","contactsApi","headers","getAppAuthHeaders","mapContact","friendAlias","localeCompare","keyword","reason","addContactApi","normalizeConversation","subtitle","createGroup","memberIds","channel","conversationActionsApi","joinGroup","groupKey","broadcastMessage","targetIds","groupId","members","targetUserId","adminIds","targetId","updateAliasApi","getProfile","profileApi","updateProfile","portraitFile","changePassword","oldPassword","newPassword","changePasswordApi","msg","resetPasswordWithCode","resetCode","resetPasswordApi","refreshContactList","createSingleConversation","userInfo","friend","rawFriend","on","eventName","handler","off","payload","appToken","authtoken","authToken","authTokenStoragePrefix","getUrlHost","host","addingContact","addKeyword","filteredContacts","toLowerCase","openAddContact","actionInfo","closeAddContact","submitAddContact","added","LOCAL_CONVERSATION_STORAGE_KEY","LOCAL_FAVORITE_MESSAGES_KEY","readFavoriteMessages","writeFavoriteMessages","readLocalConversations","writeLocalConversations","messageStableKey","messageActivityTimestamp","attachmentLabel","messagePreviewText","quotePrefix","isSameMessage","right","hasExactMessage","shouldUseMessagePolling","canMarkReadNow","visibilityState","userAction","mergeVisibleMessages","currentMessages","syncedMessages","merged","currentMessage","exists","shouldKeepLocal","incomingEditedMessages","previousMessages","nextMessages","previousByKey","previous","notificationAudioContext","playNotificationSound","AudioContext","webkitAudioContext","resume","oscillator","createOscillator","gain","createGain","startAt","currentTime","frequency","setValueAtTime","exponentialRampToValueAtTime","destination","stop","activeId","visibleMessagesByConversation","eventsBound","usingDemoData","loading","syncTimer","conversationSyncTimer","readPresenceEventsBound","syncInFlight","pendingReadReceiptConversationId","conversationSyncInFlight","syncAfterSendTimer","optimisticMessagesByConversation","quotedMessage","forwardingMessages","editingMessage","editingText","editingMode","messageDetailOpen","messageDetailLoading","messageDetailError","attentionMessageTimer","favoriteMessages","activeFavoriteKey","actionNotice","getters","activeMessages","totalUnread","reduce","sum","selectedMessages","selectedIds","bindImEvents","loadScopedLocalState","startMessageSync","loadActiveMessages","clearInterval","clearTimeout","appendMessage","replaceMessage","applyRemoteConversations","sendText","appendVisibleMessage","sendAttachment","sendTextToConversation","removeConversation","removedMessages","removedVisibleMessages","removedOptimisticMessages","remote","values","keepOptimisticMessage","updateConversationFromMessage","syncVisibleMessages","removeMessages","flatMap","filterMessages","list","replaceLocalMessage","targetMessage","nextMessage","keys","replaceInList","matched","pruneOptimisticMessages","remoteMatched","syncedMessage","syncOptions","wantsReadReceipt","explicitReadReceipt","pollingReadReceipt","syncedConversationId","editedIncomingMessages","latest","latestMessage","bindReadPresenceEvents","setInterval","syncIntervalMs","syncWhenReadable","actionNoticeTimer","actionErrorTimer","handleMessageAction","copyMessages","startEditMessage","deleteMessages","startForward","toggleFavorite","openMessageDetail","quoteMessage","enterSelectionMode","sentAt","closeMessageDetail","setActiveFavorite","quoteText","cancelQuote","toggleSelectedMessage","clearSelection","copySelectedMessages","deleteSelectedMessages","startForwardSelectedMessages","cancelForward","isResend","cancelEditMessage","completeEditMessage","completeForward","targetConversationId","successCount","failedCount","CONTACT_CACHE_MS","normalizeContacts","unique","normalized","refreshSerial","refreshPromise","loadedForUserId","loadedAt","requestUserId","clearContacts","serial","serverContacts","contactId","nextAlias","savedAlias","setActiveContact","openChat","STORAGE_KEY","normalizeStoredPortrait","nextProfilePortrait","profilePortrait","currentPortrait","connecting","sdkVersion","removeItem","refreshProfile","applyLoginResult","imToken","userName","persistSession","applyProfile","saveProfile","logout","$reset","HEARTBEAT_INTERVAL_MS","RECONNECT_MIN_MS","RECONNECT_MAX_MS","buildWsUrl","wsUrl","protocol","useWss","imServerHost","hostname","port","imRoutePort","path","wsPath","normalizeConversationId","to","receiver","conversationTarget","normalizeIncomingMessage","currentUserId","fromUser","content","searchableContent","LongConnectionImClient","socket","heartbeatTimer","reconnectTimer","reconnectAttempts","manualClose","WebSocket","openSocket","clearReconnectTimer","clearHeartbeatTimer","close","readyState","OPEN","sendAuthFrame","CONNECTING","binaryType","scheduleReconnect","onopen","startHeartbeat","onmessage","handleFrame","onerror","onclose","sendFrame","frame","send","rawData","ArrayBuffer","cmd","delay","activeKey","favoritePreview","UnsupportedWildfireImClient","sdkMode","WildfireImClient","createApp","createPinia","App","use","mount","NavigationRail","ConversationList","ContactList","ChatPanel","ContactPanel","FavoriteList","FavoritePanel","CROP_OUTPUT_SIZE","settingsItems","initials","settingsOpen","settingsSection","passwordSaving","settingsNotice","settingsError","profileOpen","profileSaving","profileNotice","profileError","profileFile","profilePreview","portraitInput","cropperCanvas","cropperPreviewCanvas","passwordDraft","confirmPassword","currentAvatarUrl","activeSettingsItem","avatarPreviewViewer","open","avatarCropper","loaded","busy","objectUrl","fileName","image","baseScale","avatarPreviewStyle","drawAvatarCropper","revokeProfilePreview","closeAvatarCropper","clearProfileFeedback","clearSettingsFeedback","resetPasswordDraft","openSettings","closeSettings","selectSettingsSection","revokeObjectURL","revokeCropperObjectUrl","openProfileEditor","closeProfileEditor","closeAvatarPreview","selectPortrait","openAvatarCropper","choosePortraitFile","openAvatarPreview","resetAvatarPreview","zoomAvatarPreview","handleAvatarPreviewWheel","startAvatarPreviewDrag","currentTarget","setPointerCapture","pointerId","moveAvatarPreviewDrag","stopAvatarPreviewDrag","dropPortrait","cropperStageSize","canvas","round","cropperBoxSize","rotatedImageSize","quarterTurn","naturalHeight","naturalWidth","clampCropperOffset","cropSize","rotated","scaledWidth","scaledHeight","maxX","maxY","updateCropperBaseScale","drawCanvasImage","outputScale","cropOnly","dpr","devicePixelRatio","context","getContext","setTransform","clearRect","fillStyle","fillRect","save","translate","rotate","PI","drawImage","beginPath","fill","previewCanvas","resetCropperTransform","Image","onload","src","zoomCropper","rotateCropper","degrees","handleCropperWheel","startCropperDrag","moveCropperDrag","stopCropperDrag","canvasToBlob","quality","Promise","resolve","reject","toBlob","blob","confirmAvatarCrop","outputCanvas","croppedFile","savePassword","defineComponent","h","actionMenuOpen","activeAction","actionBusy","searchKeyword","groupName","groupAnnouncement","groupWelcomeText","joinGroupKey","broadcastText","channelName","channelAnnouncement","contactKeyword","selectedContactIds","actionTitles","broadcast","createChannel","submitLabels","actionTitle","submitLabel","modalError","modalInfo","normalizedSearchKeyword","contactsByUid","filteredConversationItems","conversationResult","conversationResults","matchesConversation","contactForConversation","conversationTargets","contactResults","matchesContact","contactResult","submitDisabled","ContactPicker","default","emptyText","emits","setup","class","placeholder","onInput","onClick","alt","searchableValues","Object","matchesKeyword","compactKeyword","group_id","owner_uid","resultKind","resultKey","isListItemActive","selectListItem","clearStoreMessages","resetActionFields","toggleActionMenu","closeActionMenu","openAction","closeActionModal","toggleContact","submitAction","formatUnread","count","currentHost","runtimeConfig","JC_WEB_IM_CONFIG","appServerOrigin","adminServerOrigin","appName","adminServer","VUE_APP_ADMIN_SERVER","VUE_APP_APP_SERVER","platformConfigApi","VUE_APP_PLATFORM_CONFIG_API","registerConfigApi","VUE_APP_REGISTER_CONFIG_API","registerPhoneExistsApi","VUE_APP_REGISTER_PHONE_EXISTS_API","VUE_APP_CONTACTS_API","VUE_APP_UPDATE_ALIAS_API","VUE_APP_ADD_CONTACT_API","VUE_APP_CONVERSATION_ACTIONS_API","VUE_APP_SEND_MESSAGE_API","VUE_APP_MESSAGE_ACTION_API","VUE_APP_MESSAGE_DETAIL_API","VUE_APP_MESSAGES_API","VUE_APP_PROFILE_API","VUE_APP_CHANGE_PASSWORD_API","VUE_APP_RESET_PASSWORD_API","VUE_APP_IM_SERVER_HOST","VUE_APP_IM_ROUTE_PORT","VUE_APP_USE_WSS","VUE_APP_WS_PATH","VUE_APP_WS_URL","VUE_APP_IM_MODE","VUE_APP_SYNC_INTERVAL_MS","pendingRegistrationStorageKey","defaultPlatformLogo","emailRegisterEnabled","view","sendingCode","info","defaultPlatformName","platformName","platformLogo","registerType","registerMethods","phone","email","mobileRealVerify","registerPhoneError","phoneCaptcha","phoneCaptchaImage","usernameCaptcha","usernameCaptchaImage","settingRegisterPassword","pendingRegistration","registerForm","phoneCountryCode","emailCode","usernamePhoneCountryCode","usernamePhone","usernameCode","registerPasswordForm","countryCodeOptions","registerMethodOptions","canSubmit","visibleRegisterMethods","enabled","canRegisterSubmit","phoneCaptchaMatched","usernameCaptchaMatched","canSetRegisterPassword","phoneCaptchaStatus","getCaptchaStatus","phoneCaptchaClass","getCaptchaClass","usernameCaptchaStatus","usernameCaptchaClass","methods","loadPlatformConfig","loadRegisterConfig","restorePendingRegistration","requestCode","requestRegisterCode","formatPhoneForApi","normalizeUsernameCaptchaInput","normalizePhoneCaptchaInput","normalizeRegisterCountryCode","showPhoneCaptcha","randomDigits","renderCaptchaImage","showUsernameCaptcha","inputValue","captchaValue","floor","moveTo","lineTo","strokeStyle","lineWidth","stroke","font","textBaseline","textAlign","fillText","toDataURL","submitRegister","clearRegisterPhoneError","formattedPhone","phoneExists","isRegisterPhoneExists","loginCode","setPendingRegistration","submitRegisterPassword","clearPendingRegistration","countryCode","digits","normalizedCode","normalizedPhone","mobile_real_verify","config","logo","logoUrl","version","resolveBrandLogo","applyDocumentBrand","appendBrandVersion","base","parsed","icon","querySelector","head","handleBrandLogoError","sessionStorage","pending","openRegister","backToLogin"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/js/chunk-vendors.fa6d4264.js b/dist/js/chunk-vendors.fa6d4264.js new file mode 100644 index 0000000..25b2e86 --- /dev/null +++ b/dist/js/chunk-vendors.fa6d4264.js @@ -0,0 +1,24384 @@ +(self["webpackChunkjc_web_im"] = self["webpackChunkjc_web_im"] || []).push([[504],{ + +/***/ 4: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var _env_data_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7958); +/* harmony import */ var _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(956); + + + + +const validators = {}; + +// eslint-disable-next-line func-names +['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => { + validators[type] = function validator(thing) { + return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type; + }; +}); +const deprecatedWarnings = {}; + +/** + * Transitional option validator + * + * @param {function|boolean?} validator - set to false if the transitional option has been removed + * @param {string?} version - deprecated version / removed since version + * @param {string?} message - some message with additional info + * + * @returns {function} + */ +validators.transitional = function transitional(validator, version, message) { + function formatMessage(opt, desc) { + return '[Axios v' + _env_data_js__WEBPACK_IMPORTED_MODULE_0__/* .VERSION */ .x + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : ''); + } + + // eslint-disable-next-line func-names + return (value, opt, opts) => { + if (validator === false) { + throw new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A.ERR_DEPRECATED); + } + if (version && !deprecatedWarnings[opt]) { + deprecatedWarnings[opt] = true; + // eslint-disable-next-line no-console + console.warn(formatMessage(opt, ' has been deprecated since v' + version + ' and will be removed in the near future')); + } + return validator ? validator(value, opt, opts) : true; + }; +}; + +/** + * Assert object's properties type + * + * @param {object} options + * @param {object} schema + * @param {boolean?} allowUnknown + * + * @returns {object} + */ + +function assertOptions(options, schema, allowUnknown) { + if (typeof options !== 'object') { + throw new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A('options must be an object', _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A.ERR_BAD_OPTION_VALUE); + } + const keys = Object.keys(options); + let i = keys.length; + while (i-- > 0) { + const opt = keys[i]; + const validator = schema[opt]; + if (validator) { + const value = options[opt]; + const result = value === undefined || validator(value, opt, options); + if (result !== true) { + throw new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A('option ' + opt + ' must be ' + result, _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A.ERR_BAD_OPTION_VALUE); + } + continue; + } + if (allowUnknown !== true) { + throw new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A('Unknown option ' + opt, _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A.ERR_BAD_OPTION); + } + } +} +/* harmony default export */ __webpack_exports__.A = ({ + assertOptions, + validators +}); + +/***/ }), + +/***/ 187: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(680); + + +const HttpStatusCode = { + Continue: 100, + SwitchingProtocols: 101, + Processing: 102, + EarlyHints: 103, + Ok: 200, + Created: 201, + Accepted: 202, + NonAuthoritativeInformation: 203, + NoContent: 204, + ResetContent: 205, + PartialContent: 206, + MultiStatus: 207, + AlreadyReported: 208, + ImUsed: 226, + MultipleChoices: 300, + MovedPermanently: 301, + Found: 302, + SeeOther: 303, + NotModified: 304, + UseProxy: 305, + Unused: 306, + TemporaryRedirect: 307, + PermanentRedirect: 308, + BadRequest: 400, + Unauthorized: 401, + PaymentRequired: 402, + Forbidden: 403, + NotFound: 404, + MethodNotAllowed: 405, + NotAcceptable: 406, + ProxyAuthenticationRequired: 407, + RequestTimeout: 408, + Conflict: 409, + Gone: 410, + LengthRequired: 411, + PreconditionFailed: 412, + PayloadTooLarge: 413, + UriTooLong: 414, + UnsupportedMediaType: 415, + RangeNotSatisfiable: 416, + ExpectationFailed: 417, + ImATeapot: 418, + MisdirectedRequest: 421, + UnprocessableEntity: 422, + Locked: 423, + FailedDependency: 424, + TooEarly: 425, + UpgradeRequired: 426, + PreconditionRequired: 428, + TooManyRequests: 429, + RequestHeaderFieldsTooLarge: 431, + UnavailableForLegalReasons: 451, + InternalServerError: 500, + NotImplemented: 501, + BadGateway: 502, + ServiceUnavailable: 503, + GatewayTimeout: 504, + HttpVersionNotSupported: 505, + VariantAlsoNegotiates: 506, + InsufficientStorage: 507, + LoopDetected: 508, + NotExtended: 510, + NetworkAuthenticationRequired: 511 +}; +Object.entries(HttpStatusCode).forEach(([key, value]) => { + HttpStatusCode[value] = key; +}); +/* harmony default export */ __webpack_exports__.A = (HttpStatusCode); + +/***/ }), + +/***/ 292: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(680); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(793); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5813); +/* harmony import */ var _helpers_parseHeaders_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1939); + + + + + + + +const $internals = Symbol('internals'); +function normalizeHeader(header) { + return header && String(header).trim().toLowerCase(); +} +function normalizeValue(value) { + if (value === false || value == null) { + return value; + } + return _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isArray(value) ? value.map(normalizeValue) : String(value); +} +function parseTokens(str) { + const tokens = Object.create(null); + const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g; + let match; + while (match = tokensRE.exec(str)) { + tokens[match[1]] = match[2]; + } + return tokens; +} +const isValidHeaderName = str => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim()); +function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) { + if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isFunction(filter)) { + return filter.call(this, value, header); + } + if (isHeaderNameFilter) { + value = header; + } + if (!_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isString(value)) return; + if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isString(filter)) { + return value.indexOf(filter) !== -1; + } + if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isRegExp(filter)) { + return filter.test(value); + } +} +function formatHeader(header) { + return header.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => { + return char.toUpperCase() + str; + }); +} +function buildAccessors(obj, header) { + const accessorName = _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.toCamelCase(' ' + header); + ['get', 'set', 'has'].forEach(methodName => { + Object.defineProperty(obj, methodName + accessorName, { + value: function (arg1, arg2, arg3) { + return this[methodName].call(this, header, arg1, arg2, arg3); + }, + configurable: true + }); + }); +} +class AxiosHeaders { + constructor(headers) { + headers && this.set(headers); + } + set(header, valueOrRewrite, rewrite) { + const self = this; + function setHeader(_value, _header, _rewrite) { + const lHeader = normalizeHeader(_header); + if (!lHeader) { + throw new Error('header name must be a non-empty string'); + } + const key = _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.findKey(self, lHeader); + if (!key || self[key] === undefined || _rewrite === true || _rewrite === undefined && self[key] !== false) { + self[key || _header] = normalizeValue(_value); + } + } + const setHeaders = (headers, _rewrite) => _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); + if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isPlainObject(header) || header instanceof this.constructor) { + setHeaders(header, valueOrRewrite); + } else if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { + setHeaders((0,_helpers_parseHeaders_js__WEBPACK_IMPORTED_MODULE_4__/* ["default"] */ .A)(header), valueOrRewrite); + } else { + header != null && setHeader(valueOrRewrite, header, rewrite); + } + return this; + } + get(header, parser) { + header = normalizeHeader(header); + if (header) { + const key = _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.findKey(this, header); + if (key) { + const value = this[key]; + if (!parser) { + return value; + } + if (parser === true) { + return parseTokens(value); + } + if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isFunction(parser)) { + return parser.call(this, value, key); + } + if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isRegExp(parser)) { + return parser.exec(value); + } + throw new TypeError('parser must be boolean|regexp|function'); + } + } + } + has(header, matcher) { + header = normalizeHeader(header); + if (header) { + const key = _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.findKey(this, header); + return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher))); + } + return false; + } + delete(header, matcher) { + const self = this; + let deleted = false; + function deleteHeader(_header) { + _header = normalizeHeader(_header); + if (_header) { + const key = _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.findKey(self, _header); + if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) { + delete self[key]; + deleted = true; + } + } + } + if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isArray(header)) { + header.forEach(deleteHeader); + } else { + deleteHeader(header); + } + return deleted; + } + clear(matcher) { + const keys = Object.keys(this); + let i = keys.length; + let deleted = false; + while (i--) { + const key = keys[i]; + if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) { + delete this[key]; + deleted = true; + } + } + return deleted; + } + normalize(format) { + const self = this; + const headers = {}; + _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.forEach(this, (value, header) => { + const key = _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.findKey(headers, header); + if (key) { + self[key] = normalizeValue(value); + delete self[header]; + return; + } + const normalized = format ? formatHeader(header) : String(header).trim(); + if (normalized !== header) { + delete self[header]; + } + self[normalized] = normalizeValue(value); + headers[normalized] = true; + }); + return this; + } + concat(...targets) { + return this.constructor.concat(this, ...targets); + } + toJSON(asStrings) { + const obj = Object.create(null); + _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.forEach(this, (value, header) => { + value != null && value !== false && (obj[header] = asStrings && _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isArray(value) ? value.join(', ') : value); + }); + return obj; + } + [Symbol.iterator]() { + return Object.entries(this.toJSON())[Symbol.iterator](); + } + toString() { + return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\n'); + } + get [Symbol.toStringTag]() { + return 'AxiosHeaders'; + } + static from(thing) { + return thing instanceof this ? thing : new this(thing); + } + static concat(first, ...targets) { + const computed = new this(first); + targets.forEach(target => computed.set(target)); + return computed; + } + static accessor(header) { + const internals = this[$internals] = this[$internals] = { + accessors: {} + }; + const accessors = internals.accessors; + const prototype = this.prototype; + function defineAccessor(_header) { + const lHeader = normalizeHeader(_header); + if (!accessors[lHeader]) { + buildAccessors(prototype, _header); + accessors[lHeader] = true; + } + } + _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); + return this; + } +} +AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']); + +// reserved names hotfix +_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.reduceDescriptors(AxiosHeaders.prototype, ({ + value +}, key) => { + let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set` + return { + get: () => value, + set(headerValue) { + this[mapped] = headerValue; + } + }; +}); +_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.freezeMethods(AxiosHeaders); +/* harmony default export */ __webpack_exports__.A = (AxiosHeaders); + +/***/ }), + +/***/ 308: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* binding */ mergeConfig; } +/* harmony export */ }); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(680); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5813); +/* harmony import */ var _AxiosHeaders_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(292); + + + + + + +const headersToObject = thing => thing instanceof _AxiosHeaders_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A ? thing.toJSON() : thing; + +/** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * + * @returns {Object} New object resulting from merging config2 to config1 + */ +function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + const config = {}; + function getMergedValue(target, source, caseless) { + if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isPlainObject(target) && _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isPlainObject(source)) { + return _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.merge.call({ + caseless + }, target, source); + } else if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isPlainObject(source)) { + return _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.merge({}, source); + } else if (_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isArray(source)) { + return source.slice(); + } + return source; + } + + // eslint-disable-next-line consistent-return + function mergeDeepProperties(a, b, caseless) { + if (!_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isUndefined(b)) { + return getMergedValue(a, b, caseless); + } else if (!_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isUndefined(a)) { + return getMergedValue(undefined, a, caseless); + } + } + + // eslint-disable-next-line consistent-return + function valueFromConfig2(a, b) { + if (!_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isUndefined(b)) { + return getMergedValue(undefined, b); + } + } + + // eslint-disable-next-line consistent-return + function defaultToConfig2(a, b) { + if (!_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isUndefined(b)) { + return getMergedValue(undefined, b); + } else if (!_utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isUndefined(a)) { + return getMergedValue(undefined, a); + } + } + + // eslint-disable-next-line consistent-return + function mergeDirectKeys(a, b, prop) { + if (prop in config2) { + return getMergedValue(a, b); + } else if (prop in config1) { + return getMergedValue(undefined, a); + } + } + const mergeMap = { + url: valueFromConfig2, + method: valueFromConfig2, + data: valueFromConfig2, + baseURL: defaultToConfig2, + transformRequest: defaultToConfig2, + transformResponse: defaultToConfig2, + paramsSerializer: defaultToConfig2, + timeout: defaultToConfig2, + timeoutMessage: defaultToConfig2, + withCredentials: defaultToConfig2, + withXSRFToken: defaultToConfig2, + adapter: defaultToConfig2, + responseType: defaultToConfig2, + xsrfCookieName: defaultToConfig2, + xsrfHeaderName: defaultToConfig2, + onUploadProgress: defaultToConfig2, + onDownloadProgress: defaultToConfig2, + decompress: defaultToConfig2, + maxContentLength: defaultToConfig2, + maxBodyLength: defaultToConfig2, + beforeRedirect: defaultToConfig2, + transport: defaultToConfig2, + httpAgent: defaultToConfig2, + httpsAgent: defaultToConfig2, + cancelToken: defaultToConfig2, + socketPath: defaultToConfig2, + responseEncoding: defaultToConfig2, + validateStatus: mergeDirectKeys, + headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true) + }; + _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { + const merge = mergeMap[prop] || mergeDeepProperties; + const configValue = merge(config1[prop], config2[prop], prop); + _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.isUndefined(configValue) && merge !== mergeDirectKeys || (config[prop] = configValue); + }); + return config; +} + +/***/ }), + +/***/ 323: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var toPrimitive = __webpack_require__(8004); + +var $TypeError = TypeError; + +// `ToBigInt` abstract operation +// https://tc39.es/ecma262/#sec-tobigint +module.exports = function (argument) { + var prim = toPrimitive(argument, 'number'); + if (typeof prim == 'number') throw new $TypeError("Can't convert number to bigint"); + // eslint-disable-next-line es/no-bigint -- safe + return BigInt(prim); +}; + + +/***/ }), + +/***/ 429: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(4911); +var fails = __webpack_require__(4212); + +// V8 ~ Chrome 36- +// https://bugs.chromium.org/p/v8/issues/detail?id=3334 +module.exports = DESCRIPTORS && fails(function () { + // eslint-disable-next-line es/no-object-defineproperty -- required for testing + return Object.defineProperty(function () { /* empty */ }, 'prototype', { + value: 42, + writable: false + }).prototype !== 42; +}); + + +/***/ }), + +/***/ 448: +/***/ (function(module) { + +"use strict"; + +// IE8- don't enum bug keys +module.exports = [ + 'constructor', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'toLocaleString', + 'toString', + 'valueOf' +]; + + +/***/ }), + +/***/ 483: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var IS_NODE = __webpack_require__(5181); + +module.exports = function (name) { + try { + // eslint-disable-next-line no-new-func -- safe + if (IS_NODE) return Function('return require("' + name + '")')(); + } catch (error) { /* empty */ } +}; + + +/***/ }), + +/***/ 491: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var global = __webpack_require__(4074); +var userAgent = __webpack_require__(8027); + +var process = global.process; +var Deno = global.Deno; +var versions = process && process.versions || Deno && Deno.version; +var v8 = versions && versions.v8; +var match, version; + +if (v8) { + match = v8.split('.'); + // in old Chrome, versions of V8 isn't V8 = Chrome / 10 + // but their correct versions are not interesting for us + version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); +} + +// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0` +// so check `userAgent` even if `.v8` exists, but 0 +if (!version && userAgent) { + match = userAgent.match(/Edge\/(\d+)/); + if (!match || match[1] >= 74) { + match = userAgent.match(/Chrome\/(\d+)/); + if (match) version = +match[1]; + } +} + +module.exports = version; + + +/***/ }), + +/***/ 640: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +/* eslint-disable no-proto -- safe */ +var uncurryThisAccessor = __webpack_require__(2471); +var anObject = __webpack_require__(6696); +var aPossiblePrototype = __webpack_require__(9219); + +// `Object.setPrototypeOf` method +// https://tc39.es/ecma262/#sec-object.setprototypeof +// Works with __proto__ only. Old v8 can't work with null proto objects. +// eslint-disable-next-line es/no-object-setprototypeof -- safe +module.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var CORRECT_SETTER = false; + var test = {}; + var setter; + try { + setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set'); + setter(test, []); + CORRECT_SETTER = test instanceof Array; + } catch (error) { /* empty */ } + return function setPrototypeOf(O, proto) { + anObject(O); + aPossiblePrototype(proto); + if (CORRECT_SETTER) setter(O, proto); + else O.__proto__ = proto; + return O; + }; +}() : undefined); + + +/***/ }), + +/***/ 679: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5813); +/* harmony import */ var _platform_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8394); + + + + +/* harmony default export */ __webpack_exports__.A = (_platform_index_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A.hasStandardBrowserEnv ? +// Standard browser envs have full support of the APIs needed to test +// whether the request URL is of the same origin as current location. +function standardBrowserEnv() { + const msie = /(msie|trident)/i.test(navigator.userAgent); + const urlParsingNode = document.createElement('a'); + let originURL; + + /** + * Parse a URL to discover its components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + let href = url; + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname + }; + } + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + const parsed = _utils_js__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A.isString(requestURL) ? resolveURL(requestURL) : requestURL; + return parsed.protocol === originURL.protocol && parsed.host === originURL.host; + }; +}() : +// Non standard browser envs (web workers, react-native) lack needed support. +function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; +}()); + +/***/ }), + +/***/ 680: +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(8155); +var iterate = __webpack_require__(1663); +var aCallable = __webpack_require__(8951); +var anObject = __webpack_require__(6696); +var getIteratorDirect = __webpack_require__(8764); + +// `Iterator.prototype.forEach` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true }, { + forEach: function forEach(fn) { + anObject(this); + aCallable(fn); + var record = getIteratorDirect(this); + var counter = 0; + iterate(record, function (value) { + fn(value, counter++); + }, { IS_RECORD: true }); + } +}); + + +/***/ }), + +/***/ 683: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var aSet = __webpack_require__(3991); +var SetHelpers = __webpack_require__(5057); +var size = __webpack_require__(903); +var getSetRecord = __webpack_require__(3108); +var iterateSet = __webpack_require__(2282); +var iterateSimple = __webpack_require__(6550); + +var Set = SetHelpers.Set; +var add = SetHelpers.add; +var has = SetHelpers.has; + +// `Set.prototype.intersection` method +// https://github.com/tc39/proposal-set-methods +module.exports = function intersection(other) { + var O = aSet(this); + var otherRec = getSetRecord(other); + var result = new Set(); + + if (size(O) > otherRec.size) { + iterateSimple(otherRec.getIterator(), function (e) { + if (has(O, e)) add(result, e); + }); + } else { + iterateSet(O, function (e) { + if (otherRec.includes(e)) add(result, e); + }); + } + + return result; +}; + + +/***/ }), + +/***/ 793: +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var $ = __webpack_require__(8155); +var map = __webpack_require__(2344); +var IS_PURE = __webpack_require__(8072); + +// `Iterator.prototype.map` method +// https://github.com/tc39/proposal-iterator-helpers +$({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { + map: map +}); + + +/***/ }), + +/***/ 797: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(793); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5813); + + + + + + +/** + * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z'] + * + * @param {string} name - The name of the property to get. + * + * @returns An array of strings. + */ +function parsePropPath(name) { + // foo[x][y][z] + // foo.x.y.z + // foo-x-y-z + // foo x y z + return _utils_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A.matchAll(/\w+|\[(\w*)]/g, name).map(match => { + return match[0] === '[]' ? '' : match[1] || match[0]; + }); +} + +/** + * Convert an array to an object. + * + * @param {Array} arr - The array to convert to an object. + * + * @returns An object with the same keys and values as the array. + */ +function arrayToObject(arr) { + const obj = {}; + const keys = Object.keys(arr); + let i; + const len = keys.length; + let key; + for (i = 0; i < len; i++) { + key = keys[i]; + obj[key] = arr[key]; + } + return obj; +} + +/** + * It takes a FormData object and returns a JavaScript object + * + * @param {string} formData The FormData object to convert to JSON. + * + * @returns {Object | null} The converted object. + */ +function formDataToJSON(formData) { + function buildPath(path, value, target, index) { + let name = path[index++]; + if (name === '__proto__') return true; + const isNumericKey = Number.isFinite(+name); + const isLast = index >= path.length; + name = !name && _utils_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A.isArray(target) ? target.length : name; + if (isLast) { + if (_utils_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A.hasOwnProp(target, name)) { + target[name] = [target[name], value]; + } else { + target[name] = value; + } + return !isNumericKey; + } + if (!target[name] || !_utils_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A.isObject(target[name])) { + target[name] = []; + } + const result = buildPath(path, value, target[name], index); + if (result && _utils_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A.isArray(target[name])) { + target[name] = arrayToObject(target[name]); + } + return !isNumericKey; + } + if (_utils_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A.isFormData(formData) && _utils_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A.isFunction(formData.entries)) { + const obj = {}; + _utils_js__WEBPACK_IMPORTED_MODULE_2__/* ["default"] */ .A.forEachEntry(formData, (name, value) => { + buildPath(parsePropPath(name), value, obj, 0); + }); + return obj; + } + return null; +} +/* harmony default export */ __webpack_exports__.A = (formDataToJSON); + +/***/ }), + +/***/ 903: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var uncurryThisAccessor = __webpack_require__(2471); +var SetHelpers = __webpack_require__(5057); + +module.exports = uncurryThisAccessor(SetHelpers.proto, 'size', 'get') || function (set) { + return set.size; +}; + + +/***/ }), + +/***/ 956: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5813); + + + + +/** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [config] The config. + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * + * @returns {Error} The created error. + */ +function AxiosError(message, code, config, request, response) { + Error.call(this); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } else { + this.stack = new Error().stack; + } + this.message = message; + this.name = 'AxiosError'; + code && (this.code = code); + config && (this.config = config); + request && (this.request = request); + response && (this.response = response); +} +_utils_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A.inherits(AxiosError, Error, { + toJSON: function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: _utils_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A.toJSONObject(this.config), + code: this.code, + status: this.response && this.response.status ? this.response.status : null + }; + } +}); +const prototype = AxiosError.prototype; +const descriptors = {}; +['ERR_BAD_OPTION_VALUE', 'ERR_BAD_OPTION', 'ECONNABORTED', 'ETIMEDOUT', 'ERR_NETWORK', 'ERR_FR_TOO_MANY_REDIRECTS', 'ERR_DEPRECATED', 'ERR_BAD_RESPONSE', 'ERR_BAD_REQUEST', 'ERR_CANCELED', 'ERR_NOT_SUPPORT', 'ERR_INVALID_URL' +// eslint-disable-next-line func-names +].forEach(code => { + descriptors[code] = { + value: code + }; +}); +Object.defineProperties(AxiosError, descriptors); +Object.defineProperty(prototype, 'isAxiosError', { + value: true +}); + +// eslint-disable-next-line func-names +AxiosError.from = (error, code, config, request, response, customProps) => { + const axiosError = Object.create(prototype); + _utils_js__WEBPACK_IMPORTED_MODULE_0__/* ["default"] */ .A.toFlatObject(error, axiosError, function filter(obj) { + return obj !== Error.prototype; + }, prop => { + return prop !== 'isAxiosError'; + }); + AxiosError.call(axiosError, error.message, code, config, request, response); + axiosError.cause = error; + axiosError.name = error.name; + customProps && Object.assign(axiosError, customProps); + return axiosError; +}; +/* harmony default export */ __webpack_exports__.A = (AxiosError); + +/***/ }), + +/***/ 978: +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var arrayToReversed = __webpack_require__(3495); +var ArrayBufferViewCore = __webpack_require__(4257); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; + +// `%TypedArray%.prototype.toReversed` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.toreversed +exportTypedArrayMethod('toReversed', function toReversed() { + return arrayToReversed(aTypedArray(this), getTypedArrayConstructor(this)); +}); + + +/***/ }), + +/***/ 1028: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var fails = __webpack_require__(4212); +var isCallable = __webpack_require__(6450); +var isObject = __webpack_require__(1909); +var create = __webpack_require__(9891); +var getPrototypeOf = __webpack_require__(3148); +var defineBuiltIn = __webpack_require__(3647); +var wellKnownSymbol = __webpack_require__(9760); +var IS_PURE = __webpack_require__(8072); + +var ITERATOR = wellKnownSymbol('iterator'); +var BUGGY_SAFARI_ITERATORS = false; + +// `%IteratorPrototype%` object +// https://tc39.es/ecma262/#sec-%iteratorprototype%-object +var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator; + +/* eslint-disable es/no-array-prototype-keys -- safe */ +if ([].keys) { + arrayIterator = [].keys(); + // Safari 8 has buggy iterators w/o `next` + if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true; + else { + PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator)); + if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype; + } +} + +var NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () { + var test = {}; + // FF44- legacy iterators case + return IteratorPrototype[ITERATOR].call(test) !== test; +}); + +if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {}; +else if (IS_PURE) IteratorPrototype = create(IteratorPrototype); + +// `%IteratorPrototype%[@@iterator]()` method +// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator +if (!isCallable(IteratorPrototype[ITERATOR])) { + defineBuiltIn(IteratorPrototype, ITERATOR, function () { + return this; + }); +} + +module.exports = { + IteratorPrototype: IteratorPrototype, + BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS +}; + + +/***/ }), + +/***/ 1079: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var uncurryThis = __webpack_require__(1371); + +var toString = uncurryThis({}.toString); +var stringSlice = uncurryThis(''.slice); + +module.exports = function (it) { + return stringSlice(toString(it), 8, -1); +}; + + +/***/ }), + +/***/ 1252: +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var DESCRIPTORS = __webpack_require__(4911); +var V8_PROTOTYPE_DEFINE_BUG = __webpack_require__(429); +var definePropertyModule = __webpack_require__(8564); +var anObject = __webpack_require__(6696); +var toIndexedObject = __webpack_require__(5830); +var objectKeys = __webpack_require__(6915); + +// `Object.defineProperties` method +// https://tc39.es/ecma262/#sec-object.defineproperties +// eslint-disable-next-line es/no-object-defineproperties -- safe +exports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var props = toIndexedObject(Properties); + var keys = objectKeys(Properties); + var length = keys.length; + var index = 0; + var key; + while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]); + return O; +}; + + +/***/ }), + +/***/ 1257: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var toIntegerOrInfinity = __webpack_require__(9106); + +var max = Math.max; +var min = Math.min; + +// Helper for a popular repeating case of the spec: +// Let integer be ? ToInteger(index). +// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length). +module.exports = function (index, length) { + var integer = toIntegerOrInfinity(index); + return integer < 0 ? max(integer + length, 0) : min(integer, length); +}; + + +/***/ }), + +/***/ 1258: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var requireObjectCoercible = __webpack_require__(2967); + +var $Object = Object; + +// `ToObject` abstract operation +// https://tc39.es/ecma262/#sec-toobject +module.exports = function (argument) { + return $Object(requireObjectCoercible(argument)); +}; + + +/***/ }), + +/***/ 1298: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var call = __webpack_require__(4978); +var anObject = __webpack_require__(6696); +var getMethod = __webpack_require__(4863); + +module.exports = function (iterator, kind, value) { + var innerResult, innerError; + anObject(iterator); + try { + innerResult = getMethod(iterator, 'return'); + if (!innerResult) { + if (kind === 'throw') throw value; + return value; + } + innerResult = call(innerResult, iterator); + } catch (error) { + innerError = true; + innerResult = error; + } + if (kind === 'throw') throw value; + if (innerError) throw innerResult; + anObject(innerResult); + return value; +}; + + +/***/ }), + +/***/ 1320: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* binding */ isAbsoluteURL; } +/* harmony export */ }); + + +/** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ +function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); +} + +/***/ }), + +/***/ 1327: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ $q: function() { return /* binding */ setupDevtoolsPlugin; } +/* harmony export */ }); +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5513); +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _env_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8184); +/* harmony import */ var _const_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5172); +/* harmony import */ var _proxy_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2779); + + + + + + + +function setupDevtoolsPlugin(pluginDescriptor, setupFn) { + const descriptor = pluginDescriptor; + const target = (0,_env_js__WEBPACK_IMPORTED_MODULE_1__/* .getTarget */ .EW)(); + const hook = (0,_env_js__WEBPACK_IMPORTED_MODULE_1__/* .getDevtoolsGlobalHook */ .HH)(); + const enableProxy = _env_js__WEBPACK_IMPORTED_MODULE_1__/* .isProxyAvailable */ .Cx && descriptor.enableEarlyProxy; + if (hook && (target.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__ || !enableProxy)) { + hook.emit(_const_js__WEBPACK_IMPORTED_MODULE_2__/* .HOOK_SETUP */ .K, pluginDescriptor, setupFn); + } else { + const proxy = enableProxy ? new _proxy_js__WEBPACK_IMPORTED_MODULE_3__/* .ApiProxy */ .R(descriptor, hook) : null; + const list = target.__VUE_DEVTOOLS_PLUGINS__ = target.__VUE_DEVTOOLS_PLUGINS__ || []; + list.push({ + pluginDescriptor: descriptor, + setupFn, + proxy + }); + if (proxy) { + setupFn(proxy.proxiedTarget); + } + } +} + +/***/ }), + +/***/ 1341: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var lengthOfArrayLike = __webpack_require__(4231); + +module.exports = function (Constructor, list, $length) { + var index = 0; + var length = arguments.length > 2 ? $length : lengthOfArrayLike(list); + var result = new Constructor(length); + while (length > index) result[index] = list[index++]; + return result; +}; + + +/***/ }), + +/***/ 1371: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var NATIVE_BIND = __webpack_require__(8537); + +var FunctionPrototype = Function.prototype; +var call = FunctionPrototype.call; +var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); + +module.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) { + return function () { + return call.apply(fn, arguments); + }; +}; + + +/***/ }), + +/***/ 1396: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var uncurryThis = __webpack_require__(1371); +var toObject = __webpack_require__(1258); + +var hasOwnProperty = uncurryThis({}.hasOwnProperty); + +// `HasOwnProperty` abstract operation +// https://tc39.es/ecma262/#sec-hasownproperty +// eslint-disable-next-line es/no-object-hasown -- safe +module.exports = Object.hasOwn || function hasOwn(it, key) { + return hasOwnProperty(toObject(it), key); +}; + + +/***/ }), + +/***/ 1422: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var toPrimitive = __webpack_require__(8004); +var isSymbol = __webpack_require__(3058); + +// `ToPropertyKey` abstract operation +// https://tc39.es/ecma262/#sec-topropertykey +module.exports = function (argument) { + var key = toPrimitive(argument, 'string'); + return isSymbol(key) ? key : key + ''; +}; + + +/***/ }), + +/***/ 1476: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var isPrototypeOf = __webpack_require__(1856); + +var $TypeError = TypeError; + +module.exports = function (it, Prototype) { + if (isPrototypeOf(Prototype, it)) return it; + throw new $TypeError('Incorrect invocation'); +}; + + +/***/ }), + +/***/ 1477: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ A: function() { return /* binding */ combineURLs; } +/* harmony export */ }); + + +/** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * + * @returns {string} The combined URL + */ +function combineURLs(baseURL, relativeURL) { + return relativeURL ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL; +} + +/***/ }), + +/***/ 1531: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var aSet = __webpack_require__(3991); +var SetHelpers = __webpack_require__(5057); +var clone = __webpack_require__(7289); +var getSetRecord = __webpack_require__(3108); +var iterateSimple = __webpack_require__(6550); + +var add = SetHelpers.add; +var has = SetHelpers.has; +var remove = SetHelpers.remove; + +// `Set.prototype.symmetricDifference` method +// https://github.com/tc39/proposal-set-methods +module.exports = function symmetricDifference(other) { + var O = aSet(this); + var keysIter = getSetRecord(other).getIterator(); + var result = clone(O); + iterateSimple(keysIter, function (e) { + if (has(O, e)) remove(result, e); + else add(result, e); + }); + return result; +}; + + +/***/ }), + +/***/ 1591: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3741); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(680); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(793); +/* harmony import */ var core_js_modules_web_dom_exception_stack_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(6180); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5813); +/* harmony import */ var _core_settle_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(6087); +/* harmony import */ var _helpers_cookies_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(7229); +/* harmony import */ var _helpers_buildURL_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(9541); +/* harmony import */ var _core_buildFullPath_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(9008); +/* harmony import */ var _helpers_isURLSameOrigin_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(679); +/* harmony import */ var _defaults_transitional_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(3773); +/* harmony import */ var _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(956); +/* harmony import */ var _cancel_CanceledError_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(7080); +/* harmony import */ var _helpers_parseProtocol_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(3009); +/* harmony import */ var _platform_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(8394); +/* harmony import */ var _core_AxiosHeaders_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(292); +/* harmony import */ var _helpers_speedometer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7727); + + + + + + + + + + + + + + + + + + + + +function progressEventReducer(listener, isDownloadStream) { + let bytesNotified = 0; + const _speedometer = (0,_helpers_speedometer_js__WEBPACK_IMPORTED_MODULE_5__/* ["default"] */ .A)(50, 250); + return e => { + const loaded = e.loaded; + const total = e.lengthComputable ? e.total : undefined; + const progressBytes = loaded - bytesNotified; + const rate = _speedometer(progressBytes); + const inRange = loaded <= total; + bytesNotified = loaded; + const data = { + loaded, + total, + progress: total ? loaded / total : undefined, + bytes: progressBytes, + rate: rate ? rate : undefined, + estimated: rate && total && inRange ? (total - loaded) / rate : undefined, + event: e + }; + data[isDownloadStream ? 'download' : 'upload'] = true; + listener(data); + }; +} +const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined'; +/* harmony default export */ __webpack_exports__.A = (isXHRAdapterSupported && function (config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + let requestData = config.data; + const requestHeaders = _core_AxiosHeaders_js__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.from(config.headers).normalize(); + let { + responseType, + withXSRFToken + } = config; + let onCanceled; + function done() { + if (config.cancelToken) { + config.cancelToken.unsubscribe(onCanceled); + } + if (config.signal) { + config.signal.removeEventListener('abort', onCanceled); + } + } + let contentType; + if (_utils_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A.isFormData(requestData)) { + if (_platform_index_js__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .A.hasStandardBrowserEnv || _platform_index_js__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .A.hasStandardBrowserWebWorkerEnv) { + requestHeaders.setContentType(false); // Let the browser set it + } else if ((contentType = requestHeaders.getContentType()) !== false) { + // fix semicolon duplication issue for ReactNative FormData implementation + const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : []; + requestHeaders.setContentType([type || 'multipart/form-data', ...tokens].join('; ')); + } + } + let request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + const username = config.auth.username || ''; + const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password)); + } + const fullPath = (0,_core_buildFullPath_js__WEBPACK_IMPORTED_MODULE_9__/* ["default"] */ .A)(config.baseURL, config.url); + request.open(config.method.toUpperCase(), (0,_helpers_buildURL_js__WEBPACK_IMPORTED_MODULE_10__/* ["default"] */ .A)(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + function onloadend() { + if (!request) { + return; + } + // Prepare the response + const responseHeaders = _core_AxiosHeaders_js__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.from('getAllResponseHeaders' in request && request.getAllResponseHeaders()); + const responseData = !responseType || responseType === 'text' || responseType === 'json' ? request.responseText : request.response; + const response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config, + request + }; + (0,_core_settle_js__WEBPACK_IMPORTED_MODULE_11__/* ["default"] */ .A)(function _resolve(value) { + resolve(value); + done(); + }, function _reject(err) { + reject(err); + done(); + }, response); + + // Clean up request + request = null; + } + if ('onloadend' in request) { + // Use onloadend if available + request.onloadend = onloadend; + } else { + // Listen for ready state to emulate onloadend + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + // readystate handler is calling before onerror or ontimeout handlers, + // so we should call onloadend on the next 'tick' + setTimeout(onloadend); + }; + } + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + reject(new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .A('Request aborted', _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .A.ECONNABORTED, config, request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .A('Network Error', _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .A.ERR_NETWORK, config, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; + const transitional = config.transitional || _defaults_transitional_js__WEBPACK_IMPORTED_MODULE_13__/* ["default"] */ .A; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .A(timeoutErrorMessage, transitional.clarifyTimeoutError ? _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .A.ETIMEDOUT : _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .A.ECONNABORTED, config, request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if (_platform_index_js__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .A.hasStandardBrowserEnv) { + withXSRFToken && _utils_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(config)); + if (withXSRFToken || withXSRFToken !== false && (0,_helpers_isURLSameOrigin_js__WEBPACK_IMPORTED_MODULE_14__/* ["default"] */ .A)(fullPath)) { + // Add xsrf header + const xsrfValue = config.xsrfHeaderName && config.xsrfCookieName && _helpers_cookies_js__WEBPACK_IMPORTED_MODULE_15__/* ["default"] */ .A.read(config.xsrfCookieName); + if (xsrfValue) { + requestHeaders.set(config.xsrfHeaderName, xsrfValue); + } + } + } + + // Remove Content-Type if data is undefined + requestData === undefined && requestHeaders.setContentType(null); + + // Add headers to the request + if ('setRequestHeader' in request) { + _utils_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) { + request.setRequestHeader(key, val); + }); + } + + // Add withCredentials to request if needed + if (!_utils_js__WEBPACK_IMPORTED_MODULE_7__/* ["default"] */ .A.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (responseType && responseType !== 'json') { + request.responseType = config.responseType; + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true)); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress)); + } + if (config.cancelToken || config.signal) { + // Handle cancellation + // eslint-disable-next-line func-names + onCanceled = cancel => { + if (!request) { + return; + } + reject(!cancel || cancel.type ? new _cancel_CanceledError_js__WEBPACK_IMPORTED_MODULE_16__/* ["default"] */ .A(null, config, request) : cancel); + request.abort(); + request = null; + }; + config.cancelToken && config.cancelToken.subscribe(onCanceled); + if (config.signal) { + config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); + } + } + const protocol = (0,_helpers_parseProtocol_js__WEBPACK_IMPORTED_MODULE_17__/* ["default"] */ .A)(fullPath); + if (protocol && _platform_index_js__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .A.protocols.indexOf(protocol) === -1) { + reject(new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .A('Unsupported protocol ' + protocol + ':', _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_12__/* ["default"] */ .A.ERR_BAD_REQUEST, config)); + return; + } + + // Send the request + request.send(requestData || null); + }); +}); + +/***/ }), + +/***/ 1663: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var bind = __webpack_require__(2719); +var call = __webpack_require__(4978); +var anObject = __webpack_require__(6696); +var tryToString = __webpack_require__(9240); +var isArrayIteratorMethod = __webpack_require__(2348); +var lengthOfArrayLike = __webpack_require__(4231); +var isPrototypeOf = __webpack_require__(1856); +var getIterator = __webpack_require__(9700); +var getIteratorMethod = __webpack_require__(7312); +var iteratorClose = __webpack_require__(1298); + +var $TypeError = TypeError; + +var Result = function (stopped, result) { + this.stopped = stopped; + this.result = result; +}; + +var ResultPrototype = Result.prototype; + +module.exports = function (iterable, unboundFunction, options) { + var that = options && options.that; + var AS_ENTRIES = !!(options && options.AS_ENTRIES); + var IS_RECORD = !!(options && options.IS_RECORD); + var IS_ITERATOR = !!(options && options.IS_ITERATOR); + var INTERRUPTED = !!(options && options.INTERRUPTED); + var fn = bind(unboundFunction, that); + var iterator, iterFn, index, length, result, next, step; + + var stop = function (condition) { + if (iterator) iteratorClose(iterator, 'normal', condition); + return new Result(true, condition); + }; + + var callFn = function (value) { + if (AS_ENTRIES) { + anObject(value); + return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]); + } return INTERRUPTED ? fn(value, stop) : fn(value); + }; + + if (IS_RECORD) { + iterator = iterable.iterator; + } else if (IS_ITERATOR) { + iterator = iterable; + } else { + iterFn = getIteratorMethod(iterable); + if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable'); + // optimisation for array iterators + if (isArrayIteratorMethod(iterFn)) { + for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) { + result = callFn(iterable[index]); + if (result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); + } + iterator = getIterator(iterable, iterFn); + } + + next = IS_RECORD ? iterable.next : iterator.next; + while (!(step = call(next, iterator)).done) { + try { + result = callFn(step.value); + } catch (error) { + iteratorClose(iterator, 'throw', error); + } + if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result; + } return new Result(false); +}; + + +/***/ }), + +/***/ 1694: +/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5513); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(680); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5813); + + + + + + +class InterceptorManager { + constructor() { + this.handlers = []; + } + + /** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ + use(fulfilled, rejected, options) { + this.handlers.push({ + fulfilled, + rejected, + synchronous: options ? options.synchronous : false, + runWhen: options ? options.runWhen : null + }); + return this.handlers.length - 1; + } + + /** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + * + * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise + */ + eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } + } + + /** + * Clear all interceptors from the stack + * + * @returns {void} + */ + clear() { + if (this.handlers) { + this.handlers = []; + } + } + + /** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + * + * @returns {void} + */ + forEach(fn) { + _utils_js__WEBPACK_IMPORTED_MODULE_3__/* ["default"] */ .A.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); + } +} +/* harmony default export */ __webpack_exports__.A = (InterceptorManager); + +/***/ }), + +/***/ 1842: +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var arrayWith = __webpack_require__(6122); +var ArrayBufferViewCore = __webpack_require__(4257); +var isBigIntArray = __webpack_require__(9830); +var toIntegerOrInfinity = __webpack_require__(9106); +var toBigInt = __webpack_require__(323); + +var aTypedArray = ArrayBufferViewCore.aTypedArray; +var getTypedArrayConstructor = ArrayBufferViewCore.getTypedArrayConstructor; +var exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod; + +var PROPER_ORDER = !!function () { + try { + // eslint-disable-next-line no-throw-literal, es/no-typed-arrays, es/no-array-prototype-with -- required for testing + new Int8Array(1)['with'](2, { valueOf: function () { throw 8; } }); + } catch (error) { + // some early implementations, like WebKit, does not follow the final semantic + // https://github.com/tc39/proposal-change-array-by-copy/pull/86 + return error === 8; + } +}(); + +// `%TypedArray%.prototype.with` method +// https://tc39.es/ecma262/#sec-%typedarray%.prototype.with +exportTypedArrayMethod('with', { 'with': function (index, value) { + var O = aTypedArray(this); + var relativeIndex = toIntegerOrInfinity(index); + var actualValue = isBigIntArray(O) ? toBigInt(value) : +value; + return arrayWith(O, getTypedArrayConstructor(O), relativeIndex, actualValue); +} }['with'], !PROPER_ORDER); + + +/***/ }), + +/***/ 1856: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + +var uncurryThis = __webpack_require__(1371); + +module.exports = uncurryThis({}.isPrototypeOf); + + +/***/ }), + +/***/ 1857: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ D$: function() { return /* binding */ withModifiers; }, +/* harmony export */ Ef: function() { return /* binding */ createApp; }, +/* harmony export */ Jo: function() { return /* binding */ vModelText; }, +/* harmony export */ jR: function() { return /* binding */ withKeys; }, +/* harmony export */ u1: function() { return /* binding */ vModelSelect; } +/* harmony export */ }); +/* unused harmony exports Transition, TransitionGroup, VueElement, createSSRApp, defineCustomElement, defineSSRCustomElement, hydrate, initDirectivesForSSR, render, useCssModule, useCssVars, useHost, useShadowRoot, vModelCheckbox, vModelDynamic, vModelRadio, vShow */ +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5513); +/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7195); +/* harmony import */ var core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3741); +/* harmony import */ var core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(680); +/* harmony import */ var core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(793); +/* harmony import */ var core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(6071); +/* harmony import */ var core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_iterator_some_js__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(8438); +/* harmony import */ var core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(6768); +/* harmony import */ var core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(2409); +/* harmony import */ var core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(9488); +/* harmony import */ var core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(6591); +/* harmony import */ var core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(5412); +/* harmony import */ var core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(9214); +/* harmony import */ var core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_esnext_set_union_v2_js__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(4187); +/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(4546); +/* harmony import */ var _vue_runtime_core__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(7987); +/* harmony import */ var _vue_shared__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(7153); + + + + + + + + + + + + + +/** +* @vue/runtime-dom v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ + + + +let policy = void 0; +const tt = typeof window !== "undefined" && window.trustedTypes; +if (tt) { + try { + policy = /* @__PURE__ */tt.createPolicy("vue", { + createHTML: val => val + }); + } catch (e) { + false && 0; + } +} +const unsafeToTrustedHTML = policy ? val => policy.createHTML(val) : val => val; +const svgNS = "http://www.w3.org/2000/svg"; +const mathmlNS = "http://www.w3.org/1998/Math/MathML"; +const doc = typeof document !== "undefined" ? document : null; +const templateContainer = doc && /* @__PURE__ */doc.createElement("template"); +const nodeOps = { + insert: (child, parent, anchor) => { + parent.insertBefore(child, anchor || null); + }, + remove: child => { + const parent = child.parentNode; + if (parent) { + parent.removeChild(child); + } + }, + createElement: (tag, namespace, is, props) => { + const el = namespace === "svg" ? doc.createElementNS(svgNS, tag) : namespace === "mathml" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { + is + }) : doc.createElement(tag); + if (tag === "select" && props && props.multiple != null) { + el.setAttribute("multiple", props.multiple); + } + return el; + }, + createText: text => doc.createTextNode(text), + createComment: text => doc.createComment(text), + setText: (node, text) => { + node.nodeValue = text; + }, + setElementText: (el, text) => { + el.textContent = text; + }, + parentNode: node => node.parentNode, + nextSibling: node => node.nextSibling, + querySelector: selector => doc.querySelector(selector), + setScopeId(el, id) { + el.setAttribute(id, ""); + }, + // __UNSAFE__ + // Reason: innerHTML. + // Static content here can only come from compiled templates. + // As long as the user only uses trusted templates, this is safe. + insertStaticContent(content, parent, anchor, namespace, start, end) { + const before = anchor ? anchor.previousSibling : parent.lastChild; + if (start && (start === end || start.nextSibling)) { + while (true) { + parent.insertBefore(start.cloneNode(true), anchor); + if (start === end || !(start = start.nextSibling)) break; + } + } else { + templateContainer.innerHTML = unsafeToTrustedHTML(namespace === "svg" ? `${content}` : namespace === "mathml" ? `${content}` : content); + const template = templateContainer.content; + if (namespace === "svg" || namespace === "mathml") { + const wrapper = template.firstChild; + while (wrapper.firstChild) { + template.appendChild(wrapper.firstChild); + } + template.removeChild(wrapper); + } + parent.insertBefore(template, anchor); + } + return [ + // first + before ? before.nextSibling : parent.firstChild, + // last + anchor ? anchor.previousSibling : parent.lastChild]; + } +}; +const TRANSITION = "transition"; +const ANIMATION = "animation"; +const vtcKey = Symbol("_vtc"); +const DOMTransitionPropsValidators = { + name: String, + type: String, + css: { + type: Boolean, + default: true + }, + duration: [String, Number, Object], + enterFromClass: String, + enterActiveClass: String, + enterToClass: String, + appearFromClass: String, + appearActiveClass: String, + appearToClass: String, + leaveFromClass: String, + leaveActiveClass: String, + leaveToClass: String +}; +const TransitionPropsValidators = /* @__PURE__ */(0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .extend */ .X$)({}, _vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .BaseTransitionPropsValidators */ .QP, DOMTransitionPropsValidators); +const decorate$1 = t => { + t.displayName = "Transition"; + t.props = TransitionPropsValidators; + return t; +}; +const Transition = /* @__PURE__ */(/* unused pure expression or super */ null && (decorate$1((props, { + slots +}) => h(BaseTransition, resolveTransitionProps(props), slots)))); +const callHook = (hook, args = []) => { + if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isArray */ .cy)(hook)) { + hook.forEach(h2 => h2(...args)); + } else if (hook) { + hook(...args); + } +}; +const hasExplicitCallback = hook => { + return hook ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isArray */ .cy)(hook) ? hook.some(h2 => h2.length > 1) : hook.length > 1 : false; +}; +function resolveTransitionProps(rawProps) { + const baseProps = {}; + for (const key in rawProps) { + if (!(key in DOMTransitionPropsValidators)) { + baseProps[key] = rawProps[key]; + } + } + if (rawProps.css === false) { + return baseProps; + } + const { + name = "v", + type, + duration, + enterFromClass = `${name}-enter-from`, + enterActiveClass = `${name}-enter-active`, + enterToClass = `${name}-enter-to`, + appearFromClass = enterFromClass, + appearActiveClass = enterActiveClass, + appearToClass = enterToClass, + leaveFromClass = `${name}-leave-from`, + leaveActiveClass = `${name}-leave-active`, + leaveToClass = `${name}-leave-to` + } = rawProps; + const durations = normalizeDuration(duration); + const enterDuration = durations && durations[0]; + const leaveDuration = durations && durations[1]; + const { + onBeforeEnter, + onEnter, + onEnterCancelled, + onLeave, + onLeaveCancelled, + onBeforeAppear = onBeforeEnter, + onAppear = onEnter, + onAppearCancelled = onEnterCancelled + } = baseProps; + const finishEnter = (el, isAppear, done, isCancelled) => { + el._enterCancelled = isCancelled; + removeTransitionClass(el, isAppear ? appearToClass : enterToClass); + removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass); + done && done(); + }; + const finishLeave = (el, done) => { + el._isLeaving = false; + removeTransitionClass(el, leaveFromClass); + removeTransitionClass(el, leaveToClass); + removeTransitionClass(el, leaveActiveClass); + done && done(); + }; + const makeEnterHook = isAppear => { + return (el, done) => { + const hook = isAppear ? onAppear : onEnter; + const resolve = () => finishEnter(el, isAppear, done); + callHook(hook, [el, resolve]); + nextFrame(() => { + removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass); + addTransitionClass(el, isAppear ? appearToClass : enterToClass); + if (!hasExplicitCallback(hook)) { + whenTransitionEnds(el, type, enterDuration, resolve); + } + }); + }; + }; + return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .extend */ .X$)(baseProps, { + onBeforeEnter(el) { + callHook(onBeforeEnter, [el]); + addTransitionClass(el, enterFromClass); + addTransitionClass(el, enterActiveClass); + }, + onBeforeAppear(el) { + callHook(onBeforeAppear, [el]); + addTransitionClass(el, appearFromClass); + addTransitionClass(el, appearActiveClass); + }, + onEnter: makeEnterHook(false), + onAppear: makeEnterHook(true), + onLeave(el, done) { + el._isLeaving = true; + const resolve = () => finishLeave(el, done); + addTransitionClass(el, leaveFromClass); + if (!el._enterCancelled) { + forceReflow(); + addTransitionClass(el, leaveActiveClass); + } else { + addTransitionClass(el, leaveActiveClass); + forceReflow(); + } + nextFrame(() => { + if (!el._isLeaving) { + return; + } + removeTransitionClass(el, leaveFromClass); + addTransitionClass(el, leaveToClass); + if (!hasExplicitCallback(onLeave)) { + whenTransitionEnds(el, type, leaveDuration, resolve); + } + }); + callHook(onLeave, [el, resolve]); + }, + onEnterCancelled(el) { + finishEnter(el, false, void 0, true); + callHook(onEnterCancelled, [el]); + }, + onAppearCancelled(el) { + finishEnter(el, true, void 0, true); + callHook(onAppearCancelled, [el]); + }, + onLeaveCancelled(el) { + finishLeave(el); + callHook(onLeaveCancelled, [el]); + } + }); +} +function normalizeDuration(duration) { + if (duration == null) { + return null; + } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isObject */ .Gv)(duration)) { + return [NumberOf(duration.enter), NumberOf(duration.leave)]; + } else { + const n = NumberOf(duration); + return [n, n]; + } +} +function NumberOf(val) { + const res = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .toNumber */ .Ro)(val); + if (false) {} + return res; +} +function addTransitionClass(el, cls) { + cls.split(/\s+/).forEach(c => c && el.classList.add(c)); + (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */new Set())).add(cls); +} +function removeTransitionClass(el, cls) { + cls.split(/\s+/).forEach(c => c && el.classList.remove(c)); + const _vtc = el[vtcKey]; + if (_vtc) { + _vtc.delete(cls); + if (!_vtc.size) { + el[vtcKey] = void 0; + } + } +} +function nextFrame(cb) { + requestAnimationFrame(() => { + requestAnimationFrame(cb); + }); +} +let endId = 0; +function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) { + const id = el._endId = ++endId; + const resolveIfNotStale = () => { + if (id === el._endId) { + resolve(); + } + }; + if (explicitTimeout != null) { + return setTimeout(resolveIfNotStale, explicitTimeout); + } + const { + type, + timeout, + propCount + } = getTransitionInfo(el, expectedType); + if (!type) { + return resolve(); + } + const endEvent = type + "end"; + let ended = 0; + const end = () => { + el.removeEventListener(endEvent, onEnd); + resolveIfNotStale(); + }; + const onEnd = e => { + if (e.target === el && ++ended >= propCount) { + end(); + } + }; + setTimeout(() => { + if (ended < propCount) { + end(); + } + }, timeout + 1); + el.addEventListener(endEvent, onEnd); +} +function getTransitionInfo(el, expectedType) { + const styles = window.getComputedStyle(el); + const getStyleProperties = key => (styles[key] || "").split(", "); + const transitionDelays = getStyleProperties(`${TRANSITION}Delay`); + const transitionDurations = getStyleProperties(`${TRANSITION}Duration`); + const transitionTimeout = getTimeout(transitionDelays, transitionDurations); + const animationDelays = getStyleProperties(`${ANIMATION}Delay`); + const animationDurations = getStyleProperties(`${ANIMATION}Duration`); + const animationTimeout = getTimeout(animationDelays, animationDurations); + let type = null; + let timeout = 0; + let propCount = 0; + if (expectedType === TRANSITION) { + if (transitionTimeout > 0) { + type = TRANSITION; + timeout = transitionTimeout; + propCount = transitionDurations.length; + } + } else if (expectedType === ANIMATION) { + if (animationTimeout > 0) { + type = ANIMATION; + timeout = animationTimeout; + propCount = animationDurations.length; + } + } else { + timeout = Math.max(transitionTimeout, animationTimeout); + type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null; + propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0; + } + const hasTransform = type === TRANSITION && /\b(transform|all)(,|$)/.test(getStyleProperties(`${TRANSITION}Property`).toString()); + return { + type, + timeout, + propCount, + hasTransform + }; +} +function getTimeout(delays, durations) { + while (delays.length < durations.length) { + delays = delays.concat(delays); + } + return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i]))); +} +function toMs(s) { + if (s === "auto") return 0; + return Number(s.slice(0, -1).replace(",", ".")) * 1e3; +} +function forceReflow() { + return document.body.offsetHeight; +} +function patchClass(el, value, isSVG) { + const transitionClasses = el[vtcKey]; + if (transitionClasses) { + value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" "); + } + if (value == null) { + el.removeAttribute("class"); + } else if (isSVG) { + el.setAttribute("class", value); + } else { + el.className = value; + } +} +const vShowOriginalDisplay = Symbol("_vod"); +const vShowHidden = Symbol("_vsh"); +const vShow = { + beforeMount(el, { + value + }, { + transition + }) { + el[vShowOriginalDisplay] = el.style.display === "none" ? "" : el.style.display; + if (transition && value) { + transition.beforeEnter(el); + } else { + setDisplay(el, value); + } + }, + mounted(el, { + value + }, { + transition + }) { + if (transition && value) { + transition.enter(el); + } + }, + updated(el, { + value, + oldValue + }, { + transition + }) { + if (!value === !oldValue) return; + if (transition) { + if (value) { + transition.beforeEnter(el); + setDisplay(el, true); + transition.enter(el); + } else { + transition.leave(el, () => { + setDisplay(el, false); + }); + } + } else { + setDisplay(el, value); + } + }, + beforeUnmount(el, { + value + }) { + setDisplay(el, value); + } +}; +if (false) {} +function setDisplay(el, value) { + el.style.display = value ? el[vShowOriginalDisplay] : "none"; + el[vShowHidden] = !value; +} +function initVShowForSSR() { + vShow.getSSRProps = ({ + value + }) => { + if (!value) { + return { + style: { + display: "none" + } + }; + } + }; +} +const CSS_VAR_TEXT = Symbol( false ? 0 : ""); +function useCssVars(getter) { + const instance = getCurrentInstance(); + if (!instance) { + false && 0; + return; + } + const updateTeleports = instance.ut = (vars = getter(instance.proxy)) => { + Array.from(document.querySelectorAll(`[data-v-owner="${instance.uid}"]`)).forEach(node => setVarsOnNode(node, vars)); + }; + if (false) {} + const setVars = () => { + const vars = getter(instance.proxy); + if (instance.ce) { + setVarsOnNode(instance.ce, vars); + } else { + setVarsOnVNode(instance.subTree, vars); + } + updateTeleports(vars); + }; + onBeforeUpdate(() => { + queuePostFlushCb(setVars); + }); + onMounted(() => { + watch(setVars, NOOP, { + flush: "post" + }); + const ob = new MutationObserver(setVars); + ob.observe(instance.subTree.el.parentNode, { + childList: true + }); + onUnmounted(() => ob.disconnect()); + }); +} +function setVarsOnVNode(vnode, vars) { + if (vnode.shapeFlag & 128) { + const suspense = vnode.suspense; + vnode = suspense.activeBranch; + if (suspense.pendingBranch && !suspense.isHydrating) { + suspense.effects.push(() => { + setVarsOnVNode(suspense.activeBranch, vars); + }); + } + } + while (vnode.component) { + vnode = vnode.component.subTree; + } + if (vnode.shapeFlag & 1 && vnode.el) { + setVarsOnNode(vnode.el, vars); + } else if (vnode.type === Fragment) { + vnode.children.forEach(c => setVarsOnVNode(c, vars)); + } else if (vnode.type === Static) { + let { + el, + anchor + } = vnode; + while (el) { + setVarsOnNode(el, vars); + if (el === anchor) break; + el = el.nextSibling; + } + } +} +function setVarsOnNode(el, vars) { + if (el.nodeType === 1) { + const style = el.style; + let cssText = ""; + for (const key in vars) { + style.setProperty(`--${key}`, vars[key]); + cssText += `--${key}: ${vars[key]};`; + } + style[CSS_VAR_TEXT] = cssText; + } +} +const displayRE = /(^|;)\s*display\s*:/; +function patchStyle(el, prev, next) { + const style = el.style; + const isCssString = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isString */ .Kg)(next); + let hasControlledDisplay = false; + if (next && !isCssString) { + if (prev) { + if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isString */ .Kg)(prev)) { + for (const key in prev) { + if (next[key] == null) { + setStyle(style, key, ""); + } + } + } else { + for (const prevStyle of prev.split(";")) { + const key = prevStyle.slice(0, prevStyle.indexOf(":")).trim(); + if (next[key] == null) { + setStyle(style, key, ""); + } + } + } + } + for (const key in next) { + if (key === "display") { + hasControlledDisplay = true; + } + setStyle(style, key, next[key]); + } + } else { + if (isCssString) { + if (prev !== next) { + const cssVarText = style[CSS_VAR_TEXT]; + if (cssVarText) { + next += ";" + cssVarText; + } + style.cssText = next; + hasControlledDisplay = displayRE.test(next); + } + } else if (prev) { + el.removeAttribute("style"); + } + } + if (vShowOriginalDisplay in el) { + el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : ""; + if (el[vShowHidden]) { + style.display = "none"; + } + } +} +const semicolonRE = /[^\\];\s*$/; +const importantRE = /\s*!important$/; +function setStyle(style, name, val) { + if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isArray */ .cy)(val)) { + val.forEach(v => setStyle(style, name, v)); + } else { + if (val == null) val = ""; + if (false) {} + if (name.startsWith("--")) { + style.setProperty(name, val); + } else { + const prefixed = autoPrefix(style, name); + if (importantRE.test(val)) { + style.setProperty((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .hyphenate */ .Tg)(prefixed), val.replace(importantRE, ""), "important"); + } else { + style[prefixed] = val; + } + } + } +} +const prefixes = ["Webkit", "Moz", "ms"]; +const prefixCache = {}; +function autoPrefix(style, rawName) { + const cached = prefixCache[rawName]; + if (cached) { + return cached; + } + let name = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_15__/* .camelize */ .PT)(rawName); + if (name !== "filter" && name in style) { + return prefixCache[rawName] = name; + } + name = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .capitalize */ .ZH)(name); + for (let i = 0; i < prefixes.length; i++) { + const prefixed = prefixes[i] + name; + if (prefixed in style) { + return prefixCache[rawName] = prefixed; + } + } + return rawName; +} +const xlinkNS = "http://www.w3.org/1999/xlink"; +function patchAttr(el, key, value, isSVG, instance, isBoolean = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isSpecialBooleanAttr */ .J$)(key)) { + if (isSVG && key.startsWith("xlink:")) { + if (value == null) { + el.removeAttributeNS(xlinkNS, key.slice(6, key.length)); + } else { + el.setAttributeNS(xlinkNS, key, value); + } + } else { + if (value == null || isBoolean && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .includeBooleanAttr */ .Y2)(value)) { + el.removeAttribute(key); + } else { + el.setAttribute(key, isBoolean ? "" : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isSymbol */ .Bm)(value) ? String(value) : value); + } + } +} +function patchDOMProp(el, key, value, parentComponent, attrName) { + if (key === "innerHTML" || key === "textContent") { + if (value != null) { + el[key] = key === "innerHTML" ? unsafeToTrustedHTML(value) : value; + } + return; + } + const tag = el.tagName; + if (key === "value" && tag !== "PROGRESS" && + // custom elements may use _value internally + !tag.includes("-")) { + const oldValue = tag === "OPTION" ? el.getAttribute("value") || "" : el.value; + const newValue = value == null ? + // #11647: value should be set as empty string for null and undefined, + // but should be set as 'on'. + el.type === "checkbox" ? "on" : "" : String(value); + if (oldValue !== newValue || !("_value" in el)) { + el.value = newValue; + } + if (value == null) { + el.removeAttribute(key); + } + el._value = value; + return; + } + let needRemove = false; + if (value === "" || value == null) { + const type = typeof el[key]; + if (type === "boolean") { + value = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .includeBooleanAttr */ .Y2)(value); + } else if (value == null && type === "string") { + value = ""; + needRemove = true; + } else if (type === "number") { + value = 0; + needRemove = true; + } + } + try { + el[key] = value; + } catch (e) { + if (false) {} + } + needRemove && el.removeAttribute(attrName || key); +} +function addEventListener(el, event, handler, options) { + el.addEventListener(event, handler, options); +} +function removeEventListener(el, event, handler, options) { + el.removeEventListener(event, handler, options); +} +const veiKey = Symbol("_vei"); +function patchEvent(el, rawName, prevValue, nextValue, instance = null) { + const invokers = el[veiKey] || (el[veiKey] = {}); + const existingInvoker = invokers[rawName]; + if (nextValue && existingInvoker) { + existingInvoker.value = false ? 0 : nextValue; + } else { + const [name, options] = parseName(rawName); + if (nextValue) { + const invoker = invokers[rawName] = createInvoker( false ? 0 : nextValue, instance); + addEventListener(el, name, invoker, options); + } else if (existingInvoker) { + removeEventListener(el, name, existingInvoker, options); + invokers[rawName] = void 0; + } + } +} +const optionsModifierRE = /(?:Once|Passive|Capture)$/; +function parseName(name) { + let options; + if (optionsModifierRE.test(name)) { + options = {}; + let m; + while (m = name.match(optionsModifierRE)) { + name = name.slice(0, name.length - m[0].length); + options[m[0].toLowerCase()] = true; + } + } + const event = name[2] === ":" ? name.slice(3) : (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .hyphenate */ .Tg)(name.slice(2)); + return [event, options]; +} +let cachedNow = 0; +const p = /* @__PURE__ */Promise.resolve(); +const getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now()); +function createInvoker(initialValue, instance) { + const invoker = e => { + if (!e._vts) { + e._vts = Date.now(); + } else if (e._vts <= invoker.attached) { + return; + } + (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .callWithAsyncErrorHandling */ .qL)(patchStopImmediatePropagation(e, invoker.value), instance, 5, [e]); + }; + invoker.value = initialValue; + invoker.attached = getNow(); + return invoker; +} +function sanitizeEventValue(value, propName) { + if (isFunction(value) || isArray(value)) { + return value; + } + warn(`Wrong type passed as event handler to ${propName} - did you forget @ or : in front of your prop? +Expected function or array of functions, received type ${typeof value}.`); + return NOOP; +} +function patchStopImmediatePropagation(e, value) { + if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isArray */ .cy)(value)) { + const originalStop = e.stopImmediatePropagation; + e.stopImmediatePropagation = () => { + originalStop.call(e); + e._stopped = true; + }; + return value.map(fn => e2 => !e2._stopped && fn && fn(e2)); + } else { + return value; + } +} +const isNativeOn = key => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && +// lowercase letter +key.charCodeAt(2) > 96 && key.charCodeAt(2) < 123; +const patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => { + const isSVG = namespace === "svg"; + if (key === "class") { + patchClass(el, nextValue, isSVG); + } else if (key === "style") { + patchStyle(el, prevValue, nextValue); + } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isOn */ .Mp)(key)) { + if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isModelListener */ .CP)(key)) { + patchEvent(el, key, prevValue, nextValue, parentComponent); + } + } else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) { + patchDOMProp(el, key, nextValue); + if (!el.tagName.includes("-") && (key === "value" || key === "checked" || key === "selected")) { + patchAttr(el, key, nextValue, isSVG, parentComponent, key !== "value"); + } + } else if ( + // #11081 force set props for possible async custom element + el._isVueCE && (/[A-Z]/.test(key) || !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isString */ .Kg)(nextValue))) { + patchDOMProp(el, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .camelize */ .PT)(key), nextValue, parentComponent, key); + } else { + if (key === "true-value") { + el._trueValue = nextValue; + } else if (key === "false-value") { + el._falseValue = nextValue; + } + patchAttr(el, key, nextValue, isSVG); + } +}; +function shouldSetAsProp(el, key, value, isSVG) { + if (isSVG) { + if (key === "innerHTML" || key === "textContent") { + return true; + } + if (key in el && isNativeOn(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isFunction */ .Tn)(value)) { + return true; + } + return false; + } + if (key === "spellcheck" || key === "draggable" || key === "translate") { + return false; + } + if (key === "form") { + return false; + } + if (key === "list" && el.tagName === "INPUT") { + return false; + } + if (key === "type" && el.tagName === "TEXTAREA") { + return false; + } + if (key === "width" || key === "height") { + const tag = el.tagName; + if (tag === "IMG" || tag === "VIDEO" || tag === "CANVAS" || tag === "SOURCE") { + return false; + } + } + if (isNativeOn(key) && (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isString */ .Kg)(value)) { + return false; + } + return key in el; +} +const REMOVAL = {}; +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function defineCustomElement(options, extraOptions, _createApp) { + const Comp = defineComponent(options, extraOptions); + if (isPlainObject(Comp)) extend(Comp, extraOptions); + class VueCustomElement extends VueElement { + constructor(initialProps) { + super(Comp, initialProps, _createApp); + } + } + VueCustomElement.def = Comp; + return VueCustomElement; +} +/*! #__NO_SIDE_EFFECTS__ */ +const defineSSRCustomElement = /* @__NO_SIDE_EFFECTS__ */(options, extraOptions) => { + return /* @__PURE__ */defineCustomElement(options, extraOptions, createSSRApp); +}; +const BaseClass = typeof HTMLElement !== "undefined" ? HTMLElement : class {}; +class VueElement extends BaseClass { + constructor(_def, _props = {}, _createApp = createApp) { + super(); + this._def = _def; + this._props = _props; + this._createApp = _createApp; + this._isVueCE = true; + /** + * @internal + */ + this._instance = null; + /** + * @internal + */ + this._app = null; + /** + * @internal + */ + this._nonce = this._def.nonce; + this._connected = false; + this._resolved = false; + this._numberProps = null; + this._styleChildren = /* @__PURE__ */new WeakSet(); + this._ob = null; + if (this.shadowRoot && _createApp !== createApp) { + this._root = this.shadowRoot; + } else { + if (false) {} + if (_def.shadowRoot !== false) { + this.attachShadow({ + mode: "open" + }); + this._root = this.shadowRoot; + } else { + this._root = this; + } + } + if (!this._def.__asyncLoader) { + this._resolveProps(this._def); + } + } + connectedCallback() { + if (!this.isConnected) return; + if (!this.shadowRoot) { + this._parseSlots(); + } + this._connected = true; + let parent = this; + while (parent = parent && (parent.parentNode || parent.host)) { + if (parent instanceof VueElement) { + this._parent = parent; + break; + } + } + if (!this._instance) { + if (this._resolved) { + this._setParent(); + this._update(); + } else { + if (parent && parent._pendingResolve) { + this._pendingResolve = parent._pendingResolve.then(() => { + this._pendingResolve = void 0; + this._resolveDef(); + }); + } else { + this._resolveDef(); + } + } + } + } + _setParent(parent = this._parent) { + if (parent) { + this._instance.parent = parent._instance; + this._instance.provides = parent._instance.provides; + } + } + disconnectedCallback() { + this._connected = false; + (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .nextTick */ .dY)(() => { + if (!this._connected) { + if (this._ob) { + this._ob.disconnect(); + this._ob = null; + } + this._app && this._app.unmount(); + if (this._instance) this._instance.ce = void 0; + this._app = this._instance = null; + } + }); + } + /** + * resolve inner component definition (handle possible async component) + */ + _resolveDef() { + if (this._pendingResolve) { + return; + } + for (let i = 0; i < this.attributes.length; i++) { + this._setAttr(this.attributes[i].name); + } + this._ob = new MutationObserver(mutations => { + for (const m of mutations) { + this._setAttr(m.attributeName); + } + }); + this._ob.observe(this, { + attributes: true + }); + const resolve = (def, isAsync = false) => { + this._resolved = true; + this._pendingResolve = void 0; + const { + props, + styles + } = def; + let numberProps; + if (props && !(0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isArray */ .cy)(props)) { + for (const key in props) { + const opt = props[key]; + if (opt === Number || opt && opt.type === Number) { + if (key in this._props) { + this._props[key] = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .toNumber */ .Ro)(this._props[key]); + } + (numberProps || (numberProps = /* @__PURE__ */Object.create(null)))[(0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .camelize */ .PT)(key)] = true; + } + } + } + this._numberProps = numberProps; + if (isAsync) { + this._resolveProps(def); + } + if (this.shadowRoot) { + this._applyStyles(styles); + } else if (false) {} + this._mount(def); + }; + const asyncDef = this._def.__asyncLoader; + if (asyncDef) { + this._pendingResolve = asyncDef().then(def => resolve(this._def = def, true)); + } else { + resolve(this._def); + } + } + _mount(def) { + if (false) {} + this._app = this._createApp(def); + if (def.configureApp) { + def.configureApp(this._app); + } + this._app._ceVNode = this._createVNode(); + this._app.mount(this._root); + const exposed = this._instance && this._instance.exposed; + if (!exposed) return; + for (const key in exposed) { + if (!(0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .hasOwn */ .$3)(this, key)) { + Object.defineProperty(this, key, { + // unwrap ref to be consistent with public instance behavior + get: () => (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_16__/* .unref */ .R1)(exposed[key]) + }); + } else if (false) {} + } + } + _resolveProps(def) { + const { + props + } = def; + const declaredPropKeys = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isArray */ .cy)(props) ? props : Object.keys(props || {}); + for (const key of Object.keys(this)) { + if (key[0] !== "_" && declaredPropKeys.includes(key)) { + this._setProp(key, this[key]); + } + } + for (const key of declaredPropKeys.map(_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .camelize */ .PT)) { + Object.defineProperty(this, key, { + get() { + return this._getProp(key); + }, + set(val) { + this._setProp(key, val, true, true); + } + }); + } + } + _setAttr(key) { + if (key.startsWith("data-v-")) return; + const has = this.hasAttribute(key); + let value = has ? this.getAttribute(key) : REMOVAL; + const camelKey = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .camelize */ .PT)(key); + if (has && this._numberProps && this._numberProps[camelKey]) { + value = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .toNumber */ .Ro)(value); + } + this._setProp(camelKey, value, false, true); + } + /** + * @internal + */ + _getProp(key) { + return this._props[key]; + } + /** + * @internal + */ + _setProp(key, val, shouldReflect = true, shouldUpdate = false) { + if (val !== this._props[key]) { + if (val === REMOVAL) { + delete this._props[key]; + } else { + this._props[key] = val; + if (key === "key" && this._app) { + this._app._ceVNode.key = val; + } + } + if (shouldUpdate && this._instance) { + this._update(); + } + if (shouldReflect) { + const ob = this._ob; + ob && ob.disconnect(); + if (val === true) { + this.setAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .hyphenate */ .Tg)(key), ""); + } else if (typeof val === "string" || typeof val === "number") { + this.setAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .hyphenate */ .Tg)(key), val + ""); + } else if (!val) { + this.removeAttribute((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .hyphenate */ .Tg)(key)); + } + ob && ob.observe(this, { + attributes: true + }); + } + } + } + _update() { + render(this._createVNode(), this._root); + } + _createVNode() { + const baseProps = {}; + if (!this.shadowRoot) { + baseProps.onVnodeMounted = baseProps.onVnodeUpdated = this._renderSlots.bind(this); + } + const vnode = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .createVNode */ .bF)(this._def, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .extend */ .X$)(baseProps, this._props)); + if (!this._instance) { + vnode.ce = instance => { + this._instance = instance; + instance.ce = this; + instance.isCE = true; + if (false) {} + const dispatch = (event, args) => { + this.dispatchEvent(new CustomEvent(event, (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isPlainObject */ .Qd)(args[0]) ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .extend */ .X$)({ + detail: args + }, args[0]) : { + detail: args + })); + }; + instance.emit = (event, ...args) => { + dispatch(event, args); + if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .hyphenate */ .Tg)(event) !== event) { + dispatch((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .hyphenate */ .Tg)(event), args); + } + }; + this._setParent(); + }; + } + return vnode; + } + _applyStyles(styles, owner) { + if (!styles) return; + if (owner) { + if (owner === this._def || this._styleChildren.has(owner)) { + return; + } + this._styleChildren.add(owner); + } + const nonce = this._nonce; + for (let i = styles.length - 1; i >= 0; i--) { + const s = document.createElement("style"); + if (nonce) s.setAttribute("nonce", nonce); + s.textContent = styles[i]; + this.shadowRoot.prepend(s); + if (false) {} + } + } + /** + * Only called when shadowRoot is false + */ + _parseSlots() { + const slots = this._slots = {}; + let n; + while (n = this.firstChild) { + const slotName = n.nodeType === 1 && n.getAttribute("slot") || "default"; + (slots[slotName] || (slots[slotName] = [])).push(n); + this.removeChild(n); + } + } + /** + * Only called when shadowRoot is false + */ + _renderSlots() { + const outlets = (this._teleportTarget || this).querySelectorAll("slot"); + const scopeId = this._instance.type.__scopeId; + for (let i = 0; i < outlets.length; i++) { + const o = outlets[i]; + const slotName = o.getAttribute("name") || "default"; + const content = this._slots[slotName]; + const parent = o.parentNode; + if (content) { + for (const n of content) { + if (scopeId && n.nodeType === 1) { + const id = scopeId + "-s"; + const walker = document.createTreeWalker(n, 1); + n.setAttribute(id, ""); + let child; + while (child = walker.nextNode()) { + child.setAttribute(id, ""); + } + } + parent.insertBefore(n, o); + } + } else { + while (o.firstChild) parent.insertBefore(o.firstChild, o); + } + parent.removeChild(o); + } + } + /** + * @internal + */ + _injectChildStyle(comp) { + this._applyStyles(comp.styles, comp); + } + /** + * @internal + */ + _removeChildStyle(comp) { + if (false) {} + } +} +function useHost(caller) { + const instance = getCurrentInstance(); + const el = instance && instance.ce; + if (el) { + return el; + } else if (false) {} + return null; +} +function useShadowRoot() { + const el = false ? 0 : useHost(); + return el && el.shadowRoot; +} +function useCssModule(name = "$style") { + { + const instance = getCurrentInstance(); + if (!instance) { + false && 0; + return EMPTY_OBJ; + } + const modules = instance.type.__cssModules; + if (!modules) { + false && 0; + return EMPTY_OBJ; + } + const mod = modules[name]; + if (!mod) { + false && 0; + return EMPTY_OBJ; + } + return mod; + } +} +const positionMap = /* @__PURE__ */new WeakMap(); +const newPositionMap = /* @__PURE__ */new WeakMap(); +const moveCbKey = Symbol("_moveCb"); +const enterCbKey = Symbol("_enterCb"); +const decorate = t => { + delete t.props.mode; + return t; +}; +const TransitionGroupImpl = /* @__PURE__ */decorate({ + name: "TransitionGroup", + props: /* @__PURE__ */(0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .extend */ .X$)({}, TransitionPropsValidators, { + tag: String, + moveClass: String + }), + setup(props, { + slots + }) { + const instance = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .getCurrentInstance */ .nI)(); + const state = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .useTransitionState */ .Gy)(); + let prevChildren; + let children; + (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .onUpdated */ .$u)(() => { + if (!prevChildren.length) { + return; + } + const moveClass = props.moveClass || `${props.name || "v"}-move`; + if (!hasCSSTransform(prevChildren[0].el, instance.vnode.el, moveClass)) { + return; + } + prevChildren.forEach(callPendingCbs); + prevChildren.forEach(recordPosition); + const movedChildren = prevChildren.filter(applyTranslation); + forceReflow(); + movedChildren.forEach(c => { + const el = c.el; + const style = el.style; + addTransitionClass(el, moveClass); + style.transform = style.webkitTransform = style.transitionDuration = ""; + const cb = el[moveCbKey] = e => { + if (e && e.target !== el) { + return; + } + if (!e || /transform$/.test(e.propertyName)) { + el.removeEventListener("transitionend", cb); + el[moveCbKey] = null; + removeTransitionClass(el, moveClass); + } + }; + el.addEventListener("transitionend", cb); + }); + }); + return () => { + const rawProps = (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_16__/* .toRaw */ .ux)(props); + const cssTransitionProps = resolveTransitionProps(rawProps); + let tag = rawProps.tag || _vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .Fragment */ .FK; + prevChildren = []; + if (children) { + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child.el && child.el instanceof Element) { + prevChildren.push(child); + (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .setTransitionHooks */ .MZ)(child, (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .resolveTransitionHooks */ .OW)(child, cssTransitionProps, state, instance)); + positionMap.set(child, child.el.getBoundingClientRect()); + } + } + } + children = slots.default ? (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .getTransitionRawChildren */ .Df)(slots.default()) : []; + for (let i = 0; i < children.length; i++) { + const child = children[i]; + if (child.key != null) { + (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .setTransitionHooks */ .MZ)(child, (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .resolveTransitionHooks */ .OW)(child, cssTransitionProps, state, instance)); + } else if (false) {} + } + return (0,_vue_runtime_core__WEBPACK_IMPORTED_MODULE_14__/* .createVNode */ .bF)(tag, null, children); + }; + } +}); +const TransitionGroup = (/* unused pure expression or super */ null && (TransitionGroupImpl)); +function callPendingCbs(c) { + const el = c.el; + if (el[moveCbKey]) { + el[moveCbKey](); + } + if (el[enterCbKey]) { + el[enterCbKey](); + } +} +function recordPosition(c) { + newPositionMap.set(c, c.el.getBoundingClientRect()); +} +function applyTranslation(c) { + const oldPos = positionMap.get(c); + const newPos = newPositionMap.get(c); + const dx = oldPos.left - newPos.left; + const dy = oldPos.top - newPos.top; + if (dx || dy) { + const s = c.el.style; + s.transform = s.webkitTransform = `translate(${dx}px,${dy}px)`; + s.transitionDuration = "0s"; + return c; + } +} +function hasCSSTransform(el, root, moveClass) { + const clone = el.cloneNode(); + const _vtc = el[vtcKey]; + if (_vtc) { + _vtc.forEach(cls => { + cls.split(/\s+/).forEach(c => c && clone.classList.remove(c)); + }); + } + moveClass.split(/\s+/).forEach(c => c && clone.classList.add(c)); + clone.style.display = "none"; + const container = root.nodeType === 1 ? root : root.parentNode; + container.appendChild(clone); + const { + hasTransform + } = getTransitionInfo(clone); + container.removeChild(clone); + return hasTransform; +} +const getModelAssigner = vnode => { + const fn = vnode.props["onUpdate:modelValue"] || false; + return (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isArray */ .cy)(fn) ? value => (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .invokeArrayFns */ .DY)(fn, value) : fn; +}; +function onCompositionStart(e) { + e.target.composing = true; +} +function onCompositionEnd(e) { + const target = e.target; + if (target.composing) { + target.composing = false; + target.dispatchEvent(new Event("input")); + } +} +const assignKey = Symbol("_assign"); +const vModelText = { + created(el, { + modifiers: { + lazy, + trim, + number + } + }, vnode) { + el[assignKey] = getModelAssigner(vnode); + const castToNumber = number || vnode.props && vnode.props.type === "number"; + addEventListener(el, lazy ? "change" : "input", e => { + if (e.target.composing) return; + let domValue = el.value; + if (trim) { + domValue = domValue.trim(); + } + if (castToNumber) { + domValue = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .looseToNumber */ .bB)(domValue); + } + el[assignKey](domValue); + }); + if (trim) { + addEventListener(el, "change", () => { + el.value = el.value.trim(); + }); + } + if (!lazy) { + addEventListener(el, "compositionstart", onCompositionStart); + addEventListener(el, "compositionend", onCompositionEnd); + addEventListener(el, "change", onCompositionEnd); + } + }, + // set value on mounted so it's after min/max for type="range" + mounted(el, { + value + }) { + el.value = value == null ? "" : value; + }, + beforeUpdate(el, { + value, + oldValue, + modifiers: { + lazy, + trim, + number + } + }, vnode) { + el[assignKey] = getModelAssigner(vnode); + if (el.composing) return; + const elValue = (number || el.type === "number") && !/^0\d/.test(el.value) ? (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .looseToNumber */ .bB)(el.value) : el.value; + const newValue = value == null ? "" : value; + if (elValue === newValue) { + return; + } + if (document.activeElement === el && el.type !== "range") { + if (lazy && value === oldValue) { + return; + } + if (trim && el.value.trim() === newValue) { + return; + } + } + el.value = newValue; + } +}; +const vModelCheckbox = { + // #4096 array checkboxes need to be deep traversed + deep: true, + created(el, _, vnode) { + el[assignKey] = getModelAssigner(vnode); + addEventListener(el, "change", () => { + const modelValue = el._modelValue; + const elementValue = getValue(el); + const checked = el.checked; + const assign = el[assignKey]; + if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isArray */ .cy)(modelValue)) { + const index = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .looseIndexOf */ .u3)(modelValue, elementValue); + const found = index !== -1; + if (checked && !found) { + assign(modelValue.concat(elementValue)); + } else if (!checked && found) { + const filtered = [...modelValue]; + filtered.splice(index, 1); + assign(filtered); + } + } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isSet */ .vM)(modelValue)) { + const cloned = new Set(modelValue); + if (checked) { + cloned.add(elementValue); + } else { + cloned.delete(elementValue); + } + assign(cloned); + } else { + assign(getCheckboxValue(el, checked)); + } + }); + }, + // set initial checked on mount to wait for true-value/false-value + mounted: setChecked, + beforeUpdate(el, binding, vnode) { + el[assignKey] = getModelAssigner(vnode); + setChecked(el, binding, vnode); + } +}; +function setChecked(el, { + value, + oldValue +}, vnode) { + el._modelValue = value; + let checked; + if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isArray */ .cy)(value)) { + checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .looseIndexOf */ .u3)(value, vnode.props.value) > -1; + } else if ((0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .isSet */ .vM)(value)) { + checked = value.has(vnode.props.value); + } else { + if (value === oldValue) return; + checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .looseEqual */ .BX)(value, getCheckboxValue(el, true)); + } + if (el.checked !== checked) { + el.checked = checked; + } +} +const vModelRadio = { + created(el, { + value + }, vnode) { + el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .looseEqual */ .BX)(value, vnode.props.value); + el[assignKey] = getModelAssigner(vnode); + addEventListener(el, "change", () => { + el[assignKey](getValue(el)); + }); + }, + beforeUpdate(el, { + value, + oldValue + }, vnode) { + el[assignKey] = getModelAssigner(vnode); + if (value !== oldValue) { + el.checked = (0,_vue_shared__WEBPACK_IMPORTED_MODULE_13__/* .looseEqual */ .BX)(value, vnode.props.value); + } + } +}; +const vModelSelect = { + // relies on its children + //