├── .gitignore ├── src ├── vite-env.d.ts ├── App.tsx ├── lib │ ├── utils.ts │ ├── pca.ts │ └── colorPCA.ts ├── main.tsx ├── components │ ├── ui │ │ ├── skeleton.tsx │ │ ├── input.tsx │ │ ├── progress.tsx │ │ ├── slider.tsx │ │ ├── alert.tsx │ │ ├── button.tsx │ │ └── card.tsx │ ├── Header.tsx │ └── ImageProcessor.tsx └── index.css ├── screenshot.png ├── postcss.config.js ├── public └── images │ └── logo-elemar-jr.png ├── tsconfig.json ├── catalog-info.yaml ├── Dockerfile ├── deploy └── chart │ └── color-reduction-with-pca │ ├── .helmignore │ ├── templates │ ├── service.yaml │ ├── ingress.yaml │ ├── deployment.yaml │ └── _helpers.tpl │ ├── Chart.yaml │ └── values.yaml ├── components.json ├── tsconfig.node.json ├── index.html ├── vite.config.ts ├── tsconfig.app.json ├── eslint.config.js ├── LICENSE ├── package.json ├── tailwind.config.js ├── .github └── workflows │ └── main.yml ├── README.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .env 4 | .DS_Store -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ElemarJR/color-reduction-with-pca/HEAD/screenshot.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /public/images/logo-elemar-jr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ElemarJR/color-reduction-with-pca/HEAD/public/images/logo-elemar-jr.png -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { ImageProcessor } from './components/ImageProcessor'; 3 | 4 | function App() { 5 | return ; 6 | } 7 | export default App; 8 | -------------------------------------------------------------------------------- /src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ], 7 | "compilerOptions": { 8 | "baseUrl": ".", 9 | "paths": { 10 | "@/*": ["./src/*"] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | import App from './App.tsx'; 4 | import './index.css'; 5 | 6 | createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /catalog-info.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: backstage.io/v1alpha1 2 | kind: Component 3 | metadata: 4 | name: color-reduction-with-pca 5 | description: Color reduction with PCA 6 | spec: 7 | type: website 8 | lifecycle: experimental 9 | owner: elemarjr 10 | system: labs 11 | tags: 12 | - react 13 | - tailwind 14 | - vite -------------------------------------------------------------------------------- /src/components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes) { 7 | return ( 8 |
12 | ) 13 | } 14 | 15 | export { Skeleton } 16 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20-alpine AS builder 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json yarn.lock* ./ 6 | 7 | RUN yarn install --frozen-lockfile 8 | 9 | COPY . . 10 | 11 | RUN yarn build 12 | 13 | FROM nginx:1.27-alpine 14 | 15 | COPY --from=builder /app/dist /usr/share/nginx/html/color-reduction-with-pca/ 16 | 17 | EXPOSE 80 18 | 19 | CMD ["nginx", "-g", "daemon off;"] -------------------------------------------------------------------------------- /deploy/chart/color-reduction-with-pca/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /deploy/chart/color-reduction-with-pca/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "${{values.name}}.fullname" . }} 5 | labels: 6 | {{- include "${{values.name}}.labels" . | nindent 4 }} 7 | spec: 8 | type: {{ .Values.service.type }} 9 | ports: 10 | - port: {{ .Values.service.port }} 11 | targetPort: http 12 | protocol: TCP 13 | name: http 14 | selector: 15 | {{- include "${{values.name}}.selectorLabels" . | nindent 4 }} 16 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "src/index.css", 9 | "baseColor": "zinc", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | }, 20 | "iconLibrary": "lucide" 21 | } -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2022", 4 | "lib": ["ES2023"], 5 | "module": "ESNext", 6 | "skipLibCheck": true, 7 | 8 | /* Bundler mode */ 9 | "moduleResolution": "bundler", 10 | "allowImportingTsExtensions": true, 11 | "isolatedModules": true, 12 | "moduleDetection": "force", 13 | "noEmit": true, 14 | 15 | /* Linting */ 16 | "strict": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noFallthroughCasesInSwitch": true 20 | }, 21 | "include": ["vite.config.ts"] 22 | } 23 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | Color Reduction with PCA 12 | 13 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import { defineConfig } from 'vite'; 3 | import react from '@vitejs/plugin-react'; 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig({ 7 | base: '/color-reduction-with-pca/', 8 | plugins: [react()], 9 | optimizeDeps: { 10 | exclude: ['lucide-react'], 11 | }, 12 | resolve: { 13 | alias: { 14 | '@': path.resolve(__dirname, './src'), 15 | }, 16 | }, 17 | server: { 18 | proxy: { 19 | '/wp-content': { 20 | target: 'https://elemarjr.com', 21 | changeOrigin: true, 22 | secure: true, 23 | } 24 | } 25 | }, 26 | }); -------------------------------------------------------------------------------- /tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | "jsx": "react-jsx", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true, 22 | 23 | "baseUrl": ".", 24 | "paths": { 25 | "@/*": [ 26 | "./src/*" 27 | ] 28 | } 29 | }, 30 | "include": ["src", "components/ui"] 31 | } 32 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js'; 2 | import globals from 'globals'; 3 | import reactHooks from 'eslint-plugin-react-hooks'; 4 | import reactRefresh from 'eslint-plugin-react-refresh'; 5 | import tseslint from 'typescript-eslint'; 6 | 7 | export default tseslint.config( 8 | { ignores: ['dist'] }, 9 | { 10 | extends: [js.configs.recommended, ...tseslint.configs.recommended], 11 | files: ['**/*.{ts,tsx}'], 12 | languageOptions: { 13 | ecmaVersion: 2020, 14 | globals: globals.browser, 15 | }, 16 | plugins: { 17 | 'react-hooks': reactHooks, 18 | 'react-refresh': reactRefresh, 19 | }, 20 | rules: { 21 | ...reactHooks.configs.recommended.rules, 22 | 'react-refresh/only-export-components': [ 23 | 'warn', 24 | { allowConstantExport: true }, 25 | ], 26 | }, 27 | } 28 | ); 29 | -------------------------------------------------------------------------------- /src/components/ui/input.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Input = React.forwardRef>( 6 | ({ className, type, ...props }, ref) => { 7 | return ( 8 | 17 | ) 18 | } 19 | ) 20 | Input.displayName = "Input" 21 | 22 | export { Input } 23 | -------------------------------------------------------------------------------- /src/components/ui/progress.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import * as ProgressPrimitive from "@radix-ui/react-progress" 3 | 4 | import { cn } from "@/lib/utils" 5 | 6 | const Progress = React.forwardRef< 7 | React.ElementRef, 8 | React.ComponentPropsWithoutRef 9 | >(({ className, value, ...props }, ref) => ( 10 | 18 | 22 | 23 | )) 24 | Progress.displayName = ProgressPrimitive.Root.displayName 25 | 26 | export { Progress } 27 | -------------------------------------------------------------------------------- /src/components/ui/slider.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import * as SliderPrimitive from "@radix-ui/react-slider" 3 | 4 | import { cn } from "@/lib/utils" 5 | 6 | const Slider = React.forwardRef< 7 | React.ElementRef, 8 | React.ComponentPropsWithoutRef 9 | >(({ className, ...props }, ref) => ( 10 | 18 | 19 | 20 | 21 | 22 | 23 | )) 24 | Slider.displayName = SliderPrimitive.Root.displayName 25 | 26 | export { Slider } 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Elemar Rodrigues Severo Junior 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /deploy/chart/color-reduction-with-pca/templates/ingress.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.ingress.enabled -}} 2 | {{- $fullName := include "${{values.name}}.fullname" . -}} 3 | {{- $svcPort := .Values.service.port -}} 4 | apiVersion: networking.k8s.io/v1 5 | kind: Ingress 6 | metadata: 7 | name: {{ $fullName }} 8 | labels: 9 | {{- include "${{values.name}}.labels" . | nindent 4 }} 10 | {{- with .Values.ingress.annotations }} 11 | annotations: 12 | {{- toYaml . | nindent 4 }} 13 | {{- end }} 14 | spec: 15 | ingressClassName: {{ .Values.ingress.className }} 16 | {{- if .Values.ingress.tls }} 17 | tls: 18 | {{- range .Values.ingress.tls }} 19 | - hosts: 20 | {{- range .hosts }} 21 | - {{ . | quote }} 22 | {{- end }} 23 | secretName: {{ .secretName }} 24 | {{- end }} 25 | {{- end }} 26 | rules: 27 | {{- range .Values.ingress.hosts }} 28 | - host: {{ .host | quote }} 29 | http: 30 | paths: 31 | {{- range .paths }} 32 | - path: {{ .path }} 33 | pathType: {{ .pathType }} 34 | backend: 35 | service: 36 | name: {{ $fullName }} 37 | port: 38 | number: {{ $svcPort }} 39 | {{- end }} 40 | {{- end }} 41 | {{- end }} 42 | -------------------------------------------------------------------------------- /deploy/chart/color-reduction-with-pca/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v2 2 | name: color-reduction-with-pca 3 | description: A helm chart for color-reduction-with-pca 4 | 5 | # A chart can be either an 'application' or a 'library' chart. 6 | # 7 | # Application charts are a collection of templates that can be packaged into versioned archives 8 | # to be deployed. 9 | # 10 | # Library charts provide useful utilities or functions for the chart developer. They're included as 11 | # a dependency of application charts to inject those utilities and functions into the rendering 12 | # pipeline. Library charts do not define any templates and therefore cannot be deployed. 13 | type: application 14 | 15 | # This is the chart version. This version number should be incremented each time you make changes 16 | # to the chart and its templates, including the app version. 17 | # Versions are expected to follow Semantic Versioning (https://semver.org/) 18 | version: 1.0.0 19 | 20 | # This is the version number of the application being deployed. This version number should be 21 | # incremented each time you make changes to the application. Versions are not expected to 22 | # follow Semantic Versioning. They should reflect the version the application is using. 23 | # It is recommended to use it with quotes. 24 | appVersion: "1.0.0" 25 | -------------------------------------------------------------------------------- /deploy/chart/color-reduction-with-pca/values.yaml: -------------------------------------------------------------------------------- 1 | replicaCount: 1 2 | 3 | image: 4 | repository: nginx 5 | pullPolicy: Always 6 | tag: latest 7 | 8 | podAnnotations: {} 9 | podLabels: {} 10 | 11 | service: 12 | type: ClusterIP 13 | port: 80 14 | 15 | ingress: 16 | enabled: true 17 | className: nginx 18 | annotations: 19 | cert-manager.io/issuer: "letsencrypt" 20 | hosts: 21 | - host: labs.elemarjr.com 22 | paths: 23 | - path: /color-reduction-with-pca 24 | pathType: Prefix 25 | tls: 26 | - secretName: color-reduction-with-pca-tls 27 | hosts: 28 | - labs.elemarjr.com 29 | 30 | resources: {} 31 | # We usually recommend not to specify default resources and to leave this as a conscious 32 | # choice for the user. This also increases chances charts run on environments with little 33 | # resources, such as Minikube. If you do want to specify resources, uncomment the following 34 | # lines, adjust them as necessary, and remove the curly braces after 'resources:'. 35 | # limits: 36 | # cpu: 100m 37 | # memory: 128Mi 38 | # requests: 39 | # cpu: 100m 40 | # memory: 128Mi 41 | 42 | # livenessProbe: 43 | # httpGet: 44 | # path: / 45 | # port: http 46 | 47 | # readinessProbe: 48 | # httpGet: 49 | # path: / 50 | # port: http 51 | 52 | envVars: [] 53 | 54 | 55 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-react-typescript-starter", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "@fortawesome/fontawesome-svg-core": "^6.6.0", 14 | "@fortawesome/free-brands-svg-icons": "^6.6.0", 15 | "@fortawesome/free-solid-svg-icons": "^6.6.0", 16 | "@fortawesome/react-fontawesome": "^0.2.2", 17 | "@radix-ui/react-progress": "^1.1.0", 18 | "@radix-ui/react-slider": "^1.2.1", 19 | "@radix-ui/react-slot": "^1.1.0", 20 | "class-variance-authority": "^0.7.0", 21 | "clsx": "^2.1.1", 22 | "lucide-react": "^0.344.0", 23 | "react": "^18.3.1", 24 | "react-dom": "^18.3.1", 25 | "tailwind-merge": "^2.5.4", 26 | "tailwindcss-animate": "^1.0.7" 27 | }, 28 | "devDependencies": { 29 | "@eslint/js": "^9.9.1", 30 | "@types/node": "^22.9.0", 31 | "@types/react": "^18.3.5", 32 | "@types/react-dom": "^18.3.0", 33 | "@vitejs/plugin-react": "^4.3.1", 34 | "autoprefixer": "^10.4.18", 35 | "eslint": "^9.9.1", 36 | "eslint-plugin-react-hooks": "^5.1.0-rc.0", 37 | "eslint-plugin-react-refresh": "^0.4.11", 38 | "globals": "^15.9.0", 39 | "postcss": "^8.4.35", 40 | "tailwindcss": "^3.4.1", 41 | "typescript": "^5.5.3", 42 | "typescript-eslint": "^8.3.0", 43 | "vite": "^5.4.2" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /deploy/chart/color-reduction-with-pca/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: {{ include "${{values.name}}.fullname" . }} 5 | labels: 6 | {{- include "${{values.name}}.labels" . | nindent 4 }} 7 | spec: 8 | replicas: {{ .Values.replicaCount }} 9 | selector: 10 | matchLabels: 11 | {{- include "${{values.name}}.selectorLabels" . | nindent 6 }} 12 | template: 13 | metadata: 14 | {{- with .Values.podAnnotations }} 15 | annotations: 16 | {{- toYaml . | nindent 8 }} 17 | {{- end }} 18 | labels: 19 | {{- include "${{values.name}}.labels" . | nindent 8 }} 20 | {{- with .Values.podLabels }} 21 | {{- toYaml . | nindent 8 }} 22 | {{- end }} 23 | spec: 24 | containers: 25 | - name: {{ .Chart.Name }} 26 | image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" 27 | imagePullPolicy: {{ .Values.image.pullPolicy }} 28 | ports: 29 | - name: http 30 | containerPort: {{ .Values.service.port }} 31 | protocol: TCP 32 | env: 33 | {{- toYaml .Values.envVars | nindent 12 }} 34 | 35 | livenessProbe: 36 | {{- toYaml .Values.livenessProbe | nindent 12 }} 37 | readinessProbe: 38 | {{- toYaml .Values.readinessProbe | nindent 12 }} 39 | resources: 40 | {{- toYaml .Values.resources | nindent 12 }} 41 | -------------------------------------------------------------------------------- /src/components/ui/alert.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { cva, type VariantProps } from "class-variance-authority" 3 | 4 | import { cn } from "@/lib/utils" 5 | 6 | const alertVariants = cva( 7 | "relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7", 8 | { 9 | variants: { 10 | variant: { 11 | default: "bg-background text-foreground", 12 | destructive: 13 | "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", 14 | }, 15 | }, 16 | defaultVariants: { 17 | variant: "default", 18 | }, 19 | } 20 | ) 21 | 22 | const Alert = React.forwardRef< 23 | HTMLDivElement, 24 | React.HTMLAttributes & VariantProps 25 | >(({ className, variant, ...props }, ref) => ( 26 |
32 | )) 33 | Alert.displayName = "Alert" 34 | 35 | const AlertTitle = React.forwardRef< 36 | HTMLParagraphElement, 37 | React.HTMLAttributes 38 | >(({ className, ...props }, ref) => ( 39 |
44 | )) 45 | AlertTitle.displayName = "AlertTitle" 46 | 47 | const AlertDescription = React.forwardRef< 48 | HTMLParagraphElement, 49 | React.HTMLAttributes 50 | >(({ className, ...props }, ref) => ( 51 |
56 | )) 57 | AlertDescription.displayName = "AlertDescription" 58 | 59 | export { Alert, AlertTitle, AlertDescription } 60 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | darkMode: ['class'], 4 | content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], 5 | theme: { 6 | extend: { 7 | fontFamily: { 8 | sans: ['var(--font-sans)'], 9 | }, 10 | borderRadius: { 11 | lg: 'var(--radius)', 12 | md: 'calc(var(--radius) - 2px)', 13 | sm: 'calc(var(--radius) - 4px)' 14 | }, 15 | colors: { 16 | background: 'hsl(var(--background))', 17 | foreground: 'hsl(var(--foreground))', 18 | card: { 19 | DEFAULT: 'hsl(var(--card))', 20 | foreground: 'hsl(var(--card-foreground))' 21 | }, 22 | popover: { 23 | DEFAULT: 'hsl(var(--popover))', 24 | foreground: 'hsl(var(--popover-foreground))' 25 | }, 26 | primary: { 27 | DEFAULT: 'hsl(var(--primary))', 28 | foreground: 'hsl(var(--primary-foreground))' 29 | }, 30 | secondary: { 31 | DEFAULT: 'hsl(var(--secondary))', 32 | foreground: 'hsl(var(--secondary-foreground))' 33 | }, 34 | muted: { 35 | DEFAULT: 'hsl(var(--muted))', 36 | foreground: 'hsl(var(--muted-foreground))' 37 | }, 38 | accent: { 39 | DEFAULT: 'hsl(var(--accent))', 40 | foreground: 'hsl(var(--accent-foreground))' 41 | }, 42 | destructive: { 43 | DEFAULT: 'hsl(var(--destructive))', 44 | foreground: 'hsl(var(--destructive-foreground))' 45 | }, 46 | border: 'hsl(var(--border))', 47 | input: 'hsl(var(--input))', 48 | ring: 'hsl(var(--ring))', 49 | chart: { 50 | '1': 'hsl(var(--chart-1))', 51 | '2': 'hsl(var(--chart-2))', 52 | '3': 'hsl(var(--chart-3))', 53 | '4': 'hsl(var(--chart-4))', 54 | '5': 'hsl(var(--chart-5))' 55 | } 56 | } 57 | } 58 | }, 59 | plugins: [require("tailwindcss-animate")], 60 | }; 61 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Docker Image CI 2 | 3 | on: 4 | push: 5 | branches: [ "main" ] 6 | pull_request: 7 | branches: [ "main" ] 8 | 9 | permissions: 10 | id-token: write 11 | contents: read 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v4 18 | 19 | - name: Build the Docker image 20 | run: docker build . --tag 339713015367.dkr.ecr.us-east-1.amazonaws.com/labs/color-reduction-with-pca:${{ github.run_id }} --tag 339713015367.dkr.ecr.us-east-1.amazonaws.com/labs/color-reduction-with-pca:latest 21 | 22 | - name: configure aws credentials 23 | uses: aws-actions/configure-aws-credentials@v3 24 | with: 25 | role-to-assume: arn:aws:iam::339713015367:role/GithubIdentityProviderRole 26 | role-session-name: GithubSession 27 | aws-region: us-east-1 28 | 29 | - name: Amazon ECR Login 30 | uses: aws-actions/amazon-ecr-login@v2 31 | 32 | - name: Push Docker images 33 | run: | 34 | docker image push 339713015367.dkr.ecr.us-east-1.amazonaws.com/labs/color-reduction-with-pca:${{ github.run_id }} 35 | docker image push 339713015367.dkr.ecr.us-east-1.amazonaws.com/labs/color-reduction-with-pca:latest 36 | 37 | deploy: 38 | runs-on: ubuntu-latest 39 | needs: build 40 | steps: 41 | - uses: actions/checkout@v4 42 | - name: configure aws credentials 43 | uses: aws-actions/configure-aws-credentials@v3 44 | with: 45 | role-to-assume: arn:aws:iam::339713015367:role/GithubIdentityProviderRole 46 | role-session-name: GithubSession 47 | aws-region: us-east-1 48 | 49 | - name: Deploy Backend 50 | run: | 51 | aws eks update-kubeconfig --name ia-factory-cluster --region us-east-1 52 | helm upgrade --install color-reduction-with-pca ./deploy/chart/color-reduction-with-pca --namespace labs --set image.repository=339713015367.dkr.ecr.us-east-1.amazonaws.com/labs/color-reduction-with-pca --set image.tag=${{ github.run_id }} --wait --create-namespace 53 | -------------------------------------------------------------------------------- /src/components/ui/button.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { Slot } from "@radix-ui/react-slot" 3 | import { cva, type VariantProps } from "class-variance-authority" 4 | 5 | import { cn } from "@/lib/utils" 6 | 7 | const buttonVariants = cva( 8 | "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", 9 | { 10 | variants: { 11 | variant: { 12 | default: 13 | "bg-primary text-primary-foreground shadow hover:bg-primary/90", 14 | destructive: 15 | "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", 16 | outline: 17 | "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", 18 | secondary: 19 | "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", 20 | ghost: "hover:bg-accent hover:text-accent-foreground", 21 | link: "text-primary underline-offset-4 hover:underline", 22 | }, 23 | size: { 24 | default: "h-9 px-4 py-2", 25 | sm: "h-8 rounded-md px-3 text-xs", 26 | lg: "h-10 rounded-md px-8", 27 | icon: "h-9 w-9", 28 | }, 29 | }, 30 | defaultVariants: { 31 | variant: "default", 32 | size: "default", 33 | }, 34 | } 35 | ) 36 | 37 | export interface ButtonProps 38 | extends React.ButtonHTMLAttributes, 39 | VariantProps { 40 | asChild?: boolean 41 | } 42 | 43 | const Button = React.forwardRef( 44 | ({ className, variant, size, asChild = false, ...props }, ref) => { 45 | const Comp = asChild ? Slot : "button" 46 | return ( 47 | 52 | ) 53 | } 54 | ) 55 | Button.displayName = "Button" 56 | 57 | export { Button, buttonVariants } 58 | -------------------------------------------------------------------------------- /src/components/ui/card.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Card = React.forwardRef< 6 | HTMLDivElement, 7 | React.HTMLAttributes 8 | >(({ className, ...props }, ref) => ( 9 |
17 | )) 18 | Card.displayName = "Card" 19 | 20 | const CardHeader = React.forwardRef< 21 | HTMLDivElement, 22 | React.HTMLAttributes 23 | >(({ className, ...props }, ref) => ( 24 |
29 | )) 30 | CardHeader.displayName = "CardHeader" 31 | 32 | const CardTitle = React.forwardRef< 33 | HTMLDivElement, 34 | React.HTMLAttributes 35 | >(({ className, ...props }, ref) => ( 36 |
41 | )) 42 | CardTitle.displayName = "CardTitle" 43 | 44 | const CardDescription = React.forwardRef< 45 | HTMLDivElement, 46 | React.HTMLAttributes 47 | >(({ className, ...props }, ref) => ( 48 |
53 | )) 54 | CardDescription.displayName = "CardDescription" 55 | 56 | const CardContent = React.forwardRef< 57 | HTMLDivElement, 58 | React.HTMLAttributes 59 | >(({ className, ...props }, ref) => ( 60 |
61 | )) 62 | CardContent.displayName = "CardContent" 63 | 64 | const CardFooter = React.forwardRef< 65 | HTMLDivElement, 66 | React.HTMLAttributes 67 | >(({ className, ...props }, ref) => ( 68 |
73 | )) 74 | CardFooter.displayName = "CardFooter" 75 | 76 | export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } 77 | -------------------------------------------------------------------------------- /deploy/chart/color-reduction-with-pca/templates/_helpers.tpl: -------------------------------------------------------------------------------- 1 | {{/* 2 | Expand the name of the chart. 3 | */}} 4 | {{- define "${{values.name}}.name" -}} 5 | {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} 6 | {{- end }} 7 | 8 | {{/* 9 | Create a default fully qualified app name. 10 | We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). 11 | If release name contains chart name it will be used as a full name. 12 | */}} 13 | {{- define "${{values.name}}.fullname" -}} 14 | {{- if .Values.fullnameOverride }} 15 | {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} 16 | {{- else }} 17 | {{- $name := default .Chart.Name .Values.nameOverride }} 18 | {{- if contains $name .Release.Name }} 19 | {{- .Release.Name | trunc 63 | trimSuffix "-" }} 20 | {{- else }} 21 | {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} 22 | {{- end }} 23 | {{- end }} 24 | {{- end }} 25 | 26 | {{/* 27 | Create chart name and version as used by the chart label. 28 | */}} 29 | {{- define "${{values.name}}.chart" -}} 30 | {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} 31 | {{- end }} 32 | 33 | {{/* 34 | Common labels 35 | */}} 36 | {{- define "${{values.name}}.labels" -}} 37 | helm.sh/chart: {{ include "${{values.name}}.chart" . }} 38 | {{ include "${{values.name}}.selectorLabels" . }} 39 | {{- if .Chart.AppVersion }} 40 | app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} 41 | {{- end }} 42 | app.kubernetes.io/managed-by: {{ .Release.Service }} 43 | {{- end }} 44 | 45 | {{/* 46 | Selector labels 47 | */}} 48 | {{- define "${{values.name}}.selectorLabels" -}} 49 | app.kubernetes.io/name: {{ include "${{values.name}}.name" . }} 50 | app.kubernetes.io/instance: {{ .Release.Name }} 51 | {{- end }} 52 | 53 | {{/* 54 | Create the name of the service account to use 55 | */}} 56 | {{- define "${{values.name}}.serviceAccountName" -}} 57 | {{- if .Values.serviceAccount.create }} 58 | {{- default (include "${{values.name}}.fullname" .) .Values.serviceAccount.name }} 59 | {{- else }} 60 | {{- default "default" .Values.serviceAccount.name }} 61 | {{- end }} 62 | {{- end }} 63 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700&display=swap'); 2 | 3 | @tailwind base; 4 | @tailwind components; 5 | @tailwind utilities; 6 | 7 | @layer base { 8 | :root { 9 | --background: 0 0% 100%; 10 | --foreground: 240 10% 3.9%; 11 | --card: 0 0% 100%; 12 | --card-foreground: 240 10% 3.9%; 13 | --popover: 0 0% 100%; 14 | --popover-foreground: 240 10% 3.9%; 15 | --primary: 240 5.9% 10%; 16 | --primary-foreground: 0 0% 98%; 17 | --secondary: 240 4.8% 95.9%; 18 | --secondary-foreground: 240 5.9% 10%; 19 | --muted: 240 4.8% 95.9%; 20 | --muted-foreground: 240 3.8% 46.1%; 21 | --accent: 240 4.8% 95.9%; 22 | --accent-foreground: 240 5.9% 10%; 23 | --destructive: 0 84.2% 60.2%; 24 | --destructive-foreground: 0 0% 98%; 25 | --border: 240 5.9% 90%; 26 | --input: 240 5.9% 90%; 27 | --ring: 240 10% 3.9%; 28 | --chart-1: 12 76% 61%; 29 | --chart-2: 173 58% 39%; 30 | --chart-3: 197 37% 24%; 31 | --chart-4: 43 74% 66%; 32 | --chart-5: 27 87% 67%; 33 | --radius: 0.5rem; 34 | --font-sans: 'Montserrat', sans-serif; 35 | } 36 | .dark { 37 | --background: 240 10% 3.9%; 38 | --foreground: 0 0% 98%; 39 | --card: 240 10% 3.9%; 40 | --card-foreground: 0 0% 98%; 41 | --popover: 240 10% 3.9%; 42 | --popover-foreground: 0 0% 98%; 43 | --primary: 0 0% 98%; 44 | --primary-foreground: 240 5.9% 10%; 45 | --secondary: 240 3.7% 15.9%; 46 | --secondary-foreground: 0 0% 98%; 47 | --muted: 240 3.7% 15.9%; 48 | --muted-foreground: 240 5% 64.9%; 49 | --accent: 240 3.7% 15.9%; 50 | --accent-foreground: 0 0% 98%; 51 | --destructive: 0 62.8% 30.6%; 52 | --destructive-foreground: 0 0% 98%; 53 | --border: 240 3.7% 15.9%; 54 | --input: 240 3.7% 15.9%; 55 | --ring: 240 4.9% 83.9%; 56 | --chart-1: 220 70% 50%; 57 | --chart-2: 160 60% 45%; 58 | --chart-3: 30 80% 55%; 59 | --chart-4: 280 65% 60%; 60 | --chart-5: 340 75% 55% 61 | } 62 | } 63 | @layer base { 64 | * { 65 | @apply border-border; 66 | } 67 | body { 68 | @apply bg-background text-foreground font-sans; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Color Reduction with PCA 2 | 3 | A React application that reduces the color palette of images using Principal Component Analysis (PCA) and K-means clustering algorithms. 4 | 5 | ![Color Reduction App Screenshot](screenshot.png) 6 | 7 | ## Features 8 | 9 | - Upload and process images to reduce their color palette 10 | - Adjustable number of target colors (2-512) 11 | - Real-time progress tracking with percentage completion 12 | - Side-by-side comparison of original and processed images 13 | - Visual representation of the reduced color palette 14 | - Count of unique colors in original and processed images 15 | - Download processed images in PNG format 16 | - Responsive design for mobile and desktop 17 | - Dark mode support 18 | 19 | ## Tech Stack 20 | 21 | - React 18 22 | - TypeScript 23 | - Vite 24 | - Tailwind CSS 25 | - Radix UI (for accessible components) 26 | - Lucide React (for icons) 27 | - Font Awesome (for social media icons) 28 | - shadcn/ui components 29 | 30 | ## Getting Started 31 | 32 | ### Prerequisites 33 | 34 | - Node.js (v18 or higher recommended) 35 | - npm or yarn 36 | 37 | ### Installation 38 | 39 | 1. Clone the repository: 40 | ```bash 41 | git clone https://github.com/yourusername/color-reduction-pca.git 42 | ``` 43 | 44 | 2. Navigate to the project directory: 45 | ```bash 46 | cd color-reduction-pca 47 | ``` 48 | 49 | 3. Install dependencies: 50 | ```bash 51 | npm install 52 | # or 53 | yarn install 54 | ``` 55 | 56 | ### Running the Application 57 | 58 | 1. Start the development server: 59 | ```bash 60 | npm run dev 61 | # or 62 | yarn dev 63 | ``` 64 | 65 | 2. Open your browser and navigate to `http://localhost:5173` 66 | 67 | ## Usage 68 | 69 | 1. Click the "Upload Image" button to select an image from your computer 70 | 2. Use the slider to select the desired number of colors (2-256) 71 | 3. Click "Process Image" to start the color reduction 72 | 4. Wait for the processing to complete 73 | 5. View the results and compare the original and processed images 74 | 6. Download the processed image if desired 75 | 76 | ## Contributing 77 | 78 | 1. Fork the repository 79 | 2. Create your feature branch (`git checkout -b feature/amazing-feature`) 80 | 3. Commit your changes (`git commit -m 'Add some amazing feature'`) 81 | 4. Push to the branch (`git push origin feature/amazing-feature`) 82 | 5. Open a Pull Request 83 | 84 | ## License 85 | 86 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. 87 | 88 | ## Technical Implementation 89 | 90 | ### Color Reduction Algorithm 91 | 92 | The application uses two main algorithms to reduce the color palette: 93 | 94 | 1. **K-means Clustering**: Groups similar colors together by: 95 | - Randomly selecting initial centroids 96 | - Assigning colors to nearest centroids 97 | - Recalculating centroids based on cluster means 98 | - Repeating until convergence or max iterations reached 99 | 100 | 2. **Principal Component Analysis (PCA)**: 101 | - Reduces dimensionality of color data 102 | - Implemented using power iteration method 103 | - Helps in finding main color variations 104 | 105 | ### System Requirements 106 | 107 | - Modern web browser with WebGL support 108 | - Sufficient RAM for processing large images 109 | - Node.js v18 or higher 110 | - npm v7 or higher or yarn v1.22 or higher 111 | 112 | ### Browser Compatibility 113 | 114 | - Chrome (latest) 115 | - Firefox (latest) 116 | - Safari (latest) 117 | - Edge (latest) 118 | -------------------------------------------------------------------------------- /src/lib/pca.ts: -------------------------------------------------------------------------------- 1 | export class PCA { 2 | private mean: number[] = []; 3 | private eigenvectors: number[][] = []; 4 | 5 | // Standardize the data 6 | private standardize(data: number[][]): number[][] { 7 | const n = data.length; 8 | const p = data[0].length; 9 | this.mean = new Array(p).fill(0); 10 | 11 | // Calculate mean 12 | for (let i = 0; i < n; i++) { 13 | for (let j = 0; j < p; j++) { 14 | this.mean[j] += data[i][j]; 15 | } 16 | } 17 | this.mean = this.mean.map(m => m / n); 18 | 19 | // Center the data 20 | return data.map(row => 21 | row.map((val, j) => val - this.mean[j]) 22 | ); 23 | } 24 | 25 | // Calculate covariance matrix 26 | private covariance(data: number[][]): number[][] { 27 | const n = data.length; 28 | const p = data[0].length; 29 | const cov = Array(p).fill(0).map(() => Array(p).fill(0)); 30 | 31 | for (let i = 0; i < p; i++) { 32 | for (let j = 0; j < p; j++) { 33 | let sum = 0; 34 | for (let k = 0; k < n; k++) { 35 | sum += data[k][i] * data[k][j]; 36 | } 37 | cov[i][j] = sum / (n - 1); 38 | } 39 | } 40 | return cov; 41 | } 42 | 43 | // Power iteration method to find principal eigenvector 44 | private powerIteration(matrix: number[][], iterations: number = 100): number[] { 45 | const n = matrix.length; 46 | let eigenvector = Array(n).fill(0).map(() => Math.random()); 47 | 48 | for (let iter = 0; iter < iterations; iter++) { 49 | // Matrix multiplication 50 | const newVector = Array(n).fill(0); 51 | for (let i = 0; i < n; i++) { 52 | for (let j = 0; j < n; j++) { 53 | newVector[i] += matrix[i][j] * eigenvector[j]; 54 | } 55 | } 56 | 57 | // Normalize 58 | const norm = Math.sqrt(newVector.reduce((sum, val) => sum + val * val, 0)); 59 | eigenvector = newVector.map(val => val / norm); 60 | } 61 | 62 | return eigenvector; 63 | } 64 | 65 | // Fit the PCA model 66 | public fit(data: number[][], components: number): void { 67 | const standardizedData = this.standardize(data); 68 | const covMatrix = this.covariance(standardizedData); 69 | 70 | this.eigenvectors = []; 71 | let currentMatrix = covMatrix; 72 | 73 | for (let i = 0; i < components; i++) { 74 | const eigenvector = this.powerIteration(currentMatrix); 75 | this.eigenvectors.push(eigenvector); 76 | 77 | // Deflate the matrix 78 | const projection = Array(covMatrix.length).fill(0).map(() => Array(covMatrix.length).fill(0)); 79 | for (let j = 0; j < covMatrix.length; j++) { 80 | for (let k = 0; k < covMatrix.length; k++) { 81 | projection[j][k] = eigenvector[j] * eigenvector[k]; 82 | } 83 | } 84 | 85 | currentMatrix = currentMatrix.map((row, j) => 86 | row.map((val, k) => val - projection[j][k]) 87 | ); 88 | } 89 | } 90 | 91 | // Transform data using fitted PCA 92 | public transform(data: number[][]): number[][] { 93 | const centered = data.map(row => 94 | row.map((val, j) => val - this.mean[j]) 95 | ); 96 | 97 | return centered.map(row => 98 | this.eigenvectors.map(eigenvector => 99 | row.reduce((sum, val, j) => sum + val * eigenvector[j], 0) 100 | ) 101 | ); 102 | } 103 | 104 | // Inverse transform to reconstruct original data 105 | public inverseTransform(transformed: number[][]): number[][] { 106 | return transformed.map(row => 107 | Array(this.mean.length).fill(0).map((_, i) => 108 | row.reduce((sum, val, j) => sum + val * this.eigenvectors[j][i], 0) + this.mean[i] 109 | ) 110 | ); 111 | } 112 | } -------------------------------------------------------------------------------- /src/lib/colorPCA.ts: -------------------------------------------------------------------------------- 1 | export class ColorPCA { 2 | private uniqueColors: number[][] = []; 3 | private reducedColors: number[][] = []; 4 | private colorMap: Map = new Map(); 5 | private onProgress?: (progress: number) => void; 6 | 7 | constructor(onProgress?: (progress: number) => void) { 8 | this.onProgress = onProgress; 9 | } 10 | 11 | private rgbToKey(rgb: number[]): string { 12 | return rgb.join(','); 13 | } 14 | 15 | private colorDistance(color1: number[], color2: number[]): number { 16 | return Math.sqrt( 17 | Math.pow(color1[0] - color2[0], 2) + 18 | Math.pow(color1[1] - color2[1], 2) + 19 | Math.pow(color1[2] - color2[2], 2) 20 | ); 21 | } 22 | 23 | private findClosestColor(color: number[]): number[] { 24 | let minDistance = Infinity; 25 | let closestColor = color; 26 | 27 | for (const reducedColor of this.reducedColors) { 28 | const distance = this.colorDistance(color, reducedColor); 29 | if (distance < minDistance) { 30 | minDistance = distance; 31 | closestColor = reducedColor; 32 | } 33 | } 34 | 35 | return closestColor; 36 | } 37 | 38 | private kMeans(colors: number[][], k: number, maxIterations: number = 10): number[][] { 39 | const centroids = colors 40 | .sort(() => Math.random() - 0.5) 41 | .slice(0, k) 42 | .map(color => [...color]); 43 | 44 | for (let iteration = 0; iteration < maxIterations; iteration++) { 45 | if (this.onProgress) { 46 | const progress = (iteration / maxIterations) * 50; 47 | this.onProgress(progress); 48 | } 49 | 50 | const clusters: number[][][] = Array(k).fill(null).map(() => []); 51 | 52 | for (const color of colors) { 53 | let minDistance = Infinity; 54 | let closestCentroidIndex = 0; 55 | 56 | for (let i = 0; i < centroids.length; i++) { 57 | const distance = this.colorDistance(color, centroids[i]); 58 | if (distance < minDistance) { 59 | minDistance = distance; 60 | closestCentroidIndex = i; 61 | } 62 | } 63 | 64 | clusters[closestCentroidIndex].push(color); 65 | } 66 | 67 | let changed = false; 68 | for (let i = 0; i < k; i++) { 69 | if (clusters[i].length === 0) continue; 70 | 71 | const newCentroid = clusters[i].reduce( 72 | (acc, color) => color.map((v, j) => acc[j] + v), 73 | [0, 0, 0] 74 | ).map(v => Math.round(v / clusters[i].length)); 75 | 76 | if (JSON.stringify(newCentroid) !== JSON.stringify(centroids[i])) { 77 | centroids[i] = newCentroid; 78 | changed = true; 79 | } 80 | } 81 | 82 | if (!changed) break; 83 | } 84 | 85 | return centroids; 86 | } 87 | 88 | public processImage(imageData: Uint8ClampedArray, numColors: number): Uint8ClampedArray { 89 | if (this.onProgress) { 90 | this.onProgress(5); 91 | } 92 | 93 | const uniqueColorsSet = new Set(); 94 | for (let i = 0; i < imageData.length; i += 4) { 95 | const rgb = [imageData[i], imageData[i + 1], imageData[i + 2]]; 96 | uniqueColorsSet.add(this.rgbToKey(rgb)); 97 | } 98 | 99 | this.uniqueColors = Array.from(uniqueColorsSet).map(key => 100 | key.split(',').map(Number) 101 | ); 102 | 103 | if (this.onProgress) { 104 | this.onProgress(10); 105 | } 106 | 107 | this.reducedColors = this.kMeans(this.uniqueColors, numColors); 108 | 109 | if (this.onProgress) { 110 | this.onProgress(60); 111 | } 112 | 113 | for (const color of this.uniqueColors) { 114 | const closestColor = this.findClosestColor(color); 115 | this.colorMap.set(this.rgbToKey(color), closestColor); 116 | } 117 | 118 | if (this.onProgress) { 119 | this.onProgress(80); 120 | } 121 | 122 | const newImageData = new Uint8ClampedArray(imageData.length); 123 | const totalPixels = imageData.length / 4; 124 | 125 | for (let i = 0; i < imageData.length; i += 4) { 126 | const rgb = [imageData[i], imageData[i + 1], imageData[i + 2]]; 127 | const newColor = this.colorMap.get(this.rgbToKey(rgb)) || rgb; 128 | 129 | newImageData[i] = newColor[0]; 130 | newImageData[i + 1] = newColor[1]; 131 | newImageData[i + 2] = newColor[2]; 132 | newImageData[i + 3] = imageData[i + 3]; 133 | 134 | if (this.onProgress && i % 10000 === 0) { 135 | const pixelProgress = (i / 4) / totalPixels; 136 | this.onProgress(80 + pixelProgress * 20); 137 | } 138 | } 139 | 140 | if (this.onProgress) { 141 | this.onProgress(100); 142 | } 143 | 144 | return newImageData; 145 | } 146 | 147 | public getReducedColors(): number[][] { 148 | return this.reducedColors; 149 | } 150 | } -------------------------------------------------------------------------------- /src/components/Header.tsx: -------------------------------------------------------------------------------- 1 | import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; 2 | import { 3 | faMicrophoneAlt, 4 | faNewspaper, 5 | } from "@fortawesome/free-solid-svg-icons"; 6 | import { 7 | faLinkedinIn, 8 | faInstagram, 9 | faYoutube, 10 | faXTwitter, 11 | faGithub, 12 | } from "@fortawesome/free-brands-svg-icons"; 13 | import { ExternalLink } from "lucide-react"; 14 | 15 | export function Header() { 16 | return ( 17 | <> 18 |
19 | 155 |
156 |
157 |
158 |
159 |

160 | This example was developed by Elemar JR for an Algorithms and Data 161 | Structures masterclass, focusing on dimensionality reduction using 162 | Principal Component Analysis (PCA). The complete class recording, 163 | including in-depth explanations and implementation details, is 164 | available exclusively for{" "} 165 | 171 | Study Club members 172 | 173 | 174 |

175 |
176 |
177 |
178 | 179 | ); 180 | } 181 | -------------------------------------------------------------------------------- /src/components/ImageProcessor.tsx: -------------------------------------------------------------------------------- 1 | import React, { useCallback, useRef, useState } from 'react'; 2 | import { Upload, Play, Palette, X, Download } from 'lucide-react'; 3 | import { ColorPCA } from '../lib/colorPCA'; 4 | import { Progress } from './ui/progress'; 5 | 6 | import { Button } from "@/components/ui/button"; 7 | import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; 8 | import { Input } from "@/components/ui/input"; 9 | import { Header } from './Header'; 10 | 11 | export function ImageProcessor() { 12 | const [originalImage, setOriginalImage] = useState(null); 13 | const [processedImage, setProcessedImage] = useState(null); 14 | const [colorPalette, setColorPalette] = useState([]); 15 | const [numColors, setNumColors] = useState(16); 16 | const [processedNumColors, setProcessedNumColors] = useState(16); 17 | const [originalColorCount, setOriginalColorCount] = useState(0); 18 | const [isProcessing, setIsProcessing] = useState(false); 19 | const [progress, setProgress] = useState(0); 20 | const [showInfo, setShowInfo] = useState(false); 21 | const canvasRef = useRef(null); 22 | 23 | const countUniqueColors = (imageData: ImageData): number => { 24 | const uniqueColors = new Set(); 25 | for (let i = 0; i < imageData.data.length; i += 4) { 26 | const rgb = [imageData.data[i], imageData.data[i + 1], imageData.data[i + 2]]; 27 | uniqueColors.add(rgb.join(',')); 28 | } 29 | return uniqueColors.size; 30 | }; 31 | 32 | const handleImageUpload = (event: React.ChangeEvent) => { 33 | const file = event.target.files?.[0]; 34 | if (file) { 35 | const reader = new FileReader(); 36 | reader.onload = (e) => { 37 | const img = new Image(); 38 | img.onload = () => { 39 | setOriginalImage(img.src); 40 | setProcessedImage(null); 41 | setColorPalette([]); 42 | setProgress(0); 43 | 44 | const canvas = canvasRef.current!; 45 | const ctx = canvas.getContext('2d')!; 46 | canvas.width = img.width; 47 | canvas.height = img.height; 48 | ctx.drawImage(img, 0, 0); 49 | const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); 50 | const uniqueColors = countUniqueColors(imageData); 51 | setOriginalColorCount(uniqueColors); 52 | }; 53 | img.src = e.target?.result as string; 54 | }; 55 | reader.readAsDataURL(file); 56 | } 57 | }; 58 | 59 | const resetImage = () => { 60 | setOriginalImage(null); 61 | setProcessedImage(null); 62 | setColorPalette([]); 63 | setProgress(0); 64 | setOriginalColorCount(0); 65 | }; 66 | 67 | const processImage = useCallback(async () => { 68 | if (!originalImage || !canvasRef.current) return; 69 | 70 | setIsProcessing(true); 71 | setProgress(0); 72 | 73 | const img = new Image(); 74 | img.onload = () => { 75 | const canvas = canvasRef.current!; 76 | const ctx = canvas.getContext('2d')!; 77 | 78 | canvas.width = img.width; 79 | canvas.height = img.height; 80 | ctx.drawImage(img, 0, 0); 81 | 82 | const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); 83 | 84 | const colorPCA = new ColorPCA((progress) => { 85 | setProgress(Math.round(progress)); 86 | }); 87 | 88 | const processedData = colorPCA.processImage(imageData.data, numColors); 89 | 90 | const newImageData = new ImageData(processedData, canvas.width, canvas.height); 91 | ctx.putImageData(newImageData, 0, 0); 92 | 93 | setProcessedImage(canvas.toDataURL()); 94 | setColorPalette(colorPCA.getReducedColors()); 95 | setProcessedNumColors(numColors); 96 | setIsProcessing(false); 97 | }; 98 | img.src = originalImage; 99 | }, [originalImage, numColors]); 100 | 101 | const handleNumColorsChange = (e: React.ChangeEvent) => { 102 | const value = parseInt(e.target.value); 103 | if (!isNaN(value) && value >= 2 && value <= 512) { 104 | setNumColors(value); 105 | } 106 | }; 107 | 108 | const downloadProcessedImage = () => { 109 | if (!processedImage) return; 110 | 111 | const link = document.createElement('a'); 112 | link.href = processedImage; 113 | link.download = 'processed-image.png'; 114 | document.body.appendChild(link); 115 | link.click(); 116 | document.body.removeChild(link); 117 | }; 118 | 119 | return ( 120 |
121 |
122 | 123 | 124 |
125 |
126 | 127 | 128 | Color Reduction with PCA 129 | 130 | Upload an image and reduce its color palette using Principal Component Analysis. 131 | Adjust the number of colors to see how the image changes with different levels of color reduction. 132 | 133 | 134 | 135 | 136 |
137 | {!originalImage ? ( 138 |
139 | 146 | 153 |
154 | ) : ( 155 |
156 |
157 |
158 |
159 | Original 164 |
165 | {originalColorCount.toLocaleString()} unique colors 166 |
167 | 175 |
176 | 177 |
178 |
179 | 182 | 190 |
191 | 206 | {isProcessing && } 207 |
208 |
209 | 210 |
211 | {!processedImage ? ( 212 |
213 | Original 218 |
219 | {originalColorCount.toLocaleString()} unique colors 220 |
221 |
222 | ) : ( 223 | <> 224 |
setShowInfo(true)} 227 | onMouseLeave={() => setShowInfo(false)} 228 | > 229 | Processed 234 |
235 | {processedNumColors} colors 236 |
237 | 245 | {showInfo && ( 246 |
247 |

248 | The processed image uses a reduced color palette determined by color clustering. 249 | Each pixel is mapped to its nearest color in the reduced palette. 250 |

251 |
252 | )} 253 |
254 | 255 | {colorPalette.length > 0 && ( 256 | 257 | 258 | 259 | 260 | Color Palette 261 | 262 | 263 | 264 |
265 | {colorPalette.map((color, index) => ( 266 |
274 | ))} 275 |
276 | 277 | 278 | )} 279 | 280 | )} 281 |
282 |
283 |
284 | )} 285 |
286 | 287 | 288 |
289 |
290 | 291 |
292 | ); 293 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@alloc/quick-lru@^5.2.0": 6 | version "5.2.0" 7 | resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" 8 | integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== 9 | 10 | "@ampproject/remapping@^2.2.0": 11 | version "2.3.0" 12 | resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" 13 | integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== 14 | dependencies: 15 | "@jridgewell/gen-mapping" "^0.3.5" 16 | "@jridgewell/trace-mapping" "^0.3.24" 17 | 18 | "@babel/code-frame@^7.25.7": 19 | version "7.25.7" 20 | resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz" 21 | integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g== 22 | dependencies: 23 | "@babel/highlight" "^7.25.7" 24 | picocolors "^1.0.0" 25 | 26 | "@babel/compat-data@^7.25.7": 27 | version "7.25.7" 28 | resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz" 29 | integrity sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw== 30 | 31 | "@babel/core@^7.25.2": 32 | version "7.25.7" 33 | resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz" 34 | integrity sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow== 35 | dependencies: 36 | "@ampproject/remapping" "^2.2.0" 37 | "@babel/code-frame" "^7.25.7" 38 | "@babel/generator" "^7.25.7" 39 | "@babel/helper-compilation-targets" "^7.25.7" 40 | "@babel/helper-module-transforms" "^7.25.7" 41 | "@babel/helpers" "^7.25.7" 42 | "@babel/parser" "^7.25.7" 43 | "@babel/template" "^7.25.7" 44 | "@babel/traverse" "^7.25.7" 45 | "@babel/types" "^7.25.7" 46 | convert-source-map "^2.0.0" 47 | debug "^4.1.0" 48 | gensync "^1.0.0-beta.2" 49 | json5 "^2.2.3" 50 | semver "^6.3.1" 51 | 52 | "@babel/generator@^7.25.7": 53 | version "7.25.7" 54 | resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz" 55 | integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA== 56 | dependencies: 57 | "@babel/types" "^7.25.7" 58 | "@jridgewell/gen-mapping" "^0.3.5" 59 | "@jridgewell/trace-mapping" "^0.3.25" 60 | jsesc "^3.0.2" 61 | 62 | "@babel/helper-compilation-targets@^7.25.7": 63 | version "7.25.7" 64 | resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz" 65 | integrity sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A== 66 | dependencies: 67 | "@babel/compat-data" "^7.25.7" 68 | "@babel/helper-validator-option" "^7.25.7" 69 | browserslist "^4.24.0" 70 | lru-cache "^5.1.1" 71 | semver "^6.3.1" 72 | 73 | "@babel/helper-module-imports@^7.25.7": 74 | version "7.25.7" 75 | resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz" 76 | integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw== 77 | dependencies: 78 | "@babel/traverse" "^7.25.7" 79 | "@babel/types" "^7.25.7" 80 | 81 | "@babel/helper-module-transforms@^7.25.7": 82 | version "7.25.7" 83 | resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz" 84 | integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ== 85 | dependencies: 86 | "@babel/helper-module-imports" "^7.25.7" 87 | "@babel/helper-simple-access" "^7.25.7" 88 | "@babel/helper-validator-identifier" "^7.25.7" 89 | "@babel/traverse" "^7.25.7" 90 | 91 | "@babel/helper-plugin-utils@^7.25.7": 92 | version "7.25.7" 93 | resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz" 94 | integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw== 95 | 96 | "@babel/helper-simple-access@^7.25.7": 97 | version "7.25.7" 98 | resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz" 99 | integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ== 100 | dependencies: 101 | "@babel/traverse" "^7.25.7" 102 | "@babel/types" "^7.25.7" 103 | 104 | "@babel/helper-string-parser@^7.25.7": 105 | version "7.25.7" 106 | resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz" 107 | integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== 108 | 109 | "@babel/helper-validator-identifier@^7.25.7": 110 | version "7.25.7" 111 | resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz" 112 | integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== 113 | 114 | "@babel/helper-validator-option@^7.25.7": 115 | version "7.25.7" 116 | resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz" 117 | integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ== 118 | 119 | "@babel/helpers@^7.25.7": 120 | version "7.25.7" 121 | resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz" 122 | integrity sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA== 123 | dependencies: 124 | "@babel/template" "^7.25.7" 125 | "@babel/types" "^7.25.7" 126 | 127 | "@babel/highlight@^7.25.7": 128 | version "7.25.7" 129 | resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz" 130 | integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw== 131 | dependencies: 132 | "@babel/helper-validator-identifier" "^7.25.7" 133 | chalk "^2.4.2" 134 | js-tokens "^4.0.0" 135 | picocolors "^1.0.0" 136 | 137 | "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.7": 138 | version "7.25.7" 139 | resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz" 140 | integrity sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw== 141 | dependencies: 142 | "@babel/types" "^7.25.7" 143 | 144 | "@babel/plugin-transform-react-jsx-self@^7.24.7": 145 | version "7.25.7" 146 | resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz" 147 | integrity sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg== 148 | dependencies: 149 | "@babel/helper-plugin-utils" "^7.25.7" 150 | 151 | "@babel/plugin-transform-react-jsx-source@^7.24.7": 152 | version "7.25.7" 153 | resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz" 154 | integrity sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w== 155 | dependencies: 156 | "@babel/helper-plugin-utils" "^7.25.7" 157 | 158 | "@babel/template@^7.25.7": 159 | version "7.25.7" 160 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz" 161 | integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA== 162 | dependencies: 163 | "@babel/code-frame" "^7.25.7" 164 | "@babel/parser" "^7.25.7" 165 | "@babel/types" "^7.25.7" 166 | 167 | "@babel/traverse@^7.25.7": 168 | version "7.25.7" 169 | resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz" 170 | integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg== 171 | dependencies: 172 | "@babel/code-frame" "^7.25.7" 173 | "@babel/generator" "^7.25.7" 174 | "@babel/parser" "^7.25.7" 175 | "@babel/template" "^7.25.7" 176 | "@babel/types" "^7.25.7" 177 | debug "^4.3.1" 178 | globals "^11.1.0" 179 | 180 | "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.7": 181 | version "7.25.7" 182 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz" 183 | integrity sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ== 184 | dependencies: 185 | "@babel/helper-string-parser" "^7.25.7" 186 | "@babel/helper-validator-identifier" "^7.25.7" 187 | to-fast-properties "^2.0.0" 188 | 189 | "@esbuild/aix-ppc64@0.21.5": 190 | version "0.21.5" 191 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" 192 | integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== 193 | 194 | "@esbuild/android-arm64@0.21.5": 195 | version "0.21.5" 196 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" 197 | integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== 198 | 199 | "@esbuild/android-arm@0.21.5": 200 | version "0.21.5" 201 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" 202 | integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== 203 | 204 | "@esbuild/android-x64@0.21.5": 205 | version "0.21.5" 206 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" 207 | integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== 208 | 209 | "@esbuild/darwin-arm64@0.21.5": 210 | version "0.21.5" 211 | resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" 212 | integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== 213 | 214 | "@esbuild/darwin-x64@0.21.5": 215 | version "0.21.5" 216 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" 217 | integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== 218 | 219 | "@esbuild/freebsd-arm64@0.21.5": 220 | version "0.21.5" 221 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" 222 | integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== 223 | 224 | "@esbuild/freebsd-x64@0.21.5": 225 | version "0.21.5" 226 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" 227 | integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== 228 | 229 | "@esbuild/linux-arm64@0.21.5": 230 | version "0.21.5" 231 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" 232 | integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== 233 | 234 | "@esbuild/linux-arm@0.21.5": 235 | version "0.21.5" 236 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" 237 | integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== 238 | 239 | "@esbuild/linux-ia32@0.21.5": 240 | version "0.21.5" 241 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" 242 | integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== 243 | 244 | "@esbuild/linux-loong64@0.21.5": 245 | version "0.21.5" 246 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" 247 | integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== 248 | 249 | "@esbuild/linux-mips64el@0.21.5": 250 | version "0.21.5" 251 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" 252 | integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== 253 | 254 | "@esbuild/linux-ppc64@0.21.5": 255 | version "0.21.5" 256 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" 257 | integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== 258 | 259 | "@esbuild/linux-riscv64@0.21.5": 260 | version "0.21.5" 261 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" 262 | integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== 263 | 264 | "@esbuild/linux-s390x@0.21.5": 265 | version "0.21.5" 266 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" 267 | integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== 268 | 269 | "@esbuild/linux-x64@0.21.5": 270 | version "0.21.5" 271 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" 272 | integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== 273 | 274 | "@esbuild/netbsd-x64@0.21.5": 275 | version "0.21.5" 276 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" 277 | integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== 278 | 279 | "@esbuild/openbsd-x64@0.21.5": 280 | version "0.21.5" 281 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" 282 | integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== 283 | 284 | "@esbuild/sunos-x64@0.21.5": 285 | version "0.21.5" 286 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" 287 | integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== 288 | 289 | "@esbuild/win32-arm64@0.21.5": 290 | version "0.21.5" 291 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" 292 | integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== 293 | 294 | "@esbuild/win32-ia32@0.21.5": 295 | version "0.21.5" 296 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" 297 | integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== 298 | 299 | "@esbuild/win32-x64@0.21.5": 300 | version "0.21.5" 301 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" 302 | integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== 303 | 304 | "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": 305 | version "4.4.0" 306 | resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" 307 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 308 | dependencies: 309 | eslint-visitor-keys "^3.3.0" 310 | 311 | "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": 312 | version "4.11.1" 313 | resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz" 314 | integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== 315 | 316 | "@eslint/config-array@^0.18.0": 317 | version "0.18.0" 318 | resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz" 319 | integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== 320 | dependencies: 321 | "@eslint/object-schema" "^2.1.4" 322 | debug "^4.3.1" 323 | minimatch "^3.1.2" 324 | 325 | "@eslint/core@^0.6.0": 326 | version "0.6.0" 327 | resolved "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz" 328 | integrity sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg== 329 | 330 | "@eslint/eslintrc@^3.1.0": 331 | version "3.1.0" 332 | resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz" 333 | integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== 334 | dependencies: 335 | ajv "^6.12.4" 336 | debug "^4.3.2" 337 | espree "^10.0.1" 338 | globals "^14.0.0" 339 | ignore "^5.2.0" 340 | import-fresh "^3.2.1" 341 | js-yaml "^4.1.0" 342 | minimatch "^3.1.2" 343 | strip-json-comments "^3.1.1" 344 | 345 | "@eslint/js@9.12.0", "@eslint/js@^9.9.1": 346 | version "9.12.0" 347 | resolved "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz" 348 | integrity sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA== 349 | 350 | "@eslint/object-schema@^2.1.4": 351 | version "2.1.4" 352 | resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz" 353 | integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== 354 | 355 | "@eslint/plugin-kit@^0.2.0": 356 | version "0.2.0" 357 | resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz" 358 | integrity sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig== 359 | dependencies: 360 | levn "^0.4.1" 361 | 362 | "@fortawesome/fontawesome-common-types@6.6.0": 363 | version "6.6.0" 364 | resolved "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz" 365 | integrity sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw== 366 | 367 | "@fortawesome/fontawesome-svg-core@^6.6.0": 368 | version "6.6.0" 369 | resolved "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz" 370 | integrity sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg== 371 | dependencies: 372 | "@fortawesome/fontawesome-common-types" "6.6.0" 373 | 374 | "@fortawesome/free-brands-svg-icons@^6.6.0": 375 | version "6.6.0" 376 | resolved "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.6.0.tgz" 377 | integrity sha512-1MPD8lMNW/earme4OQi1IFHtmHUwAKgghXlNwWi9GO7QkTfD+IIaYpIai4m2YJEzqfEji3jFHX1DZI5pbY/biQ== 378 | dependencies: 379 | "@fortawesome/fontawesome-common-types" "6.6.0" 380 | 381 | "@fortawesome/free-solid-svg-icons@^6.6.0": 382 | version "6.6.0" 383 | resolved "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.6.0.tgz" 384 | integrity sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA== 385 | dependencies: 386 | "@fortawesome/fontawesome-common-types" "6.6.0" 387 | 388 | "@fortawesome/react-fontawesome@^0.2.2": 389 | version "0.2.2" 390 | resolved "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz" 391 | integrity sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g== 392 | dependencies: 393 | prop-types "^15.8.1" 394 | 395 | "@humanfs/core@^0.19.0": 396 | version "0.19.0" 397 | resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz" 398 | integrity sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw== 399 | 400 | "@humanfs/node@^0.16.5": 401 | version "0.16.5" 402 | resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz" 403 | integrity sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg== 404 | dependencies: 405 | "@humanfs/core" "^0.19.0" 406 | "@humanwhocodes/retry" "^0.3.0" 407 | 408 | "@humanwhocodes/module-importer@^1.0.1": 409 | version "1.0.1" 410 | resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" 411 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 412 | 413 | "@humanwhocodes/retry@^0.3.0", "@humanwhocodes/retry@^0.3.1": 414 | version "0.3.1" 415 | resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz" 416 | integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== 417 | 418 | "@isaacs/cliui@^8.0.2": 419 | version "8.0.2" 420 | resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" 421 | integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== 422 | dependencies: 423 | string-width "^5.1.2" 424 | string-width-cjs "npm:string-width@^4.2.0" 425 | strip-ansi "^7.0.1" 426 | strip-ansi-cjs "npm:strip-ansi@^6.0.1" 427 | wrap-ansi "^8.1.0" 428 | wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" 429 | 430 | "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": 431 | version "0.3.5" 432 | resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" 433 | integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== 434 | dependencies: 435 | "@jridgewell/set-array" "^1.2.1" 436 | "@jridgewell/sourcemap-codec" "^1.4.10" 437 | "@jridgewell/trace-mapping" "^0.3.24" 438 | 439 | "@jridgewell/resolve-uri@^3.1.0": 440 | version "3.1.2" 441 | resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" 442 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 443 | 444 | "@jridgewell/set-array@^1.2.1": 445 | version "1.2.1" 446 | resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" 447 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 448 | 449 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 450 | version "1.5.0" 451 | resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" 452 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 453 | 454 | "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": 455 | version "0.3.25" 456 | resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" 457 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 458 | dependencies: 459 | "@jridgewell/resolve-uri" "^3.1.0" 460 | "@jridgewell/sourcemap-codec" "^1.4.14" 461 | 462 | "@nodelib/fs.scandir@2.1.5": 463 | version "2.1.5" 464 | resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" 465 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 466 | dependencies: 467 | "@nodelib/fs.stat" "2.0.5" 468 | run-parallel "^1.1.9" 469 | 470 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 471 | version "2.0.5" 472 | resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" 473 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 474 | 475 | "@nodelib/fs.walk@^1.2.3": 476 | version "1.2.8" 477 | resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" 478 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 479 | dependencies: 480 | "@nodelib/fs.scandir" "2.1.5" 481 | fastq "^1.6.0" 482 | 483 | "@pkgjs/parseargs@^0.11.0": 484 | version "0.11.0" 485 | resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" 486 | integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== 487 | 488 | "@radix-ui/number@1.1.0": 489 | version "1.1.0" 490 | resolved "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz" 491 | integrity sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ== 492 | 493 | "@radix-ui/primitive@1.1.0": 494 | version "1.1.0" 495 | resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz" 496 | integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== 497 | 498 | "@radix-ui/react-collection@1.1.0": 499 | version "1.1.0" 500 | resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz" 501 | integrity sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw== 502 | dependencies: 503 | "@radix-ui/react-compose-refs" "1.1.0" 504 | "@radix-ui/react-context" "1.1.0" 505 | "@radix-ui/react-primitive" "2.0.0" 506 | "@radix-ui/react-slot" "1.1.0" 507 | 508 | "@radix-ui/react-compose-refs@1.1.0": 509 | version "1.1.0" 510 | resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz" 511 | integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== 512 | 513 | "@radix-ui/react-context@1.1.0": 514 | version "1.1.0" 515 | resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz" 516 | integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== 517 | 518 | "@radix-ui/react-context@1.1.1": 519 | version "1.1.1" 520 | resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz" 521 | integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== 522 | 523 | "@radix-ui/react-direction@1.1.0": 524 | version "1.1.0" 525 | resolved "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz" 526 | integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg== 527 | 528 | "@radix-ui/react-primitive@2.0.0": 529 | version "2.0.0" 530 | resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz" 531 | integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== 532 | dependencies: 533 | "@radix-ui/react-slot" "1.1.0" 534 | 535 | "@radix-ui/react-progress@^1.1.0": 536 | version "1.1.0" 537 | resolved "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.0.tgz" 538 | integrity sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg== 539 | dependencies: 540 | "@radix-ui/react-context" "1.1.0" 541 | "@radix-ui/react-primitive" "2.0.0" 542 | 543 | "@radix-ui/react-slider@^1.2.1": 544 | version "1.2.1" 545 | resolved "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.1.tgz" 546 | integrity sha512-bEzQoDW0XP+h/oGbutF5VMWJPAl/UU8IJjr7h02SOHDIIIxq+cep8nItVNoBV+OMmahCdqdF38FTpmXoqQUGvw== 547 | dependencies: 548 | "@radix-ui/number" "1.1.0" 549 | "@radix-ui/primitive" "1.1.0" 550 | "@radix-ui/react-collection" "1.1.0" 551 | "@radix-ui/react-compose-refs" "1.1.0" 552 | "@radix-ui/react-context" "1.1.1" 553 | "@radix-ui/react-direction" "1.1.0" 554 | "@radix-ui/react-primitive" "2.0.0" 555 | "@radix-ui/react-use-controllable-state" "1.1.0" 556 | "@radix-ui/react-use-layout-effect" "1.1.0" 557 | "@radix-ui/react-use-previous" "1.1.0" 558 | "@radix-ui/react-use-size" "1.1.0" 559 | 560 | "@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.1.0": 561 | version "1.1.0" 562 | resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz" 563 | integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== 564 | dependencies: 565 | "@radix-ui/react-compose-refs" "1.1.0" 566 | 567 | "@radix-ui/react-use-callback-ref@1.1.0": 568 | version "1.1.0" 569 | resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz" 570 | integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== 571 | 572 | "@radix-ui/react-use-controllable-state@1.1.0": 573 | version "1.1.0" 574 | resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz" 575 | integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw== 576 | dependencies: 577 | "@radix-ui/react-use-callback-ref" "1.1.0" 578 | 579 | "@radix-ui/react-use-layout-effect@1.1.0": 580 | version "1.1.0" 581 | resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz" 582 | integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== 583 | 584 | "@radix-ui/react-use-previous@1.1.0": 585 | version "1.1.0" 586 | resolved "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz" 587 | integrity sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og== 588 | 589 | "@radix-ui/react-use-size@1.1.0": 590 | version "1.1.0" 591 | resolved "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz" 592 | integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw== 593 | dependencies: 594 | "@radix-ui/react-use-layout-effect" "1.1.0" 595 | 596 | "@rollup/rollup-android-arm-eabi@4.24.0": 597 | version "4.24.0" 598 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz#1661ff5ea9beb362795304cb916049aba7ac9c54" 599 | integrity sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA== 600 | 601 | "@rollup/rollup-android-arm64@4.24.0": 602 | version "4.24.0" 603 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz#2ffaa91f1b55a0082b8a722525741aadcbd3971e" 604 | integrity sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA== 605 | 606 | "@rollup/rollup-darwin-arm64@4.24.0": 607 | version "4.24.0" 608 | resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz" 609 | integrity sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA== 610 | 611 | "@rollup/rollup-darwin-x64@4.24.0": 612 | version "4.24.0" 613 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz#0605506142b9e796c370d59c5984ae95b9758724" 614 | integrity sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ== 615 | 616 | "@rollup/rollup-linux-arm-gnueabihf@4.24.0": 617 | version "4.24.0" 618 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz#62dfd196d4b10c0c2db833897164d2d319ee0cbb" 619 | integrity sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA== 620 | 621 | "@rollup/rollup-linux-arm-musleabihf@4.24.0": 622 | version "4.24.0" 623 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz#53ce72aeb982f1f34b58b380baafaf6a240fddb3" 624 | integrity sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw== 625 | 626 | "@rollup/rollup-linux-arm64-gnu@4.24.0": 627 | version "4.24.0" 628 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz#1632990f62a75c74f43e4b14ab3597d7ed416496" 629 | integrity sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA== 630 | 631 | "@rollup/rollup-linux-arm64-musl@4.24.0": 632 | version "4.24.0" 633 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz#8c03a996efb41e257b414b2e0560b7a21f2d9065" 634 | integrity sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw== 635 | 636 | "@rollup/rollup-linux-powerpc64le-gnu@4.24.0": 637 | version "4.24.0" 638 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz#5b98729628d5bcc8f7f37b58b04d6845f85c7b5d" 639 | integrity sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw== 640 | 641 | "@rollup/rollup-linux-riscv64-gnu@4.24.0": 642 | version "4.24.0" 643 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz#48e42e41f4cabf3573cfefcb448599c512e22983" 644 | integrity sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg== 645 | 646 | "@rollup/rollup-linux-s390x-gnu@4.24.0": 647 | version "4.24.0" 648 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz#e0b4f9a966872cb7d3e21b9e412a4b7efd7f0b58" 649 | integrity sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g== 650 | 651 | "@rollup/rollup-linux-x64-gnu@4.24.0": 652 | version "4.24.0" 653 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz#78144741993100f47bd3da72fce215e077ae036b" 654 | integrity sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A== 655 | 656 | "@rollup/rollup-linux-x64-musl@4.24.0": 657 | version "4.24.0" 658 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz#d9fe32971883cd1bd858336bd33a1c3ca6146127" 659 | integrity sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ== 660 | 661 | "@rollup/rollup-win32-arm64-msvc@4.24.0": 662 | version "4.24.0" 663 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz#71fa3ea369316db703a909c790743972e98afae5" 664 | integrity sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ== 665 | 666 | "@rollup/rollup-win32-ia32-msvc@4.24.0": 667 | version "4.24.0" 668 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz#653f5989a60658e17d7576a3996deb3902e342e2" 669 | integrity sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ== 670 | 671 | "@rollup/rollup-win32-x64-msvc@4.24.0": 672 | version "4.24.0" 673 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz#0574d7e87b44ee8511d08cc7f914bcb802b70818" 674 | integrity sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw== 675 | 676 | "@types/babel__core@^7.20.5": 677 | version "7.20.5" 678 | resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" 679 | integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== 680 | dependencies: 681 | "@babel/parser" "^7.20.7" 682 | "@babel/types" "^7.20.7" 683 | "@types/babel__generator" "*" 684 | "@types/babel__template" "*" 685 | "@types/babel__traverse" "*" 686 | 687 | "@types/babel__generator@*": 688 | version "7.6.8" 689 | resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" 690 | integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== 691 | dependencies: 692 | "@babel/types" "^7.0.0" 693 | 694 | "@types/babel__template@*": 695 | version "7.4.4" 696 | resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" 697 | integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== 698 | dependencies: 699 | "@babel/parser" "^7.1.0" 700 | "@babel/types" "^7.0.0" 701 | 702 | "@types/babel__traverse@*": 703 | version "7.20.6" 704 | resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz" 705 | integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== 706 | dependencies: 707 | "@babel/types" "^7.20.7" 708 | 709 | "@types/estree@1.0.6", "@types/estree@^1.0.6": 710 | version "1.0.6" 711 | resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" 712 | integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== 713 | 714 | "@types/json-schema@^7.0.15": 715 | version "7.0.15" 716 | resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" 717 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 718 | 719 | "@types/node@^22.9.0": 720 | version "22.9.0" 721 | resolved "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz" 722 | integrity sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ== 723 | dependencies: 724 | undici-types "~6.19.8" 725 | 726 | "@types/prop-types@*": 727 | version "15.7.13" 728 | resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz" 729 | integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== 730 | 731 | "@types/react-dom@^18.3.0": 732 | version "18.3.0" 733 | resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" 734 | integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== 735 | dependencies: 736 | "@types/react" "*" 737 | 738 | "@types/react@*", "@types/react@^18.3.5": 739 | version "18.3.11" 740 | resolved "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz" 741 | integrity sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ== 742 | dependencies: 743 | "@types/prop-types" "*" 744 | csstype "^3.0.2" 745 | 746 | "@typescript-eslint/eslint-plugin@8.8.1": 747 | version "8.8.1" 748 | resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz" 749 | integrity sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ== 750 | dependencies: 751 | "@eslint-community/regexpp" "^4.10.0" 752 | "@typescript-eslint/scope-manager" "8.8.1" 753 | "@typescript-eslint/type-utils" "8.8.1" 754 | "@typescript-eslint/utils" "8.8.1" 755 | "@typescript-eslint/visitor-keys" "8.8.1" 756 | graphemer "^1.4.0" 757 | ignore "^5.3.1" 758 | natural-compare "^1.4.0" 759 | ts-api-utils "^1.3.0" 760 | 761 | "@typescript-eslint/parser@8.8.1": 762 | version "8.8.1" 763 | resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.1.tgz" 764 | integrity sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow== 765 | dependencies: 766 | "@typescript-eslint/scope-manager" "8.8.1" 767 | "@typescript-eslint/types" "8.8.1" 768 | "@typescript-eslint/typescript-estree" "8.8.1" 769 | "@typescript-eslint/visitor-keys" "8.8.1" 770 | debug "^4.3.4" 771 | 772 | "@typescript-eslint/scope-manager@8.8.1": 773 | version "8.8.1" 774 | resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.1.tgz" 775 | integrity sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA== 776 | dependencies: 777 | "@typescript-eslint/types" "8.8.1" 778 | "@typescript-eslint/visitor-keys" "8.8.1" 779 | 780 | "@typescript-eslint/type-utils@8.8.1": 781 | version "8.8.1" 782 | resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.1.tgz" 783 | integrity sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA== 784 | dependencies: 785 | "@typescript-eslint/typescript-estree" "8.8.1" 786 | "@typescript-eslint/utils" "8.8.1" 787 | debug "^4.3.4" 788 | ts-api-utils "^1.3.0" 789 | 790 | "@typescript-eslint/types@8.8.1": 791 | version "8.8.1" 792 | resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.1.tgz" 793 | integrity sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q== 794 | 795 | "@typescript-eslint/typescript-estree@8.8.1": 796 | version "8.8.1" 797 | resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.1.tgz" 798 | integrity sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg== 799 | dependencies: 800 | "@typescript-eslint/types" "8.8.1" 801 | "@typescript-eslint/visitor-keys" "8.8.1" 802 | debug "^4.3.4" 803 | fast-glob "^3.3.2" 804 | is-glob "^4.0.3" 805 | minimatch "^9.0.4" 806 | semver "^7.6.0" 807 | ts-api-utils "^1.3.0" 808 | 809 | "@typescript-eslint/utils@8.8.1": 810 | version "8.8.1" 811 | resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.1.tgz" 812 | integrity sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w== 813 | dependencies: 814 | "@eslint-community/eslint-utils" "^4.4.0" 815 | "@typescript-eslint/scope-manager" "8.8.1" 816 | "@typescript-eslint/types" "8.8.1" 817 | "@typescript-eslint/typescript-estree" "8.8.1" 818 | 819 | "@typescript-eslint/visitor-keys@8.8.1": 820 | version "8.8.1" 821 | resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.1.tgz" 822 | integrity sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag== 823 | dependencies: 824 | "@typescript-eslint/types" "8.8.1" 825 | eslint-visitor-keys "^3.4.3" 826 | 827 | "@vitejs/plugin-react@^4.3.1": 828 | version "4.3.2" 829 | resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz" 830 | integrity sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg== 831 | dependencies: 832 | "@babel/core" "^7.25.2" 833 | "@babel/plugin-transform-react-jsx-self" "^7.24.7" 834 | "@babel/plugin-transform-react-jsx-source" "^7.24.7" 835 | "@types/babel__core" "^7.20.5" 836 | react-refresh "^0.14.2" 837 | 838 | acorn-jsx@^5.3.2: 839 | version "5.3.2" 840 | resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" 841 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 842 | 843 | acorn@^8.12.0: 844 | version "8.12.1" 845 | resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" 846 | integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== 847 | 848 | ajv@^6.12.4: 849 | version "6.12.6" 850 | resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" 851 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 852 | dependencies: 853 | fast-deep-equal "^3.1.1" 854 | fast-json-stable-stringify "^2.0.0" 855 | json-schema-traverse "^0.4.1" 856 | uri-js "^4.2.2" 857 | 858 | ansi-regex@^5.0.1: 859 | version "5.0.1" 860 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 861 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 862 | 863 | ansi-regex@^6.0.1: 864 | version "6.1.0" 865 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" 866 | integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== 867 | 868 | ansi-styles@^3.2.1: 869 | version "3.2.1" 870 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 871 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 872 | dependencies: 873 | color-convert "^1.9.0" 874 | 875 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 876 | version "4.3.0" 877 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 878 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 879 | dependencies: 880 | color-convert "^2.0.1" 881 | 882 | ansi-styles@^6.1.0: 883 | version "6.2.1" 884 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" 885 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 886 | 887 | any-promise@^1.0.0: 888 | version "1.3.0" 889 | resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" 890 | integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== 891 | 892 | anymatch@~3.1.2: 893 | version "3.1.3" 894 | resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" 895 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 896 | dependencies: 897 | normalize-path "^3.0.0" 898 | picomatch "^2.0.4" 899 | 900 | arg@^5.0.2: 901 | version "5.0.2" 902 | resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" 903 | integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== 904 | 905 | argparse@^2.0.1: 906 | version "2.0.1" 907 | resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" 908 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 909 | 910 | autoprefixer@^10.4.18: 911 | version "10.4.20" 912 | resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz" 913 | integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== 914 | dependencies: 915 | browserslist "^4.23.3" 916 | caniuse-lite "^1.0.30001646" 917 | fraction.js "^4.3.7" 918 | normalize-range "^0.1.2" 919 | picocolors "^1.0.1" 920 | postcss-value-parser "^4.2.0" 921 | 922 | balanced-match@^1.0.0: 923 | version "1.0.2" 924 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" 925 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 926 | 927 | binary-extensions@^2.0.0: 928 | version "2.3.0" 929 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" 930 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 931 | 932 | brace-expansion@^1.1.7: 933 | version "1.1.11" 934 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 935 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 936 | dependencies: 937 | balanced-match "^1.0.0" 938 | concat-map "0.0.1" 939 | 940 | brace-expansion@^2.0.1: 941 | version "2.0.1" 942 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" 943 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 944 | dependencies: 945 | balanced-match "^1.0.0" 946 | 947 | braces@^3.0.3, braces@~3.0.2: 948 | version "3.0.3" 949 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" 950 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 951 | dependencies: 952 | fill-range "^7.1.1" 953 | 954 | browserslist@^4.23.3, browserslist@^4.24.0: 955 | version "4.24.0" 956 | resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz" 957 | integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== 958 | dependencies: 959 | caniuse-lite "^1.0.30001663" 960 | electron-to-chromium "^1.5.28" 961 | node-releases "^2.0.18" 962 | update-browserslist-db "^1.1.0" 963 | 964 | callsites@^3.0.0: 965 | version "3.1.0" 966 | resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" 967 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 968 | 969 | camelcase-css@^2.0.1: 970 | version "2.0.1" 971 | resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" 972 | integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== 973 | 974 | caniuse-lite@^1.0.30001646, caniuse-lite@^1.0.30001663: 975 | version "1.0.30001667" 976 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz" 977 | integrity sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw== 978 | 979 | chalk@^2.4.2: 980 | version "2.4.2" 981 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 982 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 983 | dependencies: 984 | ansi-styles "^3.2.1" 985 | escape-string-regexp "^1.0.5" 986 | supports-color "^5.3.0" 987 | 988 | chalk@^4.0.0: 989 | version "4.1.2" 990 | resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" 991 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 992 | dependencies: 993 | ansi-styles "^4.1.0" 994 | supports-color "^7.1.0" 995 | 996 | chokidar@^3.5.3: 997 | version "3.6.0" 998 | resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" 999 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 1000 | dependencies: 1001 | anymatch "~3.1.2" 1002 | braces "~3.0.2" 1003 | glob-parent "~5.1.2" 1004 | is-binary-path "~2.1.0" 1005 | is-glob "~4.0.1" 1006 | normalize-path "~3.0.0" 1007 | readdirp "~3.6.0" 1008 | optionalDependencies: 1009 | fsevents "~2.3.2" 1010 | 1011 | class-variance-authority@^0.7.0: 1012 | version "0.7.0" 1013 | resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz" 1014 | integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== 1015 | dependencies: 1016 | clsx "2.0.0" 1017 | 1018 | clsx@2.0.0: 1019 | version "2.0.0" 1020 | resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" 1021 | integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== 1022 | 1023 | clsx@^2.1.1: 1024 | version "2.1.1" 1025 | resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" 1026 | integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== 1027 | 1028 | color-convert@^1.9.0: 1029 | version "1.9.3" 1030 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 1031 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 1032 | dependencies: 1033 | color-name "1.1.3" 1034 | 1035 | color-convert@^2.0.1: 1036 | version "2.0.1" 1037 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 1038 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 1039 | dependencies: 1040 | color-name "~1.1.4" 1041 | 1042 | color-name@1.1.3: 1043 | version "1.1.3" 1044 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 1045 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 1046 | 1047 | color-name@~1.1.4: 1048 | version "1.1.4" 1049 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 1050 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 1051 | 1052 | commander@^4.0.0: 1053 | version "4.1.1" 1054 | resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" 1055 | integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== 1056 | 1057 | concat-map@0.0.1: 1058 | version "0.0.1" 1059 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 1060 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 1061 | 1062 | convert-source-map@^2.0.0: 1063 | version "2.0.0" 1064 | resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" 1065 | integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== 1066 | 1067 | cross-spawn@^7.0.0, cross-spawn@^7.0.2: 1068 | version "7.0.3" 1069 | resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" 1070 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 1071 | dependencies: 1072 | path-key "^3.1.0" 1073 | shebang-command "^2.0.0" 1074 | which "^2.0.1" 1075 | 1076 | cssesc@^3.0.0: 1077 | version "3.0.0" 1078 | resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" 1079 | integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== 1080 | 1081 | csstype@^3.0.2: 1082 | version "3.1.3" 1083 | resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" 1084 | integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== 1085 | 1086 | debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: 1087 | version "4.3.7" 1088 | resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" 1089 | integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== 1090 | dependencies: 1091 | ms "^2.1.3" 1092 | 1093 | deep-is@^0.1.3: 1094 | version "0.1.4" 1095 | resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" 1096 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 1097 | 1098 | didyoumean@^1.2.2: 1099 | version "1.2.2" 1100 | resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" 1101 | integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== 1102 | 1103 | dlv@^1.1.3: 1104 | version "1.1.3" 1105 | resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" 1106 | integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== 1107 | 1108 | eastasianwidth@^0.2.0: 1109 | version "0.2.0" 1110 | resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" 1111 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 1112 | 1113 | electron-to-chromium@^1.5.28: 1114 | version "1.5.33" 1115 | resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.33.tgz" 1116 | integrity sha512-+cYTcFB1QqD4j4LegwLfpCNxifb6dDFUAwk6RsLusCwIaZI6or2f+q8rs5tTB2YC53HhOlIbEaqHMAAC8IOIwA== 1117 | 1118 | emoji-regex@^8.0.0: 1119 | version "8.0.0" 1120 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 1121 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 1122 | 1123 | emoji-regex@^9.2.2: 1124 | version "9.2.2" 1125 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" 1126 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 1127 | 1128 | esbuild@^0.21.3: 1129 | version "0.21.5" 1130 | resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" 1131 | integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== 1132 | optionalDependencies: 1133 | "@esbuild/aix-ppc64" "0.21.5" 1134 | "@esbuild/android-arm" "0.21.5" 1135 | "@esbuild/android-arm64" "0.21.5" 1136 | "@esbuild/android-x64" "0.21.5" 1137 | "@esbuild/darwin-arm64" "0.21.5" 1138 | "@esbuild/darwin-x64" "0.21.5" 1139 | "@esbuild/freebsd-arm64" "0.21.5" 1140 | "@esbuild/freebsd-x64" "0.21.5" 1141 | "@esbuild/linux-arm" "0.21.5" 1142 | "@esbuild/linux-arm64" "0.21.5" 1143 | "@esbuild/linux-ia32" "0.21.5" 1144 | "@esbuild/linux-loong64" "0.21.5" 1145 | "@esbuild/linux-mips64el" "0.21.5" 1146 | "@esbuild/linux-ppc64" "0.21.5" 1147 | "@esbuild/linux-riscv64" "0.21.5" 1148 | "@esbuild/linux-s390x" "0.21.5" 1149 | "@esbuild/linux-x64" "0.21.5" 1150 | "@esbuild/netbsd-x64" "0.21.5" 1151 | "@esbuild/openbsd-x64" "0.21.5" 1152 | "@esbuild/sunos-x64" "0.21.5" 1153 | "@esbuild/win32-arm64" "0.21.5" 1154 | "@esbuild/win32-ia32" "0.21.5" 1155 | "@esbuild/win32-x64" "0.21.5" 1156 | 1157 | escalade@^3.2.0: 1158 | version "3.2.0" 1159 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" 1160 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 1161 | 1162 | escape-string-regexp@^1.0.5: 1163 | version "1.0.5" 1164 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 1165 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 1166 | 1167 | escape-string-regexp@^4.0.0: 1168 | version "4.0.0" 1169 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" 1170 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 1171 | 1172 | eslint-plugin-react-hooks@^5.1.0-rc.0: 1173 | version "5.1.0-rc-fb9a90fa48-20240614" 1174 | resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-fb9a90fa48-20240614.tgz" 1175 | integrity sha512-xsiRwaDNF5wWNC4ZHLut+x/YcAxksUd9Rizt7LaEn3bV8VyYRpXnRJQlLOfYaVy9esk4DFP4zPPnoNVjq5Gc0w== 1176 | 1177 | eslint-plugin-react-refresh@^0.4.11: 1178 | version "0.4.12" 1179 | resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz" 1180 | integrity sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg== 1181 | 1182 | eslint-scope@^8.1.0: 1183 | version "8.1.0" 1184 | resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz" 1185 | integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== 1186 | dependencies: 1187 | esrecurse "^4.3.0" 1188 | estraverse "^5.2.0" 1189 | 1190 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: 1191 | version "3.4.3" 1192 | resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" 1193 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 1194 | 1195 | eslint-visitor-keys@^4.1.0: 1196 | version "4.1.0" 1197 | resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz" 1198 | integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== 1199 | 1200 | eslint@^9.9.1: 1201 | version "9.12.0" 1202 | resolved "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz" 1203 | integrity sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw== 1204 | dependencies: 1205 | "@eslint-community/eslint-utils" "^4.2.0" 1206 | "@eslint-community/regexpp" "^4.11.0" 1207 | "@eslint/config-array" "^0.18.0" 1208 | "@eslint/core" "^0.6.0" 1209 | "@eslint/eslintrc" "^3.1.0" 1210 | "@eslint/js" "9.12.0" 1211 | "@eslint/plugin-kit" "^0.2.0" 1212 | "@humanfs/node" "^0.16.5" 1213 | "@humanwhocodes/module-importer" "^1.0.1" 1214 | "@humanwhocodes/retry" "^0.3.1" 1215 | "@types/estree" "^1.0.6" 1216 | "@types/json-schema" "^7.0.15" 1217 | ajv "^6.12.4" 1218 | chalk "^4.0.0" 1219 | cross-spawn "^7.0.2" 1220 | debug "^4.3.2" 1221 | escape-string-regexp "^4.0.0" 1222 | eslint-scope "^8.1.0" 1223 | eslint-visitor-keys "^4.1.0" 1224 | espree "^10.2.0" 1225 | esquery "^1.5.0" 1226 | esutils "^2.0.2" 1227 | fast-deep-equal "^3.1.3" 1228 | file-entry-cache "^8.0.0" 1229 | find-up "^5.0.0" 1230 | glob-parent "^6.0.2" 1231 | ignore "^5.2.0" 1232 | imurmurhash "^0.1.4" 1233 | is-glob "^4.0.0" 1234 | json-stable-stringify-without-jsonify "^1.0.1" 1235 | lodash.merge "^4.6.2" 1236 | minimatch "^3.1.2" 1237 | natural-compare "^1.4.0" 1238 | optionator "^0.9.3" 1239 | text-table "^0.2.0" 1240 | 1241 | espree@^10.0.1, espree@^10.2.0: 1242 | version "10.2.0" 1243 | resolved "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz" 1244 | integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== 1245 | dependencies: 1246 | acorn "^8.12.0" 1247 | acorn-jsx "^5.3.2" 1248 | eslint-visitor-keys "^4.1.0" 1249 | 1250 | esquery@^1.5.0: 1251 | version "1.6.0" 1252 | resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" 1253 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 1254 | dependencies: 1255 | estraverse "^5.1.0" 1256 | 1257 | esrecurse@^4.3.0: 1258 | version "4.3.0" 1259 | resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" 1260 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 1261 | dependencies: 1262 | estraverse "^5.2.0" 1263 | 1264 | estraverse@^5.1.0, estraverse@^5.2.0: 1265 | version "5.3.0" 1266 | resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" 1267 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 1268 | 1269 | esutils@^2.0.2: 1270 | version "2.0.3" 1271 | resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" 1272 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1273 | 1274 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 1275 | version "3.1.3" 1276 | resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 1277 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1278 | 1279 | fast-glob@^3.3.0, fast-glob@^3.3.2: 1280 | version "3.3.2" 1281 | resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" 1282 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 1283 | dependencies: 1284 | "@nodelib/fs.stat" "^2.0.2" 1285 | "@nodelib/fs.walk" "^1.2.3" 1286 | glob-parent "^5.1.2" 1287 | merge2 "^1.3.0" 1288 | micromatch "^4.0.4" 1289 | 1290 | fast-json-stable-stringify@^2.0.0: 1291 | version "2.1.0" 1292 | resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 1293 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1294 | 1295 | fast-levenshtein@^2.0.6: 1296 | version "2.0.6" 1297 | resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" 1298 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 1299 | 1300 | fastq@^1.6.0: 1301 | version "1.17.1" 1302 | resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" 1303 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 1304 | dependencies: 1305 | reusify "^1.0.4" 1306 | 1307 | file-entry-cache@^8.0.0: 1308 | version "8.0.0" 1309 | resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" 1310 | integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== 1311 | dependencies: 1312 | flat-cache "^4.0.0" 1313 | 1314 | fill-range@^7.1.1: 1315 | version "7.1.1" 1316 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" 1317 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 1318 | dependencies: 1319 | to-regex-range "^5.0.1" 1320 | 1321 | find-up@^5.0.0: 1322 | version "5.0.0" 1323 | resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" 1324 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1325 | dependencies: 1326 | locate-path "^6.0.0" 1327 | path-exists "^4.0.0" 1328 | 1329 | flat-cache@^4.0.0: 1330 | version "4.0.1" 1331 | resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" 1332 | integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== 1333 | dependencies: 1334 | flatted "^3.2.9" 1335 | keyv "^4.5.4" 1336 | 1337 | flatted@^3.2.9: 1338 | version "3.3.1" 1339 | resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" 1340 | integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== 1341 | 1342 | foreground-child@^3.1.0: 1343 | version "3.3.0" 1344 | resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz" 1345 | integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== 1346 | dependencies: 1347 | cross-spawn "^7.0.0" 1348 | signal-exit "^4.0.1" 1349 | 1350 | fraction.js@^4.3.7: 1351 | version "4.3.7" 1352 | resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" 1353 | integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== 1354 | 1355 | fsevents@~2.3.2, fsevents@~2.3.3: 1356 | version "2.3.3" 1357 | resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" 1358 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 1359 | 1360 | function-bind@^1.1.2: 1361 | version "1.1.2" 1362 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" 1363 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 1364 | 1365 | gensync@^1.0.0-beta.2: 1366 | version "1.0.0-beta.2" 1367 | resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" 1368 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 1369 | 1370 | glob-parent@^5.1.2, glob-parent@~5.1.2: 1371 | version "5.1.2" 1372 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 1373 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1374 | dependencies: 1375 | is-glob "^4.0.1" 1376 | 1377 | glob-parent@^6.0.2: 1378 | version "6.0.2" 1379 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" 1380 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1381 | dependencies: 1382 | is-glob "^4.0.3" 1383 | 1384 | glob@^10.3.10: 1385 | version "10.4.5" 1386 | resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" 1387 | integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== 1388 | dependencies: 1389 | foreground-child "^3.1.0" 1390 | jackspeak "^3.1.2" 1391 | minimatch "^9.0.4" 1392 | minipass "^7.1.2" 1393 | package-json-from-dist "^1.0.0" 1394 | path-scurry "^1.11.1" 1395 | 1396 | globals@^11.1.0: 1397 | version "11.12.0" 1398 | resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" 1399 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1400 | 1401 | globals@^14.0.0: 1402 | version "14.0.0" 1403 | resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" 1404 | integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== 1405 | 1406 | globals@^15.9.0: 1407 | version "15.11.0" 1408 | resolved "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz" 1409 | integrity sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw== 1410 | 1411 | graphemer@^1.4.0: 1412 | version "1.4.0" 1413 | resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" 1414 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 1415 | 1416 | has-flag@^3.0.0: 1417 | version "3.0.0" 1418 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 1419 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1420 | 1421 | has-flag@^4.0.0: 1422 | version "4.0.0" 1423 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" 1424 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1425 | 1426 | hasown@^2.0.2: 1427 | version "2.0.2" 1428 | resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" 1429 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 1430 | dependencies: 1431 | function-bind "^1.1.2" 1432 | 1433 | ignore@^5.2.0, ignore@^5.3.1: 1434 | version "5.3.2" 1435 | resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" 1436 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 1437 | 1438 | import-fresh@^3.2.1: 1439 | version "3.3.0" 1440 | resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" 1441 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1442 | dependencies: 1443 | parent-module "^1.0.0" 1444 | resolve-from "^4.0.0" 1445 | 1446 | imurmurhash@^0.1.4: 1447 | version "0.1.4" 1448 | resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 1449 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1450 | 1451 | is-binary-path@~2.1.0: 1452 | version "2.1.0" 1453 | resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 1454 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1455 | dependencies: 1456 | binary-extensions "^2.0.0" 1457 | 1458 | is-core-module@^2.13.0: 1459 | version "2.15.1" 1460 | resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz" 1461 | integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== 1462 | dependencies: 1463 | hasown "^2.0.2" 1464 | 1465 | is-extglob@^2.1.1: 1466 | version "2.1.1" 1467 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 1468 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1469 | 1470 | is-fullwidth-code-point@^3.0.0: 1471 | version "3.0.0" 1472 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 1473 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1474 | 1475 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 1476 | version "4.0.3" 1477 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" 1478 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1479 | dependencies: 1480 | is-extglob "^2.1.1" 1481 | 1482 | is-number@^7.0.0: 1483 | version "7.0.0" 1484 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 1485 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1486 | 1487 | isexe@^2.0.0: 1488 | version "2.0.0" 1489 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 1490 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1491 | 1492 | jackspeak@^3.1.2: 1493 | version "3.4.3" 1494 | resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" 1495 | integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== 1496 | dependencies: 1497 | "@isaacs/cliui" "^8.0.2" 1498 | optionalDependencies: 1499 | "@pkgjs/parseargs" "^0.11.0" 1500 | 1501 | jiti@^1.21.0: 1502 | version "1.21.6" 1503 | resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz" 1504 | integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== 1505 | 1506 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1507 | version "4.0.0" 1508 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 1509 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1510 | 1511 | js-yaml@^4.1.0: 1512 | version "4.1.0" 1513 | resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" 1514 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1515 | dependencies: 1516 | argparse "^2.0.1" 1517 | 1518 | jsesc@^3.0.2: 1519 | version "3.0.2" 1520 | resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" 1521 | integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== 1522 | 1523 | json-buffer@3.0.1: 1524 | version "3.0.1" 1525 | resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" 1526 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1527 | 1528 | json-schema-traverse@^0.4.1: 1529 | version "0.4.1" 1530 | resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 1531 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1532 | 1533 | json-stable-stringify-without-jsonify@^1.0.1: 1534 | version "1.0.1" 1535 | resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" 1536 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1537 | 1538 | json5@^2.2.3: 1539 | version "2.2.3" 1540 | resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" 1541 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 1542 | 1543 | keyv@^4.5.4: 1544 | version "4.5.4" 1545 | resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" 1546 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 1547 | dependencies: 1548 | json-buffer "3.0.1" 1549 | 1550 | levn@^0.4.1: 1551 | version "0.4.1" 1552 | resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" 1553 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1554 | dependencies: 1555 | prelude-ls "^1.2.1" 1556 | type-check "~0.4.0" 1557 | 1558 | lilconfig@^2.1.0: 1559 | version "2.1.0" 1560 | resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" 1561 | integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== 1562 | 1563 | lilconfig@^3.0.0: 1564 | version "3.1.2" 1565 | resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz" 1566 | integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== 1567 | 1568 | lines-and-columns@^1.1.6: 1569 | version "1.2.4" 1570 | resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" 1571 | integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== 1572 | 1573 | locate-path@^6.0.0: 1574 | version "6.0.0" 1575 | resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" 1576 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1577 | dependencies: 1578 | p-locate "^5.0.0" 1579 | 1580 | lodash.merge@^4.6.2: 1581 | version "4.6.2" 1582 | resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" 1583 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1584 | 1585 | loose-envify@^1.1.0, loose-envify@^1.4.0: 1586 | version "1.4.0" 1587 | resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" 1588 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1589 | dependencies: 1590 | js-tokens "^3.0.0 || ^4.0.0" 1591 | 1592 | lru-cache@^10.2.0: 1593 | version "10.4.3" 1594 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" 1595 | integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== 1596 | 1597 | lru-cache@^5.1.1: 1598 | version "5.1.1" 1599 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" 1600 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1601 | dependencies: 1602 | yallist "^3.0.2" 1603 | 1604 | lucide-react@^0.344.0: 1605 | version "0.344.0" 1606 | resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.344.0.tgz" 1607 | integrity sha512-6YyBnn91GB45VuVT96bYCOKElbJzUHqp65vX8cDcu55MQL9T969v4dhGClpljamuI/+KMO9P6w9Acq1CVQGvIQ== 1608 | 1609 | merge2@^1.3.0: 1610 | version "1.4.1" 1611 | resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" 1612 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1613 | 1614 | micromatch@^4.0.4, micromatch@^4.0.5: 1615 | version "4.0.8" 1616 | resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" 1617 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1618 | dependencies: 1619 | braces "^3.0.3" 1620 | picomatch "^2.3.1" 1621 | 1622 | minimatch@^3.1.2: 1623 | version "3.1.2" 1624 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 1625 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1626 | dependencies: 1627 | brace-expansion "^1.1.7" 1628 | 1629 | minimatch@^9.0.4: 1630 | version "9.0.5" 1631 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" 1632 | integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== 1633 | dependencies: 1634 | brace-expansion "^2.0.1" 1635 | 1636 | "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: 1637 | version "7.1.2" 1638 | resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" 1639 | integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== 1640 | 1641 | ms@^2.1.3: 1642 | version "2.1.3" 1643 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 1644 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1645 | 1646 | mz@^2.7.0: 1647 | version "2.7.0" 1648 | resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" 1649 | integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 1650 | dependencies: 1651 | any-promise "^1.0.0" 1652 | object-assign "^4.0.1" 1653 | thenify-all "^1.0.0" 1654 | 1655 | nanoid@^3.3.7: 1656 | version "3.3.7" 1657 | resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" 1658 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 1659 | 1660 | natural-compare@^1.4.0: 1661 | version "1.4.0" 1662 | resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" 1663 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1664 | 1665 | node-releases@^2.0.18: 1666 | version "2.0.18" 1667 | resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz" 1668 | integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== 1669 | 1670 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1671 | version "3.0.0" 1672 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 1673 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1674 | 1675 | normalize-range@^0.1.2: 1676 | version "0.1.2" 1677 | resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" 1678 | integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== 1679 | 1680 | object-assign@^4.0.1, object-assign@^4.1.1: 1681 | version "4.1.1" 1682 | resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" 1683 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1684 | 1685 | object-hash@^3.0.0: 1686 | version "3.0.0" 1687 | resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" 1688 | integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== 1689 | 1690 | optionator@^0.9.3: 1691 | version "0.9.4" 1692 | resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" 1693 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 1694 | dependencies: 1695 | deep-is "^0.1.3" 1696 | fast-levenshtein "^2.0.6" 1697 | levn "^0.4.1" 1698 | prelude-ls "^1.2.1" 1699 | type-check "^0.4.0" 1700 | word-wrap "^1.2.5" 1701 | 1702 | p-limit@^3.0.2: 1703 | version "3.1.0" 1704 | resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" 1705 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1706 | dependencies: 1707 | yocto-queue "^0.1.0" 1708 | 1709 | p-locate@^5.0.0: 1710 | version "5.0.0" 1711 | resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" 1712 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1713 | dependencies: 1714 | p-limit "^3.0.2" 1715 | 1716 | package-json-from-dist@^1.0.0: 1717 | version "1.0.1" 1718 | resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" 1719 | integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== 1720 | 1721 | parent-module@^1.0.0: 1722 | version "1.0.1" 1723 | resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" 1724 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1725 | dependencies: 1726 | callsites "^3.0.0" 1727 | 1728 | path-exists@^4.0.0: 1729 | version "4.0.0" 1730 | resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" 1731 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1732 | 1733 | path-key@^3.1.0: 1734 | version "3.1.1" 1735 | resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" 1736 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1737 | 1738 | path-parse@^1.0.7: 1739 | version "1.0.7" 1740 | resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" 1741 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1742 | 1743 | path-scurry@^1.11.1: 1744 | version "1.11.1" 1745 | resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" 1746 | integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== 1747 | dependencies: 1748 | lru-cache "^10.2.0" 1749 | minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 1750 | 1751 | picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: 1752 | version "1.1.0" 1753 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz" 1754 | integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== 1755 | 1756 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 1757 | version "2.3.1" 1758 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 1759 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1760 | 1761 | pify@^2.3.0: 1762 | version "2.3.0" 1763 | resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" 1764 | integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== 1765 | 1766 | pirates@^4.0.1: 1767 | version "4.0.6" 1768 | resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" 1769 | integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== 1770 | 1771 | postcss-import@^15.1.0: 1772 | version "15.1.0" 1773 | resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" 1774 | integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== 1775 | dependencies: 1776 | postcss-value-parser "^4.0.0" 1777 | read-cache "^1.0.0" 1778 | resolve "^1.1.7" 1779 | 1780 | postcss-js@^4.0.1: 1781 | version "4.0.1" 1782 | resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" 1783 | integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== 1784 | dependencies: 1785 | camelcase-css "^2.0.1" 1786 | 1787 | postcss-load-config@^4.0.1: 1788 | version "4.0.2" 1789 | resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" 1790 | integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== 1791 | dependencies: 1792 | lilconfig "^3.0.0" 1793 | yaml "^2.3.4" 1794 | 1795 | postcss-nested@^6.0.1: 1796 | version "6.2.0" 1797 | resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz" 1798 | integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== 1799 | dependencies: 1800 | postcss-selector-parser "^6.1.1" 1801 | 1802 | postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1: 1803 | version "6.1.2" 1804 | resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" 1805 | integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== 1806 | dependencies: 1807 | cssesc "^3.0.0" 1808 | util-deprecate "^1.0.2" 1809 | 1810 | postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: 1811 | version "4.2.0" 1812 | resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" 1813 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== 1814 | 1815 | postcss@^8.4.23, postcss@^8.4.35, postcss@^8.4.43: 1816 | version "8.4.47" 1817 | resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz" 1818 | integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== 1819 | dependencies: 1820 | nanoid "^3.3.7" 1821 | picocolors "^1.1.0" 1822 | source-map-js "^1.2.1" 1823 | 1824 | prelude-ls@^1.2.1: 1825 | version "1.2.1" 1826 | resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" 1827 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1828 | 1829 | prop-types@^15.8.1: 1830 | version "15.8.1" 1831 | resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" 1832 | integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== 1833 | dependencies: 1834 | loose-envify "^1.4.0" 1835 | object-assign "^4.1.1" 1836 | react-is "^16.13.1" 1837 | 1838 | punycode@^2.1.0: 1839 | version "2.3.1" 1840 | resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" 1841 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1842 | 1843 | queue-microtask@^1.2.2: 1844 | version "1.2.3" 1845 | resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" 1846 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1847 | 1848 | react-dom@^18.3.1: 1849 | version "18.3.1" 1850 | resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" 1851 | integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== 1852 | dependencies: 1853 | loose-envify "^1.1.0" 1854 | scheduler "^0.23.2" 1855 | 1856 | react-is@^16.13.1: 1857 | version "16.13.1" 1858 | resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" 1859 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== 1860 | 1861 | react-refresh@^0.14.2: 1862 | version "0.14.2" 1863 | resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz" 1864 | integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== 1865 | 1866 | react@^18.3.1: 1867 | version "18.3.1" 1868 | resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" 1869 | integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== 1870 | dependencies: 1871 | loose-envify "^1.1.0" 1872 | 1873 | read-cache@^1.0.0: 1874 | version "1.0.0" 1875 | resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" 1876 | integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== 1877 | dependencies: 1878 | pify "^2.3.0" 1879 | 1880 | readdirp@~3.6.0: 1881 | version "3.6.0" 1882 | resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" 1883 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1884 | dependencies: 1885 | picomatch "^2.2.1" 1886 | 1887 | resolve-from@^4.0.0: 1888 | version "4.0.0" 1889 | resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" 1890 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1891 | 1892 | resolve@^1.1.7, resolve@^1.22.2: 1893 | version "1.22.8" 1894 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" 1895 | integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== 1896 | dependencies: 1897 | is-core-module "^2.13.0" 1898 | path-parse "^1.0.7" 1899 | supports-preserve-symlinks-flag "^1.0.0" 1900 | 1901 | reusify@^1.0.4: 1902 | version "1.0.4" 1903 | resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" 1904 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1905 | 1906 | rollup@^4.20.0: 1907 | version "4.24.0" 1908 | resolved "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz" 1909 | integrity sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg== 1910 | dependencies: 1911 | "@types/estree" "1.0.6" 1912 | optionalDependencies: 1913 | "@rollup/rollup-android-arm-eabi" "4.24.0" 1914 | "@rollup/rollup-android-arm64" "4.24.0" 1915 | "@rollup/rollup-darwin-arm64" "4.24.0" 1916 | "@rollup/rollup-darwin-x64" "4.24.0" 1917 | "@rollup/rollup-linux-arm-gnueabihf" "4.24.0" 1918 | "@rollup/rollup-linux-arm-musleabihf" "4.24.0" 1919 | "@rollup/rollup-linux-arm64-gnu" "4.24.0" 1920 | "@rollup/rollup-linux-arm64-musl" "4.24.0" 1921 | "@rollup/rollup-linux-powerpc64le-gnu" "4.24.0" 1922 | "@rollup/rollup-linux-riscv64-gnu" "4.24.0" 1923 | "@rollup/rollup-linux-s390x-gnu" "4.24.0" 1924 | "@rollup/rollup-linux-x64-gnu" "4.24.0" 1925 | "@rollup/rollup-linux-x64-musl" "4.24.0" 1926 | "@rollup/rollup-win32-arm64-msvc" "4.24.0" 1927 | "@rollup/rollup-win32-ia32-msvc" "4.24.0" 1928 | "@rollup/rollup-win32-x64-msvc" "4.24.0" 1929 | fsevents "~2.3.2" 1930 | 1931 | run-parallel@^1.1.9: 1932 | version "1.2.0" 1933 | resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" 1934 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1935 | dependencies: 1936 | queue-microtask "^1.2.2" 1937 | 1938 | scheduler@^0.23.2: 1939 | version "0.23.2" 1940 | resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" 1941 | integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== 1942 | dependencies: 1943 | loose-envify "^1.1.0" 1944 | 1945 | semver@^6.3.1: 1946 | version "6.3.1" 1947 | resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" 1948 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1949 | 1950 | semver@^7.6.0: 1951 | version "7.6.3" 1952 | resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" 1953 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 1954 | 1955 | shebang-command@^2.0.0: 1956 | version "2.0.0" 1957 | resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" 1958 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1959 | dependencies: 1960 | shebang-regex "^3.0.0" 1961 | 1962 | shebang-regex@^3.0.0: 1963 | version "3.0.0" 1964 | resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" 1965 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1966 | 1967 | signal-exit@^4.0.1: 1968 | version "4.1.0" 1969 | resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" 1970 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 1971 | 1972 | source-map-js@^1.2.1: 1973 | version "1.2.1" 1974 | resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" 1975 | integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== 1976 | 1977 | "string-width-cjs@npm:string-width@^4.2.0": 1978 | version "4.2.3" 1979 | resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" 1980 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1981 | dependencies: 1982 | emoji-regex "^8.0.0" 1983 | is-fullwidth-code-point "^3.0.0" 1984 | strip-ansi "^6.0.1" 1985 | 1986 | string-width@^4.1.0: 1987 | version "4.2.3" 1988 | resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" 1989 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1990 | dependencies: 1991 | emoji-regex "^8.0.0" 1992 | is-fullwidth-code-point "^3.0.0" 1993 | strip-ansi "^6.0.1" 1994 | 1995 | string-width@^5.0.1, string-width@^5.1.2: 1996 | version "5.1.2" 1997 | resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" 1998 | integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== 1999 | dependencies: 2000 | eastasianwidth "^0.2.0" 2001 | emoji-regex "^9.2.2" 2002 | strip-ansi "^7.0.1" 2003 | 2004 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1": 2005 | version "6.0.1" 2006 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 2007 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2008 | dependencies: 2009 | ansi-regex "^5.0.1" 2010 | 2011 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 2012 | version "6.0.1" 2013 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 2014 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2015 | dependencies: 2016 | ansi-regex "^5.0.1" 2017 | 2018 | strip-ansi@^7.0.1: 2019 | version "7.1.0" 2020 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" 2021 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 2022 | dependencies: 2023 | ansi-regex "^6.0.1" 2024 | 2025 | strip-json-comments@^3.1.1: 2026 | version "3.1.1" 2027 | resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" 2028 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 2029 | 2030 | sucrase@^3.32.0: 2031 | version "3.35.0" 2032 | resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" 2033 | integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== 2034 | dependencies: 2035 | "@jridgewell/gen-mapping" "^0.3.2" 2036 | commander "^4.0.0" 2037 | glob "^10.3.10" 2038 | lines-and-columns "^1.1.6" 2039 | mz "^2.7.0" 2040 | pirates "^4.0.1" 2041 | ts-interface-checker "^0.1.9" 2042 | 2043 | supports-color@^5.3.0: 2044 | version "5.5.0" 2045 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 2046 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2047 | dependencies: 2048 | has-flag "^3.0.0" 2049 | 2050 | supports-color@^7.1.0: 2051 | version "7.2.0" 2052 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" 2053 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2054 | dependencies: 2055 | has-flag "^4.0.0" 2056 | 2057 | supports-preserve-symlinks-flag@^1.0.0: 2058 | version "1.0.0" 2059 | resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" 2060 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2061 | 2062 | tailwind-merge@^2.5.4: 2063 | version "2.5.4" 2064 | resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.4.tgz" 2065 | integrity sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q== 2066 | 2067 | tailwindcss-animate@^1.0.7: 2068 | version "1.0.7" 2069 | resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" 2070 | integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== 2071 | 2072 | tailwindcss@^3.4.1: 2073 | version "3.4.13" 2074 | resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz" 2075 | integrity sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw== 2076 | dependencies: 2077 | "@alloc/quick-lru" "^5.2.0" 2078 | arg "^5.0.2" 2079 | chokidar "^3.5.3" 2080 | didyoumean "^1.2.2" 2081 | dlv "^1.1.3" 2082 | fast-glob "^3.3.0" 2083 | glob-parent "^6.0.2" 2084 | is-glob "^4.0.3" 2085 | jiti "^1.21.0" 2086 | lilconfig "^2.1.0" 2087 | micromatch "^4.0.5" 2088 | normalize-path "^3.0.0" 2089 | object-hash "^3.0.0" 2090 | picocolors "^1.0.0" 2091 | postcss "^8.4.23" 2092 | postcss-import "^15.1.0" 2093 | postcss-js "^4.0.1" 2094 | postcss-load-config "^4.0.1" 2095 | postcss-nested "^6.0.1" 2096 | postcss-selector-parser "^6.0.11" 2097 | resolve "^1.22.2" 2098 | sucrase "^3.32.0" 2099 | 2100 | text-table@^0.2.0: 2101 | version "0.2.0" 2102 | resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" 2103 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 2104 | 2105 | thenify-all@^1.0.0: 2106 | version "1.6.0" 2107 | resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" 2108 | integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== 2109 | dependencies: 2110 | thenify ">= 3.1.0 < 4" 2111 | 2112 | "thenify@>= 3.1.0 < 4": 2113 | version "3.3.1" 2114 | resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" 2115 | integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== 2116 | dependencies: 2117 | any-promise "^1.0.0" 2118 | 2119 | to-fast-properties@^2.0.0: 2120 | version "2.0.0" 2121 | resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" 2122 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 2123 | 2124 | to-regex-range@^5.0.1: 2125 | version "5.0.1" 2126 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 2127 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2128 | dependencies: 2129 | is-number "^7.0.0" 2130 | 2131 | ts-api-utils@^1.3.0: 2132 | version "1.3.0" 2133 | resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" 2134 | integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== 2135 | 2136 | ts-interface-checker@^0.1.9: 2137 | version "0.1.13" 2138 | resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" 2139 | integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== 2140 | 2141 | type-check@^0.4.0, type-check@~0.4.0: 2142 | version "0.4.0" 2143 | resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" 2144 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2145 | dependencies: 2146 | prelude-ls "^1.2.1" 2147 | 2148 | typescript-eslint@^8.3.0: 2149 | version "8.8.1" 2150 | resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.8.1.tgz" 2151 | integrity sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ== 2152 | dependencies: 2153 | "@typescript-eslint/eslint-plugin" "8.8.1" 2154 | "@typescript-eslint/parser" "8.8.1" 2155 | "@typescript-eslint/utils" "8.8.1" 2156 | 2157 | typescript@^5.5.3: 2158 | version "5.6.3" 2159 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz" 2160 | integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== 2161 | 2162 | undici-types@~6.19.8: 2163 | version "6.19.8" 2164 | resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" 2165 | integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== 2166 | 2167 | update-browserslist-db@^1.1.0: 2168 | version "1.1.1" 2169 | resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz" 2170 | integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== 2171 | dependencies: 2172 | escalade "^3.2.0" 2173 | picocolors "^1.1.0" 2174 | 2175 | uri-js@^4.2.2: 2176 | version "4.4.1" 2177 | resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" 2178 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2179 | dependencies: 2180 | punycode "^2.1.0" 2181 | 2182 | util-deprecate@^1.0.2: 2183 | version "1.0.2" 2184 | resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 2185 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 2186 | 2187 | vite@^5.4.2: 2188 | version "5.4.8" 2189 | resolved "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz" 2190 | integrity sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ== 2191 | dependencies: 2192 | esbuild "^0.21.3" 2193 | postcss "^8.4.43" 2194 | rollup "^4.20.0" 2195 | optionalDependencies: 2196 | fsevents "~2.3.3" 2197 | 2198 | which@^2.0.1: 2199 | version "2.0.2" 2200 | resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" 2201 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2202 | dependencies: 2203 | isexe "^2.0.0" 2204 | 2205 | word-wrap@^1.2.5: 2206 | version "1.2.5" 2207 | resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" 2208 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 2209 | 2210 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 2211 | version "7.0.0" 2212 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" 2213 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2214 | dependencies: 2215 | ansi-styles "^4.0.0" 2216 | string-width "^4.1.0" 2217 | strip-ansi "^6.0.0" 2218 | 2219 | wrap-ansi@^8.1.0: 2220 | version "8.1.0" 2221 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" 2222 | integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== 2223 | dependencies: 2224 | ansi-styles "^6.1.0" 2225 | string-width "^5.0.1" 2226 | strip-ansi "^7.0.1" 2227 | 2228 | yallist@^3.0.2: 2229 | version "3.1.1" 2230 | resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" 2231 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 2232 | 2233 | yaml@^2.3.4: 2234 | version "2.5.1" 2235 | resolved "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz" 2236 | integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== 2237 | 2238 | yocto-queue@^0.1.0: 2239 | version "0.1.0" 2240 | resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" 2241 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2242 | --------------------------------------------------------------------------------