├── src-tauri ├── build.rs ├── .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 ├── tauri.macos.conf.json ├── tauri.linux.conf.json ├── tauri.windows.conf.json ├── Cargo.toml ├── tauri.conf.json └── src │ └── main.rs ├── app-icon.png ├── images ├── 1.png ├── 2.png └── 3.png ├── src ├── lib │ ├── icon.png │ ├── components │ │ └── ui │ │ │ ├── index.ts │ │ │ ├── label │ │ │ ├── index.ts │ │ │ └── label.svelte │ │ │ ├── card │ │ │ ├── card-content.svelte │ │ │ ├── card-footer.svelte │ │ │ ├── card-header.svelte │ │ │ ├── card-description.svelte │ │ │ ├── card.svelte │ │ │ ├── card-title.svelte │ │ │ └── index.ts │ │ │ ├── dropdown-menu │ │ │ ├── dropdown-menu-radio-group.svelte │ │ │ ├── dropdown-menu-shortcut.svelte │ │ │ ├── dropdown-menu-separator.svelte │ │ │ ├── dropdown-menu-label.svelte │ │ │ ├── dropdown-menu-content.svelte │ │ │ ├── dropdown-menu-sub-content.svelte │ │ │ ├── dropdown-menu-item.svelte │ │ │ ├── dropdown-menu-sub-trigger.svelte │ │ │ ├── dropdown-menu-radio-item.svelte │ │ │ ├── dropdown-menu-checkbox-item.svelte │ │ │ └── index.ts │ │ │ ├── table │ │ │ ├── table-body.svelte │ │ │ ├── table-caption.svelte │ │ │ ├── table-footer.svelte │ │ │ ├── table-cell.svelte │ │ │ ├── table.svelte │ │ │ ├── table-head.svelte │ │ │ ├── table-header.svelte │ │ │ ├── table-row.svelte │ │ │ └── index.ts │ │ │ ├── button │ │ │ ├── button.svelte │ │ │ └── index.ts │ │ │ ├── input │ │ │ ├── index.ts │ │ │ └── input.svelte │ │ │ └── Downloader.svelte │ ├── downloads.ts │ └── utils.ts ├── routes │ ├── +layout.ts │ ├── url │ │ └── +page.svelte │ ├── +page.svelte │ └── +layout.svelte ├── app.html ├── app.pcss └── app.d.ts ├── static └── favicon.png ├── .prettierignore ├── postcss.config.js ├── .gitignore ├── vite.config.ts ├── tailwind.config.ts ├── .prettierrc ├── components.json ├── postcss.config.cjs ├── install-macos.sh ├── install-linux.sh ├── install-windows.bat ├── tsconfig.json ├── svelte.config.js ├── README.md ├── package.json ├── tailwind.config.js ├── .github └── workflows │ ├── test.yml │ └── release.yml ├── LICENSE └── pnpm-lock.yaml /src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | tauri_build::build() 3 | } 4 | -------------------------------------------------------------------------------- /app-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/app-icon.png -------------------------------------------------------------------------------- /images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/images/1.png -------------------------------------------------------------------------------- /images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/images/2.png -------------------------------------------------------------------------------- /images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/images/3.png -------------------------------------------------------------------------------- /src/lib/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src/lib/icon.png -------------------------------------------------------------------------------- /src/routes/+layout.ts: -------------------------------------------------------------------------------- 1 | export const prerender = true; 2 | export const ssr = false; 3 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/static/favicon.png -------------------------------------------------------------------------------- /src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ -------------------------------------------------------------------------------- /src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Ignore files for PNPM, NPM and YARN 2 | pnpm-lock.yaml 3 | package-lock.json 4 | yarn.lock 5 | -------------------------------------------------------------------------------- /src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /src/lib/components/ui/index.ts: -------------------------------------------------------------------------------- 1 | import Downloader from './Downloader.svelte'; 2 | 3 | export { Downloader }; 4 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | }; 7 | -------------------------------------------------------------------------------- /src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chientrm/xtuber/HEAD/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /src/lib/components/ui/label/index.ts: -------------------------------------------------------------------------------- 1 | import Root from "./label.svelte"; 2 | 3 | export { 4 | Root, 5 | // 6 | Root as Label, 7 | }; 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | vite.config.js.timestamp-* 10 | vite.config.ts.timestamp-* 11 | ffmpeg* 12 | yt-dlp* -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import Icons from 'unplugin-icons/vite'; 3 | import { defineConfig } from 'vite'; 4 | 5 | export default defineConfig({ 6 | plugins: [sveltekit(), Icons({ compiler: 'svelte' })] 7 | }); 8 | -------------------------------------------------------------------------------- /src-tauri/tauri.macos.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "tauri": { 3 | "bundle": { 4 | "resources": [ 5 | "yt-dlp/yt-dlp_macos", 6 | "ffmpeg/ffmpeg-x86_64-apple-darwin" 7 | ] 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src-tauri/tauri.linux.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "tauri": { 3 | "bundle": { 4 | "resources": [ 5 | "yt-dlp/yt-dlp_linux", 6 | "ffmpeg/ffmpeg-x86_64-unknown-linux-gnu" 7 | ] 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src-tauri/tauri.windows.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "tauri": { 3 | "bundle": { 4 | "resources": [ 5 | "yt-dlp/yt-dlp.exe", 6 | "ffmpeg/ffmpeg-x86_64-pc-windows-msvc.exe" 7 | ] 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from 'tailwindcss'; 2 | 3 | export default { 4 | content: ['./src/**/*.{html,js,svelte,ts}'], 5 | 6 | theme: { 7 | extend: {} 8 | }, 9 | 10 | plugins: [require('@tailwindcss/typography')] 11 | } as Config; 12 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], 7 | "overrides": [ 8 | { 9 | "files": "*.svelte", 10 | "options": { 11 | "parser": "svelte" 12 | } 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://shadcn-svelte.com/schema.json", 3 | "style": "default", 4 | "tailwind": { 5 | "config": "tailwind.config.js", 6 | "css": "src/app.pcss", 7 | "baseColor": "slate" 8 | }, 9 | "aliases": { 10 | "components": "$lib/components", 11 | "utils": "$lib/utils" 12 | }, 13 | "typescript": true 14 | } -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | const tailwindcss = require('tailwindcss'); 2 | const autoprefixer = require('autoprefixer'); 3 | 4 | const config = { 5 | plugins: [ 6 | //Some plugins, like tailwindcss/nesting, need to run before Tailwind, 7 | tailwindcss(), 8 | //But others, like autoprefixer, need to run after, 9 | autoprefixer 10 | ] 11 | }; 12 | 13 | module.exports = config; 14 | -------------------------------------------------------------------------------- /install-macos.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | mkdir -p src-tauri/ffmpeg 4 | wget https://www.osxexperts.net/ffmpeg7intel.zip 5 | unzip ffmpeg7intel.zip 6 | mv ffmpeg src-tauri/ffmpeg/ffmpeg-x86_64-apple-darwin 7 | mkdir -p src-tauri/yt-dlp 8 | wget https://github.com/yt-dlp/yt-dlp/releases/download/2024.04.09/yt-dlp_macos -O src-tauri/yt-dlp/yt-dlp_macos 9 | chmod +x src-tauri/ffmpeg/* 10 | chmod +x src-tauri/yt-dlp/* -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/lib/components/ui/card/card-content.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | 13 |
14 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/lib/components/ui/card/card-footer.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | 13 |
14 | -------------------------------------------------------------------------------- /src/lib/components/ui/card/card-header.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | 13 |
14 | -------------------------------------------------------------------------------- /src/lib/components/ui/card/card-description.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |

12 | 13 |

14 | -------------------------------------------------------------------------------- /src/lib/components/ui/table/table-body.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/lib/components/ui/table/table-caption.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/lib/components/ui/table/table-footer.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/lib/components/ui/card/card.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |
15 | 16 |
17 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 15 | -------------------------------------------------------------------------------- /src/lib/components/ui/table/table-cell.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/lib/components/ui/table/table.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 |
12 | 13 | 14 |
15 |
16 | -------------------------------------------------------------------------------- /install-linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | mkdir -p src-tauri/ffmpeg 4 | wget https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz 5 | tar -xf ffmpeg-master-latest-linux64-gpl.tar.xz 6 | mv ffmpeg-master-latest-linux64-gpl/bin/ffmpeg src-tauri/ffmpeg/ffmpeg-x86_64-unknown-linux-gnu 7 | mkdir -p src-tauri/yt-dlp 8 | wget https://github.com/yt-dlp/yt-dlp/releases/download/2024.04.09/yt-dlp_linux -O src-tauri/yt-dlp/yt-dlp_linux 9 | chmod +x src-tauri/ffmpeg/* 10 | chmod +x src-tauri/yt-dlp/* -------------------------------------------------------------------------------- /src/lib/components/ui/table/table-head.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/lib/components/ui/table/table-header.svelte: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /install-windows.bat: -------------------------------------------------------------------------------- 1 | mkdir -p src-tauri/ffmpeg 2 | Invoke-WebRequest -Uri https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip -OutFile "ffmpeg-master-latest-win64-gpl.zip" 3 | unzip ffmpeg-master-latest-win64-gpl.zip 4 | mv ffmpeg-master-latest-win64-gpl/bin/ffmpeg.exe src-tauri/ffmpeg/ffmpeg-x86_64-pc-windows-msvc.exe 5 | mkdir -p src-tauri/yt-dlp 6 | Invoke-WebRequest -Uri https://github.com/yt-dlp/yt-dlp/releases/download/2024.04.09/yt-dlp.exe -OutFile "src-tauri/yt-dlp/yt-dlp.exe" 7 | chmod +x src-tauri/ffmpeg/* 8 | chmod +x src-tauri/yt-dlp/* -------------------------------------------------------------------------------- /src/lib/components/ui/table/table-row.svelte: -------------------------------------------------------------------------------- 1 | 12 | 13 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/lib/components/ui/label/label.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/lib/components/ui/card/card-title.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/lib/components/ui/card/index.ts: -------------------------------------------------------------------------------- 1 | import Root from "./card.svelte"; 2 | import Content from "./card-content.svelte"; 3 | import Description from "./card-description.svelte"; 4 | import Footer from "./card-footer.svelte"; 5 | import Header from "./card-header.svelte"; 6 | import Title from "./card-title.svelte"; 7 | 8 | export { 9 | Root, 10 | Content, 11 | Description, 12 | Footer, 13 | Header, 14 | Title, 15 | // 16 | Root as Card, 17 | Content as CardContent, 18 | Description as CardDescription, 19 | Footer as CardFooter, 20 | Header as CardHeader, 21 | Title as CardTitle, 22 | }; 23 | 24 | export type HeadingLevel = "h1" | "h2" | "h3" | "h4" | "h5" | "h6"; 25 | -------------------------------------------------------------------------------- /src/lib/components/ui/table/index.ts: -------------------------------------------------------------------------------- 1 | import Root from "./table.svelte"; 2 | import Body from "./table-body.svelte"; 3 | import Caption from "./table-caption.svelte"; 4 | import Cell from "./table-cell.svelte"; 5 | import Footer from "./table-footer.svelte"; 6 | import Head from "./table-head.svelte"; 7 | import Header from "./table-header.svelte"; 8 | import Row from "./table-row.svelte"; 9 | 10 | export { 11 | Root, 12 | Body, 13 | Caption, 14 | Cell, 15 | Footer, 16 | Head, 17 | Header, 18 | Row, 19 | // 20 | Root as Table, 21 | Body as TableBody, 22 | Caption as TableCaption, 23 | Cell as TableCell, 24 | Footer as TableFooter, 25 | Head as TableHead, 26 | Header as TableHeader, 27 | Row as TableRow, 28 | }; 29 | -------------------------------------------------------------------------------- /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 | "moduleResolution": "bundler" 13 | } 14 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 15 | // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files 16 | // 17 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 18 | // from the referenced tsconfig.json - TypeScript does not merge them in 19 | } 20 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-static'; 2 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://kit.svelte.dev/docs/integrations#preprocessors 7 | // for more information about preprocessors 8 | preprocess: [vitePreprocess({})], 9 | 10 | kit: { 11 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. 12 | // If your environment is not supported or you settled on a specific environment, switch out the adapter. 13 | // See https://kit.svelte.dev/docs/adapters for more information about adapters. 14 | adapter: adapter() 15 | } 16 | }; 17 | 18 | export default config; 19 | -------------------------------------------------------------------------------- /src/lib/components/ui/button/button.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/routes/url/+page.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | {#await invoking} 17 |
18 | 19 |
20 | {:then video} 21 | {#if video} 22 | 23 | {/if} 24 | {:catch _} 25 |
Invalid video
26 | {/await} 27 | -------------------------------------------------------------------------------- /src-tauri/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "app" 3 | version = "0.1.0" 4 | description = "A Tauri App" 5 | authors = ["you"] 6 | license = "" 7 | repository = "" 8 | default-run = "app" 9 | edition = "2021" 10 | rust-version = "1.60" 11 | 12 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 13 | 14 | [build-dependencies] 15 | tauri-build = { version = "1.5.1", features = [] } 16 | 17 | [dependencies] 18 | open = "5.1.2" 19 | tauri = { version = "1.6.1", features = [ "updater", "api-all"] } 20 | youtube_dl = "0.10.0" 21 | 22 | [features] 23 | # this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. 24 | # If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes. 25 | # DO NOT REMOVE!! 26 | custom-protocol = [ "tauri/custom-protocol" ] 27 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/lib/components/ui/input/index.ts: -------------------------------------------------------------------------------- 1 | import Root from "./input.svelte"; 2 | 3 | export type FormInputEvent = T & { 4 | currentTarget: EventTarget & HTMLInputElement; 5 | }; 6 | export type InputEvents = { 7 | blur: FormInputEvent; 8 | change: FormInputEvent; 9 | click: FormInputEvent; 10 | focus: FormInputEvent; 11 | focusin: FormInputEvent; 12 | focusout: FormInputEvent; 13 | keydown: FormInputEvent; 14 | keypress: FormInputEvent; 15 | keyup: FormInputEvent; 16 | mouseover: FormInputEvent; 17 | mouseenter: FormInputEvent; 18 | mouseleave: FormInputEvent; 19 | mousemove: FormInputEvent; 20 | paste: FormInputEvent; 21 | input: FormInputEvent; 22 | wheel: FormInputEvent; 23 | }; 24 | 25 | export { 26 | Root, 27 | // 28 | Root as Input, 29 | }; 30 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte: -------------------------------------------------------------------------------- 1 | 16 | 17 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte: -------------------------------------------------------------------------------- 1 | 14 | 15 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # XTuber - Simple YouTube Downloader 2 | 3 | ![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/chientrm/xtuber/total) 4 | ![GitHub Release](https://img.shields.io/github/v/release/chientrm/xtuber) 5 | 6 | XTuber - Free & Effortless YouTube downloads for your desktop | Product Hunt 7 | 8 | [Releases](https://github.com/chientrm/xtuber/releases) 9 | 10 | ![Image 3](images/3.png) 11 | 12 | ## Development 13 | 14 | - Install [Tauri](https://tauri.app/v1/guides/getting-started/prerequisites) 15 | - Download yt-dlp and ffmpeg using script: 16 | 17 | - For MacOS: `install-macos.sh` 18 | - For Linux: `install-linux.sh` 19 | - For Windows: `install-windows.bat` 20 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/lib/components/ui/input/input.svelte: -------------------------------------------------------------------------------- 1 | 17 | 18 | 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "xtuber", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite dev", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 10 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 11 | "lint": "prettier --check .", 12 | "format": "prettier --write ." 13 | }, 14 | "devDependencies": { 15 | "@iconify/json": "^2.2.199", 16 | "@sveltejs/adapter-static": "^3.0.1", 17 | "@sveltejs/kit": "^2.0.0", 18 | "@sveltejs/vite-plugin-svelte": "^3.0.0", 19 | "@tailwindcss/typography": "^0.5.14", 20 | "@tauri-apps/cli": "^1.6.2", 21 | "autoprefixer": "^10.4.20", 22 | "postcss": "^8.4.32", 23 | "postcss-load-config": "^5.0.2", 24 | "prettier": "^3.1.1", 25 | "prettier-plugin-svelte": "^3.1.2", 26 | "prettier-plugin-tailwindcss": "^0.6.5", 27 | "svelte": "^4.2.7", 28 | "svelte-check": "^3.6.0", 29 | "tailwindcss": "^3.4.9", 30 | "tslib": "^2.4.1", 31 | "typescript": "^5.0.0", 32 | "unplugin-icons": "^0.18.5", 33 | "vite": "^5.0.3" 34 | }, 35 | "type": "module", 36 | "dependencies": { 37 | "@tauri-apps/api": "^1.6.0", 38 | "bits-ui": "^0.21.2", 39 | "clsx": "^2.1.0", 40 | "cmdk-sv": "^0.0.17", 41 | "lucide-svelte": "^0.446.0", 42 | "svelte-sonner": "^0.3.22", 43 | "tailwind-merge": "^2.2.2", 44 | "tailwind-variants": "^0.2.1", 45 | "tauri-plugin-upload-api": "github:tauri-apps/tauri-plugin-upload#v1" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/lib/components/ui/dropdown-menu/index.ts: -------------------------------------------------------------------------------- 1 | import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui"; 2 | import Item from "./dropdown-menu-item.svelte"; 3 | import Label from "./dropdown-menu-label.svelte"; 4 | import Content from "./dropdown-menu-content.svelte"; 5 | import Shortcut from "./dropdown-menu-shortcut.svelte"; 6 | import RadioItem from "./dropdown-menu-radio-item.svelte"; 7 | import Separator from "./dropdown-menu-separator.svelte"; 8 | import RadioGroup from "./dropdown-menu-radio-group.svelte"; 9 | import SubContent from "./dropdown-menu-sub-content.svelte"; 10 | import SubTrigger from "./dropdown-menu-sub-trigger.svelte"; 11 | import CheckboxItem from "./dropdown-menu-checkbox-item.svelte"; 12 | 13 | const Sub = DropdownMenuPrimitive.Sub; 14 | const Root = DropdownMenuPrimitive.Root; 15 | const Trigger = DropdownMenuPrimitive.Trigger; 16 | const Group = DropdownMenuPrimitive.Group; 17 | 18 | export { 19 | Sub, 20 | Root, 21 | Item, 22 | Label, 23 | Group, 24 | Trigger, 25 | Content, 26 | Shortcut, 27 | Separator, 28 | RadioItem, 29 | SubContent, 30 | SubTrigger, 31 | RadioGroup, 32 | CheckboxItem, 33 | // 34 | Root as DropdownMenu, 35 | Sub as DropdownMenuSub, 36 | Item as DropdownMenuItem, 37 | Label as DropdownMenuLabel, 38 | Group as DropdownMenuGroup, 39 | Content as DropdownMenuContent, 40 | Trigger as DropdownMenuTrigger, 41 | Shortcut as DropdownMenuShortcut, 42 | RadioItem as DropdownMenuRadioItem, 43 | Separator as DropdownMenuSeparator, 44 | RadioGroup as DropdownMenuRadioGroup, 45 | SubContent as DropdownMenuSubContent, 46 | SubTrigger as DropdownMenuSubTrigger, 47 | CheckboxItem as DropdownMenuCheckboxItem, 48 | }; 49 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | Downloads. 11 | 12 | 13 | Thumbnail 14 | Title 15 | Quality 16 | Download 17 | 18 | 19 | 20 | {#each $downloads as { video, videoFormat, downloaded, folder, payload }} 21 | 22 | 23 | Thumbnail 24 | 25 | 26 | {video.title} 27 |
28 | {payload ?? ''} 29 |
30 | 31 | {#if videoFormat} 32 | {videoFormat.format_note} 33 | {:else} 34 | Audio only 35 | {/if} 36 | 37 | 38 | {#if downloaded} 39 | 42 | {:else} 43 | 47 | {/if} 48 | 49 |
50 | {/each} 51 |
52 |
53 | -------------------------------------------------------------------------------- /src/lib/components/ui/button/index.ts: -------------------------------------------------------------------------------- 1 | import { type VariantProps, tv } from "tailwind-variants"; 2 | import type { Button as ButtonPrimitive } from "bits-ui"; 3 | import Root from "./button.svelte"; 4 | 5 | const buttonVariants = tv({ 6 | base: "ring-offset-background focus-visible:ring-ring inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", 7 | variants: { 8 | variant: { 9 | default: "bg-primary text-primary-foreground hover:bg-primary/90", 10 | destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", 11 | outline: 12 | "border-input bg-background hover:bg-accent hover:text-accent-foreground border", 13 | secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", 14 | ghost: "hover:bg-accent hover:text-accent-foreground", 15 | link: "text-primary underline-offset-4 hover:underline", 16 | }, 17 | size: { 18 | default: "h-10 px-4 py-2", 19 | sm: "h-9 rounded-md px-3", 20 | lg: "h-11 rounded-md px-8", 21 | icon: "h-10 w-10", 22 | }, 23 | }, 24 | defaultVariants: { 25 | variant: "default", 26 | size: "default", 27 | }, 28 | }); 29 | 30 | type Variant = VariantProps["variant"]; 31 | type Size = VariantProps["size"]; 32 | 33 | type Props = ButtonPrimitive.Props & { 34 | variant?: Variant; 35 | size?: Size; 36 | }; 37 | 38 | type Events = ButtonPrimitive.Events; 39 | 40 | export { 41 | Root, 42 | type Props, 43 | type Events, 44 | // 45 | Root as Button, 46 | type Props as ButtonProps, 47 | type Events as ButtonEvents, 48 | buttonVariants, 49 | }; 50 | -------------------------------------------------------------------------------- /src/lib/downloads.ts: -------------------------------------------------------------------------------- 1 | import { goto } from '$app/navigation'; 2 | import { listen, type UnlistenFn } from '@tauri-apps/api/event'; 3 | import { invoke } from '@tauri-apps/api/tauri'; 4 | import { toast } from 'svelte-sonner'; 5 | import { writable } from 'svelte/store'; 6 | 7 | let index = 0; 8 | 9 | interface Download { 10 | video: YouTube.Video; 11 | videoFormat?: YouTube.Format; 12 | downloaded: boolean; 13 | folder: string; 14 | payload?: string; 15 | } 16 | 17 | export const downloads = writable([]); 18 | 19 | const unlistenFns: UnlistenFn[] = []; 20 | 21 | export const download = async ( 22 | folder: string, 23 | video: YouTube.Video, 24 | videoFormat?: YouTube.Format 25 | ) => { 26 | const download: Download = { 27 | video, 28 | videoFormat, 29 | downloaded: false, 30 | folder 31 | }; 32 | downloads.update((items) => [download, ...items]); 33 | const { id } = video; 34 | const fid = videoFormat?.format_id 35 | ? `${videoFormat.format_id}+bestaudio[ext=m4a]` 36 | : 'bestaudio[ext=m4a]'; 37 | toast.info(`${video.title} downloading`, { 38 | action: { label: 'See downloads', onClick: () => goto('/') } 39 | }); 40 | const key = index.toString(); 41 | const unlistenFn = await listen(key, ({ payload }) => { 42 | if (payload === 'done') { 43 | download.downloaded = true; 44 | downloads.update((items) => items); 45 | toast.success(`${video.title} downloaded`, { 46 | action: { label: 'Open folder', onClick: () => invoke('open_dir', { folder }) } 47 | }); 48 | } else { 49 | download.payload = payload; 50 | downloads.update((items) => items); 51 | } 52 | }); 53 | await invoke('download', { id, fid, folder, key }); 54 | index++; 55 | unlistenFns.push(unlistenFn); 56 | }; 57 | 58 | export const stopListen = () => unlistenFns.map((f) => f()); 59 | -------------------------------------------------------------------------------- /src/lib/components/ui/Downloader.svelte: -------------------------------------------------------------------------------- 1 | 31 | 32 |
33 |

Downloads

34 |
35 | {#each formats as format} 36 | 40 | {/each} 41 |
42 | 46 |
47 |
48 |

49 | {video.title} 50 |

51 | thumbnail 52 |
53 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from "clsx"; 2 | import { twMerge } from "tailwind-merge"; 3 | import { cubicOut } from "svelte/easing"; 4 | import type { TransitionConfig } from "svelte/transition"; 5 | 6 | export function cn(...inputs: ClassValue[]) { 7 | return twMerge(clsx(inputs)); 8 | } 9 | 10 | type FlyAndScaleParams = { 11 | y?: number; 12 | x?: number; 13 | start?: number; 14 | duration?: number; 15 | }; 16 | 17 | export const flyAndScale = ( 18 | node: Element, 19 | params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 } 20 | ): TransitionConfig => { 21 | const style = getComputedStyle(node); 22 | const transform = style.transform === "none" ? "" : style.transform; 23 | 24 | const scaleConversion = ( 25 | valueA: number, 26 | scaleA: [number, number], 27 | scaleB: [number, number] 28 | ) => { 29 | const [minA, maxA] = scaleA; 30 | const [minB, maxB] = scaleB; 31 | 32 | const percentage = (valueA - minA) / (maxA - minA); 33 | const valueB = percentage * (maxB - minB) + minB; 34 | 35 | return valueB; 36 | }; 37 | 38 | const styleToString = ( 39 | style: Record 40 | ): string => { 41 | return Object.keys(style).reduce((str, key) => { 42 | if (style[key] === undefined) return str; 43 | return str + `${key}:${style[key]};`; 44 | }, ""); 45 | }; 46 | 47 | return { 48 | duration: params.duration ?? 200, 49 | delay: 0, 50 | css: (t) => { 51 | const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); 52 | const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); 53 | const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); 54 | 55 | return styleToString({ 56 | transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`, 57 | opacity: t 58 | }); 59 | }, 60 | easing: cubicOut 61 | }; 62 | }; -------------------------------------------------------------------------------- /src/app.pcss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | :root { 7 | --background: 0 0% 100%; 8 | --foreground: 222.2 84% 4.9%; 9 | 10 | --muted: 210 40% 96.1%; 11 | --muted-foreground: 215.4 16.3% 46.9%; 12 | 13 | --popover: 0 0% 100%; 14 | --popover-foreground: 222.2 84% 4.9%; 15 | 16 | --card: 0 0% 100%; 17 | --card-foreground: 222.2 84% 4.9%; 18 | 19 | --border: 214.3 31.8% 91.4%; 20 | --input: 214.3 31.8% 91.4%; 21 | 22 | --primary: 222.2 47.4% 11.2%; 23 | --primary-foreground: 210 40% 98%; 24 | 25 | --secondary: 210 40% 96.1%; 26 | --secondary-foreground: 222.2 47.4% 11.2%; 27 | 28 | --accent: 210 40% 96.1%; 29 | --accent-foreground: 222.2 47.4% 11.2%; 30 | 31 | --destructive: 0 72.2% 50.6%; 32 | --destructive-foreground: 210 40% 98%; 33 | 34 | --ring: 222.2 84% 4.9%; 35 | 36 | --radius: 0.5rem; 37 | } 38 | 39 | .dark { 40 | --background: 222.2 84% 4.9%; 41 | --foreground: 210 40% 98%; 42 | 43 | --muted: 217.2 32.6% 17.5%; 44 | --muted-foreground: 215 20.2% 65.1%; 45 | 46 | --popover: 222.2 84% 4.9%; 47 | --popover-foreground: 210 40% 98%; 48 | 49 | --card: 222.2 84% 4.9%; 50 | --card-foreground: 210 40% 98%; 51 | 52 | --border: 217.2 32.6% 17.5%; 53 | --input: 217.2 32.6% 17.5%; 54 | 55 | --primary: 210 40% 98%; 56 | --primary-foreground: 222.2 47.4% 11.2%; 57 | 58 | --secondary: 217.2 32.6% 17.5%; 59 | --secondary-foreground: 210 40% 98%; 60 | 61 | --accent: 217.2 32.6% 17.5%; 62 | --accent-foreground: 210 40% 98%; 63 | 64 | --destructive: 0 62.8% 30.6%; 65 | --destructive-foreground: 210 40% 98%; 66 | 67 | --ring: 212.7 26.8% 83.9%; 68 | } 69 | } 70 | 71 | @layer base { 72 | * { 73 | @apply border-border; 74 | } 75 | body { 76 | @apply bg-background text-foreground; 77 | } 78 | } -------------------------------------------------------------------------------- /src-tauri/tauri.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "../node_modules/@tauri-apps/cli/schema.json", 3 | "build": { 4 | "beforeBuildCommand": "npm run build", 5 | "beforeDevCommand": "npm run dev", 6 | "devPath": "http://localhost:5173", 7 | "distDir": "../build" 8 | }, 9 | "package": { 10 | "productName": "XTuber" 11 | }, 12 | "tauri": { 13 | "allowlist": { 14 | "all": true 15 | }, 16 | "bundle": { 17 | "active": true, 18 | "category": "DeveloperTool", 19 | "copyright": "", 20 | "deb": { 21 | "depends": [] 22 | }, 23 | "externalBin": [], 24 | "icon": [ 25 | "icons/32x32.png", 26 | "icons/128x128.png", 27 | "icons/128x128@2x.png", 28 | "icons/icon.icns", 29 | "icons/icon.ico" 30 | ], 31 | "identifier": "com.chientrm.xtuber", 32 | "longDescription": "", 33 | "macOS": { 34 | "entitlements": null, 35 | "exceptionDomain": "", 36 | "frameworks": [], 37 | "providerShortName": null, 38 | "signingIdentity": null 39 | }, 40 | "shortDescription": "", 41 | "targets": "all", 42 | "windows": { 43 | "certificateThumbprint": null, 44 | "digestAlgorithm": "sha256", 45 | "timestampUrl": "" 46 | } 47 | }, 48 | "security": { 49 | "csp": null 50 | }, 51 | "updater": { 52 | "active": true, 53 | "endpoints": [ 54 | "https://github.com/chientrm/xtuber/releases/latest/download/latest.json" 55 | ], 56 | "dialog": true, 57 | "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDJFNDc1QjI0MTg3MDFDODkKUldTSkhIQVlKRnRITHVIb2wrWG9XWVhtVWhKcmNuQlZFdUJUWXFaOHljZkFyeVRJYU4vSWpYQlAK" 58 | }, 59 | "windows": [ 60 | { 61 | "minWidth": 720, 62 | "minHeight": 480, 63 | "width": 720, 64 | "height": 480, 65 | "fullscreen": false, 66 | "resizable": true, 67 | "title": "XTuber" 68 | } 69 | ] 70 | } 71 | } -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | import { fontFamily } from "tailwindcss/defaultTheme"; 2 | 3 | /** @type {import('tailwindcss').Config} */ 4 | const config = { 5 | darkMode: ["class"], 6 | content: ["./src/**/*.{html,js,svelte,ts}"], 7 | safelist: ["dark"], 8 | theme: { 9 | container: { 10 | center: true, 11 | padding: "2rem", 12 | screens: { 13 | "2xl": "1400px" 14 | } 15 | }, 16 | extend: { 17 | colors: { 18 | border: "hsl(var(--border) / )", 19 | input: "hsl(var(--input) / )", 20 | ring: "hsl(var(--ring) / )", 21 | background: "hsl(var(--background) / )", 22 | foreground: "hsl(var(--foreground) / )", 23 | primary: { 24 | DEFAULT: "hsl(var(--primary) / )", 25 | foreground: "hsl(var(--primary-foreground) / )" 26 | }, 27 | secondary: { 28 | DEFAULT: "hsl(var(--secondary) / )", 29 | foreground: "hsl(var(--secondary-foreground) / )" 30 | }, 31 | destructive: { 32 | DEFAULT: "hsl(var(--destructive) / )", 33 | foreground: "hsl(var(--destructive-foreground) / )" 34 | }, 35 | muted: { 36 | DEFAULT: "hsl(var(--muted) / )", 37 | foreground: "hsl(var(--muted-foreground) / )" 38 | }, 39 | accent: { 40 | DEFAULT: "hsl(var(--accent) / )", 41 | foreground: "hsl(var(--accent-foreground) / )" 42 | }, 43 | popover: { 44 | DEFAULT: "hsl(var(--popover) / )", 45 | foreground: "hsl(var(--popover-foreground) / )" 46 | }, 47 | card: { 48 | DEFAULT: "hsl(var(--card) / )", 49 | foreground: "hsl(var(--card-foreground) / )" 50 | } 51 | }, 52 | borderRadius: { 53 | lg: "var(--radius)", 54 | md: "calc(var(--radius) - 2px)", 55 | sm: "calc(var(--radius) - 4px)" 56 | }, 57 | fontFamily: { 58 | sans: [...fontFamily.sans] 59 | } 60 | } 61 | }, 62 | }; 63 | 64 | export default config; 65 | -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 27 | 28 | 29 | 30 |
33 |
34 | 35 | icon 36 | XTuber 37 | 38 | {$downloads.length} 39 | 40 | 41 | 42 | 43 | 47 | 48 | 49 | 53 | 54 | 55 | X 56 | Newsletter 58 | 59 | GitHub 60 | 61 | 62 | Version: 63 | {#await getVersion()} 64 | ... 65 | {:then version} 66 | {version} 67 | {/await} 68 | 69 | 70 | 71 |
72 |
73 | 74 | 75 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | publish-tauri: 8 | permissions: 9 | contents: write 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | platform: [macos-latest, ubuntu-20.04, windows-latest] 14 | 15 | runs-on: ${{ matrix.platform }} 16 | steps: 17 | - uses: actions/checkout@v4 18 | with: 19 | lfs: true 20 | fetch-depth: 0 21 | - name: ubuntu-20.04 22 | if: matrix.platform == 'ubuntu-20.04' 23 | run: | 24 | mkdir -p src-tauri/ffmpeg 25 | wget https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz 26 | tar -xf ffmpeg-master-latest-linux64-gpl.tar.xz 27 | mv ffmpeg-master-latest-linux64-gpl/bin/ffmpeg src-tauri/ffmpeg/ffmpeg-x86_64-unknown-linux-gnu 28 | mkdir -p src-tauri/yt-dlp 29 | wget https://github.com/yt-dlp/yt-dlp/releases/download/2024.04.09/yt-dlp_linux -O src-tauri/yt-dlp/yt-dlp_linux 30 | # - name: ubuntu-20.04/arm64 31 | # if: ${{ (matrix.platform == 'ubuntu-20.04/arm64') && (matrix.arch == 'arm64') }} 32 | # run: | 33 | # mkdir -p src-tauri/ffmpeg 34 | # wget https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linuxarm64-gpl.tar.xz 35 | # tar -xf ffmpeg-master-latest-linuxarm64-gpl.tar.xz 36 | # mv ffmpeg-master-latest-linuxarm64-gpl/bin/ffmpeg src-tauri/ffmpeg/ffmpeg-arm-unknown-linux-gnu 37 | - name: windows-latest 38 | if: matrix.platform == 'windows-latest' 39 | run: | 40 | mkdir -p src-tauri/ffmpeg 41 | Invoke-WebRequest -Uri https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip -OutFile "ffmpeg-master-latest-win64-gpl.zip" 42 | unzip ffmpeg-master-latest-win64-gpl.zip 43 | mv ffmpeg-master-latest-win64-gpl/bin/ffmpeg.exe src-tauri/ffmpeg/ffmpeg-x86_64-pc-windows-msvc.exe 44 | mkdir -p src-tauri/yt-dlp 45 | Invoke-WebRequest -Uri https://github.com/yt-dlp/yt-dlp/releases/download/2024.04.09/yt-dlp.exe -OutFile "src-tauri/yt-dlp/yt-dlp.exe" 46 | # - name: windows-latest/arm64 47 | # if: ${{ (matrix.platform == 'windows-latest/arm64') && (matrix.arch == 'arm64') }} 48 | # run: | 49 | # mkdir -p src-tauri/ffmpeg 50 | # Invoke-WebRequest -Uri https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-winarm64-gpl.zip -OutFile "ffmpeg-master-latest-winarm64-gpl.zip" 51 | # unzip ffmpeg-master-latest-winarm64-gpl.zip 52 | # mv ffmpeg-master-latest-winarm64-gpl/bin/ffmpeg.exe src-tauri/ffmpeg/ffmpeg-arm-windows-mvsc.exe 53 | - name: macos-latest 54 | if: matrix.platform == 'macos-latest' 55 | run: | 56 | mkdir -p src-tauri/ffmpeg 57 | wget https://www.osxexperts.net/ffmpeg7intel.zip 58 | unzip ffmpeg7intel.zip 59 | mv ffmpeg src-tauri/ffmpeg/ffmpeg-x86_64-apple-darwin 60 | mkdir -p src-tauri/yt-dlp 61 | wget https://github.com/yt-dlp/yt-dlp/releases/download/2024.04.09/yt-dlp_macos -O src-tauri/yt-dlp/yt-dlp_macos 62 | # - name: macos-latest/arm64 63 | # if: ${{ (matrix.platform == 'macos-latest/arm64') && (matrix.arch == 'arm64') }} 64 | # run: | 65 | # mkdir -p src-tauri/ffmpeg 66 | # wget https://www.osxexperts.net/ffmpeg7arm.zip 67 | # unzip ffmpeg7arm.zip 68 | # mv ffmpeg src-tauri/ffmpeg/ffmpeg-arm-unknown-linux-gnu 69 | - run: chmod +x src-tauri/ffmpeg/* 70 | - run: chmod +x src-tauri/yt-dlp/* 71 | - run: ls src-tauri/ffmpeg 72 | - run: ls src-tauri/yt-dlp 73 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - '*' 7 | 8 | jobs: 9 | prepare: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - id: get_tag 13 | run: echo ::set-output name=TAG::${GITHUB_REF/refs\/tags\//} 14 | outputs: 15 | TAG: ${{ steps.get_tag.outputs.TAG }} 16 | publish-tauri: 17 | permissions: 18 | contents: write 19 | strategy: 20 | fail-fast: false 21 | matrix: 22 | platform: [macos-latest, ubuntu-20.04, windows-latest] 23 | 24 | runs-on: ${{ matrix.platform }} 25 | needs: prepare 26 | steps: 27 | - uses: actions/checkout@v4 28 | with: 29 | lfs: true 30 | fetch-depth: 0 31 | - name: Install Rust 32 | uses: dtolnay/rust-toolchain@stable 33 | - name: Setup node 34 | uses: actions/setup-node@v4 35 | with: 36 | node-version: 20 37 | 38 | - name: Setup and run pnpm install 39 | uses: pnpm/action-setup@v4 40 | with: 41 | version: 9 42 | run_install: | 43 | - recursive: true 44 | args: [--frozen-lockfile, --strict-peer-dependencies] 45 | 46 | - name: Install dependencies (ubuntu only) 47 | if: matrix.platform == 'ubuntu-20.04' 48 | run: | 49 | sudo apt-get update 50 | sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf 51 | - run: cd src-tauri && cargo install cargo-bump --locked && cargo bump ${{ needs.prepare.outputs.TAG }} 52 | - name: ubuntu-20.04 53 | if: matrix.platform == 'ubuntu-20.04' 54 | run: | 55 | mkdir -p src-tauri/ffmpeg 56 | wget https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-linux64-gpl.tar.xz 57 | tar -xf ffmpeg-master-latest-linux64-gpl.tar.xz 58 | mv ffmpeg-master-latest-linux64-gpl/bin/ffmpeg src-tauri/ffmpeg/ffmpeg-x86_64-unknown-linux-gnu 59 | mkdir -p src-tauri/yt-dlp 60 | wget https://github.com/yt-dlp/yt-dlp/releases/download/2024.04.09/yt-dlp_linux -O src-tauri/yt-dlp/yt-dlp_linux 61 | - name: windows-latest 62 | if: matrix.platform == 'windows-latest' 63 | run: | 64 | mkdir -p src-tauri/ffmpeg 65 | Invoke-WebRequest -Uri https://github.com/yt-dlp/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip -OutFile "ffmpeg-master-latest-win64-gpl.zip" 66 | unzip ffmpeg-master-latest-win64-gpl.zip 67 | mv ffmpeg-master-latest-win64-gpl/bin/ffmpeg.exe src-tauri/ffmpeg/ffmpeg-x86_64-pc-windows-msvc.exe 68 | mkdir -p src-tauri/yt-dlp 69 | Invoke-WebRequest -Uri https://github.com/yt-dlp/yt-dlp/releases/download/2024.04.09/yt-dlp.exe -OutFile "src-tauri/yt-dlp/yt-dlp.exe" 70 | - name: macos-latest 71 | if: matrix.platform == 'macos-latest' 72 | run: | 73 | mkdir -p src-tauri/ffmpeg 74 | wget https://www.osxexperts.net/ffmpeg7intel.zip 75 | unzip ffmpeg7intel.zip 76 | mv ffmpeg src-tauri/ffmpeg/ffmpeg-x86_64-apple-darwin 77 | mkdir -p src-tauri/yt-dlp 78 | wget https://github.com/yt-dlp/yt-dlp/releases/download/2024.04.09/yt-dlp_macos -O src-tauri/yt-dlp/yt-dlp_macos 79 | - run: chmod +x src-tauri/ffmpeg/* 80 | - run: chmod +x src-tauri/yt-dlp/* 81 | - name: Build and upload a GitHub release 82 | uses: tauri-apps/tauri-action@v0 83 | env: 84 | TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} 85 | TAURI_KEY_PASSWORD: 86 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 87 | with: 88 | tagName: __VERSION__ 89 | releaseName: 'XTuber __VERSION__' 90 | releaseBody: | 91 | New features and bug fixes. 92 | releaseDraft: false 93 | prerelease: false 94 | includeUpdaterJson: true 95 | -------------------------------------------------------------------------------- /src-tauri/src/main.rs: -------------------------------------------------------------------------------- 1 | // Prevents additional console window on Windows in release, DO NOT REMOVE!! 2 | #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] 3 | 4 | use open; 5 | #[cfg(target_os = "windows")] 6 | use std::os::windows::process::CommandExt; 7 | use std::{ 8 | io::{BufRead, BufReader}, 9 | path::PathBuf, 10 | process::{Command, Stdio}, 11 | thread, 12 | }; 13 | use tauri::{Manager, State, Window}; 14 | use youtube_dl::{SingleVideo, YoutubeDl}; 15 | 16 | #[cfg(target_os = "windows")] 17 | const CREATE_NO_WINDOW: u32 = 0x08000000; 18 | 19 | struct AppState { 20 | ytdlp: PathBuf, 21 | ffmpeg: PathBuf, 22 | } 23 | 24 | #[tauri::command] 25 | async fn get_info(id: &str, state: State<'_, AppState>) -> Result { 26 | let url = format!("https://youtube.com/watch?v={}", id); 27 | let output = YoutubeDl::new(url) 28 | .youtube_dl_path(&state.ytdlp) 29 | .socket_timeout("15") 30 | .run() 31 | .map_err(|e| format!("youtube_dl error: {}", e))?; 32 | let video = output 33 | .into_single_video() 34 | .ok_or_else(|| "Failed to get video info".to_string())?; 35 | Ok(video) 36 | } 37 | 38 | #[tauri::command] 39 | fn download( 40 | id: &str, 41 | fid: &str, 42 | folder: &str, 43 | key: &str, 44 | state: State<'_, AppState>, 45 | window: Window, 46 | ) -> Result<(), String> { 47 | let url = format!("https://youtube.com/watch?v={}", id); 48 | let mut command = Command::new(&state.ytdlp); 49 | #[cfg(target_os = "windows")] 50 | command.creation_flags(CREATE_NO_WINDOW); 51 | let mut child = command 52 | .arg("--force-overwrites") 53 | .arg("--socket-timeout") 54 | .arg("15") 55 | .arg("-f") 56 | .arg(fid) 57 | .arg(url) 58 | .arg("--ffmpeg-location") 59 | .arg(state.ffmpeg.clone()) 60 | .arg("-q") 61 | .arg("--progress") 62 | .arg("--no-warnings") 63 | .arg("--newline") 64 | .arg("--progress-template") 65 | .arg( 66 | "%(progress._percent_str)s of %(progress._total_bytes_str)s at %(progress._speed_str)s", 67 | ) 68 | .current_dir(folder) 69 | .stdout(Stdio::piped()) 70 | .spawn() 71 | .expect("Failed to execute command"); 72 | let stdout = BufReader::new(child.stdout.take().unwrap()); 73 | let key = key.to_string(); 74 | thread::spawn(move || { 75 | for line in stdout.lines() { 76 | let _ = window.emit(&key, line.unwrap()); 77 | } 78 | let _ = window.emit(&key, "done"); 79 | }); 80 | Ok(()) 81 | } 82 | 83 | #[tauri::command] 84 | fn open_dir(folder: &str) -> Result<(), String> { 85 | let _ = open::that(folder); 86 | Ok(()) 87 | } 88 | 89 | fn main() { 90 | tauri::Builder::default() 91 | .setup(|app| { 92 | let path_resolver = app.path_resolver(); 93 | #[cfg(target_os = "linux")] 94 | let ytdlp = path_resolver 95 | .resolve_resource("yt-dlp/yt-dlp_linux") 96 | .expect("Failed to get yt-dlp"); 97 | #[cfg(target_os = "macos")] 98 | let ytdlp = path_resolver 99 | .resolve_resource("yt-dlp/yt-dlp_macos") 100 | .expect("Failed to get yt-dlp"); 101 | #[cfg(target_os = "windows")] 102 | let ytdlp = path_resolver 103 | .resolve_resource("yt-dlp/yt-dlp.exe") 104 | .expect("Failed to get yt-dlp"); 105 | #[cfg(target_os = "linux")] 106 | let ffmpeg = path_resolver 107 | .resolve_resource("ffmpeg/ffmpeg-x86_64-unknown-linux-gnu") 108 | .expect("Failed to get ffmpeg"); 109 | #[cfg(target_os = "macos")] 110 | let ffmpeg = path_resolver 111 | .resolve_resource("ffmpeg/ffmpeg-x86_64-apple-darwin") 112 | .expect("Failed to get ffmpeg"); 113 | #[cfg(target_os = "windows")] 114 | let ffmpeg = path_resolver 115 | .resolve_resource("ffmpeg/ffmpeg-x86_64-pc-windows-msvc.exe") 116 | .expect("Failed to get ffmpeg"); 117 | let state = AppState { ytdlp, ffmpeg }; 118 | app.manage(state); 119 | Ok(()) 120 | }) 121 | .invoke_handler(tauri::generate_handler![get_info, download, open_dir]) 122 | .run(tauri::generate_context!()) 123 | .expect("error while running tauri application"); 124 | } 125 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | import 'unplugin-icons/types/svelte'; 2 | // See https://kit.svelte.dev/docs/types#app 3 | // for information about these interfaces 4 | declare global { 5 | namespace App { 6 | // interface Error {} 7 | // interface Locals {} 8 | // interface PageData {} 9 | // interface PageState {} 10 | // interface Platform {} 11 | } 12 | 13 | namespace YouTube { 14 | interface Video { 15 | abr: number; 16 | acodec: Acodec; 17 | age_limit: number; 18 | album: null; 19 | album_artist: null; 20 | album_type: null; 21 | alt_title: null; 22 | artist: null; 23 | asr: number; 24 | automatic_captions: { [key: string]: AutomaticCaption[] }; 25 | average_rating: null; 26 | categories: string[]; 27 | channel: string; 28 | channel_id: string; 29 | channel_url: string; 30 | chapter: null; 31 | chapter_id: null; 32 | chapter_number: null; 33 | chapters: Chapter[]; 34 | comment_count: number; 35 | comments: null; 36 | container: null; 37 | creator: null; 38 | description: string; 39 | disc_number: null; 40 | dislike_count: null; 41 | display_id: string; 42 | downloader_options: null; 43 | duration: number; 44 | duration_string: string; 45 | end_time: null; 46 | episode: null; 47 | episode_id: null; 48 | episode_number: null; 49 | epoch: number; 50 | ext: VideoEXT; 51 | extractor: string; 52 | extractor_key: string; 53 | filesize: null; 54 | filesize_approx: number; 55 | format: string; 56 | format_id: string; 57 | format_note: string; 58 | formats: Format[]; 59 | fps: number; 60 | fragment_base_url: null; 61 | fragments: null; 62 | genre: null; 63 | heatmap: null; 64 | height: number; 65 | http_headers: null; 66 | id: string; 67 | is_live: boolean; 68 | language: Language; 69 | language_preference: null; 70 | license: string; 71 | like_count: number; 72 | location: null; 73 | manifest_url: null; 74 | no_resume: null; 75 | player_url: null; 76 | playlist: null; 77 | playlist_id: null; 78 | playlist_index: null; 79 | playlist_title: null; 80 | playlist_uploader: null; 81 | playlist_uploader_id: null; 82 | preference: null; 83 | protocol: string; 84 | quality: null; 85 | release_date: null; 86 | release_year: null; 87 | repost_count: null; 88 | requested_subtitles: null; 89 | resolution: string; 90 | season: null; 91 | season_id: null; 92 | season_number: null; 93 | series: null; 94 | source_preference: null; 95 | start_time: null; 96 | stretched_ratio: null; 97 | subtitles: Subtitles; 98 | tags: string[]; 99 | tbr: number; 100 | thumbnail: string; 101 | thumbnails: Thumbnail[]; 102 | timestamp: null; 103 | title: string; 104 | track: null; 105 | track_id: null; 106 | track_number: null; 107 | upload_date: string; 108 | uploader: string; 109 | uploader_id: string; 110 | uploader_url: string; 111 | url: null; 112 | vbr: number; 113 | vcodec: string; 114 | view_count: number; 115 | webpage_url: string; 116 | width: number; 117 | } 118 | 119 | enum Acodec { 120 | Mp4A402 = 'mp4a.40.2', 121 | Mp4A405 = 'mp4a.40.5', 122 | Opus = 'opus' 123 | } 124 | 125 | interface AutomaticCaption { 126 | data: null; 127 | ext: AutomaticCaptionEXT; 128 | url: string; 129 | } 130 | 131 | enum AutomaticCaptionEXT { 132 | Json3 = 'json3', 133 | Srv1 = 'srv1', 134 | Srv2 = 'srv2', 135 | Srv3 = 'srv3', 136 | Ttml = 'ttml', 137 | Vtt = 'vtt' 138 | } 139 | 140 | interface Chapter { 141 | end_time: number; 142 | start_time: number; 143 | title: string; 144 | } 145 | 146 | enum VideoEXT { 147 | M4A = 'm4a', 148 | Mhtml = 'mhtml', 149 | Mp4 = 'mp4', 150 | Webm = 'webm' 151 | } 152 | 153 | interface Format { 154 | abr: number | null; 155 | acodec: Acodec | null; 156 | asr: number | null; 157 | container: Container | null; 158 | downloader_options: DownloaderOptions | null; 159 | ext: VideoEXT; 160 | filesize: number | null; 161 | filesize_approx: number | null; 162 | format: string; 163 | format_id: string; 164 | format_note: null | string; 165 | fps: number | null; 166 | fragment_base_url: null; 167 | fragments: Fragment[] | null; 168 | height: number | null; 169 | http_headers: HTTPHeaders; 170 | language: Language | null; 171 | language_preference: number | null; 172 | manifest_url: null | string; 173 | no_resume: null; 174 | player_url: null; 175 | preference: null; 176 | protocol: Protocol; 177 | quality: number | null; 178 | resolution: string; 179 | source_preference: number | null; 180 | stretched_ratio: null; 181 | tbr: number | null; 182 | url: string; 183 | vbr: number | null; 184 | vcodec: null | string; 185 | width: number | null; 186 | } 187 | 188 | enum Container { 189 | M4ADash = 'm4a_dash', 190 | Mp4Dash = 'mp4_dash', 191 | WebmDash = 'webm_dash' 192 | } 193 | 194 | interface DownloaderOptions { 195 | http_chunk_size: number; 196 | } 197 | 198 | interface Fragment { 199 | duration: number; 200 | filesize: null; 201 | path: null; 202 | url: string; 203 | } 204 | 205 | interface HTTPHeaders { 206 | Accept: Accept; 207 | 'Accept-Language': AcceptLanguage; 208 | 'Sec-Fetch-Mode': SECFetchMode; 209 | 'User-Agent': string; 210 | } 211 | 212 | enum Accept { 213 | TextHTMLApplicationXHTMLXMLApplicationXMLQ09Q08 = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' 214 | } 215 | 216 | enum AcceptLanguage { 217 | EnUsEnQ05 = 'en-us,en;q=0.5' 218 | } 219 | 220 | enum SECFetchMode { 221 | Navigate = 'navigate' 222 | } 223 | 224 | enum Language { 225 | Vi = 'vi' 226 | } 227 | 228 | enum Protocol { 229 | HTTPS = 'https', 230 | M3U8Native = 'm3u8_native', 231 | Mhtml = 'mhtml' 232 | } 233 | 234 | interface Subtitles {} 235 | 236 | interface Thumbnail { 237 | filesize: null; 238 | height: number | null; 239 | id: string; 240 | preference: number; 241 | url: string; 242 | width: number | null; 243 | } 244 | } 245 | } 246 | 247 | export {}; 248 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@tauri-apps/api': 12 | specifier: ^1.6.0 13 | version: 1.6.0 14 | bits-ui: 15 | specifier: ^0.21.2 16 | version: 0.21.2(svelte@4.2.12) 17 | clsx: 18 | specifier: ^2.1.0 19 | version: 2.1.0 20 | cmdk-sv: 21 | specifier: ^0.0.17 22 | version: 0.0.17(svelte@4.2.12) 23 | lucide-svelte: 24 | specifier: ^0.446.0 25 | version: 0.446.0(svelte@4.2.12) 26 | svelte-sonner: 27 | specifier: ^0.3.22 28 | version: 0.3.22(svelte@4.2.12) 29 | tailwind-merge: 30 | specifier: ^2.2.2 31 | version: 2.2.2 32 | tailwind-variants: 33 | specifier: ^0.2.1 34 | version: 0.2.1(tailwindcss@3.4.13) 35 | tauri-plugin-upload-api: 36 | specifier: github:tauri-apps/tauri-plugin-upload#v1 37 | version: https://codeload.github.com/tauri-apps/tauri-plugin-upload/tar.gz/56d958697109d854bca19050403b017c9a28b434 38 | devDependencies: 39 | '@iconify/json': 40 | specifier: ^2.2.199 41 | version: 2.2.199 42 | '@sveltejs/adapter-static': 43 | specifier: ^3.0.1 44 | version: 3.0.1(@sveltejs/kit@2.5.5(@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8))(svelte@4.2.12)(vite@5.2.8)) 45 | '@sveltejs/kit': 46 | specifier: ^2.0.0 47 | version: 2.5.5(@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8))(svelte@4.2.12)(vite@5.2.8) 48 | '@sveltejs/vite-plugin-svelte': 49 | specifier: ^3.0.0 50 | version: 3.0.2(svelte@4.2.12)(vite@5.2.8) 51 | '@tailwindcss/typography': 52 | specifier: ^0.5.14 53 | version: 0.5.15(tailwindcss@3.4.13) 54 | '@tauri-apps/cli': 55 | specifier: ^1.6.2 56 | version: 1.6.2 57 | autoprefixer: 58 | specifier: ^10.4.20 59 | version: 10.4.20(postcss@8.4.38) 60 | postcss: 61 | specifier: ^8.4.32 62 | version: 8.4.38 63 | postcss-load-config: 64 | specifier: ^5.0.2 65 | version: 5.0.3(jiti@2.0.0)(postcss@8.4.38) 66 | prettier: 67 | specifier: ^3.1.1 68 | version: 3.2.5 69 | prettier-plugin-svelte: 70 | specifier: ^3.1.2 71 | version: 3.2.2(prettier@3.2.5)(svelte@4.2.12) 72 | prettier-plugin-tailwindcss: 73 | specifier: ^0.6.5 74 | version: 0.6.8(prettier-plugin-svelte@3.2.2(prettier@3.2.5)(svelte@4.2.12))(prettier@3.2.5) 75 | svelte: 76 | specifier: ^4.2.7 77 | version: 4.2.12 78 | svelte-check: 79 | specifier: ^3.6.0 80 | version: 3.6.9(postcss-load-config@5.0.3(jiti@2.0.0)(postcss@8.4.38))(postcss@8.4.38)(svelte@4.2.12) 81 | tailwindcss: 82 | specifier: ^3.4.9 83 | version: 3.4.13 84 | tslib: 85 | specifier: ^2.4.1 86 | version: 2.6.2 87 | typescript: 88 | specifier: ^5.0.0 89 | version: 5.4.4 90 | unplugin-icons: 91 | specifier: ^0.18.5 92 | version: 0.18.5 93 | vite: 94 | specifier: ^5.0.3 95 | version: 5.2.8 96 | 97 | packages: 98 | 99 | '@alloc/quick-lru@5.2.0': 100 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 101 | engines: {node: '>=10'} 102 | 103 | '@ampproject/remapping@2.3.0': 104 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 105 | engines: {node: '>=6.0.0'} 106 | 107 | '@antfu/install-pkg@0.1.1': 108 | resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} 109 | 110 | '@antfu/install-pkg@0.3.2': 111 | resolution: {integrity: sha512-FFYqME8+UHlPnRlX/vn+8cTD4Wo/nG/lzRxpABs3XANBmdJdNImVz3QvjNAE/W3PSCNbG387FOz8o5WelnWOlg==} 112 | 113 | '@antfu/utils@0.7.7': 114 | resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==} 115 | 116 | '@babel/runtime@7.24.4': 117 | resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} 118 | engines: {node: '>=6.9.0'} 119 | 120 | '@esbuild/aix-ppc64@0.20.2': 121 | resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} 122 | engines: {node: '>=12'} 123 | cpu: [ppc64] 124 | os: [aix] 125 | 126 | '@esbuild/android-arm64@0.20.2': 127 | resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} 128 | engines: {node: '>=12'} 129 | cpu: [arm64] 130 | os: [android] 131 | 132 | '@esbuild/android-arm@0.20.2': 133 | resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} 134 | engines: {node: '>=12'} 135 | cpu: [arm] 136 | os: [android] 137 | 138 | '@esbuild/android-x64@0.20.2': 139 | resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} 140 | engines: {node: '>=12'} 141 | cpu: [x64] 142 | os: [android] 143 | 144 | '@esbuild/darwin-arm64@0.20.2': 145 | resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} 146 | engines: {node: '>=12'} 147 | cpu: [arm64] 148 | os: [darwin] 149 | 150 | '@esbuild/darwin-x64@0.20.2': 151 | resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} 152 | engines: {node: '>=12'} 153 | cpu: [x64] 154 | os: [darwin] 155 | 156 | '@esbuild/freebsd-arm64@0.20.2': 157 | resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} 158 | engines: {node: '>=12'} 159 | cpu: [arm64] 160 | os: [freebsd] 161 | 162 | '@esbuild/freebsd-x64@0.20.2': 163 | resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} 164 | engines: {node: '>=12'} 165 | cpu: [x64] 166 | os: [freebsd] 167 | 168 | '@esbuild/linux-arm64@0.20.2': 169 | resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} 170 | engines: {node: '>=12'} 171 | cpu: [arm64] 172 | os: [linux] 173 | 174 | '@esbuild/linux-arm@0.20.2': 175 | resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} 176 | engines: {node: '>=12'} 177 | cpu: [arm] 178 | os: [linux] 179 | 180 | '@esbuild/linux-ia32@0.20.2': 181 | resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} 182 | engines: {node: '>=12'} 183 | cpu: [ia32] 184 | os: [linux] 185 | 186 | '@esbuild/linux-loong64@0.20.2': 187 | resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} 188 | engines: {node: '>=12'} 189 | cpu: [loong64] 190 | os: [linux] 191 | 192 | '@esbuild/linux-mips64el@0.20.2': 193 | resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} 194 | engines: {node: '>=12'} 195 | cpu: [mips64el] 196 | os: [linux] 197 | 198 | '@esbuild/linux-ppc64@0.20.2': 199 | resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} 200 | engines: {node: '>=12'} 201 | cpu: [ppc64] 202 | os: [linux] 203 | 204 | '@esbuild/linux-riscv64@0.20.2': 205 | resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} 206 | engines: {node: '>=12'} 207 | cpu: [riscv64] 208 | os: [linux] 209 | 210 | '@esbuild/linux-s390x@0.20.2': 211 | resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} 212 | engines: {node: '>=12'} 213 | cpu: [s390x] 214 | os: [linux] 215 | 216 | '@esbuild/linux-x64@0.20.2': 217 | resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} 218 | engines: {node: '>=12'} 219 | cpu: [x64] 220 | os: [linux] 221 | 222 | '@esbuild/netbsd-x64@0.20.2': 223 | resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} 224 | engines: {node: '>=12'} 225 | cpu: [x64] 226 | os: [netbsd] 227 | 228 | '@esbuild/openbsd-x64@0.20.2': 229 | resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} 230 | engines: {node: '>=12'} 231 | cpu: [x64] 232 | os: [openbsd] 233 | 234 | '@esbuild/sunos-x64@0.20.2': 235 | resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} 236 | engines: {node: '>=12'} 237 | cpu: [x64] 238 | os: [sunos] 239 | 240 | '@esbuild/win32-arm64@0.20.2': 241 | resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} 242 | engines: {node: '>=12'} 243 | cpu: [arm64] 244 | os: [win32] 245 | 246 | '@esbuild/win32-ia32@0.20.2': 247 | resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} 248 | engines: {node: '>=12'} 249 | cpu: [ia32] 250 | os: [win32] 251 | 252 | '@esbuild/win32-x64@0.20.2': 253 | resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} 254 | engines: {node: '>=12'} 255 | cpu: [x64] 256 | os: [win32] 257 | 258 | '@floating-ui/core@1.6.0': 259 | resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} 260 | 261 | '@floating-ui/dom@1.6.3': 262 | resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} 263 | 264 | '@floating-ui/utils@0.2.1': 265 | resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} 266 | 267 | '@iconify/json@2.2.199': 268 | resolution: {integrity: sha512-dmdbHES8HmvGYwdbse8g7ZO4Grvi35NGuaVA8+R5alkf1Ky6Y6atlzQJPhj7a6UN/+gM5qOzQ3Tcc6Fna7Rv5A==} 269 | 270 | '@iconify/types@2.0.0': 271 | resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} 272 | 273 | '@iconify/utils@2.1.22': 274 | resolution: {integrity: sha512-6UHVzTVXmvO8uS6xFF+L/QTSpTzA/JZxtgU+KYGFyDYMEObZ1bu/b5l+zNJjHy+0leWjHI+C0pXlzGvv3oXZMA==} 275 | 276 | '@internationalized/date@3.5.2': 277 | resolution: {integrity: sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==} 278 | 279 | '@isaacs/cliui@8.0.2': 280 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 281 | engines: {node: '>=12'} 282 | 283 | '@jridgewell/gen-mapping@0.3.5': 284 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 285 | engines: {node: '>=6.0.0'} 286 | 287 | '@jridgewell/resolve-uri@3.1.2': 288 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 289 | engines: {node: '>=6.0.0'} 290 | 291 | '@jridgewell/set-array@1.2.1': 292 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 293 | engines: {node: '>=6.0.0'} 294 | 295 | '@jridgewell/sourcemap-codec@1.4.15': 296 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 297 | 298 | '@jridgewell/trace-mapping@0.3.25': 299 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 300 | 301 | '@melt-ui/svelte@0.61.2': 302 | resolution: {integrity: sha512-BHkD9G31zQBToA4euDRBgTQRvWxT9scufOVCXgDO6HKTvyxFspbWT2bgiSFqAK4BbAGDn9Ao36Q8F9O71KN4OQ==} 303 | peerDependencies: 304 | svelte: '>=3 <5' 305 | 306 | '@melt-ui/svelte@0.76.2': 307 | resolution: {integrity: sha512-7SbOa11tXUS95T3fReL+dwDs5FyJtCEqrqG3inRziDws346SYLsxOQ6HmX+4BkIsQh1R8U3XNa+EMmdMt38lMA==} 308 | peerDependencies: 309 | svelte: '>=3 <5' 310 | 311 | '@nodelib/fs.scandir@2.1.5': 312 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 313 | engines: {node: '>= 8'} 314 | 315 | '@nodelib/fs.stat@2.0.5': 316 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 317 | engines: {node: '>= 8'} 318 | 319 | '@nodelib/fs.walk@1.2.8': 320 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 321 | engines: {node: '>= 8'} 322 | 323 | '@pkgjs/parseargs@0.11.0': 324 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 325 | engines: {node: '>=14'} 326 | 327 | '@polka/url@1.0.0-next.25': 328 | resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} 329 | 330 | '@rollup/rollup-android-arm-eabi@4.14.1': 331 | resolution: {integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==} 332 | cpu: [arm] 333 | os: [android] 334 | 335 | '@rollup/rollup-android-arm64@4.14.1': 336 | resolution: {integrity: sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==} 337 | cpu: [arm64] 338 | os: [android] 339 | 340 | '@rollup/rollup-darwin-arm64@4.14.1': 341 | resolution: {integrity: sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==} 342 | cpu: [arm64] 343 | os: [darwin] 344 | 345 | '@rollup/rollup-darwin-x64@4.14.1': 346 | resolution: {integrity: sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==} 347 | cpu: [x64] 348 | os: [darwin] 349 | 350 | '@rollup/rollup-linux-arm-gnueabihf@4.14.1': 351 | resolution: {integrity: sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==} 352 | cpu: [arm] 353 | os: [linux] 354 | 355 | '@rollup/rollup-linux-arm64-gnu@4.14.1': 356 | resolution: {integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==} 357 | cpu: [arm64] 358 | os: [linux] 359 | 360 | '@rollup/rollup-linux-arm64-musl@4.14.1': 361 | resolution: {integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==} 362 | cpu: [arm64] 363 | os: [linux] 364 | 365 | '@rollup/rollup-linux-powerpc64le-gnu@4.14.1': 366 | resolution: {integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==} 367 | cpu: [ppc64le] 368 | os: [linux] 369 | 370 | '@rollup/rollup-linux-riscv64-gnu@4.14.1': 371 | resolution: {integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==} 372 | cpu: [riscv64] 373 | os: [linux] 374 | 375 | '@rollup/rollup-linux-s390x-gnu@4.14.1': 376 | resolution: {integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==} 377 | cpu: [s390x] 378 | os: [linux] 379 | 380 | '@rollup/rollup-linux-x64-gnu@4.14.1': 381 | resolution: {integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==} 382 | cpu: [x64] 383 | os: [linux] 384 | 385 | '@rollup/rollup-linux-x64-musl@4.14.1': 386 | resolution: {integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==} 387 | cpu: [x64] 388 | os: [linux] 389 | 390 | '@rollup/rollup-win32-arm64-msvc@4.14.1': 391 | resolution: {integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==} 392 | cpu: [arm64] 393 | os: [win32] 394 | 395 | '@rollup/rollup-win32-ia32-msvc@4.14.1': 396 | resolution: {integrity: sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==} 397 | cpu: [ia32] 398 | os: [win32] 399 | 400 | '@rollup/rollup-win32-x64-msvc@4.14.1': 401 | resolution: {integrity: sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==} 402 | cpu: [x64] 403 | os: [win32] 404 | 405 | '@sveltejs/adapter-static@3.0.1': 406 | resolution: {integrity: sha512-6lMvf7xYEJ+oGeR5L8DFJJrowkefTK6ZgA4JiMqoClMkKq0s6yvsd3FZfCFvX1fQ0tpCD7fkuRVHsnUVgsHyNg==} 407 | peerDependencies: 408 | '@sveltejs/kit': ^2.0.0 409 | 410 | '@sveltejs/kit@2.5.5': 411 | resolution: {integrity: sha512-ULe3PB00q4+wYRL+IS5FDPsCEVnhEITofm7b9Yz8malcH3r1SAnW/JJ6T13hIMeu8QNRIuVQWo+P4+2VklbnLQ==} 412 | engines: {node: '>=18.13'} 413 | hasBin: true 414 | peerDependencies: 415 | '@sveltejs/vite-plugin-svelte': ^3.0.0 416 | svelte: ^4.0.0 || ^5.0.0-next.0 417 | vite: ^5.0.3 418 | 419 | '@sveltejs/vite-plugin-svelte-inspector@2.0.0': 420 | resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} 421 | engines: {node: ^18.0.0 || >=20} 422 | peerDependencies: 423 | '@sveltejs/vite-plugin-svelte': ^3.0.0 424 | svelte: ^4.0.0 || ^5.0.0-next.0 425 | vite: ^5.0.0 426 | 427 | '@sveltejs/vite-plugin-svelte@3.0.2': 428 | resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==} 429 | engines: {node: ^18.0.0 || >=20} 430 | peerDependencies: 431 | svelte: ^4.0.0 || ^5.0.0-next.0 432 | vite: ^5.0.0 433 | 434 | '@swc/helpers@0.5.8': 435 | resolution: {integrity: sha512-lruDGw3pnfM3wmZHeW7JuhkGQaJjPyiKjxeGhdmfoOT53Ic9qb5JLDNaK2HUdl1zLDeX28H221UvKjfdvSLVMg==} 436 | 437 | '@tailwindcss/typography@0.5.15': 438 | resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} 439 | peerDependencies: 440 | tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20' 441 | 442 | '@tauri-apps/api@1.5.3': 443 | resolution: {integrity: sha512-zxnDjHHKjOsrIzZm6nO5Xapb/BxqUq1tc7cGkFXsFkGTsSWgCPH1D8mm0XS9weJY2OaR73I3k3S+b7eSzJDfqA==} 444 | engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} 445 | 446 | '@tauri-apps/api@1.6.0': 447 | resolution: {integrity: sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==} 448 | engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} 449 | 450 | '@tauri-apps/cli-darwin-arm64@1.6.2': 451 | resolution: {integrity: sha512-6mdRyf9DaLqlZvj8kZB09U3rwY+dOHSGzTZ7+GDg665GJb17f4cb30e8dExj6/aghcsOie9EGpgiURcDUvLNSQ==} 452 | engines: {node: '>= 10'} 453 | cpu: [arm64] 454 | os: [darwin] 455 | 456 | '@tauri-apps/cli-darwin-x64@1.6.2': 457 | resolution: {integrity: sha512-PLxZY5dn38H3R9VRmBN/l0ZDB5JFanCwlK4rmpzDQPPg3tQmbu5vjSCP6TVj5U6aLKsj79kFyULblPr5Dn9+vw==} 458 | engines: {node: '>= 10'} 459 | cpu: [x64] 460 | os: [darwin] 461 | 462 | '@tauri-apps/cli-linux-arm-gnueabihf@1.6.2': 463 | resolution: {integrity: sha512-xnpj4BLeeGOh5I/ewCQlYJZwHH0CBNBN+4q8BNWNQ9MKkjN9ST366RmHRzl2ANNgWwijOPxyce7GiUmvuH8Atw==} 464 | engines: {node: '>= 10'} 465 | cpu: [arm] 466 | os: [linux] 467 | 468 | '@tauri-apps/cli-linux-arm64-gnu@1.6.2': 469 | resolution: {integrity: sha512-uaiRE0vE2P+tdsCngfKt+7yKr3VZXIq/t3w01DzSdnBgHSp0zmRsRR4AhZt7ibvoEgA8GzBP+eSHJdFNZsTU9w==} 470 | engines: {node: '>= 10'} 471 | cpu: [arm64] 472 | os: [linux] 473 | 474 | '@tauri-apps/cli-linux-arm64-musl@1.6.2': 475 | resolution: {integrity: sha512-o9JunVrMrhqTBLrdvEbS64W0bo1dPm0lxX51Mx+6x9SmbDjlEWGgaAHC3iKLK9khd5Yu1uO1e+8TJltAcScvmw==} 476 | engines: {node: '>= 10'} 477 | cpu: [arm64] 478 | os: [linux] 479 | 480 | '@tauri-apps/cli-linux-x64-gnu@1.6.2': 481 | resolution: {integrity: sha512-jL9f+o61DdQmNYKIt2Q3BA8YJ+hyC5+GdNxqDf7j5SoQ85j//YfUWbmp9ZgsPHVBxgSGZVvgGMNvf64Ykp0buQ==} 482 | engines: {node: '>= 10'} 483 | cpu: [x64] 484 | os: [linux] 485 | 486 | '@tauri-apps/cli-linux-x64-musl@1.6.2': 487 | resolution: {integrity: sha512-xsa4Pu9YMHKAX0J8pIoXfN/uhvAAAoECZDixDhWw8zi57VZ4QX28ycqolS+NscdD9NAGSgHk45MpBZWdvRtvjQ==} 488 | engines: {node: '>= 10'} 489 | cpu: [x64] 490 | os: [linux] 491 | 492 | '@tauri-apps/cli-win32-arm64-msvc@1.6.2': 493 | resolution: {integrity: sha512-eJtUOx2UFhJpCCkm5M5+4Co9JbjvgIHTdyS/hTSZfOEdT58CNEGVJXMA39FsSZXYoxYPE+9K7Km6haMozSmlxw==} 494 | engines: {node: '>= 10'} 495 | cpu: [arm64] 496 | os: [win32] 497 | 498 | '@tauri-apps/cli-win32-ia32-msvc@1.6.2': 499 | resolution: {integrity: sha512-9Jwx3PrhNw3VKOgPISRRXPkvoEAZP+7rFRHXIo49dvlHy2E/o9qpWi1IntE33HWeazP6KhvsCjvXB2Ai4eGooA==} 500 | engines: {node: '>= 10'} 501 | cpu: [ia32] 502 | os: [win32] 503 | 504 | '@tauri-apps/cli-win32-x64-msvc@1.6.2': 505 | resolution: {integrity: sha512-5Z+ZjRFJE8MXghJe1UXvGephY5ZcgVhiTI9yuMi9xgX3CEaAXASatyXllzsvGJ9EDaWMEpa0PHjAzi7LBAWROw==} 506 | engines: {node: '>= 10'} 507 | cpu: [x64] 508 | os: [win32] 509 | 510 | '@tauri-apps/cli@1.6.2': 511 | resolution: {integrity: sha512-zpfZdxhm20s7d/Uejpg/T3a9sqLVe3Ih2ztINfy8v6iLw9Ohowkb9g+agZffYKlEWfOSpmCy69NFyBLj7OZL0A==} 512 | engines: {node: '>= 10'} 513 | hasBin: true 514 | 515 | '@types/cookie@0.6.0': 516 | resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 517 | 518 | '@types/estree@1.0.5': 519 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 520 | 521 | '@types/pug@2.0.10': 522 | resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} 523 | 524 | acorn@8.11.3: 525 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 526 | engines: {node: '>=0.4.0'} 527 | hasBin: true 528 | 529 | ansi-regex@5.0.1: 530 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 531 | engines: {node: '>=8'} 532 | 533 | ansi-regex@6.0.1: 534 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 535 | engines: {node: '>=12'} 536 | 537 | ansi-styles@4.3.0: 538 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 539 | engines: {node: '>=8'} 540 | 541 | ansi-styles@6.2.1: 542 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 543 | engines: {node: '>=12'} 544 | 545 | any-promise@1.3.0: 546 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 547 | 548 | anymatch@3.1.3: 549 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 550 | engines: {node: '>= 8'} 551 | 552 | arg@5.0.2: 553 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 554 | 555 | aria-query@5.3.0: 556 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 557 | 558 | autoprefixer@10.4.20: 559 | resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} 560 | engines: {node: ^10 || ^12 || >=14} 561 | hasBin: true 562 | peerDependencies: 563 | postcss: ^8.1.0 564 | 565 | axobject-query@4.0.0: 566 | resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} 567 | 568 | balanced-match@1.0.2: 569 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 570 | 571 | binary-extensions@2.3.0: 572 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 573 | engines: {node: '>=8'} 574 | 575 | bits-ui@0.21.2: 576 | resolution: {integrity: sha512-tDOvNdJ+uC/VWlzCZ6Pwv3enQJBw1D7leUfdIqg8WvqcDHnvn3fk4V3Y9VmpMOPnl+xTaiKxSiVpO/Dh8wD6jA==} 577 | peerDependencies: 578 | svelte: ^4.0.0 579 | 580 | bits-ui@0.9.9: 581 | resolution: {integrity: sha512-LkdkyTtpXdkjBzPZJVJgpcre4fut6DONoprMfadHFo82HNUhph+02CxDjYEcZcThb5z4YjSxMlCYvQPZm+YtfQ==} 582 | peerDependencies: 583 | svelte: ^4.0.0 584 | 585 | brace-expansion@1.1.11: 586 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 587 | 588 | brace-expansion@2.0.1: 589 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 590 | 591 | braces@3.0.2: 592 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 593 | engines: {node: '>=8'} 594 | 595 | browserslist@4.24.0: 596 | resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} 597 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 598 | hasBin: true 599 | 600 | buffer-crc32@0.2.13: 601 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 602 | 603 | callsites@3.1.0: 604 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 605 | engines: {node: '>=6'} 606 | 607 | camelcase-css@2.0.1: 608 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 609 | engines: {node: '>= 6'} 610 | 611 | caniuse-lite@1.0.30001664: 612 | resolution: {integrity: sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==} 613 | 614 | chokidar@3.6.0: 615 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 616 | engines: {node: '>= 8.10.0'} 617 | 618 | clsx@2.1.0: 619 | resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} 620 | engines: {node: '>=6'} 621 | 622 | cmdk-sv@0.0.17: 623 | resolution: {integrity: sha512-28QTrK1tT1TSNoGq9MVnzjeLNNjCgjmsM8c2HJfDpRt9t+GD+9m3wX/WdAPaP9jdoNYU0SSdZVdgsGgpaSQOYQ==} 624 | peerDependencies: 625 | svelte: ^4.0.0 626 | 627 | code-red@1.0.4: 628 | resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} 629 | 630 | color-convert@2.0.1: 631 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 632 | engines: {node: '>=7.0.0'} 633 | 634 | color-name@1.1.4: 635 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 636 | 637 | commander@4.1.1: 638 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 639 | engines: {node: '>= 6'} 640 | 641 | concat-map@0.0.1: 642 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 643 | 644 | cookie@0.6.0: 645 | resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 646 | engines: {node: '>= 0.6'} 647 | 648 | cross-spawn@7.0.3: 649 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 650 | engines: {node: '>= 8'} 651 | 652 | css-tree@2.3.1: 653 | resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 654 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 655 | 656 | cssesc@3.0.0: 657 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 658 | engines: {node: '>=4'} 659 | hasBin: true 660 | 661 | debug@4.3.4: 662 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 663 | engines: {node: '>=6.0'} 664 | peerDependencies: 665 | supports-color: '*' 666 | peerDependenciesMeta: 667 | supports-color: 668 | optional: true 669 | 670 | deepmerge@4.3.1: 671 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 672 | engines: {node: '>=0.10.0'} 673 | 674 | dequal@2.0.3: 675 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 676 | engines: {node: '>=6'} 677 | 678 | detect-indent@6.1.0: 679 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 680 | engines: {node: '>=8'} 681 | 682 | devalue@4.3.2: 683 | resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} 684 | 685 | didyoumean@1.2.2: 686 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 687 | 688 | dlv@1.1.3: 689 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 690 | 691 | eastasianwidth@0.2.0: 692 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 693 | 694 | electron-to-chromium@1.5.29: 695 | resolution: {integrity: sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==} 696 | 697 | emoji-regex@8.0.0: 698 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 699 | 700 | emoji-regex@9.2.2: 701 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 702 | 703 | es6-promise@3.3.1: 704 | resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} 705 | 706 | esbuild@0.20.2: 707 | resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} 708 | engines: {node: '>=12'} 709 | hasBin: true 710 | 711 | escalade@3.2.0: 712 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 713 | engines: {node: '>=6'} 714 | 715 | esm-env@1.0.0: 716 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 717 | 718 | estree-walker@3.0.3: 719 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 720 | 721 | execa@5.1.1: 722 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 723 | engines: {node: '>=10'} 724 | 725 | execa@8.0.1: 726 | resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 727 | engines: {node: '>=16.17'} 728 | 729 | fast-glob@3.3.2: 730 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 731 | engines: {node: '>=8.6.0'} 732 | 733 | fastq@1.17.1: 734 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 735 | 736 | fill-range@7.0.1: 737 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 738 | engines: {node: '>=8'} 739 | 740 | find-up@5.0.0: 741 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 742 | engines: {node: '>=10'} 743 | 744 | focus-trap@7.5.4: 745 | resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} 746 | 747 | foreground-child@3.1.1: 748 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 749 | engines: {node: '>=14'} 750 | 751 | fraction.js@4.3.7: 752 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 753 | 754 | fs.realpath@1.0.0: 755 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 756 | 757 | fsevents@2.3.3: 758 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 759 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 760 | os: [darwin] 761 | 762 | function-bind@1.1.2: 763 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 764 | 765 | get-stream@6.0.1: 766 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 767 | engines: {node: '>=10'} 768 | 769 | get-stream@8.0.1: 770 | resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 771 | engines: {node: '>=16'} 772 | 773 | glob-parent@5.1.2: 774 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 775 | engines: {node: '>= 6'} 776 | 777 | glob-parent@6.0.2: 778 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 779 | engines: {node: '>=10.13.0'} 780 | 781 | glob@10.3.12: 782 | resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} 783 | engines: {node: '>=16 || 14 >=14.17'} 784 | hasBin: true 785 | 786 | glob@7.2.3: 787 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 788 | 789 | globalyzer@0.1.0: 790 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 791 | 792 | globrex@0.1.2: 793 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 794 | 795 | graceful-fs@4.2.11: 796 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 797 | 798 | hasown@2.0.2: 799 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 800 | engines: {node: '>= 0.4'} 801 | 802 | human-signals@2.1.0: 803 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 804 | engines: {node: '>=10.17.0'} 805 | 806 | human-signals@5.0.0: 807 | resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 808 | engines: {node: '>=16.17.0'} 809 | 810 | import-fresh@3.3.0: 811 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 812 | engines: {node: '>=6'} 813 | 814 | import-meta-resolve@4.0.0: 815 | resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} 816 | 817 | inflight@1.0.6: 818 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 819 | 820 | inherits@2.0.4: 821 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 822 | 823 | is-binary-path@2.1.0: 824 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 825 | engines: {node: '>=8'} 826 | 827 | is-core-module@2.13.1: 828 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 829 | 830 | is-extglob@2.1.1: 831 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 832 | engines: {node: '>=0.10.0'} 833 | 834 | is-fullwidth-code-point@3.0.0: 835 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 836 | engines: {node: '>=8'} 837 | 838 | is-glob@4.0.3: 839 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 840 | engines: {node: '>=0.10.0'} 841 | 842 | is-number@7.0.0: 843 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 844 | engines: {node: '>=0.12.0'} 845 | 846 | is-reference@3.0.2: 847 | resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} 848 | 849 | is-stream@2.0.1: 850 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 851 | engines: {node: '>=8'} 852 | 853 | is-stream@3.0.0: 854 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 855 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 856 | 857 | isexe@2.0.0: 858 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 859 | 860 | jackspeak@2.3.6: 861 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 862 | engines: {node: '>=14'} 863 | 864 | jiti@1.21.0: 865 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 866 | hasBin: true 867 | 868 | jiti@2.0.0: 869 | resolution: {integrity: sha512-CJ7e7Abb779OTRv3lomfp7Mns/Sy1+U4pcAx5VbjxCZD5ZM/VJaXPpPjNKjtSvWQy/H86E49REXR34dl1JEz9w==} 870 | hasBin: true 871 | 872 | jsonc-parser@3.2.1: 873 | resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} 874 | 875 | kleur@4.1.5: 876 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 877 | engines: {node: '>=6'} 878 | 879 | kolorist@1.8.0: 880 | resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 881 | 882 | lilconfig@2.1.0: 883 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 884 | engines: {node: '>=10'} 885 | 886 | lilconfig@3.1.1: 887 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 888 | engines: {node: '>=14'} 889 | 890 | lines-and-columns@1.2.4: 891 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 892 | 893 | local-pkg@0.5.0: 894 | resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} 895 | engines: {node: '>=14'} 896 | 897 | locate-character@3.0.0: 898 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 899 | 900 | locate-path@6.0.0: 901 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 902 | engines: {node: '>=10'} 903 | 904 | lodash.castarray@4.4.0: 905 | resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} 906 | 907 | lodash.isplainobject@4.0.6: 908 | resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} 909 | 910 | lodash.merge@4.6.2: 911 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 912 | 913 | lru-cache@10.2.0: 914 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 915 | engines: {node: 14 || >=16.14} 916 | 917 | lucide-svelte@0.446.0: 918 | resolution: {integrity: sha512-ofx/Ykes1q1/sb0t4weezIt0SrMZd4x5Ox1APeR/ZgAHB7taXHqEExS9aGVImFqS35CfnjNGUqMr16/GwTd2lQ==} 919 | peerDependencies: 920 | svelte: ^3 || ^4 || ^5.0.0-next.42 921 | 922 | magic-string@0.30.9: 923 | resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} 924 | engines: {node: '>=12'} 925 | 926 | mdn-data@2.0.30: 927 | resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 928 | 929 | merge-stream@2.0.0: 930 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 931 | 932 | merge2@1.4.1: 933 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 934 | engines: {node: '>= 8'} 935 | 936 | micromatch@4.0.5: 937 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 938 | engines: {node: '>=8.6'} 939 | 940 | mimic-fn@2.1.0: 941 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 942 | engines: {node: '>=6'} 943 | 944 | mimic-fn@4.0.0: 945 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 946 | engines: {node: '>=12'} 947 | 948 | min-indent@1.0.1: 949 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 950 | engines: {node: '>=4'} 951 | 952 | minimatch@3.1.2: 953 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 954 | 955 | minimatch@9.0.4: 956 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 957 | engines: {node: '>=16 || 14 >=14.17'} 958 | 959 | minimist@1.2.8: 960 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 961 | 962 | minipass@7.0.4: 963 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 964 | engines: {node: '>=16 || 14 >=14.17'} 965 | 966 | mkdirp@0.5.6: 967 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 968 | hasBin: true 969 | 970 | mlly@1.6.1: 971 | resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} 972 | 973 | mri@1.2.0: 974 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 975 | engines: {node: '>=4'} 976 | 977 | mrmime@2.0.0: 978 | resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} 979 | engines: {node: '>=10'} 980 | 981 | ms@2.1.2: 982 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 983 | 984 | mz@2.7.0: 985 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 986 | 987 | nanoid@3.3.7: 988 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 989 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 990 | hasBin: true 991 | 992 | nanoid@4.0.2: 993 | resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} 994 | engines: {node: ^14 || ^16 || >=18} 995 | hasBin: true 996 | 997 | nanoid@5.0.7: 998 | resolution: {integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==} 999 | engines: {node: ^18 || >=20} 1000 | hasBin: true 1001 | 1002 | node-releases@2.0.18: 1003 | resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 1004 | 1005 | normalize-path@3.0.0: 1006 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1007 | engines: {node: '>=0.10.0'} 1008 | 1009 | normalize-range@0.1.2: 1010 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1011 | engines: {node: '>=0.10.0'} 1012 | 1013 | npm-run-path@4.0.1: 1014 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1015 | engines: {node: '>=8'} 1016 | 1017 | npm-run-path@5.3.0: 1018 | resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 1019 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1020 | 1021 | object-assign@4.1.1: 1022 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1023 | engines: {node: '>=0.10.0'} 1024 | 1025 | object-hash@3.0.0: 1026 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1027 | engines: {node: '>= 6'} 1028 | 1029 | once@1.4.0: 1030 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1031 | 1032 | onetime@5.1.2: 1033 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1034 | engines: {node: '>=6'} 1035 | 1036 | onetime@6.0.0: 1037 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1038 | engines: {node: '>=12'} 1039 | 1040 | p-limit@3.1.0: 1041 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1042 | engines: {node: '>=10'} 1043 | 1044 | p-locate@5.0.0: 1045 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1046 | engines: {node: '>=10'} 1047 | 1048 | parent-module@1.0.1: 1049 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1050 | engines: {node: '>=6'} 1051 | 1052 | path-exists@4.0.0: 1053 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1054 | engines: {node: '>=8'} 1055 | 1056 | path-is-absolute@1.0.1: 1057 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1058 | engines: {node: '>=0.10.0'} 1059 | 1060 | path-key@3.1.1: 1061 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1062 | engines: {node: '>=8'} 1063 | 1064 | path-key@4.0.0: 1065 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 1066 | engines: {node: '>=12'} 1067 | 1068 | path-parse@1.0.7: 1069 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1070 | 1071 | path-scurry@1.10.2: 1072 | resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} 1073 | engines: {node: '>=16 || 14 >=14.17'} 1074 | 1075 | pathe@1.1.2: 1076 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 1077 | 1078 | periscopic@3.1.0: 1079 | resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} 1080 | 1081 | picocolors@1.0.0: 1082 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1083 | 1084 | picocolors@1.1.0: 1085 | resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} 1086 | 1087 | picomatch@2.3.1: 1088 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1089 | engines: {node: '>=8.6'} 1090 | 1091 | pify@2.3.0: 1092 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1093 | engines: {node: '>=0.10.0'} 1094 | 1095 | pirates@4.0.6: 1096 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1097 | engines: {node: '>= 6'} 1098 | 1099 | pkg-types@1.0.3: 1100 | resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} 1101 | 1102 | postcss-import@15.1.0: 1103 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 1104 | engines: {node: '>=14.0.0'} 1105 | peerDependencies: 1106 | postcss: ^8.0.0 1107 | 1108 | postcss-js@4.0.1: 1109 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 1110 | engines: {node: ^12 || ^14 || >= 16} 1111 | peerDependencies: 1112 | postcss: ^8.4.21 1113 | 1114 | postcss-load-config@4.0.2: 1115 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1116 | engines: {node: '>= 14'} 1117 | peerDependencies: 1118 | postcss: '>=8.0.9' 1119 | ts-node: '>=9.0.0' 1120 | peerDependenciesMeta: 1121 | postcss: 1122 | optional: true 1123 | ts-node: 1124 | optional: true 1125 | 1126 | postcss-load-config@5.0.3: 1127 | resolution: {integrity: sha512-90pBBI5apUVruIEdCxZic93Wm+i9fTrp7TXbgdUCH+/L+2WnfpITSpq5dFU/IPvbv7aNiMlQISpUkAm3fEcvgQ==} 1128 | engines: {node: '>= 18'} 1129 | peerDependencies: 1130 | jiti: '>=1.21.0' 1131 | postcss: '>=8.0.9' 1132 | peerDependenciesMeta: 1133 | jiti: 1134 | optional: true 1135 | postcss: 1136 | optional: true 1137 | 1138 | postcss-nested@6.0.1: 1139 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 1140 | engines: {node: '>=12.0'} 1141 | peerDependencies: 1142 | postcss: ^8.2.14 1143 | 1144 | postcss-selector-parser@6.0.10: 1145 | resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} 1146 | engines: {node: '>=4'} 1147 | 1148 | postcss-selector-parser@6.0.16: 1149 | resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} 1150 | engines: {node: '>=4'} 1151 | 1152 | postcss-value-parser@4.2.0: 1153 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1154 | 1155 | postcss@8.4.38: 1156 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} 1157 | engines: {node: ^10 || ^12 || >=14} 1158 | 1159 | prettier-plugin-svelte@3.2.2: 1160 | resolution: {integrity: sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q==} 1161 | peerDependencies: 1162 | prettier: ^3.0.0 1163 | svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 1164 | 1165 | prettier-plugin-tailwindcss@0.6.8: 1166 | resolution: {integrity: sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA==} 1167 | engines: {node: '>=14.21.3'} 1168 | peerDependencies: 1169 | '@ianvs/prettier-plugin-sort-imports': '*' 1170 | '@prettier/plugin-pug': '*' 1171 | '@shopify/prettier-plugin-liquid': '*' 1172 | '@trivago/prettier-plugin-sort-imports': '*' 1173 | '@zackad/prettier-plugin-twig-melody': '*' 1174 | prettier: ^3.0 1175 | prettier-plugin-astro: '*' 1176 | prettier-plugin-css-order: '*' 1177 | prettier-plugin-import-sort: '*' 1178 | prettier-plugin-jsdoc: '*' 1179 | prettier-plugin-marko: '*' 1180 | prettier-plugin-multiline-arrays: '*' 1181 | prettier-plugin-organize-attributes: '*' 1182 | prettier-plugin-organize-imports: '*' 1183 | prettier-plugin-sort-imports: '*' 1184 | prettier-plugin-style-order: '*' 1185 | prettier-plugin-svelte: '*' 1186 | peerDependenciesMeta: 1187 | '@ianvs/prettier-plugin-sort-imports': 1188 | optional: true 1189 | '@prettier/plugin-pug': 1190 | optional: true 1191 | '@shopify/prettier-plugin-liquid': 1192 | optional: true 1193 | '@trivago/prettier-plugin-sort-imports': 1194 | optional: true 1195 | '@zackad/prettier-plugin-twig-melody': 1196 | optional: true 1197 | prettier-plugin-astro: 1198 | optional: true 1199 | prettier-plugin-css-order: 1200 | optional: true 1201 | prettier-plugin-import-sort: 1202 | optional: true 1203 | prettier-plugin-jsdoc: 1204 | optional: true 1205 | prettier-plugin-marko: 1206 | optional: true 1207 | prettier-plugin-multiline-arrays: 1208 | optional: true 1209 | prettier-plugin-organize-attributes: 1210 | optional: true 1211 | prettier-plugin-organize-imports: 1212 | optional: true 1213 | prettier-plugin-sort-imports: 1214 | optional: true 1215 | prettier-plugin-style-order: 1216 | optional: true 1217 | prettier-plugin-svelte: 1218 | optional: true 1219 | 1220 | prettier@3.2.5: 1221 | resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} 1222 | engines: {node: '>=14'} 1223 | hasBin: true 1224 | 1225 | queue-microtask@1.2.3: 1226 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1227 | 1228 | read-cache@1.0.0: 1229 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 1230 | 1231 | readdirp@3.6.0: 1232 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1233 | engines: {node: '>=8.10.0'} 1234 | 1235 | regenerator-runtime@0.14.1: 1236 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1237 | 1238 | resolve-from@4.0.0: 1239 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1240 | engines: {node: '>=4'} 1241 | 1242 | resolve@1.22.8: 1243 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1244 | hasBin: true 1245 | 1246 | reusify@1.0.4: 1247 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1248 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1249 | 1250 | rimraf@2.7.1: 1251 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 1252 | hasBin: true 1253 | 1254 | rollup@4.14.1: 1255 | resolution: {integrity: sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==} 1256 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1257 | hasBin: true 1258 | 1259 | run-parallel@1.2.0: 1260 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1261 | 1262 | sade@1.8.1: 1263 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1264 | engines: {node: '>=6'} 1265 | 1266 | sander@0.5.1: 1267 | resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} 1268 | 1269 | set-cookie-parser@2.6.0: 1270 | resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} 1271 | 1272 | shebang-command@2.0.0: 1273 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1274 | engines: {node: '>=8'} 1275 | 1276 | shebang-regex@3.0.0: 1277 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1278 | engines: {node: '>=8'} 1279 | 1280 | signal-exit@3.0.7: 1281 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1282 | 1283 | signal-exit@4.1.0: 1284 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1285 | engines: {node: '>=14'} 1286 | 1287 | sirv@2.0.4: 1288 | resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} 1289 | engines: {node: '>= 10'} 1290 | 1291 | sorcery@0.11.0: 1292 | resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} 1293 | hasBin: true 1294 | 1295 | source-map-js@1.2.0: 1296 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 1297 | engines: {node: '>=0.10.0'} 1298 | 1299 | string-width@4.2.3: 1300 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1301 | engines: {node: '>=8'} 1302 | 1303 | string-width@5.1.2: 1304 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1305 | engines: {node: '>=12'} 1306 | 1307 | strip-ansi@6.0.1: 1308 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1309 | engines: {node: '>=8'} 1310 | 1311 | strip-ansi@7.1.0: 1312 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1313 | engines: {node: '>=12'} 1314 | 1315 | strip-final-newline@2.0.0: 1316 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1317 | engines: {node: '>=6'} 1318 | 1319 | strip-final-newline@3.0.0: 1320 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 1321 | engines: {node: '>=12'} 1322 | 1323 | strip-indent@3.0.0: 1324 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1325 | engines: {node: '>=8'} 1326 | 1327 | sucrase@3.35.0: 1328 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1329 | engines: {node: '>=16 || 14 >=14.17'} 1330 | hasBin: true 1331 | 1332 | supports-preserve-symlinks-flag@1.0.0: 1333 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1334 | engines: {node: '>= 0.4'} 1335 | 1336 | svelte-check@3.6.9: 1337 | resolution: {integrity: sha512-hDQrk3L0osX07djQyMiXocKysTLfusqi8AriNcCiQxhQR49/LonYolcUGMtZ0fbUR8HTR198Prrgf52WWU9wEg==} 1338 | hasBin: true 1339 | peerDependencies: 1340 | svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 1341 | 1342 | svelte-hmr@0.15.3: 1343 | resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} 1344 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 1345 | peerDependencies: 1346 | svelte: ^3.19.0 || ^4.0.0 1347 | 1348 | svelte-preprocess@5.1.3: 1349 | resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} 1350 | engines: {node: '>= 16.0.0', pnpm: ^8.0.0} 1351 | peerDependencies: 1352 | '@babel/core': ^7.10.2 1353 | coffeescript: ^2.5.1 1354 | less: ^3.11.3 || ^4.0.0 1355 | postcss: ^7 || ^8 1356 | postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 1357 | pug: ^3.0.0 1358 | sass: ^1.26.8 1359 | stylus: ^0.55.0 1360 | sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 1361 | svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 1362 | typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' 1363 | peerDependenciesMeta: 1364 | '@babel/core': 1365 | optional: true 1366 | coffeescript: 1367 | optional: true 1368 | less: 1369 | optional: true 1370 | postcss: 1371 | optional: true 1372 | postcss-load-config: 1373 | optional: true 1374 | pug: 1375 | optional: true 1376 | sass: 1377 | optional: true 1378 | stylus: 1379 | optional: true 1380 | sugarss: 1381 | optional: true 1382 | typescript: 1383 | optional: true 1384 | 1385 | svelte-sonner@0.3.22: 1386 | resolution: {integrity: sha512-1AEBl7rTP4oeMAmBmkcvoHNOwB8gPzz73RYApcY8pyDwbjBewU8ATnXV8N42omV1sQvtSX/X0o5A1nfkN3T6cg==} 1387 | peerDependencies: 1388 | svelte: '>=3 <5' 1389 | 1390 | svelte@4.2.12: 1391 | resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==} 1392 | engines: {node: '>=16'} 1393 | 1394 | tabbable@6.2.0: 1395 | resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} 1396 | 1397 | tailwind-merge@2.2.2: 1398 | resolution: {integrity: sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==} 1399 | 1400 | tailwind-variants@0.2.1: 1401 | resolution: {integrity: sha512-2xmhAf4UIc3PijOUcJPA1LP4AbxhpcHuHM2C26xM0k81r0maAO6uoUSHl3APmvHZcY5cZCY/bYuJdfFa4eGoaw==} 1402 | engines: {node: '>=16.x', pnpm: '>=7.x'} 1403 | peerDependencies: 1404 | tailwindcss: '*' 1405 | 1406 | tailwindcss@3.4.13: 1407 | resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==} 1408 | engines: {node: '>=14.0.0'} 1409 | hasBin: true 1410 | 1411 | tauri-plugin-upload-api@https://codeload.github.com/tauri-apps/tauri-plugin-upload/tar.gz/56d958697109d854bca19050403b017c9a28b434: 1412 | resolution: {tarball: https://codeload.github.com/tauri-apps/tauri-plugin-upload/tar.gz/56d958697109d854bca19050403b017c9a28b434} 1413 | version: 0.0.0 1414 | 1415 | thenify-all@1.6.0: 1416 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1417 | engines: {node: '>=0.8'} 1418 | 1419 | thenify@3.3.1: 1420 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1421 | 1422 | tiny-glob@0.2.9: 1423 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 1424 | 1425 | to-regex-range@5.0.1: 1426 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1427 | engines: {node: '>=8.0'} 1428 | 1429 | totalist@3.0.1: 1430 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1431 | engines: {node: '>=6'} 1432 | 1433 | ts-interface-checker@0.1.13: 1434 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1435 | 1436 | tslib@2.6.2: 1437 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 1438 | 1439 | typescript@5.4.4: 1440 | resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==} 1441 | engines: {node: '>=14.17'} 1442 | hasBin: true 1443 | 1444 | ufo@1.5.3: 1445 | resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} 1446 | 1447 | unplugin-icons@0.18.5: 1448 | resolution: {integrity: sha512-KVNAohXbZ7tVcG1C3p6QaC7wU9Qrj7etv4XvsMMJAxr5LccQZ+Iuv5LOIv/7GtqXaGN1BuFCqRO1ErsHEgEXdQ==} 1449 | peerDependencies: 1450 | '@svgr/core': '>=7.0.0' 1451 | '@svgx/core': ^1.0.1 1452 | '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 1453 | vue-template-compiler: ^2.6.12 1454 | vue-template-es2015-compiler: ^1.9.0 1455 | peerDependenciesMeta: 1456 | '@svgr/core': 1457 | optional: true 1458 | '@svgx/core': 1459 | optional: true 1460 | '@vue/compiler-sfc': 1461 | optional: true 1462 | vue-template-compiler: 1463 | optional: true 1464 | vue-template-es2015-compiler: 1465 | optional: true 1466 | 1467 | unplugin@1.10.1: 1468 | resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} 1469 | engines: {node: '>=14.0.0'} 1470 | 1471 | update-browserslist-db@1.1.1: 1472 | resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} 1473 | hasBin: true 1474 | peerDependencies: 1475 | browserslist: '>= 4.21.0' 1476 | 1477 | util-deprecate@1.0.2: 1478 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1479 | 1480 | vite@5.2.8: 1481 | resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} 1482 | engines: {node: ^18.0.0 || >=20.0.0} 1483 | hasBin: true 1484 | peerDependencies: 1485 | '@types/node': ^18.0.0 || >=20.0.0 1486 | less: '*' 1487 | lightningcss: ^1.21.0 1488 | sass: '*' 1489 | stylus: '*' 1490 | sugarss: '*' 1491 | terser: ^5.4.0 1492 | peerDependenciesMeta: 1493 | '@types/node': 1494 | optional: true 1495 | less: 1496 | optional: true 1497 | lightningcss: 1498 | optional: true 1499 | sass: 1500 | optional: true 1501 | stylus: 1502 | optional: true 1503 | sugarss: 1504 | optional: true 1505 | terser: 1506 | optional: true 1507 | 1508 | vitefu@0.2.5: 1509 | resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} 1510 | peerDependencies: 1511 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 1512 | peerDependenciesMeta: 1513 | vite: 1514 | optional: true 1515 | 1516 | webpack-sources@3.2.3: 1517 | resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} 1518 | engines: {node: '>=10.13.0'} 1519 | 1520 | webpack-virtual-modules@0.6.1: 1521 | resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} 1522 | 1523 | which@2.0.2: 1524 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1525 | engines: {node: '>= 8'} 1526 | hasBin: true 1527 | 1528 | wrap-ansi@7.0.0: 1529 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1530 | engines: {node: '>=10'} 1531 | 1532 | wrap-ansi@8.1.0: 1533 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1534 | engines: {node: '>=12'} 1535 | 1536 | wrappy@1.0.2: 1537 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1538 | 1539 | yaml@2.4.1: 1540 | resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} 1541 | engines: {node: '>= 14'} 1542 | hasBin: true 1543 | 1544 | yocto-queue@0.1.0: 1545 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1546 | engines: {node: '>=10'} 1547 | 1548 | snapshots: 1549 | 1550 | '@alloc/quick-lru@5.2.0': {} 1551 | 1552 | '@ampproject/remapping@2.3.0': 1553 | dependencies: 1554 | '@jridgewell/gen-mapping': 0.3.5 1555 | '@jridgewell/trace-mapping': 0.3.25 1556 | 1557 | '@antfu/install-pkg@0.1.1': 1558 | dependencies: 1559 | execa: 5.1.1 1560 | find-up: 5.0.0 1561 | 1562 | '@antfu/install-pkg@0.3.2': 1563 | dependencies: 1564 | execa: 8.0.1 1565 | 1566 | '@antfu/utils@0.7.7': {} 1567 | 1568 | '@babel/runtime@7.24.4': 1569 | dependencies: 1570 | regenerator-runtime: 0.14.1 1571 | 1572 | '@esbuild/aix-ppc64@0.20.2': 1573 | optional: true 1574 | 1575 | '@esbuild/android-arm64@0.20.2': 1576 | optional: true 1577 | 1578 | '@esbuild/android-arm@0.20.2': 1579 | optional: true 1580 | 1581 | '@esbuild/android-x64@0.20.2': 1582 | optional: true 1583 | 1584 | '@esbuild/darwin-arm64@0.20.2': 1585 | optional: true 1586 | 1587 | '@esbuild/darwin-x64@0.20.2': 1588 | optional: true 1589 | 1590 | '@esbuild/freebsd-arm64@0.20.2': 1591 | optional: true 1592 | 1593 | '@esbuild/freebsd-x64@0.20.2': 1594 | optional: true 1595 | 1596 | '@esbuild/linux-arm64@0.20.2': 1597 | optional: true 1598 | 1599 | '@esbuild/linux-arm@0.20.2': 1600 | optional: true 1601 | 1602 | '@esbuild/linux-ia32@0.20.2': 1603 | optional: true 1604 | 1605 | '@esbuild/linux-loong64@0.20.2': 1606 | optional: true 1607 | 1608 | '@esbuild/linux-mips64el@0.20.2': 1609 | optional: true 1610 | 1611 | '@esbuild/linux-ppc64@0.20.2': 1612 | optional: true 1613 | 1614 | '@esbuild/linux-riscv64@0.20.2': 1615 | optional: true 1616 | 1617 | '@esbuild/linux-s390x@0.20.2': 1618 | optional: true 1619 | 1620 | '@esbuild/linux-x64@0.20.2': 1621 | optional: true 1622 | 1623 | '@esbuild/netbsd-x64@0.20.2': 1624 | optional: true 1625 | 1626 | '@esbuild/openbsd-x64@0.20.2': 1627 | optional: true 1628 | 1629 | '@esbuild/sunos-x64@0.20.2': 1630 | optional: true 1631 | 1632 | '@esbuild/win32-arm64@0.20.2': 1633 | optional: true 1634 | 1635 | '@esbuild/win32-ia32@0.20.2': 1636 | optional: true 1637 | 1638 | '@esbuild/win32-x64@0.20.2': 1639 | optional: true 1640 | 1641 | '@floating-ui/core@1.6.0': 1642 | dependencies: 1643 | '@floating-ui/utils': 0.2.1 1644 | 1645 | '@floating-ui/dom@1.6.3': 1646 | dependencies: 1647 | '@floating-ui/core': 1.6.0 1648 | '@floating-ui/utils': 0.2.1 1649 | 1650 | '@floating-ui/utils@0.2.1': {} 1651 | 1652 | '@iconify/json@2.2.199': 1653 | dependencies: 1654 | '@iconify/types': 2.0.0 1655 | pathe: 1.1.2 1656 | 1657 | '@iconify/types@2.0.0': {} 1658 | 1659 | '@iconify/utils@2.1.22': 1660 | dependencies: 1661 | '@antfu/install-pkg': 0.1.1 1662 | '@antfu/utils': 0.7.7 1663 | '@iconify/types': 2.0.0 1664 | debug: 4.3.4 1665 | kolorist: 1.8.0 1666 | local-pkg: 0.5.0 1667 | mlly: 1.6.1 1668 | transitivePeerDependencies: 1669 | - supports-color 1670 | 1671 | '@internationalized/date@3.5.2': 1672 | dependencies: 1673 | '@swc/helpers': 0.5.8 1674 | 1675 | '@isaacs/cliui@8.0.2': 1676 | dependencies: 1677 | string-width: 5.1.2 1678 | string-width-cjs: string-width@4.2.3 1679 | strip-ansi: 7.1.0 1680 | strip-ansi-cjs: strip-ansi@6.0.1 1681 | wrap-ansi: 8.1.0 1682 | wrap-ansi-cjs: wrap-ansi@7.0.0 1683 | 1684 | '@jridgewell/gen-mapping@0.3.5': 1685 | dependencies: 1686 | '@jridgewell/set-array': 1.2.1 1687 | '@jridgewell/sourcemap-codec': 1.4.15 1688 | '@jridgewell/trace-mapping': 0.3.25 1689 | 1690 | '@jridgewell/resolve-uri@3.1.2': {} 1691 | 1692 | '@jridgewell/set-array@1.2.1': {} 1693 | 1694 | '@jridgewell/sourcemap-codec@1.4.15': {} 1695 | 1696 | '@jridgewell/trace-mapping@0.3.25': 1697 | dependencies: 1698 | '@jridgewell/resolve-uri': 3.1.2 1699 | '@jridgewell/sourcemap-codec': 1.4.15 1700 | 1701 | '@melt-ui/svelte@0.61.2(svelte@4.2.12)': 1702 | dependencies: 1703 | '@floating-ui/core': 1.6.0 1704 | '@floating-ui/dom': 1.6.3 1705 | '@internationalized/date': 3.5.2 1706 | dequal: 2.0.3 1707 | focus-trap: 7.5.4 1708 | nanoid: 4.0.2 1709 | svelte: 4.2.12 1710 | 1711 | '@melt-ui/svelte@0.76.2(svelte@4.2.12)': 1712 | dependencies: 1713 | '@floating-ui/core': 1.6.0 1714 | '@floating-ui/dom': 1.6.3 1715 | '@internationalized/date': 3.5.2 1716 | dequal: 2.0.3 1717 | focus-trap: 7.5.4 1718 | nanoid: 5.0.7 1719 | svelte: 4.2.12 1720 | 1721 | '@nodelib/fs.scandir@2.1.5': 1722 | dependencies: 1723 | '@nodelib/fs.stat': 2.0.5 1724 | run-parallel: 1.2.0 1725 | 1726 | '@nodelib/fs.stat@2.0.5': {} 1727 | 1728 | '@nodelib/fs.walk@1.2.8': 1729 | dependencies: 1730 | '@nodelib/fs.scandir': 2.1.5 1731 | fastq: 1.17.1 1732 | 1733 | '@pkgjs/parseargs@0.11.0': 1734 | optional: true 1735 | 1736 | '@polka/url@1.0.0-next.25': {} 1737 | 1738 | '@rollup/rollup-android-arm-eabi@4.14.1': 1739 | optional: true 1740 | 1741 | '@rollup/rollup-android-arm64@4.14.1': 1742 | optional: true 1743 | 1744 | '@rollup/rollup-darwin-arm64@4.14.1': 1745 | optional: true 1746 | 1747 | '@rollup/rollup-darwin-x64@4.14.1': 1748 | optional: true 1749 | 1750 | '@rollup/rollup-linux-arm-gnueabihf@4.14.1': 1751 | optional: true 1752 | 1753 | '@rollup/rollup-linux-arm64-gnu@4.14.1': 1754 | optional: true 1755 | 1756 | '@rollup/rollup-linux-arm64-musl@4.14.1': 1757 | optional: true 1758 | 1759 | '@rollup/rollup-linux-powerpc64le-gnu@4.14.1': 1760 | optional: true 1761 | 1762 | '@rollup/rollup-linux-riscv64-gnu@4.14.1': 1763 | optional: true 1764 | 1765 | '@rollup/rollup-linux-s390x-gnu@4.14.1': 1766 | optional: true 1767 | 1768 | '@rollup/rollup-linux-x64-gnu@4.14.1': 1769 | optional: true 1770 | 1771 | '@rollup/rollup-linux-x64-musl@4.14.1': 1772 | optional: true 1773 | 1774 | '@rollup/rollup-win32-arm64-msvc@4.14.1': 1775 | optional: true 1776 | 1777 | '@rollup/rollup-win32-ia32-msvc@4.14.1': 1778 | optional: true 1779 | 1780 | '@rollup/rollup-win32-x64-msvc@4.14.1': 1781 | optional: true 1782 | 1783 | '@sveltejs/adapter-static@3.0.1(@sveltejs/kit@2.5.5(@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8))(svelte@4.2.12)(vite@5.2.8))': 1784 | dependencies: 1785 | '@sveltejs/kit': 2.5.5(@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8))(svelte@4.2.12)(vite@5.2.8) 1786 | 1787 | '@sveltejs/kit@2.5.5(@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8))(svelte@4.2.12)(vite@5.2.8)': 1788 | dependencies: 1789 | '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.8) 1790 | '@types/cookie': 0.6.0 1791 | cookie: 0.6.0 1792 | devalue: 4.3.2 1793 | esm-env: 1.0.0 1794 | import-meta-resolve: 4.0.0 1795 | kleur: 4.1.5 1796 | magic-string: 0.30.9 1797 | mrmime: 2.0.0 1798 | sade: 1.8.1 1799 | set-cookie-parser: 2.6.0 1800 | sirv: 2.0.4 1801 | svelte: 4.2.12 1802 | tiny-glob: 0.2.9 1803 | vite: 5.2.8 1804 | 1805 | '@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8))(svelte@4.2.12)(vite@5.2.8)': 1806 | dependencies: 1807 | '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.8) 1808 | debug: 4.3.4 1809 | svelte: 4.2.12 1810 | vite: 5.2.8 1811 | transitivePeerDependencies: 1812 | - supports-color 1813 | 1814 | '@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8)': 1815 | dependencies: 1816 | '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8))(svelte@4.2.12)(vite@5.2.8) 1817 | debug: 4.3.4 1818 | deepmerge: 4.3.1 1819 | kleur: 4.1.5 1820 | magic-string: 0.30.9 1821 | svelte: 4.2.12 1822 | svelte-hmr: 0.15.3(svelte@4.2.12) 1823 | vite: 5.2.8 1824 | vitefu: 0.2.5(vite@5.2.8) 1825 | transitivePeerDependencies: 1826 | - supports-color 1827 | 1828 | '@swc/helpers@0.5.8': 1829 | dependencies: 1830 | tslib: 2.6.2 1831 | 1832 | '@tailwindcss/typography@0.5.15(tailwindcss@3.4.13)': 1833 | dependencies: 1834 | lodash.castarray: 4.4.0 1835 | lodash.isplainobject: 4.0.6 1836 | lodash.merge: 4.6.2 1837 | postcss-selector-parser: 6.0.10 1838 | tailwindcss: 3.4.13 1839 | 1840 | '@tauri-apps/api@1.5.3': {} 1841 | 1842 | '@tauri-apps/api@1.6.0': {} 1843 | 1844 | '@tauri-apps/cli-darwin-arm64@1.6.2': 1845 | optional: true 1846 | 1847 | '@tauri-apps/cli-darwin-x64@1.6.2': 1848 | optional: true 1849 | 1850 | '@tauri-apps/cli-linux-arm-gnueabihf@1.6.2': 1851 | optional: true 1852 | 1853 | '@tauri-apps/cli-linux-arm64-gnu@1.6.2': 1854 | optional: true 1855 | 1856 | '@tauri-apps/cli-linux-arm64-musl@1.6.2': 1857 | optional: true 1858 | 1859 | '@tauri-apps/cli-linux-x64-gnu@1.6.2': 1860 | optional: true 1861 | 1862 | '@tauri-apps/cli-linux-x64-musl@1.6.2': 1863 | optional: true 1864 | 1865 | '@tauri-apps/cli-win32-arm64-msvc@1.6.2': 1866 | optional: true 1867 | 1868 | '@tauri-apps/cli-win32-ia32-msvc@1.6.2': 1869 | optional: true 1870 | 1871 | '@tauri-apps/cli-win32-x64-msvc@1.6.2': 1872 | optional: true 1873 | 1874 | '@tauri-apps/cli@1.6.2': 1875 | optionalDependencies: 1876 | '@tauri-apps/cli-darwin-arm64': 1.6.2 1877 | '@tauri-apps/cli-darwin-x64': 1.6.2 1878 | '@tauri-apps/cli-linux-arm-gnueabihf': 1.6.2 1879 | '@tauri-apps/cli-linux-arm64-gnu': 1.6.2 1880 | '@tauri-apps/cli-linux-arm64-musl': 1.6.2 1881 | '@tauri-apps/cli-linux-x64-gnu': 1.6.2 1882 | '@tauri-apps/cli-linux-x64-musl': 1.6.2 1883 | '@tauri-apps/cli-win32-arm64-msvc': 1.6.2 1884 | '@tauri-apps/cli-win32-ia32-msvc': 1.6.2 1885 | '@tauri-apps/cli-win32-x64-msvc': 1.6.2 1886 | 1887 | '@types/cookie@0.6.0': {} 1888 | 1889 | '@types/estree@1.0.5': {} 1890 | 1891 | '@types/pug@2.0.10': {} 1892 | 1893 | acorn@8.11.3: {} 1894 | 1895 | ansi-regex@5.0.1: {} 1896 | 1897 | ansi-regex@6.0.1: {} 1898 | 1899 | ansi-styles@4.3.0: 1900 | dependencies: 1901 | color-convert: 2.0.1 1902 | 1903 | ansi-styles@6.2.1: {} 1904 | 1905 | any-promise@1.3.0: {} 1906 | 1907 | anymatch@3.1.3: 1908 | dependencies: 1909 | normalize-path: 3.0.0 1910 | picomatch: 2.3.1 1911 | 1912 | arg@5.0.2: {} 1913 | 1914 | aria-query@5.3.0: 1915 | dependencies: 1916 | dequal: 2.0.3 1917 | 1918 | autoprefixer@10.4.20(postcss@8.4.38): 1919 | dependencies: 1920 | browserslist: 4.24.0 1921 | caniuse-lite: 1.0.30001664 1922 | fraction.js: 4.3.7 1923 | normalize-range: 0.1.2 1924 | picocolors: 1.1.0 1925 | postcss: 8.4.38 1926 | postcss-value-parser: 4.2.0 1927 | 1928 | axobject-query@4.0.0: 1929 | dependencies: 1930 | dequal: 2.0.3 1931 | 1932 | balanced-match@1.0.2: {} 1933 | 1934 | binary-extensions@2.3.0: {} 1935 | 1936 | bits-ui@0.21.2(svelte@4.2.12): 1937 | dependencies: 1938 | '@internationalized/date': 3.5.2 1939 | '@melt-ui/svelte': 0.76.2(svelte@4.2.12) 1940 | nanoid: 5.0.7 1941 | svelte: 4.2.12 1942 | 1943 | bits-ui@0.9.9(svelte@4.2.12): 1944 | dependencies: 1945 | '@melt-ui/svelte': 0.61.2(svelte@4.2.12) 1946 | nanoid: 5.0.7 1947 | svelte: 4.2.12 1948 | 1949 | brace-expansion@1.1.11: 1950 | dependencies: 1951 | balanced-match: 1.0.2 1952 | concat-map: 0.0.1 1953 | 1954 | brace-expansion@2.0.1: 1955 | dependencies: 1956 | balanced-match: 1.0.2 1957 | 1958 | braces@3.0.2: 1959 | dependencies: 1960 | fill-range: 7.0.1 1961 | 1962 | browserslist@4.24.0: 1963 | dependencies: 1964 | caniuse-lite: 1.0.30001664 1965 | electron-to-chromium: 1.5.29 1966 | node-releases: 2.0.18 1967 | update-browserslist-db: 1.1.1(browserslist@4.24.0) 1968 | 1969 | buffer-crc32@0.2.13: {} 1970 | 1971 | callsites@3.1.0: {} 1972 | 1973 | camelcase-css@2.0.1: {} 1974 | 1975 | caniuse-lite@1.0.30001664: {} 1976 | 1977 | chokidar@3.6.0: 1978 | dependencies: 1979 | anymatch: 3.1.3 1980 | braces: 3.0.2 1981 | glob-parent: 5.1.2 1982 | is-binary-path: 2.1.0 1983 | is-glob: 4.0.3 1984 | normalize-path: 3.0.0 1985 | readdirp: 3.6.0 1986 | optionalDependencies: 1987 | fsevents: 2.3.3 1988 | 1989 | clsx@2.1.0: {} 1990 | 1991 | cmdk-sv@0.0.17(svelte@4.2.12): 1992 | dependencies: 1993 | bits-ui: 0.9.9(svelte@4.2.12) 1994 | nanoid: 5.0.7 1995 | svelte: 4.2.12 1996 | 1997 | code-red@1.0.4: 1998 | dependencies: 1999 | '@jridgewell/sourcemap-codec': 1.4.15 2000 | '@types/estree': 1.0.5 2001 | acorn: 8.11.3 2002 | estree-walker: 3.0.3 2003 | periscopic: 3.1.0 2004 | 2005 | color-convert@2.0.1: 2006 | dependencies: 2007 | color-name: 1.1.4 2008 | 2009 | color-name@1.1.4: {} 2010 | 2011 | commander@4.1.1: {} 2012 | 2013 | concat-map@0.0.1: {} 2014 | 2015 | cookie@0.6.0: {} 2016 | 2017 | cross-spawn@7.0.3: 2018 | dependencies: 2019 | path-key: 3.1.1 2020 | shebang-command: 2.0.0 2021 | which: 2.0.2 2022 | 2023 | css-tree@2.3.1: 2024 | dependencies: 2025 | mdn-data: 2.0.30 2026 | source-map-js: 1.2.0 2027 | 2028 | cssesc@3.0.0: {} 2029 | 2030 | debug@4.3.4: 2031 | dependencies: 2032 | ms: 2.1.2 2033 | 2034 | deepmerge@4.3.1: {} 2035 | 2036 | dequal@2.0.3: {} 2037 | 2038 | detect-indent@6.1.0: {} 2039 | 2040 | devalue@4.3.2: {} 2041 | 2042 | didyoumean@1.2.2: {} 2043 | 2044 | dlv@1.1.3: {} 2045 | 2046 | eastasianwidth@0.2.0: {} 2047 | 2048 | electron-to-chromium@1.5.29: {} 2049 | 2050 | emoji-regex@8.0.0: {} 2051 | 2052 | emoji-regex@9.2.2: {} 2053 | 2054 | es6-promise@3.3.1: {} 2055 | 2056 | esbuild@0.20.2: 2057 | optionalDependencies: 2058 | '@esbuild/aix-ppc64': 0.20.2 2059 | '@esbuild/android-arm': 0.20.2 2060 | '@esbuild/android-arm64': 0.20.2 2061 | '@esbuild/android-x64': 0.20.2 2062 | '@esbuild/darwin-arm64': 0.20.2 2063 | '@esbuild/darwin-x64': 0.20.2 2064 | '@esbuild/freebsd-arm64': 0.20.2 2065 | '@esbuild/freebsd-x64': 0.20.2 2066 | '@esbuild/linux-arm': 0.20.2 2067 | '@esbuild/linux-arm64': 0.20.2 2068 | '@esbuild/linux-ia32': 0.20.2 2069 | '@esbuild/linux-loong64': 0.20.2 2070 | '@esbuild/linux-mips64el': 0.20.2 2071 | '@esbuild/linux-ppc64': 0.20.2 2072 | '@esbuild/linux-riscv64': 0.20.2 2073 | '@esbuild/linux-s390x': 0.20.2 2074 | '@esbuild/linux-x64': 0.20.2 2075 | '@esbuild/netbsd-x64': 0.20.2 2076 | '@esbuild/openbsd-x64': 0.20.2 2077 | '@esbuild/sunos-x64': 0.20.2 2078 | '@esbuild/win32-arm64': 0.20.2 2079 | '@esbuild/win32-ia32': 0.20.2 2080 | '@esbuild/win32-x64': 0.20.2 2081 | 2082 | escalade@3.2.0: {} 2083 | 2084 | esm-env@1.0.0: {} 2085 | 2086 | estree-walker@3.0.3: 2087 | dependencies: 2088 | '@types/estree': 1.0.5 2089 | 2090 | execa@5.1.1: 2091 | dependencies: 2092 | cross-spawn: 7.0.3 2093 | get-stream: 6.0.1 2094 | human-signals: 2.1.0 2095 | is-stream: 2.0.1 2096 | merge-stream: 2.0.0 2097 | npm-run-path: 4.0.1 2098 | onetime: 5.1.2 2099 | signal-exit: 3.0.7 2100 | strip-final-newline: 2.0.0 2101 | 2102 | execa@8.0.1: 2103 | dependencies: 2104 | cross-spawn: 7.0.3 2105 | get-stream: 8.0.1 2106 | human-signals: 5.0.0 2107 | is-stream: 3.0.0 2108 | merge-stream: 2.0.0 2109 | npm-run-path: 5.3.0 2110 | onetime: 6.0.0 2111 | signal-exit: 4.1.0 2112 | strip-final-newline: 3.0.0 2113 | 2114 | fast-glob@3.3.2: 2115 | dependencies: 2116 | '@nodelib/fs.stat': 2.0.5 2117 | '@nodelib/fs.walk': 1.2.8 2118 | glob-parent: 5.1.2 2119 | merge2: 1.4.1 2120 | micromatch: 4.0.5 2121 | 2122 | fastq@1.17.1: 2123 | dependencies: 2124 | reusify: 1.0.4 2125 | 2126 | fill-range@7.0.1: 2127 | dependencies: 2128 | to-regex-range: 5.0.1 2129 | 2130 | find-up@5.0.0: 2131 | dependencies: 2132 | locate-path: 6.0.0 2133 | path-exists: 4.0.0 2134 | 2135 | focus-trap@7.5.4: 2136 | dependencies: 2137 | tabbable: 6.2.0 2138 | 2139 | foreground-child@3.1.1: 2140 | dependencies: 2141 | cross-spawn: 7.0.3 2142 | signal-exit: 4.1.0 2143 | 2144 | fraction.js@4.3.7: {} 2145 | 2146 | fs.realpath@1.0.0: {} 2147 | 2148 | fsevents@2.3.3: 2149 | optional: true 2150 | 2151 | function-bind@1.1.2: {} 2152 | 2153 | get-stream@6.0.1: {} 2154 | 2155 | get-stream@8.0.1: {} 2156 | 2157 | glob-parent@5.1.2: 2158 | dependencies: 2159 | is-glob: 4.0.3 2160 | 2161 | glob-parent@6.0.2: 2162 | dependencies: 2163 | is-glob: 4.0.3 2164 | 2165 | glob@10.3.12: 2166 | dependencies: 2167 | foreground-child: 3.1.1 2168 | jackspeak: 2.3.6 2169 | minimatch: 9.0.4 2170 | minipass: 7.0.4 2171 | path-scurry: 1.10.2 2172 | 2173 | glob@7.2.3: 2174 | dependencies: 2175 | fs.realpath: 1.0.0 2176 | inflight: 1.0.6 2177 | inherits: 2.0.4 2178 | minimatch: 3.1.2 2179 | once: 1.4.0 2180 | path-is-absolute: 1.0.1 2181 | 2182 | globalyzer@0.1.0: {} 2183 | 2184 | globrex@0.1.2: {} 2185 | 2186 | graceful-fs@4.2.11: {} 2187 | 2188 | hasown@2.0.2: 2189 | dependencies: 2190 | function-bind: 1.1.2 2191 | 2192 | human-signals@2.1.0: {} 2193 | 2194 | human-signals@5.0.0: {} 2195 | 2196 | import-fresh@3.3.0: 2197 | dependencies: 2198 | parent-module: 1.0.1 2199 | resolve-from: 4.0.0 2200 | 2201 | import-meta-resolve@4.0.0: {} 2202 | 2203 | inflight@1.0.6: 2204 | dependencies: 2205 | once: 1.4.0 2206 | wrappy: 1.0.2 2207 | 2208 | inherits@2.0.4: {} 2209 | 2210 | is-binary-path@2.1.0: 2211 | dependencies: 2212 | binary-extensions: 2.3.0 2213 | 2214 | is-core-module@2.13.1: 2215 | dependencies: 2216 | hasown: 2.0.2 2217 | 2218 | is-extglob@2.1.1: {} 2219 | 2220 | is-fullwidth-code-point@3.0.0: {} 2221 | 2222 | is-glob@4.0.3: 2223 | dependencies: 2224 | is-extglob: 2.1.1 2225 | 2226 | is-number@7.0.0: {} 2227 | 2228 | is-reference@3.0.2: 2229 | dependencies: 2230 | '@types/estree': 1.0.5 2231 | 2232 | is-stream@2.0.1: {} 2233 | 2234 | is-stream@3.0.0: {} 2235 | 2236 | isexe@2.0.0: {} 2237 | 2238 | jackspeak@2.3.6: 2239 | dependencies: 2240 | '@isaacs/cliui': 8.0.2 2241 | optionalDependencies: 2242 | '@pkgjs/parseargs': 0.11.0 2243 | 2244 | jiti@1.21.0: {} 2245 | 2246 | jiti@2.0.0: 2247 | optional: true 2248 | 2249 | jsonc-parser@3.2.1: {} 2250 | 2251 | kleur@4.1.5: {} 2252 | 2253 | kolorist@1.8.0: {} 2254 | 2255 | lilconfig@2.1.0: {} 2256 | 2257 | lilconfig@3.1.1: {} 2258 | 2259 | lines-and-columns@1.2.4: {} 2260 | 2261 | local-pkg@0.5.0: 2262 | dependencies: 2263 | mlly: 1.6.1 2264 | pkg-types: 1.0.3 2265 | 2266 | locate-character@3.0.0: {} 2267 | 2268 | locate-path@6.0.0: 2269 | dependencies: 2270 | p-locate: 5.0.0 2271 | 2272 | lodash.castarray@4.4.0: {} 2273 | 2274 | lodash.isplainobject@4.0.6: {} 2275 | 2276 | lodash.merge@4.6.2: {} 2277 | 2278 | lru-cache@10.2.0: {} 2279 | 2280 | lucide-svelte@0.446.0(svelte@4.2.12): 2281 | dependencies: 2282 | svelte: 4.2.12 2283 | 2284 | magic-string@0.30.9: 2285 | dependencies: 2286 | '@jridgewell/sourcemap-codec': 1.4.15 2287 | 2288 | mdn-data@2.0.30: {} 2289 | 2290 | merge-stream@2.0.0: {} 2291 | 2292 | merge2@1.4.1: {} 2293 | 2294 | micromatch@4.0.5: 2295 | dependencies: 2296 | braces: 3.0.2 2297 | picomatch: 2.3.1 2298 | 2299 | mimic-fn@2.1.0: {} 2300 | 2301 | mimic-fn@4.0.0: {} 2302 | 2303 | min-indent@1.0.1: {} 2304 | 2305 | minimatch@3.1.2: 2306 | dependencies: 2307 | brace-expansion: 1.1.11 2308 | 2309 | minimatch@9.0.4: 2310 | dependencies: 2311 | brace-expansion: 2.0.1 2312 | 2313 | minimist@1.2.8: {} 2314 | 2315 | minipass@7.0.4: {} 2316 | 2317 | mkdirp@0.5.6: 2318 | dependencies: 2319 | minimist: 1.2.8 2320 | 2321 | mlly@1.6.1: 2322 | dependencies: 2323 | acorn: 8.11.3 2324 | pathe: 1.1.2 2325 | pkg-types: 1.0.3 2326 | ufo: 1.5.3 2327 | 2328 | mri@1.2.0: {} 2329 | 2330 | mrmime@2.0.0: {} 2331 | 2332 | ms@2.1.2: {} 2333 | 2334 | mz@2.7.0: 2335 | dependencies: 2336 | any-promise: 1.3.0 2337 | object-assign: 4.1.1 2338 | thenify-all: 1.6.0 2339 | 2340 | nanoid@3.3.7: {} 2341 | 2342 | nanoid@4.0.2: {} 2343 | 2344 | nanoid@5.0.7: {} 2345 | 2346 | node-releases@2.0.18: {} 2347 | 2348 | normalize-path@3.0.0: {} 2349 | 2350 | normalize-range@0.1.2: {} 2351 | 2352 | npm-run-path@4.0.1: 2353 | dependencies: 2354 | path-key: 3.1.1 2355 | 2356 | npm-run-path@5.3.0: 2357 | dependencies: 2358 | path-key: 4.0.0 2359 | 2360 | object-assign@4.1.1: {} 2361 | 2362 | object-hash@3.0.0: {} 2363 | 2364 | once@1.4.0: 2365 | dependencies: 2366 | wrappy: 1.0.2 2367 | 2368 | onetime@5.1.2: 2369 | dependencies: 2370 | mimic-fn: 2.1.0 2371 | 2372 | onetime@6.0.0: 2373 | dependencies: 2374 | mimic-fn: 4.0.0 2375 | 2376 | p-limit@3.1.0: 2377 | dependencies: 2378 | yocto-queue: 0.1.0 2379 | 2380 | p-locate@5.0.0: 2381 | dependencies: 2382 | p-limit: 3.1.0 2383 | 2384 | parent-module@1.0.1: 2385 | dependencies: 2386 | callsites: 3.1.0 2387 | 2388 | path-exists@4.0.0: {} 2389 | 2390 | path-is-absolute@1.0.1: {} 2391 | 2392 | path-key@3.1.1: {} 2393 | 2394 | path-key@4.0.0: {} 2395 | 2396 | path-parse@1.0.7: {} 2397 | 2398 | path-scurry@1.10.2: 2399 | dependencies: 2400 | lru-cache: 10.2.0 2401 | minipass: 7.0.4 2402 | 2403 | pathe@1.1.2: {} 2404 | 2405 | periscopic@3.1.0: 2406 | dependencies: 2407 | '@types/estree': 1.0.5 2408 | estree-walker: 3.0.3 2409 | is-reference: 3.0.2 2410 | 2411 | picocolors@1.0.0: {} 2412 | 2413 | picocolors@1.1.0: {} 2414 | 2415 | picomatch@2.3.1: {} 2416 | 2417 | pify@2.3.0: {} 2418 | 2419 | pirates@4.0.6: {} 2420 | 2421 | pkg-types@1.0.3: 2422 | dependencies: 2423 | jsonc-parser: 3.2.1 2424 | mlly: 1.6.1 2425 | pathe: 1.1.2 2426 | 2427 | postcss-import@15.1.0(postcss@8.4.38): 2428 | dependencies: 2429 | postcss: 8.4.38 2430 | postcss-value-parser: 4.2.0 2431 | read-cache: 1.0.0 2432 | resolve: 1.22.8 2433 | 2434 | postcss-js@4.0.1(postcss@8.4.38): 2435 | dependencies: 2436 | camelcase-css: 2.0.1 2437 | postcss: 8.4.38 2438 | 2439 | postcss-load-config@4.0.2(postcss@8.4.38): 2440 | dependencies: 2441 | lilconfig: 3.1.1 2442 | yaml: 2.4.1 2443 | optionalDependencies: 2444 | postcss: 8.4.38 2445 | 2446 | postcss-load-config@5.0.3(jiti@2.0.0)(postcss@8.4.38): 2447 | dependencies: 2448 | lilconfig: 3.1.1 2449 | yaml: 2.4.1 2450 | optionalDependencies: 2451 | jiti: 2.0.0 2452 | postcss: 8.4.38 2453 | 2454 | postcss-nested@6.0.1(postcss@8.4.38): 2455 | dependencies: 2456 | postcss: 8.4.38 2457 | postcss-selector-parser: 6.0.16 2458 | 2459 | postcss-selector-parser@6.0.10: 2460 | dependencies: 2461 | cssesc: 3.0.0 2462 | util-deprecate: 1.0.2 2463 | 2464 | postcss-selector-parser@6.0.16: 2465 | dependencies: 2466 | cssesc: 3.0.0 2467 | util-deprecate: 1.0.2 2468 | 2469 | postcss-value-parser@4.2.0: {} 2470 | 2471 | postcss@8.4.38: 2472 | dependencies: 2473 | nanoid: 3.3.7 2474 | picocolors: 1.0.0 2475 | source-map-js: 1.2.0 2476 | 2477 | prettier-plugin-svelte@3.2.2(prettier@3.2.5)(svelte@4.2.12): 2478 | dependencies: 2479 | prettier: 3.2.5 2480 | svelte: 4.2.12 2481 | 2482 | prettier-plugin-tailwindcss@0.6.8(prettier-plugin-svelte@3.2.2(prettier@3.2.5)(svelte@4.2.12))(prettier@3.2.5): 2483 | dependencies: 2484 | prettier: 3.2.5 2485 | optionalDependencies: 2486 | prettier-plugin-svelte: 3.2.2(prettier@3.2.5)(svelte@4.2.12) 2487 | 2488 | prettier@3.2.5: {} 2489 | 2490 | queue-microtask@1.2.3: {} 2491 | 2492 | read-cache@1.0.0: 2493 | dependencies: 2494 | pify: 2.3.0 2495 | 2496 | readdirp@3.6.0: 2497 | dependencies: 2498 | picomatch: 2.3.1 2499 | 2500 | regenerator-runtime@0.14.1: {} 2501 | 2502 | resolve-from@4.0.0: {} 2503 | 2504 | resolve@1.22.8: 2505 | dependencies: 2506 | is-core-module: 2.13.1 2507 | path-parse: 1.0.7 2508 | supports-preserve-symlinks-flag: 1.0.0 2509 | 2510 | reusify@1.0.4: {} 2511 | 2512 | rimraf@2.7.1: 2513 | dependencies: 2514 | glob: 7.2.3 2515 | 2516 | rollup@4.14.1: 2517 | dependencies: 2518 | '@types/estree': 1.0.5 2519 | optionalDependencies: 2520 | '@rollup/rollup-android-arm-eabi': 4.14.1 2521 | '@rollup/rollup-android-arm64': 4.14.1 2522 | '@rollup/rollup-darwin-arm64': 4.14.1 2523 | '@rollup/rollup-darwin-x64': 4.14.1 2524 | '@rollup/rollup-linux-arm-gnueabihf': 4.14.1 2525 | '@rollup/rollup-linux-arm64-gnu': 4.14.1 2526 | '@rollup/rollup-linux-arm64-musl': 4.14.1 2527 | '@rollup/rollup-linux-powerpc64le-gnu': 4.14.1 2528 | '@rollup/rollup-linux-riscv64-gnu': 4.14.1 2529 | '@rollup/rollup-linux-s390x-gnu': 4.14.1 2530 | '@rollup/rollup-linux-x64-gnu': 4.14.1 2531 | '@rollup/rollup-linux-x64-musl': 4.14.1 2532 | '@rollup/rollup-win32-arm64-msvc': 4.14.1 2533 | '@rollup/rollup-win32-ia32-msvc': 4.14.1 2534 | '@rollup/rollup-win32-x64-msvc': 4.14.1 2535 | fsevents: 2.3.3 2536 | 2537 | run-parallel@1.2.0: 2538 | dependencies: 2539 | queue-microtask: 1.2.3 2540 | 2541 | sade@1.8.1: 2542 | dependencies: 2543 | mri: 1.2.0 2544 | 2545 | sander@0.5.1: 2546 | dependencies: 2547 | es6-promise: 3.3.1 2548 | graceful-fs: 4.2.11 2549 | mkdirp: 0.5.6 2550 | rimraf: 2.7.1 2551 | 2552 | set-cookie-parser@2.6.0: {} 2553 | 2554 | shebang-command@2.0.0: 2555 | dependencies: 2556 | shebang-regex: 3.0.0 2557 | 2558 | shebang-regex@3.0.0: {} 2559 | 2560 | signal-exit@3.0.7: {} 2561 | 2562 | signal-exit@4.1.0: {} 2563 | 2564 | sirv@2.0.4: 2565 | dependencies: 2566 | '@polka/url': 1.0.0-next.25 2567 | mrmime: 2.0.0 2568 | totalist: 3.0.1 2569 | 2570 | sorcery@0.11.0: 2571 | dependencies: 2572 | '@jridgewell/sourcemap-codec': 1.4.15 2573 | buffer-crc32: 0.2.13 2574 | minimist: 1.2.8 2575 | sander: 0.5.1 2576 | 2577 | source-map-js@1.2.0: {} 2578 | 2579 | string-width@4.2.3: 2580 | dependencies: 2581 | emoji-regex: 8.0.0 2582 | is-fullwidth-code-point: 3.0.0 2583 | strip-ansi: 6.0.1 2584 | 2585 | string-width@5.1.2: 2586 | dependencies: 2587 | eastasianwidth: 0.2.0 2588 | emoji-regex: 9.2.2 2589 | strip-ansi: 7.1.0 2590 | 2591 | strip-ansi@6.0.1: 2592 | dependencies: 2593 | ansi-regex: 5.0.1 2594 | 2595 | strip-ansi@7.1.0: 2596 | dependencies: 2597 | ansi-regex: 6.0.1 2598 | 2599 | strip-final-newline@2.0.0: {} 2600 | 2601 | strip-final-newline@3.0.0: {} 2602 | 2603 | strip-indent@3.0.0: 2604 | dependencies: 2605 | min-indent: 1.0.1 2606 | 2607 | sucrase@3.35.0: 2608 | dependencies: 2609 | '@jridgewell/gen-mapping': 0.3.5 2610 | commander: 4.1.1 2611 | glob: 10.3.12 2612 | lines-and-columns: 1.2.4 2613 | mz: 2.7.0 2614 | pirates: 4.0.6 2615 | ts-interface-checker: 0.1.13 2616 | 2617 | supports-preserve-symlinks-flag@1.0.0: {} 2618 | 2619 | svelte-check@3.6.9(postcss-load-config@5.0.3(jiti@2.0.0)(postcss@8.4.38))(postcss@8.4.38)(svelte@4.2.12): 2620 | dependencies: 2621 | '@jridgewell/trace-mapping': 0.3.25 2622 | chokidar: 3.6.0 2623 | fast-glob: 3.3.2 2624 | import-fresh: 3.3.0 2625 | picocolors: 1.0.0 2626 | sade: 1.8.1 2627 | svelte: 4.2.12 2628 | svelte-preprocess: 5.1.3(postcss-load-config@5.0.3(jiti@2.0.0)(postcss@8.4.38))(postcss@8.4.38)(svelte@4.2.12)(typescript@5.4.4) 2629 | typescript: 5.4.4 2630 | transitivePeerDependencies: 2631 | - '@babel/core' 2632 | - coffeescript 2633 | - less 2634 | - postcss 2635 | - postcss-load-config 2636 | - pug 2637 | - sass 2638 | - stylus 2639 | - sugarss 2640 | 2641 | svelte-hmr@0.15.3(svelte@4.2.12): 2642 | dependencies: 2643 | svelte: 4.2.12 2644 | 2645 | svelte-preprocess@5.1.3(postcss-load-config@5.0.3(jiti@2.0.0)(postcss@8.4.38))(postcss@8.4.38)(svelte@4.2.12)(typescript@5.4.4): 2646 | dependencies: 2647 | '@types/pug': 2.0.10 2648 | detect-indent: 6.1.0 2649 | magic-string: 0.30.9 2650 | sorcery: 0.11.0 2651 | strip-indent: 3.0.0 2652 | svelte: 4.2.12 2653 | optionalDependencies: 2654 | postcss: 8.4.38 2655 | postcss-load-config: 5.0.3(jiti@2.0.0)(postcss@8.4.38) 2656 | typescript: 5.4.4 2657 | 2658 | svelte-sonner@0.3.22(svelte@4.2.12): 2659 | dependencies: 2660 | svelte: 4.2.12 2661 | 2662 | svelte@4.2.12: 2663 | dependencies: 2664 | '@ampproject/remapping': 2.3.0 2665 | '@jridgewell/sourcemap-codec': 1.4.15 2666 | '@jridgewell/trace-mapping': 0.3.25 2667 | '@types/estree': 1.0.5 2668 | acorn: 8.11.3 2669 | aria-query: 5.3.0 2670 | axobject-query: 4.0.0 2671 | code-red: 1.0.4 2672 | css-tree: 2.3.1 2673 | estree-walker: 3.0.3 2674 | is-reference: 3.0.2 2675 | locate-character: 3.0.0 2676 | magic-string: 0.30.9 2677 | periscopic: 3.1.0 2678 | 2679 | tabbable@6.2.0: {} 2680 | 2681 | tailwind-merge@2.2.2: 2682 | dependencies: 2683 | '@babel/runtime': 7.24.4 2684 | 2685 | tailwind-variants@0.2.1(tailwindcss@3.4.13): 2686 | dependencies: 2687 | tailwind-merge: 2.2.2 2688 | tailwindcss: 3.4.13 2689 | 2690 | tailwindcss@3.4.13: 2691 | dependencies: 2692 | '@alloc/quick-lru': 5.2.0 2693 | arg: 5.0.2 2694 | chokidar: 3.6.0 2695 | didyoumean: 1.2.2 2696 | dlv: 1.1.3 2697 | fast-glob: 3.3.2 2698 | glob-parent: 6.0.2 2699 | is-glob: 4.0.3 2700 | jiti: 1.21.0 2701 | lilconfig: 2.1.0 2702 | micromatch: 4.0.5 2703 | normalize-path: 3.0.0 2704 | object-hash: 3.0.0 2705 | picocolors: 1.0.0 2706 | postcss: 8.4.38 2707 | postcss-import: 15.1.0(postcss@8.4.38) 2708 | postcss-js: 4.0.1(postcss@8.4.38) 2709 | postcss-load-config: 4.0.2(postcss@8.4.38) 2710 | postcss-nested: 6.0.1(postcss@8.4.38) 2711 | postcss-selector-parser: 6.0.16 2712 | resolve: 1.22.8 2713 | sucrase: 3.35.0 2714 | transitivePeerDependencies: 2715 | - ts-node 2716 | 2717 | tauri-plugin-upload-api@https://codeload.github.com/tauri-apps/tauri-plugin-upload/tar.gz/56d958697109d854bca19050403b017c9a28b434: 2718 | dependencies: 2719 | '@tauri-apps/api': 1.5.3 2720 | 2721 | thenify-all@1.6.0: 2722 | dependencies: 2723 | thenify: 3.3.1 2724 | 2725 | thenify@3.3.1: 2726 | dependencies: 2727 | any-promise: 1.3.0 2728 | 2729 | tiny-glob@0.2.9: 2730 | dependencies: 2731 | globalyzer: 0.1.0 2732 | globrex: 0.1.2 2733 | 2734 | to-regex-range@5.0.1: 2735 | dependencies: 2736 | is-number: 7.0.0 2737 | 2738 | totalist@3.0.1: {} 2739 | 2740 | ts-interface-checker@0.1.13: {} 2741 | 2742 | tslib@2.6.2: {} 2743 | 2744 | typescript@5.4.4: {} 2745 | 2746 | ufo@1.5.3: {} 2747 | 2748 | unplugin-icons@0.18.5: 2749 | dependencies: 2750 | '@antfu/install-pkg': 0.3.2 2751 | '@antfu/utils': 0.7.7 2752 | '@iconify/utils': 2.1.22 2753 | debug: 4.3.4 2754 | kolorist: 1.8.0 2755 | local-pkg: 0.5.0 2756 | unplugin: 1.10.1 2757 | transitivePeerDependencies: 2758 | - supports-color 2759 | 2760 | unplugin@1.10.1: 2761 | dependencies: 2762 | acorn: 8.11.3 2763 | chokidar: 3.6.0 2764 | webpack-sources: 3.2.3 2765 | webpack-virtual-modules: 0.6.1 2766 | 2767 | update-browserslist-db@1.1.1(browserslist@4.24.0): 2768 | dependencies: 2769 | browserslist: 4.24.0 2770 | escalade: 3.2.0 2771 | picocolors: 1.1.0 2772 | 2773 | util-deprecate@1.0.2: {} 2774 | 2775 | vite@5.2.8: 2776 | dependencies: 2777 | esbuild: 0.20.2 2778 | postcss: 8.4.38 2779 | rollup: 4.14.1 2780 | optionalDependencies: 2781 | fsevents: 2.3.3 2782 | 2783 | vitefu@0.2.5(vite@5.2.8): 2784 | optionalDependencies: 2785 | vite: 5.2.8 2786 | 2787 | webpack-sources@3.2.3: {} 2788 | 2789 | webpack-virtual-modules@0.6.1: {} 2790 | 2791 | which@2.0.2: 2792 | dependencies: 2793 | isexe: 2.0.0 2794 | 2795 | wrap-ansi@7.0.0: 2796 | dependencies: 2797 | ansi-styles: 4.3.0 2798 | string-width: 4.2.3 2799 | strip-ansi: 6.0.1 2800 | 2801 | wrap-ansi@8.1.0: 2802 | dependencies: 2803 | ansi-styles: 6.2.1 2804 | string-width: 5.1.2 2805 | strip-ansi: 7.1.0 2806 | 2807 | wrappy@1.0.2: {} 2808 | 2809 | yaml@2.4.1: {} 2810 | 2811 | yocto-queue@0.1.0: {} 2812 | --------------------------------------------------------------------------------