├── .npmrc ├── src ├── types │ └── index.d.ts ├── routes │ ├── +page.ts │ ├── weekdata │ │ ├── +page.ts │ │ └── +page.svelte │ ├── +page.svelte │ └── +layout.svelte ├── favicon.ico ├── lib │ ├── assets │ │ ├── icon.png │ │ ├── favicon.png │ │ ├── icon-square.png │ │ ├── icon-square-1240.png │ │ ├── close.svg │ │ └── ic_fluent_timer_24_filled.svg │ ├── components │ │ ├── caption.svelte │ │ ├── title.svelte │ │ ├── stat.svelte │ │ ├── graph.svelte │ │ └── activityGraph.svelte │ ├── helpers │ │ ├── date.ts │ │ └── color.ts │ ├── data.ts │ ├── stores.ts │ └── islands │ │ ├── adjustDialog.svelte │ │ ├── week.svelte │ │ └── day.svelte ├── app.html ├── app.d.ts ├── hooks.server.ts └── app.css ├── Images ├── icon.png └── activity-tracker.png ├── src-tauri ├── .gitignore ├── icons │ ├── 32x32.png │ ├── icon.icns │ ├── icon.ico │ ├── icon.png │ ├── 128x128.png │ ├── 128x128@2x.png │ ├── StoreLogo.png │ ├── Square30x30Logo.png │ ├── Square44x44Logo.png │ ├── Square71x71Logo.png │ ├── Square89x89Logo.png │ ├── Square107x107Logo.png │ ├── Square142x142Logo.png │ ├── Square150x150Logo.png │ ├── Square284x284Logo.png │ └── Square310x310Logo.png ├── src │ ├── threads.rs │ ├── records.rs │ ├── threads │ │ ├── adjustment_thread.rs │ │ ├── data_thread.rs │ │ └── event_thread.rs │ ├── week_stats.rs │ ├── throttle.rs │ ├── data.rs │ ├── day_record_file.rs │ ├── week_data.rs │ ├── main.rs │ └── day_record.rs ├── build.rs ├── Cargo.toml └── tauri.conf.json ├── .vscode ├── extensions.json └── settings.json ├── .prettierrc ├── .eslintignore ├── .prettierignore ├── vite.config.ts ├── .eslintrc.cjs ├── svelte.config.js ├── tsconfig.json ├── .gitignore ├── .github └── workflows │ └── publish.yml ├── package.json ├── README.md └── pnpm-lock.yaml /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /src/types/index.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'days-of-week'; -------------------------------------------------------------------------------- /src/routes/+page.ts: -------------------------------------------------------------------------------- 1 | export const prerender = true; 2 | -------------------------------------------------------------------------------- /src/routes/weekdata/+page.ts: -------------------------------------------------------------------------------- 1 | export const prerender = true; 2 | -------------------------------------------------------------------------------- /Images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/Images/icon.png -------------------------------------------------------------------------------- /src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src/favicon.ico -------------------------------------------------------------------------------- /src/lib/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src/lib/assets/icon.png -------------------------------------------------------------------------------- /src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | 5 | -------------------------------------------------------------------------------- /src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] 3 | } 4 | -------------------------------------------------------------------------------- /Images/activity-tracker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/Images/activity-tracker.png -------------------------------------------------------------------------------- /src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /src/lib/assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src/lib/assets/favicon.png -------------------------------------------------------------------------------- /src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /src/lib/assets/icon-square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src/lib/assets/icon-square.png -------------------------------------------------------------------------------- /src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /src/lib/assets/icon-square-1240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src/lib/assets/icon-square-1240.png -------------------------------------------------------------------------------- /src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TheRolfFR/activity-tracker/HEAD/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /src-tauri/src/threads.rs: -------------------------------------------------------------------------------- 1 | mod adjustment_thread; 2 | pub use adjustment_thread::*; 3 | 4 | mod data_thread; 5 | pub use data_thread::*; 6 | 7 | mod event_thread; 8 | pub use event_thread::*; -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "pluginSearchDirs": ["."], 7 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 8 | } 9 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import type { UserConfig } from 'vite'; 3 | 4 | const config: UserConfig = { 5 | plugins: [ 6 | sveltekit(), 7 | ] 8 | }; 9 | 10 | export default config; 11 | -------------------------------------------------------------------------------- /src-tauri/src/records.rs: -------------------------------------------------------------------------------- 1 | use serde::{Serialize, Deserialize}; 2 | use ts_rs::TS; 3 | 4 | use crate::data::MeasureCount; 5 | 6 | #[derive(Debug, Clone, Copy, Default, TS, Serialize, Deserialize)] 7 | pub struct Record { 8 | pub clicks: MeasureCount, 9 | pub inputs: MeasureCount 10 | } -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Actibity tracker 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
11 | %sveltekit.body% 12 |
13 | 14 | 15 | -------------------------------------------------------------------------------- /src/lib/components/caption.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 |
7 | 8 |
9 | 10 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | // and what to do when importing types 4 | declare namespace App { 5 | interface Locals { 6 | userid: string; 7 | } 8 | 9 | // interface PageData {} 10 | 11 | // interface Error {} 12 | 13 | // interface Platform {} 14 | } 15 | -------------------------------------------------------------------------------- /src/lib/helpers/date.ts: -------------------------------------------------------------------------------- 1 | function padTo2Digits(num: number|string) { 2 | return String(num).padStart(2, '0'); 3 | } 4 | 5 | const getHour = (s: number) => { 6 | const now = new Date(s*1000); 7 | 8 | return padTo2Digits(now.getHours()) 9 | + 'h' + padTo2Digits(now.getMinutes()); 10 | }; 11 | 12 | export { getHour, padTo2Digits }; -------------------------------------------------------------------------------- /src/lib/assets/close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/lib/assets/ic_fluent_timer_24_filled.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/lib/components/title.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 | 8 |
9 | 10 | -------------------------------------------------------------------------------- /src/hooks.server.ts: -------------------------------------------------------------------------------- 1 | import type { Handle } from '@sveltejs/kit'; 2 | 3 | export const handle: Handle = async ({ event, resolve }) => { 4 | let userid = event.cookies.get('userid'); 5 | 6 | if (!userid) { 7 | // if this is the first time the user has visited this app, 8 | // set a cookie so that we recognise them when they return 9 | userid = crypto.randomUUID(); 10 | event.cookies.set('userid', userid, { path: '/' }); 11 | } 12 | 13 | event.locals.userid = userid; 14 | 15 | return resolve(event); 16 | }; 17 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | ignorePatterns: ['*.cjs'], 7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 8 | settings: { 9 | 'svelte3/typescript': () => require('typescript') 10 | }, 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020 14 | }, 15 | env: { 16 | browser: true, 17 | es2017: true, 18 | node: true 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-static'; // This was changed from adapter-auto 2 | import preprocess from 'svelte-preprocess'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://github.com/sveltejs/svelte-preprocess 7 | // for more information about preprocessors 8 | preprocess: preprocess(), 9 | 10 | kit: { 11 | adapter: adapter(), 12 | alias: { 13 | '$src/*': './src/*', 14 | '$bindings/*': './src-tauri/bindings/*', 15 | '$components/*': './src/lib/components/*' 16 | } 17 | } 18 | }; 19 | 20 | export default config; 21 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true, 12 | "typeRoots":["src/types/index.d.ts"] 13 | } 14 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 15 | // 16 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 17 | // from the referenced tsconfig.json - TypeScript does not merge them in 18 | } 19 | -------------------------------------------------------------------------------- /src-tauri/src/threads/adjustment_thread.rs: -------------------------------------------------------------------------------- 1 | use std::sync::mpsc::{Receiver, Sender}; 2 | 3 | use log::error; 4 | 5 | use super::DataMessage; 6 | 7 | pub fn adjustment_thread(adj_rcv: Receiver, evt_send: Sender) { 8 | loop { 9 | match adj_rcv.recv() { 10 | Ok(adj) => { 11 | if let Err(err_send) = evt_send.send(DataMessage::Adjustement(adj)) { 12 | error!("Failed to send async adjustment: {err_send}"); 13 | } 14 | }, 15 | Err(err) => { 16 | error!("Failed to received adjustment in thread: {err}"); 17 | } 18 | }; 19 | } 20 | } -------------------------------------------------------------------------------- /src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | use std::process::Command; 2 | 3 | fn main() { 4 | let commit_hash_output = Command::new("git").args(&["rev-parse", "--short", "HEAD"]).output().unwrap(); 5 | let commit_hash = String::from_utf8(commit_hash_output.stdout).unwrap(); 6 | println!("cargo:rustc-env=GIT_HASH={}", commit_hash); 7 | 8 | let commit_date_output = Command::new("git").args(&["-c", "log.showSignature=false", "log", "-1", "--date=format:\"%Y.%m.%d\"", "--format=\"%ad\""]).output().unwrap(); 9 | let commit_date = String::from_utf8(commit_date_output.stdout).unwrap().replace("\"", ""); 10 | println!("cargo:rustc-env=GIT_DATE={}", commit_date); 11 | tauri_build::build() 12 | } 13 | -------------------------------------------------------------------------------- /src/app.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | position: relative; 4 | } 5 | html, 6 | body, body > div { 7 | overflow: hidden; 8 | background: transparent; 9 | height: 100vh; 10 | } 11 | 12 | .pointer { 13 | cursor: pointer; 14 | } 15 | 16 | body > div { 17 | display: flex; 18 | flex-direction: column; 19 | } 20 | ::-webkit-scrollbar { 21 | width: 5px; 22 | height: 5px; 23 | } 24 | ::-webkit-scrollbar-thumb { 25 | box-shadow: inset 0 0 6px rgba(0,0,0,.3); 26 | border-radius: 3px; 27 | background-color: #555; 28 | } 29 | 30 | .flex { 31 | display: flex; 32 | flex: 1 1 auto; 33 | align-items: flex-start; 34 | justify-content: stretch; 35 | margin: -5px; 36 | } 37 | .flex > * { 38 | margin: 5px; 39 | flex-grow: 1; 40 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | .vercel 10 | .output 11 | 12 | ### VisualStudioCode ### 13 | .vscode/* 14 | !.vscode/settings.json 15 | !.vscode/tasks.json 16 | !.vscode/launch.json 17 | !.vscode/extensions.json 18 | !.vscode/*.code-snippets 19 | 20 | # Local History for Visual Studio Code 21 | .history/ 22 | 23 | # Built Visual Studio Code Extensions 24 | *.vsix 25 | 26 | ### VisualStudioCode Patch ### 27 | # Ignore all local history of files 28 | .history 29 | .ionide 30 | 31 | # Support for Project snippet scope 32 | .vscode/*.code-snippets 33 | 34 | # Ignore code-workspaces 35 | *.code-workspace 36 | 37 | # rust TS bindings 38 | src-tauri/bindings 39 | 40 | Images/icon.psd 41 | -------------------------------------------------------------------------------- /src-tauri/src/week_stats.rs: -------------------------------------------------------------------------------- 1 | use std::collections::hash_map::ValuesMut; 2 | use ts_rs::TS; 3 | 4 | use crate::day_record::DayRecord; 5 | 6 | #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)] 7 | #[ts(export)] 8 | pub struct WeekStats { 9 | #[ts(type = "number")] 10 | pub done: u64 11 | } 12 | 13 | impl<'a> From> for WeekStats { 14 | fn from(values: ValuesMut) -> Self { 15 | let stats = values.into_iter().fold(WeekStats { 16 | done: 0 17 | }, |mut acc,cur| { 18 | let stats = cur.get_stats(); 19 | let secs = stats.duration.as_secs(); 20 | acc.done += secs; 21 | acc 22 | }); 23 | 24 | stats 25 | } 26 | } -------------------------------------------------------------------------------- /src/lib/components/stat.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 |
13 |
14 | {title} 15 | {#if typeof(detail) === "string" } 16 |
17 | {detail} 18 | {/if} 19 |
20 | {time} 21 |
22 | 23 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "**/.git": true, 4 | "**/.svn": true, 5 | "**/.hg": true, 6 | "**/CVS": true, 7 | "**/.DS_Store": true, 8 | "**/Thumbs.db": true, 9 | "**/__pycache__": true, 10 | "**/.idea": true, 11 | "**/.classpath": true, 12 | "**/.project": true, 13 | "**/.settings": true, 14 | "**/.factorypath": true, 15 | "**/node_modules": false 16 | }, 17 | "json.schemas": [{ 18 | "fileMatch": [ 19 | "tauri.conf.json", 20 | ], 21 | "url": "https://raw.githubusercontent.com/tauri-apps/tauri/1.2/tooling/cli/schema.json" 22 | }], 23 | "rust-analyzer.server.extraEnv": { 24 | "CARGO_TARGET_DIR": "${workspaceFolder}/src-tauri/target/analyzer" 25 | }, 26 | "rust-analyzer.cargo.targetDir": "${workspaceFolder}/src-tauri/target/analyzer" 27 | } -------------------------------------------------------------------------------- /src/lib/data.ts: -------------------------------------------------------------------------------- 1 | import type { DayPayload } from './../../src-tauri/bindings/DayPayload'; 2 | import type { DayStats } from '$bindings/DayStats'; 3 | import type { WeekStats } from '$bindings/WeekStats'; 4 | import type { ActivitySeries } from "$bindings/ActivitySeries"; 5 | import type { Measure } from "$bindings/Measure"; 6 | 7 | export interface Activity { 8 | clicks_per_minute: number, 9 | click_series: ActivitySeries, 10 | inputs_per_minute: number, 11 | input_series: ActivitySeries, 12 | adjusted: number 13 | } 14 | 15 | export interface ActivityPeriod { 16 | start: number, 17 | end?: number, 18 | level: Activity 19 | } 20 | 21 | export interface ActDur { 22 | count: number, 23 | from: number, 24 | to: number 25 | } 26 | 27 | export interface Payload { 28 | activity: Activity, 29 | today: number, 30 | week_payload: DayPayload[], 31 | week_stats: WeekStats, 32 | today_stats: DayStats, 33 | version: string 34 | } 35 | 36 | export type WeekActivity = Array; 37 | -------------------------------------------------------------------------------- /src/lib/stores.ts: -------------------------------------------------------------------------------- 1 | import { writable, type Writable } from 'svelte/store'; 2 | 3 | function isBrowser() { 4 | return typeof(localStorage) != 'undefined' && typeof(window) != 'undefined' 5 | } 6 | 7 | function createStore(key: string, default_value: T, parse: (v: string) => T, obj: (v: Writable) => V): V { 8 | let initial: T; 9 | if(isBrowser()) { 10 | const val = localStorage.getItem(key); 11 | initial = val ? parse(val) : default_value; 12 | } else { 13 | initial = default_value; 14 | } 15 | 16 | const my_writable = writable(initial); 17 | my_writable.subscribe(v => { 18 | if (isBrowser()) { 19 | localStorage.setItem(key, String(v)); 20 | } 21 | }); 22 | return obj(my_writable); 23 | } 24 | 25 | // 2250 = 37h30 in minutes 26 | export const total_store = createStore('TOTAL_HOURS', 2250, v => { 27 | return Number.parseInt(v, 10) 28 | }, writable => { 29 | const { subscribe, set } = writable; 30 | 31 | return { 32 | subscribe, 33 | set 34 | } 35 | }); -------------------------------------------------------------------------------- /src-tauri/src/throttle.rs: -------------------------------------------------------------------------------- 1 | use std::time::{Duration, Instant}; 2 | 3 | pub struct Throttle { 4 | // settings 5 | duration: Duration, 6 | executions: usize, 7 | 8 | // inner data 9 | instant: Instant, 10 | count: usize 11 | } 12 | 13 | impl Throttle { 14 | /// Creates new Throttle 15 | pub(crate) fn new(duration: Duration, executions: usize) -> Self { 16 | return Self { 17 | duration, 18 | executions, 19 | instant: Instant::now(), 20 | count: 0usize 21 | } 22 | } 23 | 24 | /// Updates and returns true if valid throttle 25 | pub(crate) fn update(&mut self) -> bool { 26 | let now = Instant::now(); 27 | 28 | if now.duration_since(self.instant) < self.duration { 29 | if self.count < self.executions { 30 | self.count+=1; 31 | true 32 | } else { 33 | false 34 | } 35 | } else { 36 | // reset 37 | self.instant = now; 38 | self.count = 0; 39 | true 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: "publish" 2 | on: 3 | push: 4 | paths: 5 | - 'src-tauri/tauri.conf.json' 6 | workflow_dispatch: 7 | 8 | jobs: 9 | build-tauri: 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | platform: [windows-latest] 14 | 15 | runs-on: ${{ matrix.platform }} 16 | steps: 17 | - uses: actions/checkout@v3 18 | - uses: pnpm/action-setup@v2 19 | with: 20 | version: 8 21 | - name: setup node 22 | uses: actions/setup-node@v3 23 | with: 24 | node-version: 18 25 | cache: 'pnpm' 26 | - name: install Rust stable 27 | uses: actions-rs/toolchain@v1 28 | with: 29 | toolchain: stable 30 | - name: install app dependencies and build it 31 | run: pnpm install && pnpm run build 32 | - uses: tauri-apps/tauri-action@v0 33 | env: 34 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 35 | with: 36 | args: --bundles nsis 37 | tagName: v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version 38 | releaseName: "Activity tracker v__VERSION__" 39 | releaseBody: "See the assets to download this version and install." 40 | releaseDraft: false 41 | prerelease: false -------------------------------------------------------------------------------- /src-tauri/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "activity-tracker" 3 | version = "0.5.0" 4 | description = "A Tauri App" 5 | authors = ["you"] 6 | license = "" 7 | repository = "" 8 | edition = "2021" 9 | rust-version = "1.57" 10 | 11 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 12 | 13 | [build-dependencies] 14 | tauri-build = { version = "1.5.5", features = [] } 15 | 16 | [dependencies] 17 | serde_json = "1.0.128" 18 | rdev = "0.5.3" 19 | bounded-vec-deque = "0.1.1" 20 | serde = { version = "1.0.210", features = ["derive"] } 21 | tauri = { version = "1.8.0", features = ["api-all", "devtools", "system-tray"] } 22 | chrono = { version = "0.4.38", features = ["serde"] } 23 | window-vibrancy = "0.4" 24 | tauri-plugin-window-state = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } 25 | ts-rs = { version = "10.0.0", features = ["chrono-impl", "no-serde-warnings", "serde-compat"] } 26 | serde_with = "3.9.0" 27 | sorted-vec = "0.8.3" 28 | log = "0.4.22" 29 | simple-logging = "2.0.2" 30 | 31 | [features] 32 | # by default Tauri runs in production mode 33 | # when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL 34 | default = [ "custom-protocol" ] 35 | # this feature is used used for production builds where `devPath` points to the filesystem 36 | # DO NOT remove this 37 | custom-protocol = [ "tauri/custom-protocol" ] 38 | -------------------------------------------------------------------------------- /src/lib/helpers/color.ts: -------------------------------------------------------------------------------- 1 | function rgbToHex(r: number, g: number, b: number) { 2 | return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); 3 | } 4 | 5 | function hexToRgb(hex: string) { 6 | const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); 7 | return result 8 | ? { 9 | r: parseInt(result[1], 16), 10 | g: parseInt(result[2], 16), 11 | b: parseInt(result[3], 16) 12 | } 13 | : null; 14 | } 15 | 16 | // returns an array of startColor, colors between according to steps, and endColor 17 | function colorRamp(startColor: string, endColor: string, steps: number) { 18 | const ramp = []; 19 | 20 | ramp.push(startColor); 21 | 22 | const startColorRgb = hexToRgb(startColor); 23 | const endColorRgb = hexToRgb(endColor); 24 | 25 | if(startColorRgb === null || endColorRgb === null) throw new Error('Failed to parse colors'); 26 | 27 | const rInc = Math.round((endColorRgb.r - startColorRgb.r) / (steps + 1)); 28 | const gInc = Math.round((endColorRgb.g - startColorRgb.g) / (steps + 1)); 29 | const bInc = Math.round((endColorRgb.b - startColorRgb.b) / (steps + 1)); 30 | 31 | for (let i = 0; i < steps; i++) { 32 | startColorRgb.r += rInc; 33 | startColorRgb.g += gInc; 34 | startColorRgb.b += bInc; 35 | 36 | ramp.push(rgbToHex(startColorRgb.r, startColorRgb.g, startColorRgb.b)); 37 | } 38 | ramp.push(endColor); 39 | 40 | return ramp; 41 | } 42 | 43 | export { rgbToHex, hexToRgb, colorRamp } -------------------------------------------------------------------------------- /src/lib/islands/adjustDialog.svelte: -------------------------------------------------------------------------------- 1 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 32 |
33 | 34 | -------------------------------------------------------------------------------- /src-tauri/src/threads/data_thread.rs: -------------------------------------------------------------------------------- 1 | use std::sync::mpsc::{Receiver, Sender}; 2 | 3 | use log::error; 4 | 5 | use crate::{data::{ONE_SECOND, ONE_MINUTE}, throttle::Throttle, records::Record, week_data::{WeekData, Payload}}; 6 | 7 | pub enum DataMessage { 8 | EventRecord(Record), 9 | Adjustement(i32) 10 | } 11 | 12 | pub fn data_thread(evt_rchan: Receiver, evt_schan: Sender) -> ! { 13 | let mut week_data: WeekData = WeekData::load(); 14 | 15 | // once per minute 16 | let mut file_throttle = Throttle::new(ONE_MINUTE, 1); 17 | let mut ui_throttle = Throttle::new(ONE_SECOND, 1); 18 | let min_timeout = ONE_MINUTE.min(ONE_SECOND); 19 | 20 | loop { 21 | let res_message = evt_rchan.recv_timeout(min_timeout); 22 | 23 | // diverge and converge 24 | if let Ok(message) = res_message { 25 | match message { 26 | DataMessage::EventRecord(record) => { 27 | week_data.update_today(record); 28 | }, 29 | DataMessage::Adjustement(adjusted) => { 30 | week_data.adjust_today(adjusted); 31 | } 32 | } 33 | } 34 | 35 | if ui_throttle.update() { 36 | if let Err(err) = evt_schan.send(week_data.to_payload()) { 37 | error!("Failed to send payload from data thread: {}", err); 38 | } 39 | } 40 | 41 | if file_throttle.update() { 42 | week_data.save(); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src-tauri/src/threads/event_thread.rs: -------------------------------------------------------------------------------- 1 | use rdev::{listen, Event, EventType::*}; 2 | use std::{thread, sync::mpsc::Sender}; 3 | use log::error; 4 | 5 | use crate::{records::Record, throttle::Throttle, data::ONE_SECOND}; 6 | 7 | use super::DataMessage; 8 | 9 | pub fn event_thread(evt_schan: Sender) { 10 | let mut record = Record::default(); 11 | let mut evt_throttle = Throttle::new(ONE_SECOND, 1); 12 | // event listener 13 | thread::spawn(move || { 14 | if let Err(err_listen) = listen(move |event: Event| { 15 | let modified = match event.event_type { 16 | KeyRelease(_) | 17 | ButtonRelease(_) | 18 | MouseMove { x: _, y: _ } | 19 | Wheel { delta_x: _, delta_y: _ } => false, 20 | KeyPress(_) => { 21 | record.inputs = record.inputs.saturating_add(1); 22 | true 23 | }, 24 | ButtonPress(_) => { 25 | record.clicks = record.clicks.saturating_add(1); 26 | true 27 | } 28 | }; 29 | 30 | if modified && evt_throttle.update() { 31 | if let Err(err_send) = evt_schan.send(DataMessage::EventRecord(record)) { 32 | error!("Failed to send record in data thread: {err_send}"); 33 | } 34 | // reset 35 | record = Record::default(); 36 | } 37 | }) { 38 | error!("Failed to listen in data thread: {:?}", err_listen); 39 | } 40 | }); 41 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte", 3 | "version": "0.0.1", 4 | "scripts": { 5 | "dev": "vite dev", 6 | "build": "vite build", 7 | "preview": "vite preview", 8 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 9 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 10 | "lint": "prettier --check . && eslint .", 11 | "format": "prettier --write .", 12 | "bindings": "cd src-tauri && cargo test && cd .." 13 | }, 14 | "devDependencies": { 15 | "@sveltejs/adapter-auto": "3.2.5", 16 | "@sveltejs/adapter-static": "3.0.5", 17 | "@sveltejs/kit": "2.5.28", 18 | "@sveltejs/vite-plugin-svelte": "^3.1.2", 19 | "@tauri-apps/cli": "1.6.2", 20 | "@types/cookie": "0.6.0", 21 | "@types/rollup-plugin-svelte-svg": "1.0.6", 22 | "@typescript-eslint/eslint-plugin": "8.6.0", 23 | "@typescript-eslint/parser": "8.6.0", 24 | "eslint": "9.11.0", 25 | "eslint-config-prettier": "9.1.0", 26 | "fluent-svelte": "1.6.0", 27 | "prettier": "3.3.3", 28 | "prettier-plugin-svelte": "3.2.6", 29 | "rollup-plugin-svelte-svg": "0.2.3", 30 | "svelte": "4.2.19", 31 | "svelte-check": "4.0.2", 32 | "svelte-preprocess": "6.0.2", 33 | "tslib": "2.7.0", 34 | "typescript": "5.6.2", 35 | "vite": "5.4.7" 36 | }, 37 | "type": "module", 38 | "dependencies": { 39 | "@fontsource/fira-mono": "5.1.0", 40 | "@tauri-apps/api": "1.6.0", 41 | "days-of-week": "1.0.3", 42 | "eslint-plugin-svelte": "^2.44.0", 43 | "svelte-tiny-linked-charts": "1.6.1", 44 | "uuid": "10.0.0" 45 | }, 46 | "pnpm": { 47 | "overrides": { 48 | "undici@<5.19.1": ">=5.19.1", 49 | "undici@>=2.0.0 <5.19.1": ">=5.19.1" 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src-tauri/src/data.rs: -------------------------------------------------------------------------------- 1 | use std::time::Duration; 2 | 3 | use chrono::{serde::ts_seconds, DateTime, Utc}; 4 | use serde::{Serialize, Deserialize}; 5 | use ts_rs::TS; 6 | 7 | #[derive(Debug, Clone, Serialize, Deserialize, TS)] 8 | #[ts(export)] 9 | pub struct ActivityLabels { 10 | pub x: String, 11 | pub y: String, 12 | } 13 | 14 | 15 | #[derive(Debug, Clone, Serialize, Deserialize)] 16 | pub struct ActivitySeries 17 | where 18 | T: Serialize + TS, 19 | { 20 | pub points: Vec, 21 | pub labels: ActivityLabels 22 | } 23 | 24 | pub type MeasureCount = u32; 25 | pub type MeasureDate = DateTime; 26 | pub type ClickMeasure = Measure; 27 | pub type InputMeasure = Measure; 28 | pub type AdjustedType = i32; 29 | 30 | #[derive(Debug, Clone, Serialize, Deserialize, TS)] 31 | #[ts(export, concrete(T = u32))] 32 | pub struct Measure 33 | where 34 | T: Serialize + Default + TS, 35 | { 36 | pub count: T, 37 | #[serde(with = "ts_seconds")] 38 | #[ts(type = "number")] 39 | pub date: DateTime 40 | } 41 | 42 | #[derive(Debug, Clone, Serialize, Deserialize)] 43 | pub struct Activity { 44 | pub clicks_per_minute: f64, 45 | pub click_series: ActivitySeries, 46 | 47 | pub inputs_per_minute: f64, 48 | pub input_series: ActivitySeries, 49 | 50 | pub adjusted: i32 51 | } 52 | 53 | pub const ONE_MINUTE: Duration = Duration::from_secs(60); 54 | pub const ONE_SECOND: Duration = Duration::from_secs(1); 55 | pub const FIVE_MINUTES: chrono::Duration = chrono::Duration::minutes(5); 56 | 57 | #[derive(Debug, Clone, Serialize, Deserialize)] 58 | pub struct ActivityPeriod { 59 | pub start: DateTime, 60 | pub end: Option>, 61 | pub level: Activity 62 | } 63 | -------------------------------------------------------------------------------- /src-tauri/src/day_record_file.rs: -------------------------------------------------------------------------------- 1 | use std::{fs::File, path::PathBuf, io::Read}; 2 | 3 | use chrono::Utc; 4 | 5 | use crate::{day_record::DayRecord, week_data::WeekData}; 6 | 7 | pub struct DayRecordFile; 8 | 9 | impl DayRecordFile { 10 | fn today_index() -> u32 { 11 | WeekData::today_index() 12 | } 13 | fn path_activity_day(day_index: u32) -> PathBuf { 14 | std::env::temp_dir().join(format!("activity-tracker-{day_index}.json")) 15 | } 16 | fn path_activity_today() -> PathBuf { 17 | Self::path_activity_day(Self::today_index()) 18 | } 19 | 20 | pub fn load_activity_day(day: u32) -> DayRecord { 21 | let path = Self::path_activity_day(day); 22 | let file: Option = File::open(path).ok(); 23 | let mut buff = String::new(); 24 | 25 | if let Some(mut f) = file { 26 | f.read_to_string(&mut buff).unwrap(); 27 | match serde_json::from_str::(&buff) { 28 | Ok(val) => { 29 | if Utc::now().signed_duration_since(val.date).num_hours() >= 6*24 { 30 | DayRecord::new() 31 | } else { 32 | val 33 | } 34 | }, 35 | Err(err) => { 36 | eprintln!("{}", &buff); 37 | eprintln!("{err}"); 38 | panic!("Panicked while loading {day} activity"); 39 | } 40 | } 41 | } else { 42 | DayRecord::new() 43 | } 44 | } 45 | 46 | pub fn save(day_record: DayRecord) { 47 | let path = Self::path_activity_today(); 48 | std::fs::write( 49 | path, 50 | serde_json::to_string_pretty(&day_record).unwrap(), 51 | ).unwrap(); 52 | } 53 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 |
3 | logo 4 |
5 | Activity Tracker 6 |

7 | 8 |

Custom work activity tracker with Tauri, Rust and SvelteKit

9 |
10 | 11 |
12 | 13 |
14 | 15 | ## Technologies 16 | 17 | Front-end: Svelte and Fluent Svelte for visual components, svelte-tiny-linked-charts for charts visualization. 18 | 19 | Back-end: TypeScript bindings for Svelte are provided by the ts-rs crate. 20 | serde and serde_json for serialization. rdev for global input events. 21 | Massive use of MPSC channels in Rust code because data goes only one way. 22 | 23 | ## How to develop 24 | 25 | Recommended IDE Setup: 26 | 27 | - [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) 28 | 29 | Prepare your environment: follow the guide from https://tauri.app/v1/guides/getting-started/prerequisites. 30 | 31 | Install JS and Rust dependencies 32 | 33 | ``` 34 | pnpm install && cd src-tauri && cargo build 35 | ``` 36 | 37 | Start dev command from root project 38 | 39 | ``` 40 | cargo tauri dev 41 | ``` 42 | depends on the package manager used to install tauri CLI. 43 | -------------------------------------------------------------------------------- /src/routes/weekdata/+page.svelte: -------------------------------------------------------------------------------- 1 | 26 | 27 |
28 | {#each Object.entries(days_data) as [day_number, day]} 29 |
30 | 31 | {days.english[(Number.parseInt(day_number,10)+1)%7]} 32 | 33 |
34 | {#if day.time == 0} 35 | 36 | <i class="nodata">No data provided for this day</i> 37 | 38 | {:else} 39 | 40 | {/if} 41 |
42 |
43 | {/each} 44 |
45 | 46 | -------------------------------------------------------------------------------- /src/lib/islands/week.svelte: -------------------------------------------------------------------------------- 1 | 53 | 54 |
55 | 56 | 57 |
58 | 59 | 60 | 61 |
62 | 63 | -------------------------------------------------------------------------------- /src-tauri/tauri.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "beforeDevCommand": "npm run dev", 4 | "beforeBuildCommand": "npm run bindings && npm run build", 5 | "devPath": "http://localhost:5173", 6 | "distDir": "../build/", 7 | "withGlobalTauri": true 8 | }, 9 | "package": { 10 | "productName": "activity-tracker", 11 | "version": "0.9.0" 12 | }, 13 | "tauri": { 14 | "allowlist": { 15 | "all": true 16 | }, 17 | "bundle": { 18 | "active": true, 19 | "category": "DeveloperTool", 20 | "copyright": "", 21 | "deb": { 22 | "depends": [] 23 | }, 24 | "externalBin": [], 25 | "icon": [ 26 | "icons/32x32.png", 27 | "icons/128x128.png", 28 | "icons/128x128@2x.png", 29 | "icons/icon.icns", 30 | "icons/icon.ico" 31 | ], 32 | "identifier": "com.therolf.activitytracker", 33 | "longDescription": "", 34 | "macOS": { 35 | "entitlements": null, 36 | "exceptionDomain": "", 37 | "frameworks": [], 38 | "providerShortName": null, 39 | "signingIdentity": null 40 | }, 41 | "resources": [], 42 | "shortDescription": "", 43 | "targets": "all", 44 | "windows": { 45 | "certificateThumbprint": null, 46 | "digestAlgorithm": "sha256", 47 | "nsis": { 48 | "installMode": "both" 49 | }, 50 | "timestampUrl": "" 51 | } 52 | }, 53 | "security": { 54 | "csp": null 55 | }, 56 | "systemTray": { 57 | "iconPath": "../src/lib/assets/icon.png", 58 | "iconAsTemplate": true 59 | }, 60 | "updater": { 61 | "active": false 62 | }, 63 | "windows": [ 64 | { 65 | "fullscreen": false, 66 | "minHeight": 358, 67 | "height": 390, 68 | "resizable": true, 69 | "label": "main", 70 | "title": "Activity tracker", 71 | "width": 525, 72 | "decorations": false, 73 | "skipTaskbar": true, 74 | "theme": "Dark", 75 | "alwaysOnTop": true, 76 | "transparent": true, 77 | "url": "/", 78 | "visible": false 79 | }, 80 | { 81 | "height": 500, 82 | "resizable": true, 83 | "title": "Activity tracker: Week data", 84 | "width": 1050, 85 | "label": "week_data", 86 | "transparent": true, 87 | "decorations": false, 88 | "skipTaskbar": false, 89 | "url": "/weekdata", 90 | "visible": false 91 | } 92 | ] 93 | }, 94 | "$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/tooling/cli/schema.json" 95 | } 96 | -------------------------------------------------------------------------------- /src/lib/components/graph.svelte: -------------------------------------------------------------------------------- 1 | 36 | 37 |
38 | {title} 39 | {#if avg } 40 |
41 | {avg.toFixed(2)}/min 42 | {/if} 43 |
44 |
45 |
46 | hovered = true } 49 | on:blur={ () => hovered = false } 50 | {labels} 51 | {values} 52 | {type} 53 | {width} 54 | fill={color} 55 | linked={uid} 56 | uid={uid} 57 | /> 58 |
59 |
60 | 61 | {#if hasData} 62 | {#if hovered} 63 | Selected: : 64 | {:else} 65 | Last minute: {lastPoint.count} ({data.points.length}) 66 | {/if} 67 | {/if} 68 | 69 |
70 |
71 | 72 | -------------------------------------------------------------------------------- /src-tauri/src/week_data.rs: -------------------------------------------------------------------------------- 1 | use std::collections::HashMap; 2 | 3 | use chrono::{Local, Datelike}; 4 | use log::error; 5 | use ts_rs::TS; 6 | 7 | use crate::{day_record::{DayRecord, DayStats}, records::Record, week_stats::WeekStats, data::Activity, day_record_file::DayRecordFile}; 8 | 9 | pub struct WeekData { 10 | days: HashMap, 11 | last_dow: u32 12 | } 13 | 14 | #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, TS)] 15 | #[ts(export)] 16 | pub struct DayPayload { 17 | #[ts(type="Activity")] 18 | activity: Activity, 19 | stats: DayStats, 20 | #[ts(type="number")] 21 | time: u64, 22 | adjusted: i32 23 | } 24 | 25 | #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] 26 | pub struct Payload { 27 | activity: Activity, 28 | today: u32, 29 | today_stats: DayStats, 30 | week_stats: WeekStats, 31 | week_payload: HashMap, 32 | pub version: String 33 | } 34 | 35 | impl WeekData { 36 | pub fn today_index() -> u32 { 37 | Local::now().weekday().number_from_monday() - 1 38 | } 39 | 40 | fn get_today(&mut self) -> &mut DayRecord { 41 | let today_dow = Self::today_index(); 42 | 43 | // new day here (I hope it will never happen) 44 | if self.last_dow != today_dow { 45 | if today_dow < self.last_dow { 46 | // new week 47 | self.days.clear(); 48 | } 49 | 50 | // generally new day 51 | self.last_dow = today_dow; 52 | self.days.insert(today_dow, DayRecord::new()); 53 | } 54 | 55 | if let Some(today) = self.days.get_mut(&today_dow) { 56 | today 57 | } else { 58 | error!("Failed to get today data"); 59 | unreachable!("Failed to get today data"); 60 | } 61 | } 62 | 63 | pub(crate) fn load() -> WeekData { 64 | // load previous days data and today data 65 | let today_dow = Self::today_index(); 66 | 67 | let mut res = WeekData { 68 | days: HashMap::new(), 69 | last_dow: today_dow, 70 | }; 71 | 72 | 73 | for dow in 0..=today_dow { 74 | res.days.insert(dow, DayRecordFile::load_activity_day(dow)); 75 | } 76 | 77 | res 78 | } 79 | 80 | pub(crate) fn update_today(&mut self, record: Record) { 81 | let today = self.get_today(); 82 | 83 | today.increase_click(record.clicks); 84 | today.increase_input(record.inputs); 85 | } 86 | 87 | /// Adjust time with desired value in minute 88 | pub(crate) fn adjust_today(&mut self, adjusted: i32) { 89 | let today = self.get_today(); 90 | 91 | today.adjusted = adjusted; 92 | } 93 | 94 | pub(crate) fn to_payload(&mut self) -> Payload { 95 | let today = self.get_today(); 96 | let act = today.get_activity(); 97 | 98 | let today_stats = today.get_stats(); 99 | let dur_secs = today_stats.duration.as_secs(); 100 | 101 | let week_payload = self.days.iter().fold(HashMap::new(), |mut acc, (day, data)| { 102 | let stats = data.get_stats(); 103 | let day_dur_secs = stats.duration.as_secs(); 104 | let time = u64::div_ceil(day_dur_secs, 60); 105 | 106 | let this_day = DayPayload { 107 | activity: data.get_activity(), 108 | adjusted: data.adjusted, 109 | stats, 110 | time 111 | }; 112 | 113 | acc.insert(day.clone(), this_day); 114 | 115 | return acc; 116 | }); 117 | 118 | Payload { 119 | activity: act, 120 | today_stats, 121 | week_payload, 122 | today: (dur_secs/60u64) as u32, 123 | week_stats: WeekStats::from(self.days.values_mut()), 124 | version: String::new() 125 | } 126 | } 127 | 128 | pub(crate) fn save(&mut self) { 129 | let today = self.get_today().clone(); 130 | DayRecordFile::save(today); 131 | } 132 | } -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 80 | 81 | 82 | Home 83 | 84 | 85 | 86 | 87 | 88 |
89 |
90 | 91 |
92 | 93 |
94 | 95 | 96 |
97 | {#if activity} 98 |
99 | 104 |
105 |
106 | 112 |
113 | {/if} 114 |
115 |
116 |
117 | 118 | -------------------------------------------------------------------------------- /src/lib/islands/day.svelte: -------------------------------------------------------------------------------- 1 | 82 | 83 |
84 | 85 |
visible = !visible}> 86 |
87 | 88 |
89 |
90 | 91 |
92 |
93 | 94 | 95 |
96 | 97 |
98 |
99 | 100 |
101 |
102 | 103 | -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 45 | 46 |
47 |
48 | 51 | 52 | Activity tracker 53 | {version} 54 | 55 |
56 |
57 | 58 | 61 |
62 |
63 | 64 |
65 | 66 |
67 | 68 | 181 | -------------------------------------------------------------------------------- /src-tauri/src/main.rs: -------------------------------------------------------------------------------- 1 | #![cfg_attr( 2 | all(not(debug_assertions), target_os = "windows"), 3 | windows_subsystem = "windows" 4 | )] 5 | 6 | use std::sync::mpsc::SyncSender; 7 | use std::sync::mpsc::sync_channel; 8 | use std::vec; 9 | use std::thread; 10 | use std::sync::mpsc::channel; 11 | 12 | use log::error; 13 | use log::{LevelFilter, info}; 14 | use simple_logging; 15 | use tauri::{SystemTray, SystemTrayEvent}; 16 | use tauri::{CustomMenuItem, SystemTrayMenu, SystemTrayMenuItem}; 17 | use tauri::Manager; 18 | use tauri_plugin_window_state; 19 | use tauri_plugin_window_state::{AppHandleExt, StateFlags}; 20 | 21 | use window_vibrancy; 22 | 23 | mod throttle; 24 | 25 | mod day_record; 26 | mod day_record_file; 27 | mod records; 28 | 29 | mod threads; 30 | use threads::*; 31 | use week_data::Payload; 32 | 33 | mod data; 34 | mod week_data; 35 | mod week_stats; 36 | 37 | #[tauri::command] 38 | fn open_week_window(app_handle: tauri::AppHandle) { 39 | let opened_window = app_handle.get_window("week_data"); 40 | let window = match opened_window { 41 | None => { 42 | tauri::WindowBuilder::new( 43 | &app_handle, 44 | "week_data", 45 | tauri::WindowUrl::App("/week_data".into()) 46 | ).build().unwrap(); 47 | app_handle.get_window("week_data").unwrap() 48 | } 49 | Some(w) => w 50 | }; 51 | window.show().unwrap(); 52 | window.set_focus().unwrap(); 53 | } 54 | 55 | #[tauri::command] 56 | fn adjust(val: i32, state: tauri::State>) { 57 | if let Err(err) = state.send(val) { 58 | error!("Failed to send adjustment: {err}"); 59 | } 60 | } 61 | 62 | #[allow(dead_code)] 63 | #[tauri::command] 64 | fn open_menu_handle(window: tauri::Window) { 65 | if let Err(err) = window.menu_handle().show() { 66 | error!("Failed to open menu {err}"); 67 | } 68 | } 69 | 70 | fn saved_states() -> StateFlags { 71 | StateFlags::VISIBLE|StateFlags::POSITION|StateFlags::SIZE 72 | } 73 | 74 | fn main() { 75 | //* Log 76 | simple_logging::log_to_file( 77 | std::env::temp_dir().join("activity-tracker.log"), 78 | LevelFilter::Trace 79 | ).unwrap(); 80 | 81 | info!("Starting activity tracker..."); 82 | 83 | let (evt_schan, evt_rchan) = channel::(); 84 | let send_adj = evt_schan.clone(); 85 | let (payload_schan, payload_rchan) = channel::(); 86 | let (adj_schan, adj_rchan) = sync_channel::(1); 87 | 88 | thread::spawn(move || -> () { 89 | adjustment_thread(adj_rchan, send_adj); 90 | }); 91 | 92 | event_thread(evt_schan); 93 | 94 | thread::spawn(move || -> () { 95 | data_thread(evt_rchan, payload_schan); 96 | }); 97 | 98 | let quit = CustomMenuItem::new("quit".to_string(), "Quit"); 99 | let week = CustomMenuItem::new("week_data".to_string(), "Week data"); 100 | let hide = CustomMenuItem::new("hide".to_string(), "Hide"); 101 | let tray_menu = SystemTrayMenu::new() 102 | .add_item(quit) 103 | .add_native_item(SystemTrayMenuItem::Separator) 104 | .add_item(hide) 105 | .add_item(week); 106 | let system_tray = SystemTray::new().with_menu(tray_menu); 107 | 108 | tauri::Builder::default() 109 | .manage(adj_schan) 110 | .invoke_handler(tauri::generate_handler![adjust, open_menu_handle, open_week_window]) 111 | .plugin(tauri_plugin_window_state::Builder::default() 112 | .with_state_flags(saved_states()) 113 | .build() 114 | ) 115 | .system_tray(system_tray) 116 | .on_system_tray_event(|app, event| match event { 117 | SystemTrayEvent::LeftClick { 118 | .. 119 | } => { 120 | let opt_main_window = app.get_window("main"); 121 | 122 | if let Some(main_window) = opt_main_window { 123 | if main_window.is_visible().unwrap() { 124 | main_window.hide().ok(); 125 | } else { 126 | main_window.show().ok(); 127 | } 128 | app.save_window_state(saved_states()).ok(); 129 | } 130 | }, 131 | SystemTrayEvent::MenuItemClick { id, .. } => { 132 | // get a handle to the clicked menu item 133 | // note that `tray_handle` can be called anywhere, 134 | // just get a `AppHandle` instance with `app.handle()` on the setup hook 135 | // and move it to another function or thread 136 | match id.as_str() { 137 | "quit" => { 138 | app.save_window_state(saved_states()) 139 | .and_then(|_| -> Result<(), tauri_plugin_window_state::Error> { 140 | log::info!("Successully saved window state"); 141 | Ok(()) 142 | }) 143 | .or_else(|_| -> Result<(), ()> { 144 | log::error!("Failed to save window state"); 145 | Ok(()) 146 | }).ok(); 147 | app.exit(0); 148 | } 149 | "week_data" => { 150 | app.get_window("week_data") 151 | .and_then(|w| w.show().ok()); 152 | } 153 | "hide" => { 154 | for w in app.windows().values() { 155 | w.hide().unwrap(); 156 | } 157 | app.save_window_state(saved_states()).ok(); 158 | } 159 | _ => {} 160 | } 161 | }, 162 | _ => {} 163 | }) 164 | .setup(move |app| { 165 | 166 | let main_window = app.get_window("main").unwrap(); 167 | 168 | #[cfg(target_os = "windows")] 169 | { 170 | app.windows().values().for_each(|win| { 171 | window_vibrancy::apply_mica(win, Some(true)) 172 | .or_else(|_| window_vibrancy::apply_acrylic(win, None)) 173 | .ok(); 174 | }); 175 | } 176 | 177 | let ver = app.package_info().version.to_string(); 178 | thread::spawn(move || { 179 | loop { 180 | match payload_rchan.recv() { 181 | Ok(mut payload) => { 182 | payload.version = format!("{}-{}-{}", ver, env!("GIT_HASH"), env!("GIT_DATE")); 183 | main_window.emit("activity", payload).ok(); 184 | }, 185 | Err(_) => { 186 | // nope do nothing 187 | }, 188 | } 189 | } 190 | }); 191 | 192 | Ok(()) 193 | }) 194 | .run(tauri::generate_context!()) 195 | .expect("error while running tauri application"); 196 | } 197 | -------------------------------------------------------------------------------- /src/lib/components/activityGraph.svelte: -------------------------------------------------------------------------------- 1 | 141 | 142 |
143 | {#each hours as hour} 144 |
145 |
{padTo2Digits(hour)}
146 |
147 | {#each getShorts(hour) as short} 148 |
154 | {/each} 155 | {#each Array(60) as _ , i} 156 |
157 | {/each} 158 |
159 |
160 | {/each} 161 |
162 |
163 | 164 | -------------------------------------------------------------------------------- /src-tauri/src/day_record.rs: -------------------------------------------------------------------------------- 1 | use std::{vec, collections::HashMap, ops::AddAssign, time::Duration}; 2 | use crate::data::{Activity, ActivityLabels, ActivitySeries, AdjustedType, ClickMeasure, InputMeasure, Measure, MeasureCount, MeasureDate, FIVE_MINUTES}; 3 | 4 | use chrono::{serde::ts_seconds, Utc}; 5 | use serde::{self, Deserialize, Serialize}; 6 | use serde_with::serde_as; 7 | use ts_rs::TS; 8 | 9 | #[derive(Debug, Clone, Serialize, Deserialize, TS, Default)] 10 | pub struct DayRecord { 11 | #[serde(with = "ts_seconds")] 12 | #[ts(type = "number")] 13 | pub date: MeasureDate, 14 | pub clicks: Vec, 15 | pub inputs: Vec, 16 | pub adjusted: AdjustedType 17 | } 18 | 19 | #[derive(Debug, Clone, Serialize, Deserialize, TS)] 20 | #[ts(export)] 21 | pub struct DayActivityStat { 22 | #[serde(with = "ts_seconds")] 23 | #[ts(type = "number")] 24 | pub from: MeasureDate, 25 | #[serde(with = "ts_seconds")] 26 | #[ts(type = "number")] 27 | pub to: MeasureDate, 28 | pub count: MeasureCount 29 | } 30 | 31 | #[derive(Serialize, Deserialize, Debug, Clone, TS)] 32 | #[serde_as] 33 | #[ts(export)] 34 | pub struct DayStats { 35 | pub activities: Vec, 36 | #[serde_as(as = "serde_with::DurationSeconds")] 37 | #[ts(type = "number")] 38 | pub duration: Duration 39 | } 40 | 41 | impl DayRecord { 42 | /// Creates new day record 43 | pub fn new() -> Self { 44 | Self { 45 | date: Utc::now(), 46 | ..Default::default() 47 | } 48 | } 49 | 50 | fn increase_or_insert(vec: &mut Vec>, val: T) 51 | where T: Serialize + Default + TS + AddAssign { 52 | let date = Utc::now(); 53 | let minutes = date.timestamp()/60; 54 | 55 | let opt_last = vec.iter_mut().rev().find(|e| { 56 | minutes == e.date.timestamp()/60 57 | }); 58 | 59 | if let Some(last) = opt_last { 60 | last.count += val; 61 | } else { 62 | vec.push(Measure:: { 63 | date: date, 64 | count: val 65 | }); 66 | } 67 | } 68 | 69 | /// Increase latest click 70 | pub fn increase_click(&mut self, clicks: MeasureCount) { 71 | Self::increase_or_insert(&mut self.clicks, clicks); 72 | } 73 | 74 | /// Increase latest input 75 | pub fn increase_input(&mut self,inputs: MeasureCount) { 76 | Self::increase_or_insert(&mut self.inputs, inputs); 77 | } 78 | 79 | /// Computes stats from clicks and inputs 80 | pub fn get_stats(&self) -> DayStats { 81 | let clicks = self.clicks.clone(); 82 | let inputs = self.inputs.clone(); 83 | 84 | // get all timestamps 85 | let mut measures: HashMap = HashMap::new(); 86 | 87 | //* count clicks 88 | for measure in clicks.iter() { 89 | let possible_count = measures.get_mut(&measure.date); 90 | 91 | if let Some(count) = possible_count { 92 | *count += measure.count; 93 | } else { 94 | measures.insert(measure.date, measure.count); 95 | } 96 | } 97 | 98 | //* count inputs 99 | for measure in inputs.iter() { 100 | let possible_count = measures.get_mut(&measure.date); 101 | 102 | if let Some(count) = possible_count { 103 | *count += measure.count; 104 | } else { 105 | measures.insert(measure.date, measure.count); 106 | } 107 | } 108 | 109 | let mut measures_dates: Vec::<(MeasureDate, MeasureCount)> = measures.into_iter().collect(); 110 | measures_dates.sort_by(|a,b| a.0.cmp(&b.0)); 111 | 112 | //* create activities 113 | let mut measures_dates_iter = measures_dates.into_iter(); 114 | let opt_last_date = measures_dates_iter.next(); 115 | let activities: Vec = match opt_last_date { 116 | None => { 117 | vec![] // zero 118 | }, 119 | Some((last_date, last_count)) => { 120 | let mut act_vec = vec![]; 121 | let mut from:MeasureDate = last_date.clone(); 122 | let mut to: MeasureDate = last_date.clone(); 123 | let mut count: MeasureCount = last_count; 124 | 125 | // two or plus 126 | for (cur_date, cur_count) in measures_dates_iter { 127 | if cur_date - to <= FIVE_MINUTES 128 | { 129 | to = cur_date; 130 | count += cur_count; 131 | } 132 | else 133 | { 134 | act_vec.push(DayActivityStat { 135 | from, 136 | to, 137 | count 138 | }); 139 | from = cur_date; 140 | to = cur_date; 141 | count = cur_count; 142 | } 143 | } 144 | 145 | // one or plus 146 | act_vec.push(DayActivityStat { 147 | from, 148 | to, 149 | count 150 | }); 151 | 152 | act_vec 153 | } 154 | }; 155 | 156 | let mut duration: std::time::Duration = std::time::Duration::ZERO; 157 | for activity in activities.iter() { 158 | let act_duration_secs = (activity.to - activity.from).num_seconds(); 159 | let us_act_duration_secs = u64::try_from(act_duration_secs).expect("activity.from > activity.to"); 160 | duration += std::time::Duration::from_secs(us_act_duration_secs); 161 | } 162 | 163 | DayStats { 164 | activities, 165 | duration 166 | } 167 | } 168 | 169 | /// Creates act 170 | pub(crate) fn get_activity(&self) -> Activity { 171 | let mut clicks = self.clicks.clone(); 172 | let mut inputs = self.inputs.clone(); 173 | 174 | clicks.sort_by( 175 | |a,b| b.date.cmp(&a.date) 176 | ); 177 | let five_clicks = self.clicks.clone(); 178 | let fold_clicks = five_clicks.iter().fold( 179 | (0u32,0u32), 180 | |acc, cur| (acc.0 + cur.count, acc.1 + 1) 181 | ); 182 | 183 | inputs.sort_by( 184 | |a,b| b.date.cmp(&a.date) 185 | ); 186 | let five_inputs = self.inputs.clone(); 187 | let fold_inputs = five_inputs.iter().fold( 188 | (0u32,0u32), 189 | |acc, cur| (acc.0 + cur.count, acc.1 + 1) 190 | ); 191 | 192 | Activity { 193 | clicks_per_minute: f64::from(fold_clicks.0) / f64::from(fold_clicks.1.max(1)), 194 | click_series: ActivitySeries { 195 | points: five_clicks, 196 | labels: ActivityLabels { 197 | x: "clicks".to_string(), 198 | y: "count".to_string() 199 | } 200 | }, 201 | inputs_per_minute: f64::from(fold_inputs.0) / f64::from(fold_inputs.1.max(1)), 202 | input_series: ActivitySeries { 203 | points: five_inputs, 204 | labels: ActivityLabels { 205 | x: "inputs".to_string(), 206 | y: "count".to_string() 207 | } 208 | }, 209 | adjusted: self.adjusted 210 | } 211 | } 212 | } -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | overrides: 8 | undici@<5.19.1: '>=5.19.1' 9 | undici@>=2.0.0 <5.19.1: '>=5.19.1' 10 | 11 | importers: 12 | 13 | .: 14 | dependencies: 15 | '@fontsource/fira-mono': 16 | specifier: 5.1.0 17 | version: 5.1.0 18 | '@tauri-apps/api': 19 | specifier: 1.6.0 20 | version: 1.6.0 21 | '@tauri-controls/svelte': 22 | specifier: 0.4.0 23 | version: 0.4.0(clsx@2.1.1)(svelte@4.2.19)(tailwind-merge@1.14.0) 24 | days-of-week: 25 | specifier: 1.0.3 26 | version: 1.0.3(prop-types@15.8.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0) 27 | eslint-plugin-svelte: 28 | specifier: ^2.44.0 29 | version: 2.44.0(eslint@9.11.0)(svelte@4.2.19) 30 | svelte-tiny-linked-charts: 31 | specifier: 1.6.1 32 | version: 1.6.1(svelte@4.2.19) 33 | uuid: 34 | specifier: 10.0.0 35 | version: 10.0.0 36 | devDependencies: 37 | '@sveltejs/adapter-auto': 38 | specifier: 3.2.5 39 | version: 3.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18))) 40 | '@sveltejs/adapter-static': 41 | specifier: 3.0.5 42 | version: 3.0.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18))) 43 | '@sveltejs/kit': 44 | specifier: 2.5.28 45 | version: 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)) 46 | '@sveltejs/vite-plugin-svelte': 47 | specifier: ^3.1.2 48 | version: 3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)) 49 | '@tauri-apps/cli': 50 | specifier: 1.6.2 51 | version: 1.6.2 52 | '@types/cookie': 53 | specifier: 0.6.0 54 | version: 0.6.0 55 | '@types/rollup-plugin-svelte-svg': 56 | specifier: 1.0.6 57 | version: 1.0.6 58 | '@typescript-eslint/eslint-plugin': 59 | specifier: 8.6.0 60 | version: 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0)(typescript@5.6.2))(eslint@9.11.0)(typescript@5.6.2) 61 | '@typescript-eslint/parser': 62 | specifier: 8.6.0 63 | version: 8.6.0(eslint@9.11.0)(typescript@5.6.2) 64 | eslint: 65 | specifier: 9.11.0 66 | version: 9.11.0 67 | eslint-config-prettier: 68 | specifier: 9.1.0 69 | version: 9.1.0(eslint@9.11.0) 70 | fluent-svelte: 71 | specifier: 1.6.0 72 | version: 1.6.0 73 | prettier: 74 | specifier: 3.3.3 75 | version: 3.3.3 76 | prettier-plugin-svelte: 77 | specifier: 3.2.6 78 | version: 3.2.6(prettier@3.3.3)(svelte@4.2.19) 79 | rollup-plugin-svelte-svg: 80 | specifier: 0.2.3 81 | version: 0.2.3(svelte@4.2.19) 82 | svelte: 83 | specifier: 4.2.19 84 | version: 4.2.19 85 | svelte-check: 86 | specifier: 4.0.2 87 | version: 4.0.2(svelte@4.2.19)(typescript@5.6.2) 88 | svelte-preprocess: 89 | specifier: 6.0.2 90 | version: 6.0.2(postcss-load-config@3.1.4(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)(typescript@5.6.2) 91 | tslib: 92 | specifier: 2.7.0 93 | version: 2.7.0 94 | typescript: 95 | specifier: 5.6.2 96 | version: 5.6.2 97 | vite: 98 | specifier: 5.4.7 99 | version: 5.4.7(@types/node@18.7.18) 100 | 101 | packages: 102 | 103 | '@ampproject/remapping@2.3.0': 104 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 105 | engines: {node: '>=6.0.0'} 106 | 107 | '@esbuild/aix-ppc64@0.21.5': 108 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 109 | engines: {node: '>=12'} 110 | cpu: [ppc64] 111 | os: [aix] 112 | 113 | '@esbuild/android-arm64@0.21.5': 114 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 115 | engines: {node: '>=12'} 116 | cpu: [arm64] 117 | os: [android] 118 | 119 | '@esbuild/android-arm@0.21.5': 120 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 121 | engines: {node: '>=12'} 122 | cpu: [arm] 123 | os: [android] 124 | 125 | '@esbuild/android-x64@0.21.5': 126 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 127 | engines: {node: '>=12'} 128 | cpu: [x64] 129 | os: [android] 130 | 131 | '@esbuild/darwin-arm64@0.21.5': 132 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 133 | engines: {node: '>=12'} 134 | cpu: [arm64] 135 | os: [darwin] 136 | 137 | '@esbuild/darwin-x64@0.21.5': 138 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 139 | engines: {node: '>=12'} 140 | cpu: [x64] 141 | os: [darwin] 142 | 143 | '@esbuild/freebsd-arm64@0.21.5': 144 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 145 | engines: {node: '>=12'} 146 | cpu: [arm64] 147 | os: [freebsd] 148 | 149 | '@esbuild/freebsd-x64@0.21.5': 150 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 151 | engines: {node: '>=12'} 152 | cpu: [x64] 153 | os: [freebsd] 154 | 155 | '@esbuild/linux-arm64@0.21.5': 156 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 157 | engines: {node: '>=12'} 158 | cpu: [arm64] 159 | os: [linux] 160 | 161 | '@esbuild/linux-arm@0.21.5': 162 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 163 | engines: {node: '>=12'} 164 | cpu: [arm] 165 | os: [linux] 166 | 167 | '@esbuild/linux-ia32@0.21.5': 168 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 169 | engines: {node: '>=12'} 170 | cpu: [ia32] 171 | os: [linux] 172 | 173 | '@esbuild/linux-loong64@0.21.5': 174 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 175 | engines: {node: '>=12'} 176 | cpu: [loong64] 177 | os: [linux] 178 | 179 | '@esbuild/linux-mips64el@0.21.5': 180 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 181 | engines: {node: '>=12'} 182 | cpu: [mips64el] 183 | os: [linux] 184 | 185 | '@esbuild/linux-ppc64@0.21.5': 186 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 187 | engines: {node: '>=12'} 188 | cpu: [ppc64] 189 | os: [linux] 190 | 191 | '@esbuild/linux-riscv64@0.21.5': 192 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 193 | engines: {node: '>=12'} 194 | cpu: [riscv64] 195 | os: [linux] 196 | 197 | '@esbuild/linux-s390x@0.21.5': 198 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 199 | engines: {node: '>=12'} 200 | cpu: [s390x] 201 | os: [linux] 202 | 203 | '@esbuild/linux-x64@0.21.5': 204 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 205 | engines: {node: '>=12'} 206 | cpu: [x64] 207 | os: [linux] 208 | 209 | '@esbuild/netbsd-x64@0.21.5': 210 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 211 | engines: {node: '>=12'} 212 | cpu: [x64] 213 | os: [netbsd] 214 | 215 | '@esbuild/openbsd-x64@0.21.5': 216 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 217 | engines: {node: '>=12'} 218 | cpu: [x64] 219 | os: [openbsd] 220 | 221 | '@esbuild/sunos-x64@0.21.5': 222 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 223 | engines: {node: '>=12'} 224 | cpu: [x64] 225 | os: [sunos] 226 | 227 | '@esbuild/win32-arm64@0.21.5': 228 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 229 | engines: {node: '>=12'} 230 | cpu: [arm64] 231 | os: [win32] 232 | 233 | '@esbuild/win32-ia32@0.21.5': 234 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 235 | engines: {node: '>=12'} 236 | cpu: [ia32] 237 | os: [win32] 238 | 239 | '@esbuild/win32-x64@0.21.5': 240 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 241 | engines: {node: '>=12'} 242 | cpu: [x64] 243 | os: [win32] 244 | 245 | '@eslint-community/eslint-utils@4.4.0': 246 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 247 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 248 | peerDependencies: 249 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 250 | 251 | '@eslint-community/regexpp@4.11.1': 252 | resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} 253 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 254 | 255 | '@eslint/config-array@0.18.0': 256 | resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} 257 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 258 | 259 | '@eslint/eslintrc@3.1.0': 260 | resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} 261 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 262 | 263 | '@eslint/js@9.11.0': 264 | resolution: {integrity: sha512-LPkkenkDqyzTFauZLLAPhIb48fj6drrfMvRGSL9tS3AcZBSVTllemLSNyCvHNNL2t797S/6DJNSIwRwXgMO/eQ==} 265 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 266 | 267 | '@eslint/object-schema@2.1.4': 268 | resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} 269 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 270 | 271 | '@eslint/plugin-kit@0.2.0': 272 | resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} 273 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 274 | 275 | '@fontsource/fira-mono@5.1.0': 276 | resolution: {integrity: sha512-6+nftSKApXyN0I9FC5GJuG5TUCh+in5OehtrXRIsHJvq38Pm//oA1kZZYNdXv99JYzLzJ3lzsTAavmS+xGLGDw==} 277 | 278 | '@humanwhocodes/module-importer@1.0.1': 279 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 280 | engines: {node: '>=12.22'} 281 | 282 | '@humanwhocodes/retry@0.3.0': 283 | resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} 284 | engines: {node: '>=18.18'} 285 | 286 | '@jridgewell/gen-mapping@0.3.5': 287 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 288 | engines: {node: '>=6.0.0'} 289 | 290 | '@jridgewell/resolve-uri@3.1.0': 291 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 292 | engines: {node: '>=6.0.0'} 293 | 294 | '@jridgewell/set-array@1.2.1': 295 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 296 | engines: {node: '>=6.0.0'} 297 | 298 | '@jridgewell/sourcemap-codec@1.5.0': 299 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 300 | 301 | '@jridgewell/trace-mapping@0.3.25': 302 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 303 | 304 | '@nodelib/fs.scandir@2.1.5': 305 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 306 | engines: {node: '>= 8'} 307 | 308 | '@nodelib/fs.stat@2.0.5': 309 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 310 | engines: {node: '>= 8'} 311 | 312 | '@nodelib/fs.walk@1.2.8': 313 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 314 | engines: {node: '>= 8'} 315 | 316 | '@polka/url@1.0.0-next.28': 317 | resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} 318 | 319 | '@rollup/rollup-android-arm-eabi@4.22.4': 320 | resolution: {integrity: sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==} 321 | cpu: [arm] 322 | os: [android] 323 | 324 | '@rollup/rollup-android-arm64@4.22.4': 325 | resolution: {integrity: sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==} 326 | cpu: [arm64] 327 | os: [android] 328 | 329 | '@rollup/rollup-darwin-arm64@4.22.4': 330 | resolution: {integrity: sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==} 331 | cpu: [arm64] 332 | os: [darwin] 333 | 334 | '@rollup/rollup-darwin-x64@4.22.4': 335 | resolution: {integrity: sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==} 336 | cpu: [x64] 337 | os: [darwin] 338 | 339 | '@rollup/rollup-linux-arm-gnueabihf@4.22.4': 340 | resolution: {integrity: sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==} 341 | cpu: [arm] 342 | os: [linux] 343 | 344 | '@rollup/rollup-linux-arm-musleabihf@4.22.4': 345 | resolution: {integrity: sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==} 346 | cpu: [arm] 347 | os: [linux] 348 | 349 | '@rollup/rollup-linux-arm64-gnu@4.22.4': 350 | resolution: {integrity: sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==} 351 | cpu: [arm64] 352 | os: [linux] 353 | 354 | '@rollup/rollup-linux-arm64-musl@4.22.4': 355 | resolution: {integrity: sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==} 356 | cpu: [arm64] 357 | os: [linux] 358 | 359 | '@rollup/rollup-linux-powerpc64le-gnu@4.22.4': 360 | resolution: {integrity: sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==} 361 | cpu: [ppc64] 362 | os: [linux] 363 | 364 | '@rollup/rollup-linux-riscv64-gnu@4.22.4': 365 | resolution: {integrity: sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==} 366 | cpu: [riscv64] 367 | os: [linux] 368 | 369 | '@rollup/rollup-linux-s390x-gnu@4.22.4': 370 | resolution: {integrity: sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==} 371 | cpu: [s390x] 372 | os: [linux] 373 | 374 | '@rollup/rollup-linux-x64-gnu@4.22.4': 375 | resolution: {integrity: sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==} 376 | cpu: [x64] 377 | os: [linux] 378 | 379 | '@rollup/rollup-linux-x64-musl@4.22.4': 380 | resolution: {integrity: sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==} 381 | cpu: [x64] 382 | os: [linux] 383 | 384 | '@rollup/rollup-win32-arm64-msvc@4.22.4': 385 | resolution: {integrity: sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==} 386 | cpu: [arm64] 387 | os: [win32] 388 | 389 | '@rollup/rollup-win32-ia32-msvc@4.22.4': 390 | resolution: {integrity: sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==} 391 | cpu: [ia32] 392 | os: [win32] 393 | 394 | '@rollup/rollup-win32-x64-msvc@4.22.4': 395 | resolution: {integrity: sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==} 396 | cpu: [x64] 397 | os: [win32] 398 | 399 | '@sveltejs/adapter-auto@3.2.5': 400 | resolution: {integrity: sha512-27LR+uKccZ62lgq4N/hvyU2G+hTP9fxWEAfnZcl70HnyfAjMSsGk1z/SjAPXNCD1mVJIE7IFu3TQ8cQ/UH3c0A==} 401 | peerDependencies: 402 | '@sveltejs/kit': ^2.0.0 403 | 404 | '@sveltejs/adapter-static@3.0.5': 405 | resolution: {integrity: sha512-kFJR7RxeB6FBvrKZWAEzIALatgy11ISaaZbcPup8JdWUdrmmfUHHTJ738YHJTEfnCiiXi6aX8Q6ePY7tnSMD6Q==} 406 | peerDependencies: 407 | '@sveltejs/kit': ^2.0.0 408 | 409 | '@sveltejs/kit@2.5.28': 410 | resolution: {integrity: sha512-/O7pvFGBsQPcFa9UrW8eUC5uHTOXLsUp3SN0dY6YmRAL9nfPSrJsSJk//j5vMpinSshzUjteAFcfQTU+04Ka1w==} 411 | engines: {node: '>=18.13'} 412 | hasBin: true 413 | peerDependencies: 414 | '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 415 | svelte: ^4.0.0 || ^5.0.0-next.0 416 | vite: ^5.0.3 417 | 418 | '@sveltejs/vite-plugin-svelte-inspector@2.1.0': 419 | resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} 420 | engines: {node: ^18.0.0 || >=20} 421 | peerDependencies: 422 | '@sveltejs/vite-plugin-svelte': ^3.0.0 423 | svelte: ^4.0.0 || ^5.0.0-next.0 424 | vite: ^5.0.0 425 | 426 | '@sveltejs/vite-plugin-svelte@3.1.2': 427 | resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==} 428 | engines: {node: ^18.0.0 || >=20} 429 | peerDependencies: 430 | svelte: ^4.0.0 || ^5.0.0-next.0 431 | vite: ^5.0.0 432 | 433 | '@tauri-apps/api@1.6.0': 434 | resolution: {integrity: sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==} 435 | engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} 436 | 437 | '@tauri-apps/cli-darwin-arm64@1.6.2': 438 | resolution: {integrity: sha512-6mdRyf9DaLqlZvj8kZB09U3rwY+dOHSGzTZ7+GDg665GJb17f4cb30e8dExj6/aghcsOie9EGpgiURcDUvLNSQ==} 439 | engines: {node: '>= 10'} 440 | cpu: [arm64] 441 | os: [darwin] 442 | 443 | '@tauri-apps/cli-darwin-x64@1.6.2': 444 | resolution: {integrity: sha512-PLxZY5dn38H3R9VRmBN/l0ZDB5JFanCwlK4rmpzDQPPg3tQmbu5vjSCP6TVj5U6aLKsj79kFyULblPr5Dn9+vw==} 445 | engines: {node: '>= 10'} 446 | cpu: [x64] 447 | os: [darwin] 448 | 449 | '@tauri-apps/cli-linux-arm-gnueabihf@1.6.2': 450 | resolution: {integrity: sha512-xnpj4BLeeGOh5I/ewCQlYJZwHH0CBNBN+4q8BNWNQ9MKkjN9ST366RmHRzl2ANNgWwijOPxyce7GiUmvuH8Atw==} 451 | engines: {node: '>= 10'} 452 | cpu: [arm] 453 | os: [linux] 454 | 455 | '@tauri-apps/cli-linux-arm64-gnu@1.6.2': 456 | resolution: {integrity: sha512-uaiRE0vE2P+tdsCngfKt+7yKr3VZXIq/t3w01DzSdnBgHSp0zmRsRR4AhZt7ibvoEgA8GzBP+eSHJdFNZsTU9w==} 457 | engines: {node: '>= 10'} 458 | cpu: [arm64] 459 | os: [linux] 460 | 461 | '@tauri-apps/cli-linux-arm64-musl@1.6.2': 462 | resolution: {integrity: sha512-o9JunVrMrhqTBLrdvEbS64W0bo1dPm0lxX51Mx+6x9SmbDjlEWGgaAHC3iKLK9khd5Yu1uO1e+8TJltAcScvmw==} 463 | engines: {node: '>= 10'} 464 | cpu: [arm64] 465 | os: [linux] 466 | 467 | '@tauri-apps/cli-linux-x64-gnu@1.6.2': 468 | resolution: {integrity: sha512-jL9f+o61DdQmNYKIt2Q3BA8YJ+hyC5+GdNxqDf7j5SoQ85j//YfUWbmp9ZgsPHVBxgSGZVvgGMNvf64Ykp0buQ==} 469 | engines: {node: '>= 10'} 470 | cpu: [x64] 471 | os: [linux] 472 | 473 | '@tauri-apps/cli-linux-x64-musl@1.6.2': 474 | resolution: {integrity: sha512-xsa4Pu9YMHKAX0J8pIoXfN/uhvAAAoECZDixDhWw8zi57VZ4QX28ycqolS+NscdD9NAGSgHk45MpBZWdvRtvjQ==} 475 | engines: {node: '>= 10'} 476 | cpu: [x64] 477 | os: [linux] 478 | 479 | '@tauri-apps/cli-win32-arm64-msvc@1.6.2': 480 | resolution: {integrity: sha512-eJtUOx2UFhJpCCkm5M5+4Co9JbjvgIHTdyS/hTSZfOEdT58CNEGVJXMA39FsSZXYoxYPE+9K7Km6haMozSmlxw==} 481 | engines: {node: '>= 10'} 482 | cpu: [arm64] 483 | os: [win32] 484 | 485 | '@tauri-apps/cli-win32-ia32-msvc@1.6.2': 486 | resolution: {integrity: sha512-9Jwx3PrhNw3VKOgPISRRXPkvoEAZP+7rFRHXIo49dvlHy2E/o9qpWi1IntE33HWeazP6KhvsCjvXB2Ai4eGooA==} 487 | engines: {node: '>= 10'} 488 | cpu: [ia32] 489 | os: [win32] 490 | 491 | '@tauri-apps/cli-win32-x64-msvc@1.6.2': 492 | resolution: {integrity: sha512-5Z+ZjRFJE8MXghJe1UXvGephY5ZcgVhiTI9yuMi9xgX3CEaAXASatyXllzsvGJ9EDaWMEpa0PHjAzi7LBAWROw==} 493 | engines: {node: '>= 10'} 494 | cpu: [x64] 495 | os: [win32] 496 | 497 | '@tauri-apps/cli@1.6.2': 498 | resolution: {integrity: sha512-zpfZdxhm20s7d/Uejpg/T3a9sqLVe3Ih2ztINfy8v6iLw9Ohowkb9g+agZffYKlEWfOSpmCy69NFyBLj7OZL0A==} 499 | engines: {node: '>= 10'} 500 | hasBin: true 501 | 502 | '@tauri-controls/svelte@0.4.0': 503 | resolution: {integrity: sha512-5zSLCz/l90+mQt/6lDZHzbJdTOt4Qbe1Mv0DCzCnNcaDy0Bbl8gqSWDps6SrIF4oq1sZkJno0GFjwHnol/wKSw==} 504 | peerDependencies: 505 | clsx: ^2.0.0 506 | svelte: ^4.1.2 507 | tailwind-merge: ^1.14.0 508 | 509 | '@types/cookie@0.6.0': 510 | resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 511 | 512 | '@types/estree@1.0.5': 513 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 514 | 515 | '@types/estree@1.0.6': 516 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 517 | 518 | '@types/node@18.7.18': 519 | resolution: {integrity: sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==} 520 | 521 | '@types/rollup-plugin-svelte-svg@1.0.6': 522 | resolution: {integrity: sha512-CBqP8rU0u6VWSHwX3gJ2BPJXvt1e9PZccBo7m8Mc9PSQBB4zg31+zqj2VjYNz18BSzEou0hMWGjaTQ4fRMUyfQ==} 523 | 524 | '@types/svgo@2.6.4': 525 | resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} 526 | 527 | '@typescript-eslint/eslint-plugin@8.6.0': 528 | resolution: {integrity: sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==} 529 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 530 | peerDependencies: 531 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 532 | eslint: ^8.57.0 || ^9.0.0 533 | typescript: '*' 534 | peerDependenciesMeta: 535 | typescript: 536 | optional: true 537 | 538 | '@typescript-eslint/parser@8.6.0': 539 | resolution: {integrity: sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==} 540 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 541 | peerDependencies: 542 | eslint: ^8.57.0 || ^9.0.0 543 | typescript: '*' 544 | peerDependenciesMeta: 545 | typescript: 546 | optional: true 547 | 548 | '@typescript-eslint/scope-manager@8.6.0': 549 | resolution: {integrity: sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==} 550 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 551 | 552 | '@typescript-eslint/type-utils@8.6.0': 553 | resolution: {integrity: sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==} 554 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 555 | peerDependencies: 556 | typescript: '*' 557 | peerDependenciesMeta: 558 | typescript: 559 | optional: true 560 | 561 | '@typescript-eslint/types@8.6.0': 562 | resolution: {integrity: sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==} 563 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 564 | 565 | '@typescript-eslint/typescript-estree@8.6.0': 566 | resolution: {integrity: sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==} 567 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 568 | peerDependencies: 569 | typescript: '*' 570 | peerDependenciesMeta: 571 | typescript: 572 | optional: true 573 | 574 | '@typescript-eslint/utils@8.6.0': 575 | resolution: {integrity: sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==} 576 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 577 | peerDependencies: 578 | eslint: ^8.57.0 || ^9.0.0 579 | 580 | '@typescript-eslint/visitor-keys@8.6.0': 581 | resolution: {integrity: sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==} 582 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 583 | 584 | acorn-jsx@5.3.2: 585 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 586 | peerDependencies: 587 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 588 | 589 | acorn@8.12.1: 590 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 591 | engines: {node: '>=0.4.0'} 592 | hasBin: true 593 | 594 | ajv@6.12.6: 595 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 596 | 597 | ansi-regex@5.0.1: 598 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 599 | engines: {node: '>=8'} 600 | 601 | ansi-styles@4.3.0: 602 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 603 | engines: {node: '>=8'} 604 | 605 | anymatch@3.1.2: 606 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 607 | engines: {node: '>= 8'} 608 | 609 | argparse@2.0.1: 610 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 611 | 612 | aria-query@5.3.2: 613 | resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 614 | engines: {node: '>= 0.4'} 615 | 616 | axobject-query@4.1.0: 617 | resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 618 | engines: {node: '>= 0.4'} 619 | 620 | balanced-match@1.0.2: 621 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 622 | 623 | binary-extensions@2.2.0: 624 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 625 | engines: {node: '>=8'} 626 | 627 | brace-expansion@1.1.11: 628 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 629 | 630 | brace-expansion@2.0.1: 631 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 632 | 633 | braces@3.0.2: 634 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 635 | engines: {node: '>=8'} 636 | 637 | callsites@3.1.0: 638 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 639 | engines: {node: '>=6'} 640 | 641 | chalk@4.1.2: 642 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 643 | engines: {node: '>=10'} 644 | 645 | chokidar@3.5.3: 646 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 647 | engines: {node: '>= 8.10.0'} 648 | 649 | clsx@2.1.1: 650 | resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 651 | engines: {node: '>=6'} 652 | 653 | code-red@1.0.4: 654 | resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} 655 | 656 | color-convert@2.0.1: 657 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 658 | engines: {node: '>=7.0.0'} 659 | 660 | color-name@1.1.4: 661 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 662 | 663 | concat-map@0.0.1: 664 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 665 | 666 | cookie@0.6.0: 667 | resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 668 | engines: {node: '>= 0.6'} 669 | 670 | cross-spawn@7.0.3: 671 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 672 | engines: {node: '>= 8'} 673 | 674 | css-tree@2.3.1: 675 | resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 676 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 677 | 678 | cssesc@3.0.0: 679 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 680 | engines: {node: '>=4'} 681 | hasBin: true 682 | 683 | days-of-week@1.0.3: 684 | resolution: {integrity: sha512-FoZ2Op+Me4q9uS1HmhQSMIKUqIVswe7UstgK+cNbPO9MSzyWTOuHeYTvRTR20P4sBNa2WRKHcSKpfkCFYRq8Gg==} 685 | engines: {node: '>=8', npm: '>=5'} 686 | peerDependencies: 687 | prop-types: ^15.5.4 688 | react: ^15.0.0 || ^16.0.0 689 | react-dom: ^15.0.0 || ^16.0.0 690 | 691 | debug@4.3.4: 692 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 693 | engines: {node: '>=6.0'} 694 | peerDependencies: 695 | supports-color: '*' 696 | peerDependenciesMeta: 697 | supports-color: 698 | optional: true 699 | 700 | deep-is@0.1.4: 701 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 702 | 703 | deepmerge@4.3.1: 704 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 705 | engines: {node: '>=0.10.0'} 706 | 707 | devalue@5.0.0: 708 | resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} 709 | 710 | esbuild@0.21.5: 711 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 712 | engines: {node: '>=12'} 713 | hasBin: true 714 | 715 | escape-string-regexp@4.0.0: 716 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 717 | engines: {node: '>=10'} 718 | 719 | eslint-compat-utils@0.5.1: 720 | resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} 721 | engines: {node: '>=12'} 722 | peerDependencies: 723 | eslint: '>=6.0.0' 724 | 725 | eslint-config-prettier@9.1.0: 726 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 727 | hasBin: true 728 | peerDependencies: 729 | eslint: '>=7.0.0' 730 | 731 | eslint-plugin-svelte@2.44.0: 732 | resolution: {integrity: sha512-wav4MOs02vBb1WjvTCYItwJCxMkuk2Z4p+K/eyjL0N/z7ahXLP+0LtQQjiKc2ezuif7GnZLbD1F3o1VHzSvdVg==} 733 | engines: {node: ^14.17.0 || >=16.0.0} 734 | peerDependencies: 735 | eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 736 | svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 737 | peerDependenciesMeta: 738 | svelte: 739 | optional: true 740 | 741 | eslint-scope@7.2.2: 742 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 743 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 744 | 745 | eslint-scope@8.0.2: 746 | resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} 747 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 748 | 749 | eslint-visitor-keys@3.3.0: 750 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 751 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 752 | 753 | eslint-visitor-keys@3.4.3: 754 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 755 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 756 | 757 | eslint-visitor-keys@4.0.0: 758 | resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} 759 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 760 | 761 | eslint@9.11.0: 762 | resolution: {integrity: sha512-yVS6XODx+tMFMDFcG4+Hlh+qG7RM6cCJXtQhCKLSsr3XkLvWggHjCqjfh0XsPPnt1c56oaT6PMgW9XWQQjdHXA==} 763 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 764 | hasBin: true 765 | peerDependencies: 766 | jiti: '*' 767 | peerDependenciesMeta: 768 | jiti: 769 | optional: true 770 | 771 | esm-env@1.0.0: 772 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 773 | 774 | espree@10.1.0: 775 | resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} 776 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 777 | 778 | espree@9.6.1: 779 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 780 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 781 | 782 | esquery@1.6.0: 783 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 784 | engines: {node: '>=0.10'} 785 | 786 | esrecurse@4.3.0: 787 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 788 | engines: {node: '>=4.0'} 789 | 790 | estraverse@5.3.0: 791 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 792 | engines: {node: '>=4.0'} 793 | 794 | estree-walker@0.2.1: 795 | resolution: {integrity: sha512-6/I1dwNKk0N9iGOU3ydzAAurz4NPo/ttxZNCqgIVbWFvWyzWBSNonRrJ5CpjDuyBfmM7ENN7WCzUi9aT/UPXXQ==} 796 | 797 | estree-walker@3.0.3: 798 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 799 | 800 | esutils@2.0.3: 801 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 802 | engines: {node: '>=0.10.0'} 803 | 804 | fast-deep-equal@3.1.3: 805 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 806 | 807 | fast-glob@3.3.2: 808 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 809 | engines: {node: '>=8.6.0'} 810 | 811 | fast-json-stable-stringify@2.1.0: 812 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 813 | 814 | fast-levenshtein@2.0.6: 815 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 816 | 817 | fastq@1.13.0: 818 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 819 | 820 | fdir@6.3.0: 821 | resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} 822 | peerDependencies: 823 | picomatch: ^3 || ^4 824 | peerDependenciesMeta: 825 | picomatch: 826 | optional: true 827 | 828 | file-entry-cache@8.0.0: 829 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 830 | engines: {node: '>=16.0.0'} 831 | 832 | fill-range@7.0.1: 833 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 834 | engines: {node: '>=8'} 835 | 836 | find-up@5.0.0: 837 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 838 | engines: {node: '>=10'} 839 | 840 | flat-cache@4.0.1: 841 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 842 | engines: {node: '>=16'} 843 | 844 | flatted@3.3.1: 845 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 846 | 847 | fluent-svelte@1.6.0: 848 | resolution: {integrity: sha512-z+QUvfAzh3t0bpiURO6f2eciZPnPPwl1pZe+sAYM8A8vUDSAHH8D0U4+VT+OHA16PEAd2DYVdPyJqM27ly5lxQ==} 849 | 850 | focus-trap@6.9.4: 851 | resolution: {integrity: sha512-v2NTsZe2FF59Y+sDykKY+XjqZ0cPfhq/hikWVL88BqLivnNiEffAsac6rP6H45ff9wG9LL5ToiDqrLEP9GX9mw==} 852 | 853 | fsevents@2.3.2: 854 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 855 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 856 | os: [darwin] 857 | 858 | fsevents@2.3.3: 859 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 860 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 861 | os: [darwin] 862 | 863 | glob-parent@5.1.2: 864 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 865 | engines: {node: '>= 6'} 866 | 867 | glob-parent@6.0.2: 868 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 869 | engines: {node: '>=10.13.0'} 870 | 871 | globals@14.0.0: 872 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 873 | engines: {node: '>=18'} 874 | 875 | globalyzer@0.1.0: 876 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 877 | 878 | globrex@0.1.2: 879 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 880 | 881 | graphemer@1.4.0: 882 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 883 | 884 | has-flag@4.0.0: 885 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 886 | engines: {node: '>=8'} 887 | 888 | ignore@5.2.0: 889 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 890 | engines: {node: '>= 4'} 891 | 892 | ignore@5.3.2: 893 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 894 | engines: {node: '>= 4'} 895 | 896 | import-fresh@3.3.0: 897 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 898 | engines: {node: '>=6'} 899 | 900 | import-meta-resolve@4.1.0: 901 | resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} 902 | 903 | imurmurhash@0.1.4: 904 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 905 | engines: {node: '>=0.8.19'} 906 | 907 | is-binary-path@2.1.0: 908 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 909 | engines: {node: '>=8'} 910 | 911 | is-extglob@2.1.1: 912 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 913 | engines: {node: '>=0.10.0'} 914 | 915 | is-glob@4.0.3: 916 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 917 | engines: {node: '>=0.10.0'} 918 | 919 | is-number@7.0.0: 920 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 921 | engines: {node: '>=0.12.0'} 922 | 923 | is-path-inside@3.0.3: 924 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 925 | engines: {node: '>=8'} 926 | 927 | is-reference@3.0.2: 928 | resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} 929 | 930 | isexe@2.0.0: 931 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 932 | 933 | js-tokens@4.0.0: 934 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 935 | 936 | js-yaml@4.1.0: 937 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 938 | hasBin: true 939 | 940 | json-buffer@3.0.1: 941 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 942 | 943 | json-schema-traverse@0.4.1: 944 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 945 | 946 | json-stable-stringify-without-jsonify@1.0.1: 947 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 948 | 949 | keyv@4.5.4: 950 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 951 | 952 | kleur@4.1.5: 953 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 954 | engines: {node: '>=6'} 955 | 956 | known-css-properties@0.34.0: 957 | resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} 958 | 959 | levn@0.4.1: 960 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 961 | engines: {node: '>= 0.8.0'} 962 | 963 | lilconfig@2.1.0: 964 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 965 | engines: {node: '>=10'} 966 | 967 | locate-character@3.0.0: 968 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 969 | 970 | locate-path@6.0.0: 971 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 972 | engines: {node: '>=10'} 973 | 974 | lodash.merge@4.6.2: 975 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 976 | 977 | loose-envify@1.4.0: 978 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 979 | hasBin: true 980 | 981 | magic-string@0.30.11: 982 | resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} 983 | 984 | mdn-data@2.0.30: 985 | resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 986 | 987 | merge2@1.4.1: 988 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 989 | engines: {node: '>= 8'} 990 | 991 | micromatch@4.0.5: 992 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 993 | engines: {node: '>=8.6'} 994 | 995 | minimatch@3.1.2: 996 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 997 | 998 | minimatch@9.0.5: 999 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1000 | engines: {node: '>=16 || 14 >=14.17'} 1001 | 1002 | mri@1.2.0: 1003 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1004 | engines: {node: '>=4'} 1005 | 1006 | mrmime@2.0.0: 1007 | resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} 1008 | engines: {node: '>=10'} 1009 | 1010 | ms@2.1.2: 1011 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1012 | 1013 | nanoid@3.3.7: 1014 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1015 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1016 | hasBin: true 1017 | 1018 | natural-compare@1.4.0: 1019 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1020 | 1021 | normalize-path@3.0.0: 1022 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1023 | engines: {node: '>=0.10.0'} 1024 | 1025 | object-assign@4.1.1: 1026 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1027 | engines: {node: '>=0.10.0'} 1028 | 1029 | optionator@0.9.4: 1030 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1031 | engines: {node: '>= 0.8.0'} 1032 | 1033 | p-limit@3.1.0: 1034 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1035 | engines: {node: '>=10'} 1036 | 1037 | p-locate@5.0.0: 1038 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1039 | engines: {node: '>=10'} 1040 | 1041 | parent-module@1.0.1: 1042 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1043 | engines: {node: '>=6'} 1044 | 1045 | path-exists@4.0.0: 1046 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1047 | engines: {node: '>=8'} 1048 | 1049 | path-key@3.1.1: 1050 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1051 | engines: {node: '>=8'} 1052 | 1053 | periscopic@3.1.0: 1054 | resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} 1055 | 1056 | picocolors@1.0.0: 1057 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1058 | 1059 | picocolors@1.1.0: 1060 | resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} 1061 | 1062 | picomatch@2.3.1: 1063 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1064 | engines: {node: '>=8.6'} 1065 | 1066 | postcss-load-config@3.1.4: 1067 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 1068 | engines: {node: '>= 10'} 1069 | peerDependencies: 1070 | postcss: '>=8.0.9' 1071 | ts-node: '>=9.0.0' 1072 | peerDependenciesMeta: 1073 | postcss: 1074 | optional: true 1075 | ts-node: 1076 | optional: true 1077 | 1078 | postcss-safe-parser@6.0.0: 1079 | resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} 1080 | engines: {node: '>=12.0'} 1081 | peerDependencies: 1082 | postcss: ^8.3.3 1083 | 1084 | postcss-scss@4.0.9: 1085 | resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} 1086 | engines: {node: '>=12.0'} 1087 | peerDependencies: 1088 | postcss: ^8.4.29 1089 | 1090 | postcss-selector-parser@6.1.2: 1091 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 1092 | engines: {node: '>=4'} 1093 | 1094 | postcss@8.4.47: 1095 | resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} 1096 | engines: {node: ^10 || ^12 || >=14} 1097 | 1098 | prelude-ls@1.2.1: 1099 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1100 | engines: {node: '>= 0.8.0'} 1101 | 1102 | prettier-plugin-svelte@3.2.6: 1103 | resolution: {integrity: sha512-Y1XWLw7vXUQQZmgv1JAEiLcErqUniAF2wO7QJsw8BVMvpLET2dI5WpEIEJx1r11iHVdSMzQxivyfrH9On9t2IQ==} 1104 | peerDependencies: 1105 | prettier: ^3.0.0 1106 | svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 1107 | 1108 | prettier@3.3.3: 1109 | resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 1110 | engines: {node: '>=14'} 1111 | hasBin: true 1112 | 1113 | prop-types@15.8.1: 1114 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 1115 | 1116 | punycode@2.1.1: 1117 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 1118 | engines: {node: '>=6'} 1119 | 1120 | queue-microtask@1.2.3: 1121 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1122 | 1123 | react-dom@16.14.0: 1124 | resolution: {integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==} 1125 | peerDependencies: 1126 | react: ^16.14.0 1127 | 1128 | react-is@16.13.1: 1129 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 1130 | 1131 | react@16.14.0: 1132 | resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==} 1133 | engines: {node: '>=0.10.0'} 1134 | 1135 | readdirp@3.6.0: 1136 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1137 | engines: {node: '>=8.10.0'} 1138 | 1139 | resolve-from@4.0.0: 1140 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1141 | engines: {node: '>=4'} 1142 | 1143 | reusify@1.0.4: 1144 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1145 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1146 | 1147 | rollup-plugin-svelte-svg@0.2.3: 1148 | resolution: {integrity: sha512-WH2KqihgVbcJT/PrjiJ/ipctrGueRdOLaaEuAIbXYqfsEzNb9krOVLyc5TL7to3cEKL6DiAa8IEe7IL1oqVolg==} 1149 | peerDependencies: 1150 | svelte: ^3.16.7 1151 | 1152 | rollup-pluginutils@1.5.2: 1153 | resolution: {integrity: sha512-SjdWWWO/CUoMpDy8RUbZ/pSpG68YHmhk5ROKNIoi2En9bJ8bTt3IhYi254RWiTclQmL7Awmrq+rZFOhZkJAHmQ==} 1154 | 1155 | rollup@2.78.1: 1156 | resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} 1157 | engines: {node: '>=10.0.0'} 1158 | hasBin: true 1159 | 1160 | rollup@4.22.4: 1161 | resolution: {integrity: sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==} 1162 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1163 | hasBin: true 1164 | 1165 | run-parallel@1.2.0: 1166 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1167 | 1168 | sade@1.8.1: 1169 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1170 | engines: {node: '>=6'} 1171 | 1172 | scheduler@0.19.1: 1173 | resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} 1174 | 1175 | semver@7.6.3: 1176 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1177 | engines: {node: '>=10'} 1178 | hasBin: true 1179 | 1180 | set-cookie-parser@2.7.0: 1181 | resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==} 1182 | 1183 | shebang-command@2.0.0: 1184 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1185 | engines: {node: '>=8'} 1186 | 1187 | shebang-regex@3.0.0: 1188 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1189 | engines: {node: '>=8'} 1190 | 1191 | sirv@2.0.4: 1192 | resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} 1193 | engines: {node: '>= 10'} 1194 | 1195 | source-map-js@1.0.2: 1196 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1197 | engines: {node: '>=0.10.0'} 1198 | 1199 | source-map-js@1.2.1: 1200 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1201 | engines: {node: '>=0.10.0'} 1202 | 1203 | strip-ansi@6.0.1: 1204 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1205 | engines: {node: '>=8'} 1206 | 1207 | strip-json-comments@3.1.1: 1208 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1209 | engines: {node: '>=8'} 1210 | 1211 | supports-color@7.2.0: 1212 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1213 | engines: {node: '>=8'} 1214 | 1215 | svelte-check@4.0.2: 1216 | resolution: {integrity: sha512-w2yqcG9ELJe2RJCnAvB7v0OgkHhL3czzz/tVoxGFfO6y4mOrF6QHCDhXijeXzsU7LVKEwWS3Qd9tza4JBuDxqA==} 1217 | engines: {node: '>= 18.0.0'} 1218 | hasBin: true 1219 | peerDependencies: 1220 | svelte: ^4.0.0 || ^5.0.0-next.0 1221 | typescript: '>=5.0.0' 1222 | 1223 | svelte-eslint-parser@0.41.1: 1224 | resolution: {integrity: sha512-08ndI6zTghzI8SuJAFpvMbA/haPSGn3xz19pjre19yYMw8Nw/wQJ2PrZBI/L8ijGTgtkWCQQiLLy+Z1tfaCwNA==} 1225 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1226 | peerDependencies: 1227 | svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 1228 | peerDependenciesMeta: 1229 | svelte: 1230 | optional: true 1231 | 1232 | svelte-hmr@0.16.0: 1233 | resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} 1234 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 1235 | peerDependencies: 1236 | svelte: ^3.19.0 || ^4.0.0 1237 | 1238 | svelte-preprocess@6.0.2: 1239 | resolution: {integrity: sha512-OvDTLfaOkkhjprbDKO0SOCkjNYuHy16dbD4SpqbIi6QiabOMHxRT4km5/dzbFFkmW1L0E2INF3MFltG2pgOyKQ==} 1240 | engines: {node: '>= 18.0.0'} 1241 | peerDependencies: 1242 | '@babel/core': ^7.10.2 1243 | coffeescript: ^2.5.1 1244 | less: ^3.11.3 || ^4.0.0 1245 | postcss: ^7 || ^8 1246 | postcss-load-config: '>=3' 1247 | pug: ^3.0.0 1248 | sass: ^1.26.8 1249 | stylus: '>=0.55' 1250 | sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 1251 | svelte: ^4.0.0 || ^5.0.0-next.100 || ^5.0.0 1252 | typescript: ^5.0.0 1253 | peerDependenciesMeta: 1254 | '@babel/core': 1255 | optional: true 1256 | coffeescript: 1257 | optional: true 1258 | less: 1259 | optional: true 1260 | postcss: 1261 | optional: true 1262 | postcss-load-config: 1263 | optional: true 1264 | pug: 1265 | optional: true 1266 | sass: 1267 | optional: true 1268 | stylus: 1269 | optional: true 1270 | sugarss: 1271 | optional: true 1272 | typescript: 1273 | optional: true 1274 | 1275 | svelte-tiny-linked-charts@1.6.1: 1276 | resolution: {integrity: sha512-Ov+k5O/0NvHGUuuWTrfQ3hm2q5iKo7P1aYJ79c8epg8lYbOLdaQm6GST6tyiqTucPtyrNHo3G5gSOG2zT4Ca8A==} 1277 | peerDependencies: 1278 | svelte: ^4.0.0 || >= 5.0.0 1279 | 1280 | svelte@3.55.1: 1281 | resolution: {integrity: sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==} 1282 | engines: {node: '>= 8'} 1283 | 1284 | svelte@4.2.19: 1285 | resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} 1286 | engines: {node: '>=16'} 1287 | 1288 | tabbable@5.3.3: 1289 | resolution: {integrity: sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==} 1290 | 1291 | tailwind-merge@1.14.0: 1292 | resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} 1293 | 1294 | text-table@0.2.0: 1295 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1296 | 1297 | tiny-glob@0.2.9: 1298 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 1299 | 1300 | to-regex-range@5.0.1: 1301 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1302 | engines: {node: '>=8.0'} 1303 | 1304 | totalist@3.0.0: 1305 | resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} 1306 | engines: {node: '>=6'} 1307 | 1308 | ts-api-utils@1.3.0: 1309 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 1310 | engines: {node: '>=16'} 1311 | peerDependencies: 1312 | typescript: '>=4.2.0' 1313 | 1314 | tslib@2.7.0: 1315 | resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} 1316 | 1317 | type-check@0.4.0: 1318 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1319 | engines: {node: '>= 0.8.0'} 1320 | 1321 | typescript@5.6.2: 1322 | resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} 1323 | engines: {node: '>=14.17'} 1324 | hasBin: true 1325 | 1326 | uri-js@4.4.1: 1327 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1328 | 1329 | util-deprecate@1.0.2: 1330 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1331 | 1332 | uuid@10.0.0: 1333 | resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} 1334 | hasBin: true 1335 | 1336 | vite@5.4.7: 1337 | resolution: {integrity: sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==} 1338 | engines: {node: ^18.0.0 || >=20.0.0} 1339 | hasBin: true 1340 | peerDependencies: 1341 | '@types/node': ^18.0.0 || >=20.0.0 1342 | less: '*' 1343 | lightningcss: ^1.21.0 1344 | sass: '*' 1345 | sass-embedded: '*' 1346 | stylus: '*' 1347 | sugarss: '*' 1348 | terser: ^5.4.0 1349 | peerDependenciesMeta: 1350 | '@types/node': 1351 | optional: true 1352 | less: 1353 | optional: true 1354 | lightningcss: 1355 | optional: true 1356 | sass: 1357 | optional: true 1358 | sass-embedded: 1359 | optional: true 1360 | stylus: 1361 | optional: true 1362 | sugarss: 1363 | optional: true 1364 | terser: 1365 | optional: true 1366 | 1367 | vitefu@0.2.5: 1368 | resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} 1369 | peerDependencies: 1370 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 1371 | peerDependenciesMeta: 1372 | vite: 1373 | optional: true 1374 | 1375 | which@2.0.2: 1376 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1377 | engines: {node: '>= 8'} 1378 | hasBin: true 1379 | 1380 | word-wrap@1.2.5: 1381 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1382 | engines: {node: '>=0.10.0'} 1383 | 1384 | yaml@1.10.2: 1385 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1386 | engines: {node: '>= 6'} 1387 | 1388 | yocto-queue@0.1.0: 1389 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1390 | engines: {node: '>=10'} 1391 | 1392 | snapshots: 1393 | 1394 | '@ampproject/remapping@2.3.0': 1395 | dependencies: 1396 | '@jridgewell/gen-mapping': 0.3.5 1397 | '@jridgewell/trace-mapping': 0.3.25 1398 | 1399 | '@esbuild/aix-ppc64@0.21.5': 1400 | optional: true 1401 | 1402 | '@esbuild/android-arm64@0.21.5': 1403 | optional: true 1404 | 1405 | '@esbuild/android-arm@0.21.5': 1406 | optional: true 1407 | 1408 | '@esbuild/android-x64@0.21.5': 1409 | optional: true 1410 | 1411 | '@esbuild/darwin-arm64@0.21.5': 1412 | optional: true 1413 | 1414 | '@esbuild/darwin-x64@0.21.5': 1415 | optional: true 1416 | 1417 | '@esbuild/freebsd-arm64@0.21.5': 1418 | optional: true 1419 | 1420 | '@esbuild/freebsd-x64@0.21.5': 1421 | optional: true 1422 | 1423 | '@esbuild/linux-arm64@0.21.5': 1424 | optional: true 1425 | 1426 | '@esbuild/linux-arm@0.21.5': 1427 | optional: true 1428 | 1429 | '@esbuild/linux-ia32@0.21.5': 1430 | optional: true 1431 | 1432 | '@esbuild/linux-loong64@0.21.5': 1433 | optional: true 1434 | 1435 | '@esbuild/linux-mips64el@0.21.5': 1436 | optional: true 1437 | 1438 | '@esbuild/linux-ppc64@0.21.5': 1439 | optional: true 1440 | 1441 | '@esbuild/linux-riscv64@0.21.5': 1442 | optional: true 1443 | 1444 | '@esbuild/linux-s390x@0.21.5': 1445 | optional: true 1446 | 1447 | '@esbuild/linux-x64@0.21.5': 1448 | optional: true 1449 | 1450 | '@esbuild/netbsd-x64@0.21.5': 1451 | optional: true 1452 | 1453 | '@esbuild/openbsd-x64@0.21.5': 1454 | optional: true 1455 | 1456 | '@esbuild/sunos-x64@0.21.5': 1457 | optional: true 1458 | 1459 | '@esbuild/win32-arm64@0.21.5': 1460 | optional: true 1461 | 1462 | '@esbuild/win32-ia32@0.21.5': 1463 | optional: true 1464 | 1465 | '@esbuild/win32-x64@0.21.5': 1466 | optional: true 1467 | 1468 | '@eslint-community/eslint-utils@4.4.0(eslint@9.11.0)': 1469 | dependencies: 1470 | eslint: 9.11.0 1471 | eslint-visitor-keys: 3.3.0 1472 | 1473 | '@eslint-community/regexpp@4.11.1': {} 1474 | 1475 | '@eslint/config-array@0.18.0': 1476 | dependencies: 1477 | '@eslint/object-schema': 2.1.4 1478 | debug: 4.3.4 1479 | minimatch: 3.1.2 1480 | transitivePeerDependencies: 1481 | - supports-color 1482 | 1483 | '@eslint/eslintrc@3.1.0': 1484 | dependencies: 1485 | ajv: 6.12.6 1486 | debug: 4.3.4 1487 | espree: 10.1.0 1488 | globals: 14.0.0 1489 | ignore: 5.2.0 1490 | import-fresh: 3.3.0 1491 | js-yaml: 4.1.0 1492 | minimatch: 3.1.2 1493 | strip-json-comments: 3.1.1 1494 | transitivePeerDependencies: 1495 | - supports-color 1496 | 1497 | '@eslint/js@9.11.0': {} 1498 | 1499 | '@eslint/object-schema@2.1.4': {} 1500 | 1501 | '@eslint/plugin-kit@0.2.0': 1502 | dependencies: 1503 | levn: 0.4.1 1504 | 1505 | '@fontsource/fira-mono@5.1.0': {} 1506 | 1507 | '@humanwhocodes/module-importer@1.0.1': {} 1508 | 1509 | '@humanwhocodes/retry@0.3.0': {} 1510 | 1511 | '@jridgewell/gen-mapping@0.3.5': 1512 | dependencies: 1513 | '@jridgewell/set-array': 1.2.1 1514 | '@jridgewell/sourcemap-codec': 1.5.0 1515 | '@jridgewell/trace-mapping': 0.3.25 1516 | 1517 | '@jridgewell/resolve-uri@3.1.0': {} 1518 | 1519 | '@jridgewell/set-array@1.2.1': {} 1520 | 1521 | '@jridgewell/sourcemap-codec@1.5.0': {} 1522 | 1523 | '@jridgewell/trace-mapping@0.3.25': 1524 | dependencies: 1525 | '@jridgewell/resolve-uri': 3.1.0 1526 | '@jridgewell/sourcemap-codec': 1.5.0 1527 | 1528 | '@nodelib/fs.scandir@2.1.5': 1529 | dependencies: 1530 | '@nodelib/fs.stat': 2.0.5 1531 | run-parallel: 1.2.0 1532 | 1533 | '@nodelib/fs.stat@2.0.5': {} 1534 | 1535 | '@nodelib/fs.walk@1.2.8': 1536 | dependencies: 1537 | '@nodelib/fs.scandir': 2.1.5 1538 | fastq: 1.13.0 1539 | 1540 | '@polka/url@1.0.0-next.28': {} 1541 | 1542 | '@rollup/rollup-android-arm-eabi@4.22.4': 1543 | optional: true 1544 | 1545 | '@rollup/rollup-android-arm64@4.22.4': 1546 | optional: true 1547 | 1548 | '@rollup/rollup-darwin-arm64@4.22.4': 1549 | optional: true 1550 | 1551 | '@rollup/rollup-darwin-x64@4.22.4': 1552 | optional: true 1553 | 1554 | '@rollup/rollup-linux-arm-gnueabihf@4.22.4': 1555 | optional: true 1556 | 1557 | '@rollup/rollup-linux-arm-musleabihf@4.22.4': 1558 | optional: true 1559 | 1560 | '@rollup/rollup-linux-arm64-gnu@4.22.4': 1561 | optional: true 1562 | 1563 | '@rollup/rollup-linux-arm64-musl@4.22.4': 1564 | optional: true 1565 | 1566 | '@rollup/rollup-linux-powerpc64le-gnu@4.22.4': 1567 | optional: true 1568 | 1569 | '@rollup/rollup-linux-riscv64-gnu@4.22.4': 1570 | optional: true 1571 | 1572 | '@rollup/rollup-linux-s390x-gnu@4.22.4': 1573 | optional: true 1574 | 1575 | '@rollup/rollup-linux-x64-gnu@4.22.4': 1576 | optional: true 1577 | 1578 | '@rollup/rollup-linux-x64-musl@4.22.4': 1579 | optional: true 1580 | 1581 | '@rollup/rollup-win32-arm64-msvc@4.22.4': 1582 | optional: true 1583 | 1584 | '@rollup/rollup-win32-ia32-msvc@4.22.4': 1585 | optional: true 1586 | 1587 | '@rollup/rollup-win32-x64-msvc@4.22.4': 1588 | optional: true 1589 | 1590 | '@sveltejs/adapter-auto@3.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))': 1591 | dependencies: 1592 | '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)) 1593 | import-meta-resolve: 4.1.0 1594 | 1595 | '@sveltejs/adapter-static@3.0.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))': 1596 | dependencies: 1597 | '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)) 1598 | 1599 | '@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18))': 1600 | dependencies: 1601 | '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)) 1602 | '@types/cookie': 0.6.0 1603 | cookie: 0.6.0 1604 | devalue: 5.0.0 1605 | esm-env: 1.0.0 1606 | import-meta-resolve: 4.1.0 1607 | kleur: 4.1.5 1608 | magic-string: 0.30.11 1609 | mrmime: 2.0.0 1610 | sade: 1.8.1 1611 | set-cookie-parser: 2.7.0 1612 | sirv: 2.0.4 1613 | svelte: 4.2.19 1614 | tiny-glob: 0.2.9 1615 | vite: 5.4.7(@types/node@18.7.18) 1616 | 1617 | '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18))': 1618 | dependencies: 1619 | '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)) 1620 | debug: 4.3.4 1621 | svelte: 4.2.19 1622 | vite: 5.4.7(@types/node@18.7.18) 1623 | transitivePeerDependencies: 1624 | - supports-color 1625 | 1626 | '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18))': 1627 | dependencies: 1628 | '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)))(svelte@4.2.19)(vite@5.4.7(@types/node@18.7.18)) 1629 | debug: 4.3.4 1630 | deepmerge: 4.3.1 1631 | kleur: 4.1.5 1632 | magic-string: 0.30.11 1633 | svelte: 4.2.19 1634 | svelte-hmr: 0.16.0(svelte@4.2.19) 1635 | vite: 5.4.7(@types/node@18.7.18) 1636 | vitefu: 0.2.5(vite@5.4.7(@types/node@18.7.18)) 1637 | transitivePeerDependencies: 1638 | - supports-color 1639 | 1640 | '@tauri-apps/api@1.6.0': {} 1641 | 1642 | '@tauri-apps/cli-darwin-arm64@1.6.2': 1643 | optional: true 1644 | 1645 | '@tauri-apps/cli-darwin-x64@1.6.2': 1646 | optional: true 1647 | 1648 | '@tauri-apps/cli-linux-arm-gnueabihf@1.6.2': 1649 | optional: true 1650 | 1651 | '@tauri-apps/cli-linux-arm64-gnu@1.6.2': 1652 | optional: true 1653 | 1654 | '@tauri-apps/cli-linux-arm64-musl@1.6.2': 1655 | optional: true 1656 | 1657 | '@tauri-apps/cli-linux-x64-gnu@1.6.2': 1658 | optional: true 1659 | 1660 | '@tauri-apps/cli-linux-x64-musl@1.6.2': 1661 | optional: true 1662 | 1663 | '@tauri-apps/cli-win32-arm64-msvc@1.6.2': 1664 | optional: true 1665 | 1666 | '@tauri-apps/cli-win32-ia32-msvc@1.6.2': 1667 | optional: true 1668 | 1669 | '@tauri-apps/cli-win32-x64-msvc@1.6.2': 1670 | optional: true 1671 | 1672 | '@tauri-apps/cli@1.6.2': 1673 | optionalDependencies: 1674 | '@tauri-apps/cli-darwin-arm64': 1.6.2 1675 | '@tauri-apps/cli-darwin-x64': 1.6.2 1676 | '@tauri-apps/cli-linux-arm-gnueabihf': 1.6.2 1677 | '@tauri-apps/cli-linux-arm64-gnu': 1.6.2 1678 | '@tauri-apps/cli-linux-arm64-musl': 1.6.2 1679 | '@tauri-apps/cli-linux-x64-gnu': 1.6.2 1680 | '@tauri-apps/cli-linux-x64-musl': 1.6.2 1681 | '@tauri-apps/cli-win32-arm64-msvc': 1.6.2 1682 | '@tauri-apps/cli-win32-ia32-msvc': 1.6.2 1683 | '@tauri-apps/cli-win32-x64-msvc': 1.6.2 1684 | 1685 | '@tauri-controls/svelte@0.4.0(clsx@2.1.1)(svelte@4.2.19)(tailwind-merge@1.14.0)': 1686 | dependencies: 1687 | clsx: 2.1.1 1688 | svelte: 4.2.19 1689 | tailwind-merge: 1.14.0 1690 | 1691 | '@types/cookie@0.6.0': {} 1692 | 1693 | '@types/estree@1.0.5': {} 1694 | 1695 | '@types/estree@1.0.6': {} 1696 | 1697 | '@types/node@18.7.18': {} 1698 | 1699 | '@types/rollup-plugin-svelte-svg@1.0.6': 1700 | dependencies: 1701 | '@types/svgo': 2.6.4 1702 | rollup: 2.78.1 1703 | svelte: 3.55.1 1704 | 1705 | '@types/svgo@2.6.4': 1706 | dependencies: 1707 | '@types/node': 18.7.18 1708 | 1709 | '@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0)(typescript@5.6.2))(eslint@9.11.0)(typescript@5.6.2)': 1710 | dependencies: 1711 | '@eslint-community/regexpp': 4.11.1 1712 | '@typescript-eslint/parser': 8.6.0(eslint@9.11.0)(typescript@5.6.2) 1713 | '@typescript-eslint/scope-manager': 8.6.0 1714 | '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.0)(typescript@5.6.2) 1715 | '@typescript-eslint/utils': 8.6.0(eslint@9.11.0)(typescript@5.6.2) 1716 | '@typescript-eslint/visitor-keys': 8.6.0 1717 | eslint: 9.11.0 1718 | graphemer: 1.4.0 1719 | ignore: 5.3.2 1720 | natural-compare: 1.4.0 1721 | ts-api-utils: 1.3.0(typescript@5.6.2) 1722 | optionalDependencies: 1723 | typescript: 5.6.2 1724 | transitivePeerDependencies: 1725 | - supports-color 1726 | 1727 | '@typescript-eslint/parser@8.6.0(eslint@9.11.0)(typescript@5.6.2)': 1728 | dependencies: 1729 | '@typescript-eslint/scope-manager': 8.6.0 1730 | '@typescript-eslint/types': 8.6.0 1731 | '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) 1732 | '@typescript-eslint/visitor-keys': 8.6.0 1733 | debug: 4.3.4 1734 | eslint: 9.11.0 1735 | optionalDependencies: 1736 | typescript: 5.6.2 1737 | transitivePeerDependencies: 1738 | - supports-color 1739 | 1740 | '@typescript-eslint/scope-manager@8.6.0': 1741 | dependencies: 1742 | '@typescript-eslint/types': 8.6.0 1743 | '@typescript-eslint/visitor-keys': 8.6.0 1744 | 1745 | '@typescript-eslint/type-utils@8.6.0(eslint@9.11.0)(typescript@5.6.2)': 1746 | dependencies: 1747 | '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) 1748 | '@typescript-eslint/utils': 8.6.0(eslint@9.11.0)(typescript@5.6.2) 1749 | debug: 4.3.4 1750 | ts-api-utils: 1.3.0(typescript@5.6.2) 1751 | optionalDependencies: 1752 | typescript: 5.6.2 1753 | transitivePeerDependencies: 1754 | - eslint 1755 | - supports-color 1756 | 1757 | '@typescript-eslint/types@8.6.0': {} 1758 | 1759 | '@typescript-eslint/typescript-estree@8.6.0(typescript@5.6.2)': 1760 | dependencies: 1761 | '@typescript-eslint/types': 8.6.0 1762 | '@typescript-eslint/visitor-keys': 8.6.0 1763 | debug: 4.3.4 1764 | fast-glob: 3.3.2 1765 | is-glob: 4.0.3 1766 | minimatch: 9.0.5 1767 | semver: 7.6.3 1768 | ts-api-utils: 1.3.0(typescript@5.6.2) 1769 | optionalDependencies: 1770 | typescript: 5.6.2 1771 | transitivePeerDependencies: 1772 | - supports-color 1773 | 1774 | '@typescript-eslint/utils@8.6.0(eslint@9.11.0)(typescript@5.6.2)': 1775 | dependencies: 1776 | '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.0) 1777 | '@typescript-eslint/scope-manager': 8.6.0 1778 | '@typescript-eslint/types': 8.6.0 1779 | '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) 1780 | eslint: 9.11.0 1781 | transitivePeerDependencies: 1782 | - supports-color 1783 | - typescript 1784 | 1785 | '@typescript-eslint/visitor-keys@8.6.0': 1786 | dependencies: 1787 | '@typescript-eslint/types': 8.6.0 1788 | eslint-visitor-keys: 3.4.3 1789 | 1790 | acorn-jsx@5.3.2(acorn@8.12.1): 1791 | dependencies: 1792 | acorn: 8.12.1 1793 | 1794 | acorn@8.12.1: {} 1795 | 1796 | ajv@6.12.6: 1797 | dependencies: 1798 | fast-deep-equal: 3.1.3 1799 | fast-json-stable-stringify: 2.1.0 1800 | json-schema-traverse: 0.4.1 1801 | uri-js: 4.4.1 1802 | 1803 | ansi-regex@5.0.1: {} 1804 | 1805 | ansi-styles@4.3.0: 1806 | dependencies: 1807 | color-convert: 2.0.1 1808 | 1809 | anymatch@3.1.2: 1810 | dependencies: 1811 | normalize-path: 3.0.0 1812 | picomatch: 2.3.1 1813 | 1814 | argparse@2.0.1: {} 1815 | 1816 | aria-query@5.3.2: {} 1817 | 1818 | axobject-query@4.1.0: {} 1819 | 1820 | balanced-match@1.0.2: {} 1821 | 1822 | binary-extensions@2.2.0: {} 1823 | 1824 | brace-expansion@1.1.11: 1825 | dependencies: 1826 | balanced-match: 1.0.2 1827 | concat-map: 0.0.1 1828 | 1829 | brace-expansion@2.0.1: 1830 | dependencies: 1831 | balanced-match: 1.0.2 1832 | 1833 | braces@3.0.2: 1834 | dependencies: 1835 | fill-range: 7.0.1 1836 | 1837 | callsites@3.1.0: {} 1838 | 1839 | chalk@4.1.2: 1840 | dependencies: 1841 | ansi-styles: 4.3.0 1842 | supports-color: 7.2.0 1843 | 1844 | chokidar@3.5.3: 1845 | dependencies: 1846 | anymatch: 3.1.2 1847 | braces: 3.0.2 1848 | glob-parent: 5.1.2 1849 | is-binary-path: 2.1.0 1850 | is-glob: 4.0.3 1851 | normalize-path: 3.0.0 1852 | readdirp: 3.6.0 1853 | optionalDependencies: 1854 | fsevents: 2.3.2 1855 | 1856 | clsx@2.1.1: {} 1857 | 1858 | code-red@1.0.4: 1859 | dependencies: 1860 | '@jridgewell/sourcemap-codec': 1.5.0 1861 | '@types/estree': 1.0.6 1862 | acorn: 8.12.1 1863 | estree-walker: 3.0.3 1864 | periscopic: 3.1.0 1865 | 1866 | color-convert@2.0.1: 1867 | dependencies: 1868 | color-name: 1.1.4 1869 | 1870 | color-name@1.1.4: {} 1871 | 1872 | concat-map@0.0.1: {} 1873 | 1874 | cookie@0.6.0: {} 1875 | 1876 | cross-spawn@7.0.3: 1877 | dependencies: 1878 | path-key: 3.1.1 1879 | shebang-command: 2.0.0 1880 | which: 2.0.2 1881 | 1882 | css-tree@2.3.1: 1883 | dependencies: 1884 | mdn-data: 2.0.30 1885 | source-map-js: 1.0.2 1886 | 1887 | cssesc@3.0.0: {} 1888 | 1889 | days-of-week@1.0.3(prop-types@15.8.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0): 1890 | dependencies: 1891 | prop-types: 15.8.1 1892 | react: 16.14.0 1893 | react-dom: 16.14.0(react@16.14.0) 1894 | 1895 | debug@4.3.4: 1896 | dependencies: 1897 | ms: 2.1.2 1898 | 1899 | deep-is@0.1.4: {} 1900 | 1901 | deepmerge@4.3.1: {} 1902 | 1903 | devalue@5.0.0: {} 1904 | 1905 | esbuild@0.21.5: 1906 | optionalDependencies: 1907 | '@esbuild/aix-ppc64': 0.21.5 1908 | '@esbuild/android-arm': 0.21.5 1909 | '@esbuild/android-arm64': 0.21.5 1910 | '@esbuild/android-x64': 0.21.5 1911 | '@esbuild/darwin-arm64': 0.21.5 1912 | '@esbuild/darwin-x64': 0.21.5 1913 | '@esbuild/freebsd-arm64': 0.21.5 1914 | '@esbuild/freebsd-x64': 0.21.5 1915 | '@esbuild/linux-arm': 0.21.5 1916 | '@esbuild/linux-arm64': 0.21.5 1917 | '@esbuild/linux-ia32': 0.21.5 1918 | '@esbuild/linux-loong64': 0.21.5 1919 | '@esbuild/linux-mips64el': 0.21.5 1920 | '@esbuild/linux-ppc64': 0.21.5 1921 | '@esbuild/linux-riscv64': 0.21.5 1922 | '@esbuild/linux-s390x': 0.21.5 1923 | '@esbuild/linux-x64': 0.21.5 1924 | '@esbuild/netbsd-x64': 0.21.5 1925 | '@esbuild/openbsd-x64': 0.21.5 1926 | '@esbuild/sunos-x64': 0.21.5 1927 | '@esbuild/win32-arm64': 0.21.5 1928 | '@esbuild/win32-ia32': 0.21.5 1929 | '@esbuild/win32-x64': 0.21.5 1930 | 1931 | escape-string-regexp@4.0.0: {} 1932 | 1933 | eslint-compat-utils@0.5.1(eslint@9.11.0): 1934 | dependencies: 1935 | eslint: 9.11.0 1936 | semver: 7.6.3 1937 | 1938 | eslint-config-prettier@9.1.0(eslint@9.11.0): 1939 | dependencies: 1940 | eslint: 9.11.0 1941 | 1942 | eslint-plugin-svelte@2.44.0(eslint@9.11.0)(svelte@4.2.19): 1943 | dependencies: 1944 | '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.0) 1945 | '@jridgewell/sourcemap-codec': 1.5.0 1946 | eslint: 9.11.0 1947 | eslint-compat-utils: 0.5.1(eslint@9.11.0) 1948 | esutils: 2.0.3 1949 | known-css-properties: 0.34.0 1950 | postcss: 8.4.47 1951 | postcss-load-config: 3.1.4(postcss@8.4.47) 1952 | postcss-safe-parser: 6.0.0(postcss@8.4.47) 1953 | postcss-selector-parser: 6.1.2 1954 | semver: 7.6.3 1955 | svelte-eslint-parser: 0.41.1(svelte@4.2.19) 1956 | optionalDependencies: 1957 | svelte: 4.2.19 1958 | transitivePeerDependencies: 1959 | - ts-node 1960 | 1961 | eslint-scope@7.2.2: 1962 | dependencies: 1963 | esrecurse: 4.3.0 1964 | estraverse: 5.3.0 1965 | 1966 | eslint-scope@8.0.2: 1967 | dependencies: 1968 | esrecurse: 4.3.0 1969 | estraverse: 5.3.0 1970 | 1971 | eslint-visitor-keys@3.3.0: {} 1972 | 1973 | eslint-visitor-keys@3.4.3: {} 1974 | 1975 | eslint-visitor-keys@4.0.0: {} 1976 | 1977 | eslint@9.11.0: 1978 | dependencies: 1979 | '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.0) 1980 | '@eslint-community/regexpp': 4.11.1 1981 | '@eslint/config-array': 0.18.0 1982 | '@eslint/eslintrc': 3.1.0 1983 | '@eslint/js': 9.11.0 1984 | '@eslint/plugin-kit': 0.2.0 1985 | '@humanwhocodes/module-importer': 1.0.1 1986 | '@humanwhocodes/retry': 0.3.0 1987 | '@nodelib/fs.walk': 1.2.8 1988 | ajv: 6.12.6 1989 | chalk: 4.1.2 1990 | cross-spawn: 7.0.3 1991 | debug: 4.3.4 1992 | escape-string-regexp: 4.0.0 1993 | eslint-scope: 8.0.2 1994 | eslint-visitor-keys: 4.0.0 1995 | espree: 10.1.0 1996 | esquery: 1.6.0 1997 | esutils: 2.0.3 1998 | fast-deep-equal: 3.1.3 1999 | file-entry-cache: 8.0.0 2000 | find-up: 5.0.0 2001 | glob-parent: 6.0.2 2002 | ignore: 5.2.0 2003 | imurmurhash: 0.1.4 2004 | is-glob: 4.0.3 2005 | is-path-inside: 3.0.3 2006 | json-stable-stringify-without-jsonify: 1.0.1 2007 | lodash.merge: 4.6.2 2008 | minimatch: 3.1.2 2009 | natural-compare: 1.4.0 2010 | optionator: 0.9.4 2011 | strip-ansi: 6.0.1 2012 | text-table: 0.2.0 2013 | transitivePeerDependencies: 2014 | - supports-color 2015 | 2016 | esm-env@1.0.0: {} 2017 | 2018 | espree@10.1.0: 2019 | dependencies: 2020 | acorn: 8.12.1 2021 | acorn-jsx: 5.3.2(acorn@8.12.1) 2022 | eslint-visitor-keys: 4.0.0 2023 | 2024 | espree@9.6.1: 2025 | dependencies: 2026 | acorn: 8.12.1 2027 | acorn-jsx: 5.3.2(acorn@8.12.1) 2028 | eslint-visitor-keys: 3.4.3 2029 | 2030 | esquery@1.6.0: 2031 | dependencies: 2032 | estraverse: 5.3.0 2033 | 2034 | esrecurse@4.3.0: 2035 | dependencies: 2036 | estraverse: 5.3.0 2037 | 2038 | estraverse@5.3.0: {} 2039 | 2040 | estree-walker@0.2.1: {} 2041 | 2042 | estree-walker@3.0.3: 2043 | dependencies: 2044 | '@types/estree': 1.0.6 2045 | 2046 | esutils@2.0.3: {} 2047 | 2048 | fast-deep-equal@3.1.3: {} 2049 | 2050 | fast-glob@3.3.2: 2051 | dependencies: 2052 | '@nodelib/fs.stat': 2.0.5 2053 | '@nodelib/fs.walk': 1.2.8 2054 | glob-parent: 5.1.2 2055 | merge2: 1.4.1 2056 | micromatch: 4.0.5 2057 | 2058 | fast-json-stable-stringify@2.1.0: {} 2059 | 2060 | fast-levenshtein@2.0.6: {} 2061 | 2062 | fastq@1.13.0: 2063 | dependencies: 2064 | reusify: 1.0.4 2065 | 2066 | fdir@6.3.0: {} 2067 | 2068 | file-entry-cache@8.0.0: 2069 | dependencies: 2070 | flat-cache: 4.0.1 2071 | 2072 | fill-range@7.0.1: 2073 | dependencies: 2074 | to-regex-range: 5.0.1 2075 | 2076 | find-up@5.0.0: 2077 | dependencies: 2078 | locate-path: 6.0.0 2079 | path-exists: 4.0.0 2080 | 2081 | flat-cache@4.0.1: 2082 | dependencies: 2083 | flatted: 3.3.1 2084 | keyv: 4.5.4 2085 | 2086 | flatted@3.3.1: {} 2087 | 2088 | fluent-svelte@1.6.0: 2089 | dependencies: 2090 | focus-trap: 6.9.4 2091 | tabbable: 5.3.3 2092 | 2093 | focus-trap@6.9.4: 2094 | dependencies: 2095 | tabbable: 5.3.3 2096 | 2097 | fsevents@2.3.2: 2098 | optional: true 2099 | 2100 | fsevents@2.3.3: 2101 | optional: true 2102 | 2103 | glob-parent@5.1.2: 2104 | dependencies: 2105 | is-glob: 4.0.3 2106 | 2107 | glob-parent@6.0.2: 2108 | dependencies: 2109 | is-glob: 4.0.3 2110 | 2111 | globals@14.0.0: {} 2112 | 2113 | globalyzer@0.1.0: {} 2114 | 2115 | globrex@0.1.2: {} 2116 | 2117 | graphemer@1.4.0: {} 2118 | 2119 | has-flag@4.0.0: {} 2120 | 2121 | ignore@5.2.0: {} 2122 | 2123 | ignore@5.3.2: {} 2124 | 2125 | import-fresh@3.3.0: 2126 | dependencies: 2127 | parent-module: 1.0.1 2128 | resolve-from: 4.0.0 2129 | 2130 | import-meta-resolve@4.1.0: {} 2131 | 2132 | imurmurhash@0.1.4: {} 2133 | 2134 | is-binary-path@2.1.0: 2135 | dependencies: 2136 | binary-extensions: 2.2.0 2137 | 2138 | is-extglob@2.1.1: {} 2139 | 2140 | is-glob@4.0.3: 2141 | dependencies: 2142 | is-extglob: 2.1.1 2143 | 2144 | is-number@7.0.0: {} 2145 | 2146 | is-path-inside@3.0.3: {} 2147 | 2148 | is-reference@3.0.2: 2149 | dependencies: 2150 | '@types/estree': 1.0.6 2151 | 2152 | isexe@2.0.0: {} 2153 | 2154 | js-tokens@4.0.0: {} 2155 | 2156 | js-yaml@4.1.0: 2157 | dependencies: 2158 | argparse: 2.0.1 2159 | 2160 | json-buffer@3.0.1: {} 2161 | 2162 | json-schema-traverse@0.4.1: {} 2163 | 2164 | json-stable-stringify-without-jsonify@1.0.1: {} 2165 | 2166 | keyv@4.5.4: 2167 | dependencies: 2168 | json-buffer: 3.0.1 2169 | 2170 | kleur@4.1.5: {} 2171 | 2172 | known-css-properties@0.34.0: {} 2173 | 2174 | levn@0.4.1: 2175 | dependencies: 2176 | prelude-ls: 1.2.1 2177 | type-check: 0.4.0 2178 | 2179 | lilconfig@2.1.0: {} 2180 | 2181 | locate-character@3.0.0: {} 2182 | 2183 | locate-path@6.0.0: 2184 | dependencies: 2185 | p-locate: 5.0.0 2186 | 2187 | lodash.merge@4.6.2: {} 2188 | 2189 | loose-envify@1.4.0: 2190 | dependencies: 2191 | js-tokens: 4.0.0 2192 | 2193 | magic-string@0.30.11: 2194 | dependencies: 2195 | '@jridgewell/sourcemap-codec': 1.5.0 2196 | 2197 | mdn-data@2.0.30: {} 2198 | 2199 | merge2@1.4.1: {} 2200 | 2201 | micromatch@4.0.5: 2202 | dependencies: 2203 | braces: 3.0.2 2204 | picomatch: 2.3.1 2205 | 2206 | minimatch@3.1.2: 2207 | dependencies: 2208 | brace-expansion: 1.1.11 2209 | 2210 | minimatch@9.0.5: 2211 | dependencies: 2212 | brace-expansion: 2.0.1 2213 | 2214 | mri@1.2.0: {} 2215 | 2216 | mrmime@2.0.0: {} 2217 | 2218 | ms@2.1.2: {} 2219 | 2220 | nanoid@3.3.7: {} 2221 | 2222 | natural-compare@1.4.0: {} 2223 | 2224 | normalize-path@3.0.0: {} 2225 | 2226 | object-assign@4.1.1: {} 2227 | 2228 | optionator@0.9.4: 2229 | dependencies: 2230 | deep-is: 0.1.4 2231 | fast-levenshtein: 2.0.6 2232 | levn: 0.4.1 2233 | prelude-ls: 1.2.1 2234 | type-check: 0.4.0 2235 | word-wrap: 1.2.5 2236 | 2237 | p-limit@3.1.0: 2238 | dependencies: 2239 | yocto-queue: 0.1.0 2240 | 2241 | p-locate@5.0.0: 2242 | dependencies: 2243 | p-limit: 3.1.0 2244 | 2245 | parent-module@1.0.1: 2246 | dependencies: 2247 | callsites: 3.1.0 2248 | 2249 | path-exists@4.0.0: {} 2250 | 2251 | path-key@3.1.1: {} 2252 | 2253 | periscopic@3.1.0: 2254 | dependencies: 2255 | '@types/estree': 1.0.6 2256 | estree-walker: 3.0.3 2257 | is-reference: 3.0.2 2258 | 2259 | picocolors@1.0.0: {} 2260 | 2261 | picocolors@1.1.0: {} 2262 | 2263 | picomatch@2.3.1: {} 2264 | 2265 | postcss-load-config@3.1.4(postcss@8.4.47): 2266 | dependencies: 2267 | lilconfig: 2.1.0 2268 | yaml: 1.10.2 2269 | optionalDependencies: 2270 | postcss: 8.4.47 2271 | 2272 | postcss-safe-parser@6.0.0(postcss@8.4.47): 2273 | dependencies: 2274 | postcss: 8.4.47 2275 | 2276 | postcss-scss@4.0.9(postcss@8.4.47): 2277 | dependencies: 2278 | postcss: 8.4.47 2279 | 2280 | postcss-selector-parser@6.1.2: 2281 | dependencies: 2282 | cssesc: 3.0.0 2283 | util-deprecate: 1.0.2 2284 | 2285 | postcss@8.4.47: 2286 | dependencies: 2287 | nanoid: 3.3.7 2288 | picocolors: 1.1.0 2289 | source-map-js: 1.2.1 2290 | 2291 | prelude-ls@1.2.1: {} 2292 | 2293 | prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@4.2.19): 2294 | dependencies: 2295 | prettier: 3.3.3 2296 | svelte: 4.2.19 2297 | 2298 | prettier@3.3.3: {} 2299 | 2300 | prop-types@15.8.1: 2301 | dependencies: 2302 | loose-envify: 1.4.0 2303 | object-assign: 4.1.1 2304 | react-is: 16.13.1 2305 | 2306 | punycode@2.1.1: {} 2307 | 2308 | queue-microtask@1.2.3: {} 2309 | 2310 | react-dom@16.14.0(react@16.14.0): 2311 | dependencies: 2312 | loose-envify: 1.4.0 2313 | object-assign: 4.1.1 2314 | prop-types: 15.8.1 2315 | react: 16.14.0 2316 | scheduler: 0.19.1 2317 | 2318 | react-is@16.13.1: {} 2319 | 2320 | react@16.14.0: 2321 | dependencies: 2322 | loose-envify: 1.4.0 2323 | object-assign: 4.1.1 2324 | prop-types: 15.8.1 2325 | 2326 | readdirp@3.6.0: 2327 | dependencies: 2328 | picomatch: 2.3.1 2329 | 2330 | resolve-from@4.0.0: {} 2331 | 2332 | reusify@1.0.4: {} 2333 | 2334 | rollup-plugin-svelte-svg@0.2.3(svelte@4.2.19): 2335 | dependencies: 2336 | rollup-pluginutils: 1.5.2 2337 | svelte: 4.2.19 2338 | 2339 | rollup-pluginutils@1.5.2: 2340 | dependencies: 2341 | estree-walker: 0.2.1 2342 | minimatch: 3.1.2 2343 | 2344 | rollup@2.78.1: 2345 | optionalDependencies: 2346 | fsevents: 2.3.2 2347 | 2348 | rollup@4.22.4: 2349 | dependencies: 2350 | '@types/estree': 1.0.5 2351 | optionalDependencies: 2352 | '@rollup/rollup-android-arm-eabi': 4.22.4 2353 | '@rollup/rollup-android-arm64': 4.22.4 2354 | '@rollup/rollup-darwin-arm64': 4.22.4 2355 | '@rollup/rollup-darwin-x64': 4.22.4 2356 | '@rollup/rollup-linux-arm-gnueabihf': 4.22.4 2357 | '@rollup/rollup-linux-arm-musleabihf': 4.22.4 2358 | '@rollup/rollup-linux-arm64-gnu': 4.22.4 2359 | '@rollup/rollup-linux-arm64-musl': 4.22.4 2360 | '@rollup/rollup-linux-powerpc64le-gnu': 4.22.4 2361 | '@rollup/rollup-linux-riscv64-gnu': 4.22.4 2362 | '@rollup/rollup-linux-s390x-gnu': 4.22.4 2363 | '@rollup/rollup-linux-x64-gnu': 4.22.4 2364 | '@rollup/rollup-linux-x64-musl': 4.22.4 2365 | '@rollup/rollup-win32-arm64-msvc': 4.22.4 2366 | '@rollup/rollup-win32-ia32-msvc': 4.22.4 2367 | '@rollup/rollup-win32-x64-msvc': 4.22.4 2368 | fsevents: 2.3.3 2369 | 2370 | run-parallel@1.2.0: 2371 | dependencies: 2372 | queue-microtask: 1.2.3 2373 | 2374 | sade@1.8.1: 2375 | dependencies: 2376 | mri: 1.2.0 2377 | 2378 | scheduler@0.19.1: 2379 | dependencies: 2380 | loose-envify: 1.4.0 2381 | object-assign: 4.1.1 2382 | 2383 | semver@7.6.3: {} 2384 | 2385 | set-cookie-parser@2.7.0: {} 2386 | 2387 | shebang-command@2.0.0: 2388 | dependencies: 2389 | shebang-regex: 3.0.0 2390 | 2391 | shebang-regex@3.0.0: {} 2392 | 2393 | sirv@2.0.4: 2394 | dependencies: 2395 | '@polka/url': 1.0.0-next.28 2396 | mrmime: 2.0.0 2397 | totalist: 3.0.0 2398 | 2399 | source-map-js@1.0.2: {} 2400 | 2401 | source-map-js@1.2.1: {} 2402 | 2403 | strip-ansi@6.0.1: 2404 | dependencies: 2405 | ansi-regex: 5.0.1 2406 | 2407 | strip-json-comments@3.1.1: {} 2408 | 2409 | supports-color@7.2.0: 2410 | dependencies: 2411 | has-flag: 4.0.0 2412 | 2413 | svelte-check@4.0.2(svelte@4.2.19)(typescript@5.6.2): 2414 | dependencies: 2415 | '@jridgewell/trace-mapping': 0.3.25 2416 | chokidar: 3.5.3 2417 | fdir: 6.3.0 2418 | picocolors: 1.0.0 2419 | sade: 1.8.1 2420 | svelte: 4.2.19 2421 | typescript: 5.6.2 2422 | transitivePeerDependencies: 2423 | - picomatch 2424 | 2425 | svelte-eslint-parser@0.41.1(svelte@4.2.19): 2426 | dependencies: 2427 | eslint-scope: 7.2.2 2428 | eslint-visitor-keys: 3.4.3 2429 | espree: 9.6.1 2430 | postcss: 8.4.47 2431 | postcss-scss: 4.0.9(postcss@8.4.47) 2432 | optionalDependencies: 2433 | svelte: 4.2.19 2434 | 2435 | svelte-hmr@0.16.0(svelte@4.2.19): 2436 | dependencies: 2437 | svelte: 4.2.19 2438 | 2439 | svelte-preprocess@6.0.2(postcss-load-config@3.1.4(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)(typescript@5.6.2): 2440 | dependencies: 2441 | svelte: 4.2.19 2442 | optionalDependencies: 2443 | postcss: 8.4.47 2444 | postcss-load-config: 3.1.4(postcss@8.4.47) 2445 | typescript: 5.6.2 2446 | 2447 | svelte-tiny-linked-charts@1.6.1(svelte@4.2.19): 2448 | dependencies: 2449 | svelte: 4.2.19 2450 | 2451 | svelte@3.55.1: {} 2452 | 2453 | svelte@4.2.19: 2454 | dependencies: 2455 | '@ampproject/remapping': 2.3.0 2456 | '@jridgewell/sourcemap-codec': 1.5.0 2457 | '@jridgewell/trace-mapping': 0.3.25 2458 | '@types/estree': 1.0.6 2459 | acorn: 8.12.1 2460 | aria-query: 5.3.2 2461 | axobject-query: 4.1.0 2462 | code-red: 1.0.4 2463 | css-tree: 2.3.1 2464 | estree-walker: 3.0.3 2465 | is-reference: 3.0.2 2466 | locate-character: 3.0.0 2467 | magic-string: 0.30.11 2468 | periscopic: 3.1.0 2469 | 2470 | tabbable@5.3.3: {} 2471 | 2472 | tailwind-merge@1.14.0: {} 2473 | 2474 | text-table@0.2.0: {} 2475 | 2476 | tiny-glob@0.2.9: 2477 | dependencies: 2478 | globalyzer: 0.1.0 2479 | globrex: 0.1.2 2480 | 2481 | to-regex-range@5.0.1: 2482 | dependencies: 2483 | is-number: 7.0.0 2484 | 2485 | totalist@3.0.0: {} 2486 | 2487 | ts-api-utils@1.3.0(typescript@5.6.2): 2488 | dependencies: 2489 | typescript: 5.6.2 2490 | 2491 | tslib@2.7.0: {} 2492 | 2493 | type-check@0.4.0: 2494 | dependencies: 2495 | prelude-ls: 1.2.1 2496 | 2497 | typescript@5.6.2: {} 2498 | 2499 | uri-js@4.4.1: 2500 | dependencies: 2501 | punycode: 2.1.1 2502 | 2503 | util-deprecate@1.0.2: {} 2504 | 2505 | uuid@10.0.0: {} 2506 | 2507 | vite@5.4.7(@types/node@18.7.18): 2508 | dependencies: 2509 | esbuild: 0.21.5 2510 | postcss: 8.4.47 2511 | rollup: 4.22.4 2512 | optionalDependencies: 2513 | '@types/node': 18.7.18 2514 | fsevents: 2.3.3 2515 | 2516 | vitefu@0.2.5(vite@5.4.7(@types/node@18.7.18)): 2517 | optionalDependencies: 2518 | vite: 5.4.7(@types/node@18.7.18) 2519 | 2520 | which@2.0.2: 2521 | dependencies: 2522 | isexe: 2.0.0 2523 | 2524 | word-wrap@1.2.5: {} 2525 | 2526 | yaml@1.10.2: {} 2527 | 2528 | yocto-queue@0.1.0: {} 2529 | --------------------------------------------------------------------------------