commit eec9927ae64447a2273889bbc6f46d45acfbbc09 Author: lennlouisgeek Date: Mon Mar 30 02:59:56 2026 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6635cf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..ab1f416 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..63623cf --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/tauri-demo.iml b/.idea/tauri-demo.iml new file mode 100644 index 0000000..5302050 --- /dev/null +++ b/.idea/tauri-demo.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..61343e9 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "svelte.svelte-vscode", + "tauri-apps.tauri-vscode", + "rust-lang.rust-analyzer" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2f86c50 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "svelte.enable-ts-plugin": true +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..858d179 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Tauri + SvelteKit + TypeScript + +This template should help get you started developing with Tauri, SvelteKit and TypeScript in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer). diff --git a/assest/paxini.jpg b/assest/paxini.jpg new file mode 100644 index 0000000..edbadc8 Binary files /dev/null and b/assest/paxini.jpg differ diff --git a/flowus_tools.json b/flowus_tools.json new file mode 100644 index 0000000..7924847 --- /dev/null +++ b/flowus_tools.json @@ -0,0 +1 @@ +{"jsonrpc":"2.0","id":5,"result":{"tools":[{"name":"API-createDatabase","description":"Create a database","inputSchema":{"type":"object","properties":{"parent":{"type":"object","properties":{"type":{"type":"string"},"page_id":{"type":"string","format":"uuid"}},"required":["type","page_id"],"additionalProperties":true},"title":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"text":{"type":"object","properties":{"content":{"type":"string"}},"required":["content"],"additionalProperties":true}},"required":["type","text"],"additionalProperties":true}},"icon":{"$ref":"#/$defs/Icon"},"properties":{"type":"object","additionalProperties":{"$ref":"#/$defs/PropertySchema"}},"is_inline":{"type":"boolean","description":"是否为内联数据库"}},"required":["parent","title","properties"]}},{"name":"API-getDatabase","description":"获取数据库","inputSchema":{"type":"object","properties":{"database_id":{"type":"string","format":"uuid","description":"数据库ID"}},"required":["database_id"]}},{"name":"API-updateDatabase","description":"更新数据库","inputSchema":{"type":"object","properties":{"database_id":{"type":"string","format":"uuid","description":"数据库ID"},"title":{"type":"array","items":{"$ref":"#/$defs/RichText"}},"icon":{"$ref":"#/$defs/Icon"},"cover":{"$ref":"#/$defs/Cover"},"properties":{"type":"object","additionalProperties":{"oneOf":[{"$ref":"#/$defs/PropertySchema"},{"type":"null"}]}},"archived":{"type":"boolean"}},"required":["database_id"]}},{"name":"API-queryDatabase","description":"查询数据库","inputSchema":{"type":"object","properties":{"database_id":{"type":"string","format":"uuid","description":"数据库ID"},"start_cursor":{"type":"string","description":"分页游标"},"page_size":{"type":"integer","description":"每页记录数","default":50}},"required":["database_id"]}},{"name":"API-createPage","description":"Create a page","inputSchema":{"type":"object","properties":{"parent":{"$ref":"#/$defs/Parent"},"icon":{"$ref":"#/$defs/Icon"},"properties":{"type":"object","properties":{"title":{"type":"object","properties":{"type":{"type":"string","enum":["title"]},"title":{"type":"array","items":{"$ref":"#/$defs/RichText"}}},"additionalProperties":true}},"additionalProperties":true}},"required":["properties"]}},{"name":"API-getPage","description":"Retrieve a page","inputSchema":{"type":"object","properties":{"page_id":{"type":"string","format":"uuid","description":"Identifier for a Notion page"}},"required":["page_id"]}},{"name":"API-updatePage","description":"Update page properties","inputSchema":{"type":"object","properties":{"page_id":{"type":"string","format":"uuid","description":"The identifier for the Notion page to be updated."},"properties":{"type":"object","description":"The property values to update for the page. The keys are the names or IDs of the property and the values are property values. If a page property ID is not included, then it is not changed.","properties":{"title":{"type":"object","properties":{"type":{"type":"string","enum":["title"]},"title":{"type":"array","items":{"$ref":"#/$defs/RichText"}}},"additionalProperties":true}},"additionalProperties":true},"icon":{"$ref":"#/$defs/Icon"},"cover":{"$ref":"#/$defs/Cover"},"archived":{"type":"boolean"}},"required":["page_id"]}},{"name":"API-getBlock","description":"Retrieve a block","inputSchema":{"type":"object","properties":{"block_id":{"type":"string","format":"uuid","description":"Identifier for a Notion block"}},"required":["block_id"]}},{"name":"API-updateBlock","description":"更新块","inputSchema":{"type":"object","properties":{"block_id":{"type":"string","format":"uuid","description":"块ID"},"archived":{"type":"boolean","description":"设置为 true 来归档(删除)块"},"data":{"type":"object","description":"块类型特定的数据内容","properties":{"rich_text":{"type":"array","description":"富文本内容","items":{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"object","properties":{"content":{"type":"string"},"link":{"type":"object","properties":{"url":{"type":"string"}},"additionalProperties":true}},"additionalProperties":true}},"additionalProperties":true}},"checked":{"type":"boolean","description":"待办事项是否完成"}},"additionalProperties":false}},"required":["block_id"]}},{"name":"API-deleteBlock","description":"Delete a block","inputSchema":{"type":"object","properties":{"block_id":{"type":"string","format":"uuid","description":"Identifier for a Notion block"}},"required":["block_id"]}},{"name":"API-getBlockChildren","description":"获取子块","inputSchema":{"type":"object","properties":{"block_id":{"type":"string","format":"uuid","description":"块ID"},"start_cursor":{"type":"string","description":"分页游标"},"page_size":{"type":"integer","default":100,"description":"每页记录数"}},"required":["block_id"]}},{"name":"API-appendBlockChildren","description":"添加子块","inputSchema":{"type":"object","properties":{"block_id":{"type":"string","format":"uuid","description":"父块ID"},"children":{"type":"array","description":"要添加的子块内容","items":{"type":"object","properties":{"type":{"type":"string","enum":["paragraph","bulleted_list_item","to_do"]},"data":{"type":"object","description":"块类型特定的数据内容","properties":{"rich_text":{"type":"array","description":"富文本内容","items":{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"object","properties":{"content":{"type":"string"},"link":{"type":"object","properties":{"url":{"type":"string"}},"additionalProperties":true}},"additionalProperties":true}},"additionalProperties":true}},"checked":{"type":"boolean","description":"待办事项是否完成"}},"additionalProperties":false}},"required":["type","data"],"additionalProperties":true}},"after":{"type":"string","description":"在指定块后插入新块的ID"}},"required":["block_id","children"]}},{"name":"API-searchPages","description":"Flowus知识库搜索","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"搜索关键词"}},"required":["query"]}}]}} diff --git a/frontend_prompt.md b/frontend_prompt.md new file mode 100644 index 0000000..67b06a1 --- /dev/null +++ b/frontend_prompt.md @@ -0,0 +1,254 @@ +# premise + +这是我在展会看到的友商上位机 UI(`assets/paxini.jpg`)的风格参考,希望做一份相近气质的前端界面。前端由你负责实现与迭代。 + +## 约束(长期有效) + +- 使用 `Svelte + TypeScript` +- 页面拆分成 `HudPanel`、`CenterStage`、`SignalChart` +- 不引入大型 UI 库 +- 主色调:近黑背景 + 青蓝 / 荧光绿 / 橙红 +- 主界面整体是“一整块 board”,通过渐变过渡,不做强分块 +- 不做明显流光/扫光动画(可有静态纹理层次) +- 样式集中在组件内或 `theme` 文件 +- 布局优先 `grid/flex`,仅在必要位置使用绝对定位 +- 后续对接 Tauri,组件层不要把数据源写死 + +--- + +# 当前实现基线(已完成) + +## Step1:主背景 + +- 已完成近黑全屏背景、弱渐变、暗角和轻噪声层 +- `:root/html/body` 背景已与主界面统一,避免拖动窗口出现黑边断层 + +## Step2:TitleBar + ControlBar + 主布局 + +- 已完成窗口按钮(最小化 / 最大化切换 / 关闭) +- 已完成 ControlBar: + - 配置菜单组(打开/关闭/校准/参数) + - 连接状态卡片 + - 串口下拉框 + - 中英文切换 + - 设备信息行(设备/采样率/通道) +- 页面主结构已固定为:`TitleBar + ControlBar + WebGL2 Area` + +## Step2-1:Tauri 交互与窗口体验 + +- TitleBar 已支持拖动(`data-tauri-drag-region`) +- 默认窗口大小自动尝试调整到屏幕约 `3/4` +- 已连接 Tauri window commands: + +```ts +invoke("win_minimize"); +invoke("win_toggle_maximize"); +invoke("win_close"); +``` + +## Step3:HUD 面板与数据演示 + +- 左右两侧悬浮曲线面板已完成 +- 有数据时入场并渲染,无数据时退场(当前 demo:5s 开/关周期) +- 折线、渐变填充、边框与深色半透明底已完成 +- 底部量程条已完成 + +--- + +# 当前前端结构(请按此扩展) + +## 1) `src/routes/+page.svelte` + +- 页面编排与状态管理 +- 维护 `signalPanels`、语言、连接状态、串口、配置菜单选中态 +- 将左右面板分流后传给 `CenterStage` +- 处理 Tauri invoke(窗口控制) + +## 2) `src/lib/components/HudPanel.svelte` + +- 只负责顶部控制区 UI 与交互事件分发 +- 通过事件向外抛出: + - `windowcontrol` + - `localechange` + - `configlink` + - `portchange` + +## 3) `src/lib/components/CenterStage.svelte` + +- 承载 WebGL2 主区域和左右悬浮 rail +- 接收 `leftPanels/rightPanels` 并在 rail 内渲染 `SignalChart` +- 通过 `ResizeObserver` 动态计算: + - `panel-zone` 顶部起始位置 + - 左右 rail 缩放比例(低高度窗口可自适应) +- 侧边定位策略:贴边但保留 `edge inset` 安全距离 + +## 4) `src/lib/components/SignalChart.svelte` + +- 单个曲线面板渲染组件 +- 仅消费结构化数据,不关心数据来源 +- 支持 `side`(left/right)与 `active`(入场/退场)状态 + +--- + +# 关键布局规则(避免回归) + +- WebGL2 区域占据下半主容器 +- HUD 曲线面板浮在 WebGL2 上方,但贴近左右边缘,不遮挡中间核心区域 +- 左右面板必须挂在 `CenterStage` 的 rail 容器内 +- 不再使用命名 slot 传曲线面板(曾导致面板落到错误容器) +- 调试用彩色边框已移除,保持正式视觉 + +--- + +# 数据接入约定(统一结构) + +```ts +type SignalTone = "cyan" | "lime" | "orange"; +type SignalPanelSide = "left" | "right"; + +interface HudSignalSeries { + id: string; + tone: SignalTone; + points: number[]; +} + +interface HudSignalIcon { + id: string; + label: string; + tone: SignalTone; +} + +interface HudSignalPanel { + id: string; + code: string; + title: string; + side: SignalPanelSide; + active: boolean; + series: HudSignalSeries[]; + icons: HudSignalIcon[]; +} + +interface HudPacket { + ts: number; + panels: HudSignalPanel[]; +} +``` + +统一入口: + +```ts +let signalPanels: HudSignalPanel[] = []; + +function applyPacket(packet: HudPacket) { + signalPanels = packet.panels; +} +``` + +--- + +# Step3 数据源 Demo(可替换) + +## Demo A:本地 Mock + +```ts +function startMockFeed(push: (packet: HudPacket) => void): () => void { + let hasData = false; + const cycle = setInterval(() => { + hasData = !hasData; + push({ + ts: Date.now(), + panels: hasData ? buildRandomPanels() : buildInactivePanels() + }); + }, 5000); + + const tick = setInterval(() => { + if (hasData) { + push({ + ts: Date.now(), + panels: evolvePanels() + }); + } + }, 1200); + + return () => { + clearInterval(cycle); + clearInterval(tick); + }; +} +``` + +## Demo B:Tauri invoke 轮询 + +```ts +import { invoke } from "@tauri-apps/api/core"; + +async function fetchHudPacket(): Promise { + return await invoke("hud_get_packet"); +} +``` + +## Demo C:Tauri 事件推送 + +```ts +import { listen, type UnlistenFn } from "@tauri-apps/api/event"; + +async function startTauriStream(push: (packet: HudPacket) => void): Promise<() => void> { + const unlisten: UnlistenFn = await listen("hud_stream", (event) => { + push(event.payload); + }); + return () => unlisten(); +} +``` + +## Demo D:WebSocket + +```ts +function startWebSocket(push: (packet: HudPacket) => void): () => void { + const ws = new WebSocket("ws://127.0.0.1:9001/hud"); + ws.onmessage = (e) => push(JSON.parse(e.data) as HudPacket); + return () => ws.close(); +} +``` + +--- + +# 其他接口建议(主控区联动) + +```ts +invoke("sensor_connect", { port: "COM3" }); +invoke("sensor_disconnect"); + +invoke("sensor_set_sample_rate", { hz: 120 }); +invoke("sensor_set_channels", { channels: [1, 2, 3, 4] }); + +invoke("sensor_start_stream"); +invoke("sensor_stop_stream"); + +invoke("sensor_get_status"); +``` + +--- + +# step3 前端细节调整 + +1. 添加对串口连接失败的提醒 +2. 连接成功后,连接按钮变成断开按钮点击就断开连接 + +# step 4 webgl2 + +1. 黑色背景,科技感 UI 容器 +2. 一个 64x64 的压力矩阵 +3. 用 InstancedMesh 渲染 4096 个小圆柱或小圆环 +4. 每个实例根据 value 更新位置、缩放、颜色 +5. 支持 OrbitControls 旋转缩放 +6. 内置一个假数据生成器,能模拟脚印从无到有再消失 +7. 数据更新用平滑插值,不要跳变 +8. 左侧显示总压力、最大值、平均值 +9. 支持 2D/3D 模式切换,但第一版 2D 可以只是俯视正交投影 + +# step4 config panel + +我需要一个panel来进行参数配置,有以下配置(后面会加) + +1. 点阵数量,目前默认是64*64,我希望可以自定义 +2. range上下限,我希望可以自定义max和min来映射颜色 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b68bf59 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1957 @@ +{ + "name": "tauri-demo", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tauri-demo", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2", + "three": "^0.183.2" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.6", + "@sveltejs/kit": "^2.9.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tauri-apps/cli": "^2", + "@types/three": "^0.183.1", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "~5.6.2", + "vite": "^6.0.3" + } + }, + "node_modules/@dimforge/rapier3d-compat": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.55.0", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.55.0.tgz", + "integrity": "sha512-MdFRjevVxmAknf2NbaUkDF16jSIzXMWd4Nfah0Qp8TtQVoSp3bV4jKt8mX7z7qTUTWvgSaxtR0EG5WJf53gcuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", + "cookie": "^0.6.0", + "devalue": "^5.6.4", + "esm-env": "^1.2.2", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "set-cookie-parser": "^3.0.0", + "sirv": "^3.0.0" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": "^5.3.3", + "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.6" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.7" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@tauri-apps/api": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz", + "integrity": "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.10.1.tgz", + "integrity": "sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.10.1", + "@tauri-apps/cli-darwin-x64": "2.10.1", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.10.1", + "@tauri-apps/cli-linux-arm64-gnu": "2.10.1", + "@tauri-apps/cli-linux-arm64-musl": "2.10.1", + "@tauri-apps/cli-linux-riscv64-gnu": "2.10.1", + "@tauri-apps/cli-linux-x64-gnu": "2.10.1", + "@tauri-apps/cli-linux-x64-musl": "2.10.1", + "@tauri-apps/cli-win32-arm64-msvc": "2.10.1", + "@tauri-apps/cli-win32-ia32-msvc": "2.10.1", + "@tauri-apps/cli-win32-x64-msvc": "2.10.1" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.10.1.tgz", + "integrity": "sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.10.1.tgz", + "integrity": "sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.10.1.tgz", + "integrity": "sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.10.1.tgz", + "integrity": "sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.10.1.tgz", + "integrity": "sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.10.1.tgz", + "integrity": "sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.10.1.tgz", + "integrity": "sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.10.1.tgz", + "integrity": "sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.10.1.tgz", + "integrity": "sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.10.1.tgz", + "integrity": "sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.10.1.tgz", + "integrity": "sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/plugin-opener": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.3.tgz", + "integrity": "sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stats.js": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.183.1", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.183.1.tgz", + "integrity": "sha512-f2Pu5Hrepfgavttdye3PsH5RWyY/AvdZQwIVhrc4uNtvF7nOWJacQKcoVJn0S4f0yYbmAE6AR+ve7xDcuYtMGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dimforge/rapier3d-compat": "~0.12.0", + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": ">=0.5.17", + "@webgpu/types": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~1.0.1" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/webxr": { + "version": "0.5.24", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", + "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.57.1.tgz", + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webgpu/types": { + "version": "0.1.69", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.69.tgz", + "integrity": "sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/devalue": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz", + "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.4.tgz", + "integrity": "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@typescript-eslint/types": "^8.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/meshoptimizer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-1.0.1.tgz", + "integrity": "sha512-Vix+QlA1YYT3FwmBBZ+49cE5y/b+pRrcXKqGpS5ouh33d3lSp2PoTpCw19E0cKDFWalembrHnIaZetf27a+W2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/set-cookie-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.0.1.tgz", + "integrity": "sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "5.54.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.54.0.tgz", + "integrity": "sha512-TTDxwYnHkova6Wsyj1PGt9TByuWqvMoeY1bQiuAf2DM/JeDSMw7FjRKzk8K/5mJ99vGOKhbCqTDpyAKwjp4igg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.6.4", + "esm-env": "^1.2.1", + "esrap": "^2.2.2", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.5.tgz", + "integrity": "sha512-1bSwIRCvvmSHrlK52fOlZmVtUZgil43jNL/2H18pRpa+eQjzGt6e3zayxhp1S7GajPFKNM/2PMCG+DZFHlG9fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/three": { + "version": "0.183.2", + "resolved": "https://registry.npmjs.org/three/-/three-0.183.2.tgz", + "integrity": "sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.2.tgz", + "integrity": "sha512-zpKATdUbzbsycPFBN71nS2uzBUQiVnFoOrr2rvqv34S1lcAgMKKkjWleLGeiJlZ8lwCXvtWaRn7R3ZC16SYRuw==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ad83466 --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "tauri-demo", + "version": "0.1.0", + "description": "", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "tauri": "tauri" + }, + "license": "MIT", + "dependencies": { + "@tauri-apps/api": "^2", + "@tauri-apps/plugin-opener": "^2", + "three": "^0.183.2" + }, + "devDependencies": { + "@sveltejs/adapter-static": "^3.0.6", + "@sveltejs/kit": "^2.9.0", + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "@tauri-apps/cli": "^2", + "@types/three": "^0.183.1", + "svelte": "^5.0.0", + "svelte-check": "^4.0.0", + "typescript": "~5.6.2", + "vite": "^6.0.3" + } +} diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 0000000..b21bd68 --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,7 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ + +# Generated by Tauri +# will have schema files for capabilities auto-completion +/gen/schemas diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000..1fc874d --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,5664 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.11.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.18", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.2.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link 0.2.1", +] + +[[package]] +name = "colored" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +dependencies = [ + "lazy_static", + "windows-sys 0.59.0", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.13.1", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "csv" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde_core", +] + +[[package]] +name = "csv-core" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +dependencies = [ + "powerfmt", + "serde_core", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dom_query" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" +dependencies = [ + "bit-set", + "cssparser 0.36.0", + "foldhash 0.2.0", + "html5ever 0.38.0", + "precomputed-hash", + "selectors 0.36.1", + "tendril 0.5.0", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47ec73ddcf6b7f23173d5c3c5a32b5507dc0a734de7730aa14abc5d5e296bb5f" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.12+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fern" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29" +dependencies = [ + "chrono", + "colored", + "log", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.11.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever 0.14.1", + "match_token", +] + +[[package]] +name = "html5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +dependencies = [ + "log", + "markup5ever 0.38.0", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "io-kit-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" +dependencies = [ + "core-foundation-sys", + "mach2", +] + +[[package]] +name = "ipnet" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.11.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser 0.29.6", + "html5ever 0.29.1", + "indexmap 2.13.0", + "selectors 0.24.0", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.183" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache 0.8.9", + "string_cache_codegen 0.5.4", + "tendril 0.4.3", +] + +[[package]] +name = "markup5ever" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +dependencies = [ + "log", + "tendril 0.5.0", + "web_atoms", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "log", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", +] + +[[package]] +name = "mio-serial" +version = "5.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029e1f407e261176a983a6599c084efd322d9301028055c87174beac71397ba3" +dependencies = [ + "log", + "mio", + "nix 0.29.0", + "serialport", + "winapi", +] + +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher 1.0.2", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.13.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.117", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.5+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "reqwest" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser 0.29.6", + "derive_more 0.99.20", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc 0.2.0", + "smallvec", +] + +[[package]] +name = "selectors" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" +dependencies = [ + "bitflags 2.11.0", + "cssparser 0.36.0", + "derive_more 2.1.1", + "log", + "new_debug_unreachable", + "phf 0.13.1", + "phf_codegen 0.13.1", + "precomputed-hash", + "rustc-hash", + "servo_arc 0.4.3", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.13.0", + "schemars 0.9.0", + "schemars 1.2.1", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serialport" +version = "4.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4d91116f97173694f1642263b2ff837f80d933aa837e2314969f6728f661df3" +dependencies = [ + "bitflags 2.11.0", + "cfg-if", + "core-foundation", + "core-foundation-sys", + "io-kit-sys", + "mach2", + "nix 0.26.4", + "scopeguard", + "unescaper", + "windows-sys 0.52.0", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "string_cache" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.13.1", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.34.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d52c379e63da659a483a958110bbde891695a0ecb53e48cc7786d5eda7bb" +dependencies = [ + "bitflags 2.11.0", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "once_cell", + "parking_lot", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da77cc00fb9028caf5b5d4650f75e31f1ef3693459dfca7f7e506d1ecef0ba2d" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.18", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bbc990d1dbf57a8e1c7fa2327f2a614d8b757805603c1b9ba5c81bade09fd4d" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a24476afd977c5d5d169f72425868613d82747916dd29e0a357c84c4bd6d29" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.117", + "tauri-utils", + "thiserror 2.0.18", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-demo" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "chrono", + "csv", + "fern", + "humantime", + "log", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-opener", + "tokio", + "tokio-serial", + "tokio-util", +] + +[[package]] +name = "tauri-macros" +version = "2.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d39b349a98dadaffebb73f0a40dcd1f23c999211e5a2e744403db384d0c33de7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddde7d51c907b940fb573006cdda9a642d6a7c8153657e88f8a5c3c9290cd4aa" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.12+spec-1.1.0", + "walkdir", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc624469b06f59f5a29f874bbc61a2ed737c0f9c23ef09855a292c389c42e83f" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2826d79a3297ed08cd6ea7f412644ef58e32969504bc4fbd8d7dbeabc4445ea2" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11ea2e6f801d275fdd890d6c9603736012742a1c33b96d0db788c9cdebf7f9e" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219a1f983a2af3653f75b5747f76733b0da7ff03069c7a41901a5eb3ace4557d" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever 0.29.1", + "http", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.18", + "toml 0.9.12+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" +dependencies = [ + "dunce", + "embed-resource", + "toml 0.9.12+spec-1.1.0", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "time" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tokio-serial" +version = "5.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa1d5427f11ba7c5e6384521cfd76f2d64572ff29f3f4f7aa0f496282923fdc8" +dependencies = [ + "cfg-if", + "futures", + "log", + "mio-serial", + "serialport", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap 2.13.0", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_datetime" +version = "1.0.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.13.0", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" +dependencies = [ + "indexmap 2.13.0", + "toml_datetime 1.0.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.0", +] + +[[package]] +name = "toml_parser" +version = "1.0.10+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" +dependencies = [ + "winnow 1.0.0", +] + +[[package]] +name = "toml_writer" +version = "1.0.7+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags 2.11.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.18", + "windows-sys 0.60.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unescaper" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4064ed685c487dbc25bd3f0e9548f2e34bab9d18cefc700f9ec2dba74ba1138e" +dependencies = [ + "thiserror 2.0.18", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +dependencies = [ + "getrandom 0.4.2", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", +] + +[[package]] +name = "web-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +dependencies = [ + "phf 0.13.1", + "phf_codegen 0.13.1", + "string_cache 0.9.0", + "string_cache_codegen 0.6.1", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +dependencies = [ + "thiserror 2.0.18", + "windows", + "windows-core 0.61.2", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.13.0", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "wry" +version = "0.54.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a8135d8676225e5744de000d4dff5a082501bf7db6a1c1495034f8c314edbc" +dependencies = [ + "base64 0.22.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.18", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.15", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.15", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 0.7.15", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 0.7.15", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..9eea26e --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "tauri-demo" +version = "0.1.0" +description = "A Tauri App" +authors = ["you"] +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +# The `_lib` suffix may seem redundant but it is necessary +# to make the lib name unique and wouldn't conflict with the bin name. +# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519 +name = "tauri_demo_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = ["tray-icon"] } +tauri-plugin-opener = "2" +serde = { version = "1", features = ["derive"] } +anyhow = "1.0.102" +tokio-serial = { version = "5.4.5" } +tokio = { version = "1.50.0", features = ["full"] } +async-trait = "0.1.89" +tokio-util = "0.7.18" +serde_json = "1" +fern = { version = "0.7.1", features = ["colored", "date-based"] } +log = "0.4.29" +humantime = "2.3.0" +csv = "1.4.0" +chrono = "0.4.44" diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 0000000..4ccf441 --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,15 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "core:default", + "core:window:allow-center", + "core:window:allow-current-monitor", + "core:window:allow-inner-size", + "core:window:allow-set-size", + "core:window:allow-start-dragging", + "opener:default" + ] +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000..1f6ee4d Binary files /dev/null and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..1f6ee4d Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png new file mode 100644 index 0000000..1f6ee4d Binary files /dev/null and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000..e77e6f5 Binary files /dev/null and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000..1f6ee4d Binary files /dev/null and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/recording_replay_debug_20260330.csv b/src-tauri/recording_replay_debug_20260330.csv new file mode 100644 index 0000000..3713ded --- /dev/null +++ b/src-tauri/recording_replay_debug_20260330.csv @@ -0,0 +1,361 @@ +channel1,channel2,channel3,channel4,channel5,channel6,channel7,channel8,channel9,channel10,channel11,channel12,channel13,channel14,channel15,channel16,channel17,channel18,channel19,channel20,channel21,channel22,channel23,channel24,channel25,channel26,channel27,channel28,channel29,channel30,channel31,channel32,channel33,channel34,channel35,channel36,channel37,channel38,channel39,channel40,channel41,channel42,channel43,channel44,channel45,channel46,channel47,channel48,channel49,channel50,channel51,channel52,channel53,channel54,channel55,channel56,channel57,channel58,channel59,channel60,channel61,channel62,channel63,channel64,channel65,channel66,channel67,channel68,channel69,channel70,channel71,channel72,channel73,channel74,channel75,channel76,channel77,channel78,channel79,channel80,channel81,channel82,channel83,channel84,dts +3748,4447,2765,2814,3154,4834,4314,3093,1325,177,1870,2839,2522,3465,3098,905,4761,2290,1908,4899,3021,4467,3824,4920,5000,4420,2633,4187,1887,2670,4990,4196,532,4176,1400,288,4006,218,4744,539,5000,5000,5000,4841,1946,1611,1224,2173,4118,5000,1975,1763,4747,1611,2866,4954,3566,2973,1434,1225,3192,4116,5000,152,3274,1919,1059,2380,1456,4029,1642,4279,426,3722,3423,4743,1150,5000,3017,1363,2352,5000,3010,2711,0 +3778,4415,2733,2781,3119,4795,4271,3109,1338,218,1912,2872,2553,3492,3120,921,4710,2234,1894,4885,3004,4443,3789,4941,5000,4427,2653,4220,1920,2703,5000,4223,492,4135,1356,242,3982,195,4781,572,5000,5000,5000,4845,1958,1653,1266,2151,4091,5000,1931,1723,4705,1566,2902,4985,3597,3003,1461,1247,3210,4129,5000,134,3256,1898,1029,2345,1415,4044,1651,4284,475,3772,3469,4782,1177,5000,2978,1321,2309,5000,2983,2683,35 +3808,4445,2343,2810,3145,4818,4290,3062,1288,198,1891,2843,2522,3456,3141,936,4720,2241,1941,4932,3047,4479,3816,4899,5000,4371,2612,4191,1892,2735,5000,4249,513,4156,1374,257,4020,233,4755,543,5000,5000,4976,4787,1908,1695,1308,2191,4126,5000,1948,1745,4724,1583,2877,4955,3567,2970,1425,1208,3228,4143,5000,177,3299,1939,1059,2372,1436,3997,1598,4227,463,3759,3452,4757,1203,5000,3000,1341,2327,5000,2599,2717,71 +3776,4414,2311,2776,3109,4841,4309,3077,1300,239,1932,2876,2552,3482,3100,889,4668,2185,1927,4917,3090,4514,3842,4919,5000,4377,2632,4223,1925,2705,5000,4212,471,4114,1330,210,4059,272,4791,995,5000,5000,4986,4791,1920,1675,1288,2168,4097,5000,1902,1766,4743,1600,2913,4987,3598,2999,1451,1229,3183,4094,4975,159,3280,1916,1028,2398,1456,4011,1607,4232,512,3807,3496,4792,1167,5000,2961,1719,2283,5000,2634,2750,108 +3806,4444,2341,2804,3134,4801,4265,3030,1251,218,1910,2909,2582,3507,3120,904,4677,2191,1974,4963,3069,4485,3806,4876,5000,4321,2590,4256,1958,2737,5000,4237,491,4135,1347,226,4035,248,4765,963,5000,5000,4996,4793,1931,1717,1330,2207,4130,5000,1917,1726,4700,1555,2887,4957,3567,2966,1476,1251,3200,4106,4985,202,3323,1955,1058,2362,1414,3962,1553,4175,499,3855,3538,4826,1192,5000,2983,1739,2302,5000,2607,2722,146 +3773,3992,2370,2832,3160,4822,4283,3044,1263,258,1949,2879,2549,3470,3077,855,4625,2136,2021,5000,3109,4516,3831,4894,5000,4327,2611,4227,1928,2706,5000,4199,448,4155,1364,241,4073,285,4800,994,5000,5000,4942,4734,1881,1697,1309,2182,4100,5000,1931,1747,4718,1572,2923,4988,3597,2995,1439,1210,3154,4057,4933,183,3365,1992,1088,2387,1433,3975,1561,4179,548,3840,3518,4796,1155,5000,2943,1697,2320,4998,2641,2754,185 +3803,4022,2338,2798,3122,4781,4238,2996,1214,299,1989,2911,2578,3495,3096,869,4634,2142,2006,4991,3086,4484,3793,4850,5000,4332,2631,4259,1961,2737,5000,4223,466,4113,1319,194,4048,260,5000,961,5000,5000,4949,4736,1893,1738,1350,2220,4131,5000,1881,1705,4675,1527,2897,5000,3628,3023,1464,1230,3170,4069,4943,226,3344,1967,1056,2349,1390,3926,1506,4184,596,3886,3558,4827,1179,5000,3385,1717,2276,4971,2613,2725,225 +3833,4052,2367,2825,3147,4802,4255,3011,1226,277,1965,2881,2545,3457,3053,882,4642,2149,2052,5000,3123,4512,3817,4867,5000,4275,2589,4230,1931,2706,5000,4245,484,4132,1337,209,4086,297,5000,989,5000,5000,4894,4675,1843,1718,1391,2256,4161,5000,1893,1726,4693,1544,2933,4989,3596,2989,1426,1188,3124,4019,4954,269,3384,2002,1085,2373,1408,3938,1514,4127,582,3869,3535,4794,1141,5000,3407,1737,2295,5000,2647,2756,259 +3381,4020,2334,2790,3109,4761,4272,3025,1239,317,2003,2912,2573,3480,3071,833,4589,2093,2036,5000,3098,4477,3841,4884,5000,4279,2610,4262,1963,2736,5000,4205,439,4090,1291,163,4062,334,5000,1017,4673,5000,4900,4677,1854,1759,1369,2230,4128,5000,1841,1685,4650,1562,2968,5000,3626,3016,1450,1208,3139,4031,4902,249,3362,1974,1051,2335,1426,3950,1521,4132,630,3914,3572,4821,1164,5000,3366,1695,1831,4978,2619,2726,294 +3411,4050,2363,2817,3133,4781,4227,2977,1190,295,1978,2882,2539,3503,3089,845,4597,2100,2082,5000,3133,4502,3802,4838,5000,4222,2568,4232,1995,2765,5000,4227,455,4110,1308,178,4099,728,5000,982,4630,5000,4844,4616,1866,1801,1409,2266,4156,5000,1850,1705,4668,1517,2942,4989,3594,2981,1412,1227,3154,4043,4913,291,3401,2007,1080,2358,1381,3899,1466,4075,615,3896,3547,4847,1188,5000,3388,1714,1850,5000,2653,2756,330 +3378,4018,2329,2782,3156,4801,4243,2990,1203,334,2014,2913,2566,3464,3044,795,4543,2045,2065,5000,3166,4525,3824,4854,5000,4226,2589,4265,1964,2733,5000,4186,409,4067,1263,193,4137,764,5000,1008,4649,5000,4849,4618,1816,1780,1386,2238,4121,5000,1859,1725,4687,1535,2976,5000,3623,3008,1435,1184,3107,3993,4861,270,3377,1977,1108,2380,1397,3910,1473,4080,662,3939,3581,4808,1148,5000,3347,1672,1806,5000,2686,2786,367 +3408,4047,2358,2808,3117,4759,4198,2942,1154,311,2049,2943,2593,3486,3060,807,4552,2052,2110,5000,3136,4485,3784,4807,5000,4168,2609,4297,1995,2761,5000,4206,424,4086,1280,147,4112,737,5000,551,4605,5000,4854,4619,1828,1821,1425,2272,4147,5000,1805,1683,4643,1490,2949,4989,3590,3035,1458,1202,3121,4004,4872,311,3414,2008,1073,2341,1352,3859,1417,4024,709,3980,3615,4831,1171,5000,3368,1271,1825,5000,2656,2754,405 +3376,4077,2386,2834,3140,4778,4214,2956,1168,349,2022,2912,2558,3446,3015,756,4498,2060,2154,5000,3167,4505,3806,4821,5000,4172,2568,4267,1964,2728,5000,4163,439,4105,1297,162,4569,772,5000,576,4622,5000,4796,4558,1778,1800,1401,2243,4172,5000,1811,1703,4661,1508,2983,5000,3620,2999,1418,1158,3073,3954,4822,352,3450,2037,1100,2362,1367,3869,1424,4030,693,3959,3585,4789,1551,5000,3328,1291,1843,5000,2689,2783,444 +3405,4044,2352,2798,3101,4735,4168,2908,1181,387,2056,2942,2584,3467,3030,767,4506,2006,2135,5000,3135,4462,3765,4835,5000,4176,2588,4298,1994,2755,5000,4182,391,4062,1251,116,4543,745,5000,599,4639,5000,4800,4560,1790,1840,1439,2275,4135,5000,1755,1661,4618,1464,3017,5000,3648,3025,1440,1176,3087,3966,4833,330,3424,2003,1065,2321,1320,3817,1431,4036,738,3999,3615,4808,1573,5000,3349,1248,1800,5000,2659,2750,484 +3435,4073,2380,2823,3123,4754,4183,2922,1134,362,2026,2910,2548,3426,3046,778,4514,2014,2178,5000,3162,4478,3785,4787,5000,4118,2547,4268,1963,2721,5000,4201,405,4081,1268,132,4580,778,4839,560,4592,5000,4741,4500,1740,1880,1476,2307,4158,5000,1760,1681,4636,1483,2988,5000,3615,2988,1400,1131,3039,3977,4845,369,3458,2030,1091,2342,1335,3827,1375,3981,720,3975,3582,4763,1594,5000,2950,1268,1819,5000,2690,2778,518 +3402,4040,2346,2786,3083,4772,4199,2936,1148,398,2058,2939,2573,3446,2999,726,4460,1961,2158,5000,3127,4494,3805,4800,5000,4122,2568,4299,1992,2748,5000,4157,357,4037,1222,506,4616,812,4867,582,4607,5000,4745,4503,1752,1858,1451,2276,4118,5000,1703,1638,4654,1501,3021,5000,3643,3014,1421,1148,3053,3927,4796,346,3430,1994,1055,2362,1350,3836,1382,3988,764,4013,3610,5000,1553,5000,2909,1225,1776,5000,2660,2806,553 +3432,4069,2373,2811,3104,4728,4152,2888,1101,372,2027,2906,2598,3466,3013,737,4469,1971,2199,5000,3152,4446,3763,4751,5000,4064,2527,4330,2022,2774,5000,4174,370,4056,1239,522,4590,783,4833,541,4559,5000,4686,4505,1765,1898,1488,2306,4140,5000,1706,1658,4611,1459,2991,5000,3609,2977,1442,1165,3066,3939,4809,384,3462,2018,1080,2320,1302,3784,1327,3934,745,3987,3636,5000,1574,5000,2930,1245,1795,5000,2691,2771,589 +3399,4036,2338,2836,3126,4746,4168,2903,1117,407,2057,2935,2561,3423,2966,685,4415,1918,2240,5000,3176,4458,3782,4764,5000,4069,2548,4299,1989,2738,4999,4129,321,4012,1255,538,4625,395,4860,562,4572,5000,4690,4447,1716,1875,1461,2273,4099,5000,1710,1677,4630,1478,3023,5000,3637,3001,1401,1120,3018,3889,4760,359,3431,2041,1105,2340,1315,3793,1334,3942,788,4022,3598,5000,1532,5000,2889,1202,1814,5000,2721,2797,626 +3428,4065,2365,2798,3085,4702,4121,2855,1071,442,2086,2964,2585,3442,2979,695,4424,1929,2217,5000,3136,4407,3738,4713,4977,4073,2569,4330,2018,2763,5000,4146,334,4030,1630,493,4599,365,4825,519,4584,5000,4693,4451,1728,1914,1497,2301,4118,5000,1650,1635,4587,1436,2993,5000,3665,3026,1421,1136,3031,3902,4774,395,3462,2001,1068,2297,1267,3740,1279,3950,829,4056,4042,5000,1553,5000,2909,1222,1771,5000,2689,2761,664 +3458,4093,2392,2822,3106,4720,4136,2870,1088,414,2052,2930,2547,3399,2931,643,4433,1940,2256,5000,3157,4417,3757,4725,4984,4015,2529,4299,1984,2726,4979,4162,346,4049,1647,509,4634,397,4851,538,4534,4968,4635,4394,1679,1891,1469,2329,4137,5000,1652,1654,4606,1456,3024,5000,3630,2987,1379,1090,2982,3852,4788,431,3491,2022,1092,2315,1280,3748,1286,3898,808,4026,4001,5000,1511,5000,2930,1241,1791,5000,2719,2786,703 +3425,4059,2357,2784,3064,4675,4090,2885,1105,447,2079,2958,2570,3417,2944,653,4380,1890,2232,5000,3114,4363,3774,4736,4990,4020,2550,4329,2012,2751,4999,4116,297,4005,1601,464,4186,366,4876,556,4546,4974,4638,4399,1692,1930,1503,2294,4093,5000,1592,1612,4563,1476,3054,5000,3657,3011,1398,1106,2996,3865,4741,404,3457,1979,1054,2271,1230,3757,1293,3907,848,4057,4021,5000,1110,5000,2889,1199,1749,5000,2686,2749,743 +3454,4088,2383,2807,3084,4692,4105,2838,1060,417,2043,2924,2532,3435,2958,663,4389,1902,2269,5000,3132,4371,3729,4685,4934,3963,2510,4297,1978,2775,5000,4131,309,4443,1618,481,4221,396,4838,512,4494,4918,4580,4344,1706,1968,1536,2320,4110,5000,1593,1632,4582,1435,3022,5000,3622,2972,1356,1060,3009,3878,4757,438,3484,1997,1077,2289,1243,3704,1239,3856,824,4446,3978,5000,1130,5000,2909,1219,1768,5000,2714,2773,777 +3421,4054,2347,2769,3104,4709,4120,2854,1079,448,2068,2951,2554,3391,2908,611,4337,1853,2243,5000,3148,4376,3746,4696,4940,3968,2532,4327,2005,2737,4976,4084,260,4399,1573,499,4254,426,4862,528,4504,4923,4585,4351,1657,1943,1507,2283,4065,5000,1532,1651,4602,1456,3051,5000,3649,2995,1375,1075,2960,3829,4711,409,3448,1952,1101,2306,1255,3712,1247,3867,862,4474,3996,5000,1087,5000,2868,1176,1727,5000,2743,2797,812 +3450,4082,2373,2792,3062,4664,4074,2808,1035,417,2030,2978,2576,3408,2921,621,4347,1867,2278,5000,3102,4319,3701,4644,4885,3911,2554,4356,2032,2760,4995,4099,272,4417,1590,34,4226,393,4823,482,4452,4867,4589,4359,1671,1980,1539,2308,4080,5000,1532,1609,4560,1416,3018,5000,3613,3018,1393,1090,2973,3843,4728,442,3473,1968,1061,2261,1204,3659,1193,3817,837,4502,4012,4666,1107,5000,2888,1196,1747,5000,2708,2758,848 +3417,4047,2399,2814,3082,4681,4089,2824,1055,447,2053,2943,2536,3363,2871,569,4296,1881,2312,5000,3116,4323,3716,4654,4891,3917,2514,4323,1997,2720,4951,4052,642,4435,1607,52,4259,421,4845,498,4461,4872,4532,4306,1623,1955,1509,2269,4095,5000,1533,1629,4580,1438,3046,5000,3639,2979,1350,1044,2925,3795,4684,411,3496,1983,1083,2278,1216,3667,1202,3829,1293,4466,3964,4608,1064,5000,2847,1216,1767,5000,2736,2780,885 +3445,4075,2362,2775,3039,4636,4043,2779,1075,476,2075,2969,2558,3379,2883,579,4306,1835,2283,5000,3066,4264,3670,4601,4897,3923,2536,4352,2023,2743,4969,4066,655,4391,1562,8,4230,387,4805,513,4470,4877,4538,4317,1638,1992,1540,2292,4047,5000,1471,1587,4538,1399,3011,5000,3665,3001,1368,1059,2938,3809,4702,442,3457,1935,1043,2232,1165,3614,1211,3843,1328,4491,3978,4610,1083,5000,2867,1174,1726,5000,2701,2740,923 +3474,4102,2387,2797,3058,4653,4059,2796,1034,442,2034,2933,2517,3333,2834,589,4318,1851,2315,5000,3078,4266,3685,4611,4841,3867,2497,4319,1987,2702,4987,4080,667,4409,1159,26,4262,415,4826,465,4417,4821,4482,4266,1590,1966,1570,2314,4060,5000,1471,1607,4559,1422,3038,5000,3628,2961,1324,1011,2890,3824,4721,472,3479,1948,1065,2248,1176,3622,1159,3795,1300,4452,3508,4549,1040,5000,2888,1194,1747,5000,2727,2762,962 +3441,4068,2350,2757,3015,4607,4075,2813,1055,470,2054,2959,2538,3349,2845,537,4268,1806,2284,5000,3026,4267,3700,4620,4847,3874,2519,4347,2012,2724,4942,4452,618,4364,1114,0,4232,442,4846,478,4425,4826,4489,4279,1605,2001,1537,2274,4010,5000,1409,1565,4580,1446,3064,5000,3653,2982,1342,1026,2904,3778,4678,438,3437,1898,1024,2201,1187,3631,1168,4230,1333,4475,3518,4550,1059,5000,2847,1152,1706,5000,2691,2783,1002 +3469,4095,2375,2779,3034,4624,4029,2769,1015,434,2011,2922,2558,3364,2857,547,4280,1824,2313,5000,3036,4206,3652,4567,4791,3820,2480,4314,2037,2745,4959,4466,631,4382,1131,2,4263,406,4804,430,4371,4770,4435,4293,1621,2036,1566,2294,4022,5000,1409,1585,4539,1408,3028,5000,3616,2941,1297,1041,2918,3793,4699,466,3457,1909,1045,2217,1136,3578,1117,4184,1302,4434,3528,4549,1078,5000,2867,1172,1727,5000,2716,2741,1036 +3435,4060,2338,2801,3053,4641,4045,2788,1038,460,2030,2947,2517,3318,2807,496,4231,1780,2280,5000,3044,4206,3666,4576,4797,3827,2504,4341,2000,2704,4914,4418,582,3918,1149,21,4294,432,4823,442,4378,4776,4443,4246,1574,2009,1532,2252,3971,4948,1409,1605,4561,1432,3053,5000,3641,2962,1315,994,2870,3748,4658,431,3413,1919,1065,2232,1147,3587,1128,4201,1333,4034,3474,4486,1034,5000,2826,1130,1687,5000,2741,2761,1071 +3464,4087,2362,2760,3009,4595,4000,2745,1000,422,2047,2972,2536,3333,2818,507,4244,1800,2308,5000,2989,4143,3618,4522,4742,3836,2527,4369,2024,2724,5000,4432,596,3936,1104,0,4263,395,4780,392,4324,4782,4452,4263,1590,2043,1560,2271,3981,4951,1347,1564,4521,1395,3015,5000,3666,2983,1332,1008,2884,3764,4680,457,3431,1866,1023,2184,1095,3534,1497,4156,1362,4052,3481,4484,1053,5000,2846,1151,1709,5000,2704,2719,1107 +3430,4113,2386,2781,3028,4612,4017,2764,1024,446,2002,2934,2494,3285,2768,456,4258,1821,2334,5000,2995,4142,3631,4531,4748,3783,2488,4334,1986,2682,5000,4384,610,3954,1122,0,4293,419,4798,404,4331,4726,4400,4219,1544,2015,1525,2289,3990,4954,1347,1585,4543,1421,3039,5000,3628,2942,1287,961,2837,3720,4641,482,3447,1875,1043,2198,1106,3543,1509,4175,1329,4007,3426,4420,1010,5000,2867,1171,1731,5000,2728,2738,1144 +3458,4078,2348,2740,2984,4567,3972,2784,1049,469,2018,2958,2513,3300,2780,467,4211,1780,2297,5000,2938,4078,3582,4539,4755,3792,2512,4361,2009,2701,5000,4398,142,3910,1078,0,4260,381,4815,415,4338,4733,4411,4238,1561,2048,1551,2245,3937,4895,1286,1544,4504,1385,3062,5000,3652,2962,1304,976,2852,3738,4665,444,3401,1820,1000,2150,1054,3553,1522,4194,936,4023,3431,4417,1029,5000,2825,1130,1692,5000,2690,2695,1182 +3486,4104,2372,2761,3002,4584,3989,2742,1013,430,1971,2920,2470,3252,2791,479,4226,1802,2322,5000,2943,4077,3595,4485,4700,3740,2474,4326,1971,3140,5000,4412,157,3927,1096,0,4290,404,4770,364,4284,4679,4361,4196,1515,2080,1576,2262,3946,4898,1287,1565,4527,1412,3022,5000,3614,2920,1258,929,2867,3756,4689,467,3416,1828,1019,2164,1064,3921,1473,4152,900,3976,3373,4352,1048,5000,2846,1151,1714,5000,2713,2713,1221 +3451,4068,2333,2720,2958,4601,4007,2763,1040,451,1985,2943,2488,3266,2741,429,4180,1764,2283,5000,2947,4075,3608,4493,4707,3751,2499,4352,1993,3097,5000,4364,110,3883,1053,0,4318,427,4786,374,4291,4686,4374,4219,1533,2051,1539,2216,3892,4838,1226,1586,4551,1439,3044,5000,3637,2939,1275,943,2820,3713,4652,427,3367,1772,976,2178,1075,3931,1487,4173,925,3990,3376,4348,1005,5000,2805,1110,1675,5000,2735,2731,1261 +3479,4094,2357,2740,2976,4556,3963,2723,1005,410,1936,2966,2506,3280,2752,441,4197,1788,2305,5000,2888,4011,3558,4439,4653,3700,2461,4378,2016,3116,5000,3958,126,3901,1071,0,4284,387,4739,322,4236,4633,4388,4242,1550,2082,1563,2231,3899,4840,1228,1546,4513,1404,3004,5000,3598,2897,1291,958,2836,3733,4678,448,3380,1778,994,2129,1023,3879,1439,3714,887,4003,3379,4344,1025,5000,2825,1131,1699,5000,2696,2686,1295 +3445,4058,2380,2760,2994,4573,3982,2745,1033,429,1949,2927,2462,3232,2702,392,4152,1751,2326,5000,2890,4009,3570,4447,4660,3712,2486,4342,2396,3072,5000,3911,80,3919,1090,0,4312,409,4754,332,4243,4642,4341,4205,1506,2051,1525,2184,3844,4842,1230,1568,4537,1433,3025,5000,3621,2916,1246,911,2790,3691,4643,407,3393,1784,1012,2142,1453,3890,1454,3737,909,3952,3319,4278,982,4991,2784,1091,1722,5000,2718,2703,1330 +3472,4083,2341,2718,2950,4528,3938,2706,999,448,1962,2950,2480,3246,2714,405,4171,1777,2284,5000,2830,3945,3519,4393,4669,3725,2511,4367,2418,3090,5000,3925,97,3876,1047,0,4277,368,4707,280,4251,4651,4357,4231,1525,2082,1548,2198,3851,4783,1171,1528,4500,1399,2983,5000,3644,2935,1262,926,2807,3712,4671,426,3342,1727,968,2093,1402,3839,1408,3761,931,3963,3320,4274,1002,5000,2805,1112,1684,5000,2677,2658,1366 +3499,4109,2364,2738,2968,4545,3958,2729,1029,405,1911,2910,2435,3197,2664,419,4189,1804,2303,5000,2831,3943,3531,4401,4615,3676,2474,4330,2377,3046,4807,3940,115,3894,1066,0,4304,389,4721,289,4197,4600,4313,4197,1482,2050,1570,2212,3857,4785,1174,1551,4525,1428,3003,5000,3604,2892,1216,880,2762,3671,4699,445,3353,1732,985,2106,1412,3851,1005,3724,890,3910,3258,4209,960,5000,2826,1134,1708,5000,2698,2674,1403 +3465,4072,2324,2696,2924,4501,3977,2753,1059,422,1923,2932,2452,3211,2676,371,4147,1770,2259,4981,2770,3880,3542,4410,4624,3690,2499,4775,2398,3064,4823,3894,71,3850,1024,0,4268,409,4735,298,4205,4611,4331,4227,1501,2079,1529,2163,3801,4725,1116,1511,4488,1458,3022,5000,3627,2911,1232,895,2779,3694,4666,401,3301,1675,940,2477,1422,3863,1022,3750,909,3919,3258,4205,980,4994,2785,1094,1671,5000,2657,2628,1441 +3492,4097,2347,2716,2942,4519,3935,2716,1028,377,1871,2891,2407,3224,2688,385,4167,1799,2275,4988,2771,3879,3491,4356,4571,3643,2463,4737,2419,3081,4838,3909,90,3868,1044,0,4294,366,4686,246,4151,4561,4289,4195,1520,2108,1550,2175,3806,4727,1121,1534,4514,1426,2979,5000,3587,2868,1186,911,2797,3717,4696,418,3310,1680,957,2489,1371,3813,978,3715,865,3865,3196,4201,1000,5000,2806,1116,1696,5000,2677,2644,1480 +3457,4060,2307,2674,2960,4537,3956,2741,1059,393,1882,2913,2424,3175,2638,338,4126,1767,2229,4995,2771,3879,3502,4364,4581,3659,2489,4761,2378,2616,4792,3863,47,3825,1001,0,4319,385,4699,255,4160,4573,4310,4227,1478,2074,1509,2125,3749,4668,1127,1558,4540,1456,2998,5000,3608,2886,1202,865,2754,3678,4665,372,3257,1623,974,2501,1382,3406,997,3743,883,3871,3195,4136,959,4975,2765,1077,1659,5000,2697,2659,1520 +3484,4085,2329,2693,2916,4493,3915,2705,1029,347,1892,2934,2440,3188,2651,354,4148,1798,2244,4938,2710,3817,3450,4310,4529,3614,2935,4785,2398,2633,4807,3880,68,3843,1022,0,4282,341,4650,202,4107,4587,4332,4261,1499,2102,1528,2136,3754,4671,1071,1519,4505,1425,2954,5000,3568,2904,1218,881,2772,3702,4697,387,3266,1627,1348,2452,1331,3357,954,3710,899,3877,3194,4134,980,4996,2787,1099,1684,5000,2654,2613,1554 +3448,4109,2351,2713,2934,4512,3936,2731,1062,362,1839,2892,2394,3139,2602,308,4109,1830,2258,4944,2710,3818,3461,4318,4539,3631,2900,4747,2356,2588,4761,3835,89,3862,1042,0,4306,359,4662,211,4116,4539,4293,4234,1458,2067,1485,2085,3759,4674,1078,1543,4532,1456,2972,5000,3589,2860,1172,835,2730,3665,4667,402,3274,1632,1364,2464,1342,3371,975,3740,852,3821,3130,4069,939,4956,2746,1122,1710,5000,2673,2628,1589 +3475,4072,2311,2670,2890,4469,3896,2697,1095,376,1849,2913,2410,3152,2615,325,4133,1800,2209,4886,2648,3758,3409,4327,4550,3649,2926,4770,1956,2605,4776,3852,48,3819,1001,0,4268,315,4612,220,4126,4555,4318,4270,1479,2094,1503,2095,3701,4615,1024,1505,4498,1426,2989,5000,3611,2878,1189,851,2749,3691,4700,354,3219,1575,1318,2414,871,3323,996,3771,867,3825,3129,4068,960,4977,2767,1083,1674,5000,2630,2581,1625 +3501,4096,2332,2689,2908,4488,3919,2724,1067,328,1796,2871,2364,3104,2628,342,4157,1834,2222,4891,2649,3761,3420,4274,4500,4026,2891,4731,1913,2560,4792,3870,71,3838,1022,0,4291,332,4624,167,4075,4509,4282,4246,1439,2120,1521,2104,3706,4619,1033,1530,4526,1458,2944,5000,3570,2834,1143,806,2708,3717,4734,367,3227,2000,1333,2426,882,3338,956,3741,818,3767,3065,4005,982,4999,2789,1106,1700,5000,2649,2596,1662 +3466,4058,2292,2646,2865,4507,3941,2752,1102,341,1805,2891,2380,3117,2580,298,4120,1806,2171,4832,2587,3764,3430,4283,4512,4046,2918,4754,1932,2577,4747,3826,32,3795,981,0,4314,348,4636,176,4086,4526,4309,4284,1461,2083,1476,2052,3648,4561,981,1493,4554,1491,2961,5000,3590,2852,1159,823,2729,3682,4706,317,3172,1943,1287,2438,894,3353,979,3774,830,3770,3064,4005,942,4958,2749,1068,1665,5000,2605,2610,1700 +3492,4082,2313,2666,2883,4465,3903,2719,1075,292,1752,2849,2395,3130,2594,316,4146,1842,2182,4836,2588,3707,3378,4230,4463,4005,2884,4356,1951,2594,4763,3845,56,3814,1003,0,4274,303,4585,123,4035,4483,4276,4324,1484,2108,1493,2061,3652,4566,991,1518,4521,1461,2915,5000,3549,2808,1175,841,2750,3710,4741,329,3178,1949,1302,1968,844,3307,940,3745,780,3711,3062,4006,965,4980,2771,1091,1692,5000,2623,2563,1739 +3456,4044,2272,2685,2901,4485,3927,2749,1111,305,1761,2868,2349,3081,2546,273,4111,1816,2191,4839,2589,3712,3388,4239,4896,4026,2911,4316,1908,2548,4718,3802,19,3771,1025,0,4296,318,4596,133,4048,4502,4306,4303,1445,2071,1447,2007,3595,4571,1003,1543,4550,1494,2931,5000,3570,2825,1130,796,2710,3676,4715,279,3543,1955,1317,1980,856,3324,965,3780,791,3713,2999,3946,926,4939,2731,1053,1719,5000,2640,2577,1779 +3482,4068,2293,2642,2858,4443,3889,2717,1085,317,1770,2887,2364,3094,2561,293,4138,1853,2139,4779,2529,3657,3336,4186,4848,4049,2939,4338,1927,2565,4735,3822,45,3791,985,0,4255,272,4545,81,4061,4523,4337,4346,1468,2095,1462,2015,3599,4515,954,1507,4517,1466,2886,5000,3590,2843,1146,815,2732,3705,4751,290,3550,1900,1270,1930,807,3279,928,3815,800,3715,2997,3948,949,4961,2753,1077,1685,5000,2596,2530,1813 +3508,4091,2314,2661,2877,4464,3914,2748,1121,266,1717,2844,2317,3046,2514,251,4167,1890,2147,4782,2531,3665,3346,4196,4862,4010,2485,4298,1884,2520,4690,3843,72,3811,1007,0,4276,287,4556,91,4012,4482,4307,4327,1430,2056,1415,2023,3603,4521,968,1533,4547,1500,2901,5000,3548,2798,1101,771,2693,3673,4788,300,3556,1907,864,1942,820,3296,954,3790,747,3654,2935,3890,911,4921,2775,1102,1713,5000,2613,2544,1848 +3471,4053,2273,2618,2834,4423,3877,2779,1158,278,1727,2863,2332,3059,2529,272,4134,1867,2093,4722,2471,3612,3356,4626,4877,4034,2514,4320,1902,2537,4707,3802,37,3769,968,0,4235,239,4567,101,4027,4505,4340,4371,1455,2079,1430,1969,3546,4466,922,1498,4515,1533,2917,5000,3568,2816,1117,790,2717,3704,4764,668,3501,1853,817,1892,771,3315,981,3827,756,3655,2934,3895,935,4943,2735,1064,1679,5000,2568,2496,1884 +3497,4076,2294,2637,2853,4444,3903,2748,1134,227,1674,2819,2285,3073,2545,293,4164,1906,2100,4725,2474,3623,3303,4575,4831,3997,2480,4279,1859,2553,4725,3824,65,3789,991,0,4255,254,4515,50,3980,4466,4313,4355,1480,2101,1444,1976,3550,4473,938,1524,4546,1506,2871,5000,3526,2771,1072,747,2741,3735,4802,678,3507,1861,831,1904,784,3272,947,3803,701,3594,2872,3902,959,4964,2758,1089,1707,5000,2584,2511,1921 +3461,4037,2253,2594,2872,4466,3929,2781,1172,238,1684,2838,2300,3025,2499,254,4133,1884,2045,4665,2478,3635,3313,4586,4847,3603,2509,4300,1877,2509,4682,3785,32,3747,953,0,4274,268,4526,61,3996,4491,4349,4401,1443,2060,1395,1921,3493,4420,893,1552,4577,1540,2886,5000,3545,2788,1089,767,2704,3704,4779,625,3452,1389,845,1916,798,3291,976,3841,708,3595,2873,3847,922,4924,2719,1052,1674,5000,2601,2525,1959 +3486,4060,2273,2613,2830,4426,3894,2752,1148,187,1632,2856,2314,3039,2516,276,4164,1924,2051,4667,2421,3586,3681,4535,4802,3568,2538,4321,1895,2526,4700,3808,62,3767,977,0,4231,220,4475,10,3950,4455,4386,4448,1469,2081,1408,1928,3498,4429,912,1517,4546,1513,2840,5000,3503,2806,1107,786,2729,3737,5000,634,3459,1399,797,1866,751,3250,943,3819,652,3595,2874,3856,947,4946,2742,1078,1703,5000,2555,2478,1998 +3449,4021,2294,2633,2849,4449,3922,2785,1187,198,1642,2812,2267,2991,2471,238,4135,1965,2057,4670,2426,3601,3691,4546,4819,3596,2505,4279,1851,2481,4658,3770,30,3788,1001,0,4250,233,4485,22,3968,4482,4362,4433,1433,2040,1358,1872,3503,4438,932,1545,4577,1547,2856,5000,3522,2761,1062,745,2693,3708,5000,581,3466,1410,811,1879,765,3271,973,3859,658,3534,2814,3804,911,4906,2703,1103,1733,5000,2571,2493,2038 +3474,4043,2252,2590,2807,4410,3888,2757,1225,209,1653,2829,2282,3005,2489,262,4168,1945,2001,4611,2371,3555,3639,4496,4418,3624,2534,4300,1869,2499,4677,3794,61,3747,963,0,4207,184,4434,34,3986,4510,4401,4482,1460,2060,1370,1879,3447,4387,891,1511,4547,1520,2809,5000,3541,2779,1080,766,2720,3741,5000,590,2992,1360,763,1829,718,3230,1004,3900,663,3534,2816,3816,937,4928,2726,1067,1700,5000,2525,2445,2072 +3499,4066,2273,2609,2828,4433,3916,2791,1202,157,1603,2785,2234,2958,2445,287,4202,1987,2006,4614,2378,3993,3650,4508,4375,3592,2502,4258,1825,2454,4697,3819,93,3768,988,0,4225,198,4445,0,3944,4477,4379,4468,1425,2018,1382,1885,3453,4398,914,1539,4579,1555,2825,5000,3499,2734,1036,725,2685,4195,5000,598,3000,1373,777,1842,734,3253,974,3880,606,3473,2758,3767,902,4950,2749,1093,1730,5000,2541,2460,2107 +3462,4026,2231,2567,2786,4395,3945,2826,1242,168,1615,2802,2249,2972,2463,251,4174,1968,1949,4555,2325,4013,3660,4521,4395,3622,2532,4278,1843,2472,4656,3783,64,3727,951,0,4180,210,4456,0,3964,4508,4420,4518,1453,2036,1331,1830,3397,4349,875,1506,4611,1590,2841,5000,3518,2751,1054,747,2712,4168,5000,545,2946,1324,729,1793,750,3276,1007,3922,610,3474,2762,3782,929,4911,2711,1057,1698,5000,2495,2475,2143 +3487,4049,2251,2586,2807,4419,3913,2799,1219,117,1565,2757,2263,2987,2482,277,4210,2011,1953,4559,2334,3972,3608,4052,4353,3591,2500,4236,1861,2490,4677,3810,97,3749,976,0,4198,161,4405,0,3923,4477,4400,4568,1481,2055,1342,1836,3404,4362,900,1535,4582,1563,2795,5000,3475,2707,1010,769,2740,4203,5000,133,2955,1339,742,1806,704,3238,978,3903,552,3413,2767,3799,956,4933,2734,1084,1729,5000,2511,2429,2180 +3449,4009,2210,2606,2828,4444,3942,2834,1259,128,1579,2774,2216,2941,2440,242,4184,1993,1896,4563,2765,3995,3619,4065,4374,3624,2530,4256,1817,2447,4637,3775,69,3708,1002,0,4215,174,4417,0,3945,4509,4443,4556,1448,2011,1291,1780,3349,4314,926,1564,4614,1598,2811,5000,3494,2724,1029,729,3127,4177,5000,79,2903,1355,756,1819,721,3262,1012,3946,556,3414,2712,3755,922,4893,2696,1049,1697,5000,2527,2444,2218 +3474,4031,2230,2563,2787,4407,3911,2808,1236,77,1592,2791,2231,2956,2460,270,4220,2037,1900,4506,2714,3957,3567,4017,4334,3657,2560,4275,1835,2465,4659,3803,104,3730,966,0,4169,124,4366,0,3906,4543,4486,4606,1477,2028,1301,1786,3357,4329,892,1532,4585,1571,2765,4995,3512,2742,1048,752,3157,4213,5000,88,2913,1310,707,1771,677,3225,985,3928,559,3416,2719,3774,950,4916,2720,1076,1728,5000,2481,2398,2257 +3436,4053,2250,2583,2808,4432,3942,2844,1276,88,1545,2746,2183,2910,2419,237,4257,2082,1905,4512,2727,3983,3158,4032,4357,3628,2528,4233,1791,2423,4619,3769,139,3752,992,0,4186,137,4378,0,3930,4515,4469,4595,1445,1984,1249,1793,3365,4345,920,1561,4618,1606,2782,5000,3469,2698,1005,714,3125,4188,4896,96,2924,1329,721,1784,695,3251,1021,3973,500,3356,2665,3734,917,4876,2744,1103,1759,5000,2497,2415,2297 +3460,4013,2208,2541,2768,4396,3911,2881,1315,100,1560,2763,2198,2926,2440,266,4233,2064,1847,4876,2680,3949,3107,4047,4380,3663,2559,4253,1810,2442,4643,3798,113,3713,957,0,4140,87,4390,0,3955,4551,4514,4645,1475,2000,1259,1737,3312,4300,888,1530,4589,1579,2799,5000,3488,2716,1025,1158,3155,4225,4938,43,2873,1286,673,1736,651,3278,1057,4018,503,3359,2675,3756,946,4899,2707,1069,1729,4999,2450,2369,2331 +3484,4035,2228,2561,2790,4422,3943,2856,1293,50,1514,2717,2151,2881,2462,296,4272,2109,1851,4882,2695,3978,3118,4000,4342,3636,2528,4210,1766,2462,4666,3828,149,3735,984,3,4155,99,4341,0,3919,4525,4498,4634,1443,2016,1268,1744,3321,4319,919,1560,4623,1614,2754,4996,3444,2671,983,1121,3186,4262,4979,52,2885,1307,686,1751,670,3243,1032,4001,443,3300,2624,3719,975,4922,2731,1097,1760,5000,2466,2386,2366 +3446,3995,2186,2519,2751,4449,3975,2893,1333,62,1531,2734,2166,2897,2422,264,4249,2093,1794,4828,2712,3589,3130,4016,4367,3673,2558,4229,1784,2420,4629,3797,124,3696,950,0,4171,112,4354,0,3946,4562,4544,4685,1474,1970,1215,1688,3269,4276,890,1590,4656,1648,2772,5000,3463,2689,1003,1146,3156,3818,4959,0,2836,1267,638,1765,690,3271,1070,4047,446,3304,2636,3745,943,4883,2694,1063,1730,4972,2482,2403,2402 +3470,4016,2207,2540,2773,4414,3946,2868,1310,13,1487,2750,2181,2915,2445,295,4288,2138,2219,4836,2668,3560,3080,3970,4331,3648,2527,4249,1803,2440,4654,3828,162,3719,977,7,4124,62,4305,0,3912,4539,4591,4735,1505,1985,1224,1695,3280,4296,923,1559,4628,1621,2728,4976,3420,2646,1443,1171,3188,3856,5000,8,2850,1290,651,1718,648,3238,1046,4031,387,3308,2649,3773,973,4906,2719,1091,1762,4990,2436,2359,2439 +3432,3976,2227,2560,2796,4442,3979,2906,1349,27,1506,2704,2134,2870,2406,265,4267,2122,2224,4845,2688,3594,3091,3988,4357,3685,2559,4206,1760,2399,4617,3798,137,3743,1005,40,4139,74,4319,0,3940,4578,4576,4723,1475,1938,1171,1640,3229,4317,958,1590,4661,1655,2746,4997,3438,2664,1402,1135,3158,3833,4981,0,2865,1314,665,1733,668,3267,1085,4077,390,3251,2602,3741,941,4867,2682,1057,1794,5000,2452,2377,2477 +3456,3998,2185,2519,2758,4408,3950,2881,1327,40,1525,2720,2149,2888,2430,297,4307,2167,2167,4793,2227,3567,3042,3943,4385,3724,2590,4225,1779,2420,4643,3830,176,3704,972,12,4092,25,4271,0,3970,4618,4624,4773,1507,1952,1179,1647,3241,4278,932,1559,4633,1627,2703,5000,3457,2682,1423,1161,2771,3872,5000,0,2819,1278,617,1686,628,3235,1063,4124,392,3257,2618,3772,972,4890,2708,1086,1765,4963,2407,2333,2516 +3479,4019,2205,2540,2782,4436,3984,2919,1366,0,1484,2675,2103,2844,2393,330,4348,2633,2172,4804,2250,3605,3054,3961,4351,3701,2559,4182,1736,2380,4608,3863,214,3728,1000,46,4107,37,4285,0,3939,4597,4610,4760,1478,1905,1188,1655,3254,4301,969,1591,4667,1661,2722,4976,3413,3059,1383,1126,2743,3849,5000,0,2835,1305,630,1702,649,3266,1103,4109,333,3202,2573,3743,941,4913,2733,1115,1797,4980,2423,2352,2556 +3441,3978,2164,2499,2744,4403,4018,2957,1404,7,1505,2691,2118,2863,2418,302,4328,2617,2116,4754,2212,3581,3067,3980,4379,3741,2590,4201,1755,2402,4635,3834,191,3691,967,18,4059,50,4300,0,3970,4638,4658,4809,1511,1918,1134,1601,3205,4263,945,1560,4638,1694,2742,4997,3432,3078,1405,1154,2777,3889,5000,0,2791,1271,582,1656,672,3297,1144,4156,337,3209,2592,3778,972,4875,2697,1082,1768,4935,2378,2309,2590 +3464,4000,2184,2520,2768,4432,3990,2933,1381,0,1466,2645,2072,2882,2444,336,4370,2662,2123,4348,2237,3621,3018,3937,4347,3720,2560,4159,1774,2424,4663,3868,230,3715,997,53,4073,0,4254,0,3941,4618,4645,4796,1544,1932,1142,1609,3219,4289,984,1592,4672,1666,2700,4955,3388,3035,1365,762,2811,3928,5000,0,2809,1300,596,1673,633,3267,1123,4141,278,3156,2550,3814,1004,4898,2723,1112,1801,4952,2394,2329,2625 +3426,3959,2143,2480,2793,4462,4025,2971,1419,0,1489,2661,2088,2840,2408,309,4770,2646,2068,4362,2264,3663,3031,3957,4377,3761,2591,4178,1732,2385,4629,3841,207,3678,964,88,4088,13,4270,0,3974,4661,4693,4843,1516,1883,1089,1555,3173,4254,1025,1624,4706,1699,2721,4975,3827,3054,1388,728,2784,3906,5000,0,2767,1269,610,1689,656,3300,1165,4188,282,3165,2572,3790,974,4860,2687,1079,1772,4969,2411,2349,2661 +3449,3980,2163,2501,2756,4430,3998,2948,1394,0,1514,2677,2104,2859,2435,345,4812,2691,2075,4315,2230,3644,2983,3916,4346,3741,2623,4197,1752,2408,4658,3876,247,3703,994,61,4040,0,4224,0,3946,4705,4742,4890,1550,1895,1097,1564,3188,4281,1004,1594,4677,1669,2681,4933,3784,3074,1411,757,2819,3946,5000,0,2787,1301,563,1644,618,3271,1145,4174,286,3175,2595,3829,1006,4884,2713,1109,1805,4925,2367,2307,2698 +3410,4002,2184,2523,2781,4460,4033,2986,1431,0,1477,2631,2058,2818,2401,319,4793,2737,1663,4331,2260,3688,2997,3937,4377,3783,2592,4155,1710,2370,4625,3849,286,3728,1025,96,4054,0,4241,0,3981,4687,4729,4875,1523,1846,1043,1512,3205,4310,1047,1626,4711,1702,2702,4954,3802,3031,952,724,2793,3925,5000,0,2809,1334,577,1662,643,3305,1188,4221,228,3125,2558,3808,976,4846,2678,1139,1838,4942,2384,2329,2736 +3433,3961,2142,2483,2745,4429,4007,2962,1468,0,1503,2647,2075,2839,2429,775,4836,2720,1610,4287,2229,3671,2949,3959,4410,3826,2624,4174,1731,2394,4655,3885,264,3691,993,69,4006,0,4197,0,4017,4731,4777,4920,1558,1858,1051,1522,3161,4278,1028,1596,4682,1672,2725,5000,3821,3051,976,754,2829,3965,5000,0,2770,1306,530,1618,606,3278,1231,4268,233,3137,2584,3850,1009,4870,2705,1107,1809,4897,2340,2288,2775 +3456,3982,2163,2506,2771,4460,4043,3000,1443,0,1469,2601,2030,2798,2458,812,4880,2764,1619,4306,2261,3718,2964,3919,4381,3808,2594,4132,1690,2357,4685,3921,304,3717,1024,105,4019,0,4215,0,3992,4714,4763,4902,1531,1870,1059,1532,3179,4309,1072,1628,4715,1703,2686,5000,3778,3009,938,722,2803,4005,5000,0,2793,1341,544,1636,632,3313,1212,4253,177,3089,2550,3831,1041,4894,2732,1137,1842,4914,2358,2310,2815 +3417,3941,2122,2466,2736,4492,4079,3038,1479,0,1497,2617,2047,2820,2425,788,4861,2327,1567,4264,2233,3765,2979,3942,4415,3852,2625,4151,1711,2382,4654,3896,281,3681,993,79,4033,0,4234,0,4029,4760,4811,4946,1567,1819,1006,1481,3136,4279,1055,1599,4749,1734,2710,5000,3797,2610,963,753,2840,3983,5000,0,2756,1316,497,1655,658,3349,1256,4300,183,3104,2579,3876,1012,4857,2697,1106,1814,4869,2314,2333,2849 +3440,3963,2143,2489,2762,4461,4053,3014,1452,0,1465,2571,2064,2842,2875,826,4905,2371,1578,4285,2269,3752,2933,3903,4387,3835,2595,4171,1732,2408,4686,3933,321,3707,1024,115,3985,0,4192,0,4005,4744,4797,4988,1603,1831,1014,1492,3157,4312,1101,1631,4719,1703,3092,5000,3754,2568,988,784,2877,4024,5000,0,2782,1353,512,1612,624,3324,1238,4285,128,3058,2610,3922,1045,4881,2724,1137,1847,4886,2333,2294,2884 +3400,3922,2102,2512,2790,4494,4089,3051,1487,0,1495,2587,2019,2802,2843,802,4886,2353,1590,4307,2305,3801,2949,3928,4422,3880,2627,4129,1692,2372,4656,3908,299,3672,1056,151,3999,0,4212,0,4044,4790,4845,4967,1577,1780,960,1442,3116,4346,1148,1664,4752,1734,3117,5000,3773,2589,951,754,2852,4002,5000,0,2747,1392,527,1632,651,3361,1283,4332,135,3075,2580,3908,1016,4844,2689,1106,1881,4904,2352,2318,2920 +3423,3943,2123,2474,2755,4464,4063,3027,1459,0,1526,2603,2037,2825,2874,841,4510,2396,1540,4269,2281,3790,2903,3891,4396,3925,2658,4149,1714,2399,4688,3945,338,3699,1026,125,3951,0,4171,0,4084,4836,4892,5000,1614,1791,969,1454,3138,4320,1133,1634,4723,1701,3080,5000,3372,2610,977,786,2890,4042,5000,0,2775,1370,481,1590,617,3336,1265,4378,143,3093,2613,3956,1049,4868,2717,1137,1853,4859,2309,2281,2973 +3446,3964,2145,2497,2783,4497,4100,3064,1493,0,1496,2557,1993,3207,2844,818,4554,2438,1554,4294,2320,3841,2920,3916,4432,3909,2628,4107,1675,2364,4659,3983,377,3726,1058,161,3965,0,4192,0,4062,4820,4876,4984,1589,1739,916,1467,3161,4356,1181,1667,4755,2151,3106,5000,3329,2570,941,756,2866,4020,5000,0,2805,1410,496,1611,646,3374,1310,4362,90,3051,2586,3944,1020,4831,2745,1168,1886,4877,2329,2306,3027 +3406,3923,2104,2459,2749,4468,4074,3101,1526,0,1530,2574,2012,3231,2876,858,4536,2419,1506,4258,2299,3830,2937,3942,4469,3956,2660,4127,1697,2391,4692,3959,354,3691,1028,136,3917,0,4214,0,4103,4867,4922,5000,1626,1750,925,1419,3122,4331,1168,1637,4725,2180,3133,5000,3348,2591,968,789,2904,4060,5000,0,2773,1389,450,1570,614,3413,1355,4408,99,3072,2622,3994,1053,4856,2711,1137,1858,4832,2287,2269,3082 +3429,3945,2126,2483,2778,4501,4111,3075,1496,0,1502,2528,1968,3256,2908,478,4580,2460,1521,4286,2340,3883,2893,3907,4445,3940,2629,4086,1659,2419,4726,3996,393,3719,1061,172,3931,0,4175,0,4082,4852,4905,4996,1663,1760,934,1433,3147,4369,1218,1669,4757,2146,3098,4884,3306,2551,933,760,2942,4100,5000,0,2804,1432,467,1591,644,3390,1338,4391,48,3032,2598,4046,1086,4882,2739,1169,1892,4850,2307,2295,3138 +3389,3904,2085,2446,2806,4535,4148,3112,1528,0,1536,2545,2407,3219,2879,456,4562,2439,1476,4253,2383,3936,2911,3934,4483,3987,2661,4106,1682,2386,4698,3973,369,3685,1032,209,3945,0,4198,0,4124,4898,4950,5000,1639,1709,882,1386,3111,4346,1206,1702,5000,2174,3126,4903,3325,2574,960,793,2918,4077,5000,0,2775,1413,483,1613,674,3429,1384,4436,59,3055,2637,4036,1058,4845,2706,1138,1863,4806,2328,2322,3188 +3411,3925,2107,2470,2774,4507,4123,3086,1497,0,1510,2561,2427,3244,2913,497,4605,2480,1493,4283,2364,3927,2868,3900,4460,3972,2692,4127,1706,2415,4732,4011,407,3713,1065,184,3897,0,4161,0,4104,4883,4993,5000,1677,1719,891,1401,3138,4386,1256,1672,5000,2140,3092,4861,3283,2596,988,827,2957,4117,5000,0,2808,1456,438,1573,643,3407,1367,4418,9,3080,2677,4089,1091,4871,2734,1170,1897,4824,2287,2287,3239 +3372,3884,2129,2495,2803,4541,4159,3121,1527,0,1547,2516,2384,3208,2465,476,4587,2520,1511,4314,2409,3980,2887,3929,4500,4020,2661,4086,1668,2382,4705,3987,382,3741,1098,220,3911,0,4185,0,4147,4929,4974,5000,1654,1667,839,1355,3165,4426,1307,1704,5000,2167,2701,4881,3303,2557,954,800,2933,4094,5000,0,2842,1501,455,1596,675,3448,1412,4462,22,3044,2656,4081,1062,4834,2701,1202,1931,4843,2309,2315,3291 +3394,3906,2090,2459,2771,4513,4134,3095,1557,0,1584,2953,2404,3235,2500,517,4630,2497,1468,4284,2393,3972,2844,3896,4540,4067,2693,4107,1693,2412,4740,4025,419,3708,1070,195,3864,0,4149,0,4191,4976,5000,5000,1692,1677,850,1372,3132,4406,1296,2094,5000,2131,2669,4900,3323,2580,983,834,2972,4132,5000,0,2816,1484,410,1558,645,3426,1458,4505,36,3071,2699,4135,1094,4860,2730,1172,1902,4799,2269,2281,3344 +3416,3927,2112,2484,2801,4547,4170,3130,1524,0,1560,2908,2362,3200,2473,559,4673,2535,1488,4318,2440,4026,2864,3926,4518,4053,2662,4067,1656,2380,4776,4063,456,3737,1104,232,3879,0,4175,0,4172,4960,4995,5000,1669,1625,860,1390,3161,4448,1347,2126,5000,2157,2699,4858,3281,2542,950,807,2949,4171,5000,0,2852,1529,427,1582,678,3467,1441,4486,0,3038,2681,4128,1065,4886,2759,1204,1936,4818,2291,2310,3398 +3377,3887,2073,2448,2769,4520,4207,3164,1552,0,1599,2925,2383,2807,2508,538,4654,2511,1448,4291,2425,4080,2885,3957,4559,4101,2693,4089,1681,2411,4749,4039,430,3704,1076,207,3832,0,4202,0,4216,5000,5000,5000,1708,1635,809,1346,3130,4430,1337,2096,5000,1762,2730,4878,3301,2565,979,842,2988,4147,5000,0,2827,1513,383,1544,711,3509,1486,4528,5,3068,2726,4183,1098,4850,2726,1174,1907,4775,2252,2339,3453 +3399,3908,2095,2474,2800,4555,4181,3136,1518,0,1996,2880,2404,2835,2544,580,4697,2547,1470,4327,2473,4072,2844,3926,4539,4087,2662,4049,1707,2442,4785,4077,465,3733,1110,243,3847,0,4168,0,4198,4989,5000,5000,1747,1645,821,1365,3161,4473,1809,2128,5000,1725,2699,4835,3260,2528,947,878,3026,4185,5000,0,2865,1560,401,1569,683,3489,1469,4508,0,3037,2772,4239,1130,4876,2755,1206,1940,4794,2275,2307,3509 +3359,3868,2056,2500,2831,4590,4217,3170,1545,0,2036,2898,2363,2801,2518,560,4677,2521,1432,4364,2522,4126,2865,3957,4581,4135,2692,4071,1671,2411,4759,4053,438,3701,1144,280,3862,0,4196,0,4243,5000,5000,5000,1724,1593,771,1323,3131,4456,1861,2159,5000,1750,2731,4855,3281,2552,977,851,3003,4160,5000,0,2842,1607,420,1594,717,3531,1514,4548,0,3070,2757,4233,1101,4841,2723,1177,1912,4814,2299,2337,3559 +3381,3889,2079,2465,2800,4563,4192,3141,1509,0,2076,2915,1965,2830,2555,602,4719,2557,1456,4340,2510,4117,2825,3928,4561,4183,2723,4093,1698,2443,4796,4090,472,3731,1116,255,3816,0,4163,0,4225,5000,5000,5000,1764,1603,783,1344,3164,4501,1851,2129,4781,1712,2701,4813,3302,2577,1007,887,3042,4197,5000,0,2882,1592,376,1558,690,3511,1497,4527,0,3103,2805,4289,1133,4867,2752,1209,1945,4771,2261,2306,3610 +3341,3911,2103,2492,2832,4598,4227,3173,1534,357,2055,2871,1925,2798,2530,582,4760,2591,1482,4379,2560,4170,2848,3961,4604,4169,2692,4054,1663,2413,4770,4065,506,3761,1151,291,3832,0,4193,0,4270,5000,5000,5000,1741,1551,733,1365,3198,4967,1903,2160,4810,1735,2734,4833,3261,2540,976,861,3018,4171,5000,0,2922,1639,396,1584,726,3554,1541,4566,0,3076,2791,4283,1103,4832,2782,1241,1978,4791,2286,2338,3662 +3363,3871,2064,2457,2801,4571,4201,3205,1559,390,2097,2889,1948,2827,2567,624,4739,2562,1447,4358,2548,4161,2809,3994,4647,4217,2722,4077,1690,2446,4806,4102,477,3729,1124,266,3786,0,4223,38,4315,5000,5000,5000,1781,1561,747,1325,3171,4952,1893,2129,4776,1696,2767,4853,3282,2565,1007,898,3057,4207,5000,0,2902,1624,353,1549,699,3596,1586,4604,0,3112,2841,4339,1134,4859,2750,1212,1949,4750,2249,2308,3715 +3385,3893,2088,2485,2833,4606,4237,3174,1521,363,2077,2425,1909,2796,2605,666,4780,2595,1475,4399,2599,4213,2833,3966,4629,4203,2690,4039,1656,2479,4843,4139,509,3759,1158,302,3802,0,4192,15,4297,5000,5000,5000,1759,1572,760,1348,3207,4999,1944,1740,4803,1719,2739,4811,3241,2529,977,872,3095,4242,5000,0,2943,1672,373,1576,736,3577,1568,4580,0,3087,2829,4332,1165,4886,2780,1244,1982,4770,2275,2340,3769 +3345,3853,2050,2450,2803,4642,4272,3205,1964,398,2119,2444,1932,2826,2581,646,4758,2565,1442,4379,2650,4265,2857,4001,4673,4250,2720,4062,1684,2450,4818,4114,478,3728,1131,277,3819,0,4224,56,4342,5000,5000,5000,1799,1520,712,1310,3601,4984,1934,1770,4831,1741,2773,4831,3263,2555,1009,909,3072,4215,5000,0,2924,1657,331,1604,772,3620,1612,4617,0,3126,2880,4388,1134,4851,2748,1215,1952,4729,2301,2373,3824 +3368,3875,2074,2478,2836,4615,4245,3174,1925,372,2099,2462,1956,2858,2620,688,4797,2595,1472,4422,2640,4253,2819,3974,4655,4236,2688,4086,1712,2483,4854,4150,509,3759,1166,313,3774,0,4195,34,4325,5000,5000,5000,1839,1530,727,1335,3639,5000,1986,1739,4795,1700,2746,4789,3223,2519,1041,946,3110,4249,5000,0,2967,1704,351,1571,747,3602,1593,4591,0,3165,2932,4443,1165,4878,2779,1247,1985,4751,2266,2344,3880 +3328,3835,2098,2507,2869,4650,4279,3203,1946,408,1722,2419,1918,2827,2597,668,4774,2563,1503,4466,2692,4303,2844,4010,4700,4283,2718,4048,1679,2455,4829,4123,477,3790,1201,349,3792,0,4228,76,4369,5000,5000,5000,1817,1479,680,1298,3615,5000,1617,1769,4822,1721,2780,4809,3245,2546,1011,921,3085,4221,5000,0,3010,1751,372,1599,785,3645,1636,4626,0,3144,2922,4436,1133,4844,2747,1218,2017,4772,2293,2378,3930 +3350,3857,2061,2473,2839,4624,4251,3590,1906,445,1765,2438,1942,2859,2636,710,4813,2592,1473,4449,2681,4290,2808,3984,4744,4330,2747,4073,1708,2489,4866,4158,506,3760,1175,323,3748,0,4199,55,4414,5000,5000,5000,1857,1490,695,1744,3654,5000,1605,1736,4786,1680,2754,4829,3268,2573,1044,958,3123,4254,5000,0,2992,1736,332,1567,761,3626,1616,4661,0,3186,2975,4490,1164,4871,2778,1250,1987,4732,2258,2350,3981 +3372,3880,2086,2502,2872,4659,4285,3619,1926,421,1746,2396,1905,2830,2613,752,4851,2620,1506,4495,2733,4338,2834,4021,4727,4315,2714,4036,1676,2461,4840,4193,535,3791,1210,359,3766,0,4233,97,4396,5000,5000,4964,1835,1439,712,1771,3693,5000,1656,1766,4812,1701,2789,4788,3228,2539,1015,933,3098,4224,5000,0,3037,1783,353,1596,799,3670,1659,4632,0,3166,2965,4481,1131,4899,2808,1283,2019,4754,2286,2385,4033 +3332,3840,2049,2469,2844,4632,4319,3647,1946,39,1789,2415,1930,2863,2652,732,4826,2585,1479,4479,2723,4324,2861,4058,4773,4362,2743,4061,1705,2496,4877,4165,500,3761,1183,332,3722,0,4268,139,4440,5000,5000,4976,1876,1450,666,1737,3672,4683,1644,1733,4775,1720,2825,4808,3251,2566,1048,970,3136,4256,5000,0,3019,1767,313,1565,838,3713,1700,4665,0,3210,3019,4534,1161,4865,2777,1254,1989,4715,2253,2357,4086 +3354,3863,2074,2498,2877,4667,4710,3612,1903,15,1770,2373,1894,2896,2692,773,4863,2611,1514,4526,2774,4370,2826,4034,4756,4346,2710,4024,1736,2530,4913,4199,527,3793,1219,368,3741,0,4241,119,4422,5000,5000,4924,1916,1462,1104,1765,3713,4733,1693,1762,4800,1678,2798,4766,3212,2532,1020,1008,3172,4287,5000,0,3064,1812,336,1595,815,3695,1679,4634,0,3192,3010,4587,1190,4893,2808,1286,2020,4738,2282,2393,4140 +3314,3824,2037,2466,2910,4702,4743,3639,1921,54,1812,2393,1920,2868,2670,752,4837,2574,1488,4573,2826,4414,2854,4072,4802,4392,2739,4050,1704,2503,4887,4170,491,3763,1192,403,3761,0,4277,162,4465,5000,5000,4934,1894,1411,1060,1733,3692,4720,1742,1791,4824,1697,2834,4787,3236,2561,1054,983,3147,4256,5000,0,3048,1796,358,1626,854,3738,1720,4665,0,3238,3064,4576,1156,4859,2777,1256,1989,4761,2311,2428,4195 +3336,3847,2063,2496,2882,4675,4714,3603,1457,32,1855,2414,1947,2902,2710,793,4872,2598,1526,4559,2814,4396,2820,4048,4786,4375,2767,4076,1735,2538,4923,4203,516,3796,1227,376,3719,0,4252,143,4446,5000,5000,4942,1934,1423,1078,1763,3315,4770,1728,1757,4786,1654,2809,4746,3197,2589,1088,1020,3183,4286,5000,0,3093,1840,320,1596,832,3720,1698,4633,2,3284,3117,4626,1184,4887,2808,1289,2020,4723,2279,2402,4251 +3297,3870,2089,2526,2916,5000,4746,3628,1475,72,1836,2372,1911,2874,2688,772,4844,2621,1564,4607,2865,4438,2849,4088,4831,4420,2734,4040,1704,2511,4897,4173,540,3828,1263,411,3739,0,4289,185,4488,5000,5000,4887,1913,1793,1036,1732,3357,4820,1775,1785,4810,1673,2845,4767,3221,2556,1060,995,3157,4253,5000,0,3138,1884,343,1628,872,3763,1738,4661,0,3269,3109,4613,1150,4853,2777,1321,2051,4747,2309,2438,4301 +3319,3831,2053,2494,2887,5000,4715,3591,1491,112,1878,2393,1939,2909,2728,812,4878,2582,1541,4594,2853,4417,2816,4127,4877,4465,2762,4067,1735,2546,4933,4205,502,3799,1236,383,3697,0,4264,228,4530,5000,5000,4894,1953,1806,1055,1763,3339,4808,1760,1751,4771,1629,2881,4788,3245,2585,1095,1033,3192,4281,5000,0,3122,1865,305,1599,850,3744,1776,4689,8,3316,3163,4662,1177,4882,2808,1291,2020,4709,2277,2413,4352 +3341,3854,2079,2524,2921,5000,4746,3195,1446,91,1858,2352,1904,2882,2769,852,4911,2603,1581,4643,2903,4456,2846,4105,4861,4447,2727,4032,1705,2519,4968,4235,525,3832,1272,417,3719,0,4302,209,4510,5000,5000,4837,1931,1819,1076,1376,3383,4858,1806,1779,4794,1647,2856,4747,3207,2553,1067,1008,3165,4309,5000,0,3167,1908,329,1632,890,3787,1753,4654,0,3303,3154,4647,1204,4910,2839,1324,2050,4734,2309,2449,4404 +3302,3816,2044,2493,3313,5000,4777,3219,1461,131,1900,2374,1932,2918,2747,830,4882,2561,1559,4631,2889,4494,2876,4145,4907,4490,2755,4059,1737,2555,4941,4204,485,3802,1245,389,3740,0,4340,252,4551,5000,5000,4842,2391,1770,1035,1347,3366,4845,1789,1744,4816,1665,2892,4768,3232,2583,1102,1045,3199,4274,5000,0,3151,1887,292,1665,931,3830,1790,4680,18,3352,3207,4693,1169,4877,2809,1294,2018,4697,2278,2486,4457 +3324,3839,2071,2524,3347,5000,4745,3180,1415,110,1879,2334,1961,2954,2787,869,4913,2581,1601,4680,2938,4469,2845,4124,4891,4471,2720,4087,1769,2590,4976,4233,506,3836,1280,423,3700,0,4317,233,4529,5000,5000,4846,2431,1784,1057,1381,3411,4895,1833,1770,4776,1621,2867,4728,3195,2551,1137,1082,3234,4301,5000,0,3196,1928,317,1637,910,3811,1765,4643,0,3339,3260,4737,1195,4906,2840,1326,2048,4723,2310,2461,4511 +3284,3801,2036,2555,3381,5000,4355,3203,1430,151,1920,2356,1928,2928,2766,846,4882,2537,1643,4730,2985,4504,2877,4165,4937,4514,2747,4053,1740,2563,4948,4200,465,3807,1316,456,3723,0,4356,276,4568,5000,5000,4788,2409,1735,597,1353,3394,4944,1876,1797,4798,1638,2903,4749,3220,2581,1111,1057,3205,4265,5000,0,3179,1968,343,1671,951,3853,1801,4667,32,3389,3250,4718,1159,4873,2809,1296,2077,4749,2342,2498,4566 +3307,3825,2063,2944,3353,5000,4322,3162,1382,193,1961,2378,1957,2964,2806,884,4912,2555,1624,4717,2970,4475,2846,4144,4921,4556,2774,4081,1772,2598,4982,4228,484,3840,1289,427,3684,0,4333,257,4607,5000,5000,5000,2449,1750,620,1389,3440,4932,1857,1761,4757,1594,2877,4709,3245,2612,1146,1094,3238,4290,5000,9,3224,1944,307,1643,930,3833,1775,4689,71,3439,3302,4760,1184,4902,2841,1327,2044,4713,2312,2894,4622 +3329,3849,2090,2976,3387,5000,4351,3184,1396,172,1939,2339,1925,2939,2785,860,4941,2572,1668,4767,3015,4507,2879,4186,4967,4535,2739,4047,1743,2572,4954,4256,503,3873,1324,460,3707,0,4373,300,4584,5000,5000,5000,2426,1702,582,1425,3486,4981,1898,1787,4779,1611,2913,4731,3209,2581,1119,1068,3209,4252,5000,51,3268,1982,333,1678,972,3875,1810,4649,49,3428,3292,4739,1147,4869,2872,1359,2073,4740,2345,2931,4672 +3290,3811,2056,2945,3359,4734,4317,3204,1410,213,1978,2362,1955,2976,2825,898,4908,2526,1650,4754,2998,4475,2911,4228,5000,4575,2765,4076,1776,2607,4987,4221,460,3845,1297,431,3669,0,4413,342,4621,5000,5000,5000,2466,1297,606,1399,3471,4967,1876,1750,4737,1628,2949,4753,3235,2612,1155,1105,3241,4276,5000,32,3250,1957,298,1652,951,3916,1844,4670,91,3479,3342,4777,1171,4898,2842,1329,2040,4705,2317,2907,4723 +3313,3835,2504,2977,3394,4767,4345,3163,1361,192,1954,2323,1923,3013,2865,935,4935,2541,1695,4804,3042,4504,2883,4208,4996,4553,2729,4043,1748,2642,5000,4247,477,3879,1332,463,3694,0,4391,323,4596,5000,5000,5000,2505,1313,631,1437,3517,5000,1915,1775,4758,1583,2923,4713,3199,2582,1129,1079,3273,4299,5000,76,3294,1992,325,1687,993,3896,1815,4629,71,3468,3330,4815,1195,4928,2873,1360,2068,4733,2770,2944,4775 +3274,3798,2470,2947,3428,4800,4372,3182,1374,234,1992,2347,1954,2989,2844,909,4900,2494,1678,4791,3084,4531,2916,4251,5000,4592,2755,4073,1781,2615,4990,4211,433,3850,1305,494,3719,0,4432,365,4632,5000,5000,5000,2482,1267,595,1413,3503,5000,1892,1800,4778,1600,2958,4735,3226,2614,1164,1115,3242,4260,5000,57,3275,1965,353,1724,1034,3936,1847,4648,114,3519,3380,4788,1157,4895,2843,1329,2034,4699,2804,2982,4828 +3296,3823,2498,2979,2980,4770,4337,3139,1325,213,1967,2371,1985,3026,2884,945,4926,2508,1724,4840,3064,4494,2889,4232,5000,4569,2780,4102,1814,2650,5000,4235,449,3884,1340,464,3682,0,4411,344,4605,5000,5000,5000,2101,1283,621,1451,3550,5000,1929,1763,4736,1555,2932,4696,3190,2646,1200,1151,3273,4281,5000,101,3318,1998,319,1698,1014,3915,1817,4604,95,3571,3428,4823,1180,4925,2874,1360,2062,4727,2776,2958,4882 +3257,4205,2526,3011,3013,4802,4363,3158,1338,254,2004,2333,1954,3002,2862,919,4889,2521,1770,4888,3104,4518,2923,4275,5000,4606,2744,4070,1786,2622,4991,4198,403,3918,1375,495,3708,0,4452,386,4639,5000,5000,5000,2078,1238,587,1429,3597,5000,1965,1787,4756,1572,2967,4719,3217,2616,1174,1124,3241,4240,5000,82,3359,2030,348,1735,1056,3955,1848,4621,139,3560,3414,4793,1141,4892,2844,1391,2089,5000,2811,2995,4937 +3280,4230,2493,2981,2985,4771,4327,3114,1351,294,2039,2357,1986,3040,2901,954,4913,2471,1755,4875,3081,4478,2896,4256,5000,4643,2769,4100,1820,2657,5000,4221,418,3890,1347,464,3672,0,4431,427,4673,5000,5000,5000,2116,1255,614,1468,3583,5000,1937,1749,4713,1527,2939,4741,3244,2648,1210,1159,3270,4261,5000,126,3339,1999,314,1710,1035,3932,1878,4638,184,3612,3460,4824,1164,4922,2875,1360,2054,5000,2783,2971,4993 +3303,4256,2522,2594,3019,4803,4352,3132,1301,272,2012,2320,1956,3017,2879,988,4937,2482,1802,4922,3119,4499,2932,4299,5000,4617,2732,4068,1792,2629,5000,4244,433,3924,1381,494,3699,0,4472,405,4643,5000,5000,4556,2092,1211,643,1509,3631,5000,1971,1772,4733,1544,2973,4703,3210,2619,1184,1132,3237,4281,5000,170,3379,2028,344,1747,1077,3971,1845,4591,168,3601,3444,4791,1124,4952,2907,1391,2081,5000,2818,2588,5043 +3684,4219,2489,2564,2991,4772,4377,3149,1314,312,2046,2346,1989,3055,2918,960,4898,2431,1787,4907,3094,4517,2968,4343,5000,4653,2756,4099,1826,2663,5000,4204,386,3896,1354,462,3665,0,4513,445,5000,5000,5000,4558,2130,1229,610,1488,3616,5000,1941,1734,4752,1561,3007,4726,3238,2652,1220,1167,3265,4238,5000,151,3357,1995,311,1723,1119,4010,1874,4606,214,3652,3488,4819,1146,4920,2876,1359,2466,5000,2791,2625,5094 +3708,4244,2518,2597,3024,4802,4339,3104,1264,290,2017,2309,2021,3093,2957,993,4919,2442,1834,4954,3129,4473,2942,4325,5000,4625,2719,4068,1860,2697,5000,4226,400,3930,1388,492,3693,0,4492,423,5000,5000,5000,4559,2168,1248,640,1529,3664,5000,1972,1757,4709,1517,2979,4687,3204,2623,1194,1201,3293,4256,5000,195,3396,2022,341,1760,1098,3986,1839,4558,199,3641,3532,4845,1167,4950,2907,1389,2492,5000,2827,2601,5146 +3669,4208,2065,2630,3058,4832,4362,3120,1276,329,2049,2335,1993,3070,2934,963,4879,2390,1820,5000,3163,4488,2979,4368,5000,4659,2743,4099,1832,2668,5000,4185,352,3902,1422,521,3721,0,4534,462,5000,5000,4851,4500,2143,1205,608,1509,3650,5000,2002,1779,4727,1534,3012,4711,3232,2656,1230,1173,3258,4212,5000,176,3373,2048,372,1799,1140,4024,1866,4571,246,3692,3512,4807,1126,4918,2877,1357,2456,5000,2442,2638,5199 +3692,4234,2095,2600,3029,4800,4323,3074,1227,306,2080,2361,2026,3109,2973,995,4899,2399,1867,4983,3133,4441,2954,4350,5000,4691,2767,4130,1866,2702,5000,4205,365,3937,1393,488,3688,0,4513,859,5000,5000,4856,4503,2181,1225,639,1551,3697,5000,1968,1740,4684,1490,2982,4673,3260,2689,1266,1207,3285,4230,5000,219,3410,2010,340,1775,1119,3999,1830,4522,294,3742,3553,4829,1147,4948,2908,1807,2481,5000,2416,2613,5253 +3654,4260,2125,2633,3062,4830,4346,3090,1239,345,2048,2326,1998,3086,2949,964,4919,2408,1915,5000,3164,4453,2991,4394,5000,4661,2729,4099,1838,2673,5000,4163,378,3971,1427,516,3717,0,4554,897,5000,5000,4798,4444,2156,1183,609,1594,3745,5000,1996,1762,4702,1508,3014,4697,3227,2661,1239,1178,3249,4185,5000,262,3446,2034,371,1814,1161,4035,1855,4533,280,3730,3530,4788,1106,4916,2939,1837,2507,5000,2452,2649,5308 +3678,3804,2093,2604,3033,4797,4306,3105,1252,382,2077,2353,2032,3124,2987,994,4875,2354,1900,5000,3132,4403,2967,4438,5000,4693,2752,4131,1872,2705,5000,4182,329,3943,1398,482,3685,0,4595,935,5000,5000,4802,4448,2192,1204,641,1575,3730,5000,1960,1722,4659,1464,3046,4721,3256,2695,1275,1211,3274,4201,5000,242,3420,1994,341,1790,1140,4071,1879,4544,328,3779,3569,4808,1126,4946,2909,1804,2470,4749,2426,2624,5364 +3701,3831,2123,2637,3065,4825,4328,3058,1202,358,2044,2318,2004,3101,3025,1024,4893,2362,1948,5000,3160,4413,3005,4420,5000,4661,2713,4101,1843,2737,5000,4200,341,3977,1431,510,3715,0,4995,910,5000,5000,4744,4390,2166,1225,674,1619,3778,5000,1985,1743,4677,1482,3015,4683,3223,2667,1249,1181,3299,4217,5000,285,3455,2015,373,1829,1181,4045,1841,4493,315,3766,3544,4763,1146,4977,3360,1834,2494,4780,2462,2660,5414 +3663,3795,2091,2608,3036,4853,4349,3073,1215,394,2071,2345,2039,3140,3000,991,4849,2308,1933,5000,3187,4421,3044,4464,5000,4690,2736,4133,1877,2707,5000,4157,292,3949,1402,475,3746,0,5000,946,5000,5000,4747,4396,2202,1185,646,1601,3763,5000,1946,1765,4696,1501,3045,4708,3253,2701,1284,1213,3262,4170,4970,264,3426,1973,343,1869,1221,4079,1863,4502,364,3814,3580,4779,1104,4945,3329,1801,2457,4750,2498,2696,5465 +3267,3822,2121,2641,3068,4819,4308,3026,1166,368,2035,2373,2073,3179,3037,1020,4865,2315,1981,5000,3150,4367,3021,4446,5000,4657,2697,4165,1911,2739,5000,4174,304,3983,1435,502,3715,0,5000,919,4646,5000,4751,4402,2238,1208,680,1645,3809,5000,1969,1724,4652,1458,3013,4671,3220,2673,1320,1245,3285,4185,4980,306,3459,1991,375,1846,1200,4051,1823,4449,351,3861,3614,4794,1123,4975,3360,1830,2061,4783,2472,2669,5517 +3229,3787,2152,2674,3100,4846,4328,3040,1180,404,2060,2339,2046,3156,3011,986,4819,2260,2028,5000,3174,4373,3060,4490,5000,4684,2720,4135,1883,2708,5000,4129,255,4018,1467,528,3747,415,5000,954,4669,5000,4692,4347,2211,1169,653,1628,3794,5000,1990,1745,4670,1477,3042,4696,3250,2707,1293,1214,3246,4138,4928,284,3490,2008,408,1886,1240,4085,1844,4458,400,3846,3585,4745,1081,5000,3329,1796,2084,4815,2508,2705,5570 +3253,3814,2120,2644,3070,4811,4286,2993,1131,438,2084,2368,2082,3195,3047,1013,4835,2267,2012,5000,3135,4316,3037,4472,5000,4711,2742,4167,1916,2739,5000,4146,267,3990,1437,492,3717,392,5000,926,4691,5000,4696,4355,2246,1192,688,1673,3840,5000,1948,1704,4627,1435,3009,4721,3280,2741,1328,1245,3269,4152,4938,325,3459,1963,380,1863,1218,4056,1802,4466,450,3892,3616,4756,1100,5000,3360,1825,2046,4786,2482,2677,5624 +3278,3841,2151,2677,3102,4838,4306,3007,1145,410,2046,2335,2055,3171,3021,1039,4849,2273,2059,5000,3156,4320,3077,4515,5000,4675,2703,4138,1888,2707,5000,4162,279,4024,1469,518,3749,431,5000,540,4651,5000,4637,4302,2219,1154,724,1718,3886,5000,1966,1724,4645,1455,3037,4685,3249,2714,1301,1213,3229,4104,4949,364,3488,1978,413,1903,1258,4088,1822,4411,437,3875,3584,4704,1057,5000,3390,1433,2069,4819,2519,2712,5679 +3240,3806,2120,2648,3071,4802,4325,3021,1160,443,2068,2364,2091,3210,3056,1003,4801,2218,2043,5000,3113,4261,3117,4559,5000,4700,2725,4170,1921,2737,5000,4116,230,3996,1438,481,4140,470,5000,573,4671,5000,4641,4312,2253,1179,698,1701,3869,5000,1922,1683,4601,1475,3065,4710,3279,2748,1335,1243,3250,4117,4897,341,3455,1930,385,1881,1298,4120,1840,4418,486,3920,3613,4713,1496,5000,3359,1399,2030,4790,2493,2684,5735 +3264,3834,2151,2681,3102,4828,4281,2973,1113,414,2027,2331,2065,3249,3091,1028,4815,2224,2088,5000,3132,4263,3095,4541,5000,4662,2685,4141,1954,2766,5000,4131,242,4030,1470,505,4174,447,5000,543,4628,5000,4583,4261,2287,1204,735,1746,3914,5000,1938,1703,4620,1434,3030,4674,3248,2721,1308,1272,3271,4130,4908,380,3482,1943,419,1921,1275,4088,1796,4363,474,3901,3578,4720,1515,5000,3389,1426,2053,4823,2529,2718,5785 +3227,3799,2120,2652,3133,4853,4300,2987,1128,445,2048,2361,2101,3225,3063,990,4766,2168,2071,5000,3148,4265,3136,4584,5000,4685,2706,4173,1925,2733,5000,4085,193,4001,1439,530,4207,487,4710,574,4647,5000,4587,4274,2258,1168,711,1730,3896,5000,1953,1723,4639,1455,3056,4700,3279,2755,1342,1239,3230,4081,4857,356,3446,1893,454,1961,1314,4119,1813,4369,523,3944,3604,4664,1472,5000,2938,1392,2013,4857,2565,2751,5836 +3252,3827,2151,2684,3101,4816,4256,2938,1082,414,2067,2391,2138,3264,3097,1014,4778,2175,2116,5000,3102,4203,3115,4565,5000,4645,2728,4206,1958,2762,5000,4099,206,4035,1470,912,4179,465,4686,542,4602,5000,4591,4287,2291,1194,749,1775,3940,5000,1905,1681,4595,1415,3020,4664,3248,2790,1376,1268,3250,4094,4868,393,3471,1904,426,1939,1290,4086,1768,4313,571,3985,3628,5000,1491,5000,2968,1419,2035,4829,2539,2722,5888 +3215,3855,2183,2717,3132,4840,4273,2952,1098,444,2023,2359,2112,3240,3069,974,4728,2181,2159,5000,3116,4203,3156,4608,5000,4667,2687,4177,1928,2728,4987,4052,219,4069,1500,935,4214,504,4725,572,4619,4985,4535,4240,2261,1159,726,1759,3983,5000,1918,1701,4614,1437,3045,4691,3280,2763,1348,1234,3207,4044,4817,429,3495,1914,462,1979,1328,4115,1783,4318,558,3963,3588,5000,1448,5000,2936,1446,2057,4863,2575,2754,5941 +3240,3821,2152,2687,3099,4802,4229,2904,1114,473,2041,2390,2149,3278,3101,997,4739,2125,2141,5000,3067,4141,3135,4651,5000,4687,2709,4210,1961,2756,5000,4066,170,4040,1468,897,4187,62,4700,601,4635,4991,4540,4257,2294,1187,765,1805,3964,5000,1868,1659,4571,1398,3069,4717,3311,2797,1381,1261,3226,4056,4829,402,3456,1862,435,1957,1304,4081,1798,4324,606,4003,3609,5000,1467,5000,2966,1410,2016,4835,2548,2724,5995 +3265,3850,2184,2720,3129,4826,4246,2918,1070,440,1996,2359,2123,3254,3134,1018,4750,2132,2183,5000,3079,4140,3176,4631,5000,4645,2668,4180,1931,2721,5000,4081,184,4074,1918,919,4222,102,4738,566,4589,4935,4484,4212,2263,1215,804,1851,4006,5000,1879,1679,4591,1421,3031,4682,3281,2770,1353,1226,3182,4068,4841,437,3478,1870,470,1997,1342,4108,1751,4267,592,3979,3987,4972,1486,5000,2996,1437,2038,4869,2584,2756,6050 +3228,3816,2153,2690,3096,4849,4262,2932,1088,467,2012,2390,2160,3292,3103,977,4699,2077,2163,5000,3028,4138,3217,4674,5000,4664,2689,4213,1963,2748,4985,4033,137,4045,1886,880,4257,141,4775,594,4603,4941,4491,4231,2295,1181,782,1834,3985,5000,1826,1636,4610,1444,3054,4709,3313,2805,1386,1253,3200,4018,4792,409,3436,1816,444,2037,1378,4135,1764,4272,640,4016,4006,4973,1443,5000,2964,1401,1997,4842,2557,2787,6106 +3253,3845,2185,2722,3125,4809,4217,2885,1044,432,1965,2359,2197,3329,3135,997,4709,2084,2204,5000,3037,4075,3197,4654,5000,4620,2648,4246,1994,2774,5000,4047,151,4079,1915,902,3811,119,4749,558,4555,4884,4436,4252,2325,1211,822,1880,4026,5000,1835,1656,4568,1406,3015,4675,3283,2777,1418,1279,3218,4030,4805,442,3456,1824,480,2015,1353,4099,1715,4215,625,3990,4022,4973,1042,5000,2994,1427,2017,4876,2593,2755,6156 +3217,3812,2154,2754,3154,4832,4233,2899,1063,458,1979,2391,2172,3304,3103,955,4657,2029,2244,5000,3045,4073,3239,4695,5000,4637,2669,4217,1963,2738,4960,3999,104,4470,1944,923,3847,159,4785,584,4568,4890,4444,4211,2294,1178,801,1864,4004,5000,1843,1675,4588,1431,3037,4702,3315,2812,1389,1243,3173,3979,4756,412,3413,1831,517,2055,1389,4124,1728,4219,672,4444,3976,4910,999,5000,2961,1391,2038,4911,2628,2785,6207 +3242,3840,2186,2724,3120,4792,4187,2852,1021,483,1993,2423,2210,3341,3133,974,4666,2036,2222,5000,2991,4009,3218,4675,5000,4653,2689,4249,1994,2763,4979,4012,120,4503,1911,883,3821,136,4759,546,4580,4895,4453,4234,2324,1208,842,1909,4043,5000,1788,1633,4546,1394,2997,4668,3347,2846,1421,1268,3190,3991,4770,443,3431,1775,491,2032,1363,4087,1678,4224,718,4478,3990,4908,1018,5000,2991,1416,1996,4884,2600,2752,6259 +3268,3869,2218,2756,3148,4813,4203,2866,1041,445,1944,2393,2185,3316,3101,930,4675,2044,2260,5000,2997,4007,3260,4716,5000,4607,2648,4220,1963,2726,4935,4026,136,4535,1939,484,3858,176,4794,570,4530,4838,4401,4197,2291,1177,821,1954,4082,5000,1794,1652,4567,1419,3018,4696,3318,2819,1390,1230,3144,3941,4785,473,3447,1781,528,2072,1398,4111,1689,4167,701,4448,3941,4424,976,4999,3020,1441,2017,4918,2635,2781,6312 +3232,3837,2188,2726,3114,4772,4157,2882,1062,468,1957,2426,2222,3353,3130,948,4622,1991,2236,5000,2941,3943,3302,4756,5000,4622,2669,4253,1993,2750,4952,3978,511,4506,1905,442,3832,153,4828,593,4541,4844,4412,4223,2320,1209,863,1938,4058,5000,1738,1610,4525,1445,3038,4724,3350,2853,1422,1254,3160,3953,4738,441,3401,1724,503,2050,1370,4134,1700,4172,1166,4479,3953,4421,995,5000,2987,1404,1975,4891,2607,2747,6366 +3258,3866,2219,2757,3141,4793,4173,2835,1022,428,1906,2396,2198,3389,3158,965,4631,1999,2272,5000,2945,3942,3282,4735,5000,4574,2627,4223,1961,2774,4969,3992,529,4539,1933,462,3869,192,4800,553,4489,4787,4362,4189,2349,1240,905,1982,4095,5000,1743,1630,4546,1410,2996,4690,3321,2825,1391,1216,3175,3964,4754,469,3416,1729,540,2089,1404,4094,1648,4114,1148,4447,3901,4418,1015,5000,3016,1429,1994,4926,2641,2775,6421 +3222,3833,2189,2726,3168,4814,4188,2851,1044,450,1918,2429,2235,3363,3124,920,4577,1946,2246,5000,2949,3940,3324,4775,5000,4587,2648,4255,1991,2736,4924,3944,485,4509,1478,482,3907,231,4833,575,4499,4793,4374,4218,2315,1211,886,1965,4069,5000,1685,1649,4568,1437,3016,4719,3354,2860,1422,1239,3129,3914,4708,434,3368,1672,577,2129,1438,4116,1658,4120,1191,4475,3490,4352,973,5000,2982,1391,1952,4899,2675,2802,6477 +3248,3863,2221,2757,3133,4772,4141,2805,1005,409,1867,2463,2272,3398,3151,936,4585,1956,2281,5000,2890,3877,3305,4752,5000,4538,2668,4288,2020,2759,4941,4379,503,4541,1505,440,3882,208,4803,534,4447,4737,4388,4248,2343,1244,928,2009,4104,5000,1688,1607,4528,1402,2973,4685,3325,2894,1452,1262,3144,3926,4725,461,3381,1677,553,2106,1409,4075,1605,4483,1172,4502,3498,4348,993,5000,3011,1416,1971,4934,2646,2767,6527 +3213,3830,2253,2788,3159,4792,4157,2821,1029,429,1877,2434,2248,3372,3116,889,4532,1966,2314,5000,2893,3877,3347,4791,5000,4549,2626,4258,1987,2719,4895,4331,461,4573,1532,459,3920,246,4835,554,4456,4743,4341,4218,2308,1215,909,1992,4139,5000,1691,1627,4550,1430,2992,4714,3358,2866,1420,1222,3096,3877,4681,425,3393,1681,591,2145,1442,4095,1614,4488,1214,4466,3443,4282,952,5000,2977,1440,1991,4969,2679,2793,6578 +3239,3860,2223,2757,3123,4749,4110,2776,1054,448,1887,2468,2285,3406,3142,904,4540,1915,2285,5000,2833,3815,3327,4768,5000,4561,2647,4290,2015,2741,4911,4346,481,4123,1496,416,3895,222,4804,573,4465,4750,4357,4251,2335,1249,952,2035,4111,5000,1631,1585,4510,1397,2948,4743,3391,2899,1450,1244,3111,3889,4700,449,3343,1624,566,2122,1412,4053,1623,4494,1255,4070,3449,4278,973,5000,3005,1401,1948,4942,2650,2756,6630 +3266,3890,2254,2788,3148,4768,4125,2793,1017,404,1835,2439,2261,3379,3105,919,4548,1927,2316,5000,2834,3816,3369,4806,5000,4509,2605,4260,1982,2701,5000,4361,502,4155,1522,434,3933,260,4834,529,4411,4695,4312,4224,2299,1221,995,2079,4143,5000,1633,1605,4533,1426,2966,4711,3362,2871,1417,1203,3063,3902,4719,473,3354,1629,604,2160,1443,4072,1989,4438,1233,4031,3392,4212,932,5000,3033,1425,1967,4976,2682,2781,6683 +3231,3858,2224,2756,3112,4725,4141,2811,1043,422,1844,2473,2298,3413,3130,871,4494,1877,2285,5000,2773,3817,3411,4844,5000,4519,2625,4291,2009,2722,5000,4314,461,4124,1486,391,3909,298,4864,547,4419,4702,4330,4260,2325,1256,977,2060,4113,5000,1572,1563,4556,1455,2983,4740,3395,2905,1446,1224,3077,3853,4677,434,3302,1571,580,2136,1474,4091,1997,4444,1272,4053,3396,4209,953,5000,2999,1386,1924,4949,2652,2806,6737 +3258,3888,2256,2786,3137,4744,4094,2767,1008,377,1792,2446,2335,3447,3155,885,4502,1890,2314,5000,2774,3758,3391,4819,5000,4467,2584,4261,2037,2743,5000,4329,64,4155,1511,409,3947,273,4831,502,4365,4648,4288,4297,2350,1292,1020,2102,4144,5000,1573,1583,4518,1423,2938,4707,3366,2876,1412,1245,3091,3866,4697,456,3312,1576,618,2175,1442,4047,1942,4389,828,4012,3399,4205,975,5000,3027,1409,1942,4984,2684,2768,6792 +3223,3856,2226,2816,3161,4762,4109,2785,1035,393,1801,2480,2310,3418,3116,836,4449,1841,2281,5000,2775,3761,3433,4855,5000,4475,2604,4292,2002,3122,5000,4283,25,4124,1536,427,3985,310,4860,518,4372,4657,4309,4273,2313,1265,1002,2082,4112,5000,1573,1604,4542,1453,2955,4737,3400,2909,1440,1203,3042,3817,4657,415,3259,1582,657,2212,1472,4484,1950,4396,865,4031,3339,4140,935,5000,2992,1370,1899,5000,2715,2791,6848 +3250,3886,2257,2783,3123,4719,4063,2742,1002,347,1810,2515,2347,3451,3140,848,4457,1855,2308,5000,2713,3703,3412,4830,5000,4484,2624,4323,2029,3142,5000,4300,49,4155,1499,382,3961,285,4826,472,4318,4666,4331,4313,2338,1301,1046,2124,4141,5000,1512,1562,4504,1422,2909,4705,3433,2942,1468,1222,3056,3831,4679,435,3267,1525,633,2188,1439,4438,1895,4342,902,4049,3341,4137,957,5000,3019,1393,1918,4991,2684,2752,6898 +3215,3917,2289,2813,3147,4736,4079,2762,1030,362,1757,2487,2322,3422,3100,799,4465,1870,2334,5000,2713,3709,3454,4865,5000,4429,2583,4292,1993,3100,5000,3834,73,4186,1523,399,4000,321,4853,487,4325,4614,4292,4292,2299,1276,1027,2165,4169,5000,1512,1583,4529,1453,2926,4735,3405,2913,1433,1180,3007,3784,4640,454,3275,1531,671,2225,1468,4454,1902,3930,875,4004,3279,4073,918,5000,3047,1415,1936,5000,2714,2774,6949 +3242,3885,2258,2780,3109,4692,4032,2782,1060,377,1766,2522,2359,3454,3122,811,4412,1824,2297,4997,2651,3653,3434,4900,5000,4437,2603,4323,2439,3119,5000,3852,37,4154,1485,354,3976,295,4879,501,4332,4625,4316,4334,2323,1313,1071,2144,4135,5000,1450,1542,4492,1423,2942,4765,3438,2946,1460,1198,3020,3798,4664,410,3221,1476,648,2200,1854,4470,1909,3939,909,4020,3280,4071,941,5000,3011,1376,1893,4997,2682,2733,7001 +3270,3915,2290,2808,3132,4710,4048,2741,1028,328,1713,2495,2334,3424,3144,822,4421,1841,2321,5000,2652,3661,3475,4873,5000,4381,2562,4291,2402,3138,5000,3869,63,4184,1509,371,4014,330,4843,453,4278,4574,4280,4315,2284,1351,1115,2184,4161,5000,1450,1564,4518,1455,2896,4734,3409,2916,1425,1155,3034,3813,4689,428,3228,1483,686,2237,1881,4423,1854,3886,880,3973,3218,4008,965,5000,3038,1398,1911,5000,2711,2755,7054 +3235,3884,2259,2775,3093,4727,4064,2762,1059,342,1722,2531,2371,3455,3103,772,4368,1797,2282,4950,2652,3670,3516,4907,5000,4388,2582,4322,2428,3095,4803,3826,28,4152,1470,326,4052,365,4868,466,4285,4586,4307,4359,2307,1326,1097,2161,4124,5000,1388,1585,4544,1487,2911,4764,3443,2948,1451,1173,2985,3767,4652,382,3173,1429,662,2273,1908,4437,1440,3896,912,3986,3217,4008,927,5000,3003,1357,1867,5000,2740,2775,7108 +3263,3914,2290,2803,3115,4682,4019,2722,1029,293,1670,2566,2407,3486,3123,783,4378,1815,2303,4956,2591,3618,3495,4878,5000,4332,2541,4772,2452,3113,4818,3844,56,4182,1493,342,4028,338,4830,417,4230,4537,4335,4404,2329,1365,1141,2200,4149,5000,1388,1545,4509,1458,2865,4733,3414,2918,1477,1191,2998,3783,4678,398,3180,1437,701,2667,1872,4389,1385,3845,881,3998,3216,4009,951,5000,3029,1379,1886,5000,2707,2733,7163 +3229,3883,2321,2831,3137,4699,4035,2744,1061,305,1679,2539,2381,3454,3081,732,4326,1772,2324,4962,2592,3630,3536,4911,5000,4337,2562,4739,2415,3070,4772,3802,23,4211,1516,358,4066,372,4853,429,4238,4551,4303,4388,2288,1341,1122,2176,4110,5000,1388,1567,4535,1491,2881,4764,3448,2950,1440,1146,2949,3738,4643,351,3187,1446,739,2703,1898,4402,1392,3856,911,3948,3153,3948,914,5000,2993,1338,1904,5000,2735,2753,7219 +3257,3914,2291,2797,3097,4654,3990,2705,1032,318,1689,2575,2418,3484,3100,742,4336,1792,2282,4905,2531,3581,3515,4881,5000,4343,2583,4769,2439,2668,4787,3822,53,4179,1477,312,4042,343,4814,379,4245,4566,4334,4435,2310,1380,1166,2214,4133,5000,1326,1527,4501,1462,2834,4795,3481,2981,1465,1164,2963,3755,4671,366,3131,1394,716,2676,1861,3933,1336,3868,940,3958,3151,3951,939,5000,3019,1360,1860,5000,2701,2710,7269 +3285,3944,2321,2825,3119,4671,4007,2729,1066,267,1638,2548,2392,3451,3057,753,4346,1814,2300,4909,2533,3595,3555,4913,5000,4286,2962,4736,2400,2623,4741,3842,83,4208,1499,328,4080,376,4837,390,4191,4519,4304,4420,2269,1357,1210,2251,4155,5000,1327,1549,4528,1496,2850,4764,3453,2950,1427,1118,2914,3710,4700,379,3138,1405,1174,2711,1885,3945,1343,3819,905,3905,3088,3893,903,5000,3045,1381,1879,5000,2728,2729,7320 +3251,3913,2290,2790,3078,4626,4024,2753,1100,279,1649,2584,2427,3480,3075,701,4295,1774,2256,4851,2474,3549,3595,4944,5000,4291,2983,4765,2424,2641,4757,3801,52,4174,1458,282,4056,409,4858,401,4199,4536,4337,4469,2289,1397,1191,2225,4113,5000,1266,1510,4494,1530,2865,4795,3486,2981,1452,1135,2928,3729,4667,330,3083,1355,1151,2684,1909,3957,1350,3832,932,3913,3086,3897,929,5000,3008,1340,1835,5000,2693,2686,7372 +3279,3944,2321,2817,3099,4643,3980,2716,1073,228,1598,2558,2401,3509,3093,711,4307,1796,2272,4855,2477,3567,3573,4912,5000,4233,2942,4732,2027,2658,4773,3823,84,4203,1480,298,4093,379,4817,350,4146,4492,4309,4455,2309,1437,1234,2261,4133,5000,1267,1533,4523,1502,2819,4764,3457,2950,1413,1151,2941,3747,4698,343,3089,1367,1189,2718,1450,3907,1295,3785,895,3859,3022,3903,956,5000,3033,1361,1854,5000,2719,2703,7425 +3246,3913,2289,2781,3120,4659,3998,2741,1108,239,1610,2594,2436,3475,3048,659,4257,1758,2226,4858,2481,3586,3613,4942,5000,4658,2963,4760,1987,2614,4728,3783,54,4169,1439,313,4131,410,4837,360,4154,4510,4345,4505,2266,1415,1215,2234,4090,4990,1269,1557,4552,1536,2835,4796,3490,2980,1437,1105,2893,3705,4667,293,3034,1739,1227,2752,1473,3918,1302,3800,920,3865,3021,3849,920,5000,2997,1319,1810,5000,2745,2721,7479 +3274,3943,2320,2808,3079,4614,3954,2705,1082,188,1622,2630,2471,3502,3065,669,4269,1783,2241,4799,2423,3545,3590,4909,5000,4600,2985,4788,2009,2631,4745,3806,88,4197,1460,267,4106,379,4795,308,4102,4530,4381,4554,2286,1455,1258,2268,4108,4994,1209,1518,4519,1509,2789,4765,3462,3010,1460,1121,2907,3725,4698,304,3041,1754,1203,2723,1433,3867,1248,3754,943,3871,3019,3857,948,5000,3022,1340,1829,5000,2708,2676,7534 +3241,3974,2350,2834,3099,4631,3973,2732,1118,199,1573,2604,2444,3467,3020,617,4220,1809,2254,4801,2428,3567,3629,4938,5000,4604,2944,4334,1969,2586,4700,3768,121,4224,1481,282,4143,409,4814,318,4111,4489,4357,4542,2242,1434,1239,2239,4125,4997,1211,1542,4548,1543,2805,4797,3495,2978,1420,1075,2859,3684,4669,315,3048,1769,1241,2336,1454,3877,1255,3771,903,3814,2956,3805,913,5000,2984,1360,1847,5000,2733,2693,7590 +3269,3943,2318,2798,3057,4585,3930,2697,1155,210,1587,2640,2479,3494,3036,627,4234,1774,2205,4742,2373,3529,3606,4966,5000,4608,2966,4361,1991,2602,4717,3792,94,4190,1439,236,4118,377,4770,327,4121,4511,4396,4593,2261,1475,1281,2272,4080,4939,1152,1505,4516,1516,2821,4829,3528,3007,1442,1090,2874,3705,4702,263,3414,1724,1217,2306,1413,3826,1263,3788,924,3818,2956,3817,942,5000,3009,1319,1804,5000,2696,2648,7640 +3298,3974,2348,2823,3077,4602,3950,2725,1130,158,1539,2614,2451,3458,3051,637,4248,1801,2217,4744,2380,3555,3645,4931,5000,4550,2926,4326,1950,2557,4735,3817,129,4217,1460,251,4154,407,4788,274,4070,4472,4374,4581,2217,1516,1323,2304,4095,4941,1156,1529,4547,1551,2776,4798,3499,2975,1402,1044,2826,3727,4736,273,3422,1742,1255,2338,1434,3835,1209,3745,882,3760,2893,3768,970,5000,3033,1339,1823,5000,2719,2664,7691 +3265,3943,2316,2787,3034,4619,3969,2753,1168,169,1555,2650,2485,3484,3004,585,4201,1768,2166,4685,2326,3582,3683,4958,5000,4554,2528,4353,1971,2574,4691,3781,103,4182,1417,204,4191,435,4805,284,4081,4496,4415,4632,2234,1495,1303,2273,4048,4882,1099,1492,4577,1586,2793,4830,3531,3004,1424,1059,2841,3688,4709,220,3368,1700,811,2370,1454,3845,1218,3765,900,3763,2894,3782,937,5000,2996,1297,1779,5000,2681,2680,7743 +3294,3973,2346,2812,3054,4574,3928,2720,1144,118,1508,2624,2519,3509,3019,595,4216,1798,2177,4687,2335,3549,3658,5000,5000,4496,2489,4380,1992,2591,4709,3807,139,4209,1437,219,4165,401,4759,231,4031,4459,4395,4683,2251,1536,1344,2304,4062,4885,1104,1518,4546,1559,2748,4800,3502,2970,1445,1074,2857,3711,4744,650,3377,1720,848,2339,1411,3792,1165,3723,856,3703,2894,3798,966,5000,3020,1317,1798,5000,2704,2633,7796 +3261,3942,2313,2836,3073,4591,3949,2750,1182,129,1525,2660,2490,3471,2972,543,4170,1766,2186,4690,2346,3580,3696,5000,5000,4500,2511,4344,1950,2545,4666,3772,114,4173,1457,235,4200,429,4776,240,4043,4485,4437,4671,2206,1516,1323,2271,4013,4887,1110,1543,4578,1594,2766,4832,3535,2998,1403,1027,2810,3673,4718,597,3324,1742,886,2370,1430,3802,1175,3745,873,3705,2834,3754,934,5000,2981,1275,1818,5000,2727,2649,7850 +3290,3973,2342,2799,3030,4546,3908,2718,1159,140,1543,2696,2523,3495,2986,553,4187,1798,2133,4630,2295,3550,3671,5000,5000,4084,2534,4370,1970,2562,4685,3800,151,4199,1414,188,4174,394,4729,187,4057,4513,4481,4722,2223,1557,1364,2300,4026,4827,1054,1507,4547,1567,2722,4802,3567,3026,1424,1042,2826,3698,4755,605,3334,1283,861,2338,1386,3749,1122,3767,888,3707,2836,3773,964,5000,3005,1294,1775,5000,2687,2602,7905 +3319,4004,2371,2823,3049,4563,3930,2749,1198,89,1499,2670,2494,3457,2938,501,4205,1830,2141,4633,2308,3584,4127,5000,5000,4026,2495,4334,1928,2517,4643,3829,189,4225,1433,203,4209,420,4744,196,4008,4479,4463,4710,2177,1537,1342,2328,4037,4829,1062,1533,4579,1602,2740,4834,3537,2992,1382,994,2780,3661,5000,614,3345,1307,898,2368,1404,3757,1133,3728,841,3646,2777,3732,932,5000,3029,1314,1794,5000,2709,2617,7961 +3286,3972,2338,2785,3006,4518,3890,2780,1237,101,1519,2705,2526,3480,2951,512,4161,1801,2087,4574,2260,3557,4164,5000,5000,4031,2518,4359,1947,2534,4664,3796,165,4188,1389,156,4182,384,4759,205,4023,4509,4508,4760,2193,1579,1382,2294,3986,4770,1009,1498,4549,1637,2759,4867,3570,3019,1402,1009,2797,3687,5000,560,3294,1270,873,2335,1359,3766,1143,3753,855,3647,2780,3755,963,5000,2990,1272,1752,5000,2668,2570,8011 +3316,4003,2367,2809,3024,4536,3912,2750,1214,51,1477,2679,2496,3503,2964,523,4180,1835,2094,4578,2275,3594,4137,5000,5000,3974,2479,4322,1905,2551,4684,3825,203,4214,1408,172,4216,409,4711,152,3976,4477,4492,4747,2208,1621,1421,2320,3997,4772,1018,1525,4581,1610,2716,4837,3540,2984,1359,962,2814,3714,5000,569,2886,1297,909,2364,1375,3713,1093,3716,805,3586,2723,3779,994,5000,3013,1291,1772,5000,2689,2584,8062 +3283,3972,2333,2770,3043,4553,3936,2783,1254,63,1498,2715,2528,3463,2915,472,4138,1808,2039,4520,2292,4052,4173,5000,5000,3979,2503,4346,1924,2506,4644,3794,180,4177,1364,187,4250,433,4724,161,3993,4509,4538,4796,2161,1601,1398,2284,3944,4712,967,1552,4614,1644,2735,4869,3571,3011,1378,976,2770,4099,5000,515,2837,1262,946,2392,1392,3721,1105,3742,817,3587,2729,3743,963,5000,2974,1249,1730,5000,2709,2599,8114 +3313,4002,2362,2793,2999,4509,3897,2754,1231,14,1458,2751,2560,3485,2928,483,4158,1844,2045,4524,2248,4030,4146,5000,5000,3922,2526,4371,1943,2523,4665,3825,219,4201,1382,141,4222,395,4676,109,3948,4480,4585,4845,2176,1643,1437,2309,3954,4714,978,1517,4585,1617,2694,4840,3541,3037,1397,991,2788,4127,5000,523,2851,1292,920,2358,1346,3668,1055,3708,766,3587,2735,3771,995,5000,2997,1268,1750,5000,2668,2551,8167 +3280,3971,2390,2816,3017,4527,3921,2787,1271,27,1482,2724,2529,3444,2878,433,4118,1881,2051,4529,2267,4071,4180,4922,5000,3927,2488,4333,1900,2478,4626,3794,196,4226,1400,156,4255,419,4689,118,3966,4514,4570,4831,2129,1623,1413,2271,3962,4717,991,1545,4618,1651,2714,4872,3573,3001,1354,944,2744,4094,5000,50,2865,1322,956,2385,1361,3676,1068,3736,776,3526,2681,3738,964,5000,2958,1288,1770,5000,2687,2566,8221 +3310,4001,2356,2777,2973,4484,3884,2759,1310,41,1506,2760,2559,3465,2891,445,4140,1856,1994,4473,2646,4052,4152,4880,5000,3933,2513,4357,1918,2496,4648,3827,236,4188,1356,110,4226,380,4639,128,3984,4548,4618,4878,2143,1665,1450,2294,3908,4658,942,1512,4589,1623,2674,4904,3604,3027,1372,959,3183,4124,5000,58,2819,1291,930,2350,1314,3623,1082,3765,785,3526,2690,3769,996,5000,2980,1245,1729,5000,2645,2518,8252 +3339,4032,2383,2799,2991,4502,3909,2794,1288,0,1469,2733,2528,3423,2841,457,4163,1894,1999,4479,2668,4096,4186,4900,5000,3877,2475,4318,1875,2452,4672,3859,275,4212,1374,126,4259,402,4651,76,3942,4522,4604,4862,2095,1645,1487,2316,3916,4661,957,1540,4622,1657,2695,4875,3573,2990,1328,912,3140,4154,5000,67,2835,1324,965,2376,1328,3631,1034,3733,732,3465,2638,3740,967,5000,3002,1265,1750,5000,2664,2533,8284 +3307,4000,2349,2759,2947,4459,3935,2828,1328,8,1495,2769,2558,3443,2853,408,4124,1871,1942,4424,2630,4141,3799,4919,5000,3884,2500,4341,1893,2470,4634,3831,253,4174,1329,80,4229,424,4663,87,3962,4559,4652,4908,2109,1687,1461,2276,3861,4602,911,1507,4655,1691,2718,4907,3604,3015,1346,927,3160,4123,4859,14,2790,1296,938,2340,1342,3640,1049,3764,740,3466,2649,3774,999,5000,2963,1222,1709,5000,2621,2547,8310 +3337,4030,2376,2781,2965,4478,3899,2802,1305,0,1460,2742,2587,3463,2865,421,4149,1911,1947,4852,2655,4125,3769,4876,5000,3829,2463,4302,1912,2488,4658,3865,293,4197,1347,96,4261,383,4613,36,3922,4535,4638,4952,2123,1729,1497,2297,3867,4606,928,1536,4627,1662,2679,4877,3573,2978,1302,1362,3181,4154,4900,23,2809,1331,973,2365,1294,3587,1003,3734,685,3405,2661,3810,1032,5000,2985,1242,1730,5000,2639,2499,8337 +3304,3998,2341,2803,2983,4498,3926,2837,1345,0,1489,2777,2555,3420,2814,372,4112,1889,1889,4860,2682,4172,3802,4894,5000,3837,2488,4325,1868,2444,4621,3837,270,4159,1364,113,4292,403,4624,47,3944,4573,4687,4934,2074,1709,1471,2255,3811,4549,947,1565,4660,1695,2702,4910,3603,3002,1319,1315,3140,4124,4880,0,2766,1367,1008,2390,1308,3596,1020,3767,691,3407,2613,3785,1002,5000,2945,1199,1689,5000,2657,2514,8365 +3334,4028,2368,2762,2939,4455,3891,2811,1322,0,1518,2812,2583,3439,2826,386,4138,1930,1893,4808,2648,3739,3771,4849,4964,3845,2513,4347,1886,2463,4647,3872,310,4181,1319,67,4260,361,4574,0,3906,4613,4736,4976,2087,1750,1505,2275,3817,4553,904,1533,4632,1666,2664,4880,3634,3026,1337,1330,3161,3737,4921,0,2786,1343,980,2352,1259,3543,975,3739,697,3408,2628,3824,1035,5000,2967,1219,1711,5000,2613,2467,8394 +3302,4058,2394,2784,2957,4476,3919,2848,1361,0,1486,2785,2550,3395,2776,339,4165,1971,2318,4818,2677,3788,3802,4866,4970,3791,2477,4308,1842,2420,4611,3845,350,4204,1336,84,4291,381,4585,9,3930,4591,4722,4956,2038,1730,1477,2293,3823,4559,925,1563,4666,1699,2689,4912,3602,2988,1712,1284,3121,3708,4901,0,2808,1381,1014,2376,1271,3552,993,3774,641,3349,2583,3803,1006,5000,2988,1238,1733,5000,2630,2481,8424 +3332,4026,2359,2743,2913,4434,3885,2884,1400,0,1517,2819,2578,3413,2787,354,4131,1951,2260,4768,2646,3776,3771,4883,4977,3801,2503,4329,1860,2440,4638,3881,327,4165,1291,39,4259,338,4596,22,3955,4632,4771,4996,2051,1771,1511,2249,3766,4502,885,1531,4637,1669,2714,4944,3632,3011,1729,1300,3144,3742,4943,0,2768,1358,986,2337,1222,3562,1012,3809,646,3351,2601,3844,1039,5000,2948,1196,1694,5000,2586,2434,8455 +3362,4056,2385,2764,2931,4455,3914,2859,1376,0,1487,2792,2543,3369,2799,369,4159,1994,2265,4780,2258,3827,3801,4837,4921,3748,2467,4289,1816,2460,4665,3917,366,4187,1308,56,4288,356,4545,0,3919,4612,4757,4973,2001,1812,1544,2266,3771,4509,908,1561,4671,1700,2678,4915,3599,2972,1683,1254,2747,3777,4984,0,2792,1399,1019,2360,1234,3509,969,3784,588,3293,2558,3826,1073,5000,2969,1216,1716,5000,2603,2449,8487 +3329,4023,2349,2722,2887,4476,3943,2896,1415,0,1520,2826,2571,3386,2748,323,4127,2395,2207,4731,2292,3879,3831,4852,4927,3759,2494,4311,1834,2418,4631,3892,343,4147,1263,12,4317,374,4555,0,3946,4654,4805,5000,2014,1791,1514,2221,3713,4454,870,1592,4705,1731,2705,4947,3629,3415,1700,1270,2708,3750,4964,0,2754,1378,990,2383,1246,3519,989,3821,592,3297,2579,3870,1044,5000,2929,1173,1677,5000,2620,2465,8513 +3359,4053,2375,2743,2905,4435,3911,2872,1391,0,1492,2860,2597,3403,2760,340,4157,2439,2212,4746,2265,3869,3798,4805,4871,3708,2458,4332,1852,2438,4660,3928,382,4169,1279,30,4283,330,4504,0,3912,4635,4853,5000,2026,1832,1546,2237,3718,4461,896,1561,4676,1700,2670,4917,3596,3375,1716,1287,2733,3785,5000,0,2780,1420,1023,2342,1195,3467,948,3797,534,3301,2601,3916,1077,5000,2950,1193,1700,5000,2574,2418,8540 +3327,4020,2400,2763,2923,4457,3941,2909,1428,0,1526,2832,2562,3357,2709,295,4126,2421,2217,4342,2301,3922,3827,4819,4877,3719,2485,4291,1808,2397,4627,3903,358,4190,1296,48,4311,347,4515,0,3941,4679,4838,5000,1976,1811,1515,2190,3660,4470,923,1592,4710,1731,2697,4949,3625,3398,1671,821,2696,3759,4986,0,2807,1463,1055,2364,1207,3478,970,3836,537,3245,2563,3901,1048,5000,2909,1151,1724,5000,2591,2434,8568 +3357,4049,2363,2722,2879,4417,3910,2885,1403,0,1562,2866,2588,3373,2721,312,4578,2465,2160,4296,2277,3913,3793,4771,4883,3732,2512,4311,1826,2419,4656,3941,396,4150,1250,4,4277,302,4463,0,3971,4723,4885,5000,1988,1851,1545,2204,3665,4417,889,1561,4681,1699,2664,4981,4074,3419,1687,838,2721,3796,5000,0,2773,1444,1025,2323,1156,3427,931,3876,540,3251,2588,3950,1081,5000,2930,1171,1685,5000,2545,2388,8597 +3387,4079,2388,2742,2898,4440,3941,2923,1440,0,1536,2837,2552,3327,2671,331,4610,2510,2166,4314,2315,3966,3820,4785,4827,3683,2478,4270,1782,2378,4624,3978,434,4171,1267,23,4304,318,4474,0,3940,4706,4870,5000,1938,1829,1575,2218,3669,4427,919,1592,4715,1728,2693,4951,4040,3379,1641,794,2685,3771,5000,0,2802,1489,1057,2343,1167,3438,955,3854,481,3196,2553,3937,1052,5000,2951,1191,1709,5000,2561,2404,8627 +3355,4046,2351,2700,2854,4401,3973,2961,1476,0,1573,2870,2577,3343,2683,288,4581,2493,1690,4272,2294,3958,3847,4798,4833,3697,2505,4290,1801,2400,4655,3954,409,4130,1222,0,4268,334,4485,0,3972,4751,4916,5000,1950,1869,1542,2169,3611,4376,887,1562,4686,1757,2722,4983,4068,3400,1237,811,2712,3808,5000,0,2770,1472,1026,2301,1178,3450,979,3895,484,3203,2581,3987,1085,5000,2910,1149,1672,5000,2515,2359,8658 +3385,4075,2376,2719,2873,4425,3943,2937,1450,0,1549,2841,2540,3358,2695,727,4615,2538,1697,4292,2335,4012,3812,4748,4778,3649,2471,4249,1819,2423,4686,3992,446,4150,1238,0,4294,287,4434,0,3943,4734,4899,5000,1962,1909,1570,2182,3615,4387,919,1594,4719,1724,2690,5000,4034,3359,1191,829,2739,3846,5000,0,2801,1517,1057,2321,1126,3400,942,3875,424,3150,2548,4039,1118,5000,2931,1170,1696,5000,2531,2376,8690 +3353,4041,2338,2677,2892,4448,3975,2975,1485,0,1588,2874,2564,3311,2645,685,4588,2521,1642,4314,2377,4066,3838,4761,4784,3664,2499,4269,1776,2384,4656,3968,420,4109,1193,18,4319,302,4445,0,3976,4780,4944,5000,1912,1886,1536,2132,3558,4338,952,1626,4752,1752,2721,5000,4062,3380,1207,786,2705,3822,5000,0,2771,1501,1087,2340,1137,3413,968,3917,427,3160,2579,4029,1088,5000,2890,1128,1659,5000,2547,2394,8716 +3383,4070,2363,2697,2849,4411,3946,2951,1458,0,1627,2906,2588,3326,2658,706,4624,2147,1650,4274,2359,4058,3801,4710,4729,3618,2527,4289,1794,2408,4688,4006,455,4129,1209,0,4282,255,4394,0,3949,4826,4988,5000,1924,1925,1563,2144,3562,4351,925,1596,4722,1717,2690,5000,4028,2981,1224,805,2733,3861,5000,0,2804,1547,1055,2297,1085,3364,933,3898,430,3171,2612,4082,1121,5000,2911,1149,1685,5000,2501,2349,8743 +3350,4098,2387,2716,2868,4435,3979,2990,1492,0,1605,2877,2550,3279,3029,666,4598,2192,1658,4299,2403,4112,3826,4722,4735,3635,2494,4246,1751,2370,4658,3982,490,4149,1226,0,4307,269,4406,0,3984,4811,4969,5000,1873,1901,1527,2093,3567,4366,960,1628,4755,1744,3142,5000,4055,2939,1178,762,2700,3837,5000,0,2839,1594,1085,2315,1096,3377,961,3942,371,3120,2584,4073,1091,5000,2869,1169,1710,5000,2517,2368,8771 +3380,4065,2348,2673,2825,4399,3951,2966,1525,0,1645,2909,2573,3293,3042,688,4634,2176,1605,4262,2387,4103,3789,4733,4742,3653,2523,4266,1770,2394,4691,4020,463,4107,1181,0,4269,221,4355,0,4020,4857,5000,5000,1885,1940,1553,2103,3510,4319,935,1598,4725,1709,3174,5000,4082,2959,1194,781,2729,3877,5000,0,2812,1579,1052,2271,1044,3329,989,3986,374,3133,2619,4128,1123,5000,2890,1128,1674,5000,2471,2324,8800 +3410,4093,2372,2693,2844,4424,3985,3004,1496,0,1624,2878,2534,3245,3055,711,4252,2222,1614,4289,2433,4156,3813,4681,4687,3610,2489,4224,1727,2357,4725,4059,496,4127,1197,0,4292,235,4367,0,3995,4842,4990,5000,1835,1977,1578,2113,3515,4335,973,1630,4757,1735,3145,5000,3626,2917,1148,739,2697,3916,5000,0,2848,1626,1081,2289,1054,3344,956,3969,315,3085,2594,4120,1155,5000,2911,1149,1700,5000,2486,2343,8830 +3378,4059,2333,2650,2802,4450,4019,3042,1528,0,1665,2910,2556,3679,3006,672,4228,2205,1563,4255,2419,4209,3836,4692,4695,3629,2519,4243,1747,2382,4697,4035,467,4084,1152,0,4315,249,4380,0,4033,4889,5000,5000,1847,1953,1540,2061,3458,4291,950,1601,4789,2180,3178,5000,3653,2936,1164,760,2728,3894,5000,0,2823,1612,1048,2306,1064,3359,987,4014,318,3100,2632,4176,1125,5000,2869,1108,1665,5000,2440,2363,8861 +3408,4087,2357,2669,2822,4414,3992,3017,1498,0,1645,2879,2578,3693,3020,697,4266,2251,1574,4284,2467,4199,3797,4640,4640,3587,2486,4263,1766,2408,4731,4073,500,4104,1169,0,4276,200,4330,0,4009,4873,5000,5000,1858,1990,1564,2070,3463,4309,990,1633,4758,2144,3149,5000,3617,2894,1180,780,2759,3933,5000,0,2861,1659,1076,2261,1013,3312,956,3997,260,3055,2671,4231,1156,5000,2890,1130,1691,5000,2456,2321,8893 +3375,4052,2318,2688,2842,4441,4027,3055,1529,0,1687,2910,2538,3644,2972,239,4244,2235,1586,4314,2515,4251,3819,4650,4649,3608,2515,4220,1724,2372,4703,4048,469,4061,1186,0,4298,213,4343,0,4048,4920,5000,5000,1808,1965,1525,2016,3407,4328,1031,1666,4789,2168,3183,5000,3643,2913,1135,739,2729,3911,5000,0,2838,1706,1104,2277,1023,3328,987,4043,264,3072,2650,4225,1125,5000,2848,1089,1719,5000,2472,2341,8919 +3405,4080,2340,2646,2801,4407,4000,3030,1497,0,1730,2941,2980,3658,2987,265,4283,2280,1536,4284,2503,4240,3779,4597,4595,3630,2545,4239,1744,2399,4738,4086,500,4080,1141,0,4258,164,4294,0,4088,4966,5000,5000,1820,2001,1547,2025,3414,4287,1011,1636,5000,2130,3156,4986,3669,2932,1151,761,2761,3952,5000,0,2877,1692,1069,2231,971,3283,958,4089,268,3091,2692,4281,1156,5000,2869,1111,1684,5000,2426,2300,8946 +3435,4107,2363,2665,2821,4434,4035,3067,1526,0,1710,2909,2939,3609,2939,229,4324,2325,1550,4317,2553,4290,3801,4606,4604,3591,2513,4196,1703,2364,4711,4123,530,4099,1158,0,4279,177,4308,0,4067,4950,5000,4994,1770,1975,1507,2033,3420,4308,1054,1669,5000,2154,3190,5000,3632,2889,1106,721,2732,3930,5000,0,2917,1739,1096,2247,982,3301,991,4074,211,3049,2673,4275,1125,5000,2889,1133,1712,5000,2442,2322,8974 +3402,4072,2323,2622,2780,4400,4009,3104,1555,0,1753,2939,2959,3623,2535,256,4302,2308,1503,4289,2541,4277,3821,4615,4613,3615,2543,4216,1724,2392,4747,4098,498,4056,1114,0,4237,127,4322,0,4108,4996,5000,5000,1782,2010,1528,1978,3365,4269,1035,1639,5000,2177,2805,5000,3657,2907,1122,744,2765,3970,5000,0,2897,1724,1061,2200,930,3319,1025,4120,216,3070,2717,4331,1155,5000,2848,1093,1678,5000,2397,2282,9003 +3432,4099,2346,2641,2801,4429,4045,3079,1521,0,1734,3327,2917,3636,2550,284,4343,2352,1518,4324,2592,4326,3780,4562,4560,3577,2511,4173,1683,2420,4783,4135,526,4075,1131,0,4258,140,4275,0,4087,4980,5000,4959,1795,2045,1548,1986,3373,4293,1080,2091,5000,2137,2779,5000,3620,2864,1077,705,2798,4010,5000,0,2938,1770,1087,2215,941,3275,998,4105,160,3031,2700,4386,1184,5000,2868,1115,1706,5000,2413,2304,9033 +3399,4064,2306,2598,2823,4458,4081,3115,1548,0,1777,3356,2937,3587,2504,250,4323,2334,1473,4298,2643,4373,3800,4571,4570,3603,2542,4192,1704,2387,4757,4110,492,4031,1087,0,4278,152,4290,0,4129,5000,5000,4971,1745,2017,1506,1931,3319,4255,1064,2124,5000,2159,2814,5000,3644,2882,1094,728,2771,3989,5000,0,2919,1754,1113,2230,952,3295,1034,4152,166,3055,2747,4380,1152,5000,2827,1076,1673,4996,2430,2327,9064 +3429,4091,2328,2617,2783,4425,4055,3089,1513,0,1758,3385,2957,3180,2521,279,4365,2378,1490,4336,2633,4357,3757,4518,4519,3567,2572,4211,1726,2416,4793,4146,519,4050,1104,0,4235,103,4244,0,4110,5000,5000,4982,1757,2051,1525,1938,3328,4281,1110,2094,5000,1699,2788,5000,3607,2900,1111,752,2805,4029,5000,0,2961,1800,1076,2182,901,3253,1008,4138,111,3080,2794,4435,1181,5000,2847,1099,1702,5000,2384,2289,9096 +3396,4055,2350,2636,2805,4455,4092,3124,1539,0,2221,3352,2914,3131,2476,247,4345,2422,1509,4375,2684,4402,3776,4526,4530,3595,2541,4169,1686,2383,4767,4119,483,4068,1122,0,4254,115,4260,0,4153,5000,5000,4929,1708,2022,1481,1883,3337,4308,1578,2126,5000,1720,2824,5000,3631,2856,1067,715,2778,4007,5000,0,3005,1845,1101,2196,912,3273,1045,4185,119,3044,2780,4428,1148,5000,2806,1122,1731,5000,2401,2313,9122 +3425,4082,2309,2593,2765,4423,4066,3098,1564,21,2264,3381,2933,3144,2493,277,4388,2403,1466,4352,2674,4384,3732,4472,4541,3623,2572,4188,1708,2413,4803,4155,508,4024,1078,0,4211,65,4214,0,4196,5000,5000,4938,1721,2055,1499,1889,3285,4274,1564,2096,5000,1679,2798,5000,3655,2874,1084,740,2813,4047,5000,0,2987,1828,1064,2148,862,3233,1083,4232,128,3072,2829,4482,1176,5000,2827,1083,1698,4987,2357,2276,9149 +3455,4108,2331,2613,2788,4453,4103,3132,1526,0,2244,3347,2470,3096,2449,309,4431,2445,1487,4393,2726,4427,3750,4480,4491,3590,2541,4145,1669,2382,4840,4189,533,4043,1097,0,4229,77,4232,0,4178,5000,5000,4884,1672,2026,1516,1896,3296,4303,1612,2128,4806,1700,2835,5000,3616,2830,1040,703,2787,4087,5000,0,3031,1872,1088,2162,873,3255,1059,4217,75,3039,2817,4474,1142,5000,2847,1106,1728,5000,2374,2301,9177 +3422,4072,2290,2570,2749,4422,4139,3167,1550,454,2287,3375,2488,3109,2467,278,4412,2425,1447,4372,2716,4468,3768,4488,4504,3620,2572,4165,1692,2412,4815,4162,495,3999,1053,0,4185,90,4249,0,4222,5000,5000,4890,1685,2057,1471,1840,3245,4691,1599,2098,4834,1720,2871,5000,3640,2848,1058,729,2823,4065,5000,0,3014,1853,1049,2114,885,3277,1098,4265,85,3069,2868,4527,1169,5000,2806,1068,1696,4960,2330,2327,9206 +3451,4098,2311,2589,2772,4453,4114,3138,1511,431,2267,3340,2506,3122,2486,311,4455,2466,1469,4415,2767,4446,3723,4434,4455,3589,2541,4122,1715,2444,4851,4196,518,4017,1072,0,4202,40,4206,0,4204,5000,5000,4896,1699,2089,1487,1846,3257,4722,1649,2130,4799,1677,2845,5000,3601,2803,1014,755,2860,4105,5000,0,3059,1896,1073,2127,835,3239,1075,4250,34,3039,2919,4579,1196,5000,2827,1092,1726,4978,2348,2291,9236 +3418,4062,2271,2609,2796,4485,4151,3172,1533,470,2309,2947,2462,3073,2443,282,4437,2445,1431,4458,2819,4484,3740,4442,4468,3620,2572,4142,1677,2413,4826,4167,478,3973,1091,0,4219,53,4225,0,4248,5000,5000,4839,1650,2058,1441,1790,3207,4693,1699,1741,4826,1697,2882,5000,3624,2821,1033,720,2834,4082,5000,0,3042,1938,1096,2140,848,3263,1115,4297,46,3072,2909,4569,1161,5000,2786,1054,1695,4995,2366,2318,9267 +3447,4087,2292,2567,2758,4455,4125,3143,1913,447,2350,2974,2480,3087,2463,315,4480,2485,1456,4441,2808,4459,3694,4388,4420,3653,2604,4162,1701,2445,4863,4200,499,3991,1048,0,4174,3,4182,0,4231,5000,5000,4843,1664,2088,1456,1797,3641,4726,1688,1710,4790,1654,2856,5000,3646,2838,1052,748,2872,4121,5000,0,3087,1917,1056,2091,799,3226,1094,4281,58,3106,2961,4619,1187,5000,2806,1078,1726,4950,2323,2284,9299 +3413,4112,2312,2586,2782,4487,4162,3175,1934,487,2329,2939,2435,3038,2421,287,4524,2524,1482,4486,2858,4494,3710,4397,4435,3624,2573,4119,1663,2415,4837,4170,520,4009,1067,0,4191,16,4203,0,4276,5000,5000,4785,1616,2055,1408,1803,3655,4760,1739,1742,4816,1672,2893,5000,3607,2794,1009,714,2847,4098,5000,0,3133,1957,1078,2103,812,3251,1135,4328,10,3079,2952,4607,1151,5000,2827,1103,1757,4967,2342,2312,9325 +3442,4076,2271,2544,2745,4457,4137,3207,1954,527,1950,2965,2452,3052,2442,322,4506,2501,1447,4469,2846,4466,3663,4405,4451,3658,2605,4139,1688,2448,4874,4201,478,3965,1025,0,4145,0,4224,0,4321,5000,5000,4788,1631,2085,1422,1747,3608,4734,1308,1711,4779,1629,2929,5000,3629,2811,1028,742,2885,4136,5000,0,3116,1934,1038,2054,763,3277,1177,4374,24,3116,3005,4655,1176,5000,2787,1065,1726,4923,2299,2279,9352 +3471,4101,2292,2564,2770,4490,4173,3596,1911,506,1927,2929,2407,3003,2464,358,4550,2539,1476,4516,2896,4498,3678,4351,4405,3631,2574,4098,1651,2481,4910,4232,497,3982,1044,0,4161,0,4183,0,4303,5000,5000,4728,1583,2113,1436,2174,3624,4770,1360,1741,4804,1647,2903,5000,3589,2766,986,709,2922,4175,5000,0,3162,1972,1060,2066,777,3242,1157,4358,0,3091,2996,4641,1201,5000,2808,1090,1757,4940,2319,2308,9380 +3437,4063,2251,2522,2733,4523,4210,3627,1930,546,1967,2954,2423,3017,2424,331,4532,2514,1443,4501,2945,4529,3693,4359,4422,3667,2606,4118,1677,2452,4885,4201,453,3938,1003,0,4176,0,4205,0,4348,5000,5000,4730,1598,2079,1387,2118,3578,4745,1349,1772,4829,1665,2939,5000,3610,2784,1006,738,2898,4150,5000,0,3145,1946,1019,2079,791,3270,1200,4404,0,3130,3049,4687,1164,5000,2767,1054,1727,4895,2339,2337,9409 +3466,4089,2272,2543,2760,4495,4185,3596,1887,106,1944,2980,2440,3032,2447,369,4576,2551,1474,4549,2932,4496,3646,4306,4378,3643,2576,4139,1704,2486,4921,4231,472,3957,1024,0,4131,0,4167,0,4331,5000,5000,4733,1614,2107,1400,2126,3596,4364,1402,1741,4792,1621,2913,5000,3570,2740,1027,768,2937,4188,5000,0,3191,1983,1040,2029,744,3237,1182,4388,0,3171,3104,4732,1188,5000,2789,1080,1760,4913,2298,2306,9439 +3433,4052,2293,2564,2786,4530,4641,3626,1906,148,1983,2944,2395,2985,2409,344,4559,2525,1506,4598,2980,4524,3660,4315,4397,3681,2608,4099,1669,2459,4896,4199,428,3975,1045,0,4146,0,4191,0,4377,5000,5000,4673,1569,2073,1771,2071,3553,4404,1455,1771,4817,1639,2950,5000,3592,2758,986,737,2914,4164,5000,0,3237,2018,1061,2042,760,3266,1226,4433,0,3150,3096,4714,1151,5000,2749,1044,1792,4930,2320,2338,9470 +3462,4077,2252,2524,2752,4502,4616,3593,1862,190,2021,2969,2411,3000,2433,382,4603,2560,1477,4585,2966,4489,3613,4262,4416,3719,2641,4120,1696,2494,4932,4228,445,3932,1004,0,4100,0,4154,0,4422,5000,5000,4675,1585,2100,1783,2079,3573,4383,1446,1740,4779,1595,2924,5000,3614,2776,1008,769,2954,4201,5000,0,3220,1990,1019,1993,714,3235,1208,4478,0,3193,3150,4757,1175,5000,2771,1071,1763,4886,2280,2308,9502 +3491,4102,2273,2545,2779,4537,4652,3622,1459,170,1996,2932,2366,2954,2396,421,4647,2595,1512,4635,3012,4513,3627,4272,4375,3697,2611,4080,1662,2467,4907,4256,462,3950,1026,0,4115,0,4180,5,4405,5000,5000,4615,1540,2065,1795,2087,3174,4424,1498,1770,4803,1613,2959,5000,3574,2732,968,738,2931,4176,5000,0,3265,2024,1040,2006,731,3266,1253,4461,0,3174,3143,4737,1137,5000,2794,1098,1796,4904,2302,2340,9528 +3458,4065,2232,2505,2745,4930,4689,3651,1476,212,2033,2957,2382,2969,2422,398,4629,2566,1485,4623,2996,4475,3640,4282,4396,3737,2644,4102,1690,2502,4943,4222,416,3907,986,0,4069,0,4207,46,4449,5000,5000,4617,1558,2511,1745,2034,3134,4405,1489,1738,4764,1631,2995,5000,3595,2750,990,771,2970,4212,5000,0,3248,1993,998,1956,748,3298,1298,4504,0,3219,3197,4776,1160,5000,2754,1063,1768,4860,2263,2311,9555 +3486,4089,2253,2527,2773,4965,4663,3617,1430,192,2006,2919,2336,2985,2448,438,4673,2599,1521,4673,3041,4496,3592,4229,4355,3716,2614,4062,1719,2537,4978,4249,432,3926,1009,0,4084,0,4172,25,4431,5000,4983,4557,1575,2536,1756,2042,3156,4448,1541,1767,4787,1587,2968,5000,3555,2706,951,803,3010,4248,5000,0,3293,2024,1017,1969,704,3268,1281,4486,0,3203,3188,4815,1183,5000,2777,1091,1801,4878,2287,2345,9583 +3453,4052,2212,2487,2802,5000,4698,3224,1446,234,2041,2943,2352,2939,2413,416,4654,2569,1497,4723,3084,4516,3605,4240,4378,3758,2646,4085,1686,2511,4951,4214,385,3882,970,10,4099,0,4199,66,4475,5000,4994,4560,1531,2499,1705,1569,3118,4430,1593,1797,4810,1605,3002,5000,3576,2725,974,774,2987,4221,5000,0,3274,1991,1037,1982,722,3301,1327,4528,0,3249,3242,4790,1143,5000,2738,1057,1773,4897,2310,2378,9612 +3481,4076,2233,2509,3188,4974,4672,3188,1399,213,2075,2967,2368,2956,2440,456,4698,2599,1535,4711,3065,4472,3556,4188,4339,3738,2679,4108,1715,2546,4986,4239,400,3901,993,0,4052,0,4166,46,4457,5000,5000,4562,1970,2523,1716,1579,3142,4475,1583,1764,4770,1560,2975,5000,3534,2743,998,808,3027,4256,5000,7,3318,2019,994,1932,678,3273,1310,4508,0,3296,3295,4825,1166,5000,2760,1085,1806,4853,2272,2351,9642 +3447,4100,2254,2532,3218,5000,4707,3214,1414,255,2046,2929,2322,2911,2406,435,4678,2629,1574,4762,3106,4489,3568,4199,4363,3781,2649,4069,1683,2520,4959,4202,415,3920,1016,13,4066,0,4195,88,4500,5000,4951,4503,1927,2485,1664,1527,3168,4520,1635,1792,4792,1578,3008,5000,3555,2700,960,779,3004,4228,5000,51,3361,2046,1012,1945,697,3307,1356,4550,0,3282,3285,4796,1126,4992,2721,1113,1840,4871,2297,2385,9673 +3475,4062,2213,2492,3185,4984,4260,3178,1429,296,2078,2952,2337,2928,2435,476,4721,2596,1552,4750,3084,4442,3518,4210,4388,3824,2681,4092,1713,2556,4993,4227,367,3876,978,0,4019,0,4163,130,4542,5000,4960,4507,1946,2508,1255,1537,3132,4504,1624,1759,4752,1534,3042,5000,3576,2718,984,814,3044,4261,5000,32,3341,2010,968,1896,655,3280,1402,4590,0,3330,3337,4828,1147,5000,2745,1079,1812,4828,2260,2358,9705 +3503,4086,2233,2935,3215,5000,4294,3203,1381,275,2047,2912,2291,2883,2464,517,4763,2624,1593,4800,3123,4456,3531,4159,4351,3806,2651,4053,1682,2530,5000,4250,381,3895,1002,18,4034,0,4194,111,4522,5000,4906,4869,1903,2530,1265,1548,3159,4551,1675,1787,4773,1552,3013,5000,3534,2675,947,786,3021,4294,5000,76,3382,2034,986,1909,675,3316,1386,4568,0,3318,3326,4796,1168,5000,2768,1108,1846,4847,2286,2814,9731 +3469,4048,2192,2896,3183,5000,4328,3227,1395,316,2077,2935,2306,2901,2432,497,4743,2589,1573,4788,3098,4468,3542,4170,4377,3851,2683,4077,1712,2566,4998,4211,332,3852,964,0,4048,0,4225,154,4564,5000,4913,4873,1923,2490,1212,1497,3125,4536,1663,1752,4794,1569,3045,5000,3554,2694,972,821,3060,4264,5000,58,3361,1995,942,1922,695,3352,1432,4607,0,3367,3377,4825,1128,4997,2729,1075,1818,4804,2250,2850,9758 +3497,4071,2213,2920,3213,4609,4300,3188,1347,295,2044,2895,2322,2919,2462,539,4784,2616,1615,4838,3134,4417,3492,4120,4342,3834,2653,4101,1744,2602,5000,4234,346,3871,989,24,4001,0,4195,135,4542,5000,4857,4878,1944,2092,1222,1509,3155,4584,1713,1780,4753,1526,3015,5000,3513,2651,997,856,3099,4295,5000,102,3401,2017,960,1873,655,3327,1416,4584,0,3356,3426,4852,1148,5000,2753,1104,1853,4823,2276,2824,9786 +3463,4033,2592,2944,3244,4645,4333,3211,1361,335,2072,2917,2275,2876,2431,519,4763,2579,1658,4887,3169,4427,3503,4133,4370,3880,2685,4064,1713,2576,5000,4193,297,3829,1014,58,4015,0,4227,178,4582,5000,5000,4822,1903,2051,1169,1459,3123,4632,1762,1807,4774,1544,3046,5000,3533,2670,961,830,3076,4264,5000,84,3378,2038,977,1886,676,3365,1462,4621,0,3406,3413,4815,1107,4979,2715,1071,1887,4843,2723,2860,9815 +3490,4056,2613,2905,3213,4619,4304,3171,1312,374,2099,2939,2290,2894,2462,561,4803,2603,1640,4874,3141,4374,3453,4083,4337,3926,2717,4088,1745,2612,5000,4215,310,3848,977,31,3968,0,4198,160,4622,5000,5000,4829,1924,2071,1178,1472,3154,4619,1748,1771,4732,1500,3015,5000,3553,2689,988,866,3115,4294,5000,129,3416,1995,932,1837,637,3341,1446,4658,13,3457,3461,4839,1127,5000,2739,1101,1859,4800,2688,2835,9845 +3518,4079,2634,2930,2825,4655,4336,3193,1325,351,2064,2898,2244,2852,2432,541,4842,2626,1685,4923,3173,4381,3464,4097,4366,3910,2686,4051,1715,2586,5000,4235,323,3867,1002,66,3982,0,4232,204,4599,5000,5000,4774,1464,2029,1125,1485,3186,4668,1796,1798,4752,1519,3045,5000,3510,2647,952,840,3091,4262,5000,173,3454,2014,949,1851,660,3379,1492,4631,0,3447,3446,4799,1086,4962,2763,1131,1894,4820,2716,2872,9876 +3483,4460,2593,2892,2794,4629,4306,3215,1338,390,2089,2919,2259,2871,2464,584,4819,2587,1668,4909,3141,4325,3475,4110,4396,3957,2718,4077,1747,2622,5000,4193,274,3825,966,39,3935,0,4267,247,4637,5000,5000,4783,1486,2049,1134,1437,3156,4656,1781,1762,4710,1537,3074,5000,3530,2666,979,876,3129,4291,5000,155,3428,1969,903,1802,621,3418,1538,4666,22,3499,3492,4819,1106,4984,2725,1099,1866,5000,2683,2847,9908 +3510,4483,2614,2917,2826,4665,4338,3173,1290,366,2051,2878,2212,2892,2497,627,4858,2608,1713,4957,3171,4330,3424,4062,4364,3942,2687,4040,1718,2657,5000,4213,287,3845,993,74,3949,0,4240,229,4612,5000,5000,4730,1508,2068,1143,1451,3190,4706,1827,1788,4730,1494,3041,5000,3488,2624,945,851,3167,4319,5000,200,3464,1985,919,1816,645,3395,1521,4638,0,3489,3475,4838,1125,5000,2750,1129,1900,5000,2711,2885,9934 +3475,4444,2574,2460,2858,4701,4369,3193,1303,403,2074,2899,2228,2850,2469,607,4834,2567,1698,4942,3198,4334,3435,4076,4396,3989,2718,4066,1750,2631,5000,4169,238,3802,957,110,3964,0,4275,273,4648,5000,5000,4321,1469,2024,1090,1405,3163,4694,1810,1813,4749,1514,3070,5000,3507,2644,973,887,3143,4284,5000,182,3436,1938,935,1830,670,3435,1567,4671,34,3541,3518,4793,1083,4966,2712,1097,1873,5000,2741,2503,9961 +3922,4467,2595,2485,2829,4675,4338,3151,1254,378,2034,2919,2243,2871,2503,650,4871,2586,1744,4988,3163,4275,3384,4029,4366,3975,2749,4092,1783,2666,5000,4188,251,3822,984,84,3917,0,4250,254,5000,5000,5000,4333,1493,2042,1099,1421,3198,4744,1854,1776,4707,1471,3036,5000,3465,2665,1001,924,3181,4311,5000,226,3470,1952,889,1783,633,3414,1550,4641,11,3593,3561,4808,1103,4989,2737,1128,2327,5000,2708,2478,9989 +3887,4428,2616,2511,2861,4711,4368,3170,1267,414,2056,2877,2196,2830,2475,631,4845,2605,1791,5000,3187,4277,3394,4045,4399,4023,2718,4057,1755,2640,5000,4144,202,3842,1012,120,3932,0,4286,298,5000,5000,5000,4283,1455,1998,1046,1375,3234,4794,1898,1801,4726,1491,3063,5000,3484,2623,968,900,3156,4275,5000,207,3502,1965,905,1797,659,3455,1594,4673,51,3583,3540,4760,1061,4949,2700,1159,2361,5000,2738,2516,10018 +3913,4450,2156,2474,2832,4685,4335,3127,1280,450,2076,2897,2212,2852,2510,674,4881,2561,1777,5000,3149,4216,3343,3999,4433,4071,2749,4084,1788,2675,5000,4161,216,3801,977,94,3885,0,4261,341,5000,5000,4714,4297,1479,2015,1055,1392,3209,4783,1878,1764,4683,1449,3027,5000,3504,2644,997,937,3192,4300,5000,251,3471,1915,858,1750,623,3434,1639,4703,92,3635,3580,4772,1080,4971,2726,1128,2334,5000,2287,2493,10048 +3940,4473,2177,2500,2865,4720,4364,3145,1231,423,2033,2854,2165,2813,2484,717,4916,2578,1824,5000,3171,4217,3353,4015,4405,4058,2718,4049,1760,2648,5000,4178,230,3821,1005,131,3901,0,4299,743,5000,5000,4656,4251,1442,1969,1064,1410,3247,4833,1919,1788,4702,1470,3053,5000,3461,2603,964,913,3167,4325,5000,294,3502,1926,873,1765,650,3476,1621,4670,71,3625,3557,4721,1038,4994,2751,1579,2368,5000,2318,2531,10079 +3904,4433,2137,2465,2837,4694,4393,3163,1245,457,2052,2874,2181,2835,2520,697,4889,2532,1810,5000,3130,4218,3364,4032,4440,4106,2748,4076,1794,2682,5000,4133,182,3780,971,105,3854,0,4337,786,5000,5000,4660,4267,1467,1985,1011,1367,3224,4822,1898,1750,4722,1491,3078,5000,3480,2624,994,950,3203,4287,5000,275,3469,1874,827,1718,678,3517,1665,4698,114,3677,3594,4731,1057,4954,2715,1548,2340,5000,2287,2569,10111 +3930,4036,2159,2492,2870,4729,4359,3118,1196,428,2007,2831,2197,2858,2556,740,4922,2548,1858,5000,3149,4155,3313,3987,4413,4093,2716,4042,1828,2717,5000,4149,197,3801,1000,142,3870,0,4314,766,5000,5000,4603,4285,1493,2001,1020,1386,3264,4872,1937,1773,4679,1451,3041,5000,3437,2584,962,988,3238,4310,5000,317,3497,1884,841,1734,644,3498,1646,4663,95,3666,3630,4739,1077,4977,2740,1580,2374,4764,2319,2545,10137 +3895,3996,2118,2518,2904,4764,4387,3135,1210,461,2024,2850,2151,2820,2531,720,4893,2500,1845,5000,3167,4155,3323,4005,4450,4142,2746,4070,1800,2689,5000,4103,149,3760,1029,179,3886,0,4773,809,5000,5000,4607,4243,1457,1954,967,1345,3242,4861,1975,1796,4698,1472,3065,5000,3457,2606,993,964,3211,4271,5000,297,3462,1893,856,1750,673,3540,1689,4690,139,3717,3603,4684,1034,4937,3124,1550,2346,4787,2351,2584,10164 +3921,4018,2140,2484,2876,4736,4352,3090,1162,430,2040,2868,2167,2844,2568,763,4925,2514,1893,5000,3121,4092,3272,3962,4425,4190,2776,4098,1834,2723,5000,4119,165,3781,996,154,3840,0,4751,789,5000,5000,4613,4264,1484,1969,977,1366,3283,4911,1950,1757,4655,1433,3027,5000,3476,2628,1024,1002,3246,4293,5000,338,3488,1839,809,1704,640,3521,1669,4653,184,3768,3636,4690,1054,4960,3150,1582,2380,4748,2322,2560,10192 +3464,4040,2163,2511,2910,4771,4378,3106,1177,461,1994,2825,2121,2807,2544,743,4957,2527,1941,5000,3136,4091,3283,3981,4462,4177,2744,4065,1807,2694,5000,4072,180,3802,1026,191,3856,0,4790,831,4688,5000,4556,4224,1449,1922,924,1387,3324,4961,1986,1780,4674,1455,3050,5000,3433,2588,993,978,3218,4252,5000,379,3513,1846,824,1721,670,3564,1711,4678,167,3757,3605,4632,1012,4921,3177,1614,1994,4772,2355,2598,10221 +3490,4000,2123,2477,2882,4743,4343,3122,1192,491,2008,2843,2137,2832,2582,785,4925,2478,1928,5000,3088,4027,3231,4001,4501,4226,2773,4094,1841,2727,5000,4087,135,3762,993,166,3811,189,4831,872,4715,5000,4562,4247,1477,1936,934,1348,3305,4949,1958,1741,4631,1416,3072,5000,3452,2610,1025,1016,3252,4273,5000,357,3475,1792,776,1676,639,3608,1753,4701,213,3806,3636,4636,1032,5000,3141,1584,1965,4734,2326,2574,10251 +3516,4023,2145,2505,2916,4777,4368,3076,1145,458,1960,2799,2092,2796,2620,826,4955,2490,1976,5000,3101,4026,3242,3959,4478,4212,2740,4061,1814,2760,5000,4102,151,3784,1024,204,3828,217,4809,851,4680,5000,4507,4210,1443,1950,944,1371,3348,4998,1992,1763,4650,1440,3032,5000,3410,2571,995,992,3285,4293,5000,397,3498,1798,791,1693,670,3589,1731,4661,198,3794,3602,4576,1052,5000,3168,1616,1999,4758,2360,2612,10282 +3479,3983,2106,2471,2888,4811,4393,3091,1161,487,1973,2817,2109,2822,2597,806,4922,2439,1962,5000,3112,4025,3253,3980,4517,4261,2769,4091,1848,2731,5000,4055,107,3744,992,179,3846,246,4850,472,4705,5000,4514,4237,1471,1902,893,1333,3329,4986,1962,1785,4669,1464,3053,5000,3429,2595,1027,1030,3256,4251,4987,374,3457,1742,743,1711,702,3633,1772,4683,245,3842,3630,4578,1010,5000,3133,1166,1970,4721,2394,2650,10314 +3505,4005,2129,2500,2923,4783,4356,3045,1115,452,1924,2835,2125,2848,2636,847,4950,2450,2010,5000,3061,3962,3202,3940,4495,4247,2736,4120,1883,2763,5000,4070,125,3766,1023,216,4221,213,4829,450,4668,5000,4522,4265,1500,1915,903,1358,3373,5000,1993,1745,4627,1427,3012,5000,3386,2556,1060,1068,3288,4270,4998,412,3478,1748,757,1667,672,3615,1749,4642,231,3890,3655,4578,1451,5000,3160,1199,2004,4746,2366,2626,10340 +3468,3964,2152,2529,2957,4816,4380,3060,1131,479,1936,2791,2081,2813,2613,826,4915,2398,2057,5000,3070,3961,3214,3962,4536,4295,2764,4088,1856,2733,5000,4022,81,3788,1054,254,4239,243,4870,490,4691,5000,4469,4232,1468,1866,852,1321,3356,5000,2023,1766,4646,1452,3033,5000,3406,2580,1031,1044,3258,4226,4946,387,3498,1754,772,1685,705,3659,1788,4661,279,3876,3618,4516,1409,5000,3125,1170,2037,4772,2401,2664,10367 +3493,3986,2113,2496,2930,4787,4341,3013,1086,505,1948,2809,2098,2841,2653,866,4942,2408,2043,5000,3016,3899,3163,3922,4577,4343,2793,4119,1891,2764,5000,4037,101,3749,1023,229,4196,212,4430,467,4714,5000,4479,4263,1498,1879,864,1348,3401,5000,1989,1726,4604,1416,2990,5000,3425,2604,1064,1082,3289,4244,4957,424,3454,1697,724,1642,676,3641,1765,4680,328,3922,3641,4515,1430,5000,2733,1202,2008,4735,2374,2639,10395 +3518,4008,2136,2525,2965,4820,4364,3028,1104,468,1897,2764,2054,2807,2630,906,4967,2417,2090,5000,3024,3899,3175,3946,4556,4329,2759,4087,1863,2733,4998,4051,121,3772,1055,687,4214,243,4471,505,4673,4977,4427,4233,1466,1829,875,1375,3447,5000,2016,1747,4624,1442,3010,5000,3383,2566,1036,1057,3258,4199,4968,460,3472,1703,738,1661,710,3685,1802,4636,315,3906,3600,4872,1390,5000,2761,1235,2040,4762,2409,2676,10424 +3481,3968,2097,2493,2937,4790,4387,3042,1122,492,1908,2781,2071,2836,2670,884,4930,2364,2074,5000,2968,3838,3186,3970,4598,4376,2786,4118,1898,2763,5000,4004,79,3733,1025,662,4171,274,4513,543,4694,4983,4438,4267,1497,1841,825,1341,3431,5000,1980,1706,4582,1468,3029,5000,3402,2591,1070,1095,3288,4216,4917,433,3426,1646,690,1619,745,3729,1839,4653,364,3951,3620,4870,1411,5000,2727,1206,2011,4726,2382,2651,10454 +3506,3990,2121,2523,2972,4822,4347,2995,1079,453,1856,2737,2027,2865,2711,923,4954,2372,2120,5000,2973,3839,3136,3932,4579,4361,2752,4087,1932,2793,5000,4018,101,3756,1057,700,4191,0,4493,518,4652,4928,4388,4240,1528,1853,838,1370,3477,5000,2005,1727,4602,1433,2985,5000,3360,2554,1042,1132,3317,4232,4929,467,3442,1651,705,1639,717,3712,1814,4607,352,3932,3577,4867,1433,4943,2755,1239,2043,4753,2418,2688,10485 +3468,3950,2083,2491,3007,4853,4368,3009,1098,476,1867,2754,2046,2832,2689,900,4915,2318,2104,5000,2978,3841,3149,3958,4622,4408,2779,4119,1905,2761,4996,3971,61,3718,1448,737,4211,0,4535,555,4671,4934,4402,4276,1498,1803,788,1337,3462,5000,2029,1748,4622,1461,3004,5000,3380,2580,1076,1108,3284,4186,4878,438,3395,1595,719,1660,753,3756,1849,4622,401,3975,4014,4803,1393,4904,2721,1210,2013,4781,2454,2725,10517 +3493,3972,2107,2521,2980,4822,4328,2962,1056,435,1877,2771,2064,2862,2730,938,4938,2326,2149,5000,2920,3782,3099,3922,4604,4392,2806,4150,1939,2790,5000,3986,84,3742,1480,712,4169,0,4515,528,4627,4940,4416,4314,1530,1814,802,1368,3509,5000,1989,1707,4581,1427,2959,4998,3338,2605,1111,1145,3313,4201,4890,471,3409,1600,671,1619,727,3738,1822,4575,451,4017,4029,4799,1415,4928,2749,1243,2045,4746,2428,2699,10543 +3456,3994,2131,2552,3015,4853,4348,2977,1077,456,1825,2726,2021,2831,2709,914,4897,2334,2193,5000,2924,3786,3112,3948,4647,4438,2771,4120,1912,2757,4972,3939,107,3766,1513,750,3770,0,4557,564,4644,4884,4369,4290,1501,1764,753,1337,3557,5000,2010,1727,4602,1456,2977,5000,3358,2569,1084,1120,3278,4154,4841,502,3422,1606,686,1640,763,3782,1856,4588,439,3996,3982,4734,956,4890,2716,1276,2077,4775,2464,2734,10586 +3480,3954,2093,2520,2987,4822,4307,2929,1098,476,1834,2743,2041,2861,2749,951,4918,2279,2175,5000,2864,3729,3063,3975,4692,4484,2798,4152,1946,2785,4990,3955,70,4149,1484,725,3729,0,4537,598,4661,4890,4386,4331,1534,1775,768,1369,3543,5000,1968,1686,4561,1423,2994,5000,3378,2596,1119,1156,3306,4169,4853,471,3373,1551,638,1600,738,3764,1889,4601,489,4455,3995,4731,979,4914,2745,1248,2046,4741,2439,2708,10630 +3504,3976,2118,2552,3022,4852,4327,2944,1058,433,1782,2697,1998,2831,2790,988,4938,2286,2218,5000,2867,3734,3076,3941,4674,4467,2762,4122,1918,2751,5000,3970,95,4173,1518,762,3751,0,4579,570,4614,4834,4341,4310,1505,1786,782,1402,3591,5000,1986,1706,4583,1452,2949,5000,3336,2560,1092,1131,3270,4183,4866,501,3384,1557,653,1622,775,3808,1860,4552,477,4432,3945,4666,1002,4938,2774,1281,2077,4770,2475,2743,10675 +3466,3936,2081,2521,2995,4881,4346,2959,1081,452,1792,2714,2018,2863,2770,962,4896,2231,2198,5000,2806,3741,3089,3969,4719,4511,2788,4154,1952,2778,4964,3924,59,4136,1490,317,3773,0,4621,603,4629,4840,4360,4352,1539,1735,735,1373,3577,5000,1942,1664,4605,1482,2966,5000,3356,2587,1128,1167,3296,4135,4818,468,3333,1502,605,1645,813,3851,1891,4563,527,4469,3955,4243,964,4900,2741,1252,2046,4737,2450,2777,10721 +3490,3957,2106,2552,3029,4848,4303,2912,1042,408,1740,2669,2038,2895,2811,997,4914,2238,2239,5000,2808,3687,3041,3936,4702,4493,2752,4187,1985,2805,4982,3940,506,4161,1524,354,3733,0,4601,573,4582,4785,4318,4396,1573,1746,751,1407,3625,5000,1958,1685,4565,1451,2921,4980,3315,2553,1163,1203,3322,4149,4831,496,3344,1510,620,1607,789,3833,1860,4512,935,4443,3965,4240,988,4925,2770,1285,2076,4767,2487,2749,10768 +3452,3918,2069,2584,3064,4877,4322,2927,1066,425,1749,2686,1997,2865,2790,971,4870,2183,2280,5000,2809,3697,3055,3966,4748,4537,2777,4157,1957,2769,4937,3895,472,4125,1558,390,3756,0,4642,604,4595,4792,4339,4379,1546,1694,705,1380,3611,5000,1973,1705,4588,1482,2937,5000,3335,2580,1137,1177,3285,4100,4784,460,3292,1518,635,1630,828,3876,1890,4522,985,4478,3911,4175,951,4887,2738,1257,2107,4797,2523,2783,10816 +3476,3940,2094,2554,3036,4844,4278,2880,1029,441,1760,2702,2017,2899,2831,1005,4888,2190,2258,5000,2748,3646,3008,3934,4731,4580,2803,4190,1990,2795,4954,3912,500,4151,1110,365,3718,0,4622,573,4608,4799,4362,4424,1581,1705,722,1416,3660,5000,1925,1663,4549,1451,2892,4960,3356,2608,1173,1212,3309,4113,4799,486,3301,1465,588,1593,805,3857,1858,4532,1034,4512,3498,4173,976,4912,2767,1290,2075,4765,2498,2754,10858 +3500,3962,2120,2586,3070,4872,4297,2896,1054,395,1708,2657,1977,2870,2810,977,4904,2197,2297,5000,2749,3658,3023,3965,4777,4560,2766,4161,1961,2758,4909,4349,529,4177,1144,401,3741,0,4663,603,4558,4744,4323,4409,1554,1654,677,1452,3708,5000,1938,1683,4572,1483,2908,4981,3315,2575,1147,1185,3271,4064,4814,511,3310,1475,603,1618,844,3899,1886,4899,1021,4483,3443,4109,939,4874,2797,1323,2105,4796,2535,2787,10901 +3462,3922,2084,2556,3042,4837,4252,2912,1081,410,1719,2674,1998,2904,2851,1010,4858,2143,2273,5000,2688,3609,3038,3997,4823,4601,2791,4194,1994,2783,4925,4305,497,4141,1117,375,3704,0,4704,631,4570,4752,4348,4456,1590,1665,695,1427,3695,5000,1888,1642,4534,1515,2924,5000,3336,2603,1184,1220,3294,4077,4768,474,3256,1423,556,1581,822,3942,1913,4908,1070,4514,3448,4108,965,4899,2765,1294,2072,4765,2510,2757,10945 +3485,3944,2110,2588,3076,4864,4270,2866,1046,363,1668,2628,1958,2938,2892,1043,4873,2150,2310,5000,2689,3624,2992,3967,4808,4580,2753,4165,1965,2808,4942,4323,528,3747,1152,411,3729,0,4682,598,4519,4699,4312,4442,1626,1675,714,1465,3743,5000,1899,1662,4558,1486,2878,4960,3296,2570,1158,1192,3316,4089,4785,497,3264,1435,572,1607,862,3922,1878,4854,1057,4062,3390,4108,991,4924,2795,1327,2101,4796,2547,2789,10990 +3447,3905,2074,2559,3110,4891,4287,2882,1073,377,1679,2645,1980,2911,2871,1012,4826,2095,2284,5000,2690,3640,3008,3999,4854,4620,2778,4199,1997,2770,5000,4280,498,3712,1125,447,3754,0,4723,625,4529,4707,4340,4491,1600,1624,671,1441,3729,5000,1847,1682,4582,1519,2895,4981,3317,2600,1194,1226,3276,4040,4740,457,3210,1385,587,1633,902,3964,2324,4861,1104,4090,3394,4046,956,4887,2764,1298,2068,4766,2584,2821,11036 +3470,3927,2101,2592,3082,4855,4242,2837,1040,329,1629,2662,2003,2946,2912,1044,4840,2103,2319,5000,2630,3596,2962,3971,4839,4598,2802,4232,2029,2793,5000,4299,530,3739,1160,420,3718,0,4701,589,4477,4655,4368,4540,1637,1635,691,1480,3778,5000,1855,1641,4545,1490,2849,4939,3277,2629,1231,1260,3298,4052,4758,478,3218,1398,541,1598,880,3943,2287,4806,1090,4118,3396,4047,983,4912,2794,1331,2097,4798,2559,2789,11083 +3432,3887,2127,2624,3115,4881,4259,2854,1069,342,1641,2617,1964,2920,2891,1012,4791,2111,2353,5000,2631,3616,2979,4005,4885,4637,2764,4203,1999,2754,5000,4257,81,3766,1196,456,3744,0,4741,615,4487,4665,4336,4528,1612,1584,649,1458,3825,5000,1864,1661,4570,1524,2866,4960,3299,2597,1205,1231,3257,4003,4715,437,3225,1412,557,1625,921,3984,2311,4813,717,4082,3337,3987,949,4876,2763,1364,2125,4830,2595,2820,11131 +3455,3910,2092,2595,3086,4844,4214,2810,1099,355,1654,2634,1987,2955,2931,1042,4804,2058,2324,5000,2571,3575,2934,3977,4932,4675,2788,4237,2030,3197,5000,4278,115,3732,1169,429,3709,0,4718,640,4496,4676,4368,4578,1650,1594,670,1498,3811,5000,1809,1620,4534,1496,2820,4980,3321,2627,1242,1264,3277,4015,4734,456,3170,1365,511,1591,900,4382,2335,4820,763,4107,3338,3991,977,4901,2793,1335,2091,4801,2570,2787,11173 +3479,3933,2120,2628,3119,4869,4230,2828,1067,306,1606,2589,1949,2930,2910,1071,4817,2067,2356,5000,2574,3598,2951,4012,4917,4650,2749,4208,1999,3157,5000,4299,149,3760,1205,463,3737,6,4757,602,4443,4625,4338,4567,1625,1543,692,1539,3859,5000,1815,1641,4560,1530,2837,4939,3281,2596,1217,1234,3235,4027,4755,475,3178,1381,528,1619,942,4422,2295,4764,747,4068,3277,3933,943,4927,2824,1368,2119,4834,2607,2816,11216 +3440,3893,2085,2599,3090,4832,4247,2847,1098,318,1620,2606,1973,2966,2950,1038,4767,2014,2325,5000,2515,3622,2970,4048,4963,4686,2773,4242,2030,3179,5000,3839,122,3726,1178,436,3702,46,4795,625,4452,4638,4372,4618,1663,1555,652,1518,3844,5000,1759,1600,4587,1565,2854,4959,3304,2627,1253,1266,3255,3978,4713,431,3123,1337,482,1586,983,4462,2317,4350,792,4090,3277,3938,972,4891,2793,1339,2084,4805,2581,2845,11260 +3463,3916,2113,2633,3123,4856,4201,2804,1068,268,1573,2561,1998,3003,2990,1066,4778,2024,2354,5000,2519,3586,2926,4022,4948,4660,2734,4213,2481,3201,5000,3861,158,3754,1214,470,3731,23,4771,586,4398,4589,4345,4669,1702,1566,675,1560,3891,5000,1764,1621,4551,1538,2809,4917,3264,2596,1228,1297,3274,3990,4735,448,3130,1355,499,1615,1383,4439,2276,4294,774,4049,3277,3944,1001,4917,2824,1371,2111,4838,2617,2811,11305 +3424,3877,2078,2666,3155,4880,4217,2823,1101,280,1589,2578,1961,2978,2967,1031,4727,1972,2321,5000,2523,3614,2945,4059,4994,4695,2757,4247,2449,3160,5000,3822,132,3721,1250,504,3760,63,4809,608,4407,4603,4381,4658,1678,1515,637,1541,3875,5000,1768,1642,4579,1573,2827,4938,3287,2627,1265,1267,3231,3941,4695,402,3076,1375,516,1645,1425,4478,2296,4299,818,4069,3215,3890,968,4881,2793,1342,2076,4872,2653,2839,11351 +3447,3900,2106,2637,3125,4841,4171,2781,1072,230,1605,2595,1986,3015,3007,1057,4738,1983,2349,4963,2466,3581,2902,4034,4979,4729,2780,4280,2479,3181,4839,3845,169,3750,1224,475,3727,41,4784,566,4353,4618,4418,4710,1717,1527,661,1583,3921,5000,1710,1601,4544,1546,2783,4896,3311,2659,1301,1297,3249,3954,4719,418,3083,1334,472,1613,1405,4454,1834,4243,861,4087,3214,3899,998,4907,2825,1374,2102,4844,2627,2804,11398 +3408,3923,2135,2671,3157,4864,4187,2801,1106,241,1560,2551,1950,2991,2984,1021,4748,1994,2375,4969,2472,3612,2922,4071,5000,4700,2740,4671,2446,3139,4793,3808,207,3779,1260,508,3757,81,4821,587,4361,4571,4394,4699,1694,1477,624,1627,3967,5000,1713,1623,4572,1581,2801,4916,3272,2628,1276,1265,3204,3905,4681,433,3091,1356,489,2064,1447,4491,1853,4248,841,4043,3151,3848,966,4871,2856,1407,2128,4878,2663,2830,11446 +3431,3885,2101,2642,3126,4825,4141,2822,1141,253,1579,2568,1976,3029,3023,1046,4696,1944,2338,4912,2416,3583,2881,4110,5000,4732,2763,4705,2475,3159,4810,3833,183,3746,1234,479,3725,59,4857,606,4368,4588,4433,4750,1733,1489,649,1608,3950,5000,1653,1583,4539,1555,2819,4937,3296,2661,1312,1295,3222,3918,4705,385,3037,1317,445,2033,1427,4528,1870,4254,882,4059,3150,3860,997,4898,2826,1377,2092,4850,2636,2794,11488 +3454,3908,2130,2676,3158,4847,4157,2782,1114,202,1536,2524,1941,3005,3061,1071,4706,1956,2363,4916,2424,3617,2901,4086,5000,4701,2723,4676,2442,2759,4826,3858,221,3776,1270,512,3756,100,4830,563,4314,4544,4412,4739,1711,1501,676,1653,3994,5000,1655,1605,4568,1590,2776,4895,3258,2631,1286,1262,3239,3932,4731,399,3046,1342,464,2065,1469,4082,1826,4197,860,4012,3087,3811,1028,4925,2857,1409,2118,4884,2671,2819,11531 +3415,3870,2097,2648,3126,4869,4173,2804,1149,213,1555,2542,1968,3043,3038,1032,4654,1908,2324,4858,2433,3652,2923,4125,5000,4732,3165,4709,2470,2716,4781,3822,198,3744,1244,482,3787,140,4865,580,4322,4563,4453,4790,1751,1452,641,1635,3976,5000,1595,1627,4597,1626,2796,4915,3282,2664,1323,1291,3193,3884,4695,349,2993,1305,840,2097,1512,4118,1842,4203,899,4025,3086,3826,997,4890,2827,1379,2081,4857,2706,2844,11575 +3438,3893,2126,2681,3157,4828,4127,2765,1124,163,1514,2560,1995,3082,3075,1055,4663,1922,2346,4862,2381,3628,2883,4103,5000,4700,3125,4743,2498,2735,4799,3849,237,3774,1280,514,3757,118,4837,536,4268,4520,4496,4840,1790,1464,668,1680,4020,5000,1597,1588,4565,1599,2753,4874,3244,2635,1359,1319,3209,3898,4723,362,3002,1332,859,2067,1492,4091,1796,4146,876,4038,3086,3842,1029,4917,2859,1410,2106,4892,2679,2806,11620 +3399,3855,2155,2715,3187,4849,4144,2788,1160,175,1536,2516,1961,3058,3051,1016,4610,1874,2367,4866,2391,3666,2905,4143,5000,4728,3147,4714,2043,2692,4754,3815,214,3804,1316,545,3789,159,4871,552,4277,4541,4477,4828,1768,1415,635,1663,4001,5000,1598,1610,4595,1635,2774,4894,3269,2668,1333,1285,3163,3850,4689,312,3012,1361,878,2100,1115,4126,1811,4152,913,3988,3023,3798,999,4882,2828,1380,2131,4927,2713,2830,11666 +3422,3879,2123,2686,3156,4808,4098,2750,1135,186,1559,2535,1989,3097,3088,1037,4619,1890,2325,4807,2341,3644,2866,4121,5000,5000,3169,4747,2070,2711,4772,3843,254,3773,1290,515,3759,137,4842,506,4285,4563,4521,4877,1809,1429,664,1708,4043,5000,1537,1571,4563,1609,2732,4915,3294,2701,1369,1312,3179,3865,4717,323,2961,1748,836,2072,1095,4098,1763,4158,949,3998,3023,3818,1031,4909,2860,1411,2093,4900,2685,2791,11713 +3444,3903,2152,2720,3185,4829,4114,2774,1173,136,1520,2491,1956,3074,3062,1058,4628,1906,2344,4810,2355,3686,2889,4162,5000,5000,3129,4717,2035,2667,4728,3872,294,3804,1327,545,3792,178,4874,522,4232,4524,4504,4864,1787,1381,693,1754,4085,5000,1537,1595,4594,1645,2754,4873,3257,2672,1342,1277,3132,3818,4747,334,2972,1779,856,2105,1137,4131,1777,4102,923,3946,2961,3777,1001,4936,2892,1442,2117,4935,2719,2813,11761 +3405,3865,2120,2691,3153,4787,4131,2799,1211,149,1545,2510,1984,3114,3098,1017,4575,1861,2300,4751,2307,3667,2913,4204,5000,5000,3150,4330,2062,2685,4747,3840,272,3773,1301,514,3764,218,4906,536,4240,4548,4549,4912,1827,1395,662,1738,4063,5000,1476,1556,4563,1680,2775,4894,3282,2706,1378,1304,3147,3834,4716,282,2922,1749,814,1658,1180,4164,1790,4108,957,3954,2961,3800,1034,4902,2862,1411,2079,4909,2690,2773,11803 +3428,3890,2150,2725,3182,4807,4085,2763,1188,99,1509,2467,1952,3153,3134,1036,4584,1879,2317,4754,2323,3711,2876,4183,5000,5000,3110,4301,2088,2703,4766,3870,312,3804,1337,544,3797,196,4875,488,4188,4511,4533,4897,1868,1409,693,1784,4104,5000,1477,1580,4595,1654,2736,4853,3246,2678,1351,1329,3162,3850,4747,292,3354,1782,835,1692,1160,4134,1741,4053,928,3900,2901,3825,1067,4930,2894,1442,2102,4944,2723,2795,11846 +3389,3852,2118,2696,3210,4826,4102,2789,1226,112,1535,2486,1982,3130,3107,994,4531,1836,2271,4757,2340,3757,2900,4225,5000,5000,3131,4333,2051,2659,4723,3839,290,3774,1311,573,3831,236,4905,502,4197,4537,4580,4944,1847,1362,662,1768,4081,5000,1478,1604,4626,1689,2759,4873,3272,2712,1386,1293,3115,3805,4717,240,3306,1755,856,1727,1202,4165,1753,4060,960,3907,2902,3789,1038,4896,2864,1411,2063,4980,2756,2816,11890 +3411,3877,2149,2730,3177,4783,4058,2754,1203,64,1563,2505,2012,3170,3142,1012,4540,1856,2286,4699,2296,3741,2864,4205,5000,5000,2732,4365,2076,2677,4743,3871,331,3806,1347,540,3804,214,4873,453,4145,4565,4628,4989,1888,1377,694,1814,4119,5000,1416,1567,4596,1662,2720,4832,3236,2746,1421,1318,3129,3822,4749,250,3320,1790,395,1701,1182,4133,1703,4006,991,3913,2904,3817,1071,4924,2896,1441,2086,4953,2726,2774,11935 +3372,3902,2179,2763,3205,4802,4075,2782,1243,77,1530,2463,1980,3147,3114,968,4486,1876,2300,4702,2316,3789,2890,4668,5000,5000,2691,4335,2039,2632,4701,3841,371,3838,1382,569,3839,254,4902,466,4156,4531,4613,4972,1866,1331,665,1799,4157,5000,1417,1592,4629,1697,2744,4853,3263,2719,1393,1280,3081,3778,4721,679,3335,1827,417,1737,1224,4163,1714,4014,959,3857,2846,3785,1043,4890,2867,1471,2109,4989,2758,2795,11981 +3395,3865,2148,2734,3170,4759,4031,2748,1283,91,1559,2483,2011,3187,3148,985,4496,1836,2251,4644,2275,3776,2854,4711,5000,5000,2713,4367,2064,2650,4722,3874,349,3808,1356,536,3812,232,4868,478,4167,4561,4662,5000,1907,1346,699,1845,4132,5000,1356,1555,4599,1670,2769,4874,3289,2753,1428,1304,3096,3796,4755,626,3289,1803,377,1711,1204,4130,1724,4022,987,3862,2849,3816,1076,4918,2899,1439,2069,4962,2727,2752,12028 +3418,3890,2179,2768,3198,4778,4048,2777,1260,44,1528,2441,1980,3164,3181,1002,4505,1858,2264,4648,2298,3826,2881,4692,5000,4699,2672,4336,2026,2605,4743,3907,390,3840,1392,564,3848,271,4896,428,4116,4529,4648,4996,1886,1363,733,1891,4168,5000,1358,1580,4632,1705,2732,4833,3254,2726,1400,1265,3048,3814,4790,636,3306,1421,399,1748,1245,4159,1672,3969,953,3804,2792,3787,1110,4946,2931,1469,2091,4998,2758,2771,12076 +3379,3853,2148,2739,3163,4796,4067,2806,1300,60,1559,2461,2012,3204,3152,957,4452,1819,2213,4590,2260,3876,3329,4735,5000,4719,2693,4368,2049,2623,4702,3879,368,3811,1365,529,3884,310,4923,439,4128,4561,4697,5000,1927,1318,706,1876,4142,5000,1298,1544,4665,1739,2758,4854,3282,2761,1434,1288,3062,3772,5000,583,3262,1399,360,1784,1287,4186,1682,3979,980,3807,2798,3822,1082,4913,2901,1437,2051,4971,2726,2790,12118 +3402,3878,2179,2772,3189,4752,4023,2774,1279,13,1530,2420,2044,3244,3184,972,4462,1844,2224,4595,2286,3866,3295,4717,5000,4676,2652,4399,2073,2640,4725,3914,408,3843,1401,556,3858,287,4887,388,4079,4532,4684,5000,1968,1335,741,1922,4176,5000,1300,1570,4637,1711,2723,4814,3247,2734,1467,1311,3076,3792,5000,592,3280,1440,383,1760,1266,4151,1629,3927,943,3748,2804,3858,1115,4942,2933,1466,2073,5000,2756,2747,12161 +3362,3842,2149,2804,3216,4770,4042,2805,1319,30,1563,2441,2014,3221,3154,926,4410,1807,2234,4600,2313,3918,3324,4761,5000,4695,2673,4368,2034,2596,4685,3887,386,3814,1436,583,3895,326,4913,399,4093,4565,4734,5000,1947,1291,715,1907,4148,5000,1302,1596,4670,1745,2750,4835,3275,2769,1439,1271,3028,3750,5000,539,2818,1482,407,1797,1307,4178,1638,3938,967,3751,2750,3834,1087,4908,2904,1433,2094,5000,2786,2765,12205 +3385,3868,2180,2775,3180,4726,3999,2774,1297,47,1598,2462,2047,3261,3185,940,4420,1833,2182,4544,2279,4329,3291,4743,5000,4712,2694,4398,2057,2613,4708,3922,425,3847,1409,548,3870,302,4875,347,4107,4600,4783,5000,1988,1309,752,1953,4180,5000,1243,1561,4642,1717,2715,4794,3303,2804,1471,1293,3041,4191,5000,548,2839,1462,369,1773,1285,4141,1585,3949,990,3753,2759,3873,1121,4937,2936,1462,2053,5000,2753,2720,12250 +3408,3894,2212,2808,3205,4744,4019,2805,1338,3,1571,2421,2018,3238,3154,893,4431,1860,2190,4551,2309,4382,3320,4787,5000,4667,2653,4367,2017,2569,4670,3958,464,3880,1444,574,3907,340,4899,358,4059,4574,4770,5000,1967,1266,727,1999,4212,5000,1247,1588,4676,1750,2744,4816,3269,2777,1442,1252,2993,4151,5000,557,2861,1506,393,1811,1325,4166,1593,3900,950,3693,2707,3852,1093,4905,2968,1491,2074,5000,2782,2738,12296 +3369,3858,2181,2778,3169,4700,3977,2838,1378,21,1607,2443,2051,3277,3184,907,4380,1826,2137,4496,2278,4374,3351,4411,5000,4683,2674,4397,2039,2586,4694,3932,441,3852,1417,537,3882,316,4923,368,4075,4611,4819,5000,2008,1285,764,1983,4181,5000,1189,1553,4648,1783,2773,4838,3298,2812,1474,1273,3007,4174,5000,85,2822,1488,356,1788,1303,4191,1601,3912,971,3695,2718,3894,1127,4934,2938,1457,2033,5000,2748,2693,12343 +3392,3884,2213,2810,3193,4717,3998,2808,1356,0,1582,2403,2023,3317,3213,920,4391,1855,2144,4504,2731,4428,3319,4393,5000,4636,2633,4365,1999,2604,4719,3969,479,3885,1452,562,3920,353,4884,316,4029,4587,4807,5000,2049,1304,802,2029,4211,5000,1194,1581,4682,1753,2740,4798,3265,2785,1444,1231,3442,4197,5000,94,2846,1533,381,1827,1343,4152,1547,3864,929,3634,2668,3938,1160,4963,2970,1485,2054,5000,2776,2709,12391 +3353,3849,2183,2780,3218,4735,4019,2842,1396,0,1620,2425,2057,3294,3180,871,4341,1823,2089,4450,2765,4483,3350,4438,5000,4650,2654,4394,2020,2560,4683,3944,455,3857,1424,587,3957,390,4906,325,4046,4625,4855,5000,2027,1263,779,2012,4178,5000,1138,1609,4716,1785,2770,4820,3294,2821,1476,1251,3394,4159,5000,42,2809,1516,407,1866,1382,4175,1555,3878,948,3635,2682,3921,1132,4930,2940,1451,2012,5000,2804,2726,12433 +3376,3875,2215,2812,3180,4690,3978,2814,1375,0,1596,2448,2091,3333,3208,884,4353,1854,2096,4460,2738,4475,2900,4421,5000,4602,2675,4424,2041,2578,4709,3982,493,3891,1458,549,3933,365,4865,273,4002,4603,4904,5000,2068,1283,818,2057,4206,5000,1144,1575,4688,1755,2739,4780,3261,2856,1507,1271,3408,4183,4884,53,2835,1562,371,1843,1359,4135,1501,3832,903,3637,2697,3967,1166,4960,2972,1479,2032,5000,2768,2680,12476 +3338,3840,2247,2844,3204,4708,4000,2848,1414,0,1635,2409,2064,3309,3174,834,4304,1886,2102,4891,2775,4530,2932,4465,5000,4615,2634,4391,2000,2534,4673,3957,468,3925,1493,573,3972,401,4886,283,4021,4643,4890,5000,2047,1243,796,2040,4233,5000,1151,1604,4723,1786,2770,4802,3291,2829,1476,1648,3361,4146,4862,2,2863,1609,397,1882,1398,4157,1508,3848,920,3576,2651,3953,1137,4928,2942,1506,2052,5000,2795,2696,12520 +3361,3867,2217,2813,3166,4663,3960,2821,1454,2,1675,2432,2099,3348,3201,846,4317,1856,2046,4840,2751,4522,2903,4448,5000,4627,2656,4419,2021,2552,4700,3995,504,3897,1464,535,3948,375,4844,292,4041,4685,4938,5000,2087,1264,836,2085,4197,5000,1097,1571,4695,1755,2740,4825,3320,2865,1507,1667,3375,4172,4903,13,2829,1594,362,1860,1374,4115,1515,3865,936,3577,2669,4002,1170,4958,2974,1472,2010,5000,2759,2650,12565 +3384,3894,2249,2845,3189,4680,3983,2856,1432,0,1653,2393,2072,3325,3165,858,4331,1890,2052,4852,2790,4157,2936,4493,5000,4577,2615,4386,1979,2509,4728,4034,540,3931,1498,558,3986,410,4864,240,4000,4664,4923,5000,2065,1225,876,2129,4223,5000,1106,1600,4729,1785,2772,4785,3288,2838,1475,1623,3328,3779,4945,24,2859,1641,389,1900,1412,4135,1461,3820,889,3517,2626,3990,1141,4987,3006,1498,2030,5000,2784,2665,12611 +3345,3860,2220,2814,3150,4636,4006,2892,1471,0,1694,2417,2107,3363,3191,808,4283,1863,2415,4804,2769,4211,2970,4537,5000,4588,2637,4414,1999,2527,4694,4010,513,3903,1469,519,3963,445,4883,250,4021,4707,4970,5000,2105,1248,855,2111,4185,4986,1054,1568,4764,1815,2805,4808,3319,2873,1925,1642,3343,3744,4924,0,2827,1627,355,1878,1449,4155,1468,3839,902,3518,2646,4041,1174,4955,2975,1463,1988,5000,2747,2681,12658 +3369,3887,2252,2845,3173,4653,3967,2866,1448,0,1674,2379,2143,3401,3217,819,4298,1898,2421,4818,2811,4203,2942,4520,5000,4536,2596,4379,2019,2546,4723,4049,548,3938,1503,541,4002,417,4839,198,3982,4689,4954,5000,2145,1271,897,2154,4208,4990,1065,1598,4736,1782,2776,4769,3287,2847,1892,1660,3359,3772,4966,0,2859,1674,383,1918,1424,4112,1414,3797,853,3458,2668,4092,1207,4985,3007,1490,2007,5000,2772,2634,12706 +3330,3853,2222,2875,3195,4671,3992,2902,1486,0,1716,2404,2117,3377,3179,768,4252,1872,2364,4834,2434,4257,2976,4564,5000,4546,2618,4407,1977,2504,4690,4025,519,3910,1536,563,4040,451,4857,208,4005,4733,5000,5000,2123,1233,876,2135,4169,4931,1077,1628,4770,1811,2810,4792,3318,2882,1921,1615,2893,3738,4946,0,2829,1722,411,1958,1460,4130,1421,3817,865,3461,2630,4083,1177,4954,2977,1454,1965,5000,2796,2649,12748 +3354,3881,2255,2844,3155,4626,3954,2877,1462,0,1758,2428,2153,3414,3203,779,4268,2329,2369,4789,2416,4248,2949,4547,5000,4555,2640,4434,1997,2523,4720,4064,553,3945,1506,523,4017,422,4812,156,3967,4777,5000,5000,2163,1258,918,2178,4190,4934,1028,1596,4743,1777,2782,4753,3349,3337,1950,1632,2909,3768,4988,0,2863,1709,378,1936,1434,4086,1367,3776,876,3463,2655,4137,1209,4984,3008,1480,1984,5000,2758,2602,12791 +3315,3909,2287,2874,3177,4644,3980,2914,1500,0,1739,2391,2127,3389,3165,728,4285,2367,2374,4807,2461,4300,2985,4591,5000,4502,2599,4399,1954,2481,4689,4041,585,3979,1539,544,4056,455,4828,167,3992,4760,5000,5000,2140,1221,899,2220,4211,4937,1042,1627,4777,1805,2817,4777,3318,3310,1916,1587,2863,3735,4969,0,2898,1757,407,1977,1469,4103,1374,3799,825,3404,2619,4129,1179,4952,3040,1505,2003,5000,2781,2617,12835 +3339,3875,2258,2842,3137,4600,3943,2951,1537,0,1782,2417,2164,3426,3188,739,4241,2343,2317,4344,2445,4290,2959,4636,5000,4510,2621,4426,1973,2502,4720,4080,555,3952,1509,503,4033,425,4845,178,4019,4806,5000,5000,2179,1246,941,2200,4169,4878,995,1596,4749,1771,2852,4800,3349,3345,1944,1184,2880,3766,5000,0,2872,1743,375,1955,1442,4119,1382,3822,834,3408,2647,4184,1211,4983,3009,1469,1960,5000,2742,2570,12880 +3363,3903,2290,2871,3158,4617,3969,2927,1512,0,1763,2380,2139,3401,3210,749,4679,2383,2322,4364,2492,4341,2995,4618,5000,4456,2582,4390,1930,2522,4751,4119,586,3987,1541,524,4072,457,4798,127,3984,4790,5000,5000,2156,1272,984,2241,4188,4881,1011,1627,4783,1797,2825,4762,3739,3318,1909,1139,2897,3797,5000,0,2908,1790,405,1996,1477,4073,1328,3784,781,3350,2614,4177,1242,5000,3040,1494,1980,5000,2764,2585,12926 +3325,3869,2261,2839,3117,4635,3996,2965,1548,0,1806,2407,2175,3437,3170,698,4637,2361,2266,4323,2539,4391,3032,4662,5000,4463,2604,4416,1949,2481,4721,4095,554,3959,1510,482,4111,488,4813,138,4012,4836,5000,5000,2194,1237,966,2219,4144,4822,966,1658,4816,1824,2861,4786,3771,3353,1936,1155,2852,3767,5000,0,2884,1776,373,2037,1511,4088,1337,3810,789,3355,2645,4233,1211,4982,3009,1457,1937,5000,2786,2601,12973 +3349,3898,2293,2868,3138,4592,3961,2941,1522,0,1788,2433,2213,3473,3192,709,4656,2402,1851,4346,2526,4379,3007,4643,5000,4408,2564,4441,1968,2502,4754,4134,583,3994,1542,502,4088,457,4766,88,3979,4821,5000,5000,2233,1265,1009,2259,4161,4825,985,1628,4788,1788,2835,4748,3741,3326,1543,1171,2870,3800,5000,0,2922,1823,404,2015,1482,4041,1283,3774,734,3360,2677,4289,1241,5000,3040,1482,1956,5000,2746,2554,13021 +3311,3865,2326,2897,3158,4610,3989,2980,1557,0,1832,2398,2188,3447,3151,1077,4615,2381,1857,4370,2575,4427,3044,4687,5000,4415,2587,4405,1925,2462,4725,4110,550,4029,1573,522,4127,487,4780,101,4009,4868,5000,5000,2209,1230,991,2236,4115,4828,1005,1660,4821,1813,2871,5000,3773,3360,1507,1125,2826,3771,5000,0,2961,1870,435,2056,1515,4055,1292,3801,741,3305,2649,4283,1210,4981,3009,1444,1975,5000,2767,2569,13063 +3335,3894,2296,2863,3116,4567,3955,2956,1529,27,1875,2425,2225,3482,3171,1088,4636,2423,1801,4333,2563,4412,3020,4668,5000,4421,2610,4430,1944,2484,4758,4149,578,4002,1541,479,4103,454,4732,51,4040,4915,5000,5000,2247,1259,1035,2275,4131,4769,964,1630,4792,1776,2845,5000,3805,3395,1533,1141,2845,3805,5000,0,2940,1855,405,2035,1485,4007,1239,3829,747,3312,2684,4340,1239,5000,3040,1469,1932,5000,2726,2522,13106 +3359,3923,2329,2892,3137,4586,3984,2995,1563,0,1857,2390,2201,3455,3129,1098,4659,2046,1808,4360,2614,4458,3058,4711,5000,4365,2571,4392,1901,2445,4730,4187,605,4037,1572,498,4142,483,4746,65,4010,4900,5000,4993,2222,1226,1079,2313,4145,4772,986,1662,4825,1800,2882,5000,3776,2947,1496,1095,2802,3777,5000,0,2980,1901,437,2076,1517,4021,1249,3796,691,3258,2659,4335,1207,5000,3070,1493,1951,5000,2746,2538,13150 +3322,3890,2299,2858,3094,4543,4014,3034,1597,32,1900,2417,2238,3490,3568,1047,4620,2027,1753,4326,2603,4441,3097,4754,5000,4370,2594,4417,1919,2468,4764,4163,569,4010,1540,455,4118,511,4759,78,4043,4947,5000,5000,2259,1255,1061,2288,4097,4714,947,1633,4796,1824,3339,5000,3808,2981,1521,1111,2822,3812,5000,0,2960,1885,407,2054,1548,4033,1259,3826,696,3267,2696,4391,1236,5000,3039,1455,1908,5000,2704,2492,13195 +3346,3919,2332,2886,3114,4562,3981,3010,1567,5,1882,2383,2214,3524,3587,1058,4643,2070,1760,4355,2654,4484,3074,4735,5000,4314,2555,4379,1938,2491,4799,4200,595,4045,1570,474,4157,477,4710,31,4014,4933,5000,4949,2296,1286,1105,2325,4111,4718,972,1665,4828,1785,3314,5000,3779,2953,1484,1126,2842,3848,5000,0,3002,1930,440,2095,1516,3984,1208,3795,639,3214,2674,4448,1265,5000,3069,1478,1927,5000,2724,2508,13241 +3309,3887,2302,2851,3134,4582,4012,3049,1599,40,1925,2412,2252,3496,3543,1007,4186,2052,1706,4385,2706,4527,3113,4777,5000,4319,2579,4403,1895,2453,4772,4176,557,4017,1537,492,4195,504,4722,45,4049,4980,5000,4956,2271,1254,1088,2299,4061,4660,998,1698,4860,1808,3351,5000,3392,2987,1508,1080,2801,3822,5000,0,2983,1912,473,2136,1546,3996,1219,3827,644,3225,2714,4442,1231,5000,3037,1440,1884,5000,2743,2524,13288 +3333,3917,2334,2878,3091,4540,3980,3026,1569,14,1968,2440,2290,3949,3561,1019,4211,2097,1715,4355,2696,4505,3091,4757,5000,4262,2603,4426,1913,2478,4807,4212,581,4052,1567,448,4171,468,4673,0,4022,5000,5000,4963,2307,1286,1132,2334,4073,4664,963,1668,4830,2189,3326,5000,3363,3020,1532,1095,2822,3858,5000,0,3027,1955,444,2114,1514,3946,1168,3798,648,3237,2756,4498,1259,5000,3067,1463,1903,5000,2700,2478,13336 +3296,3946,2367,2905,3110,4560,4012,3065,1599,51,1949,2407,2266,3920,3516,968,4175,2142,1724,4387,2749,4545,3131,4798,5000,4267,2565,4388,1870,2440,4781,4187,604,4087,1595,466,4209,494,4685,15,4059,5000,5000,4907,2281,1255,1115,2307,4084,4669,992,1701,4861,2211,3363,5000,3396,2992,1493,1049,2782,3833,5000,0,3071,1998,478,2154,1543,3957,1180,3832,590,3188,2737,4492,1224,5000,3035,1486,1922,5000,2719,2495,13378 +3321,3914,2337,2870,3068,4518,3981,3042,1629,89,1991,2437,2304,3952,3533,560,4202,2125,1672,4359,2739,4521,3109,4840,5000,4272,2589,4411,1889,2466,4817,4223,564,4060,1562,421,4184,458,4635,32,4096,5000,5000,4912,2316,1288,1159,2341,4033,4613,959,1672,4830,2170,3400,4789,3430,3025,1516,1064,2804,3871,5000,0,3053,1978,450,2133,1509,3906,1193,3867,593,3202,2781,4547,1251,5000,3064,1447,1880,5000,2675,2450,13421 +3346,3944,2369,2896,3087,4539,4013,3080,1597,65,1971,2404,2700,3923,3550,572,4230,2171,1682,4395,2792,4557,3150,4818,5000,4214,2552,4372,1846,2429,4853,4259,586,4095,1590,439,4222,482,4646,0,4072,5000,5000,4854,2290,1320,1204,2374,4042,4619,990,1705,5000,2192,3375,4753,3401,2996,1477,1017,2765,3909,5000,0,3098,2018,484,2173,1536,3917,1144,3840,535,3155,2764,4539,1278,5000,3094,1469,1899,5000,2693,2467,13465 +3309,3912,2339,2861,3044,4560,4046,3119,1625,103,2012,2434,2738,3954,3504,522,4197,2154,1631,4369,2782,4592,3190,4859,5000,4219,2576,4394,1865,2456,4827,4232,545,4067,1556,394,4259,507,4658,5,4110,5000,5000,4858,2324,1292,1186,2344,3990,4564,960,1676,5000,2212,3412,4780,3435,3028,1500,1033,2788,3885,5000,0,3081,1996,457,2213,1563,3927,1157,3877,538,3171,2811,4593,1242,5000,3061,1430,1857,5000,2649,2485,13510 +3334,3943,2371,2886,3062,4520,4017,3095,1591,81,1991,2402,2776,3985,3099,535,4226,2200,1643,4406,2834,4563,3169,4837,5000,4162,2539,4416,1884,2482,4864,4266,565,4102,1584,411,4234,468,4608,0,4088,5000,5000,4862,2359,1326,1231,2376,3998,4571,994,1709,5000,2171,2967,4744,3406,2999,1522,1048,2812,3924,5000,0,3127,2035,492,2190,1528,3875,1110,3852,480,3126,2858,4646,1268,5000,3090,1452,1876,5000,2667,2441,13556 +3298,3911,2340,2912,3081,4542,4050,3133,1618,120,2031,2853,2752,3954,3053,486,4195,2185,1656,4445,2886,4595,3211,4876,5000,4166,2564,4376,1842,2447,4839,4238,522,4074,1611,428,4270,491,4619,0,4128,5000,5000,4803,2331,1298,1213,2344,3945,4579,1029,2163,5000,2191,3004,4771,3440,3031,1481,1002,2775,3901,5000,0,3111,2073,527,2230,1554,3885,1125,3890,483,3145,2844,4637,1231,5000,3057,1412,1896,5000,2685,2459,13603 +3323,3942,2372,2875,3038,4502,4022,3109,1582,160,2070,2883,2790,3984,3068,499,4226,2231,1608,4423,2876,4563,3190,4853,5000,4171,2590,4398,1861,2475,4876,4272,541,4109,1576,382,4245,452,4568,0,4168,5000,5000,4805,2364,1333,1257,2374,3953,4525,1002,2134,5000,2149,2978,4736,3474,3063,1502,1018,2800,3940,5000,0,3157,2048,500,2207,1517,3833,1078,3929,486,3165,2894,4688,1256,5000,3086,1434,1854,5000,2640,2416,13651 +3349,3972,2404,2900,3057,4525,4056,3147,1608,139,2047,2853,2767,3532,3020,451,4257,2277,1623,4463,2928,4591,3232,4892,5000,4114,2553,4358,1819,2441,4851,4305,559,4143,1602,399,4281,474,4580,0,4148,5000,5000,4745,2335,1306,1239,2404,3960,4535,1039,2167,5000,1748,3014,4763,3446,3032,1461,971,2764,3918,5000,0,3203,2083,536,2247,1542,3843,1095,3907,428,3124,2882,4677,1218,5000,3115,1455,1874,5000,2657,2435,13693 +3312,3941,2373,2863,3013,4486,4029,3185,1633,179,2505,2884,2805,3561,3035,465,4228,2262,1576,4443,2917,4556,3274,4930,5000,4119,2579,4379,1839,2470,4889,4275,514,4115,1566,353,4254,433,4591,0,4189,5000,5000,4748,2368,1342,1283,2370,3905,4483,1435,2138,5000,1767,3051,4791,3480,3064,1482,987,2790,3958,5000,0,3187,2056,510,2224,1504,3852,1112,3948,432,3146,2932,4726,1242,5000,3081,1415,1832,5000,2612,2393,13736 +3338,3972,2404,2888,3032,4509,4064,3160,1595,158,2481,2854,2780,3590,3049,479,4261,2308,1593,4486,2967,4581,3254,4906,5000,4063,2543,4339,1797,2499,4926,4307,531,4150,1592,369,4290,454,4541,0,4170,5000,5000,4688,2400,1378,1327,2398,3911,4493,1475,2171,5000,1724,3024,4756,3452,3033,1440,941,2817,3998,5000,0,3233,2089,547,2262,1527,3800,1068,3927,374,3108,2922,4774,1266,5000,3109,1436,1853,5000,2629,2413,13780 +3302,3941,2373,2850,3050,4533,4099,3197,1618,200,2518,2886,2398,3556,3001,433,4233,2292,1548,4467,3017,4604,3296,4943,5000,4068,2570,4360,1817,2466,4901,4276,486,4122,1556,386,4325,474,4552,0,4213,5000,5000,4690,2370,1353,1309,2362,3856,4443,1453,2204,4908,1743,3060,4784,3486,3064,1460,958,2782,3977,5000,0,3217,2059,583,2301,1550,3809,1086,3969,378,3133,2974,4759,1228,5000,3075,1396,1811,5000,2646,2433,13825 +3328,3971,2404,2874,3007,4495,4073,3171,1579,599,2491,2918,2436,3584,3014,448,4268,2339,1567,4512,3004,4564,3276,4918,5000,4012,2596,4381,1838,2496,4939,4307,501,4156,1581,340,4297,432,4502,0,4194,5000,5000,4692,2402,1390,1352,2388,3861,4876,1494,2175,4873,1699,3033,4750,3458,3094,1480,974,2810,4017,5000,0,3263,2090,558,2277,1510,3756,1044,3950,320,3159,3027,4805,1251,5000,3103,1417,1832,5000,2600,2392,13871 +3292,3940,2435,2898,3026,4520,4108,3207,1601,641,2526,2888,2412,3550,2965,402,4242,2385,1586,4557,3052,4585,3319,4954,5000,4018,2561,4339,1796,2464,4914,4275,455,4189,1606,356,4331,451,4514,0,4238,5000,5000,4632,2371,1365,1333,2352,3867,4889,1537,2208,4900,1718,3068,4778,3492,3063,1438,929,2777,3996,5000,0,3309,2120,595,2315,1532,3765,1064,3993,325,3125,3018,4787,1211,5000,3069,1438,1853,5000,2617,2414,13918 +3319,3972,2404,2859,2982,4483,4082,3181,1622,683,2560,2501,2449,3576,2978,419,4278,2369,1545,4541,3038,4541,3299,4927,5000,4024,2588,4360,1817,2495,4951,4304,470,4161,1569,310,4303,408,4464,0,4282,5000,5000,4635,2401,1403,1376,2376,3811,4841,1518,1759,4864,1674,3040,4807,3526,3092,1457,946,2806,4037,5000,0,3293,2086,571,2290,1491,3713,1084,4037,331,3153,3071,4831,1234,5000,3096,1397,1812,5000,2571,2374,13966 +3345,4003,2434,2882,3001,4508,4119,3216,2001,663,2532,2472,2425,3541,2929,436,4315,2414,1567,4588,3085,4558,3342,4962,5000,3969,2553,4318,1777,2464,4988,4333,484,4194,1593,326,4337,426,4476,0,4265,5000,5000,4575,2369,1380,1418,2400,4236,4857,1562,1791,4890,1692,3074,4774,3498,3060,1414,901,2774,4078,5000,0,3338,2113,608,2327,1512,3722,1044,4019,275,3122,3063,4810,1194,5000,3124,1417,1833,5000,2588,2396,14008 +3310,3972,2403,2843,2958,4472,4155,3251,2021,705,2564,2505,2462,3567,2942,392,4291,2398,1527,4573,3069,4574,3384,4996,5000,3976,2581,4339,1798,2496,4964,4298,437,4166,1555,280,4308,444,4488,0,4309,5000,5000,4579,2399,1418,1398,2360,4179,4811,1545,1762,4916,1709,3107,4802,3533,3089,1432,918,2804,4057,5000,0,3321,2077,584,2302,1532,3731,1067,4064,281,3153,3117,4850,1215,5000,3089,1376,1793,5000,2542,2419,14051 +3337,4003,2433,2866,2977,4499,4130,3223,1978,685,2113,2477,2499,3592,2955,410,4329,2443,1551,4621,3113,4526,3365,4968,5000,3922,2547,4297,1820,2528,5000,4326,450,4199,1578,295,4340,399,4439,0,4292,5000,5000,4582,2428,1457,1440,2382,4184,4828,1171,1794,4879,1665,3078,4769,3505,3056,1389,936,2835,4098,5000,0,3365,2102,622,2339,1490,3679,1028,4047,226,3124,3171,4889,1237,5000,3116,1397,1815,5000,2559,2381,14095 +3301,3973,2401,2888,2996,4525,4167,3677,1997,727,2143,2510,2474,3555,2905,367,4306,2425,1514,4669,3157,4539,3408,5000,5000,3930,2575,4317,1780,2498,4975,4290,402,4170,1602,311,4372,416,4452,0,4338,5000,5000,4525,2395,1435,1420,2762,4127,4784,1218,1826,4904,1683,3111,4799,3539,3085,1407,892,2804,4077,5000,0,3347,2125,660,2375,1509,3688,1052,4093,233,3158,3164,4864,1196,5000,3080,1355,1775,5000,2575,2405,14140 +3328,4004,2431,2849,2953,4491,4142,3649,1954,707,2173,2544,2511,3580,2918,387,4345,2470,1540,4656,3138,4488,3389,4972,5000,3938,2603,4337,1803,2531,5000,4316,415,4203,1563,265,4342,371,4403,0,4321,5000,5000,4530,2423,1475,1461,2782,4132,4804,1204,1796,4866,1639,3081,4766,3573,3113,1425,910,2836,4118,5000,0,3391,2085,636,2349,1465,3636,1015,4077,242,3193,3218,4900,1217,5000,3107,1375,1797,5000,2530,2368,14186 +3294,4035,2460,2871,2972,4518,4179,3682,1971,328,2139,2517,2485,3542,2868,345,4385,2513,1567,4705,3179,4498,3432,5000,5000,3885,2569,4295,1764,2502,4986,4279,429,4235,1585,281,4373,387,4417,0,4366,5000,5000,4473,2389,1453,1439,2802,4137,4404,1252,1828,4890,1656,3112,4796,3545,3080,1381,867,2807,4097,5000,39,3434,2106,674,2384,1483,3646,1041,4124,189,3167,3210,4871,1175,5000,3133,1396,1820,5000,2547,2393,14233 +3321,4005,2428,2831,2930,4484,4574,3714,1988,370,2166,2551,2522,3565,2880,365,4364,2495,1533,4693,3158,4445,3412,5000,5000,3895,2598,4315,1787,2536,5000,4304,380,4206,1546,235,4342,341,4431,0,4412,5000,5000,4480,2416,1493,1900,2759,4080,4363,1239,1797,4852,1612,3143,4826,3579,3107,1399,886,2840,4138,5000,18,3414,2064,651,2357,1439,3656,1067,4171,198,3205,3264,4904,1196,5000,3097,1354,1781,5000,2501,2357,14281 +3348,4036,2457,2852,2950,4513,4612,3684,1943,349,2131,2524,2496,3526,2892,387,4405,2537,1563,4743,3197,4452,3455,5000,5000,3843,2565,4273,1749,2569,5000,4327,393,4238,1568,252,4372,356,4384,0,4395,5000,4986,4425,2381,1534,1939,2777,4085,4386,1289,1829,4875,1630,3111,4793,3551,3073,1354,844,2873,4178,5000,60,3456,2082,690,2392,1456,3604,1033,4156,147,3181,3256,4872,1216,5000,3123,1374,1804,5000,2518,2383,14323 +3314,4006,2424,2812,2907,4542,4649,3715,1539,390,2156,2558,2532,3549,2843,347,4384,2518,1531,4731,3235,4458,3498,5000,5000,3854,2594,4293,1773,2541,5000,4289,344,4208,1528,206,4402,371,4399,2,4441,5000,4993,4434,2407,1513,1917,2733,3608,4347,1277,1860,4898,1648,3141,4824,3585,3100,1372,863,2845,4157,5000,40,3435,2038,666,2426,1473,3614,1061,4204,158,3221,3310,4901,1174,5000,3087,1333,1765,5000,2535,2410,14366 +3341,4037,2453,2833,2927,4929,4624,3684,1493,368,2118,2593,2567,3571,2855,370,4426,2559,1562,4781,3209,4402,3479,5000,5000,3803,2562,4313,1797,2576,5000,4311,357,4240,1549,222,4370,324,4352,0,4424,5000,5000,4443,2433,1974,1955,2750,3614,4372,1328,1829,4859,1604,3108,4792,3557,3064,1389,884,2880,4197,5000,83,3475,2054,705,2398,1427,3563,1028,4189,108,3262,3363,4928,1194,5000,3113,1353,1789,5000,2491,2375,14410 +3307,4007,2481,2854,2947,4959,4662,3714,1508,408,2142,2567,2541,3530,2805,331,4407,2538,1595,4832,3244,4406,3521,5000,5000,3815,2591,4271,1760,2548,5000,4271,308,4272,1570,239,4398,339,4368,9,4469,5000,4944,4391,2397,1953,1932,2704,3557,4397,1379,1859,4881,1622,3136,4822,3590,3091,1344,842,2852,4175,5000,64,3514,2069,744,2431,1443,3574,1058,4237,121,3242,3354,4892,1152,5000,3076,1311,1813,5000,2508,2404,14455 +3335,4038,2448,2813,2906,4927,4637,3261,1461,448,2164,2602,2576,3552,2818,355,4449,2578,1567,4820,3216,4347,3502,4998,5000,3828,2621,4291,1785,2583,5000,4292,321,4241,1529,193,4365,291,4322,0,4514,5000,4949,4403,2422,1995,1969,2299,3563,4362,1369,1828,4841,1578,3102,4853,3624,3117,1361,863,2888,4214,5000,107,3490,2022,721,2402,1396,3524,1027,4285,135,3285,3406,4916,1171,5000,3101,1331,1775,5000,2463,2370,14501 +3363,4070,2476,2834,3346,4957,4674,3290,1475,425,2124,2575,2548,3510,2768,380,4492,2618,1601,4870,3248,4349,3544,5000,5000,3779,2589,4249,1748,2556,5000,4313,334,4273,1550,210,4393,305,4339,18,4497,5000,4892,4353,2804,1975,2007,2314,3569,4390,1421,1858,4863,1597,3130,4822,3596,3081,1316,822,2862,4192,5000,150,3528,2035,760,2435,1411,3535,1059,4271,88,3267,3396,4876,1129,5000,3126,1351,1800,5000,2481,2399,14548 +3329,4039,2442,2793,3305,4926,4712,3318,1490,464,2144,2611,2583,3531,2781,344,4474,2595,1575,4859,3217,4289,3586,5000,5000,3793,2619,4269,1774,2591,5000,4271,286,4242,1509,165,4358,319,4357,55,4542,5000,4897,4367,2829,2017,1981,2267,3514,4357,1411,1825,4822,1615,3156,4853,3629,3106,1333,844,2898,4231,5000,132,3503,1985,737,2405,1425,3548,1091,4319,104,3312,3447,4897,1149,5000,3089,1309,1763,5000,2437,2367,14596 +3357,4071,2470,2814,3326,4957,4267,3284,1442,440,2102,2585,2555,3551,2793,370,4517,2633,1611,4909,3247,4290,3566,5000,5000,3746,2588,4227,1800,2627,5000,4290,300,4272,1529,182,4385,271,4313,30,4524,5000,4840,4320,2852,2059,1598,2280,3521,4387,1463,1855,4843,1572,3120,4822,3600,3069,1288,867,2934,4269,5000,176,3538,1996,776,2437,1377,3498,1062,4305,59,3295,3435,4916,1168,5000,3114,1330,1788,5000,2455,2397,14638 +3323,4040,2435,3192,3348,4989,4304,3311,1455,478,2121,2621,2589,3508,2744,335,4499,2608,1587,4958,3275,4290,3608,5000,5000,3762,2618,4247,1765,2600,5000,4247,252,4241,1487,199,4411,284,4331,68,4567,5000,4844,4756,2813,2039,1571,2231,3466,4356,1516,1884,4864,1592,3146,4853,3634,3094,1304,827,2909,4245,5000,159,3511,1945,815,2468,1391,3511,1096,4353,77,3342,3484,4871,1126,5000,3076,1288,1752,5000,2474,2848,14681 +3352,4072,2463,3212,3307,4959,4279,3275,1407,453,2138,2657,2623,3527,2757,363,4543,2645,1625,4946,3239,4228,3588,5000,5000,3716,2649,4267,1792,2636,5000,4266,266,4271,1507,155,4375,235,4289,45,4549,5000,4848,4774,2836,2082,1606,2244,3474,4388,1506,1851,4822,1549,3109,4823,3605,3119,1321,851,2946,4283,5000,203,3545,1955,793,2436,1343,3463,1069,4339,96,3389,3533,4887,1145,5000,3100,1308,1777,5000,2431,2817,14725 +3319,4103,2490,3233,3329,4571,4315,3301,1420,489,2093,2631,2594,3484,2709,329,4526,2680,1665,4995,3264,4228,3629,5000,5000,3733,2618,4226,1757,2610,5000,4222,281,4301,1526,172,4401,249,4308,84,4592,5000,4790,4731,2796,1642,1578,2194,3482,4421,1559,1880,4842,1569,3133,4854,3638,3081,1276,812,2922,4259,5000,247,3577,1964,832,2466,1356,3477,1104,4386,54,3375,3519,4839,1103,5000,3062,1328,1803,5000,2450,2849,14770 +3347,4073,2875,3191,3289,4542,4290,3264,1433,525,2110,2667,2627,3502,2722,358,4570,2653,1643,4981,3226,4165,3608,5000,5000,3751,2649,4246,1785,2646,5000,4239,234,4269,1484,128,4364,200,4267,124,4634,5000,5000,4752,2818,1685,1612,2205,3429,4393,1550,1846,4801,1527,3157,4886,3670,3105,1293,836,2960,4296,5000,230,3547,1910,809,2434,1307,3429,1140,4434,75,3424,3565,4852,1123,5000,3086,1287,1768,5000,2827,2819,14816 +3376,4104,2901,3211,3312,4575,4326,3289,1384,498,2063,2642,2598,3458,2736,387,4614,2687,1684,5000,3248,4164,3650,5000,5000,3708,2618,4205,1751,2620,5000,4257,250,4299,1503,146,4388,213,4288,102,4614,5000,5000,4711,2778,1728,1645,2216,3438,4429,1603,1874,4820,1548,3118,4856,3641,3066,1248,799,2936,4332,5000,274,3577,1918,848,2463,1319,3444,1115,4419,35,3412,3549,4801,1142,5000,3110,1307,1795,5000,2847,2852,14863 +3343,4073,2866,3169,2852,4608,4362,3313,1398,532,2078,2678,2630,3476,2688,356,4597,2658,1664,5000,3207,4163,3690,5000,5000,3728,2650,4225,1779,2656,5000,4211,204,4266,1460,103,4412,226,4310,143,4655,5000,5000,4735,2379,1708,1616,2164,3386,4403,1593,1839,4840,1569,3140,4888,3674,3089,1264,824,2974,4306,5000,256,3545,1863,825,2492,1332,3460,1153,4466,59,3462,3593,4811,1100,5000,3072,1266,1760,5000,2805,2885,14911 +3372,4524,2892,3189,2875,4580,4336,3274,1349,503,2030,2652,2662,3493,2702,387,4642,2690,1707,5000,3227,4099,3669,4998,4953,3686,2619,4246,1808,2692,5000,4228,220,4295,1478,121,4374,177,4270,122,4633,5000,5000,4759,2399,1751,1647,2174,3397,4440,1645,1867,4798,1528,3100,4858,3644,3050,1281,850,3013,4341,5000,300,3573,1870,864,2458,1282,3414,1129,4450,21,3450,3637,4819,1120,5000,3095,1286,1787,5000,2826,2857,14953 +3339,4494,2856,3209,2899,4614,4372,3297,1362,536,2043,2689,2632,3448,2655,356,4624,2659,1750,5000,3245,4098,3709,5000,4960,3707,2651,4205,1775,2666,5000,4182,176,4262,1497,140,4397,190,4293,163,4673,5000,5000,4724,2357,1732,1617,2122,3346,4478,1697,1894,4817,1550,3122,4890,3676,3073,1236,814,2990,4314,5000,282,3539,1876,903,2486,1294,3430,1168,4497,47,3501,3617,4765,1079,5000,3056,1245,1815,5000,2847,2891,14996 +3368,4525,2882,2746,2860,4586,4345,3257,1313,568,2056,2726,2663,3465,2670,389,4669,2689,1732,5000,3200,4035,3687,4978,4905,3730,2683,4227,1805,2702,5000,4197,194,4291,1453,97,4357,141,4255,143,4713,5000,5000,4331,2377,1774,1647,2131,3358,4455,1687,1858,4774,1510,3080,4860,3708,3095,1253,840,3029,4348,5000,326,3565,1820,880,2451,1243,3385,1146,4542,73,3552,3657,4770,1099,5000,3080,1266,1781,5000,2806,2443,15040 diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs new file mode 100644 index 0000000..c0fc4f2 --- /dev/null +++ b/src-tauri/src/commands/mod.rs @@ -0,0 +1,2 @@ +pub mod serial; +pub mod window; diff --git a/src-tauri/src/commands/serial.rs b/src-tauri/src/commands/serial.rs new file mode 100644 index 0000000..2e643a1 --- /dev/null +++ b/src-tauri/src/commands/serial.rs @@ -0,0 +1,289 @@ +use crate::serial_core::codecs::test::{export_recording_csv, TestCodec, TestCsvImporter, TestHandler}; +use crate::serial_core::error::SerialError; +use crate::serial_core::record::CsvImporter; +use crate::serial_core::{TestRecording, serial}; +use log::info; +use serde::Serialize; +use std::fs::File; +use std::io::Cursor; +use std::sync::{Arc, Mutex}; +use std::time::{Instant, SystemTime, UNIX_EPOCH}; +use tauri::{async_runtime::JoinHandle, AppHandle, Manager, State}; +use tokio_serial::{available_ports, SerialPortBuilderExt}; +use tokio_util::sync::CancellationToken; + +type SharedTestRecording = Arc>; + + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct SerialConnectResponse { + pub port: String, + pub connected: bool, + pub message: String, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct SerialExportResponse { + pub path: String, + pub frame_count: usize, + pub message: String, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct SerialImportFrame { + pub data: Vec, + pub dts_ms: u64, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct SerialImportResponse { + pub file_name: String, + pub frame_count: usize, + pub channel_count: usize, + pub frames: Vec, + pub message: String, +} + +struct SerialSession { + port: String, + cancel: CancellationToken, + task: JoinHandle<()>, + current_record: SharedTestRecording, +} + +#[derive(Default)] +pub struct SerialConnectionState { + session: Mutex>, + last_record: Mutex> +} + +#[tauri::command] +pub fn serial_enum() -> Result, SerialError> { + let ports = available_ports() + .map_err(|_| SerialError::ScanError)? + .into_iter() + .map(|info| info.port_name) + .collect(); + + Ok(ports) +} + +#[tauri::command] +pub async fn serial_connect( + app: AppHandle, + port: String, + state: State<'_, SerialConnectionState>, +) -> Result { + let port_name = port.trim().to_string(); + if port_name.is_empty() { + return Err(SerialError::InvalidConfig); + } + + { + let session = state.session.lock().map_err(|_| SerialError::StateError)?; + if session.is_some() { + return Err(SerialError::AlreadyConnected); + } + } + + let cancel = CancellationToken::new(); + let current_record = Arc::new(Mutex::new(TestRecording::new())); + let task_record = current_record.clone(); + let task_cancel = cancel.clone(); + let task_app = app.clone(); + let task_port_name = port_name.clone(); + + let port = tokio_serial::new(&port_name, 115200) + .open_native_async() + .map_err(|_| SerialError::OpenError)?; + let session_started_at = Instant::now(); + + let task = tauri::async_runtime::spawn(async move { + let codec = TestCodec::new(); + let handler = TestHandler; + + if let Err(error) = serial::run_serial( + task_app.clone(), + port, + codec, + handler, + session_started_at, + task_record.clone(), + task_cancel, + ) + .await + { + eprintln!("serial task exited with error: {error}"); + } + + let manager = task_app.state::(); + if let Ok(mut last_record) = manager.last_record.lock() { + *last_record = Some(task_record); + } + + let mut session = match manager.session.lock() { + Ok(session) => session, + Err(_) => return, + }; + + { + let should_clear = session + .as_ref() + .map(|current| current.port.as_str() == task_port_name.as_str()) + .unwrap_or(false); + + if should_clear { + session.take(); + } + } + }); + + let mut session = state.session.lock().map_err(|_| SerialError::StateError)?; + if session.is_some() { + cancel.cancel(); + task.abort(); + return Err(SerialError::AlreadyConnected); + } + + *session = Some(SerialSession { + port: port_name.clone(), + cancel, + task, + current_record + }); + + Ok(SerialConnectResponse { + port: port_name, + connected: true, + message: "connected".to_string(), + }) +} + +#[tauri::command] +pub async fn serial_disconnect( + state: State<'_, SerialConnectionState>, +) -> Result { + let session = { + let mut guard = state.session.lock().map_err(|_| SerialError::StateError)?; + guard.take() + }; + + let Some(SerialSession { + port, + cancel, + task, + current_record, + }) = session + else { + return Ok(SerialConnectResponse { + port: String::new(), + connected: false, + message: "already disconnected".to_string(), + }); + }; + + cancel.cancel(); + let _ = task.await; + let frame_count = current_record.lock().map(|record| { + record.frames.len() + }).unwrap_or(0); + + info!("last_record has {} frames", frame_count); + + if let Ok(mut last_record) = state.last_record.lock() { + *last_record = Some(current_record); + } + + + Ok(SerialConnectResponse { + port, + connected: false, + message: "disconnected".to_string(), + }) +} + +#[tauri::command] +pub fn serial_export_csv( + app: AppHandle, + state: State<'_, SerialConnectionState>, +) -> Result { + let current_record = { + let session = state.session.lock().map_err(|_| SerialError::StateError)?; + session + .as_ref() + .map(|current_session| current_session.current_record.clone()) + }; + + let record = if let Some(recording) = current_record { + recording + } else { + let last_record = state.last_record.lock().map_err(|_| SerialError::StateError)?; + last_record.clone().ok_or(SerialError::NoRecordedData)? + }; + + let mut output_dir = match app.path().desktop_dir() { + Ok(path) => path, + Err(_) => std::env::current_dir().map_err(|_| SerialError::ExportError)?, + }; + + let timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| duration.as_millis()) + .unwrap_or_default(); + + output_dir.push(format!("joyson_export_{timestamp}.csv")); + let mut file = File::create(&output_dir).map_err(|_| SerialError::ExportError)?; + + let frame_count = { + let recording = record.lock().map_err(|_| SerialError::StateError)?; + if recording.frames.is_empty() { + return Err(SerialError::NoRecordedData); + } + + export_recording_csv(&recording, &mut file).map_err(|_| SerialError::ExportError)?; + recording.frames.len() + }; + + let path = output_dir.display().to_string(); + info!("csv exported to {path}, frame_count={frame_count}"); + + Ok(SerialExportResponse { + path, + frame_count, + message: "exported".to_string(), + }) +} + +#[tauri::command] +pub fn serial_import_csv(file_name: String, csv_content: String) -> Result { + let mut importer = TestCsvImporter::new(file_name.as_str()); + let packets = importer + .load(Cursor::new(csv_content.into_bytes())) + .map_err(|_| SerialError::ImportError)?; + + if packets.is_empty() { + return Err(SerialError::NoRecordedData); + } + + let channel_count = packets.first().map(|item| item.data.len()).unwrap_or(0); + let frame_count = packets.len(); + let frames = packets + .into_iter() + .map(|packet| SerialImportFrame { + data: packet.data, + dts_ms: packet.dts_ms, + }) + .collect(); + + Ok(SerialImportResponse { + file_name, + frame_count, + channel_count, + frames, + message: "imported".to_string(), + }) +} diff --git a/src-tauri/src/commands/window.rs b/src-tauri/src/commands/window.rs new file mode 100644 index 0000000..8b40618 --- /dev/null +++ b/src-tauri/src/commands/window.rs @@ -0,0 +1,32 @@ +use tauri::{AppHandle, Manager, WebviewWindow}; + +fn main_window(app: &AppHandle) -> Result { + app.get_webview_window("main") + .ok_or_else(|| "Can't find main window".to_string()) +} + +#[tauri::command] +pub fn win_minimize(app: AppHandle) -> Result<(), String> { + main_window(&app)? + .minimize() + .map_err(|error| error.to_string()) +} + +#[tauri::command] +pub fn win_toggle_maximize(app: AppHandle) -> Result<(), String> { + let window = main_window(&app)?; + let is_maximized = window.is_maximized().map_err(|error| error.to_string())?; + + if is_maximized { + window.unmaximize().map_err(|error| error.to_string()) + } else { + window.maximize().map_err(|error| error.to_string()) + } +} + +#[tauri::command] +pub fn win_close(app: AppHandle) -> Result<(), String> { + main_window(&app)? + .close() + .map_err(|error| error.to_string()) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000..c4a0f5f --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,23 @@ +mod commands; +pub mod serial_core; +pub mod log; +use commands::serial::SerialConnectionState; + +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .manage(SerialConnectionState::default()) + .plugin(tauri_plugin_opener::init()) + .invoke_handler(tauri::generate_handler![ + commands::serial::serial_enum, + commands::serial::serial_connect, + commands::serial::serial_disconnect, + commands::serial::serial_export_csv, + commands::serial::serial_import_csv, + commands::window::win_minimize, + commands::window::win_toggle_maximize, + commands::window::win_close + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/src/log.rs b/src-tauri/src/log.rs new file mode 100644 index 0000000..5596d5d --- /dev/null +++ b/src-tauri/src/log.rs @@ -0,0 +1,36 @@ +use fern::colors::{Color, ColoredLevelConfig}; +use log::{debug, error, info, trace, warn}; +use std::time::SystemTime; +pub fn setup_logger() { + let colors_line = ColoredLevelConfig::new() + .error(Color::Red) + .warn(Color::Yellow) + .info(Color::Green) + .debug(Color::White) + .trace(Color::BrightBlack); + + let colors_level = colors_line.info(Color::Green); + fern::Dispatch::new() + .format(move |out, message, record| { + out.finish( + format_args!( + "{colors_line}[{data} {level} {target} {colors_line}] {message}\x1B[0m", + colors_line = format_args!( + "\x1B[{}m", + colors_line.get_color(&record.level()).to_fg_str() + ), + data = humantime::format_rfc3339_seconds(SystemTime::now()), + target = record.target(), + level = colors_level.color(record.level()), + message = message, + ) + ); + }) + .level(log::LevelFilter::Info) + .chain(std::io::stdout()) + .chain(fern::DateBased::new("program.log", "%Y-%m-%d")) + .apply() + .unwrap(); + + debug!("logging initialized"); +} \ No newline at end of file diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..b9b3097 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,10 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] +use log::{debug, error, info, trace, warn}; +use tauri_demo_lib::log::setup_logger; + +fn main() { + setup_logger(); + debug!("logging initialized"); + tauri_demo_lib::run() +} diff --git a/src-tauri/src/serial_core/codec.rs b/src-tauri/src/serial_core/codec.rs new file mode 100644 index 0000000..bf37bee --- /dev/null +++ b/src-tauri/src/serial_core/codec.rs @@ -0,0 +1,6 @@ +use crate::serial_core::error::CodecError; +use std::time::Instant; +pub trait Codec { + fn decode(&mut self, input: &[u8], session_started_at: Instant) -> Result, CodecError>; + fn encode(&self, frame: &F) -> Result, CodecError>; +} diff --git a/src-tauri/src/serial_core/codecs/mod.rs b/src-tauri/src/serial_core/codecs/mod.rs new file mode 100644 index 0000000..8724916 --- /dev/null +++ b/src-tauri/src/serial_core/codecs/mod.rs @@ -0,0 +1,4 @@ +use crate::serial_core::{frame::TestFrame, record::Recording}; + +pub mod test; +pub type TestRecording = Recording; \ No newline at end of file diff --git a/src-tauri/src/serial_core/codecs/test.rs b/src-tauri/src/serial_core/codecs/test.rs new file mode 100644 index 0000000..2cf3c70 --- /dev/null +++ b/src-tauri/src/serial_core/codecs/test.rs @@ -0,0 +1,258 @@ +use std::io::Read; +use std::time::Instant; +use crate::serial_core::frame::{crc8, usize_to_u16_be_bytes, FrameHandler}; +use crate::serial_core::{codec::Codec, error::CodecError, frame::TestFrame}; +use anyhow::anyhow; +use async_trait::async_trait; +use chrono::Local; +use csv::StringRecord; +use crate::serial_core::record::{write_csv, CsvExporter, CsvImporter, RecordedFrame, Recording}; + +pub struct TestCodec { + buffer: Vec, +} + +pub struct TestHandler; + +impl TestCodec { + pub fn new() -> TestCodec { + Self { buffer: Vec::new() } + } +} + +impl Codec for TestCodec { + fn decode(&mut self, input: &[u8], session_started_at: Instant) -> Result, CodecError> { + self.buffer.extend_from_slice(input); + let mut frames = Vec::new(); + + loop { + if self.buffer.len() < 6 { + break; + } + + let header_pos = self.buffer.windows(2).position(|w| w == [0xAA, 0x55]); + + let Some(pos) = header_pos else { + self.buffer.clear(); + break; + }; + if pos > 0 { + self.buffer.drain(0..pos); + } + + if self.buffer.len() < 6 { + break; + } + + let cmd = self.buffer[2]; + let length_bytes = [self.buffer[3], self.buffer[4]]; + let length = u16::from_be_bytes(length_bytes) as usize; + let frame_length = (length + 6) as usize; + if self.buffer.len() < frame_length { + break; + } + let payload = self.buffer[5..5 + length].to_vec(); + let checksum = crc8(payload.as_slice()); + if self.buffer[frame_length - 1] != checksum { + self.buffer.drain(0..1); + continue; + } + let dts = elapsed_millis(session_started_at); + println!("dts_ms: {dts}"); + frames.push(TestFrame { + header: [0xAA, 0x55], + cmd: cmd, + length: length, + payload: payload, + checksum: checksum, + dts_ms: dts, + }); + + self.buffer.drain(0..frame_length); + } + + Ok(frames) + } + fn encode(&self, frame: &TestFrame) -> Result, CodecError> { + let _ = u16::try_from(frame.payload.len()).map_err(|_| CodecError::PayloadTooLarge)?; + let mut out = Vec::with_capacity(6 + frame.length); + out.extend_from_slice(&frame.header); + out.push(frame.cmd); + out.extend_from_slice(&usize_to_u16_be_bytes(frame.length)); + out.extend_from_slice(&frame.payload); + out.push(frame.checksum); + + Ok(out) + } +} + +#[async_trait] +impl FrameHandler for TestHandler { + async fn on_frame(&mut self, frame: &TestFrame) -> anyhow::Result>> { + match frame.cmd { + 0x01 => { + let vals = parse_data_frame(&frame.payload)?; + Ok(Some(vals)) + } + _ => Ok(None), + } + } +} + +fn parse_data_frame(data: &[u8]) -> Result, CodecError> { + if data.len() % 2 != 0 { + return Err(CodecError::InvalidLength); + } + + let vals: Vec = data + .chunks_exact(2) + .map(|chunk| u16::from_be_bytes([chunk[0], chunk[1]]) as i32) + .collect::>(); + + Ok(vals) +} + +fn elapsed_millis(start_at: Instant) -> u64 { + start_at.elapsed().as_millis() as u64 +} + +pub struct TestCsvExporter; +pub struct TestCsvImporter { + channels: usize, + data_row: usize, + packets: Vec, +} + +#[derive(Clone)] +pub struct TestDataPacket { + pub data: Vec, + pub dts_ms: u64 +} + +impl TryFrom<&TestFrame> for TestDataPacket { + type Error = CodecError; + fn try_from(frame: &TestFrame) -> Result { + let data = parse_data_frame(&frame.payload)?; + let dts = frame.dts_ms; + Ok(TestDataPacket { data: data, dts_ms: dts }) + } +} +// impl From for TestDataPacket { +// fn from(frame: TestFrame) -> Self { +// let data = parse_data_frame(&frame.payload)?; +// let dts = frame.dts_ms; +// TestDataPacket { data: data, dts_ms: dts } +// } +// } + + +impl CsvExporter for TestCsvExporter { + type Error = CodecError; + fn csv_header(&self, recording: &Recording) -> Vec { + let channel_nb = recording + .frames + .iter() + .find_map(|frame| parse_data_frame(&frame.frame.payload).ok().map(|vals| vals.len())) + .unwrap_or(0); + let mut header: Vec = Vec::new(); + for i in 0..channel_nb { + header.push(format!("channel{}", i + 1)); + } + header.push("dts".to_string()); + + header + } + + fn csv_row(&self, item: &RecordedFrame) -> anyhow::Result> { + let packet: TestDataPacket = TestDataPacket::try_from(&item.frame)?; + let mut row: Vec = packet.data.iter().map(|&x| x.to_string()).collect(); + row.push(packet.dts_ms.to_string()); + Ok(row) + } +} + +impl TestCsvImporter { + pub fn new(_path: &str) -> TestCsvImporter { + Self { + channels: 0, + data_row: 0, + packets: Vec::new(), + } + } + + fn parse_record(&mut self, record: StringRecord) -> anyhow::Result{ + if self.channels == 0 { + return Err(anyhow!("csv header is missing channel columns")); + } + + if record.len() < self.channels + 1 { + return Err(anyhow!("csv row has insufficient columns")); + } + + let mut data = Vec::with_capacity(self.channels); + for index in 0..self.channels { + let cell = record.get(index).ok_or_else(|| anyhow!("missing channel cell"))?; + data.push(cell.parse::()?); + } + + let dts_cell = record + .get(self.channels) + .ok_or_else(|| anyhow!("missing dts cell"))?; + let dts_ms = dts_cell.parse::()?; + + Ok(TestDataPacket { + data: data, + dts_ms: dts_ms, + }) + } +} + +impl CsvImporter for TestCsvImporter { + fn load(&mut self, reader: R) -> anyhow::Result> { + let mut rdr = csv::Reader::from_reader(reader); + let headers = rdr.headers()?.clone(); + self.channels = headers.len().saturating_sub(1); + self.data_row = 0; + self.packets.clear(); + + for record in rdr.records() { + let record = record?; + let packet = self.parse_record(record)?; + self.packets.push(packet); + self.data_row += 1; + } + + Ok(self.packets.clone()) + } +} + + +pub fn export_recording_csv(recording: &Recording, writer: W) -> anyhow::Result<()> +where + W: std::io::Write, +{ + let now = Local::now(); + let filename = format!("joyson_{}", now.format("%Y%m%d_%H%M%S")); + write_csv(recording, &TestCsvExporter, &filename) +} + +#[cfg(test)] +mod tests { + use super::*; + use csv::Reader; + use std::io::Cursor; + + #[test] + fn test_read_csv_basic() -> anyhow::Result<()> { + let mut rdr = Reader::from_path("recording_20260329_125238.csv")?; + let headers = rdr.headers()?; + println!("headers: {:?}", headers); + + for result in rdr.records() { + let record = result?; + println!("record: {:?}", record); + } + + Ok(()) + } +} diff --git a/src-tauri/src/serial_core/error.rs b/src-tauri/src/serial_core/error.rs new file mode 100644 index 0000000..a7f38df --- /dev/null +++ b/src-tauri/src/serial_core/error.rs @@ -0,0 +1,52 @@ +use serde::Serialize; +use std::fmt; + +#[derive(Debug, Serialize)] +pub enum SerialError { + OpenError, + CloseError, + ScanError, + InvalidConfig, + AlreadyConnected, + StateError, + NoRecordedData, + ExportError, + ImportError, +} + +impl fmt::Display for SerialError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + SerialError::OpenError => write!(f, "Opening Error"), + SerialError::CloseError => write!(f, "Closing Error"), + SerialError::ScanError => write!(f, "Scan Error"), + SerialError::InvalidConfig => write!(f, "Invalid Config"), + SerialError::AlreadyConnected => write!(f, "Already Connected"), + SerialError::StateError => write!(f, "State Error"), + SerialError::NoRecordedData => write!(f, "No Recorded Data"), + SerialError::ExportError => write!(f, "Export Error"), + SerialError::ImportError => write!(f, "Import Error"), + } + } +} + +#[derive(Debug)] +pub enum CodecError { + InvalidHeader, + InvalidTail, + InvalidLength, + PayloadTooLarge, +} + +impl fmt::Display for CodecError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + CodecError::InvalidHeader => write!(f, "Invalid Header"), + CodecError::InvalidTail => write!(f, "Invalid Tail"), + CodecError::InvalidLength => write!(f, "Invalid Length"), + CodecError::PayloadTooLarge => write!(f, "Payload too large"), + } + } +} + +impl std::error::Error for CodecError {} diff --git a/src-tauri/src/serial_core/frame.rs b/src-tauri/src/serial_core/frame.rs new file mode 100644 index 0000000..330c506 --- /dev/null +++ b/src-tauri/src/serial_core/frame.rs @@ -0,0 +1,43 @@ +use anyhow::Result; +use async_trait::async_trait; +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct TestFrame { + pub header: [u8; 2], + pub cmd: u8, + pub length: usize, + pub payload: Vec, + pub checksum: u8, + pub dts_ms: u64 +} + + + +#[async_trait] +pub trait FrameHandler: Send { + async fn on_frame(&mut self, frame: &F) -> Result>>; +} + +pub fn usize_to_u16_be_bytes(n: usize) -> [u8; 2] { + (n as u16).to_be_bytes() +} + +pub fn usize_to_u16_le_bytes(n: usize) -> [u8; 2] { + (n as u16).to_be_bytes() +} + +pub fn crc8(data: &[u8]) -> u8 { + let mut crc: u8 = 0x00; + + for &byte in data { + crc ^= byte; + for _ in 0..8 { + if (crc & 0x80) != 0 { + crc = (crc << 1) ^ 0x07; + } else { + crc <<= 1; + } + } + } + + crc +} diff --git a/src-tauri/src/serial_core/mod.rs b/src-tauri/src/serial_core/mod.rs new file mode 100644 index 0000000..eacaeb8 --- /dev/null +++ b/src-tauri/src/serial_core/mod.rs @@ -0,0 +1,27 @@ +use crate::serial_core::{frame::TestFrame, record::Recording}; + +pub mod codec; +pub mod codecs; +pub mod error; +pub mod frame; +pub mod model; +pub mod serial; +pub mod record; + +pub type TestRecording = Recording; + +pub struct SerialConnection { + pub port: String, +} + +pub fn connect(port: &str) -> Result { + let port = port.trim(); + + if port.is_empty() { + return Err("Serial port is required".to_string()); + } + + Ok(SerialConnection { + port: port.to_string(), + }) +} diff --git a/src-tauri/src/serial_core/model.rs b/src-tauri/src/serial_core/model.rs new file mode 100644 index 0000000..ce5b9e9 --- /dev/null +++ b/src-tauri/src/serial_core/model.rs @@ -0,0 +1,500 @@ +use crate::serial_core::frame::TestFrame; +use std::collections::HashMap; +use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH}; + +const MAX_POINTS: usize = 28; +const MAX_SUMMARY_POINTS: usize = 42; +const PANEL_STALE_AFTER: Duration = Duration::from_millis(2400); + +#[derive(serde::Serialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct HudPacket { + pub ts: u64, + pub panels: Vec, + pub summary: HudSummary, + pub pressure_matrix: Option>, +} + +#[derive(serde::Serialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct HudSummary { + pub label: String, + pub points: Vec, + pub latest: Option, + pub min: Option, + pub max: Option, +} + +#[derive(serde::Serialize, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum HudPanelSide { + Left, + Right, +} + +#[derive(serde::Serialize, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum HudTone { + Cyan, + Lime, + Orange, + Violet, + Gold, + Rose, +} + +#[derive(serde::Serialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct HudSignalPanel { + pub id: String, + pub code: String, + pub title: String, + pub side: HudPanelSide, + pub active: bool, + pub series: Vec, + pub icons: Vec, + pub latest: Option, + pub min: Option, + pub max: Option, +} + +#[derive(serde::Serialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct HudSignalSeries { + pub id: String, + pub tone: HudTone, + pub points: Vec, +} + +#[derive(serde::Serialize, Clone)] +#[serde(rename_all = "camelCase")] +pub struct HudSignalIcon { + pub id: String, + pub label: String, + pub tone: HudTone, +} + +struct HudPanelUpdate { + source_id: String, + values: Vec, +} + +struct PanelEntry { + panel: HudSignalPanel, + last_seen: Instant, +} + +pub struct HudChartState { + panels: HashMap, + order: Vec, + summary_points: Vec, + pressure_matrix: Option>, + last_frame_seen: Option, +} + +impl HudChartState { + pub fn new() -> Self { + Self { + panels: HashMap::new(), + order: Vec::new(), + summary_points: Vec::new(), + pressure_matrix: None, + last_frame_seen: None, + } + } + + pub fn record_summary(&mut self, value: f32) { + push_summary_point(&mut self.summary_points, value); + } + + pub fn record_pressure_matrix(&mut self, values: &[i32]) { + if values.is_empty() { + return; + } + + self.pressure_matrix = Some(values.iter().map(|value| *value as f32).collect()); + } + + pub fn apply_frame(&mut self, frame: &TestFrame, decoded_values: Option<&[i32]>) -> HudPacket { + let now = Instant::now(); + self.last_frame_seen = Some(now); + + for update in expand_frame_updates(frame, decoded_values) { + self.apply_update(update, now); + } + + self.prune_stale_at(now); + self.snapshot() + } + + pub fn prune_stale(&mut self) -> Option { + let before = self.panels.len(); + let summary_points_before = self.summary_points.len(); + self.prune_stale_at(Instant::now()); + + if before == self.panels.len() && summary_points_before == self.summary_points.len() { + return None; + } + + Some(self.snapshot()) + } + + fn apply_update(&mut self, update: HudPanelUpdate, now: Instant) { + if update.values.is_empty() { + return; + } + + if !self.panels.contains_key(&update.source_id) { + let next_side = side_for_index(self.order.len()); + self.order.push(update.source_id.clone()); + self.panels.insert( + update.source_id.clone(), + PanelEntry { + panel: build_panel(&update.source_id, next_side, update.values.len()), + last_seen: now, + }, + ); + } + + let entry = self + .panels + .get_mut(&update.source_id) + .expect("panel entry should exist after insertion"); + + entry.last_seen = now; + entry.panel.active = true; + ensure_panel_channels(&mut entry.panel, update.values.len()); + + for (index, value) in update.values.into_iter().enumerate() { + if let Some(series) = entry.panel.series.get_mut(index) { + push_point(&mut series.points, value); + } + } + + refresh_panel_stats(&mut entry.panel); + } + + fn prune_stale_at(&mut self, now: Instant) { + self.panels + .retain(|_, entry| now.duration_since(entry.last_seen) <= PANEL_STALE_AFTER); + self.order.retain(|id| self.panels.contains_key(id)); + + let summary_stale = self + .last_frame_seen + .map(|last_seen| now.duration_since(last_seen) > PANEL_STALE_AFTER) + .unwrap_or(false); + + if summary_stale { + self.summary_points.clear(); + self.pressure_matrix = None; + self.last_frame_seen = None; + } + } + + fn snapshot(&mut self) -> HudPacket { + self.rebalance_sides(); + + let panels = self + .order + .iter() + .filter_map(|id| self.panels.get(id).map(|entry| entry.panel.clone())) + .collect(); + + HudPacket { + ts: now_millis(), + panels, + summary: build_summary(&self.summary_points), + pressure_matrix: self.pressure_matrix.clone(), + } + } + + fn rebalance_sides(&mut self) { + for (index, id) in self.order.iter().enumerate() { + if let Some(entry) = self.panels.get_mut(id) { + entry.panel.side = side_for_index(index); + } + } + } +} + +impl Default for HudChartState { + fn default() -> Self { + Self::new() + } +} + +fn build_panel(source_id: &str, side: HudPanelSide, channel_count: usize) -> HudSignalPanel { + HudSignalPanel { + id: format!("panel-{source_id}"), + code: source_id.to_string(), + title: format!("Source {source_id}"), + side, + active: true, + series: build_panel_series(source_id, channel_count, &[]), + icons: build_panel_icons(source_id, channel_count), + latest: None, + min: None, + max: None, + } +} + +fn expand_frame_updates(frame: &TestFrame, decoded_values: Option<&[i32]>) -> Vec { + if let Some(values) = decoded_values { + if values.is_empty() { + return Vec::new(); + } + + return vec![HudPanelUpdate { + source_id: format_source_id(frame.cmd), + values: values.iter().map(|value| *value as f32).collect(), + }]; + } + + let chunks = frame.payload.chunks_exact(4); + + if !frame.payload.is_empty() && chunks.remainder().is_empty() { + return chunks.map(build_update_from_chunk).collect(); + } + + vec![HudPanelUpdate { + source_id: format_source_id(frame.cmd), + values: fallback_values(frame), + }] +} + +fn build_update_from_chunk(chunk: &[u8]) -> HudPanelUpdate { + HudPanelUpdate { + source_id: format_source_id(chunk[0]), + values: chunk[1..] + .iter() + .enumerate() + .map(|(index, byte)| normalize_value(*byte, tone_for_index(index))) + .collect(), + } +} + +fn fallback_values(frame: &TestFrame) -> Vec { + let mut bytes = frame.payload.clone(); + + if bytes.is_empty() { + bytes.extend([ + frame.cmd, + frame.length as u8, + frame.checksum, + frame.cmd.wrapping_add(frame.checksum), + ]); + } + + while bytes.len() < 3 { + let previous = *bytes.last().unwrap_or(&frame.cmd); + bytes.push( + previous + .wrapping_add(frame.cmd) + .wrapping_add(bytes.len() as u8), + ); + } + + bytes + .into_iter() + .enumerate() + .map(|(index, byte)| normalize_value(byte, tone_for_index(index))) + .collect() +} + +fn normalize_value(byte: u8, tone: HudTone) -> f32 { + let base = (byte as f32 / 255.0) * 100.0; + let offset = match tone { + HudTone::Cyan => 6.0, + HudTone::Lime => 0.0, + HudTone::Orange => -6.0, + HudTone::Violet => 10.0, + HudTone::Gold => -10.0, + HudTone::Rose => 3.0, + }; + + (base + offset).clamp(0.0, 100.0) +} + +fn format_source_id(byte: u8) -> String { + if byte.is_ascii_alphanumeric() { + (byte as char).to_ascii_uppercase().to_string() + } else { + format!("CH{:02X}", byte) + } +} + +fn side_for_index(index: usize) -> HudPanelSide { + if index % 2 == 0 { + HudPanelSide::Left + } else { + HudPanelSide::Right + } +} + +fn push_point(points: &mut Vec, value: f32) { + if points.len() >= MAX_POINTS { + points.remove(0); + } + + points.push((value * 10.0).round() / 10.0); +} + +fn build_panel_series( + source_id: &str, + channel_count: usize, + previous: &[HudSignalSeries], +) -> Vec { + (0..channel_count) + .map(|index| HudSignalSeries { + id: format!("{source_id}-series-{}", index + 1), + tone: tone_for_index(index), + points: previous + .get(index) + .map(|series| series.points.clone()) + .unwrap_or_default(), + }) + .collect() +} + +fn build_panel_icons(source_id: &str, channel_count: usize) -> Vec { + (0..channel_count) + .map(|index| HudSignalIcon { + id: format!("{source_id}-icon-{}", index + 1), + label: if channel_count == 1 { + "TOTAL".to_string() + } else { + format!("{source_id}-{}", index + 1) + }, + tone: tone_for_index(index), + }) + .collect() +} + +fn ensure_panel_channels(panel: &mut HudSignalPanel, channel_count: usize) { + if panel.series.len() == channel_count && panel.icons.len() == channel_count { + return; + } + + panel.series = build_panel_series(&panel.code, channel_count, &panel.series); + panel.icons = build_panel_icons(&panel.code, channel_count); +} + +fn refresh_panel_stats(panel: &mut HudSignalPanel) { + let latest_values: Vec = panel + .series + .iter() + .filter_map(|series| series.points.last().copied()) + .collect(); + + panel.latest = if latest_values.is_empty() { + None + } else { + Some(latest_values.iter().sum::() / latest_values.len() as f32) + }; + + panel.min = panel + .series + .iter() + .flat_map(|series| series.points.iter().copied()) + .reduce(f32::min); + + panel.max = panel + .series + .iter() + .flat_map(|series| series.points.iter().copied()) + .reduce(f32::max); +} + +fn tone_for_index(index: usize) -> HudTone { + match index % 6 { + 0 => HudTone::Cyan, + 1 => HudTone::Lime, + 2 => HudTone::Orange, + 3 => HudTone::Violet, + 4 => HudTone::Gold, + _ => HudTone::Rose, + } +} + +fn push_summary_point(points: &mut Vec, value: f32) { + if points.len() >= MAX_SUMMARY_POINTS { + points.remove(0); + } + + points.push((value * 10.0).round() / 10.0); +} + +fn build_summary(points: &[f32]) -> HudSummary { + HudSummary { + label: "TOTAL".to_string(), + points: points.to_vec(), + latest: points.last().copied(), + min: points.iter().copied().reduce(f32::min), + max: points.iter().copied().reduce(f32::max), + } +} + +fn now_millis() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| duration.as_millis() as u64) + .unwrap_or_default() +} + +// #[cfg(test)] +// mod tests { +// use super::*; +// +// fn sample_frame() -> TestFrame { +// TestFrame { +// header: [0xAA, 0x55], +// cmd: 0x01, +// length: 4, +// payload: vec![0x00, 0x0A, 0x00, 0x14], +// checksum: 0, +// +// } +// } +// +// #[test] +// fn prune_stale_clears_panels_and_summary_after_timeout() { +// let mut state = HudChartState::new(); +// let frame = sample_frame(); +// +// state.record_summary(30.0); +// let _ = state.apply_frame(&frame, Some(&[10, 20])); +// +// let stale_now = Instant::now(); +// let stale_seen = stale_now - PANEL_STALE_AFTER - Duration::from_millis(1); +// +// state.last_frame_seen = Some(stale_seen); +// +// for entry in state.panels.values_mut() { +// entry.last_seen = stale_seen; +// } +// +// let packet = state +// .prune_stale() +// .expect("stale data should emit an update"); +// +// assert!(packet.panels.is_empty()); +// assert!(packet.summary.points.is_empty()); +// assert!(state.panels.is_empty()); +// assert!(state.summary_points.is_empty()); +// } +// +// #[test] +// fn prune_stale_keeps_recent_summary_points() { +// let mut state = HudChartState::new(); +// let frame = sample_frame(); +// +// state.record_summary(30.0); +// let _ = state.apply_frame(&frame, Some(&[10, 20])); +// +// state.last_frame_seen = Some(Instant::now()); +// +// assert!(state.prune_stale().is_none()); +// assert_eq!(state.summary_points, vec![30.0]); +// assert_eq!(state.panels.len(), 1); +// } +// } diff --git a/src-tauri/src/serial_core/record.rs b/src-tauri/src/serial_core/record.rs new file mode 100644 index 0000000..48c4b6c --- /dev/null +++ b/src-tauri/src/serial_core/record.rs @@ -0,0 +1,64 @@ +use std::fs::{write, File}; +use std::io; +use anyhow::{Result, anyhow}; +use csv::Reader; + +#[derive(Clone)] +pub struct FrameTiming { + pub pts_ms: Option, + pub dts_ms: u64, +} + +#[derive(Clone)] +pub struct RecordedFrame { + pub timing: FrameTiming, + pub frame: F +} + +#[derive(Clone, Default)] +pub struct Recording { + pub frames: Vec> +} + +impl Recording { + pub fn new() -> Recording { Self { frames: Vec::new() } } + pub fn push(&mut self, ite: RecordedFrame) { + self.frames.push(ite); + } +} + +pub trait CsvExporter { + type Error: std::error::Error + Send + Sync + 'static; + fn csv_header(&self, recording: &Recording) -> Vec; + fn csv_row(&self, item: &RecordedFrame) -> anyhow::Result>; +} + +// TODO: CsvImporter +pub trait CsvImporter

{ + fn load(&mut self, reader: R) -> anyhow::Result>; +} + +pub fn write_csv( + recording: &Recording, + exporter: &E, + path: &str + // mut writer: W, +) -> anyhow::Result<()> +where + E: CsvExporter, + // W: std::io::Write +{ + let header = exporter.csv_header(&recording); + // let mut wrt = csv::Writer::from_writer(io::stdout()); + + let mut wrt = csv::Writer::from_path(format!("{}.csv", path))?; + wrt.write_record(header)?; + for f in &recording.frames { + let row = exporter.csv_row(f)?; + wrt.write_record(&row)?; + } + + wrt.flush()?; + + Ok(()) +} diff --git a/src-tauri/src/serial_core/serial.rs b/src-tauri/src/serial_core/serial.rs new file mode 100644 index 0000000..7b38e31 --- /dev/null +++ b/src-tauri/src/serial_core/serial.rs @@ -0,0 +1,80 @@ +use crate::serial_core::codec::Codec; +use crate::serial_core::frame::{FrameHandler, TestFrame}; +use crate::serial_core::model::HudChartState; +use anyhow::Result; +use tauri::{AppHandle, Emitter}; +use tokio::io::AsyncReadExt; +use tokio::time::{self, Duration, MissedTickBehavior}; +use tokio_serial::SerialStream; +use tokio_util::sync::CancellationToken; +use std::sync::{Arc, Mutex}; +use std::time::Instant; +use log::info; +use crate::serial_core::record::{FrameTiming, RecordedFrame}; +use crate::serial_core::TestRecording; + +pub async fn run_serial( + app: AppHandle, + mut port: SerialStream, + mut codec: C, + mut handler: H, + session_started_at: Instant, + recording: Arc>, + cancel: CancellationToken, +) -> Result<()> +where + C: Codec + Send + 'static, + H: FrameHandler + Send + 'static, + T: Into, +{ + let mut chart_state = HudChartState::new(); + let mut buffer = [0u8; 1024]; + let mut prune_interval = time::interval(Duration::from_millis(450)); + prune_interval.set_missed_tick_behavior(MissedTickBehavior::Delay); + + loop { + tokio::select! { + _ = cancel.cancelled() => break, + _ = prune_interval.tick() => { + if let Some(packet) = chart_state.prune_stale() { + app.emit("hud_stream", packet)?; + } + } + read_result = port.read(&mut buffer) => { + let n = read_result?; + if n == 0 { + continue; + } + + let frames = codec.decode(&buffer[..n], session_started_at)?; + for frame in frames { + let decode_res = handler + .on_frame(&frame) + .await? + .map(|vals| vals.into_iter().map(Into::into).collect::>()); + + let mut record = recording.lock().map_err(|_| anyhow::anyhow!("recording state poisoned"))?; + record.push(RecordedFrame{ + timing: FrameTiming { pts_ms: None, dts_ms: frame.dts_ms }, + frame: frame.clone(), + }); + + let display_values = if let Some(vals) = decode_res.as_ref() { + let summary = vals.iter().copied().sum::(); + info!("dot value summary: {}", summary); + chart_state.record_summary(summary as f32); + chart_state.record_pressure_matrix(vals.as_slice()); + Some(vec![summary]) + } else { + None + }; + + let packet = chart_state.apply_frame(&frame, display_values.as_deref()); + app.emit("hud_stream", packet)?; + } + } + } + } + + Ok(()) +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..48c57d2 --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "tauri-demo", + "version": "0.1.0", + "identifier": "com.lenn.tauri-serial", + "build": { + "beforeDevCommand": "npm run dev", + "devUrl": "http://localhost:1420", + "beforeBuildCommand": "npm run build", + "frontendDist": "../build" + }, + "app": { + "windows": [ + { + "title": "joyson-serial", + "width": 1366, + "height": 860, + "decorations": false + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.ico", + "icons/icon.png" + ] + } +} diff --git a/src/app.html b/src/app.html new file mode 100644 index 0000000..92e7e33 --- /dev/null +++ b/src/app.html @@ -0,0 +1,13 @@ + + + + + + + Tauri + SvelteKit + Typescript App + %sveltekit.head% + + +

%sveltekit.body%
+ + diff --git a/src/lib/components/CenterStage.svelte b/src/lib/components/CenterStage.svelte new file mode 100644 index 0000000..5d1fa19 --- /dev/null +++ b/src/lib/components/CenterStage.svelte @@ -0,0 +1,774 @@ + + +
+
+
+
+
+

WebGL2 Stage

+

{title}

+

{hint}

+
+

+ {statusText} +

+
+ +
+ {#key `${matrixRows}x${matrixCols}`} + + {/key} +
+ + {#if showConfigPanel} +
+ dispatch("configclose")} + /> +
+ {/if} + +
+ + + +
+ + {#if replayHasData} + + {/if} + +
+ +
+
+
+
+ + diff --git a/src/lib/components/ConfigPanel.svelte b/src/lib/components/ConfigPanel.svelte new file mode 100644 index 0000000..9421fa3 --- /dev/null +++ b/src/lib/components/ConfigPanel.svelte @@ -0,0 +1,460 @@ + + +
+
+
+

Stage Config

+

{title}

+

{hint}

+
+ + +
+ +
+
+

{matrixSizeLabel}

+

{matrixRows} x {matrixCols}

+
+ +
+ {#each presetSizes as size} + + {/each} +
+ +
+ + + +
+
+ +
+
+

{rangeLabel}

+

{rangeMin} - {rangeMax}

+
+ +
+ + + +
+
+ +
+
+

{colorMapLabel}

+

{selectedColorMap?.label ?? colorMapPreset}

+
+ +
+ {#each colorMapOptions as option} + + {/each} +
+
+ +
+

{applyLiveHint}

+ +
+
+ + diff --git a/src/lib/components/HudPanel.svelte b/src/lib/components/HudPanel.svelte new file mode 100644 index 0000000..b52c82b --- /dev/null +++ b/src/lib/components/HudPanel.svelte @@ -0,0 +1,970 @@ + + +
+
+
+ + {appName} + {suiteName} +
+ +
+ + + +
+
+ +
+
+ + +
+ + {connectionLabel} + {connectionText} +
+ + + + + + + + + + + + +
+ + +
+
+ + {#if connectionNotice} +

+ {connectionNotice} +

+ {/if} + +
+
+

{deviceLabel}

+

{deviceValue}

+
+
+

{sampleRateLabel}

+

{sampleRateValue}

+
+
+

{channelsLabel}

+

{channelsValue}

+
+
+
+
+ + diff --git a/src/lib/components/PressureMatrixViewer.svelte b/src/lib/components/PressureMatrixViewer.svelte new file mode 100644 index 0000000..03caa43 --- /dev/null +++ b/src/lib/components/PressureMatrixViewer.svelte @@ -0,0 +1,654 @@ + + +
+ + + + + + +
+
+

Pressure Matrix

+
+
+ Total Pressure + {stats.total.toFixed(0)} +
+
+ Max + {stats.max.toFixed(0)} +
+
+ Avg + {stats.avg.toFixed(0)} +
+
+

{statsNote}

+
+
+
+ + diff --git a/src/lib/components/SignalChart.svelte b/src/lib/components/SignalChart.svelte new file mode 100644 index 0000000..c86d403 --- /dev/null +++ b/src/lib/components/SignalChart.svelte @@ -0,0 +1,452 @@ + + +
+
+
+

{panel.code}

+

{panel.title}

+
+ + +
+ +
+ + + {#each [6, 12, 18, 24, 30] as y} + + {/each} + + + {#each renderedSeries as series (series.id)} + {#if series.linePath} + + {/if} + {/each} + + + +
+ +
+

+ + Now + {latestValue} +

+

+ + Max + {maxValue} +

+

+ + Min + {minValue} +

+
+
+ + diff --git a/src/lib/components/SummaryCurve.svelte b/src/lib/components/SummaryCurve.svelte new file mode 100644 index 0000000..5c6f2cf --- /dev/null +++ b/src/lib/components/SummaryCurve.svelte @@ -0,0 +1,436 @@ + + +
+
+
+

TOT

+

{summary.label}

+
+ + +
+ +
+ + + + + + + + + + + {#if areaPath} + + {/if} + + {#if linePath} + + {/if} + + {#if lastPoint} + + {/if} + + + {#if sampleCount === 0} +
+ Waiting +
+ {/if} +
+ +
+

+ + Now + {latestValue} +

+

+ + Min + {minValue} +

+

+ + Max + {maxValue} +

+
+
+ + diff --git a/src/lib/config/color-map.ts b/src/lib/config/color-map.ts new file mode 100644 index 0000000..896dc6e --- /dev/null +++ b/src/lib/config/color-map.ts @@ -0,0 +1,57 @@ +import type { PressureColorMapPreset } from "$lib/types/hud"; + +export interface PressureColorPalette { + surfaceBase: string; + surfaceLow: string; + surfaceMid: string; + surfaceHigh: string; + surfaceHot: string; + labelZero: string; + labelLow: string; + labelMid: string; + labelHigh: string; + rangeStops: [string, string, string, string, string, string]; + rangeGlow: [string, string, string]; +} + +export const pressureColorPalettes: Record = { + emerald: { + surfaceBase: "#13201a", + surfaceLow: "#285338", + surfaceMid: "#3f8a66", + surfaceHigh: "#6dd3ad", + surfaceHot: "#d9fff0", + labelZero: "#2d8d59", + labelLow: "#54df8e", + labelMid: "#98e6ff", + labelHigh: "#ffab78", + rangeStops: ["#13201a", "#285338", "#3f8a66", "#6dd3ad", "#98e6ff", "#ffab78"], + rangeGlow: ["#54df8e", "#98e6ff", "#ffab78"] + }, + arctic: { + surfaceBase: "#08141d", + surfaceLow: "#14354d", + surfaceMid: "#1f6690", + surfaceHigh: "#58bee8", + surfaceHot: "#f1fdff", + labelZero: "#3f87ae", + labelLow: "#6dc8ff", + labelMid: "#aef3ff", + labelHigh: "#ffffff", + rangeStops: ["#08141d", "#14354d", "#1f6690", "#58bee8", "#aef3ff", "#ffffff"], + rangeGlow: ["#5ea9ff", "#7fe5ff", "#ffffff"] + }, + ember: { + surfaceBase: "#1b0c08", + surfaceLow: "#4a1f15", + surfaceMid: "#8f4124", + surfaceHigh: "#d9772f", + surfaceHot: "#fff1d8", + labelZero: "#b9582f", + labelLow: "#ff8a4e", + labelMid: "#ffd06a", + labelHigh: "#fff4df", + rangeStops: ["#1b0c08", "#4a1f15", "#8f4124", "#d9772f", "#ffd06a", "#fff4df"], + rangeGlow: ["#ff7247", "#ffb14d", "#fff4df"] + } +}; diff --git a/src/lib/styles/theme.css b/src/lib/styles/theme.css new file mode 100644 index 0000000..40ecacc --- /dev/null +++ b/src/lib/styles/theme.css @@ -0,0 +1,50 @@ +:root { + color-scheme: dark; + --hud-bg-00: #000000; + --hud-bg-10: #050607; + --hud-bg-20: #0b0e11; + --hud-bg-30: #030405; + + --hud-cyan: #3ee8ff; + --hud-lime: #85ff44; + --hud-orange: #ff5b3f; + --hud-range-0: #13201a; + --hud-range-1: #285338; + --hud-range-2: #3f8a66; + --hud-range-3: #6dd3ad; + --hud-range-4: #98e6ff; + --hud-range-5: #ffab78; + + --hud-text-main: #cfe7ff; + --hud-text-dim: #86a2b8; + + /* Keep root surface close to the main board style to avoid visible drag-edge seams. */ + background: + radial-gradient(circle at 18% 8%, rgb(62 232 255 / 0.05), transparent 38%), + radial-gradient(circle at 84% 14%, rgb(133 255 68 / 0.04), transparent 36%), + linear-gradient(165deg, var(--hud-bg-20) 0%, var(--hud-bg-10) 48%, var(--hud-bg-30) 100%); + background-color: var(--hud-bg-00); +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html, +body { + width: 100%; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; +} + +body { + font-family: "Rajdhani", "Segoe UI", "PingFang SC", sans-serif; + color: var(--hud-text-main); + background: inherit; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; +} diff --git a/src/lib/types/hud.ts b/src/lib/types/hud.ts new file mode 100644 index 0000000..2576492 --- /dev/null +++ b/src/lib/types/hud.ts @@ -0,0 +1,144 @@ +export type LocaleCode = "zh-CN" | "en-US"; + +export type WindowControlAction = "minimize" | "toggle-maximize" | "close"; + +export type ConnectionState = "online" | "connecting" | "offline"; + +export type StageStatusTone = "ok" | "warn" | "idle"; +export type HudNoticeTone = "ok" | "warn" | "info"; + +export type SignalTone = "cyan" | "lime" | "orange" | "violet" | "gold" | "rose"; +export type PressureColorMapPreset = "emerald" | "arctic" | "ember"; + +export type SignalPanelSide = "left" | "right"; + +export type HudConfigTone = "neutral" | "cyan" | "lime" | "orange"; + +export interface HudSignalSeries { + id: string; + tone: SignalTone; + points: number[]; +} + +export interface HudSignalIcon { + id: string; + label: string; + tone: SignalTone; +} + +export interface HudSignalPanel { + id: string; + code: string; + title: string; + side: SignalPanelSide; + active: boolean; + series: HudSignalSeries[]; + icons: HudSignalIcon[]; + latest: number | null; + min: number | null; + max: number | null; +} + +export interface HudPacket { + ts: number; + panels: HudSignalPanel[]; + summary: HudSummary; + pressureMatrix: number[] | null; +} + +export interface HudSummary { + label: string; + points: number[]; + latest: number | null; + min: number | null; + max: number | null; +} + +export interface HudConfigLink { + id: string; + label: string; + tone?: HudConfigTone; + active?: boolean; +} + +export interface HudColorMapOption { + id: PressureColorMapPreset; + label: string; + previewStops: [string, string, string]; +} + +export interface HudCopy { + appName: string; + suiteName: string; + stageTitle: string; + stageHint: string; + configPanelTitle: string; + configPanelHint: string; + matrixSizeLabel: string; + matrixRowsLabel: string; + matrixColsLabel: string; + rangeLabel: string; + rangeMinLabel: string; + rangeMaxLabel: string; + colorMapLabel: string; + resetConfigLabel: string; + applyLiveHint: string; + runtimeReady: string; + runtimeFallback: string; + controlArea: string; + serialPortLabel: string; + connectionLabel: string; + deviceLabel: string; + sampleRateLabel: string; + channelsLabel: string; + configLinksLabel: string; + refreshPortsLabel: string; + connectActionLabel: string; + disconnectActionLabel: string; + exportActionLabel: string; + exportingActionLabel: string; + importActionLabel: string; + replaySectionLabel: string; + replayPlayLabel: string; + replayPauseLabel: string; + replayStopLabel: string; + replaySpeedLabel: string; + replayProgressLabel: string; + replayEmptyHint: string; + connectedLabel: string; + connectingLabel: string; + disconnectedLabel: string; +} + +export interface HudMatrixConfig { + rows: number; + cols: number; + rangeMin: number; + rangeMax: number; + colorMapPreset: PressureColorMapPreset; +} + +export interface SerialConnectResult { + port: string; + connected: boolean; + message: string; +} + +export interface SerialExportResult { + path: string; + frameCount: number; + message: string; +} + +export interface SerialImportFrameResult { + data: number[]; + dtsMs: number; +} + +export interface SerialImportResult { + fileName: string; + frameCount: number; + channelCount: number; + frames: SerialImportFrameResult[]; + message: string; +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..8209bfd --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/routes/+layout.ts b/src/routes/+layout.ts new file mode 100644 index 0000000..9d24899 --- /dev/null +++ b/src/routes/+layout.ts @@ -0,0 +1,5 @@ +// Tauri doesn't have a Node.js server to do proper SSR +// so we use adapter-static with a fallback to index.html to put the site in SPA mode +// See: https://svelte.dev/docs/kit/single-page-apps +// See: https://v2.tauri.app/start/frontend/sveltekit/ for more info +export const ssr = false; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 0000000..4aa1c5a --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,1445 @@ + + +
+ + +
+ + + (isConfigPanelOpen = false)} + > +
+

Range

+
+ {#each rangeTicks as tick} + {tick} + {/each} +
+
+
+
+
+ + diff --git a/static/favicon.png b/static/favicon.png new file mode 100644 index 0000000..825b9e6 Binary files /dev/null and b/static/favicon.png differ diff --git a/static/svelte.svg b/static/svelte.svg new file mode 100644 index 0000000..c5e0848 --- /dev/null +++ b/static/svelte.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/tauri.svg b/static/tauri.svg new file mode 100644 index 0000000..31b62c9 --- /dev/null +++ b/static/tauri.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/vite.svg b/static/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/static/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svelte.config.js b/svelte.config.js new file mode 100644 index 0000000..a7830ea --- /dev/null +++ b/svelte.config.js @@ -0,0 +1,18 @@ +// Tauri doesn't have a Node.js server to do proper SSR +// so we use adapter-static with a fallback to index.html to put the site in SPA mode +// See: https://svelte.dev/docs/kit/single-page-apps +// See: https://v2.tauri.app/start/frontend/sveltekit/ for more info +import adapter from "@sveltejs/adapter-static"; +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + preprocess: vitePreprocess(), + kit: { + adapter: adapter({ + fallback: "index.html", + }), + }, +}; + +export default config; diff --git a/tauri-event.md b/tauri-event.md new file mode 100644 index 0000000..e34ee9e --- /dev/null +++ b/tauri-event.md @@ -0,0 +1,554 @@ +# Tauri Event Demo + +这份笔记对应当前工程里的“串口后台任务 -> Tauri event -> 前端折线图”这条链路。 + +目标是把一类很常见的需求拆清楚: + +- 前端点一次按钮,调用 Rust command +- Rust 启动一个长期运行的后台任务 +- 后台任务持续读取数据 +- 每拿到一帧数据,就通过 Tauri event 推给前端 +- 前端监听 event,直接刷新图表 + +## 0. 2026-03-25 需求更新(WebGL 点阵改用真实数据) + +这次改动的目标是: + +- WebGL dot matrix 不再使用虚拟 demo 数据 +- 直接消费串口解析后的真实通道值 +- 默认矩阵大小改为 `row=12, col=7` + +### 是否需要新建 event? + +不需要。继续使用现有 `hud_stream` 即可,只扩展 payload 字段: + +- 原来:`{ ts, panels, summary }` +- 现在:`{ ts, panels, summary, pressureMatrix }` + +这样做的好处是: + +- 前后端事件通道不变,兼容原有监听逻辑 +- 折线图和点阵图保持同一时间基准 +- 只需在 `HudPacket` 上增量扩展,不引入额外生命周期管理 + +### 本次代码落地点 + +- 后端 `HudPacket` 新增 `pressure_matrix`(序列化为 `pressureMatrix`): + - `src-tauri/src/serial_core/model.rs` +- 串口读循环在拿到解析值后写入 matrix 状态: + - `src-tauri/src/serial_core/serial.rs` +- 前端类型 `HudPacket` 新增 `pressureMatrix: number[] | null`: + - `src/lib/types/hud.ts` +- 页面把 `pressureMatrix` 透传到 `CenterStage -> PressureMatrixViewer`: + - `src/routes/+page.svelte` +- `PressureMatrixViewer` 去除 demo 生成逻辑;无真实数据时显示全 0: + - `src/lib/components/PressureMatrixViewer.svelte` +- 默认矩阵改为 `12 x 7`(含 reset 默认值): + - `src/routes/+page.svelte` + - `src/lib/components/CenterStage.svelte` + - `src/lib/components/ConfigPanel.svelte` + +## 1. 什么时候用 command,什么时候用 event + +先记一个最实用的判断: + +- `command` 适合“请求一次,返回一次” +- `event` 适合“后台持续推送” + +在这个项目里: + +- `serial_enum` 是 command,因为它是“一次查询串口列表” +- `serial_connect` 是 command,因为它是“一次启动连接” +- `serial_disconnect` 是 command,因为它是“一次停止连接” +- `hud_stream` 是 event,因为图表数据会持续不断地到来 + +如果你用 command 去不停轮询图表数据,也能做,但会有这些问题: + +- 前后端耦合更重 +- 轮询频率不好拿捏 +- 串口数据到了也不能立刻推到前端 +- 后面做 TCP、日志流、状态流时会越来越别扭 + +所以像串口采样、TCP telemetry、日志输出、设备状态广播,这类都更适合 event。 + +## 2. 当前工程里各文件的职责 + +### Rust + +- `src-tauri/src/lib.rs` + - 注册 command + - 注册全局状态 `SerialConnectionState` + +- `src-tauri/src/commands/serial.rs` + - 给前端暴露 command + - 管理串口后台任务的生命周期 + - 这里尽量保持“薄” + +- `src-tauri/src/serial_core/serial.rs` + - 真正的串口读循环 + - 解码 frame + - 发出 `hud_stream` + +- `src-tauri/src/serial_core/model.rs` + - 定义发给前端的结构 + - 把原始 frame 转成前端折线图直接能吃的 `HudPacket` + +- `src-tauri/src/serial_core/codecs/test.rs` + - 协议解码 + +### Frontend + +- `src/routes/+page.svelte` + - 调用 `serial_connect` / `serial_disconnect` + - 监听 `hud_stream` + - 拿到 `HudPacket` 后刷新页面状态 + +- `src/lib/types/hud.ts` + - 前端使用的 HUD 类型定义 + +## 3. 完整数据流 + +当前链路可以按下面理解: + +### 第一步:前端发起连接 + +前端点击按钮后: + +```ts +await invoke("serial_connect", { port }) +``` + +这一步只负责“启动”,不要指望它直接把流式数据返回给前端。 + +### 第二步:Rust command 启动后台任务 + +`serial_connect` 做的事应该很少: + +1. 校验参数 +2. 打开串口 +3. 创建取消信号 +4. `spawn` 后台任务 +5. 把任务句柄保存到全局状态 +6. 立刻返回前端 + +也就是说,command 只是“开机按钮”。 + +### 第三步:后台任务持续读串口 + +后台任务跑在 `serial_core/serial.rs` 里: + +```rust +loop { + tokio::select! { + _ = cancel.cancelled() => break, + read_result = port.read(&mut buffer) => { + let n = read_result?; + let frames = codec.decode(&buffer[..n])?; + ... + } + } +} +``` + +这里有两个关键点: + +- 必须只解码 `&buffer[..n]` +- 长循环不要放在 command 里 `await` 到结束 + +第一点是为了避免把缓冲区后面没读到的 `0` 一起喂给解码器。 +第二点是为了避免前端永远等不到 command 返回。 + +### 第四步:frame 转成前端友好的 packet + +后台拿到 frame 后,不要把原始协议直接丢给前端,先整理成业务结构: + +```rust +let packet = chart_state.apply_frame(&frame); +``` + +这里输出的是 `HudPacket`,它的结构是前端图表直接能渲染的形状。 + +### 第五步:Rust 发 event + +```rust +app.emit("hud_stream", packet)?; +``` + +这一步就是把数据从 Rust 主动推给前端。 + +### 第六步:前端监听 event + +前端在页面挂载时注册监听: + +```ts +const unlisten = await listen("hud_stream", (event) => { + applyPacket(event.payload); +}); +``` + +拿到 payload 后直接更新 `signalPanels`,图表就会刷新。 + +## 4. 为什么要保存后台任务句柄 + +因为连接不是瞬时动作,而是一个持续运行的任务。 + +如果你只做: + +```rust +tauri::async_runtime::spawn(async move { + ... +}); +``` + +但不保存返回的 `JoinHandle`,那你后面其实不知道该停哪个任务。 + +所以当前项目里 `SerialConnectionState` 的职责是: + +- 保存当前连接的端口 +- 保存取消信号 `CancellationToken` +- 保存后台任务句柄 `JoinHandle` + +断开时: + +1. 从 state 里把当前 session 取出来 +2. `cancel.cancel()` +3. 等任务退出 +4. 清空 session + +这就是“连接生命周期管理”。 + +## 5. 为什么我这里用 CancellationToken,而不是只 abort + +`abort()` 可以硬停,但更像“直接掐掉线程”。 + +`CancellationToken` 更适合做长期任务,因为它允许你在循环里优雅退出: + +```rust +tokio::select! { + _ = cancel.cancelled() => break, + ... +} +``` + +这样后面如果你需要: + +- 退出前写日志 +- 退出前关闭资源 +- 退出前发送状态事件 + +都更自然。 + +当前代码里依然保留了 `JoinHandle`,因为它可以让你等待任务真正结束。 + +## 6. 这个 demo 里 model 层在做什么 + +`src-tauri/src/serial_core/model.rs` 里现在做了两件事: + +1. 定义前端消费的数据结构 +2. 提供 `HudChartState` + +`HudChartState` 的作用是把“一帧 frame”逐步积累成“可滚动折线图数据”。 + +你可以把它理解成一个很轻量的 view-model: + +- 输入:`TestFrame` +- 内部:维护每条折线的点数组 +- 输出:`HudPacket` + +好处是前端不用知道: + +- CRC +- 包头包尾 +- payload 字节意义 +- 缓冲和滑动窗口怎么维护 + +前端只知道:我收到了一份新的图表数据。 + +## 7. 前端这里做了什么 + +前端现在分成两层: + +### 控制层 + +通过 `invoke` 调 Rust command: + +- `serial_enum` +- `serial_connect` +- `serial_disconnect` + +### 数据层 + +通过 `listen("hud_stream")` 收 Rust 推送的数据。 + +也就是说: + +- 控制动作走 command +- 连续数据走 event + +这就是后面最好复用的模式。 + +## 8. 为什么页面里还保留了 mock feed + +因为浏览器直接预览 UI 的时候,没有 Tauri runtime,也没有串口。 + +所以当前页面里做了两条分支: + +- 在 Tauri 环境里:监听真实 `hud_stream` +- 在普通浏览器里:启动本地 mock feed + +这样你开发样式时不用每次都连设备,效率会高很多。 + +## 9. 后面照着扩展时怎么套 + +如果你接下来做 TCP、日志流、设备状态流,基本可以照这个模板: + +### TCP telemetry + +- `tcp_connect` command +- `tcp_disconnect` command +- `tcp_stream` event + +### 设备状态 + +- `device_get_status` command +- `device_status` event + +### 日志输出 + +- `log_stream` event + +只要记住一句话: + +“一次性动作走 command,持续推送走 event。” + +## 10. 一个最小可复用模板 + +### Rust command + +```rust +#[tauri::command] +pub async fn start_task(app: AppHandle, state: State<'_, TaskState>) -> Result<(), TaskError> { + let cancel = CancellationToken::new(); + let task_cancel = cancel.clone(); + let task_app = app.clone(); + + let task = tauri::async_runtime::spawn(async move { + let _ = run_task(task_app, task_cancel).await; + }); + + *state.task.lock().unwrap() = Some(TaskSession { cancel, task }); + Ok(()) +} +``` + +### Rust 后台任务 + +```rust +pub async fn run_task(app: AppHandle, cancel: CancellationToken) -> anyhow::Result<()> { + loop { + tokio::select! { + _ = cancel.cancelled() => break, + data = next_data() => { + let payload = build_payload(data?); + app.emit("some_stream", payload)?; + } + } + } + + Ok(()) +} +``` + +### 前端监听 + +```ts +const unlisten = await listen("some_stream", (event) => { + applyPayload(event.payload); +}); +``` + +## 11. 这套方式最容易踩的坑 + +### 1. 在同步 command 里调用 async-only API + +像 `open_native_async()` 这种需要 runtime 的 API,command 本身就应该写成 `async fn`。 + +### 2. 把长期循环直接写在 command 里 + +这样前端 `invoke` 会一直挂着,按钮像卡死一样。 + +### 3. 解码时传整个 buffer,而不是 `&buffer[..n]` + +这会把未读取区域的垃圾值一并喂给解码器。 + +### 4. 没有保存任务句柄 + +这样断开时你并不知道要停哪个任务。 + +### 5. 原始协议直接发前端 + +短期快,长期维护会很痛苦。最好让 Rust 先转换成业务数据。 + +## 12. 你后面可以继续优化的方向 + +- 增加 `status_stream`,当串口异常退出时主动通知前端 +- 把 `SerialConnectionState` 扩成 `HashMap`,支持多串口 +- 把 `HudChartState` 抽成更明确的 telemetry service +- 给不同协议定义不同 packet,而不是全部复用一个事件名 + +## 13. 现在这版如何支持动态 panel + +这次我已经把 demo 从“固定四个 panel”改成了“按数据源 id 动态创建 panel”。 + +当前后端的行为是: + +- 串口保持连接 +- 收到某个 source id 的数据时,如果这个 id 还没有 panel,就新建 +- 后面这个 id 持续有数据,就持续往它自己的折线里追加点 +- 如果某个 id 超过一段时间没有新数据,就自动移除 +- 移除后前端会走离场动画 + +### 当前 demo 约定的数据格式 + +现在 `model.rs` 里的 demo 约定是一帧 payload 可以写成多个 4 字节分组: + +```text +[source_id, value1, value2, value3, source_id, value1, value2, value3, ...] +``` + +例如: + +```text +[0x41, 180, 120, 60, 0x42, 170, 80, 30] +``` + +这里会被解释成: + +- `0x41` -> `A` +- `0x42` -> `B` + +也就是说这一帧会同时更新两个 panel: + +- A panel +- B panel + +如果后续几帧只有 B 和 C,没有 A,那 A 超时之后就会自动被移除。 + +### source id 是怎么来的 + +当前 demo 里: + +- 如果字节是字母或数字,比如 `A`、`B`、`3` +- 就直接把它当 source id + +否则会变成: + +- `CH01` +- `CH0A` +- `CHFF` + +这种形式。 + +### 超时移除在哪里控制 + +在 `src-tauri/src/serial_core/model.rs` 里有一个常量: + +```rust +const PANEL_STALE_AFTER: Duration = Duration::from_millis(2400); +``` + +意思是某个 panel 2.4 秒没收到新数据,就认为它已经“消失”,会从当前 packet 里移除。 + +### 如果你的真实协议不是这个格式怎么办 + +那就只改 `expand_frame_updates(frame)` 这一层。 + +你真正要做的是把自己的协议,翻译成: + +- source id +- 这个 source 对应的 3 个数值 + +例如如果你的协议里一帧只表示一个源: + +```rust +fn expand_frame_updates(frame: &TestFrame) -> Vec { + vec![HudPanelUpdate { + source_id: "A".to_string(), + values: [12.3, 45.6, 78.9], + }] +} +``` + +如果一帧里同时包含多个源: + +```rust +fn expand_frame_updates(frame: &TestFrame) -> Vec { + vec![ + HudPanelUpdate { + source_id: "A".to_string(), + values: [12.3, 45.6, 78.9], + }, + HudPanelUpdate { + source_id: "C".to_string(), + values: [33.1, 29.8, 81.4], + }, + ] +} +``` + +后面的动态创建、更新、超时移除,`HudChartState` 都会自动帮你处理掉。 + +## 14. TODO 提示词 + +如果你后面把 `handle` / 协议解析逻辑写完了,想让我把 demo 逻辑替换成真实业务逻辑,直接把下面这段话发给我就行: + +```md +我已经把串口 frame 的业务含义梳理清楚了,请你把当前 tauri-demo 里的 demo 动态 panel 逻辑改成真实协议版本。 + +已知信息: +- frame 类型:`TestFrame` +- 数据来源文件:`src-tauri/src/serial_core/...` +- 当前 demo 映射入口:`src-tauri/src/serial_core/model.rs` 里的 `expand_frame_updates` +- 如果需要,也可以调整 `handler.on_frame(...)` 的职责 + +真实协议说明: +- source_id 怎么取: +- 一帧里有几路数据: +- 每一路数据对应哪些字段: +- 数值是 u8 / u16 / i16 / float: +- 字节序是大端还是小端: +- 缩放系数是多少: +- 哪些情况下表示“该路数据消失”: +- panel 标题 / 图例文案要如何显示: + +请你帮我做这些事: +1. 去掉当前 demo 的 4 字节分组映射逻辑 +2. 改成按真实协议生成动态 panel +3. 保留“有数据就创建,超时没数据就移除”的行为 +4. 如有必要,重构 `model.rs` / `handler` / `serial.rs` 的职责边界 +5. 更新 `tauri-event.md`,说明新的真实数据流 +``` + +如果你到时候还没完全确定协议,也可以先用这个简化版提示词: + +```md +我已经知道 payload 里哪些字节对应哪几个通道了,请你帮我把 `src-tauri/src/serial_core/model.rs` 里的 demo 映射改成真实映射,并告诉我还缺哪些协议信息。 +``` + +### 到时候我最需要你提供的最小信息 + +- source id 怎么区分不同数据源 +- 每个 source 对应几条曲线 +- payload 各字段的字节位置 +- 数值类型和缩放系数 +- 多久没数据算“消失” + +--- + +如果你后面要继续照这个模式扩展,最推荐的顺序是: + +1. 先定义前端真正需要的 payload 结构 +2. 再写 Rust 的 model/service 层 +3. 最后只让 command 负责启动和停止 + +这样结构通常都会比较干净。 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..f4d0a0e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..3ecfa0a --- /dev/null +++ b/vite.config.js @@ -0,0 +1,32 @@ +import { defineConfig } from "vite"; +import { sveltekit } from "@sveltejs/kit/vite"; + +// @ts-expect-error process is a nodejs global +const host = process.env.TAURI_DEV_HOST; + +// https://vite.dev/config/ +export default defineConfig(async () => ({ + plugins: [sveltekit()], + + // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` + // + // 1. prevent Vite from obscuring rust errors + clearScreen: false, + // 2. tauri expects a fixed port, fail if that port is not available + server: { + port: 1420, + strictPort: true, + host: host || false, + hmr: host + ? { + protocol: "ws", + host, + port: 1421, + } + : undefined, + watch: { + // 3. tell Vite to ignore watching `src-tauri` + ignored: ["**/src-tauri/**"], + }, + }, +}));