From 7da7f79a25942899174226f9e07c4f3d245cd57a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabien=20M=C3=A9nager?= Date: Mon, 16 Jun 2025 22:45:52 +0200 Subject: [PATCH 1/3] Create static.yml --- .github/workflows/static.yml | 42 ++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 .github/workflows/static.yml diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml new file mode 100644 index 0000000..21f98b8 --- /dev/null +++ b/.github/workflows/static.yml @@ -0,0 +1,42 @@ +# Simple workflow for deploying static content to GitHub Pages +name: Deploy static content to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Single deploy job since we're just deploying + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Pages + uses: actions/configure-pages@v5 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: 'pages' + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From 1ae0e5f999d9c37e5d78166e5aaa4eb6ce091900 Mon Sep 17 00:00:00 2001 From: "fabien.menager" Date: Sat, 21 Jun 2025 12:01:40 +0200 Subject: [PATCH 2/3] Add docs --- .github/workflows/static.yml | 44 +- .gitignore | 4 + docs/.vitepress/config.mts | 63 + docs/documentation.md | 206 +++ docs/getting-started.md | 97 ++ docs/images/bench-postgresql.png | Bin 0 -> 23811 bytes docs/index.md | 57 + docs/limitations.md | 9 + package-lock.json | 2251 ++++++++++++++++++++++++++++++ package.json | 10 + 10 files changed, 2729 insertions(+), 12 deletions(-) create mode 100644 docs/.vitepress/config.mts create mode 100644 docs/documentation.md create mode 100644 docs/getting-started.md create mode 100644 docs/images/bench-postgresql.png create mode 100644 docs/index.md create mode 100644 docs/limitations.md create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index 21f98b8..12d21e4 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -1,10 +1,10 @@ -# Simple workflow for deploying static content to GitHub Pages -name: Deploy static content to Pages +name: Deploy site to Pages on: - # Runs on pushes targeting the default branch + # Runs on pushes targeting the `main` branch. Change this to `master` if you're + # using the `master` branch as the default branch. push: - branches: ["main"] + branches: [main] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -18,25 +18,45 @@ permissions: # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: - group: "pages" + group: pages cancel-in-progress: false jobs: - # Single deploy job since we're just deploying - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} + # Build job + build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 + # - uses: pnpm/action-setup@v3 # Uncomment this block if you're using pnpm + # with: + # version: 9 # Not needed if you've set "packageManager" in package.json + # - uses: oven-sh/setup-bun@v1 # Uncomment this if you're using Bun + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm # or pnpm / yarn - name: Setup Pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@v4 + - name: Install dependencies + run: npm ci # or pnpm install / yarn install / bun install + - name: Build with VitePress + run: npm run docs:build # or pnpm docs:build / yarn docs:build / bun run docs:build - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: - path: 'pages' + path: docs/.vitepress/dist + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + name: Deploy + steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 0073c2e..bdba052 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,7 @@ fabric.properties # Visual Studio Files .vs + +# Vitepress +docs/.vitepress/dist +docs/.vitepress/cache diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 0000000..95bd361 --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,63 @@ +import {defineConfig} from 'vitepress' + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + title: "PhenX EFCore BulkInsert", + description: "Super fast bulk insert for EF Core", + themeConfig: { + outline: "deep", + search: { + provider: 'local' + }, + + // https://vitepress.dev/reference/default-theme-config + nav: [ + {text: 'Home', link: '/'}, + {text: 'Documentation', link: '/documentation'}, + ], + + sidebar: [ + { + text: 'Getting started', + items: [ + {text: 'Installation', link: '/getting-started#installation'}, + {text: 'Usage', link: '/getting-started#usage'}, + ] + }, + { + text: 'Documentation', + link: '/documentation' + }, + { + text: 'Limitations', + link: '/limitations' + }, + ], + + editLink: { + pattern: 'https://github.com/PhenX/PhenX.EntityFrameworkCore.BulkInsert/edit/main/README.md/edit/main/docs/:path', + text: 'Edit this page on GitHub' + }, + + lastUpdated: { + text: 'Updated at', + formatOptions: { + dateStyle: 'full', + timeStyle: 'medium' + } + }, + + socialLinks: [ + { + icon: 'github', link: 'https://github.com/PhenX/PhenX.EntityFrameworkCore.BulkInsert', + } + ], + + externalLinkIcon: true, + + footer: { + message: 'Released under the MIT License.', + copyright: 'Copyright © 2025-present Fabien Ménager' + } + } +}) diff --git a/docs/documentation.md b/docs/documentation.md new file mode 100644 index 0000000..e58fc0d --- /dev/null +++ b/docs/documentation.md @@ -0,0 +1,206 @@ +# Configure the DbContext + +Register the bulk insert provider in your `DbContextOptions`: + +```csharp{6,8,10,12,14} +services.AddDbContext(options => +{ + options + // .UseSqlServer(connectionString) // or UseNpgsql or UseSqlite, as appropriate + + .UseBulkInsertPostgreSql() + // OR + .UseBulkInsertSqlServer() + // OR + .UseBulkInsertSqlite() + // OR + .UseBulkInsertMySql() + // OR + .UseBulkInsertOracle() + ; +}); +``` + +# Insert methods + +There are two groups of methods for inserting data into the database: + +* `ExecuteBulkInsert` - inserts the entities as fast as possible, without returning the inserted entities. This is suitable for scenarios where you don't need to access the inserted data immediately. +* `ExecuteBulkInsertReturnEntities` - inserts the entities and returns the inserted entities. This is useful when you need to access the inserted data right after the insertion, but it's slower because it requires creating an intermediate temporary table. + +Each method has an asynchronous version (`ExecuteBulkInsertAsync` and `ExecuteBulkInsertReturnEntitiesAsync`). + +These methods all take the same parameters: + +* `IEnumerable` - the collection of entities to insert. +* `Action>` - an optional action to configure the bulk insert options, such as batch size, timeout, etc. +* `OnConflictOptions` - an optional action to configure conflict resolution options, such as ignoring conflicts or updating existing records. +* `CancellationToken` - an optional cancellation token to cancel the operation, only for the asynchronous methods. + +### Basic usage + +```csharp +// Asynchronously +await dbContext.ExecuteBulkInsertAsync(entities); + +// Or synchronously +dbContext.ExecuteBulkInsert(entities); +``` + +### Bulk insert with options + +```csharp +// Common options +await dbContext.ExecuteBulkInsertAsync(entities, options => +{ + options.BatchSize = 1000; // Set the batch size for the insert operation, the default value is different for each provider +}); + +// Provider specific options, when available, example for SQL Server +await dbContext.ExecuteBulkInsertAsync(entities, (SqlServerBulkInsertOptions o) => // <<< here specify the SQL Server options class +{ + options.EnableStreaming = true; // Enable streaming for SQL Server +}); + +// Provider specific options, supporting multiple providers +await dbContext.ExecuteBulkInsertAsync(entities, o => +{ + o.MoveRows = true; + + if (o is SqlServerBulkInsertOptions sqlServerOptions) + { + sqlServerOptions.EnableStreaming = true; + } + else if (o is MySqlBulkInsertOptions mysqlOptions) + { + mysqlOptions.BatchSize = 1000; + } +}); +``` + +### Returning inserted entities + +```csharp +await dbContext.ExecuteBulkInsertReturnEntitiesAsync(entities); +``` + +### Conflict resolution / merge / upsert + +Conflict resolution works by specifying columns that should be used to detect conflicts and the action to take when +a conflict is detected (e.g., update existing rows), using the `onConflict` parameter. + +* The conflicting columns are specified with the `Match` property and must have a unique constraint in the database. +* The action to take when a conflict is detected is specified with the `Update` property. If not specified, the default action is to do nothing (i.e., skip the conflicting rows). +* You can also specify the condition for the update action using either the `Where` or the `RawWhere` property. If not specified, the update action will be applied to all conflicting rows. + +```csharp +await dbContext.ExecuteBulkInsertAsync(entities, onConflict: new OnConflictOptions +{ + Match = e => new + { + e.Name, + // ...other columns to match on + }, + + // Optional: specify the update action, if not specified, the default action is to do nothing + // Excluded is the row being inserted which is in conflict, and Inserted is the row already in the database. + Update = (inserted, excluded) => new TestEntity + { + Price = inserted.Price // Update the Price column with the new value + }, + + // Optional: specify the condition for the update action + // Excluded is the row being inserted which is in conflict, and Inserted is the row already in the database. + // Using raw SQL condition + RawWhere = (insertedTable, excludedTable) => $"{excludedTable}.some_price > {insertedTable}.some_price", + + // OR using a lambda expression + Where = (inserted, excluded) => excluded.Price > inserted.Price, +}); +``` + +## Options + +The default values for each provider are shown in the table below. + +You can override these defaults by passing an action to the `ExecuteBulkInsert` or `ExecuteBulkInsertReturnEntities` methods. + +### BatchSize + +* Type: `int` +* Default: + * SQL Server: `50,000` + * PostgreSQL: N/A (uses native bulk insert) + * SQLite: `5` (INSERT statement with multiple values) + * MySQL: N/A (uses native bulk insert) + * Oracle: `50,000` + +The number of rows to insert in each batch. + +### CopyTimeout + +* Type: `TimeSpan` +* Default: `10 minutes` + +The timeout for the bulk insert operation. + +### CopyGeneratedColumns +* Type: `bool` +* Default: `false` + +Copy computed/generated columns + +### MoveRows +* Type: `bool` +* Default: `false` (PostgreSQL only) + +Move rows between tables (PostgreSQL only), only applies when returning entities. + +### SRID + +* Type: `int` +* Default: `4326` + +Sets the ID of the Spatial Reference System used by the Geometries to be inserted. + +### NotifyProgressAfter + +* Type: `int` +* Default: `unset` + +Notify after X rows are copied. This is useful for tracking progress in long-running operations. + +### OnProgress + +* Type: `Action` +* Default: `unset` + +Callback for progress reporting. This is called with the number of rows copied so far. + +### Converters + +* Type: `IEnumerable` +* Default: `[GeometryConverter]` (SQL Server and PostgreSQL only) + +List of value converters for custom types, such as spatial types. + +### CopyOptions + +* Type: `Enum` +* Default: `Default` (SQL Server and Oracle only) + +Provider-specific copy/bulk options (`SqlBulkCopyOptions` for SQL Server, `OracleBulkCopyOptions` for Oracle, etc) + +### EnableStreaming + +* Type: `bool` +* Default: `false` (SQL Server only) + +Enable streaming bulk copy for SQL Server + +### TypeProviders + +* Type: `IEnumerable` +* Default: `unset` (PostgreSQL only) + +Custom PostgreSQL type providers for handling specific data types. diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 0000000..82f339f --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,97 @@ +--- +title: Getting started +lang: en-US +--- + +# Installation + +Install the NuGet package for your database provider: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nuget installNuGet Link
+ +```shell +Install-Package PhenX.EntityFrameworkCore.BulkInsert.PostgreSql +``` +NuGet
+ +```shell +Install-Package PhenX.EntityFrameworkCore.BulkInsert.Sqlite +``` +NuGet
+ +```shell +Install-Package PhenX.EntityFrameworkCore.BulkInsert.Sqlite +``` +NuGet
+ +```shell +Install-Package PhenX.EntityFrameworkCore.BulkInsert.MySql +``` +NuGet
+ +```shell +Install-Package PhenX.EntityFrameworkCore.BulkInsert.Oracle +``` +NuGet
+ +# Usage + +Register the bulk insert provider in your `DbContextOptions`: + +```csharp{6,8,10,12,14} +services.AddDbContext(options => +{ + options + // .UseSqlServer(connectionString) // or UseNpgsql or UseSqlite, as appropriate + + .UseBulkInsertPostgreSql() + // OR + .UseBulkInsertSqlServer() + // OR + .UseBulkInsertSqlite() + // OR + .UseBulkInsertMySql() + // OR + .UseBulkInsertOracle() + ; +}); +``` + +Then insert data: + +```csharp{2,5} +// Asynchronously +await dbContext.ExecuteBulkInsertAsync(entities); + +// Or synchronously +dbContext.ExecuteBulkInsert(entities); +``` diff --git a/docs/images/bench-postgresql.png b/docs/images/bench-postgresql.png new file mode 100644 index 0000000000000000000000000000000000000000..87f4ebc4f66caaf93c5877b028147b4e0e029491 GIT binary patch literal 23811 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 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.29.0.tgz", + "integrity": "sha512-AM/6LYMSTnZvAT5IarLEKjYWOdV+Fb+LVs8JRq88jn8HH6bpVUtjWdOZXqX1hJRXuCAY8SdQfb7F8uEiMNXdYQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.29.0.tgz", + "integrity": "sha512-La34HJh90l0waw3wl5zETO8TuukeUyjcXhmjYZL3CAPLggmKv74mobiGRIb+mmBENybiFDXf/BeKFLhuDYWMMQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.29.0.tgz", + "integrity": "sha512-T0lzJH/JiCxQYtCcnWy7Jf1w/qjGDXTi2npyF9B9UsTvXB97GRC6icyfXxe21mhYvhQcaB1EQ/J2575FXxi2rA==", + "dev": true, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.29.0.tgz", + "integrity": "sha512-A39F1zmHY9aev0z4Rt3fTLcGN5AG1VsVUkVWy6yQG5BRDScktH+U5m3zXwThwniBTDV1HrPgiGHZeWb67GkR2Q==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.29.0.tgz", + "integrity": "sha512-ibxmh2wKKrzu5du02gp8CLpRMeo+b/75e4ORct98CT7mIxuYFXowULwCd6cMMkz/R0LpKXIbTUl15UL5soaiUQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.29.0.tgz", + "integrity": "sha512-VZq4/AukOoJC2WSwF6J5sBtt+kImOoBwQc1nH3tgI+cxJBg7B77UsNC+jT6eP2dQCwGKBBRTmtPLUTDDnHpMgA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.29.0.tgz", + "integrity": "sha512-cZ0Iq3OzFUPpgszzDr1G1aJV5UMIZ4VygJ2Az252q4Rdf5cQMhYEIKArWY/oUjMhQmosM8ygOovNq7gvA9CdCg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.29.0.tgz", + "integrity": "sha512-scBXn0wO5tZCxmO6evfa7A3bGryfyOI3aoXqSQBj5SRvNYXaUlFWQ/iKI70gRe/82ICwE0ICXbHT/wIvxOW7vw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.29.0.tgz", + "integrity": "sha512-FGWWG9jLFhsKB7YiDjM2dwQOYnWu//7Oxrb2vT96N7+s+hg1mdHHfHNRyEudWdxd4jkMhBjeqNA21VbTiOIPVg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.29.0.tgz", + "integrity": "sha512-xte5+mpdfEARAu61KXa4ewpjchoZuJlAlvQb8ptK6hgHlBHDnYooy1bmOFpokaAICrq/H9HpoqNUX71n+3249A==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.29.0.tgz", + "integrity": "sha512-og+7Em75aPHhahEUScq2HQ3J7ULN63Levtd87BYMpn6Im5d5cNhaC4QAUsXu6LWqxRPgh4G+i+wIb6tVhDhg2A==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.29.0.tgz", + "integrity": "sha512-JCxapz7neAy8hT/nQpCvOrI5JO8VyQ1kPvBiaXWNC1prVq0UMYHEL52o1BsPvtXfdQ7BVq19OIq6TjOI06mV/w==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.29.0.tgz", + "integrity": "sha512-lVBD81RBW5VTdEYgnzCz7Pf9j2H44aymCP+/eHGJu4vhU+1O8aKf3TVBgbQr5UM6xoe8IkR/B112XY6YIG2vtg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.39", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.39.tgz", + "integrity": "sha512-XlhW73c4dHvUrwWckVY76HDjnaZ2fWKD6hNZtd5kuv23GC0g3Lu0MXnYscpkIYOeiXO+Gtlw8FM53J7C84mCtA==", + "dev": true, + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true + }, + "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 + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz", + "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz", + "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz", + "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz", + "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz", + "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz", + "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz", + "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz", + "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz", + "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz", + "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz", + "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz", + "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz", + "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz", + "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz", + "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz", + "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz", + "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz", + "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz", + "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz", + "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.17.tgz", + "integrity": "sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@vue/shared": "3.5.17", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.17.tgz", + "integrity": "sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.17.tgz", + "integrity": "sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.27.5", + "@vue/compiler-core": "3.5.17", + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.17.tgz", + "integrity": "sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", + "dev": true, + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.17.tgz", + "integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==", + "dev": true, + "dependencies": { + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.17.tgz", + "integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.5.17", + "@vue/shared": "3.5.17" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz", + "integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.5.17", + "@vue/runtime-core": "3.5.17", + "@vue/shared": "3.5.17", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.17.tgz", + "integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.5.17", + "@vue/shared": "3.5.17" + }, + "peerDependencies": { + "vue": "3.5.17" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.17.tgz", + "integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/algoliasearch": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.29.0.tgz", + "integrity": "sha512-E2l6AlTWGznM2e7vEE6T6hzObvEyXukxMOlBmVlMyixZyK1umuO/CiVc6sDBbzVH0oEviCE5IfVY1oZBmccYPQ==", + "dev": true, + "dependencies": { + "@algolia/client-abtesting": "5.29.0", + "@algolia/client-analytics": "5.29.0", + "@algolia/client-common": "5.29.0", + "@algolia/client-insights": "5.29.0", + "@algolia/client-personalization": "5.29.0", + "@algolia/client-query-suggestions": "5.29.0", + "@algolia/client-search": "5.29.0", + "@algolia/ingestion": "1.29.0", + "@algolia/monitoring": "1.29.0", + "@algolia/recommend": "5.29.0", + "@algolia/requester-browser-xhr": "5.29.0", + "@algolia/requester-fetch": "5.29.0", + "@algolia/requester-node-http": "5.29.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/birpc": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.4.0.tgz", + "integrity": "sha512-5IdNxTyhXHv2UlgnPHQ0h+5ypVmkrYHzL8QT+DwFZ//2N/oNV8Ch+BCRmTJ3x6/z9Axo/cXYBc9eprsUVK/Jsg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "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 + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz", + "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/minisearch": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz", + "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "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 + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.26.9", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.9.tgz", + "integrity": "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "dev": true, + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz", + "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.44.0", + "@rollup/rollup-android-arm64": "4.44.0", + "@rollup/rollup-darwin-arm64": "4.44.0", + "@rollup/rollup-darwin-x64": "4.44.0", + "@rollup/rollup-freebsd-arm64": "4.44.0", + "@rollup/rollup-freebsd-x64": "4.44.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", + "@rollup/rollup-linux-arm-musleabihf": "4.44.0", + "@rollup/rollup-linux-arm64-gnu": "4.44.0", + "@rollup/rollup-linux-arm64-musl": "4.44.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", + "@rollup/rollup-linux-riscv64-gnu": "4.44.0", + "@rollup/rollup-linux-riscv64-musl": "4.44.0", + "@rollup/rollup-linux-s390x-gnu": "4.44.0", + "@rollup/rollup-linux-x64-gnu": "4.44.0", + "@rollup/rollup-linux-x64-musl": "4.44.0", + "@rollup/rollup-win32-arm64-msvc": "4.44.0", + "@rollup/rollup-win32-ia32-msvc": "4.44.0", + "@rollup/rollup-win32-x64-msvc": "4.44.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "peer": true + }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "dev": true, + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.3.tgz", + "integrity": "sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==", + "dev": true, + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.17.tgz", + "integrity": "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.5.17", + "@vue/compiler-sfc": "3.5.17", + "@vue/runtime-dom": "3.5.17", + "@vue/server-renderer": "3.5.17", + "@vue/shared": "3.5.17" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1c37c23 --- /dev/null +++ b/package.json @@ -0,0 +1,10 @@ +{ + "scripts": { + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs" + }, + "devDependencies": { + "vitepress": "^1.6.3" + } +} From 865960355c9da2f23b2830175198fe9ef122bb41 Mon Sep 17 00:00:00 2001 From: "fabien.menager" Date: Sat, 21 Jun 2025 16:01:58 +0200 Subject: [PATCH 3/3] Add benchmarks --- docs/images/bench-mysql.png | Bin 0 -> 23176 bytes docs/images/bench-oracle.png | Bin 0 -> 24622 bytes docs/images/bench-sqlite.png | Bin 0 -> 26615 bytes docs/images/bench-sqlserver.png | Bin 0 -> 25855 bytes docs/index.md | 50 ++++++++++++++++++++++++++++++++ 5 files changed, 50 insertions(+) create mode 100644 docs/images/bench-mysql.png create mode 100644 docs/images/bench-oracle.png create mode 100644 docs/images/bench-sqlite.png create mode 100644 docs/images/bench-sqlserver.png diff --git a/docs/images/bench-mysql.png b/docs/images/bench-mysql.png new file mode 100644 index 0000000000000000000000000000000000000000..da6f61c21a7f6771908837d4a63431120be3249f GIT binary patch literal 23176 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 literal 0 HcmV?d00001 diff --git a/docs/images/bench-sqlite.png b/docs/images/bench-sqlite.png new file mode 100644 index 0000000000000000000000000000000000000000..b5c4966bb5cddd8659d564e8e3281455f2e95e06 GIT binary patch literal 26615 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 X?p-9hh~^J2^kFlEo9xfgx4rx?^@K!E literal 0 HcmV?d00001 diff --git a/docs/images/bench-sqlserver.png b/docs/images/bench-sqlserver.png new file mode 100644 index 0000000000000000000000000000000000000000..74cbc613fdfb5df8facdd21bf8c77efff35cc16a GIT binary patch literal 25855 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 ObTrPN$@%+5pZ@~1k3Mq% literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index dcbf6e9..d7df99a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -29,6 +29,8 @@ features: ## It's fast ! +It's also memory efficient, with low allocations and garbage collection pressure, see benchmark results below. + The benchmark consists of inserting 500 000 records into a single table with various column types, using various methods to compare performance. The results are shown for PostgreSQL, SQL Server, SQLite, MySQL and Oracle databases. @@ -55,3 +57,51 @@ The benchmark code is available on [GitHub](https://github.com/PhenX/PhenX.Entit | Linq2Db | 1.427 s | 1.05 | 11000.0000 | 1000.0000 | - | 91.68 MB | 1.00 | | Z_EntityFramework_Extensions_EFCore | 3.750 s | 2.76 | 53000.0000 | 1000.0000 | - | 439.14 MB | 4.79 | | EFCore_BulkExtensions | 13.432 s | 9.88 | 29000.0000 | 2000.0000 | - | 232.77 MB | 2.54 | + +### MySQL + +![MySQL benchmark results](images/bench-mysql.png) + +| Method | Mean | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio | +|--------------------------------------|---------:|------:|------------:|-----------:|----------:|-----------:|------------:| +| PhenX_EntityFrameworkCore_BulkInsert | 4.369 s | 1.02 | 18000.0000 | 1000.0000 | - | 147.12 MB | 1.00 | +| RawInsert | 17.146 s | 4.00 | 33000.0000 | 13000.0000 | 1000.0000 | 266.41 MB | 1.81 | +| Linq2Db | 4.680 s | 1.09 | 18000.0000 | 1000.0000 | - | 145.13 MB | 0.99 | +| Z_EntityFramework_Extensions_EFCore | 37.362 s | 8.72 | 192000.0000 | 6000.0000 | - | 1554.77 MB | 10.57 | +| EFCore_BulkExtensions | NA | ? | NA | NA | NA | NA | ? | + +### SQLite + +![SQLite benchmark results](images/bench-sqlite.png) + +| Method | Mean | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio | +|--------------------------------------|--------:|------:|------------:|----------:|----------:|-----------:|------------:| +| PhenX_EntityFrameworkCore_BulkInsert | 2.259 s | 1.00 | 69000.0000 | 1000.0000 | - | 554.55 MB | 1.00 | +| RawInsert | 2.141 s | 0.95 | 78000.0000 | 1000.0000 | - | 625.5 MB | 1.13 | +| Linq2Db | 4.452 s | 1.98 | 65000.0000 | 5000.0000 | 2000.0000 | 646.42 MB | 1.17 | +| Z_EntityFramework_Extensions_EFCore | 3.008 s | 1.34 | 200000.0000 | 1000.0000 | - | 1613.93 MB | 2.91 | +| EFCore_BulkExtensions | 2.850 s | 1.27 | 102000.0000 | 1000.0000 | - | 820.09 MB | 1.48 | + +### SQL Server + +![SQL Server benchmark results](images/bench-sqlserver.png) + +| Method | Mean | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio | +|--------------------------------------|--------:|------:|-----------:|-----------:|----------:|----------:|------------:| +| PhenX_EntityFrameworkCore_BulkInsert | 3.072 s | 1.01 | 11000.0000 | 1000.0000 | - | 87.76 MB | 1.00 | +| RawInsert | 3.926 s | 1.29 | 38000.0000 | 16000.0000 | 1000.0000 | 310.32 MB | 3.54 | +| Linq2Db | 3.294 s | 1.08 | 56000.0000 | 1000.0000 | - | 450.2 MB | 5.13 | +| Z_EntityFramework_Extensions_EFCore | 3.773 s | 1.24 | 35000.0000 | 1000.0000 | - | 297.98 MB | 3.40 | +| EFCore_BulkExtensions | 7.375 s | 2.42 | 48000.0000 | 11000.0000 | 1000.0000 | 461.71 MB | 5.26 | + +### Oracle + +![Oracle benchmark results](images/bench-oracle.png) + +| Method | Mean | Ratio | Gen0 | Gen1 | Gen2 | Allocated | Alloc Ratio | +|--------------------------------------|---------:|------:|------------:|------------:|----------:|----------:|------------:| +| PhenX_EntityFrameworkCore_BulkInsert | 4.943 s | 1.01 | 99000.0000 | 43000.0000 | 2000.0000 | 781.07 MB | 1.00 | +| RawInsert | 13.651 s | 2.78 | 115000.0000 | 48000.0000 | 3000.0000 | 907.65 MB | 1.16 | +| Linq2Db | NA | ? | NA | NA | NA | NA | ? | +| Z_EntityFramework_Extensions_EFCore | 5.251 s | 1.07 | 107000.0000 | 101000.0000 | - | 873.4 MB | 1.12 | +| EFCore_BulkExtensions | NA | ? | NA | NA | NA | NA | ? |