From a5fc776dcd2636f172877b3aec245c32782cff9d Mon Sep 17 00:00:00 2001 From: SoulHarsh007 Date: Mon, 7 Jul 2025 00:29:47 +0530 Subject: [PATCH 01/11] feat(wip)!: UI overhaul and Next.js 15 migration Switched to Next.js 15 and ShadCN UI components for a more modern and polished design. Currently, the dashboard is a work in progress with only the package list page being partially functional (it's missing filters for now) Additionally, the authentication system has been revamped to automatically login to all the servers in the list and provide switcher to change the active server. Signed-off-by: SoulHarsh007 --- .github/workflows/deploy.yml | 35 - CachyOS Builder Dashboard.code-workspace | 5 +- README.md | 8 +- app/actions.ts | 297 ----- app/api/logs/[march]/[pkgbase]/route.ts | 29 - app/dashboard/page.tsx | 12 - app/globals.css | 3 - app/logs/[march]/[pkgbase]/page.tsx | 38 - app/page.tsx | 13 - bun.lock | 1099 +++++++++++++++++ bun.lockb | Bin 270148 -> 0 bytes components.json | 21 + components/AddPackageModal.tsx | 59 - components/AdminShell.tsx | 182 --- components/AuditLogs.tsx | 379 ------ components/BasePackageList.tsx | 67 - components/Checkbox.tsx | 60 - components/ConfirmBulkRebuildModal.tsx | 58 - components/ConfirmRebuildModal.tsx | 54 - components/KPICards.tsx | 59 - components/LoginForm.tsx | 121 -- components/Modal.tsx | 38 - components/PackageTable.tsx | 537 -------- components/RebuildTable.tsx | 333 ----- components/Statistics.tsx | 217 ---- components/SubmitButton.tsx | 21 - eslint.config.mjs | 29 +- lib/db.ts | 232 ---- lib/fetcher.ts | 45 - lib/hooks.ts | 254 ---- lib/servers.ts | 17 - lib/util.ts | 91 -- next.config.mjs => next.config.ts | 18 +- package.json | 83 +- postcss.config.js | 6 - postcss.config.mjs | 5 + public/cachyos-logo-white.svg | 1 + public/cachyos-logo.svg | 1 + public/logo.png | Bin 8036 -> 0 bytes renovate.json | 6 - src/app/actions.ts | 167 +++ {app => src/app}/apple-icon.png | Bin src/app/dashboard/layout.tsx | 33 + src/app/dashboard/package-list/page.tsx | 193 +++ {app => src/app}/favicon.ico | Bin src/app/globals.css | 145 +++ {app => src/app}/icon.png | Bin {app => src/app}/layout.tsx | 37 +- {app => src/app}/manifest.ts | 0 src/app/page.tsx | 11 + {app => src/app}/robots.ts | 0 src/app/validate/page.tsx | 22 + src/components/app-sidebar.tsx | 74 ++ src/components/header-breadcrumbs.tsx | 34 + .../Loader.tsx => src/components/loader.tsx | 28 +- src/components/login-form.tsx | 241 ++++ src/components/nav-main.tsx | 38 + src/components/nav-secondary.tsx | 40 + src/components/nav-user.tsx | 103 ++ src/components/server-switcher.tsx | 150 +++ .../terminal-component.tsx.temp-exclude | 45 +- src/components/theme-provider.tsx | 11 + src/components/ui/avatar.tsx | 53 + src/components/ui/badge.tsx | 46 + src/components/ui/breadcrumb.tsx | 109 ++ src/components/ui/button.tsx | 59 + src/components/ui/card.tsx | 92 ++ src/components/ui/checkbox.tsx | 32 + src/components/ui/collapsible.tsx | 33 + .../ui/data-table-column-header.tsx | 66 + src/components/ui/data-table-pagination.tsx | 119 ++ src/components/ui/data-table-view-options.tsx | 56 + src/components/ui/data-table.tsx | 180 +++ src/components/ui/dropdown-menu.tsx | 257 ++++ src/components/ui/form.tsx | 167 +++ src/components/ui/input.tsx | 21 + src/components/ui/label.tsx | 24 + src/components/ui/select.tsx | 183 +++ src/components/ui/separator.tsx | 28 + src/components/ui/sheet.tsx | 139 +++ src/components/ui/sidebar.tsx | 735 +++++++++++ src/components/ui/skeleton.tsx | 13 + src/components/ui/sonner.tsx | 25 + src/components/ui/table.tsx | 113 ++ src/components/ui/tooltip.tsx | 61 + src/hooks/use-find-shortcut-listener.ts | 18 + src/hooks/use-logout-shortcut-listener.ts | 47 + src/hooks/use-mobile.ts | 21 + src/lib/CachyBuilderClient.ts | 276 +++++ {lib => src/lib}/session.ts | 19 +- src/lib/typings.ts | 184 +++ src/lib/utils.tsx | 38 + tailwind.config.ts | 133 -- tsconfig.json | 3 +- turbo.json | 8 - types/AuditLog.ts | 30 - types/BuilderPackage.ts | 49 - 97 files changed, 5728 insertions(+), 3614 deletions(-) delete mode 100644 .github/workflows/deploy.yml delete mode 100644 app/actions.ts delete mode 100644 app/api/logs/[march]/[pkgbase]/route.ts delete mode 100644 app/dashboard/page.tsx delete mode 100644 app/globals.css delete mode 100644 app/logs/[march]/[pkgbase]/page.tsx delete mode 100644 app/page.tsx create mode 100644 bun.lock delete mode 100755 bun.lockb create mode 100644 components.json delete mode 100644 components/AddPackageModal.tsx delete mode 100644 components/AdminShell.tsx delete mode 100644 components/AuditLogs.tsx delete mode 100644 components/BasePackageList.tsx delete mode 100644 components/Checkbox.tsx delete mode 100644 components/ConfirmBulkRebuildModal.tsx delete mode 100644 components/ConfirmRebuildModal.tsx delete mode 100644 components/KPICards.tsx delete mode 100644 components/LoginForm.tsx delete mode 100644 components/Modal.tsx delete mode 100644 components/PackageTable.tsx delete mode 100644 components/RebuildTable.tsx delete mode 100644 components/Statistics.tsx delete mode 100644 components/SubmitButton.tsx delete mode 100644 lib/db.ts delete mode 100644 lib/fetcher.ts delete mode 100644 lib/hooks.ts delete mode 100644 lib/servers.ts delete mode 100644 lib/util.ts rename next.config.mjs => next.config.ts (60%) delete mode 100644 postcss.config.js create mode 100644 postcss.config.mjs create mode 100644 public/cachyos-logo-white.svg create mode 100644 public/cachyos-logo.svg delete mode 100644 public/logo.png delete mode 100644 renovate.json create mode 100644 src/app/actions.ts rename {app => src/app}/apple-icon.png (100%) create mode 100644 src/app/dashboard/layout.tsx create mode 100644 src/app/dashboard/package-list/page.tsx rename {app => src/app}/favicon.ico (100%) create mode 100644 src/app/globals.css rename {app => src/app}/icon.png (100%) rename {app => src/app}/layout.tsx (57%) rename {app => src/app}/manifest.ts (100%) create mode 100644 src/app/page.tsx rename {app => src/app}/robots.ts (100%) create mode 100644 src/app/validate/page.tsx create mode 100644 src/components/app-sidebar.tsx create mode 100644 src/components/header-breadcrumbs.tsx rename components/Loader.tsx => src/components/loader.tsx (95%) create mode 100644 src/components/login-form.tsx create mode 100644 src/components/nav-main.tsx create mode 100644 src/components/nav-secondary.tsx create mode 100644 src/components/nav-user.tsx create mode 100644 src/components/server-switcher.tsx rename components/TerminalComponent.tsx => src/components/terminal-component.tsx.temp-exclude (84%) create mode 100644 src/components/theme-provider.tsx create mode 100644 src/components/ui/avatar.tsx create mode 100644 src/components/ui/badge.tsx create mode 100644 src/components/ui/breadcrumb.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/card.tsx create mode 100644 src/components/ui/checkbox.tsx create mode 100644 src/components/ui/collapsible.tsx create mode 100644 src/components/ui/data-table-column-header.tsx create mode 100644 src/components/ui/data-table-pagination.tsx create mode 100644 src/components/ui/data-table-view-options.tsx create mode 100644 src/components/ui/data-table.tsx create mode 100644 src/components/ui/dropdown-menu.tsx create mode 100644 src/components/ui/form.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/select.tsx create mode 100644 src/components/ui/separator.tsx create mode 100644 src/components/ui/sheet.tsx create mode 100644 src/components/ui/sidebar.tsx create mode 100644 src/components/ui/skeleton.tsx create mode 100644 src/components/ui/sonner.tsx create mode 100644 src/components/ui/table.tsx create mode 100644 src/components/ui/tooltip.tsx create mode 100644 src/hooks/use-find-shortcut-listener.ts create mode 100644 src/hooks/use-logout-shortcut-listener.ts create mode 100644 src/hooks/use-mobile.ts create mode 100644 src/lib/CachyBuilderClient.ts rename {lib => src/lib}/session.ts (61%) create mode 100644 src/lib/typings.ts create mode 100644 src/lib/utils.tsx delete mode 100644 tailwind.config.ts delete mode 100644 turbo.json delete mode 100644 types/AuditLog.ts delete mode 100644 types/BuilderPackage.ts diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index aeadee7..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Deploy to vercel -on: - push: - branches: - - main - workflow_dispatch: -jobs: - build_and_deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v1 - - uses: dkershner6/vercel-set-env-action@v3 - with: - token: ${{ secrets.VERCEL_TOKEN }} - projectName: builder-dashboard - envVariableKeys: COOKIE_SECRET,NEXT_PUBLIC_TURNSTILE_SITE_KEY,TURNSTILE_SECRET_KEY - env: - COOKIE_SECRET: ${{ secrets.COOKIE_SECRET }} - TARGET_COOKIE_SECRET: preview,development,production - TYPE_COOKIE_SECRET: encrypted - NEXT_PUBLIC_TURNSTILE_SITE_KEY: ${{ secrets.NEXT_PUBLIC_TURNSTILE_SITE_KEY }} - TARGET_NEXT_PUBLIC_TURNSTILE_SITE_KEY: production - TYPE_NEXT_PUBLIC_TURNSTILE_SITE_KEY: plain - TURNSTILE_SECRET_KEY: ${{ secrets.TURNSTILE_SECRET_KEY }} - TARGET_TURNSTILE_SECRET_KEY: production - TYPE_TURNSTILE_SECRET_KEY: encrypted - - uses: amondnet/vercel-action@v25 - with: - vercel-token: ${{ secrets.VERCEL_TOKEN }} - github-token: ${{ secrets.GITHUB_TOKEN }} - vercel-args: '--prod' - vercel-org-id: ${{ secrets.ORG_ID }} - vercel-project-id: ${{ secrets.PROJECT_ID }} - vercel-project-name: builder-dashboard diff --git a/CachyOS Builder Dashboard.code-workspace b/CachyOS Builder Dashboard.code-workspace index 57528c5..03032dc 100644 --- a/CachyOS Builder Dashboard.code-workspace +++ b/CachyOS Builder Dashboard.code-workspace @@ -15,9 +15,12 @@ "QPKG", "remixicon", "rxdb", + "scrollback", + "sonner", "toastify", "Upsert", - "webgl" + "webgl", + "ZNVER" ] } } diff --git a/README.md b/README.md index c403366..e215bc4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). ## Getting Started @@ -18,7 +18,7 @@ Open [http://localhost:3000](http://localhost:3000) with your browser to see the You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. -This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. ## Learn More @@ -27,10 +27,10 @@ To learn more about Next.js, take a look at the following resources: - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! ## Deploy on Vercel The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/app/actions.ts b/app/actions.ts deleted file mode 100644 index 92631c5..0000000 --- a/app/actions.ts +++ /dev/null @@ -1,297 +0,0 @@ -'use server'; - -import fetcher from '@/lib/fetcher'; -import servers from '@/lib/servers'; -import {SessionData, defaultSession, sessionOptions} from '@/lib/session'; -import {AuditLogEntry} from '@/types/AuditLog'; -import { - BaseBuilderPackage, - BuilderPackage, - BuilderPackageArchitecture, - BuilderPackageRepository, - BuilderRebuildPackage, -} from '@/types/BuilderPackage'; -import {getIronSession} from 'iron-session'; -import {cookies, headers} from 'next/headers'; -import {redirect} from 'next/navigation'; -import stripAnsi from 'strip-ansi'; -import {isURL} from 'validator'; - -export async function getSession() { - const session = await getIronSession(cookies(), sessionOptions); - if (!session.isLoggedIn) { - session.isLoggedIn = defaultSession.isLoggedIn; - session.token = defaultSession.token; - session.createdAt = Date.now(); - session.server = defaultSession.server; - } - return session; -} - -export async function logout() { - const session = await getSession(); - session.destroy(); - return redirect('/'); -} - -export async function login(_: unknown, formData: FormData) { - const session = await getSession(); - const token = formData.get('cf-turnstile-response')?.toString() ?? ''; - const username = formData.get('username')?.toString().trim() ?? ''; - const password = formData.get('password')?.toString() ?? ''; - const redirectTo = formData.get('redirect')?.toString() ?? ''; - const server = formData.get('server')?.toString() ?? defaultSession.server; - - if (!token) { - return { - errorCredentials: 'CF Turnstile verification failed. Please try again.', - errorPassword: '', - errorUsername: '', - }; - } - - if (!servers.find(s => s.url === server)) { - return { - errorCredentials: 'Invalid server.', - errorPassword: '', - errorUsername: '', - }; - } - - if (!username || !password) { - return { - errorCredentials: 'Missing username or password.', - errorPassword: 'Password is required.', - errorUsername: 'Username is required.', - }; - } - - const turnstileResponse = await fetch( - 'https://challenges.cloudflare.com/turnstile/v0/siteverify', - { - body: `secret=${encodeURIComponent(process.env.TURNSTILE_SECRET_KEY!)}&response=${encodeURIComponent(token)}`, - headers: { - 'content-type': 'application/x-www-form-urlencoded', - }, - method: 'POST', - } - ) - .then(res => res.json()) - .then(res => res.success) - .catch(() => false); - if (!turnstileResponse) { - return { - errorCredentials: 'CF Turnstile verification failed. Please try again.', - errorPassword: '', - errorUsername: '', - }; - } - - const res = await fetcher<{token: string}>( - '/v1/login', - '', - headers(), - { - body: JSON.stringify({ - password, - username, - }), - method: 'POST', - }, - server - ).catch(() => {}); - if (!res?.token) { - return { - errorCredentials: 'Invalid username or password.', - errorPassword: '', - errorUsername: '', - }; - } - session.isLoggedIn = true; - session.token = res.token; - session.createdAt = Date.now(); - session.username = username; - session.server = server; - await session.save(); - if (redirectTo?.startsWith('/')) { - return redirect(redirectTo); - } - return redirect('/dashboard'); -} - -export async function getUsername() { - const session = await getSession(); - if (!session.isLoggedIn) { - return redirect('/'); - } - return session.username; -} - -export async function getServerDetails() { - const session = await getSession(); - if (!session.isLoggedIn) { - return redirect('/'); - } - return servers.find(s => s.url === session.server)!; -} - -export async function getPackages() { - const session = await getSession(); - if (!session.isLoggedIn) { - return redirect('/'); - } - return fetcher( - '/v1/packages', - session.token, - headers(), - {}, - session.server - ).catch(() => []); -} - -export async function getRebuildPackages() { - const session = await getSession(); - if (!session.isLoggedIn) { - return redirect('/'); - } - return fetcher( - '/v1/rebuild-status', - session.token, - headers(), - {}, - session.server - ).catch(() => []); -} - -export async function getPackageLog( - pkg: string, - march: BuilderPackageArchitecture, - strip = false, - redirectTo?: string -) { - const session = await getSession(); - if (!session.isLoggedIn) { - if (redirectTo?.startsWith('/')) { - return redirect(`/?redirect=${encodeURIComponent(redirectTo)}`); - } - return redirect('/'); - } - return fetcher( - `/v1/logs/${march}/${pkg}.log`, - session.token, - headers(), - { - method: 'GET', - }, - session.server, - 'text' - ) - .then(text => (strip ? stripAnsi(text) : text)) - .catch(() => ''); -} - -export async function addPackage(_: unknown, formData: FormData) { - const session = await getSession(); - const pkgURL = formData.get('pkgURL')?.toString().trim() ?? ''; - if (!pkgURL || !isURL(pkgURL)) { - return { - errorPkgURL: 'Invalid package URL.', - success: false, - }; - } - const res = await fetcher<{success: boolean}>( - '/v1/packages', - session.token, - headers(), - { - body: JSON.stringify({ - url: pkgURL, - }), - method: 'POST', - }, - session.server - ).catch(() => {}); - if (!res?.success) { - return { - errorPkgURL: 'Invalid package URL.', - success: false, - }; - } - return { - errorPkgURL: '', - success: true, - }; -} - -export async function rebuildPackage(_: unknown, formData: FormData) { - const session = await getSession(); - const march = formData.get('march')?.toString().trim() ?? ''; - const repository = formData.get('repository')?.toString().trim() ?? ''; - const pkgbase = formData.get('pkgbase')?.toString().trim() ?? ''; - if ( - !march || - !repository || - !pkgbase || - !Object.values(BuilderPackageArchitecture).includes( - march as BuilderPackageArchitecture - ) || - !Object.values(BuilderPackageRepository).includes( - repository as BuilderPackageRepository - ) - ) { - return redirect('/dashboard'); - } - const res = await fetcher<{track_id: string}>( - `/v1/rebuild/${march}/${repository}/${pkgbase}`, - session.token, - headers(), - { - method: 'PUT', - }, - session.server - ).catch(() => {}); - if (!res?.track_id) { - return { - success: false, - }; - } - return { - success: true, - }; -} - -export async function bulkRebuildPackages(packages: BaseBuilderPackage[]) { - const session = await getSession(); - if (!Array.isArray(packages) || !packages.length) { - return { - success: false, - }; - } - const res = await fetcher( - '/v1/bulk-rebuild', - session.token, - headers(), - { - body: JSON.stringify(packages), - method: 'PUT', - }, - session.server - ).catch(() => []); - return { - success: !!res.length, - }; -} - -export async function getAuditLogs() { - const session = await getSession(); - if (!session.isLoggedIn) { - return redirect('/'); - } - return fetcher( - '/v1/audit-logs', - session.token, - headers(), - {}, - session.server - ).catch(() => []); -} diff --git a/app/api/logs/[march]/[pkgbase]/route.ts b/app/api/logs/[march]/[pkgbase]/route.ts deleted file mode 100644 index 5acccb6..0000000 --- a/app/api/logs/[march]/[pkgbase]/route.ts +++ /dev/null @@ -1,29 +0,0 @@ -import {getPackageLog} from '@/app/actions'; -import {BuilderPackageArchitecture} from '@/types/BuilderPackage'; -import {NextRequest, NextResponse} from 'next/server'; - -export async function GET( - req: NextRequest, - context: { - params: { - march: BuilderPackageArchitecture; - pkgbase: string; - }; - } -) { - const {march, pkgbase} = context.params; - if (!march || !pkgbase) { - return new NextResponse('Not found', {status: 404}); - } - if (!Object.values(BuilderPackageArchitecture).includes(march)) { - return new NextResponse('Not found', {status: 404}); - } - const log = await getPackageLog(pkgbase, march, true, req.nextUrl.pathname); - return new NextResponse(log, { - headers: { - 'Content-Type': 'text/plain', - }, - }); -} - -export const runtime = 'edge'; diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx deleted file mode 100644 index efcaa0a..0000000 --- a/app/dashboard/page.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import AdminShell from '@/components/AdminShell'; -import {redirect} from 'next/navigation'; - -import {getSession} from '../actions'; - -export default async function Dashboard() { - const user = await getSession(); - if (!user.isLoggedIn) { - return redirect('/'); - } - return ; -} diff --git a/app/globals.css b/app/globals.css deleted file mode 100644 index b5c61c9..0000000 --- a/app/globals.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; diff --git a/app/logs/[march]/[pkgbase]/page.tsx b/app/logs/[march]/[pkgbase]/page.tsx deleted file mode 100644 index 2f3211a..0000000 --- a/app/logs/[march]/[pkgbase]/page.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import Loader from '@/components/Loader'; -import {BuilderPackageArchitecture} from '@/types/BuilderPackage'; -import dynamic from 'next/dynamic'; - -const TerminalComponent = dynamic( - () => import('@/components/TerminalComponent'), - { - loading: () => , - ssr: false, - } -); - -export default function LogsPage({ - params, -}: Readonly<{ - params: { - march: BuilderPackageArchitecture; - pkgbase: string; - }; -}>) { - const {march, pkgbase} = params; - if (!march || !pkgbase) { - return ; - } - if (!Object.values(BuilderPackageArchitecture).includes(march)) { - return ( - - ); - } - return ( -
- -
- ); -} diff --git a/app/page.tsx b/app/page.tsx deleted file mode 100644 index 84c1369..0000000 --- a/app/page.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import LoginForm from '@/components/LoginForm'; -import {Card} from '@tremor/react'; - -import {getSession} from './actions'; - -export default async function LoginPage() { - const user = await getSession(); - return ( - - - - ); -} diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..3601ee7 --- /dev/null +++ b/bun.lock @@ -0,0 +1,1099 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "cachyos-builder-dashboard", + "dependencies": { + "@hookform/resolvers": "^5.1.1", + "@marsidev/react-turnstile": "1.1.0", + "@radix-ui/react-avatar": "^1.1.10", + "@radix-ui/react-checkbox": "^1.3.2", + "@radix-ui/react-collapsible": "^1.1.11", + "@radix-ui/react-dialog": "^1.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.15", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-select": "^2.2.5", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tooltip": "^1.2.7", + "@tabler/icons-react": "3.34.0", + "@tanstack/react-table": "^8.21.3", + "@xterm/addon-fit": "0.10.0", + "@xterm/addon-search": "0.15.0", + "@xterm/addon-web-links": "0.11.0", + "@xterm/addon-webgl": "0.18.0", + "ansi-styles": "6.2.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "iron-session": "8.0.4", + "lucide-react": "^0.525.0", + "next": "15.3.5", + "next-themes": "^0.4.6", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-hook-form": "7.60.0", + "sonner": "^2.0.6", + "strip-ansi": "7.1.0", + "tailwind-merge": "^3.3.1", + "zod": "^3.25.74", + }, + "devDependencies": { + "@eslint/eslintrc": "^3.3.1", + "@tailwindcss/postcss": "^4.1.11", + "@types/node": "^24.0.10", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "eslint": "^9.30.1", + "eslint-config-next": "15.3.5", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-perfectionist": "^4.15.0", + "eslint-plugin-prettier": "^5.5.1", + "prettier": "^3.6.2", + "tailwindcss": "^4.1.11", + "tw-animate-css": "^1.3.5", + "typescript": "^5.8.3", + }, + }, + }, + "packages": { + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.3.0", "", {}, "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw=="], + + "@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "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" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.30.1", "", {}, "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.2", "", { "dependencies": { "@eslint/core": "^0.15.0", "levn": "^0.4.1" } }, "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg=="], + + "@floating-ui/core": ["@floating-ui/core@1.7.1", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.1", "", { "dependencies": { "@floating-ui/core": "^1.7.1", "@floating-ui/utils": "^0.2.9" } }, "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.3", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], + + "@hookform/resolvers": ["@hookform/resolvers@5.1.1", "", { "dependencies": { "@standard-schema/utils": "^0.3.0" }, "peerDependencies": { "react-hook-form": "^7.55.0" } }, "sha512-J/NVING3LMAEvexJkyTLjruSm7aOFx7QX21pzkiJfMoNG0wl5aFEjLTl7ay7IQb9EWY6AkrBy7tHL2Alijpdcg=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.1.0" }, "os": "darwin", "cpu": "arm64" }, "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.1.0" }, "os": "darwin", "cpu": "x64" }, "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.1.0", "", { "os": "linux", "cpu": "arm" }, "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.1.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.1.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.1.0" }, "os": "linux", "cpu": "arm" }, "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.1.0" }, "os": "linux", "cpu": "s390x" }, "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.2", "", { "dependencies": { "@emnapi/runtime": "^1.4.3" }, "cpu": "none" }, "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.2", "", { "os": "win32", "cpu": "x64" }, "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@marsidev/react-turnstile": ["@marsidev/react-turnstile@1.1.0", "", { "peerDependencies": { "react": "^17.0.2 || ^18.0.0 || ^19.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0" } }, "sha512-X7bP9ZYutDd+E+klPYF+/BJHqEyyVkN4KKmZcNRr84zs3DcMoftlMAuoKqNSnqg0HE7NQ1844+TLFSJoztCdSA=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" } }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="], + + "@next/env": ["@next/env@15.3.5", "", {}, "sha512-7g06v8BUVtN2njAX/r8gheoVffhiKFVt4nx74Tt6G4Hqw9HCLYQVx/GkH2qHvPtAHZaUNZ0VXAa0pQP6v1wk7g=="], + + "@next/eslint-plugin-next": ["@next/eslint-plugin-next@15.3.5", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-BZwWPGfp9po/rAnJcwUBaM+yT/+yTWIkWdyDwc74G9jcfTrNrmsHe+hXHljV066YNdVs8cxROxX5IgMQGX190w=="], + + "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w=="], + + "@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA=="], + + "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ=="], + + "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A=="], + + "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A=="], + + "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg=="], + + "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.3.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ=="], + + "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.5", "", { "os": "win32", "cpu": "x64" }, "sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], + + "@pkgr/core": ["@pkgr/core@0.2.7", "", {}, "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg=="], + + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], + + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.10", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog=="], + + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ=="], + + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.15", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], + + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ=="], + + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.10", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.7", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q=="], + + "@radix-ui/react-select": ["@radix-ui/react-select@2.2.5", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA=="], + + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], + + "@radix-ui/react-use-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.0", "", { "dependencies": { "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + + "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], + + "@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.11.0", "", {}, "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ=="], + + "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], + + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], + + "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], + + "@tabler/icons": ["@tabler/icons@3.34.0", "", {}, "sha512-jtVqv0JC1WU2TTEBN32D9+R6mc1iEBuPwLnBsWaR02SIEciu9aq5806AWkCHuObhQ4ERhhXErLEK7Fs+tEZxiA=="], + + "@tabler/icons-react": ["@tabler/icons-react@3.34.0", "", { "dependencies": { "@tabler/icons": "3.34.0" }, "peerDependencies": { "react": ">= 16" } }, "sha512-OpEIR2iZsIXECtAIMbn1zfKfQ3zKJjXyIZlkgOGUL9UkMCFycEiF2Y8AVfEQsyre/3FnBdlWJvGr0NU47n2TbQ=="], + + "@tailwindcss/node": ["@tailwindcss/node@4.1.11", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="], + + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.11", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.11", "@tailwindcss/oxide-darwin-arm64": "4.1.11", "@tailwindcss/oxide-darwin-x64": "4.1.11", "@tailwindcss/oxide-freebsd-x64": "4.1.11", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", "@tailwindcss/oxide-linux-x64-musl": "4.1.11", "@tailwindcss/oxide-wasm32-wasi": "4.1.11", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg=="], + + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.11", "", { "os": "android", "cpu": "arm64" }, "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg=="], + + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ=="], + + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw=="], + + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.11", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA=="], + + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11", "", { "os": "linux", "cpu": "arm" }, "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.11", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.11", "", { "os": "win32", "cpu": "x64" }, "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg=="], + + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.11", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.11", "@tailwindcss/oxide": "4.1.11", "postcss": "^8.4.41", "tailwindcss": "4.1.11" } }, "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA=="], + + "@tanstack/react-table": ["@tanstack/react-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="], + + "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], + + "@types/node": ["@types/node@24.0.10", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA=="], + + "@types/react": ["@types/react@19.1.8", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g=="], + + "@types/react-dom": ["@types/react-dom@19.1.6", "", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.34.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.34.0", "@typescript-eslint/type-utils": "8.34.0", "@typescript-eslint/utils": "8.34.0", "@typescript-eslint/visitor-keys": "8.34.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.34.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.34.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.34.0", "@typescript-eslint/types": "8.34.0", "@typescript-eslint/typescript-estree": "8.34.0", "@typescript-eslint/visitor-keys": "8.34.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.34.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.34.0", "@typescript-eslint/types": "^8.34.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.34.0", "", { "dependencies": { "@typescript-eslint/types": "8.34.0", "@typescript-eslint/visitor-keys": "8.34.0" } }, "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.34.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.34.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.34.0", "@typescript-eslint/utils": "8.34.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.34.1", "", {}, "sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.34.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.34.0", "@typescript-eslint/tsconfig-utils": "8.34.0", "@typescript-eslint/types": "8.34.0", "@typescript-eslint/visitor-keys": "8.34.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": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.34.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.34.1", "@typescript-eslint/types": "8.34.1", "@typescript-eslint/typescript-estree": "8.34.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.34.0", "", { "dependencies": { "@typescript-eslint/types": "8.34.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA=="], + + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.9.0", "", { "os": "android", "cpu": "arm" }, "sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg=="], + + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.9.0", "", { "os": "android", "cpu": "arm64" }, "sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA=="], + + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.9.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A=="], + + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.9.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw=="], + + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.9.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA=="], + + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0", "", { "os": "linux", "cpu": "arm" }, "sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg=="], + + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.9.0", "", { "os": "linux", "cpu": "arm" }, "sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA=="], + + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.9.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA=="], + + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.9.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ=="], + + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.9.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ=="], + + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.9.0", "", { "os": "linux", "cpu": "none" }, "sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w=="], + + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.9.0", "", { "os": "linux", "cpu": "none" }, "sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw=="], + + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.9.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA=="], + + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.9.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA=="], + + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.9.0", "", { "os": "linux", "cpu": "x64" }, "sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg=="], + + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.9.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ=="], + + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.9.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ=="], + + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.9.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A=="], + + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.9.0", "", { "os": "win32", "cpu": "x64" }, "sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw=="], + + "@xterm/addon-fit": ["@xterm/addon-fit@0.10.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ=="], + + "@xterm/addon-search": ["@xterm/addon-search@0.15.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-ZBZKLQ+EuKE83CqCmSSz5y1tx+aNOCUaA7dm6emgOX+8J9H1FWXZyrKfzjwzV+V14TV3xToz1goIeRhXBS5qjg=="], + + "@xterm/addon-web-links": ["@xterm/addon-web-links@0.11.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-nIHQ38pQI+a5kXnRaTgwqSHnX7KE6+4SVoceompgHL26unAxdfP6IPqUTSYPQgSwM56hsElfoNrrW5V7BUED/Q=="], + + "@xterm/addon-webgl": ["@xterm/addon-webgl@0.18.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-xCnfMBTI+/HKPdRnSOHaJDRqEpq2Ugy8LEj9GiY4J3zJObo3joylIFaMvzBwbYRg8zLtkO0KQaStCeSfoaI2/w=="], + + "@xterm/xterm": ["@xterm/xterm@5.5.0", "", {}, "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + + "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="], + + "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="], + + "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="], + + "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="], + + "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="], + + "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "axe-core": ["axe-core@4.10.3", "", {}, "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg=="], + + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001723", "", {}, "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "detect-libc": ["detect-libc@2.0.4", "", {}, "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.1", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg=="], + + "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-iterator-helpers": ["es-iterator-helpers@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.30.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.30.1", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.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", "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" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ=="], + + "eslint-config-next": ["eslint-config-next@15.3.5", "", { "dependencies": { "@next/eslint-plugin-next": "15.3.5", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-oQdvnIgP68wh2RlR3MdQpvaJ94R6qEFl+lnu8ZKxPj5fsAHrSF/HlAOZcsimLw3DT6bnEQIUdbZC2Ab6sWyptg=="], + + "eslint-config-prettier": ["eslint-config-prettier@10.1.5", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw=="], + + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + + "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="], + + "eslint-module-utils": ["eslint-module-utils@2.12.0", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg=="], + + "eslint-plugin-import": ["eslint-plugin-import@2.31.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A=="], + + "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="], + + "eslint-plugin-perfectionist": ["eslint-plugin-perfectionist@4.15.0", "", { "dependencies": { "@typescript-eslint/types": "^8.34.1", "@typescript-eslint/utils": "^8.34.1", "natural-orderby": "^5.0.0" }, "peerDependencies": { "eslint": ">=8.45.0" } }, "sha512-pC7PgoXyDnEXe14xvRUhBII8A3zRgggKqJFx2a82fjrItDs1BSI7zdZnQtM2yQvcyod6/ujmzb7ejKPx8lZTnw=="], + + "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.1", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw=="], + + "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], + + "fast-glob": ["fast-glob@3.3.1", "", { "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" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + + "iron-session": ["iron-session@8.0.4", "", { "dependencies": { "cookie": "^0.7.2", "iron-webcrypto": "^1.2.1", "uncrypto": "^0.1.3" } }, "sha512-9ivNnaKOd08osD0lJ3i6If23GFS2LsxyMU8Gf/uBUEgm8/8CC1hrrCHFDpMo3IFbpBgwoo/eairRsaD3c5itxA=="], + + "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], + + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="], + + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], + + "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], + + "language-tags": ["language-tags@1.0.9", "", { "dependencies": { "language-subtag-registry": "^0.3.20" } }, "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lucide-react": ["lucide-react@0.525.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ=="], + + "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], + + "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "napi-postinstall": ["napi-postinstall@0.2.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "natural-orderby": ["natural-orderby@5.0.0", "", {}, "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg=="], + + "next": ["next@15.3.5", "", { "dependencies": { "@next/env": "15.3.5", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.5", "@next/swc-darwin-x64": "15.3.5", "@next/swc-linux-arm64-gnu": "15.3.5", "@next/swc-linux-arm64-musl": "15.3.5", "@next/swc-linux-x64-gnu": "15.3.5", "@next/swc-linux-x64-musl": "15.3.5", "@next/swc-win32-arm64-msvc": "15.3.5", "@next/swc-win32-x64-msvc": "15.3.5", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-RkazLBMMDJSJ4XZQ81kolSpwiCt907l0xcgcpF4xC2Vml6QVcPNXW0NQRwQ80FFtSn7UM52XN0anaw8TEJXaiw=="], + + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="], + + "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="], + + "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="], + + "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="], + + "optionator": ["optionator@0.9.4", "", { "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" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.5.5", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], + + "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="], + + "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="], + + "react-hook-form": ["react-hook-form@7.60.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A=="], + + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.1", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + + "sharp": ["sharp@0.34.2", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.4", "semver": "^7.7.2" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.2", "@img/sharp-darwin-x64": "0.34.2", "@img/sharp-libvips-darwin-arm64": "1.1.0", "@img/sharp-libvips-darwin-x64": "1.1.0", "@img/sharp-libvips-linux-arm": "1.1.0", "@img/sharp-libvips-linux-arm64": "1.1.0", "@img/sharp-libvips-linux-ppc64": "1.1.0", "@img/sharp-libvips-linux-s390x": "1.1.0", "@img/sharp-libvips-linux-x64": "1.1.0", "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", "@img/sharp-libvips-linuxmusl-x64": "1.1.0", "@img/sharp-linux-arm": "0.34.2", "@img/sharp-linux-arm64": "0.34.2", "@img/sharp-linux-s390x": "0.34.2", "@img/sharp-linux-x64": "0.34.2", "@img/sharp-linuxmusl-arm64": "0.34.2", "@img/sharp-linuxmusl-x64": "0.34.2", "@img/sharp-wasm32": "0.34.2", "@img/sharp-win32-arm64": "0.34.2", "@img/sharp-win32-ia32": "0.34.2", "@img/sharp-win32-x64": "0.34.2" } }, "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], + + "sonner": ["sonner@2.0.6", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], + + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + + "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], + + "string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="], + + "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], + + "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "synckit": ["synckit@0.11.8", "", { "dependencies": { "@pkgr/core": "^0.2.4" } }, "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A=="], + + "tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="], + + "tailwindcss": ["tailwindcss@4.1.11", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="], + + "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="], + + "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], + + "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tw-animate-css": ["tw-animate-css@1.3.5", "", {}, "sha512-t3u+0YNoloIhj1mMXs779P6MO9q3p3mvGn4k1n3nJPqJw/glZcuijG2qTSN4z4mgNRfW5ZC3aXJFLwDtiipZXA=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + + "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], + + "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "unrs-resolver": ["unrs-resolver@1.9.0", "", { "dependencies": { "napi-postinstall": "^0.2.2" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.9.0", "@unrs/resolver-binding-android-arm64": "1.9.0", "@unrs/resolver-binding-darwin-arm64": "1.9.0", "@unrs/resolver-binding-darwin-x64": "1.9.0", "@unrs/resolver-binding-freebsd-x64": "1.9.0", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.0", "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.0", "@unrs/resolver-binding-linux-arm64-gnu": "1.9.0", "@unrs/resolver-binding-linux-arm64-musl": "1.9.0", "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.0", "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.0", "@unrs/resolver-binding-linux-riscv64-musl": "1.9.0", "@unrs/resolver-binding-linux-s390x-gnu": "1.9.0", "@unrs/resolver-binding-linux-x64-gnu": "1.9.0", "@unrs/resolver-binding-linux-x64-musl": "1.9.0", "@unrs/resolver-binding-wasm32-wasi": "1.9.0", "@unrs/resolver-binding-win32-arm64-msvc": "1.9.0", "@unrs/resolver-binding-win32-ia32-msvc": "1.9.0", "@unrs/resolver-binding-win32-x64-msvc": "1.9.0" } }, "sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zod": ["zod@3.25.74", "", {}, "sha512-J8poo92VuhKjNknViHRAIuuN6li/EwFbAC8OedzI8uxpEPGiXHGQu9wemIAioIpqgfB4SySaJhdk0mH5Y4ICBg=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.15.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" }, "bundled": true }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="], + + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + + "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.34.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.34.0", "@typescript-eslint/types": "8.34.0", "@typescript-eslint/typescript-estree": "8.34.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.34.0", "", {}, "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA=="], + + "@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.34.0", "", {}, "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA=="], + + "@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.34.0", "", {}, "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA=="], + + "@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.34.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.34.0", "@typescript-eslint/types": "8.34.0", "@typescript-eslint/typescript-estree": "8.34.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ=="], + + "@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.34.0", "", {}, "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA=="], + + "@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "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.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.34.1", "", { "dependencies": { "@typescript-eslint/types": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1" } }, "sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.34.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.34.1", "@typescript-eslint/tsconfig-utils": "8.34.1", "@typescript-eslint/types": "8.34.1", "@typescript-eslint/visitor-keys": "8.34.1", "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": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA=="], + + "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.34.0", "", {}, "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA=="], + + "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], + + "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "is-bun-module/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], + + "sharp/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.34.0", "", {}, "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA=="], + + "@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.34.0", "", {}, "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA=="], + + "@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.34.1", "", { "dependencies": { "@typescript-eslint/types": "8.34.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.34.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.34.1", "@typescript-eslint/types": "^8.34.1", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.34.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.34.1", "", { "dependencies": { "@typescript-eslint/types": "8.34.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/fast-glob": ["fast-glob@3.3.3", "", { "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.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + } +} diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index eeebe17c60f34406aa689641deefb5a3bed57012..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270148 zcmeEPcRZHw_kRc}8HtLhs5EJ4sYJ4pC@Ym@Jyx=bG&D45ph-)6Ye-Y2G?ccc_Ac!y zTEBDL*ZFup{fhhM_j>*Q`CPAV@8>$#d7pExbFKTnpXc-aw$SMq6%pRiD+M(Rg*sw*uLiMk&7Qtye5-h8W1-L<+U7Mho?`?cjn z>6*@6EtBRNC(dfIyQvIliA3{J8Hzjy|6n|;pGsm1<#i2_C?3t%1su#U!rwDI6k3zP zpf1Qm0hERS=1k0V5-V0=yv3(;x>?e1v#Rv^ZQO@(u|K0T9{O z6N%to{5trf1Xu!ydP@PZzh;1nfFj^yJv=5b0%)S}7#}n%8VgREfLu{UBvJ+Z26e=D zfM~}@>?YfGQJMTu^)#ZD2!`D1Ca>+#eang z%AZFi<`j>ge|-G(u?c8=(=$sQ~JzKLsX9b3kS29L6aFh`dz{ouD1#3jxIT zQIIt3_eiKCeup~Rp*Yt-1>+tY0l`6840X)QY(TV|36lxqs1K72d9@gB0L1oyV1IFV zKxD)k(8Kxyrk}u293HOk9pWSQ5qm}Xf&DSek5`nhFV2quu~^)rTUSv|b1v@5%L84%&W52`<-58G3kMQ;vkMS(k<=Wpddm>|`O4%Yfrs(@06DHpH{fC1vLMHJi~Dl=rXa`p z8c@gl?Eu7ng@GT~`r=~-a_gZs)G>b_%(=Wi1w`ISTP{z*o{>16 zMZu%Ru@MG=5mAFU`<{W(C>GVVe%lWFkdmAaOi9#=ufcc z?AII2$s?hT?H@o7yIlY{^go5XbSu5Dtp~F;B-BZUMypE(FAW zP6oudq5!d9ZVcZzbM+xm$8oU&#Cfs9g{$|4I>r?m5)tVg5g|$*%H@ALAnFBs28RT| zNP0y@c!k7@L@BPEy*tnk^rJnD>rYg$cX(`QWQcbNOdPRDMCmnEs$GssS_Uj(x1mkTqlB+{(uvLgeGEhg}95*iRSkEy*n7>a@M>|geF~8KG z8>}8KjtB{g7K=WP;_h=^0Al}c0iymqRu2vEglNEAUxDFI2P_lz5OGiyu;yG6BP$={SOTY_l$(V$Be_Q!2MVtmxoAyaWLB7 z$?7?P*zcRbL%Ze40sX}=Iv8&mAm;Ba!^vZ~b#o06d7++>{`#=?#`*_%LujIa2yqN_ zO*EV7Ylg6V1Ox|!dPYP{1v%#DBFL2iTZMA{8pq^^p^koc0-}97SLj^o7|!X_xkTsv zF^C`MA1sCP_2&wR_ldUvQQjXA_vOHVNYI4+Fo@e9;5fvp=++2sexC-!`K|!XIN$vN zF`g5EDBlf;c@hC)ULrlcyga>v#Ii8|QQi=C2lST&*bs0(*h9V#jE25%aKsj<<2Z(k zz2S~NGQuCm2kQgkxcD{!VqSVNY|k)iJg29{>hBp(k=1{(x{o2;X2GrYql$WD08B=Z z!y^P7K!*A_WFoA?2`=t2iL(oJ)I+&vc(`Y53CMArv>1Y1jPq+avun$+%Ve&9rckd3 z`uCuY{XPST>!o~O)endmFonw(><4%bimpIA=8xKgLVU^(EO#l+o+Tjeo4N@i5!@=p z-v?|CCYHTteRHIb6IBfas?fMfz(3)-6j76amZegWf-c7{Q{ zxdi^Mrw#4e(Eg7d;35A$AjU=W@igQX*C~unWMqIiJR&yOdo+yu#SL8l4FGYy_-^EQ znV{bU>b;n~+MBrkz;Kq^nGT5g3*5r3JFBhSyyyj}2yz2JjK9q`F0W0Yt^)N)&rsYx zMRHKbIBDHbKkUIC`laW_?oh||1XsEK<;`52Ie^%o^*g!t!MiyB+jn#8MLC<4O z=@19Dk799$u=+?AUw=SNXm1bL7_cFrI-o2d+Ib5+%-7~4T>T-`ahy&AVjLN)JsA-D zH4PBQFA5Oz<`0Pa?~Zcvk;k|=2LYmfA3*fu40_m46F~H*!T7ZSF^?ahUl`XNhUWm0 zzY7q@Jsl9^PuR)n#{i<=btl<;VfCO>oZJ;q4cZm*xpmtJ+Oa>bfDHg`Slu&53peO0%E)yVLqXq;ximSx`6BF7(kpq@LUD^WJF{jJa=`2xk&H1ZZrMUfauRB z#5*!PAXvN=>bNdf1J(sxxS4A|d!F-~1&H&S?su0!9pjDyL_0|rx&DuYI_ATIAsoBq z%f}1av0s6}!#odXXvgf_xWbKFXQ-<}`5IOnR{y*>;^~vMZ(Z*! zRI4~B8wM_>-iq}l>jV?>-*J5H}T2$OCuXpvPZdx6>zVE&%aW7XM``Y2_ z_WakY2ac7p8S?SA%H#{utsSRIPk1wP=52YauqpSCs{fpJ!~b!>n$=4CR8=i3SKisY zy3xU}{-xvNWlXZI)CW9qQA}<5XxW|SGluMv-FiTF)moX;8+O)K8>JTa!fgAO;6+o^ z>aK5b$#wI^0iRYr@d|5cY^tE#)24ap{snPomoMzlKsK>cpXIY#UKy|Qrk8@h$m7$~ zLv1_fzv#L(YRBDI?FuHe)Ou0JBfqa)WXjGUuc5M0kqVbH+`G1V)4Q?Wl0u!iDxtC~ zr|AxP^+on}=8=q`)+wEz=eDVz(sB44y=-HnIw5^d77s~3c<$uQ6jieyXBz(0wK%f9 zaBjWL7ccgbS>}Jk{MYV){Exfr)+DuA;Ox0GZtA^&_9+XmZoK#L+53I(I^X}?@`y&< zS-%alUW@fS+gO!ayIq=QamVL(I~U|jTpUuHrgyzD@9vjE%T~1!M!8rc2)=%SA|l79Hj`!b-{MzeFhXQ#i7&s!0GFiT_m^k$bFXO7(0K5|OE z?afDR%2M5T^n$Lh{hB^%x3w;-Z5lpgR{bYi!YEFoZ^O+^7TE{YmKiW%-`qY0ThgZY z&z~Y|FFSv&N$nF39SUB{y7tpM(tWkzHM^DTN_!l<{M2h>#O@h7w>rAFcGr1UKfSn7 z<9k>9u4I@L_j~Z&t#>nP_i?E<18pxq%o%qeaeubGacl9H$!F(I6?J`}dFJHW-N&zH zU!P}vVu1PVHsg-Yo8}z#)1jI9*P#x}L_gn_ojFj)(ym|BfrCrl4|};NRlT5zd3c$( zZm#zJ0jj2&WuEe#g68aKc_97ent~;qTA4hUbS)70$w zG#md|X_Nhz9*itA$+rvBnsG{f!MlkQE&Yw-^`|s&xqR!{$Czh5##@XT{d3WZ>}zc@ z9~9KSx#8ftDC^Y`VbkjvDNkMDGG?8~c1y|0p-udnS~kghJiTv+J)W{}-uNajtb1zY zx)*w9MSZi}pMK60Ee>q-ww2$3oEh&A7&Xtb^7hVp8R0!*pZ5DE&xWMVwOD@hc=WEq zt2b^P-E>xQzDoz`PazNW_Fh`6^h^D7yX$IeER(W>T{9*Q7c1}TsoB!{c+Pp5r*X&1 z9va?Sv3lut1D7Z34mHe{XZb zXn6cYwTCjdWBRwREuA0e-r&Xx`?F&=zZ^K&de(H)wewy++}tDn&9}#QhMWp`t?j-& zV9V9B4GuRn_Pgjaenw!+A3;((LUqlHwuW@x9rVU~#VeoT&UgCcn*Y8ZeGkg}F=#~0 zsK%|Qd0xrrGT6EBRm*W9D#PqL9$T$(CQr@$gVcv7ha+<2se;9%|Lr`e97)RoSz74_7@d*m|qW2#@u>r;Ob> z!v582wb`@wyESOFrqBDLATNEh^MEq1ai5CmNwf$7Pgn0~57WetQylwYJt{`ArWe53D0=tmJ1sc6G}a$%cka2I?J?l{)k6LC5+U zCl)up*z?-jc6XDa2DG*5<@?}9TK2U5ZTou7>Y*e%@}P64%k9T19S_M~du6@t!_WIt zf{qUHePPo~HP^`C*zwcHr7y=UEBdt5Cd8)IxLeW*eeUi5;j>AaZXa}l9IiNeD_v{9%zba|WhrM{OntighsluB`}`NDiF98iBptrENa5zE zg|2%P!c5#hM3?nnx%J)NnaOGLPkOFaTCzWC&Oy`0E927UY;@}KYP<0&wQT1$i(2K2 zqf{O9tWA>Y%(A(EacSBa&9E{16b$<0iJvDry0jXklX2YSc7t8p<>p`MY?-8^_RuPTR@r=AKb${MmkilId-mej}Qk+7r|5 zXYtLMdO!P)m|4eE_u|B9tL%$4@>A;EN!YO^u5s_OfEiA{$B)E{NjFH z+CSfzsC@03T&TmN^`jSfZFgyZZQY4ciOqiO6?>3&bj6U1q`jmz{>lAj7 zS>f92nslCb)5)E$Myj=+?`oLpJ?`l8j0puUi_TrXGG&zI=3kq%cACLKc;-!)rJ6C) z>))O6_21V%KX`bW{khiTGBm>Rmtaz+q&3!Gkyd)seL=&?)uORle*0> zT>H4Q<7-)3zZ#+Uy7^}M=e)LD>^9t^R)gi|mVWKE&vyTh7q@3mcI%(jOMSIZ(yES* zQS}DB9o_qGq@Vh{5g(q8Txs+5bdc=ZHBQGf$C{~1na4R=-~1pmv0IvbXew6{WtzlT0eH0?^6T&sBU$aKPZ}3`;lRjO_T0rKFb!_ z9m{gMmgBYb<(T73U7rmpaQ1lht1Q{`ORm}txdVC6ni+r0-FZf(o4<@}7pHS_n@_as zX#M@`2(=G86`MYuHD{AP^{cbV+E(MI*4O;BUUivts&6v+J zylbw!V?*Sei-|t7_qYVyUhzh^*MvX3^SJoYtWF<3Zhf(F)X_QXzQp)ADxFkxm~}0)sjE%h zakrYOob}d^^&L9rjpi^r3k_A(Ag30}R}MP_j^4uK|#}`mc2VZA#~aGvxO0I z$rHSn^onUF{m^~Ln>V4uj=YgwcK3Cgp+l|=8u{V$gIvv4atB9w+}{}cGsG~XNxv1F zQ(rbzznnnl3Y|;CPIh-Fwkdr@=MtUwOV#%lYbNB3j(wkfqbD3?rDlVC|?AlNnmwLHJrubxSNgp`0-U;37LlzIwo!jPofc16TuI59v z^d>D)w$?~+?XNBCe#LXhtz{33CYs!=J?Gib8FMynve&+}EcNoi0?l_VL(~^Eqzp zv93CL&s+_<_L(waUW1dJAC^3ssINWnM(M)wjScVB-Ti&y=`*@9Z~Ga|dwR5?_Rxms zK0R3&+g;^gYC?u{U-jNyRZ0ssJqT)bW1UUxnT847*k%~-egME%SuiaNcIHJhhC(sTcT z^cJ%nhpt_+J?)6mm&kewvGY^h<{aNztNDRQYR`QbZM@vb?#iU4Ps=Wt#BALD`g!j+ z!Na#neGacZxO?1$TNnJ) zPHq0aFJ;rUR->108WQGhq5Ne=YO6(it`6uobcIsTrI|JdQ$45U4crhus-fe7AjkZ^ zi4jraF@HDl)Ji%l~d1r9r$y(?>Ui#u6E21bVTyAo*_agGJ)f*>72lzKg4k=nQ+(WZm5pDU zN89WOSF_2D+5fqRY_9=Z4CPx58elsjvF9TF1v+`Er?XB^N;UJ_+A3G+*(R$jpZ7Og zoNG1B`jx4=%Fcu1<^?bLeI1>iGhV5Y^wpT)Qlqbf0v(#TXj)%t_CD)$M`d}hW+_?4 z#SSM=-w>}4RC*eqq?tV=!fJejRbK87HnCPKD85KXH5S*a`5aQ5og+U z+|W1oX@b{;E*7p^=T$on%G>-x1w{swPO59xAuwC>AA44yL8T#xAONs6}3=bwds*bug(LV zG$-HNI(&xCIHT+@CoU^I^@^LXf0WuIY)3nL^q-Q@PfW*G*j+!`RY>ypQe^Xk_9)_w|n9^CZfk*haa8WH}k zm$El6FF?2ROtMqkE^cgS+c##%hjl8cJA2POnvdTdI(?m7Up()&dnboo?f1`_?i4&r zf8zIRor8S`d&RqEMP9$~@mBC5=W#pwO|$E>%30;>=n0{-UFFE$*S+sYyA1HxS?Tra zm8az;(c3;j(QVf}@qTwYQ(sM2?y`Ht$20TZbR4B~X8Q7bem6&`D-9U#?SH*jQ$tJ7 z=i?UY`oG=%)}d=;+x*h53JdfLk7r!U$(j&4w;in;>W6rCgWjnHSzh$q=o0xRcGxfV zJeRb`@yc2&HmXVuxczCb-jN^Qay*_NnIV0*&YEF+EuIy*?`v>(!jVF6Bh{OY z78|I>`#v^UqSLmxpRR$H<>ct+H>8`zm3+`YI%>VIyWM@q7em_g3;(&L?ApWGt*nn5 zH?#}48`?tc@bZ<{FTI+)Hcz!kW=I5VI(uXE+rJ#&PV;$-NtSItzG|+vL!oF)Ov0YR?zZFF z8?1b5U=eGUe(F5dX7$t=iy`R9rmvr ztT%3eV#BY)-_5>1;f11ii}0Hs-}SzR&m15(OfLFD@+w>VD}`Nt?a{WAO+271v*O{X zE?V)geICE~GBeIr$#hY1lQ>7$qNzt4H$4A-!o}{dr0fdRZO&|*p?pKu>dw3Pg2C7`T@0EX zYfwwqD%X8+oO=84kR=zCC(g88JoxRZ4a4)tyX|d!;`YUhKOevB?df^Ci(Q>PWucEc z>Yc1R^Wgf+jmKW*MHsRRmEL&A9Xf{ukmVB zq#0WcKJvk~9k^ui1CK)fcgcuEe!!>Lp~|ZeUjrP% zPadkx9}j%b8u0G`e^d?leIW5Q;V%U~{6wYN{r?L55jEgD!o-v03myMV;Jbo<9Q5kU zA31rE$f*YW;lOvO0e>s-2iJiAy@q^S_)-VH1F3fY(rd_n4t(1h`0ol|D%FG^Uqk*` z;9J%pejWJIsxR2^{6 zD=6=S5WWh0xr*`QzKu48`X2#&Q{ZFXU@8gje-`k~fe+Mj|I{z6S5`<*8ope_@k3pV zo#a@rtdO25@bUb``0>I#@F~O}4}3G=Q(fr%In4aizDsthih=aXfZqxHx+{P?&^Gb4>T~&{c_(!Kj03(K>p$hNs@Ns{Ujsg#zv!Q05W;T< zU)JOJVgGULFo%2!^*e*KHi(}M{C>d4y-%$wl0-Z4zX0C`_%wDx z^KS}2k}w87<{oo^aqubRKN%_H#x7$5zU4f0VL z5`PQuasNTT@H-&hHi-WM`1Zg@U$B)69>1Qj@CE=M?LjI9&)+=YcL6^2o#Fyhl@`+b z41DZAoqv4Ck@$v?G;`n+kFZkb&`A8Tz{lqoL#E7$3GW!ShcS zer#w3d>TKY{SN?sPvB$F7(dNptXEbj{;k08!Te(mX&zU`#WvzU0)AKEk(%xkKN2aPcV=uQlUi zzhNo~oiZqVg7LrQe5z{(n5O8n*MwLC3&S}Xe2#v2|mWaw-A39@Nxd&_@PW_|K9;0*FV`4 zn*TPg+$+z{m3o&ko!}_!i3lE8t`QG4Hqs3q61IbU8lG9kR(M2GaEaKAxYLJInz- zL-Hxa&j3Eof86`9kesXi{V(ZBw-AYX10SD#rT(t|zgmcI4E#R8$7ery6~?;|KNk4r zz{mVy|M?c;A7cKIFJugeUkZF2f6P1ffo~3oKSfU@8V-D*mggSFkxwDMR%`D54>>4n z!-vdtQPmsx=FC6N0ipgk0H4-Bt{08Q2f{@>KA;h zw2?+)?tiO*FFAj)4}1#wF9Cix z@Q<t@<;nN zVO2JW{{{F~;2-tTztH(Jv@`en5xj3jKG}tjl@`)F27DXvkM-)DKlR|{Bd$NP$M+tH z^c{fT5BT`rsyhDX1K$+*IDTl8<^g=Hw2=SLz^C_bl@fkyB>q4{?*4)AzE5U|KMVMH z|B34di_rOVg7GQuLiti~^G?s76cZOo<$p=n2>6h~^85el#2*QKynn*EE2NPBOyJ}F z8;(EUu}43|e+7J4g5}R|DCawl#Mgq&562JV#~An);w!_$FZo9q-#!rE1o-G*$lAde zi62)({@&mCWVfn3klsh&o7EuxZt(Do<4^OR?DF*=A;BjbRdKPM{Okli?thejl2>Je z^h$tlE5WadNA1M#4~y3f_*CaR2T4Bx_@)y6Nlt$LhNO1__}0L$?)p=Nm#_H#1oMaY z-}oMcPa*$Kz;^^ba&YY^;Rhat__@Fz%=p!Leo%qU%bf9X@8G+Sk$)%PQ~W3sdj97E zpW;XVWVfmmke&*>JfZtXymuBFzccXBKdl|1{6oOEli&-TzY4JVnMv@4`X2#&>ObB; z3-!MP_&EPD-{@N?UlS%jjUVPvC_fPR=FC6NUz`Jc3XOjz@a-8N*AM1^Pa(bHjT(_7zy!aI2F9kl1Ki0AD zLivTj$MsLX@eJit$iH5H?*4`HPFR%<;>Q5rl=HZgKB(KT@>AeF!Y{CEJzbYQJ6W;)wgn_~~`#BU9Jcm)vuk3F6SNPj%= zDSjbykobpd7{3g>yrcQUckW^r$$wwqo7NzI6M^p{!52FISAdWAzsSRj_CfeqX`%RA z!sg{9;a}+bO9j501iwFm@1Ls6&jG$E@X;^dy#rMLnWyTIe4IZ* zxRQK(;A8($)(9@jE7mJ3q?ZVM+&^gD%T`8`Xe0gw;CBK()-eY{^IvZWcmJydT(qGG z7oS4@$2oBK57p>|7l2Y@T@jRM&re4f)rAkLOQy{kH>hP52Xm3@NO(|BJwfDO7EK zb7$`Uue$vY0zTY=maku&ca6`S<~40$=)A8SGf2|R}`zY@I8`losxrauHzZUrD zAGr1z zt**FY{bQe~U!?apBt1*uQ~vqJjy8!O&-j>kyhx5Zl@-z}0zQr(`j&xA6tMmSK74UKYqjAGAQRk3(g%mK18NNd~JV@k9C@Ze9REv8Thz< zu}*yu!ru&hyniPDe7LAX{y(w!tK0t$0Tubf_|XoZLjIG0kM~c=Yr%)ebcp{G`0xrd z9>wTi=>5Na;J?pLzH@;5Cjh?#%YSVQf@dNA72xCkfwA-TjV_4abTk(~<_|BvbBOp( zz$gF6=Ua%M3Vbt&pY~3n{;vQZ=P&ZmrqK0k5X8N|t_xg@ACXU?_%{IG8vIlK_;68& z__AZT{89gf^7}JB%^kjTfcz%|-xA`dx={a*fN#e7&zFmOU5T&iEULbNQFFiJz+~z zz7xccb&^#|WR0Yo3w%@HqqqTFB*%JXh4gfyE53i^+jq1}{21WV`!~#ey~>lKMj03fAI{&G2~Oo zSKkGM|!d#Ls2^DQ`m8|1Syu zXrJsz`ufvn^517dMgLJIbpFQy-<A8k@U&_`v3{EOl%oGrJo|9(6dHdD z@bURa1-OdU;1>YDFYqyL>1y!nOs$wd7`xE?nE;>s16^?cCjj3F;#Xz9h30P$iyz0X zK3wW>@hO-qEU$o%`#17QR^Cv>AJT0*t>V9*!PteyADti)1%iJeTnvr;i>7n``}5W1 zy93{)2L5-~kY9HO_x<}n{i!1F)J*!pz_+YP{J^)X0l&pek;tP4{HegNiT_K$x2=JH z?O7H3Ki|2FV?g=$1pZ*=Us8^rD=Wm$13vB_SV#Z3hw>@JZWPC?|h%ZDE_y=$MXmKkI!HD49%wy zzwPXb|Nb8Puf>N9I>ZkIzLmuIle{W3q_-3J^!*&l5a{~hpcz(3AAzI~VEC(RLw zoNK^eJ(s)xLH~FL@+}m<={#=yaqQ*bB6(GINN*PKyFvUo_IQ5sEyVwkTrvO92A-pQ z3h{kYD(?S~hkf8vh@T1kP7ptG&^O;bjQDqfPwR(o?C6X5nyDNg{h~~$e;456`Xj#3 z{VN&xc>fQs%YF0h1I2$5_;h~q<)Sa**PCCle^4K=y{bZdOW@=BM=o9pRS{V`@fQQ1 z#t)m&2A@LwLg1T%f9!j8)=z^4B2hStAN>mTp8$M3|A@Q3h|0pKD%2MvXU&py$4=%oIfcV3J?*{&{&Ufu%K*Y}mK0ZI949AeK4dTl# zcP@T(R7H{d%<_@_9~US);yH+VU> zeo$8hE}`)+mf$x4zEJ;{fKUC$^(&OGx`JCjKrNqBI0yI?>c0!{asRFE^G_1+O@WWG zlT9K1i-C{(H}zd;|1DQ?=eLl#kMU8giUlZKAu0wr!$mK z4k>>Zf$vxYev5V7??_b(cMKDkF7%Kv=ecPK2};tFCF;!{Eo`Ff07*Ql@-z}lHgT?W&VC|BmW`5r}4ua@GZpO1bp1TkXxPe!*Ns1_MbH1)AHQT*}19{~Pw{p0rseC-hbH1Ki#VjVA`{9nMw{hN5L!3Li~ z{_QercK)peKF)v4eRb|1J^>%sFUCx37(Z84D1L|S-1`UQqKxkxCjK}A zfGP{|8}H!OZ*|vS5b$lmKaL;10~5M__5mO7KQMOWQ(W+|(n5Mqc5?lvI?ba>$5# zJiccz=`a3`PjbHg3xVGi#*cVH{ntKFGk$O2cbD)lbpHwiejhgf_>P_AIBf&IOAYw7 z4%Y1VOIEyKJ6bE1K%;E z_zQtg{l|U_jlb=oiv5pl3dx^0@Fo2VjekGzY5zgLd}AOz*~9<--+vam|9Jx6m5o38 z$LAnEh5YXaKE6Mp`GfaBdOas0^X~&6&o7EcsQ)%cMIuv)`9pRvmdXn0 z`2!#C-^j1f`|nKPn=${GL%xOlf0u~AI{dI>75gXpCc9O|L3&4lFM0pKHwNO@$*WjD zRr!=`C%z-_>HNfYq4}Q&e98Gob|roN=`-m)0zTcp*ZPyy$ z=MeCR0Urkl`;O1RdA2%kdySjNY^kxU5xAn@t_3;px8L3&N|x%ZDW zZX~ZN2GR=xzB%L%eWMMbZ1@c=$PKg&Vzw1)Wf zgW_KRe4KyepKl(Be*^gV{u%4__&8=d#BY6$%OBP$20mtpKMMF>68RUpe;x&XH^#4y z|1ZGD{^NV2R&Y^VRrP`N6fRV(->Nv0?Zo#4{s{1o`wtcc4yyc1{2bsL1E1L>k z8bD&MUyvPB^e%c7$q7ln6!blzwyP2^Mh=XkIImAmjmAx;z!?jQ64JeVjJ;a z0H5wZs>APhse+F-h0ecCz&C^V@$A6Z)!^b&DE_9Gx%*e-VEiPn$_DBA0KYHzN8h;i zaUSz2#9s~kevIE3h(h;|)`b=K?-)N`dJrqDeYzP-TQr8&FOJ&#uG+=u#@7GO09GAOrVI242LVFJwJ_N+}XK-PW zL^-Ixh6~$2z=id%a3Q}GE-Z+czj7f%)RO}xlq;e#L$ssH^bj#WeE`vKef3-EaS$M?*fBjsJU@oB zx)8*ExG^3dM16PA$Nq^K4-xYk2#EO!WpYHUM>8A`i2R9w$WH)-f1>H|2m3V(E59M~ z=Ybq~DS+r_5g_uHGxWKJp533{M$Gr^qF}V=L zI1d32@ffp{$LvTVijFfmBF>+DKQGn0VE&I0O{y@vl87QzCYMBvOP$I8gcx!|){cn!8m!I-k*^8*h)o!3G1Lac zac|A)Z2<8;r7s}-6Pe;4hBzMPto|p&CQJB(@eKe({Xwig7#pETBE~ZW*IwID?08tbHe{kO!hn3$D^EmS6xE{Ui&7vzZZSUVzqOks6I+-DX8qTh6e%US!M5cM*k9aUB{Jt2sc zweSb~zX=fSZ3RSmCjMcFac_q@;tnQ9#QC}#5P5r<91%b6XLU)$b(05jd^WiRi1scs zJxN4)A(JCw{R*o~BFe8a`JWKmud#MS?B^{&l;37}hv8j7ER`Yh?lC(S-FKje_YL0x(atYGq)I^ru@*yFK=fM|5dMi28L9xHo+=>5)0ovY z0kI%ryB2HL1w=co0nvXOCN}^?y-rNtnbi#eQNJf3{1f$tKj^0)tD6HVK;0e?*QE;} z7Q_~Sv4E&QiOCVs&tyRKKZVIFL)4qfcnM6O52BwLOdk>L%w#x=VIpfs#P%dWlba)e*6M3#%idoo%d+i0zrIE{Q1L4svYT#o8qi?d)c9MD%+I5amah z91-p0GWjuv#~Gdk#Da+VIRl92$7MjAr`K6KBF?)z3?DH$BKmv6>WJv?DXSx5TyFu9 z|Cz}VQSS>Nu2*Srj`Lm-gJ6j5N>E2sW^zRISD)1-5$$M$9R0KaL|1x%$ZyTC4a2s8 zSP=0Ykr5#3_W?8j3<`Beu*JBChF9Sdc!t@Z;pl%6>avLW96QZAitQ`^KumeQ7J;T9(7>5fW7DRlf z8vuy?8x4r_ek>sJ$1$7$i0?3G10p{a5dMi4v-)yC9M`od{0%YgjUY#RTUh&_5aZkm z?HETU(?i7i4pxVc|Gk%l9N5BzdHwIbBsV|seIyn{%*%i8B{3V^`$}9_|Gk&w_O1Wk zOLF`4fA1yBmxt(2?{OLU@Ggu?66N?*FUjTOzxR^d z`B5`|aC?>%MSu>tgZdNAK}LI>~t*%%iXMtKa{Szkiu_qx^!m z!KU%^Wu>M+&q&<3Aici9qdr&LxjWeS9*dnS$aTDT!g&KGi%%0L(A`- zWy-%-!FPL9WIp#iEW7)LVnLG)vzvM8eXn~nJ8_u76jPG}r_@%iYt(+&$hGWKNh>x3Ao z%~gN<>yVu3ir0}ldU`BTGzpG4VAXlugd;Z3=4@s8#WBP0?5N0`3`=>Rl;-)tGR^yK z`iKqc>t^jd;`qJRo-;Pex7~hSnmBZ*??#UXk4J3{tfO$ncJ*rg>%+J1*}1{cz4Vah zoF_A+B*qPYyFf*zi+Fwin0e~ypLAaSl#y5OeCTGrLEV_4J!ZT4b=#>Ncz$=>Q27Zj zZ|!-t@=NH+7KZ5~3hylIp{p0NL(OIWqP}6?<#wgZ=NW!?NJVB!iS&I@e9upVq201q zzF=I~sr_MJKD*CTKQbczyxK{1n||%BUiD7llb_bd3o(d z9(w8WQ{no=oOc~#^-HqWk3IKJb-sV;fz+}IQTDzDAG06beB6G&znE-0(mM0KM$pcVN*x>q96j*7!8q4W zH@{3C!{tF9*M+L2-AOt{5i|261}l2_^gnrH^EihlQ33M%{A~p?ZpfQQZtB%As+Iks!_?E${Oc1_-? zyY%4{&CBhszT0!7pvS=358Zw1E-l!Vk^QMt#2lxsZNC+@ojNJfd38$nyPB_*2OSF> zG^0FT&My8pK2&5fQi4k+UkrJ;F#7QV)5Gspq-|banzZA-$ujwIA**T^il$|3Gg(ry z*l|OT+>EOqBU<))aKSvz!EN<|lFL$~yB@*cw$lBB1{npE38}ZclX(A=o%^m1-+8K? z-Oek^HCMlL`(QG0MyJW$rPWT}acFLOe4nwr+sVQL!<(D4Qpf9#+WB~~+YU6#kTjUVUwLg3xeAJ=z7dUW>UMv@z+f)LkzCha!zQYIci6r zu?Ysc&hk&*_MB;}H2wTd<7vLcb`PU(tEC@B6R(?A@oyLW{Cz{`=f749S&R zGvfM$f_2|N+*9(G9yLtDuH=79EEDp& zeIJru*Rw!YyIp|V%~$h&MjJU@YJ1qwB)#=0S&Mt!eA9X2=_Rs|nBNO`I_DBTYKba;eug4eUKMY&SDcBgIrwrYiX;SuYfYtEjO zu#4}osL0s#cNp3J-bJ&LRpzhr7ik%9FtPIfK}wa)C*qXXW`Whj^5|8o07OEL;5)1}G##_zoK#)z}lJw0?fqh)aJ z`mH`{1C8tpre0_-UY8|RyH>pwlP7IG(eUhd+ZRc9=jlF>*DgBVx7N}8y-iYL21~@- zO44rb%k52^<~$hKbK9$*d)tQQi56a4s@u(RZL3E;q%0P6^Ea8@wehV7$A8W3S+GQ_ ztdp;0hH9@dbH_DxySmkCRZe}$anqBud&_*%l3q5}pO@>MckH#SBrd0T%>6n0a_1$u z-&lUrxb2{n;5J{jFWhI|tO3A8^m&25gxxlhcBTBzUjAya#5_g3Ri@R42j=rTNHw+YrPbwlkafN16D-0K z!>*2da$;NZ;IUWoyobCGksf+${@CuT6Fy}g3UEz$CAqJ+m9*RT*2oiSo67obDC@Z* z`Q%aaw}nQI-!d$hZ(TY2VW&u=*Us80m#^9yo=OYKag3S!XxQ!u(`zF~9Xi_KNAsuA z2?h5g;%z5scX4Fc^tC^mC&p>NJ=#B`&8Kf?in7u#9}9|e@%K-yyI!xGc}ItW$tg2x zPu;6#xx98x>Z9|qSMnPq7vI}(*+VCEnS|Z;l6I9nd)zsd(pPSG_fL7#(l$-AuJg*d zaif7>7aj6Rvg)wKZf>-j&BW(&XYXj+*xG)-UaZhirbA}ku(jt0KQA1baeIY?-42p= zGs{*?D2mSfAbKgkaY=sNVRshz6yANF)xEyE>Hay#jHNBU9lsU5tJJQ$cIO}J(w&!G zF!E_OE2?{^$B9}^=0!apD`8h(((WkDG8r{9(PQ0{WvzR+&Mv9*F~8@6>>isJ7S2sK zK9=(I$?E9ap^DLc+*LWFGe@88QS#QgXATdP9r<&of}naz~q;v zlNN9LvBtR|vAcxbj${;2W@U-dvy_E1_vvjm9{Y0E=oM~eW`#o=Yo=v=&YAaV@v@w> zVPUVkYzv#CxODW1;qT;vU$|I&8!WSIR7U8A=h}nSCGB>SwEHq%_Ikq}J?qFeU9aN<5y|KQv>TQkuG!c=)eFPue>c95;3AWI8jnN%+EZvsLHEeOaz%*-)m|NC~@! zl6G}mQ>8;R?jG;wp?v7*xn}xx7JMptAL70x)M)0crb|BUa`5ZYyWiZwJ9-B8O`SWt z&Zpk@9*^JVIQ~+-PEzx16N^kF>~@v3Yb6yBa%kE2#)CUpzC{2o2k4e# zGAmP)bVH^KF2!-LOFuxCLWUZLQ{}0B?RULwfM*O3ZPWabUmyCh zDQHJ&&T8V z&h_CzM`R+g*1o`O#n^naNz}D254lQYNKuP}{`0A+er*BVMJ_#D-(3Y3;Btd*4S&XD zSgriv5oFGBL9LG9r>~!Wqs;JhNTes~J{G(rrQhD?dLx=ApY!^8ImvtUmLSN{-&QT! zTC%$PR;Jl4UhzWa?J$ckV z`&Tff&=}jSRpC}RO z<+~ymraKf^(0+VRrcA4Cfelx}bCHFw4sso>?Z5!sKlix*1$5!vPurLNj>r2Sa7?t7 zv#9W_)n@8^S6*4E?+TA;FjA~S@?5RzW-=EQ*i532?tHi|XzLYD6<2A@#jbieOPomvHY)bLgv9XrfIwsyQAQsuV(Tg@^c2 zYDDZ!H6|jbR0+z&ptiV&l2tB2Q7RzcKljZ41@!yP$`9rU^9so5Ms`r-v+b!>l2Bsf zmHTO=3ylN4#+;uK@1BI&pCMAITF+`!ussIYTzIYFMB^$53&ZFd8Ylr*=pXvuUue3q zfgCUP_v882CiLqZN$v*JvE%4%pFN1VAbVJfF%o#QY18KXBpMG8ds`H59ZXUJeCeK- zdD6tiNyt%gAOG$f{cQ(f&~;mLdwq%GcDVCkqETXl8EA#~dNBA>6JFn_O&8fMm86w+ zVgc!^>0}JGGz0vXwCgdV9IKh>X3d27Jlo#Ukgpi%a($U!#Arb&Q7uMK8Cg%8 z32ut-`ze(~^|5m0N_H}1YG%$|&Cq(nrm!T*;^u_zFl`0;ZK~C`3dDjzGg-v;Ypvf zx1jYe;?xHT)JL3%i+2p{hxa7j^HP6LcNJG-#Q0b(zkwB>LuYl5iSbY+cYpJ58x z=!~FKOiIO#PfNjhi8SbH_fg#wQwMI@o98Z|q1*~fF;|*5i;c1xl?=U#v`RBn!9)+R z<4~)>p6=TSJ!i&@uwt!DWX~LofHxQ64x{G-@|6KyG@$_IVaHF^Lhi_;1Fpxxxx|Lxw-wzxz1LAvT7yI~ zOYJREKiU2}qS>NH1YEg)=zo8q=}TgG9%azR7*P;I5M_im-we+LzM#)F@a|&&ei!FQ zKBU!qjp+DM=gKcYBQvt4?sbm|gXx2~POm|{*a~DXLHyC71`(u`ZsoaX-{1~E&ZHhe1?->+!=Mf3;wRl|mG15!m7W4uv*E6)i{feX?zb%@_{6X6y1TRa{udOs zdb@JHiqh zDh{>@X5uE)HZ7RD2Mlq4JLr47tp?p*EvuM78Xpn$(5NM+M(+ zN}!9TlByM#cwTrgO(m{D%p!L`wWOXGfe@wo&8pZ1fyI0Ll|F74-k4n42t1Tb{R{if z>Go3&jG&lkZmg_`-u#m5tFp} zUbkx=CW2?M;vF3)QQTBh&l+>MW&3oJI5c#N=yZBE;HrQw`q^EHcG7^3R36=MIyFbS z+rbJ{>K>t9L`=`PXS%?if0BE^h?}e+p6Qg=L~!Z+7Jn9S<9DnUw;On-+tq+kxfG5?=O0mwnlef!1aYX=*Io-v+x!)QftuW4@bNj z=W!+?@i^cvF)PBc{lT(78vl9(iGpT8bFRWa9XFP3sZaU~jO&m({j0`LK`Eq&nVmqs z8lc-2;u5_5v_=-MbtE1(LlH>b>^+q9jY$m4R4ZhZfnDK-%LLuRDIB{cl-{2T*}j(I z#CImubvgqnUw}rU0uOv&Xo4>1PJ~o>R(#$aWnQuoF!UOgP(kdB_+YC+(!}0z-elP4M@*X@M>)yf$-Y9eV0SC09$g zf?e_Qd?kKyKz~za)3XjTNyqlOwRmB6ACT=&=_`M_<{4vA{ZsJmQ+)Qzys@tGym^02*K%hLv$Xllo;R=!%L(F5b+}wG%S%f5Re`Jt10Y{r(B0E?YN{PJu^F7N_@P2V z=_+YFT5jG4abZp=Fc@%Z-@=rm7DQEXw2M7(c>Pnb#OavW;l-gu2Ko0o53ywv<#@o= z16^$HFL_HgT~wL`;@S?i0}jbOVoH!%OT|yoy)isqyJsvT0%qno3|#f7heI1|w@8wl zd{ql0c1)x>XHZ6m#oU0a54xX5iv9V1PBZc*IP0iof1_WwVR?!D(GTVDY;}i^b2Kcz zI;Vxa1g4K(66s{fpsbB{X7r7V?Jw5bO3gi0gadH@%m8#>6l)nN?p~~5s@4P{F{SNp zgnqelZEu0PxH&CrjHXKC^UR)#<$;6~=au-6L#OF} z!7nDfm`4y5b=&F|klzTv{$K>URL3z0av4Gcm~`Xx0#yu^`{W8& z3WFIO#tWr55P*q>wqxZy32 zoE1@4+ZwmmS_PLD49MyC%7pPn(C`^QC?kYaiUtnpilgQH3_tv^An`?Tw)7nV3RqWR z0=g%ag$a8f#|-lHFz%1C5NE=iCfbsJzftD@{+(vS+{%X3`;)@6&(yx%khdEAdaZ<5 z5sI5j{CpD%Zp7)V|Mw&y-w&Wm1KB+wPLdxLlNk6M+8AHY;qDSccNgI`jcTwi9R|q+ zIbi(Ar62G~ZOcieiuOmz`e)oCJA{$rP~7jI!Vd#9_Z^uiqEeb8O|ne$M-;%d09_{)_GFr^zudOdR5MZSKh()d+$|w}%w##+CMSgQFl7Z?OVG{Z zN1l=_hZMn{X zs&YgIJ&L(S(9aNXtw48doB8SDWVi_3qo3GZ)$b&OS?!saN_WSOV}13b(r@Wki%8SO z6zU5NpF=hZkeHj)(v9gV`{h`=H!P(&BP78Ct_|oazYO5b z%ox$Qd13DfThVDWd$2?57{*$)j^nP4PH0|$d_FkFveBMo^~4*@5K-6;aTN3}D%`Uz z)vFD%Y!4?PrPLvguy^B~O_Xo# z+tk7xxvU(ze{>AFsN+%1Q}1ft?;DXk+aJ>Er?jUMrSK{~wd9Wb&pG$MeOi0a^~9DV ze#RH8CofhT2*}EZ{V4>&`086)LBHJ4RK>~hg;Jq_G9C+Zni5rO_U$QJmAO)|pe21+ z=>u&2LJZC(1>ib>uBfUlR2&B$Z%J23GkLCxa)^TNf&d9LnVXw!#QMC}mCa21fv89& zOs-HQviM@-8qVsDG7?JiDQzu!plY!2IN&;hZY6Ktr*&O5Z`&bgsx6sdnl0XEWMv1R z1KPV<79w8AH%RXs!r(cO%j`{@I&-4SmaNR&ldmy7?+TsaX*TWe1pwCxbbSZ(stlZl z&V$~as$DEiYbabehV%HrpS~=-P@fQ6HRZ#}U^N-?NPdo6Fp|{Jas9=eUP98?wA;_7 zw|9sctO~dvL3bRz@lL{H*fdI>MxBxk3;Vtgw>iVmeHv~NLFI)fCtXO*iz%n5o8l_L z!E5{sNJAT%<_~#O(4~PZUSLA-O!|7$DaQoCI97>UXXYvn6IP3ZCGV56xOS1j)Uk94jy}XSsw3xSdKHOLEHwl z!X^mrSG$02UPSR(j09Y3aLI4BRDwRK568T}osvpKl&q^`pF}Qxukt9V5PyqW8zt-F z96D!^`Z}5MP=0lrP;I1RAS&_=tS4{<-QwNWb>2X+SPP1r&UoE#vA;MBdk<@cMpexH zBE!ZW%Z~PKsS}z>Upu^kPGzT{&h)#6y+ZTDNDx)j7cY=f83CS~8|Y?tzMf&;hI`9* zqxl&Qrc{f+zY8atj)Ww0qY6vfX*{4yo#?rI-lSiBe9vr+-u4w@t0>LT2h-ZS@uH6# z1iJ1L}&DzHxL8_Ks$JXF3wK=C{3_g0ri<; zB5(V;8%c~nIfbucqHIFQI}9e?J>Pr;?UL`m3#?qPcfW4r(}c4Xhj9rgS(%>` zfa9+h=+bJdXf%6E4UlyS4MAR-sO`QO!kiJw{BodSrXmyU7m^rYhPe_{5)PLT5P#da zKuix)CElG1XG-K$IU?t#0RE1>LHErt_pwIdcf(GWyukfYpB7!!c95VF`hh(t_?rO;Qfjt&9Z!3T7)KT@4E&~ypyTnNiJ zug|Q;Vi-`E-_Eh~hx#<=`@^o|52a|)3Fn$E-{i>`bw2-;SpR+~#W)WwTre%p;OyuO zxSv7S)AXF;;#-oz0L`R$KofV0-xAw_{{n*7YCfm+d`v;xAi2x7T2MjtO(vy-QiU+hFf%fqcJ!?zcWWisMX|+zzy3 zPn2&nqf30+6xc%LTtxnceTQ&RFM3-m&W-oe@sgj&l9qefWT6cr$uR>80}kSTac1sx zCIGG<=#CeK+^9KUe5?*l^Nu(5)+f$NIHhGT`ugW(6Ltqh)Q9p0t{1b@G@b zx)CA4-syR`(xToM4`@=}nBRcw54yeiZ*U{>jH>xZ64pw`J*2Cp;fAkUQ)7M>;D#0P zepFe5d;3WcxHvn|8$Lt$pvirgn+)6HN z=_~zc+9zAyRJ5nvJM2g81_n52KrCjkSZ6_d^fF!Wcna@^hzcsgiH$O;>crNE#CTu> zZXoCq63#x>zzWbkPBOiK%=og##??V1_Azd_%#@atsh#O%EB$uUYHC(JpZD5GE{E@m zX2D35=4rjrKv`S60{*JN%imDGdInP_cUmI_mg z2(c|OHzP>WX`lDM}Nlrr>xdvmToEPU}%@Np@{AntB98h_>?S z%vFfBP6uVB_v{-1mAIUTkPL8YJ7bd6sg>z6Sq?z^hJh|5<>+I>%5_r}EWbltxEO>( zN^4)l&KL#XUMB&h2=^*I)n_+DrtW?3d5+N}5t$%P>-;q;Jmv^}>hr?IT5){94F}!h z>6#xe-`Gpd*6AcY)TS|a%)YUl#U$v}!Z7Q35KlU3vln>ZQr7j; zNrj(whji$)h(7!fa3et1)A}9x_sU8;hw@*>)lH^MHjyms8-xTeSewZ(Hc3hb*s?3X z3n2a$?-7+^o%Xw#he#8<I2{C0hgy{`H?`b&ZJ4Vu-@#3HHer50rCBf%lRHKvN3Ujc3u=+zCSF1$m<VViE6J^Qwwd+Eyj$)9*_q1^jtvQUuMvR(xi*We!Jg{LeeT7W<2O4zC$7MD> zOe=&LB}4x`pdI2s*VqSJfOM%?*a|VmOmy)?%B{Hh@Gi$GG|wz|Apo#wX$x!&C;<2W8HFXjyTYwu6y2Tp`dMc9&MmKMKloZ|h)sb*FhVU|R zY4&QA(ng`DD|N7jx%gyhohh6KiJcx3rC60;efK`#-g(TQ{J>#U zGS%ppd$9eZ?KRgcT>gv;dYMc1?a*XsB!NNq4zl2lqPkTCKVQ95Ctnzvv$Tt~ue^h#vk_pLc zEk;s`+L>F@DE=^LHK>b1l-^a{jTomAu;&v#L_&q$u9;n7{u^pD90s`|KB<`4RjMa&+-;X ze4$5epS1FfMdT)}_$u@Wc4Wgo%OM?1y?N&uY)^+*hwa+v6Iv(9);iT~I;w+)b+9S# zzIVpmCS2WXn7>*?FM%{PbXpf&nMLVeD^%lRs3Hi(F-`OP5ZO< zb8!7uDpFcWqc~J ziU^`&G0ulvL+gM`caR<)Ogx8B z6nRAAYDw9k18x@R#!P2=buX817`^OOvh`t~U154zJ_Pq<;9@q{-fGyGNOJb&Fx5wi zmhz@9Np)X8uXi=vyPaXONTquHQ;80F3RjvjOw=Du$Rl0m%!CPAK|-?^CUSq zO|{$i4RZRkYOi=N%p}h`<82yeATOQBm$RpjY?Y>+_xdE?V~p0$zXseK&`s2s(MwHo zYqk#MXqmpzLI?`Be{Y_p!-J~Ax@~xmTi;tjHeHH-`^ziwLC#k?X@b&eA0qT>4>##nr^aRnRrjSQ|?r&Q%I*Ox~WwW;kHU*Yx0kPn+Lkaq*|fU;X9pI zqokVf%jd|9m#(J1kIV3i-$fw!vI$L>r&Yu{tr<4dU3vV_v`(~^U210yKPyyb6k}1o z)olaoVe&y2B8A`us$Kf(>Dt)=JvqjXjz>V64L>(z;xiZ4b1(Cp;yfDxgQUKgkOZPh z{$z05$N&^-o(k2wDn3uD%d8|uAm0Mel}GYVr#-j%aR_;<|4`p|GO2>bZK+Rc_T9y1 zq$cV!>39FN;bTLys#c16q2GgIAH|zj1n)laLmoW(XYXrog6ATIpqrV)NBHB#NK|GE z2QxBqtwp3EV#ddcw%gC0F`wj%xv#HusfoxxAeHrYZp&3kjjG02}k?X21z%(TVYB$O>wu3&V&UrETrbKZO+(5OKM+P4^VF-0>eyAf3h+006x zBMV{P=PW+swaY1Ckgdt#x>(qU1t_bt1<>k!xvyB<@49!eiWWrP_gG#Tr&QP{wC;}u z=MN>IYmv$P`cjm&qsqUu+qx`!CjTQv38CnOwrd!9-lY8Ks~mN)xu~OG`;i#zHT(Ea zIfU;?`dn)I#;UU%)`>)A{(d{??>e>=bTK`Dus3@D`i)RcTMBh9Uc#A|TKSTuA*7vM zA`y+yNB!|=aynikBW|U3is7}d@wX)smaLr3dimOmxvB)wL~!4z40Lhj+M3w!hcE2r zM6Y;xl|8uPgfqotDHc9BmXytiM|?kCjefatx)~y$qYQ&qu+i#WWEkv*`2bsq<=kLW zu>g)|<)AC^*mt5%#V;#oTFPhWfohw~kI-Erd`<}>NXI@jU5wb?C<~;1X zm*uvQ9Ytp`Q}X#jJEf>LB#D5z&i>`|j6_Xof;By=QzYQlfG%%g2ET8lcgJ?FmkJjw zKD;uf`KjrZ-Ido@xTvgU6NQmixl>L=@m-~n!}gIFIjDZms+C5x&fo6mZKVUh#1;T< zE$B*``RZrF{0hi!iI-URHm>B;Uthlv4}PVu+9&UPOSIik2Q{(=>pL1i9`^L#r-s$x zMH9{9YEfZLsZqQ(8=)8Sk$a>0l0%M-8o`#%o; z{*D_!mnj=zXC|AFrrz%s-{~>R*5;tk654ONKluVRA0Mgf=<&_3L|cMz;r09y?BcqZ zXugN%Hv@f!g>s1p3Q@v8e1Lo#LAOjVjt%?e;R|6iOGe~jW2!E7wYpu6X+IqLRetY;GK{Dlqrm7 zH8jsFf9p*<BH<^I*rzh=ficjgq?1B!^kv2M-oo8dee~DoDSc17X+@m zn?ZN_>j%`@Lv&$f65K~N+zu^v?rMp2=(qT(fz_f?pVnV2a{SP`$Vm&^gpo{vJ32{7 zH{`WpBhY-qD_)D@HWX?Fv_lK%{tBvb{U!~!GD;~MZt;FuSP0^lHa8LRR(^GSsX-VKIzC5zhF6p&&ZVW+&%v=pnZe+y1>TnL+Fc;@jcR23o!!uHx=$}v}fpR z+w?Lb6{NGjHCqrOLxFrdL02747j_?N^yE6{SBEgM$IgByiDedTs_gGR^+Srh3ujWb zP#%Q9lwm#>1N^x<{P%aou!*JeerKLX6A5O&PQc%B7w9f%KOg4(_DGKyLVtner$u{W zrdo2@Xr!R3t!U61J-5MM-{n4iiIlLf7tqEWW_W(Mr~I&?qM5{eHn1)A`usbPZ#U?+ zg?T6ls9c-#{`7g{-y*~NOQ_`(s*-6VUi+Pj3*2wy3h4>?eWM=Gt<$88U_lDYLFq zKs8CT60s2^GpWvRORMV<0>bR_taRvEhor$P@rV40>KG6NZ z2vHdNY#LO2xG6&w_cW2dGa2vMg)c7fsE&mhMuAQ+VoWW~Fwmff8ay6b&rZ&kt1=rx zE@V>mSzPXXO@j__`$1Q5xhmOyJc2Chje9`v?g1M*CTGQhMjW*19xWo*(+mB5-(Fhg z9!S3ykGms^T=|nT*l(@6+fC2CIeWSvMcOL?cK~!nqmj_Q8p)IjDH>GjduWN6GxyW4 zAWp(Jw(;Lvd`$PmT9LziFoL024RZ0ppDloA$>GsI{aQSfs3ya9O!evxa0fwmbiF^= zWKI^v+92!9WVLL|F~!`gAuK$2+KJhAduP$l$ffdhypT~`sfazVP2p#UD#?d*qopRq zUGDryQ(stcoE!pO&wNO{_ElxP#pBP?hw!FbC#qk!S7~5u`kbE*P=2-`kzb{GwG0?C z?~y5eiQJHOLACnIC7qoga6^1Iw#s}>4CFfuy3@All!uc)tHY5ixQ}&5i7x7Y?6v-y zsLbOo_7v+ERKRREYj!g-h0GFC4&$f}xshAX(=w>_^KA8C^L^`_?+dsipc|9)Okebl ztS*Q=|A1SSEV!@zbP4)F5dC&M0>X?kj)u!F$T_ZsUC8VkC--NVu~Z4CPyEP1OwI0! zU2}U)CE)z*2k823dgH=;6@S}|>I&20F(8@bP0Ghw@X8KNyDQ+@V84?vi@#~fx^pGG z)=Tt5JHc<_@8O|E8Wpz1z0f&`v2kF%#wh4=W<$aC8uKfS%Tq%qVhqBy5@hcc$Zq3#2n; zF=UzF#VjjTbuemK{>ZeV}QWRHUW zYpRyf9Q6qAkm1W>AE(HDoP}SW*5bf(n*iO&0%FF@o!rHNLAZw@vHI_oZ|7FfBi1s> zv;4+p4lT*+LJ=N*!fy~)Y2RE$YF!a?&c|B$-iZ5SmDg>w&AbNhA5VhrGHc+xZOb&1Pxax&e0@bPJ$$HZWbEx{Wm`Vy_SiWg=LXYh+P)sEHu& z6mubDM?x~>KVrh<%n&>=GwHoLfoNQv?o1vM*%6$5JY=gH0pIg8pt~C@N4N3n{=Sj+ zSU7xZlg*T%4w4DsZ66NHS;~z(UZj0yBSpwEuE=~x!n#uNeo9(k&5D<=%x;MtqfuUx zK{=4`Ea-Z;O?bmin}z^-70ixtksl(=6~YEAab?6o!YjB1Wn z%#Zii2N?zyF?s1^0%|CwREaBq`xA6a@S$r?h3-#zh+coth!qRz(&y(^Oy%D*oOfT( zeWkq=Ly{6ZjAM4@OVQ}Zvnu~ve&23_70#vWUi5xpa)QPcaOXgGZ74iA_i>8qA|>po zc^Q(}oLkp)m2o~FQEaE)Ob7Xm9Nd1i8GD_iP*;^=@NSz0&e5r zIqy8^PGYKDlSH)}vytFvzRH!?HEnh-^3a^Pvi~A5yjCqU)VJbzdxk? zAz&=A9eIxS0^+z~O`7K=3y|*u=pH-#=PldcgEM1cb5*!*Rv1Ch9qM&^K#=P`{6fW4dScN-;ZK7=H9Npv z0^JW!5_6?Ci?~y5)pmlWYHvg!dr))l(W%&2DTmSK^V{2m3}1Y3}Z&7!|UrqoeMrbGnLM zLTHme?l9)7Z5rZ=nAKS|Ra_SH?2rgP`DL+Kxwl{)=?dt=zJk6pSQv&dm}gcqnCZYe zg_wrkeUByl&0%ckBjY4T$S3W&1^lf-5|^U=vShBP5Jn$pcK!}%e+}bT?`&Mbb@wXh zmSQoH^H@L)-(zisn1;T+wZ|>)I*dgfk-8vD@9qt>ps7Ipc{i1$69487`u-P7-pEK6 zsv|Pjhp#UB5!P)}w?I3rfo|6|IqY;G*Y_4_Hj9#H*?DfRU9s0_?#*+)nhdo<5^9sI z3Pm%Cnc8bow*mqaC!{2SGB7>enkUFX!KVtGxjz7R9duplnD2JX6N75e?FWp4+HFwP z^c=!@Q@)z0oUj;F7Vuw2w-vtULJUUW4kX5kbg1?)In&tZQuIhSJ3h2E&^ia)4bW}M zXnL%Bks!|FMTAQGmi_|-L)2i+jRS< zD$R&Js{<=W9g}Q;y9v6Ho#eywE<=<(qMJv$^S<OMI`AG+JnB7d~K%N#5Mog(Snf zOMDq`b3Z98zbs@EF4c2!|E|neIXQwfNjH23xLcrmT&Eo-X&d!GPXbkA*UMo!vUVe3 zw3O?EM9FbQF>o?Y^TGFZ_IF2kj(r;^@5bMZT25E<+J7vZs(TQd;;608rV*x+*rElz&cR4EyI^^L`8A}Vlfej6*dfFiU zly%ek0VCzvn|ooyrCNWQPCU{pgE+_52Eg3~-CE*>$pKBKgx8vH-sBt=d-1VxPaki{ zCCkXziqIi*3wTa#;(s-rQ$y}n^xf{?BZ~OaTn=}2;d6uX?4=oj*$23LpnK5b{cdG} zm%$8o#Nn7v6ik=1XJpf(ZM{3QJn5v_Vm&5IlS=ynL_^BzD`%FHC zCuhe2V-L|1fpt(QlJ-`I9bEKj&4u%td@IV&-G+*#$hH$S-%qgs_Yid1#{>oEf9Y|o zlcrq9H=1B)L&|Pr2)oV(=s`eTnejfev?G=kN8?=iHKx2|ks(w}jASU`Dz=kBO>9Z! zV^{|3OO8O-yt%)gpex*4!Xwa`c=q-EQ+&jCa|isy{q!wLs1o_tdYCjFoaIb2e0T!+ z;?p-e%?CZB)k~TL$uI%k+nr?KI^Y;|ecYpO{8?`VKKtW*C!P`crGu25ErKAwhP*$- z4hy@3&&*dTLnk0WI4WVV^k{GN_V;TGWHJ(zqB6A~ToCM@>p(l4fbNbhwNSBlS-ket zI83AC$8B#LU4YQT=Y=P;E0l#Ty4CT`?-EOyNr9_ZOm8|Z7Y7;+=zzth|zXh7v1sc z`~9oWu2kzr1nPS&IF`z4g7sis+ZpI4(O2`IP=*(@D9WBd(*tkqP3 zD|VtaEW*^|V~S6mR`<8zWbl1)3A)LXWed#eRH&#Y@fp@L#3<88^b?ZKw8WLZf`dX; z)(|*Jz9R$w-7c&XbM)#-{O{!ZEZPYBb=sb#Y*?M56PF;+4p*S-7E&v0V53y2_Q9~$ z#fO*Mfca;E*RQw@9xYC|`b|x$ez%GI?c>*)#mzgSfxhn|+&ke>g}g|qru;6XujfQe z0QVYnVf&M>{p`;nl{)I7PF`z{>P4&YV!m{IR>X3nFQ-ruvq0>L)I7?y_6@z8Rk6S} zBIFDg_Q5N**d0Ibv^LfI`<*iA7oYz#Z$P*4Q9U-hSlw8acr|;WqopYPZMT)8O*fg2 zB0ejPiD<{CJH3L%;Wz#SFW}z!CGXa@L{fWb_bQjS`w`!q<3p(aFWinOp0japuGZt)?QKJ@hlvOQDHS~Gt@J8GUZ&Q?ouBtYCqc;GCBPyW)=hLEC7 z^^kY9B-m)9^*{ITclK^USKT&qjArZ`q9}|WrGpXa8Syv?1^4$&9@r?y=o;_p!cZCl zDHYy#P6Zn%I{8f;Q%DiSTcKZ+Wo+t+dTLB<|Gtm^=6eUa1B5mP!eYgduQ@E3OVje} zT9}WfI-p+5>%LPD_5W~9t+xM_$a7=z_q(3T;#t_)!5d2~R2VKoOeCf}2oWcu_W$Mk z0{-)V<~`_YBafm(2;;pLC3vrS>K38g5qV)5&fc7gzlM7CZs*5%bbPXEov9hGZhLtV zwlGsN(f%fnrOijp2(M;)2O0mr^U1&8BmE7!n=r|zm!(o)-*cCYR39sQ(3-Tg3=Q%X zIi3y6#nVl2GF|O$7zUIbI&ENSPBo<*i2BR7cJk>KwO{Y=1uwt)yB_-MK7g);I$v5K z(y_)@@ux{1#|H5f^^tX=r#!ZIsEP~s>bAZeus_Z&ev4Hr#*LlW&{42yO2s8(scMU% zJHJMJw`Gd^|Mmyy|IA0wB@?0&60av(Xz#Fxgu^PW*7gn`!d|gr>Y=^TP|2dCWqRso zy=Ura7Lw*DbU8qr=zoK!D~{kaUxjW#L^cNTxBtHQ-}e#!J2&~ifJS{(gtp?8Sa;7(+L{HDA{E!t~4aMXK=+5m|%T62}qzDhM~yv(9-cP62tf?4zm=bUa$JLGIh#Uo9+{htA!g%jQe1uOD)p?>^CI1cq*77M z`d1;#Em!6Iw+8V^m@kPPU#8-6CyjijVZyBe_rHRW{|jguQg)fi~*^-s$W*F}C*yvZ{o~m)T=;q6OCT6-qUti*DaDX3gkFzgqvG*R+f` z9ijVg(=#F<>)b~X02dN;#j4$&cmnLFMC>`-a(~99V-7xeuxaX|ojNbws^4ZX9a0G< zTQCOW(?l|fnZpD;C8?Gqx$&+L50&~9`e)#@0WK8i=G&eiX}TuA@@$6PFl~UZCSy`3 zR7v4FJC=f6ma4Ben=TnQjO!vB5J5}I@w9|ki{fEC5MU7!*Y-rUm4;450$ga&CDk2m zk(^}Xv~qFR+#DQ^5fp{0B$-Va`%x4fn9$<%QQNV&<~#pP%f^H6eR$zBJex6k9Zj+M z8>_PZld~v#X2693-5NK;y$S*w8^f(RyrU^Sz511@<6M$J#OuJ%*KY@!&So=G&3{a& z6y~f>tXOe;Kx_%>X`;L-CCkTSE@`0EM+00~&=p|dCv7IPnlGz)toGGiVNB%t@_O3g zV&*|?ipS>NLIDd!P9ThoT=>d8w(lBc zoDOreQz`A#4qj;*O&@1Y`LNW5>R74z`^CEd83l5CI^tpcltueW}P3@VJ{yuH%vLFdJ zZUCDX>M1FUg^SS>O=?lesfx!$tz8{bJ>(@$lTC7DRCV?C11=&KMPq6SEFy;76yPF) z?m4M~E!tH8n#1rX6j?%COb-;8x~zbwiF(g{rrIr7icYcn@hcsjthX~%gL+iy-wx_z z+FZ+d@N(l_n@Tq48UgoDpZgckEd4wkE;)s>Nn>hN`}Hb=ky_qpwhJwHj(PAaCRRqm zUoPtE{eN&qSXD+&KHb(f71K@*;ob;eTyPGj-)TdG>x)0N8~*}YYy9UV;s&fncn(nx zUI3T0dY1OKlFj)csaCug3W_b-n9Kg=vBD9perdn3L=+{Y`7x(aAok94p0?;gtCFM? zkS_}8dToa9sl`?l_q@RKapjt++NhT8IKIvK=1O=cEoOGjUpP)zq1MNR1 zg37at6z+HCNJC+S@>>zjK)^)>T@ii0BE`;?v2G88e5jwbUj`=+Ir8DoVE6Un7tphut}F(+lsO6zzkC0Is|L{6_u-v~ruyAZI}{p~$=O ztUOcR`iRyf{2v|Xjd(}T7#eFnj;5oJO!2&*ET zf#*1X&LsZ@wDrp41%$q^PemBY#3@~$CSGCba*?<&g%bDnTAbOMJZ%4~&03pY+bVd{ zi0#W;t4>*XS1P+Oe?}g*TW0AQaNU9dx`AIM4D;}}4s1C0cLxx*h{^fQY38Rp;ZfKb zXUXtwn4kMXt$!&C@6y$oR4gMIiQ1@^;n-X%&3jSEMU+549Q|kgs~f}w-5%Oi=9dG% z&xZu2%_P?sDA+AAQ|pzGTi-}N;!$x^dk*q6b47;dlcI^B1Cbx47Hrzys5!h)Om8|kiowg2G>rdkluS4#tew&rGgmQR=W zB=_-hRA?g5m28 zXu6_)?%1Nw+YDRye7n|p2z!<748*jW^gE%YFBg3-(tT>t-q}{(bQKw1 z9;Qy- z{NxT%F^JZ%OnmAD#c8S=Epc%f*`Y@^b-d!Apj&Kq|KCOc-~JeoFCpljwBZPH7jaz) z#MoQqUXP`t=8b;zSYkQ2{jk2Z>0uf^!B-F-(exE|qqOe0vRb7#no)OVi5)K#72!Zr zCnNUHob2CoBLZEeh8NJpjW*J~F9`4xw+5i4e|Fs*DPMcYC1j;EB6u}12jka-Fd6ht z`6<(Xb?aY#jm8s+Agf(;BI8rD&4Xy5ZrRt zOKO?+U=9tX)oH=1`A1vT7@UcYVDfJI zjNgJAaBvgib*6-4QP-#^3o5bssA-XH*~2MTMZxhmH}}DCfj+kE|7{Z9LWAW$o6Ydet82vKA4(ZBML zqB8a1L^-IhwM1qA+MT628`0Aef0Xpa!{7Dh-}MkB=r-3*lFSlA1QS@-Uk$MHxxkRV(hA2Zkp=Rc;dg@#6O0;qX&Fg4eTd?2fxuwJ z=l6J6dCYM=wBOzVE;Z;j&Aow$%6ji{dLqJSQL0@66JaL=7feV8eJUUj8x`xngS$s) zTh&b?SPS>zwux)-LFHOP-s%SWC_?fFRhTWfE~Ek7=_!$#lJc@UY@6-AbtVLCL7SiR zja#1!L!Q|*8r-t4Qg+`_ck~b4dToA>;CBf=d#<#pf70q@lni!9vQUZ|=k+h3 z_jjzfTDY{vzgB+wcFho|%tTl$Egtq+RYsuCvdDk`=)~^*r@8;G-h5*If2g{vs5+Wp zQNYN?-QC@t1b5fq1PSggL4tem5C{&z9fG^NTX1)`;E=%mS!eBg=F}5U-zs`$x~pqu z�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 i15JMlsdmg5og+DxAZ>Mw02?mo$M(M>&c9S0i( zF*&evZQ|gstOG0i4}SwS1DYSvBd7;UtbT9OTireS>`?wF)sX3nsnkP=qg0bnr=MA>=b z1DU)6B97{$b4gm`FY#L~wyT%(q+PYNDg+}ycXF}CML0R%k?52&Zzhn!r(BAO3cdm5 zZUW!}fx;s`E>vi(U>}Tyk9?H`Vl9PWXpci08}0`E zQn1$PZs>GAz@!vOU+ba4LVP97{lpd=PZ3=zx23V6kiV!^&hvbM?wg^lycna@+Tqn@ z3eP#aReTO~zFo}YUG7Q@V2H*6xC2+{U?aCwK756&KsVMl&%s~bh$WQ^SB+p1T!eF! zN)H&oA^kj?pQoJ?^C5u*3lSSiKa&(Nq zZ54xx1#&{o0x3LfiJ2A}sTmFpg2dv|8I%FOt0^TiKgx8kRI~+3@$pB zpD06uxX93Z7y4zWDsV&|6zo28VR7N&fSCb)AjMG;Jj2>H`MDc)N`T||pY3an05@jxa*Y9DZwH(<+g$sqf17XguQBGY1L z1Ezwmw62BaatE}$X=G2Q%1kmqdMrm?R+k?y$!j4LPIeehfqcSfVxaA1 z0#)yY$JMw%bnv62&ZZ7jQCgdi9SSXDt#f?~sV*?t>8`m`sTQ!XA zQVKrkbedLYw| zJN6NY4u?`l86c(`H_eWut0M}E7*XOHirpgBLnd-GM^n>4D*k$nXb&9Zq5+^un^w`i z$X+}Bk~^?rd?nqCnhcl+`Gav6%tzf>3kZv_!O9L z;sj#R01%Duwm|hwwFEU^Qndr5JAD&0+*jr!u8V;Wp+#cSDoCg)h!n*~J$w^PqCpE( z&V-YM3>u_GIB$pp+KF7wcp0{u4aC&fXj)hiLzqG#&QVhJUHV5Rt&PYYEL>8lO0Yq8 zg0#q+A+f~SQy(3wXOIx3F{L;&;spjk!h2!dxUg1qsDbE2#vrPaP$0+wVu2J;sb>8x z7(5Y#$l@pwm8v?E*LD2kb7Xo|G7n(7BWz?kQ;gFG1=AT_gGp7<;XWQ6$$|h4P^KQ| zbNMWY5B_Za%;zV0KO@lpzm@@&pv zOLQn|ApvSwZbC>tPOQEtE~xq5VX4*VrQ)bl$XE)Azv*IHK=S4Dge&kMmG~{r-1dRe zK`1I2^yGmCih;JJvsNWXdu?dN$i!qsZj=y_%FP%z1`1_$qS_9t@DW4+9&(k()eTJ^ z5poBih*ah%PBs1EeB#I#-)Gk+&fF(D>2eO zpaWteAEgFjER>pH5VE&K!i|K>L&b@aYED-97iPpN8mL4i!+PM$m@MBW99>T2v5PDj z;u|NmGLQ^@Z~?ejkCGd+d5uN(Bfh8z22ieB^YN|HY_SzUyL>{Oj2BPhmr(qKQ6YZ< z>8`vemnJ3!1bnk{!w~IH9%B%;nhkV0JGXs9HB%ri321Jq>_^7wET3)^K92LqCMQna zm^qh8YP+~TU$V0}Kurwt1J>c^n9F_1I(9j~`%pf05WM1QDRys8WMIER|bm=@XjaLzL z9S}={`!$~_td#TEgx8YpG+s23P_hwiT1pm$NM&t(57DgV6|JCmO(-!`&Aj8UmAO z2!opYSYsJ0tnw5~T;FXV5mjSQib@7=V`|66ji1sh!E^+l5rYW_G56V`%NS{QnYrO4 z39)A>c-0TKX~{{Hp;jsdFd!%~CeG8La0&OWn2e|8 diff --git a/components.json b/components.json new file mode 100644 index 0000000..ffe928f --- /dev/null +++ b/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} \ No newline at end of file diff --git a/components/AddPackageModal.tsx b/components/AddPackageModal.tsx deleted file mode 100644 index a1b0be4..0000000 --- a/components/AddPackageModal.tsx +++ /dev/null @@ -1,59 +0,0 @@ -'use client'; - -import {addPackage} from '@/app/actions'; -import {RiLink} from '@remixicon/react'; -import {TextInput} from '@tremor/react'; -import {useEffect} from 'react'; -import {useFormState} from 'react-dom'; -import {toast} from 'react-toastify'; - -import Modal from './Modal'; -import SubmitButton from './SubmitButton'; - -const initialState = { - errorPkgURL: '', - success: false, -}; - -export default function AddPackageModal({ - isOpen, - onClose, -}: Readonly<{ - isOpen: boolean; - onClose: () => void; -}>) { - const [state, formAction] = useFormState(addPackage, initialState); - useEffect(() => { - if (state?.success) { - toast.success('Package added successfully!'); - onClose(); - } - }, [onClose, state?.success]); - return ( - -

-

- Add a new package -

-

- Enter the URL of the package to add it to the CachyOS Builder. -

- - - - - - ); -} diff --git a/components/AdminShell.tsx b/components/AdminShell.tsx deleted file mode 100644 index 00287ba..0000000 --- a/components/AdminShell.tsx +++ /dev/null @@ -1,182 +0,0 @@ -'use client'; - -import { - getAuditLogs, - getPackages, - getRebuildPackages, - getServerDetails, - getUsername, - logout, -} from '@/app/actions'; -import {BuilderPackageDatabase, getRxDB} from '@/lib/db'; -import {useLogoutShortcutListener} from '@/lib/hooks'; -import {BuilderPackageStatus} from '@/types/BuilderPackage'; -import {RiLogoutBoxLine} from '@remixicon/react'; -import { - Button, - Card, - Select, - SelectItem, - Tab, - TabGroup, - TabList, - TabPanel, - TabPanels, -} from '@tremor/react'; -import {useEffect, useState} from 'react'; -import {toast} from 'react-toastify'; - -import {parseAuditLogEntry} from '@/lib/util'; -import {DistinctAuditLogUsers} from '@/types/AuditLog'; -import AuditLogs from './AuditLogs'; -import KPICards from './KPICards'; -import Loader from './Loader'; -import PackageTable from './PackageTable'; -import RebuildTable from './RebuildTable'; -import Statistics from './Statistics'; - -const list = [ - { - text: 'Package List', - value: '0', - }, - { - text: 'Rebuild Queue', - value: '1', - }, - { - text: 'Audit Logs', - value: '2', - }, - { - text: 'Statistics', - value: '3', - }, -]; - -export default function AdminShell() { - const [name, setName] = useState(''); - const [server, setServer] = useState(''); - const [selectedTab, setSelectedTab] = useState('0'); - const [filterStatus, setFilterStatus] = useState(); - const [db, setDb] = useState(); - useLogoutShortcutListener(() => logout()); - useEffect(() => { - getUsername().then(x => setName(x)); - getServerDetails().then(x => setServer(x.name)); - }, []); - useEffect(() => { - toast.promise( - getRxDB() - .then(x => { - setDb(x); - return x; - }) - .then(x => - Promise.all([ - getPackages().then(data => x.packages.bulkUpsert(data)), - getRebuildPackages().then(data => { - if (data.length) { - return x.rebuild_packages.bulkUpsert(data); - } - }), - getAuditLogs().then(data => { - let users: string[] = []; - if (data.length) { - data.forEach(log => { - if (!users.includes(log.username)) { - users.push(log.username); - } - x.audit_logs.upsert(parseAuditLogEntry(log)); - }); - } - return x.audit_logs.upsertLocal('users', { - users, - }); - }), - ]) - ), - { - error: 'Failed to load packages', - pending: 'Loading packages...', - success: 'Packages loaded!', - } - ); - }, []); - if (!db) { - return ( - - ); - } - return ( - -
-
-
-
-

- CachyOS Builder Dashboard -

-
-
- -
-
-

- Hello {name}, welcome to the CachyOS builder dashboard! You are - currently connected to the {server} server. -

-
-
- -
-
- setFilterStatus(type)} /> - setSelectedTab(index.toString())} - > - - - {list.map(({text, value}) => ( - - {text} - - ))} - - - - - - - - - - - - - - - - -
- ); -} diff --git a/components/AuditLogs.tsx b/components/AuditLogs.tsx deleted file mode 100644 index 4efded4..0000000 --- a/components/AuditLogs.tsx +++ /dev/null @@ -1,379 +0,0 @@ -'use client'; - -import {getAuditLogs} from '@/app/actions'; -import {BuilderPackageDatabase} from '@/lib/db'; -import {parseAuditLogEntry} from '@/lib/util'; -import { - AuditLogEventName, - DistinctAuditLogUsers, - ParsedAuditLogEntry, -} from '@/types/AuditLog'; -import { - BuilderPackageArchitecture, - BuilderPackageRepository, -} from '@/types/BuilderPackage'; -import {RiRefreshLine, RiSearchLine, RiSoundModuleFill} from '@remixicon/react'; -import { - Accordion, - AccordionBody, - AccordionHeader, - AccordionList, - Button, - Card, - Icon, - List, - ListItem, - MultiSelect, - MultiSelectItem, - NumberInput, - TextInput, -} from '@tremor/react'; -import {useEffect, useMemo, useState} from 'react'; -import {toast} from 'react-toastify'; -import {MangoQuery} from 'rxdb'; -import {useRxQuery} from 'rxdb-hooks'; - -export default function AuditLogs({ - db, -}: Readonly<{db: BuilderPackageDatabase}>) { - const [pkgQuery, setPkgQuery] = useState(''); - const [distinctUsers, setDistinctUsers] = useState([]); - const [selectedUser, setSelectedUser] = useState([]); - const [selectedEvents, setSelectedEvents] = useState([]); - const [selectedRepositories, setSelectedRepositories] = useState( - [] - ); - const [selectedMarch, setSelectedMarch] = useState([]); - const [pageSize, setPageSize] = useState(10); - const auditLogCollection = useMemo(() => db.collections.audit_logs, [db]); - useEffect(() => { - auditLogCollection - .getLocal$('users') - .subscribe(data => { - if (data) { - setDistinctUsers(data.get('users') ?? []); - } - }); - }, [db]); - const query = useMemo(() => { - const searchQuery: MangoQuery = { - selector: { - ...(selectedUser.length - ? { - username: { - $in: selectedUser, - }, - } - : {}), - ...(pkgQuery.trim().length - ? { - 'packages.pkgbase': { - $options: 'ig', - $regex: pkgQuery.trim(), - }, - } - : {}), - ...(selectedRepositories.length - ? { - 'packages.repository': { - $in: selectedRepositories, - }, - } - : {}), - ...(selectedMarch.length - ? { - 'packages.march': { - $in: selectedMarch, - }, - } - : {}), - ...(selectedEvents.length - ? { - event_name: { - $in: selectedEvents, - }, - } - : {}), - }, - }; - return auditLogCollection.find(searchQuery).sort({ - updated: 'desc', - }); - }, [ - auditLogCollection, - pkgQuery, - selectedUser, - selectedRepositories, - selectedMarch, - selectedEvents, - ]); - const { - currentPage, - fetchPage, - pageCount, - result: auditLogs, - } = useRxQuery(query, { - pageSize, - pagination: 'Traditional', - }); - return ( - -
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setSelectedEvents(events); - }} - placeholder="Filter by event" - > - {Object.values(AuditLogEventName).map(event => ( - - {event} - - ))} - -
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setSelectedUser(users); - }} - placeholder="Filter by user" - > - {distinctUsers.map(user => ( - - {user} - - ))} - -
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setSelectedRepositories(repositories); - }} - placeholder="Filter by repository" - > - {Object.values(BuilderPackageRepository).map(repo => ( - - {repo} - - ))} - -
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setSelectedMarch(arch); - }} - placeholder="Filter by march" - > - {Object.values(BuilderPackageArchitecture).map(arch => ( - - {arch} - - ))} - -
-
- -
-
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setPkgQuery(value); - }} - placeholder="Search for a package" - value={pkgQuery} - /> -
- - {auditLogs.map(log => ( - - - -
1} - > - x{log.packages.length} -
-
- {log.username} performed {log.event_name} on{' '} - {log.packages.length > 3 - ? `${log.packages - .slice(3) - .map(pkg => pkg.pkgbase) - .join(', ')} and ${log.packages.length - 3} more` - : log.packages.map(pkg => pkg.pkgbase).join(', ')}{' '} - at {new Date(log.updated).toLocaleString()} -
-
- - - - Parsed Event Description - - -
- {log.packages.map(pkg => ( - - - - Package: - - {pkg.pkgbase} - - - - Repository: - - {pkg.repository} - - - - Architecture: - - {pkg.march} - - - - - ))} -
-
-
- - - Raw Event Description - - -

{log.event_desc}

-
-
-
-
- ))} -
-
- -
- {currentPage} / {pageCount} -
- -
-
-
- - - isNaN(value) || value > pageCount ? null : fetchPage(value) - } - placeholder="Page Number" - value={currentPage} - /> - - - isNaN(value) || value > 50 || value < 1 - ? null - : setPageSize(value) - } - placeholder="Page Size" - value={pageSize} - /> -
-
-
- ); -} diff --git a/components/BasePackageList.tsx b/components/BasePackageList.tsx deleted file mode 100644 index 90cfcc1..0000000 --- a/components/BasePackageList.tsx +++ /dev/null @@ -1,67 +0,0 @@ -'use client'; - -import {BaseBuilderPackageWithName} from '@/types/BuilderPackage'; -import { - Button, - Card, - Table, - TableBody, - TableCell, - TableHeaderCell, - TableRow, -} from '@tremor/react'; -import {useMemo, useState} from 'react'; - -export function BasePackageList({ - packages, - title, -}: Readonly<{ - packages: BaseBuilderPackageWithName[]; - title?: string; -}>) { - const [showAll, setShowAll] = useState(false); - const pkgs = useMemo( - () => (showAll ? packages : packages.slice(0, 5)), - [packages, showAll] - ); - return ( - -

- {title} -

- - - - Base (Name) - - - Arch - - - Repository - - - - {pkgs.map(item => ( - - - {item.pkgbase} ({item.pkgname}) - - {item.march} - {item.repository} - - ))} - -
- -
- ); -} diff --git a/components/Checkbox.tsx b/components/Checkbox.tsx deleted file mode 100644 index d358335..0000000 --- a/components/Checkbox.tsx +++ /dev/null @@ -1,60 +0,0 @@ -'use client'; - -import * as CheckboxPrimitives from '@radix-ui/react-checkbox'; -import {ComponentPropsWithoutRef, ElementRef, forwardRef} from 'react'; - -const Checkbox = forwardRef< - ElementRef, - ComponentPropsWithoutRef ->(({checked, className, ...props}, forwardedRef) => { - return ( - - - {checked === 'indeterminate' ? ( - - ) : ( - - - - )} - - - ); -}); -Checkbox.displayName = 'Checkbox'; - -export default Checkbox; diff --git a/components/ConfirmBulkRebuildModal.tsx b/components/ConfirmBulkRebuildModal.tsx deleted file mode 100644 index 1990e75..0000000 --- a/components/ConfirmBulkRebuildModal.tsx +++ /dev/null @@ -1,58 +0,0 @@ -'use client'; - -import {bulkRebuildPackages} from '@/app/actions'; -import {BaseBuilderPackageWithName} from '@/types/BuilderPackage'; -import {Button} from '@tremor/react'; -import {useEffect} from 'react'; -import {useFormState} from 'react-dom'; -import {toast} from 'react-toastify'; - -import {BasePackageList} from './BasePackageList'; -import Modal from './Modal'; -import SubmitButton from './SubmitButton'; - -const initialState = { - success: false, -}; - -export default function ConfirmBulkRebuildModal({ - isOpen, - onClose, - packages, -}: Readonly<{ - isOpen: boolean; - onClose: () => void; - packages: BaseBuilderPackageWithName[]; -}>) { - const [state, formAction] = useFormState( - bulkRebuildPackages.bind(null, packages), - initialState - ); - useEffect(() => { - if (state?.success) { - toast.success('Packages added to rebuild queue successfully!'); - onClose(); - } - }, [onClose, state?.success]); - return ( - -
-

- Rebuild packages? -

-

- Are you sure you want to rebuild the following packages? -

-
- -
-
- - -
-
-
- ); -} diff --git a/components/ConfirmRebuildModal.tsx b/components/ConfirmRebuildModal.tsx deleted file mode 100644 index d9c5b85..0000000 --- a/components/ConfirmRebuildModal.tsx +++ /dev/null @@ -1,54 +0,0 @@ -'use client'; -import {rebuildPackage} from '@/app/actions'; -import {BuilderPackage} from '@/types/BuilderPackage'; -import {Button} from '@tremor/react'; -import {useEffect} from 'react'; -import {useFormState} from 'react-dom'; -import {toast} from 'react-toastify'; - -import Modal from './Modal'; -import SubmitButton from './SubmitButton'; - -const initialState = { - success: false, -}; - -export default function ConfirmRebuildModal({ - isOpen, - onClose, - pkg, -}: Readonly<{ - isOpen: boolean; - onClose: () => void; - pkg: BuilderPackage; -}>) { - const [state, formAction] = useFormState(rebuildPackage, initialState); - useEffect(() => { - if (state?.success) { - toast.success('Package added successfully!'); - onClose(); - } - }, [onClose, state?.success]); - return ( - -
-

- Rebuild package? -

-

- Are you sure you want to rebuild {pkg.pkgname} ({pkg.pkgbase}) ( - {pkg.march})? -

- - - -
- - -
-
-
- ); -} diff --git a/components/KPICards.tsx b/components/KPICards.tsx deleted file mode 100644 index dadb075..0000000 --- a/components/KPICards.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import {BuilderPackageDatabase} from '@/lib/db'; -import {useKpiCards} from '@/lib/hooks'; -import {BuilderPackageStatus} from '@/types/BuilderPackage'; -import {Badge, Card, ProgressCircle} from '@tremor/react'; - -export default function KPICards({ - db, - handleClick, -}: Readonly<{ - db: BuilderPackageDatabase; - handleClick: (type: BuilderPackageStatus) => void; -}>) { - const {kpiCards, total} = useKpiCards(db); - return ( -
- {kpiCards.map(kpi => { - const percentage = total - ? parseFloat(((kpi.current / total) * 100).toFixed(2)) - : 0; - return ( - handleClick(kpi.type)} - > -
-

- - - {kpi.name} - -

- {percentage}% -
-
-

- - {kpi.current} - - {kpi.total ? ( - - /{kpi.total} - - ) : ( - <> - )} -

- - - {percentage}% - - -
-
- ); - })} -
- ); -} diff --git a/components/LoginForm.tsx b/components/LoginForm.tsx deleted file mode 100644 index 83a52b8..0000000 --- a/components/LoginForm.tsx +++ /dev/null @@ -1,121 +0,0 @@ -'use client'; - -import {login} from '@/app/actions'; -import servers, {defaultServer} from '@/lib/servers'; -import {Turnstile} from '@marsidev/react-turnstile'; -import {Select, SelectItem, TextInput} from '@tremor/react'; -import Image from 'next/image'; -import {redirect, useSearchParams} from 'next/navigation'; -import {useFormState} from 'react-dom'; - -import SubmitButton from './SubmitButton'; - -const initialState = { - errorCredentials: '', - errorPassword: '', - errorUsername: '', -}; - -export default function LoginForm({loggedIn}: Readonly<{loggedIn?: boolean}>) { - const [state, formAction] = useFormState(login, initialState); - const query = useSearchParams(); - const redirectTo = query.get('redirect'); - if (loggedIn) { - if (redirectTo?.startsWith('/')) { - return redirect(redirectTo); - } - return redirect('/dashboard'); - } - return ( -
-
-
- CachyOS Logo -
-

- Log in to your CachyOS Builder account -

-
- - - - - - -

Beep boop, boop beep?

- - {redirectTo ? ( - - ) : null} - - -

- {state.errorCredentials} -

-

- By signing in, you agree to data processing and privacy policy. Your - ip address and user agent will be stored for security purposes. -

-
-
- ); -} diff --git a/components/Modal.tsx b/components/Modal.tsx deleted file mode 100644 index 7c2bfb9..0000000 --- a/components/Modal.tsx +++ /dev/null @@ -1,38 +0,0 @@ -'use client'; -import {RiCloseLine} from '@remixicon/react'; -import {Dialog, DialogPanel} from '@tremor/react'; - -export default function Modal({ - children, - isOpen, - large, - onClose, -}: Readonly<{ - children: React.ReactNode; - isOpen: boolean; - large?: boolean; - onClose: () => void; -}>) { - return ( - onClose()} - open={isOpen} - static={true} - > - -
- -
- {children} -
-
- ); -} diff --git a/components/PackageTable.tsx b/components/PackageTable.tsx deleted file mode 100644 index ea0c0a9..0000000 --- a/components/PackageTable.tsx +++ /dev/null @@ -1,537 +0,0 @@ -'use client'; - -import {getPackages} from '@/app/actions'; -import {BuilderPackageDatabase} from '@/lib/db'; -import {getColor} from '@/lib/util'; -import { - BaseBuilderPackageWithName, - BuilderPackageArchitecture, - BuilderPackageRepository, - BuilderPackageStatus, - BuilderPackageWithID, -} from '@/types/BuilderPackage'; -import { - Menu, - MenuButton, - MenuItem, - MenuItems, - Transition, -} from '@headlessui/react'; -import {CheckedState} from '@radix-ui/react-checkbox'; -import { - RiAddLine, - RiArrowDownSLine, - RiArticleLine, - RiRefreshLine, - RiRestartLine, - RiSearchLine, - RiSoundModuleFill, -} from '@remixicon/react'; -import { - Badge, - Button, - Card, - MultiSelect, - MultiSelectItem, - NumberInput, - Table, - TableBody, - TableCell, - TableHead, - TableHeaderCell, - TableRow, - TextInput, -} from '@tremor/react'; -import Link from 'next/link'; -import {Fragment, useEffect, useMemo, useState} from 'react'; -import {toast} from 'react-toastify'; -import {MangoQuery} from 'rxdb'; -import {useRxQuery} from 'rxdb-hooks'; - -import AddPackageModal from './AddPackageModal'; -import Checkbox from './Checkbox'; -import ConfirmBulkRebuildModal from './ConfirmBulkRebuildModal'; -import ConfirmRebuildModal from './ConfirmRebuildModal'; - -export default function PackageTable({ - db, - filterStatus, -}: Readonly<{ - db: BuilderPackageDatabase; - filterStatus?: BuilderPackageStatus; -}>) { - const [selectedPackages, setSelectedPackages] = useState< - BaseBuilderPackageWithName[] - >([]); - const [checked, setChecked] = useState(false); - const [addPkgModalOpen, setAddPkgModalOpen] = useState(false); - const [bulkRebuildModalOpen, setBulkRebuildModalOpen] = useState(false); - const [rebuildPackage, setRebuildPackage] = useState(); - const [pkgQuery, setPkgQuery] = useState(''); - const [selectedBuildStatus, setSelectedBuildStatus] = useState([]); - const [selectedRepositories, setSelectedRepositories] = useState( - [] - ); - const [selectedMarch, setSelectedMarch] = useState([]); - const [pageSize, setPageSize] = useState(10); - useEffect(() => { - if (filterStatus) { - setSelectedBuildStatus([filterStatus]); - } - }, [filterStatus]); - const packageCollection = useMemo(() => db.collections.packages, [db]); - const query = useMemo(() => { - const searchQuery: MangoQuery = { - selector: { - $or: [ - { - ...(selectedBuildStatus.length - ? { - status: { - $in: selectedBuildStatus, - }, - } - : {}), - ...(pkgQuery.trim().length - ? { - pkgname: { - $options: 'ig', - $regex: pkgQuery.trim(), - }, - } - : {}), - ...(selectedRepositories.length - ? { - repository: { - $in: selectedRepositories, - }, - } - : {}), - ...(selectedMarch.length - ? { - march: { - $in: selectedMarch, - }, - } - : {}), - }, - ...(selectedPackages.length - ? [ - { - $or: selectedPackages.map(pkg => ({ - march: pkg.march, - pkgbase: pkg.pkgbase, - repository: pkg.repository, - })), - }, - ] - : []), - ], - }, - }; - return packageCollection.find(searchQuery).sort({ - updated: 'desc', - }); - }, [ - packageCollection, - pkgQuery, - selectedBuildStatus, - selectedRepositories, - selectedMarch, - ]); - const { - currentPage, - fetchPage, - pageCount, - result: packages, - } = useRxQuery(query, { - pageSize, - pagination: 'Traditional', - }); - useEffect(() => { - if (selectedPackages.length === 0) { - setChecked(false); - } else if ( - packages.filter(pkg => - selectedPackages.some( - x => x.pkgbase === pkg.pkgbase && x.march === pkg.march - ) - ).length === packages.length - ) { - setChecked(true); - } else { - setChecked('indeterminate'); - } - }, [packages, selectedPackages]); - return ( - - {bulkRebuildModalOpen ? ( - { - setBulkRebuildModalOpen(false); - setSelectedPackages([]); - }} - packages={selectedPackages} - /> - ) : null} - {addPkgModalOpen ? ( - setAddPkgModalOpen(false)} - /> - ) : null} - {rebuildPackage ? ( - setRebuildPackage(undefined)} - pkg={rebuildPackage} - /> - ) : null} -
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setSelectedBuildStatus(status); - }} - placeholder="Filter by build status" - value={selectedBuildStatus} - > - {Object.values(BuilderPackageStatus).map(status => ( - - {status} - - ))} - -
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setSelectedRepositories(repositories); - }} - placeholder="Filter by repository" - value={selectedRepositories} - > - {Object.values(BuilderPackageRepository).map(repo => ( - - {repo} - - ))} - -
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setSelectedMarch(arch); - }} - placeholder="Filter by march" - value={selectedMarch} - > - {Object.values(BuilderPackageArchitecture).map(arch => ( - - {arch} - - ))} - -
-
- - - -
- - Options - -
- - -
- - - -
-
-
-
-
-
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setPkgQuery(value); - }} - placeholder="Search for a package" - value={pkgQuery} - /> -
- - - - - { - if (status === true) { - setSelectedPackages( - selectedPackages.concat( - packages.map(pkg => ({ - march: pkg.march, - pkgbase: pkg.pkgbase, - pkgname: pkg.pkgname, - repository: pkg.repository, - })) - ) - ); - } else if (status === false) { - setSelectedPackages( - selectedPackages.filter( - x => - packages.findIndex( - pkg => - x.pkgbase === pkg.pkgbase && x.march === pkg.march - ) === -1 - ) - ); - } - }} - /> - - - Name - - - Arch - - - Version - - - Repository - - - Status - - - Updated At - - - Build Log - - - Raw Build Log - - - Rebuild - - - - - {packages.map(pkg => ( - - - x.pkgbase === pkg.pkgbase && x.march === pkg.march - )} - onCheckedChange={checked => - setSelectedPackages( - checked - ? [ - ...selectedPackages, - { - march: pkg.march, - pkgbase: pkg.pkgbase, - pkgname: pkg.pkgname, - repository: pkg.repository, - }, - ] - : selectedPackages.filter( - x => - x.pkgbase !== pkg.pkgbase || x.march !== pkg.march - ) - ) - } - /> - - - {pkg.pkgname} ({pkg.pkgbase}) - - {pkg.march} - {pkg.version} - {pkg.repository} - - {pkg.status} - - - {new Date(pkg.updated * 1000).toLocaleString()} - - - - - - - - - - - - - - - - ))} - -
-
- -
- {currentPage} / {pageCount} -
- -
-
-
- - - isNaN(value) || value > pageCount ? null : fetchPage(value) - } - placeholder="Page Number" - value={currentPage} - /> - - - isNaN(value) || value > 50 || value < 1 - ? null - : setPageSize(value) - } - placeholder="Page Size" - value={pageSize} - /> -
-
-
- ); -} diff --git a/components/RebuildTable.tsx b/components/RebuildTable.tsx deleted file mode 100644 index ee30c82..0000000 --- a/components/RebuildTable.tsx +++ /dev/null @@ -1,333 +0,0 @@ -'use client'; - -import {getRebuildPackages} from '@/app/actions'; -import {BuilderPackageDatabase} from '@/lib/db'; -import {getColor} from '@/lib/util'; -import { - BuilderPackageArchitecture, - BuilderPackageRepository, - BuilderPackageStatus, - BuilderRebuildPackageWithID, -} from '@/types/BuilderPackage'; -import { - RiArticleLine, - RiRefreshLine, - RiSearchLine, - RiSoundModuleFill, -} from '@remixicon/react'; -import { - Badge, - Button, - Card, - MultiSelect, - MultiSelectItem, - NumberInput, - Table, - TableBody, - TableCell, - TableHead, - TableHeaderCell, - TableRow, - TextInput, -} from '@tremor/react'; -import Link from 'next/link'; -import {useMemo, useState} from 'react'; -import {toast} from 'react-toastify'; -import {MangoQuery} from 'rxdb'; -import {useRxQuery} from 'rxdb-hooks'; - -export default function RebuildTable({ - db, -}: Readonly<{db: BuilderPackageDatabase}>) { - const [pkgQuery, setPkgQuery] = useState(''); - const [selectedBuildStatus, setSelectedBuildStatus] = useState([]); - const [selectedRepositories, setSelectedRepositories] = useState( - [] - ); - const [selectedMarch, setSelectedMarch] = useState([]); - const [pageSize, setPageSize] = useState(10); - const packageCollection = useMemo( - () => db.collections.rebuild_packages, - [db] - ); - const query = useMemo(() => { - const searchQuery: MangoQuery = { - selector: { - ...(selectedBuildStatus.length - ? { - status: { - $in: selectedBuildStatus, - }, - } - : {}), - ...(pkgQuery.trim().length - ? { - pkgbase: { - $options: 'ig', - $regex: pkgQuery.trim(), - }, - } - : {}), - ...(selectedRepositories.length - ? { - repository: { - $in: selectedRepositories, - }, - } - : {}), - ...(selectedMarch.length - ? { - march: { - $in: selectedMarch, - }, - } - : {}), - }, - }; - return packageCollection.find(searchQuery).sort({ - updated: 'desc', - }); - }, [ - packageCollection, - pkgQuery, - selectedBuildStatus, - selectedRepositories, - selectedMarch, - ]); - const { - currentPage, - fetchPage, - pageCount, - result: packages, - } = useRxQuery(query, { - pageSize, - pagination: 'Traditional', - }); - return ( - -
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setSelectedBuildStatus(status); - }} - placeholder="Filter by build status" - > - {Object.values(BuilderPackageStatus).map(status => ( - - {status} - - ))} - -
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setSelectedRepositories(repositories); - }} - placeholder="Filter by repository" - > - {Object.values(BuilderPackageRepository).map(repo => ( - - {repo} - - ))} - -
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setSelectedMarch(arch); - }} - placeholder="Filter by march" - > - {Object.values(BuilderPackageArchitecture).map(arch => ( - - {arch} - - ))} - -
-
- -
-
-
- { - if (currentPage !== 1) { - fetchPage(1); - } - setPkgQuery(value); - }} - placeholder="Search for a package" - value={pkgQuery} - /> -
- - - - - Base - - - Arch - - - Repository - - - Status - - - Updated At - - - Build Log - - - Raw Build Log - - - - - {packages.map(pkg => ( - - {pkg.pkgbase} - {pkg.march} - {pkg.repository} - - {pkg.status} - - - {new Date(pkg.updated / 1000000).toLocaleString()} - - - - - - - - - - - - - ))} - -
-
- -
- {currentPage} / {pageCount} -
- -
-
-
- - - isNaN(value) || value > pageCount ? null : fetchPage(value) - } - placeholder="Page Number" - value={currentPage} - /> - - - isNaN(value) || value > 50 || value < 1 - ? null - : setPageSize(value) - } - placeholder="Page Size" - value={pageSize} - /> -
-
-
- ); -} diff --git a/components/Statistics.tsx b/components/Statistics.tsx deleted file mode 100644 index f72d797..0000000 --- a/components/Statistics.tsx +++ /dev/null @@ -1,217 +0,0 @@ -'use client'; - -import {BuilderPackageDatabase} from '@/lib/db'; -import {useKpiCards} from '@/lib/hooks'; -import {getClassByColor} from '@/lib/util'; -import {BuilderPackage, BuilderPackageStatus} from '@/types/BuilderPackage'; -import {AreaChart, Card, DonutChart, List, ListItem} from '@tremor/react'; -import {useEffect, useMemo, useState} from 'react'; -import {toast} from 'react-toastify'; - -type StatsData = {[K in BuilderPackageStatus]?: number} & {monthYear: string}; - -const numberFormatter = (number: number) => - Intl.NumberFormat('us').format(number).toString(); - -const handleStats = ( - packages: BuilderPackage[], - callback: (stats: StatsData[]) => void -) => { - if (!packages.length) { - return; - } - const minDate = new Date(packages[0].updated * 1000); - const maxDate = new Date(packages[packages.length - 1].updated * 1000); - const data: { - [monthYear: string]: { - [status: string]: number; - }; - } = {}; - const monthStatusCounts = packages.reduce((acc, doc) => { - const date = new Date(doc.updated * 1000); - const monthYear = `${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getFullYear()}`; - const {status} = doc; - if (!acc[monthYear]) { - acc[monthYear] = {}; - } - if (!acc[monthYear][status]) { - acc[monthYear][status] = 0; - } - acc[monthYear][status]++; - return acc; - }, data); - const currentDate = new Date(minDate.getFullYear(), minDate.getMonth()); - while (currentDate <= maxDate) { - const monthYear = `${(currentDate.getMonth() + 1).toString().padStart(2, '0')}-${currentDate.getFullYear()}`; - if (!monthStatusCounts[monthYear]) { - monthStatusCounts[monthYear] = {}; - } - currentDate.setMonth(currentDate.getMonth() + 1); - } - const monthStatusCountsArray = Object.entries(monthStatusCounts).map( - ([monthYear, statusCounts]) => { - return { - monthYear, - ...statusCounts, - }; - } - ); - callback(monthStatusCountsArray); -}; - -const colors = ['green', 'amber', 'blue', 'red', 'sky', 'violet', 'pink']; - -export default function Statistics({ - db, -}: Readonly<{db: BuilderPackageDatabase}>) { - const [stats, setStats] = useState([]); - const {extraKpiCards, kpiCards} = useKpiCards(db); - const data = useMemo( - () => - [...kpiCards, ...extraKpiCards].map(x => ({ - amount: x.current, - color: x.color, - name: x.name, - share: ((x.current / x.total) * 100).toFixed(2) + '%', - })), - [extraKpiCards, kpiCards] - ); - const packageCollection = useMemo(() => db.collections.packages, [db]); - const query = useMemo( - () => - packageCollection.find().sort({ - updated: 'asc', - }), - [packageCollection] - ); - useEffect(() => { - const querySubscription = query.$.subscribe(packages => { - if (!packages.length) { - return; - } - const id = toast.loading('Updating statistics...'); - handleStats(packages, computedStats => setStats(computedStats)); - toast.update(id, { - autoClose: 5000, - closeButton: true, - isLoading: false, - render: 'Statistics updated!', - type: 'success', - }); - }); - - return () => { - querySubscription.unsubscribe(); - }; - }, [query]); - return ( - - -

- Total builds by month -

- { - const {active, label, payload} = props; - if (!active || !payload) { - return null; - } - return ( -
-
-
-
- Date: {label} -
-
-
- {payload.map((category, idx) => ( -
-
-
-

- {category.dataKey} -

-

- {category.value} packages -

-
-
- ))} -
- ); - }} - data={stats} - index="monthYear" - noDataText="Crunching the numbers..." - onValueChange={v => v} - showAnimation - showTooltip - yAxisWidth={64} - /> - - -

- Total builds by category -

- v} - showAnimation - valueFormatter={numberFormatter} - /> -

- Category - Amount / Share -

- - {data.map(item => ( - -
- - - {item.name} - -
-
- - {numberFormatter(item.amount)} - - - {item.share} - -
-
- ))} -
-
- - ); -} diff --git a/components/SubmitButton.tsx b/components/SubmitButton.tsx deleted file mode 100644 index a1d461d..0000000 --- a/components/SubmitButton.tsx +++ /dev/null @@ -1,21 +0,0 @@ -'use client'; - -import {Button} from '@tremor/react'; -import {useFormStatus} from 'react-dom'; - -export default function SubmitButton({ - className = 'mt-4 w-full', - disabled = false, - text, -}: Readonly<{className?: string; disabled?: boolean; text: string}>) { - const {pending} = useFormStatus(); - return ( - - ); -} diff --git a/eslint.config.mjs b/eslint.config.mjs index b1903b9..eb9c46c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,22 +1,17 @@ -import js from '@eslint/js'; -import next from '@next/eslint-plugin-next'; +import {FlatCompat} from '@eslint/eslintrc'; import perfectionist from 'eslint-plugin-perfectionist'; import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; -import tsEslint from 'typescript-eslint'; +import {dirname} from 'path'; +import {fileURLToPath} from 'url'; -export default tsEslint.config( - js.configs.recommended, +const compat = new FlatCompat({ + baseDirectory: dirname(fileURLToPath(import.meta.url)), +}); + +const eslintConfig = [ + ...compat.extends('next/core-web-vitals', 'next/typescript'), perfectionist.configs['recommended-natural'], eslintPluginPrettierRecommended, - ...tsEslint.configs.recommended, - { - files: ['./**/*.ts', './**/*.tsx'], - plugins: { - '@next/next': next, - }, - rules: { - 'no-unused-vars': 'warn', - ...next.configs.recommended.rules, - }, - } -); +]; + +export default eslintConfig; diff --git a/lib/db.ts b/lib/db.ts deleted file mode 100644 index c8d398c..0000000 --- a/lib/db.ts +++ /dev/null @@ -1,232 +0,0 @@ -import {AuditLogEventName, ParsedAuditLogEntry} from '@/types/AuditLog'; -import { - BuilderPackageArchitecture, - BuilderPackageRepository, - BuilderPackageStatus, - BuilderPackageWithID, -} from '@/types/BuilderPackage'; -import { - RxCollection, - RxDatabase, - addRxPlugin, - createRxDatabase, - toTypedRxJsonSchema, -} from 'rxdb'; -import {wrappedKeyCompressionStorage} from 'rxdb/plugins/key-compression'; -import {RxDBLocalDocumentsPlugin} from 'rxdb/plugins/local-documents'; -import {RxDBQueryBuilderPlugin} from 'rxdb/plugins/query-builder'; -import {getRxStorageMemory} from 'rxdb/plugins/storage-memory'; - -const BuilderPackageSchema = toTypedRxJsonSchema({ - indexes: ['pkgbase', 'pkgname', 'repository', 'status'], - keyCompression: true, - primaryKey: { - fields: ['pkgbase', 'pkgname', 'repository', 'march'], - key: 'packageID', - separator: '-', - }, - properties: { - march: { - enum: Object.values(BuilderPackageArchitecture), - maxLength: 10, - type: 'string', - }, - packageID: { - maxLength: 640, - type: 'string', - }, - pkgbase: { - maxLength: 256, - type: 'string', - }, - pkgname: { - maxLength: 256, - type: 'string', - }, - repo_version: { - type: 'string', - }, - repository: { - enum: Object.values(BuilderPackageRepository), - maxLength: 10, - type: 'string', - }, - status: { - enum: Object.values(BuilderPackageStatus), - maxLength: 10, - type: 'string', - }, - updated: { - type: 'number', - }, - version: { - type: 'string', - }, - }, - required: [ - 'march', - 'packageID', - 'pkgbase', - 'pkgname', - 'repo_version', - 'repository', - 'status', - 'updated', - 'version', - ], - title: 'packages', - type: 'object', - version: 0, -}); - -const BuilderRebuildPackageSchema = toTypedRxJsonSchema({ - indexes: ['pkgbase', 'march', 'repository', 'status'], - keyCompression: true, - primaryKey: { - fields: ['pkgbase', 'repository', 'march'], - key: 'packageID', - separator: '-', - }, - properties: { - march: { - enum: Object.values(BuilderPackageArchitecture), - maxLength: 10, - type: 'string', - }, - packageID: { - maxLength: 640, - type: 'string', - }, - pkgbase: { - maxLength: 256, - type: 'string', - }, - repository: { - enum: Object.values(BuilderPackageRepository), - maxLength: 10, - type: 'string', - }, - status: { - enum: Object.values(BuilderPackageStatus), - maxLength: 10, - type: 'string', - }, - updated: { - type: 'number', - }, - }, - required: [ - 'march', - 'packageID', - 'pkgbase', - 'repository', - 'status', - 'updated', - ], - title: 'rebuildPackages', - type: 'object', - version: 0, -}); - -const ParsedAuditLogSchema = toTypedRxJsonSchema({ - indexes: ['updated', 'username', 'event_name'], - keyCompression: true, - primaryKey: 'id', - properties: { - id: { - maxLength: 320, - type: 'string', - }, - event_desc: { - type: 'string', - }, - event_name: { - enum: Object.values(AuditLogEventName), - maxLength: 32, - type: 'string', - }, - packages: { - items: { - properties: { - march: { - enum: Object.values(BuilderPackageArchitecture), - maxLength: 10, - type: 'string', - }, - pkgbase: { - maxLength: 256, - type: 'string', - }, - repository: { - enum: Object.values(BuilderPackageRepository), - maxLength: 10, - type: 'string', - }, - }, - required: ['march', 'pkgbase', 'repository'], - type: 'object', - }, - type: 'array', - }, - updated: { - maximum: Number.MAX_SAFE_INTEGER, - minimum: 0, - multipleOf: 1, - type: 'number', - }, - username: { - maxLength: 256, - type: 'string', - }, - }, - required: ['id', 'event_desc', 'event_name', 'packages', 'updated'], - title: 'auditLogs', - type: 'object', - version: 0, -}); - -export type BuilderPackageCollection = RxCollection; -export type BuilderRebuildPackageCollection = - RxCollection; -export type ParsedAuditLogCollection = RxCollection; -export type BuilderPackageDatabase = RxDatabase<{ - // camelCase is not compatible with RxDB for database and collection names - audit_logs: ParsedAuditLogCollection; - packages: BuilderPackageCollection; - // camelCase is not compatible with RxDB for database and collection names - rebuild_packages: BuilderRebuildPackageCollection; -}>; - -export async function getRxDB() { - if (process.env.NODE_ENV !== 'production') { - await import('rxdb/plugins/dev-mode').then(module => - addRxPlugin(module.RxDBDevModePlugin) - ); - } - addRxPlugin(RxDBQueryBuilderPlugin); - addRxPlugin(RxDBLocalDocumentsPlugin); - const db: BuilderPackageDatabase = await createRxDatabase({ - eventReduce: true, - ignoreDuplicate: process.env.NODE_ENV !== 'production', - multiInstance: false, - name: 'packages', - storage: wrappedKeyCompressionStorage({ - storage: getRxStorageMemory(), - }), - }); - await db.addCollections({ - // camelCase is not compatible with RxDB for database and collection names - audit_logs: { - schema: ParsedAuditLogSchema, - localDocuments: true, - }, - packages: { - schema: BuilderPackageSchema, - }, - // camelCase is not compatible with RxDB for database and collection names - rebuild_packages: { - schema: BuilderRebuildPackageSchema, - }, - }); - return db; -} diff --git a/lib/fetcher.ts b/lib/fetcher.ts deleted file mode 100644 index e4a0dd7..0000000 --- a/lib/fetcher.ts +++ /dev/null @@ -1,45 +0,0 @@ -import {ReadonlyHeaders} from 'next/dist/server/web/spec-extension/adapters/headers'; - -import {defaultServer} from './servers'; - -export type ResponseType = 'json' | 'raw' | 'text'; - -export function processResponse( - response: Response, - mode: ResponseType -): Promise { - switch (mode) { - case 'json': - return response.json() as Promise; - case 'raw': - return response.arrayBuffer() as Promise; - case 'text': - return response.text() as Promise; - } -} - -export default async function fetcher( - path: string, - sessionToken: string, - clientHeaders: ReadonlyHeaders, - init?: RequestInit, - baseURL = defaultServer.url, - responseMode: ResponseType = 'json' -): Promise { - return fetch(`${baseURL}${path}`, { - cache: 'no-store', - headers: { - ...(sessionToken ? {Authorization: `Bearer ${sessionToken}`} : {}), - 'Content-Type': 'application/json', - 'User-Agent': - clientHeaders.get('User-Agent') ?? - 'CachyBuilderDashboardProxyServer/1.0.0', - 'X-Forwarded-For': - clientHeaders.get('CF-Connecting-IP') ?? - clientHeaders.get('X-Forwarded-For') ?? - '', - ...init?.headers, - }, - ...init, - }).then(res => processResponse(res, responseMode)); -} diff --git a/lib/hooks.ts b/lib/hooks.ts deleted file mode 100644 index 5b152e5..0000000 --- a/lib/hooks.ts +++ /dev/null @@ -1,254 +0,0 @@ -'use client'; - -import {BuilderPackageStatus} from '@/types/BuilderPackage'; -import {useEffect, useMemo, useState} from 'react'; - -import {BuilderPackageDatabase} from './db'; -import {getColor} from './util'; - -const clearTimer = (timer: NodeJS.Timeout | null) => { - if (timer) { - clearTimeout(timer); - } -}; - -export function useKpiCards(db: BuilderPackageDatabase) { - const [total, setTotal] = useState(0); - const [queued, setQueued] = useState(0); - const [failed, setFailed] = useState(0); - const [latest, setLatest] = useState(0); - const [building, setBuilding] = useState(0); - const [done, setDone] = useState(0); - const [skipped, setSkipped] = useState(0); - const [unknown, setUnknown] = useState(0); - const kpiCards = useMemo( - () => [ - { - color: getColor(BuilderPackageStatus.LATEST), - current: latest, - id: 1, - name: 'Latest Packages', - total, - type: BuilderPackageStatus.LATEST, - }, - { - color: getColor(BuilderPackageStatus.BUILDING), - current: building, - id: 2, - name: 'Building Packages', - total, - type: BuilderPackageStatus.BUILDING, - }, - { - color: getColor(BuilderPackageStatus.QUEUED), - current: queued, - id: 3, - name: 'Queued Packages', - total, - type: BuilderPackageStatus.QUEUED, - }, - { - color: getColor(BuilderPackageStatus.FAILED), - current: failed, - id: 4, - name: 'Failed Packages', - total, - type: BuilderPackageStatus.FAILED, - }, - ], - [total, queued, failed, latest, building] - ); - const extraKpiCards = useMemo( - () => [ - { - color: getColor(BuilderPackageStatus.DONE), - current: done, - id: 1, - name: 'Done Packages', - total, - type: BuilderPackageStatus.DONE, - }, - { - color: getColor(BuilderPackageStatus.SKIPPED), - current: skipped, - id: 2, - name: 'Skipped Packages', - total, - type: BuilderPackageStatus.SKIPPED, - }, - { - color: getColor(BuilderPackageStatus.UNKNOWN), - current: unknown, - id: 3, - name: 'Unknown Packages', - total, - type: BuilderPackageStatus.UNKNOWN, - }, - ], - [total, done, skipped, unknown] - ); - const packageCollection = useMemo(() => db.collections.packages, [db]); - const totalQuery = useMemo( - () => packageCollection.count({}), - [packageCollection] - ); - const buildingQuery = useMemo( - () => - packageCollection.count({ - selector: { - status: BuilderPackageStatus.BUILDING, - }, - }), - [packageCollection] - ); - const doneQuery = useMemo( - () => - packageCollection.count({ - selector: { - status: BuilderPackageStatus.DONE, - }, - }), - [packageCollection] - ); - const failedQuery = useMemo( - () => - packageCollection.count({ - selector: { - status: BuilderPackageStatus.FAILED, - }, - }), - [packageCollection] - ); - const latestQuery = useMemo( - () => - packageCollection.count({ - selector: { - status: BuilderPackageStatus.LATEST, - }, - }), - [packageCollection] - ); - const queuedQuery = useMemo( - () => - packageCollection.count({ - selector: { - status: BuilderPackageStatus.QUEUED, - }, - }), - [packageCollection] - ); - const skippedQuery = useMemo( - () => - packageCollection.count({ - selector: { - status: BuilderPackageStatus.SKIPPED, - }, - }), - [packageCollection] - ); - const unknownQuery = useMemo( - () => - packageCollection.count({ - selector: { - status: BuilderPackageStatus.UNKNOWN, - }, - }), - [packageCollection] - ); - - useEffect(() => { - totalQuery.exec().then(x => setTotal(x)); - queuedQuery.exec().then(x => setQueued(x)); - failedQuery.exec().then(x => setFailed(x)); - latestQuery.exec().then(x => setLatest(x)); - buildingQuery.exec().then(x => setBuilding(x)); - doneQuery.exec().then(x => setDone(x)); - skippedQuery.exec().then(x => setSkipped(x)); - unknownQuery.exec().then(x => setUnknown(x)); - - const totalSub = totalQuery.$.subscribe(x => setTotal(x)); - const queuedSub = queuedQuery.$.subscribe(x => setQueued(x)); - const failedSub = failedQuery.$.subscribe(x => setFailed(x)); - const latestSub = latestQuery.$.subscribe(x => setLatest(x)); - const buildingSub = buildingQuery.$.subscribe(x => setBuilding(x)); - const doneSub = doneQuery.$.subscribe(x => setDone(x)); - const skippedSub = skippedQuery.$.subscribe(x => setSkipped(x)); - const unknownSub = unknownQuery.$.subscribe(x => setUnknown(x)); - - return () => { - totalSub.unsubscribe(); - queuedSub.unsubscribe(); - failedSub.unsubscribe(); - latestSub.unsubscribe(); - buildingSub.unsubscribe(); - doneSub.unsubscribe(); - skippedSub.unsubscribe(); - unknownSub.unsubscribe(); - }; - }, [ - totalQuery, - queuedQuery, - failedQuery, - latestQuery, - buildingQuery, - doneQuery, - skippedQuery, - unknownQuery, - ]); - return {extraKpiCards, kpiCards, total}; -} - -export function useLogoutShortcutListener(callback: () => void) { - const [colonQPressed, setColonQPressed] = useState(false); - let timer: NodeJS.Timeout | null = null; - - useEffect(() => { - let colonPressed = false; - const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === ':') { - colonPressed = true; - timer = setTimeout(() => { - colonPressed = false; - }, 800); - } else if (colonPressed && event.key.toLowerCase() === 'q') { - setColonQPressed(true); - colonPressed = false; - clearTimer(timer); - } else { - colonPressed = false; - clearTimer(timer); - } - }; - - window.addEventListener('keydown', handleKeyDown); - - return () => { - window.removeEventListener('keydown', handleKeyDown); - clearTimer(timer); - }; - }, []); - - useEffect(() => { - if (colonQPressed) { - callback(); - setColonQPressed(false); - } - }, [callback, colonQPressed]); -} - -export function useCtrlFShortcutListener(callback: () => void) { - useEffect(() => { - const handleKeyDown = (event: KeyboardEvent) => { - if (event.ctrlKey && event.key.toLowerCase() === 'f') { - event.preventDefault(); - callback(); - } - }; - - window.addEventListener('keydown', handleKeyDown); - - return () => { - window.removeEventListener('keydown', handleKeyDown); - }; - }); -} diff --git a/lib/servers.ts b/lib/servers.ts deleted file mode 100644 index 8fe0600..0000000 --- a/lib/servers.ts +++ /dev/null @@ -1,17 +0,0 @@ -const servers = [ - { - default: true, - name: 'CachyOS Builder API - STANDARD', - url: 'https://builder-api.cachyos.org/api', - }, - { - default: false, - name: 'CachyOS Builder API - ZEN4', - url: 'https://builder-api-1.cachyos.org/api', - }, -]; - -export const defaultServer = - servers.find(server => server.default) ?? servers[0]; - -export default servers; diff --git a/lib/util.ts b/lib/util.ts deleted file mode 100644 index ec722fe..0000000 --- a/lib/util.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { - AuditLogEntry, - AuditLogEventName, - AuditLogPackageWithPkgName, - ParsedAuditLogEntry, -} from '@/types/AuditLog'; -import {BuilderPackageStatus} from '@/types/BuilderPackage'; - -export function getColor(status: BuilderPackageStatus) { - switch (status) { - case BuilderPackageStatus.FAILED: - return 'red'; - case BuilderPackageStatus.BUILDING: - return 'amber'; - case BuilderPackageStatus.QUEUED: - return 'blue'; - case BuilderPackageStatus.DONE: - case BuilderPackageStatus.SKIPPED: - case BuilderPackageStatus.LATEST: - return 'green'; - case BuilderPackageStatus.UNKNOWN: - default: - return 'gray'; - } -} - -export function getClassByColor(color: string) { - switch (color) { - case 'red': - return 'bg-red-500'; - case 'amber': - return 'bg-yellow-500'; - case 'blue': - return 'bg-blue-500'; - case 'green': - return 'bg-green-500'; - case 'sky': - return 'bg-sky-500'; - case 'violet': - return 'bg-purple-500'; - case 'pink': - return 'bg-pink-500'; - default: - return 'bg-gray-500'; - } -} - -export function parseAuditLogEntry(event: AuditLogEntry): ParsedAuditLogEntry { - if (event.event_name === AuditLogEventName.QPKG_REBUILD) { - return { - ...event, - packages: [ - { - march: event.event_desc.split("'")[5], - pkgbase: event.event_desc.split("'")[1], - repository: event.event_desc.split("'")[3], - }, - ], - updated: event.updated / 1000000, - }; - } else if (event.event_name === AuditLogEventName.BULK_QPKG_REBUILD) { - console.log(event); - let packages: { - march: string; - pkgbase: string; - repository: string; - }[] = []; - const raw_pkgs = event.event_desc - .replace(/'/g, '') - .replace('bulk rebuild queued: ', ''); - if (raw_pkgs.length) { - packages = (JSON.parse(raw_pkgs) as AuditLogPackageWithPkgName[]).map( - x => ({ - march: x.march, - pkgbase: `${x.pkgbase} (${x.pkgname})`, - repository: x.repository, - }) - ); - } - return { - ...event, - packages, - updated: event.updated / 1000000, - }; - } - return { - ...event, - packages: [], - updated: event.updated / 1000000, - }; -} diff --git a/next.config.mjs b/next.config.ts similarity index 60% rename from next.config.mjs rename to next.config.ts index 6f3a4bc..1faec7c 100644 --- a/next.config.mjs +++ b/next.config.ts @@ -1,5 +1,9 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { +import type {NextConfig} from 'next'; + +const nextConfig: NextConfig = { + devIndicators: { + position: 'bottom-right', + }, poweredByHeader: false, reactStrictMode: false, async redirects() { @@ -15,13 +19,13 @@ const nextConfig = { permanent: false, source: '/logs/:arch/:pkgbase', }, + { + destination: '/dashboard/package-list', + permanent: false, + source: '/dashboard', + }, ]; }, - experimental: { - turbo: { - useSwcCss: true, - }, - }, }; export default nextConfig; diff --git a/package.json b/package.json index a96015a..bd951b9 100644 --- a/package.json +++ b/package.json @@ -1,58 +1,61 @@ { "dependencies": { - "@headlessui/react": "2.1.8", - "@headlessui/tailwindcss": "0.2.1", - "@marsidev/react-turnstile": "1.0.2", - "@radix-ui/react-checkbox": "1.1.1", - "@remixicon/react": "4.2.0", - "@tremor/react": "3.18.3", + "@hookform/resolvers": "^5.1.1", + "@marsidev/react-turnstile": "1.1.0", + "@radix-ui/react-avatar": "^1.1.10", + "@radix-ui/react-checkbox": "^1.3.2", + "@radix-ui/react-collapsible": "^1.1.11", + "@radix-ui/react-dialog": "^1.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.15", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-select": "^2.2.5", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tooltip": "^1.2.7", + "@tabler/icons-react": "3.34.0", + "@tanstack/react-table": "^8.21.3", "@xterm/addon-fit": "0.10.0", "@xterm/addon-search": "0.15.0", "@xterm/addon-web-links": "0.11.0", "@xterm/addon-webgl": "0.18.0", - "@xterm/xterm": "5.5.0", "ansi-styles": "6.2.1", - "iron-session": "8.0.3", - "next": "14.2.13", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-toastify": "10.0.5", - "rxdb": "15.33.0", - "rxdb-hooks": "5.0.2", - "sharp": "0.33.5", - "strip-ansi": "7.1.0" + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "iron-session": "8.0.4", + "lucide-react": "^0.525.0", + "next": "15.3.5", + "next-themes": "^0.4.6", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-hook-form": "7.60.0", + "sonner": "^2.0.6", + "strip-ansi": "7.1.0", + "tailwind-merge": "^3.3.1", + "zod": "^3.25.74" }, "devDependencies": { - "@next/eslint-plugin-next": "^14.2.20", - "@tailwindcss/forms": "0.5.9", - "@types/node": "^22.10.2", - "@types/react": "^18.3.16", - "@types/react-dom": "^18.3.5", - "@types/validator": "13.12.2", - "autoprefixer": "10.4.20", - "eslint": "^9.17.0", - "eslint-config-next": "^14.2.20", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-perfectionist": "^3.9.1", - "eslint-plugin-prettier": "^5.2.1", - "postcss": "8.4.47", - "tailwindcss": "3.4.13", - "typescript": "5.6.2", - "typescript-eslint": "8.7.0" + "@eslint/eslintrc": "^3.3.1", + "@tailwindcss/postcss": "^4.1.11", + "@types/node": "^24.0.10", + "@types/react": "^19.1.8", + "@types/react-dom": "^19.1.6", + "eslint": "^9.30.1", + "eslint-config-next": "15.3.5", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-perfectionist": "^4.15.0", + "eslint-plugin-prettier": "^5.5.1", + "prettier": "^3.6.2", + "tailwindcss": "^4.1.11", + "tw-animate-css": "^1.3.5", + "typescript": "^5.8.3" }, "name": "cachyos-builder-dashboard", "private": true, "scripts": { "build": "next build", - "dev": "next dev", + "dev": "next dev --turbopack", "lint": "next lint", "start": "next start" }, - "version": "0.1.0", - "packageManager": "bun@1.1.38", - "trustedDependencies": [ - "protobufjs", - "rxdb", - "sharp" - ] + "version": "0.1.0" } diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index 12a703d..0000000 --- a/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -}; diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..ba720fe --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ['@tailwindcss/postcss'], +}; + +export default config; diff --git a/public/cachyos-logo-white.svg b/public/cachyos-logo-white.svg new file mode 100644 index 0000000..882d3dd --- /dev/null +++ b/public/cachyos-logo-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/cachyos-logo.svg b/public/cachyos-logo.svg new file mode 100644 index 0000000..07c25fc --- /dev/null +++ b/public/cachyos-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logo.png b/public/logo.png deleted file mode 100644 index 5be51b27e07237b1f73fc402f95c4609314bf3ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8036 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 diff --git a/renovate.json b/renovate.json deleted file mode 100644 index 5db72dd..0000000 --- a/renovate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:recommended" - ] -} diff --git a/src/app/actions.ts b/src/app/actions.ts new file mode 100644 index 0000000..a663ec2 --- /dev/null +++ b/src/app/actions.ts @@ -0,0 +1,167 @@ +'use server'; + +import {getIronSession} from 'iron-session'; +import {cookies, headers} from 'next/headers'; +import {redirect} from 'next/navigation'; + +import CachyBuilderClient from '@/lib/CachyBuilderClient'; +import {defaultSession, SessionData, sessionOptions} from '@/lib/session'; +import { + ListPackagesQuery, + LoginRequest, + LoginRequestSchema, +} from '@/lib/typings'; + +export async function changeServer(serverName: string) { + const {session} = await getSession(); + const serverIndex = session.tokens.findIndex( + token => token.name === serverName && token.token !== '' + ); + if (serverIndex === -1) { + return { + error: `Server "${serverName}" not found or is not accessible with the current session.`, + }; + } + session.serverIndex = serverIndex; + await session.save(); + return { + msg: `Switched to server "${serverName}" successfully.`, + }; +} + +export async function getAccessibleServers() { + const {session} = await getSession(); + if (!session.isLoggedIn) { + return redirect('/'); + } + return session.tokens.map((token, index) => ({ + accessible: token.token !== '', + active: index === session.serverIndex, + description: token.description, + name: token.name, + })); +} + +export async function getSession() { + const session = await getIronSession( + await cookies(), + sessionOptions + ); + if (!session.isLoggedIn) { + session.displayName = defaultSession.displayName; + session.isLoggedIn = defaultSession.isLoggedIn; + session.tokens = defaultSession.tokens; + session.createdAt = Date.now(); + session.serverIndex = defaultSession.serverIndex; + } + const cachyBuilderClient = new CachyBuilderClient( + session.serverIndex, + session.tokens[session.serverIndex].token + ); + return { + cachyBuilderClient, + session, + }; +} + +export async function getUser() { + const {cachyBuilderClient, session} = await getSession(); + if (!session.isLoggedIn) { + return redirect('/'); + } + const {display_name, profile_picture_url, username} = + await cachyBuilderClient.getUserProfile(await headers()); + session.displayName = display_name ?? username; + session.username = username; + session.profile_picture_url = profile_picture_url ?? '/cachyos-logo.svg'; + await session.save(); + return { + displayName: session.displayName, + profile_picture_url: session.profile_picture_url, + username: session.username, + }; +} + +export async function isLoggedIn() { + const {session} = await getSession(); + return session.isLoggedIn; +} + +export async function listPackages(query?: ListPackagesQuery) { + const {cachyBuilderClient, session} = await getSession(); + if (!session.isLoggedIn) { + return redirect('/'); + } + try { + const packages = await cachyBuilderClient.listPackages( + query, + await headers() + ); + return packages; + } catch (error) { + return { + error: `Failed to list packages: ${error instanceof Error ? error.message : 'Unknown error'}`, + }; + } +} + +export async function login(loginRequest: LoginRequest) { + const data = LoginRequestSchema.safeParse(loginRequest); + if (!data.success) { + return { + error: `Invalid login request: ${data.error.issues.map(issue => issue.message).join(', ')}`, + }; + } + + const turnstileResponse = await fetch( + 'https://challenges.cloudflare.com/turnstile/v0/siteverify', + { + body: `secret=${encodeURIComponent(process.env.TURNSTILE_SECRET_KEY!)}&response=${encodeURIComponent(data.data.turnstileToken)}`, + headers: { + 'content-type': 'application/x-www-form-urlencoded', + }, + method: 'POST', + } + ) + .then(res => res.json()) + .then(res => res.success) + .catch(() => false); + + if (!turnstileResponse) { + return { + error: 'Turnstile verification failed. Please try again.', + }; + } + + const {cachyBuilderClient, session} = await getSession(); + try { + const {errors, validServers} = await cachyBuilderClient.login( + data.data, + await headers(), + true + ); + session.isLoggedIn = true; + session.username = data.data.username; + session.tokens = cachyBuilderClient.apiTokens; + session.serverIndex = cachyBuilderClient.serverIdx; + session.profile_picture_url = '/cachyos-logo.svg'; + await session.save(); + return { + success: validServers.length > 0, + warning: + errors.length > 0 + ? `Some servers failed to respond correctly and have been disabled for this session:\n${errors}` + : undefined, + }; + } catch (error) { + return { + error: `Login failed: ${error instanceof Error ? error.message : 'Unknown error'}`, + }; + } +} + +export async function logout() { + const {session} = await getSession(); + session.destroy(); + return redirect('/'); +} diff --git a/app/apple-icon.png b/src/app/apple-icon.png similarity index 100% rename from app/apple-icon.png rename to src/app/apple-icon.png diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx new file mode 100644 index 0000000..f582516 --- /dev/null +++ b/src/app/dashboard/layout.tsx @@ -0,0 +1,33 @@ +import {AppSidebar} from '@/components/app-sidebar'; +import {HeaderBreadcrumbs} from '@/components/header-breadcrumbs'; +import {Separator} from '@/components/ui/separator'; +import { + SidebarInset, + SidebarProvider, + SidebarTrigger, +} from '@/components/ui/sidebar'; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + +
+
+ + + +
+
+
{children}
+
+
+ ); +} diff --git a/src/app/dashboard/package-list/page.tsx b/src/app/dashboard/package-list/page.tsx new file mode 100644 index 0000000..d627abd --- /dev/null +++ b/src/app/dashboard/package-list/page.tsx @@ -0,0 +1,193 @@ +'use client'; + +import {ColumnDef} from '@tanstack/react-table'; +import {Ellipsis} from 'lucide-react'; +import {useEffect, useState} from 'react'; +import {toast} from 'sonner'; + +import {listPackages} from '@/app/actions'; +import Loader from '@/components/loader'; +import {Badge} from '@/components/ui/badge'; +import {Button} from '@/components/ui/button'; +import {Card} from '@/components/ui/card'; +import {Checkbox} from '@/components/ui/checkbox'; +import {DataTable} from '@/components/ui/data-table'; +import {DataTableColumnHeader} from '@/components/ui/data-table-column-header'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import {useSidebar} from '@/components/ui/sidebar'; +import {ListPackageResponse, Package} from '@/lib/typings'; +import {packageStatusToIcon} from '@/lib/utils'; + +const columns: ColumnDef[] = [ + { + cell: ({row}) => ( + row.toggleSelected(!!value)} + /> + ), + enableHiding: false, + enableSorting: false, + header: ({table}) => ( + table.toggleAllPageRowsSelected(!!value)} + /> + ), + id: 'select', + }, + { + cell: ({row}) => ( + + {row.original.pkgname} ({row.original.pkgbase}) + + ), + header: ({column}) => ( + + ), + id: 'name', + }, + { + cell: ({row}) => {row.original.march}, + header: ({column}) => ( + + ), + id: 'arch', + }, + { + cell: ({row}) => ( + {row.original.version} + ), + header: ({column}) => ( + + ), + id: 'version', + }, + { + cell: ({row}) => ( + {row.original.repo_version} + ), + header: ({column}) => ( + + ), + id: 'repo version', + }, + { + cell: ({row}) => ( +
+ + {packageStatusToIcon(row.original.status)} + {row.original.status} + +
+ ), + header: ({column}) => ( + + ), + id: 'status', + }, + { + cell: ({row}) => { + const date = new Date(row.original.updated * 1000); + return ( + + {date.toLocaleDateString()}, {date.toLocaleTimeString()} + + ); + }, + header: ({column}) => ( + + ), + id: 'updated at', + }, + { + cell: () => ( + + + + + + Edit + Make a copy + Favorite + + Delete + + + ), + id: 'actions', + }, +]; + +export default function PackageListPage() { + const {activeServer} = useSidebar(); + const [data, setData] = useState(null); + const [error, setError] = useState(null); + const [pageSize, setPageSize] = useState(20); + const [currentPage, setCurrentPage] = useState(1); + useEffect(() => { + setError(null); + listPackages({ + current_page: currentPage, + page_size: pageSize, + }) + .then(response => { + if ('error' in response && response.error) { + setError(response.error); + toast.error(`Failed to fetch package list: ${response.error}`, { + closeButton: true, + duration: Infinity, + }); + } + if ('packages' in response) { + setData(response); + } + }) + .catch(() => { + setError('Failed to fetch package list, please try again later.'); + toast.error('Failed to fetch package list, please try again later.', { + closeButton: true, + duration: Infinity, + }); + }); + }, [activeServer, currentPage, pageSize]); + return ( + + {data ? ( + setCurrentPage(pageIndex + 1)} + onPageSizeChange={pageSize => setPageSize(pageSize)} + packageCount={data.total_packages} + pageCount={data.total_pages} + shrinkFirstColumn + /> + ) : ( + + )} + + ); +} diff --git a/app/favicon.ico b/src/app/favicon.ico similarity index 100% rename from app/favicon.ico rename to src/app/favicon.ico diff --git a/src/app/globals.css b/src/app/globals.css new file mode 100644 index 0000000..e0cd8c7 --- /dev/null +++ b/src/app/globals.css @@ -0,0 +1,145 @@ +@import 'tailwindcss'; +@import 'tw-animate-css'; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --animate-shine: shine var(--duration) infinite linear; + @keyframes shine { + 0% { + background-position: 0% 0%; + } + 50% { + background-position: 100% 100%; + } + to { + background-position: 0% 0%; + } + } + @keyframes shine { + 0% { + background-position: 0% 0%; + } + 50% { + background-position: 100% 100%; + } + to { + background-position: 0% 0%; + } + } +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.205 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.205 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.922 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.556 0 0); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/app/icon.png b/src/app/icon.png similarity index 100% rename from app/icon.png rename to src/app/icon.png diff --git a/app/layout.tsx b/src/app/layout.tsx similarity index 57% rename from app/layout.tsx rename to src/app/layout.tsx index d28951c..c08695b 100644 --- a/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,12 +1,21 @@ import type {Metadata, Viewport} from 'next'; -import {Inter} from 'next/font/google'; -import {ToastContainer} from 'react-toastify'; -import 'react-toastify/dist/ReactToastify.css'; +import {Geist, Geist_Mono} from 'next/font/google'; + +import {ThemeProvider} from '@/components/theme-provider'; +import {Toaster} from '@/components/ui/sonner'; import './globals.css'; -const inter = Inter({subsets: ['latin']}); +const geistSans = Geist({ + subsets: ['latin'], + variable: '--font-geist-sans', +}); + +const geistMono = Geist_Mono({ + subsets: ['latin'], + variable: '--font-geist-mono', +}); const description = 'CachyOS Builder Dashboard'; const name = 'CachyOS Builder Dashboard'; @@ -44,22 +53,14 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - + - - {children} + + {children} + + ); diff --git a/app/manifest.ts b/src/app/manifest.ts similarity index 100% rename from app/manifest.ts rename to src/app/manifest.ts diff --git a/src/app/page.tsx b/src/app/page.tsx new file mode 100644 index 0000000..8c3e680 --- /dev/null +++ b/src/app/page.tsx @@ -0,0 +1,11 @@ +import {LoginForm} from '@/components/login-form'; + +export default function Page() { + return ( +
+
+ +
+
+ ); +} diff --git a/app/robots.ts b/src/app/robots.ts similarity index 100% rename from app/robots.ts rename to src/app/robots.ts diff --git a/src/app/validate/page.tsx b/src/app/validate/page.tsx new file mode 100644 index 0000000..2ac38ea --- /dev/null +++ b/src/app/validate/page.tsx @@ -0,0 +1,22 @@ +'use client'; + +import {useRouter} from 'next/navigation'; +import {useEffect} from 'react'; + +import Loader from '@/components/loader'; + +export default function Page() { + const router = useRouter(); + useEffect(() => { + setTimeout(() => { + router.push('/dashboard/package-list'); + }, 5000); + }, [router]); + return ( +
+
+ +
+
+ ); +} diff --git a/src/components/app-sidebar.tsx b/src/components/app-sidebar.tsx new file mode 100644 index 0000000..314c0c6 --- /dev/null +++ b/src/components/app-sidebar.tsx @@ -0,0 +1,74 @@ +'use client'; + +import {Activity, Package, PieChart, Repeat2} from 'lucide-react'; +import * as React from 'react'; + +import {getAccessibleServers, getUser} from '@/app/actions'; +import {NavMain} from '@/components/nav-main'; +import {NavUser} from '@/components/nav-user'; +import {ServerSwitcher} from '@/components/server-switcher'; +import { + Sidebar, + SidebarContent, + SidebarFooter, + SidebarHeader, + SidebarRail, +} from '@/components/ui/sidebar'; +import CachyBuilderClient from '@/lib/CachyBuilderClient'; +import {UserData} from '@/lib/typings'; + +const items = [ + { + icon: Package, + name: 'Package List', + url: '/dashboard/package-list', + }, + { + icon: Repeat2, + name: 'Rebuild Queue', + url: '/dashboard/rebuild-queue', + }, + { + icon: Activity, + name: 'Audit Logs', + url: '/dashboard/audit-logs', + }, + { + icon: PieChart, + name: 'Statistics', + url: '/dashboard/statistics', + }, +]; +export function AppSidebar({...props}: React.ComponentProps) { + const [servers, setServers] = React.useState( + CachyBuilderClient.servers.map(server => ({ + accessible: true, + active: server.default, + description: server.description, + name: server.name, + })) + ); + const [user, setUser] = React.useState({ + displayName: 'Loading...', + profile_picture_url: '/cachyos-logo.svg', + username: 'Loading...', + }); + React.useEffect(() => { + getAccessibleServers().then(data => setServers(data)); + getUser().then(data => setUser(data)); + }, []); + return ( + + + + + + + + + + + + + ); +} diff --git a/src/components/header-breadcrumbs.tsx b/src/components/header-breadcrumbs.tsx new file mode 100644 index 0000000..1fe50f8 --- /dev/null +++ b/src/components/header-breadcrumbs.tsx @@ -0,0 +1,34 @@ +'use client'; + +import {usePathname} from 'next/navigation'; +import {useMemo} from 'react'; + +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbList, + BreadcrumbPage, + BreadcrumbSeparator, +} from '@/components/ui/breadcrumb'; + +export function HeaderBreadcrumbs() { + const pathname = usePathname(); + const breadCrumb = useMemo( + () => pathname.replace('/dashboard/', '').split('-').join(' '), + [pathname] + ); + + return ( + + + + CachyOS Builder Dashboard + + + + {breadCrumb} + + + + ); +} diff --git a/components/Loader.tsx b/src/components/loader.tsx similarity index 95% rename from components/Loader.tsx rename to src/components/loader.tsx index 7009442..ebef9ca 100644 --- a/components/Loader.tsx +++ b/src/components/loader.tsx @@ -1,19 +1,5 @@ import Image from 'next/image'; -export function LogoLoader({animate = true}: Readonly<{animate?: boolean}>) { - return ( - CachyOS Logo - ); -} - export default function Loader({ animate = true, text, @@ -27,3 +13,17 @@ export default function Loader({
); } + +export function LogoLoader({animate = true}: Readonly<{animate?: boolean}>) { + return ( + CachyOS Logo + ); +} diff --git a/src/components/login-form.tsx b/src/components/login-form.tsx new file mode 100644 index 0000000..fbde444 --- /dev/null +++ b/src/components/login-form.tsx @@ -0,0 +1,241 @@ +'use client'; + +import {zodResolver} from '@hookform/resolvers/zod'; +import {Turnstile} from '@marsidev/react-turnstile'; +import Image from 'next/image'; +import {useRouter} from 'next/navigation'; +import {useCallback, useEffect, useState} from 'react'; +import {useForm} from 'react-hook-form'; +import {toast} from 'sonner'; + +import {isLoggedIn, login} from '@/app/actions'; +import {Button} from '@/components/ui/button'; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@/components/ui/card'; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@/components/ui/form'; +import {Input} from '@/components/ui/input'; +import {LoginRequest, LoginRequestSchema} from '@/lib/typings'; +import {cn} from '@/lib/utils'; + +export function LoginForm({className, ...props}: React.ComponentProps<'div'>) { + const router = useRouter(); + const [error, setError] = useState(null); + const [warning, setWarning] = useState(null); + const [submitting, setSubmitting] = useState(false); + const [canRedirect, setCanRedirect] = useState(false); + useEffect(() => { + isLoggedIn().then(redirect => { + if (redirect) { + router.push('/dashboard/package-list'); + } + }); + }, [router]); + const form = useForm({ + defaultValues: { + password: '', + turnstileToken: '', + username: '', + }, + resolver: zodResolver(LoginRequestSchema), + }); + const onSubmit = useCallback( + (data: LoginRequest) => { + if (submitting) { + return; + } + setSubmitting(true); + setCanRedirect(false); + setError(null); + setWarning(null); + const toastId = toast.loading('Logging in...'); + login(data) + .then(res => { + if (res.error) { + setError(res.error); + toast.error('Failed to login with provided credentials', { + closeButton: true, + duration: Infinity, + id: toastId, + }); + } else if (res.warning) { + setWarning(res.warning); + toast.warning( + 'Some servers are not accessible with provided credentials', + { + closeButton: true, + duration: Infinity, + id: toastId, + } + ); + setCanRedirect(true); + } else { + toast.success('Login successful!', {id: toastId}); + setCanRedirect(true); + router.push('/validate'); + } + }) + .catch(() => { + setError('An unexpected error occurred while logging in.'); + toast.error('An unexpected error occurred while logging in.', { + closeButton: true, + duration: Infinity, + id: toastId, + }); + }) + .finally(() => { + setSubmitting(false); + }); + }, + [submitting, router] + ); + return ( +
+ + + CachyOS Logo + + Login to your CachyOS Builder account + + + Enter your email and password to access the CachyOS Builder + Dashboard. + + + +
+ +
+
+ ( + + Username + + + + + + )} + /> +
+
+ ( + + Password + + + + + + )} + /> +
+
+ ( + + Are you a robot? + + { + field.onChange(''); + }} + onExpire={() => { + field.onChange(''); + }} + onSuccess={token => { + field.onChange(token); + }} + onTimeout={() => { + field.onChange(''); + }} + options={{ + appearance: 'always', + size: 'flexible', + theme: 'auto', + }} + siteKey={ + process.env.NEXT_PUBLIC_TURNSTILE_SITE_KEY! + } + {...field} + /> + + + + )} + /> +
+ {error && ( +
+ {error} +
+ )} + {warning && ( +
+ {warning} +
+ )} +
+ {canRedirect ? ( + + ) : ( + + )} +
+
+
+ By signing in, you agree to data processing and privacy policy. + Your ip address and user agent will be stored for security + purposes. +
+
+ +
+
+
+ ); +} diff --git a/src/components/nav-main.tsx b/src/components/nav-main.tsx new file mode 100644 index 0000000..981a44f --- /dev/null +++ b/src/components/nav-main.tsx @@ -0,0 +1,38 @@ +'use client'; + +import {type LucideIcon} from 'lucide-react'; +import Link from 'next/link'; + +import { + SidebarGroup, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from '@/components/ui/sidebar'; + +export function NavMain({ + items, +}: Readonly<{ + items: { + icon: LucideIcon; + name: string; + url: string; + }[]; +}>) { + return ( + + + {items.map(item => ( + + + + + {item.name} + + + + ))} + + + ); +} diff --git a/src/components/nav-secondary.tsx b/src/components/nav-secondary.tsx new file mode 100644 index 0000000..6f63425 --- /dev/null +++ b/src/components/nav-secondary.tsx @@ -0,0 +1,40 @@ +import {type LucideIcon} from 'lucide-react'; +import * as React from 'react'; + +import { + SidebarGroup, + SidebarGroupContent, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, +} from '@/components/ui/sidebar'; + +export function NavSecondary({ + items, + ...props +}: React.ComponentPropsWithoutRef & { + items: { + icon: LucideIcon; + title: string; + url: string; + }[]; +}) { + return ( + + + + {items.map(item => ( + + + + + {item.title} + + + + ))} + + + + ); +} diff --git a/src/components/nav-user.tsx b/src/components/nav-user.tsx new file mode 100644 index 0000000..4255b07 --- /dev/null +++ b/src/components/nav-user.tsx @@ -0,0 +1,103 @@ +'use client'; + +import {BadgeCheck, ChevronsUpDown, LogOut} from 'lucide-react'; + +import {logout} from '@/app/actions'; +import {Avatar, AvatarFallback, AvatarImage} from '@/components/ui/avatar'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from '@/components/ui/sidebar'; +import {UserData} from '@/lib/typings'; + +export function NavUser({ + user, +}: Readonly<{ + user: UserData; +}>) { + const {isMobile} = useSidebar(); + const fallbackName = user.displayName + .split(' ') + .map(n => n.charAt(0)) + .join('') + .toUpperCase(); + + return ( + + + + + + + + + {fallbackName} + + +
+ {user.displayName} + {user.username} +
+ +
+
+ + +
+ + + + {fallbackName} + + +
+ + {user.displayName} + + {user.username} +
+
+
+ + + + + Account + + + + logout()}> + + Log out + +
+
+
+
+ ); +} diff --git a/src/components/server-switcher.tsx b/src/components/server-switcher.tsx new file mode 100644 index 0000000..cc7c0b8 --- /dev/null +++ b/src/components/server-switcher.tsx @@ -0,0 +1,150 @@ +'use client'; + +import {ChevronsUpDown} from 'lucide-react'; +import Image from 'next/image'; +import * as React from 'react'; +import {toast} from 'sonner'; + +import {changeServer} from '@/app/actions'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuShortcut, + DropdownMenuTrigger, +} from '@/components/ui/dropdown-menu'; +import { + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + useSidebar, +} from '@/components/ui/sidebar'; +import {ServerData} from '@/lib/typings'; + +export function ServerSwitcher({ + servers, +}: Readonly<{ + servers: ServerData[]; +}>) { + const {isMobile, setActiveServer: updateActiveServer} = useSidebar(); + const [activeServer, setActiveServer] = React.useState( + null + ); + + React.useEffect(() => { + if (servers.length > 0) { + const defaultServer = servers.find( + server => server.active && server.accessible + ); + if (defaultServer) { + setActiveServer(defaultServer); + } else { + setActiveServer(servers[0]); + } + } + }, [servers]); + + if (!activeServer) { + return null; + } + + return ( + + + + + +
+ CachyOS Logo +
+
+ + {activeServer.name} + + + {activeServer.description} + +
+ +
+
+ + + Build Servers + + {servers.map((server, index) => ( + { + if (server.accessible && server.name !== activeServer.name) { + const toastId = toast.loading( + `Switching to server "${server.name}"...` + ); + changeServer(server.name) + .then(res => { + if (res.error) { + toast.error(res.error, { + closeButton: true, + duration: Infinity, + id: toastId, + }); + } else { + setActiveServer(server); + updateActiveServer(server.name); + toast.success( + res.msg ?? 'Switched server successfully!', + { + id: toastId, + } + ); + } + }) + .catch(() => { + toast.error( + 'Failed to switch server, please try again later.', + { + closeButton: true, + duration: Infinity, + id: toastId, + } + ); + }); + } + }} + > +
+ CachyOS Logo +
+ {server.name} + ⌘{index + 1} +
+ ))} +
+
+
+
+ ); +} diff --git a/components/TerminalComponent.tsx b/src/components/terminal-component.tsx.temp-exclude similarity index 84% rename from components/TerminalComponent.tsx rename to src/components/terminal-component.tsx.temp-exclude index 8ea3218..63bea00 100644 --- a/components/TerminalComponent.tsx +++ b/src/components/terminal-component.tsx.temp-exclude @@ -1,20 +1,20 @@ 'use client'; -import {getPackageLog} from '@/app/actions'; -import {useCtrlFShortcutListener} from '@/lib/hooks'; -import {BuilderPackageArchitecture} from '@/types/BuilderPackage'; -import {RiArrowDownLine, RiArrowUpLine, RiSearchLine} from '@remixicon/react'; -import {TextInput} from '@tremor/react'; import {FitAddon} from '@xterm/addon-fit'; import {SearchAddon} from '@xterm/addon-search'; import {WebLinksAddon} from '@xterm/addon-web-links'; import {WebglAddon} from '@xterm/addon-webgl'; import {Terminal} from '@xterm/xterm'; -import '@xterm/xterm/css/xterm.css'; import styles from 'ansi-styles'; +import {ArrowDownIcon, ArrowUpIcon, SearchIcon} from 'lucide-react'; import {useEffect, useRef, useState} from 'react'; -import Loader from './Loader'; +import Loader from '@/components/loader'; +import {Input} from '@/components/ui/input'; +import {useFindShortcutListener} from '@/hooks/use-find-shortcut-listener'; +import {PackageMArch} from '@/lib/typings'; + +import '@xterm/xterm/css/xterm.css'; const OSC = '\u001B]'; const BEL = '\u0007'; @@ -24,7 +24,7 @@ export default function TerminalComponent({ march, pkgbase, }: Readonly<{ - march: BuilderPackageArchitecture; + march: PackageMArch; pkgbase: string; }>) { const [loaded, setLoaded] = useState(false); @@ -95,13 +95,10 @@ export default function TerminalComponent({ }); }; useEffect(() => { - if ( - !loaded && - ref.current && - inputRef.current && - arrowUpRef.current && - arrowDownRef.current - ) { + const input = inputRef.current; + const arrowUp = arrowUpRef.current; + const arrowDown = arrowDownRef.current; + if (!loaded && ref.current && input && arrowUp && arrowDown) { setLoaded(true); terminal.open(ref.current); terminal.attachCustomKeyEventHandler(e => { @@ -153,7 +150,7 @@ export default function TerminalComponent({ SEP, BEL, ].join('') - ) || + ) ?? `${styles.yellowBright.open}No logs found for this package (Received a blank response).${styles.yellowBright.close}`, () => { setTextLoaded(true); @@ -172,13 +169,13 @@ export default function TerminalComponent({ webLinksAddon.dispose(); webglAddon.dispose(); terminal.dispose(); - inputRef.current?.removeEventListener('input', searchEvent); - arrowUpRef.current?.removeEventListener('click', arrowUpEvent); - arrowDownRef.current?.removeEventListener('click', searchEvent); + input?.removeEventListener('input', searchEvent); + arrowUp?.removeEventListener('click', arrowUpEvent); + arrowDown?.removeEventListener('click', searchEvent); } }; }, [ref, loaded, inputRef, arrowUpRef, arrowDownRef]); - useCtrlFShortcutListener(() => { + useFindShortcutListener(() => { containerRef.current?.classList.remove('md:hidden'); inputRef.current?.focus(); }); @@ -188,17 +185,17 @@ export default function TerminalComponent({
-
- +
- +
>) { + return {children}; +} diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx new file mode 100644 index 0000000..12ae47b --- /dev/null +++ b/src/components/ui/avatar.tsx @@ -0,0 +1,53 @@ +'use client'; + +import * as AvatarPrimitive from '@radix-ui/react-avatar'; +import * as React from 'react'; + +import {cn} from '@/lib/utils'; + +function Avatar({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarFallback({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function AvatarImage({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export {Avatar, AvatarFallback, AvatarImage}; diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx new file mode 100644 index 0000000..defd592 --- /dev/null +++ b/src/components/ui/badge.tsx @@ -0,0 +1,46 @@ +import {Slot} from '@radix-ui/react-slot'; +import {cva, type VariantProps} from 'class-variance-authority'; +import * as React from 'react'; + +import {cn} from '@/lib/utils'; + +const badgeVariants = cva( + 'inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden', + { + defaultVariants: { + variant: 'default', + }, + variants: { + variant: { + default: + 'border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90', + destructive: + 'border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + outline: + 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground', + secondary: + 'border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90', + }, + }, + } +); + +function Badge({ + asChild = false, + className, + variant, + ...props +}: React.ComponentProps<'span'> & + VariantProps & {asChild?: boolean}) { + const Comp = asChild ? Slot : 'span'; + + return ( + + ); +} + +export {Badge, badgeVariants}; diff --git a/src/components/ui/breadcrumb.tsx b/src/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..e5289a8 --- /dev/null +++ b/src/components/ui/breadcrumb.tsx @@ -0,0 +1,109 @@ +import {Slot} from '@radix-ui/react-slot'; +import {ChevronRight, MoreHorizontal} from 'lucide-react'; +import * as React from 'react'; + +import {cn} from '@/lib/utils'; + +function Breadcrumb({...props}: React.ComponentProps<'nav'>) { + return