diff --git a/.gitea/workflows/android-build.yml b/.gitea/workflows/android-build.yml
index 459c8ed..72cb31e 100644
--- a/.gitea/workflows/android-build.yml
+++ b/.gitea/workflows/android-build.yml
@@ -30,6 +30,11 @@ jobs:
node-version: 22
cache: 'npm'
+ # 版本号一致性: package.json / tauri.conf.json / Cargo.toml / Cargo.lock 必须完全相等。
+ # tauri.conf.json 的 version 就是 APK 的 versionName, 漏改会打出一个版本号错误的安装包。
+ - name: Check version consistency
+ run: node scripts/ci/check-version.mjs
+
- name: Setup JDK 17
uses: https://gitea.com/actions/setup-java@v4
with:
diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml
index 06cef12..c40afb3 100644
--- a/.gitea/workflows/docker-build.yml
+++ b/.gitea/workflows/docker-build.yml
@@ -1,12 +1,21 @@
name: Docker Build and Push
-# 仅 main 分支 push 触发, 其他分支不触发
-# 每次主分支提交: 构建前端 + 生成 OTA 升级包 (签名) → 打进 Docker 镜像 → 部署
+# 仅主分支 (master) push 触发部署; 其他分支一律不触发 (见 readme「分支规则」)
+# 每次提交: 构建前端 + 生成 OTA 升级包 (签名) → 打进 Docker 镜像 → 自动升级数据库 → 部署
# OTA 随镜像发布: 容器内 OTA_PACKAGE_DIR=/app/ota-package 指向打包的 ota-package/
+#
+# 分支策略 (2026-10 调整):
+# - master = 主分支, 唯一部署出口, push 即发布生产 (容器 iboard, 宿主 3001)
+# - dev-* = 开发集成分支, 只做 CI 校验 (构建/版本一致性), **不再自动部署**;
+# 要上线必须先合并到 master 再推 master
+# - tmp-* = 单个问题的临时分支, 合到 dev-* 后删除
+# - android-*= 只用于触发 APK 外壳构建, 不部署; 改动前须与 master 同步
+#
+# 历史: 之前 dev-* 与 master 共用同一套生产环境 (推送即发布), 容易把半成品带上线,
+# 现已取消 dev-* 的 push 触发。
on:
push:
branches:
- - main
- master
jobs:
@@ -17,6 +26,11 @@ jobs:
# 其他 VITE_API_BASE 值。否则 OTA 包里的前端可能连错后端, 导致
# "OTA 更新后登录失败/进不去内部"。与 android-build.yml 保持一致。
VITE_API_BASE: http://bh.vps.honor3.com:3001
+ # OTA bundle 要求的最低原生二进制版本。
+ # 与 package.json 的应用版本是**两个概念**: 前端 OTA 不碰原生层,
+ # 现有 APK 仍是 0.1.0, 所以这里固定 0.1.0 (否则旧 APK 会被判定为不兼容而收不到更新)。
+ # 重打 APK 并确认原生层无破坏后, 再提升此值。
+ OTA_MIN_BINARY: '0.1.0'
steps:
- uses: https://gitea.com/actions/checkout@v4
@@ -25,6 +39,16 @@ jobs:
with:
node-version: 22
+ - name: Check version consistency & branch
+ # 1) package.json / tauri.conf.json / Cargo.toml / Cargo.lock 四处版本必须完全相等且不带 -ota
+ # (tauri.conf.json 的 version 就是 APK 的 versionName)
+ # 2) 防止 OTA 版本号与分支错位: OTA 包的 version 直接取自 package.json,
+ # dev-0.2 分支上必须是 0.2.x, 否则线上 OTA 会报成上一个版本的号
+ # (master 分支跳过分支前缀校验, 但四处一致性照样强制)
+ env:
+ GITHUB_REF_NAME: ${{ github.ref_name }}
+ run: node scripts/ci/check-version.mjs
+
- name: Install deps
run: npm ci --no-audit --no-fund
@@ -43,7 +67,7 @@ jobs:
OTA_NOTES: ${{ github.sha }}
run: |
set -euo pipefail
- node scripts/build-ota.mjs --out ota-package --notes ${OTA_NOTES}
+ node scripts/build-ota.mjs --out ota-package --notes ${OTA_NOTES} --min-binary ${OTA_MIN_BINARY}
echo "===== latest.json ====="
cat ota-package/latest.json
echo "===== bundle sha256 ====="
@@ -57,10 +81,16 @@ jobs:
run: docker images
- name: Apply DB migrations
- # 仓库内的 prisma 迁移自动应用 (migrate deploy 幂等, 无新迁移时为 no-op)
+ # 数据库自动升级: 按 prisma/migrations/ 下的迁移顺序应用 (生产库由 master 部署时统一升级)
+ # migrate deploy 幂等, 无新迁移时为 no-op
+ # 位置关键: 在 "Remove old container" 之前 —— 建表/改表成功后才切换流量,
+ # 迁移失败则整个 workflow 中断, 不会用新镜像顶掉仍在运行的旧容器
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
- run: npx prisma migrate deploy
+ run: |
+ set -euo pipefail
+ npx prisma migrate status || true
+ npx prisma migrate deploy
- name: Remove old container
run: docker rm -vf iboard || true
diff --git a/.gitea/workflows/ota-build.yml b/.gitea/workflows/ota-build.yml
index d293808..40538a0 100644
--- a/.gitea/workflows/ota-build.yml
+++ b/.gitea/workflows/ota-build.yml
@@ -21,10 +21,10 @@ on:
type: string
default: ''
min_binary:
- description: '最低 binary 版本 (留空用 src-tauri/tauri.conf.json 的 version)'
+ description: '最低 binary 版本 (默认 0.1.0 = 现有 APK 的原生版本, 与前端应用版本无关)'
required: false
type: string
- default: ''
+ default: '0.1.0'
jobs:
build-ota:
@@ -56,7 +56,7 @@ jobs:
set -euo pipefail
OUT="ota-package"
ARGS="--out ${OUT}"
- # inputs 留空时 → 不传 --sequence/--min-binary, 脚本默认 sequence=时间戳, min-binary=tauri.conf version
+ # sequence 留空 → 脚本默认用时间戳; min_binary 默认 0.1.0 (与前端版本解耦)
if [ -n "${{ inputs.sequence }}" ]; then ARGS="${ARGS} --sequence ${{ inputs.sequence }}"; fi
if [ -n "${OTA_NOTES}" ]; then ARGS="${ARGS} --notes ${OTA_NOTES}"; fi
if [ -n "${{ inputs.min_binary }}" ]; then ARGS="${ARGS} --min-binary ${{ inputs.min_binary }}"; fi
diff --git a/.gitignore b/.gitignore
index 9edb0b1..9123757 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,47 +1,49 @@
-# dependencies
-/node_modules
-/.pnp
-.pnp.js
-
-# testing
-/coverage
-
-# production
-/build
-/out
-/.next
-
-# misc
-.DS_Store
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
-
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-
-# Editor directories and files
-.idea
-.vscode
-*.swp
-*.swo
-*~
-dist/*
-
-# local env (contains API keys)
-/.env
-.reasonix/*
-# OTA 升级: 产物 (运行时生成, 部署时单独管理) + 私钥 (绝不能提交)
-ota-package/*
-!ota-package/README.md
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
-# apizero 文件缓存 (运行时按需生成)
-cache/apizero/
-# Dockerfile 持久卷挂载点 (跟 ota-package 同类)
-.cache/
-# 米家凭证缓存 (含 token, 绝不能提交)
+# testing
+/coverage
+
+# production
+/build
+/out
+/.next
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.swp
+*.swo
+*~
+dist/*
+
+# local env (contains API keys)
+/.env
+.reasonix/*
+# OTA 升级: 产物 (运行时生成, 部署时单独管理) + 私钥 (绝不能提交)
+ota-package/*
+!ota-package/README.md
+
+# apizero 文件缓存 (运行时按需生成)
+cache/apizero/
+# Dockerfile 持久卷挂载点 (跟 ota-package 同类)
+.cache/
+# 米家凭证缓存 (含 token, 绝不能提交)
server/mihome/.cache/
+# 工作区记忆/会话数据 (本地私有, 不入库)
+.workbuddy/
diff --git a/docs/环境监控模块设计.md b/docs/V0.1/环境监控模块设计.md
similarity index 100%
rename from docs/环境监控模块设计.md
rename to docs/V0.1/环境监控模块设计.md
diff --git a/docs/V0.2/数据库设计文档.md b/docs/V0.2/数据库设计文档.md
new file mode 100644
index 0000000..003a9d4
--- /dev/null
+++ b/docs/V0.2/数据库设计文档.md
@@ -0,0 +1,325 @@
+# iBoard V0.2 数据库设计文档
+
+| 项 | 内容 |
+| --- | --- |
+| 版本 | V0.2 |
+| 文档状态 | 已实现(与代码一致) |
+| 数据库 | MariaDB / MySQL 8(Prisma `provider = "mysql"`) |
+| 字符集 | `utf8mb4 / utf8mb4_unicode_ci` |
+| 时区约定 | 应用层统一 `Asia/Shanghai`,库内 `DATETIME` 存 UTC |
+| 相关文件 | `prisma/schema.prisma`、`prisma/migrations/20261022120000_add_checkin_checklist/migration.sql` |
+| 关联文档 | `需求文档.md`、`设计文档.md`、`界面设计.html` |
+
+---
+
+## 1. 概述
+
+V0.2 新增「打卡 / 日历 / 清单」三个功能域,共引入 **5 张表**:
+
+| 表 | 作用 | 归属域 |
+| --- | --- | --- |
+| `Habit` | 打卡项(每天/每周/每月/每年 n 次的目标定义) | 打卡 |
+| `CheckIn` | 打卡记录(一次打卡 = 一条) | 打卡 |
+| `CheckList` | 检查清单(出差/回老家等场景的一次性清单) | 清单 |
+| `CheckListItem` | 检查项(勾选即完成) | 清单 |
+| `CheckListTemplate` | 清单模板(系统预置 + 用户自定义) | 清单 |
+
+日历视图**不新增表**:完全由 `Habit` + `CheckIn` 按月聚合得出(见 §7.3)。
+
+### 1.1 设计原则
+
+1. **记录为真,进度不落库。** 环形进度、完成率、streak 一律由 `CheckIn` 现场聚合,不在 `Habit` 上冗余 `doneCount` 字段——避免并发计数不一致、以及用户中途把「每周 3 次」改成「每周 5 次」后需要回填历史的问题。
+2. **日期以本地日历日字符串存储。** `CheckIn.date` 用 `VARCHAR(10)` 存 `"YYYY-MM-DD"`(Asia/Shanghai 下的日历日),而不是 `DATETIME`:范围查询走索引、字典序等于时间序、天然幂等边界,且彻底规避「UTC 存 + 本地读」导致的跨零点归属错误。
+3. **软删除优先。** 打卡项删除默认走 `archived` 归档(保留历史统计),只有显式 `?hard=1` 才物理删除。
+4. **一切按 `userId` 隔离。** 所有业务表都带 `userId`,`Habit`/`CheckIn`/`CheckList`/`CheckListTemplate` 外键 `ON DELETE CASCADE` 到 `User`。
+5. **迁移只增不改。** 新增需求一律新迁移文件,不修改已执行的迁移(部署走 `prisma migrate deploy`)。
+
+---
+
+## 2. 概念模型(ER)
+
+```
+ ┌──────────┐
+ │ User │ (既有表, 本次仅新增反向关系)
+ └────┬─────┘
+ ┌───────────────┼────────────────────┬─────────────────┐
+ │ │ │ │
+ ┌────▼────┐ ┌────▼────┐ ┌─────▼─────┐ ┌──────▼──────┐
+ │ Habit │1───*│ CheckIn │ │ CheckList │1─* │CheckListItem│
+ └─────────┘ └─────────┘ └───────────┘ └─────────────┘
+ 打卡项 打卡记录 场景清单 检查项
+ (周期+目标n) (habitId,date,seq) (done, doneAt)
+ ▲
+ │ 生成(复制条目, 不建外键)
+ ┌─────┴──────────┐
+ │CheckListTemplate│
+ │ (builtin/自定义) │
+ └────────────────┘
+```
+
+基数说明:
+
+| 关系 | 基数 | 级联 |
+| --- | --- | --- |
+| User → Habit | 1 : N | Cascade |
+| User → CheckIn | 1 : N | Cascade |
+| Habit → CheckIn | 1 : N | Cascade |
+| User → CheckList | 1 : N | Cascade |
+| CheckList → CheckListItem | 1 : N | Cascade |
+| User → CheckListTemplate | 1 : N(可空,系统预置为空) | Cascade |
+| CheckListTemplate → CheckList | 无外键,创建时**复制**条目内容 | — |
+
+---
+
+## 3. 表结构
+
+### 3.1 `Habit` — 打卡项
+
+周期目标的**定义**表,不含任何计数。
+
+| 字段 | 类型 | 空 | 默认 | 说明 |
+| --- | --- | --- | --- | --- |
+| `id` | INT PK | 否 | AUTO_INCREMENT | 主键 |
+| `userId` | INT FK | 否 | — | 所属用户 |
+| `name` | VARCHAR(191) | 否 | — | 名称,接口校验 1~20 字 |
+| `period` | VARCHAR(191) | 否 | `'day'` | `day` \| `week` \| `month` \| `year` |
+| `target` | INT | 否 | `1` | 周期内目标次数 n(校验 ≥1) |
+| `color` | VARCHAR(191) | 否 | `'#1677ff'` | 环形与标记主色(7 色预设之一) |
+| `icon` | VARCHAR(191) | 否 | `''` | emoji / 图标名,**V0.2 预留不展示** |
+| `note` | VARCHAR(191) | 否 | `''` | 备注 |
+| `archived` | BOOLEAN | 否 | `false` | 归档后不出现在待办,历史保留 |
+| `sortOrder` | INT | 否 | `0` | 排序权重(升序) |
+| `createdAt` | DATETIME(3) | 否 | now() | 用于「创建之前的日期不计入月历期望」 |
+| `updatedAt` | DATETIME(3) | 否 | 自动 | — |
+
+索引:`INDEX(userId, archived, sortOrder)` — 覆盖「取当前用户未归档打卡项」主查询。
+
+### 3.2 `CheckIn` — 打卡记录
+
+**一次打卡 = 一条记录**,同日多次用 `seq` 递增。
+
+| 字段 | 类型 | 空 | 默认 | 说明 |
+| --- | --- | --- | --- | --- |
+| `id` | INT PK | 否 | AUTO_INCREMENT | 主键 |
+| `habitId` | INT FK | 否 | — | 所属打卡项 |
+| `userId` | INT FK | 否 | — | 冗余用户(用于单用户全量区间查询,避免 join) |
+| `date` | VARCHAR(10) | 否 | — | 本地日历日 `"YYYY-MM-DD"` |
+| `seq` | INT | 否 | `1` | 当日第几次(1..n,超额继续累加) |
+| `note` | VARCHAR(191) | 否 | `''` | 单次备注(接口截断 200 字) |
+| `source` | VARCHAR(191) | 否 | `'user'` | `user` \| `backfill`(补打) |
+| `createdAt` | DATETIME(3) | 否 | now() | 打卡时刻(UTC) |
+
+约束与索引:
+
+| 名称 | 类型 | 字段 | 作用 |
+| --- | --- | --- | --- |
+| `CheckIn_habitId_date_seq_key` | **UNIQUE** | `(habitId, date, seq)` | 并发重复提交的幂等防线(冲突 → P2002 → 409) |
+| `CheckIn_userId_date_idx` | INDEX | `(userId, date)` | 月历按月区间扫全量记录 |
+| `CheckIn_habitId_date_idx` | INDEX | `(habitId, date)` | 单打卡项周期区间聚合 |
+
+### 3.3 `CheckList` — 检查清单
+
+| 字段 | 类型 | 空 | 默认 | 说明 |
+| --- | --- | --- | --- | --- |
+| `id` | INT PK | 否 | AUTO_INCREMENT | 主键 |
+| `userId` | INT FK | 否 | — | 所属用户 |
+| `title` | VARCHAR(191) | 否 | — | 清单名,如「出差 · 杭州」 |
+| `scene` | VARCHAR(191) | 否 | `''` | 场景:`出差` \| `回老家` \| `其他` |
+| `note` | VARCHAR(191) | 否 | `''` | 备注 |
+| `archived` | BOOLEAN | 否 | `false` | 归档 |
+| `createdAt` / `updatedAt` | DATETIME(3) | 否 | — | 列表默认按 `updatedAt` 倒序 |
+
+索引:`INDEX(userId, archived)` — 对应「进行中 / 已归档」两个分段列表。
+
+### 3.4 `CheckListItem` — 检查项
+
+| 字段 | 类型 | 空 | 默认 | 说明 |
+| --- | --- | --- | --- | --- |
+| `id` | INT PK | 否 | AUTO_INCREMENT | 主键 |
+| `listId` | INT FK | 否 | — | 所属清单 |
+| `title` | VARCHAR(191) | 否 | — | 条目名(校验 ≤40 字) |
+| `note` | VARCHAR(191) | 否 | `''` | 条目备注 |
+| `done` | BOOLEAN | 否 | `false` | 是否已完成 |
+| `doneAt` | DATETIME(3) | **是** | NULL | 勾选时刻;取消勾选置回 NULL |
+| `sortOrder` | INT | 否 | `0` | 排序(升序,同值按 id) |
+| `createdAt` / `updatedAt` | DATETIME(3) | 否 | — | — |
+
+索引:`INDEX(listId, sortOrder)`。
+
+### 3.5 `CheckListTemplate` — 清单模板
+
+| 字段 | 类型 | 空 | 默认 | 说明 |
+| --- | --- | --- | --- | --- |
+| `id` | INT PK | 否 | AUTO_INCREMENT | 主键 |
+| `userId` | INT FK | **是** | NULL | NULL = 系统预置(`builtin=true`) |
+| `name` | VARCHAR(191) | 否 | — | 模板名 |
+| `scene` | VARCHAR(191) | 否 | `''` | 场景标签 |
+| `items` | **JSON** | 否 | — | `[{ title, note }]`,创建清单时展开为 `CheckListItem` |
+| `builtin` | BOOLEAN | 否 | `false` | 系统预置:只读、不可删(接口层限制) |
+| `createdAt` / `updatedAt` | DATETIME(3) | 否 | — | — |
+
+索引:`INDEX(userId, builtin)` — 查询条件为 `builtin=true OR userId=me`。
+
+系统预置数据(首次访问 `GET /api/checklists/templates` 时**幂等写入**):
+
+| 模板 | 条目数 | 条目 |
+| --- | --- | --- |
+| 出差 | 11 | 身份证/证件、手机充电器+充电宝、笔记本电脑+电源、耳机、换洗衣物、洗漱包、常用药、雨伞、车票/机票/酒店确认、工牌/名片、报销单据 |
+| 回老家 | 12 | 身份证/证件、钥匙、手机充电器+充电宝、换洗衣物、洗漱包、常用药、给家人的礼物/伴手礼、长辈的药品/营养品、口罩、现金零钱、车票/加油/行程确认、家里门窗水电检查 |
+
+---
+
+## 4. 外键与级联
+
+| 子表.字段 | 父表.字段 | ON DELETE | ON UPDATE |
+| --- | --- | --- | --- |
+| `Habit.userId` | `User.id` | CASCADE | CASCADE |
+| `CheckIn.habitId` | `Habit.id` | CASCADE | CASCADE |
+| `CheckIn.userId` | `User.id` | CASCADE | CASCADE |
+| `CheckList.userId` | `User.id` | CASCADE | CASCADE |
+| `CheckListItem.listId` | `CheckList.id` | CASCADE | CASCADE |
+| `CheckListTemplate.userId` | `User.id` | CASCADE | CASCADE |
+
+删除链路:删用户 → 级联清 Habit/CheckIn/CheckList/Template;删 Habit → 清其全部 CheckIn;删 CheckList → 清其全部 Item。业务层删打卡项默认只置 `archived=true`,物理删需 `?hard=1`(此时先 `deleteMany` 记录再删主表)。
+
+---
+
+## 5. 关键设计决策
+
+### 5.1 为什么 `date` 用 `VARCHAR(10)` 而不是 `DATETIME`
+
+| 维度 | VARCHAR(10) 本地日历日 | DATETIME(UTC) |
+| --- | --- | --- |
+| 跨零点归属 | 明确:由应用层按 Asia/Shanghai 计算一次,落库即定 | 读时需要再转时区,易错 |
+| 范围查询 | `date >= '2026-10-01' AND date <= '2026-10-31'` 直接走索引 | 需函数/边界换算,易失效 |
+| 幂等边界 | `UNIQUE(habitId, date, seq)` 天然按「日」收敛 | 需按日截取 |
+| 字典序 | 等于时间序,可安全字符串比较 | — |
+| 存储 | 10 字节 | 5 字节(略优,但不足以抵消上述成本) |
+
+代价:跨时区展示需自行换算——本项目全链路 Asia/Shanghai,不成为问题。
+
+### 5.2 为什么不冗余 `doneCount` / `streak`
+
+- **并发**:计数需事务 + 行锁,聚合查询天然一致。
+- **改配置**:用户把「每周 3 次」改成「每周 5 次」,冗余计数立刻失真,需要全量重算;现方案改 `target` 立即生效。
+- **撤销**:撤销即删一条记录,无需维护计数器。
+- **成本**:单个用户打卡项数量在 10~30 量级,月历查询一次拉取整月记录(≤ 数百行)在内存聚合,开销可接受。
+
+### 5.3 `seq` 与幂等
+
+同日多次打卡用 `seq = max(seq)+1`。唯一约束 `(habitId, date, seq)` 使并发重复提交必然撞 P2002,服务端转 409「该次打卡已记录」,前端幂等收敛,不会出现「点两下加两次」的体验事故。
+
+### 5.4 归档 vs 物理删除
+
+| 操作 | 语义 | 数据影响 |
+| --- | --- | --- |
+| `DELETE /api/checkin/habits/:id` | 归档(默认) | `archived=true`,记录全保留 |
+| `DELETE /api/checkin/habits/:id?hard=1` | 物理删除 | 先删 CheckIn,再删 Habit |
+| `DELETE /api/checklists/:id` | 物理删除(一次性清单,不留历史) | 先删 Item,再删 List |
+
+理由:打卡是长期行为数据,历史构成 streak 与完成率;清单是短期事务,用完即归档/删除。
+
+### 5.5 模板用 JSON 而非明细表
+
+模板条目结构固定(`title` + `note`)、只在「创建清单」时整体读取并展开、不需要按条目检索或统计 —— 用 `JSON` 列避免额外的 `TemplateItem` 表与 join。展开后落到 `CheckListItem`,之后模板改动不影响已生成清单。
+
+---
+
+## 6. 数据量估算
+
+单用户规模假设:打卡项 20 个,平均每天打卡 25 次;清单每月 4 份,每份 12 条。
+
+| 表 | 年增量(单用户) | 行大小(约) | 年占用(约) |
+| --- | --- | --- | --- |
+| `CheckIn` | 25 × 365 ≈ 9,100 | ~80 B | ~0.7 MB |
+| `CheckListItem` | 4 × 12 × 12 = 576 | ~90 B | ~0.05 MB |
+| `Habit` / `CheckList` / `CheckListTemplate` | < 100 | ~200 B | 忽略 |
+
+结论:**无需分区、无需归档策略**。10 用户 × 5 年 ≈ 45 万行 CheckIn,仍远低于单表瓶颈。若未来接入多租户或做年视图长周期统计,再考虑按月汇总表。
+
+---
+
+## 7. 典型查询
+
+### 7.1 今日待办 + 周期进度
+
+```sql
+-- 步骤 1: 取未归档打卡项 (走 Habit_userId_archived_sortOrder_idx)
+SELECT id, name, period, target, color FROM Habit
+WHERE userId = ? AND archived = 0 ORDER BY sortOrder, id;
+
+-- 步骤 2: 取覆盖所有周期窗口的最小区间内的记录 (走 CheckIn_userId_date_idx)
+SELECT habitId, date FROM CheckIn
+WHERE userId = ? AND date >= ? AND date <= ?; -- 如 week: '2026-10-19' ~ '2026-10-25'
+-- 步骤 3: 内存按 habitId/date 分组 -> 计算 done/percent/streak
+```
+
+### 7.2 打一次卡
+
+```sql
+SELECT MAX(seq) FROM CheckIn WHERE habitId = ? AND date = ?; -- -> seq
+INSERT INTO CheckIn (habitId, userId, date, seq, note, source) VALUES (?, ?, ?, ?, ?, 'user');
+-- 冲突 -> P2002 -> 409
+```
+
+撤销(撤销本周期最近一次):
+
+```sql
+SELECT id FROM CheckIn WHERE habitId = ? AND date BETWEEN ? AND ?
+ORDER BY date DESC, seq DESC LIMIT 1;
+DELETE FROM CheckIn WHERE id = ?;
+```
+
+### 7.3 月历(日历视图数据来源)
+
+```sql
+SELECT habitId, date FROM CheckIn
+WHERE userId = ? AND date >= '2026-10-01' AND date <= '2026-10-31';
+```
+
+按天聚合后与 `Habit.expectedPerDay` 比较得出日状态:
+
+| 状态 | 条件 | 展示 |
+| --- | --- | --- |
+| `full` | 全部打卡项当日次数 ≥ 日均期望 | 绿点 |
+| `over` | 有任一打卡项当日次数 > 日均期望 | 紫点 |
+| `partial` | 有完成但未全完成 | 黄点 |
+| `empty` | 无记录或当天无打卡项 | 无点 |
+
+`Habit.createdAt` 早于该日的才计入期望,避免新建打卡项把历史日期标成「未完成」。
+
+### 7.4 清单列表(带进度)
+
+```sql
+SELECT l.*, i.* FROM CheckList l
+LEFT JOIN CheckListItem i ON i.listId = l.id
+WHERE l.userId = ? AND l.archived = ?
+ORDER BY l.updatedAt DESC, i.sortOrder, i.id;
+```
+
+---
+
+## 8. 迁移
+
+| 项 | 内容 |
+| --- | --- |
+| 迁移目录 | `prisma/migrations/20261022120000_add_checkin_checklist/` |
+| 内容 | 5 张 `CREATE TABLE` + 6 条 `ADD CONSTRAINT`(见 `migration.sql`) |
+| 生成方式 | 手写 SQL(与 `prisma migrate diff` 产出格式一致),已通过 `prisma migrate deploy` 验证 |
+| 部署命令 | `npx prisma migrate deploy && npx prisma generate` |
+| 回滚 | 无自动回滚。应急:`DROP TABLE CheckIn, CheckListItem, CheckList, CheckListTemplate, Habit;`(注意外键顺序)并把 `_prisma_migrations` 中该记录删除 |
+
+>V0.2 全为新增表与新增字段(`User` 侧仅新增 Prisma 反向关系,不产生 DDL),对既有数据零影响。
+
+---
+
+## 9. V0.3 预留
+
+| 方向 | 可能的表变更 |
+| --- | --- |
+| 打卡提醒 | `Habit` 增加 `remindAt TIME`、`remindDays` |
+| 打卡统计快照 | 新增 `HabitDailyStat(userId, date, done, expected)` 汇总表,用于年视图/热力图加速 |
+| 清单共享协作 | 新增 `CheckListShare(listId, userId, role)` |
+| 模板市场 | `CheckListTemplate` 增加 `visibility`、`useCount` |
+
+以上均可通过「新增表 / 新增可空字段」完成,不影响 V0.2 数据结构。
diff --git a/docs/V0.2/界面设计.html b/docs/V0.2/界面设计.html
new file mode 100644
index 0000000..1ace70a
--- /dev/null
+++ b/docs/V0.2/界面设计.html
@@ -0,0 +1,1704 @@
+
+
+
+
+
+iBoard V0.2 界面设计 · 打卡 / 日历 / 清单
+
+
+
+
+
+
+
iBoard V0.2 · 界面设计
+
打卡 / 日历 / 清单 —— 移动端静态高保真原型(设计基线 420 × 820,适配 375~430px)
+
+ 版本 V0.2(0.2.0)分支 dev-0.2antd-mobile 风格
+ 底部 4 Tab(打卡默认)时区 Asia/Shanghai文档日期 2026-10-22 · 修订 2026-10-23
+
+
+
+
+
1 设计规范Design Tokens
+
沿用项目既有 :root 变量(src/styles/globals.css),本模块不引入新主题。
+
+
+
语义色
+
+
#1677ff主色 / 今日 / 链接
+
#00b578完成 / 进度条
+
#ffc53d部分完成 / 粒子
+
#a855f7超额完成
+
#ff8f1f连续天数 / 超额徽标
+
#ff3141危险操作
+
#f5f5f5页面底色
+
#f7fbf8已完成卡片底
+
+
+ 日历·全部完成
+ 日历·部分完成
+ 日历·超额
+
+
+
+
布局与圆角
+
+ 视口420 × 820(375~430 自适应)
+ NavBar 高45px
+ TabBar 高72px(含安全区)
+ 页面内边距左右 12px
+ 卡片圆角10px
+ 卡片间距10px 纵向
+ 卡片阴影0 1px 2px rgba(0,0,0,.04)
+ 环形尺寸58 × 58,环宽 6px
+ 最小点按区≥ 40 × 40
+
+
+
+
字号层级
+
18 / 700日期标题「10月22日」
+
17 / 600NavBar 标题「打卡」
+
16 / 700环形中心数字 / 弹窗标题
+
15 / 600打卡项名 / 清单标题
+
13 / 400正文 / 日历日期数字
+
12 / 400次要信息 / 操作链接
+
11 / 400备注 / 周期范围 / 徽标
+
+
+
+
+
2 主界面三个子视图(V0.2 现状;合并方案见 2.12 ②)
+
+
+
+
+
+
+
打卡
+
+
+
+
10月22日 周四
+
已完成 2 / 4
+
+
+
+
+
+
+
+
+
+
喝水
+
每天 2 次连续 12
+
今日
+
+
+
+
+
+
+
+
+
+
健身
+
每周 3 次连续 5
+
10-19 ~ 10-25
+
+
+
+
+
+
+
+
+
+
读书
+
每月 12 次连续 3
+
10-01 ~ 10-31
+
+
+
+
+
+
+
+
+
+
吃药
+
每天 1 次连续 30
+
今日超额 1
+
+
+
+
+
+
+
+
+
+
2.1 打卡视图 · 今天默认进入
+
头部日期 + 完成数;未完成卡片排在前面。环形中心未达标显示 done/target,达标显示对勾(每天 1 次打完即刻闭合);超额在右上角显示 +n。点环或「打卡」按钮均可打卡,卡片底部提供撤销 / 编辑 / 归档。
+
+
+
+
+
+
+
打卡
+
+
+
+ ‹2026年10月›
+ 回到今天
+
+
+
+
+
一二三四五六日
+
+
28
+
29
+
30
+
1
+
2
+
3
+
4
+
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
+
26
+
27
+
28
+
29
+
30
+
31
+
1
+
+
+
+
本月完成率 82%
+
今天 · 2026-10-22
+
+
+ 喝水
+ 每天 2 次 · 当日 2/2
+ 已达标
+
+
+ 健身
+ 每周 3 次 · 当日 0/1
+ 打卡
+
+
+ 读书
+ 每月 12 次 · 当日 1/1
+ 已达标
+
+
+ 吃药
+ 每天 1 次 · 当日 2/1
+ 已达标
+
+
+
+
+
+
2.2 日历视图 · 今天选中
+
周一起始月历 + 「昨天 / 今天 / 明天」快捷分段;日期下方状态点:绿=全部完成、黄=部分完成、紫=超额、无点=未完成或未来。今天用主色数字并选中高亮,未来日期数字弱化。下方为该日明细,可直接打卡;底部展示本月完成率。
+
+
+
+
+
+
+
打卡
+
+
+
+
+
+
出差 · 杭州出差
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 全选全不选复制
+ 存为模板归档删除
+
+
+
+
+
+
+
+
+
+
2.3 清单视图 · 展开态
+
卡片头部常显标题、场景标签、进度条与 8/12;点击展开逐条勾选(勾选后绿色圆底、文字加删除线并弱化)。底部可继续添加检查项,并提供全选 / 全不选 / 复制 / 存为模板 / 归档 / 删除。收起态只保留头部一行。
+
+
+
+
+
+
+
打卡
+
+
+
+
10月22日 周四
+
已完成 2 / 4
+
+
+
+
+
+
+
+
新建打卡项
+
+
+
+
+
+
保存
+
取消
+
+
+
+
+
2.4 新建 / 编辑打卡项(底部弹层)
+
名称 ≤20 字;周期四选一(每天 / 每周 / 每月 / 每年);目标次数用 Stepper,最小 1;颜色 7 色预设;备注可选。编辑态标题变为「编辑打卡项」并回填当前值。
+
+
+
+
+
+
+
打卡
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
2.5 达标瞬间 · 完成特效
+
环形闭合 + 对勾缩放入场(0.32s);同时 14 颗粒子沿圆周扩散(26~58px,交替主色与金色)+ 主色光环脉冲(0.7s),总时长 ≤900ms,pointer-events:none 不阻塞后续操作;并触发 18ms 轻震动。特效恒开(V0.2 设计变更:头部不再有开关)。
+
+
+
+
+
+
+
打卡
+
+
+
‹2026年10月›回到今天
+
+
+
一二三四五六日
+
+
28
29
30
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
27
+
28
29
+
30
31
+
1
+
+
+
本月完成率 82%
+
明天 · 2026-10-23计划(不可打卡)
+
喝水每天 2 次 · 当日 0/2待办
+
健身每周 3 次 · 当日 0/1待办
+
读书每月 12 次 · 当日 0/1待办
+
吃药每天 1 次 · 当日 0/1待办
+
+
+
+
+
2.6 日历 · 明天(计划,只读)
+
未来日期不允许打卡:标题右侧显示「计划(不可打卡)」徽标,条目右侧只显示「待办」文案而不渲染按钮,月历上未来日期数字弱化且不打点。昨天视图则相反——可补打最近 7 天内的漏打卡。
+
+
+
+
+
+
+
+
2.7 清单全部完成(12/12)
+
进度条 100%、计数变为 12/12、卡片底色转 #f7fbf8,并播放与打卡一致的完成特效。清单完成后用户通常选择「归档」或「复制」复用。
+
+
+
+
+
+
+
打卡
+
+
+
+
○
+
还没有打卡项
+
创建第一个打卡项
+
+
+
+
+
+
2.8 空态
+
三个视图均具备加载中 / 空态 / 错误(带重试)三态。空态给出明确引导按钮。V0.2 设计变更:打卡页头部不再有「特效开 / 特效关」开关,完成特效与触感反馈恒开,没有任何关闭入口。
+
+
+
+
+
+
+
宏观
+
+
+
+
报警3
新闻
+
油价
经济数据
策略研究
经济文章
+
+
›
+
+
+
+
央行开展 5000 亿元 MLF 操作,中标利率持平
+
本月 MLF 净投放 2000 亿元,市场流动性保持合理充裕…
+
妙想财经2026-10-22#1
+
+
+
9 月社零同比增长 3.2%,服务消费延续回暖
+
餐饮收入增速回升至 5.1%,可选消费分化明显…
+
妙想财经2026-10-21#2
+
+
+
美联储会议纪要偏鹰,美元指数小幅走强
+
点阵图显示年内或仍有一次降息空间,但分歧加大…
+
妙想财经2026-10-21#3
+
+
+
OPEC+ 维持减产节奏,国际油价日内涨逾 1%
+
布伦特原油重回 78 美元上方,化工链成本端承压…
+
妙想财经2026-10-20#4
+
+
+
+
+
+
+
2.9 宏观 · 原「首页」报警/新闻并入设计变更
+
「首页」Tab 取消,报警与新闻并入宏观。2026-10-23 调整:两者移到最左(报警 → 新闻 → 油价 → 经济数据 → 策略研究 → 经济文章),默认选中「新闻」;共 6 个子 Tab 可横向滚动,当前项底部有 3px 主色指示条;报警数量以红色角标挂在子 Tab 上。tab 条右侧增加渐变遮罩 + 箭头,提示还有未展示的 tab(详见 2.12 ④)。新闻详情为 /macro/news/:id,底部「宏观」保持高亮。
+
+
+
+
+
+
+
+
+
C
+
Cheney
+
qian.huang@sunyard.com
+
+
+
前端升级 (OTA)
+
当前版本v0.2.0 · 20261022.1530
+
运行资源内置
+
+
+
开发版本
+
按版本号判新:仅当服务端版本号更高时才提示更新
+
+
+
+
+
+
+
+
+
+
2.10 我的 · OTA「开发版本」关闭(默认)新功能
+
开关默认关闭 = 按版本号判新:取服务端 latest.json 的 version(如 0.2.0-ota),与当前运行版本按数字字段逐段比较,更高才提示更新。用于生产,避免旧分支被重建(sequence 变大但版本更小)把设备拉回旧版。开关值保存在设备端 localStorage.iboard_ota_dev_mode。
+
+
+
+
+
+
+
+
+
C
+
Cheney
+
qian.huang@sunyard.com
+
+
+
前端升级 (OTA)
+
当前版本v0.2.0 · 20261022.1530
+
运行资源内置
+
+
+
开发版本
+
按 build sequence 判新:每次构建都算新版本,便于开发联调
+
+
+
+
新版本v0.2.0-ota (288 KB)
+
+
+
+
+
+
+
2.11 我的 · OTA「开发版本」打开
+
开关打开 = 按 build sequence 判新:走 hotswap 插件的 checkUpdate(),只要服务端 sequence 比本地大就算新版本——每次 CI 构建 sequence 都会变(默认取时间戳),所以任何一次提交都能推到设备上,适合开发联调。切换开关会清空上一次的检查结果,避免上一种口径的结论误导。
+
+
+
+
+
+
+
2.12 V0.2.1 界面调整头部统一 / 日历·打卡合并 / 模板分类 / 宏观 tab 溢出
+
本节为 2026-10-23 提出的调整方案。其中 ①头部统一 / ③模板分类 / ④宏观 tab 溢出 已按本节实现;
+ ②日历与打卡合并 为待确认草案,确认后再改代码。
+
+
① 四个主 Tab 头部统一
+
+ | 页 | 调整前 | 调整后 |
+ | 打卡 | NavBar 45px,标题「打卡」17px 深色 | 23px,标题「打卡」12px 主色加粗,字距 1px |
+ | 宏观 | NavBar 45px,无标题(空白) | 23px + 标题「宏观」(同打卡规格) |
+ | 监控 | NavBar 45px,无标题(空白) | 23px + 标题「监控」(同打卡规格) |
+ | 我 | NavBar 45px 空白条 | 整条去掉,蓝色头像区直接顶到状态栏下方 |
+
+
实现为独立组件 PageHeader,只被打卡 / 宏观 / 监控 引用;「我」页不引用,因此三者互不影响。
+ 头部背景取页面底色 #f5f5f5(不再是卡片白),视觉上更轻。
+
+
+
+
+
+
①-a 打卡(头部已缩至 23px)已实现
+
原 45px 白色 NavBar 换成 23px 底色条 + 主色标题,页面上移,首屏多出一张卡片的高度。
+
+
+
+
+
+
宏观
+
+
+
+
报警1
新闻
油价
+
经济数据
策略研究
经济文章
+
+
›
+
+
+
+
央行开展 5000 亿元 MLF 操作,中标利率持平
+
本月 MLF 净投放 2000 亿元,市场流动性保持合理充裕…
+
妙想财经2026-10-22#1
+
+
+
9 月社零同比增长 3.2%,服务消费延续回暖
+
餐饮收入增速回升至 5.1%,可选消费分化明显…
+
妙想财经2026-10-21#2
+
+
+
+
+
+
+
①-b + ④ 宏观:头部标题化 · 报警/新闻置最左 · 右侧溢出提示已实现
+
顺序:报警 → 新闻 → 油价 → 经济数据 → 策略研究 → 经济文章,默认选中「新闻」(/macro 自动跳 /macro/news)。
+ 溢出提示:tab 条仍可向右滚动时,右边缘出现白色渐变遮罩 + 主色圆底箭头「›」(1.5s 轻微左右摆动,可点击向右翻页),滚到末尾自动消失;切换 tab 时自动把激活项滚到可视区中间。
+ antd-mobile Tabs 自带的右侧渐变遮罩只有 30px 且无箭头,用户难以察觉,故叠加此提示层。
+
+
+
+
+
② 打卡:日历 + 打卡合并(待确认草案)
+
把原来的「打卡」「日历」两个 tab 合成一个:上半部日历,下半部打卡卡片。取舍按下述规则:
+
+ | 项 | 规则 |
+ | 页面结构 | SwipeTabs 从 3 个减为 2 个:日历(含打卡) / 清单 |
+ | 上方日历 | 保留月历网格 + 月份左右切换 + 「回到今天」;去掉「昨天 / 今天 / 明天」分段控件(点日期即可,节省 38px 高度) |
+ | 日历高度 | 日期格子 38px → 31px,去掉 6 行补位中的空行;整块约 240px |
+ | 下方打卡 | 沿用现有打卡卡片样式,但紧凑化:内边距 12px → 8px,环形 58px → 42px(环宽 6 → 5),行高压缩,卡片间距 10 → 7px |
+ | 卡片内容 | 保留环形进度(含达标对勾 / 超额 +n)、名称、周期与目标、连续天数、打卡按钮;撤销 / 编辑 / 归档收进「⋯」,减少一行高度 |
+ | 分组 | 按周期类型分组:每天 → 每周 → 每月,每组一个小标题(左侧主色竖条 + 组名 + 条数);去掉「每年」分组(已有年目标项并入「每月」区末尾的「其他周期」小标题,或建议直接隐藏年视图) |
+ | 联动 | 点日历某日 → 下方卡片即该日数据(进度仍按该日所属周期算);未来日期只读,按钮变灰显示「计划」 |
+ | 空态 | 日历下方直接显示「该日没有打卡项」+「+ 新建」引导 |
+
+
+
+
+
+
打卡
+
+
+
+
+
+ ‹2026年10月›
+ 回到今天
+
+
一二三四五六日
+
+
29
30
+
1
2
+
3
4
5
+
6
7
+
8
9
+
10
11
12
+
13
14
15
+
16
17
18
19
+
20
21
+
22
23
24
25
+
26
27
28
+
29
30
31
1
+
+
本月完成率 82%今天 · 2026-10-22
+
+
+
今天已完成 2 / 4点环即打卡
+
+
+
每天2 项
+
+
+
+
+
喝水
+
每天 2 次 · 今日 1/2连续 12
+
+
打卡
+
⋯
+
+
+
+
+
+
吃药
+
每天 1 次 · 今日 2/1连续 30
+
+
再打一次
+
⋯
+
+
+
每周1 项
+
+
+
+
健身
+
每周 3 次 · 本周 1/3连续 5
+
+
打卡
+
⋯
+
+
+
每月1 项
+
+
+
+
读书
+
每月 12 次 · 本月 0/12
+
+
打卡
+
⋯
+
+
+
+
+
+
+
②-a 合并后的主视图(日历在上 · 打卡在下,按天 / 周 / 月分组)待确认
+
卡片整体压缩:环形 42px、内边距 8px、行距 7px,单卡高度约 58px(原 92px),一屏可看 4~5 项。分组顺序固定为 每天 → 每周 → 每月,
+ 组标题左侧 3px 主色竖条;无「每年」分组。日历顶部的「昨天 / 今天 / 明天」分段已去掉,直接点日期切换,选中日靠「今天」主色数字与蓝色实心块识别。
+
+
+
+
+
+
打卡
+
+
+
+
‹2026年10月›回到今天
+
一二三四五六日
+
+
29
30
+
1
2
+
3
4
5
+
6
7
+
8
9
+
10
11
12
+
13
14
15
+
16
17
18
19
+
20
21
+
22
23
24
25
+
26
27
28
+
29
30
31
1
+
+
本月完成率 82%明天 · 2026-10-23
+
+
明天计划(不可打卡)
+
+
+
+
+
+
②-b 未来日期(计划态)
+
选中未来日期时,打卡按钮统一变灰显示「计划」,点击不生效;环形仍显示该日所属周期的既有进度(此处举例为周期初)。
+ 补打窗口仍是最近 7 天,超出时同样只读。
+
+
+
+
+
+
打卡
+
+
+
+
‹2026年10月›回到今天
+
一二三四五六日
+
+
29
30
+
1
2
+
3
4
5
+
6
7
+
8
9
+
10
11
12
+
13
14
15
+
16
17
18
19
+
20
21
+
22
23
24
25
+
26
27
28
+
29
30
31
1
+
+
本月完成率 82%今天 · 2026-10-22
+
+
今天已完成 2 / 4点环即打卡
+
+
+
+
+
吃药 · 每天 1 次
+
撤销上次打卡今日 2 次
+
编辑打卡项名称 / 周期 / 目标
+
归档历史记录保留
+
取消
+
+
+
+
+
②-c 卡片「⋯」操作面板
+
紧凑化后卡片不再常显三个文字链接,改由右上角「⋯」唤出底部面板:撤销 / 编辑 / 归档。面板项 44px 高,
+ 「归档」用危险色;撤销仅在当日有记录时可用,否则置灰。
+
+
+
+
+
③ 清单:新增「模板」分类(与进行中 / 已归档并列)已实现
+
清单页分段从 2 个变为 3 个:进行中 / 已归档 / 模板。模板拥有独立的增删改查,按名称字母顺序(中文按拼音、数字按数值)排序;
+ 新建清单时只保留名称,去掉场景,模板改为点击后在右侧滑出的面板里选择。
+
+
+
+
+
打卡
+
+
+
+
+
+
出差预置11 项
+
+ 身份证 / 证件手机充电器 + 充电宝
+ 笔记本电脑 + 电源耳机+7
+
+
由此新建
+
+
+
+
回老家预置12 项
+
+ 身份证 / 证件钥匙
+ 手机充电器 + 充电宝换洗衣物+8
+
+
由此新建
+
+
+
+
露营装备2 项
+
帐篷睡袋
+
由此新建编辑删除
+
+
+
+
+
+
③-a 模板分类已实现
+
模板卡片:名称 + 「预置」标记 + 项数;下方最多展示 4 个检查项摘要(超出折叠为 +n);底部操作「由此新建 / 编辑 / 删除」。
+ 系统预置模板不可编辑、不可删除(只保留「由此新建」)。右上角按钮随分段切换:模板页为「+ 新建模板」,其余为「+ 新建」。
+
+
+
+
+
+
打卡
+
+
+
+
+
+
选择模板×
+
按名称字母顺序排列
+
不使用模板空白清单
+
出差预置11 项
+
回老家预置12 项
+
露营装备2 项
+
+
+
+
+
+
③-b 新建清单 + 模板右侧滑出面板已实现
+
表单只剩两项:名称(≤20 字,必填)与 模板(可空)。场景选择器已移除——场景不再由用户填写,新建时沿用所选模板自带的场景(无模板则为空),历史数据仍正常展示场景标签。
+ 点模板行从右侧滑出 78% 宽面板:首项固定为「不使用模板」,其后按字母顺序列出全部模板(预置带标记、右侧显示项数),选中项主色高亮,点遮罩或 × 关闭。
+
+
+
+
+
+
+
③-c 模板编辑(增删改)已实现
+
新建 / 编辑共用同一弹层:模板名称(≤20 字)+ 检查项列表(逐条 ≤40 字,可删除、可追加)。保存时至少需 1 条有效检查项,名称为空或全空则拦截并 Toast 提示。
+ 删除模板需二次确认,且不影响已用该模板创建过的清单。
+
+
+
+
+
④ 补充:模板接口
+
+ | 方法 | 路径 | 说明 |
+ | GET | /api/checklists/templates | 模板列表(含预置),服务端按名称字母顺序排序 |
+ | GET | /api/checklists/templates/:id | 模板详情 |
+ | POST | /api/checklists/templates | 新建模板 { name, items[] } |
+ | PUT | /api/checklists/templates/:id | 改名称 / 检查项(预置模板拒绝) |
+ | DELETE | /api/checklists/templates/:id | 删自建模板(预置模板拒绝) |
+
+
排序口径:Intl.Collator('zh-Hans-CN', { numeric: true, sensitivity: 'base' }),中文按拼音、数字按数值比较,前后端一致。
+
+
+
3 组件状态定义Component States
+
+
3.0 页面头部(PageHeader)
+
+ | 项 | 取值 |
+ | 高度 | 23px(原 NavBar 45px 的一半),flex: 0 0 23px 不参与压缩 |
+ | 标题字号 / 字重 | 12px / 600 |
+ | 标题颜色 | 主色 #1677ff |
+ | 背景 | 页面底色 #f5f5f5 |
+ | 适用范围 | 打卡 / 宏观 / 监控;「我」页不使用 |
+
+
实现为独立组件 src/components/PageHeader.jsx,三页各自引用、互不影响;「我」页移除 NavBar 后头像区直接贴顶。
+
+
3.1 环形进度(尺寸 58,环宽 6,r=26,周长 163.4)
+
+ | 状态 | 条件 | 环形 | 中心 | 卡片底 | 按钮 |
+ | 未开始 | done = 0 | 仅灰底环 | 0/2 | 白 | 打卡(主色) |
+ | 进行中 | 0 < done < target | 按 done/target 填充(45°…330°) | 1/3 | 白 | 打卡(主色) |
+ | 已达标 | done = target | 闭合整圈 | 对勾(主色) | #f7fbf8 | 再打一次(灰) |
+ | 超额 | done > target | 闭合 + 右上角 +n 橙标 | 对勾 | #f7fbf8 | 再打一次(灰) |
+ | 每日 1 次达标 | target = 1 且已打卡 | 直接整圈闭合,不做渐增生长期 | 对勾 | #f7fbf8 | 再打一次 |
+
+
环形进度 = 周期完成度(done / n);日历日标记 = 当日份额(当日次数 / 日均期望),两者口径不同,互不影响。
+
+
3.2 日历日期
+
+ | 状态 | 判定 | 视觉 |
+ 全部完成 full | 所有打卡项当日次数 ≥ 日均期望,且无超额 | 绿色圆点 |
+ 超额 over | 全部达标且存在任一打卡项当日次数 > 期望 | 紫色圆点 |
+ 部分完成 partial | 有完成但未全部完成 | 黄色圆点 |
+ 无 empty | 无记录 / 当天无打卡项 / 未来日期 | 不显示圆点 |
+ | 今天 | date = today | 数字主色加粗 |
+ | 选中 | 用户点击 | 主色实心底,数字与圆点转白 |
+ | 非本月 / 未来 | 月份不符 / date > today | 数字弱化(#c8c8c8 / #b0b0b0) |
+
+
+
3.3 清单检查项
+
+ | 状态 | 勾选框 | 文字 | 触发 |
+ | 未完成 | 1.5px 灰边圆圈,对勾透明 | #333 | 点击圆圈或文字切换 |
+ | 已完成 | 绿底绿边,白色对勾显现(0.2s) | #a0a0a0 + 删除线 | 同上,写 doneAt |
+ | 整单完成 | — | 进度条 100%、卡片转绿 | 最后一项勾选时播放特效 |
+
+
+
+
4 交互与动效Motion
+
+ | 动效 | 时长 | 曲线 / 实现 | 说明 |
+ | 环形增长 | 450ms | cubic-bezier(.4,0,.2,1),stroke-dashoffset 过渡 | 12 点方向顺时针增长 |
+ | 对勾入场 | 320ms | scale(.4) → 1 + 透明度 | 达标瞬间出现 |
+ | 完成粒子 | ≤900ms | 14 颗粒子按角度 --a、距离 --d 扩散,交错 40ms 延迟 | 不阻塞点击 |
+ | 光环脉冲 | 700ms | 主色圆环放大淡出 | 与粒子同时开始 |
+ | 触感反馈 | 18ms | navigator.vibrate(18) | WebView 不支持则静默跳过 |
+ | 进度条填充 | 400ms | width 过渡 | 清单勾选后更新 |
+ | 视图切换 | — | SwipeTabs 跟手横滑 | 与既有模块一致 |
+
+
+
4.1 打卡时序
+
用户点环 / 点「打卡」
+ └─ 前端乐观更新:done+1,重算 percent / completed / over,环形立即增长
+ └─ POST /api/checkin/habits/:id/check
+ ├─ 200 → 用服务端 item 覆盖本地;若 completed → 触发特效 + 震动
+ ├─ 400 → 回滚 + Toast(未来日期 / 超出 7 天补打窗口)
+ ├─ 409 → 视为已打卡,刷新一次(幂等)
+ └─ 网络失败 → 回滚 + Toast「打卡失败」
+
+
+
5 适配与可达性
+
+ | 项 | 约定 |
+ | 视口 | 设计稿 420×820;375~430px 内元素不换行、不裁切;底部 TabBar 4 项每项 ≥ 44px 可点宽度 |
+ | 安全区 | TabBar 使用 antd-mobile safeArea,页面底部留出 tabbar-h + safe-bottom |
+ | 动效 | 特效恒开(V0.2 设计变更,无开关):单次 ≤900ms、pointer-events:none,不阻塞连续打卡;不再响应 prefers-reduced-motion |
+ | 大字号 | 卡片采用 grid 自适应列宽,文字超长换行不截断;名称限制 20 字、检查项 40 字 |
+ | 深色模式 | V0.2 沿用现有浅色主题,暂不适配 |
+
+
+
本文档为静态设计稿,不含脚本逻辑;实现对应 src/pages/checkin/*.jsx、src/components/RingProgress.jsx 与样式段(src/styles/globals.css)。接口与数据口径见《设计文档.md》与《数据库设计文档.md》。
+
+
+
+
diff --git a/docs/V0.2/设计文档.md b/docs/V0.2/设计文档.md
new file mode 100644
index 0000000..a32a869
--- /dev/null
+++ b/docs/V0.2/设计文档.md
@@ -0,0 +1,516 @@
+# iBoard V0.2 设计文档 — 打卡 / 日历 / 清单
+
+| 项 | 内容 |
+| --- | --- |
+| 版本 | V0.2(对应分支 `dev-0.2`,应用版本 `0.2.0`) |
+| 文档状态 | 已实现(与代码一致;含 2026-10-22 设计变更,见 §10) |
+| 上游文档 | `需求文档.md`(需求编号 F-CK / F-CL / F-LS / F-SY / U / D / N / E 沿用本文) |
+| 配套文档 | `数据库设计文档.md`、`界面设计.html` |
+| 技术栈 | Tauri 2 + React 18 + antd-mobile + React Router v6 + Express 4 + Prisma/MariaDB |
+| 设计基线 | 移动端优先,视口 420×820,375~430px 自适应;时区统一 `Asia/Shanghai` |
+
+---
+
+## 1. 总体设计
+
+### 1.1 目标与范围
+
+在既有 iBoard 之上**新增「打卡」模块并升为默认首页**(底部 Tab 由 5 个精简为 4 个:打卡 / 宏观 / 监控 / 我),页面内以三个子视图承载三类需求:
+
+| 子视图 | 解决问题 | 核心隐喻 |
+| --- | --- | --- |
+| **打卡** | 周期性习惯的量化坚持 | 环形进度,点环即打卡 |
+| **日历** | 回看昨天、执行今天、预知明天 | 月历网格 + 日状态点 |
+| **清单** | 出差/回老家等一次性场景的漏项检查 | 勾选清单 + 进度条 |
+
+> **Tab 结构(V0.2 终态)**
+>
+> | 顺序 | Tab | 路由 | 说明 |
+> | --- | --- | --- | --- |
+> | 1 | **打卡(默认)** | `/checkin` | 根路径 `/` 重定向到此;`/checkin` 内含 打卡/日历/清单 三视图 |
+> | 2 | 宏观 | `/macro/*` | 油价 / 经济数据 / 策略研究 / 经济文章 / **报警** / **新闻**(后两者由原「首页」并入) |
+> | 3 | 监控 | `/monitor` | 服务器 + 米家环境 |
+> | 4 | 我 | `/me` | 用户信息 + 前端 OTA 升级 |
+>
+> 原「首页」Tab 已移除:其中的**报警**、**新闻** 两个模块并入宏观,作为其第 5、6 个子 Tab(`/macro/alerts`、`/macro/news`),新闻详情改为 `/macro/news/:id` 以保持宏观 Tab 高亮。
+
+**不纳入 V0.2**:多用户共享清单、提醒推送、数据导出、打卡项分组、年视图热力图(见 §9 演进)。
+
+### 1.2 架构总览
+
+```
+┌──────────────────────── 前端 (React + antd-mobile, 打包进 Tauri / OTA) ────────────────────────┐
+│ App.jsx 路由 (默认 / → /checkin) │
+│ └ /checkin ──► CheckinPage ── SwipeTabs ──┬── HabitView (打卡) │
+│ ├── CalendarView (日历) │
+│ └── ListView (清单) │
+│ └ /macro/* ──► MacroPage ── 油价/经济数据/策略研究/经济文章/报警/新闻 │
+│ 组件: RingProgress(环形) / Celebrate(特效, 恒开) / BottomNav / TabIcon │
+│ 工具: src/pages/checkin/date.js (本地日期, 与后端同口径) apiClient: src/api/checkin.js │
+└──────────────────────────────────┬─────────────────────────────────────────────────────────────┘
+ │ HTTPS + JWT (Authorization: Bearer)
+┌──────────────────────────────────▼─────────────────────────────────────────────────────────────┐
+│ Express (server/index.js) │
+│ /api/checkin ─► routes/checkin.js ─┐ │
+│ /api/checklists─► routes/checklists.js ─┤─► middleware.authRequired ─► Prisma Client │
+│ └─► checkin/period.js (周期口径唯一来源) │
+└──────────────────────────────────┬─────────────────────────────────────────────────────────────┘
+ ▼
+ MariaDB: Habit / CheckIn / CheckList / CheckListItem / CheckListTemplate
+```
+
+### 1.3 分层与职责
+
+| 层 | 位置 | 职责 |
+| --- | --- | --- |
+| 页面 | `src/pages/checkin/*.jsx` | 视图编排、本地状态、乐观更新与回滚 |
+| 组件 | `src/components/RingProgress.jsx` | 纯展示:SVG 环形 + 完成特效(恒开,无开关) |
+| 日期工具 | `src/pages/checkin/date.js` | 与后端同口径的本地日期运算(**改一处需同步另一处**) |
+| API 封装 | `src/api/checkin.js` | 统一走 `api()`(自带 token / 错误解析) |
+| 路由 | `server/routes/checkin.js`、`checklists.js` | 参数校验、鉴权、组装展示态 |
+| 领域逻辑 | `server/checkin/period.js` | 周期窗口、日均期望、streak 判定 |
+| 持久化 | Prisma Client(`generated/prisma`) | 表操作 |
+
+### 1.4 目录结构(本次新增/修改)
+
+```
+prisma/
+ schema.prisma # +5 个 model,User 加反向关系
+ migrations/20261022120000_add_checkin_checklist/ # 新建表 + 外键
+server/
+ checkin/period.js # 周期计算(唯一口径)
+ routes/checkin.js # /api/checkin/*
+ routes/checklists.js # /api/checklists/*
+ index.js # 挂载两个路由
+src/
+ api/checkin.js # checkinApi / checklistApi
+ api/ota.js # OTA 封装 + 判新模式(version/sequence)
+ utils/version.js # 版本号字段比较(纯函数, 可单测)
+ utils/format.js # 日期格式化
+ components/RingProgress.jsx # 环形进度 + Celebrate 特效
+ components/BottomNav.jsx # Tab: 打卡(默认)/宏观/监控/我
+ components/TabIcon.jsx # 图标集(移除 home)
+ pages/checkin/CheckinPage.jsx # 容器:三视图切换
+ pages/checkin/HabitView.jsx # 打卡视图
+ pages/checkin/CalendarView.jsx # 日历视图
+ pages/checkin/ListView.jsx # 清单视图
+ pages/checkin/date.js # 前端日期工具
+ pages/MacroPage.jsx # 宏观: 6 个子 Tab(含报警/新闻)
+ pages/macro/AlertsView.jsx # 报警(原首页)
+ pages/macro/NewsView.jsx # 新闻(原首页)
+ pages/MePage.jsx # 我: OTA 组内「开发版本」开关
+ App.jsx # / → /checkin; /macro/*; 移除 /news/:id
+ styles/globals.css # 打卡相关样式段
+scripts/ci/check-version.mjs # CI: 校验分支名 ↔ package.json 版本
+docs/V0.2/ # 需求 / 设计 / 数据库设计 / 界面设计
+```
+
+---
+
+## 2. 领域模型与核心口径
+
+### 2.1 实体
+
+`Habit`(打卡项定义)· `CheckIn`(一次打卡)· `CheckList`(场景清单)· `CheckListItem`(检查项)· `CheckListTemplate`(模板)。字段与索引见《数据库设计文档》。
+
+### 2.2 周期口径(唯一来源:`server/checkin/period.js`)
+
+| 概念 | 定义 |
+| --- | --- |
+| 本地日历日 | `Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Shanghai' })` → `"YYYY-MM-DD"` |
+| 周起始 | **周一**(`startOfWeek` 把周日映射到第 7 天) |
+| 周期窗口 | day = [d, d];week = [周一, 周日];month = [1 号, 月末];year = [1/1, 12/31] |
+| **环形进度** | `percent = 周期内累计次数 / n`,上限 1 —— 回答「这周期做了多少」 |
+| **日均期望次数** | day→n;week→`ceil(n/7)`;month→`ceil(n/当月天数)`;year→`ceil(n/365)` —— 回答「今天该做多少」 |
+| 完成 | `done >= target`(超额允许,`over = done - target` 继续累加) |
+| streak | 从当前周期向前回溯:达标 +1;**当前周期未结束且未达标 → 跳过而非中断**;已结束周期未达标 → 终止 |
+
+>两种口径并存是有意为之:环形看「周期整体」,日历日标记看「当天份额」。例如「每周 3 次」,周三打 1 次 → 环形 33.3%,当天已达标(1 ≥ ceil(3/7)=1)。
+
+### 2.3 边界规则
+
+| 场景 | 规则 | 编号 |
+| --- | --- | --- |
+| 提前打卡(未来日期) | 拒绝,返回 400「不能为未来日期打卡」 | F-CK-11 |
+| 补打 | 仅限最近 **7 天**,记录 `source='backfill'` | F-CK-10 |
+| 跨零点 | 以服务端 Asia/Shanghai 日历日为准,前端不自行判断 | E-02 |
+| 周期中途新建 | 按完整 n 计算,不按剩余天数折算 | E-01 |
+| 编辑 `target` | 立即生效,历史记录不改动 | F-CK-13 |
+| 删除打卡项 | 默认归档(`archived=true`),`?hard=1` 物理删并清记录 | E-05 |
+| 清单删除 | 物理删(一次性场景不留历史) | F-LS-10 |
+
+---
+
+## 3. 前端设计
+
+### 3.1 路由与容器
+
+```
+底部 Tab (BottomNav) 打卡(默认) ─ 宏观 ─ 监控 ─ 我
+ / →
+/checkin → CheckinPage
+ ├─ NavBar「打卡」
+ └─ SwipeTabs(左右滑动切换,与既有模块交互一致)
+ ├─ habit → HabitView (受 date 影响)
+ ├─ calendar → CalendarView (持有选中 date,可回写容器)
+ └─ list → ListView (独立)
+/macro/* → MacroPage (油价 / 经济数据 / 策略研究 / 经济文章 / 报警 / 新闻)
+```
+
+`activeKeyFromPath()` 对未匹配路径兜底返回**第一个 Tab(`/checkin`)**,与默认路由保持一致。
+
+`date` 状态提升到 `CheckinPage`:日历里点某天 → 切回打卡视图时即为该日,实现「日历与打卡联动」。
+
+### 3.2 组件树与关键状态
+
+```
+CheckinPage
+├── useState: active('habit'|'calendar'|'list'), date('YYYY-MM-DD')
+HabitView(date)
+├── data: { today, date, items[], summary:{total,done} }
+├── bursts: { habitId: n } // 特效触发计数(+1 即播放一次)
+└── form / showForm // 新建/编辑弹窗
+CalendarView(date, onDateChange)
+├── month, cal(月历), detail(当日), bursts
+└── quickValue: -1|0|1|null // 昨天/今天/明天 分段控件
+ListView()
+├── archived, lists, openId(展开的清单), newItem, templates, form/showForm
+└── bursts
+```
+
+统一约定:
+- 加载中 → `DotLoading`;错误 → `error-banner` + 重试;空 → antd-mobile `Empty` + 引导按钮(三态齐全,U-06)。
+- 页面重新可见时静默刷新(`useRefreshOnVisible`),与既有模块一致。
+
+### 3.3 环形进度组件 `RingProgress`
+
+| 项 | 设计 |
+| --- | --- |
+| 实现 | 双 ``:灰底环 + `stroke-dasharray/dashoffset` 进度环,`rotate(-90)` 从 12 点顺时针 |
+| 尺寸 | `size=58`,`stroke=6`,`r=26`,周长 `2πr≈163.4` |
+| 动画 | `transition: stroke-dashoffset .45s cubic-bezier(.4,0,.2,1)`(400ms 级,U-01) |
+| 中心内容 | 未达标 → `done / target` 数字;**达标 → 对勾 SVG**(`ring-check-in` 缩放入场);超额 → 右上角 `+n` 徽标 |
+| 交互 | 整个环可点 = 打卡(`clickable`),同时卡片右侧保留显式「打卡」按钮,降低发现成本 |
+| 无障碍/降级 | `disabled` 态半透明;**完成特效恒开**(V0.2 设计变更:取消页面内特效开关,无任何关闭入口) |
+
+**完成特效 `Celebrate`**(F-CK-07 / U-02):`fire` 计数器 +1 即触发一次 → 14 个粒子沿圆周角度扩散(`--a/--d` CSS 变量)+ 主色光环脉冲 0.7s,总时长 ≤900ms,`pointer-events:none` 不阻塞后续操作;同时 `navigator.vibrate(18)` 轻震动(U-03)。**特效永远播放**,不再读 `localStorage.iboard_celebrate`,也不再响应 `prefers-reduced-motion` 关闭(用户明确要求「特效永远打开」)。
+
+### 3.4 交互清单
+
+| 视图 | 主要交互 |
+| --- | --- |
+| 打卡 | 点环/点按钮打卡(乐观更新,失败回滚 + Toast)、撤销、编辑、归档、新建弹窗(名称/周期/目标次数/颜色/备注) |
+| 日历 | 月份左右切换、回到今天、「昨天/今天/明天」分段切换、点日期选中、当日详情内打卡(未来日期只读显示「计划」)、本月完成率 |
+| 清单 | 进行中/已归档切换、展开/收起、逐条勾选、添加检查项、全选/全不选、复制、存为模板、归档/恢复、删除、从模板新建 |
+
+排序:打卡项列表**未完成在前**(F-CK-16);清单按 `updatedAt` 倒序。
+
+### 3.5 视觉规范
+
+| 类别 | 取值 |
+| --- | --- |
+| 主色 | `#1677ff`;成功 `#00b578`;警告/部分 `#ffc53d`;超额 `#a855f7`;危险 `#ff3141` |
+| 背景 / 卡片 | `#f5f5f5` / `#ffffff`,卡片 `radius 10px` + `0 1px 2px rgba(0,0,0,.04)` |
+| 文字 | 主 `#333`、次 `#666`、弱 `#999` |
+| 日历日状态点 | full 绿 / partial 黄 / over 紫 / empty 无 |
+| 打卡项预设色 | `#1677ff #00b578 #ff8f1f #ff3141 #a855f7 #14b8a6 #f43f9e` |
+
+完整高保真稿见 `界面设计.html`。
+
+---
+
+## 4. 后端设计
+
+### 4.1 通用约定
+
+- 两个路由文件首行 `router.use(authRequired)`,**全部接口需登录**;用户维度一律取 `req.user.sub`,不信任 body 中的 `userId`。
+- 响应统一 `{ item }` / `{ items }` / `{ ok }`;错误统一 `{ error: '中文提示' }` + 语义化状态码。
+- 展示态(percent / completed / streak / dayDone …)由服务端计算后下发,前端不做二次口径推导,避免两端不一致。
+
+### 4.2 接口清单
+
+#### 打卡 `/api/checkin`
+
+| 方法 | 路径 | 说明 | 关键响应字段 |
+| --- | --- | --- | --- |
+| GET | `/habits?date=` | 指定日待办 + 周期进度 | `items[]`(含 `done/target/percent/completed/over/streak/expectedPerDay/periodStart,End`)、`summary` |
+| POST | `/habits` | 新建打卡项 | `item` |
+| PUT | `/habits/:id` | 编辑(名称/周期/目标/颜色/备注/归档/排序) | `item` |
+| DELETE | `/habits/:id?hard=1` | 默认归档;`hard=1` 物理删 | `{ ok, removed }` |
+| POST | `/habits/:id/check` | 打一次卡(`{ date?, note? }`) | `item`(最新展示态) |
+| DELETE | `/habits/:id/check?date=` | 撤销本周期最近一次 | `item` |
+| GET | `/day?date=` | 某日每个打卡项明细 | `items[]`(含 `canCheck`)、`isToday`、`isFuture` |
+| GET | `/calendar?month=YYYY-MM` | 月历 + 完成率 | `days[]`(`status/expected/actual/isToday/isFuture/habits[]`)、`rate`、`habits[]` |
+
+#### 清单 `/api/checklists`
+
+| 方法 | 路径 | 说明 |
+| --- | --- | --- |
+| GET | `/?archived=0|1` | 清单列表(带 `done/total/percent/completed`) |
+| POST | `/` | 新建(`{ title, scene, note?, items?, templateId? }`) |
+| GET | `/:id` | 单条详情 |
+| PUT | `/:id` | 改名称/场景/备注/归档 |
+| DELETE | `/:id` | 物理删除(连带检查项) |
+| POST | `/:id/duplicate` | 复制为新清单(勾选状态重置) |
+| POST | `/:id/items` | 新增检查项 |
+| PUT | `/items/:id` | 改标题/备注/勾选(`done` 变更时写 `doneAt`) |
+| DELETE | `/items/:id` | 删除检查项 |
+| POST | `/:id/check-all` | 一键全选/全不选(`{ done }`) |
+| GET | `/templates` | 模板列表(含系统预置,首次访问幂等写入) |
+| POST | `/templates` | 另存为模板 |
+| DELETE | `/templates/:id` | 删除**自建**模板(预置模板拒绝) |
+
+### 4.3 关键流程:打卡
+
+```
+用户点环
+ │
+ ├─ 前端: 本地 +1,重算 percent/completed/over(乐观更新)
+ │
+ └─ POST /api/checkin/habits/:id/check
+ ├─ 校验 habit 归属 → 404
+ ├─ date > today → 400 不能为未来日期打卡
+ ├─ date < today-7 → 400 最多只能补打最近 7 天
+ ├─ seq = max(seq)+1 → insert
+ │ └─ P2002 → 409 该次打卡已记录(幂等)
+ └─ 返回最新 item
+ │
+ ├─ 成功: 用服务端 item 覆盖本地;若 completed → fire 特效
+ └─ 失败: setData(before) 回滚 + Toast
+```
+
+### 4.4 关键流程:月历聚合
+
+1. 取全部 Habit(含归档)→ 过滤 `archived=false` 得 `active`。
+2. 一次查询当月 `[01, 月末]` 全部 CheckIn,按 `habitId → date → count` 分组。
+3. 逐日遍历:仅统计 `Habit.createdAt <= 该日` 的项;累加 `expected += expectedPerDay(...)`、`actual += min(count, expected)`;任一 `count > expected` 记 `over`。
+4. `status`:全完成且无超额 → `full`;全完成且有超额 → `over`;有完成未全完成 → `partial`;否则 `empty`。
+5. 完成率 `rate = Σactual / Σexpected`(**只统计非未来日期**)。
+
+复杂度:`O(天数 × 打卡项数)`,30×20=600 次内存运算,无 N+1 查询。
+
+### 4.5 校验与错误码
+
+| 状态码 | 场景 |
+| --- | --- |
+| 400 | 名称为空/超长、周期非法、target < 1、未来日期打卡、超出补打窗口、本周期无记录可撤销、模板缺条目 |
+| 404 | 资源不存在或不属于当前用户 |
+| 409 | 并发重复打卡(P2002) |
+| 401 | 未登录 / token 失效(`authRequired`) |
+
+所有写操作均用 `prisma.xxx.findFirst({ where: { id, userId } })` 或 `where: { id, list: { userId } }` 做归属校验,杜绝越权改他人数据。
+
+---
+
+## 5. 非功能设计
+
+| 维度 | 设计 |
+| --- | --- |
+| 首屏 | 三视图懒切换,只有激活视图发请求;单视图首屏 ≤ 1 次列表请求(N-01) |
+| 弱网/失败 | 乐观更新 + 失败回滚 + Toast;错误横幅带重试;`useRefreshOnVisible` 静默刷新 |
+| 幂等 | 唯一约束 `(habitId, date, seq)` + 前端按钮 loading,防连点重复计次 |
+| 时区 | 全链路 Asia/Shanghai;库内 `DATETIME` 存 UTC,业务日期用 `VARCHAR(10)` 本地日历日 |
+| 兼容 | 375~430px 自适应;Tauri Android WebView 支持 `navigator.vibrate`,不支持时静默跳过 |
+| 性能 | 月历/周期统计均为「一次范围查询 + 内存聚合」,避免逐项查询 |
+| 安全 | 全接口 `authRequired`;输入长度截断(名称 20、检查项 40、备注 200);无 SQL 拼接(Prisma 参数化) |
+| 可维护 | 周期口径单点(`server/checkin/period.js`),前端 `date.js` 与之对齐,改动需同步两处(已在文档与注释中标注) |
+
+---
+
+## 6. 测试与验证
+
+| 层级 | 内容 | 结果 |
+| --- | --- | --- |
+| 单元 | 周期工具 23 条断言(窗口边界、周一起始、月末、闰年、日均期望、streak 跳过未结束周期) | 全通过 |
+| 单元 | 版本比较 10 条断言(`-ota` 后缀、`v` 前缀、缺位补 0、`0.10 > 0.9`、`beta.3 < beta.10`、空串) | 全通过 |
+| 接口冒烟 | 自签 JWT 端到端:每天 1 次闭合、每周 3 次 33.3%、超额 +1、撤销归零、未来日期 400、月历 31 天、模板生成 11 项、全选完成、复制重置 | 全通过,测试数据已清理 |
+| 构建 | `npm run build` | 通过 |
+| 迁移 | `prisma migrate deploy` 到目标库 | 成功 |
+
+---
+
+## 7. 里程碑(对应需求文档 M1~M5)
+
+| 里程碑 | 内容 | 状态 |
+| --- | --- | --- |
+| M1 | 数据模型 + 迁移 + 周期模块 + 全部后端接口 | 完成 |
+| M2 | 打卡视图:环形进度、特效、撤销/补打、新建编辑 | 完成 |
+| M3 | 日历视图:月历 + 昨天/今天/明天 + 完成率 | 完成 |
+| M4 | 清单视图:CRUD、勾选、进度、模板复用 | 完成 |
+| M5 | 文档(需求/设计/数据库/界面)+ 构建校验 + 提交 | 完成 |
+
+---
+
+## 8. 风险与权衡
+
+| 项 | 权衡 | 缓解 |
+| --- | --- | --- |
+| 周期口径前后端各实现一份 | 前端需离线即时反馈,不能等接口 | 两端算法同源同注释;口径变更必须同步 `period.js` 与 `date.js`(已写入项目记忆) |
+| 进度实时聚合而非冗余计数 | 换取一致性与配置即时生效,牺牲少量 CPU | 单用户数据量极小(月历 30 天 × 20 项),实测无感;V0.3 可加汇总表 |
+| 未来日期禁止打卡 | 防止「提前打完一周」刷进度,符合「日历看明天=计划」语义 | 明天视图只读展示「计划」,明确文案 |
+| 特效恒开可能打扰 | 用户明确要求「特效永远打开」,不再提供开关 | 单次特效 ≤900ms 且 `pointer-events:none`,不影响连续打卡;若后续需要再评估恢复开关 |
+| Tab 调整为 4 个(打卡置左并默认) | 首页被取消,报警/新闻并入宏观后宏观有 6 个子 Tab | 子 Tab 可横向滚动;报警角标保留在子 Tab 上;底部 4 项在 375px 下热区充足(≥44px) |
+
+---
+
+## 9. 后续演进(V0.3+)
+
+1. **提醒与通知**:`Habit.remindAt` + Tauri 本地通知,解决「忘打卡」。
+2. **补打放宽 / 历史编辑**:当前 7 天限制可配置化。
+3. **统计视图**:连续天数榜单、月/年热力图(届时引入 `HabitDailyStat` 汇总表)。
+4. **打卡项分组与排序拖拽**:现有 `sortOrder` 已预留,仅需交互。
+5. **清单协作/分享**:引入 `CheckListShare`。
+6. **数据导出**:清单完成后导出为图片或文本(便于发群里确认)。
+
+---
+
+## 10. 设计变更记录(2026-10-22)
+
+### 10.1 变更清单
+
+| # | 类型 | 变更 | 影响文件 |
+| --- | --- | --- | --- |
+| 1 | Bug | OTA 包版本与分支不对应:`dev-0.2` 上仍是 `0.1.0` → OTA 报成 `0.1.0-ota`。统一升到 `0.2.0`,OTA 包变为 **`0.2.0-ota`**,并加 CI 强校验 | `package.json`、`src-tauri/tauri.conf.json`、`src-tauri/Cargo.toml`、`Cargo.lock`、`scripts/ci/check-version.mjs`、`docker-build.yml` |
+| 2 | 功能 | 我的页 OTA 组新增**「开发版本」Switch**(默认关),切换判新口径:开=`build sequence`,关=版本号字段比较;开关值持久化在设备端 | `src/api/ota.js`、`src/utils/version.js`、`src/pages/MePage.jsx` |
+| 3 | 设计 | 打卡 Tab 移到**最左边并默认选中**;打卡页移除**特效开关**,特效永远打开 | `BottomNav.jsx`、`App.jsx`、`TabIcon.jsx`、`HabitView.jsx`、`RingProgress.jsx`、`globals.css` |
+| 4 | 设计 | 取消「首页」Tab,其**报警 / 新闻**并入宏观,成为宏观的第 5、6 个子 Tab | `MacroPage.jsx`、新增 `macro/AlertsView.jsx`、`macro/NewsView.jsx`、删除 `HomePage.jsx` |
+
+### 10.2 版本号为什么必须跟分支走
+
+`scripts/build-ota.mjs` 里 `manifest.version = package.json.version + '-ota'`,也就是**版本号的唯一来源仍是 `package.json`**。
+分支按版本命名(`dev-0.2`),但版本号是手工改的,一旦忘改就会出现「分支 0.2、包版本 0.1」的错位,客户端判新逻辑全部失准。
+
+**同一版本号的两种产物写法**(2026-10-22 补充确认):
+
+```
+分支 dev-0.2 → 0.2.0
+ ├─ APK / 桌面安装包 0.2.0 裸版本号,无后缀
+ ├─ 前端运行时 0.2.0 裸版本号,无后缀
+ └─ OTA 热更包 0.2.0-ota 多一个 -ota 标记
+```
+
+即 APK 与 OTA 的版本主体完全一致,唯一差别是 OTA 多 `-ota` 后缀;`package.json` 只写裸版本号,后缀由打包脚本追加。
+
+| 环节 | 取值 | 现状 |
+| --- | --- | --- |
+| `package.json` `version` | `0.2.0` | 唯一手动管理点,**不得带 `-ota`** |
+| `src-tauri/tauri.conf.json` `version` | `0.2.0` | 决定 **APK `versionName`**(经 `tauri android init` 写入 `tauri.properties`)与桌面包版本 |
+| `src-tauri/Cargo.toml` / `Cargo.lock` | `0.2.0` | Rust 包版本,与上两者保持一致 |
+| OTA `latest.json.version` | `0.2.0-ota` | 打包脚本自动拼 `-ota` 后缀 |
+| `src/version.js` `APP_VERSION` | `0.2.0` | 前端展示与版本比较的基准 |
+| APK `versionCode` | `2000` | `major*1000000 + minor*1000 + patch`,必须单调递增才能覆盖安装(`0.1.0` = 1000) |
+| OTA `latest.json.min_binary_version` | `0.1.0` | **与前端版本解耦**:前端 bundle 要求的最低原生二进制版本。现有 APK 原生层仍是 0.1.0,跟着抬会导致旧 APK 收不到更新,CI 固定传 `--min-binary 0.1.0` |
+| CI 守卫 | `scripts/ci/check-version.mjs` | ① 四处版本必须完全相等且不含 `-ota`(`main`/`master` 也查);② 从 `GITHUB_REF_NAME` 解析 `dev-.`,要求 `version` 以该前缀开头;任一不满足**构建直接失败**。`docker-build.yml` 与 `android-build.yml` 都在构建前执行 |
+
+### 10.3 判新口径:版本号 vs build sequence
+
+「我的 → 前端升级 (OTA)」组内新增 `开发版本` 开关(antd-mobile `Switch`),默认**关闭**:
+
+| 开关 | 判新依据 | 实现路径 | 适用场景 |
+| --- | --- | --- | --- |
+| **关(默认)** | **版本号字段大小** | `GET /api/ota/check/0` 取 `manifest.version` → `compareVersion(manifest.version, 当前运行版本) > 0` 才算新 | 生产口径。旧分支被重新构建(sequence 变大但版本更小)时不会把设备拉回旧版 |
+| **开** | **build sequence** | `tauri-plugin-hotswap` 的 `checkUpdate()`(内部拿本地 sequence 请求 `/api/ota/check/:seq`,服务端只回比它大的) | 开发联调。每次构建 sequence 都变,保证任何一次提交都能推到设备上 |
+
+补充约定:
+
+- **持久化**:`localStorage['iboard_ota_dev_mode'] = '1' | '0'`(默认 `'0'`)。值只存在设备端 WebView 存储里,不进数据库、不上报,换设备/清数据即回默认。
+- **当前运行版本**:已应用过 OTA 覆盖包时取覆盖包 `version`(插件 `getVersionInfo()`),否则取内置包 `APP_VERSION`;避免「内置包 0.1.0 + 覆盖包 0.2.0」时永远判定有新版本。
+- **切换开关会重置检查结果**(`otaState='idle'`、清空 `otaInfo`),避免上一种口径的结论误导用户。
+- **Web 端**:浏览器里拿不到本地 sequence。默认口径按版本号比较;开发口径退化为「服务端版本 ≠ 本地版本即算新」(近似 sequence 语义)。Web 端只提示刷新,不下载不替换,与原设计一致。
+
+**版本比较算法**(`src/utils/version.js`,纯函数可单测):
+
+```js
+parseVersionFields('0.2.0-ota') // → [0, 2, 0]
+compareVersion('0.2.0-ota','0.1.0') // → 1 (0.2.0 更新)
+compareVersion('0.2','0.2.0') // → 0 (缺位补 0)
+```
+
+规则:按非数字字符切段 → 过滤空段 → 转数字 → 逐段比较,位数不足补 0。单测 10 条覆盖 `-ota` 后缀、`v` 前缀、多位段(`0.10 > 0.9`)、空串、`beta.3 < beta.10`,全部通过。
+
+### 10.4 交互与信息架构变更
+
+| 项 | 变更前 | 变更后 |
+| --- | --- | --- |
+| 底部 Tab | 首页 / 宏观 / 监控 / 打卡 / 我(5 个) | **打卡 / 宏观 / 监控 / 我(4 个)**,打卡在最左 |
+| 默认落地 | `/` → 首页(默认选中新闻) | `/` → **`/checkin`**;`RedirectIfAuthed` 与 404 兜底同样指向 `/checkin` |
+| 报警 / 新闻 | 首页内的 2 个 Tab | 宏观的第 5、6 个子 Tab(`/macro/alerts`、`/macro/news`),报警角标保留 |
+| 新闻详情 | `/news/:id`(底部无 Tab 高亮) | **`/macro/news/:id`**(宏观 Tab 保持高亮) |
+| 打卡页头部 | `[特效开/关]` + `[+ 新建]` | 只保留 `[+ 新建]`;特效恒开 |
+| 特效实现 | `effectsEnabled()` 读 `localStorage.iboard_celebrate` + `prefers-reduced-motion` 降级 | 删除开关与降级判断,`Celebrate` 只要 `fire` 变化就播放 |
+
+### 10.5 界面设计同步
+
+`界面设计.html` 已同步:底部 Tab 改为 4 项且「打卡」高亮在首位、打卡页去掉特效开关按钮、新增「我的 · OTA 开发版本开关」屏、宏观新增「报警 / 新闻」子 Tab 与合并后的 6 Tab 导航。
+
+---
+
+## 11. 界面调整(2026-10-23)
+
+### 11.1 变更清单
+
+| # | 范围 | 变更 | 状态 |
+| --- | --- | --- | --- |
+| 1 | 页面头部 | 打卡 NavBar 高度减半(45 → 23px)、标题改主色 12px;宏观 / 监控补标题;「我」页整条去掉 | **已实现** |
+| 2 | 打卡页 | 日历与打卡合并为一个视图(上日历、下打卡,按天/周/月分组、去掉年分组、卡片紧凑化) | **待确认**(设计稿已出,见《界面设计.html》2.12 ②节) |
+| 3 | 清单页 | 新增「模板」分类(与进行中 / 已归档并列),独立 CRUD + 字母序;新建清单去掉场景、模板改右侧滑出选择 | **已实现** |
+| 4 | 宏观页 | 报警 / 新闻移到最左并默认选中新闻;tab 条增加右侧溢出提示 | **已实现** |
+
+### 11.2 页面头部统一
+
+新增组件 `src/components/PageHeader.jsx`(高度 23px、标题 12px/600 主色、字距 1px、背景取页面底色 `#f5f5f5`),只被 **打卡 / 宏观 / 监控** 三页引用:
+
+| 页 | 变更前 | 变更后 |
+| --- | --- | --- |
+| 打卡 | `NavBar` 45px,标题 17px 深色 | `PageHeader` 23px,标题主色 |
+| 宏观 | `NavBar` 45px,空白 | `PageHeader` + 标题「宏观」 |
+| 监控 | `NavBar` 45px,空白 | `PageHeader` + 标题「监控」 |
+| 我 | `NavBar` 45px 空白条 | **移除**,`me-profile` 直接贴顶 |
+
+> 「我」页不引用该组件,因此调整打卡/宏观/监控的头部不会波及「我」;反之亦然。三个页面之间也各自持有独立实例,互不影响。
+
+### 11.3 清单模板分类
+
+**接口**(`server/routes/checklists.js`):
+
+| 方法 | 路径 | 说明 |
+| --- | --- | --- |
+| GET | `/api/checklists/templates` | 列表,**服务端按名称字母顺序排序**(原为 `builtin desc, id asc`) |
+| GET | `/api/checklists/templates/:id` | 详情(新增) |
+| POST | `/api/checklists/templates` | 新建(名称 ≤20 字,≥1 条检查项) |
+| PUT | `/api/checklists/templates/:id` | 改名称 / 检查项(新增;`builtin=true` 拒绝,404) |
+| DELETE | `/api/checklists/templates/:id` | 删自建模板(`builtin=true` 拒绝) |
+
+排序口径:`Intl.Collator('zh-Hans-CN', { numeric: true, sensitivity: 'base' })` —— 中文按拼音、数字按数值。前端 `ListView` 拿到列表后再排一次,保证与后端一致(网络返回顺序不可控时也不乱)。
+
+**前端**(`src/pages/checkin/ListView.jsx`):
+
+- 分段由 2 项扩为 3 项:`active`(进行中)/ `archived`(已归档)/ `template`(模板);右上角按钮随分段切换为「+ 新建」/「+ 新建模板」。
+- 模板卡片:名称 + 「预置」标记 + 项数;最多展示 4 条检查项摘要,超出折叠为 `+n`;操作「由此新建 / 编辑 / 删除」,预置模板只保留「由此新建」。
+- 新建 / 编辑模板共用底部弹层:名称 + 检查项逐条编辑(≤40 字,可删可加)。
+- **新建清单表单**:仅「名称」+「模板」两项 —— **场景选择器已移除**(`scene` 改为沿用所选模板自带的场景,无模板则为空;数据库字段保留,历史数据照常展示)。
+- **模板选择**:点击模板行从**右侧滑出** `78vw` 面板(antd-mobile `Popup position="right"`),首项固定「不使用模板」,其后为字母序模板列表(预置带标记 + 项数),选中项主色高亮。
+
+### 11.4 宏观 tab 顺序与溢出提示
+
+- Tab 顺序改为 **报警 → 新闻 → 油价 → 经济数据 → 策略研究 → 经济文章**,默认选中 **新闻**;`/macro` 由路由直接 `Navigate` 到 `/macro/news`(`App.jsx`),`activeFromPath` 兜底同样返回 `news`。
+- `SwipeTabs` 增加溢出提示层:测量 `.adm-tabs-tab-list` 的 `scrollLeft + clientWidth < scrollWidth`,为真时在顶部右侧渲染 `.tab-more-hint`(白色渐变 + 主色圆底箭头「›」,1.5s 轻微摆动动画,点击向右翻页 60% 视宽),滚到末尾自动消失。
+- 切换 tab 时把激活项平滑滚到可视区中央,避免选中项藏在屏幕外。
+- 为什么不用框架自带的:antd-mobile Tabs 自带 `.adm-tabs-header-mask-right` 只有 30px 纯渐变、无箭头、无交互,用户难以判断"右侧还有内容",故叠加此提示层。
+
+### 11.5 待确认项:日历与打卡合并
+
+方案已写入《界面设计.html》2.12 ②节(含主视图、未来日期计划态、卡片「⋯」操作面板三屏)。要点:
+
+| 项 | 方案 |
+| --- | --- |
+| 结构 | SwipeTabs 由 3 个减为 2 个:`日历(含打卡)` / `清单` |
+| 日历 | 月历 + 月份切换 + 回到今天;**去掉「昨天/今天/明天」分段**;日期格 38 → 31px |
+| 打卡 | 沿用现有卡片样式,紧凑化:内边距 12→8px、环形 58→42px(环宽 6→5)、间距 10→7px |
+| 操作 | 撤销 / 编辑 / 归档收进「⋯」底部面板(原为卡片底部三个文字链接) |
+| 分组 | **每天 → 每周 → 每月**,组标题左侧主色竖条;**去掉「每年」分组** |
+| 联动 | 点日期即切换当日数据;未来日期只读,按钮灰显「计划」 |
+
+确认后再落地:`CheckinPage` 收敛为 2 个 tab、`CalendarView` 与 `HabitView` 合成新视图组件、`HabitView` 的循环/编辑逻辑抽出复用、样式新增 `.mv-*` 段。
+
+
diff --git a/docs/V0.2/需求文档.md b/docs/V0.2/需求文档.md
new file mode 100644
index 0000000..b8585a9
--- /dev/null
+++ b/docs/V0.2/需求文档.md
@@ -0,0 +1,348 @@
+# iBoard V0.2 需求文档 — 打卡 / 日历 / 清单
+
+> 版本:V0.2 · 分支:`dev-0.2` · 日期:2026-10-22
+> 目标项目:iboard(Tauri 2 + React 18 + antd-mobile + Express + Prisma/MariaDB,移动端优先)
+> 基线版本:V0.1(`dev-0.1`)
+
+---
+
+## 1. 总体描述
+
+在 iBoard 移动端新增一个「打卡」模块一个「清单」模块,满足两类日常需求:
+### 打卡
+1. **周期性打卡**(习惯养成):用户定义"每天 n 次 / 每周 n 次 / 每月 n 次 / 每年 n 次"的目标,
+ 每次打卡后卡片上的**环形进度**按 `已完成次数 / 目标次数` 增长,达标时环形闭合并播放完成特效;
+2. **日历回看**:以日历为载体,快速查看**今天**(要做什么)、**昨天**(做得怎样)、
+ **明天**(计划做什么),日期上以圆点/实心标记完成情况;
+
+### 清单
+1. **清单**(场景化一次性事项):面向**出差、回老家**等临时场景,逐条勾选确认,
+ 避免遗漏;清单可复用为模板,下次一键生成。
+
+### 1.1 本期范围
+
+- 单用户使用,数据按登录用户隔离(复用现有 JWT 鉴权)。
+- 移动端优先(`MobileShell` + 底部 TabBar 体系),桌面浏览器兼容可用即可。
+- 数据落库 MariaDB,通过现有 Express `/api/*` 提供接口。
+
+### 1.2 不在本期范围(明确排除)
+
+- 多人协作 / 共享打卡 / 打卡排行榜。
+- 系统通知、推送提醒、定时提醒(V0.2 不引入通知能力)。
+- 复杂统计报表(周报/月报/趋势图),本期只提供完成率概览。
+- 桌面端专用布局、横屏适配。
+- 清单的周期性重复(如"每次出差都生成"),本期只做**临时清单 + 模板手动复用**。
+
+---
+
+## 2. 术语与概念定义
+
+| 术语 | 定义 |
+| --- | --- |
+| **打卡项(Habit)** | 一个被跟踪的周期性目标,如"喝水 每天 8 次""健身 每周 3 次" |
+| **周期类型** | `day` / `week` / `month` / `year`,决定进度统计窗口 |
+| **目标次数 n** | 一个周期内需要完成的打卡次数,n ≥ 1 |
+| **周期窗口** | 日=自然日;周=自然周(周一 00:00 至周日 23:59);月=自然月;年=自然年。时区统一 Asia/Shanghai |
+| **打卡记录(CheckIn)** | 一次打卡动作,归属到某个**本地日历日**(可补打到过去日期) |
+| **环形进度** | 卡片上的圆环组件,`进度 = min(已完成次数 / n, 1)`;达标=闭合 |
+| **清单(CheckList)** | 一次性检查清单,如"出差 · 10月杭州",含若干检查项 |
+| **检查项(CheckItem)** | 清单中的单条待检查事项,勾选即完成 |
+| **模板(Template)** | 可被复用的清单结构(一组检查项标题),用于一键生成新清单 |
+| **日期状态** | 某日的打卡完成情况:全部完成 / 部分完成 / 未开始 / 超额完成 |
+
+---
+
+## 3. 需求点
+
+**编号规则**:`类型-模块-序号`。类型:F=功能需求、U=交互与体验、D=数据、N=非功能、E=异常与边界。
+模块:CK=打卡、CL=日历、LS=清单、SY=通用。
+
+**优先级**:P0 = 本期必须有;P1 = 本期应该有;P2 = 有则更好(可延后)。
+
+### 3.1 功能需求 — 打卡(F-CK)
+
+| 编号 | 需求描述 | 验收要点 | 优先级 |
+| --- | --- | --- | --- |
+| F-CK-01 | 支持新建打卡项:名称、周期类型、目标次数 n、颜色、图标、备注 | 表单校验:名称必填且 ≤ 20 字;n 为 ≥1 的整数 | P0 |
+| F-CK-02 | 周期类型支持**每天 n 次 / 每周 n 次 / 每月 n 次 / 每年 n 次**四种 | 四种类型均可创建并正确统计 | P0 |
+| F-CK-03 | 卡片以**环形进度**展示当前周期完成情况,环中心显示 `已完成/n` | 进度 = 已完成次数 / n,上限 100% | P0 |
+| F-CK-04 | **每天 1 次**的打卡项:打卡后环形**直接闭合**(100%),卡片进入"已完成"态 | 一次点击即闭合,不出现 50% 之类的中间态 | P0 |
+| F-CK-05 | **每周 n 次**(及月/年):每打卡一次环形闭合对应百分比(如 n=3,打 1 次=33.3%、2 次=66.7%、3 次=100% 闭合) | 进度随每次打卡实时刷新,带过渡动画 | P0 |
+| F-CK-06 | 打卡主操作:点击卡片上的打卡按钮即完成一次打卡 | 单击即生效,响应 < 300ms(乐观更新) | P0 |
+| F-CK-07 | 打卡**完成特效**:达标(进度达 100%)时播放特效——环形闭合动画 + 光晕/粒子扩散 + 轻量触感反馈 | 特效时长 ≤ 800ms,不阻塞后续操作 | P0 |
+| F-CK-08 | 打卡记录需记录**发生日期**(本地日历日)与时间戳 | 支持按日回看,跨零点归属正确 | P0 |
+| F-CK-09 | 支持**撤销**:可撤销本周期内最近一次打卡(主要是误触场景) | 撤销后进度回退,记录物理删除或标记撤销 | P1 |
+| F-CK-10 | 支持**补打卡**:对过去日期补记一次打卡,默认允许回溯 7 天 | 补打后对应日期的状态与进度同步更新 | P1 |
+| F-CK-11 | **不允许提前打卡**(未来日期不可打卡) | 明天的项只展示为"计划",按钮置灰 | P0 |
+| F-CK-12 | 展示**连续完成天数/周期数(streak)** | 如"已连续 5 天",断签归零 | P1 |
+| F-CK-13 | 打卡项可**编辑**(改名/改 n/改颜色/改周期)与**停用(归档)** | 归档后不出现在今日待办,历史保留 | P1 |
+| F-CK-14 | 修改目标次数 n 后,**当前周期**进度按新 n 重算展示,不改写历史记录 | 例如 n 由 3 改 5,已完成 3 次 → 显示 3/5(60%) | P1 |
+| F-CK-15 | **超额打卡**:周期内超过 n 仍可继续打卡,环形保持闭合,中心显示 `n+k`(如 3+1) | 不清零、不报错 | P2 |
+| F-CK-16 | 打卡项支持**排序**(拖动或置顶)与分组展示 | 今日列表按"未完成在前、已完成在后"默认排序 | P2 |
+| F-CK-17 | 打卡时可附带**备注**(可选,纯文本) | 列表详情中可查看 | P2 |
+
+### 3.2 功能需求 — 日历(F-CL)
+
+| 编号 | 需求描述 | 验收要点 | 优先级 |
+| --- | --- | --- | --- |
+| F-CL-01 | 提供**月历视图**:当月日历网格,可切换上/下月,点击日期查看当日详情 | 周一起始,周一~周日七列 | P0 |
+| F-CL-02 | **今天**视图(默认):列出今天应打卡的项及完成状态,可直接打卡 | 打开页面默认定位今天 | P0 |
+| F-CL-03 | **昨天**视图:展示昨天各打卡项的**已完成结果**(完成/未完成/超额),未完成项可进行补打 | 以回看为主,标记为"已完成的历史" | P0 |
+| F-CL-04 | **明天**视图:展示**明天计划要打卡的项**(按周期规则推算),只读,不可打卡 | 明确标注"计划",打卡按钮不可用 | P0 |
+| F-CL-05 | 今天/昨天/明天**快捷切换**(顶部 Segmented 或左右滑动) | 一键切换,切换有过渡动画 | P0 |
+| F-CL-06 | **日期标记**:月历中每个日期按完成情况标记——全部完成(实心)、部分完成(半填充)、未开始(空心/无标记)、超额完成(特殊标记) | 一眼能看出当月坚持情况 | P0 |
+| F-CL-07 | **日期详情**:点击某日期,展示当天每个打卡项的"目标次数 / 已完成次数 / 状态" | 过去日期可补打,未来日期只读 | P0 |
+| F-CL-08 | 日历与打卡**数据同源**:打卡操作在日历视图与打卡列表视图中即时一致 | 任一处打卡,另一处刷新 | P0 |
+| F-CL-09 | 月历顶部展示**当月完成率**(完成次数 / 应完成次数) | 百分比展示 | P1 |
+| F-CL-10 | 支持左右**滑动手势**切换月份 | 与按钮切换等价 | P2 |
+| F-CL-11 | 月视图支持简单的**完成热力**(按完成率深浅着色) | 可选展示,默认关闭 | P2 |
+
+### 3.3 功能需求 — 清单(F-LS)
+
+| 编号 | 需求描述 | 验收要点 | 优先级 |
+| --- | --- | --- | --- |
+| F-LS-01 | 支持新建**检查清单**:名称、场景标签(出差 / 回老家 / 自定义)、备注 | 名称必填,场景标签可空 | P0 |
+| F-LS-02 | 清单内可**增删改检查项**,支持排序 | 单条 ≤ 40 字 | P0 |
+| F-LS-03 | **勾选完成**:点击检查项前的复选框即打勾,已完成项置灰 + 删除线;可取消勾选 | 单击切换,状态即时保存 | P0 |
+| F-LS-04 | 清单头部显示**进度**:`已完成 / 总数` + 进度条;全部完成时显示完成态 | 全部勾完触发完成提示 | P0 |
+| F-LS-05 | 清单**全部完成**时播放完成特效(与 F-CK-07 同一套特效组件) | 复用,风格统一 | P1 |
+| F-LS-06 | **模板**:系统预置常用模板(出差、回老家),一键基于模板生成新清单 | 至少 2 个预置模板 | P1 |
+| F-LS-07 | **另存为模板**:用户可将自己的清单保存为自定义模板,后续复用 | 自定义模板可删除 | P1 |
+| F-LS-08 | **复用历史清单**:从历史清单复制生成一份新清单(勾选状态重置) | 原清单保持不变 | P1 |
+| F-LS-09 | 清单**归档/删除**:完成的清单可归档(不出现在进行中列表),可查看历史 | 删除需二次确认 | P1 |
+| F-LS-10 | 清单项支持**备注/数量**说明(如"充电器 ×1") | 展示在标题下方,弱色小字 | P2 |
+| F-LS-11 | 清单支持**一键全部勾选 / 全部取消** | 批量操作入口 | P2 |
+
+### 3.4 功能需求 — 通用(F-SY)
+
+| 编号 | 需求描述 | 验收要点 | 优先级 |
+| --- | --- | --- | --- |
+| F-SY-01 | 底部 TabBar 新增**「打卡」页**,并作为**默认首页放在最左**;「清单」不单独占 Tab,作为打卡页内的第三个子视图 | 图标风格与现有 TabIcon 一致;启动即进入 `/checkin` | P0 |
+| F-SY-02 | 「打卡」页内集成 打卡/日历 两个功能,日历放在上半截,默认显示一行为周视图,下拉显示为月视图。 | 日历中选择时间与下部打卡任务联动 | P0 |
+| F-SY-03 | 所有接口复用现有鉴权(`authRequired`,JWT),数据按 `userId` 隔离 | 未登录跳转 `/login` | P0 |
+| F-SY-04 | 后端新增 REST 路由(建议 `/api/checkin/*`、`/api/checklist/*`),挂载到 `server/index.js` | 与现有路由风格一致 | P0 |
+| F-SY-05 | 时间处理统一 **Asia/Shanghai**,前端与后端对"日历日"的判定一致 | 跨零点打卡归属当天 | P0 |
+| F-SY-06 | 打卡/勾选操作采用**乐观更新**,接口失败时回滚并 Toast 提示 | 失败可见、状态不失真 | P1 |
+| F-SY-07 | 写接口**幂等/防抖**:同一打卡项 1 秒内重复点击只记一次 | 前端防抖 + 后端唯一约束双保险 | P1 |
+| F-SY-08 | 页面可见性变化时刷新数据(复用 `useRefreshOnVisible`) | 从后台切回自动同步 | P1 |
+
+### 3.5 交互与体验需求(U)
+
+| 编号 | 需求描述 | 验收要点 | 优先级 |
+| --- | --- | --- | --- |
+| U-01 | **环形进度组件**:SVG 圆环,背景环 + 进度环,进度变化带 400ms ease-out 动画 | 组件可复用(打卡卡片、清单进度共用) | P0 |
+| U-02 | **完成特效**:达标瞬间环形闭合 + 光晕/粒子扩散,约 600ms;可重复观看不烦扰 | 不阻塞操作,动画结束自动清理 | P0 |
+| U-03 | **触感反馈**:完成打卡时轻量震动(Web Vibration API / Tauri) | 固定开启,与特效一同触发 | P1 |
+| U-04 | 移动端适配:375~430px 视口,复用 `globals.css` 的 `.card` 体系,安全区与底部 TabBar 不遮挡内容 | 真机无横向滚动、无遮挡 | P0 |
+| U-05 | 空态 / 加载态 / 错误态三态齐全(首次使用引导"创建第一个打卡项") | 空态有明确 CTA | P0 |
+| U-06 | 打卡按钮足够大(点击热区 ≥ 44×44),符合移动端触控规范 | 误触率低 | P1 |
+| U-07 | 动效**性能降级**:特效保持轻量(单次 ≤900ms、`pointer-events:none`),不给低端机造成卡顿 | 不卡顿、不阻塞操作 | P1 |
+| U-08 | 深浅色:跟随现有浅色主题,卡片/分割线风格与首页、监控页一致 | 视觉统一 | P1 |
+| U-09 | 清单勾选有明确的勾选动画(勾形描边动画) | 反馈即时 | P2 |
+
+### 3.6 数据需求(D)
+
+| 编号 | 需求描述 | 验收要点 | 优先级 |
+| --- | --- | --- | --- |
+| D-01 | 新增 Prisma 模型:`Habit`(打卡项)、`CheckIn`(打卡记录) | 字段见附录 A | P0 |
+| D-02 | 新增 Prisma 模型:`CheckList`(清单)、`CheckListItem`(检查项)、`CheckListTemplate`(模板,P1) | 字段见附录 A | P0 |
+| D-03 | `Habit` / `CheckList` 均带 `userId` 外键,删除用户级联删除 | 数据隔离 | P0 |
+| D-04 | `CheckIn` 建立 `(habitId, date)` 索引,支持按日期范围查询 | 日历月查询走索引 | P0 |
+| D-05 | 提供迁移 SQL 并纳入 `prisma migrate deploy` 流程 | 与 V0.1 迁移流程一致 | P0 |
+| D-06 | 软删除语义:`Habit.archived`、`CheckList.archived`,历史记录保留 | 不物理删除历史 | P1 |
+
+### 3.7 非功能需求(N)
+
+| 编号 | 需求描述 | 验收要点 | 优先级 |
+| --- | --- | --- | --- |
+| N-01 | 页面首屏数据加载 < 1.5s(内网/正常网络),交互响应 < 300ms(乐观更新) | 真机可感知流畅 | P0 |
+| N-02 | 兼容 Android WebView(Tauri 打包)与移动端浏览器,不依赖桌面专有 API | 真机验证 | P0 |
+| N-03 | 单用户数据量按"千级记录/年"设计,无需分表;月查询一次请求返回 | 日历切月无等待感 | P1 |
+| N-04 | 所有接口 `authRequired`,越权访问返回 401 | 安全基线 | P0 |
+| N-05 | 前端代码组织遵循现有约定:`src/pages/checkin/*` + `src/components/*` + `server/routes/*` | 结构一致 | P0 |
+
+### 3.8 异常与边界需求(E)
+
+| 编号 | 需求描述 | 处理约定 | 优先级 |
+| --- | --- | --- | --- |
+| E-01 | 重复点击打卡 | 前端防抖 + 后端唯一约束,只记一次 | P0 |
+| E-02 | 接口失败 / 断网 | 乐观更新回滚 + Toast 提示,可重试 | P0 |
+| E-03 | **周期中途新建**打卡项(如周三创建"每周 3 次") | 本期按**完整目标 n** 计算,不按剩余天数折算 | P1 |
+| E-04 | 每月 n 次在天数不同的月份 | 按**自然月**窗口,不折算 | P0 |
+| E-05 | 每年 n 次跨年 | 按**自然年**窗口,年末清零 | P0 |
+| E-06 | 删除打卡项 | 归档(软删除)为主;硬删除需二次确认并提示"历史记录将一并删除" | P1 |
+| E-07 | 清单项全部删除后清单进度为 0/0 | 显示空清单,不显示 100% | P1 |
+| E-08 | 跨零点打卡(23:59 → 00:00) | 以**提交时刻的本地日历日**归属 | P0 |
+
+### 3.9 功能需求 — 版本与升级(F-OT,2026-10-22 追加)
+
+| 编号 | 需求描述 | 验收要点 | 优先级 |
+| --- | --- | --- | --- |
+| F-OT-01 | **OTA 包版本必须与分支对应**:`dev-0.2` 分支上 OTA 包版本应为 `0.2.0-ota` | `GET /api/ota/check/0` 返回 `version = 0.2.0-ota` | P0 |
+| F-OT-01a | **APK 版本与 OTA 版本同源**:APK(含桌面包)版本为裸版本号 `0.2.0`,无后缀;OTA 版本为同一版本号加 `-ota`。两者都跟代码分支保持一致 | APK 系统信息里 versionName=`0.2.0`(versionCode=2000),OTA manifest=`0.2.0-ota` | P0 |
+| F-OT-02 | 版本号错位在 CI 阶段就拦住:①`package.json`/`tauri.conf.json`/`Cargo.toml`/`Cargo.lock` 四处必须完全一致且不含 `-ota`;②分支名 `dev-x.y` 与版本主次号不一致时构建失败 | CI 输出明确报错并中断 | P0 |
+| F-OT-03 | 「我」页 OTA 组内新增**「开发版本」开关**,默认**关闭** | 关闭=按版本号比较;打开=按 build sequence 比较 | P0 |
+| F-OT-04 | 开关值**持久化在设备端**,重启 App 后保持上次选择 | 杀进程重进仍为上次状态 | P0 |
+| F-OT-05 | 版本号比较规则:按非数字字符切成数字字段,逐段比较大小(`0.2.0 > 0.1.0`,`0.10 > 0.9`) | 单测覆盖后缀/前缀/缺位/多位段 | P0 |
+| F-OT-06 | 切换开关后清空上一次的检查结果,避免误判 | 切换即回到「未检查」状态 | P1 |
+
+---
+
+## 4. 优先级汇总(本期交付范围)
+
+- **P0(必须)**:F-CK-01~08、F-CK-11;F-CL-01~08;F-LS-01~04;F-SY-01~05;F-OT-01、F-OT-01a、F-OT-02~05;U-01、U-02、U-04、U-05;D-01~05;N-01、N-02、N-04、N-05;E-01、E-02、E-04、E-05、E-08。
+- **P1(应该)**:F-CK-09、10、12~14;F-CL-09;F-LS-05~09;F-SY-06~08;F-OT-06;U-03、U-06~08;D-06;N-03;E-03、E-06、E-07。
+- **P2(可选/延后)**:F-CK-15~17;F-CL-10、11;F-LS-10、11;U-09。
+
+---
+
+## 5. 里程碑建议
+
+| 里程碑 | 内容 |
+| --- | --- |
+| **M1 数据与接口** | Prisma 模型 + 迁移;`server/routes/checkin.js`、`checklist.js`;周期进度计算与日期查询 |
+| **M2 打卡视图** | 环形进度组件 + 打卡卡片列表 + 打卡/撤销/补打 + 完成特效 |
+| **M3 日历视图** | 月历网格 + 今天/昨天/明天三视图 + 日期标记 + 日期详情 |
+| **M4 清单视图** | 清单 CRUD + 勾选交互 + 进度条 + 模板与复用 |
+| **M5 联调打磨** | 真机验证、动效降级、空态/错误态、性能与跨天边界 |
+
+---
+
+## 6. 待确认问题(评审时决策)
+
+| # | 问题 | 建议 |
+| --- | --- | --- |
+| 1 | 是否新增第 5 个底部 Tab「打卡」,还是放在首页入口? | ✅ **已决策(2026-10-22)**:「打卡」作为**默认首页放在最左**;原来的「首页」取消,报警/新闻并入宏观 |
+| 2 | 周起始日是周一还是周日? | 建议周一(国内习惯) |
+| 3 | 是否允许"明天提前打卡"? | 建议**不允许**(F-CK-11),保持统计口径干净 |
+| 4 | 删除打卡项时历史是否保留? | 建议默认归档保留,硬删除才清历史 |
+| 5 | 预置模板具体包含哪些项? | 评审时列出"出差/回老家"各 8~12 条初始项 |
+| 6 | 完成特效是否可全局关闭? | ✅ **已决策(2026-10-22)**:不提供关闭入口,**特效永远打开**;页面内不再有特效开关 |
+
+---
+
+## 附录 A:核心实体草案(供设计阶段参考,非最终表结构)
+
+```prisma
+// 打卡项
+model Habit {
+ id Int @id @default(autoincrement())
+ userId Int
+ name String
+ period String // day | week | month | year
+ target Int @default(1) // 周期内目标次数 n
+ color String @default("#1677ff")
+ icon String @default("")
+ note String @default("")
+ archived Boolean @default(false)
+ sortOrder Int @default(0)
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+ records CheckIn[]
+
+ @@index([userId, archived])
+}
+
+// 打卡记录(一次打卡 = 一条;同日多次为多条)
+model CheckIn {
+ id Int @id @default(autoincrement())
+ habitId Int
+ habit Habit @relation(fields: [habitId], references: [id], onDelete: Cascade)
+ userId Int
+ date String // 本地日历日 "YYYY-MM-DD" (Asia/Shanghai)
+ seq Int @default(1) // 当日第几次 (1..n, 超额继续累加)
+ note String @default("")
+ source String @default("user") // user | backfill(补打)
+ createdAt DateTime @default(now())
+
+ @@unique([habitId, date, seq])
+ @@index([userId, date])
+ @@index([habitId, date])
+}
+
+// 检查清单
+model CheckList {
+ id Int @id @default(autoincrement())
+ userId Int
+ title String
+ scene String @default("") // 出差 | 回老家 | 自定义
+ note String @default("")
+ archived Boolean @default(false)
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+ items CheckListItem[]
+
+ @@index([userId, archived])
+}
+
+// 检查项
+model CheckListItem {
+ id Int @id @default(autoincrement())
+ listId Int
+ list CheckList @relation(fields: [listId], references: [id], onDelete: Cascade)
+ title String
+ note String @default("")
+ done Boolean @default(false)
+ doneAt DateTime?
+ sortOrder Int @default(0)
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+
+ @@index([listId, sortOrder])
+}
+
+// 清单模板(P1)
+model CheckListTemplate {
+ id Int @id @default(autoincrement())
+ userId Int? // null = 系统预置
+ name String
+ scene String @default("")
+ items Json // [{ title, note }]
+ builtin Boolean @default(false)
+ createdAt DateTime @default(now())
+ updatedAt DateTime @updatedAt
+}
+```
+
+> 说明:周期进度由 `CheckIn` 按周期窗口现场聚合(不冗余计数字段),避免并发与修改 n 后的一致性问题。
+
+---
+
+## 附录 B:实现约定(开发期补充,用于消除口径歧义)
+
+| # | 约定 | 说明 |
+| --- | --- | --- |
+| B-1 | **周期窗口** | 日=自然日;周=周一 00:00 ~ 周日 23:59;月=自然月;年=自然年;时区 Asia/Shanghai |
+| B-2 | **环形进度** | 周期完成度 = 周期内累计打卡次数 / n(每周 n 次:打 1 次=1/n 环;每天 1 次:打 1 次直接闭合) |
+| B-3 | **日历日期标记** | 用"当日完成度":当日次数 / **日均期望次数**(每天 n 次→n;每周 n 次→ceil(n/7);每月→ceil(n/当月天数);每年→ceil(n/365))。全完成=实心绿点,部分=黄点,超额=紫点,无记录=不显示 |
+| B-4 | **streak** | 从当前周期往回数连续达标的周期数;**当前周期未结束且未达标不算断签**(跳过继续往前数) |
+| B-5 | **补打限制** | 只能补打最近 7 天(`BACKFILL_DAYS`),未来日期禁止打卡 |
+| B-6 | **撤销语义** | 撤销删除本周期内"最近一次"打卡(按 date desc、seq desc 取第一条) |
+| B-7 | **删除打卡项** | 默认归档(`archived=true`,历史保留);`?hard=1` 才物理删除并清记录 |
+| B-8 | **接口前缀** | 打卡 `/api/checkin/*`、清单 `/api/checklists/*`,全部 `authRequired`,数据按 `userId` 隔离 |
+| B-9 | **前端入口** | 底部 Tab 4 个:**打卡(最左,默认选中)** / 宏观 / 监控 / 我;`/` 重定向到 `/checkin`,页内三视图:打卡 / 日历 / 清单。原「首页」取消,报警/新闻并入宏观 |
+| B-10 | **特效** | 完成特效 + 触感反馈**恒开**,页面内不提供开关(2026-10-22 变更,原 `localStorage iboard_celebrate` 机制已移除) |
+| B-11 | **OTA 版本** | OTA 包 `version = package.json.version + '-ota'`,必须与分支一致(`dev-0.2` → `0.2.0-ota`),CI 有强校验 |
+| B-12 | **OTA 判新** | 我的页「开发版本」开关(默认关,持久化 `localStorage.iboard_ota_dev_mode`):关=版本号字段比较,开=build sequence 比较 |
+
+### 接口清单
+
+| 方法 | 路径 | 说明 |
+| --- | --- | --- |
+| GET | `/api/checkin/habits?date=` | 打卡项列表 + 当前周期进度 + streak |
+| POST | `/api/checkin/habits` | 新建打卡项 |
+| PUT | `/api/checkin/habits/:id` | 编辑(改 n / 周期 / 归档) |
+| DELETE | `/api/checkin/habits/:id?hard=1` | 归档(默认)/ 物理删除 |
+| POST | `/api/checkin/habits/:id/check` | 打卡一次(可带 `date` 补打、`note`) |
+| DELETE | `/api/checkin/habits/:id/check?date=` | 撤销本周期最近一次 |
+| GET | `/api/checkin/day?date=` | 某日详情(今天可打卡 / 昨天可补打 / 明天只读) |
+| GET | `/api/checkin/calendar?month=YYYY-MM` | 月历:每日状态 + 当月完成率 |
+| GET | `/api/checklists?archived=0\|1` | 清单列表(含进度) |
+| POST | `/api/checklists` | 新建清单(可带 `templateId` 从模板生成) |
+| GET/PUT/DELETE | `/api/checklists/:id` | 详情 / 编辑 / 删除 |
+| POST | `/api/checklists/:id/duplicate` | 复制为新清单(勾选重置) |
+| POST | `/api/checklists/:id/items` | 新增检查项 |
+| PUT/DELETE | `/api/checklists/items/:id` | 改标题 / 勾选(`done`) / 删除 |
+| POST | `/api/checklists/:id/check-all` | 一键全选 / 全不选 |
+| GET/POST | `/api/checklists/templates` | 模板列表(含系统预置)/ 另存为模板 |
+| DELETE | `/api/checklists/templates/:id` | 删除自定义模板 |
diff --git a/generated/prisma/browser.ts b/generated/prisma/browser.ts
index 2b1f0eb..fad8cc8 100644
--- a/generated/prisma/browser.ts
+++ b/generated/prisma/browser.ts
@@ -107,3 +107,28 @@ export type MihomeEnvSample = Prisma.MihomeEnvSampleModel
*
*/
export type MihomeEnvHour = Prisma.MihomeEnvHourModel
+/**
+ * Model Habit
+ *
+ */
+export type Habit = Prisma.HabitModel
+/**
+ * Model CheckIn
+ *
+ */
+export type CheckIn = Prisma.CheckInModel
+/**
+ * Model CheckList
+ *
+ */
+export type CheckList = Prisma.CheckListModel
+/**
+ * Model CheckListItem
+ *
+ */
+export type CheckListItem = Prisma.CheckListItemModel
+/**
+ * Model CheckListTemplate
+ *
+ */
+export type CheckListTemplate = Prisma.CheckListTemplateModel
diff --git a/generated/prisma/client.ts b/generated/prisma/client.ts
index 5eb90db..322de4c 100644
--- a/generated/prisma/client.ts
+++ b/generated/prisma/client.ts
@@ -131,3 +131,28 @@ export type MihomeEnvSample = Prisma.MihomeEnvSampleModel
*
*/
export type MihomeEnvHour = Prisma.MihomeEnvHourModel
+/**
+ * Model Habit
+ *
+ */
+export type Habit = Prisma.HabitModel
+/**
+ * Model CheckIn
+ *
+ */
+export type CheckIn = Prisma.CheckInModel
+/**
+ * Model CheckList
+ *
+ */
+export type CheckList = Prisma.CheckListModel
+/**
+ * Model CheckListItem
+ *
+ */
+export type CheckListItem = Prisma.CheckListItemModel
+/**
+ * Model CheckListTemplate
+ *
+ */
+export type CheckListTemplate = Prisma.CheckListTemplateModel
diff --git a/generated/prisma/internal/class.ts b/generated/prisma/internal/class.ts
index 9d85193..c8ce4ba 100644
--- a/generated/prisma/internal/class.ts
+++ b/generated/prisma/internal/class.ts
@@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = {
"clientVersion": "7.7.0",
"engineVersion": "75cbdc1eb7150937890ad5465d861175c6624711",
"activeProvider": "mysql",
- "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Get a free hosted Postgres database in seconds: `npx create-db`\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"mysql\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n name String\n email String @unique\n password String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Article {\n id Int @id @default(autoincrement())\n title String\n slug String @unique\n content String\n date String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Strategy {\n id Int @id @default(autoincrement())\n name String\n description String\n data Json\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Indicator {\n id Int @id @default(autoincrement())\n name String @unique\n groupName String\n title String @default(\"\")\n unit String @default(\"\")\n source String @default(\"\")\n frequency String @default(\"month\") // year | quarter | month | day\n hidden Boolean @default(false) // true = 数据/脚本保留, 但不在前端展示\n points IndicatorPoint[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel IndicatorPoint {\n id Int @id @default(autoincrement())\n indicatorId Int\n indicator Indicator @relation(fields: [indicatorId], references: [id], onDelete: Cascade)\n period String // \"2024\" | \"2024-Q1\" | \"2024-01\" | \"2024-01-15\"\n value Float\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([indicatorId, period])\n}\n\n// 新闻: 每天 3 点由 mx_finance_search_news 拉取, 按影响大小排序, 累加多日供首页无限滚动\nmodel News {\n id Int @id @default(autoincrement())\n title String\n summary String @default(\"\")\n content String? @db.Text\n source String @default(\"\")\n url String @default(\"\")\n publishedAt DateTime\n impactRank Int\n createdAt DateTime @default(now())\n\n @@unique([title, publishedAt])\n @@index([publishedAt])\n}\n\n// 报警: refresh 写库时比对同 (indicatorName, period) 的跨源数据, 差异超阈值记录\nmodel Alert {\n id Int @id @default(autoincrement())\n indicatorName String\n period String\n valueA Float\n valueB Float\n sourceA String\n sourceB String\n diff Float\n diffRatio Float\n createdAt DateTime @default(now())\n\n @@index([createdAt])\n}\n\n// 服务器监控: 对接 komari 公开 API\nmodel ServerNode {\n id Int @id @default(autoincrement())\n uuid String @unique\n name String\n cpuName String @default(\"\")\n os String @default(\"\")\n region String @default(\"\")\n memTotal BigInt @default(0)\n diskTotal BigInt @default(0)\n cpuCores Int @default(0)\n // 最新实时快照\n cpuUsage Float @default(0)\n ramUsed BigInt @default(0)\n swapUsed BigInt @default(0)\n load1 Float @default(0)\n load5 Float @default(0)\n load15 Float @default(0)\n diskUsed BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n uptime BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n status String @default(\"unknown\") // online | offline | unknown\n recordedAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 时序历史: 每节点每分钟一条 (komari records 1 分钟粒度)\nmodel ServerNodeHistory {\n id Int @id @default(autoincrement())\n uuid String\n period DateTime\n cpu Float @default(0)\n ram BigInt @default(0)\n load Float @default(0)\n disk BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n createdAt DateTime @default(now())\n\n @@unique([uuid, period])\n @@index([uuid, period])\n}\n\n// 服务健康检查: 本应用自检 (健康端点 / DB / 第三方)\nmodel ServiceCheck {\n id Int @id @default(autoincrement())\n name String @unique\n url String\n status String @default(\"unknown\") // up | down | unknown\n latencyMs Int @default(0)\n message String @default(\"\")\n lastCheckAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Econ_SowInventory {\n id Int @id @default(autoincrement())\n month String @unique\n inventory Int // 能繁母猪数量(万头)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ScraperCache {\n id Int @id @default(autoincrement())\n scraperName String @unique // 爬虫名称,如:sow-inventory\n lastDataHash String? // 上次数据指纹\n lastUpdateAt DateTime // 上次更新时间\n metadata Json? // 其他元数据\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 浙江省油价历史 (apizero price 接口每日抓取)\n// 每天 04:00 cron 触发: 检查 schedule 里待定且 <= 昨天的调价日, 抓 price?province=浙江 存本表\n// unique (date, province, fuel) 防重复\nmodel OilPriceHistory {\n id Int @id @default(autoincrement())\n date DateTime // 调价日次日 (即数据实际抓取日)\n province String // '浙江'\n fuel String // '92' | '95' | '0'\n price Float // 油价 (元/升, 4 位小数足够)\n source String @default(\"apizero\")\n createdAt DateTime @default(now())\n\n @@unique([date, province, fuel])\n @@index([province, fuel, date])\n}\n\n// ==================== 环境监控:米家 ====================\n\n// 米家授权状态 (DiskCache 存凭证, 本表只存状态/错误供前端展示)\nmodel MihomeAccount {\n id Int @id @default(autoincrement())\n key String @unique @default(\"default\")\n userId String @default(\"\")\n status String @default(\"unknown\") // ok | pending | expired\n lastError String @default(\"\")\n updatedAt DateTime @updatedAt\n}\n\nmodel MihomeHome {\n id Int @id @default(autoincrement())\n homeId String @unique\n name String\n createdAt DateTime @default(now())\n devices MihomeDevice[]\n}\n\nmodel MihomeDevice {\n id Int @id @default(autoincrement())\n did String @unique\n homeId String\n home MihomeHome @relation(fields: [homeId], references: [homeId])\n model String\n name String\n alias String? // 用户别名, 仅本应用展示\n tempSiid Int\n tempPiid Int\n humSiid Int\n humPiid Int\n battSiid Int // 电池电量属性 (炎米 3.1003 / 青萍 2.3)\n battPiid Int\n battery Int? // 最近一次电量 (每天读一次, 标题展示用)\n batteryAt DateTime? // 电量读取时间 (当天缓存, 不频繁更新)\n enabled Boolean @default(true)\n lastSyncAt DateTime?\n createdAt DateTime @default(now())\n samples MihomeEnvSample[]\n hours MihomeEnvHour[]\n}\n\n// 日档: 月视图(逐日)数据源; unique (deviceId, date) 防重\nmodel MihomeEnvSample {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n date DateTime // 采样日 (Asia/Shanghai 当日 00:00 存 UTC)\n temperature Float? // 当日最后一次实时值 (或 vendor hour 均值)\n humidity Float?\n temperatureAvg Float? // 当日均值 (由小时档聚合, 或 vendor_hour)\n humidityAvg Float?\n temperatureMin Float? // 当日最低\n temperatureMax Float? // 当日最高\n humidityMin Float?\n humidityMax Float?\n origin String @default(\"live\") // live | vendor_history | backfill\n sampledAt DateTime?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, date])\n @@index([deviceId, date])\n}\n\n// 小时档: 当天视图(逐小时)数据源; unique (deviceId, hour) 防重\nmodel MihomeEnvHour {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n hour DateTime // Asia/Shanghai 整点 (存 UTC)\n temperatureAvg Float? // 该小时均值 (live 采样点, 或 vendor_hour)\n humidityAvg Float?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, hour])\n @@index([deviceId, hour])\n}\n",
+ "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Get a free hosted Postgres database in seconds: `npx create-db`\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"mysql\"\n}\n\nmodel User {\n id Int @id @default(autoincrement())\n name String\n email String @unique\n password String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n // V0.2 打卡 / 清单: 用户删除时级联清理\n habits Habit[]\n checkIns CheckIn[]\n checkLists CheckList[]\n templates CheckListTemplate[]\n}\n\nmodel Article {\n id Int @id @default(autoincrement())\n title String\n slug String @unique\n content String\n date String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Strategy {\n id Int @id @default(autoincrement())\n name String\n description String\n data Json\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Indicator {\n id Int @id @default(autoincrement())\n name String @unique\n groupName String\n title String @default(\"\")\n unit String @default(\"\")\n source String @default(\"\")\n frequency String @default(\"month\") // year | quarter | month | day\n hidden Boolean @default(false) // true = 数据/脚本保留, 但不在前端展示\n points IndicatorPoint[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel IndicatorPoint {\n id Int @id @default(autoincrement())\n indicatorId Int\n indicator Indicator @relation(fields: [indicatorId], references: [id], onDelete: Cascade)\n period String // \"2024\" | \"2024-Q1\" | \"2024-01\" | \"2024-01-15\"\n value Float\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@unique([indicatorId, period])\n}\n\n// 新闻: 每天 3 点由 mx_finance_search_news 拉取, 按影响大小排序, 累加多日供首页无限滚动\nmodel News {\n id Int @id @default(autoincrement())\n title String\n summary String @default(\"\")\n content String? @db.Text\n source String @default(\"\")\n url String @default(\"\")\n publishedAt DateTime\n impactRank Int\n createdAt DateTime @default(now())\n\n @@unique([title, publishedAt])\n @@index([publishedAt])\n}\n\n// 报警: refresh 写库时比对同 (indicatorName, period) 的跨源数据, 差异超阈值记录\nmodel Alert {\n id Int @id @default(autoincrement())\n indicatorName String\n period String\n valueA Float\n valueB Float\n sourceA String\n sourceB String\n diff Float\n diffRatio Float\n createdAt DateTime @default(now())\n\n @@index([createdAt])\n}\n\n// 服务器监控: 对接 komari 公开 API\nmodel ServerNode {\n id Int @id @default(autoincrement())\n uuid String @unique\n name String\n cpuName String @default(\"\")\n os String @default(\"\")\n region String @default(\"\")\n memTotal BigInt @default(0)\n diskTotal BigInt @default(0)\n cpuCores Int @default(0)\n // 最新实时快照\n cpuUsage Float @default(0)\n ramUsed BigInt @default(0)\n swapUsed BigInt @default(0)\n load1 Float @default(0)\n load5 Float @default(0)\n load15 Float @default(0)\n diskUsed BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n uptime BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n status String @default(\"unknown\") // online | offline | unknown\n recordedAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 时序历史: 每节点每分钟一条 (komari records 1 分钟粒度)\nmodel ServerNodeHistory {\n id Int @id @default(autoincrement())\n uuid String\n period DateTime\n cpu Float @default(0)\n ram BigInt @default(0)\n load Float @default(0)\n disk BigInt @default(0)\n netIn BigInt @default(0)\n netOut BigInt @default(0)\n process Int @default(0)\n connections Int @default(0)\n createdAt DateTime @default(now())\n\n @@unique([uuid, period])\n @@index([uuid, period])\n}\n\n// 服务健康检查: 本应用自检 (健康端点 / DB / 第三方)\nmodel ServiceCheck {\n id Int @id @default(autoincrement())\n name String @unique\n url String\n status String @default(\"unknown\") // up | down | unknown\n latencyMs Int @default(0)\n message String @default(\"\")\n lastCheckAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Econ_SowInventory {\n id Int @id @default(autoincrement())\n month String @unique\n inventory Int // 能繁母猪数量(万头)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel ScraperCache {\n id Int @id @default(autoincrement())\n scraperName String @unique // 爬虫名称,如:sow-inventory\n lastDataHash String? // 上次数据指纹\n lastUpdateAt DateTime // 上次更新时间\n metadata Json? // 其他元数据\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\n// 浙江省油价历史 (apizero price 接口每日抓取)\n// 每天 04:00 cron 触发: 检查 schedule 里待定且 <= 昨天的调价日, 抓 price?province=浙江 存本表\n// unique (date, province, fuel) 防重复\nmodel OilPriceHistory {\n id Int @id @default(autoincrement())\n date DateTime // 调价日次日 (即数据实际抓取日)\n province String // '浙江'\n fuel String // '92' | '95' | '0'\n price Float // 油价 (元/升, 4 位小数足够)\n source String @default(\"apizero\")\n createdAt DateTime @default(now())\n\n @@unique([date, province, fuel])\n @@index([province, fuel, date])\n}\n\n// ==================== 环境监控:米家 ====================\n\n// 米家授权状态 (DiskCache 存凭证, 本表只存状态/错误供前端展示)\nmodel MihomeAccount {\n id Int @id @default(autoincrement())\n key String @unique @default(\"default\")\n userId String @default(\"\")\n status String @default(\"unknown\") // ok | pending | expired\n lastError String @default(\"\")\n updatedAt DateTime @updatedAt\n}\n\nmodel MihomeHome {\n id Int @id @default(autoincrement())\n homeId String @unique\n name String\n createdAt DateTime @default(now())\n devices MihomeDevice[]\n}\n\nmodel MihomeDevice {\n id Int @id @default(autoincrement())\n did String @unique\n homeId String\n home MihomeHome @relation(fields: [homeId], references: [homeId])\n model String\n name String\n alias String? // 用户别名, 仅本应用展示\n tempSiid Int\n tempPiid Int\n humSiid Int\n humPiid Int\n battSiid Int // 电池电量属性 (炎米 3.1003 / 青萍 2.3)\n battPiid Int\n battery Int? // 最近一次电量 (每天读一次, 标题展示用)\n batteryAt DateTime? // 电量读取时间 (当天缓存, 不频繁更新)\n enabled Boolean @default(true)\n lastSyncAt DateTime?\n createdAt DateTime @default(now())\n samples MihomeEnvSample[]\n hours MihomeEnvHour[]\n}\n\n// 日档: 月视图(逐日)数据源; unique (deviceId, date) 防重\nmodel MihomeEnvSample {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n date DateTime // 采样日 (Asia/Shanghai 当日 00:00 存 UTC)\n temperature Float? // 当日最后一次实时值 (或 vendor hour 均值)\n humidity Float?\n temperatureAvg Float? // 当日均值 (由小时档聚合, 或 vendor_hour)\n humidityAvg Float?\n temperatureMin Float? // 当日最低\n temperatureMax Float? // 当日最高\n humidityMin Float?\n humidityMax Float?\n origin String @default(\"live\") // live | vendor_history | backfill\n sampledAt DateTime?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, date])\n @@index([deviceId, date])\n}\n\n// 小时档: 当天视图(逐小时)数据源; unique (deviceId, hour) 防重\nmodel MihomeEnvHour {\n id Int @id @default(autoincrement())\n deviceId Int\n device MihomeDevice @relation(fields: [deviceId], references: [id], onDelete: Cascade)\n hour DateTime // Asia/Shanghai 整点 (存 UTC)\n temperatureAvg Float? // 该小时均值 (live 采样点, 或 vendor_hour)\n humidityAvg Float?\n raw Json?\n createdAt DateTime @default(now())\n\n @@unique([deviceId, hour])\n @@index([deviceId, hour])\n}\n\n// ==================== 打卡 / 日历 / 清单 (V0.2) ====================\n\n// 打卡项: 周期性目标 (每天 / 每周 / 每月 / 每年 n 次)\nmodel Habit {\n id Int @id @default(autoincrement())\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n name String\n period String @default(\"day\") // day | week | month | year\n target Int @default(1) // 周期内目标次数 n (>=1)\n color String @default(\"#1677ff\")\n icon String @default(\"\") // emoji 或图标名, 预留\n note String @default(\"\")\n archived Boolean @default(false) // 归档: 不出现在今日待办, 历史保留\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n records CheckIn[]\n\n @@index([userId, archived, sortOrder])\n}\n\n// 打卡记录: 一次打卡 = 一条; 同日多次 => seq 递增 (1..n, 超额继续累加)\nmodel CheckIn {\n id Int @id @default(autoincrement())\n habitId Int\n habit Habit @relation(fields: [habitId], references: [id], onDelete: Cascade)\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n date String @db.VarChar(10) // 本地日历日 \"YYYY-MM-DD\" (Asia/Shanghai)\n seq Int @default(1) // 当日第几次\n note String @default(\"\")\n source String @default(\"user\") // user | backfill (补打)\n createdAt DateTime @default(now())\n\n @@unique([habitId, date, seq])\n @@index([userId, date])\n @@index([habitId, date])\n}\n\n// 检查清单: 出差 / 回老家 等场景的一次性清单\nmodel CheckList {\n id Int @id @default(autoincrement())\n userId Int\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n title String\n scene String @default(\"\") // 出差 | 回老家 | 自定义\n note String @default(\"\")\n archived Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n items CheckListItem[]\n\n @@index([userId, archived])\n}\n\n// 检查项: 勾选即完成\nmodel CheckListItem {\n id Int @id @default(autoincrement())\n listId Int\n list CheckList @relation(fields: [listId], references: [id], onDelete: Cascade)\n title String\n note String @default(\"\")\n done Boolean @default(false)\n doneAt DateTime?\n sortOrder Int @default(0)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([listId, sortOrder])\n}\n\n// 清单模板: builtin = 系统预置 (userId 为空); 否则为用户自定义\nmodel CheckListTemplate {\n id Int @id @default(autoincrement())\n userId Int?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n name String\n scene String @default(\"\")\n items Json // [{ title, note }]\n builtin Boolean @default(false)\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId, builtin])\n}\n",
"runtimeDataModel": {
"models": {},
"enums": {},
@@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = {
}
}
-config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Article\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Strategy\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Indicator\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groupName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"unit\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"frequency\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"hidden\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"points\",\"kind\":\"object\",\"type\":\"IndicatorPoint\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"IndicatorPoint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicator\",\"kind\":\"object\",\"type\":\"Indicator\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"News\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"summary\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"impactRank\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Alert\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"valueA\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"valueB\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"sourceA\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceB\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"diff\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diffRatio\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cpuName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"os\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"region\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"diskTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"cpuCores\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cpuUsage\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ramUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"swapUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load1\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load5\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load15\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diskUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"uptime\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"recordedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNodeHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"cpu\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ram\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"disk\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServiceCheck\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"latencyMs\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"message\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastCheckAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Econ_SowInventory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"month\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inventory\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ScraperCache\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scraperName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastDataHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastUpdateAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OilPriceHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"province\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fuel\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeAccount\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastError\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeHome\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"devices\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeHome\"}],\"dbName\":null},\"MihomeDevice\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"did\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"home\",\"kind\":\"object\",\"type\":\"MihomeHome\",\"relationName\":\"MihomeDeviceToMihomeHome\"},{\"name\":\"model\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"alias\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tempSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tempPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battery\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"batteryAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lastSyncAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"samples\",\"kind\":\"object\",\"type\":\"MihomeEnvSample\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"hours\",\"kind\":\"object\",\"type\":\"MihomeEnvHour\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"}],\"dbName\":null},\"MihomeEnvSample\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperature\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidity\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"origin\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sampledAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeEnvHour\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"},{\"name\":\"hour\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
+config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"habits\",\"kind\":\"object\",\"type\":\"Habit\",\"relationName\":\"HabitToUser\"},{\"name\":\"checkIns\",\"kind\":\"object\",\"type\":\"CheckIn\",\"relationName\":\"CheckInToUser\"},{\"name\":\"checkLists\",\"kind\":\"object\",\"type\":\"CheckList\",\"relationName\":\"CheckListToUser\"},{\"name\":\"templates\",\"kind\":\"object\",\"type\":\"CheckListTemplate\",\"relationName\":\"CheckListTemplateToUser\"}],\"dbName\":null},\"Article\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Strategy\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"data\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Indicator\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"groupName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"unit\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"frequency\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"hidden\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"points\",\"kind\":\"object\",\"type\":\"IndicatorPoint\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"IndicatorPoint\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicator\",\"kind\":\"object\",\"type\":\"Indicator\",\"relationName\":\"IndicatorToIndicatorPoint\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"News\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"summary\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"publishedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"impactRank\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Alert\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"indicatorName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"valueA\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"valueB\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"sourceA\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sourceB\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"diff\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diffRatio\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNode\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"cpuName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"os\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"region\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"memTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"diskTotal\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"cpuCores\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"cpuUsage\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ramUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"swapUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load1\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load5\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"load15\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"diskUsed\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"uptime\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"recordedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServerNodeHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"uuid\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"cpu\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"ram\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"load\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"disk\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netIn\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"netOut\",\"kind\":\"scalar\",\"type\":\"BigInt\"},{\"name\":\"process\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"connections\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ServiceCheck\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"url\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"latencyMs\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"message\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastCheckAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Econ_SowInventory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"month\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"inventory\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ScraperCache\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"scraperName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastDataHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastUpdateAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"metadata\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"OilPriceHistory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"province\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fuel\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeAccount\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastError\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeHome\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"devices\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeHome\"}],\"dbName\":null},\"MihomeDevice\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"did\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"homeId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"home\",\"kind\":\"object\",\"type\":\"MihomeHome\",\"relationName\":\"MihomeDeviceToMihomeHome\"},{\"name\":\"model\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"alias\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tempSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"tempPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"humPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battSiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battPiid\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"battery\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"batteryAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"enabled\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"lastSyncAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"samples\",\"kind\":\"object\",\"type\":\"MihomeEnvSample\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"hours\",\"kind\":\"object\",\"type\":\"MihomeEnvHour\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"}],\"dbName\":null},\"MihomeEnvSample\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvSample\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperature\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidity\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"temperatureMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMin\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityMax\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"origin\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sampledAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"MihomeEnvHour\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"deviceId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"device\",\"kind\":\"object\",\"type\":\"MihomeDevice\",\"relationName\":\"MihomeDeviceToMihomeEnvHour\"},{\"name\":\"hour\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"temperatureAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"humidityAvg\",\"kind\":\"scalar\",\"type\":\"Float\"},{\"name\":\"raw\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"Habit\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"HabitToUser\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"period\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"target\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"color\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"icon\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"records\",\"kind\":\"object\",\"type\":\"CheckIn\",\"relationName\":\"CheckInToHabit\"}],\"dbName\":null},\"CheckIn\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"habitId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"habit\",\"kind\":\"object\",\"type\":\"Habit\",\"relationName\":\"CheckInToHabit\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckInToUser\"},{\"name\":\"date\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"seq\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"source\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"CheckList\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckListToUser\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scene\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"archived\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"items\",\"kind\":\"object\",\"type\":\"CheckListItem\",\"relationName\":\"CheckListToCheckListItem\"}],\"dbName\":null},\"CheckListItem\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"listId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"list\",\"kind\":\"object\",\"type\":\"CheckList\",\"relationName\":\"CheckListToCheckListItem\"},{\"name\":\"title\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"note\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"done\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"doneAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"CheckListTemplate\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"CheckListTemplateToUser\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"scene\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"items\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"builtin\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null}},\"enums\":{},\"types\":{}}")
config.parameterizationSchema = {
- strings: JSON.parse("[\"where\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"orderBy\",\"cursor\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.updateOne\",\"User.updateMany\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_count\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Article.findUnique\",\"Article.findUniqueOrThrow\",\"Article.findFirst\",\"Article.findFirstOrThrow\",\"Article.findMany\",\"Article.createOne\",\"Article.createMany\",\"Article.updateOne\",\"Article.updateMany\",\"Article.upsertOne\",\"Article.deleteOne\",\"Article.deleteMany\",\"Article.groupBy\",\"Article.aggregate\",\"Strategy.findUnique\",\"Strategy.findUniqueOrThrow\",\"Strategy.findFirst\",\"Strategy.findFirstOrThrow\",\"Strategy.findMany\",\"Strategy.createOne\",\"Strategy.createMany\",\"Strategy.updateOne\",\"Strategy.updateMany\",\"Strategy.upsertOne\",\"Strategy.deleteOne\",\"Strategy.deleteMany\",\"Strategy.groupBy\",\"Strategy.aggregate\",\"indicator\",\"points\",\"Indicator.findUnique\",\"Indicator.findUniqueOrThrow\",\"Indicator.findFirst\",\"Indicator.findFirstOrThrow\",\"Indicator.findMany\",\"Indicator.createOne\",\"Indicator.createMany\",\"Indicator.updateOne\",\"Indicator.updateMany\",\"Indicator.upsertOne\",\"Indicator.deleteOne\",\"Indicator.deleteMany\",\"Indicator.groupBy\",\"Indicator.aggregate\",\"IndicatorPoint.findUnique\",\"IndicatorPoint.findUniqueOrThrow\",\"IndicatorPoint.findFirst\",\"IndicatorPoint.findFirstOrThrow\",\"IndicatorPoint.findMany\",\"IndicatorPoint.createOne\",\"IndicatorPoint.createMany\",\"IndicatorPoint.updateOne\",\"IndicatorPoint.updateMany\",\"IndicatorPoint.upsertOne\",\"IndicatorPoint.deleteOne\",\"IndicatorPoint.deleteMany\",\"IndicatorPoint.groupBy\",\"IndicatorPoint.aggregate\",\"News.findUnique\",\"News.findUniqueOrThrow\",\"News.findFirst\",\"News.findFirstOrThrow\",\"News.findMany\",\"News.createOne\",\"News.createMany\",\"News.updateOne\",\"News.updateMany\",\"News.upsertOne\",\"News.deleteOne\",\"News.deleteMany\",\"News.groupBy\",\"News.aggregate\",\"Alert.findUnique\",\"Alert.findUniqueOrThrow\",\"Alert.findFirst\",\"Alert.findFirstOrThrow\",\"Alert.findMany\",\"Alert.createOne\",\"Alert.createMany\",\"Alert.updateOne\",\"Alert.updateMany\",\"Alert.upsertOne\",\"Alert.deleteOne\",\"Alert.deleteMany\",\"Alert.groupBy\",\"Alert.aggregate\",\"ServerNode.findUnique\",\"ServerNode.findUniqueOrThrow\",\"ServerNode.findFirst\",\"ServerNode.findFirstOrThrow\",\"ServerNode.findMany\",\"ServerNode.createOne\",\"ServerNode.createMany\",\"ServerNode.updateOne\",\"ServerNode.updateMany\",\"ServerNode.upsertOne\",\"ServerNode.deleteOne\",\"ServerNode.deleteMany\",\"ServerNode.groupBy\",\"ServerNode.aggregate\",\"ServerNodeHistory.findUnique\",\"ServerNodeHistory.findUniqueOrThrow\",\"ServerNodeHistory.findFirst\",\"ServerNodeHistory.findFirstOrThrow\",\"ServerNodeHistory.findMany\",\"ServerNodeHistory.createOne\",\"ServerNodeHistory.createMany\",\"ServerNodeHistory.updateOne\",\"ServerNodeHistory.updateMany\",\"ServerNodeHistory.upsertOne\",\"ServerNodeHistory.deleteOne\",\"ServerNodeHistory.deleteMany\",\"ServerNodeHistory.groupBy\",\"ServerNodeHistory.aggregate\",\"ServiceCheck.findUnique\",\"ServiceCheck.findUniqueOrThrow\",\"ServiceCheck.findFirst\",\"ServiceCheck.findFirstOrThrow\",\"ServiceCheck.findMany\",\"ServiceCheck.createOne\",\"ServiceCheck.createMany\",\"ServiceCheck.updateOne\",\"ServiceCheck.updateMany\",\"ServiceCheck.upsertOne\",\"ServiceCheck.deleteOne\",\"ServiceCheck.deleteMany\",\"ServiceCheck.groupBy\",\"ServiceCheck.aggregate\",\"Econ_SowInventory.findUnique\",\"Econ_SowInventory.findUniqueOrThrow\",\"Econ_SowInventory.findFirst\",\"Econ_SowInventory.findFirstOrThrow\",\"Econ_SowInventory.findMany\",\"Econ_SowInventory.createOne\",\"Econ_SowInventory.createMany\",\"Econ_SowInventory.updateOne\",\"Econ_SowInventory.updateMany\",\"Econ_SowInventory.upsertOne\",\"Econ_SowInventory.deleteOne\",\"Econ_SowInventory.deleteMany\",\"Econ_SowInventory.groupBy\",\"Econ_SowInventory.aggregate\",\"ScraperCache.findUnique\",\"ScraperCache.findUniqueOrThrow\",\"ScraperCache.findFirst\",\"ScraperCache.findFirstOrThrow\",\"ScraperCache.findMany\",\"ScraperCache.createOne\",\"ScraperCache.createMany\",\"ScraperCache.updateOne\",\"ScraperCache.updateMany\",\"ScraperCache.upsertOne\",\"ScraperCache.deleteOne\",\"ScraperCache.deleteMany\",\"ScraperCache.groupBy\",\"ScraperCache.aggregate\",\"OilPriceHistory.findUnique\",\"OilPriceHistory.findUniqueOrThrow\",\"OilPriceHistory.findFirst\",\"OilPriceHistory.findFirstOrThrow\",\"OilPriceHistory.findMany\",\"OilPriceHistory.createOne\",\"OilPriceHistory.createMany\",\"OilPriceHistory.updateOne\",\"OilPriceHistory.updateMany\",\"OilPriceHistory.upsertOne\",\"OilPriceHistory.deleteOne\",\"OilPriceHistory.deleteMany\",\"OilPriceHistory.groupBy\",\"OilPriceHistory.aggregate\",\"MihomeAccount.findUnique\",\"MihomeAccount.findUniqueOrThrow\",\"MihomeAccount.findFirst\",\"MihomeAccount.findFirstOrThrow\",\"MihomeAccount.findMany\",\"MihomeAccount.createOne\",\"MihomeAccount.createMany\",\"MihomeAccount.updateOne\",\"MihomeAccount.updateMany\",\"MihomeAccount.upsertOne\",\"MihomeAccount.deleteOne\",\"MihomeAccount.deleteMany\",\"MihomeAccount.groupBy\",\"MihomeAccount.aggregate\",\"home\",\"device\",\"samples\",\"hours\",\"devices\",\"MihomeHome.findUnique\",\"MihomeHome.findUniqueOrThrow\",\"MihomeHome.findFirst\",\"MihomeHome.findFirstOrThrow\",\"MihomeHome.findMany\",\"MihomeHome.createOne\",\"MihomeHome.createMany\",\"MihomeHome.updateOne\",\"MihomeHome.updateMany\",\"MihomeHome.upsertOne\",\"MihomeHome.deleteOne\",\"MihomeHome.deleteMany\",\"MihomeHome.groupBy\",\"MihomeHome.aggregate\",\"MihomeDevice.findUnique\",\"MihomeDevice.findUniqueOrThrow\",\"MihomeDevice.findFirst\",\"MihomeDevice.findFirstOrThrow\",\"MihomeDevice.findMany\",\"MihomeDevice.createOne\",\"MihomeDevice.createMany\",\"MihomeDevice.updateOne\",\"MihomeDevice.updateMany\",\"MihomeDevice.upsertOne\",\"MihomeDevice.deleteOne\",\"MihomeDevice.deleteMany\",\"MihomeDevice.groupBy\",\"MihomeDevice.aggregate\",\"MihomeEnvSample.findUnique\",\"MihomeEnvSample.findUniqueOrThrow\",\"MihomeEnvSample.findFirst\",\"MihomeEnvSample.findFirstOrThrow\",\"MihomeEnvSample.findMany\",\"MihomeEnvSample.createOne\",\"MihomeEnvSample.createMany\",\"MihomeEnvSample.updateOne\",\"MihomeEnvSample.updateMany\",\"MihomeEnvSample.upsertOne\",\"MihomeEnvSample.deleteOne\",\"MihomeEnvSample.deleteMany\",\"MihomeEnvSample.groupBy\",\"MihomeEnvSample.aggregate\",\"MihomeEnvHour.findUnique\",\"MihomeEnvHour.findUniqueOrThrow\",\"MihomeEnvHour.findFirst\",\"MihomeEnvHour.findFirstOrThrow\",\"MihomeEnvHour.findMany\",\"MihomeEnvHour.createOne\",\"MihomeEnvHour.createMany\",\"MihomeEnvHour.updateOne\",\"MihomeEnvHour.updateMany\",\"MihomeEnvHour.upsertOne\",\"MihomeEnvHour.deleteOne\",\"MihomeEnvHour.deleteMany\",\"MihomeEnvHour.groupBy\",\"MihomeEnvHour.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"deviceId\",\"hour\",\"temperatureAvg\",\"humidityAvg\",\"raw\",\"createdAt\",\"equals\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"in\",\"notIn\",\"date\",\"temperature\",\"humidity\",\"temperatureMin\",\"temperatureMax\",\"humidityMin\",\"humidityMax\",\"origin\",\"sampledAt\",\"contains\",\"startsWith\",\"endsWith\",\"search\",\"did\",\"homeId\",\"model\",\"name\",\"alias\",\"tempSiid\",\"tempPiid\",\"humSiid\",\"humPiid\",\"battSiid\",\"battPiid\",\"battery\",\"batteryAt\",\"enabled\",\"lastSyncAt\",\"every\",\"some\",\"none\",\"deviceId_hour\",\"deviceId_date\",\"key\",\"userId\",\"status\",\"lastError\",\"updatedAt\",\"province\",\"fuel\",\"price\",\"source\",\"date_province_fuel\",\"scraperName\",\"lastDataHash\",\"lastUpdateAt\",\"metadata\",\"month\",\"inventory\",\"url\",\"latencyMs\",\"message\",\"lastCheckAt\",\"uuid\",\"period\",\"cpu\",\"ram\",\"load\",\"disk\",\"netIn\",\"netOut\",\"process\",\"connections\",\"uuid_period\",\"cpuName\",\"os\",\"region\",\"memTotal\",\"diskTotal\",\"cpuCores\",\"cpuUsage\",\"ramUsed\",\"swapUsed\",\"load1\",\"load5\",\"load15\",\"diskUsed\",\"uptime\",\"recordedAt\",\"indicatorName\",\"valueA\",\"valueB\",\"sourceA\",\"sourceB\",\"diff\",\"diffRatio\",\"title\",\"summary\",\"content\",\"publishedAt\",\"impactRank\",\"title_publishedAt\",\"indicatorId\",\"value\",\"groupName\",\"unit\",\"frequency\",\"hidden\",\"indicatorId_period\",\"description\",\"slug\",\"email\",\"password\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"_relevance\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"),
- graph: "2gWUAfwBCY8CAACFBAAwkAIAAAQAEJECAACFBAAwkgICAAAAAZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIYwDAQAAAAGNAwEAyAMAIQEAAAABACABAAAAAQAgCY8CAACFBAAwkAIAAAQAEJECAACFBAAwkgICAMcDACGYAkAAyQMAIbcCAQDIAwAhzAJAAMkDACGMAwEAyAMAIY0DAQDIAwAhAZkDAADCBQAgAwAAAAQAIAMAAAUAMAQAAAEAIAMAAAAEACADAAAFADAEAAABACADAAAABAAgAwAABQAwBAAAAQAgBpICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAGMAwEAAAABjQMBAAAAAQEIAAAJACAGkgICAAAAAZgCQAAAAAG3AgEAAAABzAJAAAAAAYwDAQAAAAGNAwEAAAABAQgAAAsAMAaSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHMAkAAjAQAIYwDAQCWBAAhjQMBAJYEACECAAAAAQAgCAAADQAgBpICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcwCQACMBAAhjAMBAJYEACGNAwEAlgQAIQIAAAAEACAIAAAPACADAAAAAQAgDQAACQAgDgAADQAgAQAAAAEAIAEAAAAEACAFEwAAvQUAIBQAAL4FACAVAADBBQAgFgAAwAUAIBcAAL8FACAJjwIAAIQEADCQAgAAFQAQkQIAAIQEADCSAgIAqAMAIZgCQACpAwAhtwIBALYDACHMAkAAqQMAIYwDAQC2AwAhjQMBALYDACEDAAAABAAgAwAAFAAwEgAAFQAgAwAAAAQAIAMAAAUAMAQAAAEAIAqPAgAAgwQAMJACAAAbABCRAgAAgwQAMJICAgAAAAGYAkAAyQMAIacCAQDIAwAhzAJAAMkDACH9AgEAyAMAIf8CAQDIAwAhiwMBAAAAAQEAAAAYACABAAAAGAAgCo8CAACDBAAwkAIAABsAEJECAACDBAAwkgICAMcDACGYAkAAyQMAIacCAQDIAwAhzAJAAMkDACH9AgEAyAMAIf8CAQDIAwAhiwMBAMgDACEBmQMAALwFACADAAAAGwAgAwAAHAAwBAAAGAAgAwAAABsAIAMAABwAMAQAABgAIAMAAAAbACADAAAcADAEAAAYACAHkgICAAAAAZgCQAAAAAGnAgEAAAABzAJAAAAAAf0CAQAAAAH_AgEAAAABiwMBAAAAAQEIAAAgACAHkgICAAAAAZgCQAAAAAGnAgEAAAABzAJAAAAAAf0CAQAAAAH_AgEAAAABiwMBAAAAAQEIAAAiADAHkgICAI4EACGYAkAAjAQAIacCAQCWBAAhzAJAAIwEACH9AgEAlgQAIf8CAQCWBAAhiwMBAJYEACECAAAAGAAgCAAAJAAgB5ICAgCOBAAhmAJAAIwEACGnAgEAlgQAIcwCQACMBAAh_QIBAJYEACH_AgEAlgQAIYsDAQCWBAAhAgAAABsAIAgAACYAIAMAAAAYACANAAAgACAOAAAkACABAAAAGAAgAQAAABsAIAUTAAC3BQAgFAAAuAUAIBUAALsFACAWAAC6BQAgFwAAuQUAIAqPAgAAggQAMJACAAAsABCRAgAAggQAMJICAgCoAwAhmAJAAKkDACGnAgEAtgMAIcwCQACpAwAh_QIBALYDACH_AgEAtgMAIYsDAQC2AwAhAwAAABsAIAMAACsAMBIAACwAIAMAAAAbACADAAAcADAEAAAYACAJCAAAgQQAII8CAACABAAwkAIAADIAEJECAACABAAwkgICAAAAAZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIYoDAQDIAwAhAQAAAC8AIAEAAAAvACAJCAAAgQQAII8CAACABAAwkAIAADIAEJECAACABAAwkgICAMcDACGYAkAAyQMAIbcCAQDIAwAhzAJAAMkDACGKAwEAyAMAIQGZAwAAtgUAIAMAAAAyACADAAAzADAEAAAvACADAAAAMgAgAwAAMwAwBAAALwAgAwAAADIAIAMAADMAMAQAAC8AIAYIgAAAAAGSAgIAAAABmAJAAAAAAbcCAQAAAAHMAkAAAAABigMBAAAAAQEIAAA3ACAGCIAAAAABkgICAAAAAZgCQAAAAAG3AgEAAAABzAJAAAAAAYoDAQAAAAEBCAAAOQAwBgiAAAAAAZICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcwCQACMBAAhigMBAJYEACECAAAALwAgCAAAOwAgBgiAAAAAAZICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcwCQACMBAAhigMBAJYEACECAAAAMgAgCAAAPQAgAwAAAC8AIA0AADcAIA4AADsAIAEAAAAvACABAAAAMgAgBRMAALEFACAUAACyBQAgFQAAtQUAIBYAALQFACAXAACzBQAgCQgAAP4DACCPAgAA_QMAMJACAABDABCRAgAA_QMAMJICAgCoAwAhmAJAAKkDACG3AgEAtgMAIcwCQACpAwAhigMBALYDACEDAAAAMgAgAwAAQgAwEgAAQwAgAwAAADIAIAMAADMAMAQAAC8AIA43AAD5AwAgjwIAAPgDADCQAgAATgAQkQIAAPgDADCSAgIAAAABmAJAAMkDACG3AgEAAAABzAJAAMkDACHQAgEAyAMAIf0CAQDIAwAhhQMBAMgDACGGAwEAyAMAIYcDAQDIAwAhiAMgANYDACEBAAAARgAgCjYAAPwDACCPAgAA-wMAMJACAABIABCRAgAA-wMAMJICAgDHAwAhmAJAAMkDACHMAkAAyQMAId0CAQDIAwAhgwMCAMcDACGEAwgA4AMAIQI2AACvBQAgmQMAALAFACALNgAA_AMAII8CAAD7AwAwkAIAAEgAEJECAAD7AwAwkgICAAAAAZgCQADJAwAhzAJAAMkDACHdAgEAyAMAIYMDAgDHAwAhhAMIAOADACGJAwAA-gMAIAMAAABIACADAABJADAEAABKACABAAAASAAgAQAAAEYAIA43AAD5AwAgjwIAAPgDADCQAgAATgAQkQIAAPgDADCSAgIAxwMAIZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIdACAQDIAwAh_QIBAMgDACGFAwEAyAMAIYYDAQDIAwAhhwMBAMgDACGIAyAA1gMAIQI3AACtBQAgmQMAAK4FACADAAAATgAgAwAATwAwBAAARgAgAwAAAE4AIAMAAE8AMAQAAEYAIAMAAABOACADAABPADAEAABGACALNwAArAUAIJICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAHQAgEAAAAB_QIBAAAAAYUDAQAAAAGGAwEAAAABhwMBAAAAAYgDIAAAAAEBCAAAUwAgCpICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAHQAgEAAAAB_QIBAAAAAYUDAQAAAAGGAwEAAAABhwMBAAAAAYgDIAAAAAEBCAAAVQAwCzcAAJ8FACCSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHMAkAAjAQAIdACAQCWBAAh_QIBAJYEACGFAwEAlgQAIYYDAQCWBAAhhwMBAJYEACGIAyAAoQQAIQIAAABGACAIAABXACAKkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhzAJAAIwEACHQAgEAlgQAIf0CAQCWBAAhhQMBAJYEACGGAwEAlgQAIYcDAQCWBAAhiAMgAKEEACECAAAATgAgCAAAWQAgAwAAAEYAIA0AAFMAIA4AAFcAIAEAAABGACABAAAATgAgBRMAAJoFACAUAACbBQAgFQAAngUAIBYAAJ0FACAXAACcBQAgDY8CAAD3AwAwkAIAAF8AEJECAAD3AwAwkgICAKgDACGYAkAAqQMAIbcCAQC2AwAhzAJAAKkDACHQAgEAtgMAIf0CAQC2AwAhhQMBALYDACGGAwEAtgMAIYcDAQC2AwAhiAMgAL8DACEDAAAATgAgAwAAXgAwEgAAXwAgAwAAAE4AIAMAAE8AMAQAAEYAIAEAAABKACABAAAASgAgAwAAAEgAIAMAAEkAMAQAAEoAIAMAAABIACADAABJADAEAABKACADAAAASAAgAwAASQAwBAAASgAgBzYAAJkFACCSAgIAAAABmAJAAAAAAcwCQAAAAAHdAgEAAAABgwMCAAAAAYQDCAAAAAEBCAAAZwAgBpICAgAAAAGYAkAAAAABzAJAAAAAAd0CAQAAAAGDAwIAAAABhAMIAAAAAQEIAABpADAHNgAAmAUAIJICAgCOBAAhmAJAAIwEACHMAkAAjAQAId0CAQCWBAAhgwMCAI4EACGEAwgA5gQAIQIAAABKACAIAABrACAGkgICAI4EACGYAkAAjAQAIcwCQACMBAAh3QIBAJYEACGDAwIAjgQAIYQDCADmBAAhAgAAAEgAIAgAAG0AIAMAAABKACANAABnACAOAABrACABAAAASgAgAQAAAEgAIAUTAACTBQAgFAAAlAUAIBUAAJcFACAWAACWBQAgFwAAlQUAIAmPAgAA9gMAMJACAABzABCRAgAA9gMAMJICAgCoAwAhmAJAAKkDACHMAkAAqQMAId0CAQC2AwAhgwMCAKgDACGEAwgA3QMAIQMAAABIACADAAByADASAABzACADAAAASAAgAwAASQAwBAAASgAgDY8CAAD0AwAwkAIAAHkAEJECAAD0AwAwkgICAAAAAZgCQADJAwAh0AIBAMgDACHYAgEAyAMAIf0CAQDIAwAh_gIBAMgDACH_AgEA1AMAIYADQADJAwAhgQMCAMcDACGCAwAA9QMAIAEAAAB2ACABAAAAdgAgDI8CAAD0AwAwkAIAAHkAEJECAAD0AwAwkgICAMcDACGYAkAAyQMAIdACAQDIAwAh2AIBAMgDACH9AgEAyAMAIf4CAQDIAwAh_wIBANQDACGAA0AAyQMAIYEDAgDHAwAhAv8CAACGBAAgmQMAAJIFACADAAAAeQAgAwAAegAwBAAAdgAgAwAAAHkAIAMAAHoAMAQAAHYAIAMAAAB5ACADAAB6ADAEAAB2ACAJkgICAAAAAZgCQAAAAAHQAgEAAAAB2AIBAAAAAf0CAQAAAAH-AgEAAAAB_wIBAAAAAYADQAAAAAGBAwIAAAABAQgAAH4AIAmSAgIAAAABmAJAAAAAAdACAQAAAAHYAgEAAAAB_QIBAAAAAf4CAQAAAAH_AgEAAAABgANAAAAAAYEDAgAAAAEBCAAAgAEAMAmSAgIAjgQAIZgCQACMBAAh0AIBAJYEACHYAgEAlgQAIf0CAQCWBAAh_gIBAJYEACH_AgEAnwQAIYADQACMBAAhgQMCAI4EACECAAAAdgAgCAAAggEAIAmSAgIAjgQAIZgCQACMBAAh0AIBAJYEACHYAgEAlgQAIf0CAQCWBAAh_gIBAJYEACH_AgEAnwQAIYADQACMBAAhgQMCAI4EACECAAAAeQAgCAAAhAEAIAMAAAB2ACANAAB-ACAOAACCAQAgAQAAAHYAIAEAAAB5ACAGEwAAjQUAIBQAAI4FACAVAACRBQAgFgAAkAUAIBcAAI8FACD_AgAAhgQAIAyPAgAA8wMAMJACAACKAQAQkQIAAPMDADCSAgIAqAMAIZgCQACpAwAh0AIBALYDACHYAgEAtgMAIf0CAQC2AwAh_gIBALYDACH_AgEAvQMAIYADQACpAwAhgQMCAKgDACEDAAAAeQAgAwAAiQEAMBIAAIoBACADAAAAeQAgAwAAegAwBAAAdgAgDY8CAADyAwAwkAIAAJABABCRAgAA8gMAMJICAgAAAAGYAkAAyQMAId0CAQDIAwAh9gIBAMgDACH3AggA4AMAIfgCCADgAwAh-QIBAMgDACH6AgEAyAMAIfsCCADgAwAh_AIIAOADACEBAAAAjQEAIAEAAACNAQAgDY8CAADyAwAwkAIAAJABABCRAgAA8gMAMJICAgDHAwAhmAJAAMkDACHdAgEAyAMAIfYCAQDIAwAh9wIIAOADACH4AggA4AMAIfkCAQDIAwAh-gIBAMgDACH7AggA4AMAIfwCCADgAwAhAZkDAACMBQAgAwAAAJABACADAACRAQAwBAAAjQEAIAMAAACQAQAgAwAAkQEAMAQAAI0BACADAAAAkAEAIAMAAJEBADAEAACNAQAgCpICAgAAAAGYAkAAAAAB3QIBAAAAAfYCAQAAAAH3AggAAAAB-AIIAAAAAfkCAQAAAAH6AgEAAAAB-wIIAAAAAfwCCAAAAAEBCAAAlQEAIAqSAgIAAAABmAJAAAAAAd0CAQAAAAH2AgEAAAAB9wIIAAAAAfgCCAAAAAH5AgEAAAAB-gIBAAAAAfsCCAAAAAH8AggAAAABAQgAAJcBADAKkgICAI4EACGYAkAAjAQAId0CAQCWBAAh9gIBAJYEACH3AggA5gQAIfgCCADmBAAh-QIBAJYEACH6AgEAlgQAIfsCCADmBAAh_AIIAOYEACECAAAAjQEAIAgAAJkBACAKkgICAI4EACGYAkAAjAQAId0CAQCWBAAh9gIBAJYEACH3AggA5gQAIfgCCADmBAAh-QIBAJYEACH6AgEAlgQAIfsCCADmBAAh_AIIAOYEACECAAAAkAEAIAgAAJsBACADAAAAjQEAIA0AAJUBACAOAACZAQAgAQAAAI0BACABAAAAkAEAIAUTAACHBQAgFAAAiAUAIBUAAIsFACAWAACKBQAgFwAAiQUAIA2PAgAA8QMAMJACAAChAQAQkQIAAPEDADCSAgIAqAMAIZgCQACpAwAh3QIBALYDACH2AgEAtgMAIfcCCADdAwAh-AIIAN0DACH5AgEAtgMAIfoCAQC2AwAh-wIIAN0DACH8AggA3QMAIQMAAACQAQAgAwAAoAEAMBIAAKEBACADAAAAkAEAIAMAAJEBADAEAACNAQAgHI8CAADwAwAwkAIAAKcBABCRAgAA8AMAMJICAgAAAAGYAkAAyQMAIbcCAQDIAwAhygIBAMgDACHMAkAAyQMAIdwCAQAAAAHiAgQA7QMAIeMCBADtAwAh5AICAMcDACHlAgIAxwMAIecCAQDIAwAh6AIBAMgDACHpAgEAyAMAIeoCBADtAwAh6wIEAO0DACHsAgIAxwMAIe0CCADgAwAh7gIEAO0DACHvAgQA7QMAIfACCADgAwAh8QIIAOADACHyAggA4AMAIfMCBADtAwAh9AIEAO0DACH1AkAAyQMAIQEAAACkAQAgAQAAAKQBACAcjwIAAPADADCQAgAApwEAEJECAADwAwAwkgICAMcDACGYAkAAyQMAIbcCAQDIAwAhygIBAMgDACHMAkAAyQMAIdwCAQDIAwAh4gIEAO0DACHjAgQA7QMAIeQCAgDHAwAh5QICAMcDACHnAgEAyAMAIegCAQDIAwAh6QIBAMgDACHqAgQA7QMAIesCBADtAwAh7AICAMcDACHtAggA4AMAIe4CBADtAwAh7wIEAO0DACHwAggA4AMAIfECCADgAwAh8gIIAOADACHzAgQA7QMAIfQCBADtAwAh9QJAAMkDACEBmQMAAIYFACADAAAApwEAIAMAAKgBADAEAACkAQAgAwAAAKcBACADAACoAQAwBAAApAEAIAMAAACnAQAgAwAAqAEAMAQAAKQBACAZkgICAAAAAZgCQAAAAAG3AgEAAAABygIBAAAAAcwCQAAAAAHcAgEAAAAB4gIEAAAAAeMCBAAAAAHkAgIAAAAB5QICAAAAAecCAQAAAAHoAgEAAAAB6QIBAAAAAeoCBAAAAAHrAgQAAAAB7AICAAAAAe0CCAAAAAHuAgQAAAAB7wIEAAAAAfACCAAAAAHxAggAAAAB8gIIAAAAAfMCBAAAAAH0AgQAAAAB9QJAAAAAAQEIAACsAQAgGZICAgAAAAGYAkAAAAABtwIBAAAAAcoCAQAAAAHMAkAAAAAB3AIBAAAAAeICBAAAAAHjAgQAAAAB5AICAAAAAeUCAgAAAAHnAgEAAAAB6AIBAAAAAekCAQAAAAHqAgQAAAAB6wIEAAAAAewCAgAAAAHtAggAAAAB7gIEAAAAAe8CBAAAAAHwAggAAAAB8QIIAAAAAfICCAAAAAHzAgQAAAAB9AIEAAAAAfUCQAAAAAEBCAAArgEAMBmSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHKAgEAlgQAIcwCQACMBAAh3AIBAJYEACHiAgQA_wQAIeMCBAD_BAAh5AICAI4EACHlAgIAjgQAIecCAQCWBAAh6AIBAJYEACHpAgEAlgQAIeoCBAD_BAAh6wIEAP8EACHsAgIAjgQAIe0CCADmBAAh7gIEAP8EACHvAgQA_wQAIfACCADmBAAh8QIIAOYEACHyAggA5gQAIfMCBAD_BAAh9AIEAP8EACH1AkAAjAQAIQIAAACkAQAgCAAAsAEAIBmSAgIAjgQAIZgCQACMBAAhtwIBAJYEACHKAgEAlgQAIcwCQACMBAAh3AIBAJYEACHiAgQA_wQAIeMCBAD_BAAh5AICAI4EACHlAgIAjgQAIecCAQCWBAAh6AIBAJYEACHpAgEAlgQAIeoCBAD_BAAh6wIEAP8EACHsAgIAjgQAIe0CCADmBAAh7gIEAP8EACHvAgQA_wQAIfACCADmBAAh8QIIAOYEACHyAggA5gQAIfMCBAD_BAAh9AIEAP8EACH1AkAAjAQAIQIAAACnAQAgCAAAsgEAIAMAAACkAQAgDQAArAEAIA4AALABACABAAAApAEAIAEAAACnAQAgBRMAAIEFACAUAACCBQAgFQAAhQUAIBYAAIQFACAXAACDBQAgHI8CAADvAwAwkAIAALgBABCRAgAA7wMAMJICAgCoAwAhmAJAAKkDACG3AgEAtgMAIcoCAQC2AwAhzAJAAKkDACHcAgEAtgMAIeICBADpAwAh4wIEAOkDACHkAgIAqAMAIeUCAgCoAwAh5wIBALYDACHoAgEAtgMAIekCAQC2AwAh6gIEAOkDACHrAgQA6QMAIewCAgCoAwAh7QIIAN0DACHuAgQA6QMAIe8CBADpAwAh8AIIAN0DACHxAggA3QMAIfICCADdAwAh8wIEAOkDACH0AgQA6QMAIfUCQACpAwAhAwAAAKcBACADAAC3AQAwEgAAuAEAIAMAAACnAQAgAwAAqAEAMAQAAKQBACAQjwIAAOwDADCQAgAAvgEAEJECAADsAwAwkgICAAAAAZgCQADJAwAh3AIBAMgDACHdAkAAyQMAId4CCADgAwAh3wIEAO0DACHgAggA4AMAIeECBADtAwAh4gIEAO0DACHjAgQA7QMAIeQCAgDHAwAh5QICAMcDACHmAgAA7gMAIAEAAAC7AQAgAQAAALsBACAPjwIAAOwDADCQAgAAvgEAEJECAADsAwAwkgICAMcDACGYAkAAyQMAIdwCAQDIAwAh3QJAAMkDACHeAggA4AMAId8CBADtAwAh4AIIAOADACHhAgQA7QMAIeICBADtAwAh4wIEAO0DACHkAgIAxwMAIeUCAgDHAwAhAZkDAACABQAgAwAAAL4BACADAAC_AQAwBAAAuwEAIAMAAAC-AQAgAwAAvwEAMAQAALsBACADAAAAvgEAIAMAAL8BADAEAAC7AQAgDJICAgAAAAGYAkAAAAAB3AIBAAAAAd0CQAAAAAHeAggAAAAB3wIEAAAAAeACCAAAAAHhAgQAAAAB4gIEAAAAAeMCBAAAAAHkAgIAAAAB5QICAAAAAQEIAADDAQAgDJICAgAAAAGYAkAAAAAB3AIBAAAAAd0CQAAAAAHeAggAAAAB3wIEAAAAAeACCAAAAAHhAgQAAAAB4gIEAAAAAeMCBAAAAAHkAgIAAAAB5QICAAAAAQEIAADFAQAwDJICAgCOBAAhmAJAAIwEACHcAgEAlgQAId0CQACMBAAh3gIIAOYEACHfAgQA_wQAIeACCADmBAAh4QIEAP8EACHiAgQA_wQAIeMCBAD_BAAh5AICAI4EACHlAgIAjgQAIQIAAAC7AQAgCAAAxwEAIAySAgIAjgQAIZgCQACMBAAh3AIBAJYEACHdAkAAjAQAId4CCADmBAAh3wIEAP8EACHgAggA5gQAIeECBAD_BAAh4gIEAP8EACHjAgQA_wQAIeQCAgCOBAAh5QICAI4EACECAAAAvgEAIAgAAMkBACADAAAAuwEAIA0AAMMBACAOAADHAQAgAQAAALsBACABAAAAvgEAIAUTAAD6BAAgFAAA-wQAIBUAAP4EACAWAAD9BAAgFwAA_AQAIA-PAgAA6AMAMJACAADPAQAQkQIAAOgDADCSAgIAqAMAIZgCQACpAwAh3AIBALYDACHdAkAAqQMAId4CCADdAwAh3wIEAOkDACHgAggA3QMAIeECBADpAwAh4gIEAOkDACHjAgQA6QMAIeQCAgCoAwAh5QICAKgDACEDAAAAvgEAIAMAAM4BADASAADPAQAgAwAAAL4BACADAAC_AQAwBAAAuwEAIAyPAgAA5wMAMJACAADVAQAQkQIAAOcDADCSAgIAAAABmAJAAMkDACG3AgEAAAABygIBAMgDACHMAkAAyQMAIdgCAQDIAwAh2QICAMcDACHaAgEAyAMAIdsCQADJAwAhAQAAANIBACABAAAA0gEAIAyPAgAA5wMAMJACAADVAQAQkQIAAOcDADCSAgIAxwMAIZgCQADJAwAhtwIBAMgDACHKAgEAyAMAIcwCQADJAwAh2AIBAMgDACHZAgIAxwMAIdoCAQDIAwAh2wJAAMkDACEBmQMAAPkEACADAAAA1QEAIAMAANYBADAEAADSAQAgAwAAANUBACADAADWAQAwBAAA0gEAIAMAAADVAQAgAwAA1gEAMAQAANIBACAJkgICAAAAAZgCQAAAAAG3AgEAAAABygIBAAAAAcwCQAAAAAHYAgEAAAAB2QICAAAAAdoCAQAAAAHbAkAAAAABAQgAANoBACAJkgICAAAAAZgCQAAAAAG3AgEAAAABygIBAAAAAcwCQAAAAAHYAgEAAAAB2QICAAAAAdoCAQAAAAHbAkAAAAABAQgAANwBADAJkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhygIBAJYEACHMAkAAjAQAIdgCAQCWBAAh2QICAI4EACHaAgEAlgQAIdsCQACMBAAhAgAAANIBACAIAADeAQAgCZICAgCOBAAhmAJAAIwEACG3AgEAlgQAIcoCAQCWBAAhzAJAAIwEACHYAgEAlgQAIdkCAgCOBAAh2gIBAJYEACHbAkAAjAQAIQIAAADVAQAgCAAA4AEAIAMAAADSAQAgDQAA2gEAIA4AAN4BACABAAAA0gEAIAEAAADVAQAgBRMAAPQEACAUAAD1BAAgFQAA-AQAIBYAAPcEACAXAAD2BAAgDI8CAADmAwAwkAIAAOYBABCRAgAA5gMAMJICAgCoAwAhmAJAAKkDACG3AgEAtgMAIcoCAQC2AwAhzAJAAKkDACHYAgEAtgMAIdkCAgCoAwAh2gIBALYDACHbAkAAqQMAIQMAAADVAQAgAwAA5QEAMBIAAOYBACADAAAA1QEAIAMAANYBADAEAADSAQAgCI8CAADlAwAwkAIAAOwBABCRAgAA5QMAMJICAgAAAAGYAkAAyQMAIcwCQADJAwAh1gIBAAAAAdcCAgDHAwAhAQAAAOkBACABAAAA6QEAIAiPAgAA5QMAMJACAADsAQAQkQIAAOUDADCSAgIAxwMAIZgCQADJAwAhzAJAAMkDACHWAgEAyAMAIdcCAgDHAwAhAZkDAADzBAAgAwAAAOwBACADAADtAQAwBAAA6QEAIAMAAADsAQAgAwAA7QEAMAQAAOkBACADAAAA7AEAIAMAAO0BADAEAADpAQAgBZICAgAAAAGYAkAAAAABzAJAAAAAAdYCAQAAAAHXAgIAAAABAQgAAPEBACAFkgICAAAAAZgCQAAAAAHMAkAAAAAB1gIBAAAAAdcCAgAAAAEBCAAA8wEAMAWSAgIAjgQAIZgCQACMBAAhzAJAAIwEACHWAgEAlgQAIdcCAgCOBAAhAgAAAOkBACAIAAD1AQAgBZICAgCOBAAhmAJAAIwEACHMAkAAjAQAIdYCAQCWBAAh1wICAI4EACECAAAA7AEAIAgAAPcBACADAAAA6QEAIA0AAPEBACAOAAD1AQAgAQAAAOkBACABAAAA7AEAIAUTAADuBAAgFAAA7wQAIBUAAPIEACAWAADxBAAgFwAA8AQAIAiPAgAA5AMAMJACAAD9AQAQkQIAAOQDADCSAgIAqAMAIZgCQACpAwAhzAJAAKkDACHWAgEAtgMAIdcCAgCoAwAhAwAAAOwBACADAAD8AQAwEgAA_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wIBAAAAAcwCQAAAAAEBCAAAuAIAMAaSAgIAjgQAIcgCAQCWBAAhyQIBAJYEACHKAgEAlgQAIcsCAQCWBAAhzAJAAIwEACECAAAArgIAIAgAALoCACAGkgICAI4EACHIAgEAlgQAIckCAQCWBAAhygIBAJYEACHLAgEAlgQAIcwCQACMBAAhAgAAALECACAIAAC8AgAgAwAAAK4CACANAAC2AgAgDgAAugIAIAEAAACuAgAgAQAAALECACAFEwAA2wQAIBQAANwEACAVAADfBAAgFgAA3gQAIBcAAN0EACAJjwIAANoDADCQAgAAwgIAEJECAADaAwAwkgICAKgDACHIAgEAtgMAIckCAQC2AwAhygIBALYDACHLAgEAtgMAIcwCQACpAwAhAwAAALECACADAADBAgAwEgAAwgIAIAMAAACxAgAgAwAAsgIAMAQAAK4CACAI1gEAAMoDACCPAgAAxgMAMJACAADXAgAQkQIAAMYDADCSAgIAAAABmAJAAMkDACG1AgEAAAABtwIBAMgDACEBAAAAxQIAIBfSAQAA1wMAINQBAADYAwAg1QEAANkDACCPAgAA0wMAMJACAADHAgAQkQIAANMDADCSAgIAxwMAIZgCQADJAwAhtAIBAMgDACG1AgEAyAMAIbYCAQDIAwAhtwIBAMgDACG4AgEA1AMAIbkCAgDHAwAhugICAMcDACG7AgIAxwMAIbwCAgDHAwAhvQICAMcDACG-AgIAxwMAIb8CAgDVAwAhwAJAANIDACHBAiAA1gMAIcICQADSAwAhCNIBAADXBAAg1AEAANgEACDVAQAA2QQAILgCAACGBAAgvwIAAIYEACDAAgAAhgQAIMICAACGBAAgmQMAANoEACAX0gEAANcDACDUAQAA2AMAINUBAADZAwAgjwIAANMDADCQAgAAxwIAEJECAADTAwAwkgICAAAAAZgCQADJAwAhtAIBAAAAAbUCAQDIAwAhtgIBAMgDACG3AgEAyAMAIbgCAQDUAwAhuQICAMcDACG6AgIAxwMAIbsCAgDHAwAhvAICAMcDACG9AgIAxwMAIb4CAgDHAwAhvwICANUDACHAAkAA0gMAIcECIADWAwAhwgJAANIDACEDAAAAxwIAIAMAAMgCADAEAADJAgAgE9MBAADPAwAgjwIAANEDADCQAgAAywIAEJECAADRAwAwkgICAMcDACGTAgIAxwMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhpwJAAMkDACGoAggAzQMAIakCCADNAwAhqgIIAM0DACGrAggAzQMAIawCCADNAwAhrQIIAM0DACGuAgEAyAMAIa8CQADSAwAhDNMBAADVBAAglQIAAIYEACCWAgAAhgQAIJcCAACGBAAgqAIAAIYEACCpAgAAhgQAIKoCAACGBAAgqwIAAIYEACCsAgAAhgQAIK0CAACGBAAgrwIAAIYEACCZAwAA1gQAIBTTAQAAzwMAII8CAADRAwAwkAIAAMsCABCRAgAA0QMAMJICAgAAAAGTAgIAxwMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhpwJAAMkDACGoAggAzQMAIakCCADNAwAhqgIIAM0DACGrAggAzQMAIawCCADNAwAhrQIIAM0DACGuAgEAyAMAIa8CQADSAwAhxwIAANADACADAAAAywIAIAMAAMwCADAEAADNAgAgC9MBAADPAwAgjwIAAMwDADCQAgAAzwIAEJECAADMAwAwkgICAMcDACGTAgIAxwMAIZQCQADJAwAhlQIIAM0DACGWAggAzQMAIZcCAADOAwAgmAJAAMkDACEE0wEAANUEACCVAgAAhgQAIJYCAACGBAAglwIAAIYEACAM0wEAAM8DACCPAgAAzAMAMJACAADPAgAQkQIAAMwDADCSAgIAAAABkwICAMcDACGUAkAAyQMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhxgIAAMsDACADAAAAzwIAIAMAANACADAEAADRAgAgAQAAAMsCACABAAAAzwIAIAEAAADHAgAgAQAAAMUCACAI1gEAAMoDACCPAgAAxgMAMJACAADXAgAQkQIAAMYDADCSAgIAxwMAIZgCQADJAwAhtQIBAMgDACG3AgEAyAMAIQLWAQAA0wQAIJkDAADUBAAgAwAAANcCACADAADYAgAwBAAAxQIAIAMAAADXAgAgAwAA2AIAMAQAAMUCACADAAAA1wIAIAMAANgCADAEAADFAgAgBdYBAADSBAAgkgICAAAAAZgCQAAAAAG1AgEAAAABtwIBAAAAAQEIAADcAgAgBJICAgAAAAGYAkAAAAABtQIBAAAAAbcCAQAAAAEBCAAA3gIAMAXWAQAAxQQAIJICAgCOBAAhmAJAAIwEACG1AgEAlgQAIbcCAQCWBAAhAgAAAMUCACAIAADgAgAgBJICAgCOBAAhmAJAAIwEACG1AgEAlgQAIbcCAQCWBAAhAgAAANcCACAIAADiAgAgAwAAAMUCACANAADcAgAgDgAA4AIAIAEAAADFAgAgAQAAANcCACAFEwAAwAQAIBQAAMEEACAVAADEBAAgFgAAwwQAIBcAAMIEACAHjwIAAMUDADCQAgAA6AIAEJECAADFAwAwkgICAKgDACGYAkAAqQMAIbUCAQC2AwAhtwIBALYDACEDAAAA1wIAIAMAAOcCADASAADoAgAgAwAAANcCACADAADYAgAwBAAAxQIAIAEAAADJAgAgAQAAAMkCACADAAAAxwIAIAMAAMgCADAEAADJAgAgAwAAAMcCACADAADIAgAwBAAAyQIAIAMAAADHAgAgAwAAyAIAMAQAAMkCACAU0gEAAL0EACDUAQAAvgQAINUBAAC_BAAgkgICAAAAAZgCQAAAAAG0AgEAAAABtQIBAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAgAAAAG6AgIAAAABuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgAAAAHAAkAAAAABwQIgAAAAAcICQAAAAAEBCAAA8AIAIBGSAgIAAAABmAJAAAAAAbQCAQAAAAG1AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQICAAAAAboCAgAAAAG7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAAAAAcACQAAAAAHBAiAAAAABwgJAAAAAAQEIAADyAgAwFNIBAACiBAAg1AEAAKMEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbUCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACECAAAAyQIAIAgAAPQCACARkgICAI4EACGYAkAAjAQAIbQCAQCWBAAhtQIBAJYEACG2AgEAlgQAIbcCAQCWBAAhuAIBAJ8EACG5AgIAjgQAIboCAgCOBAAhuwICAI4EACG8AgIAjgQAIb0CAgCOBAAhvgICAI4EACG_AgIAoAQAIcACQACXBAAhwQIgAKEEACHCAkAAlwQAIQIAAADHAgAgCAAA9gIAIAMAAADJAgAgDQAA8AIAIA4AAPQCACABAAAAyQIAIAEAAADHAgAgCRMAAJoEACAUAACbBAAgFQAAngQAIBYAAJ0EACAXAACcBAAguAIAAIYEACC_AgAAhgQAIMACAACGBAAgwgIAAIYEACAUjwIAALwDADCQAgAA_AIAEJECAAC8AwAwkgICAKgDACGYAkAAqQMAIbQCAQC2AwAhtQIBALYDACG2AgEAtgMAIbcCAQC2AwAhuAIBAL0DACG5AgIAqAMAIboCAgCoAwAhuwICAKgDACG8AgIAqAMAIb0CAgCoAwAhvgICAKgDACG_AgIAvgMAIcACQAC3AwAhwQIgAL8DACHCAkAAtwMAIQMAAADHAgAgAwAA-wIAMBIAAPwCACADAAAAxwIAIAMAAMgCADAEAADJAgAgAQAAAM0CACABAAAAzQIAIAMAAADLAgAgAwAAzAIAMAQAAM0CACADAAAAywIAIAMAAMwCADAEAADNAgAgAwAAAMsCACADAADMAgAwBAAAzQIAIBDTAQAAmQQAIJICAgAAAAGTAgIAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAacCQAAAAAGoAggAAAABqQIIAAAAAaoCCAAAAAGrAggAAAABrAIIAAAAAa0CCAAAAAGuAgEAAAABrwJAAAAAAQEIAACEAwAgD5ICAgAAAAGTAgIAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAacCQAAAAAGoAggAAAABqQIIAAAAAaoCCAAAAAGrAggAAAABrAIIAAAAAa0CCAAAAAGuAgEAAAABrwJAAAAAAQEIAACGAwAwENMBAACYBAAgkgICAI4EACGTAgIAjgQAIZUCCACNBAAhlgIIAI0EACGXAoAAAAABmAJAAIwEACGnAkAAjAQAIagCCACNBAAhqQIIAI0EACGqAggAjQQAIasCCACNBAAhrAIIAI0EACGtAggAjQQAIa4CAQCWBAAhrwJAAJcEACECAAAAzQIAIAgAAIgDACAPkgICAI4EACGTAgIAjgQAIZUCCACNBAAhlgIIAI0EACGXAoAAAAABmAJAAIwEACGnAkAAjAQAIagCCACNBAAhqQIIAI0EACGqAggAjQQAIasCCACNBAAhrAIIAI0EACGtAggAjQQAIa4CAQCWBAAhrwJAAJcEACECAAAAywIAIAgAAIoDACADAAAAzQIAIA0AAIQDACAOAACIAwAgAQAAAM0CACABAAAAywIAIA8TAACRBAAgFAAAkgQAIBUAAJUEACAWAACUBAAgFwAAkwQAIJUCAACGBAAglgIAAIYEACCXAgAAhgQAIKgCAACGBAAgqQIAAIYEACCqAgAAhgQAIKsCAACGBAAgrAIAAIYEACCtAgAAhgQAIK8CAACGBAAgEo8CAAC1AwAwkAIAAJADABCRAgAAtQMAMJICAgCoAwAhkwICAKgDACGVAggAqgMAIZYCCACqAwAhlwIAAKsDACCYAkAAqQMAIacCQACpAwAhqAIIAKoDACGpAggAqgMAIaoCCACqAwAhqwIIAKoDACGsAggAqgMAIa0CCACqAwAhrgIBALYDACGvAkAAtwMAIQMAAADLAgAgAwAAjwMAMBIAAJADACADAAAAywIAIAMAAMwCADAEAADNAgAgAQAAANECACABAAAA0QIAIAMAAADPAgAgAwAA0AIAMAQAANECACADAAAAzwIAIAMAANACADAEAADRAgAgAwAAAM8CACADAADQAgAwBAAA0QIAIAjTAQAAkAQAIJICAgAAAAGTAgIAAAABlAJAAAAAAZUCCAAAAAGWAggAAAABlwKAAAAAAZgCQAAAAAEBCAAAmAMAIAeSAgIAAAABkwICAAAAAZQCQAAAAAGVAggAAAABlgIIAAAAAZcCgAAAAAGYAkAAAAABAQgAAJoDADAI0wEAAI8EACCSAgIAjgQAIZMCAgCOBAAhlAJAAIwEACGVAggAjQQAIZYCCACNBAAhlwKAAAAAAZgCQACMBAAhAgAAANECACAIAACcAwAgB5ICAgCOBAAhkwICAI4EACGUAkAAjAQAIZUCCACNBAAhlgIIAI0EACGXAoAAAAABmAJAAIwEACECAAAAzwIAIAgAAJ4DACADAAAA0QIAIA0AAJgDACAOAACcAwAgAQAAANECACABAAAAzwIAIAgTAACHBAAgFAAAiAQAIBUAAIsEACAWAACKBAAgFwAAiQQAIJUCAACGBAAglgIAAIYEACCXAgAAhgQAIAqPAgAApwMAMJACAACkAwAQkQIAAKcDADCSAgIAqAMAIZMCAgCoAwAhlAJAAKkDACGVAggAqgMAIZYCCACqAwAhlwIAAKsDACCYAkAAqQMAIQMAAADPAgAgAwAAowMAMBIAAKQDACADAAAAzwIAIAMAANACADAEAADRAgAgCo8CAACnAwAwkAIAAKQDABCRAgAApwMAMJICAgCoAwAhkwICAKgDACGUAkAAqQMAIZUCCACqAwAhlgIIAKoDACGXAgAAqwMAIJgCQACpAwAhDRMAALEDACAUAAC0AwAgFQAAsQMAIBYAALEDACAXAACxAwAgmQICAAAAAaACAgAAAAGhAgIAAAABogICAAAAAaMCAgAAAAGkAgIAswMAIaUCAgAAAASmAgIAAAAECxMAALEDACAWAACyAwAgFwAAsgMAIJkCQAAAAAGgAkAAAAABoQJAAAAAAaICQAAAAAGjAkAAAAABpAJAALADACGlAkAAAAAEpgJAA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-AgIAqAMAIb8CAgC-AwAhwAJAALcDACHBAiAAvwMAIcICQAC3AwAhDxMAAKwDACAWAADEAwAgFwAAxAMAIJkCAQAAAAGgAgEAAAABoQIBAAAAAaICAQAAAAGjAgEAAAABpAIBAMMDACGlAgEAAAAFpgIBAAAABbACAQAAAAGxAgEAAAABsgIBAAAAAbMCAQAAAAENEwAArAMAIBQAAK8DACAVAACsAwAgFgAArAMAIBcAAKwDACCZAgIAAAABoAICAAAAAaECAgAAAAGiAgIAAAABowICAAAAAaQCAgDCAwAhpQICAAAABaYCAgAAAAUFEwAAsQMAIBYAAMEDACAXAADBAwAgmQIgAAAAAaQCIADAAwAhBRMAALEDACAWAADBAwAgFwAAwQMAIJkCIAAAAAGkAiAAwAMAIQKZAiAAAAABpAIgAMEDACENEwAArAMAIBQAAK8DACAVAACsAwAgFgAArAMAIBcAAKwDACCZAgIAAAABoAICAAAAAaECAgAAAAGiAgIAAAABowICAAAAAaQCAgDCAwAhpQICAAAABaYCAgAAAAUPEwAArAMAIBYAAMQDACAXAADEAwAgmQIBAAAAAaACAQAAAAGhAgEAAAABogIBAAAAAaMCAQAAAAGkAgEAwwMAIaUCAQAAAAWmAgEAAAAFsAIBAAAAAbECAQAAAAGyAgEAAAABswIBAAAAAQyZAgEAAAABoAIBAAAAAaECAQAAAAGiAgEAAAABowIBAAAAAaQCAQDEAwAhpQIBAAAABaYCAQAAAAWwAgEAAAABsQIBAAAAAbICAQAAAAGzAgEAAAABB48CAADFAwAwkAIAAOgCABCRAgAAxQMAMJICAgCoAwAhmAJAAKkDACG1AgEAtgMAIbcCAQC2AwAhCNYBAADKAwAgjwIAAMYDADCQAgAA1wIAEJECAADGAwAwkgICAMcDACGYAkAAyQMAIbUCAQDIAwAhtwIBAMgDACEImQICAAAAAaACAgAAAAGhAgIAAAABogICAAAAAaMCAgAAAAGkAgIAsQMAIaUCAgAAAASmAgIAAAAEDJkCAQAAAAGgAgEAAAABoQIBAAAAAaICAQAAAAGjAgEAAAABpAIBALsDACGlAgEAAAAEpgIBAAAABLACAQAAAAGxAgEAAAABsgIBAAAAAbMCAQAAAAEImQJAAAAAAaACQAAAAAGhAkAAAAABogJAAAAAAaMCQAAAAAGkAkAAsgMAIaUCQAAAAASmAkAAAAAEA8MCAADHAgAgxAIAAMcCACDFAgAAxwIAIAKTAgIAAAABlAJAAAAAAQvTAQAAzwMAII8CAADMAwAwkAIAAM8CABCRAgAAzAMAMJICAgDHAwAhkwICAMcDACGUAkAAyQMAIZUCCADNAwAhlgIIAM0DACGXAgAAzgMAIJgCQADJAwAhCJkCCAAAAAGgAggAAAABoQIIAAAAAaICCAAAAAGjAggAAAABpAIIAK8DACGlAggAAAAFpgIIAAAABQyZAoAAAAABmgIBAAAAAZsCAQAAAAGcAgEAAAABnQKAAAAAAZ4CgAAAAAGfAoAAAAABoAKAAAAAAaECgAAAAAGiAoAAAAABowKAAAAAAaQCgAAAAAEZ0gEAANcDACDUAQAA2AMAINUBAADZAwAgjwIAANMDADCQAgAAxwIAEJECAADTAwAwkgICAMcDACGYAkAAyQMAIbQCAQDIAwAhtQIBAMgDACG2AgEAyAMAIbcCAQDIAwAhuAIBANQDACG5AgIAxwMAIboCAgDHAwAhuwICAMcDACG8AgIAxwMAIb0CAgDHAwAhvgICAMcDACG_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-AIIAN0DACH5AgEAtgMAIfoCAQC2AwAh-wIIAN0DACH8AggA3QMAIQ2PAgAA8gMAMJACAACQAQAQkQIAAPIDADCSAgIAxwMAIZgCQADJAwAh3QIBAMgDACH2AgEAyAMAIfcCCADgAwAh-AIIAOADACH5AgEAyAMAIfoCAQDIAwAh-wIIAOADACH8AggA4AMAIQyPAgAA8wMAMJACAACKAQAQkQIAAPMDADCSAgIAqAMAIZgCQACpAwAh0AIBALYDACHYAgEAtgMAIf0CAQC2AwAh_gIBALYDACH_AgEAvQMAIYADQACpAwAhgQMCAKgDACEMjwIAAPQDADCQAgAAeQAQkQIAAPQDADCSAgIAxwMAIZgCQADJAwAh0AIBAMgDACHYAgEAyAMAIf0CAQDIAwAh_gIBAMgDACH_AgEA1AMAIYADQADJAwAhgQMCAMcDACEC_QIBAAAAAYADQAAAAAEJjwIAAPYDADCQAgAAcwAQkQIAAPYDADCSAgIAqAMAIZgCQACpAwAhzAJAAKkDACHdAgEAtgMAIYMDAgCoAwAhhAMIAN0DACENjwIAAPcDADCQAgAAXwAQkQIAAPcDADCSAgIAqAMAIZgCQACpAwAhtwIBALYDACHMAkAAqQMAIdACAQC2AwAh_QIBALYDACGFAwEAtgMAIYYDAQC2AwAhhwMBALYDACGIAyAAvwMAIQ43AAD5AwAgjwIAAPgDADCQAgAATgAQkQIAAPgDADCSAgIAxwMAIZgCQADJAwAhtwIBAMgDACHMAkAAyQMAIdACAQDIAwAh_QIBAMgDACGFAwEAyAMAIYYDAQDIAwAhhwMBAMgDACGIAyAA1gMAIQPDAgAASAAgxAIAAEgAIMUCAABIACAC3QIBAAAAAYMDAgAAAAEKNgAA_AMAII8CAAD7AwAwkAIAAEgAEJECAAD7AwAwkgICAMcDACGYAkAAyQMAIcwCQADJAwAh3QIBAMgDACGDAwIAxwMAIYQDCADgAwAhEDcAAPkDACCPAgAA-AMAMJACAABOABCRAgAA-AMAMJICAgDHAwAhmAJAAMkDACG3AgEAyAMAIcwCQADJAwAh0AIBAMgDACH9AgEAyAMAIYUDAQDIAwAhhgMBAMgDACGHAwEAyAMAIYgDIADWAwAhjgMAAE4AII8DAABOACAJCAAA_gMAII8CAAD9AwAwkAIAAEMAEJECAAD9AwAwkgICAKgDACGYAkAAqQMAIbcCAQC2AwAhzAJAAKkDACGKAwEAtgMAIQ8TAACxAwAgFgAA_wMAIBcAAP8DACCZAoAAAAABmgIBAAAAAZsCAQAAAAGcAgEAAAABnQKAAAAAAZ4CgAAAAAGfAoAAAAABoAKAAAAAAaECgAAAAAGiAoAAAAABowKAAAAAAaQCgAAAAAEMmQKAAAAAAZoCAQAAAAGbAgEAAAABnAIBAAAAAZ0CgAAAAAGeAoAAAAABnwKAAAAAAaACgAAAAAGhAoAAAAABogKAAAAAAaMCgAAAAAGkAoAAAAABCQgAAIEEACCPAgAAgAQAMJACAAAyABCRAgAAgAQAMJICAgDHAwAhmAJAAMkDACG3AgEAyAMAIcwCQADJAwAhigMBAMgDACEMmQKAAAAAAZoCAQAAAAGbAgEAAAABnAIBAAAAAZ0CgAAAAAGeAoAAAAABnwKAAAAAAaACgAAAAAGhAoAAAAABogKAAAAAAaMCgAAAAAGkAoAAAAABCo8CAACCBAAwkAIAACwAEJECAACCBAAwkgICAKgDACGYAkAAqQMAIacCAQC2AwAhzAJAAKkDACH9AgEAtgMAIf8CAQC2AwAhiwMBALYDACEKjwIAAIMEADCQAgAAGwAQkQIAAIMEADCSAgIAxwMAIZgCQADJAwAhpwIBAMgDACHMAkAAyQMAIf0CAQDIAwAh_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_BAAgkgICAAAAAZgCQAAAAAG0AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQICAAAAAboCAgAAAAG7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAAAAAcACQAAAAAHBAiAAAAABwgJAAAAAAQIAAADJAgAgDQAA0QQAIAMAAADJAgAgDQAA0QQAIA4AANAEACABCAAAyQUAMBfSAQAA1wMAINQBAADYAwAg1QEAANkDACCPAgAA0wMAMJACAADHAgAQkQIAANMDADCSAgIAAAABmAJAAMkDACG0AgEAAAABtQIBAMgDACG2AgEAyAMAIbcCAQDIAwAhuAIBANQDACG5AgIAxwMAIboCAgDHAwAhuwICAMcDACG8AgIAxwMAIb0CAgDHAwAhvgICAMcDACG_AgIA1QMAIcACQADSAwAhwQIgANYDACHCAkAA0gMAIQIAAADJAgAgCAAA0AQAIAIAAADOBAAgCAAAzwQAIBSPAgAAzQQAMJACAADOBAAQkQIAAM0EADCSAgIAxwMAIZgCQADJAwAhtAIBAMgDACG1AgEAyAMAIbYCAQDIAwAhtwIBAMgDACG4AgEA1AMAIbkCAgDHAwAhugICAMcDACG7AgIAxwMAIbwCAgDHAwAhvQICAMcDACG-AgIAxwMAIb8CAgDVAwAhwAJAANIDACHBAiAA1gMAIcICQADSAwAhFI8CAADNBAAwkAIAAM4EABCRAgAAzQQAMJICAgDHAwAhmAJAAMkDACG0AgEAyAMAIbUCAQDIAwAhtgIBAMgDACG3AgEAyAMAIbgCAQDUAwAhuQICAMcDACG6AgIAxwMAIbsCAgDHAwAhvAICAMcDACG9AgIAxwMAIb4CAgDHAwAhvwICANUDACHAAkAA0gMAIcECIADWAwAhwgJAANIDACEQkgICAI4EACGYAkAAjAQAIbQCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACES1AEAAKMEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbYCAQCWBAAhtwIBAJYEACG4AgEAnwQAIbkCAgCOBAAhugICAI4EACG7AgIAjgQAIbwCAgCOBAAhvQICAI4EACG-AgIAjgQAIb8CAgCgBAAhwAJAAJcEACHBAiAAoQQAIcICQACXBAAhEtQBAAC-BAAg1QEAAL8EACCSAgIAAAABmAJAAAAAAbQCAQAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgIAAAABugICAAAAAbsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIAAAABwAJAAAAAAcECIAAAAAHCAkAAAAABBA0AAMYEADCQAwAAxwQAMJIDAADJBAAglgMAAMoEADAAAbMCAQAAAAEI0gEAANcEACDUAQAA2AQAINUBAADZBAAguAIAAIYEACC_AgAAhgQAIMACAACGBAAgwgIAAIYEACCZAwAA2gQAIAGzAgEAAAABAtYBAADTBAAgmQMAANQEACAAAAGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAABZMDCAAAAAGaAwgAAAABmwMIAAAAAZwDCAAAAAGdAwgAAAABAbMCAQAAAAEAAAAAAAGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAAAbMCAQAAAAEAAAAAAAWTAwQAAAABmgMEAAAAAZsDBAAAAAGcAwQAAAABnQMEAAAAAQGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAAAbMCAQAAAAEAAAAAAAGzAgEAAAABAAAAAAAFDQAAxAUAIA4AAMcFACCQAwAAxQUAIJEDAADGBQAglgMAAEYAIAMNAADEBQAgkAMAAMUFACCWAwAARgAgAAAAAAALDQAAoAUAMA4AAKUFADCQAwAAoQUAMJEDAACiBQAwkgMAAKMFACCTAwAApAUAMJQDAACkBQAwlQMAAKQFADCWAwAApAUAMJcDAACmBQAwmAMAAKcFADAFkgICAAAAAZgCQAAAAAHMAkAAAAAB3QIBAAAAAYQDCAAAAAECAAAASgAgDQAAqwUAIAMAAABKACANAACrBQAgDgAAqgUAIAEIAADDBQAwCzYAAPwDACCPAgAA-wMAMJACAABIABCRAgAA-wMAMJICAgAAAAGYAkAAyQMAIcwCQADJAwAh3QIBAMgDACGDAwIAxwMAIYQDCADgAwAhiQMAAPoDACACAAAASgAgCAAAqgUAIAIAAACoBQAgCAAAqQUAIAmPAgAApwUAMJACAACoBQAQkQIAAKcFADCSAgIAxwMAIZgCQADJAwAhzAJAAMkDACHdAgEAyAMAIYMDAgDHAwAhhAMIAOADACEJjwIAAKcFADCQAgAAqAUAEJECAACnBQAwkgICAMcDACGYAkAAyQMAIcwCQADJAwAh3QIBAMgDACGDAwIAxwMAIYQDCADgAwAhBZICAgCOBAAhmAJAAIwEACHMAkAAjAQAId0CAQCWBAAhhAMIAOYEACEFkgICAI4EACGYAkAAjAQAIcwCQACMBAAh3QIBAJYEACGEAwgA5gQAIQWSAgIAAAABmAJAAAAAAcwCQAAAAAHdAgEAAAABhAMIAAAAAQQNAACgBQAwkAMAAKEFADCSAwAAowUAIJYDAACkBQAwAAGzAgEAAAABAjcAAK0FACCZAwAArgUAIAGzAgEAAAABAAAAAAABswIBAAAAAQAAAAAAAbMCAQAAAAEAAAAAAAGzAgEAAAABBZICAgAAAAGYAkAAAAABzAJAAAAAAd0CAQAAAAGEAwgAAAABCpICAgAAAAGYAkAAAAABtwIBAAAAAcwCQAAAAAHQAgEAAAAB_QIBAAAAAYUDAQAAAAGGAwEAAAABhwMBAAAAAYgDIAAAAAECAAAARgAgDQAAxAUAIAMAAABOACANAADEBQAgDgAAyAUAIAwAAABOACAIAADIBQAgkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhzAJAAIwEACHQAgEAlgQAIf0CAQCWBAAhhQMBAJYEACGGAwEAlgQAIYcDAQCWBAAhiAMgAKEEACEKkgICAI4EACGYAkAAjAQAIbcCAQCWBAAhzAJAAIwEACHQAgEAlgQAIf0CAQCWBAAhhQMBAJYEACGGAwEAlgQAIYcDAQCWBAAhiAMgAKEEACEQkgICAAAAAZgCQAAAAAG0AgEAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQICAAAAAboCAgAAAAG7AgIAAAABvAICAAAAAb0CAgAAAAG-AgIAAAABvwICAAAAAcACQAAAAAHBAiAAAAABwgJAAAAAAQSSAgIAAAABmAJAAAAAAbUCAQAAAAG3AgEAAAABAgAAAMUCACANAADKBQAgDpICAgAAAAGVAggAAAABlgIIAAAAAZcCgAAAAAGYAkAAAAABpwJAAAAAAagCCAAAAAGpAggAAAABqgIIAAAAAasCCAAAAAGsAggAAAABrQIIAAAAAa4CAQAAAAGvAkAAAAABBpICAgAAAAGUAkAAAAABlQIIAAAAAZYCCAAAAAGXAoAAAAABmAJAAAAAAQMAAADXAgAgDQAAygUAIA4AANAFACAGAAAA1wIAIAgAANAFACCSAgIAjgQAIZgCQACMBAAhtQIBAJYEACG3AgEAlgQAIQSSAgIAjgQAIZgCQACMBAAhtQIBAJYEACG3AgEAlgQAIRPSAQAAvQQAINUBAAC_BAAgkgICAAAAAZgCQAAAAAG0AgEAAAABtQIBAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAgAAAAG6AgIAAAABuwICAAAAAbwCAgAAAAG9AgIAAAABvgICAAAAAb8CAgAAAAHAAkAAAAABwQIgAAAAAcICQAAAAAECAAAAyQIAIA0AANEFACADAAAAxwIAIA0AANEFACAOAADVBQAgFQAAAMcCACAIAADVBQAg0gEAAKIEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbUCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACET0gEAAKIEACDVAQAApAQAIJICAgCOBAAhmAJAAIwEACG0AgEAlgQAIbUCAQCWBAAhtgIBAJYEACG3AgEAlgQAIbgCAQCfBAAhuQICAI4EACG6AgIAjgQAIbsCAgCOBAAhvAICAI4EACG9AgIAjgQAIb4CAgCOBAAhvwICAKAEACHAAkAAlwQAIcECIAChBAAhwgJAAJcEACET0gEAAL0EACDUAQAAvgQAIJICAgAAAAGYAkAAAAABtAIBAAAAAbUCAQAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgIAAAABugICAAAAAbsCAgAAAAG8AgIAAAABvQICAAAAAb4CAgAAAAG_AgIAAAABwAJAAAAAAcECIAAAAAHCAkAAAAABAgAAAMkCACANAADWBQAgAwAAAMcCACANAADWBQAgDgAA2gUAIBUAAADHAgAgCAAA2gUAINIBAACiBAAg1AEAAKMEACCSAgIAjgQAIZgCQACMBAAhtAIBAJYEACG1AgEAlgQAIbYCAQCWBAAhtwIBAJYEACG4AgEAnwQAIbkCAgCOBAAhugICAI4EACG7AgIAjgQAIbwCAgCOBAAhvQICAI4EACG-AgIAjgQAIb8CAgCgBAAhwAJAAJcEACHBAiAAoQQAIcICQACXBAAhE9IBAACiBAAg1AEAAKMEACCSAgIAjgQAIZgCQACMBAAhtAIBAJYEACG1AgEAlgQAIbYCAQCWBAAhtwIBAJYEACG4AgEAnwQAIbkCAgCOBAAhugICAI4EACG7AgIAjgQAIbwCAgCOBAAhvQICAI4EACG-AgIAjgQAIb8CAgCgBAAhwAJAAJcEACHBAiAAoQQAIcICQACXBAAhAAAFEwAEFAAFFQAGFgAHFwAIAAAAAAAFEwAEFAAFFQAGFgAHFwAIAAUTAAwUAA0VAA4WAA8XABAAAAAAAAUTAAwUAA0VAA4WAA8XABAABRMAFBQAFRUAFhYAFxcAGAAAAAAABRMAFBQAFRUAFhYAFxcAGAITABw3SxsBNgAaATdMAAUTAB4UAB8VACAWACEXACIAAAAAAAUTAB4UAB8VACAWACEXACIFEwAlFAAmFQAnFgAoFwApAAAAAAAFEwAlFAAmFQAnFgAoFwApAAUTAC0UAC4VAC8WADAXADEAAAAAAAUTAC0UAC4VAC8WADAXADEABRMANRQANhUANxYAOBcAOQAAAAAABRMANRQANhUANxYAOBcAOQAFEwA9FAA-FQA_FgBAFwBBAAAAAAAFEwA9FAA-FQA_FgBAFwBBAAUTAEUUAEYVAEcWAEgXAEkAAAAAAAUTAEUUAEYVAEcWAEgXAEkABRMATRQAThUATxYAUBcAUQAAAAAABRMATRQAThUATxYAUBcAUQAFEwBVFABWFQBXFgBYFwBZAAAAAAAFEwBVFABWFQBXFgBYFwBZAAUTAF0UAF4VAF8WAGAXAGEAAAAAAAUTAF0UAF4VAF8WAGAXAGEABRMAZRQAZhUAZxYAaBcAaQAAAAAABRMAZRQAZhUAZxYAaBcAaQAFEwBtFABuFQBvFgBwFwBxAAAAAAAFEwBtFABuFQBvFgBwFwBxAhMAeNYBygJ0BBMAd9IBAHPUAc4CddUB0gJ2AdMBAHQB0wEAdALUAdMCANUB1AIAAdYB1QIABRMAehQAexUAfBYAfRcAfgAAAAAABRMAehQAexUAfBYAfRcAfgUTAIEBFACCARUAgwEWAIQBFwCFAQAAAAAABRMAgQEUAIIBFQCDARYAhAEXAIUBBRMAiAEUAIkBFQCKARYAiwEXAIwBAAAAAAAFEwCIARQAiQEVAIoBFgCLARcAjAEFEwCPARQAkAEVAJEBFgCSARcAkwEAAAAAAAUTAI8BFACQARUAkQEWAJIBFwCTAQECAQIDAQUGAQYHAQcIAQkKAQoMAgsOAQwQAg8RARASARETAhgWAxkXCRoZChsaChwdCh0eCh4fCh8hCiAjAiElCiInAiMoCiQpCiUqAiYtCycuESgwEikxEio0Eis1Eiw2Ei04Ei46Ai88EjA-AjE_EjJAEjNBAjREEzVFGThHGjlNGjpQGjtRGjxSGj1UGj5WAj9YGkBaAkFbGkJcGkNdAkRgHUVhI0ZiG0djG0hkG0llG0pmG0toG0xqAk1sG05uAk9vG1BwG1FxAlJ0JFN1KlR3K1V4K1Z7K1d8K1h9K1l_K1qBAQJbgwErXIUBAl2GAStehwErX4gBAmCLASxhjAEyYo4BM2OPATNkkgEzZZMBM2aUATNnlgEzaJgBAmmaATNqnAECa50BM2yeATNtnwECbqIBNG-jATpwpQE7caYBO3KpATtzqgE7dKsBO3WtATt2rwECd7EBO3izAQJ5tAE7erUBO3u2AQJ8uQE8fboBQn68AUN_vQFDgAHAAUOBAcEBQ4IBwgFDgwHEAUOEAcYBAoUByAFDhgHKAQKHAcsBQ4gBzAFDiQHNAQKKAdABRIsB0QFKjAHTAUuNAdQBS44B1wFLjwHYAUuQAdkBS5EB2wFLkgHdAQKTAd8BS5QB4QEClQHiAUuWAeMBS5cB5AECmAHnAUyZAegBUpoB6gFTmwHrAVOcAe4BU50B7wFTngHwAVOfAfIBU6AB9AECoQH2AVOiAfgBAqMB-QFTpAH6AVOlAfsBAqYB_gFUpwH_AVqoAYECW6kBggJbqgGFAlurAYYCW6wBhwJbrQGJAluuAYsCAq8BjQJbsAGPAgKxAZACW7IBkQJbswGSAgK0AZUCXLUBlgJitgGYAmO3AZkCY7gBnAJjuQGdAmO6AZ4CY7sBoAJjvAGiAgK9AaQCY74BpgICvwGnAmPAAagCY8EBqQICwgGsAmTDAa0CasQBrwJrxQGwAmvGAbMCa8cBtAJryAG1AmvJAbcCa8oBuQICywG7AmvMAb0CAs0BvgJrzgG_AmvPAcACAtABwwJs0QHEAnLXAcYCc9gB1gJz2QHZAnPaAdoCc9sB2wJz3AHdAnPdAd8CAt4B4QJz3wHjAgLgAeQCc-EB5QJz4gHmAgLjAekCeeQB6gJ_5QHrAnTmAewCdOcB7QJ06AHuAnTpAe8CdOoB8QJ06wHzAgLsAfUCdO0B9wIC7gH4AnTvAfkCdPAB-gIC8QH9AoAB8gH-AoYB8wH_AnX0AYADdfUBgQN19gGCA3X3AYMDdfgBhQN1-QGHAwL6AYkDdfsBiwMC_AGMA3X9AY0Ddf4BjgMC_wGRA4cBgAKSA40BgQKTA3aCApQDdoMClQN2hAKWA3aFApcDdoYCmQN2hwKbAwKIAp0DdokCnwMCigKgA3aLAqEDdowCogMCjQKlA44BjgKmA5QB"
+ strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"habit\",\"records\",\"_count\",\"habits\",\"checkIns\",\"list\",\"items\",\"checkLists\",\"templates\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.updateOne\",\"User.updateMany\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Article.findUnique\",\"Article.findUniqueOrThrow\",\"Article.findFirst\",\"Article.findFirstOrThrow\",\"Article.findMany\",\"Article.createOne\",\"Article.createMany\",\"Article.updateOne\",\"Article.updateMany\",\"Article.upsertOne\",\"Article.deleteOne\",\"Article.deleteMany\",\"Article.groupBy\",\"Article.aggregate\",\"Strategy.findUnique\",\"Strategy.findUniqueOrThrow\",\"Strategy.findFirst\",\"Strategy.findFirstOrThrow\",\"Strategy.findMany\",\"Strategy.createOne\",\"Strategy.createMany\",\"Strategy.updateOne\",\"Strategy.updateMany\",\"Strategy.upsertOne\",\"Strategy.deleteOne\",\"Strategy.deleteMany\",\"Strategy.groupBy\",\"Strategy.aggregate\",\"indicator\",\"points\",\"Indicator.findUnique\",\"Indicator.findUniqueOrThrow\",\"Indicator.findFirst\",\"Indicator.findFirstOrThrow\",\"Indicator.findMany\",\"Indicator.createOne\",\"Indicator.createMany\",\"Indicator.updateOne\",\"Indicator.updateMany\",\"Indicator.upsertOne\",\"Indicator.deleteOne\",\"Indicator.deleteMany\",\"Indicator.groupBy\",\"Indicator.aggregate\",\"IndicatorPoint.findUnique\",\"IndicatorPoint.findUniqueOrThrow\",\"IndicatorPoint.findFirst\",\"IndicatorPoint.findFirstOrThrow\",\"IndicatorPoint.findMany\",\"IndicatorPoint.createOne\",\"IndicatorPoint.createMany\",\"IndicatorPoint.updateOne\",\"IndicatorPoint.updateMany\",\"IndicatorPoint.upsertOne\",\"IndicatorPoint.deleteOne\",\"IndicatorPoint.deleteMany\",\"IndicatorPoint.groupBy\",\"IndicatorPoint.aggregate\",\"News.findUnique\",\"News.findUniqueOrThrow\",\"News.findFirst\",\"News.findFirstOrThrow\",\"News.findMany\",\"News.createOne\",\"News.createMany\",\"News.updateOne\",\"News.updateMany\",\"News.upsertOne\",\"News.deleteOne\",\"News.deleteMany\",\"News.groupBy\",\"News.aggregate\",\"Alert.findUnique\",\"Alert.findUniqueOrThrow\",\"Alert.findFirst\",\"Alert.findFirstOrThrow\",\"Alert.findMany\",\"Alert.createOne\",\"Alert.createMany\",\"Alert.updateOne\",\"Alert.updateMany\",\"Alert.upsertOne\",\"Alert.deleteOne\",\"Alert.deleteMany\",\"Alert.groupBy\",\"Alert.aggregate\",\"ServerNode.findUnique\",\"ServerNode.findUniqueOrThrow\",\"ServerNode.findFirst\",\"ServerNode.findFirstOrThrow\",\"ServerNode.findMany\",\"ServerNode.createOne\",\"ServerNode.createMany\",\"ServerNode.updateOne\",\"ServerNode.updateMany\",\"ServerNode.upsertOne\",\"ServerNode.deleteOne\",\"ServerNode.deleteMany\",\"ServerNode.groupBy\",\"ServerNode.aggregate\",\"ServerNodeHistory.findUnique\",\"ServerNodeHistory.findUniqueOrThrow\",\"ServerNodeHistory.findFirst\",\"ServerNodeHistory.findFirstOrThrow\",\"ServerNodeHistory.findMany\",\"ServerNodeHistory.createOne\",\"ServerNodeHistory.createMany\",\"ServerNodeHistory.updateOne\",\"ServerNodeHistory.updateMany\",\"ServerNodeHistory.upsertOne\",\"ServerNodeHistory.deleteOne\",\"ServerNodeHistory.deleteMany\",\"ServerNodeHistory.groupBy\",\"ServerNodeHistory.aggregate\",\"ServiceCheck.findUnique\",\"ServiceCheck.findUniqueOrThrow\",\"ServiceCheck.findFirst\",\"ServiceCheck.findFirstOrThrow\",\"ServiceCheck.findMany\",\"ServiceCheck.createOne\",\"ServiceCheck.createMany\",\"ServiceCheck.updateOne\",\"ServiceCheck.updateMany\",\"ServiceCheck.upsertOne\",\"ServiceCheck.deleteOne\",\"ServiceCheck.deleteMany\",\"ServiceCheck.groupBy\",\"ServiceCheck.aggregate\",\"Econ_SowInventory.findUnique\",\"Econ_SowInventory.findUniqueOrThrow\",\"Econ_SowInventory.findFirst\",\"Econ_SowInventory.findFirstOrThrow\",\"Econ_SowInventory.findMany\",\"Econ_SowInventory.createOne\",\"Econ_SowInventory.createMany\",\"Econ_SowInventory.updateOne\",\"Econ_SowInventory.updateMany\",\"Econ_SowInventory.upsertOne\",\"Econ_SowInventory.deleteOne\",\"Econ_SowInventory.deleteMany\",\"Econ_SowInventory.groupBy\",\"Econ_SowInventory.aggregate\",\"ScraperCache.findUnique\",\"ScraperCache.findUniqueOrThrow\",\"ScraperCache.findFirst\",\"ScraperCache.findFirstOrThrow\",\"ScraperCache.findMany\",\"ScraperCache.createOne\",\"ScraperCache.createMany\",\"ScraperCache.updateOne\",\"ScraperCache.updateMany\",\"ScraperCache.upsertOne\",\"ScraperCache.deleteOne\",\"ScraperCache.deleteMany\",\"ScraperCache.groupBy\",\"ScraperCache.aggregate\",\"OilPriceHistory.findUnique\",\"OilPriceHistory.findUniqueOrThrow\",\"OilPriceHistory.findFirst\",\"OilPriceHistory.findFirstOrThrow\",\"OilPriceHistory.findMany\",\"OilPriceHistory.createOne\",\"OilPriceHistory.createMany\",\"OilPriceHistory.updateOne\",\"OilPriceHistory.updateMany\",\"OilPriceHistory.upsertOne\",\"OilPriceHistory.deleteOne\",\"OilPriceHistory.deleteMany\",\"OilPriceHistory.groupBy\",\"OilPriceHistory.aggregate\",\"MihomeAccount.findUnique\",\"MihomeAccount.findUniqueOrThrow\",\"MihomeAccount.findFirst\",\"MihomeAccount.findFirstOrThrow\",\"MihomeAccount.findMany\",\"MihomeAccount.createOne\",\"MihomeAccount.createMany\",\"MihomeAccount.updateOne\",\"MihomeAccount.updateMany\",\"MihomeAccount.upsertOne\",\"MihomeAccount.deleteOne\",\"MihomeAccount.deleteMany\",\"MihomeAccount.groupBy\",\"MihomeAccount.aggregate\",\"home\",\"device\",\"samples\",\"hours\",\"devices\",\"MihomeHome.findUnique\",\"MihomeHome.findUniqueOrThrow\",\"MihomeHome.findFirst\",\"MihomeHome.findFirstOrThrow\",\"MihomeHome.findMany\",\"MihomeHome.createOne\",\"MihomeHome.createMany\",\"MihomeHome.updateOne\",\"MihomeHome.updateMany\",\"MihomeHome.upsertOne\",\"MihomeHome.deleteOne\",\"MihomeHome.deleteMany\",\"MihomeHome.groupBy\",\"MihomeHome.aggregate\",\"MihomeDevice.findUnique\",\"MihomeDevice.findUniqueOrThrow\",\"MihomeDevice.findFirst\",\"MihomeDevice.findFirstOrThrow\",\"MihomeDevice.findMany\",\"MihomeDevice.createOne\",\"MihomeDevice.createMany\",\"MihomeDevice.updateOne\",\"MihomeDevice.updateMany\",\"MihomeDevice.upsertOne\",\"MihomeDevice.deleteOne\",\"MihomeDevice.deleteMany\",\"MihomeDevice.groupBy\",\"MihomeDevice.aggregate\",\"MihomeEnvSample.findUnique\",\"MihomeEnvSample.findUniqueOrThrow\",\"MihomeEnvSample.findFirst\",\"MihomeEnvSample.findFirstOrThrow\",\"MihomeEnvSample.findMany\",\"MihomeEnvSample.createOne\",\"MihomeEnvSample.createMany\",\"MihomeEnvSample.updateOne\",\"MihomeEnvSample.updateMany\",\"MihomeEnvSample.upsertOne\",\"MihomeEnvSample.deleteOne\",\"MihomeEnvSample.deleteMany\",\"MihomeEnvSample.groupBy\",\"MihomeEnvSample.aggregate\",\"MihomeEnvHour.findUnique\",\"MihomeEnvHour.findUniqueOrThrow\",\"MihomeEnvHour.findFirst\",\"MihomeEnvHour.findFirstOrThrow\",\"MihomeEnvHour.findMany\",\"MihomeEnvHour.createOne\",\"MihomeEnvHour.createMany\",\"MihomeEnvHour.updateOne\",\"MihomeEnvHour.updateMany\",\"MihomeEnvHour.upsertOne\",\"MihomeEnvHour.deleteOne\",\"MihomeEnvHour.deleteMany\",\"MihomeEnvHour.groupBy\",\"MihomeEnvHour.aggregate\",\"Habit.findUnique\",\"Habit.findUniqueOrThrow\",\"Habit.findFirst\",\"Habit.findFirstOrThrow\",\"Habit.findMany\",\"Habit.createOne\",\"Habit.createMany\",\"Habit.updateOne\",\"Habit.updateMany\",\"Habit.upsertOne\",\"Habit.deleteOne\",\"Habit.deleteMany\",\"Habit.groupBy\",\"Habit.aggregate\",\"CheckIn.findUnique\",\"CheckIn.findUniqueOrThrow\",\"CheckIn.findFirst\",\"CheckIn.findFirstOrThrow\",\"CheckIn.findMany\",\"CheckIn.createOne\",\"CheckIn.createMany\",\"CheckIn.updateOne\",\"CheckIn.updateMany\",\"CheckIn.upsertOne\",\"CheckIn.deleteOne\",\"CheckIn.deleteMany\",\"CheckIn.groupBy\",\"CheckIn.aggregate\",\"CheckList.findUnique\",\"CheckList.findUniqueOrThrow\",\"CheckList.findFirst\",\"CheckList.findFirstOrThrow\",\"CheckList.findMany\",\"CheckList.createOne\",\"CheckList.createMany\",\"CheckList.updateOne\",\"CheckList.updateMany\",\"CheckList.upsertOne\",\"CheckList.deleteOne\",\"CheckList.deleteMany\",\"CheckList.groupBy\",\"CheckList.aggregate\",\"CheckListItem.findUnique\",\"CheckListItem.findUniqueOrThrow\",\"CheckListItem.findFirst\",\"CheckListItem.findFirstOrThrow\",\"CheckListItem.findMany\",\"CheckListItem.createOne\",\"CheckListItem.createMany\",\"CheckListItem.updateOne\",\"CheckListItem.updateMany\",\"CheckListItem.upsertOne\",\"CheckListItem.deleteOne\",\"CheckListItem.deleteMany\",\"CheckListItem.groupBy\",\"CheckListItem.aggregate\",\"CheckListTemplate.findUnique\",\"CheckListTemplate.findUniqueOrThrow\",\"CheckListTemplate.findFirst\",\"CheckListTemplate.findFirstOrThrow\",\"CheckListTemplate.findMany\",\"CheckListTemplate.createOne\",\"CheckListTemplate.createMany\",\"CheckListTemplate.updateOne\",\"CheckListTemplate.updateMany\",\"CheckListTemplate.upsertOne\",\"CheckListTemplate.deleteOne\",\"CheckListTemplate.deleteMany\",\"CheckListTemplate.groupBy\",\"CheckListTemplate.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"userId\",\"name\",\"scene\",\"builtin\",\"createdAt\",\"updatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"search\",\"listId\",\"title\",\"note\",\"done\",\"doneAt\",\"sortOrder\",\"archived\",\"habitId\",\"date\",\"seq\",\"source\",\"period\",\"target\",\"color\",\"icon\",\"deviceId\",\"hour\",\"temperatureAvg\",\"humidityAvg\",\"raw\",\"temperature\",\"humidity\",\"temperatureMin\",\"temperatureMax\",\"humidityMin\",\"humidityMax\",\"origin\",\"sampledAt\",\"did\",\"homeId\",\"model\",\"alias\",\"tempSiid\",\"tempPiid\",\"humSiid\",\"humPiid\",\"battSiid\",\"battPiid\",\"battery\",\"batteryAt\",\"enabled\",\"lastSyncAt\",\"every\",\"some\",\"none\",\"deviceId_hour\",\"deviceId_date\",\"key\",\"status\",\"lastError\",\"province\",\"fuel\",\"price\",\"date_province_fuel\",\"scraperName\",\"lastDataHash\",\"lastUpdateAt\",\"metadata\",\"month\",\"inventory\",\"url\",\"latencyMs\",\"message\",\"lastCheckAt\",\"uuid\",\"cpu\",\"ram\",\"load\",\"disk\",\"netIn\",\"netOut\",\"process\",\"connections\",\"uuid_period\",\"cpuName\",\"os\",\"region\",\"memTotal\",\"diskTotal\",\"cpuCores\",\"cpuUsage\",\"ramUsed\",\"swapUsed\",\"load1\",\"load5\",\"load15\",\"diskUsed\",\"uptime\",\"recordedAt\",\"indicatorName\",\"valueA\",\"valueB\",\"sourceA\",\"sourceB\",\"diff\",\"diffRatio\",\"summary\",\"content\",\"publishedAt\",\"impactRank\",\"title_publishedAt\",\"indicatorId\",\"value\",\"groupName\",\"unit\",\"frequency\",\"hidden\",\"indicatorId_period\",\"description\",\"slug\",\"email\",\"password\",\"habitId_date_seq\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"_relevance\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"),
+ graph: "lQi_AcICDQcAAIsFACAIAACMBQAgCwAAjQUAIAwAAI4FACDeAgAAigUAMN8CAAAaABDgAgAAigUAMOECAgAAAAHjAgEAzwQAIeYCQADQBAAh5wJAANAEACHoAwEAAAAB6QMBAM8EACEBAAAAAQAgEQMAAJQFACAFAACMBQAg3gIAAJkFADDfAgAAAwAQ4AIAAJkFADDhAgIAzgQAIeICAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh_AIBAM8EACH_AgIAzgQAIYADIADdBAAhhQMBAM8EACGGAwIAzgQAIYcDAQDPBAAhiAMBAM8EACEDAwAA0QcAIAUAAM0HACD2AwAA2QcAIBEDAACUBQAgBQAAjAUAIN4CAACZBQAw3wIAAAMAEOACAACZBQAw4QICAAAAAeICAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh_AIBAM8EACH_AgIAzgQAIYADIADdBAAhhQMBAM8EACGGAwIAzgQAIYcDAQDPBAAhiAMBAM8EACEDAAAAAwAgAQAABAAwAgAABQAgDQMAAJQFACAEAACYBQAg3gIAAJcFADDfAgAABwAQ4AIAAJcFADDhAgIAzgQAIeICAgDOBAAh5gJAANAEACH8AgEAzwQAIYEDAgDOBAAhggMBAM8EACGDAwIAzgQAIYQDAQDPBAAhAwMAANEHACAEAADXBwAg9gMAANgHACAOAwAAlAUAIAQAAJgFACDeAgAAlwUAMN8CAAAHABDgAgAAlwUAMOECAgAAAAHiAgIAzgQAIeYCQADQBAAh_AIBAM8EACGBAwIAzgQAIYIDAQDPBAAhgwMCAM4EACGEAwEAzwQAIeoDAACWBQAgAwAAAAcAIAEAAAgAMAIAAAkAIAEAAAAHACADAAAABwAgAQAACAAwAgAACQAgDQMAAJQFACAKAACVBQAg3gIAAJMFADDfAgAADQAQ4AIAAJMFADDhAgIAzgQAIeICAgDOBAAh5AIBAM8EACHmAkAA0AQAIecCQADQBAAh-wIBAM8EACH8AgEAzwQAIYADIADdBAAhAwMAANEHACAKAADVBwAg9gMAANYHACANAwAAlAUAIAoAAJUFACDeAgAAkwUAMN8CAAANABDgAgAAkwUAMOECAgAAAAHiAgIAzgQAIeQCAQDPBAAh5gJAANAEACHnAkAA0AQAIfsCAQDPBAAh_AIBAM8EACGAAyAA3QQAIQMAAAANACABAAAOADACAAAPACANCQAAkgUAIN4CAACRBQAw3wIAABEAEOACAACRBQAw4QICAM4EACHmAkAA0AQAIecCQADQBAAh-gICAM4EACH7AgEAzwQAIfwCAQDPBAAh_QIgAN0EACH-AkAA2QQAIf8CAgDOBAAhAwkAANMHACD-AgAAmgUAIPYDAADUBwAgDQkAAJIFACDeAgAAkQUAMN8CAAARABDgAgAAkQUAMOECAgAAAAHmAkAA0AQAIecCQADQBAAh-gICAM4EACH7AgEAzwQAIfwCAQDPBAAh_QIgAN0EACH-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_wQAMN8CAABqABDgAgAA_wQAMOECAgAAAAHjAgEAAAAB5gJAANAEACHnAkAA0AQAIfsCAQDPBAAhhAMBAM8EACHhAwEAzwQAIeIDAQDPBAAh4wMBAM8EACHkAyAA3QQAIQEAAABiACAKPwAAgwUAIN4CAACCBQAw3wIAAGQAEOACAACCBQAw4QICAM4EACHmAkAA0AQAIecCQADQBAAhhQMBAM8EACHfAwIAzgQAIeADCADnBAAhAj8AAIQHACD2AwAAhQcAIAs_AACDBQAg3gIAAIIFADDfAgAAZAAQ4AIAAIIFADDhAgIAAAAB5gJAANAEACHnAkAA0AQAIYUDAQDPBAAh3wMCAM4EACHgAwgA5wQAIeUDAACBBQAgAwAAAGQAIAEAAGUAMAIAAGYAIAEAAABkACABAAAAYgAgDkAAAIAFACDeAgAA_wQAMN8CAABqABDgAgAA_wQAMOECAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh-wIBAM8EACGEAwEAzwQAIeEDAQDPBAAh4gMBAM8EACHjAwEAzwQAIeQDIADdBAAhAkAAAIIHACD2AwAAgwcAIAMAAABqACABAABrADACAABiACADAAAAagAgAQAAawAwAgAAYgAgAwAAAGoAIAEAAGsAMAIAAGIAIAtAAACBBwAg4QICAAAAAeMCAQAAAAHmAkAAAAAB5wJAAAAAAfsCAQAAAAGEAwEAAAAB4QMBAAAAAeIDAQAAAAHjAwEAAAAB5AMgAAAAAQESAABvACAK4QICAAAAAeMCAQAAAAHmAkAAAAAB5wJAAAAAAfsCAQAAAAGEAwEAAAAB4QMBAAAAAeIDAQAAAAHjAwEAAAAB5AMgAAAAAQESAABxADALQAAA9AYAIOECAgCjBQAh4wIBAKAFACHmAkAAogUAIecCQACiBQAh-wIBAKAFACGEAwEAoAUAIeEDAQCgBQAh4gMBAKAFACHjAwEAoAUAIeQDIAChBQAhAgAAAGIAIBIAAHMAIArhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfsCAQCgBQAhhAMBAKAFACHhAwEAoAUAIeIDAQCgBQAh4wMBAKAFACHkAyAAoQUAIQIAAABqACASAAB1ACADAAAAYgAgFwAAbwAgGAAAcwAgAQAAAGIAIAEAAABqACAFBgAA7wYAIB0AAPAGACAeAADzBgAgHwAA8gYAICAAAPEGACAN3gIAAP4EADDfAgAAewAQ4AIAAP4EADDhAgIAqAQAIeMCAQCqBAAh5gJAAK0EACHnAkAArQQAIfsCAQCqBAAhhAMBAKoEACHhAwEAqgQAIeIDAQCqBAAh4wMBAKoEACHkAyAArAQAIQMAAABqACABAAB6ADAcAAB7ACADAAAAagAgAQAAawAwAgAAYgAgAQAAAGYAIAEAAABmACADAAAAZAAgAQAAZQAwAgAAZgAgAwAAAGQAIAEAAGUAMAIAAGYAIAMAAABkACABAABlADACAABmACAHPwAA7gYAIOECAgAAAAHmAkAAAAAB5wJAAAAAAYUDAQAAAAHfAwIAAAAB4AMIAAAAAQESAACDAQAgBuECAgAAAAHmAkAAAAAB5wJAAAAAAYUDAQAAAAHfAwIAAAAB4AMIAAAAAQESAACFAQAwBz8AAO0GACDhAgIAowUAIeYCQACiBQAh5wJAAKIFACGFAwEAoAUAId8DAgCjBQAh4AMIALsGACECAAAAZgAgEgAAhwEAIAbhAgIAowUAIeYCQACiBQAh5wJAAKIFACGFAwEAoAUAId8DAgCjBQAh4AMIALsGACECAAAAZAAgEgAAiQEAIAMAAABmACAXAACDAQAgGAAAhwEAIAEAAABmACABAAAAZAAgBQYAAOgGACAdAADpBgAgHgAA7AYAIB8AAOsGACAgAADqBgAgCd4CAAD9BAAw3wIAAI8BABDgAgAA_QQAMOECAgCoBAAh5gJAAK0EACHnAkAArQQAIYUDAQCqBAAh3wMCAKgEACHgAwgA5AQAIQMAAABkACABAACOAQAwHAAAjwEAIAMAAABkACABAABlADACAABmACAN3gIAAPsEADDfAgAAlQEAEOACAAD7BAAw4QICAAAAAeYCQADQBAAh-wIBAM8EACGEAwEAzwQAIbYDAQDPBAAh2gMBAM8EACHbAwEA2wQAIdwDQADQBAAh3QMCAM4EACHeAwAA_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_AwQA9AQAIcADBAD0BAAhwQMCAM4EACHCAwIAzgQAIcQDAQDPBAAhxQMBAM8EACHGAwEAzwQAIccDBAD0BAAhyAMEAPQEACHJAwIAzgQAIcoDCADnBAAhywMEAPQEACHMAwQA9AQAIc0DCADnBAAhzgMIAOcEACHPAwgA5wQAIdADBAD0BAAh0QMEAPQEACHSA0AA0AQAIQH2AwAA2wYAIAMAAADDAQAgAQAAxAEAMAIAAMABACADAAAAwwEAIAEAAMQBADACAADAAQAgAwAAAMMBACABAADEAQAwAgAAwAEAIBnhAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAABqgMBAAAAAboDAQAAAAG_AwQAAAABwAMEAAAAAcEDAgAAAAHCAwIAAAABxAMBAAAAAcUDAQAAAAHGAwEAAAABxwMEAAAAAcgDBAAAAAHJAwIAAAABygMIAAAAAcsDBAAAAAHMAwQAAAABzQMIAAAAAc4DCAAAAAHPAwgAAAAB0AMEAAAAAdEDBAAAAAHSA0AAAAABARIAAMgBACAZ4QICAAAAAeMCAQAAAAHmAkAAAAAB5wJAAAAAAaoDAQAAAAG6AwEAAAABvwMEAAAAAcADBAAAAAHBAwIAAAABwgMCAAAAAcQDAQAAAAHFAwEAAAABxgMBAAAAAccDBAAAAAHIAwQAAAAByQMCAAAAAcoDCAAAAAHLAwQAAAABzAMEAAAAAc0DCAAAAAHOAwgAAAABzwMIAAAAAdADBAAAAAHRAwQAAAAB0gNAAAAAAQESAADKAQAwGeECAgCjBQAh4wIBAKAFACHmAkAAogUAIecCQACiBQAhqgMBAKAFACG6AwEAoAUAIb8DBADUBgAhwAMEANQGACHBAwIAowUAIcIDAgCjBQAhxAMBAKAFACHFAwEAoAUAIcYDAQCgBQAhxwMEANQGACHIAwQA1AYAIckDAgCjBQAhygMIALsGACHLAwQA1AYAIcwDBADUBgAhzQMIALsGACHOAwgAuwYAIc8DCAC7BgAh0AMEANQGACHRAwQA1AYAIdIDQACiBQAhAgAAAMABACASAADMAQAgGeECAgCjBQAh4wIBAKAFACHmAkAAogUAIecCQACiBQAhqgMBAKAFACG6AwEAoAUAIb8DBADUBgAhwAMEANQGACHBAwIAowUAIcIDAgCjBQAhxAMBAKAFACHFAwEAoAUAIcYDAQCgBQAhxwMEANQGACHIAwQA1AYAIckDAgCjBQAhygMIALsGACHLAwQA1AYAIcwDBADUBgAhzQMIALsGACHOAwgAuwYAIc8DCAC7BgAh0AMEANQGACHRAwQA1AYAIdIDQACiBQAhAgAAAMMBACASAADOAQAgAwAAAMABACAXAADIAQAgGAAAzAEAIAEAAADAAQAgAQAAAMMBACAFBgAA1gYAIB0AANcGACAeAADaBgAgHwAA2QYAICAAANgGACAc3gIAAPYEADDfAgAA1AEAEOACAAD2BAAw4QICAKgEACHjAgEAqgQAIeYCQACtBAAh5wJAAK0EACGqAwEAqgQAIboDAQCqBAAhvwMEAPAEACHAAwQA8AQAIcEDAgCoBAAhwgMCAKgEACHEAwEAqgQAIcUDAQCqBAAhxgMBAKoEACHHAwQA8AQAIcgDBADwBAAhyQMCAKgEACHKAwgA5AQAIcsDBADwBAAhzAMEAPAEACHNAwgA5AQAIc4DCADkBAAhzwMIAOQEACHQAwQA8AQAIdEDBADwBAAh0gNAAK0EACEDAAAAwwEAIAEAANMBADAcAADUAQAgAwAAAMMBACABAADEAQAwAgAAwAEAIBDeAgAA8wQAMN8CAADaAQAQ4AIAAPMEADDhAgIAAAAB5gJAANAEACGFA0AA0AQAIboDAQDPBAAhuwMIAOcEACG8AwQA9AQAIb0DCADnBAAhvgMEAPQEACG_AwQA9AQAIcADBAD0BAAhwQMCAM4EACHCAwIAzgQAIcMDAAD1BAAgAQAAANcBACABAAAA1wEAIA_eAgAA8wQAMN8CAADaAQAQ4AIAAPMEADDhAgIAzgQAIeYCQADQBAAhhQNAANAEACG6AwEAzwQAIbsDCADnBAAhvAMEAPQEACG9AwgA5wQAIb4DBAD0BAAhvwMEAPQEACHAAwQA9AQAIcEDAgDOBAAhwgMCAM4EACEB9gMAANUGACADAAAA2gEAIAEAANsBADACAADXAQAgAwAAANoBACABAADbAQAwAgAA1wEAIAMAAADaAQAgAQAA2wEAMAIAANcBACAM4QICAAAAAeYCQAAAAAGFA0AAAAABugMBAAAAAbsDCAAAAAG8AwQAAAABvQMIAAAAAb4DBAAAAAG_AwQAAAABwAMEAAAAAcEDAgAAAAHCAwIAAAABARIAAN8BACAM4QICAAAAAeYCQAAAAAGFA0AAAAABugMBAAAAAbsDCAAAAAG8AwQAAAABvQMIAAAAAb4DBAAAAAG_AwQAAAABwAMEAAAAAcEDAgAAAAHCAwIAAAABARIAAOEBADAM4QICAKMFACHmAkAAogUAIYUDQACiBQAhugMBAKAFACG7AwgAuwYAIbwDBADUBgAhvQMIALsGACG-AwQA1AYAIb8DBADUBgAhwAMEANQGACHBAwIAowUAIcIDAgCjBQAhAgAAANcBACASAADjAQAgDOECAgCjBQAh5gJAAKIFACGFA0AAogUAIboDAQCgBQAhuwMIALsGACG8AwQA1AYAIb0DCAC7BgAhvgMEANQGACG_AwQA1AYAIcADBADUBgAhwQMCAKMFACHCAwIAowUAIQIAAADaAQAgEgAA5QEAIAMAAADXAQAgFwAA3wEAIBgAAOMBACABAAAA1wEAIAEAAADaAQAgBQYAAM8GACAdAADQBgAgHgAA0wYAIB8AANIGACAgAADRBgAgD94CAADvBAAw3wIAAOsBABDgAgAA7wQAMOECAgCoBAAh5gJAAK0EACGFA0AArQQAIboDAQCqBAAhuwMIAOQEACG8AwQA8AQAIb0DCADkBAAhvgMEAPAEACG_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-BgAgHgAAwQYAIB8AAMAGACAgAAC_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_hAgIAowUAIeYCQACiBQAhggNAAKIFACGJAwIAowUAIYsDCADnBQAhjAMIAOcFACGNA4AAAAABjgMIAOcFACGPAwgA5wUAIZADCADnBQAhkQMIAOcFACGSAwgA5wUAIZMDCADnBQAhlAMBAKAFACGVA0AArAUAIQIAAADnAgAgEgAApgMAIAMAAADpAgAgFwAAoAMAIBgAAKQDACABAAAA6QIAIAEAAADnAgAgDwYAAOoFACAdAADrBQAgHgAA7gUAIB8AAO0FACAgAADsBQAgiwMAAJoFACCMAwAAmgUAII0DAACaBQAgjgMAAJoFACCPAwAAmgUAIJADAACaBQAgkQMAAJoFACCSAwAAmgUAIJMDAACaBQAglQMAAJoFACAS3gIAAMcEADDfAgAArAMAEOACAADHBAAw4QICAKgEACHmAkAArQQAIYIDQACtBAAhiQMCAKgEACGLAwgAwwQAIYwDCADDBAAhjQMAAMQEACCOAwgAwwQAIY8DCADDBAAhkAMIAMMEACGRAwgAwwQAIZIDCADDBAAhkwMIAMMEACGUAwEAqgQAIZUDQAC8BAAhAwAAAOcCACABAACrAwAwHAAArAMAIAMAAADnAgAgAQAA6AIAMAIAAOkCACABAAAA7QIAIAEAAADtAgAgAwAAAOsCACABAADsAgAwAgAA7QIAIAMAAADrAgAgAQAA7AIAMAIAAO0CACADAAAA6wIAIAEAAOwCADACAADtAgAgCNwBAADpBQAg4QICAAAAAeYCQAAAAAGJAwIAAAABigNAAAAAAYsDCAAAAAGMAwgAAAABjQOAAAAAAQESAAC0AwAgB-ECAgAAAAHmAkAAAAABiQMCAAAAAYoDQAAAAAGLAwgAAAABjAMIAAAAAY0DgAAAAAEBEgAAtgMAMAjcAQAA6AUAIOECAgCjBQAh5gJAAKIFACGJAwIAowUAIYoDQACiBQAhiwMIAOcFACGMAwgA5wUAIY0DgAAAAAECAAAA7QIAIBIAALgDACAH4QICAKMFACHmAkAAogUAIYkDAgCjBQAhigNAAKIFACGLAwgA5wUAIYwDCADnBQAhjQOAAAAAAQIAAADrAgAgEgAAugMAIAMAAADtAgAgFwAAtAMAIBgAALgDACABAAAA7QIAIAEAAADrAgAgCAYAAOIFACAdAADjBQAgHgAA5gUAIB8AAOUFACAgAADkBQAgiwMAAJoFACCMAwAAmgUAII0DAACaBQAgCt4CAADCBAAw3wIAAMADABDgAgAAwgQAMOECAgCoBAAh5gJAAK0EACGJAwIAqAQAIYoDQACtBAAhiwMIAMMEACGMAwgAwwQAIY0DAADEBAAgAwAAAOsCACABAAC_AwAwHAAAwAMAIAMAAADrAgAgAQAA7AIAMAIAAO0CACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIA4DAADgBQAgBQAA4QUAIOECAgAAAAHiAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAAB_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQESAADIAwAgDOECAgAAAAHiAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAAB_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQESAADKAwAwDgMAANIFACAFAADTBQAg4QICAKMFACHiAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfwCAQCgBQAh_wICAKMFACGAAyAAoQUAIYUDAQCgBQAhhgMCAKMFACGHAwEAoAUAIYgDAQCgBQAhAgAAAAUAIBIAAMwDACAM4QICAKMFACHiAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfwCAQCgBQAh_wICAKMFACGAAyAAoQUAIYUDAQCgBQAhhgMCAKMFACGHAwEAoAUAIYgDAQCgBQAhAgAAAAMAIBIAAM4DACADAAAABQAgFwAAyAMAIBgAAMwDACABAAAABQAgAQAAAAMAIAUGAADNBQAgHQAAzgUAIB4AANEFACAfAADQBQAgIAAAzwUAIA_eAgAAwQQAMN8CAADUAwAQ4AIAAMEEADDhAgIAqAQAIeICAgCoBAAh4wIBAKoEACHmAkAArQQAIecCQACtBAAh_AIBAKoEACH_AgIAqAQAIYADIACsBAAhhQMBAKoEACGGAwIAqAQAIYcDAQCqBAAhiAMBAKoEACEDAAAAAwAgAQAA0wMAMBwAANQDACADAAAAAwAgAQAABAAwAgAABQAgAQAAAAkAIAEAAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACAKAwAAzAUAIAQAAMsFACDhAgIAAAAB4gICAAAAAeYCQAAAAAH8AgEAAAABgQMCAAAAAYIDAQAAAAGDAwIAAAABhAMBAAAAAQESAADcAwAgCOECAgAAAAHiAgIAAAAB5gJAAAAAAfwCAQAAAAGBAwIAAAABggMBAAAAAYMDAgAAAAGEAwEAAAABARIAAN4DADAKAwAAygUAIAQAAMkFACDhAgIAowUAIeICAgCjBQAh5gJAAKIFACH8AgEAoAUAIYEDAgCjBQAhggMBAKAFACGDAwIAowUAIYQDAQCgBQAhAgAAAAkAIBIAAOADACAI4QICAKMFACHiAgIAowUAIeYCQACiBQAh_AIBAKAFACGBAwIAowUAIYIDAQCgBQAhgwMCAKMFACGEAwEAoAUAIQIAAAAHACASAADiAwAgAwAAAAkAIBcAANwDACAYAADgAwAgAQAAAAkAIAEAAAAHACAFBgAAxAUAIB0AAMUFACAeAADIBQAgHwAAxwUAICAAAMYFACAL3gIAAMAEADDfAgAA6AMAEOACAADABAAw4QICAKgEACHiAgIAqAQAIeYCQACtBAAh_AIBAKoEACGBAwIAqAQAIYIDAQCqBAAhgwMCAKgEACGEAwEAqgQAIQMAAAAHACABAADnAwAwHAAA6AMAIAMAAAAHACABAAAIADACAAAJACABAAAADwAgAQAAAA8AIAMAAAANACABAAAOADACAAAPACADAAAADQAgAQAADgAwAgAADwAgAwAAAA0AIAEAAA4AMAIAAA8AIAoDAADCBQAgCgAAwwUAIOECAgAAAAHiAgIAAAAB5AIBAAAAAeYCQAAAAAHnAkAAAAAB-wIBAAAAAfwCAQAAAAGAAyAAAAABARIAAPADACAI4QICAAAAAeICAgAAAAHkAgEAAAAB5gJAAAAAAecCQAAAAAH7AgEAAAAB_AIBAAAAAYADIAAAAAEBEgAA8gMAMAoDAAC0BQAgCgAAtQUAIOECAgCjBQAh4gICAKMFACHkAgEAoAUAIeYCQACiBQAh5wJAAKIFACH7AgEAoAUAIfwCAQCgBQAhgAMgAKEFACECAAAADwAgEgAA9AMAIAjhAgIAowUAIeICAgCjBQAh5AIBAKAFACHmAkAAogUAIecCQACiBQAh-wIBAKAFACH8AgEAoAUAIYADIAChBQAhAgAAAA0AIBIAAPYDACADAAAADwAgFwAA8AMAIBgAAPQDACABAAAADwAgAQAAAA0AIAUGAACvBQAgHQAAsAUAIB4AALMFACAfAACyBQAgIAAAsQUAIAveAgAAvwQAMN8CAAD8AwAQ4AIAAL8EADDhAgIAqAQAIeICAgCoBAAh5AIBAKoEACHmAkAArQQAIecCQACtBAAh-wIBAKoEACH8AgEAqgQAIYADIACsBAAhAwAAAA0AIAEAAPsDADAcAAD8AwAgAwAAAA0AIAEAAA4AMAIAAA8AIAEAAAATACABAAAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACADAAAAEQAgAQAAEgAwAgAAEwAgCgkAAK4FACDhAgIAAAAB5gJAAAAAAecCQAAAAAH6AgIAAAAB-wIBAAAAAfwCAQAAAAH9AiAAAAAB_gJAAAAAAf8CAgAAAAEBEgAAhAQAIAnhAgIAAAAB5gJAAAAAAecCQAAAAAH6AgIAAAAB-wIBAAAAAfwCAQAAAAH9AiAAAAAB_gJAAAAAAf8CAgAAAAEBEgAAhgQAMAoJAACtBQAg4QICAKMFACHmAkAAogUAIecCQACiBQAh-gICAKMFACH7AgEAoAUAIfwCAQCgBQAh_QIgAKEFACH-AkAArAUAIf8CAgCjBQAhAgAAABMAIBIAAIgEACAJ4QICAKMFACHmAkAAogUAIecCQACiBQAh-gICAKMFACH7AgEAoAUAIfwCAQCgBQAh_QIgAKEFACH-AkAArAUAIf8CAgCjBQAhAgAAABEAIBIAAIoEACADAAAAEwAgFwAAhAQAIBgAAIgEACABAAAAEwAgAQAAABEAIAYGAACnBQAgHQAAqAUAIB4AAKsFACAfAACqBQAgIAAAqQUAIP4CAACaBQAgDN4CAAC7BAAw3wIAAJAEABDgAgAAuwQAMOECAgCoBAAh5gJAAK0EACHnAkAArQQAIfoCAgCoBAAh-wIBAKoEACH8AgEAqgQAIf0CIACsBAAh_gJAALwEACH_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_AIBAKoEACH9AiAArAQAIf4CQAC8BAAh_wICAKgEACELBgAAtwQAIB8AAL4EACAgAAC-BAAg6AJAAAAAAekCQAAAAAXqAkAAAAAF6wJAAAAAAewCQAAAAAHtAkAAAAAB7gJAAAAAAe8CQAC9BAAhCwYAALcEACAfAAC-BAAgIAAAvgQAIOgCQAAAAAHpAkAAAAAF6gJAAAAABesCQAAAAAHsAkAAAAAB7QJAAAAAAe4CQAAAAAHvAkAAvQQAIQjoAkAAAAAB6QJAAAAABeoCQAAAAAXrAkAAAAAB7AJAAAAAAe0CQAAAAAHuAkAAAAAB7wJAAL4EACEL3gIAAL8EADDfAgAA_AMAEOACAAC_BAAw4QICAKgEACHiAgIAqAQAIeQCAQCqBAAh5gJAAK0EACHnAkAArQQAIfsCAQCqBAAh_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_AwQA8AQAIcADBADwBAAhwQMCAKgEACHCAwIAqAQAIQ0GAACvBAAgHQAAugQAIB4AAPIEACAfAADyBAAgIAAA8gQAIOgCBAAAAAHpAgQAAAAE6gIEAAAABOsCBAAAAAHsAgQAAAAB7QIEAAAAAe4CBAAAAAHvAgQA8QQAIQ0GAACvBAAgHQAAugQAIB4AAPIEACAfAADyBAAgIAAA8gQAIOgCBAAAAAHpAgQAAAAE6gIEAAAABOsCBAAAAAHsAgQAAAAB7QIEAAAAAe4CBAAAAAHvAgQA8QQAIQjoAgQAAAAB6QIEAAAABOoCBAAAAATrAgQAAAAB7AIEAAAAAe0CBAAAAAHuAgQAAAAB7wIEAPIEACEP3gIAAPMEADDfAgAA2gEAEOACAADzBAAw4QICAM4EACHmAkAA0AQAIYUDQADQBAAhugMBAM8EACG7AwgA5wQAIbwDBAD0BAAhvQMIAOcEACG-AwQA9AQAIb8DBAD0BAAhwAMEAPQEACHBAwIAzgQAIcIDAgDOBAAhCOgCBAAAAAHpAgQAAAAE6gIEAAAABOsCBAAAAAHsAgQAAAAB7QIEAAAAAe4CBAAAAAHvAgQA8gQAIQKFA0AAAAABugMBAAAAARzeAgAA9gQAMN8CAADUAQAQ4AIAAPYEADDhAgIAqAQAIeMCAQCqBAAh5gJAAK0EACHnAkAArQQAIaoDAQCqBAAhugMBAKoEACG_AwQA8AQAIcADBADwBAAhwQMCAKgEACHCAwIAqAQAIcQDAQCqBAAhxQMBAKoEACHGAwEAqgQAIccDBADwBAAhyAMEAPAEACHJAwIAqAQAIcoDCADkBAAhywMEAPAEACHMAwQA8AQAIc0DCADkBAAhzgMIAOQEACHPAwgA5AQAIdADBADwBAAh0QMEAPAEACHSA0AArQQAIRzeAgAA9wQAMN8CAADDAQAQ4AIAAPcEADDhAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIaoDAQDPBAAhugMBAM8EACG_AwQA9AQAIcADBAD0BAAhwQMCAM4EACHCAwIAzgQAIcQDAQDPBAAhxQMBAM8EACHGAwEAzwQAIccDBAD0BAAhyAMEAPQEACHJAwIAzgQAIcoDCADnBAAhywMEAPQEACHMAwQA9AQAIc0DCADnBAAhzgMIAOcEACHPAwgA5wQAIdADBAD0BAAh0QMEAPQEACHSA0AA0AQAIQ3eAgAA-AQAMN8CAAC9AQAQ4AIAAPgEADDhAgIAqAQAIeYCQACtBAAhhQMBAKoEACHTAwEAqgQAIdQDCADkBAAh1QMIAOQEACHWAwEAqgQAIdcDAQCqBAAh2AMIAOQEACHZAwgA5AQAIQ3eAgAA-QQAMN8CAACsAQAQ4AIAAPkEADDhAgIAzgQAIeYCQADQBAAhhQMBAM8EACHTAwEAzwQAIdQDCADnBAAh1QMIAOcEACHWAwEAzwQAIdcDAQDPBAAh2AMIAOcEACHZAwgA5wQAIQzeAgAA-gQAMN8CAACmAQAQ4AIAAPoEADDhAgIAqAQAIeYCQACtBAAh-wIBAKoEACGEAwEAqgQAIbYDAQCqBAAh2gMBAKoEACHbAwEAyQQAIdwDQACtBAAh3QMCAKgEACEM3gIAAPsEADDfAgAAlQEAEOACAAD7BAAw4QICAM4EACHmAkAA0AQAIfsCAQDPBAAhhAMBAM8EACG2AwEAzwQAIdoDAQDPBAAh2wMBANsEACHcA0AA0AQAId0DAgDOBAAhAvsCAQAAAAHcA0AAAAABCd4CAAD9BAAw3wIAAI8BABDgAgAA_QQAMOECAgCoBAAh5gJAAK0EACHnAkAArQQAIYUDAQCqBAAh3wMCAKgEACHgAwgA5AQAIQ3eAgAA_gQAMN8CAAB7ABDgAgAA_gQAMOECAgCoBAAh4wIBAKoEACHmAkAArQQAIecCQACtBAAh-wIBAKoEACGEAwEAqgQAIeEDAQCqBAAh4gMBAKoEACHjAwEAqgQAIeQDIACsBAAhDkAAAIAFACDeAgAA_wQAMN8CAABqABDgAgAA_wQAMOECAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh-wIBAM8EACGEAwEAzwQAIeEDAQDPBAAh4gMBAM8EACHjAwEAzwQAIeQDIADdBAAhA6QDAABkACClAwAAZAAgpgMAAGQAIAKFAwEAAAAB3wMCAAAAAQo_AACDBQAg3gIAAIIFADDfAgAAZAAQ4AIAAIIFADDhAgIAzgQAIeYCQADQBAAh5wJAANAEACGFAwEAzwQAId8DAgDOBAAh4AMIAOcEACEQQAAAgAUAIN4CAAD_BAAw3wIAAGoAEOACAAD_BAAw4QICAM4EACHjAgEAzwQAIeYCQADQBAAh5wJAANAEACH7AgEAzwQAIYQDAQDPBAAh4QMBAM8EACHiAwEAzwQAIeMDAQDPBAAh5AMgAN0EACHrAwAAagAg7AMAAGoAIAkSAACrBAAg3gIAAIQFADDfAgAAXwAQ4AIAAIQFADDhAgIAqAQAIeMCAQCqBAAh5gJAAK0EACHnAkAArQQAIeYDAQCqBAAhCRIAAIYFACDeAgAAhQUAMN8CAABOABDgAgAAhQUAMOECAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh5gMBAM8EACEM6AKAAAAAAesCgAAAAAHsAoAAAAAB7QKAAAAAAe4CgAAAAAHvAoAAAAAB8AIBAAAAAfECAQAAAAHyAgEAAAAB8wKAAAAAAfQCgAAAAAH1AoAAAAABCt4CAACHBQAw3wIAAEgAEOACAACHBQAw4QICAKgEACHmAkAArQQAIecCQACtBAAh-wIBAKoEACGCAwEAqgQAIdsDAQCqBAAh5wMBAKoEACEK3gIAAIgFADDfAgAANwAQ4AIAAIgFADDhAgIAzgQAIeYCQADQBAAh5wJAANAEACH7AgEAzwQAIYIDAQDPBAAh2wMBAM8EACHnAwEAzwQAIQneAgAAiQUAMN8CAAAxABDgAgAAiQUAMOECAgCoBAAh4wIBAKoEACHmAkAArQQAIecCQACtBAAh6AMBAKoEACHpAwEAqgQAIQ0HAACLBQAgCAAAjAUAIAsAAI0FACAMAACOBQAg3gIAAIoFADDfAgAAGgAQ4AIAAIoFADDhAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIegDAQDPBAAh6QMBAM8EACEDpAMAAAMAIKUDAAADACCmAwAAAwAgA6QDAAAHACClAwAABwAgpgMAAAcAIAOkAwAADQAgpQMAAA0AIKYDAAANACADpAMAABYAIKUDAAAWACCmAwAAFgAgDAMAAJAFACAKAACGBQAg3gIAAI8FADDfAgAAFgAQ4AIAAI8FADDhAgIAzgQAIeICAgDcBAAh4wIBAM8EACHkAgEAzwQAIeUCIADdBAAh5gJAANAEACHnAkAA0AQAIQ8HAACLBQAgCAAAjAUAIAsAAI0FACAMAACOBQAg3gIAAIoFADDfAgAAGgAQ4AIAAIoFADDhAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIegDAQDPBAAh6QMBAM8EACHrAwAAGgAg7AMAABoAIA0JAACSBQAg3gIAAJEFADDfAgAAEQAQ4AIAAJEFADDhAgIAzgQAIeYCQADQBAAh5wJAANAEACH6AgIAzgQAIfsCAQDPBAAh_AIBAM8EACH9AiAA3QQAIf4CQADZBAAh_wICAM4EACEPAwAAlAUAIAoAAJUFACDeAgAAkwUAMN8CAAANABDgAgAAkwUAMOECAgDOBAAh4gICAM4EACHkAgEAzwQAIeYCQADQBAAh5wJAANAEACH7AgEAzwQAIfwCAQDPBAAhgAMgAN0EACHrAwAADQAg7AMAAA0AIA0DAACUBQAgCgAAlQUAIN4CAACTBQAw3wIAAA0AEOACAACTBQAw4QICAM4EACHiAgIAzgQAIeQCAQDPBAAh5gJAANAEACHnAkAA0AQAIfsCAQDPBAAh_AIBAM8EACGAAyAA3QQAIQ8HAACLBQAgCAAAjAUAIAsAAI0FACAMAACOBQAg3gIAAIoFADDfAgAAGgAQ4AIAAIoFADDhAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIegDAQDPBAAh6QMBAM8EACHrAwAAGgAg7AMAABoAIAOkAwAAEQAgpQMAABEAIKYDAAARACADgQMCAAAAAYIDAQAAAAGDAwIAAAABDQMAAJQFACAEAACYBQAg3gIAAJcFADDfAgAABwAQ4AIAAJcFADDhAgIAzgQAIeICAgDOBAAh5gJAANAEACH8AgEAzwQAIYEDAgDOBAAhggMBAM8EACGDAwIAzgQAIYQDAQDPBAAhEwMAAJQFACAFAACMBQAg3gIAAJkFADDfAgAAAwAQ4AIAAJkFADDhAgIAzgQAIeICAgDOBAAh4wIBAM8EACHmAkAA0AQAIecCQADQBAAh_AIBAM8EACH_AgIAzgQAIYADIADdBAAhhQMBAM8EACGGAwIAzgQAIYcDAQDPBAAhiAMBAM8EACHrAwAAAwAg7AMAAAMAIBEDAACUBQAgBQAAjAUAIN4CAACZBQAw3wIAAAMAEOACAACZBQAw4QICAM4EACHiAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIfwCAQDPBAAh_wICAM4EACGAAyAA3QQAIYUDAQDPBAAhhgMCAM4EACGHAwEAzwQAIYgDAQDPBAAhAAAAAAAAAfADAQAAAAEB8AMgAAAAAQHwA0AAAAABBfADAgAAAAH3AwIAAAAB-AMCAAAAAfkDAgAAAAH6AwIAAAABBfADAgAAAAH3AwIAAAAB-AMCAAAAAfkDAgAAAAH6AwIAAAABBxcAAJEIACAYAACUCAAg7QMAAJIIACDuAwAAkwgAIPEDAAAaACDyAwAAGgAg8wMAAAEAIAMXAACRCAAg7QMAAJIIACDzAwAAAQAgAAAAAAAB8ANAAAAAAQUXAACMCAAgGAAAjwgAIO0DAACNCAAg7gMAAI4IACDzAwAADwAgAxcAAIwIACDtAwAAjQgAIPMDAAAPACAAAAAAAAUXAACGCAAgGAAAiggAIO0DAACHCAAg7gMAAIkIACDzAwAAAQAgCxcAALYFADAYAAC7BQAw7QMAALcFADDuAwAAuAUAMO8DAAC5BQAg8AMAALoFADDxAwAAugUAMPIDAAC6BQAw8wMAALoFADD0AwAAvAUAMPUDAAC9BQAwCOECAgAAAAHmAkAAAAAB5wJAAAAAAfsCAQAAAAH8AgEAAAAB_QIgAAAAAf4CQAAAAAH_AgIAAAABAgAAABMAIBcAAMEFACADAAAAEwAgFwAAwQUAIBgAAMAFACABEgAAiAgAMA0JAACSBQAg3gIAAJEFADDfAgAAEQAQ4AIAAJEFADDhAgIAAAAB5gJAANAEACHnAkAA0AQAIfoCAgDOBAAh-wIBAM8EACH8AgEAzwQAIf0CIADdBAAh_gJAANkEACH_AgIAzgQAIQIAAAATACASAADABQAgAgAAAL4FACASAAC_BQAgDN4CAAC9BQAw3wIAAL4FABDgAgAAvQUAMOECAgDOBAAh5gJAANAEACHnAkAA0AQAIfoCAgDOBAAh-wIBAM8EACH8AgEAzwQAIf0CIADdBAAh_gJAANkEACH_AgIAzgQAIQzeAgAAvQUAMN8CAAC-BQAQ4AIAAL0FADDhAgIAzgQAIeYCQADQBAAh5wJAANAEACH6AgIAzgQAIfsCAQDPBAAh_AIBAM8EACH9AiAA3QQAIf4CQADZBAAh_wICAM4EACEI4QICAKMFACHmAkAAogUAIecCQACiBQAh-wIBAKAFACH8AgEAoAUAIf0CIAChBQAh_gJAAKwFACH_AgIAowUAIQjhAgIAowUAIeYCQACiBQAh5wJAAKIFACH7AgEAoAUAIfwCAQCgBQAh_QIgAKEFACH-AkAArAUAIf8CAgCjBQAhCOECAgAAAAHmAkAAAAAB5wJAAAAAAfsCAQAAAAH8AgEAAAAB_QIgAAAAAf4CQAAAAAH_AgIAAAABAxcAAIYIACDtAwAAhwgAIPMDAAABACAEFwAAtgUAMO0DAAC3BQAw7wMAALkFACDzAwAAugUAMAAAAAAABRcAAP4HACAYAACECAAg7QMAAP8HACDuAwAAgwgAIPMDAAAFACAFFwAA_AcAIBgAAIEIACDtAwAA_QcAIO4DAACACAAg8wMAAAEAIAMXAAD-BwAg7QMAAP8HACDzAwAABQAgAxcAAPwHACDtAwAA_QcAIPMDAAABACAAAAAAAAUXAAD2BwAgGAAA-gcAIO0DAAD3BwAg7gMAAPkHACDzAwAAAQAgCxcAANQFADAYAADZBQAw7QMAANUFADDuAwAA1gUAMO8DAADXBQAg8AMAANgFADDxAwAA2AUAMPIDAADYBQAw8wMAANgFADD0AwAA2gUAMPUDAADbBQAwCAMAAMwFACDhAgIAAAAB4gICAAAAAeYCQAAAAAH8AgEAAAABggMBAAAAAYMDAgAAAAGEAwEAAAABAgAAAAkAIBcAAN8FACADAAAACQAgFwAA3wUAIBgAAN4FACABEgAA-AcAMA4DAACUBQAgBAAAmAUAIN4CAACXBQAw3wIAAAcAEOACAACXBQAw4QICAAAAAeICAgDOBAAh5gJAANAEACH8AgEAzwQAIYEDAgDOBAAhggMBAM8EACGDAwIAzgQAIYQDAQDPBAAh6gMAAJYFACACAAAACQAgEgAA3gUAIAIAAADcBQAgEgAA3QUAIAveAgAA2wUAMN8CAADcBQAQ4AIAANsFADDhAgIAzgQAIeICAgDOBAAh5gJAANAEACH8AgEAzwQAIYEDAgDOBAAhggMBAM8EACGDAwIAzgQAIYQDAQDPBAAhC94CAADbBQAw3wIAANwFABDgAgAA2wUAMOECAgDOBAAh4gICAM4EACHmAkAA0AQAIfwCAQDPBAAhgQMCAM4EACGCAwEAzwQAIYMDAgDOBAAhhAMBAM8EACEH4QICAKMFACHiAgIAowUAIeYCQACiBQAh_AIBAKAFACGCAwEAoAUAIYMDAgCjBQAhhAMBAKAFACEIAwAAygUAIOECAgCjBQAh4gICAKMFACHmAkAAogUAIfwCAQCgBQAhggMBAKAFACGDAwIAowUAIYQDAQCgBQAhCAMAAMwFACDhAgIAAAAB4gICAAAAAeYCQAAAAAH8AgEAAAABggMBAAAAAYMDAgAAAAGEAwEAAAABAxcAAPYHACDtAwAA9wcAIPMDAAABACAEFwAA1AUAMO0DAADVBQAw7wMAANcFACDzAwAA2AUAMAAAAAAABfADCAAAAAH3AwgAAAAB-AMIAAAAAfkDCAAAAAH6AwgAAAABBRcAAPEHACAYAAD0BwAg7QMAAPIHACDuAwAA8wcAIPMDAADlAgAgAxcAAPEHACDtAwAA8gcAIPMDAADlAgAgAAAAAAAFFwAA7AcAIBgAAO8HACDtAwAA7QcAIO4DAADuBwAg8wMAAOUCACADFwAA7AcAIO0DAADtBwAg8wMAAOUCACAAAAAAAAHwAwEAAAABBRcAAOUHACAYAADqBwAg7QMAAOYHACDuAwAA6QcAIPMDAADhAgAgCxcAAIYGADAYAACLBgAw7QMAAIcGADDuAwAAiAYAMO8DAACJBgAg8AMAAIoGADDxAwAAigYAMPIDAACKBgAw8wMAAIoGADD0AwAAjAYAMPUDAACNBgAwCxcAAPoFADAYAAD_BQAw7QMAAPsFADDuAwAA_AUAMO8DAAD9BQAg8AMAAP4FADDxAwAA_gUAMPIDAAD-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-QIBAAAAAQAAAAAABfADCAAAAAH3AwgAAAAB-AMIAAAAAfkDCAAAAAH6AwgAAAABAfkCAQAAAAEAAAAAAAH5AgEAAAABAAAAAAAB-QIBAAAAAQAAAAAAAfkCAQAAAAEAAAAAAAXwAwQAAAAB9wMEAAAAAfgDBAAAAAH5AwQAAAAB-gMEAAAAAQH5AgEAAAABAAAAAAAB-QIBAAAAAQAAAAAAAfkCAQAAAAEAAAAAAAH5AgEAAAABAAAAAAAFFwAA3wcAIBgAAOIHACDtAwAA4AcAIO4DAADhBwAg8wMAAGIAIAMXAADfBwAg7QMAAOAHACDzAwAAYgAgAAAAAAALFwAA9QYAMBgAAPoGADDtAwAA9gYAMO4DAAD3BgAw7wMAAPgGACDwAwAA-QYAMPEDAAD5BgAw8gMAAPkGADDzAwAA-QYAMPQDAAD7BgAw9QMAAPwGADAF4QICAAAAAeYCQAAAAAHnAkAAAAABhQMBAAAAAeADCAAAAAECAAAAZgAgFwAAgAcAIAMAAABmACAXAACABwAgGAAA_wYAIAESAADeBwAwCz8AAIMFACDeAgAAggUAMN8CAABkABDgAgAAggUAMOECAgAAAAHmAkAA0AQAIecCQADQBAAhhQMBAM8EACHfAwIAzgQAIeADCADnBAAh5QMAAIEFACACAAAAZgAgEgAA_wYAIAIAAAD9BgAgEgAA_gYAIAneAgAA_AYAMN8CAAD9BgAQ4AIAAPwGADDhAgIAzgQAIeYCQADQBAAh5wJAANAEACGFAwEAzwQAId8DAgDOBAAh4AMIAOcEACEJ3gIAAPwGADDfAgAA_QYAEOACAAD8BgAw4QICAM4EACHmAkAA0AQAIecCQADQBAAhhQMBAM8EACHfAwIAzgQAIeADCADnBAAhBeECAgCjBQAh5gJAAKIFACHnAkAAogUAIYUDAQCgBQAh4AMIALsGACEF4QICAKMFACHmAkAAogUAIecCQACiBQAhhQMBAKAFACHgAwgAuwYAIQXhAgIAAAAB5gJAAAAAAecCQAAAAAGFAwEAAAAB4AMIAAAAAQQXAAD1BgAw7QMAAPYGADDvAwAA-AYAIPMDAAD5BgAwAAH5AgEAAAABAkAAAIIHACD2AwAAgwcAIAH5AgEAAAABAAAAAAAB-QIBAAAAAQAAAAAAAfkCAQAAAAEAAAAAAAsXAAC8BwAwGAAAwQcAMO0DAAC9BwAw7gMAAL4HADDvAwAAvwcAIPADAADABwAw8QMAAMAHADDyAwAAwAcAMPMDAADABwAw9AMAAMIHADD1AwAAwwcAMAsXAACzBwAwGAAAtwcAMO0DAAC0BwAw7gMAALUHADDvAwAAtgcAIPADAADYBQAw8QMAANgFADDyAwAA2AUAMPMDAADYBQAw9AMAALgHADD1AwAA2wUAMAsXAACnBwAwGAAArAcAMO0DAACoBwAw7gMAAKkHADDvAwAAqgcAIPADAACrBwAw8QMAAKsHADDyAwAAqwcAMPMDAACrBwAw9AMAAK0HADD1AwAArgcAMAsXAACbBwAwGAAAoAcAMO0DAACcBwAw7gMAAJ0HADDvAwAAngcAIPADAACfBwAw8QMAAJ8HADDyAwAAnwcAMPMDAACfBwAw9AMAAKEHADD1AwAAogcAMAcKgAAAAAHhAgIAAAAB4wIBAAAAAeQCAQAAAAHlAiAAAAAB5gJAAAAAAecCQAAAAAECAAAAGAAgFwAApgcAIAMAAAAYACAXAACmBwAgGAAApQcAIAESAADdBwAwDAMAAJAFACAKAACGBQAg3gIAAI8FADDfAgAAFgAQ4AIAAI8FADDhAgIAAAAB4gICANwEACHjAgEAzwQAIeQCAQDPBAAh5QIgAN0EACHmAkAA0AQAIecCQADQBAAhAgAAABgAIBIAAKUHACACAAAAowcAIBIAAKQHACALCgAAhgUAIN4CAACiBwAw3wIAAKMHABDgAgAAogcAMOECAgDOBAAh4gICANwEACHjAgEAzwQAIeQCAQDPBAAh5QIgAN0EACHmAkAA0AQAIecCQADQBAAhCwoAAIYFACDeAgAAogcAMN8CAACjBwAQ4AIAAKIHADDhAgIAzgQAIeICAgDcBAAh4wIBAM8EACHkAgEAzwQAIeUCIADdBAAh5gJAANAEACHnAkAA0AQAIQcKgAAAAAHhAgIAowUAIeMCAQCgBQAh5AIBAKAFACHlAiAAoQUAIeYCQACiBQAh5wJAAKIFACEHCoAAAAAB4QICAKMFACHjAgEAoAUAIeQCAQCgBQAh5QIgAKEFACHmAkAAogUAIecCQACiBQAhBwqAAAAAAeECAgAAAAHjAgEAAAAB5AIBAAAAAeUCIAAAAAHmAkAAAAAB5wJAAAAAAQgKAADDBQAg4QICAAAAAeQCAQAAAAHmAkAAAAAB5wJAAAAAAfsCAQAAAAH8AgEAAAABgAMgAAAAAQIAAAAPACAXAACyBwAgAwAAAA8AIBcAALIHACAYAACxBwAgARIAANwHADANAwAAlAUAIAoAAJUFACDeAgAAkwUAMN8CAAANABDgAgAAkwUAMOECAgAAAAHiAgIAzgQAIeQCAQDPBAAh5gJAANAEACHnAkAA0AQAIfsCAQDPBAAh_AIBAM8EACGAAyAA3QQAIQIAAAAPACASAACxBwAgAgAAAK8HACASAACwBwAgC94CAACuBwAw3wIAAK8HABDgAgAArgcAMOECAgDOBAAh4gICAM4EACHkAgEAzwQAIeYCQADQBAAh5wJAANAEACH7AgEAzwQAIfwCAQDPBAAhgAMgAN0EACEL3gIAAK4HADDfAgAArwcAEOACAACuBwAw4QICAM4EACHiAgIAzgQAIeQCAQDPBAAh5gJAANAEACHnAkAA0AQAIfsCAQDPBAAh_AIBAM8EACGAAyAA3QQAIQfhAgIAowUAIeQCAQCgBQAh5gJAAKIFACHnAkAAogUAIfsCAQCgBQAh_AIBAKAFACGAAyAAoQUAIQgKAAC1BQAg4QICAKMFACHkAgEAoAUAIeYCQACiBQAh5wJAAKIFACH7AgEAoAUAIfwCAQCgBQAhgAMgAKEFACEICgAAwwUAIOECAgAAAAHkAgEAAAAB5gJAAAAAAecCQAAAAAH7AgEAAAAB_AIBAAAAAYADIAAAAAEIBAAAywUAIOECAgAAAAHmAkAAAAAB_AIBAAAAAYEDAgAAAAGCAwEAAAABgwMCAAAAAYQDAQAAAAECAAAACQAgFwAAuwcAIAMAAAAJACAXAAC7BwAgGAAAugcAIAESAADbBwAwAgAAAAkAIBIAALoHACACAAAA3AUAIBIAALkHACAH4QICAKMFACHmAkAAogUAIfwCAQCgBQAhgQMCAKMFACGCAwEAoAUAIYMDAgCjBQAhhAMBAKAFACEIBAAAyQUAIOECAgCjBQAh5gJAAKIFACH8AgEAoAUAIYEDAgCjBQAhggMBAKAFACGDAwIAowUAIYQDAQCgBQAhCAQAAMsFACDhAgIAAAAB5gJAAAAAAfwCAQAAAAGBAwIAAAABggMBAAAAAYMDAgAAAAGEAwEAAAABDAUAAOEFACDhAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAAB_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQIAAAAFACAXAADHBwAgAwAAAAUAIBcAAMcHACAYAADGBwAgARIAANoHADARAwAAlAUAIAUAAIwFACDeAgAAmQUAMN8CAAADABDgAgAAmQUAMOECAgAAAAHiAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIfwCAQDPBAAh_wICAM4EACGAAyAA3QQAIYUDAQDPBAAhhgMCAM4EACGHAwEAzwQAIYgDAQDPBAAhAgAAAAUAIBIAAMYHACACAAAAxAcAIBIAAMUHACAP3gIAAMMHADDfAgAAxAcAEOACAADDBwAw4QICAM4EACHiAgIAzgQAIeMCAQDPBAAh5gJAANAEACHnAkAA0AQAIfwCAQDPBAAh_wICAM4EACGAAyAA3QQAIYUDAQDPBAAhhgMCAM4EACGHAwEAzwQAIYgDAQDPBAAhD94CAADDBwAw3wIAAMQHABDgAgAAwwcAMOECAgDOBAAh4gICAM4EACHjAgEAzwQAIeYCQADQBAAh5wJAANAEACH8AgEAzwQAIf8CAgDOBAAhgAMgAN0EACGFAwEAzwQAIYYDAgDOBAAhhwMBAM8EACGIAwEAzwQAIQvhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfwCAQCgBQAh_wICAKMFACGAAyAAoQUAIYUDAQCgBQAhhgMCAKMFACGHAwEAoAUAIYgDAQCgBQAhDAUAANMFACDhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfwCAQCgBQAh_wICAKMFACGAAyAAoQUAIYUDAQCgBQAhhgMCAKMFACGHAwEAoAUAIYgDAQCgBQAhDAUAAOEFACDhAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAAB_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQQXAAC8BwAw7QMAAL0HADDvAwAAvwcAIPMDAADABwAwBBcAALMHADDtAwAAtAcAMO8DAAC2BwAg8wMAANgFADAEFwAApwcAMO0DAACoBwAw7wMAAKoHACDzAwAAqwcAMAQXAACbBwAw7QMAAJwHADDvAwAAngcAIPMDAACfBwAwAAAAAAH5AgEAAAABBQcAAMwHACAIAADNBwAgCwAAzgcAIAwAAM8HACD2AwAA0AcAIAH5AgEAAAABAwMAANEHACAKAADVBwAg9gMAANYHACAB-QIBAAAAAQAB-QIBAAAAAQMDAADRBwAgBQAAzQcAIPYDAADZBwAgAfkCAQAAAAEB-QIBAAAAAQvhAgIAAAAB4wIBAAAAAeYCQAAAAAHnAkAAAAAB_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQfhAgIAAAAB5gJAAAAAAfwCAQAAAAGBAwIAAAABggMBAAAAAYMDAgAAAAGEAwEAAAABB-ECAgAAAAHkAgEAAAAB5gJAAAAAAecCQAAAAAH7AgEAAAAB_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_AIBAAAAAf8CAgAAAAGAAyAAAAABhQMBAAAAAYYDAgAAAAGHAwEAAAABiAMBAAAAAQIAAAAFACAXAAD-BwAgAwAAABoAIBcAAPwHACAYAACCCAAgCwAAABoAIAcAAJcHACALAACZBwAgDAAAmgcAIBIAAIIIACDhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIegDAQCgBQAh6QMBAKAFACEJBwAAlwcAIAsAAJkHACAMAACaBwAg4QICAKMFACHjAgEAoAUAIeYCQACiBQAh5wJAAKIFACHoAwEAoAUAIekDAQCgBQAhAwAAAAMAIBcAAP4HACAYAACFCAAgDwAAAAMAIAMAANIFACASAACFCAAg4QICAKMFACHiAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIfwCAQCgBQAh_wICAKMFACGAAyAAoQUAIYUDAQCgBQAhhgMCAKMFACGHAwEAoAUAIYgDAQCgBQAhDQMAANIFACDhAgIAowUAIeICAgCjBQAh4wIBAKAFACHmAkAAogUAIecCQACiBQAh_AIBAKAFACH_AgIAowUAIYADIAChBQAhhQMBAKAFACGGAwIAowUAIYcDAQCgBQAhiAMBAKAFACEJBwAAyAcAIAgAAMkHACAMAADLBwAg4QICAAAAAeMCAQAAAAHmAkAAAAAB5wJAAAAAAegDAQAAAAHpAwEAAAABAgAAAAEAIBcAAIYIACAI4QICAAAAAeYCQAAAAAHnAkAAAAAB-wIBAAAAAfwCAQAAAAH9AiAAAAAB_gJAAAAAAf8CAgAAAAEDAAAAGgAgFwAAhggAIBgAAIsIACALAAAAGgAgBwAAlwcAIAgAAJgHACAMAACaBwAgEgAAiwgAIOECAgCjBQAh4wIBAKAFACHmAkAAogUAIecCQACiBQAh6AMBAKAFACHpAwEAoAUAIQkHAACXBwAgCAAAmAcAIAwAAJoHACDhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIegDAQCgBQAh6QMBAKAFACEJAwAAwgUAIOECAgAAAAHiAgIAAAAB5AIBAAAAAeYCQAAAAAHnAkAAAAAB-wIBAAAAAfwCAQAAAAGAAyAAAAABAgAAAA8AIBcAAIwIACADAAAADQAgFwAAjAgAIBgAAJAIACALAAAADQAgAwAAtAUAIBIAAJAIACDhAgIAowUAIeICAgCjBQAh5AIBAKAFACHmAkAAogUAIecCQACiBQAh-wIBAKAFACH8AgEAoAUAIYADIAChBQAhCQMAALQFACDhAgIAowUAIeICAgCjBQAh5AIBAKAFACHmAkAAogUAIecCQACiBQAh-wIBAKAFACH8AgEAoAUAIYADIAChBQAhCQcAAMgHACAIAADJBwAgCwAAygcAIOECAgAAAAHjAgEAAAAB5gJAAAAAAecCQAAAAAHoAwEAAAAB6QMBAAAAAQIAAAABACAXAACRCAAgAwAAABoAIBcAAJEIACAYAACVCAAgCwAAABoAIAcAAJcHACAIAACYBwAgCwAAmQcAIBIAAJUIACDhAgIAowUAIeMCAQCgBQAh5gJAAKIFACHnAkAAogUAIegDAQCgBQAh6QMBAKAFACEJBwAAlwcAIAgAAJgHACALAACZBwAg4QICAKMFACHjAgEAoAUAIeYCQACiBQAh5wJAAKIFACHoAwEAoAUAIekDAQCgBQAhBQYACQcGAggMAwsQBQwZCAMDAAEFCgMGAAQCAwABBAACAQULAAMDAAEGAAcKFAYBCQAFAQoVAAEDGwEEBxwACB0ACx4ADB8AAAUGAAwdAA0eAA4fAA8gABAAAAAAAAUGAAwdAA0eAA4fAA8gABAABQYAFB0AFR4AFh8AFyAAGAAAAAAABQYAFB0AFR4AFh8AFyAAGAAFBgAcHQAdHgAeHwAfIAAgAAAAAAAFBgAcHQAdHgAeHwAfIAAgAgYAJEBnIwE_ACIBQGgABQYAJh0AJx4AKB8AKSAAKgAAAAAABQYAJh0AJx4AKB8AKSAAKgUGAC0dAC4eAC8fADAgADEAAAAAAAUGAC0dAC4eAC8fADAgADEABQYANR0ANh4ANx8AOCAAOQAAAAAABQYANR0ANh4ANx8AOCAAOQAFBgA9HQA-HgA_HwBAIABBAAAAAAAFBgA9HQA-HgA_HwBAIABBAAUGAEUdAEYeAEcfAEggAEkAAAAAAAUGAEUdAEYeAEcfAEggAEkABQYATR0ATh4ATx8AUCAAUQAAAAAABQYATR0ATh4ATx8AUCAAUQAFBgBVHQBWHgBXHwBYIABZAAAAAAAFBgBVHQBWHgBXHwBYIABZAAUGAF0dAF4eAF8fAGAgAGEAAAAAAAUGAF0dAF4eAF8fAGAgAGEABQYAZR0AZh4AZx8AaCAAaQAAAAAABQYAZR0AZh4AZx8AaCAAaQAFBgBtHQBuHgBvHwBwIABxAAAAAAAFBgBtHQBuHgBvHwBwIABxAAUGAHUdAHYeAHcfAHggAHkAAAAAAAUGAHUdAHYeAHcfAHggAHkCBgCAAd8B5gJ8BAYAf9sBAHvdAeoCfd4B7gJ-AdwBAHwB3AEAfALdAe8CAN4B8AIAAd8B8QIABQYAggEdAIMBHgCEAR8AhQEgAIYBAAAAAAAFBgCCAR0AgwEeAIQBHwCFASAAhgEFBgCJAR0AigEeAIsBHwCMASAAjQEAAAAAAAUGAIkBHQCKAR4AiwEfAIwBIACNAQUGAJABHQCRAR4AkgEfAJMBIACUAQAAAAAABQYAkAEdAJEBHgCSAR8AkwEgAJQBBQYAlwEdAJgBHgCZAR8AmgEgAJsBAAAAAAAFBgCXAR0AmAEeAJkBHwCaASAAmwEFBgCeAR0AnwEeAKABHwChASAAogEAAAAAAAUGAJ4BHQCfAR4AoAEfAKEBIACiAQUGAKUBHQCmAR4ApwEfAKgBIACpAQAAAAAABQYApQEdAKYBHgCnAR8AqAEgAKkBBQYArAEdAK0BHgCuAR8ArwEgALABAAAAAAAFBgCsAR0ArQEeAK4BHwCvASAAsAEFBgCzAR0AtAEeALUBHwC2ASAAtwEAAAAAAAUGALMBHQC0AR4AtQEfALYBIAC3AQUGALoBHQC7AR4AvAEfAL0BIAC-AQAAAAAABQYAugEdALsBHgC8AR8AvQEgAL4BDQIBDiABDyIBECMBESQBEyYBFCgKFSoBFiwKGS0BGi4BGy8KITILIjMRIzUSJDYSJTkSJjoSJzsSKD0SKT8KKkESK0MKLEQSLUUSLkYKL0kTMEoZMUwaMk0aM1AaNFEaNVIaNlQaN1YKOFgaOVoKOlsaO1waPF0KPWAbPmEhQWMiQmkiQ2wiRG0iRW4iRnAiR3IKSHQiSXYKSnciS3giTHkKTXwlTn0rT34jUH8jUYABI1KBASNTggEjVIQBI1WGAQpWiAEjV4oBCliLASNZjAEjWo0BCluQASxckQEyXZMBM16UATNflwEzYJgBM2GZATNimwEzY50BCmSfATNloQEKZqIBM2ejATNopAEKaacBNGqoATprqgE7bKsBO22uATturwE7b7ABO3CyATtxtAEKcrYBO3O4AQp0uQE7dboBO3a7AQp3vgE8eL8BQnnBAUN6wgFDe8UBQ3zGAUN9xwFDfskBQ3_LAQqAAc0BQ4EBzwEKggHQAUODAdEBQ4QB0gEKhQHVAUSGAdYBSocB2AFLiAHZAUuJAdwBS4oB3QFLiwHeAUuMAeABS40B4gEKjgHkAUuPAeYBCpAB5wFLkQHoAUuSAekBCpMB7AFMlAHtAVKVAe8BU5YB8AFTlwHzAVOYAfQBU5kB9QFTmgH3AVObAfkBCpwB-wFTnQH9AQqeAf4BU58B_wFToAGAAgqhAYMCVKIBhAJaowGGAlukAYcCW6UBigJbpgGLAlunAYwCW6gBjgJbqQGQAgqqAZICW6sBlAIKrAGVAlutAZYCW64BlwIKrwGaAlywAZsCYrEBnQJjsgGeAmOzAaECY7QBogJjtQGjAmO2AaUCY7cBpwIKuAGpAmO5AasCCroBrAJjuwGtAmO8Aa4CCr0BsQJkvgGyAmq_AbQCa8ABtQJrwQG4AmvCAbkCa8MBugJrxAG8AmvFAb4CCsYBwAJrxwHCAgrIAcMCa8kBxAJrygHFAgrLAcgCbMwByQJyzQHLAnPOAcwCc88BzwJz0AHQAnPRAdECc9IB0wJz0wHVAgrUAdcCc9UB2QIK1gHaAnPXAdsCc9gB3AIK2QHfAnTaAeACeuAB4gJ74QHyAnviAfUCe-MB9gJ75AH3AnvlAfkCe-YB-wIK5wH9AnvoAf8CCukBgAN76gGBA3vrAYIDCuwBhQOBAe0BhgOHAe4BhwN87wGIA3zwAYkDfPEBigN88gGLA3zzAY0DfPQBjwMK9QGRA3z2AZMDCvcBlAN8-AGVA3z5AZYDCvoBmQOIAfsBmgOOAfwBmwN9_QGcA33-AZ0Dff8BngN9gAKfA32BAqEDfYICowMKgwKlA32EAqcDCoUCqAN9hgKpA32HAqoDCogCrQOPAYkCrgOVAYoCrwN-iwKwA36MArEDfo0CsgN-jgKzA36PArUDfpACtwMKkQK5A36SArsDCpMCvAN-lAK9A36VAr4DCpYCwQOWAZcCwgOcAZgCwwMCmQLEAwKaAsUDApsCxgMCnALHAwKdAskDAp4CywMKnwLNAwKgAs8DCqEC0AMCogLRAwKjAtIDCqQC1QOdAaUC1gOjAaYC1wMDpwLYAwOoAtkDA6kC2gMDqgLbAwOrAt0DA6wC3wMKrQLhAwOuAuMDCq8C5AMDsALlAwOxAuYDCrIC6QOkAbMC6gOqAbQC6wMFtQLsAwW2Au0DBbcC7gMFuALvAwW5AvEDBboC8wMKuwL1AwW8AvcDCr0C-AMFvgL5AwW_AvoDCsAC_QOrAcEC_gOxAcIC_wMGwwKABAbEAoEEBsUCggQGxgKDBAbHAoUEBsgChwQKyQKJBAbKAosECssCjAQGzAKNBAbNAo4ECs4CkQSyAc8CkgS4AdACkwQI0QKUBAjSApUECNMClgQI1AKXBAjVApkECNYCmwQK1wKdBAjYAp8ECtkCoAQI2gKhBAjbAqIECtwCpQS5Ad0CpgS_AQ"
}
async function decodeBase64AsWasm(wasmBase64: string): Promise {
@@ -367,6 +367,56 @@ export interface PrismaClient<
* ```
*/
get mihomeEnvHour(): Prisma.MihomeEnvHourDelegate;
+
+ /**
+ * `prisma.habit`: Exposes CRUD operations for the **Habit** model.
+ * Example usage:
+ * ```ts
+ * // Fetch zero or more Habits
+ * const habits = await prisma.habit.findMany()
+ * ```
+ */
+ get habit(): Prisma.HabitDelegate;
+
+ /**
+ * `prisma.checkIn`: Exposes CRUD operations for the **CheckIn** model.
+ * Example usage:
+ * ```ts
+ * // Fetch zero or more CheckIns
+ * const checkIns = await prisma.checkIn.findMany()
+ * ```
+ */
+ get checkIn(): Prisma.CheckInDelegate;
+
+ /**
+ * `prisma.checkList`: Exposes CRUD operations for the **CheckList** model.
+ * Example usage:
+ * ```ts
+ * // Fetch zero or more CheckLists
+ * const checkLists = await prisma.checkList.findMany()
+ * ```
+ */
+ get checkList(): Prisma.CheckListDelegate;
+
+ /**
+ * `prisma.checkListItem`: Exposes CRUD operations for the **CheckListItem** model.
+ * Example usage:
+ * ```ts
+ * // Fetch zero or more CheckListItems
+ * const checkListItems = await prisma.checkListItem.findMany()
+ * ```
+ */
+ get checkListItem(): Prisma.CheckListItemDelegate;
+
+ /**
+ * `prisma.checkListTemplate`: Exposes CRUD operations for the **CheckListTemplate** model.
+ * Example usage:
+ * ```ts
+ * // Fetch zero or more CheckListTemplates
+ * const checkListTemplates = await prisma.checkListTemplate.findMany()
+ * ```
+ */
+ get checkListTemplate(): Prisma.CheckListTemplateDelegate;
}
export function getPrismaClientClass(): PrismaClientConstructor {
diff --git a/generated/prisma/internal/prismaNamespace.ts b/generated/prisma/internal/prismaNamespace.ts
index 2a1166a..26ef65d 100644
--- a/generated/prisma/internal/prismaNamespace.ts
+++ b/generated/prisma/internal/prismaNamespace.ts
@@ -401,7 +401,12 @@ export const ModelName = {
MihomeHome: 'MihomeHome',
MihomeDevice: 'MihomeDevice',
MihomeEnvSample: 'MihomeEnvSample',
- MihomeEnvHour: 'MihomeEnvHour'
+ MihomeEnvHour: 'MihomeEnvHour',
+ Habit: 'Habit',
+ CheckIn: 'CheckIn',
+ CheckList: 'CheckList',
+ CheckListItem: 'CheckListItem',
+ CheckListTemplate: 'CheckListTemplate'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
@@ -417,7 +422,7 @@ export type TypeMap
+ fields: Prisma.HabitFieldRefs
+ operations: {
+ findUnique: {
+ args: Prisma.HabitFindUniqueArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findUniqueOrThrow: {
+ args: Prisma.HabitFindUniqueOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findFirst: {
+ args: Prisma.HabitFindFirstArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findFirstOrThrow: {
+ args: Prisma.HabitFindFirstOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findMany: {
+ args: Prisma.HabitFindManyArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ create: {
+ args: Prisma.HabitCreateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ createMany: {
+ args: Prisma.HabitCreateManyArgs
+ result: BatchPayload
+ }
+ delete: {
+ args: Prisma.HabitDeleteArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ update: {
+ args: Prisma.HabitUpdateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ deleteMany: {
+ args: Prisma.HabitDeleteManyArgs
+ result: BatchPayload
+ }
+ updateMany: {
+ args: Prisma.HabitUpdateManyArgs
+ result: BatchPayload
+ }
+ upsert: {
+ args: Prisma.HabitUpsertArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ aggregate: {
+ args: Prisma.HabitAggregateArgs
+ result: runtime.Types.Utils.Optional
+ }
+ groupBy: {
+ args: Prisma.HabitGroupByArgs
+ result: runtime.Types.Utils.Optional[]
+ }
+ count: {
+ args: Prisma.HabitCountArgs
+ result: runtime.Types.Utils.Optional | number
+ }
+ }
+ }
+ CheckIn: {
+ payload: Prisma.$CheckInPayload
+ fields: Prisma.CheckInFieldRefs
+ operations: {
+ findUnique: {
+ args: Prisma.CheckInFindUniqueArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findUniqueOrThrow: {
+ args: Prisma.CheckInFindUniqueOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findFirst: {
+ args: Prisma.CheckInFindFirstArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findFirstOrThrow: {
+ args: Prisma.CheckInFindFirstOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findMany: {
+ args: Prisma.CheckInFindManyArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ create: {
+ args: Prisma.CheckInCreateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ createMany: {
+ args: Prisma.CheckInCreateManyArgs
+ result: BatchPayload
+ }
+ delete: {
+ args: Prisma.CheckInDeleteArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ update: {
+ args: Prisma.CheckInUpdateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ deleteMany: {
+ args: Prisma.CheckInDeleteManyArgs
+ result: BatchPayload
+ }
+ updateMany: {
+ args: Prisma.CheckInUpdateManyArgs
+ result: BatchPayload
+ }
+ upsert: {
+ args: Prisma.CheckInUpsertArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ aggregate: {
+ args: Prisma.CheckInAggregateArgs
+ result: runtime.Types.Utils.Optional
+ }
+ groupBy: {
+ args: Prisma.CheckInGroupByArgs
+ result: runtime.Types.Utils.Optional[]
+ }
+ count: {
+ args: Prisma.CheckInCountArgs
+ result: runtime.Types.Utils.Optional | number
+ }
+ }
+ }
+ CheckList: {
+ payload: Prisma.$CheckListPayload
+ fields: Prisma.CheckListFieldRefs
+ operations: {
+ findUnique: {
+ args: Prisma.CheckListFindUniqueArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findUniqueOrThrow: {
+ args: Prisma.CheckListFindUniqueOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findFirst: {
+ args: Prisma.CheckListFindFirstArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findFirstOrThrow: {
+ args: Prisma.CheckListFindFirstOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findMany: {
+ args: Prisma.CheckListFindManyArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ create: {
+ args: Prisma.CheckListCreateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ createMany: {
+ args: Prisma.CheckListCreateManyArgs
+ result: BatchPayload
+ }
+ delete: {
+ args: Prisma.CheckListDeleteArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ update: {
+ args: Prisma.CheckListUpdateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ deleteMany: {
+ args: Prisma.CheckListDeleteManyArgs
+ result: BatchPayload
+ }
+ updateMany: {
+ args: Prisma.CheckListUpdateManyArgs
+ result: BatchPayload
+ }
+ upsert: {
+ args: Prisma.CheckListUpsertArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ aggregate: {
+ args: Prisma.CheckListAggregateArgs
+ result: runtime.Types.Utils.Optional
+ }
+ groupBy: {
+ args: Prisma.CheckListGroupByArgs
+ result: runtime.Types.Utils.Optional[]
+ }
+ count: {
+ args: Prisma.CheckListCountArgs
+ result: runtime.Types.Utils.Optional | number
+ }
+ }
+ }
+ CheckListItem: {
+ payload: Prisma.$CheckListItemPayload
+ fields: Prisma.CheckListItemFieldRefs
+ operations: {
+ findUnique: {
+ args: Prisma.CheckListItemFindUniqueArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findUniqueOrThrow: {
+ args: Prisma.CheckListItemFindUniqueOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findFirst: {
+ args: Prisma.CheckListItemFindFirstArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findFirstOrThrow: {
+ args: Prisma.CheckListItemFindFirstOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findMany: {
+ args: Prisma.CheckListItemFindManyArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ create: {
+ args: Prisma.CheckListItemCreateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ createMany: {
+ args: Prisma.CheckListItemCreateManyArgs
+ result: BatchPayload
+ }
+ delete: {
+ args: Prisma.CheckListItemDeleteArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ update: {
+ args: Prisma.CheckListItemUpdateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ deleteMany: {
+ args: Prisma.CheckListItemDeleteManyArgs
+ result: BatchPayload
+ }
+ updateMany: {
+ args: Prisma.CheckListItemUpdateManyArgs
+ result: BatchPayload
+ }
+ upsert: {
+ args: Prisma.CheckListItemUpsertArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ aggregate: {
+ args: Prisma.CheckListItemAggregateArgs
+ result: runtime.Types.Utils.Optional
+ }
+ groupBy: {
+ args: Prisma.CheckListItemGroupByArgs
+ result: runtime.Types.Utils.Optional[]
+ }
+ count: {
+ args: Prisma.CheckListItemCountArgs
+ result: runtime.Types.Utils.Optional | number
+ }
+ }
+ }
+ CheckListTemplate: {
+ payload: Prisma.$CheckListTemplatePayload
+ fields: Prisma.CheckListTemplateFieldRefs
+ operations: {
+ findUnique: {
+ args: Prisma.CheckListTemplateFindUniqueArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findUniqueOrThrow: {
+ args: Prisma.CheckListTemplateFindUniqueOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findFirst: {
+ args: Prisma.CheckListTemplateFindFirstArgs
+ result: runtime.Types.Utils.PayloadToResult | null
+ }
+ findFirstOrThrow: {
+ args: Prisma.CheckListTemplateFindFirstOrThrowArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ findMany: {
+ args: Prisma.CheckListTemplateFindManyArgs
+ result: runtime.Types.Utils.PayloadToResult[]
+ }
+ create: {
+ args: Prisma.CheckListTemplateCreateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ createMany: {
+ args: Prisma.CheckListTemplateCreateManyArgs
+ result: BatchPayload
+ }
+ delete: {
+ args: Prisma.CheckListTemplateDeleteArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ update: {
+ args: Prisma.CheckListTemplateUpdateArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ deleteMany: {
+ args: Prisma.CheckListTemplateDeleteManyArgs
+ result: BatchPayload
+ }
+ updateMany: {
+ args: Prisma.CheckListTemplateUpdateManyArgs
+ result: BatchPayload
+ }
+ upsert: {
+ args: Prisma.CheckListTemplateUpsertArgs
+ result: runtime.Types.Utils.PayloadToResult
+ }
+ aggregate: {
+ args: Prisma.CheckListTemplateAggregateArgs
+ result: runtime.Types.Utils.Optional
+ }
+ groupBy: {
+ args: Prisma.CheckListTemplateGroupByArgs
+ result: runtime.Types.Utils.Optional[]
+ }
+ count: {
+ args: Prisma.CheckListTemplateCountArgs
+ result: runtime.Types.Utils.Optional | number
+ }
+ }
+ }
}
} & {
other: {
@@ -1924,6 +2259,81 @@ export const MihomeEnvHourScalarFieldEnum = {
export type MihomeEnvHourScalarFieldEnum = (typeof MihomeEnvHourScalarFieldEnum)[keyof typeof MihomeEnvHourScalarFieldEnum]
+export const HabitScalarFieldEnum = {
+ id: 'id',
+ userId: 'userId',
+ name: 'name',
+ period: 'period',
+ target: 'target',
+ color: 'color',
+ icon: 'icon',
+ note: 'note',
+ archived: 'archived',
+ sortOrder: 'sortOrder',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type HabitScalarFieldEnum = (typeof HabitScalarFieldEnum)[keyof typeof HabitScalarFieldEnum]
+
+
+export const CheckInScalarFieldEnum = {
+ id: 'id',
+ habitId: 'habitId',
+ userId: 'userId',
+ date: 'date',
+ seq: 'seq',
+ note: 'note',
+ source: 'source',
+ createdAt: 'createdAt'
+} as const
+
+export type CheckInScalarFieldEnum = (typeof CheckInScalarFieldEnum)[keyof typeof CheckInScalarFieldEnum]
+
+
+export const CheckListScalarFieldEnum = {
+ id: 'id',
+ userId: 'userId',
+ title: 'title',
+ scene: 'scene',
+ note: 'note',
+ archived: 'archived',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type CheckListScalarFieldEnum = (typeof CheckListScalarFieldEnum)[keyof typeof CheckListScalarFieldEnum]
+
+
+export const CheckListItemScalarFieldEnum = {
+ id: 'id',
+ listId: 'listId',
+ title: 'title',
+ note: 'note',
+ done: 'done',
+ doneAt: 'doneAt',
+ sortOrder: 'sortOrder',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type CheckListItemScalarFieldEnum = (typeof CheckListItemScalarFieldEnum)[keyof typeof CheckListItemScalarFieldEnum]
+
+
+export const CheckListTemplateScalarFieldEnum = {
+ id: 'id',
+ userId: 'userId',
+ name: 'name',
+ scene: 'scene',
+ items: 'items',
+ builtin: 'builtin',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type CheckListTemplateScalarFieldEnum = (typeof CheckListTemplateScalarFieldEnum)[keyof typeof CheckListTemplateScalarFieldEnum]
+
+
export const SortOrder = {
asc: 'asc',
desc: 'desc'
@@ -2128,6 +2538,51 @@ export const MihomeEnvSampleOrderByRelevanceFieldEnum = {
export type MihomeEnvSampleOrderByRelevanceFieldEnum = (typeof MihomeEnvSampleOrderByRelevanceFieldEnum)[keyof typeof MihomeEnvSampleOrderByRelevanceFieldEnum]
+export const HabitOrderByRelevanceFieldEnum = {
+ name: 'name',
+ period: 'period',
+ color: 'color',
+ icon: 'icon',
+ note: 'note'
+} as const
+
+export type HabitOrderByRelevanceFieldEnum = (typeof HabitOrderByRelevanceFieldEnum)[keyof typeof HabitOrderByRelevanceFieldEnum]
+
+
+export const CheckInOrderByRelevanceFieldEnum = {
+ date: 'date',
+ note: 'note',
+ source: 'source'
+} as const
+
+export type CheckInOrderByRelevanceFieldEnum = (typeof CheckInOrderByRelevanceFieldEnum)[keyof typeof CheckInOrderByRelevanceFieldEnum]
+
+
+export const CheckListOrderByRelevanceFieldEnum = {
+ title: 'title',
+ scene: 'scene',
+ note: 'note'
+} as const
+
+export type CheckListOrderByRelevanceFieldEnum = (typeof CheckListOrderByRelevanceFieldEnum)[keyof typeof CheckListOrderByRelevanceFieldEnum]
+
+
+export const CheckListItemOrderByRelevanceFieldEnum = {
+ title: 'title',
+ note: 'note'
+} as const
+
+export type CheckListItemOrderByRelevanceFieldEnum = (typeof CheckListItemOrderByRelevanceFieldEnum)[keyof typeof CheckListItemOrderByRelevanceFieldEnum]
+
+
+export const CheckListTemplateOrderByRelevanceFieldEnum = {
+ name: 'name',
+ scene: 'scene'
+} as const
+
+export type CheckListTemplateOrderByRelevanceFieldEnum = (typeof CheckListTemplateOrderByRelevanceFieldEnum)[keyof typeof CheckListTemplateOrderByRelevanceFieldEnum]
+
+
/**
* Field references
@@ -2302,6 +2757,11 @@ export type GlobalOmitConfig = {
mihomeDevice?: Prisma.MihomeDeviceOmit
mihomeEnvSample?: Prisma.MihomeEnvSampleOmit
mihomeEnvHour?: Prisma.MihomeEnvHourOmit
+ habit?: Prisma.HabitOmit
+ checkIn?: Prisma.CheckInOmit
+ checkList?: Prisma.CheckListOmit
+ checkListItem?: Prisma.CheckListItemOmit
+ checkListTemplate?: Prisma.CheckListTemplateOmit
}
/* Types for Logging */
diff --git a/generated/prisma/internal/prismaNamespaceBrowser.ts b/generated/prisma/internal/prismaNamespaceBrowser.ts
index 96969ba..64b061e 100644
--- a/generated/prisma/internal/prismaNamespaceBrowser.ts
+++ b/generated/prisma/internal/prismaNamespaceBrowser.ts
@@ -68,7 +68,12 @@ export const ModelName = {
MihomeHome: 'MihomeHome',
MihomeDevice: 'MihomeDevice',
MihomeEnvSample: 'MihomeEnvSample',
- MihomeEnvHour: 'MihomeEnvHour'
+ MihomeEnvHour: 'MihomeEnvHour',
+ Habit: 'Habit',
+ CheckIn: 'CheckIn',
+ CheckList: 'CheckList',
+ CheckListItem: 'CheckListItem',
+ CheckListTemplate: 'CheckListTemplate'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
@@ -363,6 +368,81 @@ export const MihomeEnvHourScalarFieldEnum = {
export type MihomeEnvHourScalarFieldEnum = (typeof MihomeEnvHourScalarFieldEnum)[keyof typeof MihomeEnvHourScalarFieldEnum]
+export const HabitScalarFieldEnum = {
+ id: 'id',
+ userId: 'userId',
+ name: 'name',
+ period: 'period',
+ target: 'target',
+ color: 'color',
+ icon: 'icon',
+ note: 'note',
+ archived: 'archived',
+ sortOrder: 'sortOrder',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type HabitScalarFieldEnum = (typeof HabitScalarFieldEnum)[keyof typeof HabitScalarFieldEnum]
+
+
+export const CheckInScalarFieldEnum = {
+ id: 'id',
+ habitId: 'habitId',
+ userId: 'userId',
+ date: 'date',
+ seq: 'seq',
+ note: 'note',
+ source: 'source',
+ createdAt: 'createdAt'
+} as const
+
+export type CheckInScalarFieldEnum = (typeof CheckInScalarFieldEnum)[keyof typeof CheckInScalarFieldEnum]
+
+
+export const CheckListScalarFieldEnum = {
+ id: 'id',
+ userId: 'userId',
+ title: 'title',
+ scene: 'scene',
+ note: 'note',
+ archived: 'archived',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type CheckListScalarFieldEnum = (typeof CheckListScalarFieldEnum)[keyof typeof CheckListScalarFieldEnum]
+
+
+export const CheckListItemScalarFieldEnum = {
+ id: 'id',
+ listId: 'listId',
+ title: 'title',
+ note: 'note',
+ done: 'done',
+ doneAt: 'doneAt',
+ sortOrder: 'sortOrder',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type CheckListItemScalarFieldEnum = (typeof CheckListItemScalarFieldEnum)[keyof typeof CheckListItemScalarFieldEnum]
+
+
+export const CheckListTemplateScalarFieldEnum = {
+ id: 'id',
+ userId: 'userId',
+ name: 'name',
+ scene: 'scene',
+ items: 'items',
+ builtin: 'builtin',
+ createdAt: 'createdAt',
+ updatedAt: 'updatedAt'
+} as const
+
+export type CheckListTemplateScalarFieldEnum = (typeof CheckListTemplateScalarFieldEnum)[keyof typeof CheckListTemplateScalarFieldEnum]
+
+
export const SortOrder = {
asc: 'asc',
desc: 'desc'
@@ -566,3 +646,48 @@ export const MihomeEnvSampleOrderByRelevanceFieldEnum = {
export type MihomeEnvSampleOrderByRelevanceFieldEnum = (typeof MihomeEnvSampleOrderByRelevanceFieldEnum)[keyof typeof MihomeEnvSampleOrderByRelevanceFieldEnum]
+
+export const HabitOrderByRelevanceFieldEnum = {
+ name: 'name',
+ period: 'period',
+ color: 'color',
+ icon: 'icon',
+ note: 'note'
+} as const
+
+export type HabitOrderByRelevanceFieldEnum = (typeof HabitOrderByRelevanceFieldEnum)[keyof typeof HabitOrderByRelevanceFieldEnum]
+
+
+export const CheckInOrderByRelevanceFieldEnum = {
+ date: 'date',
+ note: 'note',
+ source: 'source'
+} as const
+
+export type CheckInOrderByRelevanceFieldEnum = (typeof CheckInOrderByRelevanceFieldEnum)[keyof typeof CheckInOrderByRelevanceFieldEnum]
+
+
+export const CheckListOrderByRelevanceFieldEnum = {
+ title: 'title',
+ scene: 'scene',
+ note: 'note'
+} as const
+
+export type CheckListOrderByRelevanceFieldEnum = (typeof CheckListOrderByRelevanceFieldEnum)[keyof typeof CheckListOrderByRelevanceFieldEnum]
+
+
+export const CheckListItemOrderByRelevanceFieldEnum = {
+ title: 'title',
+ note: 'note'
+} as const
+
+export type CheckListItemOrderByRelevanceFieldEnum = (typeof CheckListItemOrderByRelevanceFieldEnum)[keyof typeof CheckListItemOrderByRelevanceFieldEnum]
+
+
+export const CheckListTemplateOrderByRelevanceFieldEnum = {
+ name: 'name',
+ scene: 'scene'
+} as const
+
+export type CheckListTemplateOrderByRelevanceFieldEnum = (typeof CheckListTemplateOrderByRelevanceFieldEnum)[keyof typeof CheckListTemplateOrderByRelevanceFieldEnum]
+
diff --git a/generated/prisma/models.ts b/generated/prisma/models.ts
index 05ae935..5cd3c70 100644
--- a/generated/prisma/models.ts
+++ b/generated/prisma/models.ts
@@ -26,4 +26,9 @@ export type * from './models/MihomeHome.ts'
export type * from './models/MihomeDevice.ts'
export type * from './models/MihomeEnvSample.ts'
export type * from './models/MihomeEnvHour.ts'
+export type * from './models/Habit.ts'
+export type * from './models/CheckIn.ts'
+export type * from './models/CheckList.ts'
+export type * from './models/CheckListItem.ts'
+export type * from './models/CheckListTemplate.ts'
export type * from './commonInputTypes.ts'
\ No newline at end of file
diff --git a/generated/prisma/models/CheckIn.ts b/generated/prisma/models/CheckIn.ts
new file mode 100644
index 0000000..afe0207
--- /dev/null
+++ b/generated/prisma/models/CheckIn.ts
@@ -0,0 +1,1518 @@
+
+/* !!! This is code generated by Prisma. Do not edit directly. !!! */
+/* eslint-disable */
+// biome-ignore-all lint: generated file
+// @ts-nocheck
+/*
+ * This file exports the `CheckIn` model and its related types.
+ *
+ * 🟢 You can import this file directly.
+ */
+import type * as runtime from "@prisma/client/runtime/client"
+import type * as $Enums from "../enums.ts"
+import type * as Prisma from "../internal/prismaNamespace.ts"
+
+/**
+ * Model CheckIn
+ *
+ */
+export type CheckInModel = runtime.Types.Result.DefaultSelection
+
+export type AggregateCheckIn = {
+ _count: CheckInCountAggregateOutputType | null
+ _avg: CheckInAvgAggregateOutputType | null
+ _sum: CheckInSumAggregateOutputType | null
+ _min: CheckInMinAggregateOutputType | null
+ _max: CheckInMaxAggregateOutputType | null
+}
+
+export type CheckInAvgAggregateOutputType = {
+ id: number | null
+ habitId: number | null
+ userId: number | null
+ seq: number | null
+}
+
+export type CheckInSumAggregateOutputType = {
+ id: number | null
+ habitId: number | null
+ userId: number | null
+ seq: number | null
+}
+
+export type CheckInMinAggregateOutputType = {
+ id: number | null
+ habitId: number | null
+ userId: number | null
+ date: string | null
+ seq: number | null
+ note: string | null
+ source: string | null
+ createdAt: Date | null
+}
+
+export type CheckInMaxAggregateOutputType = {
+ id: number | null
+ habitId: number | null
+ userId: number | null
+ date: string | null
+ seq: number | null
+ note: string | null
+ source: string | null
+ createdAt: Date | null
+}
+
+export type CheckInCountAggregateOutputType = {
+ id: number
+ habitId: number
+ userId: number
+ date: number
+ seq: number
+ note: number
+ source: number
+ createdAt: number
+ _all: number
+}
+
+
+export type CheckInAvgAggregateInputType = {
+ id?: true
+ habitId?: true
+ userId?: true
+ seq?: true
+}
+
+export type CheckInSumAggregateInputType = {
+ id?: true
+ habitId?: true
+ userId?: true
+ seq?: true
+}
+
+export type CheckInMinAggregateInputType = {
+ id?: true
+ habitId?: true
+ userId?: true
+ date?: true
+ seq?: true
+ note?: true
+ source?: true
+ createdAt?: true
+}
+
+export type CheckInMaxAggregateInputType = {
+ id?: true
+ habitId?: true
+ userId?: true
+ date?: true
+ seq?: true
+ note?: true
+ source?: true
+ createdAt?: true
+}
+
+export type CheckInCountAggregateInputType = {
+ id?: true
+ habitId?: true
+ userId?: true
+ date?: true
+ seq?: true
+ note?: true
+ source?: true
+ createdAt?: true
+ _all?: true
+}
+
+export type CheckInAggregateArgs = {
+ /**
+ * Filter which CheckIn to aggregate.
+ */
+ where?: Prisma.CheckInWhereInput
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs}
+ *
+ * Determine the order of CheckIns to fetch.
+ */
+ orderBy?: Prisma.CheckInOrderByWithRelationInput | Prisma.CheckInOrderByWithRelationInput[]
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs}
+ *
+ * Sets the start position
+ */
+ cursor?: Prisma.CheckInWhereUniqueInput
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs}
+ *
+ * Take `±n` CheckIns from the position of the cursor.
+ */
+ take?: number
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs}
+ *
+ * Skip the first `n` CheckIns.
+ */
+ skip?: number
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs}
+ *
+ * Count returned CheckIns
+ **/
+ _count?: true | CheckInCountAggregateInputType
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs}
+ *
+ * Select which fields to average
+ **/
+ _avg?: CheckInAvgAggregateInputType
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs}
+ *
+ * Select which fields to sum
+ **/
+ _sum?: CheckInSumAggregateInputType
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs}
+ *
+ * Select which fields to find the minimum value
+ **/
+ _min?: CheckInMinAggregateInputType
+ /**
+ * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs}
+ *
+ * Select which fields to find the maximum value
+ **/
+ _max?: CheckInMaxAggregateInputType
+}
+
+export type GetCheckInAggregateType = {
+ [P in keyof T & keyof AggregateCheckIn]: P extends '_count' | 'count'
+ ? T[P] extends true
+ ? number
+ : Prisma.GetScalarType
+ : Prisma.GetScalarType
+}
+
+
+
+
+export type CheckInGroupByArgs = {
+ where?: Prisma.CheckInWhereInput
+ orderBy?: Prisma.CheckInOrderByWithAggregationInput | Prisma.CheckInOrderByWithAggregationInput[]
+ by: Prisma.CheckInScalarFieldEnum[] | Prisma.CheckInScalarFieldEnum
+ having?: Prisma.CheckInScalarWhereWithAggregatesInput
+ take?: number
+ skip?: number
+ _count?: CheckInCountAggregateInputType | true
+ _avg?: CheckInAvgAggregateInputType
+ _sum?: CheckInSumAggregateInputType
+ _min?: CheckInMinAggregateInputType
+ _max?: CheckInMaxAggregateInputType
+}
+
+export type CheckInGroupByOutputType = {
+ id: number
+ habitId: number
+ userId: number
+ date: string
+ seq: number
+ note: string
+ source: string
+ createdAt: Date
+ _count: CheckInCountAggregateOutputType | null
+ _avg: CheckInAvgAggregateOutputType | null
+ _sum: CheckInSumAggregateOutputType | null
+ _min: CheckInMinAggregateOutputType | null
+ _max: CheckInMaxAggregateOutputType | null
+}
+
+export type GetCheckInGroupByPayload = Prisma.PrismaPromise<
+ Array<
+ Prisma.PickEnumerable &
+ {
+ [P in ((keyof T) & (keyof CheckInGroupByOutputType))]: P extends '_count'
+ ? T[P] extends boolean
+ ? number
+ : Prisma.GetScalarType
+ : Prisma.GetScalarType
+ }
+ >
+ >
+
+
+
+export type CheckInWhereInput = {
+ AND?: Prisma.CheckInWhereInput | Prisma.CheckInWhereInput[]
+ OR?: Prisma.CheckInWhereInput[]
+ NOT?: Prisma.CheckInWhereInput | Prisma.CheckInWhereInput[]
+ id?: Prisma.IntFilter<"CheckIn"> | number
+ habitId?: Prisma.IntFilter<"CheckIn"> | number
+ userId?: Prisma.IntFilter<"CheckIn"> | number
+ date?: Prisma.StringFilter<"CheckIn"> | string
+ seq?: Prisma.IntFilter<"CheckIn"> | number
+ note?: Prisma.StringFilter<"CheckIn"> | string
+ source?: Prisma.StringFilter<"CheckIn"> | string
+ createdAt?: Prisma.DateTimeFilter<"CheckIn"> | Date | string
+ habit?: Prisma.XOR
+ user?: Prisma.XOR
+}
+
+export type CheckInOrderByWithRelationInput = {
+ id?: Prisma.SortOrder
+ habitId?: Prisma.SortOrder
+ userId?: Prisma.SortOrder
+ date?: Prisma.SortOrder
+ seq?: Prisma.SortOrder
+ note?: Prisma.SortOrder
+ source?: Prisma.SortOrder
+ createdAt?: Prisma.SortOrder
+ habit?: Prisma.HabitOrderByWithRelationInput
+ user?: Prisma.UserOrderByWithRelationInput
+ _relevance?: Prisma.CheckInOrderByRelevanceInput
+}
+
+export type CheckInWhereUniqueInput = Prisma.AtLeast<{
+ id?: number
+ habitId_date_seq?: Prisma.CheckInHabitIdDateSeqCompoundUniqueInput
+ AND?: Prisma.CheckInWhereInput | Prisma.CheckInWhereInput[]
+ OR?: Prisma.CheckInWhereInput[]
+ NOT?: Prisma.CheckInWhereInput | Prisma.CheckInWhereInput[]
+ habitId?: Prisma.IntFilter<"CheckIn"> | number
+ userId?: Prisma.IntFilter<"CheckIn"> | number
+ date?: Prisma.StringFilter<"CheckIn"> | string
+ seq?: Prisma.IntFilter<"CheckIn"> | number
+ note?: Prisma.StringFilter<"CheckIn"> | string
+ source?: Prisma.StringFilter<"CheckIn"> | string
+ createdAt?: Prisma.DateTimeFilter<"CheckIn"> | Date | string
+ habit?: Prisma.XOR
+ user?: Prisma.XOR
+}, "id" | "habitId_date_seq">
+
+export type CheckInOrderByWithAggregationInput = {
+ id?: Prisma.SortOrder
+ habitId?: Prisma.SortOrder
+ userId?: Prisma.SortOrder
+ date?: Prisma.SortOrder
+ seq?: Prisma.SortOrder
+ note?: Prisma.SortOrder
+ source?: Prisma.SortOrder
+ createdAt?: Prisma.SortOrder
+ _count?: Prisma.CheckInCountOrderByAggregateInput
+ _avg?: Prisma.CheckInAvgOrderByAggregateInput
+ _max?: Prisma.CheckInMaxOrderByAggregateInput
+ _min?: Prisma.CheckInMinOrderByAggregateInput
+ _sum?: Prisma.CheckInSumOrderByAggregateInput
+}
+
+export type CheckInScalarWhereWithAggregatesInput = {
+ AND?: Prisma.CheckInScalarWhereWithAggregatesInput | Prisma.CheckInScalarWhereWithAggregatesInput[]
+ OR?: Prisma.CheckInScalarWhereWithAggregatesInput[]
+ NOT?: Prisma.CheckInScalarWhereWithAggregatesInput | Prisma.CheckInScalarWhereWithAggregatesInput[]
+ id?: Prisma.IntWithAggregatesFilter<"CheckIn"> | number
+ habitId?: Prisma.IntWithAggregatesFilter<"CheckIn"> | number
+ userId?: Prisma.IntWithAggregatesFilter<"CheckIn"> | number
+ date?: Prisma.StringWithAggregatesFilter<"CheckIn"> | string
+ seq?: Prisma.IntWithAggregatesFilter<"CheckIn"> | number
+ note?: Prisma.StringWithAggregatesFilter<"CheckIn"> | string
+ source?: Prisma.StringWithAggregatesFilter<"CheckIn"> | string
+ createdAt?: Prisma.DateTimeWithAggregatesFilter<"CheckIn"> | Date | string
+}
+
+export type CheckInCreateInput = {
+ date: string
+ seq?: number
+ note?: string
+ source?: string
+ createdAt?: Date | string
+ habit: Prisma.HabitCreateNestedOneWithoutRecordsInput
+ user: Prisma.UserCreateNestedOneWithoutCheckInsInput
+}
+
+export type CheckInUncheckedCreateInput = {
+ id?: number
+ habitId: number
+ userId: number
+ date: string
+ seq?: number
+ note?: string
+ source?: string
+ createdAt?: Date | string
+}
+
+export type CheckInUpdateInput = {
+ date?: Prisma.StringFieldUpdateOperationsInput | string
+ seq?: Prisma.IntFieldUpdateOperationsInput | number
+ note?: Prisma.StringFieldUpdateOperationsInput | string
+ source?: Prisma.StringFieldUpdateOperationsInput | string
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ habit?: Prisma.HabitUpdateOneRequiredWithoutRecordsNestedInput
+ user?: Prisma.UserUpdateOneRequiredWithoutCheckInsNestedInput
+}
+
+export type CheckInUncheckedUpdateInput = {
+ id?: Prisma.IntFieldUpdateOperationsInput | number
+ habitId?: Prisma.IntFieldUpdateOperationsInput | number
+ userId?: Prisma.IntFieldUpdateOperationsInput | number
+ date?: Prisma.StringFieldUpdateOperationsInput | string
+ seq?: Prisma.IntFieldUpdateOperationsInput | number
+ note?: Prisma.StringFieldUpdateOperationsInput | string
+ source?: Prisma.StringFieldUpdateOperationsInput | string
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+}
+
+export type CheckInCreateManyInput = {
+ id?: number
+ habitId: number
+ userId: number
+ date: string
+ seq?: number
+ note?: string
+ source?: string
+ createdAt?: Date | string
+}
+
+export type CheckInUpdateManyMutationInput = {
+ date?: Prisma.StringFieldUpdateOperationsInput | string
+ seq?: Prisma.IntFieldUpdateOperationsInput | number
+ note?: Prisma.StringFieldUpdateOperationsInput | string
+ source?: Prisma.StringFieldUpdateOperationsInput | string
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+}
+
+export type CheckInUncheckedUpdateManyInput = {
+ id?: Prisma.IntFieldUpdateOperationsInput | number
+ habitId?: Prisma.IntFieldUpdateOperationsInput | number
+ userId?: Prisma.IntFieldUpdateOperationsInput | number
+ date?: Prisma.StringFieldUpdateOperationsInput | string
+ seq?: Prisma.IntFieldUpdateOperationsInput | number
+ note?: Prisma.StringFieldUpdateOperationsInput | string
+ source?: Prisma.StringFieldUpdateOperationsInput | string
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+}
+
+export type CheckInListRelationFilter = {
+ every?: Prisma.CheckInWhereInput
+ some?: Prisma.CheckInWhereInput
+ none?: Prisma.CheckInWhereInput
+}
+
+export type CheckInOrderByRelationAggregateInput = {
+ _count?: Prisma.SortOrder
+}
+
+export type CheckInOrderByRelevanceInput = {
+ fields: Prisma.CheckInOrderByRelevanceFieldEnum | Prisma.CheckInOrderByRelevanceFieldEnum[]
+ sort: Prisma.SortOrder
+ search: string
+}
+
+export type CheckInHabitIdDateSeqCompoundUniqueInput = {
+ habitId: number
+ date: string
+ seq: number
+}
+
+export type CheckInCountOrderByAggregateInput = {
+ id?: Prisma.SortOrder
+ habitId?: Prisma.SortOrder
+ userId?: Prisma.SortOrder
+ date?: Prisma.SortOrder
+ seq?: Prisma.SortOrder
+ note?: Prisma.SortOrder
+ source?: Prisma.SortOrder
+ createdAt?: Prisma.SortOrder
+}
+
+export type CheckInAvgOrderByAggregateInput = {
+ id?: Prisma.SortOrder
+ habitId?: Prisma.SortOrder
+ userId?: Prisma.SortOrder
+ seq?: Prisma.SortOrder
+}
+
+export type CheckInMaxOrderByAggregateInput = {
+ id?: Prisma.SortOrder
+ habitId?: Prisma.SortOrder
+ userId?: Prisma.SortOrder
+ date?: Prisma.SortOrder
+ seq?: Prisma.SortOrder
+ note?: Prisma.SortOrder
+ source?: Prisma.SortOrder
+ createdAt?: Prisma.SortOrder
+}
+
+export type CheckInMinOrderByAggregateInput = {
+ id?: Prisma.SortOrder
+ habitId?: Prisma.SortOrder
+ userId?: Prisma.SortOrder
+ date?: Prisma.SortOrder
+ seq?: Prisma.SortOrder
+ note?: Prisma.SortOrder
+ source?: Prisma.SortOrder
+ createdAt?: Prisma.SortOrder
+}
+
+export type CheckInSumOrderByAggregateInput = {
+ id?: Prisma.SortOrder
+ habitId?: Prisma.SortOrder
+ userId?: Prisma.SortOrder
+ seq?: Prisma.SortOrder
+}
+
+export type CheckInCreateNestedManyWithoutUserInput = {
+ create?: Prisma.XOR | Prisma.CheckInCreateWithoutUserInput[] | Prisma.CheckInUncheckedCreateWithoutUserInput[]
+ connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutUserInput | Prisma.CheckInCreateOrConnectWithoutUserInput[]
+ createMany?: Prisma.CheckInCreateManyUserInputEnvelope
+ connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+}
+
+export type CheckInUncheckedCreateNestedManyWithoutUserInput = {
+ create?: Prisma.XOR | Prisma.CheckInCreateWithoutUserInput[] | Prisma.CheckInUncheckedCreateWithoutUserInput[]
+ connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutUserInput | Prisma.CheckInCreateOrConnectWithoutUserInput[]
+ createMany?: Prisma.CheckInCreateManyUserInputEnvelope
+ connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+}
+
+export type CheckInUpdateManyWithoutUserNestedInput = {
+ create?: Prisma.XOR | Prisma.CheckInCreateWithoutUserInput[] | Prisma.CheckInUncheckedCreateWithoutUserInput[]
+ connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutUserInput | Prisma.CheckInCreateOrConnectWithoutUserInput[]
+ upsert?: Prisma.CheckInUpsertWithWhereUniqueWithoutUserInput | Prisma.CheckInUpsertWithWhereUniqueWithoutUserInput[]
+ createMany?: Prisma.CheckInCreateManyUserInputEnvelope
+ set?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ disconnect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ delete?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ update?: Prisma.CheckInUpdateWithWhereUniqueWithoutUserInput | Prisma.CheckInUpdateWithWhereUniqueWithoutUserInput[]
+ updateMany?: Prisma.CheckInUpdateManyWithWhereWithoutUserInput | Prisma.CheckInUpdateManyWithWhereWithoutUserInput[]
+ deleteMany?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[]
+}
+
+export type CheckInUncheckedUpdateManyWithoutUserNestedInput = {
+ create?: Prisma.XOR | Prisma.CheckInCreateWithoutUserInput[] | Prisma.CheckInUncheckedCreateWithoutUserInput[]
+ connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutUserInput | Prisma.CheckInCreateOrConnectWithoutUserInput[]
+ upsert?: Prisma.CheckInUpsertWithWhereUniqueWithoutUserInput | Prisma.CheckInUpsertWithWhereUniqueWithoutUserInput[]
+ createMany?: Prisma.CheckInCreateManyUserInputEnvelope
+ set?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ disconnect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ delete?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ update?: Prisma.CheckInUpdateWithWhereUniqueWithoutUserInput | Prisma.CheckInUpdateWithWhereUniqueWithoutUserInput[]
+ updateMany?: Prisma.CheckInUpdateManyWithWhereWithoutUserInput | Prisma.CheckInUpdateManyWithWhereWithoutUserInput[]
+ deleteMany?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[]
+}
+
+export type CheckInCreateNestedManyWithoutHabitInput = {
+ create?: Prisma.XOR | Prisma.CheckInCreateWithoutHabitInput[] | Prisma.CheckInUncheckedCreateWithoutHabitInput[]
+ connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutHabitInput | Prisma.CheckInCreateOrConnectWithoutHabitInput[]
+ createMany?: Prisma.CheckInCreateManyHabitInputEnvelope
+ connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+}
+
+export type CheckInUncheckedCreateNestedManyWithoutHabitInput = {
+ create?: Prisma.XOR | Prisma.CheckInCreateWithoutHabitInput[] | Prisma.CheckInUncheckedCreateWithoutHabitInput[]
+ connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutHabitInput | Prisma.CheckInCreateOrConnectWithoutHabitInput[]
+ createMany?: Prisma.CheckInCreateManyHabitInputEnvelope
+ connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+}
+
+export type CheckInUpdateManyWithoutHabitNestedInput = {
+ create?: Prisma.XOR | Prisma.CheckInCreateWithoutHabitInput[] | Prisma.CheckInUncheckedCreateWithoutHabitInput[]
+ connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutHabitInput | Prisma.CheckInCreateOrConnectWithoutHabitInput[]
+ upsert?: Prisma.CheckInUpsertWithWhereUniqueWithoutHabitInput | Prisma.CheckInUpsertWithWhereUniqueWithoutHabitInput[]
+ createMany?: Prisma.CheckInCreateManyHabitInputEnvelope
+ set?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ disconnect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ delete?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ update?: Prisma.CheckInUpdateWithWhereUniqueWithoutHabitInput | Prisma.CheckInUpdateWithWhereUniqueWithoutHabitInput[]
+ updateMany?: Prisma.CheckInUpdateManyWithWhereWithoutHabitInput | Prisma.CheckInUpdateManyWithWhereWithoutHabitInput[]
+ deleteMany?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[]
+}
+
+export type CheckInUncheckedUpdateManyWithoutHabitNestedInput = {
+ create?: Prisma.XOR | Prisma.CheckInCreateWithoutHabitInput[] | Prisma.CheckInUncheckedCreateWithoutHabitInput[]
+ connectOrCreate?: Prisma.CheckInCreateOrConnectWithoutHabitInput | Prisma.CheckInCreateOrConnectWithoutHabitInput[]
+ upsert?: Prisma.CheckInUpsertWithWhereUniqueWithoutHabitInput | Prisma.CheckInUpsertWithWhereUniqueWithoutHabitInput[]
+ createMany?: Prisma.CheckInCreateManyHabitInputEnvelope
+ set?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ disconnect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ delete?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ connect?: Prisma.CheckInWhereUniqueInput | Prisma.CheckInWhereUniqueInput[]
+ update?: Prisma.CheckInUpdateWithWhereUniqueWithoutHabitInput | Prisma.CheckInUpdateWithWhereUniqueWithoutHabitInput[]
+ updateMany?: Prisma.CheckInUpdateManyWithWhereWithoutHabitInput | Prisma.CheckInUpdateManyWithWhereWithoutHabitInput[]
+ deleteMany?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[]
+}
+
+export type CheckInCreateWithoutUserInput = {
+ date: string
+ seq?: number
+ note?: string
+ source?: string
+ createdAt?: Date | string
+ habit: Prisma.HabitCreateNestedOneWithoutRecordsInput
+}
+
+export type CheckInUncheckedCreateWithoutUserInput = {
+ id?: number
+ habitId: number
+ date: string
+ seq?: number
+ note?: string
+ source?: string
+ createdAt?: Date | string
+}
+
+export type CheckInCreateOrConnectWithoutUserInput = {
+ where: Prisma.CheckInWhereUniqueInput
+ create: Prisma.XOR
+}
+
+export type CheckInCreateManyUserInputEnvelope = {
+ data: Prisma.CheckInCreateManyUserInput | Prisma.CheckInCreateManyUserInput[]
+ skipDuplicates?: boolean
+}
+
+export type CheckInUpsertWithWhereUniqueWithoutUserInput = {
+ where: Prisma.CheckInWhereUniqueInput
+ update: Prisma.XOR
+ create: Prisma.XOR
+}
+
+export type CheckInUpdateWithWhereUniqueWithoutUserInput = {
+ where: Prisma.CheckInWhereUniqueInput
+ data: Prisma.XOR
+}
+
+export type CheckInUpdateManyWithWhereWithoutUserInput = {
+ where: Prisma.CheckInScalarWhereInput
+ data: Prisma.XOR
+}
+
+export type CheckInScalarWhereInput = {
+ AND?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[]
+ OR?: Prisma.CheckInScalarWhereInput[]
+ NOT?: Prisma.CheckInScalarWhereInput | Prisma.CheckInScalarWhereInput[]
+ id?: Prisma.IntFilter<"CheckIn"> | number
+ habitId?: Prisma.IntFilter<"CheckIn"> | number
+ userId?: Prisma.IntFilter<"CheckIn"> | number
+ date?: Prisma.StringFilter<"CheckIn"> | string
+ seq?: Prisma.IntFilter<"CheckIn"> | number
+ note?: Prisma.StringFilter<"CheckIn"> | string
+ source?: Prisma.StringFilter<"CheckIn"> | string
+ createdAt?: Prisma.DateTimeFilter<"CheckIn"> | Date | string
+}
+
+export type CheckInCreateWithoutHabitInput = {
+ date: string
+ seq?: number
+ note?: string
+ source?: string
+ createdAt?: Date | string
+ user: Prisma.UserCreateNestedOneWithoutCheckInsInput
+}
+
+export type CheckInUncheckedCreateWithoutHabitInput = {
+ id?: number
+ userId: number
+ date: string
+ seq?: number
+ note?: string
+ source?: string
+ createdAt?: Date | string
+}
+
+export type CheckInCreateOrConnectWithoutHabitInput = {
+ where: Prisma.CheckInWhereUniqueInput
+ create: Prisma.XOR
+}
+
+export type CheckInCreateManyHabitInputEnvelope = {
+ data: Prisma.CheckInCreateManyHabitInput | Prisma.CheckInCreateManyHabitInput[]
+ skipDuplicates?: boolean
+}
+
+export type CheckInUpsertWithWhereUniqueWithoutHabitInput = {
+ where: Prisma.CheckInWhereUniqueInput
+ update: Prisma.XOR
+ create: Prisma.XOR
+}
+
+export type CheckInUpdateWithWhereUniqueWithoutHabitInput = {
+ where: Prisma.CheckInWhereUniqueInput
+ data: Prisma.XOR
+}
+
+export type CheckInUpdateManyWithWhereWithoutHabitInput = {
+ where: Prisma.CheckInScalarWhereInput
+ data: Prisma.XOR
+}
+
+export type CheckInCreateManyUserInput = {
+ id?: number
+ habitId: number
+ date: string
+ seq?: number
+ note?: string
+ source?: string
+ createdAt?: Date | string
+}
+
+export type CheckInUpdateWithoutUserInput = {
+ date?: Prisma.StringFieldUpdateOperationsInput | string
+ seq?: Prisma.IntFieldUpdateOperationsInput | number
+ note?: Prisma.StringFieldUpdateOperationsInput | string
+ source?: Prisma.StringFieldUpdateOperationsInput | string
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ habit?: Prisma.HabitUpdateOneRequiredWithoutRecordsNestedInput
+}
+
+export type CheckInUncheckedUpdateWithoutUserInput = {
+ id?: Prisma.IntFieldUpdateOperationsInput | number
+ habitId?: Prisma.IntFieldUpdateOperationsInput | number
+ date?: Prisma.StringFieldUpdateOperationsInput | string
+ seq?: Prisma.IntFieldUpdateOperationsInput | number
+ note?: Prisma.StringFieldUpdateOperationsInput | string
+ source?: Prisma.StringFieldUpdateOperationsInput | string
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+}
+
+export type CheckInUncheckedUpdateManyWithoutUserInput = {
+ id?: Prisma.IntFieldUpdateOperationsInput | number
+ habitId?: Prisma.IntFieldUpdateOperationsInput | number
+ date?: Prisma.StringFieldUpdateOperationsInput | string
+ seq?: Prisma.IntFieldUpdateOperationsInput | number
+ note?: Prisma.StringFieldUpdateOperationsInput | string
+ source?: Prisma.StringFieldUpdateOperationsInput | string
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+}
+
+export type CheckInCreateManyHabitInput = {
+ id?: number
+ userId: number
+ date: string
+ seq?: number
+ note?: string
+ source?: string
+ createdAt?: Date | string
+}
+
+export type CheckInUpdateWithoutHabitInput = {
+ date?: Prisma.StringFieldUpdateOperationsInput | string
+ seq?: Prisma.IntFieldUpdateOperationsInput | number
+ note?: Prisma.StringFieldUpdateOperationsInput | string
+ source?: Prisma.StringFieldUpdateOperationsInput | string
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+ user?: Prisma.UserUpdateOneRequiredWithoutCheckInsNestedInput
+}
+
+export type CheckInUncheckedUpdateWithoutHabitInput = {
+ id?: Prisma.IntFieldUpdateOperationsInput | number
+ userId?: Prisma.IntFieldUpdateOperationsInput | number
+ date?: Prisma.StringFieldUpdateOperationsInput | string
+ seq?: Prisma.IntFieldUpdateOperationsInput | number
+ note?: Prisma.StringFieldUpdateOperationsInput | string
+ source?: Prisma.StringFieldUpdateOperationsInput | string
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+}
+
+export type CheckInUncheckedUpdateManyWithoutHabitInput = {
+ id?: Prisma.IntFieldUpdateOperationsInput | number
+ userId?: Prisma.IntFieldUpdateOperationsInput | number
+ date?: Prisma.StringFieldUpdateOperationsInput | string
+ seq?: Prisma.IntFieldUpdateOperationsInput | number
+ note?: Prisma.StringFieldUpdateOperationsInput | string
+ source?: Prisma.StringFieldUpdateOperationsInput | string
+ createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
+}
+
+
+
+export type CheckInSelect = runtime.Types.Extensions.GetSelect<{
+ id?: boolean
+ habitId?: boolean
+ userId?: boolean
+ date?: boolean
+ seq?: boolean
+ note?: boolean
+ source?: boolean
+ createdAt?: boolean
+ habit?: boolean | Prisma.HabitDefaultArgs
+ user?: boolean | Prisma.UserDefaultArgs
+}, ExtArgs["result"]["checkIn"]>
+
+
+
+export type CheckInSelectScalar = {
+ id?: boolean
+ habitId?: boolean
+ userId?: boolean
+ date?: boolean
+ seq?: boolean
+ note?: boolean
+ source?: boolean
+ createdAt?: boolean
+}
+
+export type CheckInOmit = runtime.Types.Extensions.GetOmit<"id" | "habitId" | "userId" | "date" | "seq" | "note" | "source" | "createdAt", ExtArgs["result"]["checkIn"]>
+export type CheckInInclude = {
+ habit?: boolean | Prisma.HabitDefaultArgs
+ user?: boolean | Prisma.UserDefaultArgs
+}
+
+export type $CheckInPayload = {
+ name: "CheckIn"
+ objects: {
+ habit: Prisma.$HabitPayload
+ user: Prisma.$UserPayload
+ }
+ scalars: runtime.Types.Extensions.GetPayloadResult<{
+ id: number
+ habitId: number
+ userId: number
+ date: string
+ seq: number
+ note: string
+ source: string
+ createdAt: Date
+ }, ExtArgs["result"]["checkIn"]>
+ composites: {}
+}
+
+export type CheckInGetPayload = runtime.Types.Result.GetResult
+
+export type CheckInCountArgs =
+ Omit & {
+ select?: CheckInCountAggregateInputType | true
+ }
+
+export interface CheckInDelegate {
+ [K: symbol]: { types: Prisma.TypeMap['model']['CheckIn'], meta: { name: 'CheckIn' } }
+ /**
+ * Find zero or one CheckIn that matches the filter.
+ * @param {CheckInFindUniqueArgs} args - Arguments to find a CheckIn
+ * @example
+ * // Get one CheckIn
+ * const checkIn = await prisma.checkIn.findUnique({
+ * where: {
+ * // ... provide filter here
+ * }
+ * })
+ */
+ findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions>
+
+ /**
+ * Find one CheckIn that matches the filter or throw an error with `error.code='P2025'`
+ * if no matches were found.
+ * @param {CheckInFindUniqueOrThrowArgs} args - Arguments to find a CheckIn
+ * @example
+ * // Get one CheckIn
+ * const checkIn = await prisma.checkIn.findUniqueOrThrow({
+ * where: {
+ * // ... provide filter here
+ * }
+ * })
+ */
+ findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions>
+
+ /**
+ * Find the first CheckIn that matches the filter.
+ * Note, that providing `undefined` is treated as the value not being there.
+ * Read more here: https://pris.ly/d/null-undefined
+ * @param {CheckInFindFirstArgs} args - Arguments to find a CheckIn
+ * @example
+ * // Get one CheckIn
+ * const checkIn = await prisma.checkIn.findFirst({
+ * where: {
+ * // ... provide filter here
+ * }
+ * })
+ */
+ findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions>
+
+ /**
+ * Find the first CheckIn that matches the filter or
+ * throw `PrismaKnownClientError` with `P2025` code if no matches were found.
+ * Note, that providing `undefined` is treated as the value not being there.
+ * Read more here: https://pris.ly/d/null-undefined
+ * @param {CheckInFindFirstOrThrowArgs} args - Arguments to find a CheckIn
+ * @example
+ * // Get one CheckIn
+ * const checkIn = await prisma.checkIn.findFirstOrThrow({
+ * where: {
+ * // ... provide filter here
+ * }
+ * })
+ */
+ findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions>
+
+ /**
+ * Find zero or more CheckIns that matches the filter.
+ * Note, that providing `undefined` is treated as the value not being there.
+ * Read more here: https://pris.ly/d/null-undefined
+ * @param {CheckInFindManyArgs} args - Arguments to filter and select certain fields only.
+ * @example
+ * // Get all CheckIns
+ * const checkIns = await prisma.checkIn.findMany()
+ *
+ * // Get first 10 CheckIns
+ * const checkIns = await prisma.checkIn.findMany({ take: 10 })
+ *
+ * // Only select the `id`
+ * const checkInWithIdOnly = await prisma.checkIn.findMany({ select: { id: true } })
+ *
+ */
+ findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>>
+
+ /**
+ * Create a CheckIn.
+ * @param {CheckInCreateArgs} args - Arguments to create a CheckIn.
+ * @example
+ * // Create one CheckIn
+ * const CheckIn = await prisma.checkIn.create({
+ * data: {
+ * // ... data to create a CheckIn
+ * }
+ * })
+ *
+ */
+ create(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions>
+
+ /**
+ * Create many CheckIns.
+ * @param {CheckInCreateManyArgs} args - Arguments to create many CheckIns.
+ * @example
+ * // Create many CheckIns
+ * const checkIn = await prisma.checkIn.createMany({
+ * data: [
+ * // ... provide data here
+ * ]
+ * })
+ *
+ */
+ createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise
+
+ /**
+ * Delete a CheckIn.
+ * @param {CheckInDeleteArgs} args - Arguments to delete one CheckIn.
+ * @example
+ * // Delete one CheckIn
+ * const CheckIn = await prisma.checkIn.delete({
+ * where: {
+ * // ... filter to delete one CheckIn
+ * }
+ * })
+ *
+ */
+ delete(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions>
+
+ /**
+ * Update one CheckIn.
+ * @param {CheckInUpdateArgs} args - Arguments to update one CheckIn.
+ * @example
+ * // Update one CheckIn
+ * const checkIn = await prisma.checkIn.update({
+ * where: {
+ * // ... provide filter here
+ * },
+ * data: {
+ * // ... provide data here
+ * }
+ * })
+ *
+ */
+ update(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions>
+
+ /**
+ * Delete zero or more CheckIns.
+ * @param {CheckInDeleteManyArgs} args - Arguments to filter CheckIns to delete.
+ * @example
+ * // Delete a few CheckIns
+ * const { count } = await prisma.checkIn.deleteMany({
+ * where: {
+ * // ... provide filter here
+ * }
+ * })
+ *
+ */
+ deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise
+
+ /**
+ * Update zero or more CheckIns.
+ * Note, that providing `undefined` is treated as the value not being there.
+ * Read more here: https://pris.ly/d/null-undefined
+ * @param {CheckInUpdateManyArgs} args - Arguments to update one or more rows.
+ * @example
+ * // Update many CheckIns
+ * const checkIn = await prisma.checkIn.updateMany({
+ * where: {
+ * // ... provide filter here
+ * },
+ * data: {
+ * // ... provide data here
+ * }
+ * })
+ *
+ */
+ updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise
+
+ /**
+ * Create or update one CheckIn.
+ * @param {CheckInUpsertArgs} args - Arguments to update or create a CheckIn.
+ * @example
+ * // Update or create a CheckIn
+ * const checkIn = await prisma.checkIn.upsert({
+ * create: {
+ * // ... data to create a CheckIn
+ * },
+ * update: {
+ * // ... in case it already exists, update
+ * },
+ * where: {
+ * // ... the filter for the CheckIn we want to update
+ * }
+ * })
+ */
+ upsert(args: Prisma.SelectSubset>): Prisma.Prisma__CheckInClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions>
+
+
+ /**
+ * Count the number of CheckIns.
+ * Note, that providing `undefined` is treated as the value not being there.
+ * Read more here: https://pris.ly/d/null-undefined
+ * @param {CheckInCountArgs} args - Arguments to filter CheckIns to count.
+ * @example
+ * // Count the number of CheckIns
+ * const count = await prisma.checkIn.count({
+ * where: {
+ * // ... the filter for the CheckIns we want to count
+ * }
+ * })
+ **/
+ count(
+ args?: Prisma.Subset,
+ ): Prisma.PrismaPromise<
+ T extends runtime.Types.Utils.Record<'select', any>
+ ? T['select'] extends true
+ ? number
+ : Prisma.GetScalarType
+ : number
+ >
+
+ /**
+ * Allows you to perform aggregations operations on a CheckIn.
+ * Note, that providing `undefined` is treated as the value not being there.
+ * Read more here: https://pris.ly/d/null-undefined
+ * @param {CheckInAggregateArgs} args - Select which aggregations you would like to apply and on what fields.
+ * @example
+ * // Ordered by age ascending
+ * // Where email contains prisma.io
+ * // Limited to the 10 users
+ * const aggregations = await prisma.user.aggregate({
+ * _avg: {
+ * age: true,
+ * },
+ * where: {
+ * email: {
+ * contains: "prisma.io",
+ * },
+ * },
+ * orderBy: {
+ * age: "asc",
+ * },
+ * take: 10,
+ * })
+ **/
+ aggregate(args: Prisma.Subset): Prisma.PrismaPromise>
+
+ /**
+ * Group by CheckIn.
+ * Note, that providing `undefined` is treated as the value not being there.
+ * Read more here: https://pris.ly/d/null-undefined
+ * @param {CheckInGroupByArgs} args - Group by arguments.
+ * @example
+ * // Group by city, order by createdAt, get count
+ * const result = await prisma.user.groupBy({
+ * by: ['city', 'createdAt'],
+ * orderBy: {
+ * createdAt: true
+ * },
+ * _count: {
+ * _all: true
+ * },
+ * })
+ *
+ **/
+ groupBy<
+ T extends CheckInGroupByArgs,
+ HasSelectOrTake extends Prisma.Or<
+ Prisma.Extends<'skip', Prisma.Keys>,
+ Prisma.Extends<'take', Prisma.Keys>
+ >,
+ OrderByArg extends Prisma.True extends HasSelectOrTake
+ ? { orderBy: CheckInGroupByArgs['orderBy'] }
+ : { orderBy?: CheckInGroupByArgs['orderBy'] },
+ OrderFields extends Prisma.ExcludeUnderscoreKeys>>,
+ ByFields extends Prisma.MaybeTupleToUnion,
+ ByValid extends Prisma.Has,
+ HavingFields extends Prisma.GetHavingFields,
+ HavingValid extends Prisma.Has,
+ ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False,
+ InputErrors extends ByEmpty extends Prisma.True
+ ? `Error: "by" must not be empty.`
+ : HavingValid extends Prisma.False
+ ? {
+ [P in HavingFields]: P extends ByFields
+ ? never
+ : P extends string
+ ? `Error: Field "${P}" used in "having" needs to be provided in "by".`
+ : [
+ Error,
+ 'Field ',
+ P,
+ ` in "having" needs to be provided in "by"`,
+ ]
+ }[HavingFields]
+ : 'take' extends Prisma.Keys
+ ? 'orderBy' extends Prisma.Keys
+ ? ByValid extends Prisma.True
+ ? {}
+ : {
+ [P in OrderFields]: P extends ByFields
+ ? never
+ : `Error: Field "${P}" in "orderBy" needs to be provided in "by"`
+ }[OrderFields]
+ : 'Error: If you provide "take", you also need to provide "orderBy"'
+ : 'skip' extends Prisma.Keys
+ ? 'orderBy' extends Prisma.Keys
+ ? ByValid extends Prisma.True
+ ? {}
+ : {
+ [P in OrderFields]: P extends ByFields
+ ? never
+ : `Error: Field "${P}" in "orderBy" needs to be provided in "by"`
+ }[OrderFields]
+ : 'Error: If you provide "skip", you also need to provide "orderBy"'
+ : ByValid extends Prisma.True
+ ? {}
+ : {
+ [P in OrderFields]: P extends ByFields
+ ? never
+ : `Error: Field "${P}" in "orderBy" needs to be provided in "by"`
+ }[OrderFields]
+ >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetCheckInGroupByPayload : Prisma.PrismaPromise