From edafa021ee25b2c957b1d972bdc6ee37b705799a Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Thu, 19 Sep 2024 23:50:16 +0200 Subject: [PATCH] added first backend draft --- .../{npm-build.yml => bun-build.yml} | 8 +- .gitignore | 1 + README.md | 6 + backend/database/db.ts | 3 + backend/database/getDb.ts | 8 + backend/database/getTestDb.ts | 25 + .../drizzle/0000_nostalgic_next_avengers.sql | 14 + backend/drizzle/meta/0000_snapshot.json | 106 + backend/drizzle/meta/_journal.json | 13 + backend/index.ts | 98 + backend/migrate.ts | 8 + backend/schema.ts | 22 + backend/services/score.test.ts | 40 + backend/services/score.ts | 11 + backend/services/user.test.ts | 48 + backend/services/user.ts | 53 + backend/test-setup.ts | 6 + bun.lockb | Bin 0 -> 101782 bytes bunfig.toml | 2 + index.html | 3 +- index.ts | 1 + package-lock.json | 4261 ----------------- package.json | 28 +- sqlite.db | Bin 0 -> 28672 bytes src/App.tsx | 52 +- src/Button.tsx | 104 +- src/GameState.ts | 19 +- src/index.css | 51 + src/main.tsx | 5 + src/ws.ts | 51 + tsconfig.app.tsbuildinfo | 1 - tsconfig.node.json | 28 +- tsconfig.node.tsbuildinfo | 2 +- 33 files changed, 727 insertions(+), 4351 deletions(-) rename .github/workflows/{npm-build.yml => bun-build.yml} (75%) create mode 100644 backend/database/db.ts create mode 100644 backend/database/getDb.ts create mode 100644 backend/database/getTestDb.ts create mode 100644 backend/drizzle/0000_nostalgic_next_avengers.sql create mode 100644 backend/drizzle/meta/0000_snapshot.json create mode 100644 backend/drizzle/meta/_journal.json create mode 100644 backend/index.ts create mode 100644 backend/migrate.ts create mode 100644 backend/schema.ts create mode 100644 backend/services/score.test.ts create mode 100644 backend/services/score.ts create mode 100644 backend/services/user.test.ts create mode 100644 backend/services/user.ts create mode 100644 backend/test-setup.ts create mode 100755 bun.lockb create mode 100644 bunfig.toml create mode 100644 index.ts delete mode 100644 package-lock.json create mode 100644 sqlite.db create mode 100644 src/ws.ts delete mode 100644 tsconfig.app.tsbuildinfo diff --git a/.github/workflows/npm-build.yml b/.github/workflows/bun-build.yml similarity index 75% rename from .github/workflows/npm-build.yml rename to .github/workflows/bun-build.yml index 9fb4fdb..6ba3c64 100644 --- a/.github/workflows/npm-build.yml +++ b/.github/workflows/bun-build.yml @@ -11,8 +11,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + - uses: oven-sh/setup-bun@v2 with: node-version: 22 - - run: npm ci - - run: npm run build + - run: bun install + - run: bun run build + - run: bun test + - run: bun lint diff --git a/.gitignore b/.gitignore index a547bf3..93d40db 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* +tsconfig.app.tsbuildinfo node_modules dist diff --git a/README.md b/README.md index 57ce192..22fc07b 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,9 @@ A simple version of minesweeper built with react in about 1h. ![image](https://github.com/user-attachments/assets/25012972-ebe8-4610-bd28-c181ce8c4e2d) + +## Ideas + +- Add global big board +- Questinmark after flag +- Earn points for wins diff --git a/backend/database/db.ts b/backend/database/db.ts new file mode 100644 index 0000000..254a390 --- /dev/null +++ b/backend/database/db.ts @@ -0,0 +1,3 @@ +import { getDb } from "./getDb"; + +export const db = getDb(); diff --git a/backend/database/getDb.ts b/backend/database/getDb.ts new file mode 100644 index 0000000..f86fcf1 --- /dev/null +++ b/backend/database/getDb.ts @@ -0,0 +1,8 @@ +import { drizzle } from "drizzle-orm/bun-sqlite"; +import { Database } from "bun:sqlite"; + +export const getDb = (filename: string = "sqlite.db") => { + const sqlite = new Database(filename); + const db = drizzle(sqlite); + return db; +}; diff --git a/backend/database/getTestDb.ts b/backend/database/getTestDb.ts new file mode 100644 index 0000000..ee6725b --- /dev/null +++ b/backend/database/getTestDb.ts @@ -0,0 +1,25 @@ +import { migrate } from "drizzle-orm/bun-sqlite/migrator"; +import crypto from "crypto"; +import { getDb } from "./getDb"; +import fs from "fs"; + +const dbs: string[] = []; + +export const getTestDb = () => { + const randomId = crypto.randomUUID(); + dbs.push(randomId); + fs.existsSync("temp_dbs") || fs.mkdirSync("temp_dbs"); + const db = getDb(`temp_dbs/${randomId}.db`); + migrate(db, { migrationsFolder: "./backend/drizzle" }); + return db; +}; + +export const clearTestDbs = () => { + dbs.forEach((db) => { + const dbPath = `temp_dbs/${db}.db`; + if (fs.existsSync(dbPath)) { + fs.rmSync(dbPath); + } + }); + dbs.length = 0; +}; diff --git a/backend/drizzle/0000_nostalgic_next_avengers.sql b/backend/drizzle/0000_nostalgic_next_avengers.sql new file mode 100644 index 0000000..4db83b8 --- /dev/null +++ b/backend/drizzle/0000_nostalgic_next_avengers.sql @@ -0,0 +1,14 @@ +CREATE TABLE `games` ( + `uuid` text PRIMARY KEY NOT NULL, + `user` text NOT NULL, + `gameState` text NOT NULL, + `stage` integer NOT NULL, + `finished` integer DEFAULT 0 NOT NULL, + `timestamp` integer NOT NULL, + FOREIGN KEY (`user`) REFERENCES `users`(`name`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `users` ( + `name` text PRIMARY KEY NOT NULL, + `password` text NOT NULL +); diff --git a/backend/drizzle/meta/0000_snapshot.json b/backend/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..9bfef61 --- /dev/null +++ b/backend/drizzle/meta/0000_snapshot.json @@ -0,0 +1,106 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "af6e3102-34d0-4247-84ae-14f2d3d8fa4c", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "games": { + "name": "games", + "columns": { + "uuid": { + "name": "uuid", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user": { + "name": "user", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "gameState": { + "name": "gameState", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "stage": { + "name": "stage", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "finished": { + "name": "finished", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "timestamp": { + "name": "timestamp", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "games_user_users_name_fk": { + "name": "games_user_users_name_fk", + "tableFrom": "games", + "tableTo": "users", + "columnsFrom": [ + "user" + ], + "columnsTo": [ + "name" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "name": { + "name": "name", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/backend/drizzle/meta/_journal.json b/backend/drizzle/meta/_journal.json new file mode 100644 index 0000000..0976922 --- /dev/null +++ b/backend/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "6", + "when": 1726774158116, + "tag": "0000_nostalgic_next_avengers", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/backend/index.ts b/backend/index.ts new file mode 100644 index 0000000..30394e7 --- /dev/null +++ b/backend/index.ts @@ -0,0 +1,98 @@ +import type { ServerWebSocket } from "bun"; + +interface Scoreboard { + stage: number; + user: string; +} + +const loadScoreboard = async (): Promise => { + try { + const scoreboardFile = Bun.file("./scoreboard.json"); + const scoreboard = await scoreboardFile.json(); + return scoreboard; + } catch (e) { + return []; + } +}; + +const allowCors = { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS", + "Access-Control-Allow-Headers": "Content-Type", +}; + +const lastMessage = new WeakMap, number>(); +const server = Bun.serve({ + async fetch(request: Request) { + if (request.method === "OPTIONS") { + const res = new Response("Departed", { headers: allowCors }); + return res; + } + if (request.url.endsWith("ws")) { + if (server.upgrade(request)) return new Response("ok"); + } + if (new URL(request.url).pathname === "/submit") { + const body = await request.text(); + const data = JSON.parse(body) as { stage: number; user: string }; + const scoreboardFile = Bun.file("./scoreboard.json"); + const scoreboard = await loadScoreboard(); + const currentScore = scoreboard.find((s) => s.user === data.user); + if (currentScore) { + if (currentScore.stage < data.stage) { + currentScore.stage = data.stage; + Bun.write(scoreboardFile, JSON.stringify(scoreboard)); + } + return new Response(JSON.stringify(currentScore), { + headers: { + "content-type": "application/json", + ...allowCors, + }, + }); + } + scoreboard.push(data); + Bun.write(scoreboardFile, JSON.stringify(scoreboard)); + return new Response(JSON.stringify(data), { + headers: { + "content-type": "application/json", + ...allowCors, + }, + }); + } + const scoreboard = await loadScoreboard(); + const sorted = scoreboard.sort((a, b) => b.stage - a.stage); + return new Response(JSON.stringify(sorted), { + headers: { + "content-type": "application/json", + ...allowCors, + }, + }); + }, + websocket: { + message: (ws, message) => { + if (typeof message !== "string") { + return; + } + const msg = JSON.parse(message); + const now = Date.now(); + if (lastMessage.has(ws) && now - lastMessage.get(ws)! < 200) { + return; + } + lastMessage.set(ws, now); + if (msg.type === "loss") { + server.publish( + "minesweeper", + JSON.stringify({ type: "loss", user: msg.user, stage: msg.stage }), + ); + } else if (msg.type === "new") { + server.publish( + "minesweeper", + JSON.stringify({ type: "new", user: msg.user }), + ); + } + }, + open: async (ws) => { + ws.subscribe("minesweeper"); + }, + }, + port: 8076, +}); diff --git a/backend/migrate.ts b/backend/migrate.ts new file mode 100644 index 0000000..43e64df --- /dev/null +++ b/backend/migrate.ts @@ -0,0 +1,8 @@ +import { migrate } from "drizzle-orm/bun-sqlite/migrator"; + +import { drizzle } from "drizzle-orm/bun-sqlite"; +import { Database } from "bun:sqlite"; + +const sqlite = new Database("sqlite.db"); +const db = drizzle(sqlite); +migrate(db, { migrationsFolder: "./backend/drizzle" }); diff --git a/backend/schema.ts b/backend/schema.ts new file mode 100644 index 0000000..7d5ad71 --- /dev/null +++ b/backend/schema.ts @@ -0,0 +1,22 @@ +import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core"; + +export const User = sqliteTable("users", { + name: text("name").primaryKey().notNull(), + password: text("password").notNull(), +}); + +export const Game = sqliteTable("games", { + uuid: text("uuid").primaryKey().notNull(), + user: text("user") + .notNull() + .references(() => User.name), + gameState: text("gameState").notNull(), + stage: integer("stage").notNull(), + finished: integer("finished").notNull().default(0), + timestamp: integer("timestamp").notNull(), +}); + +export type UserType = Omit & { + password?: undefined; +}; +export type GameType = typeof Game.$inferSelect; diff --git a/backend/services/score.test.ts b/backend/services/score.test.ts new file mode 100644 index 0000000..72fc1ed --- /dev/null +++ b/backend/services/score.test.ts @@ -0,0 +1,40 @@ +import { describe, it, expect } from "bun:test"; +import { getScoreBoard } from "./score.ts"; +import { getTestDb } from "../database/getTestDb.ts"; +import { Game, User } from "../schema.ts"; + +describe("Score", () => { + it("should return the score board", async () => { + const db = getTestDb(); + await db.insert(User).values({ + name: "TestUser", + password: "test", + }); + await db.insert(Game).values({ + user: "TestUser", + uuid: crypto.randomUUID(), + stage: 1, + gameState: "ANY", + finished: 1, + timestamp: Date.now(), + }); + await db.insert(Game).values({ + user: "TestUser", + uuid: crypto.randomUUID(), + stage: 10, + gameState: "ANY", + finished: 1, + timestamp: Date.now(), + }); + await db.insert(Game).values({ + user: "TestUser", + uuid: crypto.randomUUID(), + stage: 20, + gameState: "ANY", + finished: 0, + timestamp: Date.now(), + }); + const result = await getScoreBoard(db); + expect(result).toEqual([{ stage: 10, user: "TestUser" }]); + }); +}); diff --git a/backend/services/score.ts b/backend/services/score.ts new file mode 100644 index 0000000..ea54bb3 --- /dev/null +++ b/backend/services/score.ts @@ -0,0 +1,11 @@ +import { eq, sql } from "drizzle-orm"; +import { Game } from "../schema"; +import type { BunSQLiteDatabase } from "drizzle-orm/bun-sqlite"; + +export const getScoreBoard = async (db: BunSQLiteDatabase) => { + return await db + .select({ stage: sql`max(${Game.stage})`, user: Game.user }) + .from(Game) + .where(eq(Game.finished, 1)) + .groupBy(Game.user); +}; diff --git a/backend/services/user.test.ts b/backend/services/user.test.ts new file mode 100644 index 0000000..de98f4c --- /dev/null +++ b/backend/services/user.test.ts @@ -0,0 +1,48 @@ +import { describe, it, expect } from "bun:test"; +import { getTestDb } from "../database/getTestDb"; +import { getUser, loginUser, registerUser } from "./user"; + +describe("User", () => { + it("should register a user", async () => { + const db = getTestDb(); + await registerUser(db, "TestUser", "test"); + const user = await getUser(db, "TestUser"); + expect(user).toEqual({ + name: "TestUser", + password: undefined, + }); + }); + + it("should throw an error if user already exists register", async () => { + const db = getTestDb(); + await registerUser(db, "TestUser", "test"); + expect(registerUser(db, "TestUser", "test")).rejects.toThrow( + "User already exists", + ); + }); + + it("should throw an error if user already exists register case insensitive", async () => { + const db = getTestDb(); + await registerUser(db, "TestUser", "test"); + expect(registerUser(db, "TESTUSER", "test")).rejects.toThrow( + "User already exists", + ); + }); + + it("should throw an error if user does not exist on login", async () => { + const db = getTestDb(); + expect(loginUser(db, "TestUser", "test")).rejects.toThrow( + "User does not exist", + ); + }); + + it("should login a user", async () => { + const db = getTestDb(); + await registerUser(db, "TestUser", "test"); + const user = await loginUser(db, "TestUser", "test"); + expect(user).toEqual({ + name: "TestUser", + password: undefined, + }); + }); +}); diff --git a/backend/services/user.ts b/backend/services/user.ts new file mode 100644 index 0000000..dd157b4 --- /dev/null +++ b/backend/services/user.ts @@ -0,0 +1,53 @@ +import type { BunSQLiteDatabase } from "drizzle-orm/bun-sqlite"; +import { User, type UserType } from "../schema"; +import { eq, sql } from "drizzle-orm"; + +export const registerUser = async ( + db: BunSQLiteDatabase, + name: string, + password: string, +) => { + const user = await db + .select() + .from(User) + .where(eq(sql`lower(${User.name})`, name.toLowerCase())); + if (user.length > 0) { + throw new Error("User already exists"); + } + const hash = await Bun.password.hash(password + Bun.env.SALT ?? ""); + await db.insert(User).values({ name, password: hash }); +}; + +export const loginUser = async ( + db: BunSQLiteDatabase, + name: string, + password: string, +) => { + const user = await db + .select() + .from(User) + .where(eq(sql`lower(${User.name})`, name.toLowerCase())); + if (user.length === 0) { + throw new Error("User does not exist"); + } + if ( + !(await Bun.password.verify( + password + Bun.env.SALT ?? "", + user[0].password, + )) + ) { + throw new Error("Incorrect password"); + } + return { ...user[0], password: undefined }; +}; + +export const getUser = async ( + db: BunSQLiteDatabase, + name: string, +): Promise => { + const user = await db + .select() + .from(User) + .where(eq(sql`lower(${User.name})`, name.toLowerCase())); + return { ...user[0], password: undefined }; +}; diff --git a/backend/test-setup.ts b/backend/test-setup.ts new file mode 100644 index 0000000..e34d528 --- /dev/null +++ b/backend/test-setup.ts @@ -0,0 +1,6 @@ +import { afterAll } from "bun:test"; +import { clearTestDbs } from "./database/getTestDb"; + +afterAll(() => { + clearTestDbs(); +}); diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..b7020966bd9d52edbbeeb17bd7d7abbc1040a90c GIT binary patch literal 101782 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 I2mbSa0Qmq!7ytkO literal 0 HcmV?d00001 diff --git a/bunfig.toml b/bunfig.toml new file mode 100644 index 0000000..84db95e --- /dev/null +++ b/bunfig.toml @@ -0,0 +1,2 @@ +[test] +preload = ["./backend/test-setup.ts"] diff --git a/index.html b/index.html index 9a10663..944032c 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,8 @@ - + + Minesweeper diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..f67b2c6 --- /dev/null +++ b/index.ts @@ -0,0 +1 @@ +console.log("Hello via Bun!"); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index f51810d..0000000 --- a/package-lock.json +++ /dev/null @@ -1,4261 +0,0 @@ -{ - "name": "minesweeper", - "version": "0.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "minesweeper", - "version": "0.0.0", - "dependencies": { - "lucide-react": "^0.441.0", - "react": "^18.3.1", - "react-confetti-boom": "^1.0.0", - "react-dom": "^18.3.1", - "use-sound": "^4.0.3", - "zustand": "^4.5.5" - }, - "devDependencies": { - "@eslint/js": "^9.9.0", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react-swc": "^3.5.0", - "eslint": "^9.9.0", - "eslint-plugin-react-hooks": "^5.1.0-rc.0", - "eslint-plugin-react-refresh": "^0.4.9", - "globals": "^15.9.0", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.1", - "vite": "^5.4.1" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", - "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", - "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", - "dev": true, - "dependencies": { - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz", - "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz", - "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz", - "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz", - "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz", - "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz", - "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz", - "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz", - "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz", - "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz", - "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz", - "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz", - "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz", - "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz", - "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz", - "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz", - "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@swc/core": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.26.tgz", - "integrity": "sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.26", - "@swc/core-darwin-x64": "1.7.26", - "@swc/core-linux-arm-gnueabihf": "1.7.26", - "@swc/core-linux-arm64-gnu": "1.7.26", - "@swc/core-linux-arm64-musl": "1.7.26", - "@swc/core-linux-x64-gnu": "1.7.26", - "@swc/core-linux-x64-musl": "1.7.26", - "@swc/core-win32-arm64-msvc": "1.7.26", - "@swc/core-win32-ia32-msvc": "1.7.26", - "@swc/core-win32-x64-msvc": "1.7.26" - }, - "peerDependencies": { - "@swc/helpers": "*" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz", - "integrity": "sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz", - "integrity": "sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz", - "integrity": "sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz", - "integrity": "sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz", - "integrity": "sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz", - "integrity": "sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz", - "integrity": "sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz", - "integrity": "sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz", - "integrity": "sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz", - "integrity": "sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true - }, - "node_modules/@swc/types": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", - "dev": true, - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "devOptional": true - }, - "node_modules/@types/react": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz", - "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==", - "devOptional": true, - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz", - "integrity": "sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/type-utils": "8.5.0", - "@typescript-eslint/utils": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.5.0.tgz", - "integrity": "sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz", - "integrity": "sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/utils": "8.5.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", - "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", - "dev": true, - "dependencies": { - "@swc/core": "^1.5.7" - }, - "peerDependencies": { - "vite": "^4 || ^5" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", - "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.10.0", - "@eslint/plugin-kit": "^0.1.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.1.0-rc-fb9a90fa48-20240614", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz", - "integrity": "sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz", - "integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/howler": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.4.tgz", - "integrity": "sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lucide-react": { - "version": "0.441.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.441.0.tgz", - "integrity": "sha512-0vfExYtvSDhkC2lqg0zYVW1Uu9GsI4knuV9GP9by5z0Xhc4Zi5RejTxfz9LsjRmCyWVzHCJvxGKZWcRyvQCWVg==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-confetti-boom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-confetti-boom/-/react-confetti-boom-1.0.0.tgz", - "integrity": "sha512-JPCs1tx36xduFdMORaRLLvFJABAQUgjEqKvqZiBZr8bUkHsCzbHeesnfQwZU1LExmGiYVFGIJS/tiR4OUTktww==", - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz", - "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.3", - "@rollup/rollup-android-arm64": "4.21.3", - "@rollup/rollup-darwin-arm64": "4.21.3", - "@rollup/rollup-darwin-x64": "4.21.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", - "@rollup/rollup-linux-arm-musleabihf": "4.21.3", - "@rollup/rollup-linux-arm64-gnu": "4.21.3", - "@rollup/rollup-linux-arm64-musl": "4.21.3", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", - "@rollup/rollup-linux-riscv64-gnu": "4.21.3", - "@rollup/rollup-linux-s390x-gnu": "4.21.3", - "@rollup/rollup-linux-x64-gnu": "4.21.3", - "@rollup/rollup-linux-x64-musl": "4.21.3", - "@rollup/rollup-win32-arm64-msvc": "4.21.3", - "@rollup/rollup-win32-ia32-msvc": "4.21.3", - "@rollup/rollup-win32-x64-msvc": "4.21.3", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.5.0.tgz", - "integrity": "sha512-uD+XxEoSIvqtm4KE97etm32Tn5MfaZWgWfMMREStLxR6JzvHkc2Tkj7zhTEK5XmtpTmKHNnG8Sot6qDfhHtR1Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.5.0", - "@typescript-eslint/parser": "8.5.0", - "@typescript-eslint/utils": "8.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-sound": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/use-sound/-/use-sound-4.0.3.tgz", - "integrity": "sha512-L205pEUFIrLsGYsCUKHQVCt0ajs//YQOFbEQeNwaWaqQj3y3st4SuR+rvpMHLmv8hgTcfUFlvMQawZNI3OE18w==", - "dependencies": { - "howler": "^2.1.3" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/vite": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.5.tgz", - "integrity": "sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zustand": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz", - "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==", - "dependencies": { - "use-sync-external-store": "1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - } - }, - "dependencies": { - "@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - } - } - }, - "@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true - }, - "@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", - "dev": true, - "requires": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - } - }, - "@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true - } - } - }, - "@eslint/js": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", - "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", - "dev": true - }, - "@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true - }, - "@eslint/plugin-kit": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", - "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", - "dev": true, - "requires": { - "levn": "^0.4.1" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@rollup/rollup-android-arm-eabi": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz", - "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-android-arm64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz", - "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-arm64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz", - "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-darwin-x64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz", - "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz", - "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz", - "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz", - "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-arm64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz", - "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz", - "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz", - "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz", - "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz", - "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==", - "dev": true, - "optional": true - }, - "@rollup/rollup-linux-x64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz", - "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz", - "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz", - "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==", - "dev": true, - "optional": true - }, - "@rollup/rollup-win32-x64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz", - "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==", - "dev": true, - "optional": true - }, - "@swc/core": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.26.tgz", - "integrity": "sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==", - "dev": true, - "requires": { - "@swc/core-darwin-arm64": "1.7.26", - "@swc/core-darwin-x64": "1.7.26", - "@swc/core-linux-arm-gnueabihf": "1.7.26", - "@swc/core-linux-arm64-gnu": "1.7.26", - "@swc/core-linux-arm64-musl": "1.7.26", - "@swc/core-linux-x64-gnu": "1.7.26", - "@swc/core-linux-x64-musl": "1.7.26", - "@swc/core-win32-arm64-msvc": "1.7.26", - "@swc/core-win32-ia32-msvc": "1.7.26", - "@swc/core-win32-x64-msvc": "1.7.26", - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.12" - } - }, - "@swc/core-darwin-arm64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.26.tgz", - "integrity": "sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==", - "dev": true, - "optional": true - }, - "@swc/core-darwin-x64": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.26.tgz", - "integrity": "sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==", - "dev": true, - "optional": true - }, - "@swc/core-linux-arm-gnueabihf": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.26.tgz", - "integrity": "sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==", - "dev": true, - "optional": true - }, - "@swc/core-linux-arm64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.26.tgz", - "integrity": "sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==", - "dev": true, - "optional": true - }, - "@swc/core-linux-arm64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.26.tgz", - "integrity": "sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==", - "dev": true, - "optional": true - }, - "@swc/core-linux-x64-gnu": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.26.tgz", - "integrity": "sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==", - "dev": true, - "optional": true - }, - "@swc/core-linux-x64-musl": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.26.tgz", - "integrity": "sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==", - "dev": true, - "optional": true - }, - "@swc/core-win32-arm64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.26.tgz", - "integrity": "sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==", - "dev": true, - "optional": true - }, - "@swc/core-win32-ia32-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.26.tgz", - "integrity": "sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==", - "dev": true, - "optional": true - }, - "@swc/core-win32-x64-msvc": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.26.tgz", - "integrity": "sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==", - "dev": true, - "optional": true - }, - "@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true - }, - "@swc/types": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", - "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", - "dev": true, - "requires": { - "@swc/counter": "^0.1.3" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "devOptional": true - }, - "@types/react": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz", - "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==", - "devOptional": true, - "requires": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "@types/react-dom": { - "version": "18.3.0", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", - "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", - "dev": true, - "requires": { - "@types/react": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz", - "integrity": "sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/type-utils": "8.5.0", - "@typescript-eslint/utils": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/parser": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.5.0.tgz", - "integrity": "sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz", - "integrity": "sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/utils": "8.5.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@typescript-eslint/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.5.0", - "eslint-visitor-keys": "^3.4.3" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - } - } - }, - "@vitejs/plugin-react-swc": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz", - "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==", - "dev": true, - "requires": { - "@swc/core": "^1.5.7" - } - }, - "acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "requires": { - "fill-range": "^7.1.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true - }, - "debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "requires": { - "ms": "^2.1.3" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "9.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", - "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.10.0", - "@eslint/plugin-kit": "^0.1.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - } - }, - "eslint-plugin-react-hooks": { - "version": "5.1.0-rc-fb9a90fa48-20240614", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz", - "integrity": "sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w==", - "dev": true, - "requires": {} - }, - "eslint-plugin-react-refresh": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz", - "integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true - }, - "espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "requires": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - } - }, - "esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "requires": { - "flat-cache": "^4.0.0" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - } - }, - "flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "howler": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.4.tgz", - "integrity": "sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==" - }, - "ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lucide-react": { - "version": "0.441.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.441.0.tgz", - "integrity": "sha512-0vfExYtvSDhkC2lqg0zYVW1Uu9GsI4knuV9GP9by5z0Xhc4Zi5RejTxfz9LsjRmCyWVzHCJvxGKZWcRyvQCWVg==", - "requires": {} - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-confetti-boom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-confetti-boom/-/react-confetti-boom-1.0.0.tgz", - "integrity": "sha512-JPCs1tx36xduFdMORaRLLvFJABAQUgjEqKvqZiBZr8bUkHsCzbHeesnfQwZU1LExmGiYVFGIJS/tiR4OUTktww==", - "requires": {} - }, - "react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rollup": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz", - "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.21.3", - "@rollup/rollup-android-arm64": "4.21.3", - "@rollup/rollup-darwin-arm64": "4.21.3", - "@rollup/rollup-darwin-x64": "4.21.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", - "@rollup/rollup-linux-arm-musleabihf": "4.21.3", - "@rollup/rollup-linux-arm64-gnu": "4.21.3", - "@rollup/rollup-linux-arm64-musl": "4.21.3", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", - "@rollup/rollup-linux-riscv64-gnu": "4.21.3", - "@rollup/rollup-linux-s390x-gnu": "4.21.3", - "@rollup/rollup-linux-x64-gnu": "4.21.3", - "@rollup/rollup-linux-x64-musl": "4.21.3", - "@rollup/rollup-win32-arm64-msvc": "4.21.3", - "@rollup/rollup-win32-ia32-msvc": "4.21.3", - "@rollup/rollup-win32-x64-msvc": "4.21.3", - "@types/estree": "1.0.5", - "fsevents": "~2.3.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "requires": {} - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", - "dev": true - }, - "typescript-eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.5.0.tgz", - "integrity": "sha512-uD+XxEoSIvqtm4KE97etm32Tn5MfaZWgWfMMREStLxR6JzvHkc2Tkj7zhTEK5XmtpTmKHNnG8Sot6qDfhHtR1Q==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "8.5.0", - "@typescript-eslint/parser": "8.5.0", - "@typescript-eslint/utils": "8.5.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "use-sound": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/use-sound/-/use-sound-4.0.3.tgz", - "integrity": "sha512-L205pEUFIrLsGYsCUKHQVCt0ajs//YQOFbEQeNwaWaqQj3y3st4SuR+rvpMHLmv8hgTcfUFlvMQawZNI3OE18w==", - "requires": { - "howler": "^2.1.3" - } - }, - "use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", - "requires": {} - }, - "vite": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.5.tgz", - "integrity": "sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==", - "dev": true, - "requires": { - "esbuild": "^0.21.3", - "fsevents": "~2.3.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, - "zustand": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz", - "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==", - "requires": { - "use-sync-external-store": "1.2.2" - } - } - } -} diff --git a/package.json b/package.json index 7205a61..f735650 100644 --- a/package.json +++ b/package.json @@ -7,27 +7,35 @@ "dev": "vite", "build": "tsc -b && vite build", "lint": "eslint .", - "preview": "vite preview" + "preview": "vite preview", + "drizzle:schema": "drizzle-kit generate --dialect sqlite --schema ./backend/schema.ts --out ./backend/drizzle", + "drizzle:migrate": "bun run backend/migrate.ts" }, "dependencies": { + "@uidotdev/usehooks": "^2.4.1", + "drizzle-orm": "^0.33.0", "lucide-react": "^0.441.0", "react": "^18.3.1", "react-confetti-boom": "^1.0.0", "react-dom": "^18.3.1", + "react-hot-toast": "^2.4.1", "use-sound": "^4.0.3", "zustand": "^4.5.5" }, "devDependencies": { - "@eslint/js": "^9.9.0", - "@types/react": "^18.3.3", + "@eslint/js": "^9.10.0", + "@types/bun": "latest", + "@types/react": "^18.3.8", "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react-swc": "^3.5.0", - "eslint": "^9.9.0", + "@vitejs/plugin-react-swc": "^3.7.0", + "drizzle-kit": "^0.24.2", + "eslint": "^9.10.0", "eslint-plugin-react-hooks": "^5.1.0-rc.0", - "eslint-plugin-react-refresh": "^0.4.9", + "eslint-plugin-react-refresh": "^0.4.12", "globals": "^15.9.0", - "typescript": "^5.5.3", - "typescript-eslint": "^8.0.1", - "vite": "^5.4.1" - } + "typescript": "^5.6.2", + "typescript-eslint": "^8.6.0", + "vite": "^5.4.6" + }, + "module": "index.ts" } diff --git a/sqlite.db b/sqlite.db new file mode 100644 index 0000000000000000000000000000000000000000..e548cfad181ba81985d800fbaf1cd86b4224af1b GIT binary patch literal 28672 zcmeI(PjAv-90%~Hl);$8Y8GsEd$M?d#27l(G7cugty`8Mo4^i>hf-)^HT;>h=(5EF z#+x@2Ux6>cgD0=Pgq?f^Cf?j-(PRgor`QM!+sVV0e4kLB@_Qco{GLzCp)D;xEjXS{ z8{J;p^k|0MA%Z|wC?$l1*%D<-P(-%EV?hyul`HBndHC{OT>3>Kv*$z-rBCq>x4+Gv z$Dd#E9W+4z0uX=z1Rwwb2tWV=5cux`t*NLi%fcY*nYEVPckQ0*zeQF{dcLC5O8#*{ zr&T{zrOBCCwPUvJD)sC`kM5KbW7i(#qA0$?iLCUSeFCSbzgOR*57VH(@ZKA ziO7#+fjAw@K6GES*lCwx_PwtE+3*K36u*kTSrPrr-Wq;pO*X3QzlFy$^JBxz`h6!D z^0LhMwl8GG6XqK!d!`pmEXbI*xt`f%ai`-pV6g{H^) zc@9h7GusFMI*yF6zFpEcH;TSu(wDBLXh~n!OL}otF9-O^p?r#N7wPWK8s9mcE;Z|( z)9vusnqJUHV@x}Im9`IOD1J3HNC{C{RfR#{*ES5R=NuiiY@_WodnO;kofHd=?Tdv; zT^9I3!-`|kvR>NE7eFy5?s1X$wulH=WODuz(ly~}VyXVw-_tZuxB0p0v zJBTLbU?`KK{9JyT|DfV*5v0$Ay-*+k0SG_<0uX=z1Rwwb2tWV=5V$@9Tf!6>#HW^W z+1k=#O|jBeBW*5PHFYtgX<1cUPFuE}Q_M^wmsaYQR#)npttx3vHFJvAsMR$!n=zM# z_qV=&yg$R{B}nYv{Q32nATogf1Rwwb2tWV=5P$##AOHafK;Zugh$4yc`~RZ!g-Ac7 z6IP)>00Izz00bZa0SG_<0uX=z1R!vo1Z4Jz$oySlI;8O1{u}IxlWynubuyhxgrW)7 z5EEF#QV_p)oDiaOJk0wCQ89eN@BfR^cOw0kezFP$0uX=z1Rwwb2tWV=5P$##AOL|I zD-aW9emOwX#Az|%Ul<5Q#JLy?4WIu%CDQ4Qog5N}00bZa0SG_<0uX=z1Rwwb2teSX zKwJ>#6T?3M@IMF)pZ`B2(%Hq1_zVFEKmY;|fB*y_009U<00Izzz|9tjiSx1HHGn@f C**uj1 literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx index 8a2ee11..a9711fb 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,16 +4,27 @@ import explosion from "./sound/explosion.mp3"; import useGameStore from "./GameState"; import { useEffect, useState } from "react"; import useSound from "use-sound"; +import { loseGame } from "./ws"; +import toast, { useToasterStore } from "react-hot-toast"; interface Score { user: string; stage: number; } +function useMaxToasts(max: number) { + const { toasts } = useToasterStore(); + + useEffect(() => { + toasts + .filter((t) => t.visible) // Only consider visible toasts + .filter((_, i) => i >= max) // Is toast index over limit? + .forEach((t) => toast.dismiss(t.id)); // Dismiss – Use toast.remove(t.id) for no exit animation + }, [toasts, max]); +} function App() { const game = useGameStore(); const [scores, setScores] = useState([]); - const [showScores, setShowScores] = useState(false); const [playSound] = useSound(explosion, { volume: 0.5, }); @@ -21,6 +32,7 @@ function App() { useEffect(() => { if (game.isGameOver) { playSound(); + loseGame(game.name, game.stage); } }, [game.isGameOver]); @@ -44,31 +56,35 @@ function App() { game.resetGame(4, 4, 2); }, []); + useMaxToasts(5); + return (
-

- Minesweeper Endless{" "} - -

-

- Name:{" "} - game.setName(e.target.value)} - /> -

- - {showScores && ( + {import.meta.env.DEV && ( + + )} +
+

+ Minesweeper Endless{" "} + +

+

+ Name:{" "} + game.setName(e.target.value)} + /> +

+
+
{scores.slice(0, 10).map((score) => (

{score.user} - {score.stage}

))}
- )} +
@@ -88,7 +104,7 @@ function App() {
-
Version: 1.1.3
+
Version: 1.1.6
           Made by MasterGordon -{" "}
           
diff --git a/src/Button.tsx b/src/Button.tsx
index 206d676..9a65254 100644
--- a/src/Button.tsx
+++ b/src/Button.tsx
@@ -1,6 +1,7 @@
-import { ReactNode } from "react";
+import { ReactNode, useRef } from "react";
 import { Bomb, Flag } from "lucide-react";
 import useGameStore from "./GameState";
+import { useLongPress } from "@uidotdev/usehooks";
 
 interface ButtonProps {
   x: number;
@@ -19,75 +20,98 @@ export const colorMap: Record = {
 };
 
 export const Button = ({ x, y }: ButtonProps) => {
-  const game = useGameStore();
+  const {
+    isRevealed,
+    isFlagged,
+    isMine,
+    getValue,
+    reveal,
+    flag,
+    getNeighborFlags,
+    isGameOver,
+    getHasWon,
+  } = useGameStore();
 
   let content: ReactNode = "";
 
-  if (game.isRevealed[x][y]) {
-    content = game.isMine(x, y) ?  : game.getValue(x, y).toString();
+  if (isRevealed[x][y]) {
+    content = isMine(x, y) ?  : getValue(x, y).toString();
   }
 
-  if (game.isFlagged[x][y]) {
+  const attrs = useLongPress(
+    () => {
+      if (isRevealed[x][y]) return;
+      flag(x, y);
+    },
+    {
+      threshold: 400,
+    },
+  );
+
+  if (isFlagged[x][y]) {
     content = ;
   }
   if (content === "0") content = "";
   if (
+    import.meta.env.DEV &&
     window.location.href.includes("xray") &&
-    game.isMine(x, y) &&
-    !game.isFlagged[x][y]
+    isMine(x, y) &&
+    !isFlagged[x][y]
   )
     content = ;
 
+  const touchStart = useRef(0);
+
   return (
     
0 ? "1.75rem" : undefined, - cursor: game.isRevealed[x][y] ? "default" : "pointer", + cursor: isRevealed[x][y] ? "default" : "pointer", + }} + onMouseDown={() => { + touchStart.current = Date.now(); }} onMouseUp={(e) => { - if (game.getHasWon() || game.isGameOver) { + if (Date.now() - touchStart.current > 400 && !isRevealed[x][y]) { + flag(x, y); + return; + } + if (getHasWon() || isGameOver) { return; } if (e.button === 0) { // Left click - if (!game.isRevealed[x][y] && !game.isFlagged[x][y]) { - game.reveal(x, y); + if (isFlagged[x][y]) return; + if (!isRevealed[x][y]) { + reveal(x, y); } else { - const neighborFlagCount = game - .getNeighborFlags(x, y) - .filter((n) => n).length; - const value = game.getValue(x, y); + const neighborFlagCount = getNeighborFlags(x, y).filter( + (n) => n, + ).length; + const value = getValue(x, y); if (neighborFlagCount === value) { - const currentStage = game.stage; - if (!game.isFlagged[x - 1]?.[y] && currentStage == game.stage) - game.reveal(x - 1, y); - if (!game.isFlagged[x - 1]?.[y - 1] && currentStage == game.stage) - game.reveal(x - 1, y - 1); - if (!game.isFlagged[x - 1]?.[y + 1] && currentStage == game.stage) - game.reveal(x - 1, y + 1); - if (!game.isFlagged[x]?.[y - 1] && currentStage == game.stage) - game.reveal(x, y - 1); - if (!game.isFlagged[x]?.[y + 1] && currentStage == game.stage) - game.reveal(x, y + 1); - if (!game.isFlagged[x + 1]?.[y - 1] && currentStage == game.stage) - game.reveal(x + 1, y - 1); - if (!game.isFlagged[x + 1]?.[y] && currentStage == game.stage) - game.reveal(x + 1, y); - if (!game.isFlagged[x + 1]?.[y + 1] && currentStage == game.stage) - game.reveal(x + 1, y + 1); + if (!isFlagged[x - 1]?.[y]) if (reveal(x - 1, y)) return; + if (!isFlagged[x - 1]?.[y - 1]) if (reveal(x - 1, y - 1)) return; + if (!isFlagged[x - 1]?.[y + 1]) if (reveal(x - 1, y + 1)) return; + if (!isFlagged[x]?.[y - 1]) if (reveal(x, y - 1)) return; + if (!isFlagged[x]?.[y + 1]) if (reveal(x, y + 1)) return; + if (!isFlagged[x + 1]?.[y - 1]) if (reveal(x + 1, y - 1)) return; + if (!isFlagged[x + 1]?.[y]) if (reveal(x + 1, y)) return; + if (!isFlagged[x + 1]?.[y + 1]) if (reveal(x + 1, y + 1)) return; } } - } else if (e.button === 2 && !game.isRevealed[x][y]) { - game.flag(x, y); + } else if (e.button === 2 && !isRevealed[x][y]) { + flag(x, y); } e.preventDefault(); }} diff --git a/src/GameState.ts b/src/GameState.ts index 0f01ee4..ad5cca8 100644 --- a/src/GameState.ts +++ b/src/GameState.ts @@ -1,4 +1,5 @@ import { create } from "zustand"; +import { newGame } from "./ws"; interface GameState { mines: boolean[][]; @@ -14,7 +15,7 @@ interface GameState { initializeGame: (width: number, height: number, mines: number) => void; flag: (x: number, y: number) => void; - reveal: (x: number, y: number) => void; + reveal: (x: number, y: number) => boolean; getValue: (x: number, y: number) => number; getHasWon: () => boolean; getMinesLeft: () => number; @@ -27,7 +28,7 @@ interface GameState { getWidth: () => number; getHeight: () => number; isTouched: () => boolean; - triggerPostGame: () => void; + triggerPostGame: () => boolean; expandBoard: () => void; setName: (name: string) => void; } @@ -91,13 +92,14 @@ const useGameStore = create((set, get) => ({ reveal: (x, y) => { const { mines, isRevealed, isGameOver, getValue, triggerPostGame } = get(); - if (isGameOver || !get().isValid(x, y) || isRevealed[x][y]) return; + if (isGameOver || !get().isValid(x, y) || isRevealed[x][y]) return false; const newRevealed = [...isRevealed]; newRevealed[x][y] = true; if (mines[x][y]) { set({ isGameOver: true, isRevealed: newRevealed }); + return true; } else { set({ isRevealed: newRevealed }); const value = getValue(x, y); @@ -121,7 +123,7 @@ const useGameStore = create((set, get) => ({ revealNeighbors(x + 1, y + 1); } } - triggerPostGame(); + return triggerPostGame(); }, getValue: (x, y) => { @@ -176,6 +178,8 @@ const useGameStore = create((set, get) => ({ return x >= 0 && x < width && y >= 0 && y < height; }, resetGame: (width: number, height: number, mines: number) => { + const { name } = get(); + newGame(name); if (mines > width * height) { throw new Error("Too many mines"); } @@ -263,11 +267,16 @@ const useGameStore = create((set, get) => ({ const { getHasWon, expandBoard } = get(); if (getHasWon()) { expandBoard(); + return true; } + return false; }, expandBoard: () => { const { width, height, stage, mines, isFlagged, isRevealed } = get(); - const dir = stage % 2 === 0 ? "down" : "right"; + let dir = stage % 2 === 0 ? "down" : "right"; + if (stage > 11) { + dir = "down"; + } // Expand the board by the current board size 8x8 -> 16x8 if (dir === "down") { const newHeight = Math.floor(height * 1.5); diff --git a/src/index.css b/src/index.css index aaaf0b2..1ad06f6 100644 --- a/src/index.css +++ b/src/index.css @@ -35,6 +35,7 @@ body { margin: auto; max-width: 1400px; padding: 1rem; + font-family: monospace; } .timer { @@ -63,3 +64,53 @@ pre { font-size: 1rem; font-family: monospace; } + +input { + font-size: 14px; + margin: 12px; + padding: 6px 12px 6px 12px; + border-radius: 0.7em; + background: #333; + color: #eee; + border: 1px solid rgb(251, 21, 242); + +} + +button { + color: white; + font-weight: 600; + font-size: 14px; + margin: 12px; + padding: 6px 12px 6px 12px; + border-radius: 0.7em; + background: -webkit-linear-gradient(225deg, rgb(251, 175, 21), rgb(251, 21, 242), + rgb(21, 198, 251)) 0% 0% / 300% 300%; + background-size: 200% auto; +} + +button:hover { + animation: gradient_move 1s ease infinite; +} + +@keyframes gradient_move { + 0%{background-position: 0% 92%} + 50%{background-position: 100% 9%} + 100%{background-position: 0% 92%} +} + +/* .scores { */ +/* position: fixed; */ +/* top: 0; */ +/* left: 0; */ +/* padding: 1rem; */ +/* } */ + +.header { + display: grid; + grid-template-columns: 1fr 1fr; + margin-bottom: 1rem; +} + +.scores { + text-align: right; +} diff --git a/src/main.tsx b/src/main.tsx index c763382..99a4fdc 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,13 +2,18 @@ import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; import App from "./App.tsx"; import "./index.css"; +import { connectWS } from "./ws.ts"; +import { Toaster } from "react-hot-toast"; document.addEventListener("contextmenu", (event) => { event.preventDefault(); }); +connectWS(); + createRoot(document.getElementById("root")!).render( + , ); diff --git a/src/ws.ts b/src/ws.ts new file mode 100644 index 0000000..f1af94f --- /dev/null +++ b/src/ws.ts @@ -0,0 +1,51 @@ +import toast from "react-hot-toast"; + +let ws: WebSocket; + +export const connectWS = () => { + ws = new WebSocket("wss://mb.gordon.business/ws"); + ws.onmessage = (event) => { + const data = JSON.parse(event.data); + const name = localStorage.getItem("name"); + console.log(data); + if (data.user === name) { + return; + } + switch (data.type) { + case "new": + toast(data.user + " started a new game", { + icon: "🚀", + style: { + borderRadius: "10px", + background: "#333", + color: "#fff", + }, + }); + break; + case "loss": + toast("Game over by " + data.user + " stage " + data.stage, { + icon: "😢", + style: { + borderRadius: "10px", + background: "#333", + color: "#fff", + }, + }); + break; + } + }; +}; + +export const newGame = (user: string) => { + if (ws.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify({ type: "new", user })); + } else { + setTimeout(() => { + newGame(user); + }, 100); + } +}; + +export const loseGame = (user: string, stage: number) => { + ws.send(JSON.stringify({ type: "loss", user, stage })); +}; diff --git a/tsconfig.app.tsbuildinfo b/tsconfig.app.tsbuildinfo deleted file mode 100644 index cdfb0ec..0000000 --- a/tsconfig.app.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"root":["./src/App.tsx","./src/Button.tsx","./src/Game.ts","./src/GameState.ts","./src/Options.tsx","./src/Timer.tsx","./src/main.tsx","./src/vite-env.d.ts"],"version":"5.6.2"} \ No newline at end of file diff --git a/tsconfig.node.json b/tsconfig.node.json index 0d3d714..e1c9f11 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -1,22 +1,28 @@ { "compilerOptions": { - "target": "ES2022", - "lib": ["ES2023"], + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", "module": "ESNext", - "skipLibCheck": true, + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, - /* Bundler mode */ + // Bundler mode "moduleResolution": "bundler", "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", + "verbatimModuleSyntax": true, "noEmit": true, - /* Linting */ + // Best practices "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false }, - "include": ["vite.config.ts"] + "include": ["vite.config.ts", "backend/**/*.ts"] } diff --git a/tsconfig.node.tsbuildinfo b/tsconfig.node.tsbuildinfo index 98ef2f9..070fc94 100644 --- a/tsconfig.node.tsbuildinfo +++ b/tsconfig.node.tsbuildinfo @@ -1 +1 @@ -{"root":["./vite.config.ts"],"version":"5.6.2"} \ No newline at end of file +{"root":["./vite.config.ts","./backend/index.ts","./backend/migrate.ts","./backend/schema.ts","./backend/test-setup.ts","./backend/database/db.ts","./backend/database/getDb.ts","./backend/database/getTestDb.ts","./backend/services/score.test.ts","./backend/services/score.ts"],"version":"5.6.2"} \ No newline at end of file