From 8afadf617626abb07a78e8a5042a0582e0d55df8 Mon Sep 17 00:00:00 2001 From: Karmaa Date: Thu, 6 Feb 2025 23:47:21 -0600 Subject: [PATCH] Initial version 1.1 --- .github/workflows/docker-image.yml | 80 + .gitignore | 24 + README.md | 49 + docker/Dockerfile | 30 + docker/nginx.conf | 38 + eslint.config.js | 38 + index.html | 13 + package-lock.json | 5676 ++++++++++++++++++++++++++++ package.json | 42 + public/favicon.ico | Bin 0 -> 4286 bytes public/logo192.png | Bin 0 -> 10570 bytes public/logo512.png | Bin 0 -> 40273 bytes repo-images/DemoImage1.png | Bin 0 -> 21876 bytes repo-images/TermixLogo.png | Bin 0 -> 19709 bytes src/.gitignore | 149 + src/App.css | 144 + src/App.jsx | 102 + src/Terminal.jsx | 125 + src/backend/entrypoint.sh | 7 + src/backend/server.cjs | 103 + src/index.css | 79 + src/main.jsx | 10 + vite.config.js | 7 + 23 files changed, 6716 insertions(+) create mode 100644 .github/workflows/docker-image.yml create mode 100644 .gitignore create mode 100644 README.md create mode 100644 docker/Dockerfile create mode 100644 docker/nginx.conf create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.ico create mode 100644 public/logo192.png create mode 100644 public/logo512.png create mode 100644 repo-images/DemoImage1.png create mode 100644 repo-images/TermixLogo.png create mode 100644 src/.gitignore create mode 100644 src/App.css create mode 100644 src/App.jsx create mode 100644 src/Terminal.jsx create mode 100644 src/backend/entrypoint.sh create mode 100644 src/backend/server.cjs create mode 100644 src/index.css create mode 100644 src/main.jsx create mode 100644 vite.config.js diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml new file mode 100644 index 00000000..05961696 --- /dev/null +++ b/.github/workflows/docker-image.yml @@ -0,0 +1,80 @@ +name: Build and Push Docker Image + +on: + push: + branches: + - development + workflow_dispatch: + inputs: + tag_name: + description: "Custom tag name for the Docker image" + required: false + default: "" + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: '18' + + - name: Install Dependencies and Build Frontend + run: | + cd frontend + npm ci + npm run build + + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Login to Docker Registry + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Determine Docker image tag + run: | + echo "REPO_OWNER=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV + if [ "${{ github.event.inputs.tag_name }}" == "" ]; then + IMAGE_TAG="${{ github.ref_name }}-development-latest" + else + IMAGE_TAG="${{ github.event.inputs.tag_name }}" + fi + echo "IMAGE_TAG=$IMAGE_TAG" >> $GITHUB_ENV + + - name: Build and Push Docker Image + uses: docker/build-push-action@v2 + with: + context: . + file: ./docker/Dockerfile + push: true + tags: ghcr.io/${{ env.REPO_OWNER }}/termix:${{ env.IMAGE_TAG }} + labels: org.opencontainers.image.source=https://github.com/${{ github.repository }} + + - name: Notify via ntfy + run: | + curl -d "Docker image build and push completed successfully for tag: ${{ env.IMAGE_TAG }}" \ + https://ntfy.karmaashomepage.online/termix-build + + - name: Delete all untagged image versions + uses: quartx-analytics/ghcr-cleaner@v1 + with: + owner-type: user + token: ${{ secrets.GHCR_TOKEN }} + repository-owner: ${{ github.repository_owner }} + delete-untagged: true + + - name: Cleanup Docker Images Locally + run: | + docker image prune -af + docker system prune -af --volumes \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/README.md b/README.md new file mode 100644 index 00000000..17530467 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Repo Stats +![GitHub Repo stars](https://img.shields.io/github/stars/LukeGus/Termix?style=flat&label=Stars) +![GitHub forks](https://img.shields.io/github/forks/LukeGus/Termix?style=flat&label=Forks) +![GitHub Release](https://img.shields.io/github/v/release/LukeGus/Termix?style=flat&label=Release) +#### Top Technologies +[![React Badge](https://img.shields.io/badge/-React-61DBFB?style=flat-square&labelColor=black&logo=react&logoColor=61DBFB)](#) +[![Javascript Badge](https://img.shields.io/badge/-Javascript-F0DB4F?style=flat-square&labelColor=black&logo=javascript&logoColor=F0DB4F)](#) +[![Nodejs Badge](https://img.shields.io/badge/-Nodejs-3C873A?style=flat-square&labelColor=black&logo=node.js&logoColor=3C873A)](#) +[![HTML Badge](https://img.shields.io/badge/-HTML-E34F26?style=flat-square&labelColor=black&logo=html5&logoColor=E34F26)](#) +[![CSS Badge](https://img.shields.io/badge/-CSS-1572B6?style=flat-square&labelColor=black&logo=css3&logoColor=1572B6)](#) +[![Docker Badge](https://img.shields.io/badge/-Docker-2496ED?style=flat-square&labelColor=black&logo=docker&logoColor=2496ED)](#) + +
+

+ + Termimx Banner +

+ +# Description +Termix is an open-source forever free self-hosted SSH (other protocols planned, see [Planned Features](#planned-features)) management panel inspired by [Nexterm](https://github.com/gnmyt/Nexterm). Its purpose is to provide an all-in-one docker-hosted web solution to manage your servers in one easy place. I'm using this project to help me learn [React](https://github.com/facebook/react), [Vite](https://github.com/vitejs/vite-plugin-react), and [Docker](https://www.docker.com) but also because I could never settle on a server management software that I enjoyed to use. + +> [!WARNING] +> This app is in the VERY early stages of development. Expect bugs, data loss, and possibly even security issues! + +# Planned Features +- [x] SSH +- [ ] VNC +- [ ] RDP +- [ ] SMTP (build in file transfer) +- [ ] Split Screen & Tabs +- [ ] ChatGPT/Ollama Integration (for commands) +- [ ] Login Screen + +# How Termix is Different +Before developing Termix, I faced the issue of a server management panel that did not have every feature I liked. [Guacamole](https://guacamole.apache.org/) had poor copy/paste abilities and a poor UI. [Shellngn](https://shellngn.com/) was too expensive and all other alternatives had one major problem with them. I plan to develop the management panel of my dreams with even an AI integration for those pesky commands I always forget the syntax of. + +# Installation +View the Termix [Wiki](https://github.com/LukeGus/Termix/wiki) for information on how to install Termix. You can also use these links to go directly to guide. [Docker](https://github.com/LukeGus/Termix/wiki/Docker) or [Manual](https://github.com/LukeGus/Termix/wiki/Manual). + +# Known Bugs +### Please create an [Issue](https://github.com/LukeGus/Termix/issues) if you find any problems! +Start session button stays connected even if SSH fails to connect. + +# Show-off + +![Demo Image](repo-images/DemoImage1.png) + +# License +Distributed under the MIT license. See LICENSE for more information. \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 00000000..d5f8b403 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,30 @@ +# Build frontend +FROM node:18-alpine AS frontend-build +WORKDIR /app +COPY frontend/package*.json ./frontend/ +RUN npm --prefix frontend install +COPY frontend/ ./frontend/ +RUN npm --prefix frontend run build + +# Build backend +FROM node:18-alpine AS backend-build +WORKDIR /backend +COPY backend/package*.json ./ +RUN npm install +COPY backend/ . + +# Configure nginx +FROM nginx:alpine + +RUN apk add --no-cache nodejs npm +COPY docker/nginx.conf /etc/nginx/nginx.conf +COPY --from=frontend-build /app/frontend/dist /usr/share/nginx/html +COPY --from=backend-build /backend /backend +COPY --from=backend-build /backend/entrypoint.sh /backend/entrypoint.sh + +# Configure start-up +RUN chmod +x /backend/entrypoint.sh +ENTRYPOINT ["/src/backend/entrypoint.sh"] + +EXPOSE 8080 +EXPOSE 8081 \ No newline at end of file diff --git a/docker/nginx.conf b/docker/nginx.conf new file mode 100644 index 00000000..edbe63ae --- /dev/null +++ b/docker/nginx.conf @@ -0,0 +1,38 @@ +events { + worker_connections 1024; +} + +http { + include mime.types; + default_type application/octet-stream; + + sendfile on; + keepalive_timeout 65; + + server { + listen 8080; + server_name localhost; + + # Serve the React app + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + # Proxy WebSocket requests + location /ws/ { + proxy_pass http://localhost:8081; # Backend WebSocket server + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + + # Error pages + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + } +} \ No newline at end of file diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..238d2e4e --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,38 @@ +import js from '@eslint/js' +import globals from 'globals' +import react from 'eslint-plugin-react' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' + +export default [ + { ignores: ['dist'] }, + { + files: ['**/*.{js,jsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + settings: { react: { version: '18.3' } }, + plugins: { + react, + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...js.configs.recommended.rules, + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + ...reactHooks.configs.recommended.rules, + 'react/jsx-no-target-blank': 'off', + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +] diff --git a/index.html b/index.html new file mode 100644 index 00000000..38cfc099 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Termix + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..6f728fd4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5676 @@ +{ + "name": "termix", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "termix", + "version": "0.0.0", + "dependencies": { + "@xterm/addon-fit": "^0.10.0", + "@xterm/xterm": "^5.5.0", + "cors": "^2.8.5", + "express": "^4.21.2", + "is-stream": "^4.0.1", + "make-dir": "^5.0.0", + "node-ssh": "^13.2.0", + "prop-types": "^15.8.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "sb-promise-queue": "^2.1.1", + "sb-scandir": "^3.1.0", + "shell-escape": "^0.2.0", + "socket.io": "^4.8.1", + "socket.io-client": "^4.8.1", + "ssh2": "^1.16.0" + }, + "devDependencies": { + "@eslint/js": "^9.17.0", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.17.0", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.14.0", + "vite": "^6.0.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", + "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.10.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.1.tgz", + "integrity": "sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.1.tgz", + "integrity": "sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.1.tgz", + "integrity": "sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.1.tgz", + "integrity": "sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.1.tgz", + "integrity": "sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.1.tgz", + "integrity": "sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.1.tgz", + "integrity": "sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.1.tgz", + "integrity": "sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.1.tgz", + "integrity": "sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.1.tgz", + "integrity": "sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.1.tgz", + "integrity": "sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.1.tgz", + "integrity": "sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.1.tgz", + "integrity": "sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.1.tgz", + "integrity": "sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.1.tgz", + "integrity": "sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.1.tgz", + "integrity": "sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.1.tgz", + "integrity": "sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.1.tgz", + "integrity": "sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.1.tgz", + "integrity": "sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.0.tgz", + "integrity": "sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", + "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", + "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@xterm/addon-fit": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@xterm/addon-fit/-/addon-fit-0.10.0.tgz", + "integrity": "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ==", + "license": "MIT", + "peerDependencies": { + "@xterm/xterm": "^5.0.0" + } + }, + "node_modules/@xterm/xterm": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@xterm/xterm/-/xterm-5.5.0.tgz", + "integrity": "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A==", + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buildcheck": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001696", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz", + "integrity": "sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cpu-features": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "~0.0.6", + "nan": "^2.19.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.90", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz", + "integrity": "sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", + "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.10.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.19.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", + "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", + "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.18.tgz", + "integrity": "sha512-IRGEoFn3OKalm3hjfolEWGqoF/jPqeEYFp+C8B0WMzwGwBMvlRDQd06kghDhF0C61uJ6WfSDhEZE/sAQjduKgw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.4.tgz", + "integrity": "sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", + "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", + "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-5.0.0.tgz", + "integrity": "sha512-G0yBotnlWVonPClw+tq+xi4K7DZC9n96HjGTBDdHkstAVsDkfZhi1sTvZypXLpyQTbISBkDtK0E5XlUqDsShQg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "license": "MIT", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-ssh": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/node-ssh/-/node-ssh-13.2.0.tgz", + "integrity": "sha512-7vsKR2Bbs66th6IWCy/7SN4MSwlVt+G6QrHB631BjRUM8/LmvDugtYhi0uAmgvHS/+PVurfNBOmELf30rm0MZg==", + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "make-dir": "^3.1.0", + "sb-promise-queue": "^2.1.0", + "sb-scandir": "^3.1.0", + "shell-escape": "^0.2.0", + "ssh2": "^1.14.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/node-ssh/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/node-ssh/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.1.tgz", + "integrity": "sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.32.1", + "@rollup/rollup-android-arm64": "4.32.1", + "@rollup/rollup-darwin-arm64": "4.32.1", + "@rollup/rollup-darwin-x64": "4.32.1", + "@rollup/rollup-freebsd-arm64": "4.32.1", + "@rollup/rollup-freebsd-x64": "4.32.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.32.1", + "@rollup/rollup-linux-arm-musleabihf": "4.32.1", + "@rollup/rollup-linux-arm64-gnu": "4.32.1", + "@rollup/rollup-linux-arm64-musl": "4.32.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.32.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.32.1", + "@rollup/rollup-linux-riscv64-gnu": "4.32.1", + "@rollup/rollup-linux-s390x-gnu": "4.32.1", + "@rollup/rollup-linux-x64-gnu": "4.32.1", + "@rollup/rollup-linux-x64-musl": "4.32.1", + "@rollup/rollup-win32-arm64-msvc": "4.32.1", + "@rollup/rollup-win32-ia32-msvc": "4.32.1", + "@rollup/rollup-win32-x64-msvc": "4.32.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sb-promise-queue": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sb-promise-queue/-/sb-promise-queue-2.1.1.tgz", + "integrity": "sha512-qXfdcJQMxMljxmPprn4Q4hl3pJmoljSCzUvvEBa9Kscewnv56n0KqrO6yWSrGLOL9E021wcGdPa39CHGKA6G0w==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/sb-scandir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sb-scandir/-/sb-scandir-3.1.0.tgz", + "integrity": "sha512-70BVm2xz9jn94zSQdpvYrEG101/UV9TVGcfWr9T5iob3QhCK4lYXeculfBqPGFv3XTeKgx4dpWyYIDeZUqo4kg==", + "license": "MIT", + "dependencies": { + "sb-promise-queue": "^2.1.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-escape": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/shell-escape/-/shell-escape-0.2.0.tgz", + "integrity": "sha512-uRRBT2MfEOyxuECseCZd28jC1AJ8hmqqneWQ4VWUTgCAFvb3wKU1jLqj6egC4Exrr88ogg3dp+zroH4wJuaXzw==", + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.17.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssh2": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", + "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.10", + "nan": "^2.20.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..0100487a --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "termix", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@xterm/addon-fit": "^0.10.0", + "@xterm/xterm": "^5.5.0", + "cors": "^2.8.5", + "express": "^4.21.2", + "is-stream": "^4.0.1", + "make-dir": "^5.0.0", + "node-ssh": "^13.2.0", + "prop-types": "^15.8.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "sb-promise-queue": "^2.1.1", + "sb-scandir": "^3.1.0", + "shell-escape": "^0.2.0", + "socket.io": "^4.8.1", + "socket.io-client": "^4.8.1", + "ssh2": "^1.16.0" + }, + "devDependencies": { + "@eslint/js": "^9.17.0", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.17.0", + "eslint-plugin-react": "^7.37.2", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.14.0", + "vite": "^6.0.5" + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9dfe8173ff4bc41901559aa383551647a5148801 GIT binary patch literal 4286 zcmc(jO>7%g5XWB$YHxfUxY7fuxX~j$6p9q6TJfm_2}+`te3is@i0ydSu7VsFq|yRH zO~nE6AyE?G*1(NhL}-8_(l(T+`B0Tpi_}Wtf`q8VV}7&y96MQW92}_|jrZ-mnfcF~ z_jYDB#%z)<%J|Xye$=uXE0R@cue*JvG__EpMCC2cW zLk3yVc~tIA*x2mld7c?A7LDjO%lLG5AoT|r{VzUij~-~Ty-)A6y-z(+O~PXi8D!Bx zS8O~yJW@2+tmi^b2*2BMne-gCUVmo)Dkj)*gkLg`4!UCFcd^xq&5e9eY~SB5aZ6`Y z$(2Og^YK`5euQ(_z!o-zw%77OvGLLOGnqu+UwzLV2;v)o(Iac@Zh5?l;6=to_}Idx z`VbL^aNWks=U>XE5-V}oV7!w~+0WiTWj}rIq!MFzk@)x@`haaPyu4p^9>AA9+BGD5 z)!!;HueBDjb#(ue_S>(g%UmXNp1cva?=BV%k3(SYQhN zW3msOgWa9~xb8Sj}IzBq_w&wVsroOku-cH+hu%%}H zXAT);sSW62qcWbHy)gewgG~;sm4DIw_|yrlar0NN+Mj=zvd0b|vJ>NH*VUhi@h@ya z=8!>_+KBEt{MGzhQf#fg(e(4&R)7`hhJ;A=f*x?k3V)+=a50R7JgWNu9xdi zQ2VKcQhz(DV&(9uuh_iu+pPWIm}kG6IA@na9(=~|n7cANtFq{P^6vWegW-98x&G3V z1~oX}Om9Gs;OY?gAHG$zmoLuPOEbSJU6?*^XMVX*es+9#%(-WD&@IPb_PwJ2psy~s z!;G~jlAd>M|26Q!LEUrqUFpcH)z6O4ea#%YdiDgHo=*Ev!I1M-)qlAdh#&Ny>8k!y zbbBNY|A#b=A$DB<=>nl~aQ$~Ov7)`;2KBh=-HMQ{xBss4LE<2Jxos$&o}*4_Unc8t z=OPvpIq?IX@cUy9TN>MnJ$HCfcjEA7spP)DM){V)5AsI2PjUXZyI?YhOvU%ts9-l^ z3!9t0L>C`czdtjX>1?w97WD#usGAUDcrtfW`l@L;LnHcr>$mIXzdzUdDS47U5xQSU zdnV6c{r+aGy$o}KjLNUI6ZLE-o2)g){%cI}Z(|<%)0lggjoATB8q+i)|2}YJ>b#sh U_ers_9NNP+7+`^Emv`9z0KJ2if&c&j literal 0 HcmV?d00001 diff --git a/public/logo192.png b/public/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..229e95f0e7f3485068fd7a016de9a5833e0e9c1c GIT binary patch literal 10570 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 literal 0 HcmV?d00001 diff --git a/public/logo512.png b/public/logo512.png new file mode 100644 index 0000000000000000000000000000000000000000..48dbc4f336d2c4b19a7145be73e27a9f12a0ca16 GIT binary patch literal 40273 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%0DD^jJDB-(ZoBAbT?wpgb=< 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 Do57sO literal 0 HcmV?d00001 diff --git a/repo-images/DemoImage1.png b/repo-images/DemoImage1.png new file mode 100644 index 0000000000000000000000000000000000000000..f1641293dd5e0cd917bca08c4cb512cd87d2f020 GIT binary patch literal 21876 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 literal 0 HcmV?d00001 diff --git a/repo-images/TermixLogo.png b/repo-images/TermixLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..48373054b424f1aa31e27cdfa21a89e13d47560f GIT binary patch literal 19709 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 UQ`cr1x&QzG07*qoM6N<$f<+Gj4*&oF literal 0 HcmV?d00001 diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 00000000..563fa9a0 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,149 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +.bash_history +.bashrc +.init_done +.profile +.sudo_as_admin_successful +.wget-hsts +.git-credentials +.docker/ +.bash_logout + +# VSCode Files +.vscode-server/ + +# Configs +.config/ + +# .dotnet +.dotnet/ + +# .local +.local/ \ No newline at end of file diff --git a/src/App.css b/src/App.css new file mode 100644 index 00000000..5b5bd089 --- /dev/null +++ b/src/App.css @@ -0,0 +1,144 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.sidebar { + display: flex; + flex-shrink: 1; + flex-grow: 1; + flex-direction: column; + gap: 0.5em; + position: fixed; + left: 0; + top: 0; + bottom: 0; + height: 100vh; + padding: 2em; + width: 10em; + background-color: #323232; + font-size: 16px; +} + +.topbar { + display: flex; + flex-shrink: 0; + flex-grow: 1; + flex-direction: row; + position: fixed; + justify-content: space-between; + align-items: center; + text-align: center; + padding: 30px; + background-color: #323232; + top: 0; + left: 14em; + right: 0; + width: calc(100% - 14em); + min-height: 36px; + height: auto; + font-size: 16px; + gap: 0.5em; + overflow-x: auto; +} + +.topbar button { + padding: 0.5em 1em; + background-color: #444; + border: none; + border-radius: 4px; + color: white; + cursor: pointer; + white-space: nowrap; +} + +.topbar button.active-tab { + background-color: #1a1a1a; + border-bottom: 2px solid white; +} + +.terminal-tab { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: none; +} + +.terminal-tab.active { + display: block; +} + +.add-host { + display: flex; + flex-shrink: 1; + flex-grow: 1; + flex-direction: column; + justify-content: space-between; + position: fixed; + top: 50%; + left: 50%; + width: 200px; + height: 375px; + transform: translate(-50%, -50%); + gap: 0.5em; + padding: 1em; + z-index: 1; + background-color: #323232; + box-shadow: #1a1a1a 0 0 1em; + border-radius: 8px; +} + +.add-host-close { + position: absolute; + top: -7px; + right: 5px; + width: 20px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + text-align: center; + font-size: 12px; + border-radius: 4px; +} + +.add-host h2 { + margin: 0.2em; +} + +.add-host input { + margin-top: 0.1em; +} + +.add-host button { + margin-top: 1em; +} + +.add-host.hidden { + display: none; +} + +.terminal-wrapper { + position: fixed; + top: 96px; + left: 14em; + right: 0; + bottom: 0; + display: block; + width: 100%; + height: 100%; + background-color: #1c1c1c; + text-align: left; +} + +.terminal-container { + width: 100%; + height: 100%; + border: none; + text-align: left; +} \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx new file mode 100644 index 00000000..97c7e3ba --- /dev/null +++ b/src/App.jsx @@ -0,0 +1,102 @@ +import { useState } from "react"; +import "./App.css"; +import { NewTerminal } from "./Terminal.jsx"; + +function App() { + const [isAddHostHidden, setIsAddHostHidden] = useState(true); + const [terminals, setTerminals] = useState([]); + const [activeTab, setActiveTab] = useState(null); + const [nextId, setNextId] = useState(1); + const [form, setForm] = useState({ name: "", ip: "", user: "", password: "", port: "22" }); + + const handleAddHost = () => { + if (form.ip && form.user && form.password && form.port) { + const newTerminal = { + id: nextId, + title: form.name || form.ip, + hostConfig: { + ip: form.ip, + user: form.user, + password: form.password, + port: form.port, + }, + }; + setTerminals([...terminals, newTerminal]); + setActiveTab(nextId); + setNextId(nextId + 1); + setIsAddHostHidden(true); + setForm({ name: "", ip: "", user: "", password: "", port: "22" }); + } else { + alert("Please fill out all fields."); + } + }; + + return ( + <> +
+

Termix

+ +
+
+ {terminals.map((terminal) => ( + + ))} +
+
+ {terminals.map((terminal) => ( +
+ {terminal.hostConfig && } +
+ ))} +
+
+

Add Host

+ + setForm({ ...form, name: e.target.value })} + /> + setForm({ ...form, ip: e.target.value })} + /> + setForm({ ...form, user: e.target.value })} + /> + setForm({ ...form, password: e.target.value })} + /> + setForm({ ...form, port: e.target.value })} + /> + +
+ + ); +} + +export default App; \ No newline at end of file diff --git a/src/Terminal.jsx b/src/Terminal.jsx new file mode 100644 index 00000000..ee83b57b --- /dev/null +++ b/src/Terminal.jsx @@ -0,0 +1,125 @@ +// Terminal.jsx +import { useEffect, useRef } from "react"; +import { Terminal } from "@xterm/xterm"; +import { FitAddon } from "@xterm/addon-fit"; +import "@xterm/xterm/css/xterm.css"; +import io from "socket.io-client"; +import PropTypes from "prop-types"; + +export function NewTerminal({ hostConfig }) { + const terminalRef = useRef(null); + + useEffect(() => { + if (!hostConfig || !terminalRef.current) return; + + // Initialize terminal + const terminal = new Terminal({ + cursorBlink: true, + cursorStyle: "block", + theme: { background: "#1a1a1a", foreground: "#ffffff", cursor: "#ffffff" }, + fontSize: 14, + scrollback: 1000, + }); + + // Initialize FitAddon for auto-sizing + const fitAddon = new FitAddon(); + terminal.loadAddon(fitAddon); + + // Open terminal in the container + terminal.open(terminalRef.current); + + // Apply fit after terminal is fully initialized + setTimeout(() => { + fitAddon.fit(); + resizeTerminal(); + }, 100); + + // Focus on terminal and reset layout + terminal.focus(); + + // Resize terminal to fit the container + const resizeTerminal = () => { + const terminalContainer = terminalRef.current; + const sidebarWidth = 14 * 16; // Sidebar width in pixels + const topbarHeight = 96; // Topbar height in pixels + const availableWidth = window.innerWidth - sidebarWidth; + const availableHeight = window.innerHeight - topbarHeight; + + terminalContainer.style.width = `${availableWidth}px`; + terminalContainer.style.height = `${availableHeight}px`; + + fitAddon.fit(); + const { cols, rows } = terminal; + + // Emit new terminal size to the backend + if (socket) { + socket.emit("resize", { cols, rows }); + console.log(`Terminal resized: cols=${cols}, rows=${rows}`); + } + }; + + // Handle window resize events + window.addEventListener("resize", resizeTerminal); + + // Write initial connection message + terminal.write("\r\n*** Connecting to backend ***\r\n"); + + // Create the socket connection with the provided hostConfig + const socket = io("http://localhost:8081"); + + // Emit the hostConfig to the server to start SSH connection + fitAddon.fit(); + const { cols, rows } = terminal; + socket.emit("connectToHost", cols, rows, hostConfig); + + // Handle socket connection events + socket.on("connect", () => { + terminal.write("\r\n*** Connected to backend ***\r\n"); + + // Send keystrokes to the backend + terminal.onKey((key) => { + socket.emit("data", key.key); + }); + + // Display output from the backend + socket.on("data", (data) => { + terminal.write(data); + }); + + // Handle disconnection + socket.on("disconnect", () => { + terminal.write("\r\n*** Disconnected from backend ***\r\n"); + }); + }); + + // Cleanup on component unmount + return () => { + terminal.dispose(); + window.removeEventListener("resize", resizeTerminal); + socket.disconnect(); + }; + }, [hostConfig]); // Re-run effect when hostConfig changes + + return ( +
+ ); +} + +// Prop validation using PropTypes +NewTerminal.propTypes = { + hostConfig: PropTypes.shape({ + ip: PropTypes.string.isRequired, + user: PropTypes.string.isRequired, + password: PropTypes.string.isRequired, + port: PropTypes.string.isRequired, + }).isRequired, +}; \ No newline at end of file diff --git a/src/backend/entrypoint.sh b/src/backend/entrypoint.sh new file mode 100644 index 00000000..83d01985 --- /dev/null +++ b/src/backend/entrypoint.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +# Start the backend server +node /src/backend/server.cjs & + +# Start nginx in the foreground +exec nginx -g 'daemon off;' \ No newline at end of file diff --git a/src/backend/server.cjs b/src/backend/server.cjs new file mode 100644 index 00000000..cd3f0222 --- /dev/null +++ b/src/backend/server.cjs @@ -0,0 +1,103 @@ +const http = require("http"); +const socketIo = require("socket.io"); +const SSHClient = require("ssh2").Client; + +const server = http.createServer(); +const io = socketIo(server, { + cors: { + origin: "*", + methods: ["GET", "POST"], + }, +}); + +io.on("connection", (socket) => { + console.log("New socket connection established"); + + let currentCols = 80; + let currentRows = 24; + let stream = null; + + socket.on("resize", ({ cols, rows }) => { + console.log(`Terminal resized: cols=${cols}, rows=${rows}`); + currentCols = cols; + currentRows = rows; + if (stream && stream.setWindow) { + stream.setWindow(rows, cols, rows * 100, cols * 100); + console.log(`SSH terminal resized to: cols=${cols}, rows=${rows}`); + } + }); + + socket.on("connectToHost", (cols, rows, hostConfig) => { + if (!hostConfig || !hostConfig.ip || !hostConfig.user || !hostConfig.password || !hostConfig.port) { + console.error("Invalid hostConfig received:", hostConfig); + return; + } + + console.log("Received hostConfig:", hostConfig); + const { ip, port, user, password } = hostConfig; + + if (!ip || !port || !user || !password) { + socket.emit("data", "\r\n*** Missing required connection data ***\r\n"); + return; + } + + console.log("Preparing to connect to host:", hostConfig); + const conn = new SSHClient(); + + conn + .on("ready", function () { + console.log("SSH connection established"); + socket.emit("data", "\r\n*** SSH CONNECTION ESTABLISHED ***\r\n"); + conn.shell(function (err, newStream) { + if (err) { + console.error("Error opening SSH shell:", err); + return socket.emit( + "data", + "\r\n*** SSH SHELL ERROR: " + err.message + " ***\r\n" + ); + } + stream = newStream; + + stream.setWindow(currentRows, currentCols, currentRows * 100, currentCols * 100); + + socket.on("data", function (data) { + stream.write(data); + }); + + stream + .on("data", function (d) { + socket.emit("data", d.toString("binary")); + }) + .on("close", function () { + console.log("SSH stream closed"); + conn.end(); + }); + }); + }) + .on("close", function () { + console.log("SSH connection closed"); + socket.emit("data", "\r\n*** SSH CONNECTION CLOSED ***\r\n"); + }) + .on("error", function (err) { + console.error("SSH connection error:", err); + socket.emit( + "data", + "\r\n*** SSH CONNECTION ERROR: " + err.message + " ***\r\n" + ); + }) + .connect({ + host: ip, + port: port, + username: user, + password: password, + }); + }); + + socket.on("disconnect", () => { + console.log("Client disconnected"); + }); +}); + +server.listen(8081, () => { + console.log("Server is running on port 8081"); +}); \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 00000000..a57d4834 --- /dev/null +++ b/src/index.css @@ -0,0 +1,79 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +input { + border-radius: 8px; + border: 1px solid #1a1a1a; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + color: #ffffff; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} \ No newline at end of file diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 00000000..b9a1a6de --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 00000000..8b0f57b9 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +})