From 587d606a080212cc9bc8f7c739f2175bf11c353f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Fri, 22 Nov 2024 12:30:07 +0100 Subject: [PATCH 01/20] Move desktop and browser-enxtension in subfolder --- .dockerignore | 6 +- .pre-commit-config.yaml | 4 +- .../docs/create-your-project.html.heex | 10 +- .../website/docs/getting-started.html.heex | 7 + .../website/docs/what-is-azimutt.html.heex | 7 +- .../browser-extension}/.gitignore | 0 .../browser-extension}/README.md | 0 .../browser-extension}/build.js | 0 .../browser-extension}/build.watch.js | 0 .../browser-extension}/package.json | 2 +- .../public/assets/azimutt_128.png | Bin .../public/assets/azimutt_16.png | Bin .../public/assets/azimutt_32.png | Bin .../public/assets/azimutt_48.png | Bin .../browser-extension}/public/manifest.json | 0 .../browser-extension}/public/manifest2.json | 0 .../browser-extension}/src/appendButton.ts | 0 .../browser-extension}/src/background.ts | 0 .../browser-extension}/tsconfig.json | 0 .../desktop}/.eslintrc.json | 0 {desktop => extensions/desktop}/.gitignore | 0 {desktop => extensions/desktop}/README.md | 0 .../desktop}/forge.config.ts | 0 .../desktop}/images/icon.icns | Bin .../desktop}/images/icon.ico | Bin .../desktop}/images/icon.png | Bin {desktop => extensions/desktop}/package.json | 2 +- .../desktop}/src/main/bridge.ts | 0 .../desktop}/src/main/index.ts | 0 .../desktop}/src/main/logger.ts | 0 .../desktop}/src/preload.ts | 0 .../desktop}/src/renderer/index.css | 0 .../desktop}/src/renderer/index.html | 0 .../desktop}/src/renderer/index.ts | 0 {desktop => extensions/desktop}/tsconfig.json | 0 .../desktop}/webpack.main.config.ts | 0 .../desktop}/webpack.plugins.ts | 0 .../desktop}/webpack.renderer.config.ts | 0 .../desktop}/webpack.rules.ts | 0 gateway/README.md | 2 +- integration/README.md | 17 --- integration/compose.yaml | 74 --------- integration/mysql.sql | 7 - integration/postgres.sql | 126 --------------- libs/connector-bigquery/README.md | 2 +- libs/connector-couchbase/README.md | 2 +- libs/connector-mariadb/README.md | 2 +- libs/connector-mongodb/README.md | 2 +- libs/connector-mysql/README.md | 2 +- libs/connector-oracle/README.md | 2 +- libs/connector-postgres/README.md | 2 +- libs/connector-snowflake/README.md | 2 +- libs/connector-sqlserver/README.md | 2 +- package.json | 2 +- pnpm-lock.yaml | 144 +++++++++--------- pnpm-workspace.yaml | 3 +- 56 files changed, 105 insertions(+), 326 deletions(-) rename {browser-extension => extensions/browser-extension}/.gitignore (100%) rename {browser-extension => extensions/browser-extension}/README.md (100%) rename {browser-extension => extensions/browser-extension}/build.js (100%) rename {browser-extension => extensions/browser-extension}/build.watch.js (100%) rename {browser-extension => extensions/browser-extension}/package.json (93%) rename {browser-extension => extensions/browser-extension}/public/assets/azimutt_128.png (100%) rename {browser-extension => extensions/browser-extension}/public/assets/azimutt_16.png (100%) rename {browser-extension => extensions/browser-extension}/public/assets/azimutt_32.png (100%) rename {browser-extension => extensions/browser-extension}/public/assets/azimutt_48.png (100%) rename {browser-extension => extensions/browser-extension}/public/manifest.json (100%) rename {browser-extension => extensions/browser-extension}/public/manifest2.json (100%) rename {browser-extension => extensions/browser-extension}/src/appendButton.ts (100%) rename {browser-extension => extensions/browser-extension}/src/background.ts (100%) rename {browser-extension => extensions/browser-extension}/tsconfig.json (100%) rename {desktop => extensions/desktop}/.eslintrc.json (100%) rename {desktop => extensions/desktop}/.gitignore (100%) rename {desktop => extensions/desktop}/README.md (100%) rename {desktop => extensions/desktop}/forge.config.ts (100%) rename {desktop => extensions/desktop}/images/icon.icns (100%) rename {desktop => extensions/desktop}/images/icon.ico (100%) rename {desktop => extensions/desktop}/images/icon.png (100%) rename {desktop => extensions/desktop}/package.json (98%) rename {desktop => extensions/desktop}/src/main/bridge.ts (100%) rename {desktop => extensions/desktop}/src/main/index.ts (100%) rename {desktop => extensions/desktop}/src/main/logger.ts (100%) rename {desktop => extensions/desktop}/src/preload.ts (100%) rename {desktop => extensions/desktop}/src/renderer/index.css (100%) rename {desktop => extensions/desktop}/src/renderer/index.html (100%) rename {desktop => extensions/desktop}/src/renderer/index.ts (100%) rename {desktop => extensions/desktop}/tsconfig.json (100%) rename {desktop => extensions/desktop}/webpack.main.config.ts (100%) rename {desktop => extensions/desktop}/webpack.plugins.ts (100%) rename {desktop => extensions/desktop}/webpack.renderer.config.ts (100%) rename {desktop => extensions/desktop}/webpack.rules.ts (100%) delete mode 100644 integration/README.md delete mode 100644 integration/compose.yaml delete mode 100644 integration/mysql.sql delete mode 100644 integration/postgres.sql diff --git a/.dockerignore b/.dockerignore index 1e032daad..c0b801dbe 100644 --- a/.dockerignore +++ b/.dockerignore @@ -104,9 +104,9 @@ backend/priv/static/elm/**/dist backend/priv/static/elm/**/script.js backend/priv/static/elm/**/script.js.map -# flyctl launch added from browser-extension/.gitignore -browser-extension/**/dist -browser-extension/**/node_modules +# flyctl launch added from extensions/browser-extension/.gitignore +extensions/browser-extension/**/dist +extensions/browser-extension/**/node_modules # flyctl launch added from frontend/.gitignore frontend/.coverage diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 89ee65faf..62e63516e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -189,8 +189,8 @@ repos: pass_filenames: false files: cli/.*\.ts*$ - # No test or build for browser-extension - # No test or build for desktop + # No test or build for extensions/browser-extension + # No test or build for extensions/desktop - repo: https://github.com/commitizen-tools/commitizen rev: v2.32.2 diff --git a/backend/lib/azimutt_web/templates/website/docs/create-your-project.html.heex b/backend/lib/azimutt_web/templates/website/docs/create-your-project.html.heex index fab2ae3ff..5adbe161a 100644 --- a/backend/lib/azimutt_web/templates/website/docs/create-your-project.html.heex +++ b/backend/lib/azimutt_web/templates/website/docs/create-your-project.html.heex @@ -2,7 +2,7 @@ <%= doc_prose do %>

- Azimutt explorer has several ways to import your schema. The suggested one being the database connection + Azimutt explorer has several ways to import your database schema. The suggested one is the database connection as it's more reliable and offer more features (see below) but you have many other options if you prefer. New Azimutt project

@@ -21,7 +21,7 @@ Quite awesome if you ask me 😉

- For more details, you can have a look at the connectors to see exactly what and how its being done, here are the scripts for + For more details, you can have a look at the connectors to see exactly what and how its being done, here are the scripts for PostgreSQL, MySQL and MongoDB. @@ -36,7 +36,7 @@

If you just want to explore your database schema, you can upload it as SQL statements (CREATE TABLE, CREATE INDEX, COMMENTS and others). You can do it safely as nothing will be sent to Azimutt servers, - the parsing is made on the frontend and your schema is shown with no business data being sent to Azimutt server. + the parsing is made on the frontend and your schema is shown with no business data sent to Azimutt. New Azimutt project with SQL file

@@ -45,7 +45,7 @@ <%= render "docs/_h2.html", title: "From Prisma" %>

- Prisma is a Node.jS and TypeScript ORM + Prisma is a Node.js and TypeScript ORM that use its own schema syntax. Same as SQL, you can import the file in Azimutt, local or remote.

@@ -53,7 +53,7 @@ <%= render "docs/_h2.html", title: "From JSON" %>

If you have a database that is not supported yet by Azimutt, - you can create an issue (or vote on the existing one), + you can create an issue (or vote on the existing ones), send a Pull Request (look at other connectors) or extract its schema on your own and import it as JSON in Azimutt. You just have to format it according to the JSON Schema below the import section. diff --git a/backend/lib/azimutt_web/templates/website/docs/getting-started.html.heex b/backend/lib/azimutt_web/templates/website/docs/getting-started.html.heex index 4afaf92c6..569b23016 100644 --- a/backend/lib/azimutt_web/templates/website/docs/getting-started.html.heex +++ b/backend/lib/azimutt_web/templates/website/docs/getting-started.html.heex @@ -1,2 +1,9 @@ <%= render "docs/_header.html", conn: @conn, page: @page %> + +<%= doc_prose do %> +

+ Now let's dig into the main Azimutt topics. +

+<% end %> + <%= render "docs/_footer.html", conn: @conn, page: @page, prev: @prev, next: @next %> diff --git a/backend/lib/azimutt_web/templates/website/docs/what-is-azimutt.html.heex b/backend/lib/azimutt_web/templates/website/docs/what-is-azimutt.html.heex index 1bc1913ee..3340d90a1 100644 --- a/backend/lib/azimutt_web/templates/website/docs/what-is-azimutt.html.heex +++ b/backend/lib/azimutt_web/templates/website/docs/what-is-azimutt.html.heex @@ -2,8 +2,8 @@ <%= doc_prose do %>

- Azimutt goal is to make databases way more accessible for everyone who want or need to understand them. - For that we have built several tools, the biggest one being the explorer, + Azimutt goal is to make databases way more accessible for everyone who need or want to understand them. + For that we have built several tools, the main one being the explorer, but there is also other interesting ones like the CLI and converters.

@@ -17,6 +17,7 @@ The Gateway is the central piece allowing Azimutt to connect to any database. It's a simple Node.js server with all the databases connector allowing Azimutt editor frontend to access databases. It can be launched locally using npx azimutt@latest gateway, hosted in your infrastructure or using the Azimutt one if your database is accessible over internet. + Learn more about it.

<%= render "docs/_h2.html", title: "Azimutt CLI" %> @@ -30,11 +31,13 @@
  • Analyze your database
  • More to come soon...
  • + Learn more about it.

    <%= render "docs/_h2.html", title: "Azimutt converters" %>

    Azimutt is doing a lot of work around database schemas. We took this opportunity to build these standalone converters to be easily accessible:

    Azimutt converter from AML to PostgreSQL +

    Learn more about them.

    <% end %> <%= render "docs/_footer.html", conn: @conn, page: @page, prev: @prev, next: @next %> diff --git a/browser-extension/.gitignore b/extensions/browser-extension/.gitignore similarity index 100% rename from browser-extension/.gitignore rename to extensions/browser-extension/.gitignore diff --git a/browser-extension/README.md b/extensions/browser-extension/README.md similarity index 100% rename from browser-extension/README.md rename to extensions/browser-extension/README.md diff --git a/browser-extension/build.js b/extensions/browser-extension/build.js similarity index 100% rename from browser-extension/build.js rename to extensions/browser-extension/build.js diff --git a/browser-extension/build.watch.js b/extensions/browser-extension/build.watch.js similarity index 100% rename from browser-extension/build.watch.js rename to extensions/browser-extension/build.watch.js diff --git a/browser-extension/package.json b/extensions/browser-extension/package.json similarity index 93% rename from browser-extension/package.json rename to extensions/browser-extension/package.json index 0c82274dc..4f1d755f9 100644 --- a/browser-extension/package.json +++ b/extensions/browser-extension/package.json @@ -13,7 +13,7 @@ "repository": { "type": "git", "url": "git+https://github.com/azimuttapp/azimutt.git", - "directory": "browser-extension" + "directory": "extensions/browser-extension" }, "scripts": { "start": "./build.watch.js", diff --git a/browser-extension/public/assets/azimutt_128.png b/extensions/browser-extension/public/assets/azimutt_128.png similarity index 100% rename from browser-extension/public/assets/azimutt_128.png rename to extensions/browser-extension/public/assets/azimutt_128.png diff --git a/browser-extension/public/assets/azimutt_16.png b/extensions/browser-extension/public/assets/azimutt_16.png similarity index 100% rename from browser-extension/public/assets/azimutt_16.png rename to extensions/browser-extension/public/assets/azimutt_16.png diff --git a/browser-extension/public/assets/azimutt_32.png b/extensions/browser-extension/public/assets/azimutt_32.png similarity index 100% rename from browser-extension/public/assets/azimutt_32.png rename to extensions/browser-extension/public/assets/azimutt_32.png diff --git a/browser-extension/public/assets/azimutt_48.png b/extensions/browser-extension/public/assets/azimutt_48.png similarity index 100% rename from browser-extension/public/assets/azimutt_48.png rename to extensions/browser-extension/public/assets/azimutt_48.png diff --git a/browser-extension/public/manifest.json b/extensions/browser-extension/public/manifest.json similarity index 100% rename from browser-extension/public/manifest.json rename to extensions/browser-extension/public/manifest.json diff --git a/browser-extension/public/manifest2.json b/extensions/browser-extension/public/manifest2.json similarity index 100% rename from browser-extension/public/manifest2.json rename to extensions/browser-extension/public/manifest2.json diff --git a/browser-extension/src/appendButton.ts b/extensions/browser-extension/src/appendButton.ts similarity index 100% rename from browser-extension/src/appendButton.ts rename to extensions/browser-extension/src/appendButton.ts diff --git a/browser-extension/src/background.ts b/extensions/browser-extension/src/background.ts similarity index 100% rename from browser-extension/src/background.ts rename to extensions/browser-extension/src/background.ts diff --git a/browser-extension/tsconfig.json b/extensions/browser-extension/tsconfig.json similarity index 100% rename from browser-extension/tsconfig.json rename to extensions/browser-extension/tsconfig.json diff --git a/desktop/.eslintrc.json b/extensions/desktop/.eslintrc.json similarity index 100% rename from desktop/.eslintrc.json rename to extensions/desktop/.eslintrc.json diff --git a/desktop/.gitignore b/extensions/desktop/.gitignore similarity index 100% rename from desktop/.gitignore rename to extensions/desktop/.gitignore diff --git a/desktop/README.md b/extensions/desktop/README.md similarity index 100% rename from desktop/README.md rename to extensions/desktop/README.md diff --git a/desktop/forge.config.ts b/extensions/desktop/forge.config.ts similarity index 100% rename from desktop/forge.config.ts rename to extensions/desktop/forge.config.ts diff --git a/desktop/images/icon.icns b/extensions/desktop/images/icon.icns similarity index 100% rename from desktop/images/icon.icns rename to extensions/desktop/images/icon.icns diff --git a/desktop/images/icon.ico b/extensions/desktop/images/icon.ico similarity index 100% rename from desktop/images/icon.ico rename to extensions/desktop/images/icon.ico diff --git a/desktop/images/icon.png b/extensions/desktop/images/icon.png similarity index 100% rename from desktop/images/icon.png rename to extensions/desktop/images/icon.png diff --git a/desktop/package.json b/extensions/desktop/package.json similarity index 98% rename from desktop/package.json rename to extensions/desktop/package.json index c0d88922e..08d946d30 100644 --- a/desktop/package.json +++ b/extensions/desktop/package.json @@ -17,7 +17,7 @@ "repository": { "type": "git", "url": "git+https://github.com/azimuttapp/azimutt.git", - "directory": "desktop" + "directory": "extensions/desktop" }, "main": ".webpack/main", "scripts": { diff --git a/desktop/src/main/bridge.ts b/extensions/desktop/src/main/bridge.ts similarity index 100% rename from desktop/src/main/bridge.ts rename to extensions/desktop/src/main/bridge.ts diff --git a/desktop/src/main/index.ts b/extensions/desktop/src/main/index.ts similarity index 100% rename from desktop/src/main/index.ts rename to extensions/desktop/src/main/index.ts diff --git a/desktop/src/main/logger.ts b/extensions/desktop/src/main/logger.ts similarity index 100% rename from desktop/src/main/logger.ts rename to extensions/desktop/src/main/logger.ts diff --git a/desktop/src/preload.ts b/extensions/desktop/src/preload.ts similarity index 100% rename from desktop/src/preload.ts rename to extensions/desktop/src/preload.ts diff --git a/desktop/src/renderer/index.css b/extensions/desktop/src/renderer/index.css similarity index 100% rename from desktop/src/renderer/index.css rename to extensions/desktop/src/renderer/index.css diff --git a/desktop/src/renderer/index.html b/extensions/desktop/src/renderer/index.html similarity index 100% rename from desktop/src/renderer/index.html rename to extensions/desktop/src/renderer/index.html diff --git a/desktop/src/renderer/index.ts b/extensions/desktop/src/renderer/index.ts similarity index 100% rename from desktop/src/renderer/index.ts rename to extensions/desktop/src/renderer/index.ts diff --git a/desktop/tsconfig.json b/extensions/desktop/tsconfig.json similarity index 100% rename from desktop/tsconfig.json rename to extensions/desktop/tsconfig.json diff --git a/desktop/webpack.main.config.ts b/extensions/desktop/webpack.main.config.ts similarity index 100% rename from desktop/webpack.main.config.ts rename to extensions/desktop/webpack.main.config.ts diff --git a/desktop/webpack.plugins.ts b/extensions/desktop/webpack.plugins.ts similarity index 100% rename from desktop/webpack.plugins.ts rename to extensions/desktop/webpack.plugins.ts diff --git a/desktop/webpack.renderer.config.ts b/extensions/desktop/webpack.renderer.config.ts similarity index 100% rename from desktop/webpack.renderer.config.ts rename to extensions/desktop/webpack.renderer.config.ts diff --git a/desktop/webpack.rules.ts b/extensions/desktop/webpack.rules.ts similarity index 100% rename from desktop/webpack.rules.ts rename to extensions/desktop/webpack.rules.ts diff --git a/gateway/README.md b/gateway/README.md index 5fd536808..0ef650dee 100644 --- a/gateway/README.md +++ b/gateway/README.md @@ -2,7 +2,7 @@ Small Node server to proxy database connections and enable browsers to access database features. -The other way is to use the [desktop app](../desktop) for this, keeping everything local and accessing local databases. +The other way is to use the [desktop app](../extensions/desktop) for this, keeping everything local and accessing local databases. ## Set Up diff --git a/integration/README.md b/integration/README.md deleted file mode 100644 index baea5fe07..000000000 --- a/integration/README.md +++ /dev/null @@ -1,17 +0,0 @@ -In this folder we set up several databases with default schema and data to serve as example for database access & data exploration. -We could also set up some integration tests with them... - -Start them with: `docker compose up -d` -Stop them with: `docker compose down` -Start only one: `docker compose up ` -Check which services are running: `docker ps` - -Connection urls: -- Couchbase: -- MariaDB: -- MongoDB: -- MySQL: `mysql://mysql:mysql@localhost:3306/azimutt_sample` -- PostgreSQL: `postgres://postgres:postgres@localhost:5432/azimutt_sample` -- SQL Server: - -Each database has an "interesting" database to experiment Azimutt features. diff --git a/integration/compose.yaml b/integration/compose.yaml deleted file mode 100644 index 809dd0a60..000000000 --- a/integration/compose.yaml +++ /dev/null @@ -1,74 +0,0 @@ -services: - couchbase: - image: couchbase # https://hub.docker.com/_/couchbase - restart: always - environment: - COUCHBASE_BUCKET: azimutt_sample - COUCHBASE_ROOT_PASSWORD: password - ports: - - "8091:8091" - - "8092:8092" - - "8093:8093" - - "8094:8094" - - "11210:11210" - - mariadb: - image: mariadb # https://hub.docker.com/_/mariadb - restart: always - environment: - MARIADB_ROOT_PASSWORD: root - MARIADB_USER: mariadb - MARIADB_PASSWORD: mariadb - MARIADB_DATABASE: azimutt_sample - volumes: - - ./mariadb:/docker-entrypoint-initdb.d - ports: - - "3307:3307" - - mongo: - image: mongo # https://hub.docker.com/_/mongo - restart: always - environment: - MONGO_INITDB_DATABASE: azimutt_sample - MONGO_INITDB_ROOT_USERNAME: root - MONGO_INITDB_ROOT_PASSWORD: password - volumes: - - ./mongo:/docker-entrypoint-initdb.d - ports: - - "27017:27017" - - mysql: - image: mysql # https://hub.docker.com/_/mysql - restart: always - environment: - MYSQL_ROOT_PASSWORD: root - MYSQL_USER: mysql - MYSQL_PASSWORD: mysql - MYSQL_DATABASE: azimutt_sample - volumes: - - ./mysql:/docker-entrypoint-initdb.d - ports: - - "3306:3306" - - postgres: - image: postgres # https://hub.docker.com/_/postgres - restart: always - environment: - POSTGRES_DB: azimutt_sample - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - volumes: - - ./postgres:/docker-entrypoint-initdb.d - ports: - - "5432:5432" - - sqlserver: - image: mcr.microsoft.com/mssql/server # https://hub.docker.com/_/microsoft-mssql-server - restart: always - environment: - ACCEPT_EULA: Y - MSSQL_SA_PASSWORD: Pa$$w0rdddd # userid = 'sa' - ports: - - "1433:1433" - -# https://hub.docker.com/_/oraclelinux diff --git a/integration/mysql.sql b/integration/mysql.sql deleted file mode 100644 index aac560558..000000000 --- a/integration/mysql.sql +++ /dev/null @@ -1,7 +0,0 @@ -DROP TABLE IF EXISTS users; - -CREATE TABLE users -( - id varchar(36), - name varchar(120) -); diff --git a/integration/postgres.sql b/integration/postgres.sql deleted file mode 100644 index 600e78ae4..000000000 --- a/integration/postgres.sql +++ /dev/null @@ -1,126 +0,0 @@ -DROP TABLE IF EXISTS events; -DROP TABLE IF EXISTS order_lines; -DROP TABLE IF EXISTS orders; -DROP TABLE IF EXISTS cart_items; -DROP TABLE IF EXISTS carts; -DROP TABLE IF EXISTS products; -DROP TABLE IF EXISTS categories; -DROP TABLE IF EXISTS users; - -CREATE TABLE users -( - id uuid PRIMARY KEY, - name varchar NOT NULL, - email varchar NOT NULL UNIQUE -); - -CREATE TABLE categories -( - id uuid PRIMARY KEY, - parent uuid REFERENCES categories (id), - slug varchar NOT NULL UNIQUE, - name varchar NOT NULL -); - - -CREATE TABLE products -( - id uuid PRIMARY KEY, - category_id uuid NOT NULL REFERENCES categories (id), - name varchar NOT NULL -); - - -CREATE TABLE carts -( - id uuid PRIMARY KEY, - created_by uuid NOT NULL REFERENCES users (id), - created_at timestamp NOT NULL, - updated_at timestamp NOT NULL -); -COMMENT ON TABLE carts IS 'temporary saves what users want to buy'; - -CREATE TABLE cart_items -( - cart_id uuid REFERENCES carts (id), - product_id uuid REFERENCES products (id), - price decimal NOT NULL, - quantity int NOT NULL CHECK (quantity > 0), - created_at timestamp NOT NULL, - updated_at timestamp NOT NULL, - PRIMARY KEY (cart_id, product_id) -); -COMMENT ON COLUMN cart_items.price IS 'unitary price'; -COMMENT ON COLUMN cart_items.quantity IS 'should be checked with stock at buy time'; - - -CREATE TABLE orders -( - id uuid PRIMARY KEY, - created_by uuid NOT NULL REFERENCES users (id), - created_at timestamp NOT NULL -); - -CREATE TABLE order_lines -( - order_id uuid NOT NULL REFERENCES orders (id), - product_id uuid NOT NULL REFERENCES products (id), - price decimal NOT NULL, - quantity int NOT NULL CHECK (quantity > 0) -); -COMMENT ON COLUMN order_lines.price IS 'unitary price'; -COMMENT ON COLUMN order_lines.quantity IS 'should be checked with stock at buy time'; - -CREATE TABLE events -( - id uuid PRIMARY KEY, - name varchar NOT NULL, - item_type varchar NOT NULL, - item_id uuid NOT NULL, - details json NOT NULL, - created_by uuid NOT NULL, - created_at timestamp NOT NULL -); - - -INSERT INTO users (id, name, email) -VALUES ('e7a47f0f-a2b1-44fa-aa86-c9f4dba6fa73', 'Loïc', 'loic@azimutt.app'), - ('54e48db0-8740-46be-b1dc-301832fe6a5d', 'Samir', 'samir@azimutt.app'), - ('add7502f-47fe-4870-9b9f-0c0c73e65b8b', 'Azimutt admin', 'admin@azimutt.app'), - ('fa551c9e-d9b7-42a3-96d5-af6723f1c467', 'Azimutt contact', 'contact@azimutt.app'), - ('0b48b4b3-ae00-4623-bec6-e66ae791414c', 'Claude', 'claude@example.com'), - ('5301f6c8-4259-4122-bb4b-e2378065f88c', 'Lise', 'lise@example.com'); - -INSERT INTO categories (id, parent, slug, name) -VALUES ('50c33d85-559a-44ea-b745-fad5aad7d062', null, 'electronics', 'Electronics'), - ('e62c89f7-6278-49ba-9c3c-2a2f60bbf3b4', '50c33d85-559a-44ea-b745-fad5aad7d062', 'accessories-supplies', 'Accessories & Supplies'), - ('0084e8e3-a12c-4ea5-b004-ec3e8b4573db', 'e62c89f7-6278-49ba-9c3c-2a2f60bbf3b4', 'camera-photo-accessories', 'Camera & Photo Accessories'), - ('8098c34d-2931-4510-9d2f-779d0fe69266', 'e62c89f7-6278-49ba-9c3c-2a2f60bbf3b4', 'cell-phone-accessories', 'Cell Phone Accessories'), - ('fc5d586d-6f6d-4afc-936f-1564ea6788f9', 'e62c89f7-6278-49ba-9c3c-2a2f60bbf3b4', 'telephone-accessories', 'Telephone Accessories'), - ('91f2ca95-1137-4c81-89fb-f62379c552ec', 'e62c89f7-6278-49ba-9c3c-2a2f60bbf3b4', 'cables', 'Cables'), - ('e4bb31df-18f7-4272-8f10-ca519c15cc51', 'e62c89f7-6278-49ba-9c3c-2a2f60bbf3b4', 'microphones', 'Microphones'), - ('cae0b67b-08f4-48b9-bd97-093673550fe7', null, 'computers', 'Computers'), - ('3283049d-9740-4e39-b2e9-d8f0ecaf63f3', 'cae0b67b-08f4-48b9-bd97-093673550fe7', 'data-storage', 'Data Storage'), - ('f47b15e8-2ae5-41f4-9338-c472caa5584b', '3283049d-9740-4e39-b2e9-d8f0ecaf63f3', 'external-hard-drives', 'External Hard Drives'), - ('db3b50fa-1076-48a6-b7c6-b17e464f1751', '3283049d-9740-4e39-b2e9-d8f0ecaf63f3', 'usb-flash-drives', 'USB Flash Drives'), - ('c5a7b1f3-2933-45ef-8345-4755417959aa', null, 'arts-crafts', 'Arts & Crafts'), - ('03a9dc3f-b15a-4e94-baa1-43c76863f38f', 'c5a7b1f3-2933-45ef-8345-4755417959aa', 'floral-arranging', 'Floral Arranging'), - ('dfd8acea-baa9-471b-8a41-412fdc2865a4', 'c5a7b1f3-2933-45ef-8345-4755417959aa', 'woodcrafts', 'Woodcrafts'), - ('1899869f-ae62-4978-965b-61eb22da9895', null, 'software', 'Software'), - ('b58366b6-b571-4cbc-86dc-4e8be14a082f', '1899869f-ae62-4978-965b-61eb22da9895', 'utilities', 'Utilities'), - ('47804682-deeb-45a1-82ef-fa49792246bd', 'b58366b6-b571-4cbc-86dc-4e8be14a082f', 'internet-utilities', 'Internet Utilities'), - ('73835bef-b948-42de-aaf8-ab10ca469b45', '1899869f-ae62-4978-965b-61eb22da9895', 'photography-graphic-design', 'Photography & Graphic Design'), - ('c68aab30-6052-47da-bece-3e4fac896099', null, 'video-games', 'Video Games'); - -INSERT INTO products (id, category_id, name) -VALUES ('407ae0e1-eee2-4513-a753-7bb557694af9', '73835bef-b948-42de-aaf8-ab10ca469b45', 'Adobe Photoshop Elements 2023'), - ('55334065-0cf8-4016-afc4-ce120ec8afc1', '73835bef-b948-42de-aaf8-ab10ca469b45', 'Clip Studio Paint Pro'), - ('34e0a39a-1bc1-4ec5-99bd-d340ed8d4550', '73835bef-b948-42de-aaf8-ab10ca469b45', 'Corel PaintShop Pro 2023 Ultimate'), - ('dbfad459-bf8e-4d97-917c-6e4e74277509', '73835bef-b948-42de-aaf8-ab10ca469b45', 'Nero Standard 2018'), - ('81ec90c8-48e0-4fd9-888b-5824300a98e7', '73835bef-b948-42de-aaf8-ab10ca469b45', 'Adobe Premiere Elements 2023'); - -INSERT INTO events (id, name, item_type, item_id, details, created_by, created_at) -VALUES ('730a110f-9dc1-41c3-a48a-c8442e36fd16', 'user_created', 'User', 'add7502f-47fe-4870-9b9f-0c0c73e65b8b', '{"name": "Admin"}', 'add7502f-47fe-4870-9b9f-0c0c73e65b8b', '2023-09-01 12:12:12-07'), - ('1d5619fe-a2a8-4c07-9243-b6f0c27ab64f', 'user_created', 'User', 'e7a47f0f-a2b1-44fa-aa86-c9f4dba6fa73', '{"name": "Loïc"}', 'e7a47f0f-a2b1-44fa-aa86-c9f4dba6fa73', '2023-09-01 18:05:25-07'), - ('8e555622-44d6-41f0-90f8-38e22c43ea66', 'category_created', 'Category', '1899869f-ae62-4978-965b-61eb22da9895', '{}', 'e7a47f0f-a2b1-44fa-aa86-c9f4dba6fa73', '2023-09-01 19:21:42-07'), - ('d0f4e0de-4b6b-42ac-941b-7c3bc563a828', 'product_created', 'Product', '407ae0e1-eee2-4513-a753-7bb557694af9', '{"source": "web"}', 'e7a47f0f-a2b1-44fa-aa86-c9f4dba6fa73', '2023-09-01 19:32:58-07'); diff --git a/libs/connector-bigquery/README.md b/libs/connector-bigquery/README.md index 2d609b664..202b9d4f7 100644 --- a/libs/connector-bigquery/README.md +++ b/libs/connector-bigquery/README.md @@ -5,7 +5,7 @@ This library allows to connect to [BigQuery](https://cloud.google.com/bigquery), It lists all schemas, tables, columns, relations and types and format them in a JSON Schema. This library is made by [Azimutt](https://azimutt.app) to allow people to explore their BigQuery database. -It's accessible through the [Desktop app](../../desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. +It's accessible through the [Desktop app](../../extensions/desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. **Feel free to use it and even submit PR to improve it:** diff --git a/libs/connector-couchbase/README.md b/libs/connector-couchbase/README.md index c538289f2..ea6f9e25a 100644 --- a/libs/connector-couchbase/README.md +++ b/libs/connector-couchbase/README.md @@ -5,7 +5,7 @@ This library allows to connect to [Couchbase](https://www.couchbase.com), extrac It browses all buckets, scopes and collections, fetch a sample of documents and then infer a schema from them. This library is made by [Azimutt](https://azimutt.app) to allow people to explore their Couchbase database. -It's accessible through the [Desktop app](../../desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. +It's accessible through the [Desktop app](../../extensions/desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. **Feel free to use it and even submit PR to improve it:** diff --git a/libs/connector-mariadb/README.md b/libs/connector-mariadb/README.md index 81f2a1fcd..62303b2b5 100644 --- a/libs/connector-mariadb/README.md +++ b/libs/connector-mariadb/README.md @@ -5,7 +5,7 @@ This library allows to connect to [MariaDB](https://mariadb.com), extract its sc It lists all schemas, tables, columns, relations and types and format them in a JSON Schema. This library is made by [Azimutt](https://azimutt.app) to allow people to explore their MariaDB database. -It's accessible through the [Desktop app](../../desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. +It's accessible through the [Desktop app](../../extensions/desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. **Feel free to use it and even submit PR to improve it:** diff --git a/libs/connector-mongodb/README.md b/libs/connector-mongodb/README.md index 9a99ab1cb..333d4c19c 100644 --- a/libs/connector-mongodb/README.md +++ b/libs/connector-mongodb/README.md @@ -5,7 +5,7 @@ This library allows to connect to [MongoDB](https://www.mongodb.com), extract it It browses all databases and collections, fetch a sample of documents and then infer a schema from them. This library is made by [Azimutt](https://azimutt.app) to allow people to explore their MongoDB database. -It's accessible through the [Desktop app](../../desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. +It's accessible through the [Desktop app](../../extensions/desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. **Feel free to use it and even submit PR to improve it:** diff --git a/libs/connector-mysql/README.md b/libs/connector-mysql/README.md index 123711dd4..8d50c90a4 100644 --- a/libs/connector-mysql/README.md +++ b/libs/connector-mysql/README.md @@ -5,7 +5,7 @@ This library allows to connect to [MySQL](https://www.mysql.com), extract its sc It lists all schemas, tables, columns, relations and types and format them in a JSON Schema. This library is made by [Azimutt](https://azimutt.app) to allow people to explore their MySQL database. -It's accessible through the [Desktop app](../../desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. +It's accessible through the [Desktop app](../../extensions/desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. **Feel free to use it and even submit PR to improve it:** diff --git a/libs/connector-oracle/README.md b/libs/connector-oracle/README.md index 826abe50f..ee4fe977f 100644 --- a/libs/connector-oracle/README.md +++ b/libs/connector-oracle/README.md @@ -5,7 +5,7 @@ This library allows to connect to [Oracle](https://www.oracle.com/database), ext It lists all schemas, tables, columns, relations and types and format them in a JSON Schema. This library is made by [Azimutt](https://azimutt.app) to allow people to explore their Oracle database. -It's accessible through the [Desktop app](../../desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. +It's accessible through the [Desktop app](../../extensions/desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. **Feel free to use it and even submit PR to improve it:** diff --git a/libs/connector-postgres/README.md b/libs/connector-postgres/README.md index 6284e6a68..5b19b6293 100644 --- a/libs/connector-postgres/README.md +++ b/libs/connector-postgres/README.md @@ -5,7 +5,7 @@ This library allows to connect to [PostgreSQL](https://www.postgresql.org), extr It lists all schemas, tables, columns, relations and types and format them in a JSON Schema. This library is made by [Azimutt](https://azimutt.app) to allow people to explore their PostgreSQL database. -It's accessible through the [Desktop app](../../desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. +It's accessible through the [Desktop app](../../extensions/desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. **Feel free to use it and even submit PR to improve it:** diff --git a/libs/connector-snowflake/README.md b/libs/connector-snowflake/README.md index 799c81424..9271574ea 100644 --- a/libs/connector-snowflake/README.md +++ b/libs/connector-snowflake/README.md @@ -5,7 +5,7 @@ This library allows to connect to [Snowflake](https://www.snowflake.com), extrac It lists all schemas, tables, columns and relations and format them in a JSON Schema. This library is made by [Azimutt](https://azimutt.app) to allow people to explore their Snowflake database. -It's accessible through the [Desktop app](../../desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. +It's accessible through the [Desktop app](../../extensions/desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. **Feel free to use it and even submit PR to improve it:** diff --git a/libs/connector-sqlserver/README.md b/libs/connector-sqlserver/README.md index 6c8f188b0..acce546fa 100644 --- a/libs/connector-sqlserver/README.md +++ b/libs/connector-sqlserver/README.md @@ -5,7 +5,7 @@ This library allows to connect to [SQL Server](https://www.microsoft.com/fr-fr/s It lists all schemas, tables, columns, relations and types and format them in a JSON Schema. This library is made by [Azimutt](https://azimutt.app) to allow people to explore their SQL Server database. -It's accessible through the [Desktop app](../../desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. +It's accessible through the [Desktop app](../../extensions/desktop) (soon), the [CLI](https://www.npmjs.com/package/azimutt) or even the website using the [gateway](../../gateway) server. **Feel free to use it and even submit PR to improve it:** diff --git a/package.json b/package.json index 8c9a2af59..5a39d5181 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "test": "pnpm -r run test", "format": "pnpm -r run format", "lint": "pnpm -r run lint", - "build": "pnpm --filter=!\"./desktop\" -r run build", + "build": "pnpm --filter=!\"./extensions/desktop\" -r run build", "update": "pnpm -r update && pnpm install && pnpm -r --if-present run update", "build:docker": "pnpm install && pnpm --filter \"azimutt-backend\" run setup && pnpm --filter \"@azimutt/*\" run build:docker && pnpm --filter \"azimutt-editor\" run build:docker" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9225dad54..6196ba05c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,25 +14,6 @@ importers: specifier: workspace:^ version: link:../frontend - browser-extension: - dependencies: - webextension-polyfill: - specifier: ^0.8.0 - version: 0.8.0 - devDependencies: - '@types/webextension-polyfill': - specifier: ^0.8.3 - version: 0.8.3 - esbuild: - specifier: ^0.14.54 - version: 0.14.54 - esbuild-plugin-copy: - specifier: ^1.6.0 - version: 1.6.0(esbuild@0.14.54) - typescript: - specifier: ^5.6.3 - version: 5.6.3 - cli: dependencies: '@azimutt/gateway': @@ -212,17 +193,36 @@ importers: specifier: ^2.0.3 version: 2.0.3(rollup@4.25.0)(vite@5.4.10(@types/node@22.9.0)(terser@5.36.0)) - desktop: + extensions/browser-extension: + dependencies: + webextension-polyfill: + specifier: ^0.8.0 + version: 0.8.0 + devDependencies: + '@types/webextension-polyfill': + specifier: ^0.8.3 + version: 0.8.3 + esbuild: + specifier: ^0.14.54 + version: 0.14.54 + esbuild-plugin-copy: + specifier: ^1.6.0 + version: 1.6.0(esbuild@0.14.54) + typescript: + specifier: ^5.6.3 + version: 5.6.3 + + extensions/desktop: dependencies: '@azimutt/connector-postgres': specifier: workspace:^ - version: link:../libs/connector-postgres + version: link:../../libs/connector-postgres '@azimutt/models': specifier: workspace:^ - version: link:../libs/models + version: link:../../libs/models '@azimutt/utils': specifier: workspace:^ - version: link:../libs/utils + version: link:../../libs/utils electron-squirrel-startup: specifier: 1.0.0 version: 1.0.0 @@ -565,7 +565,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -596,7 +596,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -627,7 +627,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -658,7 +658,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -689,7 +689,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -720,7 +720,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -754,7 +754,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -791,7 +791,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -825,7 +825,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -859,7 +859,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -896,7 +896,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -951,7 +951,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1000,7 +1000,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1055,7 +1055,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1076,7 +1076,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -10107,7 +10107,7 @@ snapshots: '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.3.7(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -10265,7 +10265,7 @@ snapshots: '@babel/parser': 7.26.2 '@babel/template': 7.25.9 '@babel/types': 7.26.0 - debug: 4.3.7 + debug: 4.3.7(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -12684,7 +12684,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.17.6 + '@types/node': 22.9.0 optional: true '@typescript-eslint/eslint-plugin@8.13.0(@typescript-eslint/parser@8.13.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)': @@ -12989,7 +12989,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7 + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14026,10 +14026,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.3.7: - dependencies: - ms: 2.1.3 - debug@4.3.7(supports-color@5.5.0): dependencies: ms: 2.1.3 @@ -15314,14 +15310,12 @@ snapshots: folder-hash@3.3.3: dependencies: - debug: 4.3.7 + debug: 4.3.7(supports-color@5.5.0) graceful-fs: 4.2.11 minimatch: 3.0.8 transitivePeerDependencies: - supports-color - follow-redirects@1.15.9: {} - follow-redirects@1.15.9(debug@3.2.7): optionalDependencies: debug: 3.2.7 @@ -15830,7 +15824,7 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.7 + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -15856,7 +15850,7 @@ snapshots: http-proxy@1.17.0: dependencies: eventemitter3: 3.1.2 - follow-redirects: 1.15.9 + follow-redirects: 1.15.9(debug@3.2.7) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -15864,7 +15858,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.9 + follow-redirects: 1.15.9(debug@3.2.7) requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -15891,7 +15885,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7 + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -16168,7 +16162,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7 + debug: 4.3.7(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -16319,7 +16313,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.9.0 - ts-node: 10.9.2(@types/node@22.9.0)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.9.1)(@types/node@22.9.0)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -17664,7 +17658,7 @@ snapshots: yaml: 2.6.0 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@types/node@22.9.0)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.9.1)(@types/node@22.9.0)(typescript@5.6.3) postcss-modules-extract-imports@3.1.0(postcss@8.4.47): dependencies: @@ -18932,6 +18926,25 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.0) + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.6.3 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.26.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + ts-loader@9.5.1(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.9.1)): dependencies: chalk: 4.1.2 @@ -18982,25 +18995,6 @@ snapshots: optionalDependencies: '@swc/core': 1.9.1 - ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 22.9.0 - acorn: 8.14.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.6.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optional: true - tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 46df38d54..81644da32 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,9 +1,8 @@ packages: - "backend" - - "browser-extension" - "cli" - "cli/html-report" - - "desktop" + - "extensions/*" - "frontend" - "gateway" - "libs/*" From 42052cd6172066b7ab7045f5bb92fc0cc1689cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Fri, 22 Nov 2024 14:02:02 +0100 Subject: [PATCH 02/20] Generate boilerplate --- extensions/vscode-aml/.gitignore | 3 + extensions/vscode-aml/.npmrc | 1 + extensions/vscode-aml/.vscodeignore | 16 + extensions/vscode-aml/CHANGELOG.md | 9 + extensions/vscode-aml/README.md | 65 + extensions/vscode-aml/esbuild.js | 100 ++ extensions/vscode-aml/eslint.config.mjs | 28 + extensions/vscode-aml/package.json | 56 + extensions/vscode-aml/src/web/extension.ts | 27 + .../src/web/test/suite/extension.test.ts | 15 + .../src/web/test/suite/mochaTestRunner.ts | 26 + extensions/vscode-aml/tsconfig.json | 17 + .../vscode-aml/vsc-extension-quickstart.md | 44 + pnpm-lock.yaml | 1142 ++++++++++++++++- pnpm-workspace.yaml | 4 +- 15 files changed, 1496 insertions(+), 57 deletions(-) create mode 100644 extensions/vscode-aml/.gitignore create mode 100644 extensions/vscode-aml/.npmrc create mode 100644 extensions/vscode-aml/.vscodeignore create mode 100644 extensions/vscode-aml/CHANGELOG.md create mode 100644 extensions/vscode-aml/README.md create mode 100644 extensions/vscode-aml/esbuild.js create mode 100644 extensions/vscode-aml/eslint.config.mjs create mode 100644 extensions/vscode-aml/package.json create mode 100644 extensions/vscode-aml/src/web/extension.ts create mode 100644 extensions/vscode-aml/src/web/test/suite/extension.test.ts create mode 100644 extensions/vscode-aml/src/web/test/suite/mochaTestRunner.ts create mode 100644 extensions/vscode-aml/tsconfig.json create mode 100644 extensions/vscode-aml/vsc-extension-quickstart.md diff --git a/extensions/vscode-aml/.gitignore b/extensions/vscode-aml/.gitignore new file mode 100644 index 000000000..c4f24f4b8 --- /dev/null +++ b/extensions/vscode-aml/.gitignore @@ -0,0 +1,3 @@ +.vscode +dist +node_modules diff --git a/extensions/vscode-aml/.npmrc b/extensions/vscode-aml/.npmrc new file mode 100644 index 000000000..8e012302a --- /dev/null +++ b/extensions/vscode-aml/.npmrc @@ -0,0 +1 @@ +enable-pre-post-scripts = true diff --git a/extensions/vscode-aml/.vscodeignore b/extensions/vscode-aml/.vscodeignore new file mode 100644 index 000000000..9d63524ad --- /dev/null +++ b/extensions/vscode-aml/.vscodeignore @@ -0,0 +1,16 @@ +.vscode/** +.vscode-test-web/** +src/** +out/** +node_modules/** +dist/test/** +.gitignore +vsc-extension-quickstart.md +webpack.config.js +esbuild.js +.yarnrc +**/tsconfig.json +**/eslint.config.mjs +**/*.map +**/*.ts +**/.vscode-test.* diff --git a/extensions/vscode-aml/CHANGELOG.md b/extensions/vscode-aml/CHANGELOG.md new file mode 100644 index 000000000..56cadccec --- /dev/null +++ b/extensions/vscode-aml/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to the "vscode-aml" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +- Initial release diff --git a/extensions/vscode-aml/README.md b/extensions/vscode-aml/README.md new file mode 100644 index 000000000..662cbb50f --- /dev/null +++ b/extensions/vscode-aml/README.md @@ -0,0 +1,65 @@ +# vscode-aml README + +This is the README for your extension "vscode-aml". After writing up a brief description, we recommend including the following sections. + +## Features + +Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file. + +For example if there is an image subfolder under your extension project workspace: + +\!\[feature X\]\(images/feature-x.png\) + +> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow. + +## Requirements + +If you have any requirements or dependencies, add a section describing those and how to install and configure them. + +## Extension Settings + +Include if your extension adds any VS Code settings through the `contributes.configuration` extension point. + +For example: + +This extension contributes the following settings: + +* `myExtension.enable`: Enable/disable this extension. +* `myExtension.thing`: Set to `blah` to do something. + +## Known Issues + +Calling out known issues can help limit users opening duplicate issues against your extension. + +## Release Notes + +Users appreciate release notes as you update your extension. + +### 1.0.0 + +Initial release of ... + +### 1.0.1 + +Fixed issue #. + +### 1.1.0 + +Added features X, Y, and Z. + +--- + +## Working with Markdown + +You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts: + +* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux). +* Toggle preview (`Shift+Cmd+V` on macOS or `Shift+Ctrl+V` on Windows and Linux). +* Press `Ctrl+Space` (Windows, Linux, macOS) to see a list of Markdown snippets. + +## For more information + +* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown) +* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/) + +**Enjoy!** diff --git a/extensions/vscode-aml/esbuild.js b/extensions/vscode-aml/esbuild.js new file mode 100644 index 000000000..9fb9920c8 --- /dev/null +++ b/extensions/vscode-aml/esbuild.js @@ -0,0 +1,100 @@ +const esbuild = require('esbuild'); +const glob = require('glob'); +const path = require('path'); +const polyfill = require('@esbuild-plugins/node-globals-polyfill'); + +const production = process.argv.includes('--production'); +const watch = process.argv.includes('--watch'); + +/** + * This plugin hooks into the build process to print errors in a format that the problem matcher in + * Visual Studio Code can understand. + * @type {import('esbuild').Plugin} + */ +const esbuildProblemMatcherPlugin = { + name: 'esbuild-problem-matcher', + + setup(build) { + build.onStart(() => { + console.log('[watch] build started'); + }); + build.onEnd((result) => { + result.errors.forEach(({ text, location }) => { + console.error(`✘ [ERROR] ${text}`); + console.error(` ${location.file}:${location.line}:${location.column}:`); + }); + console.log('[watch] build finished'); + }); + }, +}; + + +/** + * For web extension, all tests, including the test runner, need to be bundled into + * a single module that has a exported `run` function . + * This plugin bundles implements a virtual file extensionTests.ts that bundles all these together. + * @type {import('esbuild').Plugin} + */ +const testBundlePlugin = { + name: 'testBundlePlugin', + setup(build) { + build.onResolve({ filter: /[\/\\]extensionTests\.ts$/ }, args => { + if (args.kind === 'entry-point') { + return { path: path.resolve(args.path) }; + } + }); + build.onLoad({ filter: /[\/\\]extensionTests\.ts$/ }, async args => { + const testsRoot = path.join(__dirname, 'src/web/test/suite'); + const files = await glob.glob('*.test.{ts,tsx}', { cwd: testsRoot, posix: true }); + return { + contents: + `export { run } from './mochaTestRunner.ts';` + + files.map(f => `import('./${f}');`).join(''), + watchDirs: files.map(f => path.dirname(path.resolve(testsRoot, f))), + watchFiles: files.map(f => path.resolve(testsRoot, f)) + }; + }); + } +}; + +async function main() { + const ctx = await esbuild.context({ + entryPoints: [ + 'src/web/extension.ts', + 'src/web/test/suite/extensionTests.ts' + ], + bundle: true, + format: 'cjs', + minify: production, + sourcemap: !production, + sourcesContent: false, + platform: 'browser', + outdir: 'dist/web', + external: ['vscode'], + logLevel: 'silent', + // Node.js global to browser globalThis + define: { + global: 'globalThis', + }, + + plugins: [ + polyfill.NodeGlobalsPolyfillPlugin({ + process: true, + buffer: true, + }), + testBundlePlugin, + esbuildProblemMatcherPlugin, /* add to the end of plugins array */ + ], + }); + if (watch) { + await ctx.watch(); + } else { + await ctx.rebuild(); + await ctx.dispose(); + } +} + +main().catch(e => { + console.error(e); + process.exit(1); +}); diff --git a/extensions/vscode-aml/eslint.config.mjs b/extensions/vscode-aml/eslint.config.mjs new file mode 100644 index 000000000..40e4769c6 --- /dev/null +++ b/extensions/vscode-aml/eslint.config.mjs @@ -0,0 +1,28 @@ +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; + +export default [{ + files: ["**/*.ts"], +}, { + plugins: { + "@typescript-eslint": typescriptEslint, + }, + + languageOptions: { + parser: tsParser, + ecmaVersion: 2022, + sourceType: "module", + }, + + rules: { + "@typescript-eslint/naming-convention": ["warn", { + selector: "import", + format: ["camelCase", "PascalCase"], + }], + + curly: "warn", + eqeqeq: "warn", + "no-throw-literal": "warn", + semi: "warn", + }, +}]; diff --git a/extensions/vscode-aml/package.json b/extensions/vscode-aml/package.json new file mode 100644 index 000000000..fdd9cb71b --- /dev/null +++ b/extensions/vscode-aml/package.json @@ -0,0 +1,56 @@ +{ + "name": "@azimutt/vscode-aml", + "displayName": "AML - Fast database design", + "description": "Language support for Azimutt Markup Language (AML)", + "icon": "assets/icon.png", + "version": "0.0.1", + "publisher": "loicknuchel", + "engines": { + "vscode": "^1.95.0" + }, + "categories": ["Programming Languages", "Snippets", "Other"], + "repository": { + "type": "git", + "url": "git+https://github.com/azimuttapp/azimutt.git", + "directory": "extensions/vscode-aml" + }, + "activationEvents": [], + "browser": "./dist/web/extension.js", + "contributes": { + "commands": [ + { + "command": "aml-web.helloWorld", + "title": "Hello World" + } + ] + }, + "scripts": { + "test": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. --extensionTestsPath=dist/web/test/suite/extensionTests.js", + "pretest": "pnpm run compile-web", + "vscode:prepublish": "pnpm run package-web", + "compile-web": "pnpm run check-types && pnpm run lint && node esbuild.js", + "watch-web": "npm-run-all -p watch-web:*", + "watch-web:esbuild": "node esbuild.js --watch", + "watch-web:tsc": "tsc --noEmit --watch --project tsconfig.json", + "package-web": "pnpm run check-types && pnpm run lint && node esbuild.js --production", + "check-types": "tsc --noEmit", + "lint": "eslint src", + "run-in-browser": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. ." + }, + "devDependencies": { + "@types/vscode": "^1.95.0", + "@types/mocha": "^10.0.9", + "@types/assert": "^1.5.10", + "eslint": "^9.13.0", + "@typescript-eslint/eslint-plugin": "^8.10.0", + "@typescript-eslint/parser": "^8.7.0", + "mocha": "^10.7.3", + "typescript": "^5.6.3", + "@vscode/test-web": "^0.0.63", + "esbuild": "^0.24.0", + "glob": "^11.0.0", + "npm-run-all": "^4.1.5", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "assert": "^2.1.0" + } +} diff --git a/extensions/vscode-aml/src/web/extension.ts b/extensions/vscode-aml/src/web/extension.ts new file mode 100644 index 000000000..3d69aae16 --- /dev/null +++ b/extensions/vscode-aml/src/web/extension.ts @@ -0,0 +1,27 @@ +// The module 'vscode' contains the VS Code extensibility API +// Import the module and reference it with the alias vscode in your code below +import * as vscode from 'vscode'; + +// This method is called when your extension is activated +// Your extension is activated the very first time the command is executed +export function activate(context: vscode.ExtensionContext) { + + // Use the console to output diagnostic information (console.log) and errors (console.error) + // This line of code will only be executed once when your extension is activated + console.log('Congratulations, your extension "aml-web" is now active in the web extension host!'); + + // The command has been defined in the package.json file + // Now provide the implementation of the command with registerCommand + // The commandId parameter must match the command field in package.json + const disposable = vscode.commands.registerCommand('aml-web.helloWorld', () => { + // The code you place here will be executed every time your command is executed + + // Display a message box to the user + vscode.window.showInformationMessage('Hello World from AML-web in a web extension host!'); + }); + + context.subscriptions.push(disposable); +} + +// This method is called when your extension is deactivated +export function deactivate() {} diff --git a/extensions/vscode-aml/src/web/test/suite/extension.test.ts b/extensions/vscode-aml/src/web/test/suite/extension.test.ts new file mode 100644 index 000000000..7e022bc4c --- /dev/null +++ b/extensions/vscode-aml/src/web/test/suite/extension.test.ts @@ -0,0 +1,15 @@ +import * as assert from 'assert'; + +// You can import and use all API from the 'vscode' module +// as well as import your extension to test it +import * as vscode from 'vscode'; +// import * as myExtension from '../../extension'; + +suite('Web Extension Test Suite', () => { + vscode.window.showInformationMessage('Start all tests.'); + + test('Sample test', () => { + assert.strictEqual(-1, [1, 2, 3].indexOf(5)); + assert.strictEqual(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/extensions/vscode-aml/src/web/test/suite/mochaTestRunner.ts b/extensions/vscode-aml/src/web/test/suite/mochaTestRunner.ts new file mode 100644 index 000000000..d449bc2f3 --- /dev/null +++ b/extensions/vscode-aml/src/web/test/suite/mochaTestRunner.ts @@ -0,0 +1,26 @@ +// Imports mocha for the browser, defining the `mocha` global. +import 'mocha/mocha'; + +mocha.setup({ + ui: 'tdd', + reporter: undefined +}); + +export function run(): Promise { + + return new Promise((c, e) => { + try { + // Run the mocha test + mocha.run(failures => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + console.error(err); + e(err); + } + }); +} diff --git a/extensions/vscode-aml/tsconfig.json b/extensions/vscode-aml/tsconfig.json new file mode 100644 index 000000000..1d76149b4 --- /dev/null +++ b/extensions/vscode-aml/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "Node16", + "target": "ES2020", + "outDir": "dist", + "lib": [ + "ES2020", "WebWorker" + ], + "sourceMap": true, + "rootDir": "src", + "strict": true /* enable all strict type-checking options */ + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + } +} diff --git a/extensions/vscode-aml/vsc-extension-quickstart.md b/extensions/vscode-aml/vsc-extension-quickstart.md new file mode 100644 index 000000000..5176d16cd --- /dev/null +++ b/extensions/vscode-aml/vsc-extension-quickstart.md @@ -0,0 +1,44 @@ +# Welcome to your VS Code Extension + +## What's in the folder + +* This folder contains all of the files necessary for your web extension. +* `package.json` * this is the manifest file in which you declare your extension and command. +* `src/web/extension.ts` * this is the main file for the browser +* `webpack.config.js` * the webpack config file for the web main + +## Setup + +* install the recommended extensions (amodio.tsl-problem-matcher, ms-vscode.extension-test-runner, and dbaeumer.vscode-eslint) + +## Get up and running the Web Extension + +* Run `pnpm install`. +* Place breakpoints in `src/web/extension.ts`. +* Debug via F5 (Run Web Extension). +* Execute extension code via `F1 > Hello world`. + +## Make changes + +* You can relaunch the extension from the debug toolbar after changing code in `src/web/extension.ts`. +* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. + +## Explore the API + +* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. + +## Run tests + +* Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. +* Press `F5` to run the tests in a new window with your extension loaded. +* See the output of the test result in the debug console. +* Make changes to `src/web/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder. + * The provided test runner will only consider files matching the name pattern `**.test.ts`. + * You can create folders inside the `test` folder to structure your tests any way you want. + +## Go further + +* [Follow UX guidelines](https://code.visualstudio.com/api/ux-guidelines/overview) to create extensions that seamlessly integrate with VS Code's native interface and patterns. +* Check out the [Web Extension Guide](https://code.visualstudio.com/api/extension-guides/web-extensions). +* [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. +* Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6196ba05c..bfbfd18a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -300,6 +300,51 @@ importers: specifier: ^5.96.1 version: 5.96.1(@swc/core@1.9.1) + extensions/vscode-aml: + devDependencies: + '@esbuild-plugins/node-globals-polyfill': + specifier: ^0.2.3 + version: 0.2.3(esbuild@0.24.0) + '@types/assert': + specifier: ^1.5.10 + version: 1.5.11 + '@types/mocha': + specifier: ^10.0.9 + version: 10.0.10 + '@types/vscode': + specifier: ^1.95.0 + version: 1.95.0 + '@typescript-eslint/eslint-plugin': + specifier: ^8.10.0 + version: 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/parser': + specifier: ^8.7.0 + version: 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + '@vscode/test-web': + specifier: ^0.0.63 + version: 0.0.63 + assert: + specifier: ^2.1.0 + version: 2.1.0 + esbuild: + specifier: ^0.24.0 + version: 0.24.0 + eslint: + specifier: ^9.13.0 + version: 9.14.0(jiti@1.21.6) + glob: + specifier: ^11.0.0 + version: 11.0.0 + mocha: + specifier: ^10.7.3 + version: 10.8.2 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + typescript: + specifier: ^5.6.3 + version: 5.6.3 + frontend: dependencies: '@azimutt/aml': @@ -1773,6 +1818,11 @@ packages: cpu: [x64] os: [win32] + '@esbuild-plugins/node-globals-polyfill@0.2.3': + resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} + peerDependencies: + esbuild: '*' + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1785,6 +1835,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -1797,6 +1853,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -1809,6 +1871,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -1821,6 +1889,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -1833,6 +1907,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -1845,6 +1925,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -1857,6 +1943,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -1869,6 +1961,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -1881,6 +1979,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -1893,6 +1997,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -1905,6 +2015,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.14.54': resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} engines: {node: '>=12'} @@ -1923,6 +2039,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -1935,6 +2057,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -1947,6 +2075,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -1959,6 +2093,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -1971,6 +2111,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -1983,6 +2129,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -1995,12 +2147,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -2013,6 +2177,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -2025,6 +2195,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -2037,6 +2213,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -2049,6 +2231,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -2061,6 +2249,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2298,6 +2492,14 @@ packages: '@js-joda/core@5.6.3': resolution: {integrity: sha512-T1rRxzdqkEXcou0ZprN1q9yDRlvzCPLqmlNt5IIsGBzoEVgLCCYrKEwc84+TvsXuAc95VAZwtWD2zVsKPY4bcA==} + '@koa/cors@5.0.0': + resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} + engines: {node: '>= 14.0.0'} + + '@koa/router@13.1.0': + resolution: {integrity: sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==} + engines: {node: '>= 18'} + '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -2389,6 +2591,10 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/browser-chromium@1.49.0': + resolution: {integrity: sha512-SnDBEmw0h4XpbHcWR8T0LgLj1Cqn8Cvql+Nahot2zBud945z+MYXH3WVPvMI5U37WsWAgw9Cj7pZ6oL7haKrhg==} + engines: {node: '>=18'} + '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} @@ -3270,6 +3476,9 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/assert@1.5.11': + resolution: {integrity: sha512-FjS1mxq2dlGr9N4z72/DO+XmyRS3ZZIoVn998MEopAN/OmyN28F4yumRL5pOw2z+hbFLuWGYuF2rrw5p11xM5A==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3393,6 +3602,9 @@ packages: '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} + '@types/mssql@9.1.5': resolution: {integrity: sha512-Q9EsgXwuRoX5wvUSu24YfbKMbFChv7pZ/jeCzPkj47ehcuXYsBcfogwrtVFosSjinD4Q/MY2YPGk9Yy1cM2Ywg==} @@ -3474,6 +3686,9 @@ packages: '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + '@types/vscode@1.95.0': + resolution: {integrity: sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==} + '@types/webextension-polyfill@0.8.3': resolution: {integrity: sha512-GN+Hjzy9mXjWoXKmaicTegv3FJ0WFZ3aYz77Wk8TMp1IY3vEzvzj1vnsa0ggV7vMI1i+PUxe4qqnIJKCzf9aTg==} @@ -3592,6 +3807,11 @@ packages: '@vitest/utils@2.1.4': resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} + '@vscode/test-web@0.0.63': + resolution: {integrity: sha512-FIFfT2gZeEp0d1RnR+IYORS9HZPTtlTNuMLdZpO5c9sAtz5rCHPWsCD5VxnV4U08Slz5GdzgH7pDQspb9Oa8ZQ==} + engines: {node: '>=16'} + hasBin: true + '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -3730,6 +3950,10 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -3876,6 +4100,9 @@ packages: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -3934,6 +4161,9 @@ packages: axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3962,9 +4192,28 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.5.0: + resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + + bare-fs@2.3.5: + resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} + + bare-os@2.4.4: + resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} + + bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + + bare-stream@2.4.0: + resolution: {integrity: sha512-sd96/aZ8LjF1uJbEHzIo1LrERPKRFPEy1nZ1eOILftBxrVsFDAQkimHIIq87xrHcubzjNeETsD9PwN0wp+vLiQ==} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -4053,6 +4302,12 @@ packages: resolution: {integrity: sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==} engines: {'0': node} + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + browserslist@4.24.2: resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -4108,6 +4363,10 @@ packages: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -4414,6 +4673,10 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -4593,6 +4856,10 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -4612,6 +4879,9 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -4720,6 +4990,10 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} @@ -4783,6 +5057,9 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} @@ -5143,6 +5420,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -5402,6 +5684,9 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -5661,6 +5946,11 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -5775,6 +6065,11 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -5852,6 +6147,10 @@ packages: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -5948,6 +6247,10 @@ packages: htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -5962,6 +6265,10 @@ packages: resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} engines: {node: '>= 0.6'} + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -6111,6 +6418,10 @@ packages: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -6151,6 +6462,9 @@ packages: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} + is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} + is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -6177,10 +6491,18 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -6196,6 +6518,10 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -6212,6 +6538,10 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -6343,6 +6673,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} + jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} @@ -6541,6 +6875,9 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -6601,6 +6938,10 @@ packages: jws@4.0.0: resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -6612,6 +6953,32 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + + koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + + koa-morgan@1.0.1: + resolution: {integrity: sha512-JOUdCNlc21G50afBXfErUrr1RKymbgzlrO5KURY+wmDG1Uvd2jmxUJcHgylb/mYXy2SjiNZyYim/ptUBGsIi3A==} + + koa-mount@4.0.0: + resolution: {integrity: sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==} + engines: {node: '>= 7.6.0'} + + koa-send@5.0.1: + resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} + engines: {node: '>= 8'} + + koa-static@5.0.0: + resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} + engines: {node: '>= 7.6.0'} + + koa@2.15.3: + resolution: {integrity: sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} @@ -6660,6 +7027,10 @@ packages: resolution: {integrity: sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==} engines: {node: '>=4'} + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -6757,6 +7128,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -6830,6 +7205,10 @@ packages: memory-stream@1.0.0: resolution: {integrity: sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==} + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -6903,6 +7282,10 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + minimatch@3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} @@ -6976,6 +7359,11 @@ packages: mnemonist@0.39.6: resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.0.0'} + hasBin: true + moment-timezone@0.5.46: resolution: {integrity: sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==} @@ -7012,6 +7400,10 @@ packages: socks: optional: true + morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -7153,6 +7545,11 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} + npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} @@ -7187,6 +7584,10 @@ packages: resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -7239,6 +7640,9 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} @@ -7343,6 +7747,9 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -7358,6 +7765,10 @@ packages: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -7406,13 +7817,24 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + path-to-regexp@0.1.10: resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-type@2.0.0: resolution: {integrity: sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==} engines: {node: '>=4'} + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -7428,6 +7850,9 @@ packages: resolution: {integrity: sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==} engines: {node: '>=14', npm: '>=7'} + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + pem@1.14.2: resolution: {integrity: sha512-TOnPtq3ZFnCniOZ+rka4pk8UIze9xG1qI+wNE7EmkiR/cg+53uVvk5QbkWZ7M6RsuOxzz62FW1hlAobJr/lTOA==} engines: {node: '>=6.0.0'} @@ -7497,10 +7922,19 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} @@ -7523,6 +7957,16 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + playwright-core@1.49.0: + resolution: {integrity: sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.49.0: + resolution: {integrity: sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==} + engines: {node: '>=18'} + hasBin: true + plist@3.1.0: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} @@ -7729,9 +8173,15 @@ packages: pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -7761,6 +8211,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -7843,6 +8296,10 @@ packages: resolution: {integrity: sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==} engines: {node: '>=4'} + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + readable-stream@1.0.31: resolution: {integrity: sha512-tco/Dwv1f/sgIgN6CWdj/restacPKNskK6yps1981ivH2ZmLYcs5o5rVzL3qaO/cSkhN8hYOMWs7+glzOLSgRg==} @@ -7940,6 +8397,10 @@ packages: resolution: {integrity: sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g==} engines: {node: '>=4', npm: '>=2'} + resolve-path@1.4.0: + resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} + engines: {node: '>= 0.8'} + resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -8328,6 +8789,9 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + streamx@2.20.2: + resolution: {integrity: sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -8340,6 +8804,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string.prototype.padend@3.1.6: + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} + engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -8480,6 +8948,12 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -8534,6 +9008,9 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-decoder@1.2.1: + resolution: {integrity: sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==} + text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -8550,6 +9027,9 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -8708,6 +9188,10 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + tsx@4.19.2: resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} engines: {node: '>=18.0.0'} @@ -8882,6 +9366,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} @@ -8988,6 +9475,9 @@ packages: jsdom: optional: true + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} @@ -9129,6 +9619,9 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -9263,6 +9756,10 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -9283,6 +9780,10 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -10107,7 +10608,7 @@ snapshots: '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -10265,7 +10766,7 @@ snapshots: '@babel/parser': 7.26.2 '@babel/template': 7.25.9 '@babel/types': 7.26.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -10341,7 +10842,7 @@ snapshots: '@electron/get': 3.1.0 chalk: 4.1.2 commander: 4.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 10.1.0 listr2: 7.0.2 semver: 7.6.3 @@ -10356,7 +10857,7 @@ snapshots: '@electron/rebuild': 3.7.0 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) find-up: 5.0.0 fs-extra: 10.1.0 log-symbols: 4.1.0 @@ -10384,7 +10885,7 @@ snapshots: '@electron/rebuild': 3.7.0 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fast-glob: 3.3.2 filenamify: 4.3.0 find-up: 5.0.0 @@ -10473,7 +10974,7 @@ snapshots: '@electron-forge/shared-types': 7.5.0 '@electron-forge/web-multi-logger': 7.5.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) chalk: 4.1.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fast-glob: 3.3.2 fs-extra: 10.1.0 html-webpack-plugin: 5.6.3(webpack@5.96.1(@swc/core@1.9.1)) @@ -10509,7 +11010,7 @@ snapshots: '@octokit/rest': 18.12.0(encoding@0.1.13) '@octokit/types': 6.41.0 chalk: 4.1.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 10.1.0 log-symbols: 4.1.0 mime-types: 2.1.35 @@ -10532,7 +11033,7 @@ snapshots: dependencies: '@electron-forge/shared-types': 7.5.0 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 10.1.0 username: 5.1.0 transitivePeerDependencies: @@ -10599,7 +11100,7 @@ snapshots: '@electron/get@2.0.3': dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -10613,7 +11114,7 @@ snapshots: '@electron/get@3.1.0': dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -10643,7 +11144,7 @@ snapshots: '@electron/notarize@2.5.0': dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: @@ -10652,7 +11153,7 @@ snapshots: '@electron/osx-sign@1.3.1': dependencies: compare-version: 0.1.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -10668,7 +11169,7 @@ snapshots: '@electron/osx-sign': 1.3.1 '@electron/universal': 2.0.1 '@electron/windows-sign': 1.2.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) extract-zip: 2.0.1 filenamify: 4.3.0 fs-extra: 11.2.0 @@ -10689,7 +11190,7 @@ snapshots: '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) detect-libc: 2.0.3 fs-extra: 10.1.0 got: 11.8.6 @@ -10708,7 +11209,7 @@ snapshots: dependencies: '@electron/asar': 3.2.17 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) dir-compare: 4.2.0 fs-extra: 11.2.0 minimatch: 9.0.5 @@ -10719,7 +11220,7 @@ snapshots: '@electron/windows-sign@1.2.0': dependencies: cross-dirname: 0.1.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 11.2.0 minimist: 1.2.8 postject: 1.0.0-alpha.6 @@ -10738,72 +11239,109 @@ snapshots: '@elm_binaries/win32_x64@0.19.1-0': optional: true + '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.24.0)': + dependencies: + esbuild: 0.24.0 + '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/aix-ppc64@0.23.1': optional: true + '@esbuild/aix-ppc64@0.24.0': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.23.1': optional: true + '@esbuild/android-arm64@0.24.0': + optional: true + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.23.1': optional: true + '@esbuild/android-arm@0.24.0': + optional: true + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.23.1': optional: true + '@esbuild/android-x64@0.24.0': + optional: true + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.23.1': optional: true + '@esbuild/darwin-arm64@0.24.0': + optional: true + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.23.1': optional: true + '@esbuild/darwin-x64@0.24.0': + optional: true + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.23.1': optional: true + '@esbuild/freebsd-arm64@0.24.0': + optional: true + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.23.1': optional: true + '@esbuild/freebsd-x64@0.24.0': + optional: true + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.23.1': optional: true + '@esbuild/linux-arm64@0.24.0': + optional: true + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.23.1': optional: true + '@esbuild/linux-arm@0.24.0': + optional: true + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.23.1': optional: true + '@esbuild/linux-ia32@0.24.0': + optional: true + '@esbuild/linux-loong64@0.14.54': optional: true @@ -10813,75 +11351,114 @@ snapshots: '@esbuild/linux-loong64@0.23.1': optional: true + '@esbuild/linux-loong64@0.24.0': + optional: true + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.23.1': optional: true + '@esbuild/linux-mips64el@0.24.0': + optional: true + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.23.1': optional: true + '@esbuild/linux-ppc64@0.24.0': + optional: true + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.23.1': optional: true + '@esbuild/linux-riscv64@0.24.0': + optional: true + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.23.1': optional: true + '@esbuild/linux-s390x@0.24.0': + optional: true + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.23.1': optional: true + '@esbuild/linux-x64@0.24.0': + optional: true + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.23.1': optional: true + '@esbuild/netbsd-x64@0.24.0': + optional: true + '@esbuild/openbsd-arm64@0.23.1': optional: true + '@esbuild/openbsd-arm64@0.24.0': + optional: true + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.23.1': optional: true + '@esbuild/openbsd-x64@0.24.0': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.23.1': optional: true + '@esbuild/sunos-x64@0.24.0': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.23.1': optional: true + '@esbuild/win32-arm64@0.24.0': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.23.1': optional: true + '@esbuild/win32-ia32@0.24.0': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.23.1': optional: true + '@esbuild/win32-x64@0.24.0': + optional: true + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -10897,7 +11474,7 @@ snapshots: '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -10907,7 +11484,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -10921,7 +11498,7 @@ snapshots: '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -11056,7 +11633,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -11314,6 +11891,16 @@ snapshots: '@js-joda/core@5.6.3': {} + '@koa/cors@5.0.0': + dependencies: + vary: 1.1.2 + + '@koa/router@13.1.0': + dependencies: + http-errors: 2.0.0 + koa-compose: 4.1.0 + path-to-regexp: 6.3.0 + '@leichtgewicht/ip-codec@2.0.5': {} '@loancrate/prisma-schema-parser@2.0.0': @@ -11445,6 +12032,10 @@ snapshots: '@pkgr/core@0.1.1': {} + '@playwright/browser-chromium@1.49.0': + dependencies: + playwright-core: 1.49.0 + '@radix-ui/number@1.1.0': {} '@radix-ui/primitive@1.1.0': {} @@ -12396,6 +12987,8 @@ snapshots: '@types/aria-query@5.0.4': {} + '@types/assert@1.5.11': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.2 @@ -12558,6 +13151,8 @@ snapshots: '@types/minimatch@5.1.2': optional: true + '@types/mocha@10.0.10': {} + '@types/mssql@9.1.5': dependencies: '@types/node': 22.9.0 @@ -12664,6 +13259,8 @@ snapshots: '@types/triple-beam@1.3.5': {} + '@types/vscode@1.95.0': {} + '@types/webextension-polyfill@0.8.3': {} '@types/webidl-conversions@7.0.3': {} @@ -12729,7 +13326,7 @@ snapshots: '@typescript-eslint/types': 8.13.0 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.13.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) eslint: 8.57.1 optionalDependencies: typescript: 5.6.3 @@ -12742,7 +13339,7 @@ snapshots: '@typescript-eslint/types': 8.13.0 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.13.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) eslint: 9.14.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.3 @@ -12758,7 +13355,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) '@typescript-eslint/utils': 8.13.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -12770,7 +13367,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -12784,7 +13381,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.13.0 '@typescript-eslint/visitor-keys': 8.13.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -12875,6 +13472,26 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 + '@vscode/test-web@0.0.63': + dependencies: + '@koa/cors': 5.0.0 + '@koa/router': 13.1.0 + '@playwright/browser-chromium': 1.49.0 + glob: 11.0.0 + gunzip-maybe: 1.4.2 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + koa: 2.15.3 + koa-morgan: 1.0.1 + koa-mount: 4.0.0 + koa-static: 5.0.0 + minimist: 1.2.8 + playwright: 1.49.0 + tar-fs: 3.0.6 + vscode-uri: 3.0.8 + transitivePeerDependencies: + - supports-color + '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -12989,13 +13606,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -13039,6 +13656,8 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -13191,6 +13810,14 @@ snapshots: assert-plus@1.0.0: {} + assert@2.1.0: + dependencies: + call-bind: 1.0.7 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.5 + util: 0.12.5 + assertion-error@2.0.1: {} astral-regex@2.0.0: {} @@ -13254,6 +13881,8 @@ snapshots: transitivePeerDependencies: - debug + b4a@1.6.7: {} + babel-jest@29.7.0(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 @@ -13311,8 +13940,35 @@ snapshots: balanced-match@1.0.2: {} + bare-events@2.5.0: + optional: true + + bare-fs@2.3.5: + dependencies: + bare-events: 2.5.0 + bare-path: 2.1.3 + bare-stream: 2.4.0 + optional: true + + bare-os@2.4.4: + optional: true + + bare-path@2.1.3: + dependencies: + bare-os: 2.4.4 + optional: true + + bare-stream@2.4.0: + dependencies: + streamx: 2.20.2 + optional: true + base64-js@1.5.1: {} + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + batch@0.6.1: {} bcrypt-pbkdf@1.0.2: @@ -13413,6 +14069,12 @@ snapshots: browser-request@0.3.3: {} + browser-stdout@1.3.1: {} + + browserify-zlib@0.1.4: + dependencies: + pako: 0.2.9 + browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001679 @@ -13483,6 +14145,11 @@ snapshots: transitivePeerDependencies: - bluebird + cache-content-type@1.0.1: + dependencies: + mime-types: 2.1.35 + ylru: 1.4.0 + cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: @@ -13662,7 +14329,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - optional: true cliui@8.0.1: dependencies: @@ -13689,7 +14355,7 @@ snapshots: cmake-js@7.3.0: dependencies: axios: 1.7.7(debug@4.3.7) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 11.2.0 lodash.isplainobject: 4.0.6 memory-stream: 1.0.0 @@ -13823,6 +14489,11 @@ snapshots: cookie@0.7.2: {} + cookies@0.9.1: + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + core-util-is@1.0.2: {} core-util-is@1.0.3: {} @@ -14032,8 +14703,16 @@ snapshots: optionalDependencies: supports-color: 5.5.0 + debug@4.3.7(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + decamelize@1.2.0: {} + decamelize@4.0.0: {} + decimal.js@10.4.3: {} decompress-response@6.0.0: @@ -14044,6 +14723,8 @@ snapshots: deep-eql@5.0.2: {} + deep-equal@1.0.1: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -14120,6 +14801,8 @@ snapshots: diff@4.0.2: {} + diff@5.2.0: {} + dijkstrajs@1.0.3: {} dir-compare@4.2.0: @@ -14184,6 +14867,13 @@ snapshots: dotenv@16.4.5: {} + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + duplexify@4.1.3: dependencies: end-of-stream: 1.4.4 @@ -14212,7 +14902,7 @@ snapshots: dependencies: '@malept/cross-spawn-promise': 1.1.1 asar: 3.2.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 9.1.0 glob: 7.2.3 lodash: 4.17.21 @@ -14228,7 +14918,7 @@ snapshots: electron-installer-debian@3.2.0: dependencies: '@malept/cross-spawn-promise': 1.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) electron-installer-common: 0.10.3 fs-extra: 9.1.0 get-folder-size: 2.0.1 @@ -14242,7 +14932,7 @@ snapshots: electron-installer-redhat@3.4.0: dependencies: '@malept/cross-spawn-promise': 1.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) electron-installer-common: 0.10.3 fs-extra: 9.1.0 lodash: 4.17.21 @@ -14263,7 +14953,7 @@ snapshots: electron-winstaller@5.4.0: dependencies: '@electron/asar': 3.2.17 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 7.0.1 lodash: 4.17.21 temp: 0.9.4 @@ -14753,6 +15443,33 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 + esbuild@0.24.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -14872,7 +15589,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.5 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -14919,7 +15636,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.5 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 @@ -15094,7 +15811,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -15114,6 +15831,8 @@ snapshots: fast-diff@1.3.0: {} + fast-fifo@1.3.2: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -15301,7 +16020,7 @@ snapshots: flora-colossus@2.0.0: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 10.1.0 transitivePeerDependencies: - supports-color @@ -15310,7 +16029,7 @@ snapshots: folder-hash@3.3.3: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) graceful-fs: 4.2.11 minimatch: 3.0.8 transitivePeerDependencies: @@ -15322,7 +16041,7 @@ snapshots: follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) for-each@0.3.3: dependencies: @@ -15433,6 +16152,9 @@ snapshots: fsevents@2.1.3: optional: true + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -15449,7 +16171,7 @@ snapshots: galactus@1.0.0: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) flora-colossus: 2.0.0 fs-extra: 10.1.0 transitivePeerDependencies: @@ -15576,6 +16298,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -15702,6 +16433,15 @@ snapshots: - encoding - supports-color + gunzip-maybe@1.4.2: + dependencies: + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 + handle-thing@2.0.1: {} har-schema@2.0.0: {} @@ -15791,6 +16531,11 @@ snapshots: domutils: 2.8.0 entities: 2.2.0 + http-assert@1.5.0: + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + http-cache-semantics@4.1.1: {} http-deceiver@1.2.7: {} @@ -15810,6 +16555,14 @@ snapshots: statuses: 1.5.0 toidentifier: 1.0.0 + http-errors@1.8.1: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -15824,14 +16577,14 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -15885,14 +16638,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -15979,6 +16732,11 @@ snapshots: ipaddr.js@2.2.0: {} + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -16017,6 +16775,8 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-deflate@1.0.0: {} + is-docker@2.2.1: {} is-docker@3.0.0: {} @@ -16029,10 +16789,16 @@ snapshots: is-generator-fn@2.1.0: {} + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 + is-gzip@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -16043,6 +16809,11 @@ snapshots: is-module@1.0.0: {} + is-nan@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + is-negative-zero@2.0.3: {} is-number-object@1.0.7: @@ -16053,6 +16824,8 @@ snapshots: is-path-inside@3.0.3: {} + is-plain-obj@2.1.0: {} + is-plain-obj@3.0.0: {} is-plain-object@2.0.4: @@ -16162,7 +16935,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -16179,6 +16952,10 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jackspeak@4.0.2: + dependencies: + '@isaacs/cliui': 8.0.2 + jake@10.9.2: dependencies: async: 3.2.6 @@ -16642,6 +17419,8 @@ snapshots: json-buffer@3.0.1: {} + json-parse-better-errors@1.0.2: {} + json-parse-even-better-errors@2.3.1: {} json-schema-ref-resolver@1.0.1: @@ -16718,6 +17497,10 @@ snapshots: jwa: 2.0.0 safe-buffer: 5.2.1 + keygrip@1.1.0: + dependencies: + tsscmp: 1.0.6 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -16726,6 +17509,69 @@ snapshots: kleur@3.0.3: {} + koa-compose@4.1.0: {} + + koa-convert@2.0.0: + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + + koa-morgan@1.0.1: + dependencies: + morgan: 1.10.0 + transitivePeerDependencies: + - supports-color + + koa-mount@4.0.0: + dependencies: + debug: 4.3.7(supports-color@8.1.1) + koa-compose: 4.1.0 + transitivePeerDependencies: + - supports-color + + koa-send@5.0.1: + dependencies: + debug: 4.3.7(supports-color@8.1.1) + http-errors: 1.8.1 + resolve-path: 1.4.0 + transitivePeerDependencies: + - supports-color + + koa-static@5.0.0: + dependencies: + debug: 3.2.7 + koa-send: 5.0.1 + transitivePeerDependencies: + - supports-color + + koa@2.15.3: + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.9.1 + debug: 4.3.7(supports-color@8.1.1) + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + kuler@2.0.0: {} launch-editor@2.9.1: @@ -16781,6 +17627,13 @@ snapshots: pify: 2.3.0 strip-bom: 3.0.0 + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + loader-runner@4.3.0: {} loader-utils@2.0.4: @@ -16872,6 +17725,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.0.2: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -16968,6 +17823,8 @@ snapshots: dependencies: readable-stream: 3.6.2 + memorystream@0.3.1: {} + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -17009,6 +17866,10 @@ snapshots: minimalistic-assert@1.0.1: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.0.8: dependencies: brace-expansion: 1.1.11 @@ -17080,6 +17941,29 @@ snapshots: dependencies: obliterator: 2.0.4 + mocha@10.8.2: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.3.7(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + moment-timezone@0.5.46: dependencies: moment: 2.30.1 @@ -17099,6 +17983,16 @@ snapshots: optionalDependencies: socks: 2.8.3 + morgan@1.10.0: + dependencies: + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color + ms@2.0.0: {} ms@2.1.1: {} @@ -17109,7 +18003,7 @@ snapshots: dependencies: '@tediousjs/connection-string': 0.5.0 commander: 11.1.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) rfdc: 1.4.1 tarn: 3.0.2 tedious: 18.6.1 @@ -17237,6 +18131,18 @@ snapshots: normalize-url@6.1.0: {} + npm-run-all@4.1.5: + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.1 + string.prototype.padend: 3.1.6 + npm-run-path@2.0.2: dependencies: path-key: 2.0.1 @@ -17266,6 +18172,11 @@ snapshots: object-inspect@1.13.3: {} + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + object-keys@1.1.1: {} object.assign@4.1.5: @@ -17322,6 +18233,8 @@ snapshots: dependencies: mimic-fn: 2.1.0 + only@0.0.2: {} + open@10.1.0: dependencies: default-browser: 5.2.1 @@ -17434,6 +18347,8 @@ snapshots: package-json-from-dist@1.0.1: {} + pako@0.2.9: {} + param-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -17451,6 +18366,11 @@ snapshots: dependencies: error-ex: 1.3.2 + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.26.2 @@ -17490,12 +18410,23 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + path-to-regexp@0.1.10: {} + path-to-regexp@6.3.0: {} + path-type@2.0.0: dependencies: pify: 2.3.0 + path-type@3.0.0: + dependencies: + pify: 3.0.0 + path-type@4.0.0: {} pathe@1.1.2: {} @@ -17504,6 +18435,12 @@ snapshots: pe-library@1.0.1: {} + peek-stream@1.1.3: + dependencies: + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 + pem@1.14.2: dependencies: es6-promisify: 6.1.1 @@ -17583,8 +18520,12 @@ snapshots: picomatch@4.0.2: {} + pidtree@0.3.1: {} + pify@2.3.0: {} + pify@3.0.0: {} + pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 @@ -17628,6 +18569,14 @@ snapshots: dependencies: find-up: 4.1.0 + playwright-core@1.49.0: {} + + playwright@1.49.0: + dependencies: + playwright-core: 1.49.0 + optionalDependencies: + fsevents: 2.3.2 + plist@3.1.0: dependencies: '@xmldom/xmldom': 0.8.10 @@ -17796,11 +18745,22 @@ snapshots: pstree.remy@1.1.8: {} + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + punycode@2.3.1: {} pure-rand@6.1.0: {} @@ -17825,6 +18785,8 @@ snapshots: queue-microtask@1.2.3: {} + queue-tick@1.0.1: {} + quick-format-unescaped@4.0.4: {} quick-lru@5.1.1: {} @@ -17893,7 +18855,7 @@ snapshots: read-binary-file-arch@1.0.6: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17912,6 +18874,12 @@ snapshots: normalize-package-data: 2.5.0 path-type: 2.0.0 + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + readable-stream@1.0.31: dependencies: core-util-is: 1.0.3 @@ -18037,6 +19005,11 @@ snapshots: dependencies: get-installed-path: 2.1.1 + resolve-path@1.4.0: + dependencies: + http-errors: 1.6.3 + path-is-absolute: 1.0.1 + resolve-pkg-maps@1.0.0: {} resolve.exports@2.0.2: {} @@ -18414,7 +19387,7 @@ snapshots: socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -18466,7 +19439,7 @@ snapshots: spdy-transport@3.0.0: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -18477,7 +19450,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -18535,6 +19508,14 @@ snapshots: stream-shift@1.0.3: {} + streamx@2.20.2: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.2.1 + optionalDependencies: + bare-events: 2.5.0 + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -18552,6 +19533,13 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string.prototype.padend@3.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 @@ -18635,7 +19623,7 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -18710,6 +19698,20 @@ snapshots: tapable@2.2.1: {} + tar-fs@3.0.6: + dependencies: + pump: 3.0.2 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.5 + bare-path: 2.1.3 + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.20.2 + tar@6.2.1: dependencies: chownr: 2.0.0 @@ -18788,6 +19790,8 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + text-decoder@1.2.1: {} + text-hex@1.0.0: {} text-table@0.2.0: {} @@ -18804,6 +19808,11 @@ snapshots: dependencies: real-require: 0.2.0 + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + through@2.3.8: {} thunky@1.1.0: {} @@ -19004,6 +20013,8 @@ snapshots: tslib@2.8.1: {} + tsscmp@1.0.6: {} + tsx@4.19.2: dependencies: esbuild: 0.23.1 @@ -19172,6 +20183,14 @@ snapshots: util-deprecate@1.0.2: {} + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + utila@0.4.0: {} utils-merge@1.0.1: {} @@ -19206,7 +20225,7 @@ snapshots: vite-node@2.1.4(@types/node@22.9.0)(terser@5.36.0): dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) pathe: 1.1.2 vite: 5.4.10(@types/node@22.9.0)(terser@5.36.0) transitivePeerDependencies: @@ -19246,7 +20265,7 @@ snapshots: '@vitest/spy': 2.1.4 '@vitest/utils': 2.1.4 chai: 5.1.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) expect-type: 1.1.0 magic-string: 0.30.12 pathe: 1.1.2 @@ -19272,6 +20291,8 @@ snapshots: - supports-color - terser + vscode-uri@3.0.8: {} + w3c-xmlserializer@4.0.0: dependencies: xml-name-validator: 4.0.0 @@ -19487,6 +20508,8 @@ snapshots: word-wrap@1.2.5: {} + workerpool@6.5.1: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -19571,11 +20594,17 @@ snapshots: camelcase: 5.3.1 decamelize: 1.2.0 - yargs-parser@20.2.9: - optional: true + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -19599,7 +20628,6 @@ snapshots: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - optional: true yargs@17.7.2: dependencies: @@ -19621,6 +20649,8 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 + ylru@1.4.0: {} + yn@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 81644da32..35f8a8361 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,7 +2,9 @@ packages: - "backend" - "cli" - "cli/html-report" - - "extensions/*" + - "extensions/browser-extension" + - "extensions/desktop" + - "extensions/vscode-aml" - "frontend" - "gateway" - "libs/*" From 895796e29277e2b7f0696a86a94fd005045cde9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Fri, 22 Nov 2024 14:06:11 +0100 Subject: [PATCH 03/20] Update libs --- extensions/vscode-aml/package.json | 29 +- pnpm-lock.yaml | 452 ++++++++++++++++++++++------- 2 files changed, 367 insertions(+), 114 deletions(-) diff --git a/extensions/vscode-aml/package.json b/extensions/vscode-aml/package.json index fdd9cb71b..5427609f3 100644 --- a/extensions/vscode-aml/package.json +++ b/extensions/vscode-aml/package.json @@ -8,7 +8,11 @@ "engines": { "vscode": "^1.95.0" }, - "categories": ["Programming Languages", "Snippets", "Other"], + "categories": [ + "Programming Languages", + "Snippets", + "Other" + ], "repository": { "type": "git", "url": "git+https://github.com/azimuttapp/azimutt.git", @@ -37,20 +41,23 @@ "lint": "eslint src", "run-in-browser": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. ." }, + "dependencies": { + "@azimutt/aml": "^0.1.8" + }, "devDependencies": { + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@types/assert": "^1.5.11", + "@types/mocha": "^10.0.10", "@types/vscode": "^1.95.0", - "@types/mocha": "^10.0.9", - "@types/assert": "^1.5.10", - "eslint": "^9.13.0", - "@typescript-eslint/eslint-plugin": "^8.10.0", - "@typescript-eslint/parser": "^8.7.0", - "mocha": "^10.7.3", - "typescript": "^5.6.3", - "@vscode/test-web": "^0.0.63", + "@typescript-eslint/eslint-plugin": "^8.15.0", + "@typescript-eslint/parser": "^8.15.0", + "@vscode/test-web": "^0.0.64", + "assert": "^2.1.0", "esbuild": "^0.24.0", + "eslint": "^9.15.0", "glob": "^11.0.0", + "mocha": "^10.8.2", "npm-run-all": "^4.1.5", - "@esbuild-plugins/node-globals-polyfill": "^0.2.3", - "assert": "^2.1.0" + "typescript": "^5.6.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bfbfd18a4..20b6546d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -301,28 +301,32 @@ importers: version: 5.96.1(@swc/core@1.9.1) extensions/vscode-aml: + dependencies: + '@azimutt/aml': + specifier: ^0.1.8 + version: 0.1.8 devDependencies: '@esbuild-plugins/node-globals-polyfill': specifier: ^0.2.3 version: 0.2.3(esbuild@0.24.0) '@types/assert': - specifier: ^1.5.10 + specifier: ^1.5.11 version: 1.5.11 '@types/mocha': - specifier: ^10.0.9 + specifier: ^10.0.10 version: 10.0.10 '@types/vscode': specifier: ^1.95.0 version: 1.95.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.10.0 - version: 8.13.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + specifier: ^8.15.0 + version: 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) '@typescript-eslint/parser': - specifier: ^8.7.0 - version: 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) + specifier: ^8.15.0 + version: 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) '@vscode/test-web': - specifier: ^0.0.63 - version: 0.0.63 + specifier: ^0.0.64 + version: 0.0.64 assert: specifier: ^2.1.0 version: 2.1.0 @@ -330,13 +334,13 @@ importers: specifier: ^0.24.0 version: 0.24.0 eslint: - specifier: ^9.13.0 - version: 9.14.0(jiti@1.21.6) + specifier: ^9.15.0 + version: 9.15.0(jiti@1.21.6) glob: specifier: ^11.0.0 version: 11.0.0 mocha: - specifier: ^10.7.3 + specifier: ^10.8.2 version: 10.8.2 npm-run-all: specifier: ^4.1.5 @@ -610,7 +614,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -641,7 +645,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -672,7 +676,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -703,7 +707,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -734,7 +738,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -765,7 +769,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -799,7 +803,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -836,7 +840,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -870,7 +874,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -904,7 +908,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -941,7 +945,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -996,7 +1000,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1045,7 +1049,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1100,7 +1104,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1121,7 +1125,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1332,6 +1336,9 @@ packages: resolution: {integrity: sha512-k0z5b5dkYSuOHY0AOZ4iyjcGBeVL9lWsQNF4+c+1oK3OW4fRWl/bNa1soMRMpangsHPzgyn/QkzuDbl7qR4qrw==} engines: {node: '>=16.0.0'} + '@azimutt/aml@0.1.8': + resolution: {integrity: sha512-gyNAkiW1TdaXA2rg9SpBWE2p1VUnPZIv1C1r+fSt4DlDVjcRnO4Q+9QpJZoqmVghu5Hqbd5c5ia+k/vAwufrkw==} + '@azimutt/connector-bigquery@0.1.2': resolution: {integrity: sha512-MXdXAZxxn/32nCKXz+ZIk4BQajHhdVw4eI5oIKj5+vrjdXnLmXNvf6QClbHJ+mR9anDSJLTvPDEDY4iI3X4nFw==} @@ -2269,10 +2276,18 @@ packages: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.19.0': + resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.7.0': resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.9.0': + resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2281,6 +2296,10 @@ packages: resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2289,6 +2308,10 @@ packages: resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.15.0': + resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2297,6 +2320,10 @@ packages: resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.2.3': + resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@fastify/ajv-compiler@3.6.0': resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} @@ -3721,6 +3748,17 @@ packages: typescript: optional: true + '@typescript-eslint/eslint-plugin@8.15.0': + resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/parser@8.13.0': resolution: {integrity: sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3731,10 +3769,24 @@ packages: typescript: optional: true + '@typescript-eslint/parser@8.15.0': + resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/scope-manager@8.13.0': resolution: {integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.15.0': + resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@8.13.0': resolution: {integrity: sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3744,10 +3796,24 @@ packages: typescript: optional: true + '@typescript-eslint/type-utils@8.15.0': + resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/types@8.13.0': resolution: {integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.15.0': + resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.13.0': resolution: {integrity: sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3757,16 +3823,39 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@8.15.0': + resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/utils@8.13.0': resolution: {integrity: sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/utils@8.15.0': + resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/visitor-keys@8.13.0': resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.15.0': + resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -3807,8 +3896,8 @@ packages: '@vitest/utils@2.1.4': resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} - '@vscode/test-web@0.0.63': - resolution: {integrity: sha512-FIFfT2gZeEp0d1RnR+IYORS9HZPTtlTNuMLdZpO5c9sAtz5rCHPWsCD5VxnV4U08Slz5GdzgH7pDQspb9Oa8ZQ==} + '@vscode/test-web@0.0.64': + resolution: {integrity: sha512-V7fTb3K1HzlqwT+VrxIq+vZLqPYzoItu6Tg3vd6sbd87ll0srICQNiH/W7IBUn76zHf7v5xzEXzNOnhSQJ2/YQ==} engines: {node: '>=16'} hasBin: true @@ -5550,6 +5639,16 @@ packages: jiti: optional: true + eslint@9.15.0: + resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + esniff@2.0.1: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} @@ -10338,6 +10437,14 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 + '@azimutt/aml@0.1.8': + dependencies: + '@azimutt/models': 0.1.15 + '@azimutt/utils': 0.1.6 + chevrotain: 10.5.0 + transitivePeerDependencies: + - encoding + '@azimutt/connector-bigquery@0.1.2': dependencies: '@azimutt/models': 0.1.15 @@ -10608,7 +10715,7 @@ snapshots: '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -10766,7 +10873,7 @@ snapshots: '@babel/parser': 7.26.2 '@babel/template': 7.25.9 '@babel/types': 7.26.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -10842,7 +10949,7 @@ snapshots: '@electron/get': 3.1.0 chalk: 4.1.2 commander: 4.1.1 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 10.1.0 listr2: 7.0.2 semver: 7.6.3 @@ -10857,7 +10964,7 @@ snapshots: '@electron/rebuild': 3.7.0 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) find-up: 5.0.0 fs-extra: 10.1.0 log-symbols: 4.1.0 @@ -10885,7 +10992,7 @@ snapshots: '@electron/rebuild': 3.7.0 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fast-glob: 3.3.2 filenamify: 4.3.0 find-up: 5.0.0 @@ -10974,7 +11081,7 @@ snapshots: '@electron-forge/shared-types': 7.5.0 '@electron-forge/web-multi-logger': 7.5.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fast-glob: 3.3.2 fs-extra: 10.1.0 html-webpack-plugin: 5.6.3(webpack@5.96.1(@swc/core@1.9.1)) @@ -11010,7 +11117,7 @@ snapshots: '@octokit/rest': 18.12.0(encoding@0.1.13) '@octokit/types': 6.41.0 chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 10.1.0 log-symbols: 4.1.0 mime-types: 2.1.35 @@ -11033,7 +11140,7 @@ snapshots: dependencies: '@electron-forge/shared-types': 7.5.0 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 10.1.0 username: 5.1.0 transitivePeerDependencies: @@ -11100,7 +11207,7 @@ snapshots: '@electron/get@2.0.3': dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -11114,7 +11221,7 @@ snapshots: '@electron/get@3.1.0': dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -11144,7 +11251,7 @@ snapshots: '@electron/notarize@2.5.0': dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: @@ -11153,7 +11260,7 @@ snapshots: '@electron/osx-sign@1.3.1': dependencies: compare-version: 0.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -11169,7 +11276,7 @@ snapshots: '@electron/osx-sign': 1.3.1 '@electron/universal': 2.0.1 '@electron/windows-sign': 1.2.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) extract-zip: 2.0.1 filenamify: 4.3.0 fs-extra: 11.2.0 @@ -11190,7 +11297,7 @@ snapshots: '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 '@malept/cross-spawn-promise': 2.0.0 chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) detect-libc: 2.0.3 fs-extra: 10.1.0 got: 11.8.6 @@ -11209,7 +11316,7 @@ snapshots: dependencies: '@electron/asar': 3.2.17 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) dir-compare: 4.2.0 fs-extra: 11.2.0 minimatch: 9.0.5 @@ -11220,7 +11327,7 @@ snapshots: '@electron/windows-sign@1.2.0': dependencies: cross-dirname: 0.1.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 11.2.0 minimist: 1.2.8 postject: 1.0.0-alpha.6 @@ -11469,22 +11576,37 @@ snapshots: eslint: 9.14.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.1(eslint@9.15.0(jiti@1.21.6))': + dependencies: + eslint: 9.15.0(jiti@1.21.6) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-array@0.19.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.7(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@eslint/core@0.7.0': {} + '@eslint/core@0.9.0': {} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -11498,7 +11620,21 @@ snapshots: '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.2.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.7(supports-color@5.5.0) espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -11513,12 +11649,18 @@ snapshots: '@eslint/js@9.14.0': {} + '@eslint/js@9.15.0': {} + '@eslint/object-schema@2.1.4': {} '@eslint/plugin-kit@0.2.2': dependencies: levn: 0.4.1 + '@eslint/plugin-kit@0.2.3': + dependencies: + levn: 0.4.1 + '@fastify/ajv-compiler@3.6.0': dependencies: ajv: 8.17.1 @@ -11633,7 +11775,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -13320,13 +13462,31 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.15.0 + '@typescript-eslint/type-utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.15.0 + eslint: 9.15.0(jiti@1.21.6) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.13.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.13.0 '@typescript-eslint/types': 8.13.0 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.13.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) eslint: 8.57.1 optionalDependencies: typescript: 5.6.3 @@ -13339,23 +13499,41 @@ snapshots: '@typescript-eslint/types': 8.13.0 '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.13.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) eslint: 9.14.0(jiti@1.21.6) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.15.0 + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.15.0 + debug: 4.3.7(supports-color@5.5.0) + eslint: 9.15.0(jiti@1.21.6) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.13.0': dependencies: '@typescript-eslint/types': 8.13.0 '@typescript-eslint/visitor-keys': 8.13.0 + '@typescript-eslint/scope-manager@8.15.0': + dependencies: + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/type-utils@8.13.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) '@typescript-eslint/utils': 8.13.0(eslint@8.57.1)(typescript@5.6.3) - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -13367,7 +13545,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) '@typescript-eslint/utils': 8.13.0(eslint@9.14.0(jiti@1.21.6))(typescript@5.6.3) - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) ts-api-utils: 1.4.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -13375,13 +13553,42 @@ snapshots: - eslint - supports-color + '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) + debug: 4.3.7(supports-color@5.5.0) + eslint: 9.15.0(jiti@1.21.6) + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.13.0': {} + '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/typescript-estree@8.13.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.13.0 '@typescript-eslint/visitor-keys': 8.13.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/visitor-keys': 8.15.0 + debug: 4.3.7(supports-color@5.5.0) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -13414,11 +13621,28 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) + '@typescript-eslint/scope-manager': 8.15.0 + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + eslint: 9.15.0(jiti@1.21.6) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.13.0': dependencies: '@typescript-eslint/types': 8.13.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.15.0': + dependencies: + '@typescript-eslint/types': 8.15.0 + eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.2.0': {} '@vercel/webpack-asset-relocator-loader@1.7.4': @@ -13472,7 +13696,7 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 - '@vscode/test-web@0.0.63': + '@vscode/test-web@0.0.64': dependencies: '@koa/cors': 5.0.0 '@koa/router': 13.1.0 @@ -13606,13 +13830,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -14355,7 +14579,7 @@ snapshots: cmake-js@7.3.0: dependencies: axios: 1.7.7(debug@4.3.7) - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 11.2.0 lodash.isplainobject: 4.0.6 memory-stream: 1.0.0 @@ -14902,7 +15126,7 @@ snapshots: dependencies: '@malept/cross-spawn-promise': 1.1.1 asar: 3.2.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 9.1.0 glob: 7.2.3 lodash: 4.17.21 @@ -14918,7 +15142,7 @@ snapshots: electron-installer-debian@3.2.0: dependencies: '@malept/cross-spawn-promise': 1.1.1 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) electron-installer-common: 0.10.3 fs-extra: 9.1.0 get-folder-size: 2.0.1 @@ -14932,7 +15156,7 @@ snapshots: electron-installer-redhat@3.4.0: dependencies: '@malept/cross-spawn-promise': 1.1.1 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) electron-installer-common: 0.10.3 fs-extra: 9.1.0 lodash: 4.17.21 @@ -14953,7 +15177,7 @@ snapshots: electron-winstaller@5.4.0: dependencies: '@electron/asar': 3.2.17 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 7.0.1 lodash: 4.17.21 temp: 0.9.4 @@ -15589,7 +15813,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.5 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -15636,7 +15860,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.5 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 @@ -15661,6 +15885,47 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.15.0(jiti@1.21.6): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.0 + '@eslint/core': 0.9.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.15.0 + '@eslint/plugin-kit': 0.2.3 + '@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.6 + chalk: 4.1.2 + cross-spawn: 7.0.5 + debug: 4.3.7(supports-color@5.5.0) + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 1.21.6 + transitivePeerDependencies: + - supports-color + esniff@2.0.1: dependencies: d: 1.0.2 @@ -15811,7 +16076,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -16020,7 +16285,7 @@ snapshots: flora-colossus@2.0.0: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 10.1.0 transitivePeerDependencies: - supports-color @@ -16029,7 +16294,7 @@ snapshots: folder-hash@3.3.3: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) graceful-fs: 4.2.11 minimatch: 3.0.8 transitivePeerDependencies: @@ -16041,7 +16306,7 @@ snapshots: follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) for-each@0.3.3: dependencies: @@ -16171,7 +16436,7 @@ snapshots: galactus@1.0.0: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) flora-colossus: 2.0.0 fs-extra: 10.1.0 transitivePeerDependencies: @@ -16577,14 +16842,14 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -16638,14 +16903,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -16935,7 +17200,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -17524,14 +17789,14 @@ snapshots: koa-mount@4.0.0: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) koa-compose: 4.1.0 transitivePeerDependencies: - supports-color koa-send@5.0.1: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) http-errors: 1.8.1 resolve-path: 1.4.0 transitivePeerDependencies: @@ -17551,7 +17816,7 @@ snapshots: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -18003,7 +18268,7 @@ snapshots: dependencies: '@tediousjs/connection-string': 0.5.0 commander: 11.1.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) rfdc: 1.4.1 tarn: 3.0.2 tedious: 18.6.1 @@ -18855,7 +19120,7 @@ snapshots: read-binary-file-arch@1.0.6: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -19387,7 +19652,7 @@ snapshots: socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -19439,7 +19704,7 @@ snapshots: spdy-transport@3.0.0: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -19450,7 +19715,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -19623,7 +19888,7 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -19935,25 +20200,6 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.0) - ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3): - dependencies: - bs-logger: 0.2.6 - ejs: 3.1.10 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.6.3 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.26.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.0) - ts-loader@9.5.1(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.9.1)): dependencies: chalk: 4.1.2 @@ -20225,7 +20471,7 @@ snapshots: vite-node@2.1.4(@types/node@22.9.0)(terser@5.36.0): dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) pathe: 1.1.2 vite: 5.4.10(@types/node@22.9.0)(terser@5.36.0) transitivePeerDependencies: @@ -20265,7 +20511,7 @@ snapshots: '@vitest/spy': 2.1.4 '@vitest/utils': 2.1.4 chai: 5.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) expect-type: 1.1.0 magic-string: 0.30.12 pathe: 1.1.2 From e80576a881f290b95c3074e9a4fbe09177fd0d48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Fri, 22 Nov 2024 16:38:56 +0100 Subject: [PATCH 04/20] Basic language support --- extensions/vscode-aml/DEVELOPMENT.md | 9 ++++ extensions/vscode-aml/assets/icon-white.png | Bin 0 -> 31773 bytes extensions/vscode-aml/assets/icon-white.svg | 1 + extensions/vscode-aml/assets/icon.png | Bin 0 -> 31367 bytes extensions/vscode-aml/assets/icon.svg | 1 + .../vscode-aml/language-configuration.json | 26 ++++++++++ extensions/vscode-aml/package.json | 45 ++++++++++++++--- extensions/vscode-aml/resources/schema.aml | 9 ++++ extensions/vscode-aml/resources/schema.json | 26 ++++++++++ extensions/vscode-aml/resources/schema.sql | 11 ++++ extensions/vscode-aml/snippets.json | 47 ++++++++++++++++++ extensions/vscode-aml/src/web/extension.ts | 29 +++++------ .../vscode-aml/syntaxes/aml.tmLanguage.json | 25 ++++++++++ 13 files changed, 204 insertions(+), 25 deletions(-) create mode 100644 extensions/vscode-aml/DEVELOPMENT.md create mode 100644 extensions/vscode-aml/assets/icon-white.png create mode 100644 extensions/vscode-aml/assets/icon-white.svg create mode 100644 extensions/vscode-aml/assets/icon.png create mode 100644 extensions/vscode-aml/assets/icon.svg create mode 100644 extensions/vscode-aml/language-configuration.json create mode 100644 extensions/vscode-aml/resources/schema.aml create mode 100644 extensions/vscode-aml/resources/schema.json create mode 100644 extensions/vscode-aml/resources/schema.sql create mode 100644 extensions/vscode-aml/snippets.json create mode 100644 extensions/vscode-aml/syntaxes/aml.tmLanguage.json diff --git a/extensions/vscode-aml/DEVELOPMENT.md b/extensions/vscode-aml/DEVELOPMENT.md new file mode 100644 index 000000000..cdc3afb53 --- /dev/null +++ b/extensions/vscode-aml/DEVELOPMENT.md @@ -0,0 +1,9 @@ +# Developing this extension + +First, read the [VSCode extension development](https://code.visualstudio.com/api/get-started/your-first-extension). + +Specific parts: + +- [Language Configuration Guide](https://code.visualstudio.com/api/language-extensions/language-configuration-guide) +- [Syntax Highlight Guide](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide) +- [Snippet Guide](https://code.visualstudio.com/api/language-extensions/snippet-guide) diff --git a/extensions/vscode-aml/assets/icon-white.png b/extensions/vscode-aml/assets/icon-white.png new file mode 100644 index 0000000000000000000000000000000000000000..15a5c4a010ac4cd107091899705aea4fdde63e8e GIT binary patch literal 31773 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 diff --git a/extensions/vscode-aml/assets/icon.png b/extensions/vscode-aml/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..49622ad8beeffe570db79852da2b7b9eb151c546 GIT binary patch literal 31367 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 OkebRZ<+AIRA^#7Kk}Q<~ literal 0 HcmV?d00001 diff --git a/extensions/vscode-aml/assets/icon.svg b/extensions/vscode-aml/assets/icon.svg new file mode 100644 index 000000000..3835c6eee --- /dev/null +++ b/extensions/vscode-aml/assets/icon.svg @@ -0,0 +1 @@ + diff --git a/extensions/vscode-aml/language-configuration.json b/extensions/vscode-aml/language-configuration.json new file mode 100644 index 000000000..cdf2de54a --- /dev/null +++ b/extensions/vscode-aml/language-configuration.json @@ -0,0 +1,26 @@ +{ + "comments": { + "lineComment": "#" + }, + "brackets": [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + "autoClosingPairs": [ + { "open": "{", "close": "}" }, + { "open": "[", "close": "]" }, + { "open": "(", "close": ")" }, + { "open": "\"", "close": "\"", "notIn": ["string"] }, + { "open": "'", "close": "'", "notIn": ["string", "comment"] }, + { "open": "`", "close": "`", "notIn": ["string", "comment"] } + ], + "surroundingPairs": [ + ["{", "}"], + ["[", "]"], + ["(", ")"], + ["\"", "\""], + ["'", "'"], + ["`", "`"] + ] +} diff --git a/extensions/vscode-aml/package.json b/extensions/vscode-aml/package.json index 5427609f3..9ced6a6c8 100644 --- a/extensions/vscode-aml/package.json +++ b/extensions/vscode-aml/package.json @@ -10,8 +10,7 @@ }, "categories": [ "Programming Languages", - "Snippets", - "Other" + "Snippets" ], "repository": { "type": "git", @@ -21,12 +20,42 @@ "activationEvents": [], "browser": "./dist/web/extension.js", "contributes": { - "commands": [ - { - "command": "aml-web.helloWorld", - "title": "Hello World" - } - ] + "languages": [{ + "id": "aml", + "aliases": ["AML", "aml", "Azimutt Markup Language"], + "extensions": [".aml"], + "icon": {"dark": "./assets/icon.svg", "light": "./assets/icon.svg"}, + "configuration": "./language-configuration.json" + }], + "grammars": [{ + "language": "aml", + "scopeName": "source.aml", + "path": "./syntaxes/aml.tmLanguage.json" + }], + "snippets": [{ + "language": "aml", + "path": "./snippets.json" + }], + "commands": [{ + "command": "vscode-aml.fromJson", + "category": "AML", + "title": "convert JSON to AML" + }, { + "command": "vscode-aml.fromSQL", + "category": "AML", + "title": "convert SQL to AML" + }, { + "command": "vscode-aml.convert", + "category": "AML", + "title": "convert AML to" + }], + "menus": { + "commandPalette": [ + {"command": "vscode-aml.fromJson", "when": "editorLangId == json"}, + {"command": "vscode-aml.fromSQL", "when": "editorLangId == sql"}, + {"command": "vscode-aml.convert", "when": "editorLangId == aml"} + ] + } }, "scripts": { "test": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. --extensionTestsPath=dist/web/test/suite/extensionTests.js", diff --git a/extensions/vscode-aml/resources/schema.aml b/extensions/vscode-aml/resources/schema.aml new file mode 100644 index 000000000..7d41c61fe --- /dev/null +++ b/extensions/vscode-aml/resources/schema.aml @@ -0,0 +1,9 @@ +users # store users + id int pk + name varchar index=user_name_idx + +posts + id int pk + title varchar check(`length(title) > 10`) + content text | allow markdown + author int -> users(id) diff --git a/extensions/vscode-aml/resources/schema.json b/extensions/vscode-aml/resources/schema.json new file mode 100644 index 000000000..f2cdf9bbc --- /dev/null +++ b/extensions/vscode-aml/resources/schema.json @@ -0,0 +1,26 @@ +{ + "entities": [ + { + "name": "users", + "attrs": [ + {"name": "id", "type": "int"}, + {"name": "name", "type": "varchar"} + ], + "pk": {"attrs": [["id"]]}, + "indexes": [{"attrs": [["name"]]}] + }, + { + "name": "posts", + "attrs": [ + {"name": "id", "type": "int"}, + {"name": "title", "type": "varchar"}, + {"name": "content", "type": "text"}, + {"name": "author", "type": "int"} + ], + "pk": {"attrs": [["id"]]} + } + ], + "relations": [ + {"src": {"entity": "posts", "attrs": [["author"]]}, "ref": {"entity": "users", "attrs": [["id"]]}} + ] +} diff --git a/extensions/vscode-aml/resources/schema.sql b/extensions/vscode-aml/resources/schema.sql new file mode 100644 index 000000000..bc0e25f81 --- /dev/null +++ b/extensions/vscode-aml/resources/schema.sql @@ -0,0 +1,11 @@ +CREATE TABLE users ( + id SERIAL PRIMARY KEY, + name VARCHAR +); + +CREATE TABLE posts ( + id SERIAL PRIMARY KEY, + title VARCHAR, + content TEXT, + author INT REFERENCES users(id) +); diff --git a/extensions/vscode-aml/snippets.json b/extensions/vscode-aml/snippets.json new file mode 100644 index 000000000..5398b12c8 --- /dev/null +++ b/extensions/vscode-aml/snippets.json @@ -0,0 +1,47 @@ +{ + "Primary key": { + "prefix": "id", + "body": ["id ${1|uuid,int,bigint|} pk\n"], + "description": "A Primary Key column" + }, + "Many to one": { + "prefix": ["fk", "->"], + "body": ["-> ${1:entity}(${2:attribute})$0"] + }, + "One to one": { + "prefix": ["fk", "--"], + "body": ["-- ${1:entity}(${2:attribute})$0"] + }, + "Many to many": { + "prefix": ["fk", "<>", "><"], + "body": ["<> ${1:entity}(${2:attribute})$0"] + }, + "Created At": { + "prefix": "created_at", + "body": ["created_at ${1:timestamp}\n"] + }, + "Updated At": { + "prefix": "updated_at", + "body": ["updated_at ${1:timestamp}\n"] + }, + "Timestamps": { + "prefix": "timestamps", + "body": ["created_at ${1:timestamp}", "updated_at ${1:timestamp}\n"] + }, + "Deleted At": { + "prefix": "deleted_at", + "body": ["deleted_at ${1:timestamp} nullable\n"] + }, + "Created By": { + "prefix": "created_by", + "body": ["created_by -> ${1:users}(id)\n"] + }, + "Updated By": { + "prefix": "updated_by", + "body": ["updated_by -> ${1:users}(id)\n"] + }, + "Deleted By": { + "prefix": "deleted_by", + "body": ["deleted_by nullable -> ${1:users}(id)\n"] + } +} diff --git a/extensions/vscode-aml/src/web/extension.ts b/extensions/vscode-aml/src/web/extension.ts index 3d69aae16..2caf10535 100644 --- a/extensions/vscode-aml/src/web/extension.ts +++ b/extensions/vscode-aml/src/web/extension.ts @@ -2,25 +2,20 @@ // Import the module and reference it with the alias vscode in your code below import * as vscode from 'vscode'; -// This method is called when your extension is activated -// Your extension is activated the very first time the command is executed export function activate(context: vscode.ExtensionContext) { + const fromJson = vscode.commands.registerCommand('vscode-aml.fromJson', () => { + vscode.window.showInformationMessage('Convert JSON to AML') + }) + const fromSQL = vscode.commands.registerCommand('vscode-aml.fromSQL', () => { + vscode.window.showInformationMessage('Convert SQL to AML') + }) + const convert = vscode.commands.registerCommand('vscode-aml.convert', () => { + vscode.window.showInformationMessage('Convert AML') + }) - // Use the console to output diagnostic information (console.log) and errors (console.error) - // This line of code will only be executed once when your extension is activated - console.log('Congratulations, your extension "aml-web" is now active in the web extension host!'); - - // The command has been defined in the package.json file - // Now provide the implementation of the command with registerCommand - // The commandId parameter must match the command field in package.json - const disposable = vscode.commands.registerCommand('aml-web.helloWorld', () => { - // The code you place here will be executed every time your command is executed - - // Display a message box to the user - vscode.window.showInformationMessage('Hello World from AML-web in a web extension host!'); - }); - - context.subscriptions.push(disposable); + context.subscriptions.push(fromJson) + context.subscriptions.push(fromSQL) + context.subscriptions.push(convert) } // This method is called when your extension is deactivated diff --git a/extensions/vscode-aml/syntaxes/aml.tmLanguage.json b/extensions/vscode-aml/syntaxes/aml.tmLanguage.json new file mode 100644 index 000000000..6e687e307 --- /dev/null +++ b/extensions/vscode-aml/syntaxes/aml.tmLanguage.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "AML", + "scopeName": "source.aml", + "patterns": [ + {"include": "#entity"}, + {"include": "#attribute"}, + {"include": "#type"}, + {"include": "#constraint"}, + {"include": "#expression"}, + {"include": "#relation"}, + {"include": "#doc"}, + {"include": "#comment"} + ], + "repository": { + "entity": {"patterns": [{"name": "entity.function.aml", "match": "^[a-zA-Z_][a-zA-Z0-9_#]*"}]}, + "attribute": {"patterns": [{"name": "variable.parameter.aml", "match": "^ +[a-zA-Z_][a-zA-Z0-9_#]*"}]}, + "type": {"patterns": [{"name": "keyword.aml", "match": "\\b(int|varchar|text|uuid|timestamp)\\b"}]}, + "constraint": {"patterns": [{"name": "keyword.control.aml", "match": "\\b(pk|index|unique|check|rel|type)\\b"}]}, + "expression": {"patterns": [{"name": "string.interpolated.aml", "match": "`[^`]*`"}]}, + "relation": {"patterns": [{"name": "keyword.control.aml", "match": "[-<>]{2}"}]}, + "doc": {"patterns": [{"name": "comment.documentation.aml", "match": "\\|[^#]*"}]}, + "comment": {"patterns": [{"name": "comment.line.aml", "match": "#.*"}]} + } +} From a167232d69065f629e9843166f4228442bd58fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Sat, 23 Nov 2024 09:10:34 +0100 Subject: [PATCH 05/20] Improve syntax highllight --- extensions/vscode-aml/package.json | 2 +- extensions/vscode-aml/resources/schema.aml | 51 +++++++++-- extensions/vscode-aml/resources/schema.json | 84 +++++++++++++++++-- extensions/vscode-aml/resources/schema.sql | 56 +++++++++++-- extensions/vscode-aml/snippets.json | 6 +- .../vscode-aml/syntaxes/aml.tmLanguage.json | 12 +-- libs/aml/src/extensions/monaco.ts | 2 +- 7 files changed, 183 insertions(+), 30 deletions(-) diff --git a/extensions/vscode-aml/package.json b/extensions/vscode-aml/package.json index 9ced6a6c8..eb0d73681 100644 --- a/extensions/vscode-aml/package.json +++ b/extensions/vscode-aml/package.json @@ -1,5 +1,5 @@ { - "name": "@azimutt/vscode-aml", + "name": "vscode-aml", "displayName": "AML - Fast database design", "description": "Language support for Azimutt Markup Language (AML)", "icon": "assets/icon.png", diff --git a/extensions/vscode-aml/resources/schema.aml b/extensions/vscode-aml/resources/schema.aml index 7d41c61fe..e0ecccc5e 100644 --- a/extensions/vscode-aml/resources/schema.aml +++ b/extensions/vscode-aml/resources/schema.aml @@ -1,9 +1,50 @@ -users # store users - id int pk - name varchar index=user_name_idx +type auth_kind (password, google, twitter, github) -posts - id int pk +users as u {color: blue, tags: [pii]} + id int pk {autoIncrement} + name varchar(64) index=user_name_idx + email varchar(256) unique + auth auth_kind + settings json nullable + theme theme(light, dark) + last_page string | url of the last visited page + created_at timestamp=`now()` + updated_at timestamp=`now()` + deleted_at timestamp nullable + +# CMS tables + +cms.posts + id int pk {autoIncrement} title varchar check(`length(title) > 10`) content text | allow markdown + status post_status(draft, published, archived)=draft author int -> users(id) + tags "varchar[]" + created_at timestamp=`now()` + created_by -> users(id) + updated_at timestamp=`now()` + updated_by -> users(id) + +cms.comments + id int pk {autoIncrement} + post_id int -> cms.posts(id) + content text + created_at timestamp=`now()` + created_by -> users(id) + updated_at timestamp=`now()` + updated_by -> users(id) + +# Tracking tables + +tracking.events + id uuid pk + name varchar + payload json nullable + item_kind event_item(users, posts, comments) nullable + item_id int nullable + created_at timestamp=`now()` + +rel tracking.events(item_id) -item_kind=users> users(id) # polymorphic relation +rel tracking.events(item_id) -item_kind=posts> cms.posts(id) +rel tracking.events(item_id) -item_kind=comments> cms.comments(id) diff --git a/extensions/vscode-aml/resources/schema.json b/extensions/vscode-aml/resources/schema.json index f2cdf9bbc..e19813f89 100644 --- a/extensions/vscode-aml/resources/schema.json +++ b/extensions/vscode-aml/resources/schema.json @@ -3,24 +3,94 @@ { "name": "users", "attrs": [ - {"name": "id", "type": "int"}, - {"name": "name", "type": "varchar"} + {"name": "id", "type": "int", "extra": {"autoIncrement": null}}, + {"name": "name", "type": "varchar(64)"}, + {"name": "email", "type": "varchar(256)"}, + {"name": "auth", "type": "auth_kind"}, + {"name": "settings", "type": "json", "null": true, "attrs": [ + {"name": "theme", "type": "theme"}, + {"name": "last_page", "type": "string", "doc": "url of the last visited page"} + ]}, + {"name": "created_at", "type": "timestamp", "default": "`now()`"}, + {"name": "updated_at", "type": "timestamp", "default": "`now()`"}, + {"name": "deleted_at", "type": "timestamp", "null": true} ], "pk": {"attrs": [["id"]]}, - "indexes": [{"attrs": [["name"]]}] + "indexes": [ + {"attrs": [["email"]], "unique": true}, + {"name": "user_name_idx", "attrs": [["name"]]} + ], + "extra": {"color": "blue", "tags": ["pii"], "alias": "u"} }, { + "schema": "cms", "name": "posts", "attrs": [ - {"name": "id", "type": "int"}, + {"name": "id", "type": "int", "extra": {"autoIncrement": null}}, {"name": "title", "type": "varchar"}, + {"name": "content", "type": "text", "doc": "allow markdown"}, + {"name": "status", "type": "post_status", "default": "draft"}, + {"name": "author", "type": "int"}, + {"name": "tags", "type": "varchar[]"}, + {"name": "created_at", "type": "timestamp", "default": "`now()`"}, + {"name": "created_by", "type": "unknown"}, + {"name": "updated_at", "type": "timestamp", "default": "`now()`"}, + {"name": "updated_by", "type": "unknown"} + ], + "pk": {"attrs": [["id"]]}, + "checks": [ + {"attrs": [["title"]], "predicate": "length(title) > 10"} + ] + }, + { + "schema": "cms", + "name": "comments", + "attrs": [ + {"name": "id", "type": "int", "extra": {"autoIncrement": null}}, + {"name": "post_id", "type": "int"}, {"name": "content", "type": "text"}, - {"name": "author", "type": "int"} + {"name": "created_at", "type": "timestamp", "default": "`now()`"}, + {"name": "created_by", "type": "unknown"}, + {"name": "updated_at", "type": "timestamp", "default": "`now()`"}, + {"name": "updated_by", "type": "unknown"} + ], + "pk": {"attrs": [["id"]]} + }, + { + "schema": "tracking", + "name": "events", + "attrs": [ + {"name": "id", "type": "uuid"}, + {"name": "name", "type": "varchar"}, + {"name": "payload", "type": "json", "null": true}, + {"name": "item_kind", "type": "event_item", "null": true}, + {"name": "item_id", "type": "int", "null": true}, + {"name": "created_at", "type": "timestamp", "default": "`now()`"} ], "pk": {"attrs": [["id"]]} } ], "relations": [ - {"src": {"entity": "posts", "attrs": [["author"]]}, "ref": {"entity": "users", "attrs": [["id"]]}} - ] + {"src": {"schema": "cms", "entity": "posts", "attrs": [["author"]]}, "ref": {"entity": "users", "attrs": [["id"]]}, "extra": {"inline": true}}, + {"src": {"schema": "cms", "entity": "posts", "attrs": [["created_by"]]}, "ref": {"entity": "users", "attrs": [["id"]]}, "extra": {"inline": true}}, + {"src": {"schema": "cms", "entity": "posts", "attrs": [["updated_by"]]}, "ref": {"entity": "users", "attrs": [["id"]]}, "extra": {"inline": true}}, + {"src": {"schema": "cms", "entity": "comments", "attrs": [["post_id"]]}, "ref": {"schema": "cms", "entity": "posts", "attrs": [["id"]]}, "extra": {"inline": true}}, + {"src": {"schema": "cms", "entity": "comments", "attrs": [["created_by"]]}, "ref": {"entity": "users", "attrs": [["id"]]}, "extra": {"inline": true}}, + {"src": {"schema": "cms", "entity": "comments", "attrs": [["updated_by"]]}, "ref": {"entity": "users", "attrs": [["id"]]}, "extra": {"inline": true}}, + {"src": {"schema": "tracking", "entity": "events", "attrs": [["item_id"]]}, "ref": {"entity": "users", "attrs": [["id"]]}, "polymorphic": {"attribute": ["item_kind"], "value": "users"}, "extra": {"comment": "polymorphic relation"}}, + {"src": {"schema": "tracking", "entity": "events", "attrs": [["item_id"]]}, "ref": {"schema": "cms", "entity": "posts", "attrs": [["id"]]}, "polymorphic": {"attribute": ["item_kind"], "value": "posts"}}, + {"src": {"schema": "tracking", "entity": "events", "attrs": [["item_id"]]}, "ref": {"schema": "cms", "entity": "comments", "attrs": [["id"]]}, "polymorphic": {"attribute": ["item_kind"], "value": "comments"}} + ], + "types": [ + {"name": "auth_kind", "values": ["password", "google", "twitter", "github"]}, + {"name": "theme", "values": ["light", "dark"], "extra": {"inline": true}}, + {"schema": "cms", "name": "post_status", "values": ["draft", "published", "archived"], "extra": {"inline": true}}, + {"schema": "tracking", "name": "event_item", "values": ["users", "posts", "comments"], "extra": {"inline": true}} + ], + "extra": { + "comments": [ + {"line": 15, "comment": "CMS tables"}, + {"line": 39, "comment": "Tracking tables"} + ] + } } diff --git a/extensions/vscode-aml/resources/schema.sql b/extensions/vscode-aml/resources/schema.sql index bc0e25f81..eb4a7709c 100644 --- a/extensions/vscode-aml/resources/schema.sql +++ b/extensions/vscode-aml/resources/schema.sql @@ -1,11 +1,53 @@ +CREATE TYPE auth_kind AS ENUM ('password', 'google', 'twitter', 'github'); +CREATE TYPE theme AS ENUM ('light', 'dark'); +CREATE TYPE cms.post_status AS ENUM ('draft', 'published', 'archived'); +CREATE TYPE tracking.event_item AS ENUM ('users', 'posts', 'comments'); + CREATE TABLE users ( - id SERIAL PRIMARY KEY, - name VARCHAR + id int PRIMARY KEY, + name varchar(64) NOT NULL, + email varchar(256) NOT NULL UNIQUE, + auth auth_kind NOT NULL, + settings json, + created_at timestamp NOT NULL DEFAULT now(), + updated_at timestamp NOT NULL DEFAULT now(), + deleted_at timestamp +); +CREATE INDEX user_name_idx ON users(name); + +-- CMS tables + +CREATE TABLE cms.posts ( + id int PRIMARY KEY, + title varchar NOT NULL CHECK (length(title) > 10), + content text NOT NULL, + status post_status NOT NULL DEFAULT 'draft', + author int NOT NULL REFERENCES users(id), + tags varchar[] NOT NULL, + created_at timestamp NOT NULL DEFAULT now(), + created_by unknown NOT NULL REFERENCES users(id), + updated_at timestamp NOT NULL DEFAULT now(), + updated_by unknown NOT NULL REFERENCES users(id) ); +COMMENT ON COLUMN cms.posts.content IS 'allow markdown'; + +CREATE TABLE cms.comments ( + id int PRIMARY KEY, + post_id int NOT NULL REFERENCES cms.posts(id), + content text NOT NULL, + created_at timestamp NOT NULL DEFAULT now(), + created_by unknown NOT NULL REFERENCES users(id), + updated_at timestamp NOT NULL DEFAULT now(), + updated_by unknown NOT NULL REFERENCES users(id) +); + +-- Tracking tables -CREATE TABLE posts ( - id SERIAL PRIMARY KEY, - title VARCHAR, - content TEXT, - author INT REFERENCES users(id) +CREATE TABLE tracking.events ( + id uuid PRIMARY KEY, + name varchar NOT NULL, + payload json, + item_kind event_item, + item_id int, -- references: users.id (item_kind='users'), cms.posts.id (item_kind='posts') or cms.comments.id (item_kind='comments') + created_at timestamp NOT NULL DEFAULT now() ); diff --git a/extensions/vscode-aml/snippets.json b/extensions/vscode-aml/snippets.json index 5398b12c8..b99ab13bf 100644 --- a/extensions/vscode-aml/snippets.json +++ b/extensions/vscode-aml/snippets.json @@ -18,15 +18,15 @@ }, "Created At": { "prefix": "created_at", - "body": ["created_at ${1:timestamp}\n"] + "body": ["created_at ${1:timestamp}=`${2:now()}`\n"] }, "Updated At": { "prefix": "updated_at", - "body": ["updated_at ${1:timestamp}\n"] + "body": ["updated_at ${1:timestamp}=`${2:now()}`\n"] }, "Timestamps": { "prefix": "timestamps", - "body": ["created_at ${1:timestamp}", "updated_at ${1:timestamp}\n"] + "body": ["created_at ${1:timestamp}=`${2:now()}`", "updated_at ${1:timestamp}=`${2:now()}`\n"] }, "Deleted At": { "prefix": "deleted_at", diff --git a/extensions/vscode-aml/syntaxes/aml.tmLanguage.json b/extensions/vscode-aml/syntaxes/aml.tmLanguage.json index 6e687e307..4df655d53 100644 --- a/extensions/vscode-aml/syntaxes/aml.tmLanguage.json +++ b/extensions/vscode-aml/syntaxes/aml.tmLanguage.json @@ -6,20 +6,20 @@ {"include": "#entity"}, {"include": "#attribute"}, {"include": "#type"}, - {"include": "#constraint"}, + {"include": "#keyword"}, {"include": "#expression"}, {"include": "#relation"}, {"include": "#doc"}, {"include": "#comment"} ], "repository": { - "entity": {"patterns": [{"name": "entity.function.aml", "match": "^[a-zA-Z_][a-zA-Z0-9_#]*"}]}, - "attribute": {"patterns": [{"name": "variable.parameter.aml", "match": "^ +[a-zA-Z_][a-zA-Z0-9_#]*"}]}, - "type": {"patterns": [{"name": "keyword.aml", "match": "\\b(int|varchar|text|uuid|timestamp)\\b"}]}, - "constraint": {"patterns": [{"name": "keyword.control.aml", "match": "\\b(pk|index|unique|check|rel|type)\\b"}]}, + "entity": {"patterns": [{"name": "entity.name.type.class.aml", "match": "^[a-zA-Z_][a-zA-Z0-9_#]*"}]}, + "attribute": {"patterns": [{"name": "variable.other.property.aml", "match": "^ +[a-zA-Z_][a-zA-Z0-9_#]*"}]}, + "type": {"patterns": [{"name": "entity.name.type.aml", "match": "\\b(uuid|(var|n)?char2?|character( +varying)?|(tiny|medium|long|ci)?text|(tiny|small|big)?int(eger)?(\\d+)?|numeric|float|double( +precision)?|bool(ean)?|timestamp( +with(out)? +time +zone)?|date(time)?|time( +with(out)? +time +zone)?|interval|json|string|number)\\b"}]}, + "keyword": {"patterns": [{"name": "keyword.control.aml", "match": "\\b(namespace|nullable|pk|index|unique|check|fk|rel|type)\\b"}]}, "expression": {"patterns": [{"name": "string.interpolated.aml", "match": "`[^`]*`"}]}, "relation": {"patterns": [{"name": "keyword.control.aml", "match": "[-<>]{2}"}]}, - "doc": {"patterns": [{"name": "comment.documentation.aml", "match": "\\|[^#]*"}]}, + "doc": {"patterns": [{"name": "comment.documentation.aml", "match": "\\|[^#\\n]*"}]}, "comment": {"patterns": [{"name": "comment.line.aml", "match": "#.*"}]} } } diff --git a/libs/aml/src/extensions/monaco.ts b/libs/aml/src/extensions/monaco.ts index 0e72651ad..504552a54 100644 --- a/libs/aml/src/extensions/monaco.ts +++ b/libs/aml/src/extensions/monaco.ts @@ -55,7 +55,7 @@ import { // keep Regex in sync with backend/assets/js/aml.hljs.ts export const entityRegex = /^[a-zA-Z_][a-zA-Z0-9_#]*/ export const attributeNameRegex = /^ +[a-zA-Z_][a-zA-Z0-9_#]*/ -export const attributeTypeRegex = /\b(uuid|(var|n)?char2?|character( varying)?|(tiny|medium|long|ci)?text|(tiny|small|big)?int(eger)?(\d+)?|numeric|float|double( precision)?|bool(ean)?|timestamp( with(out)? time zone)?|date(time)?|time( with(out)? time zone)?|interval|json|string|number)\b/ +export const attributeTypeRegex = /\b(uuid|(var|n)?char2?|character( +varying)?|(tiny|medium|long|ci)?text|(tiny|small|big)?int(eger)?(\d+)?|numeric|float|double( +precision)?|bool(ean)?|timestamp( +with(out)? +time +zone)?|date(time)?|time( +with(out)? +time +zone)?|interval|json|string|number)\b/ export const keywordRegex = /\b(namespace|nullable|pk|index|unique|check|fk|rel|type)\b/ export const notesRegex = /\|[^#\n]*/ export const commentRegex = /#.*/ From c1a2e339e2f6ee18e011d6714d6cd3e0a55d734a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Sat, 23 Nov 2024 16:10:03 +0100 Subject: [PATCH 06/20] Add converters --- extensions/vscode-aml/eslint.config.mjs | 2 +- extensions/vscode-aml/package.json | 96 +++++++++----- extensions/vscode-aml/src/web/extension.ts | 144 ++++++++++++++++++--- pnpm-lock.yaml | 32 ++++- 4 files changed, 220 insertions(+), 54 deletions(-) diff --git a/extensions/vscode-aml/eslint.config.mjs b/extensions/vscode-aml/eslint.config.mjs index 40e4769c6..d0be3072f 100644 --- a/extensions/vscode-aml/eslint.config.mjs +++ b/extensions/vscode-aml/eslint.config.mjs @@ -23,6 +23,6 @@ export default [{ curly: "warn", eqeqeq: "warn", "no-throw-literal": "warn", - semi: "warn", + // semi: "warn", }, }]; diff --git a/extensions/vscode-aml/package.json b/extensions/vscode-aml/package.json index eb0d73681..aaf3c746a 100644 --- a/extensions/vscode-aml/package.json +++ b/extensions/vscode-aml/package.json @@ -20,40 +20,68 @@ "activationEvents": [], "browser": "./dist/web/extension.js", "contributes": { - "languages": [{ - "id": "aml", - "aliases": ["AML", "aml", "Azimutt Markup Language"], - "extensions": [".aml"], - "icon": {"dark": "./assets/icon.svg", "light": "./assets/icon.svg"}, - "configuration": "./language-configuration.json" - }], - "grammars": [{ - "language": "aml", - "scopeName": "source.aml", - "path": "./syntaxes/aml.tmLanguage.json" - }], - "snippets": [{ - "language": "aml", - "path": "./snippets.json" - }], - "commands": [{ - "command": "vscode-aml.fromJson", - "category": "AML", - "title": "convert JSON to AML" - }, { - "command": "vscode-aml.fromSQL", - "category": "AML", - "title": "convert SQL to AML" - }, { - "command": "vscode-aml.convert", - "category": "AML", - "title": "convert AML to" - }], + "languages": [ + { + "id": "aml", + "aliases": [ + "AML", + "aml", + "Azimutt Markup Language" + ], + "extensions": [ + ".aml" + ], + "icon": { + "dark": "./assets/icon.svg", + "light": "./assets/icon.svg" + }, + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "aml", + "scopeName": "source.aml", + "path": "./syntaxes/aml.tmLanguage.json" + } + ], + "snippets": [ + { + "language": "aml", + "path": "./snippets.json" + } + ], + "commands": [ + { + "command": "vscode-aml.fromJson", + "category": "AML", + "title": "convert JSON to AML" + }, + { + "command": "vscode-aml.fromSQL", + "category": "AML", + "title": "convert SQL to AML" + }, + { + "command": "vscode-aml.convert", + "category": "AML", + "title": "convert AML to" + } + ], "menus": { "commandPalette": [ - {"command": "vscode-aml.fromJson", "when": "editorLangId == json"}, - {"command": "vscode-aml.fromSQL", "when": "editorLangId == sql"}, - {"command": "vscode-aml.convert", "when": "editorLangId == aml"} + { + "command": "vscode-aml.fromJson", + "when": "editorLangId == json" + }, + { + "command": "vscode-aml.fromSQL", + "when": "editorLangId == sql" + }, + { + "command": "vscode-aml.convert", + "when": "editorLangId == aml" + } ] } }, @@ -71,7 +99,9 @@ "run-in-browser": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. ." }, "dependencies": { - "@azimutt/aml": "^0.1.8" + "@azimutt/aml": "^0.1.8", + "@azimutt/models": "^0.1.16", + "@azimutt/parser-sql": "^0.1.3" }, "devDependencies": { "@esbuild-plugins/node-globals-polyfill": "^0.2.3", diff --git a/extensions/vscode-aml/src/web/extension.ts b/extensions/vscode-aml/src/web/extension.ts index 2caf10535..04155a0d6 100644 --- a/extensions/vscode-aml/src/web/extension.ts +++ b/extensions/vscode-aml/src/web/extension.ts @@ -1,22 +1,128 @@ -// The module 'vscode' contains the VS Code extensibility API -// Import the module and reference it with the alias vscode in your code below -import * as vscode from 'vscode'; +import vscode, {TextDocument, TextEditor, TextEditorEdit} from "vscode"; +import {ParserError, ParserErrorLevel} from "@azimutt/models"; +import {generateSql, parseSql} from "@azimutt/parser-sql"; +import { + Database, + generateAml, + generateDot, + generateJsonDatabase, + generateMarkdown, + generateMermaid, + parseAml, + parseJsonDatabase, + ParserResult +} from "@azimutt/aml"; export function activate(context: vscode.ExtensionContext) { - const fromJson = vscode.commands.registerCommand('vscode-aml.fromJson', () => { - vscode.window.showInformationMessage('Convert JSON to AML') - }) - const fromSQL = vscode.commands.registerCommand('vscode-aml.fromSQL', () => { - vscode.window.showInformationMessage('Convert SQL to AML') - }) - const convert = vscode.commands.registerCommand('vscode-aml.convert', () => { - vscode.window.showInformationMessage('Convert AML') - }) - - context.subscriptions.push(fromJson) - context.subscriptions.push(fromSQL) - context.subscriptions.push(convert) -} - -// This method is called when your extension is deactivated + context.subscriptions.push( + vscode.commands.registerTextEditorCommand('vscode-aml.fromJson', (editor: TextEditor, edit: TextEditorEdit) => convertJson(editor, edit)), + vscode.commands.registerTextEditorCommand('vscode-aml.fromSQL', (editor: TextEditor, edit: TextEditorEdit) => convertSql(editor, edit)), + vscode.commands.registerTextEditorCommand('vscode-aml.convert', (editor: TextEditor, edit: TextEditorEdit) => convertAml(editor, edit)) + ) +} + export function deactivate() {} + +// private functions + +async function convertJson(editor: TextEditor, edit: TextEditorEdit): Promise { + if (editor.document.languageId !== 'json') { + vscode.window.showErrorMessage('Needs JSON file to convert it to AML.') + return + } + + const res = parseJsonDatabase(editor.document.getText()) + const error = formatErrors(res.errors) + const db = res.result + + if (db) { + error && vscode.window.showWarningMessage(error) + await openFile('aml', generateAml(db)) + } else { + error && vscode.window.showErrorMessage(error) + } +} + +async function convertSql(editor: TextEditor, edit: TextEditorEdit): Promise { + if (editor.document.languageId !== 'sql') { + vscode.window.showErrorMessage('Needs SQL file to convert it to AML.') + return + } + + const dialects = ['PostgreSQL'] + const dialect = await vscode.window.showQuickPick(dialects, {placeHolder: 'Select target'}) + if (dialect === 'PostgreSQL') { + await writeAml(parseSql(editor.document.getText(), 'postgres')) + } else { + vscode.window.showWarningMessage(`Unable to convert SQL to AML: unsupported ${dialect} dialect.`) + } +} + +async function writeAml(res: ParserResult): Promise { + const error = formatErrors(res.errors) + const db = res.result + if (db) { + error && vscode.window.showWarningMessage(error) + await openFile('aml', generateAml(db)) + } else { + error && vscode.window.showErrorMessage(error) + } +} + +async function convertAml(editor: TextEditor, edit: TextEditorEdit): Promise { + if (editor.document.languageId !== 'aml') { + vscode.window.showErrorMessage('Needs AML file to convert AML to another language.') + return + } + + const dialects = ['PostgreSQL', 'JSON', 'DOT', 'Mermaid', 'Markdown'] + const dialect = await vscode.window.showQuickPick(dialects, {placeHolder: 'Select target'}) + const res = parseAml(editor.document.getText()) + const error = formatErrors(res.errors) + const db = res.result + + if (db) { + error && vscode.window.showWarningMessage(error) + if (dialect === 'JSON') { + await openFile('json', generateJsonDatabase(db)) + } else if (dialect === 'DOT') { + await openFile('dot', generateDot(db)) + } else if (dialect === 'Mermaid') { + await openFile('mermaid', generateMermaid(db)) + } else if (dialect === 'Markdown') { + await openFile('markdown', generateMarkdown(db)) + } else if (dialect === 'PostgreSQL') { + await openFile('sql', generateSql(db, 'postgres')) + } else { + vscode.window.showWarningMessage(`Unable to convert AML to ${dialect}: unsupported dialect.`) + } + } else { + error && vscode.window.showErrorMessage(error) + } +} + +async function openFile(lang: string, content: string): Promise { + const doc: TextDocument = await vscode.workspace.openTextDocument({language: lang, content: content}) + await vscode.window.showTextDocument(doc) + return doc +} + +function formatErrors(errors: ParserError[] | undefined): string | undefined { + if (errors && errors.length > 1) { + return `Got ${errors.length} AML parsing issues:${errors.map(e => `\n- ${formatErrorLevel(e.level)} ${e.message}`).join('')}` + } else if (errors && errors.length === 1) { + const error = errors[0] + return `AML parsing ${error.level}: ${error.message}` + } else { + return undefined + } +} + +function formatErrorLevel(level: ParserErrorLevel): string { + switch (level) { + case 'error': return '[ERR] ' + case 'warning': return '[WARN]' + case 'info': return '[INFO]' + case 'hint': return '[HINT]' + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20b6546d6..a4c3cc1c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -305,6 +305,12 @@ importers: '@azimutt/aml': specifier: ^0.1.8 version: 0.1.8 + '@azimutt/models': + specifier: ^0.1.16 + version: 0.1.16 + '@azimutt/parser-sql': + specifier: ^0.1.3 + version: 0.1.3 devDependencies: '@esbuild-plugins/node-globals-polyfill': specifier: ^0.2.3 @@ -1369,6 +1375,12 @@ packages: '@azimutt/models@0.1.15': resolution: {integrity: sha512-Cog6HffVeKKPqx4KJE2iSYYy3ypE678cl2fIDDaeMsNHU8Agx6fXaOOOm9mj8MY1E7QANTIse2qFls9OXaB5Tg==} + '@azimutt/models@0.1.16': + resolution: {integrity: sha512-cW/ATuEb97Slivnehbq3UyjgTilYpsJpLJ5qkWgBZOI6ldbBld9179ywopz17XvhjVBiZu1NGEm/jDPBXV8xOw==} + + '@azimutt/parser-sql@0.1.3': + resolution: {integrity: sha512-whsNHlfTNhGMXgUGZpW5YbCOrulFHMRO2rmM3U91ME/pa8kuYEXQ1U3u/cs3ZvTyS5zdW5p0H+41Okuwq9dQ/A==} + '@azimutt/utils@0.1.6': resolution: {integrity: sha512-Qbe+78I1oseQUBJ82HbRK3OZKTiltStd+6bvnrvrnjWYMq739y86PDk4Jo5Ua8lT/i4jv9Gb5Ye584PuIXhXbw==} @@ -10439,7 +10451,7 @@ snapshots: '@azimutt/aml@0.1.8': dependencies: - '@azimutt/models': 0.1.15 + '@azimutt/models': 0.1.16 '@azimutt/utils': 0.1.6 chevrotain: 10.5.0 transitivePeerDependencies: @@ -10541,6 +10553,24 @@ snapshots: transitivePeerDependencies: - encoding + '@azimutt/models@0.1.16': + dependencies: + '@azimutt/utils': 0.1.6 + openai: 4.65.0(encoding@0.1.13)(zod@3.23.8) + zod: 3.23.8 + zod-to-json-schema: 3.23.3(zod@3.23.8) + transitivePeerDependencies: + - encoding + + '@azimutt/parser-sql@0.1.3': + dependencies: + '@azimutt/models': 0.1.16 + '@azimutt/utils': 0.1.6 + chevrotain: 10.5.0 + zod: 3.23.8 + transitivePeerDependencies: + - encoding + '@azimutt/utils@0.1.6': {} '@azure/abort-controller@2.1.2': From 7cccc9673b1501eb4e661e0f54286ed27731c468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Sat, 23 Nov 2024 18:18:15 +0100 Subject: [PATCH 07/20] Improve doc --- .gitignore | 2 +- backend/.gitignore | 1 + extensions/vscode-aml/.gitignore | 1 - extensions/vscode-aml/.vscode/extensions.json | 9 +++ extensions/vscode-aml/.vscode/launch.json | 38 +++++++++ extensions/vscode-aml/.vscode/settings.json | 11 +++ extensions/vscode-aml/.vscode/tasks.json | 54 +++++++++++++ extensions/vscode-aml/CHANGELOG.md | 9 ++- extensions/vscode-aml/DEVELOPMENT.md | 9 --- extensions/vscode-aml/README.md | 72 +++++++----------- extensions/vscode-aml/assets/screenshot.png | Bin 0 -> 136464 bytes extensions/vscode-aml/package.json | 9 ++- extensions/vscode-aml/tsconfig.json | 6 +- .../vscode-aml/vsc-extension-quickstart.md | 44 ----------- 14 files changed, 157 insertions(+), 108 deletions(-) create mode 100644 extensions/vscode-aml/.vscode/extensions.json create mode 100644 extensions/vscode-aml/.vscode/launch.json create mode 100644 extensions/vscode-aml/.vscode/settings.json create mode 100644 extensions/vscode-aml/.vscode/tasks.json delete mode 100644 extensions/vscode-aml/DEVELOPMENT.md create mode 100644 extensions/vscode-aml/assets/screenshot.png delete mode 100644 extensions/vscode-aml/vsc-extension-quickstart.md diff --git a/.gitignore b/.gitignore index d579f11fe..be88c43a7 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,6 @@ addon-manifest.json addon-manifest-prod.json addon-manifest-staging.json addon-clevercloud.json -.vscode/ +/.vscode charts/azimutt/charts/ charts/azimutt/Chart.lock diff --git a/backend/.gitignore b/backend/.gitignore index 45a9a8ce6..2f9e8bf92 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -35,3 +35,4 @@ npm-debug.log /priv/static/swagger*.json /assets/js/*.js /uploads +/.vscode diff --git a/extensions/vscode-aml/.gitignore b/extensions/vscode-aml/.gitignore index c4f24f4b8..de4d1f007 100644 --- a/extensions/vscode-aml/.gitignore +++ b/extensions/vscode-aml/.gitignore @@ -1,3 +1,2 @@ -.vscode dist node_modules diff --git a/extensions/vscode-aml/.vscode/extensions.json b/extensions/vscode-aml/.vscode/extensions.json new file mode 100644 index 000000000..5be3c32fb --- /dev/null +++ b/extensions/vscode-aml/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "dbaeumer.vscode-eslint", + "connor4312.esbuild-problem-matchers", + "ms-vscode.extension-test-runner" + ] +} diff --git a/extensions/vscode-aml/.vscode/launch.json b/extensions/vscode-aml/.vscode/launch.json new file mode 100644 index 000000000..a6abe6204 --- /dev/null +++ b/extensions/vscode-aml/.vscode/launch.json @@ -0,0 +1,38 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Web Extension ", + "type": "extensionHost", + "debugWebWorkerHost": true, + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionDevelopmentKind=web" + ], + "outFiles": [ + "${workspaceFolder}/dist/web/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + }, + { + "name": "Extension Tests", + "type": "extensionHost", + "debugWebWorkerHost": true, + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionDevelopmentKind=web", + "--extensionTestsPath=${workspaceFolder}/dist/web/test/suite/extensionTests" + ], + "outFiles": [ + "${workspaceFolder}/dist/web/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + } + ] +} diff --git a/extensions/vscode-aml/.vscode/settings.json b/extensions/vscode-aml/.vscode/settings.json new file mode 100644 index 000000000..e6109eee3 --- /dev/null +++ b/extensions/vscode-aml/.vscode/settings.json @@ -0,0 +1,11 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "dist": false // set this to true to hide the "dist" folder with the compiled JS files + }, + "search.exclude": { + "dist": true // set this to false to include "dist" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} diff --git a/extensions/vscode-aml/.vscode/tasks.json b/extensions/vscode-aml/.vscode/tasks.json new file mode 100644 index 000000000..fc326ca3f --- /dev/null +++ b/extensions/vscode-aml/.vscode/tasks.json @@ -0,0 +1,54 @@ +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format +{ + "version": "2.0.0", + "tasks": [ + { + "label": "watch-web", + "dependsOn": [ + "npm: watch-web:tsc", + "npm: watch-web:esbuild" + ], + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "npm", + "script": "watch-web:esbuild", + "group": "build", + "problemMatcher": "$esbuild-watch", + "isBackground": true, + "label": "npm: watch-web:esbuild", + "presentation": { + "group": "watch", + "reveal": "never" + } + }, + { + "type": "npm", + "script": "watch-web:tsc", + "group": "build", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "label": "npm: watch-web:tsc", + "presentation": { + "group": "watch", + "reveal": "never" + } + }, + { + "label": "compile", + "type": "npm", + "script": "compile-web", + "problemMatcher": [ + "$tsc", + "$esbuild" + ] + } + ] +} diff --git a/extensions/vscode-aml/CHANGELOG.md b/extensions/vscode-aml/CHANGELOG.md index 56cadccec..85af5dd4a 100644 --- a/extensions/vscode-aml/CHANGELOG.md +++ b/extensions/vscode-aml/CHANGELOG.md @@ -2,8 +2,13 @@ All notable changes to the "vscode-aml" extension will be documented in this file. -Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. +Check [Keep a Changelog](http://keepachangelog.com) for recommendations on how to structure this file. ## [Unreleased] -- Initial release +### Added + +- AML syntax highlighting +- AML snippets +- Command to convert AML to PostgreSQL, JSON, DOT, Mermaid and Markdown +- Command to convert SQL and JSON to AML diff --git a/extensions/vscode-aml/DEVELOPMENT.md b/extensions/vscode-aml/DEVELOPMENT.md deleted file mode 100644 index cdc3afb53..000000000 --- a/extensions/vscode-aml/DEVELOPMENT.md +++ /dev/null @@ -1,9 +0,0 @@ -# Developing this extension - -First, read the [VSCode extension development](https://code.visualstudio.com/api/get-started/your-first-extension). - -Specific parts: - -- [Language Configuration Guide](https://code.visualstudio.com/api/language-extensions/language-configuration-guide) -- [Syntax Highlight Guide](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide) -- [Snippet Guide](https://code.visualstudio.com/api/language-extensions/snippet-guide) diff --git a/extensions/vscode-aml/README.md b/extensions/vscode-aml/README.md index 662cbb50f..e00d46930 100644 --- a/extensions/vscode-aml/README.md +++ b/extensions/vscode-aml/README.md @@ -1,65 +1,49 @@ -# vscode-aml README +# AML Support for VS Code -This is the README for your extension "vscode-aml". After writing up a brief description, we recommend including the following sections. +[![](https://vsmarketplacebadges.dev/version/azimutt.vscode-aml.png)](https://marketplace.visualstudio.com/items?itemName=azimutt.vscode-aml) -## Features - -Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file. - -For example if there is an image subfolder under your extension project workspace: - -\!\[feature X\]\(images/feature-x.png\) - -> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow. - -## Requirements +This Visual Studio Code extension provides language support for [AML](https://azimutt.app/aml), an easy DSL to design database schemas. -If you have any requirements or dependencies, add a section describing those and how to install and configure them. +![AML in VS Code](./assets/screenshot.png) -## Extension Settings -Include if your extension adds any VS Code settings through the `contributes.configuration` extension point. - -For example: - -This extension contributes the following settings: - -* `myExtension.enable`: Enable/disable this extension. -* `myExtension.thing`: Set to `blah` to do something. - -## Known Issues +## Features -Calling out known issues can help limit users opening duplicate issues against your extension. +- syntax highlighting and snippets (`.aml` files) +- convert AML to PostgreSQL, JSON, DOT, Mermaid, Markdown (Command Palette) +- convert SQL and JSON to AML (Command Palette) -## Release Notes -Users appreciate release notes as you update your extension. +## Roadmap -### 1.0.0 +- Add parsing errors and auto-complete +- Add diagram preview & Open in Azimutt +- Add AML support in Markdown +- Connect to a database -Initial release of ... -### 1.0.1 +## Issues & Contributing -Fixed issue #. +If you have any issue or bug, please [create an issue](https://github.com/azimuttapp/azimutt/issues). -### 1.1.0 +If you want to improve this extension, feel free to reach out or submit a pull request. -Added features X, Y, and Z. ---- +## Development -## Working with Markdown +Here are some interesting VS Code documentation you may find helpful: -You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts: +- [VS Code extension get started](https://code.visualstudio.com/api/get-started/your-first-extension). +- [Language Configuration Guide](https://code.visualstudio.com/api/language-extensions/language-configuration-guide) +- [Syntax Highlight Guide](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide) +- [Snippet Guide](https://code.visualstudio.com/api/language-extensions/snippet-guide) -* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux). -* Toggle preview (`Shift+Cmd+V` on macOS or `Shift+Ctrl+V` on Windows and Linux). -* Press `Ctrl+Space` (Windows, Linux, macOS) to see a list of Markdown snippets. +Tips: -## For more information +- Debug extension via F5 (Run Web Extension) +- Relaunch the extension from the debug toolbar after changing code in `src/web/extension.ts` +- Reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes -* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown) -* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/) +## Publication -**Enjoy!** +[Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. diff --git a/extensions/vscode-aml/assets/screenshot.png b/extensions/vscode-aml/assets/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..be43c0968a0ebdf9b1c008263ff92f9ff77cf664 GIT binary patch literal 136464 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

    u1`a4@IHbx1vl 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 T5I)huR`95- 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

    ${aml}
    + +`; +} + async function openFile(lang: string, content: string): Promise { const doc: TextDocument = await vscode.workspace.openTextDocument({language: lang, content: content}) await vscode.window.showTextDocument(doc) @@ -124,5 +162,6 @@ function formatErrorLevel(level: ParserErrorLevel): string { case 'warning': return '[WARN]' case 'info': return '[INFO]' case 'hint': return '[HINT]' + default: return '[ERR] ' } } From 4c2cf927f627112301a13dadddfe2a4729ac24db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Sat, 23 Nov 2024 22:18:03 +0100 Subject: [PATCH 10/20] debug --- extensions/vscode-aml/package-lock.json | 23 ++++++++++++---------- extensions/vscode-aml/src/web/extension.ts | 1 + 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/extensions/vscode-aml/package-lock.json b/extensions/vscode-aml/package-lock.json index 2872d8bae..21ebc6de0 100644 --- a/extensions/vscode-aml/package-lock.json +++ b/extensions/vscode-aml/package-lock.json @@ -3147,12 +3147,15 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4754,18 +4757,18 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", - "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", + "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "gopd": "^1.0.1", + "which-builtin-type": "^1.1.4" }, "engines": { "node": ">= 0.4" diff --git a/extensions/vscode-aml/src/web/extension.ts b/extensions/vscode-aml/src/web/extension.ts index 50c101c85..7a9aa27fe 100644 --- a/extensions/vscode-aml/src/web/extension.ts +++ b/extensions/vscode-aml/src/web/extension.ts @@ -14,6 +14,7 @@ import { } from "@azimutt/aml"; export function activate(context: vscode.ExtensionContext) { + console.log('\n\n\nactivate\n\n\n') let previewPanel: WebviewPanel | undefined = undefined context.subscriptions.push( vscode.commands.registerTextEditorCommand('aml.fromJson', (editor: TextEditor, edit: TextEditorEdit) => convertJson(editor, edit)), From dd06016633bcffed7b61f37e2895b7eb424a922a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Sat, 23 Nov 2024 23:40:40 +0100 Subject: [PATCH 11/20] Refactor --- extensions/vscode-aml/src/web/extension.ts | 150 +++++++++++++-------- 1 file changed, 93 insertions(+), 57 deletions(-) diff --git a/extensions/vscode-aml/src/web/extension.ts b/extensions/vscode-aml/src/web/extension.ts index 7a9aa27fe..2b97a90bf 100644 --- a/extensions/vscode-aml/src/web/extension.ts +++ b/extensions/vscode-aml/src/web/extension.ts @@ -1,4 +1,11 @@ -import vscode, {TextDocument, TextEditor, TextEditorEdit, ViewColumn, WebviewPanel} from "vscode"; +import vscode, { + ExtensionContext, + TextDocument, + TextDocumentChangeEvent, + TextEditor, + ViewColumn, + WebviewPanel +} from "vscode"; import {ParserError, ParserErrorLevel} from "@azimutt/models"; import {generateSql, parseSql} from "@azimutt/parser-sql"; import { @@ -13,28 +20,15 @@ import { ParserResult } from "@azimutt/aml"; -export function activate(context: vscode.ExtensionContext) { +let previewPanel: WebviewPanel | undefined = undefined + +export function activate(context: ExtensionContext) { console.log('\n\n\nactivate\n\n\n') - let previewPanel: WebviewPanel | undefined = undefined context.subscriptions.push( - vscode.commands.registerTextEditorCommand('aml.fromJson', (editor: TextEditor, edit: TextEditorEdit) => convertJson(editor, edit)), - vscode.commands.registerTextEditorCommand('aml.fromSQL', (editor: TextEditor, edit: TextEditorEdit) => convertSql(editor, edit)), - vscode.commands.registerTextEditorCommand('aml.convert', (editor: TextEditor, edit: TextEditorEdit) => convertAml(editor, edit)), - vscode.commands.registerTextEditorCommand('aml.preview', (editor: TextEditor, edit: TextEditorEdit) => { - vscode.window.showInformationMessage('aml.preview called') - if (editor.document.languageId !== 'aml') { - vscode.window.showErrorMessage('Needs AML file to preview it.') - return - } - const viewColumn = editor.viewColumn ? editor.viewColumn + 1 : ViewColumn.Two - if (!previewPanel) { - previewPanel = vscode.window.createWebviewPanel('aml-preview', 'Preview AML', {viewColumn, preserveFocus: true}, {localResourceRoots: []}) - previewPanel.onDidDispose(() => previewPanel = undefined, null, context.subscriptions) - } - updateAmlPreview(editor.document, previewPanel, viewColumn) - // TODO: update preview when editor text changes or when editor changes to another aml (with debounce) - // vscode.window.onDidChangeActiveTextEditor((editor: TextEditor) => {}) - }) + vscode.commands.registerTextEditorCommand('aml.fromJson', (editor: TextEditor) => convertJsonToAml(editor)), + vscode.commands.registerTextEditorCommand('aml.fromSQL', (editor: TextEditor) => convertSqlToAml(editor)), + vscode.commands.registerTextEditorCommand('aml.convert', (editor: TextEditor) => convertAmlToDialect(editor)), + vscode.commands.registerTextEditorCommand('aml.preview', (editor: TextEditor) => previewAml(editor, context)) ) } @@ -42,25 +36,16 @@ export function deactivate() {} // private functions -async function convertJson(editor: TextEditor, edit: TextEditorEdit): Promise { +async function convertJsonToAml(editor: TextEditor): Promise { if (editor.document.languageId !== 'json') { vscode.window.showErrorMessage('Needs JSON file to convert it to AML.') return } - const res = parseJsonDatabase(editor.document.getText()) - const error = formatErrors(res.errors) - const db = res.result - - if (db) { - error && vscode.window.showWarningMessage(error) - await openFile('aml', generateAml(db)) - } else { - error && vscode.window.showErrorMessage(error) - } + await openFileResult(parseJsonDatabase(editor.document.getText()).map((db: Database) => ({lang: 'aml', content: generateAml(db)}))) } -async function convertSql(editor: TextEditor, edit: TextEditorEdit): Promise { +async function convertSqlToAml(editor: TextEditor): Promise { if (editor.document.languageId !== 'sql') { vscode.window.showErrorMessage('Needs SQL file to convert it to AML.') return @@ -69,24 +54,13 @@ async function convertSql(editor: TextEditor, edit: TextEditorEdit): Promise ({lang: 'aml', content: generateAml(db)}))) } else { vscode.window.showWarningMessage(`Unable to convert SQL to AML: unsupported ${dialect} dialect.`) } } -async function writeAml(res: ParserResult): Promise { - const error = formatErrors(res.errors) - const db = res.result - if (db) { - error && vscode.window.showWarningMessage(error) - await openFile('aml', generateAml(db)) - } else { - error && vscode.window.showErrorMessage(error) - } -} - -async function convertAml(editor: TextEditor, edit: TextEditorEdit): Promise { +async function convertAmlToDialect(editor: TextEditor): Promise { if (editor.document.languageId !== 'aml') { vscode.window.showErrorMessage('Needs AML file to convert AML to another language.') return @@ -118,16 +92,53 @@ async function convertAml(editor: TextEditor, edit: TextEditorEdit): Promise { + console.log('onDidOpenTextDocument', document.fileName) + if (document.languageId === 'aml' && previewPanel) { + updateAmlPreview(document, previewPanel) + } + }, null, context.subscriptions), + vscode.workspace.onDidChangeTextDocument((e: TextDocumentChangeEvent) => { + console.log('onDidChangeTextDocument', e.document.fileName) + if (e.document.languageId === 'aml' && previewPanel) { + updateAmlPreview(e.document, previewPanel) + } + }, null, context.subscriptions) + ] + previewPanel.onDidDispose(() => { + console.log('onDidDispose', previewPanel?.title) + previewPanel = undefined + subscriptions.map(s => s.dispose()) + }, null, context.subscriptions) } + updateAmlPreview(editor.document, previewPanel) } -function buildAmlPreview(aml: string): string { - return ` +const updateAmlPreview = debounce((document: TextDocument, panel: WebviewPanel) => updateAmlPreviewReal(document, panel), 300) +const updateAmlPreviewReal = (document: TextDocument, panel: WebviewPanel) => { + const html = buildAmlPreview(document.getText()) + if (html) { + panel.title = 'Preview ' + document.fileName + panel.webview.html = html + if (!panel.visible) {panel.reveal(ViewColumn.Beside, true)} + } +} + +function buildAmlPreview(aml: string): string | undefined { + const res = parseAml(aml) + if (res.result) { + const mermaid = generateMermaid(res.result) + // TODO: render mermaid as svg + return ` @@ -135,13 +146,27 @@ function buildAmlPreview(aml: string): string { AML preview -
    ${aml}
    +
    ${mermaid}
    -`; +` + } +} + +// utils functions + +async function openFileResult(res: ParserResult<{lang: string, content: string}>): Promise { + const error = formatErrors(res.errors) + const file = res.result + if (file) { + error && vscode.window.showWarningMessage(error) + return await openFile(file.lang, file.content) + } else { + error && vscode.window.showErrorMessage(error) + } } -async function openFile(lang: string, content: string): Promise { - const doc: TextDocument = await vscode.workspace.openTextDocument({language: lang, content: content}) +async function openFile(language: string, content: string): Promise { + const doc: TextDocument = await vscode.workspace.openTextDocument({language, content}) await vscode.window.showTextDocument(doc) return doc } @@ -166,3 +191,14 @@ function formatErrorLevel(level: ParserErrorLevel): string { default: return '[ERR] ' } } + +function debounce) => ReturnType>( + func: F, + delay: number +): (...args: Parameters) => void { + let timeout: NodeJS.Timeout + return (...args: Parameters): void => { + clearTimeout(timeout) + timeout = setTimeout(() => func(...args), delay) + } +} From f193b686f1311f70ab5b9088cf2d8db24b9096fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Mon, 25 Nov 2024 11:17:20 +0100 Subject: [PATCH 12/20] Remove Azimutt lib usage to fix build errors --- extensions/vscode-aml/package-lock.json | 53 ++++++++++++--- extensions/vscode-aml/package.json | 6 +- extensions/vscode-aml/src/web/extension.ts | 78 ++++++++++++++-------- 3 files changed, 99 insertions(+), 38 deletions(-) diff --git a/extensions/vscode-aml/package-lock.json b/extensions/vscode-aml/package-lock.json index 21ebc6de0..3648facf4 100644 --- a/extensions/vscode-aml/package-lock.json +++ b/extensions/vscode-aml/package-lock.json @@ -37,6 +37,7 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/@azimutt/aml/-/aml-0.1.8.tgz", "integrity": "sha512-gyNAkiW1TdaXA2rg9SpBWE2p1VUnPZIv1C1r+fSt4DlDVjcRnO4Q+9QpJZoqmVghu5Hqbd5c5ia+k/vAwufrkw==", + "license": "MIT", "dependencies": { "@azimutt/models": "^0.1.15", "@azimutt/utils": "^0.1.6", @@ -47,6 +48,7 @@ "version": "0.1.16", "resolved": "https://registry.npmjs.org/@azimutt/models/-/models-0.1.16.tgz", "integrity": "sha512-cW/ATuEb97Slivnehbq3UyjgTilYpsJpLJ5qkWgBZOI6ldbBld9179ywopz17XvhjVBiZu1NGEm/jDPBXV8xOw==", + "license": "MIT", "dependencies": { "@azimutt/utils": "^0.1.6", "openai": "4.65.0", @@ -58,6 +60,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@azimutt/parser-sql/-/parser-sql-0.1.3.tgz", "integrity": "sha512-whsNHlfTNhGMXgUGZpW5YbCOrulFHMRO2rmM3U91ME/pa8kuYEXQ1U3u/cs3ZvTyS5zdW5p0H+41Okuwq9dQ/A==", + "license": "MIT", "dependencies": { "@azimutt/models": "^0.1.16", "@azimutt/utils": "^0.1.6", @@ -68,12 +71,14 @@ "node_modules/@azimutt/utils": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@azimutt/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-Qbe+78I1oseQUBJ82HbRK3OZKTiltStd+6bvnrvrnjWYMq739y86PDk4Jo5Ua8lT/i4jv9Gb5Ye584PuIXhXbw==" + "integrity": "sha512-Qbe+78I1oseQUBJ82HbRK3OZKTiltStd+6bvnrvrnjWYMq739y86PDk4Jo5Ua8lT/i4jv9Gb5Ye584PuIXhXbw==", + "license": "MIT" }, "node_modules/@chevrotain/cst-dts-gen": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.5.0.tgz", "integrity": "sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==", + "license": "Apache-2.0", "dependencies": { "@chevrotain/gast": "10.5.0", "@chevrotain/types": "10.5.0", @@ -84,6 +89,7 @@ "version": "10.5.0", "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz", "integrity": "sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==", + "license": "Apache-2.0", "dependencies": { "@chevrotain/types": "10.5.0", "lodash": "4.17.21" @@ -92,12 +98,14 @@ "node_modules/@chevrotain/types": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.5.0.tgz", - "integrity": "sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==" + "integrity": "sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==", + "license": "Apache-2.0" }, "node_modules/@chevrotain/utils": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.5.0.tgz", - "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==" + "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==", + "license": "Apache-2.0" }, "node_modules/@esbuild-plugins/node-globals-polyfill": { "version": "0.2.3", @@ -819,6 +827,7 @@ "version": "18.19.65", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.65.tgz", "integrity": "sha512-Ay5BZuO1UkTmVHzZJNvZKw/E+iB3GQABb6kijEz89w2JrfhNA+M/ebp18pfz9Gqe9ywhMC8AA8yC01lZq48J+Q==", + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } @@ -827,6 +836,7 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "license": "MIT", "dependencies": { "@types/node": "*", "form-data": "^4.0.0" @@ -1073,6 +1083,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -1130,6 +1141,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "license": "MIT", "dependencies": { "humanize-ms": "^1.2.1" }, @@ -1262,7 +1274,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", @@ -1482,6 +1495,7 @@ "version": "10.5.0", "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.5.0.tgz", "integrity": "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==", + "license": "Apache-2.0", "dependencies": { "@chevrotain/cst-dts-gen": "10.5.0", "@chevrotain/gast": "10.5.0", @@ -1628,6 +1642,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1825,6 +1840,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -2306,6 +2322,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -2468,6 +2485,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -2480,12 +2498,14 @@ "node_modules/form-data-encoder": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", - "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "license": "MIT" }, "node_modules/formdata-node": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "4.0.0-beta.3" @@ -2912,6 +2932,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", "dependencies": { "ms": "^2.0.0" } @@ -3728,7 +3749,8 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -4018,6 +4040,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "engines": { "node": ">=10.5.0" } @@ -4026,6 +4049,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -4351,6 +4375,7 @@ "version": "4.65.0", "resolved": "https://registry.npmjs.org/openai/-/openai-4.65.0.tgz", "integrity": "sha512-LfA4KUBpH/8rA3vjCQ74LZtdK/8wx9W6Qxq8MHqEdImPsN1XPQ2ompIuJWkKS6kXt5Cs5i8Eb65IIo4M7U+yeQ==", + "license": "Apache-2.0", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -4780,7 +4805,8 @@ "node_modules/regexp-to-ast": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", - "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.3", @@ -5465,7 +5491,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, "node_modules/ts-api-utils": { "version": "1.4.0", @@ -5618,7 +5645,8 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" }, "node_modules/uri-js": { "version": "4.4.1", @@ -5677,6 +5705,7 @@ "version": "4.0.0-beta.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -5684,12 +5713,14 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -6030,6 +6061,7 @@ "version": "3.23.8", "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -6038,6 +6070,7 @@ "version": "3.23.3", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.3.tgz", "integrity": "sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==", + "license": "ISC", "peerDependencies": { "zod": "^3.23.3" } diff --git a/extensions/vscode-aml/package.json b/extensions/vscode-aml/package.json index 22f7faa83..664388aa6 100644 --- a/extensions/vscode-aml/package.json +++ b/extensions/vscode-aml/package.json @@ -23,7 +23,6 @@ "url": "https://github.com/azimuttapp/azimutt", "directory": "extensions/vscode-aml" }, - "type": "module", "activationEvents": [], "browser": "./dist/web/extension.js", "contributes": { @@ -59,6 +58,11 @@ } ], "commands": [ + { + "command": "aml.new", + "category": "AML", + "title": "New database schema" + }, { "command": "aml.fromJson", "category": "AML", diff --git a/extensions/vscode-aml/src/web/extension.ts b/extensions/vscode-aml/src/web/extension.ts index 2b97a90bf..13e57fede 100644 --- a/extensions/vscode-aml/src/web/extension.ts +++ b/extensions/vscode-aml/src/web/extension.ts @@ -6,8 +6,8 @@ import vscode, { ViewColumn, WebviewPanel } from "vscode"; -import {ParserError, ParserErrorLevel} from "@azimutt/models"; -import {generateSql, parseSql} from "@azimutt/parser-sql"; +// import {ParserError, ParserErrorLevel} from "@azimutt/models"; +/*import {generateSql, parseSql} from "@azimutt/parser-sql"; import { Database, generateAml, @@ -18,13 +18,13 @@ import { parseAml, parseJsonDatabase, ParserResult -} from "@azimutt/aml"; +} from "@azimutt/aml";*/ let previewPanel: WebviewPanel | undefined = undefined export function activate(context: ExtensionContext) { - console.log('\n\n\nactivate\n\n\n') context.subscriptions.push( + vscode.commands.registerCommand('aml.new', () => newAml()), vscode.commands.registerTextEditorCommand('aml.fromJson', (editor: TextEditor) => convertJsonToAml(editor)), vscode.commands.registerTextEditorCommand('aml.fromSQL', (editor: TextEditor) => convertSqlToAml(editor)), vscode.commands.registerTextEditorCommand('aml.convert', (editor: TextEditor) => convertAmlToDialect(editor)), @@ -36,13 +36,34 @@ export function deactivate() {} // private functions +async function newAml() { + await openFile('aml', `# +# Sample AML +# learn more at https://azimutt.app/aml +# + +users + id uuid pk + name varchar index + email varchar unique + +posts + id uuid pk + title varchar + content text + author uuid -> users(id) + created_at timestamp=\`now()\` +`) +} + async function convertJsonToAml(editor: TextEditor): Promise { if (editor.document.languageId !== 'json') { vscode.window.showErrorMessage('Needs JSON file to convert it to AML.') return } - await openFileResult(parseJsonDatabase(editor.document.getText()).map((db: Database) => ({lang: 'aml', content: generateAml(db)}))) + vscode.window.showInformationMessage('JSON to AML conversion not implemented yet, work in progress...') + // FIXME: await openFileResult(parseJsonDatabase(editor.document.getText()).map((db: Database) => ({lang: 'aml', content: generateAml(db)}))) } async function convertSqlToAml(editor: TextEditor): Promise { @@ -54,7 +75,8 @@ async function convertSqlToAml(editor: TextEditor): Promise { const dialects = ['PostgreSQL'] const dialect = await vscode.window.showQuickPick(dialects, {placeHolder: 'Select target'}) if (dialect === 'PostgreSQL') { - await openFileResult(parseSql(editor.document.getText(), 'postgres').map((db: Database) => ({lang: 'aml', content: generateAml(db)}))) + vscode.window.showInformationMessage('SQL to AML conversion not implemented yet, work in progress...') + // FIXME: await openFileResult(parseSql(editor.document.getText(), 'postgres').map((db: Database) => ({lang: 'aml', content: generateAml(db)}))) } else { vscode.window.showWarningMessage(`Unable to convert SQL to AML: unsupported ${dialect} dialect.`) } @@ -68,7 +90,8 @@ async function convertAmlToDialect(editor: TextEditor): Promise { const dialects = ['PostgreSQL', 'JSON', 'DOT', 'Mermaid', 'Markdown'] const dialect = await vscode.window.showQuickPick(dialects, {placeHolder: 'Select target'}) - const res = parseAml(editor.document.getText()) + vscode.window.showInformationMessage(`AML to ${dialect} conversion not implemented yet, work in progress...`) + /* FIXME: const res = parseAml(editor.document.getText()) const error = formatErrors(res.errors) const db = res.result @@ -89,7 +112,7 @@ async function convertAmlToDialect(editor: TextEditor): Promise { } } else { error && vscode.window.showErrorMessage(error) - } + }*/ } function previewAml(editor: TextEditor, context: ExtensionContext) { @@ -102,20 +125,22 @@ function previewAml(editor: TextEditor, context: ExtensionContext) { previewPanel = vscode.window.createWebviewPanel('aml-preview', 'Preview AML', {viewColumn: ViewColumn.Beside, preserveFocus: true}, {localResourceRoots: []}) const subscriptions = [ vscode.workspace.onDidOpenTextDocument((document: TextDocument) => { - console.log('onDidOpenTextDocument', document.fileName) if (document.languageId === 'aml' && previewPanel) { updateAmlPreview(document, previewPanel) } }, null, context.subscriptions), - vscode.workspace.onDidChangeTextDocument((e: TextDocumentChangeEvent) => { - console.log('onDidChangeTextDocument', e.document.fileName) - if (e.document.languageId === 'aml' && previewPanel) { - updateAmlPreview(e.document, previewPanel) + vscode.workspace.onDidChangeTextDocument((event: TextDocumentChangeEvent) => { + if (event.document.languageId === 'aml' && previewPanel) { + updateAmlPreview(event.document, previewPanel) + } + }, null, context.subscriptions), + vscode.window.onDidChangeActiveTextEditor((editor: TextEditor | undefined) => { + if (editor && editor.document.languageId === 'aml' && previewPanel) { + updateAmlPreview(editor.document, previewPanel) } }, null, context.subscriptions) ] previewPanel.onDidDispose(() => { - console.log('onDidDispose', previewPanel?.title) previewPanel = undefined subscriptions.map(s => s.dispose()) }, null, context.subscriptions) @@ -127,18 +152,17 @@ const updateAmlPreview = debounce((document: TextDocument, panel: WebviewPanel) const updateAmlPreviewReal = (document: TextDocument, panel: WebviewPanel) => { const html = buildAmlPreview(document.getText()) if (html) { - panel.title = 'Preview ' + document.fileName + panel.title = 'Preview ' + document.fileName.split('/').pop() panel.webview.html = html if (!panel.visible) {panel.reveal(ViewColumn.Beside, true)} } } function buildAmlPreview(aml: string): string | undefined { - const res = parseAml(aml) - if (res.result) { - const mermaid = generateMermaid(res.result) - // TODO: render mermaid as svg - return ` + // const res = parseAml(aml) + // const content = res.result ? generateMermaid(res.result) : aml // TODO: render mermaid as svg + const content = aml + return ` @@ -146,15 +170,14 @@ function buildAmlPreview(aml: string): string | undefined { AML preview -
    ${mermaid}
    +
    ${content}
    ` - } } // utils functions -async function openFileResult(res: ParserResult<{lang: string, content: string}>): Promise { +/*async function openFileResult(res: ParserResult<{lang: string, content: string}>): Promise { const error = formatErrors(res.errors) const file = res.result if (file) { @@ -163,7 +186,7 @@ async function openFileResult(res: ParserResult<{lang: string, content: string}> } else { error && vscode.window.showErrorMessage(error) } -} +}*/ async function openFile(language: string, content: string): Promise { const doc: TextDocument = await vscode.workspace.openTextDocument({language, content}) @@ -171,7 +194,7 @@ async function openFile(language: string, content: string): Promise 1) { return `Got ${errors.length} AML parsing issues:${errors.map(e => `\n- ${formatErrorLevel(e.level)} ${e.message}`).join('')}` } else if (errors && errors.length === 1) { @@ -190,13 +213,14 @@ function formatErrorLevel(level: ParserErrorLevel): string { case 'hint': return '[HINT]' default: return '[ERR] ' } -} +}*/ +type Timeout = ReturnType function debounce) => ReturnType>( func: F, delay: number ): (...args: Parameters) => void { - let timeout: NodeJS.Timeout + let timeout: Timeout return (...args: Parameters): void => { clearTimeout(timeout) timeout = setTimeout(() => func(...args), delay) From f57ac54d47b2a2b5fb31ab4bc8f4c7a0f54d1e1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Mon, 25 Nov 2024 12:31:45 +0100 Subject: [PATCH 13/20] Add Symbol provider --- extensions/vscode-aml/README.md | 24 +++++++++----- extensions/vscode-aml/src/web/extension.ts | 38 ++++++++++++++++++++-- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/extensions/vscode-aml/README.md b/extensions/vscode-aml/README.md index 7a1c363d7..e12c44417 100644 --- a/extensions/vscode-aml/README.md +++ b/extensions/vscode-aml/README.md @@ -9,13 +9,16 @@ This Visual Studio Code extension provides language support for [AML](https://az ## Features -- syntax highlighting and snippets (`.aml` files) -- convert AML to PostgreSQL, JSON, DOT, Mermaid, Markdown (Command Palette) -- convert SQL and JSON to AML (Command Palette) +- syntax highlighting and AML suggestions for `.aml` files +- create new `.aml` file with sample content +- symbol navigation ## Roadmap +- graph preview +- convert AML to PostgreSQL, JSON, DOT, Mermaid, Markdown (Command Palette) +- convert SQL and JSON to AML (Command Palette) - Add parsing errors - auto-complete - quick-fixes (code actions) @@ -35,12 +38,17 @@ If you want to improve this extension, feel free to reach out or submit a pull r ## Development -Here are some interesting VS Code documentation you may find helpful: +VS Code language extensions are made of several and quite independent part. +For general knowledge, look at the [extension documentation](https://code.visualstudio.com/api) and more specifically the [language extension overview](https://code.visualstudio.com/api/language-extensions/overview). + +Here are the different parts of this extension: -- [VS Code extension get started](https://code.visualstudio.com/api/get-started/your-first-extension). -- [Language Configuration Guide](https://code.visualstudio.com/api/language-extensions/language-configuration-guide) -- [Syntax Highlight Guide](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide) & [Semantic Highlight Guide](https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide) -- [Snippet Guide](https://code.visualstudio.com/api/language-extensions/snippet-guide) +- [language-configuration.json](language-configuration.json) for language behavior like brackets, comments and folding (cf [doc](https://code.visualstudio.com/api/language-extensions/language-configuration-guide)) +- [syntaxes/aml.tmLanguage.json](syntaxes/aml.tmLanguage.json) for basic syntax highlighting (cf [doc](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide)) and, later, [Semantic Highlighting](https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide) in [src/web/extension.ts](src/web/extension.ts) +- [snippets.json](snippets.json) for basic language suggestions (cf [extension doc](https://code.visualstudio.com/api/language-extensions/snippet-guide) and [snippet doc](https://code.visualstudio.com/docs/editor/userdefinedsnippets)) +- [package.json](package.json) and [src/web/extension.ts](src/web/extension.ts) for defining commands and more advanced behaviors + - [AmlDocumentSymbolProvider](src/web/extension.ts) for symbol detection + - [previewAml](src/web/extension.ts) for AML preview Tips: diff --git a/extensions/vscode-aml/src/web/extension.ts b/extensions/vscode-aml/src/web/extension.ts index 13e57fede..da5dd75a3 100644 --- a/extensions/vscode-aml/src/web/extension.ts +++ b/extensions/vscode-aml/src/web/extension.ts @@ -1,5 +1,12 @@ import vscode, { + CancellationToken, + DocumentSymbol, + DocumentSymbolProvider, ExtensionContext, + ProviderResult, + Range, + SymbolInformation, + SymbolKind, TextDocument, TextDocumentChangeEvent, TextEditor, @@ -28,7 +35,8 @@ export function activate(context: ExtensionContext) { vscode.commands.registerTextEditorCommand('aml.fromJson', (editor: TextEditor) => convertJsonToAml(editor)), vscode.commands.registerTextEditorCommand('aml.fromSQL', (editor: TextEditor) => convertSqlToAml(editor)), vscode.commands.registerTextEditorCommand('aml.convert', (editor: TextEditor) => convertAmlToDialect(editor)), - vscode.commands.registerTextEditorCommand('aml.preview', (editor: TextEditor) => previewAml(editor, context)) + vscode.commands.registerTextEditorCommand('aml.preview', (editor: TextEditor) => previewAml(editor, context)), + vscode.languages.registerDocumentSymbolProvider({scheme: 'file', language: 'aml'}, new AmlDocumentSymbolProvider()), ) } @@ -175,7 +183,33 @@ function buildAmlPreview(aml: string): string | undefined { ` } -// utils functions +// see https://microsoft.github.io/monaco-editor/typedoc/interfaces/languages.DocumentSymbolProvider.html +class AmlDocumentSymbolProvider implements DocumentSymbolProvider { + provideDocumentSymbols(document: TextDocument, token: CancellationToken): ProviderResult { + const symbols: DocumentSymbol[] = [] + const regex = /(^|\n)(type\s+)?((?:[a-zA-Z_][a-zA-Z0-9_]*\.)?[a-zA-Z_][a-zA-Z0-9_]*)/g + let match: RegExpExecArray | null = null + while (match = regex.exec(document.getText())) { + const [all, lr, keyword, name] = match || [] + if (name === 'rel') continue + const range = new Range( + document.positionAt(match.index + lr.length + (keyword || '').length), + document.positionAt(match.index + all.length) + ) + // see https://microsoft.github.io/monaco-editor/typedoc/interfaces/languages.DocumentSymbol.html + symbols.push(new DocumentSymbol( + name, + ``, // TODO: set entity doc if available + keyword?.trim() === 'type' ? SymbolKind.Enum : SymbolKind.Class, + range, + range + )) + } + return symbols + } +} + +// util functions /*async function openFileResult(res: ParserResult<{lang: string, content: string}>): Promise { const error = formatErrors(res.errors) From f19f431a04373d523bc3d7cb0d18462a567e0688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Mon, 25 Nov 2024 13:10:09 +0100 Subject: [PATCH 14/20] Add open to Azimutt --- extensions/vscode-aml/README.md | 17 +++++++++-------- extensions/vscode-aml/src/web/extension.ts | 11 ++++++++--- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/extensions/vscode-aml/README.md b/extensions/vscode-aml/README.md index e12c44417..3e8cdc301 100644 --- a/extensions/vscode-aml/README.md +++ b/extensions/vscode-aml/README.md @@ -16,16 +16,17 @@ This Visual Studio Code extension provides language support for [AML](https://az ## Roadmap -- graph preview +- diagram preview + open in Azimutt - convert AML to PostgreSQL, JSON, DOT, Mermaid, Markdown (Command Palette) - convert SQL and JSON to AML (Command Palette) -- Add parsing errors -- auto-complete -- quick-fixes (code actions) -- Go-to-definition for relations (cf https://microsoft.github.io/monaco-editor/typedoc/interfaces/languages.DocumentSymbolProvider.html) -- hover info -- Add diagram preview & Open in Azimutt -- Add AML support in Markdown +- Add parsing errors ([createDiagnosticCollection](https://code.visualstudio.com/api/references/vscode-api#languages.createDiagnosticCollection)?) +- auto-complete (cf [registerCompletionItemProvider](https://microsoft.github.io/monaco-editor/typedoc/functions/languages.registerCompletionItemProvider.html)) +- rename (cf [registerRenameProvider](https://microsoft.github.io/monaco-editor/typedoc/functions/languages.registerRenameProvider.html)) +- hover infos (cf [registerHoverProvider](https://microsoft.github.io/monaco-editor/typedoc/functions/languages.registerHoverProvider.html)) +- go-to-definition (cf [registerDefinitionProvider](https://microsoft.github.io/monaco-editor/typedoc/functions/languages.registerDefinitionProvider.html) and [registerImplementationProvider](https://microsoft.github.io/monaco-editor/typedoc/functions/languages.registerImplementationProvider.html)) +- quick-fixes (cf [registerCodeActionProvider](https://microsoft.github.io/monaco-editor/typedoc/functions/languages.registerCodeActionProvider.html)) +- hints with actions (cf [registerCodeLensProvider](https://microsoft.github.io/monaco-editor/typedoc/functions/languages.registerCodeLensProvider.html)) +- AML support in Markdown - Connect to a database diff --git a/extensions/vscode-aml/src/web/extension.ts b/extensions/vscode-aml/src/web/extension.ts index da5dd75a3..60ff5df3d 100644 --- a/extensions/vscode-aml/src/web/extension.ts +++ b/extensions/vscode-aml/src/web/extension.ts @@ -36,7 +36,7 @@ export function activate(context: ExtensionContext) { vscode.commands.registerTextEditorCommand('aml.fromSQL', (editor: TextEditor) => convertSqlToAml(editor)), vscode.commands.registerTextEditorCommand('aml.convert', (editor: TextEditor) => convertAmlToDialect(editor)), vscode.commands.registerTextEditorCommand('aml.preview', (editor: TextEditor) => previewAml(editor, context)), - vscode.languages.registerDocumentSymbolProvider({scheme: 'file', language: 'aml'}, new AmlDocumentSymbolProvider()), + vscode.languages.registerDocumentSymbolProvider({language: 'aml'}, new AmlDocumentSymbolProvider()), ) } @@ -169,7 +169,7 @@ const updateAmlPreviewReal = (document: TextDocument, panel: WebviewPanel) => { function buildAmlPreview(aml: string): string | undefined { // const res = parseAml(aml) // const content = res.result ? generateMermaid(res.result) : aml // TODO: render mermaid as svg - const content = aml + const content = aml.trim() return ` @@ -178,11 +178,16 @@ function buildAmlPreview(aml: string): string | undefined { AML preview +
    Open in Azimutt
    ${content}
    ` } +function openInAzimuttUrl(aml: string): string { + return 'https://azimutt.app/create?aml=' + encodeURIComponent(aml) +} + // see https://microsoft.github.io/monaco-editor/typedoc/interfaces/languages.DocumentSymbolProvider.html class AmlDocumentSymbolProvider implements DocumentSymbolProvider { provideDocumentSymbols(document: TextDocument, token: CancellationToken): ProviderResult { @@ -191,7 +196,7 @@ class AmlDocumentSymbolProvider implements DocumentSymbolProvider { let match: RegExpExecArray | null = null while (match = regex.exec(document.getText())) { const [all, lr, keyword, name] = match || [] - if (name === 'rel') continue + if (name === 'rel') { continue } const range = new Range( document.positionAt(match.index + lr.length + (keyword || '').length), document.positionAt(match.index + all.length) From d0b8290c254c4ef1a4da38f74b6938f441f00c52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Mon, 25 Nov 2024 13:33:34 +0100 Subject: [PATCH 15/20] Publish extension --- extensions/vscode-aml/.gitignore | 1 + extensions/vscode-aml/.vscodeignore | 2 ++ extensions/vscode-aml/CHANGELOG.md | 9 ++++++--- extensions/vscode-aml/README.md | 5 ++++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/extensions/vscode-aml/.gitignore b/extensions/vscode-aml/.gitignore index de4d1f007..eaf5a2953 100644 --- a/extensions/vscode-aml/.gitignore +++ b/extensions/vscode-aml/.gitignore @@ -1,2 +1,3 @@ dist node_modules +*.vsix diff --git a/extensions/vscode-aml/.vscodeignore b/extensions/vscode-aml/.vscodeignore index 9d63524ad..54baf2c7d 100644 --- a/extensions/vscode-aml/.vscodeignore +++ b/extensions/vscode-aml/.vscodeignore @@ -1,5 +1,7 @@ .vscode/** .vscode-test-web/** +resources/** +assets/*.svg src/** out/** node_modules/** diff --git a/extensions/vscode-aml/CHANGELOG.md b/extensions/vscode-aml/CHANGELOG.md index 85af5dd4a..474406779 100644 --- a/extensions/vscode-aml/CHANGELOG.md +++ b/extensions/vscode-aml/CHANGELOG.md @@ -6,9 +6,12 @@ Check [Keep a Changelog](http://keepachangelog.com) for recommendations on how t ## [Unreleased] + +## 0.1.0 + ### Added - AML syntax highlighting -- AML snippets -- Command to convert AML to PostgreSQL, JSON, DOT, Mermaid and Markdown -- Command to convert SQL and JSON to AML +- AML suggestions via snippets +- AML symbol navigation +- Create AML file with sample content diff --git a/extensions/vscode-aml/README.md b/extensions/vscode-aml/README.md index 3e8cdc301..27d7551c5 100644 --- a/extensions/vscode-aml/README.md +++ b/extensions/vscode-aml/README.md @@ -4,7 +4,7 @@ This Visual Studio Code extension provides language support for [AML](https://azimutt.app/aml), an easy DSL to design database schemas. -![AML in VS Code](./assets/screenshot.png) +![AML in VS Code](assets/screenshot.png) ## Features @@ -60,3 +60,6 @@ Tips: ## Publication [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. + +- Get Personal Access Token from [azimutt](https://dev.azure.com/azimutt) +- Manage extension from the [marketplace](https://marketplace.visualstudio.com/manage/publishers/azimutt) From dc36eae8e72f55554eba48a1d930b80ce712117c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Mon, 25 Nov 2024 13:44:21 +0100 Subject: [PATCH 16/20] try --- extensions/vscode-aml/README.md | 2 +- extensions/vscode-aml/src/web/extension.ts | 1 - extensions/vscode-aml/syntaxes/aml.tmLanguage.json | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/extensions/vscode-aml/README.md b/extensions/vscode-aml/README.md index 27d7551c5..8e288e449 100644 --- a/extensions/vscode-aml/README.md +++ b/extensions/vscode-aml/README.md @@ -4,7 +4,7 @@ This Visual Studio Code extension provides language support for [AML](https://azimutt.app/aml), an easy DSL to design database schemas. -![AML in VS Code](assets/screenshot.png) +![AML in VS Code](/extensions/vscode-aml/assets/screenshot.png) ## Features diff --git a/extensions/vscode-aml/src/web/extension.ts b/extensions/vscode-aml/src/web/extension.ts index 60ff5df3d..3790c9694 100644 --- a/extensions/vscode-aml/src/web/extension.ts +++ b/extensions/vscode-aml/src/web/extension.ts @@ -124,7 +124,6 @@ async function convertAmlToDialect(editor: TextEditor): Promise { } function previewAml(editor: TextEditor, context: ExtensionContext) { - vscode.window.showInformationMessage('previewAml called') if (editor.document.languageId !== 'aml') { vscode.window.showErrorMessage('Needs AML file to preview it.') return diff --git a/extensions/vscode-aml/syntaxes/aml.tmLanguage.json b/extensions/vscode-aml/syntaxes/aml.tmLanguage.json index 4df655d53..ffe1134d5 100644 --- a/extensions/vscode-aml/syntaxes/aml.tmLanguage.json +++ b/extensions/vscode-aml/syntaxes/aml.tmLanguage.json @@ -13,7 +13,7 @@ {"include": "#comment"} ], "repository": { - "entity": {"patterns": [{"name": "entity.name.type.class.aml", "match": "^[a-zA-Z_][a-zA-Z0-9_#]*"}]}, + "entity": {"patterns": [{"name": "entity.name.type.class.aml", "match": "^([a-zA-Z_][a-zA-Z0-9_#]*\\.)?([a-zA-Z_][a-zA-Z0-9_#]*\\.)?([a-zA-Z_][a-zA-Z0-9_#]*\\.)?[a-zA-Z_][a-zA-Z0-9_#]*"}]}, "attribute": {"patterns": [{"name": "variable.other.property.aml", "match": "^ +[a-zA-Z_][a-zA-Z0-9_#]*"}]}, "type": {"patterns": [{"name": "entity.name.type.aml", "match": "\\b(uuid|(var|n)?char2?|character( +varying)?|(tiny|medium|long|ci)?text|(tiny|small|big)?int(eger)?(\\d+)?|numeric|float|double( +precision)?|bool(ean)?|timestamp( +with(out)? +time +zone)?|date(time)?|time( +with(out)? +time +zone)?|interval|json|string|number)\\b"}]}, "keyword": {"patterns": [{"name": "keyword.control.aml", "match": "\\b(namespace|nullable|pk|index|unique|check|fk|rel|type)\\b"}]}, From 90c926ef1b2652523c04ff572ffdc16fd277cce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Mon, 25 Nov 2024 14:31:57 +0100 Subject: [PATCH 17/20] Add svg in extensions --- extensions/vscode-aml/.vscodeignore | 1 - extensions/vscode-aml/README.md | 3 +++ extensions/vscode-aml/package.json | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/extensions/vscode-aml/.vscodeignore b/extensions/vscode-aml/.vscodeignore index 54baf2c7d..742a07ebb 100644 --- a/extensions/vscode-aml/.vscodeignore +++ b/extensions/vscode-aml/.vscodeignore @@ -1,7 +1,6 @@ .vscode/** .vscode-test-web/** resources/** -assets/*.svg src/** out/** node_modules/** diff --git a/extensions/vscode-aml/README.md b/extensions/vscode-aml/README.md index 8e288e449..5506d53bb 100644 --- a/extensions/vscode-aml/README.md +++ b/extensions/vscode-aml/README.md @@ -63,3 +63,6 @@ Tips: - Get Personal Access Token from [azimutt](https://dev.azure.com/azimutt) - Manage extension from the [marketplace](https://marketplace.visualstudio.com/manage/publishers/azimutt) +- package the extension: `vsce package` +- publish the extension: `vsce publish` +- if needed, install vsce: `npm install -g @vscode/vsce` diff --git a/extensions/vscode-aml/package.json b/extensions/vscode-aml/package.json index 664388aa6..2350109d5 100644 --- a/extensions/vscode-aml/package.json +++ b/extensions/vscode-aml/package.json @@ -23,8 +23,8 @@ "url": "https://github.com/azimuttapp/azimutt", "directory": "extensions/vscode-aml" }, - "activationEvents": [], "browser": "./dist/web/extension.js", + "activationEvents": [], "contributes": { "languages": [ { From b32660b82bf6f8dd54b5bba337613d69001ad39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Mon, 25 Nov 2024 18:03:18 +0100 Subject: [PATCH 18/20] Marketing improvements --- extensions/vscode-aml/README.md | 36 ++++++++++++++++---- extensions/vscode-aml/assets/icon-white.png | Bin 31773 -> 9405 bytes extensions/vscode-aml/assets/icon.png | Bin 31367 -> 9459 bytes extensions/vscode-aml/assets/screenshot.png | Bin 136464 -> 40621 bytes extensions/vscode-aml/package.json | 22 +++++++----- extensions/vscode-aml/src/web/extension.ts | 7 ++-- 6 files changed, 46 insertions(+), 19 deletions(-) diff --git a/extensions/vscode-aml/README.md b/extensions/vscode-aml/README.md index 5506d53bb..3d5c0c7f8 100644 --- a/extensions/vscode-aml/README.md +++ b/extensions/vscode-aml/README.md @@ -1,18 +1,40 @@ # AML Support for VS Code -[![](https://vsmarketplacebadges.dev/version/azimutt.vscode-aml.png)](https://marketplace.visualstudio.com/items?itemName=azimutt.vscode-aml) +[![VS Code Marketplace](https://img.shields.io/vscode-marketplace/v/azimutt.vscode-aml.svg?label=vscode%20marketplace&style=flat-square&color=007ec6)](https://marketplace.visualstudio.com/items?itemName=azimutt.vscode-aml) +[![Star Azimutt on GitHub](https://img.shields.io/github/stars/azimuttapp/azimutt)](https://github.com/azimuttapp/azimutt) +[![Follow @azimuttapp on Twitter](https://img.shields.io/twitter/follow/azimuttapp.svg?style=social)](https://twitter.com/intent/follow?screen_name=azimuttapp) -This Visual Studio Code extension provides language support for [AML](https://azimutt.app/aml), an easy DSL to design database schemas. - -![AML in VS Code](/extensions/vscode-aml/assets/screenshot.png) +A VS Code extension to design database schemas with [AML](https://azimutt.app/aml), a simple and extensible DSL that speed your design by 2x ✨ +![AML in VS Code](https://raw.githubusercontent.com/azimuttapp/azimutt/refs/heads/main/extensions/vscode-aml/assets/screenshot.png) ## Features -- syntax highlighting and AML suggestions for `.aml` files -- create new `.aml` file with sample content -- symbol navigation +- Syntax highlight and suggestions for AML code (`.aml` files) +- Symbol navigation in AML + + +## Usage + +Create an empty `.aml` file or use `AML: New database schema (ERD)` command. +Write your schema using AML, check [documentation](https://azimutt.app/docs/aml) is needed. + +Here is a sample AML: + +```aml +users + id uuid pk + name varchar index + email varchar unique + role user_role(admin, guest)=guest +posts | store all posts + id uuid pk + title varchar + content text | allow markdown formatting + author uuid -> users(id) # inline relation + created_at timestamp=`now()` +``` ## Roadmap diff --git a/extensions/vscode-aml/assets/icon-white.png b/extensions/vscode-aml/assets/icon-white.png index 15a5c4a010ac4cd107091899705aea4fdde63e8e..952ade234fe5f89cf98b06634eddbb7615f54954 100644 GIT binary patch literal 9405 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 IK^qbOKMPq)KmY&$ literal 31773 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 YZ#+#^Jl6*Q_v?~@&K>P)O?34C0jbXcmH+?% literal 31367 zcmYg&1yogA7w+b8C>055kq(g#2|+-*73q=|2}vnwP#UB=6%c7qY2;whA)s_gNq56J zZ*9H*dvA<8?sW{$j)Lt5#M1+Y8&rYH28Zrf@`XAQc~RbQ&KcgC>&fTH3cjBsnsf zg^iEFj0zhU6@JMAlERK;D&oJgR2Cq0Ff(tw{rPTwQ~##q)}zu9^(mdEoK>IaoK~2EShGI6`i$-VsEuo-y5qo9NT)bT-4Uqu$GeDy;ZA>4Sl?alw;sUY^9nU z$ZsEjUvr2`a-U5l%&u*jiE<#;{}y_Em+3MBbE)s0=H_Va z9|70ZOFotB`r4a5{ztidoDU6t5I=y32}fj97u8$jows#Oo7UGf z+VrL;t(h1QOlIlO8+<2Ryf;W+6Jpx;A@hFS8mX_HEvXg}NjH4^zdT|? zfS=nkN%Qfsi!P;{omytlqX$h7?oN#e#1EI|AThHtI|-akeTaCl zUV94)e~U-eI3p!`cr})yO_MjrPA3XKJP@BH6kuyrx9L-x$ zbzDB%d+uNUlsxQ&Uoq|$0z+uHr*FW38adMXd51Yh6C!q0EUTN8&1I2Hhwl|GjYcZ5 zanWD#%?!|NtdYRNf#xQOu51W??a%ao;~c5Y0pExL(M{r&Z_J0%4l08Xm!RFSI@N|S zNuq#+Gpm1p|Kl2iL7YTTPY3G!PpO(I;U&m*OKbR0<8thDThMrp8d6RgDVOJk9Jo=> zFB*!Ar}DCfi{K{IL8|RMj@9O3K%fa*1mj2}5Zs0(Dx36^MlG5G?eq*Qk{9bY-*u_BnukwL9*w=#R zmu9{AD^$3DX?0;i>E{yr-p3;~qhhZ?Z0O6E`gN4LqZP=22hYR&=?QOGvG5s4M zOb;57`W&bysNsjQ5A3j{r)os}>CkJbhBl=w|Mr-i^tf^I397X4bFnr8s-5rc*&E?a z?$Z&M2YV}xbYa8ARiQT9Sx5|N6P+$*%sxp)q2s&%-DBrk8nyP=UD4_2 z*41M>H8%*AfqrD&uDipiqyFy~91K;WPriiLFei^=*%Cr_sdtZ?ie}lgufZoMjf_;B zEvjKKySHN;UbG~H3x%cJJwJ-VO;;g@Pmbg!KjJ=E;ZfncDceiXz*_&66Q}GVjfY16 zU9B-2;;MyM7mV{#RfPiMh=?$b5nCj;|K3^-B@lGI8-exW1?f{;eCR5N&+%67pPab8 ze=nxYxb0;?>>TirwxXk-1rI6(Z+4&PlU;{Yr)Rz|C4AfqBxWjRUIq-?_PdjwJe^pm zWUOtsM0^v;sJ~}a5Q=({$NCnx-AUPAlN3Af2BKpbM=`9REv5C}Bi^w{6QfjDCY0?= z1`&{z?-^cuymBy?>Awwrcz<>}@1-6R&-HUe6$=jJliG4ZpN3!K`tV}IVAy_cK+M-E zK)8k_omvxy5l&(368V=5B>J(aGwXY(C#69smmAg^dXebg)E)5m(LuY&w5tsGe2Lf0I3R|JT<}_rHvfC$m&j?}%Luiy zt5u{>6?|pNY2kLPUgE#MM>C;F?%3XydgI1}9w^Y{!t2=HlKw&#UTh$K5)+m%F}Svi zC-~bXNSM>-*z@K$I=#$)2PBslje1eTFq>E(LB97KzYc5|zy4fKKk;Z4AWcQiMpF&0QWwh(n?*PbS^ls@1b%v`zlS1(R78>MSUr zC1f65e;zFe73&;s&q!5#e@FM<87UD5wRZ;xiu~RdtANZ7^7y}myfLDUd3fW$>*F3E zL~#9c>1bOOHUf;XAh+wXuN|Yi;Gl)$mW=oh0jcHoijn5vsi~q%+Gy!QE?T3@3*<+rbT166Q{}QcL zZ|gs71xd|7i+F+^jsLb7W2!O=FfFfVr%h8zja?_@zim$v4N46;^t=+Q_vJUS2ju*8 zma3cLznTKpKSye2;Fnt!c|{NseZ9UBa8Z?|CHCLGFdza*jvF1w%v7kya_X;}s$&%8F3{Npl6H)(juaO2fo1^92 z00o_wT>zu?Q&2l?udeL{B{)GS_vVZDhj95Jz7|9%GC45i(tgAL66!Vgqvp}u_P=^| zbl|_cj3tB>+w-=_7aIzt-RyiTW5Nu$g;Y?Z`MoabFSrMlc08K&mlrmatIey95` z^WS5lswl|05lmIISUH_XODe20P~aRcDFiboeo`t?=e+BDX428OmvqTxF^O#It|pDo zTxJ3=evXuD4q&Ce1abHsAAB`Z?n8m&^j|Rc3)+bq6rj9>qiF2Q=BB-uZ`A$NH6qv6 z7^dvcm6~z?GtkzXEiSTJqWuYgB8Gii)tQe_`k~n`_zr*Whn3k6M1W`K6N~N-$WDE* z9g^YT?2_?6U11+7)#LTt>lLwAHcQIWsm13~HIvz9{w-}_RDp%Uy4Tr!QJLyacn5$} zo*BaG{C@VGpEq1P7;#d`6|vN?pRN7s^#fPCXurJ!pfBr8I8d4gweMiQKm$#ZkxjBr ze0I+PEK3w=H&U@d=d;dVH}*L5rIy*(Lf?a*dXBH|9y&)+a7Wg&k%Q2D5DWGHDNFWt zBY+Nhe9ml^r2t8jRzvC`|pO5n1x9zU_G|h zGUdTSZRepLjgghOfw%e0T=hfYdPB8kd*hd@;yol+SiU{-JJ1=aGM7E-=3QX#1i!Ih z;$tda-gj8-Ivhfd&D;;R3~{*h6V9D%_=TF*irw^$2I~;3Y zqv(LIW!^S=FjU)CT~I^wo)9`k;+SX|n4dO*cdkdqp*McK2}?znKP*(Kf7$+EoV#xF zcPg?AzK(T3qG-F7J1yfxn{aLEePxjq`JVVu5MN^}}`^RFnkj869 zLf`MyHue0L-&ub6op2$PS*3pyb|30xTuD=hoDCjyoG2GEw8}GdB6%7XNImCXQnJ+& zEMVmk47B)o9&OZdX{7*w`zmK<_Mjh!v$V7Zg4%N1gWqVXT`i^gn~6P`)}v{krNRKt zHNJwN`(le^A~thLoL8Ug5DI9_wgv^LVfUC!_mjs!aYB59UT+q1@C#xg*VeLh zdI76&Bg>e5Tc>Blj#G``lJe{_4+GW#7U%Vo-98;MP$M;{96#dhsv-wf0>v;mmnrHuYE|p@ zai3a6nJHtxJ4On$0j=)745r&j8kHXFO$R|e$= zQ7c<^9|x`m;RJCmV4bJA*q-Rc6t&Uk)XrB*kOU1fpfWJjf{*KaMP`~=XwJuMavLbP z4eLc_eBZN-mnuXCk|25!QaJ{i&;a{!$cH;I`$>~GZy;KpAGqq7xF;L=YkSAQalUP6C;$UjD+VWyMV0;Eln*4ZB*%W1$+`c+)X6926qj5ugUM57fI@@?JE}$BL)W#xM0|HoeXL zRc6`g-b`c6h3ILB$J@SfHK`wKRQ%Zcadq><7N!T0NL{0+w?{tO>$R#rqJdLZOPdHz z*&~2w+8!ln9*}!igDCFtzfU28VhR2EIkI+jA_0sE0~lM}z*K#?+P$G&TT|3FS#t`n=u9Ge z0Z+}NLMrV`S)M>i47O%~AWN4a9}(H@WnNe#0t0Yn z1PSUi${dRYNN$=V@aVkqe2(YBRP9zw<)haHn=w2`wBzZh z^&p{TJSk%ezw8nq;y{SIK8Mdja0y-4%H9~%_1s_tOL7XAc0lsr+tH*EK;Lnso<*12 z>98PJ)dD|aM5dl4imw*GQSnE&oC}3m``I%rg9lMfOhrFD$Z-wo!S{bc zqWZB!4ylp_$xdBkQ`^3CT!SHzCUkDSICK-V=_8{6hxUYE`+hAEmUQy0mxyR>WUXW} zh={7ylF~-4`*(lFQ1O2*|8%;FsG$v-aBS)YWaHi-s!>pm!4MG@^4p#ia-gSmQZ!0c z0en6X634{QOHJQ!`AUL#h!w=Dnj$KUZ}{O!{4wZX2CPwm><|k@sXb{D*a{u-ht{{ITM2Xif|JWqS zk|_>>C@rgr%oKHbEq*v^ss1sP(R2TZI=jlMgGG=KgrI5*lPTy$ND9qi)7SWZLVEkz4O=W;;LsZ#nM23>-U%do`96@9RZK z7a|p|K~;#rWC+eee0=Rv-CkaM@uf6NHDwI?c>a}R-IRwLAT+glY?JPKt@8EM%;v5z z{aQf68!p4n7Xi(pXP;bu{^QmIILDrhR^>OHEM=O2Dyl}}y%4WxT&i2{3-Q?v-}L-U zz%H6}shnyM1*m;%CO>weD@@fokaP^tfF#7IrQ^aB$B4rI=(gOq32LDT`-KmPysmfa>8420h}wG5%9MM`A1=JB~kPs+wisAsvLCavw37 zo^kqg@|{%Sgb64M+x%D%MyHkyoe-;oj*^y!cId61QsY!v^-E!zbN6gcOudbse*6ib zbE$j#O1Jrll9>`8k#Ai8%g{dkx6k32O{QwG5ROt`xO6Od=>>eX zw^7p8$X^CFH>6B^`vN2$lvBB_u&{grJd@M?-J_Q0j~e1CQ=;nv79u&jOsW>%`jP|{ z0F62>DJLN}f)V9MJQz7asfimo|Z} zv}^UeUc<1)Dk7Dy!hwdFCqVlZK1+HaB9P@M$5%u#a6RDbGcIM!Zf%c()WzA6slsWU zfLF&>LeG;<7D9)2A`7a6KqyvvPSh2kg*-jnSPLb*{|S>snt=N1NZtQ!i1Vmki>Y`5Xo<8 zBrR70`@zSB%@Pzhh0RSph>EV~yTJf7t&Ue<56|mYZjtDRqTapDSxv5 zG5G!aThwJci>XHUi~aA8O&huo#LP{bo#$lg0NJvOnyqRpX-;4Sms>R&62?TLHk-CK z+0@czJ;tn4i%U96jcd>Eg7$i^vG!cvzM`Q>_L}q{3g?YB7L!?IAOg~wVzfz62rP8% zdG!jE)ZtBUt8>uf{V-6)=zhN|NNA=`rTzp90DvXIRWUCO~C)IeB(_KtD%|wFr;z0u(|5eJ(}aP_kFvD zc<`}K!p9nu+D8G7H4CT({>xITaMh|z5_vlQ;lWgiY3nB+&^@XtV-KNxHXGXQ5x!>| zb@{b=FC(PK;kfl7D)oye(f2#}d4c`I&_hD@0125BMG0OCEOQ1r3A1I!{kHXIN zVe~o#%eCrPv55rebvSO%D`NkPOOYv$ocUx66cJCGT)$db0TGA!d*c4*$5m0>#m#Wd z&UX1u{isGC>~;R|H&%Gj5$^RF*Xgi+eK*qTkllF|eGx|Y{AP1#3a2f|$lW)P64FRO z8QW-;@Fal@gnGiD*6t8l5O?k9=iZ#V6O$ptw#KzPtYSQuWLM&{!eVcTD`@&oTi38d z8$i;k+vAa?jFf%{K;VJh-HO9dnLs=SA{qO^Rx7lr|H)$hhw9fdak!2%pIZ7G>wbBF zF#ol2OSBNIt>A;@&$2)G+q2ijTnp&!>OLIss-iuny={)#@aW}6j`J4oxUYIG%If0i z*MR!ieMTX_8B*xcMM;7m1;V{bsU$0b5f$?41Y_bk^;0_&z|?B2#IDj`foqj=5an=H z4jobm{dpyYcK*wH&v)9HpSE724Eg{gWlD~=xCJQ7MC!hwC{WF5RI|slWe(3k^SMOl zyWQrX!F!z5BLu00r#K82DEnK5{-xnnu3(d%g@sFBMS9Kd9QuHpE<5Y&zwHCk(?^G~ zLBG?Lw?FhKh69E8R2cxd3DaNgu1$C)dD`*u$q%MygfAS{M!cEgSm3Q5HroC82RZOr z@ktn79_#fx&x)I7gD=Y@qI-*;jy&=yUz=+36n^{N<7z4WfHZ?rB8cNBNa>?M{1*xk zx3AES=C}72V3!M1KU<&86oam*t^ttq&4UqBk#E6=_d#8D-<%wSH7VUjCI9e1Wdsct z-x#-R7ZVm4=8^A?yxZ8;eW{BNsh|A-SX#D+-h2QAIEzY8YjPEuQEkr->Mw9@*raWE z90kb;!qxg+k7q%EVl>rUSj&l|qa`b<-eq2mAE;5L#xtM%SP5y5dh%%HVLb!XznQQ9%_~VmvN{;rL@d8wsoSWXpeRI>>)f&KB9r3&+!qcfS|rGo zfow*E0iZmobB=UgDbec~g&3L!z)|vVIx%Bdab~ze^)j(d5&vLeByC2s{HdQ$unv5fCWHZ1-RM-DNe}x)6q+20s={Xahd_0}U zQ}0D`y+W1bE{&LtEu<=tNH@lHGN5WrJ$YrYZ44ZDS*4<6%r++*mI?x>;{n6{@mgNq zyymsa*sT*l)wY{<3~GSZFtnF(*Qb`XZXpVvEF0whYtJCsDit#jvz`FP`4{P2TmO(` zfhK_MsF_{Q;`0lFqJkjv?-eiM-tg?=Xh!|uZ5Bz81)u;A)J{t#go6H-ZydAEIP_i6 zz)V@by8F1Zyw!KiwVT_o?*-WNcUo^70oK{kpcYJ+-$u%VfUfQ+eKdqrI?WVwD+0aW zhT6%=ZZ~gJ%hB`%Bf{zju{sS%;9R#lE2KslF5GExHL#k>P!ng(3_OfcF7BpJs09|NTprO3GRMJ(OQ zM|ZV&rU4uGN6$2tH!Nj5qDd=^OeqMO^Oz0711Ww=$bzw81}7mrTym2Dsoxd4&ufq2 z-f&brd=6`q%&#O8kkOmPZ(?_cptZ`@PaFY1kkYkOet=&m-GRA^KVI=gH?i6D^RM9~ zn+u8eh2#F{Jr0PMn8w>NMVY5~I=vaU)lZbz?i#GE+vmzza;DO4f_Rs z>dfFYZP#@^a+!Qbyc#X(@>=I zF1Rk@nAKn#2!=}&ADw2V89#De3wj9RH*fg4@rFq#M07FtCG0HPSyk9`(|DxO-5!QR z16NKbQ{ibZ%OlV>iWgyXjU}+EP69b@3v}Jws*atMB;hYXIO+41l9nQCM=dV59_Ci2 ztbR!3lQ*w*RQeIE&vhln6>-yT~N`x-#^(DTUkUv74R4GT%9olU1HI(*qR{ z9Z3(JO3S;68P)<0*T;&cm6XwzQy3gdRD`+RbX&ZU`1c5D^pcyDc(?IdzDTsfOpAtZhS-mQD?Hc$w ze~|9&TKu@=*q+VW2}k>`YVWUHE)9I57;dS9* zJ4g#d=*ngX3dd`KtAK4;buwzoskKaf;{kE18dLI~AvC)%b4 zVdG`&Dudup0?U(A*0auJsRCW{#mB>$!C$S-FTovRH-Tz-yOW#it;e`6du4O|a*j`^ zj@8XYF5~(ExLCit;YWaza7mdQy!N|QjoWP35$>zQJ4AU?o-=ndhb+aH!3x~iv!6Y5 zI3O>5eM_gL9!!k-U@^ns5(<63cc1su{`MCl%F8jUpekTBcXd_S(1|wDDPh9}jJ7MS<7eXy`CQk9U)4m}LX4>#0cLbpYao%N=vS0)g zt=l8U^LIQqX;uBkbOmhsXh%wPIK%KCaEvNkf4Y$Ke3e75$>XV3?*%|oV=xPZ$1_j6 zc*U3zny>*4M<>}f1)5lUtqhZ!%$@jrn}PskY1PDiC+k4ltw1d7TjJcmTA2xb!Bn*H z4vC;{UP+G-*o2}c#lDy7d9q>T`i>L!c=~wIJ`htIk~_peodIBK%)dx6*s4hD^5T9tr+n$7mPViT>UP?3C}kZ; z?rv(7+$N2~e+!-rD|n)I)~%jfSOo#5UUN8l?;opc@$_Yjk8COEt8@k|ikpFK^7xy% z7yCo%2i-s^U850t0z^u!7ABj|Fho1NzSYly^~>Y^;S6AYwr{hS6k=&@6AX+s_z^M| zOQ74L*Go3|$!t4Y#Y1rBV5MvZ*J2>#XkXzf(LyqTuARa4Ye`-jQhzI8|A%4|n6jq>G6n>f z=HIlh;}^sOgcCX}8Q-VG+DC^GUSDc_wqg-^i68>Z z!MLdbVVhwiZk^r9<^1^+ih%~)Zl1vLil?)h06t_2B!Gma~o);2;b%mT`~ zzlTX#cs%BeyC|i-ZG~Z$j;l3mLnsawkP6zW3N;d$#S-sh(_CK&#tTsdHyfFw;mgtT+MUtq)EoObmBg)R2QR0F(`% zKioLJjz#z3;`BgJekqFg)AnF%7rL_ENOA}aeW7s`T9m?^yJ`6wxQF`7(WL#LRXqfJstIVj{VhOn zPnk^MWs0K&8{=(0B(F=r*B*O(AJoX+`i==EfjYQ@I|IFE&$0DX{AHecl=0w=K@^Y< zJ->tzrN)LFTvtNtsDP6!41Xq*fKLl>#1Y6!MPCEr(DKTgKNRWJNxNR3MG9?${^_wD zrQ+AjG+c%@?Lm}$tNem=5PY2Y4^k(X0(*F5KcoN@qT9nlDbo8{b(YH=3p^bc^8Aw@ zma&_hjV1o<&wrS*3%54(c8%Xzu;c=~ELox^Bl#El2c)zh7256=y^cm$2UL&wbACAC zRN*x9DFL^yMcn-*KZx^a_wdQiT!?7gtxt>{gJ7ypD3D6Pe27=`cP>}KmfA*PZ-O2o zLCD#Es-!d;lmxQ^<^=_FB+PCqE1lG3>2eKg9ai*lZ+2%xgD7mgtNTuqDZ=hDH1(ib z!@@v+i)Nz?^8dROmP|w(Cq>-`TY>RrC*f<&IsW#54H735>7B9;0O3$e9Dvp>a0JR5 zVkZ}rLDBoXw|q(~8cV1JW_FWnrkeFiq!XbS%NvG&bMXTRd8Gp zR!nhnU~LJb_PgHHh%0A%flr2u<2eN2=1lA!lU88Ov(P+8xJ&@uO^}^1+F}l-OV4%!5mVb&>3WSW+HBmfORB1 z=n=Z~z>Bi<1ryk!2gpAq0ul(N?^kJrIu6#y1e;}KZ>|7dc;Gf-3N#S>!gt|zKT8@w zhui?9+4SHbAwK0Cr{NOd_Lbbte96Gx1cIJe&{>C)2P+fCdqEoYlejzG}3QaM1ZB2!LWsF;G=CC8u)LXYKL-NKpxG7S>|#zp7GO{`yl#&t(5 zG|YOAR5~p89r^zXuPYpJl!kXk$Uqrf?#)~-(Ji<8&WjAFXx>%v1d6QksYvi6+o{Hn zfH|K{+Le}5+*>&zkC@yuu*qHo(n_Hf>YRABgb9}MShh=Qoe@2Ff*3o{9)s#o4y&46 z4aqd79Vcdb-+(HYW_Rt3oPn_H214CED(l?~z;LFRB3P;bpKcIyTdKd|G1``dd4gsp zIRmJgxy#Aj$3W=2QkdE(*e@}ZB(!}r6R<@i>`?p@vTgXGQgGuEq*Cx^=vU7dBB@Du zVmdq?Kn12Ey=@-0g3GBiqD)xl&D&v`vIG z30%{de08$Lu~LG1v&4q94>9xs=W{&G+cF|v+h)p`rRhR%Qx`BHJ~bOi;KxV-KY=HR zFMU^4ApN`qtN-&|i3}@LZ>w>Qr=6l&H`;Hm6P>#6)O@$5lP$BJNb(q!B*fFlo={WlxWQ8Uo6#L|irC=b|qn1@Mfh z$LY-1r^~=hKHx$veK?tf>Ni$@+tw%GOE?0(>iNMzY2~NgGh#ma-lOJ-8o77~r!7MW zemD`t$*It~zczAz5T$!Z&c7@Uj$_&g#y|w^1Q^-SRs2E0KD!EdV8d|VJcLkKpAEkQ zSYONDYd8#1J{g`jWrG+P^y{7TGo=DP`CJ@~_`RkfDrK1{%5+?%3VNqkne*;3m_GrL zFP$7fQJxVq3DPU@6L1m55(aWnf7z5UqwZSn%@)y|{zd(%?uo>PJ%W;M z*)3Pn9x4q!!UeO5ovy%N1wrW)7VhC{$THFa{J@_%@umSJv%Swd;utG@jy8*uKyxJ@ z4M~6@r(;hVzkhoR5FyxJM*y9xTrYGIm|WCP&cGWr0ImJDyEkPKLw9;G==pEr=kmmc zK&Pj^C=oCjj9pdv6pJ}umU0A&xnyEicW7iZk&+w`B9l&PY(F;y1_~h z6Y;3;UT@3iX>d#97vnmtcM$D2JhNaW)|;xVMKN|Pp?dr`Xi|;{Qk0FY%_9nZ339=; z+vz1=i3#}5U+wemH5WQaNWdmh3~>-nM7#@CDON|74f1U1I3YVfCa1$x$wK ze1pi)%2)GbK0miQn#@^&Ep4U}SUdx8ux}Ee*Gw_4PZpfO)UX0b{1u=M#Nt^p`mpza zR!4P$iOy5&BN#b}5)eh9QIFfT39Tet$JyCmPeKoP@QFZp|wfCNaotOjCV-EMvV zSRy?A8oOp}*fWKc)OGI^e-|#p4;=yW4qkxj+4?UK|9$qj%RKdN;)fyzvn zdmHX#TVQECKxqRI^rCP6UgEhD-ZiPiegIo99G_87`AzSZ_wNb#Rdw?;dG*oy5(Ov_ z=~_vkK%??I)xyw;o|&QS(J1hQs$F16lCqpX6O1zsXjgVn14PBMU=7sf`7(HAO$6}Q z>hGfpbLx`u>H!Is^1+V#5@ALcd*s`9V|{sXt>L zC!GJOy$eV6=-QA3x8VopN>DooovxqcGQpTXoUWVs8IPan1jOhdEUY-f(=#HPrAlr; zC7Um>3jYkWmOjF7*_LQ`vHuV$ScYD`u?i?&YwJm$touOTJ^%49jf{j6fNSLvnRnt| zrG4Tk$f@ePpn48Y>1)5l!EJ$_tn_{xjat96L;w18ZpTE2;@?jj7E|7NotbJ%#a%}| zyknKxef|1oUaewZh&wYD>0B{v!A&YvP2qBxcv@$|M3sSHw_$=MU4ajUI($y?4k6u+ zem%>H9qrX~q1TIWzXEY-4b09nGY++fiG%Balrpu|^1%NYuEA_KZ>t0e5icpUll)b@ zD2rFZp1@5ZeO*Fp zeC!8?B{{0 zlycs~z&sna!C1}&!=(cVr%7xe^a{te#6D)^oBfL3i(BT#072!@em|X;2WS3ic>o42 zd0CRf3Dt0Txy`6O_Qn)&yl>a3lH8Q(cnq+&fx>8bFTEnapDVo}i2ESa7Y19imq@Db z?6whNekpwLh~|-b#c=dTH2xgGOXg&Cn-$tO*B3;!liu%uLq9v*Q^;nqyaSrIX}-EB z7BMLMj=RdmlZOeL$qx^7u%zD|o~w+j;|74augTi4a!kgEVt%DIA&$g!tmdg|W;{## zu3ExU+OKy{43@yqY!&$JD-$1cjY$Cil6pf-IGIGQ_Y$?1e`oq2tbgvG`o82=5J<^? zG>r>}rS?(_^zCdC;oUu8Dhaa$r#qI)*CB2++%cNC|I}I1+1_nPHV~BZSl4fT{E2C^ z?5y>4wRB3J(j+PE1hY#^)$sgx1pB4&%Z&6DoK3ja-(cpZifu%xd#P#TR{uX*&aCU? zbvEBiCpHQcmnN9JMeWJirkiY}=_&B$&JEZO6*a)4+y3|OCwmg|=U=HzgAjA*ED!c$ zRF3sf&l3H?k5k1YyOhRY4yFb;BL>k3d*p``PEqyvKDHU|PCSDZ-#|9hl4(SAUk;lqklbt#7fYcLu;? z3-OhLMB3ky$tyxv=p`o)R)*NC-_RpPD2<(iQgL~#6u(wEsR)NzxUnf?hpFo>F2c<} z&j(U}9s)m!ZEA|ed)<5iN%WCc{qJ9L5gh`Gd)zYaJ+!{nSPFWVz#yUi zMm3_`rLilT>n#BDU+`? zJwntfDO`BQ{;xtT>f&t!fs21&xvN8t!4a(UHyhnUfVl~I@&c5y=T;tyAE$T_q7KAv z0HROuB$a(RGl%*MBUm2qv>7*fY#8%I?HenIDkaHM^S*O>9F5O^A?qwZtti|^u6i+E z`*bZ4t(#Oy!f_ma*(O!?@JaLd--bC4B=l_Ulvf)de7#9 z`ROBVTWkAs!Kap1c-bLbiatz>*gB>np!t?=ywk^- zPnTY*9Zq?gVzvQ^*^oWT0N(;jh90CJ`NK^sA76>JCJpmtAm+*?=`3gqV-XwGGDRoJ zt(ewYF3t68#3WmvVuzv&ThsU8ah%r4k|`Ru9$597af4ZXz=YQiLhVPXA%DZ#vc|aB zuWunaj0Q_Cp75;wkp3`JpwriPJMOCp82IE4*F9Sqq`lj_^(;l2#H#8jkeqq#0+uj# z>y)qK+N86~qI=wI1ZRl$fP3aw_u%UxV)rVW{8#33&euO~>+n3ark)jB&YD+b3!kEN^+6*?Xpbz0+#vH|-1w0HEHts?L-8c>CU~OZ2K+bY8Pq7!>>3-OZCt z008~$#lS%spxpHw%)Gc8K0Y)ZtqkJ0ynkvykWgOTNi_0fsQ^cOtk&gZPbqFONAY4X zfl)775*w=lEE9MF7c&UcvVh zDksML7-UEnd0NVQ$^5nb8(2$z{++Wd2u})pQosA2glK%$T=Li(^YrfXg5u z+#_^j0eE@VzrUj28U?FVrWt+cloZMfzKb8|?~zIvR(wrif22Iw#bzXKq$gP7+vA=v zb+MG`bXw-msWAKHuu;wJ1@$)BxTL_>AKJxFDuZRZukJlBiomA;-Ub=W?TKb$I`jhm z_O_};u%-T$x=B}6sf(9<39R$z`S%RmgF`8!U8%60B>bfB$z*-?{YII?lsZ$oP;+X7 zbKffd=59krIxC86O+d?@yI?u4wqilYM_Z36ZOV$d0LFHeV9|jdjo+7dna}U^S!>Vx zq!=htIy{*uB>^kl!-9kD>8D^VdAY!-pMZYJ+Lpe!VPMee4}2MC zKoc1R+pW+QaC6<^1tKVk$q|Pj#*ol zO+@zmT$13sHeTcY%?$$q(ONJgEugx5M5-#IOw2mRJHhHddF?|~ok_6V7zRHtURuTh z_c*A@H%Y?{%NoBmgslcHjdwJ(>*CChAax8pxsf-ky_ZUx^3ek1GO z(|_X7g@o${X5aMDUa%P*j9oLY-!n%>gps*cmznnq+aMywG94Q`yQz(o&p!;#P)q6K zxPS&Z(>2PUxy};wokiyff-7)VfAzQ4Pl?e^v$sC`$wzvo^eY4S%KOt4`J<&7I=_Ti znZ3U%K2bMH++_1ozPc4l#lgYGp;w=qA9%0nwMnm7S^l|mg;sO`{#w#k#!`4AVwJXN zN%DOA%LBxIm9JGKuI(&nmrfw?aib>e0AVnpvkH%@DrC2hx@=}yVA_@Bz?+P z$=)w&|M5P5MRIQN*GL!h?Cdqf(2uq*4gh$6pc zqSmR+ntwv3^$_Wzru?nEk6Q6eJM0FCirqh#g-%GK=gM>O0)#Uw%8F@7kG;AT6SEuq zNY4lDSkTqJy$J@YjWUF!_oxyS-uvBTobS=??YSeueV4zJxtkL9G{Ntv#}il z11ejU)6~EyU*xY4%AtYnt-->m)>c=8nOCFNl;1A!b?maErit*isyAv`Wh)v0+fOl0 z;N<{3*^Ko@*TmhyDhZafSH0G6Z$~a-wE|Bo>`*zm-QIIMgdgth@61h1`;lE%bZ;Gr{H@dJ+2WgEndtB3pQzip+Jh$?#UOj zS8B-D4B$~X+6I;W;A^y#2LI4aqxLbZm)Nx#S5NT8PK z@uEU?^wbPb%l^ZW*YZ(ithV0Af|CKjN#6j}%fjd5H!J+jS&4>jvP>H!;1*q|iK)^t5w9s>U>9PhKaelx-Tuluu_6qRn}MsP`Q&Gk&f@T&>D))7%c4LM=*lN*N!E&q6W$tjHWxSV@$+vj$ zK#X;n?J!33;eWZXGPgOqhYAx=J*G-%S<0|K-}C|B(J%xA*Kv}Tb5S=?Ss5gzlDuuh zPFC`e?a>tsM#|TmHGv2@@`-zSKhXA;!W#Z1Zt7C)LqPOiBTG_5J5rwjF$upu!RzJZ zt%;%C+Kk@o)VEByCS>nA!k(D485uTjp*m%Bp+NHIFCO6YjqcXCxJs*Di7ze83en;2 zFGBMY!bIKB$jmXS&kwi=m~YC{mL!oXzMs3cBzDs)Ag8waF0`RT}i(I-w`jv8==c6Z(su!h1j0L!WfwPwW3A8QGRfpJdsHN2YJk;j3}- zGrg=VBS`%w8;De;t4-d%fs@PZdGycJ(nE1><0rSV7q%!TFY1AX}4by+y zPu9EC<5234!wv0tofEI^EJAE`*P0+n8w$*zr?2QyWu7;R-^p9Xo&`PhkrSe@*}pX| zfPyZtEZR)DkkwMD1@tNLY?ydGnHu^A)-fJGc!+kf#2c-Wzs=5hH7Ht$?}TQo>;E+M z=J8N||Ns9rV=%~0l67p^DNBe6Vr|kPO z-*b7rKfl}Wc2ob1xm?#d=Q`(kp3leQelC9cEwD?`8e{{#|6psug?c%R%%RxoTiOnUeu4=Lv0*WN-3~Em~Y3khC10ihHI1MOE)ZecCDt!@%Fn?5 zCNaHsw^HlN6s?qG6+Y+<5+{4nl*`M&4A*&ah`qMbW6OeYkT&phz@`;FV?H3aEZoWw zjQm{T&)d4;vqlfmpp7nFEvyTYVzVzcO#G_>k^t5Qt__QP?}3H;sI;)F#?~dKHEH3( z_ZBx7+f-dTor~7?-KsN9Yab|-ydyc2oC8Ry*;jxsC0l=g%yB?|Gg@19=4~GpB1Bf& zcG`LL+lD^+;$!`l{>i1X z#^k6Xt>5sQs(h)d<9?&!UTkhK&6WMn?+ynfo^KH-nrib{dACnn0-1Yn*v-}L>X`3a z1)x-@x}$gI{SIT=4KIcJ+V{$jFBGMV-wR<%=;5=Ej$rBz?3;HNGx_dQD8k}glQ7AZ zhFJ$Cf`E)rM#&?EP4RimXQ_ZNS9H(%f1VAJd!#jYxM8tK zn^3Yp>sQ^j)8^bp zK+DI*QDNC~8V^4BLDq3~HJ^D7bMC2YbO%u|iF&Zfd8}nNKe>12A@^c$gqyU|N9Knd zSL+f~VtdX7+QlJKF}74876CI_f%`<=qfR$OUTzr9&fUZnM}i;-Xp===D~X%tFnV9^taXqRhupv+R7iPiL;4Y;@=c&ApRke(f!i?=&b6&oC zFFQCo;{{CjCxG(d1d|!l48}KH2X~LYJ|nS0JqT)hjUXr(!B}^+xhX_?M_19rClj8> zXve^gIGO3EArrCb7hFfGUb6s+2ar7Zz5e@0DfNl2*XAM6%^tPCxa^y%VjHXJr9kat zKqDStQEDQkD|A87x#*U-7LGF+O21v-@r>zEo2t2Hv1c|8S!s0#kc+Pii*4vIP6M|4zT2|TNGf3&z(_a-s zpTC91P+wx;^yMBH_L%~UMt9(Z;;6OUl9jWs?bAuRqyX84hAleILL6z}oTV~OxjoI? z@6=px{s_m3iAMd{x}#~^3)-rBQq#A8O{yoTFTu15NP<7wEi>Kc8C{p21SE^=QEKDw znA_Oc$yu9>H>6lF*&FTsjJ#zjOeX@0(|1k|H>R&;tnT~Yz&%iD?ak6XY1(MjFuNJ{ zh4bKP@e`m4>kxYlkaVp$%E5E9)7awMgJ=vswjK?%jzrp4o~i_}V19n~$>?IZ>6=Qt-n!6R|0DTAk` zZvZ`FJ;CE!v359H+Vs)YH{taL-G_`6>bscduCil9P%sABSFfx=9CVyRQY zNxyBNd|79Oa@4GMuiezViDJfn(|UYO8p$8TfKsN7RUd*o;uz>;4nkMIs!z4QAPwR} z8(oE_Fxj=2uiikR1usz(HrlS+28DuR=`Sfz$)kLKZNYgedn&L8z%|%ffTAae7=2`} zi_WtWtHTmQ#N5Jvk*ZFAC^KT*O3rae3aeR9w0xmvtAcGmHaYk-o~VjR8#wBb%thN-tMDOP}&42zwA(q zL2MtXT~{>xCtKJ28t3#*Jyg1wQeDF^^Z6n z=m|d0)`MAsiTo+={vK7E_;F8*yaaocz}|83tCFe*_qp@#wTJH?|9d4KKH*ze?L=F7 zmTF>pf9=mMYXDlXQjq+hK4k=m7Is0+Dc$c29Ry_O-L4KLtR?On#+Nvnz3T(46Jd?zHSReTIYytm_vUYaO#JbHB-W_2;0hXn5v)0C z*{=W579qvqP*VDt_00HYxP^IH%Bs|v=R)HP12?~}gDUX$OPy4wgRMnai@SO4zU}CI zpE?@p!Ba4zeSg@@+jDz)c=u3^hnL^-31{`elaG2kiax*=b=+3DKWGRLm*8DhK0*jPEK*lZpVF_cr`SQ z>Lu$Gs(O@!ZQok3;wxOnOuP6EMD_2Cp+{hnc{d-ma@iHz_m11qv189}UgU*7+3j;v~CIsuoGCg(#Jr@NsU^6iy$JgZdO#jdoEUX z?wmJB#ojb9yP;3p##8Vi{f6aIaOfiTMn}o{?l4Vinv&}EuW(eqDXSwX{2gzGz#@LeJe!?+yxY#FjB;K=qtOS{nvV-R!2Rni9v#p5sr|<<5+iv$tij3gFmbYqBT26*J9lZVg*(sXmt8nOHWGS zuYyyXVT?C4=kq=opW)`f<+r_xmFrnGi?`K<;^!t}a-E&RKNRpAL@4a;9)fD zO%*BSBJU6b5>!j!nCs_GZXOJOW1%)~p3iy|+X$)$8n5Vw)OAtuB(_EA(LO?*V^Y3y zut{-JUXZf$0aTAdAz9InY&OVLKSp1#c^W{T8c;9-Y@YSrN-n0m|Hj9QZoj%N`mSO+ z{=3RS+G}~BD9(f;osuqSdx3KM)5fKgA2)T}fy6Sr3X@tKPW)Ni6MuSHgs=u*w|J5U ze)WT@s5N=VFTuEq!|Mp_Pi0*bb|n`Wd{8{2s8c=1OzBbl_w`n%#DwsK{2|CrC;f|h zfj3}h?8ZgkGBTp1@nqVl7*IV2E;V-(FcQ|IUd+(XG~PAVg>LU=^=O|#Bt9wtE>a24 z(sP@HqDssHhCcW{t)&2G4-W7N^egWcRZLt5@*Amq$j&ILD;eR7ddm10==uV8?`)uH zq^754`RJS0GeQ#idm~47GG;sMrDIN8z=4IJ%w*<~kmLBC=eV~*QQi8%darV>5z6O} zvT6ZvOBLKebXm{;j!=HLLZF|z7blGnqPjH7n>4CSMM@o{ha9;%1yojBqtu0F6j%iA zL_&~Pr`gZ5{K!s(yB4e-|9XVVONN48aDp7CCHeqNhn}jpH*M{^)7jyoq)5H>=d?Zs zWNe;5;!Z^1J{3GDy=vxZdhVZjICmxOtjaT^jp3r(+z}*zh8m@X%d_#yt4WpY%oO(b zN`CX>apfw-^0p9EF`=Zg6Nd>3KM`x*`o`s7<+MG+oqLmW(L#6pPSt1e2+eQlD)v)E zR5JKxP*3I^z3i}e>gOD&{gJJc;F6!Zy$Nt`+dYaDF z=70kl>z`)8A$^`${JVrSP&rw?;^^~hJMS;8Pze%1?o{e__Gycf{<>Y2>OW-Kh3ipML4wbDK6D1R@hJfVyIifvn%_CF`>kEGSzZ z73ihj=sQO|6+~ih>D8DNi4BKEV-!L>UtVi4wRV*8TJ63AI{@u(t*LSi0nzVks1+M_f!lu!n$xbM))9ed#H2VGDGCL$Bc zTz^9Z?q6^#eU~cX5;2~S*}!RIrrSIYrvO=VS-ybCa4VF!Gv&OnTI%TRug$rBSlKT? zhlqg~$eO-8s2yYi!LQ@5nqp?A{{w)u&N>ME9kMAPno%`JopZ7Ku5Met-$YKf&y^o6 z1_*D8DFu`v*TXaM(_rbZ7<}pBTi(30k@?(+?$W)V9J~@D_oAxi^}T+gU@_({s75`1 zuKp?pxaIN%?58UH<$Y%bAXW1mm8Er{?N|Wtwe$9D^$ed)$v+4_rGvfJ^>^PqQpsIF zkx;Wcxh#$YQ{j{xEDoP~Imy=H4eGV)hxlkxAR>%41t<*I_|&)eWNQ_e^XzXWd^y7@ zd;d8exVDyT2eSVH=aYy;;0ch#$Lf=>nBupdmw3Pm(D4?6X)p6x>+JDF%yDn*6W|r9 zI`ur1pq*;I-hj1p9wjA})_~{pB#q<*SlL8?8TCHwcCno@c&l`f<{V_~VArksQVs}8 zMCy4glsO%dszhL(9>q}h?HWWUNHI`Y_$~4ZiFU{RPey(AEgWTygM7a0t%Edb0cR_R z_1FaM5jsm0g;@*`W=W4~+?NGv%1TRVvq&T~I8LAQ2%hzpCtF(u7AJu`M+T)|6J{T< z8|*-y16@JUK{d{!(nlXC_!E8;K=6GBa0|pW4_*Vc_(UjX&sF~*Ek?sfBOwy|jSLu( zWdnmKHF_QI{Q@%vkQ?Ub|4AYE!d#CFb&_VagpXzj>Ipb<>RnwHK1fdarA&N`1qtxJEa zw$oM=Y|A+2la17v64N*gVn}E2_`|o+1E^*WA>LKD?ef0%I{;fD=5Cgo>qXeFKmHR&)8s zt$xOBcc-oZvym6f8EQ%aB~WJ&7Tg%$05Ao~?=`R^4pwdfj?Q@0382v`QGA{dXOxzA&#%;|)b-vU`x&DN8^(sw_|8}~wb zuKa#NKgQ-gc3X$JK}Hr%_Y{_2-}C@kAz&N<=s8A{jIgs?;3i}Xcwu(j^=IF zKpw_=scEJCUN@YUhqZO~M4}om=<-0doa>2WE&9nHUH1o%aX_Nho z?gGld%u^qvt9I+9oqs(s_regL%qtSsxkG_~>dAfgGJPmMtA)Hnca8%9qs%|C&l;>0 z<^;Nf#cU(;b}Qkek?}o%5h$xq0mI|&rLoj#LI)6F_L=$4ru+k=wr1veKqL+fbabwX zC>@3_KS+d^&<|u~8VRt??vmU-A3#KbR{Z@TtibDcesBpDC~+mZq!kB4(0M`li~y@w zoW>1c)>8E*oRoUQgM$!~gHgqJwhzL6bgzD0L%msuB{92denNdVl`^51;MV9Lxx}imb>F?)Ol$js=zf zGo{TTFx4#LTQ;wiw`48X+*?hQdJI0C#bqIF+}Jcx$bRZu9X%tId_&Q{jW%`9DCxvT z_C6@#q`2vE?dCnN7Y+t^*?tY8&D#DRNN8tsK(VnvE7L*4MTm_qfdd6iq9R_D7IQf~ zC}wH|W{xX6$F((^9N${IUIMp!_3H@*hafWgscWz$;nbeU(8YA$?^db_a*_@TU|`KG ztc`R?52}^{^T0T4-G$8?;avdlHVyQ=)FQ_cgWT@<=TJt^dv}H-*u2v7gP(mxyf&Tx zgo0d&KT*Bz=Mkw*QU}KYOGGVh{Cb z)C3=tPS4u-$*A~ER0gzpa^~VG$YFB;w!)8r;^X~-yd`BkdoWBHU}f7`tgr@gl80)9 zgxLiRw%~dcBoXpTW$AeVi7yhY+Hsd3eBsn}CBSBH;6+c{D*vZT%g+rvCK`co`}s7m z({M-7EnfOAa!*zw3FfL*cn*hsmrwbVZqWqVYaG1Ij^Ukv(y|A>JR#iY@r+gA5~7yW zHVD!PmlW5fS0!2w`hI8N$#gFf3Zf7FQ>PQ9iKPZA@;t#H#Z>oNs;M-XrkK z?W1N~7cB+qhq=G=E@*~E;H)=t`*euAbKz|SP(>GLeDJWQL*TXAzVi0n(NASVmWc7S zbw%0a2Wcy8>+J#+qtQbR081f5f}~`zMX6Oc&EoxXDsvv|VlMILkfo|yR>m9K;)~f3 zbH{=oVKavysf1dz*x|A~MfBpUP_Qc*E-BXo8~gB?^C3GRUIMG4tsjr%&2T#CE-Ncj zm_a`IC8b;-^fk8~N=(?Ee5pdAMle}o*uNhRj9Xov??FTstu6Dx0S9DQ^3ATeoGt9C1!87h zU`;{d7xhn@TMGFcGrG4zufn@We|8M*kRu3vgI-5yx@9?v8Z z&WhfB(0M_Y3u!=BaUR|&dBA2Z0jBlE+)yfa;1zib%v_r0C@&tUh>mrYPM+*qwJ%f*Ked+BA*dW z0?4D~FKW&<1>=eB80lYKFz(I;4EM`}TrFBR zRa<)@XhgkyX7*Fx)SJhbynob9Ma23tz5@616F_*H?+=3z+^$nBk)T5dQ$73kcy21= z<$~YnzirsxoNoll(C6;kfNZsMXCmkEP6qr~w@{s=cHSUS3sW>x2WRC*c!B{eu`%%Y zAY(m-Qu$Ilp@&_1P{f@FgEH!V)XkfgzOe(w`4$2iW$LBVfSMPBGoakZYoQ|DbsybD zvi~@iRE8V=tghL~ktKlstv7Y4f9+$bSB>ULhPrWLEqgDEX%#{aK!&I;Pbor>Sv+r7 ze`;qPAS&sh73QP00QXU@0gM~)CLitxX>^*S;79@3lqyew2RtEoSSl52S4&=Nok&tU z#NxaEO{UJlix1i}Tx<7lyJt7>v+0*!0~3Zt4tOkKle{hsfJlE+$<%tj#2}k=4q38< z2~K_Qd}FWVCzv@FUnIo0;Rp7qe8pSpa9oI6P?=Y3V=3 zHo&7Fm{cEqe`|R8`xl`99b1(R!Nv<;M17`^Z*~Bz+0`i~3Hm{l>=If0QJU|Sikcvq zj9y_v(pI^P9xZvH;Sx@`Kb7sTfqAO2tS~S5NG7nKnDX`VI7mXPa6oNOl;+|LCxBbTnP!kMl@6i zY4rWeS{k~KYcv5_Wy@9bHQ)h1x?fN>>z%Pce-w;D7+*)<1+w-)VjQCqudu|C*rJ6{ zGneAG>$z}l1Vj~=zq1bAyyCUO5BvVBuG^_@wR))_u!B?7+8182ZMegf06?rPu!yqi zNZ(uqBJ9RvFQgU>VoOH>d+2O75dOAqe2S{ciM$npOt8^NEDAGEokW5$Ivrh~!FY?)3MiR*d<8JpW}08zaVq)qIo+Fk+= zS@_+mD2hmIQf`)w*Kz5>zk9s`8_Q71HYBw#ds!%YX#7>+-JM)8c09XT<(^?mfl>oV9uhWUPz7;@lMl=X5JLd;AVLqA+ zx?+F$Xn%7YFlA_NdKwQ0OS%DL@EF*4C2mW}UA%+zCVkDJdz(^71EU~SXX%meQoNQ$ z#z_>#TEzG#h5*CQL8RslBg{@?|76r@M#r_&s=JHm`uX(I5F0+U2U*j(BuA)1%MI~I zV>IJINYG!YoUu1D=T_GIvoZbBJ(!2lx}0}|tl=Hzf0L5*m1AwDdaMI`jk z@m(V5^9B3d#u%@zX8>R^1ajd03{OFm3`>CnE-J}S@xEfjWS#~R`NJ_&T!+t@A3qK2>Ne)-Pu zdshp%Xac!4+erVq)9DPvBHLppf!H5 zsh+Td)5XXsp}LdFwy$pvyGH33sl0wu;uHfdcN+` zOALW+(Spaz^j(z%)UMQO`raj$niUx3$9@amLT&Ki`Q!%+wJ)cT#wU>Q1*zpQ`g%D9 zra5!m4JW~?i;P0J>*1s~%X`R&Cfj-8V;tmu3?(jDbP zv$;rPWEFGjWBjYSRta)UATa;#sv-!2<_eWlxV4aZ0hP!Iphc}33M{XFSst?^)O@&e}AphJ@^E# zH)51W9ZXHRJzQM4DQdQXs^b#jVbDUxd*hh5-#qV3plG)0V0`SaAPq0DfE}y^fmafz zfGlAEZ!ux;jsD*mCjwv+l)-jdKsz81PCu03~z^oB47|>L9$Ys zsM!*%XR?n_ezdGf9_5_l_!YcfeG+3yjy7_NSCIN|^wyVGz~i~<67aAMDO1kV!7JvA zF<2v1xZQxe5W3B zM*B8_`M*C=1Ca8RbCF2-y|2U-HQs0!t~2>5P~K#f({Art(C1WF2&;1D^4R~*)A{c> zGEQMYswciEl2gq{2gTp-;m5vap_*Aq5rxleI{hh%hSY-25D0fiA{mdH<00IJD$3e; z>iNE2nIjl&|NU%m;gxc1f_R`gn=lec&riwCx>Pj zG{TQ7RVfV9`T7n#H2hogD;7guv)$n z2%Kp4iIh|j0Ehl}i@^`j@-z&i7iGvNj4izGR_(_7xd)ZG) zj>Ud{I0L!O{hC@Zt1uM&zuQ-~^hFMXIF|lwY6TIl!R8gT-R`b4``>w7;QzWbaA1|v z;2o+fP;Q(b@h3OW|2y01DfR*C7Pb0$S`+(g*G^B5n&qN;B9{OL2DtbX;hnc4#+~6d z>nAa_Xqw2EPoqkfIe6-#UcQ{>O(-E?>7|&6sh2wzu3b}D?0+Wvl*{jn&qGW|A%A3j z5sNBTxkK@38H(17={BuOC_;*C;qbTPrHmE1K?(iu`s0(~_ru5kz46OAUo;GG|CaIy z1y4ijV_8XasZXwK+z1_t<&ppgl{gC9YY+lOgN1^>61!Ar?Z&k1e>3e=hlb7%kf0Sz zh9V#&n)8cPFz4=(SlC$!gpm#9k_oQVj74Nx<@Af3IK0fpbx^6OZBJ}B8d@f&yD;^2_QmME*@-;=?kMm$;PVHS-xEzK ztS<6NsSif^2F0^;0ygc+y z9|?!uL`FQ`7+Avi$nt>%XEWL2;@qcb_S4qj6tBfUGHB^ve=XD%`c9A&YUg zTppY$s{M$+7#tQ!gXJv4xoi(+2c0!M6k~EA1H+_j9>q^Kb?@54pqimrxW~k^aqJtf zx?9%|k4VFAt0Qw|wmxEc5%SVLUy3$@P6s$2YRkt$>m=stZ`YrA4RweiX@V{HJ>NPq z@7~Sy?bAEGgI?&k+7Q-UX?HkGSyco2XHg_Xj!s zyicEFh1h(fo6x)BFP9tYtOhX@n6u~WA_cSP_>a@nz`G6wH=#VbEc}lJ{pz*XH8SaN z4&u`ObQP6*Uop_>6Hqt}g@})D;P5IMNcANO@owEd1|NZjO4@9nL}7$tw8(4)uX@g zEx6JB=O2o*{Xb7%y~@D~$JSC*xP8XR$_qb~O`(!x|#+r;k{?a^AIXiiDq1#|mPes1w=gY3(l2V= zUj@0pz%Qga!SnDC?U(&yS)tXvc_vS3+i?O)75Z>Q=b@LYPEtmx%lq#1k8P0!e34kJ zey=z;5Q?(Y#JBW&CRlnZV{@3oO0$1~KNkF%Y+>TqLE9pyp(~CT2a#c+k2Y`8S2Rd& zJsW0_;s&!tDcxSF>osl+Ppz$Cu2F>=zNuU!DKIKHOcNv?Q0N(G;83||4HHug_r3;G?)c_0j=K~+BlF$U zp$j~J4GM;kt)^@ZKH5nwJ6n^xFE6iGT61BM@!i-nUt=VkUr_k<>?=%O2>+R_4_`VS z`OIMCvU$tj{j%0$)+)?W6zC}+7BpO6(euBCPrw1w OkebRZ<+AIRA^#7Kk}Q<~ diff --git a/extensions/vscode-aml/assets/screenshot.png b/extensions/vscode-aml/assets/screenshot.png index be43c0968a0ebdf9b1c008263ff92f9ff77cf664..343d76a3e982ac08a863e012f2ce7aeb9a9d0e16 100644 GIT binary patch literal 40621 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

    ulf5bA zx*DXtRy4A81j0_5Kf4>b_+%+RJPp#X^#U{1cE3__BJKkhP*f1s0JEHqx0P%3e{`pc ze=*fuk#Fc2!kSBTrvD#l?;Ks{*Yu6YXwzs3K%$_~-nc1^v=5UVeMBzG&E7zfL1!b!s!~zDJi8f=dV=dK% z;`8(&nC+1!CJaeemRGeE3>{^Xd6SN`NA|wo*vojdKuyNb@C@tVi=cPaN*^A@-Q$u5 zBQqr2Lv-g^Ev#nGhZxIWgXQ`0TkJSvGHs5GbR;G5_ChK~zp^C#;gYUymp}%WezNWU z*)N2c`1!}y7$wUml_9+u8L&h)GDt3JMw4m`M&TA+_!$Eq@lR!GaUDTr-)OlI@|uDv z-t>^VjNID_C01pAWy}CESl8sHCsn#*z^cPZGyld;XIE_{)XuOwXk9|U!vKeh_WXUToY42xVh&f>APIhAiFaS8q%vLgQebhE?CFe6wCa1%bHfPHBhXWqz{Y zv;Tr<*=3|dLX^XlG{Nn_3^=B1Y(|r|QZC)z-A#YduhlsVK2QTH{x4{$x zUriofAk^1!;nrrxD*Spu@#DvKUoujgc}3Jl=tekh*!I%+_c5j5PXnC;>(vR|mZ;M? zkgcgqxAAr|&mW?zi*#;v%@pu&Q&do!F3F#7=hNf$R;~ygbt#nWHdfgLI_E_G{i%;P zNL`~_$enT>t6@vzt$k?3H^-VCnrL%0r~OyXPEF87G#;W{DxqW0D7_aC*DMh-+m9kEO%&jCRmlN~ea! z5QlYRyN+VqkZQ55^eOGrl-kS3JI_Qa2yue3yC*u9#>0iZTfgTUSp3Otxpu$UrcI+- zOG@uE3x!b)ZkI#xX{`ot zoXr<#UBk>-Z&|b6N*%@>(nWjuiWuaj=pg4~Vu&&Df6(P*;MPek80QP;V_6HNlslos zlcSt=ShjEKp)(oT)9nO{9oh>ngUw`onEL`|F&q7tP2%5%TLGF{=-ht&XJ;YdLct{g z_cOE4vkwSyNLYfev}B4{a12q}rF&7hH*QN@gL~g~OjkeS;(ZQk8t7Y~CS>G?0Mvx5 zkAeN^Dfw>uZU(b8Q}i{TK(yq*yj*zT;sSvI<5Ox{3JD7%9FGJM2)#!B^i6ZS9dlK$ z`!VQSEnE3^M9DRDvfTV5XX1yTpy8`LBEU-;0Z1UWR0_k4vRRD! zV_qy|U)!^qnDr3{aW-SlK%nZNym@}&^(C_np?npuJKT|5*Hj|lZ!!oqW^6`#^y{=I zCydO@%=NG5EYeGt0CBRB_O&050hCm=O+~$#xDPHbc6OkD_=73uLW{9I+Nb=5Ja1K{ zecO`UGfv~SKdz++FgK8hhAQA&UyB6e6Ntl%Q4EEAszBMT+9}WTGa?rGuz;=2jrx*f z!fJgv!?QV1TUQ+5cTvcR5y0 zHEzACLb1$wB&4Ozh*ip~4`zZf$lhFzM=eo(v{L5xo0+#TXsZk(<_EN+Z1fGQD}pjv zsR@ud`b1C>EMB_k<1~h!`Ooo!{w9+muJ^@Yvwe2wQhoGr6n?s>ir5g25iY%DaM7{_)!1KXduN>3PxP zhek!%OyJ$S!r_G=O-2Zl*!X%qxmX3ln9?_V37YVK{L|I@J7w-l`aU#7T!_eV*qqX# zkka7B(zVBOg3CSA&09sRD&h(k_}}9I>?HNW5#l3}fwjW_(I=4kE&c1YQjv7p)$o$g zmwZr1)LTq18VHHB-dwD1=_~@aTJ8-6$a_a^z!8!&<>y>s&phh)>p~4siy~MLJIQNy zw$c3jYY7qOAqk|l9zc$x7;Gt6Z?{m7rrc-tNsLjt2zrw}h@tJ6tKW-YIiA<`(j{1) zyy=b^FLq6wiq{T3`r2VWwIX2{o&}fVxT0Dj2`LfNH+w$E#0X!#|o+B3OrVES6ND(Kie`CpwM} z%~w5=hFz%vBBCN)pJDBPVQiOZ49uo2IQ@yde)cd3V^zRv@^fBF0Fth^XKGh{bRNEi z8lg|1(S9T&=;~BY=G_ejH(PQq(Qo(vGa;6EIj^VFmBs>Jf)Cj-6ZB-g%EHTds-B+W zDQ0^0Q}wcS4W&${mp`QNd;MgkETCO(-A+qTe7$`Pvcu*y3ZzYu}Bo@3|2DAY_ z`t46fp)rmbnveB`m;jk`WMpWu(--~5L4hzv+sh728_yJPEH56P{ISfv9uF|g>C~E^ zoujB)x74R2yP9$JVSMO>tm7QELcFY9p65fDiq=*LRReQU z+=eT9INV`8|LOC)RG>cCz^}4L_;2gD8Y{-#*2OZ?MBLcivFtiGeiJ_cHFvnpIft|h z@aiQVa3k37&i~9JjbUHy^_$C`Zf!gQ5_+}nOfVDEscH5q9yJQTqN<8jtYD7+c#&b6 zwOi2t3%_9+Y@oZU{j8@#@uDo)Y=1A6ZO&J|RqWZqT-+^>OczPknLPw<(xcJC6S(|Q zCRsJ>GJg1y@kR9AQ(7j8S%YcC#H67**eQ7)f&0t3-%L?_1?EL_y}z8&P-h|S+18P= z5O8I+iBhQxW1&{NsO)jE5io1EaedVk81fG?a@sc5?T?x;FY#XOrF?gkF4L;>a`ME z{EY8RH-;tE_Q5x=&6+a=m#9j68a`YmkKm%A^mEaSx}}crT?OneSUEza*hFV>Y9rJV z_>-^j@k&U6o~Kl>`LIJLnQ4#oNTjnmu1^Rk%Ba))q{wgAgbdX8aCIP=dt^F>cm1u8 z65+?ce+~Tbkpodh_91m_9n4aHk0L67JfaF-t)AQly2%{u8F!8~c={H*`-nzbD1#un zyB)n28CR5un!-{Hd0y>^Mn_VT!+t=pRf|{cRBwskMZ(~(J$5qUISfq8 ze05~po#fzz{QDS)jYI-xR8IkScx^?bZD;`DwC$Isq|v6~8`-w1Dcqqq1Od4*GX+g3 zFbTo~t3oNDmV*%N7=_JP!u{{>1@nLc4xG>P%2(z z9zG5TT3QOFC|P}m2w*@LwfR>pKtVYn7bQehgf;J>Os-T!=i_bK@q+s4iS8DkL&U<^ z`33p$Pivs9d+Q!~3*DLEQF$QLv*+Xy+M^#wBla35sY;=IQ{IFOJN|$6rH!~E!|0W= zDz(v7kk|Kxw|lG(XP<$WJS-QQFE3oo2sH?FYA}`#b!Y^#Cge9+q`hR}-9QCNkB=SDE4=#(a9tfKMu-HP89b?xW<*47+6Akx%x0!n^No+3nM-z@5%1@gUN z%RCYi{kv(ej{3l|LMD&jq+P~daEIDoBHQC{cXv}DCrG)XVx2s#*o!Lhw$?Js3ZUTgMTVr`&99bKrhYU$a>;W0sH zMa0uOXucIIe-8SL>nw6~A1O~GMcn0A&>Gu7Tygn^^!If8RV0GT}91CR^2@={iYsWXd^{ddmd(BOa6)nxy&rxW`zDkm>(W+ zOgTV?z=(3kNGc)yzV{g;{fExs?|ajf2_H;PR3|F=h0}}EIgRQg(|2IYrxw#h%e#-I z$r=UJ3G`LSB)=}S7*R!8jy`4 zo5zX;c&OY;;I|21Y&O+$K;l3|_gZ-rRJeU0Z~AF&fwM{AiQc~aF1jEW*_Rs7jhLjz zPuY6Af}a7eO(lvR$h)GkBaj3d!~E)G!ao;>Zc9$j>Pm56M-jQ?;%B96_H_-rX5t%b zu*QwHv~%Dylf>^sR5ebJiB4y0sq>|w*1HpY{X3m*bV5%YYjT!1+Hl#x$mVcn-avZS1^tRu%w0VekJ`uX ztgtUQ{tC0JHq{W_lfA7!XcKIdxUJKQT&=F2>{bU8m6MlzBU05l-9LETv zE|*)9qy}O7*m6n$c=~nOYPM1aj09}5!4@XmC!X%7JqmC>{E+v!SlFVO&?w?rB7bet z*BBpDLt?A!Bhk=t{-Uz%A?_qU8kG!clNd+&4MRpC32e$DLjyBS|AXO&%PAzgsZI2p zIql)!EV`J9o6(rD_%1r~TAXvLO_?+VwN$|;|C|msL_bq4zhie6!Cy>7*sb`fTBw=u z#3P@>xdzxpN5>mDF_%BA$R|gS+)IFIL#{& z74|Q|NRHsPO2oox^V5Q=kk*v%0&DH5&|4P$=y5;f7m55wUg#ZRZ|Z)}H+fI)TZf7= zgJRkpNLk6*7@qzrxArNhfeIk`)pih6IE^WvHW~z6hFlv-6Zt3IdpYxTQy|L*Y>8AK zZ1o9hS7y*iV#7#ImX_-gYNEiTOioBUoiQ}?-s+j3a3T!X2MsH%_vEo^!OD2V4<7EW zZ^5NBuHpC-u=-RK$6nEyVrjS5pZ3bH8Xql9eeZ1xr>C3`pbr>?15=B6Xtnt?> zl}bm2pPmZ%?4lrzTV?pm29w%My%*C1=q%~u36y&S+#2A}LCeZ=UG;EGbg8t<6FE_C zt}htsEsL>zAf z+zT{c9MjS!SFi>~#0c8d8E#Y)Doyv1`pTEb<>98y(?-wYJ>VP2Tn(8#i&VQB7KR^0 zYH%q+$VQiXS1046xBi_wXAR(h!`teq3N}xHpx;P3;kW~l{y0lC!D!sa`Ztj$JS>P} znq8?@P3Gl{<)DA=JCVZ6Zc0;E8gCJl4-NlZJw^N>rGvsoWl%xTW>>gVDbEyb4DqX^ zmp^(u-Q(MU@`8wxK;5)N`z6BH&CoaKKu zG4(il4iF6rBX~nc`5gw4JWw%v^&`Ti%{*h<7Oj%e5-I{AP(WR8>zFnikX0=(m&=kA zLzdy=CY7~dnmX#%iUa8C#IIK;ZUh7%AFs&xa^{?z97v6#ug%E-KTUQvy=U=zX{&xC z23aLXxP)^Jp;nh00&ecNE;wqL{gH@7`d3p$2RdMqo?qZdx03`e^J``z;U2<%H+!`h zQD%=vR1P(GJB4T6zwi1hwpPaHRi-v3K8))*IAIAK2=_fM4G1zaG8QO~aL4pql}uox zE_U87f!#w5U zGCgS!%p#YEy#e#T=VD4ef8RPTJ9t{b`REI9!3=8<`)^H&k2&zE_5as2jQ0O6 zOJlzt{Cg~NmoUIb;e6`> zl-j&+YGp$$G^@Jt!r1fE`vJD7Bjgp1!82ETt0fXAFxmPFBXw0#nK>w9eYk3;Tq^_6 z^j_;&>dD%l#sGoQ6J$l2>W#aR1?R$Uv@C#?5w;Z5%02DTmtFgN@btL$9og~)+D5 zaoQRa{LCKFuNdCs7tZjX4sth-tALu*O|CPN?m}a3?p{!a1xZeQcE1z+a}N8U7WUz) zP;w-J6z1SN)U_z#{wZM44kE4~dGZ+K@G*C4s{{f!Srk4dNj*#sxYQb`$hY6R z+LTaJ6{{Iv>mp5|B487B1?S^^zt3xMAIfNhJuh+Dy_e@JG&ByNR@c=a*W~VAFq@B# z;h%D07G-yeq1NKUXaid7RW%5rBjcf^-qUImOve4mJ^GD_L8AVo%t^l0*V3a_=(`p*1 z%y&COMhE+Ux8x`2q8TGIi|F@REAhM`7)i|)hm^|m>^$|wxL=L>$G$q4PaI5k>5*Q0I^>=C~e~l#^H@gf!KW0V0@^#EQ!}-+?&(W)heO9{H zgPRgz4e=oy$es$}4}}X^Kes=Em|2#0#{WFp^4+Ced5LnxdeeityAJ(2AlId&`J7%~ zvI8WL+ty+Eq^jKFLAlC~-5+7l!t-{ldAXcrgEwvqT+DKc%^KpWvlR$6$=eNGWxKj1 z_0+ZzN^kT?YujaZdW`rf42|pU8SYg@ekBMQe1iK%#v^tyA|2l(mI5Z@%r&50rFoz2 zgB{xbW>ejylR-r11hP#`F)=lK9cUN*Uu^Qc+8~M(L67HWvY|DNj^Y)xW$Qayi&dNa zIFE>S3oeKBF{x&0y#E*Ld^ti3S$X#SLX(cH9IX3Kqj*w#H2d(Wo@yP;c-_;_nv+S< zP*cq};-qrT%pMk7%AfSJbz{6vOpGQwU!BXhbv%qeMcq19v_$g&TnpMX`qCDVC({{G zER|?WOP-k>#hJKlN%sYKSN6 ziTl_%l^tcS)8j}W3n3*)JjQYumNc^%=IU8^!(624NE4p@OT@uX{DcoU?|{{8*Lo&` z5@M;CP^bFK=?qmt2YofxAEMUw*811hxs}W=2c^Z+`Jb<*?gmOrg>=!!BKkNw<-({h zC$pmCnJ{5nEeJivv0Cn(L7|HxE~hS}tTxZet6EQ6(&~fpt^u*0iygPruL(OlaOgVi z<6Dle+_4B6dTG=cCLdDmD6!-{ZEkkRuSwVCZt<5+v%WCV{D*y}TNSrwm^YJX8$8f# z%479g67c>AnL1nGjFU3ssjoh5^k;-x{d`Oo&wf=^y7I@GLv^JNI(-rRds8A!nFu#z zlLh@+?oZ^m$E#xYKbgR>zErVO``28M1EKdv5a!!pEh(DiXMe{U29#E)u8FxLe3Ibu zFrHalbe*OjA0Ne8<|at0h0J~<2AF!*2jpbIRvfcocuau|URJp?3S3oJ%W%$`DI zj+rpIG$KYZ1?P>b>tXm&FeQlXAwNkMf0MC^kiO9t+S~OQSrNQgbf4Z`Y}vclLq@%| z@{#Lu52+UXh+tp>u}IBu6OD@wrRB_(bL>&5^0gAGO^F zj*ESdosN@}zD7J##R`m&xC{s5%yYx?WVQ2)ZsKcOyu;OOjBcn_^0VBN&ZA>x^l9O2 zH%y!16H$j=Sor;rPzuRR+N&P^H{s>IWEA4Na%@s&e9&x@N+OBO901ORMdvLxr^m=k zD>6LsSe!@qIr<)3OERezYlymW>Up?Fq_bHAhM+oVyS0R)hRIKJFKw_4?k<2pLZK#g z{ru8G^ERR`p-;lYFJJ~6TV^6RmLw>X6;lJ#H|KA`!k?Zb_4o$`wsUcIbjQ4{T_sf> zr9+|`gcOy>dJ6Ww2sj3#6d!6Oraby~JE`CKnDS@!@`}7lMt1+?9u%ip9v3rK{}^mC zo5Bg^f3l__-mU3j%=W!7WFYW}*2`-$(LAIA&}+_aV9nuBUSl%u*5V34tZ10ZOps}# zUKT7iLrN0)%RWXnzpcp?G$XIqU0qY5V{EENxXUN!wVpm(=5JRy$JW@tv{04a%hGC6z4bK+^&b!jc zq$tJf^nKJte*%(0hKzm-nVG(iCAucvt`t5Z{F?`0`f|N2 z%A`QkkvB-nr=Mj?8e37UmvgzpE0AUJ8gj~Xu6V&PHeGR;tKovz9v+*9o?!$u=|LU^ zw+!+^d=b z_=J2Kx7!mVV1;A%<@8kp8VI)%{u$Wj$%@>!5>87IRaheeoAhLOihgLW zRA~>IH?j4~?Rtm1rsw?T`7AhSIiP64Y63n4v~nA6^XTT zWYyUd>JC%U?6Zn=^iY!I!4S#e_Hyh^NTeCcP{}?f_)nnh)}A(A6=#y&&gPbU$FzP# z>cQrZ3{AM{wrO^hW2$nrcY*jUL*Dw^T6|V=Gj{kE^;qqLBGYlSaQ3*Yb2`uIKv}+z z+6*89T8%Fd*(wgYLtDKOL>6k6p$?=`+^ybZ4stDJJ5wQ21yx4WdD<`NNTv{>*FUhw z^+$hsDYy>aIqnAMcJ}xSBI=tw_CXA+DM79H(=SdW6;_aqgiR&hq2hq4a#O*8(o8na zl`iiak@y{R_!}qO5;C>0ClsuXeD22OT5^BB-Wj=agTM3(NFj0@%!}SG4VJnf}48-v-Bvvn)fX`*^F;pWrScMmEMgIeE-~1-u-+_QtQY?oZSl zq|YfgGW@cpSGqV7W<6C?Eq1t(g@;WJy*l8YTmkc*p^m)SwD{^jCiRA9_&iYu9g+^2 zdHAvx^Wrc}QaRVcnZemMXxHqF83a%76jC^} zy^RECr`%v|Xtn3%x*paI$jW_aEJ>^=>(iO$YTxsf$hG^!()2@d;c7#8b_*3lOi?G%qe3u(>q<)X>Xnn!gPl8Y(^ zVNEH9G2+sfhzQiLq!0ZJtcfoWXKFUg%n~l~cw2kFQSWG&sXIDLl$@pQYr%eNw5fA`k z@HP9QGShUf40K#6%6!zIT1I|4SyMqkfQo}DB`i2N#L9mC>MK6J_ww@cEfxRvcR$3J zrT(Cs??$k~f&u~pxr7(-3R+=iEB(Vj4-XHj-pxkJGiBI?V8zA_ypojC2-qfW*jeO# z1pj()5<&O?eEji5!HeI0ML|S77@%qlvRtuY%pzSnyQ??~D_D@T;R-=2%-(iv=Sffp z^dm3^3GN4I17~6G>@uTZ&HRkw{ZoNl9OK|hz|20LACUQ8(jOnce*-GVL-wy;C%wtv zJNo+^bkzI^3Jk1Ki%d&b%3H5l2&(dvZg&L7^V~3LD{Z9i?t{;0R1%S?zLR|;P6-bzz z!B`$NhlwXl{+?@ttBhxn8^-mU|8!4;@;(4dLGWjO^bLp(bitb1U^Y*1{WuSkZ(>C(b&cilhtKlyO43u3s3CtT zQ1njeD8-5?$7vR%E_m+tWK$jBJGS_O6IrOg>tTcVL8Q`(j8eR|zFD-oviS#Kykm|6 z@PCN-^J60atlfWO7~rhGR0<6IcdNa|(%9H|qVDr|D1!X|>#t!f&OiXf*v7U6R0fk8 zIexg3ynRew!W*ugqQ=Jt!ef6+9Za9RQqBHosRr+Z>^8g(E*fz@QwF3%NPI7=sBX`{ zj`m;ww1wV}(ddM`Mx{{Vxd~|8IG5E%-82pVfL@hYwBf#}*9@lQ^nE*JnckcWAnuD| z=<**$dIWABlWNW=RvVVjtz#aSm0fCElMMxU9BKjQ@*pI z_2W$gHVws_+MQaHvNV@zI@Dc@MLTO9yhF;~3dMTmt0^AX&7rt>X-3Be7&TGwu*Ff( zO~;&>=kM5H6~c`%qoxHusO;oNTdRL|eQDl1v#U_86OgWe`yt|aMteoF6%U7yU!|{2 zChODS!GWhK68!$ALTf)OUM|A~xTm0$5ziF9_&eXs(z@FMMjC6K=NA7Ml(M26=_zj` zRzCrWizYWKjNU)-&nFu$whmy;?j!e88~B<{l;brVag)gnyg5#cr=xVZI5R*D>!trg z7e40}It>A)X~Ji|qJm2vXx6u}oDO$0bW8y~SrGn!`9S#6JceekQZWQs#korrK9@c^ zE%`6U>f+KH-PP9AOYLL@yH=oLDDI?oq-Db0MuUghpDwuuwZ~WE1FAk))#mks^Xv4X zNVTWUuj$aC?r*mi+q_H4#m3K!ScS2>3+#wF&|y1y=MB|(xqWEB=4@~H)5st1n3ybJ zQkxJ|QD|pXf)f(bbVSeai>mvYOV(R-eC8pwI(zpcdf1C@LN5YZ@~n2_*$` ztQ&~g6TO5_TYH@xMCFQ$ZZyfD#vW5{@yzmmdY!AA3UOb$jke!T$|z=F=8SIAsrT-8 zw|nxgaf5F_0LHEJ)YhGbf~?zVbdq!h163EYBVqX#K#4VsWkSu#GdnvLif%+q)Xfjq z>G#tI3Y#pikc@{D*hKVq<7bHIcLf-|tT^SKBS~kqLWLJrzN5Cff02{wo$BU#2u8Iy*<(aMarb zq%+I!r`ME5jC8hnr{C@2cs(T3!VVlhSRsCgw?y7`(tLo7`Vg5zoLsEBKhAMkb0)n<D=ESoxI_3;OVUHx7C62+#Y&u+uu!7hje+?nc zPHJgvk$TZQ4)a6B7<*^lQt=1~v<-GaM?htjHTj^4ADYuItBT+yUCERDT&FZ3vTV~feqz&K^RUJ{lx5YQM<0_dXuLB2GxZ=Sw$DlHvQc1 zf(8?{0Sxc9VGIQcY-Z4vTnER5Xnth3ZTuraI&_AyKccXt6w(KZE33{#H278|(0*Qn^R7!m@Hai=H7zcD!>?^Lx z(ADVBw#q?A7DUqWD+Y2!e|P=z9~4~xE&*qE7Y-xb7>KO+-AICFRj%v2NCjdK(dDYy zi<MGE>g8CyIk@Dikp~(mYd$sYJYRt~5YAPe82o_}4kDs>;eva1j#UJ6B5gX0 z#HZM_aA0lx)+Cb{U)vZweUfZbi1^RANtg6dLD!D{F#ChB(iaP3O4W9f0z;|jeDyK? zPU%+i7=>YXX(h?oCn{Nz>#e45M^N%}>kIq&0}BuL@Fw5L2I&6m1%L*90tj{Xh&PW( zJ@Bn28wdC8-Aib9bXFE9c#qM;1egop8`rz4S507u(8JD|B7Cr!$07=fg7vFzUH+pY z(%4gGqG&xv?ZVP5q9@bWr$J|pPL&S`rBXU2@(+yG0^yHARM;G_?LsAVR)4*seL0-K5Rceo5|d2@7mbyW}I2)q*(A)1K^^~Xx}-ep~S zYYR$(7VR&d1K{G0cc%O2vD5kl^|27|17M^1K*N6_5>BEb;GHPT)QXCVDQ2Yix1*+t zi;GRpkhVGgK>cU9O$caW8%r$1;cv64>F=QSKRUqVeaEhb;s(#HF&J@)UQ^om6}RO1 zqhh31W>~g(ed1|DxzkSALS)v4ReGz)--k^LlK&2AJN9FH3}b{TgHp{>{tU2vhLx2v z(lQ)57H;gWOzVYt-%>ct(ufc^`q0@Z%}eMP~-VB&eyEA1kOh4!m>dQYyvmk`ej z1~Ih&W`p!Oq`&Rw+JF2w#Ts6;=WwWp`4TZ5FYX5e@wSCV*D#FI)+E{ASw_J`qmcuq z&!ihxr(+YYBdbFdlAheXMP0yu=+0pyOxJfyCHb*}0?8k!WHA)6V|z2_A>_ySAR(zc zVtF}PM-*G|_W$_V+#YBKR>a*tQ~fX~+BY;f{J-WzbuBi7eQ;EWih_cIYr@w(@Bhg&Yb=kkavx;P-C^+gzcRt>5Z;ZP#;@$0 z<)WR&)yVqLSsrJfxL&*L^&GEvm~AD_0+BV9;zbtQnWY_Y#ZIhBbnjQhVys3RQxa?! z|FMS}6aO8?t!ielB{p`2?Kca`o;#PZqZ*N6`N#6`{{PLhQ;@E}2yWW1CFN9kC69@4 zvs?lJXn^S9dk!>b`2q{_p4aUq<(MX|Ojyq`l24jyd`YArOUUhcwpz?RcYW(B-QKCI zc8#lpS)(BX&LqAnUWFcZFAH~pB8NUvqR;7W!LOH}PD>W!QMJVNcYo7c=a%=Z8KOf^ zkhqoAwlLo5&pL-Q5O|Eh8iIq!GGfa!2RlYFB5)=Ih0|3P{-hIg4@6OLX%Ork|Kq-E*M zj?G2!OYHTGRQZx?`)Ey18a1$k(}A2Yr6%lzV&q`6P^mqr74d;o|!K#$NdZ z1N#~b`66biQgv$ZX%wWGqMPRCKp09W^A|8a5D8LD=|~!VnmsOiH?B*xtD)<_Q!kR5 zm-Qc5+$7q-mbvuJF9#aOx~F=xtq6!#Z$5LjAUt^a%j_72w{E)}aY1w2MAp(A=vd8n z-#5N6Q?ibtY)xI`fAAnq^1Io~${f0Ku)_c-r=(`GxOGlgP8ck){nD-w3keiV?#lj_ zhz4BDe3r{b>O*1a^*G92I0!ARkR%$2bMB{Ig;ivGl1b2>$j?*SFSvs-EnDGWy%ord zaD-Ms`!E<48mifq%|S@6D_d#i8S*epcL7o+NL@{^BNd97GH}G2q-Cd7>qAQDi!DXG z-n%tqw$p3m%k@E9fXsZ~i36;NldX90x6yl-_1zP`&_`3?YV3tjsVy^EJV1qcTtERJ zJelz>Uk9M1B@am1*M|5 z)e=wbX&vVpP8%#u!dpgj|B(L!%yA!X2iH1}9$}@8p;f7;ZQok?9c&;&&#rMgQ1$7%pa$z^Q026+9B^Q( zKmFQSJzHD`^4dU_8f?E4TE>bi@Pxp1ApZO*kGtc`F;dn^I7=^Zy?1%Vn{1J~qtoU~9X93qX}+>~ zeVem=<^{3f;DT}YhwCz7(BY_yjlcbejsGg3f9L-&Q4Z}%yA$M((ILCCU87W_z_0x+{IvP6d4rQ3RZV$L_|4< zQd*X0H@I;`bA`wq&dgv?^(c{5pQ${Y5qRk*%SnC7bzL^XhgLX?Jn+b*PAQ?8?HwHdVtHKLwzkI-!`Va8&U(n5pFF=WG zt3l_|pY_+*IHLa5QU$q)?>@l4&tJdLL!ZcxA4X?Le|0()=6`ABzhIZ%KuGgL!|OGUfYy9GK|m~?k%S+{DqB+}v!eQDD! zLs7snhV^zrWcRrC0b3>EBzy#Ufkg6g;gi&GuN+}K{H+P6MG5e_y& zZ$K)XpBtan?Z4fyHGZXgHO)4YrF1~f6e9*Krj3lue>hG5rIlf;`j9NnEA#_Gf`O#d zdf#pfXov{>Ki|sDz!PV%BCDT1B(hr`&Yas_>2kcRA5CM=^@&6rjMG@?d{X2cFMFB}=24#dIWR^R`A&4C>|1(E8>^ z7~i+M(e8=M4k%&%a^NN^sw(T3G_jSwM>1R0Ye$~&a}@pCUDe@Lf>S}o1AOSL%t*2m zy-f3K5Ap#!ApQKAo;{INQvx|5vNc;aErh6*xn|$dRYK%XXf3^MLQmb|GXR!eT8`xX z*?+YyhCGmN%Ur&PE|T^@Q5}HShDq;qwSoZ@n>(ug_&n0LnFiauC7BN^)uRo&J~pg1 z*!55{Vk%xs!MVNT)FB^)$4y*@ZF3pU`M?X!?q2TCG0(<6 zDZK}ZLhxce+80svHe6DzZ5Y&AxDV{BEob{iLknlHmiO7~oVd>q1mUe8kkjVk1BsdE zw-tI#HhHt8$uwMw79pI3Pibe`-Swiug8xZxh_p0d^Ylg7d7 z3K28AI(oz^-S}9)T=O_B7aDQynC;K+mza4Y()cdKYDg(%0sGOsfG*^ku@PO)LT3{p z|1#|?l&HyyQS?A5$Ij*MIH0W~tdp9&L=t7wGHmvol%wBcsRAn(@CYyY>%hX2L zq<}!ECTDl}o`I0y&yMNSp+VhBQrRQ)Q?AaP)bz?c(h`)KB##Gf5U;+N_sL;oPR4XM z*?mEWq&05wJ+4pJk#T{iiU=9er@oR&kC~Ra2&2B<8XEXYZOGoJ!Ce+=r?!C6;HH=g zuQCt04%mU4*c9GFqsDqJr9Gs|s*XRslR-&7ozw3w@@$bQzAMj0Wg{?v=dC8~&navJ zh4&+;v0J>Vcv>F2ND(3W<`Z+q$@ey+Gv4_YmZm`}Cjw_T+j~Q}cWsDUrp2cNqKq?u6rxgCQ&r}YRFejkX z0y@ixyv{frQNL}32doJsF7#dKE6^+$siG!Rl5;^bMh2dxgTt2Hx-JWnm5}O>hBJxP z*0Xzcu6k76tc3_bfkYJ=*6*{pT z0XLY`h0s=}!q%S4Z&p6k+@C z=fbSp`DP>tFXa5uy0AJJ5UH{GdnjxV1DXj2lEwNHk=1QQgNVd2#wW>C4>t-%Row=g z>^RecCTHj3grE!tXy~+pHHG|OBOBi9_TPhU)oIgp) zMy!nnvpQbcRLk{AF$#^_T@TCMPV{BFkECysn({KAsv7jzYO5Q(FD)zhyI%(2SAb=- zwqsHEbpi6-z`6%5@OpXbT;x36&);Xs?&4o8NConWk~HK%o%8FRec9g^=Ksz~@azPS zhHEbC8d>VUjkQwird5C}qgbW4bI4U(Rm@%$!-AAj zX(8XVh^;$*iqD#daKW3R$2$#iFy)41u!xta+ zW}rT@>{42RWGtOT**TA5LRZ^^j#Gi;Zs>Ya>z~=aUhEmsmdpFRUz!!&M9wRkF`R;+ z_d~DZmjX?xO4#r~dhfq=SHPY~RM6g!_;iiwCOQ~%>vT8M>+O%KbxLv#n_8f5wYF3r zy5F)|?6!%el!Pr7iFH1MKMi^B*jieHd)%iy}UPNvl+ zSX>C;y11AhEoJFX)px5|=}L4x(|^u%I(8s+mnF4c8bDiRr>jUJ{-(x4I=Z_WHOO)z zxfv5c`#KiTpeqftwp_QrWu;_+U?B%mROB!sMA)~h;W623_>M8R`3l|-vnM|}JceTm z^UZJUDcMSVU)SirtWlqCn7!&%QnLQ}hNw2h4d&aPy7{7c*{jqXkrwD`U9mhwiT9em zD$F#pk)>b@gz%Qem>N-ke^L4j9@5<2(eQwUaYEhQyd!oQyrpu}&1m4{0zC|QQx+6XAXO;_m(Yj-Ecw`-H+~#efw(1MLfFWI(i9+5*Ti~Kj2`Umdtd6 z99C-SDvpuBzopXUebh=9Z%ql(C0e^+%hQi!*)T#L z7cQ@4aYm!pc*JsSuw7`OOFNE@MQ*yxZT+}-v)cbxB@^WFTh$H;hg9{#ePwdR^@&VC`%2fF=a=45T3m^xPR%uL8H zL(Zqh2N(dokut-_3@}lfS?BX&|2*ah6$bduL_edA!eq) z@+2oG2S{4@wO0m&WXZ_LR$9ZLfAjHu{@WuS5a=5_0$NhZKGm+>JWbeovV=xDzH9s% zGF@+ad)o?lkslGL$S4I^-3;6bUbL;L(rsh zpmDKwUBolbHZX-z-1s)Tq5n5_Dog)KlV`T&Yfg4EYfAnUVZfhghyNdX#sBPo@8Rp$ zIU0_{OQxNx2ib|^F%7^;5%#Zb_yZ3ywEQEN3MRQCpj;CgbzTK0=R*xUe zEwy>t2M}wqkbr5R`V5Zm%{;|Im;?AEb8qq^uNQ|KXI|2<^Ks}sZc#iIxl07fcPk#M ztTk9gBpSdu1e|uh-jqf&Nsbv|t}*W-Cybdmab)P3`L;~@;|fZojH&AC8q4^9C71Q2 zi&nlebmGE;<#2=@9vSV+}mFGW^5t)wH{ETSGy)Xo4lWE-buw zF`lk9i!#aCZS_v?omo(ON~;TFxW;;0)g?eYr8VZ`@nk}(yin_m(Z_R*K5nk|Y%qf( z$#VYU0LR%I!7;@(lk2sVl0Y{x^lW5dL3wfo9);fcg4@aAVOd?ua>0SgkMJs2_Py7} zV%Zh;K#@7}u>QqTd${cMNki|(9Q$Kf;#GG+Z{v9wqM(nlyfNb}ywtgS-SSHUE{lD_U z@cNfmqU}+VyA1QVuf%FPEC76asY6^fVYGtup&ci4ZoVz}8_zFv2N%U$o&NRE^`tEaeub?2c zU!SRLX4H95udaYJh8p&jW5PPZ*fP$SVvwRW9tE|}#qBK!XDbrtPnC~hXale5nv)&R zLpQ34hfHqO4~!aZyVfBfVa(Q}*M{hYIWCWYvTe7v{>>IHmEWU8%(Tzm;7t^y5z-uI znh)qW6RKU_2A-vsWJyDs9FmU6u}|V(1K}(sQ^Y?s*{vtjgrdQHD$|75#z~V}1#}3# zxGgbWK5CL;UUfI>$t?}LCVffWHYEDW`Gc*{S%ECEQ^(5RJH{L<@d&}Ktnrr?(RNUX zGR@AcV3UQmc5ZpmRo1gd9=4u*Ve)bwH9>344!_~G?0&dU5}pl9@|77}B1?Bzkb+sB zaa_2P{CO?(RT5abV^(jr$9*H8(|=Fp>{JyH8`MTGSG>y2-rNsavPinJsj@=w{5XSs zSG8{PPsUE%m{j+r%1u3nhFix#ok+Oo0P?=B>WfxsdpJrQw3ASa$6qr zYHrYq>bFxM1ewn zXd)dpKOZ!g!N}$HEZ4)SpMFzhQg2U}fgI$SD%By)R1wkA z!Un?x{{5^V?~M%iXpG^%xB#a0E%A+)k0Sxc-SFdO+E)*TRfWfvJKl~@FGr3T7rc*^ z;1gw$v(@5T?6!wmtB;7GnJ+&qoqi~;-?&=17kQz0zQ{m-u2vaY1O#Nl5%;9=D(`;7 zxf$~Ka_BBk_XV*9_l2IYYfmA=kb%yPbr=;SWCGEkQ7byMIxZt$I)v?f#(j-vfOAh#j_5 z|3H1Q0l}yF>ag{G^Sk6ep1%>X<;{%kYJL#wut~2;i+yeI5frzc{lzontJ1Yo1 zEgnsb$#+{cTX${ormL?75n;PGM6ShO%G@gtw(+*jl&WJMpkVXDFh>|dz0bodE5=lM z^U4B>TP?%Ocb8EXV>iSp6E@sMp4S`MY#NO4}?P4Rq_1grhRnL{G%3-lGs_U+i2V%;o&jV9U=}ey& zo}%sI!`I#SQ$;=Omknf`KKa$ey(QcYa?_{VRj*dBwGNS2qifuPc%;jxf_1kz<)Bgt z!|1>mBltl8E6>HYggyB1ZI^ttLfE4UlK6s~IsT~T$UG?g)eH#<8YDSz&7OI?h=BJTY%7>Uydkj};(4__YZ?1-_wjT6>N~lnGGy^) zVPd|%JLXD~BwBkloQabr%{?(2Y0SvoYDCyr>60Gh3-^Ygz6Wjn%k>qNibQ@hbHZam z`~2_cd!4qYeM~4hnOc2}_OML&iYkL1vMR|8MQ~c)s5oq2 z_4}paV}60CB%&gQkQ#1&gx1r0jQT>+%5-fei07=&b$#t{X=1<_JUp>m&~ad~KCx2c zQgm~bsSe(~ZG>5lG9nMEtNmbre0IG`Ww(=U$!a6J_)x zbq!_mJ3`2?;sQ&{)n`4x=mQn$ZaO?uwSy;XMh*T9*Sff%Fy^KS+g{5=VCxUeXv){n zwV%>EJN59~+9y4ckF&%$5#IdCFSWt1)@GgotE(p&0fJ@7mrtLSb}DtYId_v+>ftmc zu!zM_%S%xqP%j_hzN0wOh7+Iw$qGt;JHIR9=ZmMyd#K}Erj~f0ib~0}7B~3VNO;;W zfIM+=y9+EKtB2yXW)qWGcV)jo{u^d^Q~WC5nDHrHBW||x$t~&3?q4c5OPv+3!m*N^ zzmM-@PlHZo!FHpU1N7yX$1z^1+*rroVgP+-ekb~^QmiqR8>(R+L*XMOMK`=8H`~6y zw4NsPbSeQ7NxeWd`LQuAw(jZUX`XgNW_c22y`8x*JKH|K>5+kGkMSEtq#f3p&X^H& z8gS-0;|BXd?6p*!k4IRKwLN=PbigFCekf6i0le~sY<~i=i<$?syN`rZO$6sgut|#M z#{q>v45}_Zn>IseZ0Z>qED5?1s+Nk7i1K{2x_65U&}@kxANneKYvKkQ)@Zb?$<3Zc zMP3Z6LuYf^@-PL2D=aDHRcap5%!`eMBrz8@>HIs34?F#Ng=*4*-X^iwH_V5|+=^`u zz6q=I>lB-rMhkrRQ-ibiuQ!)Vyd0>eIa`&gDqL7CV6XM_adHY+>n#JHk!$DLT1=Gw5w!5C3L^z|w#%K0}2DK7Vm^)1sh~XSDFT;rCR1 zW3-j+m;TAgUC-3@Iq)tHcewT)i~Wr_rmm`b$yT!ozAtlsteZcTSz6MvO!2;#?PpAg zZUG9yKH->(;4%0q5WMkvWDze{aa$3{hvtiQ&AjrY>WN9W8&U3k4~N~x{q=1p%xw3g z?90+2Ri9;R+`A!*Rq3Bm6TEien)Fu*Qc5xobBxPcYDdsk=nXAi2QP9#2}5C}S)1@P zR;!?<3`1tdSxxAHtpXA?K?hov9do70CPN%&{jDlhR+|C?a^T1}N+X<4w_U&@R+qez zATC`@Q|z70;ba?X7x{#>-FnEc@JX%@cMCXRAwi16rY zakK|YG}oG_G1qFaBkEy2y!o;0HK8XuihX~z^ML;uiaZ8~x+w2V~<1$a50Ba*=1 zz88Z$NA|52vdppUL>7atOy;gcO?!ik{0uR`a_h?STsO}-A3?TOA65=yu(EWeW^pQh zczFSH=1HDwPI;DPM1*rePw#STXAyKR3EXfSiP0Y^xH%Eki!$CG?C-c z!P?M=4mka@$87PS&@OB=UK_X1vV*V&PO-0>m>6Pw;i<6xBzB&n2~A(Vg1b5c+ToM0 zPduHpb3@zc(GpN}@HQ-n@CN)K5$;jRgYO~E!VhEG^_iO!zFeTAiMiFqZxc}OlJ#;a z=rwq}YVCEAxybuf+YF-3kplCIL;pWLU}5s5V|EivNFhO1^>M~(FITM5SqB-=F9HvE z#UDt1=qE)K*3t0|86WYPZG+Go|9v{hyS?&i2P;z6?@ya3iR~(B$>4&D3Vi7mRf_xZ zdAit+ZxC+?k^7T;iJo$cC@?SMC)Km;~W5Fb8~ z?O0@p1FoX&u95y$b(EMEh>v>T!Q3rKE}BX3qy^0H*+Q7^aT|zot5tGMK&dJGabVx5 zW;@u?$TjYpnSlaKl;>NxrCjd>VNLNEgIpt#{9TF~Ll>2^k7q+1mwXAHuN2-TP<7oDDlRKdoa5*{>xUhx+WF0;iMA|LaX1+j5j^&Hi)UBCE?vb z_gHdT6We5Dl0kcYFKaS5h^@b+kdY@RCvgLiwO(~Cq!*{+av-)8b<@9M7gF<~ZV zKsm7E8%^NsUiB%0b+IoR!P&&>F**U%qTL?@q~kq?{XN;$ZaWrv?s#}@DD|rMal4$E zE}V_Y?UMSvsSx|JdZ%69YF(?taknuU8LDH3&SC$2hkFqAGb0_#vbW`f37v{F0K{^^ z#X!IQf^oe1zCFZw(Vq4CH2~nAicz$~9lCkw|2az!T#5>M_dS~5*`&&w#~M$J`!xos zyyL-;Q@5hB;0zkvbj83a7YKKyfsU__70B)q1Oixwoln@Z}yIF?J3e%^nF~tjE%E{zX?4UUg&{~ zZL0CFpi#=%ehL!bi)`$RzJK_r$|(cB%LaEwo*tXY-tXwaE7N7VfRN@4t@9{Zm0&<- zhc?2$VJffd0U;u3*e^y+vksiFryp33VwV44$mT4tYCCO1U)P>j_s3RZjbc{gdI<`H|vb6jaM@iw#o% z{zR-#`8LP=hQJ^6(D+YX3(Pv`6%P;UJE`~U?<@W?(=%$Xl~En0y8oReqr(3~6Upo6Ytaz>{lUdj zw*4>0R2$y7yesZ;&k+B__x@C@_zeY%H>xwJXKZqKNw)0UR^0PV`C{UfX+Pon^+bfN z9Si~|&}+S1Jwx}x*HYG2(4EC<%oXDFggfeu*BWEdG43g2@K|3{^Z+nJJqEyV#4~-D zUP2A)XIS0q`Y;4+?B-D2419Ec;p&w^?Lw>K#r!4Q4JsFbv{7o&>a>YXX0y27*NRMD zoFF4v_09&h!R9?lPfbs8 z!PmeVJ*|rH$x81nn!qycXutUd?)5Y39l&?`h~w(oE1-7X?ZrP@SLob*C3pHf0ax&2 zP|L?hPFhu}KU)@aq$KCNr64Egk4Y&TR;#+^(blhY2geX<+!I8NTd(^V5U{%$FPy~{ zzae1Ew#QHm)COVkhH@iz9wKdC$DXh+N}=8ebWv4oeDEW+@bTR*ZA^1cKA@hiWmg5p zTfV^IGtnYG@DC0T*GzwL5)7cbC-Iej;c<@+ren^Uttf_g4$kvm;rnqAQr)8mOs z%9uGw>F|XcO>wjXHeb%sc$CxOORQz-PH4FPjBJ~)7r%j1T ztqj>L7%J z(!T)qaQR@ny>=h?kbHkM$ltD>>S!o=$LP1+9}{^Ty~(3+ zv~XP?%%m_1HY_(E<^u+IeJ}670$wjZofWGV+s?_}93Yb^a!yQTW@cH1qE!xJ6L(c7 zA^_61IHYS`Ai)(i!TH15)wA2udNt>Mn}R-Qv*{SFK_P8gKfb)e_ zz%6<;NU2LTr*9-dNh*+A($L;{* z5kE*uVe9eipeQ$`HMmWS+1nocs+xxb7l2$re_)h_u-!IlRDvpO%&p5R{oBZ6YO{^{X>BIMO zBz^m_$x+ zY)oFxL`$4 zx_P$%L{U7f7?pwJOXF1Y*o&D(qPfuJl{a)av%JcRE7*dSReWi#>iT|_HNHa9F0#|$`iPUTo?8NUjl_{9$Naf0B+9mx*-a zuU}bm>sVJ-Elje(P}VG$K79Y)?Fy{FW+_KRif#nE&Ez%7y2+W=E$ugO;c)CuFu#l+ z1NhMjK`zmgVDfFiSJmd+fPIXYM`I(jMR#6UVc`wve{fo)$Sp z14l1T&HYb58F`?K%u&i?uE_~EHzy-=KzQoS2?S39sR>fCuAbB2QP87{nE&?>i7-Xn~U>h$0*xVqUw@GWjSTC zHJq4X^7f;WRnoaTcr6~8=49rKFMLimpcO-ubS+$L-FF-RNryGM1uQO`wrud3%$W9#Mv z4cj`TXvRy>^U*R)I;xd5UaRl>3*2nFm+D&4+dyCAfq`Mm@I01gr^UOTiODB5tJX0* zb7PC{e)}$g%0)#6wnK!osn&6!L&ya|lT>d53?!tB$4JOu>hdDf(QF)+^FL6Rg68KG zb!%L!D-~zQm@6A2;z=n`@s6n6$TDREC6 z9M~XpyUl-kECIc|vNB**8GA~r0sCP+X!IHUdAqVR^}Fx6o2u2xSGDd(iYEXdi^+ht zHX}`BDoXp&|09T2iYo$0SwNRO8_U8wfGps;B>3zr_~ZSEZYLlyrt|Prqd`984ig5Q z-52-6yNRr%fl}Ue!6wb=LcJsC@>2T|7EQ|O75_p#&QG&)rAn7m9;%nb<}`{oedVYb z{Y=3s5?UcB!+N{55fZf)y;I_rOp)Mow${(7{E(=Vd)JGiMb9GriX{IZSEG(A*}GI+U2!7g{P=ZV~8I~glw1xO*e%uZRU zAwWD=66=j8zvyc?WW0}X4JO5av&w`rdEgLVDVcPY;pdc3b)>w#d6i}QJtgHG+`n274#>s)-laVZvQHPjb4&gp?2qXH?Ps8?MnwPWQaF`k;Mjaii$xp;iI6 zb!;Gl$2Eii(*EB2czQKAn#5}-^Q@ALh=7P#p}$KBeWdM_IV!;gPCrB>@`-r7+fB#! zQU8jj@cOjcmMu-~{uLNXFh-UOg(9ZAd#Zo+(t7h_sl}lwsMS4{9VlWK=;i0H4O|Og z;NX$X3cUCAU0pmtqEdz0ABzE9Z*T9pg$0e~Es38L6k$6%JMVD(x8#;N8Er@pQXi3P zKJO6%|Aap`sudP&U@Nm;*ez|GZhop^msiv?rcPOE!zJIxLMTk8E+*|tMW z{5M+sU3o2>Rb;{?GmYXY-L%NP6N1!_{Exgl0z?RrEZdozLgu1%i)XZG^n- zZiA`8e05+YF9?tu4T$c^%LiO3h>j684pO>Dny;q4JY3*|j_8|&CN(BJXaotZuhQI# zlz9O33yfV}21aFqRBtzsbUWTzCWl*#X*q*bg?h*VSE4%)HrATIus%Km%F~7H22uD; zmfHLIay)Su@gGWo=_f|mUv1diB-cwL9TM)YIKRLqfMM|KZH5R8w4D9VY<#Oe!krz@ zi8;-&{f^_^tMf*q%J}G4mN(SMHyb_fMeE$D*rsPrjVBK-#>QYt=TP9u4W5>mHZfU$ z_WP)dLA&=Zdo$^J*jUK_N!y7_3P+d7+2i?s=y`os&@-{Ri+r`wT8wH@1|ts+SEI-= zG?v`CH$U+;0Vw>53nKE1SMKeeJfY#>FecWp#{m`}0fb4snRO54e)l`|o%VUQU`Env zkn4xQGy(VPi#*VN*z=zb8TQRAtUxixz;-3wqZmugUQ z{?@RFZw(idkeK23Z7{RYGcA-rY4@rDVda#lx;mD9ga^z4o7V6K&&s`<#dWV0tn%=3 znxIQWJ&rCa&wvH>8lc1=z>zy(8q}r}3eWG6tLe@Wz0*W2C>_4_;@Ph%(*Jn&vP;$SI3IB zM6d&Kqo_^qK3t&49A$1y?#IQIy!QpvrQD}itt&B=DJsLr3bqJb5};lA_vTWO8!Go+%>TATA&^0(jx3^M}+F!se- z9Ywq>E#dW{9Y_?eb&{Jz^I;G<1FGF=#wRb7X-LwsWW->})5x8oK07CrW7CFMO`*vh zIUV8kCR9Kpj*dVAy#)a7zt3=Oxz`6*;HZdfVPMcIAM9?sD=XF{wOylrk>o`&m?N@z9=69NcLdy~HKf8ytZ^WZC3|VW z9=x9KeNt=Q)umQD<}zAG;3vb7ZGXZoPg?3D{T29=Wvtmur6B|c+AHPAkMN*xu;IN^ zYv*#}F7KS|EJ|&jmQ^3FcBkjE0Vy`UBZkrZquMCx{+f+S&8HuSbG&C9tHRbDzf_Yc zs&)^J34^+=i1^*VeypZ!FPPDp1tc6VdarNzSKuSRKIv2PaoKX(qQeEEI|nIgEsdYE zF8PGEBJW@Z0H{z26t7qxo4l~t?v-*`j@&6|)&!zyuhM^mZr{AEb-%yh33|#4dkmnP zr^oXRY8TX@icue1zrF(o9Zd@Nf(N!LGpvt>4s|$kwh^I&#G84OdnF&vk>hj8u%{s& zkw88}Q4T8i2ay3a<^CO!s?nJYmf`{D8_`87jH@D{)ukK(SGMC1?73B58#4Ud`L>ob znHoy;9prZL5gq6O|5e&gqT+O7vAQ%J?J@qW3Jg~_N>McsfzEix{%}0qQFUI&C*m^+ zWm#PZ;Z$@9_n%t)&75?IG5*9ueVtn58Y@?3oUBS7EbhoS$f}!pf4!tGRTSPee?4qC zn;C2!gB07KtKZ`af1Y%UBx8|uY5AU+1i_-wK!G1EC#!!yG?}xD0P+G?2*SGE@0c9g z!b&}f2s8%mUy&_NZJ7qY2vSs#ghpB|u6m-{lA5)_$}}57+;WoZaf83fJ61dCKK9#n zh--H5l8+VHRsSNJxD9Jm>5faDxOYP^2&5;CYhysWK``E9?W!?_q<8dIe1$ek)7S3L zH5~#-+o~_zjE&jADZ4Q*Pvd=BS(JMm6x8*!hKxK|o{~@<8HN5$!`bdrhJE-T_ZXQe zzEr@FP}Z0&C5%VJh%`Gp*+^VlF_!cWLqD5t`;7`Pl{lrSEfBINx$-__ZwTf z`#l3YFr#V4eX81s5E7D!DW7v(G#1O;j^YGbYPDcbulVUSy7QLH@ator#$+)SyUC&Z9X4mUTk!S2}HA+JZzu7;K*7&y;#nUsCJY z;CX%x=BwM%-qxj+72T=0>hv_fe(_-0*!ohGUdd3$=nhUC1TE3cUuD{~R|pJxW&rJg zOHmg)4f8#>C`pHG(4`UJtd~geRIXM}c3%{YgjjdM;BwloxO%FCxz?dyeV^1qE$e!a z#|&XlnPv?ICpdxD+AC8s!h6?V$Fi?Ndo%pmp1BHt!t_%PDfQ~I>hEA8?GU)x1^=>P z6A3?Mx}~Y&-5RJc_T{Se<iYF6mLxlFdbCQlKZg>unoj!9 z*itotGi*b%RHB17AB#CTw9bs{ki%grAp8tS1$Y1=-H`3&_!EUJ! z5qrPIK*p3FM0g)O5YiYJd=*GKQ6Aj+m?N(dTo zC1^0@&=N*-kVgoob8na*>T$cXoh$JYFZYWj-)xrBVp8R0UD9Y87|1LUE$&ya!QWdT zlT4pXmy{tUt!zpg(rGt1##&Xa(jYr*j>=3+;ggbn;@5+CH^<5%qqW~eE5TVVu1i|2 zqz;6PMar>f%PNHAV`qvjc1Qmb7_9@{cVwp~eCKA!$y(_^PCV-mJ>y+I@%3b3E`|vv zy^~p6>doI=%D!U7Kp{6PYu>oKE%g4~Trfo9o=XzwgT+;a!KyYj4qFh;Q>aAB;?|7a z;9zzD7uvp5HkZveAKFhZuDqO7AcZg4iIyu9jz{%FbweQy?>K0#_%ia16X3|nV?b%r zRWQ3{NiVbHp)IYZ)w5yl^9>yfl!tZGI6H2{N1NwvvryAENjP| z#e8uf!q)uQUa>9nWwp~_lRZ;f-_}D(E)wSWezjR_-n%`Tc+J}M#q1=avGb+heo69o zO#DQLJbVovC1}nL+Da*vHJP3E^L?SVOI;FeGL{!w?XtH@VQxEjSOP@3V(2IaTVbE#y(^}1?(g{R&1~wt8 z)&{m%e2^80bAf#-jKW^;@lT?G7Sbl=EvalLH2eD1%1 zApt1>It*I&IitFB48-yZ{>mI|X`vs*4KcOuiS)}L6E`l5?a`QCGwa_*;Sj0k&?Qt2 zn>S>(%b`s>I}ov4%CSO=>kH$1BS69IRnMSI>KzkxD|%XY8B2~JXQwm<{nf2m*wR}! zTCbhk32kYK15<`%Qp6CgwCIv~b92p2BEcoTkdWY;Q4M<5m7+4a_?sp(X^vYGFDhycf+;hh*t(u=wg0O5dX7Ka* zeX8t(t}H!AEva2NMnmAQEyw;8hki$Vf17PCW3ry`*3}+q>5k8( zsfjoB-q;meJHtHoARQ)|7*(UsG#2i5V2%CZgOi$pnvXC85qJ69cHisMN8)uj!F>lN zaECl`D@0!kn-69Ml;maB&>0~>7B2~R3V+$pF65tPQ6yfke9I~9+k$F}Oq+a6n&5;0 zEv(!cob?oyj)DVZUHy`Z=-E~KzR%<$!0t>H{FM`39VXb8IE!ime-vU1mze-%wMcm^ z6**iomw?zBTefFxPfsIBUz%S{=f^C}_oF!z1{cuS-1#N(0xHm7?1sWD!ei- z58oAVGJpMcgK-H*uP62yw$^r1l}Kv2)niPh_-4?Rb;Eaj$-Asgr>$_?_lr%IEQBi~ zZ&-W1&aRmyl$3^7Y3&OGR8|C@_U}X_%A7)4YU>}@Cu_Dv&zTx~ zGehYFtqg!6B7((%qT|_Va<3di7d|sU0Pm`Jl9>rUtjpoMt3VWsAzxsh>?G?L@>mHC z%vV^A5I)C33EI3WhjljOK}|AwTQKce;fz1mNkYZ?9rQ_0<0!#!Vo-1PJNs}mwZ?Zy z@yH8e+nH=Q{u#_2IWRqs)S%6}BQ!=- z+8;uhG7B^C+M4wyDRSFu?|WYhzP#)hG)e<))Kq7=j_JU)|97wxv3+236XtLuKl2I$ zy_j-T|0AQ_Z|rPkLI1?ct!IN6}ToWTh87RsJU~mX?mH3 zej42VI$0Cnu2$4Hu|0;_6O(Y$qR_1nHJlPZ0aRo;xn8K!afceNMZS4f14~^Np1@Iz z%GlJdV2qFO%iE+EIt?Gu5V5{cm{~ZqLz_?(x-XDG{q5O(9d0YFZTL|NUrp9(2#K6J zj`3E8m_YKh8xC7b8+b>~JZ)cBKxB)+t}B~#GomT1z^i{ihpiq9KLD>(E5a{&!nV;L zF#fx1VoVLc(9!(Z#(E(-JtIPU8dGDF1-g_pGu;_%iG9M`z;=t1%zKV>_|et3yv~by zF|WGzbWWFvnh8*qws9yzAN1%a` z@jW_rw_=5ZVm}Y{={5TU2Hf64Ny8MIsc~cjdBgW?tJolCFUn6-CHF{9l$tT-DZObl z^saR5)b4vjn_V>w7$UVXkM3>UA-O+li@nmI`6ICW%~a~K?M=u|H^5x;qtjk@EDmvD zGK~mMZh11;7gBdYn0MaDfRL)){CL?CjFEfOmN+h%7x)Az$Nz#0KeNLCAvVd+prFO& z6gzN@FW)5LIPf-rhH$EBowo5h%KqB;WLxI*>zE9P_=#%s;5_FK!bK)~Lf7PTZr{ zcxcT={NUiaTF+C5<9xgFBf;;-?n&u5!ZuY>Ul?RtOuvm1u>w8VcZiAj!~WW3JkNsw z#gd5{J9{4`ua__Ta^JA}#{28i{o&04fS(>LBb>@Fjqh;4kv!TTseXzL^VTU+`xt+a#A?c>z{{Y!<6DhUHu&i(Y<^RP@ zlC1aF8TQYvfnacI(qAz6?=QfQ|M&0y&&@#|dv9Gr6w7TsS?_RrKGyK`CbI;OWN%nO zM?d!pk>T>@zs;X3U_n;44Uz}9kSpei>D{?jMgc2!Vc6D2CE;5@s?y)Dc>+$ zI&IQ#4UzMiYVHh&5m}$vQ^;vhego?`MU2DsNSfzr;;@^I>;sq0MGXI$p;y-My$X!J zXbb2in*D<)O{3P9XEApr*P@VqTa2g6&UNEgxNIPX`v(w@y~PD~75{IG|QWR@`A zIBPoQ&@(A|79}X(!4Ggpn5(nRE`iDTv);L(D2Vo@t=ZOCcY+QJ3hpd@)QPr-4qp^~_hMv>Ce_M=E zhO+&CfrINE=B_=q2r@F9{TdMxf5Y*>a7%h-X1f-|yuXX6?QZTmh62n=t?vi>CvYU& z$1y~xe@{2`r)PmL*aCVHAQj|w*RC*CHy`uLNfKX{29xji)GV+nyln+gAIkOsmhOD6 zp0r3UPnlQJk8oTgFo#0$l7uWECN~=fqqU_fx~)FdwZSeH98g|w-}*%`iZ7->r_4>r z2nsWHS3xtr48RKQ%S)}3q>_3ZqEdEw1xM1KEE24CIAbc=dI=@4Ze{xbiM)qhc=R}Zc5DL`hHgMZTj^O=dBzp?@V1R{~J-QGYWhU`p_-+QC3-q z!-tC9)ONQ@{xB@0P3a$8;hGak6P^p0JEfL%k3!wdZmz|n0F&c_*cilcR(B#(o3SiN z0vEYK5j4g=YK;j@dE!&WitMfv0XsgZVX@dMj&|?Yh?nvZLcH#Qg1SOw1^rs9_71Bx>hx>)riVW)kh9jcWJe>`Ve z+g>Q8PBWyZU-YKDKk!N{V*KEcn)45nJzKFJq&W1FfP|_)lsdtGl)4zG^Cj9xdF(?i zdd-e5Vbw?wlY|u^mP}vc`$6k{PpZ6;C zz(riRHD*uTsk%6%MtgY*HKAz?9K4AwB5``UU=t0wzqw*YbCZ{uXNE1dFOo;DvAv;H z{!|Jks~vd$eO4rh;i`M~Sg%oIMftQ*XDO*~@5t`@hD`(0;hL!&Z}iA*JTCG4%)iJ; zrnEaIRV+Inu1be?UlTJ_3IXpEl@eKHj$-DIQ9@tlz**)f86z<9vX3sWZBlz?fAyc7 zhd!=62pwJFPJ{o#UMb1{1}-rZtugGP;hYXOva-`IsNaCRctLeG>5IGn%!rbP#V%P$ zJa>J0O*EWs{!O+r0IfJH4Q;`7;RSVP1smr+zTA)&3uK^#Xo*7jA{HG*g_@APw3t8M zJoG4p=a#nde6QWXHR`?yOX?VBy87ll~&%hwYJvcT0|KaT|qv~p!tx?>a;10pv-GjRm z+}+*XH3WjYySqEVA-KD{JA6Q%=l#yT_na}VjB)?)WAC+_wR&||*PJ!0YSIhkDQhN2 z={q@HUG(>I#w5C>76}A_9DM+?J=>13{Lg4_Z=}>;$T*0y_S@w&%wkt{*Esc*Bx3{B z1>9K*BJVWg4S!D2`$X^?xZRA`NV{-BwQ9-x#n{7sHqs4$8M3|A@m5y zSm6XbNe5Fft<5$l3uR3#EhiFxaK(uB!nnmw5)vt^qEeYD{`1B9%bz?t!H)+}Q zkv`*|h6Qzxz(~((aMjLJpTnI#PTFAFJO8wAuE*0m#`=fvIC|$hW|Ax9qG7tqde(s)ic22y%m>`Mfns|&uTd50ON+xKvy~mGm4eA>p%t{= z+xHAybuY4`6QWexV^5=CRk>k>%u;TD@k)qY?=%}B7)}(Ny@f$i>F5UW$Gzl?Fm@vQ z@+-r5vyxq#$@_9#mlomb*`?gypgvu$Z~UUgn~9Cqn%Oy4|f$=Io) z_SW&#I*avR&up9sL1KsW$CPD~6b}(xsuI0s+9j4IRIA`Gn?+<~kD?nvr!AG$XpB7x zZVQzW(^ZSWjTDxtB}mT|x(c~EJQ#at%V~WZO>i*lz}g7XebI z7I14TX)@SeL}&Koa08XSmXrzUYiX%|jqC+$y0}sCipG{nXfp#r;#<;xn%OcdSF}=MRQ{5B1`mIfJ>!}i6 z+;5Q>Y6O#V-cK!&FYwPB0F!&-)Pm)ES<}ka z32)j{`ek5CqR&PU%{`v@;B%l5m3O)yYp<v^-9cyR+C@tgMXVCir!{D}7Fslb} zk!?4ZB=hzzXh{C@u5~Dx>PSeaV|7Pxk_n5^&qH;IfU*=_excDtz`dLH*s-1)VE(S= zGD~Tj?eMpH$4_{9dDUk6_d5PicJ}l~b!c^nJd?uH2fkd+rNI|}TLt6AoeBfM{s%y< zgTh#NmO{h9;o6t^9h<*PX%rQ&_w|$B+q*Y>;-@y-;B&8x_X5{sG&HAYbOHNB)FbyN z7^o^{O~!4-XUHf26$z~)eY(X*zIDy0b=IssvE`ZnM=S(3{Vx`(;QM=NGBoEbyq>+G z{aG-^-8VkQycV!3ji3IXD1w#xQ|$HL1i7u`TIXc;tmxEEX7=^Oy;%L9m9$-=_c6>r zAmsn9xaRK<{wM8CFY^Wq^RG#Br1M5F%O;sxo98X02)qQF^#$SO7K@Ck<1hWu5_Dc3 z$-Jvxut1-pOoUC2-Ptw34;W@$#KPDC#w8SN;nLwPymz6jJ&E?&z>NX>5%R z!IIPqjtXzdjqa+yuYrU8suLBwVX*uF=MqJ;X9>v$iWaNE<@HaG{0c9OmvRvoo}5#6 zxOam31EahWe3~on-2$vIdDn;@k#V`XQoV`aEg0PFxK3x=1~`0-uxq>a=O!qTa5nG} zMh+HS&hxyR=K7xA!L+^SbNB5D3KH3x&k})*DC`mWiYV#zvXmGq&H294|bYH?>;siE!(W zv{p&MV0*FxJNz=160PT^OY|##cD8>Me|rzi!^(D6A>ocbuf*QOqU2kb{UK4ntH;+< zac;*9i~RdE{aOGrj^_+XKIF0<%@fdBd9!L~*~hUeX>M6=TutEs9;~f)1h6$;OlM}M zy*K}CG@hf0sJ}}tyWnpm_pqsPQ-H`3c67zUp^uRbGtC=WslQ#!QBz_R1O8I4A0-I= z$t2T+v1M&^=a^kKI%T{qoYh9=f!hGP4tOi6(F0>+?;S-|@Z_>M(A?34^_A5ZwnY)V zixMl&dLIj1TVpJ{sM%7p^gZ2Qpqs~x`pp~xSSUu7EpDOJlM5G|fpA+QeYKht8%Um8 zNg_K(@5z-=0a%x(Zxml{a3uTfnJ77c@KQ!AADFQpDzJ?&Pl0A^{7y^uM$F%Y29rn> z<$7!_EzLXUzklOG4u6R)OLZv=FcJzstA$wpVq(GVM02Rhgvd$u;?0Tw2zcF*EOg$! zlS&SP9G$hpW`I^m@+!e>2VPOxsSc) zY*?dLUc1rhyI>}4c{DuqNdyEmwu^p9?Ru5uvv4@UI)=8esg4ryuZak~NaS7tB2&4O zyI!*wy}~Zsog8plqU(9f7MtRqlg=0&EFiGCA@#lc=O^TEY1M@WP1mpOcz6-Uk7IBS zAtu&ys%_3Yy^7zfSH>!0=Otio=W+|e0gxzj$Ih4@Jpi*S^0Ht#Mv%@t9r9yDdB@Q@ zwse@DB&i7AaH?~*Zej1V$Yi=&d|efXV@^ZLky5l=2&?OT80+_6t8G6Gee?n@7pa$j zmbNmlKE+0{b~u)Yvhk~Cy<>MLiT4nnd5PXC!h;B8US|tx(svy;j@y$WnGeew6J*n@xiDQT`dP zv4_%2#bmE`SUVIlt+kWigw{q)uB7dTj}r=yz;?OQm*mlqS!tl^WS%&hjMcrJ@R0mO zED?7M(dy^PIpxI_20%7q;MrX^aq=zh{nW4Q$a$L+p1C>clx{aJ?6C6~;Dc7V{Q#fr z*zs(!+Rcaz7nm)D;%p)Jy}Yn^8tylXn-NY4z#Phkt-6)xSAH^bv^q>w9`zc!U)HIP z>sn*gYsl2Vg1L~Fje~D`u2F%#Ik2Ux(Q43q8FtnOa1ckRSCy8fH4pl0-X}>vH&1qg z#zkbrUiojMC_}IQ1FN4*QjSWBb4qfSb?fN&_9WldhN`Nq?{%pa7=D~j^D+=Wo4*=& zDPYqwOpb`2YIUSlHEKVcpt0Rvbqpf2u~`vrY?0UI=$2~Z)DfLIQWw!d7yGMOjxsTqBz@ywbunnK=ffvqnk&&HjN3ey*_^sd3= z(_P%wed;Urst3ZWcS^a z6kxFM2l?eSirDkQV^}g*330#BJx{-Kh&##^oo#xodYPd|xh+FX)3;BbKIMCEz_;Pb z4A75wTS~zJiGKqqZ!_!qmIld{9jtwWhn7Cc0rurI@7RZt9Rk>P?qLXz^6#PQF}`j6 zk;M2v$mR2YdJw%u(h~(CmrkzZp+{Ktezk(W$=+T1Nz?Pg8hg|*?=#573iDov)m%Nl zCa$_#czTOuvjAWp{qcyjai*Xr1>Wm-m%>IwMn_1NU=SjDLj>M{DF-Xvt!+LJM@rU4 z&-pFh-~{;vOm^HK1y8Q8OSVAfTFC9Z8G&k+y~$HNt>{zi$6-;vi0J?@=x(gdVgzj# znYc%5b|z8c_{STQF3U(h3=V9s@G`wE!3(-A7ufs4n_J-PL3Ve*CPY^A)75`%Gb_yh zMOmJw|5*5sTMCzgQ?akwA9dX;2nwf;Vhqi*lOh=J75>Oc>6Q|KQza?&60!Dz%XY(J z{k2UL)R_Hp(SARHMt?Q<%CxvnHvWYGTqc0A_GI*Fp~ZroM`DlhY24nFEr#F8h^A`` zbLptUvRD6D12?e>1`p4K?bmSEFPRwo<_hQB(8W^Z+TN8Q^Vb1IM-A2HZGG{25Cjfy zjGV#&U78JxSptvz+w#CG@CNzD=JX#K<9hc@+Fg=2yXkK4mr=O$v-HwWm zE-EA>B7RppEx6|KzSa?ull`yW66}|91ivMDcNP1 zY)mN7aNX$OVnQaHBOl=&T^1)WcKl$*NzU0E9OA5LP$_%CQDIeB?I2p8-^Q_pEY zSRY`MZuYu6SB?rmvQN%C^;?s7@zmK-LOZd+SF)43py`vf9o`CJL>S4Cy0`*=F)g3*LUFORr z8?$W*tLSHm3RX9f|%T25HnU~5xNN6z2R1wtfZ3HtwaINuHLa_^^A z`uCGwDalVO{MT=~e_Lp|Ya}~recP(QHVTTR!v?G5=O2*87a9>1E7}h$8&GO#lUSnS zOsHFoUoA80kZiD9DqXTtXs{@&wVP=h?MaIZwQBT5$piw5@?oGKu|fCcHv+r98^9;b z^usjpN`KE>#LM zNYnhVKLouMKR`YjmiNMn2xX{5U3OC<%Q`rbtC*crS-ouQdX&E{9~mo4MD_VYZUxiN z7Sxyne!(>2WsBMCR&TdSE<`MCq20^|%$$-BB6h%kV`cyt&u9?;bU3l1K1W`Z#Q76F ze_s@lb_o!BmNb|+NpygcY1UR{jJKITVsx3?0Ih^s=%iYVMS+^rs?zU z93KT&(7+h>$we6?C@54A(%GTEY$EH-!9~q!O#IXm%sG(%4yu)=RCcdK$>n3KWQ=C} zQn`)2o|HOPF3{8K>%0Bt0-#^=G&~>keOO)4Et`2;&$LX;6C=Z;`O3IV{^Q`<6#feM z0e4v#-ztIaW6vmyxge6UMH=u?2B5Jcm)f3I1KU|5&nO=mxw5y8TAdVK`lxl5fsrB4 zvie5l0uI*QJ*pgt4EK_I%Qgaq%x@x@O$lI2PXe(!; z=u|p@v{2(g@SPMZz2bBV{chUgTF#AWRo0U*GWAAcJ}pj)o8megj)CZPd49rhWUU6q z=WwM)waUZ0=a$dmjz)jE77^s}z2RbHgc7uvB+se~UOQ0&{lR2tz~fR?zBNAh`m=p*Bh{OUlD&)yiT%gmxqTF8tMh%yN6TbLA4XH+?W*f3`08xV5yw`xgBGV?Dkt(kZfzk%>TUnvDc*HN=khz2h7Or8p+meKF0B~KT z)5k`)o;I`O>}ECi4jv;D;o@0S2Vid!4;(U<;iK`1=PB6JUWo(GayLP&FfTwFcyJcx zd#dJwe9LJgwCx>MosI!m2eRGIS?`yTB2v(%v7jqo^^tjT=o+e|;h(j(6Y$C)U% z;(5Ns^Z@$Zqmna0(jDzIl_`+)7~I9gnI7#H^0+%K_Efjt629h+sr7MD3+ARs$C>{` z=!hQmi+(#%M2m;rf|~27mBOcQqY?DEWy&?sKs75B6x6-FVvP{|-7uM)G2 z%5`aJ;b?kPckeB58Av+XVV3-9W%of^>vZNj%cK90QG<`JH%Y2h#!nLGh>bYusABe% zNGJu2zQtp7SzpcKu{Hx0UZIh$uilI#DvMn%)%@mC4kfXoiA62Ta~orWL&u)*q)|Zo z+IhS8y`|5`XpB2xGf9$dM$%T26x!2{Di!;P|*6a5IJyeou(*VN$C9Wjvas{`kIHr=n+SWJsd;?$Yx zT)|pfC3J5mno!WGWZ*JikKy6%jW)FD(12K@GoMOD4`(ZOP0Ub0KsRu9Ceb0%R~nLg zo@`+0y=tTU24)pzp0(OMGIj8T-pDd%p@smFA>9uV$5dY<$SW)z{g8HiR#P=^(W)6z z3kSHnsqKw76I(EkicEG}I|5ufX4A#MO|7{*|7_Q{0Z^>T2F>49>O`UlfM4`aXGxAO zk8wczpdph)8)R>yQ}Rj?Y9n@fuX=LQMwJ+j@ygibW+EAS!}5P&Jwn+RsjW|cP7Uj) zUYr16x`nc%L3#d_pjUb%=+Ho8QD$**_?M^22>rVxeuQNvzTPWu|IjsqfM_u}V9X_D z#^9uz@pIlob@>Gp+U`uadLW_NUj_UoSkhZ}FdcRmvfApC2uJ}1&w=mG+)_QBaWEZq_dE3#Lzh15hiB@rd=$Qw8X2fJ z)~N5c{2Y5d4FS6syx@Sat&S20pguALwT!_^F-{zy;aLa2@UwAm?cPD-A_r$g?BaFK z^seJh?aW}(wZ*ZkwDcSde;H`0CnV;X%uSFpJs#Hyhu$2?NRJkYO)lJ(8Z+orwv7n1OV}@8d!^Xo}?;B>64tGDF z#&T8Xoy);Lyw&OpLmr;eq{{Z3e-;+?>R(Orz%t1)i0ZYjk9XnX)y|K)3attrjHaSJ z%mFK_F152f*xFg0-O_bLY%ykI_`em_&=)&$c^TuIx-*C>-A_)H{G8srBGCTP!AYUM z^N=1|R@9(d?yHJNyS{i6_fHNf$)`!D%`3xyo1n%-jfRG3Hg#=8ChZ?bJn|uI>N4h+6_;$~)CX07^c;c@; zru*m6AEHj_+%|UAkAf9+THDINz0JJiu~}35lfc_-{(Ce!$*&{FbmAc1V6U_U$3}+7 zx*((HcCFB+x4bd7i#-9Hwu%gddS=AT9u@<4fH@t~Ru`0WTp;yWwq$2C{H%IBo4;LV z+(wU>MjotWe*2oweT2dpCh9uIJl#M%M=|9Hhq=3EKeNO$S2!l^_(~*$CV~;K5`R9` z=LX6FO+V@#8kX4Z0w3~?(TJpL>nZlF+l^xB3sUps&7?>pJ6B5V+nJ{{in47yzF+*f z$W#;upvffv`ErmsYj0wByZe%z35Ey-S7VL3iq*+!S9I{m^)Zg5ObT8c9!ZDT6jTbb z2rGPR<_)MQfb2#ASjx%f)tA364|JSlAYSU6#Y$ zk^u&$k&VJ3B%~=u^Gs8-QXN+yc_h++g##MS;Zf$b0b=iaoyQ(M0ym~tGrGDP=|wG4 zY0kp(OW>fM!SP$fKE3VQDe&?4tw-7Mt!HYU@lU03uH0=0=>D5AVLPI%Yo!=6X{N(g zKI#D27UF5wK`w0-Dho`k64+L`r6JonF}d8K0~!0_p?%@>Mv>#DC4-u-6I#em3GbVCaz zN@)qZkmJmQNMsrAA>xS3ttPD z-H71KMEi)~l58(09u*?)8^Lrjj^MGb;kOFIeTz(*>NnbBNU<$+xQDxSo>_3I*kPlR zUIxGJ`?coSXFj`f@21J$wm}4mGl!L@96X-myfsWe6k7s7I_n2?d3mYE0|iw%t#LbI zsbK5Z)`uJMILdcA?UprlyPnh{uwlTn#-c&=W&j#+w>dkc7d4$IRujxnykvSwjrOY4 z`CU;I4zSm$<$i~&#WAN~MN<5Nxmf$tuc;0Ft5y-F0CEr5Eccnn+JdmGE}(FSUc)vU z2eF(Be)NZaFfk>Dgs0NEWujI@)8)9w)vj%_pSAVU;0kXpKtpcWXY6+uEF0vL>jz`N z0mw6GYx{976z*zqrEyqHo%oYA)>cwRwT5xQsbjRgYZ$%d7C%-=w#^-tGX4x4JFb;C zJi0g`hR&QgI`E#)6)|7`NtB-XT8*nIs!T#K>3W(*E782*@f%^_cc;hNha?mCH1ye+ zM(%jqtK0K}1fRcNEi5=}T~ zqjy3~OO>U)_9AP0co$1r%G;JMp&wV5TK|DxPvUr_dmX#nx0j%E`YAa#-zile#~C+q zZ!@Rt?yp|r$5Q(_v{T+RI?u^DSM~aPOtT%9y;txG`!%->(@W9{?sQ4je(O#&%Uiuk z$wLQSjQdYI0LG&Ws;jGfLcywTtSP;gg^r_cQl@M(QUVao!x zsEI{c@wGr$@Xj^1xvsyBY4z@^e7O*D0;+#Y4&xCK1Lycx;z$slPzZDX^+0aT*(v(# zPDnJ`pjT{OxR-IxL7G{(l!F5TuFnbyE9!iF0EUJZue4F#wRSs@5D=No&CNB#_d&LxJS$kMY^k2f z`HRcYXNSy~cutz|$@f96r-ixB~S5zX@ zdhxgv&os&fuV@Jx27)SV*xK3K(<={V#D0!fu8zX~?2L4MaR9`OHpZEG!7g|>M~(#d zX?`92q+uaYG~MYP?&%&6UgQ*l%a#R-2KjU&(>Ru8-5=NY&;$%p)4gna$XT&>J743B zVmJTJ%ux>plwCEsiD7izKDs(*Gxi7Wg#dI=<16f>wS(E(B04Yl*YuJ8nrDtdIZKEchD&~s>uKgid=SF zw@uOB?OOl>P8Kqd04PCEK7*?)E19(ZKms_;5>aLQkmzkk#CHCj-u#Mw2o7Ufx!2OX zTjy7T5313YS=wqNWk;Q(V4c zTyoP(MdYkMQ_}h_OtDON*6}z~0llQ6N;tY- zdv*$Yzz`Q4T0U-&M({rzN$my1n!EGmW-u+{bIt5~p=yVSK!3{O5HrV$C~|ABp%g~P z1l|}ck~5D-5`|u98(J2AOY!&=)uD(S zN@34?rxvaWAz&N~z=Mxf?5QMs1#Hf5d=mz{?D74h4EJ7u&X&4J@DUNk6`CK@dKu+r zS`nQ-7jNAq$-G>3`N?K(o9&sFZAh}e9_P!nlR#GoCPnwI_i)5|gX>W=R+Y08d$vCL z$w=Fp^x`33wVI_)Phz~dQToZynD+Lld$4qsPJP;_x6<&F#K$Yy1e@ju%pxV=@UHx- z;L_#c3-$c$0e~D>mhVqW&>8=Ax#ue2pdel#E&y951q^GrZ*BmfzF7He5eBz3 zf$_~ua(ye!&F+Tdp!UN5aLu1bMtBoIBs2fj0vvZPZ$E`m!26L5Oj3*XUHI8|^d1$J zQ55`H#6Zz9r)b?or91Tv4Y-@w+$HOFIOlFxZH}q7m)e{??{Q5fa(rdzx~j^B69)Uq0aDwe9*;9q`kr%~$8s+m zBRX~poetJ`Ij9cA8gC#t1E-_cb*W$B4PrbnL+@?l+p8r{;8oaIw!wCGbfTrZf3Qk! z%UBl1xcQkBzVk(_N8+9taynh`KtV4OZZ1g5FTdJxS7#xl{(ik~vBVcPg`fcBTn9ZG z(VZ*jxgQ2x+Q006bMYkZ_3cq!hNiK{@5>TP+hb->X-Q{;a^)1z?PXo`-d+Q%gYG^n zvXrVy9D?$48jGUaV#0x5Xoh3WGQ8H!j6~UZCUo3upPev5z=G94y% zt*Cks1E@51zf9{H;qDo$d?<-Z@fH5G7S9Y0l6-}-Im-SkyC$d?Gx`(^a%hMG-zv(n z+5bG+^`^HGLS(_k7G*D_yO~)y$+~AN^MyZu#04F5N|zEUZA~#}D7ZcI`?BQ(zE4#OqYQ_*Q!dmvFr`TQ z7{19!+6o(6@i zd~uz%qR&ifj3~M*+E}{f#NQORg6)~9onw6kn0;C04mX_U6;UY-6~N&6T44t@8U5jsG6=Ru?u<@36U>Zbuk!b z?Ao)BPsV{7iM)<_n!$*pdD=qdMTGpW&+PTFk+mbp^IvjL>pKrE{*~2%>eS8_nYN#J zxtr2kH-9$xV*rh=#hAt%m6kNtB%k*VA*)zfK%gM3HoIn|ZPfRX(iy{u>f>~<^*`uT zicnXHO_A1J2D!G?N7q>tb~^~nxJ2;S-4N7zq& zo6guY=m#_#l9qGt_wNkh{|5U+J>;n_##qH=SrGQp4_#{AtnVYRqMigcMv^!_Mx2u5c1c_whRN)6@HbCUFl zOZ13o1|ljl)Pg0%Y#dQY3aWV5ny@|o0?J6*VspUuJvR&vR-doZ0Z4=tel1swV~LY2 zSX|p17{)~g;?!zEZ%lvt4i^2QPb~BTn)i=EePmfu%U&yquUk6AQv)RHzZwy-D7s0b zI=Npg86+0nvu4@L$URaMy9bJ`mh)xSS>=Nu1@fJ05n+llVe+W|zB6A+R?jOcX zWlX06a;|98ua5Ts@weJipLmBf6D;*G?I>KNLKQZFE8D!oNyAB;(!%HiujoW_aB1 z(a*BvJR$?j)@e=#yhn|1W%C8o+Hvdk4~e$6yeL)ID^CCw+iwYInq?*RY*0lICwR~) zjxpN3Umr|M3vhR{9WZgEj4+BJX}C@$F08B{aL=u$Vuu&J=QGQtz9SI5{|vTzRhwtq zB-iG5rY-(#OrEUgxLc(0g7n79$ecvH>bWbyTVbFcQ+XYfs7A7(hF$W}=Ph<7Hq_Xtb zgZ%JNL$qVy4*6Am^MD>fgVqOZlPg#?V((D2gTNTdGI$>w*Rriyg!37Wux|0JPk?LS z34F~8DJPMD5Zm&A z&mEJo=n{%bD|DsXHYUmA@v4gi4x`IwK_!TUYutTL(0cQ1_YLnXA=rdRRJO zzwx(5D06Q66P3(qh#{W^Q0GhS3-XQfOZF5a$qxwYLE}Hy0MpdUN!5cj^nKq3^p+ZXW@v^(Lo@2=nrm)UNf=Zl$5^ z;m~XdhzfwBVbt>%F9EmgC$r52w&obhr zh3yat^o@~OZ=DX|tTHoKXgy%_X7$3baPy)_!o6JJw^t`=FUI`64ZHBU$NVB&pD*z4 z6*h%$6D5|OaqT$(3}ffMAqV95Nhtc$bBCtkm9Ouh@otCAmBEDC5Qj29fU33;hQL{; zQ`ILRoAXnMy*>Xxp=}?DB806H>`q~p(<5V-FsYynnHvR7Ov9|@-#bzSJ2*GLIZ+j{ zxU2bs5r>5E30#(aI4qKy!Uigv;5j{lQDx?t2}stzu(4Nnt!;_ zy7hV?UV6QNG+$loW&Mu&Wd)30_t1KOa$C?+r$hZfSw+&R{2K3zKuFX&B2RLos9>M({L-=}*;@|zKc0=2ui{{ExIWf4Uz;0)(Qk(2vs(ee=#q|2z@j@< zATx=M4@eKTR-V7Xm6C>K-a$M%z<--$TDChSGHmhv@ubW^qss=^)dmrj)Y;kOZ9J`` z(o(&WLLc~*j!-(-+;Eq)sq7Agi?~>Ib9a<)t_`gVau}VyQ+n*Q7y6MX-f}IXXh3o^ zNbzUQQ;T`CSK{8N;6Vjj7h22f?;I>`V<|VNz!O}zqp!Rb0EWGyK_&os@i7XU5N3;C z-MFGhvBex3Q6q&1-rI4w>E*94L-o0G-tQsOBJGaoKKt0zF4|-Ve?6ag9te3?AdG~s zjsWCyu>`)WfYl=7&j}!x5BGW#*F0`{i9^>YAy2IL^bpVcteGQwnXnq96ZsmEWP=!W z#i_K)>TYU~v5xzl-`W=^{)u`;b6CavET;0JgE17?*1Udt#miMG+DG(etx~JZwbUQ( zh^T$U=;-f_sbJNmNE@l$kbAyu2=r*Bj!rI*fjQfYZnFXZeuCZh^&PH=7eX8(hP40* z1V^>tmlh7KcC!XcZ>rImt=G6b`4Yj`e;kZIAyD9H&Lx4wJ_I1M-bR<1L z@Q_dvd~GY7{2vkp|@ z(ug7I0MguvWa+eFfz<^=e-7868micNT(9r)#mE2Wo$-a-4Fi%<*>)8I9vN-7g9RS> zUiw|^(R?#goS4kXW?++3vCLQbM8g6Z&Wz}0!$nZBcQ4f9k5w8&P@wR>o+RCKJZ6lKEhS3%DG=wh$FIV}Q7gv5^ zgbdCdeJx_Ms8StE2a&q1k)d6yt#bxlXgfb#Ju2Uu^Z06yzZnfHcE)sL!BdgWd>4F7 zX1(_q!$$R_1GO-+oBBf+3|`k53Z#)T^q`@>xXWKC?nA-GacKD~zdMoM&p zU2YnnE*~F&p`qak%{#^DB?bfpR9Ieqdd%Pz<92&2=H=yOoM7vZ*;xqBn`NY4}aW5qpssUX;*P8?LvJA#IzM3Ec1z~<~KP7F+-fjqOAL;wBz6L4j<#* z3&~0w9QJc_u}Da4yisij{~X36T+HfDyJK#3ybWgBdb^GGr>T#Gk$3@eJ z6E1kj6DfDM67|$~%Sp9esvWgqcjU|7a2~y8)zshj>0P{&@&cqF0RT6OJD#Hj{T5&_ z(Z(hna?j;!WXHey5~)z;&5q~ga+KXS(9r#6wIi{dhV1WZ481w}ovt}Pp1qeib-9~$ zn0Oxf^KEPj&x!%+`ePCuXnS>UybxT6MSLZs0sSy+Bn5e$vd zY!{Q)aW{Hb!f6_#eO`P)`5BvnnDm`SuD{$2>Tt08os~UKDdM{E3zCeZE~bO+ zKsvAWug^PW#r}+E)FyG{;#FNJU~ujLlB_Yt(&vc$q2zPa&7pa9z`IoMmvr?RyyNPe zUn4;%KS*`+=KlXtGeg^aTK~aa1vCP6gs^`^Uo`MM9CgVkqwK!6q$aze_{Q|?qh$cJ zIN7v4;t_g4SQniCSmy|YE$H8LJ&9>oRXdy89wEcC@=&8p{t5nwetu|~zNI92&-*qF-k~Vrf=ET> zsQ(Dt0)>Ovms!hHFgRJ9LO=&H%pW7WIV2yTGrbaTeKn@bAW;S^U$wp3Q>s2lH>PLn zx?4@-Vy+6os}?+9Wc%VA9Ox&5R_$mmu1``tF|PCc-1P14_Pw1t&(E3^&4MSUer{$g z&p6yjR>cfaBI6e%CsIR&XsDNL|B(=0Ru%`0t2-*-Ot(8KWvaEcN^XRewqbNuOAy~z zSz~b`{TTtI*l5;cl?_fij9A<>(ZUWK^G7f{0PGVN9-8l@WJo+aGSF7m7Cc+S9&>1< zvsH&#D&*!p#Lcf8%x-;YSX>;jUMWUE|HK%|N9h?u)Y!fd`)naRzKoUVgHU-U z@$Jz=oJDpwM*nPG1&N-tW$^@dwa%9V_W@6jEwI13Z+9_?OJzorZT2F{_uqltvlZkv z;#eWQ>md?_tQVIq@D|(PEMoIb5$5VDlM!LLwK=ZS%{+qMn!`?Oz~Ss1t=h+ZhUIAh z+1drY=?5x(o9~qYAF(W*0`5rA&P!qZrI7A7O_}!QVLi zoDe_S@$_`_CY^N|s$(9c@fnD4pt_~GH!=*S{6JPaL06>bvwph3Ej;2mwb)Gldkm&s zYQhN-B=k$Zx~4D{G)jmpZ|X)M9i!^r%llB7m_`4O*&L_keZ#|2nbv3(hS&#j3hGrB46MQA_DN>&4Lr3c^qg-8T)kDids*(TNc{14 z^v~?6mAo%tkt~t&(1oPqS#$RkBi`-_-9V&6UC5A6Jw2)4@6kpAJ4cE3c_@E2-;}T? ztAX!&FPIn7njOW!K zGFMN_{KlTiYMk&ASPDaWXd7)ayqv_gTi)+Rk<5NZOR!o|XZ(kMQ60XLsmYSoXNWb9 z;Fg<8RX=cozm?vROo6eXW(;V(FJO=;sgSLINGA5T3dnhe^V(SWmRZu(I5IYQ;kN~C zL4>|hH_%7KvNBTMf^6Gx7AAnmHosH}Q16{Q^rJ_Fl`?2`O7FZ5rcZ0`<@@y`1K&3A zU+M=YmJ(ml-8J+4Kx%DK(BN1mYxV{8aRqT4C)H>iK0jV}yn_FR2d>n5pFZ)0h5Udq zDfLI^*f#aF$cmsth;Q7Rn$(8a`nEuO6QeIij8xRP)@V6N8?NNwk3LU(AQfCau$Wde_q;MX^ zK(bcI)fb!M)UZ~k_?QNG{aF1}ZOa0SWe<<+XM%Cp2M(vF|J15yFMRvI<-#&Ak z?-eQnD;reg-2<_xc-vAVw%Gqf;D}@08OS+wueSS~zfU}$ahh~y6r(iT5lE_IDqu4i zU>RIpKXOHZHtFsGbaY9BgQI6mf~0E~ql5Y@sRtu;<&L4glz7gqB4^k+4AJ^z5eVGG z#;GGuFXzb)7_7f7?RQcD=|k$BJ%2}Ib|=dF9|{86rp^&J?xET9^afJ4%0{nI8({NWw~5h+TnA_pFX*uonOSy4pmydV*-*_+S!Ep zw5z~`lMzW`=l8GM9hK=rEP(-54xZPDR&e9H+i&g}3V}+g#37kGS541;tD`*0b^G`( zRy}oCdLBw85Hkt3x!wMpEsi_0r?}59za__4yRK^=_#bpHQ<%ys*=-%JI-%9HeLw(E zyv!;WXn15k0-Epc$L;4vpM?7lYeMqQnsn=AH6MQ&gMjB+@eO)gb9Zy~$w^&2qQ-Vu zEVB1W5g%>JidrR5Tc$at4gKIjXvwMo?-3?6CDI0cPzrg!e=8G@u3(h~%oLa+`ocOk z%3nw-c_w&p+Azq#G_syQjg0h%!J)+7vBd0q!T(7_)8xh+&#a-cRT0Eefj4!_VY|rh z_zRB?TiUBWnhcewAdSaG_(4$XffzHrKRqUhn<%pSjhgR`7x^O6XUJbFnGG-xi?xo8 z1wGmZUYgW1w60P&v6KPb*^;uymsTuPzCdtLP9;My4^E~GSwx=weClHYA;%O@6dP|y zmZSUc!sU++mF}g8`KX)vSWZt?g9&)@Jf0lswG`YD&b9&{R57Gpy?m+~k@ooT1W;sc zswDqRMdQ~2=LmhOj^3$|>77fd4=aimeLmUS_b8tnFHGKkZ}NOGdB1gXiV5eE&lbD6 zXmyQ&B*dp;-CFlvt_+bcl0G_YIQ1!kG~5pv0f`q;n|PfysIlrXepIolcQnPf+@00| zIi8-d_-AVGHslZKk~-_l9gJp`C7KJTqlp4Y=!gZt z?^oS1QCV z&!@T$L~c2=k2z6?BArC=$aYpEj?)khj6v%dyU{7u2wFto+5ID?`Ze}Rqil*C9^g+c zhZe1KcG#$-r@)V!LubvK%tuxpZRMG(=P?0MN0IU+J$sWa7dz-XgGxTg=KO%JuCCO0 zprEQ|H150gMQmNGdho(8M)=NVZ4;*M=Oda~HVhfoSmiO^)j-|uw&sTPB4#7G3xXIk zCrl5hOP~dIs3<=L0jgGLyx7OBR`yLe02=Poul*ex>mR(lT1xV9ioyJy&>Y1XVXtipJJSU;wS!hQ%hP+*?0C^%Qknne^n0mlJD!c~%_q%Mp-=^UCa9Z6_W$Lg3x$lXx=~6bF;PrcOJZH3ZM2*S#orEZndCW zOf^05;*t>lMlLl>rD2PBSZ-8FK^B^}hQMRQ$wOm{1XWcjE4VH&BBhYrEa+Vg;CWj~^#wq;_ko$Uw&du~hZ-Pr2T7&8M|9>4?wK(^#_Vo@tqYom=Z! z0hGx!@6mS@6%~DpqPSFpewW*n9?!8UwZG>VAR!>|IXXHTCtQS2*BHxOUR}|yol`ul zw!{|ndkri)f$0cnr2l^v;%HobRRUygB=NB;`>~gd@oLeN6Z3DY1e_eg;5TW8oJ-RO zM8z%ppy>*Qf9Q;T5Qg5rdB_ew7{6>AC`=6DnorW#J2|j_0$`vYpSdcHdIdaKk+ zp|L)LY8EK}Z^Xao5^&bW>3Y$V0P*_$2nh|DqrbZgMd@2zv&ujmEAP%|lBJ8vfzjny zfi**(>C^;;lVvU4)Y;BWTRC#GlcS~aGIHJlW zuomc3@`EEanhOu%t*&PiPBtyz0tVy-bCX5VQM8w|3lP*jF*dSZls{3WU-=IP8Q0bvVo;UkSxfP6!YXW# zLtD7Mw>JI^)ly^8)*bsR+$q=YDD<&e@AO@E-AhBW;B?qW5EBziQ~2@zpwNl`4P+mi zPS38c7Xu!pzHds9(;++Cm#;{-gNbFS=sofVyE4^70SJrnHhygtf5$>pUfm{gzw})?l_trwL!Z{aixjswd1f1jyCF};ov9+#kITedi=yQI?Bak1@)(?g_2lu>93T8-M&FILl@6Y*?Y zT%;<@u0@CeK#o8DyJ}EPluJ0v%oMUvVb135CosAVegQzf z--hRj{d<#TeOM6z7W*TJNp4$QHB5c(>x!sk{xW}*YLW`&B^|lD72UR+giSuuYCV4>;~tT{Qu^6h+Ef7@1v884U)^g>sTf>8G7FT%qb| zdY0j}k^WxuoJLx7Lv|C?R~mGg&Cp9N4XH=G+W-T5;ky=j-FTSgJhM}LxXg%=bk96u zpv`{!t@K7Cj@-iI!qtq#xXDpliabZm9)(QNLK2UW`=bJ4KSE-X28utmDYegY{X)~- zQI80W+2U7}o9!02EqGsjmvBD{#T|$vrpn6F^10;!J@mYb`6vajtF_d0@|N~d%_Ip? z>kU5BrthrYTpNg`MNR2j$>=6X0`sefD|3cIkbo+@O7X(IabJDgS7$6-vZ#J!d(^v$ zj98XCUHp!O2-PAQLt((%miXUYr|sj0_u{j|llrLq`q}-8&hj2t3R_wycgBO;sOhVm zX&<7}l4Q81^Sr`8sWMU(s7Po{Y3{A<3BRPYqH#jcjX}NVF6X7Za3oCf(I8Ag>2;tF zNfWe|&bB>Zp}_(ti^s0Gxj7wLQwJAi-u|avyC=KVTm^nR8WdBV5%EOWUqF?ER1-6@ zqJ<{`dL`ekHNe&U)<4z;0&c3vgKie>k`m9voJ9kzKyg33!ZFz6FK;bTl*mhHEvVLM zc}T2t+B0>}?Rw*L#!3^dQQX?3ie;i$=o@V2)&IR{;uQ)v^sdUuT37V4_LE`%uhfRu zgjvGo9@G)g!xCzVF`F+ugKWB8?R>u%n!IWHlLp?&=nMj#KeP|f=Ofn8B|6k3UeqGH z!{$?aZ@pfb=1J0YM3}b>na=DUh=}qy+J+e3Y<_O|b5J74?s9k#vJnfjZsmjx6N3>m zEUKqPFIkRYr1w4oA}_e^b&-lJAHjC{piPmOZP9BuN@Fob|GO;|i(*w^(&SfAYM*|J|7>?3<>??j|9>ch+qM7MHO^sx{A1sbG*}-CseRg7w z@Q{r5h^TlFxS}SLYW?(O4dJIBnPBDFKTchTY0mE;`^kKf6^8*b7+PA|{Q2XDv)1zq z5U9&s0HSVFzbGF^{;~OCFY9o+1XEeL3UYu(3W%>an@G&gULo3rhNXr7*GUPreS$A{ z2Xa^p_iOjZXE(a)dci+y2hwxulJLW)3SrAy!?tv7^1ri3JAKMj71uRR!f{78*=R%P zMUNHTuC!gzS=u?4Ly4eUSPzRwK=QEY3Td^JYw(ZkJS#BJlCs#&Wr|c>h_IN?5!G!8 zNbKM2QBBTa3hb)#V(tp~`XpGU-w`J0OY%_57m(g%8C$skU4}2v}AgH`P3K`qcvU%fA#AJ7JipcsdH6(PquBnte-X&&tgg-$ZF~nkb60+Qa z?e6Fk=Gm_2>&*ZnWv@-E*Sb$k!-_33ZR~OFX`52ICdauF6Dvo(o;y4k1k>6A<$vFv z(Y53k&nBLzUmD@!D#j1XR)L<=cZmzJ>kB;+(C6*f;D_rQKsnGPPEaNBmEaSgBn8-0 z_JpDrmX$^7wz@)7oQpw~1sN3;F8}+EHxFD?-;LRI1P;U2-kzk446@hV8J(bD?y_xb z43rg)P)isKMEIj^?=B*wH)6v*W6xH5hSaXm^gR!L0%9W4C!C#q=09nR63vD|B0S<;!t_D>I`(`ab7dT~TcV=TzH7cMt!<`YF~S`wOnn22j{TJ+0(&t%wCWw7 zJE&ySCLYyX7#m&(*tBrB2>!yoq7Pm~(^jI5wHY5){H;3uc%GD`$j)KrJ z+wE5+mZ6otO-CA2ZuQKUT5g8v0~(1|{n@AK6^XlgYaQq8jamEoU?f@^;;K z2m4H?KCmP#R#}iM1rvv%h5Lqae76R(xyGf^_+{Rahq#juKpc6o>7z7Z6k~}hxie0iiTK6 zCfMmvc>mIR)7;ykrG{fWx-ruGLoM6%k4Z*IcW>Zg&oCW&_qKk`1T5Pu*g2pt4pe&I z&RKb!r`@zQ-U&N?#o1Of9pigxKh=0e$jl|s9A&>HFP4bY)+7X9pP1qcH}F&64}6~2 zGjT&~n|>Myc2e*RS?$1JKi;&f+t{>@eObm_a9d-HAcfXx<8Pbx^I&B+o{F212lL%^ zfP|uWE_(@V`I*pwHZ)CqqXFuA8~czi150Io zTTOeqqYxbq8G)6ixbz3!vusWdO#yxUS|5IoO+N^Zi>j3ei?P|-GcOG{`vQqz1mpI? z4=+IBpdfW>PR6*(DOWbnHsDkTHkRG)Rz}nd9U&N6wVYZ#9~u319EFggloS%o-I^Dx zN-?bv^7-lME|Sna?AX}Y_00{sEo4fH0@Qx)6G!p9fpoIcl9a@t^oq?7>e_Rg z^qWrgmT?$TeZ#Jvrd(i#4LRyCYKw;}B9BmA?$h~w{6?eAP|f*IHD5PqT07?9&G(ch zuCTnQrWg;qSWr9K2kv`H8rU!u)c%F$b~G478{SS9DAYo6cS0gVL~N_cTDNWHm2txZ z=}e;--VAL(`+epcJX%Lj{%q*jDg>@e392XG0weIiagQR53_d2IHp_)(TP=wlw?J|W z;r&`{G(K)o_{|M>X#>XtA1K~DLz8gp2pRV)++98-H(5aXWM#F$x#z&Tpr&!JgG!0@ z^SiI!XA|jmNYNS3i-oB67^^$u)iu}0e*HO4riM-HqaQJuD05yvA*#Ivzc@XguV)He zpW0oec?g64 z*Jzax@9mFiYEI96Rpr$oz*KR6aFcgYUF{qH+$GImlp1rVf4V*Sy}_xiZNMrk&+shC zgvm}<^2A1nA8bP~Ku!*vt!-+miY_Byur;d(49$($=Z5)aFHYQCYz zwn3n0daBv?Z>a`;==WvMT4^k4_1B7>J6_CJp7>s=3G#pY0Mehk+9H_0x|oJY0?{#E z>cW35DN>5udr3T3iyeFXIH1trJJxa+>h0puHy-E$Ut2@&9uD~kJVyMw{8;#h3!0ih zb5>FgdHWw7Pfl%41i!HD=%ig<5lEuJVnCu-t5Y^JZ>U#W2i(9zm}?8&eq>=yV7I&{ zK_TFk5U5ETOt2n)4H|CDX=ArrD@EVJ-_woz48B<3VxuDW4AOrwBAY)UrHFku)uM|z4`+%a@=scc65Xj5v=_f5xh0K+#$#||qJ2oY@z{4tMI`ojcI?R6hAna&^b zsg1&Y++RQaEJ0`HD{or!JXYOs*eC>#eBF3GRN5Q|%iy2%k|u%!H52FUcZsQ~q0pSG z{n0Ahc8b}65B#$yi}eq~>cGIURMIyln)s}37q6;2z>gb^D#h|tP|Gtw?iJk=hKYj_ zh8)%d1u~~^iV{%Eq-aFbx4G4il)G`JSq(bQdq+wtr1G%nX4iXDwB79AzTN(G9EbDx z5M!+jcnc-cu`hGdA8TW>K$Z=bv!jE#;>P7Z_oX&F`VQylxnqv~Y%9x1H%~kaD{Pju{8#`gh*gK`e zda-k*SI>9;!p&JvFY{W5_C-oDtp36`U zr?VR&c0A5j9~>USCSJV(KjcApp>7d*b{HFe6n0df`^~I6tou%a)ZpM?dO8jkHa5{# z5QT3@CWWFaqhP_J{&rW#km;jF6T=$ag3id=f#$8zOK{~{UbNHp9|JCKOf7FN45&c? zWuR49dp91Bo8>_X;Rt;Z+SIqgJBfe-PPonxJr`xe@+mGp{+kH#aB=FOE2LMX0`Bo~ zLf~{(?@d$~(vP0W4_Et6CkyPir^`IeamQ7yv01jiEbIk)NbK4isFg(ijs|_(Q8DR$ z)t$rdw&lzxBPX{V%YU{3eZg$xK_2ovATM{kt|x@cjW#{UH+2SGuV7-y`1_%KK3w!* z!lv`Nyw`tPnwM5ksM>Obq8$d*x9ln>iuyz4pQdw2&qR6s^b)krpQDI^f`X_{OMWq@ zZ8tSD(+kyySDoOOr-%FPI3&9~XjcqMxjXlu?dR(fp)8sg`-`f&ZpfJFc43?#@mip1pd{^F+EFQ-(cq|Rwy@mFgrug4`VzuVbPa9ch>rAaACcYEtvO1R6 z7k;+cRNXPLxy^0c_M!w5xWIbe;`PLYn|E)%6XY3KKiCM_U*B)e7+*!jw_hg^+<=@4 zgmXZ30ooGeCW0~81%00Zt#0Rt8&EZ(WM+Y<%xm~pC`eGB@zeJwURU5HF%kwj?c>?Fq>(<|WIMo=|524aF6RLcj2CL%CSr>7%-WhX4kxz zY2|)WJJ9@cyLFvUR=lrVhIrBso9yd3LohK&ceXjtr2i2P`jOxX zk=GZOBdmX(b#E+7%FK)b3Tk{X6u$SHHU5)_&W_Lb4p8ClT(;{N%d!IwLAMwNkE=Vz zq1r%ScnDR{!O*L-2`62y!Ly(t|M;Hj+N(aRbjUfdU;P{b&@W{N?5w_P6Usox`)ATQ z)06$N4ED!!PS)DJ7O*yXU4$ce@&#o`u->EZLb7^a`A~<&- zn_sHlhkCW&6_sE&g5Z#N9Z&N%9-f(X_-RsRGTiL%_Omq-n!+u;YyXZvNOzc6Mu`g* z;fxp(I|ufU2s(GZMDy|5f}Sr7&&TBy_9vZo?uWZxEl;;0J1f3;?;_&dA^CY}dcH}8 zMrZ2(azE*hRp6CEzIF4>dof$w>uJ|@KF!Ie|BJQZgABz~{eO(X-=@y?k5m8u_2sg3 zdVZc~Q2}ZNpsmIFEtJ-OTT9@(|MQDN>!g0$W++L2JsHlKqg_Y%Yhg>vBV(R_A-jK3 z{O*PYK>56??#GpT+H6ptiLc;_^UuRT-&wSY4VnHWm)a3QMfi_7{o5Q7o|2J*S@2VB zHZsieb{CmvaotCUY~ytt&`w+#T&J54r0QBZWjd0{w?fIDh?b3VcU}LXH$jPFIwN*D zC)VjzU7(XomlIZO`Ha;f`*pxU8Lz_|2dXp z2Kxz%js=D_=;b=pP=nwQVCu;d()VE8D*q+|fKQL1o$Oy7Qrt*Rz3pS*#j-nF)ckzx z-Ui(NmNVbNImA?10MHs4-UBKx8@WgRco(74T9*MFva9)503}TBa6kQ8k&_ehzmkA_NOY(iFSMf^6nVG-)*%bx#wFMh9}KFb6gmYS4U4ODsY#Ufd2Ab+8B6^XAXb zON&|ggS-xizVBBSJ1S@2hJFwr7r+xGcEwyP8YwLWsdO}EbT)t7LlX!=SkOAUV0}-! zJ}Y)?EEKGRfZOV2{^RDtSOFhhwK6z#RYyUlEh2T&GSX>DW0`$T$@lM+KZvg&eA&OQ zs{(y~D~#3hoRKl&QAeB7coSDI$aPV{;Xv@^v*u}jV_C)qt>7X(4<+dv3>L4`h30d? zwMEf^Z?eGpcZ%J?2GhiWFt;IJs)iYs)+F^k1347Tf_>Ay;QkxqYz9}S|R&*W0!8Oe!q&={zE*U4_ zyCSJ$%=^{?n@Q4o5VKcPU{19xwR#t>Kf+vC(HVm-4X^cMb>)NY1gv^vn79<2sV|+g z8g_RqLv{R01Eq}u*|p7GPm-RY0&Mn!W;z)eT5GF3CPE6`4j)XnGuO;C-y%iHU&+X( zG3!DsBSUAhdZrD*QN&kMQ^{T!Z90PMv1Ny{p6QW;JWQmaKH%omOfYtHw7BNGzqLAq zR7efYZ<{z1&ghN{Z8~Ixi2TZRT1DJtSBDQ=g|ZItS+i@tddmt*w5_i}gQFHanrqbe zEQE=1ZYz=lnWh`0V}YhVE%OQD8RT;0zC)|~HtbdwXT0ks|q5lxgwF<+MZTiI_A^-2Ry)tDX%A;QC*l(f1*i-ektUO0uB54X``c?*LN}qvgX~34$s;D==i&Q=dqzRwO@`;LJVlgae$pu-#(LD&h z*J5DJ$ZYnX^hNjcn#Kk`X+g-?Pc1D|M}rC0fp0e{VbtR1$_66T?5GRB62WOEvEK>m zbm3e2eAEz^UjH0Ea53c|;mu^&ld`$>O@bLT$bg!mqxW9!_aaWsYZ4;dWW245`QHZ} z7x*PD`Srf&r!}SRswW=FEDs+{D z!=}7`PM_=}JMg!ZbALWUuW{8`TSU)hLBj5kkZkPBog@67RRgve?=+I)_|p5}C$C)|&jf~L z9Vsz_WRyCLVZ{-_V@k@{fH27VDQanjrhHpzDxU639}*N*5#|y2G@IM9pBuyo?w^d# z=e4)!rrH8cUb>3D>Xjv>Y6tTjX=qY(bh8MA&$5pi(4bBXLza zrDZD}yriK%<=gMu!r6g)USO&=gIHsq*i;Z|IMGCyAQo2-0QaZR1onWEa?ktba5^*2 z`({5F!)s^aAhBFV5&TwOc6pB~!O zyZ&_v(rCX|d?NAC02al6QpG!Ehe--4=Z>ERMysjQndq5a_VF!=_*BMW(Vw+_mc?(W zp?gF7jclg+4%^XG<+GM_F&xvI;6|R`ljQP(Z=t%iTjZ`AFAZZ#e0@!^Ce6^~{7x?o zmV0?20!+B9nY%lK+gDm{Sv=vGpso^8ZbFv@2gA~q^1)aW>(n}bj-WeNQ{18e3CVya zu(|+4KQDyS4X^xaTAH@gl$iF_SjF-Q!yKfz2GAo7GnpZwVSc^A{En(ee#6eXljquqkS6Vjm>@<>AAX{;kB6=i850Ks*j1i*N~!fO`}jBM;%HjaKgaGhJdN!yC;Z>c-~n= zK-jCKuZ)xjK8!w?UXzyy-sj~*I*8o+BVDpFzXjQG41IgNXjLt7?KVPdd*q9-sY{IT-nhlR-ttnaR&u9}HQ%|=+V%F@?gU=h>?xP5V_JSfT<-X^X5Kn8gmxZ?Z$L+Zk zGV9bK`Ay3BrpkCpk)mPVwFFwPZ`0eg1jR<8c#AoekG>gp?4GHrAgkL5jA|RE&bCoy zI*trTP*hf+D=I*-^xA5UVgyMZYig48zB=(B`5^1ioG~F5-`S{v^q3KuX)+k;{ z%3*A~E)9BDOftdUBo;GmNmD>s*ChxGxbz;8lL6{g_0dzMz9?V4s=n?dRi9N2fVT>ZSF*V z9*tgH5QXb;HoBgvE@-I>J<4Pa`Y3-D&m9~@^|_q|El^A^oV1x#xqDM(K3I&M^o)z} z!%_V<^EmCyXOX;J$`R8ZQ@HZ-h}&mk6i)uqbE22LP_DEfje{9`SVmlWPc6FjkYjXl zdy^J(-*=KCYoa=2cL~^*h3~Qz=5!bo)nPNRg_d;}(+kwTiTN$2N)mtNL(C$l!&T@z z<@$tN@W)@!86Tg)B&JU#&2U+IEG`aX;z@r<`NGQ09x=H%Bm9(Zq|%X+bG$?--lp6kCHHY9YbAxN%|H z#j`I20hZVfY*kVR#0D+Vv>d)h3*N4So+Iq1hk zysz4;D?`>8-j{OuwBe3XGpxw3N>q}=vkkE<4u%F$^|x1kvAKnob}*X&C6b#Lv5sW)``-7Sn{T=VC2Ird+Q8kK6GIs9W<^l%M#({73 zw_k*f(Nn8h2FIPZqSI8I^dYMBq>c+iOb>R+#>568=KAx2(1h{wl#(^2v1c(KzHAp- zn%IwqWo-`ipGp_nyNq>y5Wd{?b^k?1jU^wSVk?@THEzypk}^3r7b*mBl-O{t`?yhk zdg%A954pk3uyVMoZ;+#=;3)?Cu);{eEIJ*}Ackmwx@GG$Da5I(Ch4qBS(7sj@bu89 zl66STtj9y}Su+FG=j)a$=B^Tcjj6=3#in}i9j?pahYIke^{6wRKq#4;mmKEW?^nOQ=*?!&n%AZDHw`(KbBo`d zQS%EW#h*JYi6XA;J~VT?{a(Q}Qf>*#4eg}6`22Te$1xRp7c?Hx6F@_pU)q?P>+aYL z>aU{?9O2HJ8zHvW8U%>fQM5WUh$?lyuoa&_YJ``+oMK7DSP+! zLb>(qn)fvg*{L%De!`(O9qwJc`sYp`3+^|_NoZ1ptqCXlrq_=eJl4Rb+Q%h&(Ag<` zJ6*+l(9~LEj&ScQChCCNB+i}`Ig?##(X9EHbsf*V$wRSdsN=+qF@!x=zq&~sgOw8i zh_yzFjh5eAdbww{JY4D{Hasy-xck!a`|{~EE-U@OS_ms*u?1FKe}v1=4SgNi07huW zsh-?9dg>_&4M{#6j`)wWgmj#Q-LKG+hAPBz?j>YnNsBG5qW9B^6ChgQjYcn2U%PIe zLtczBS%=|%%h;Nr69w3M7UI*s3Far!Si}=BIxNP!m{R#H56yE^phMuLl~m4ykX5d6 zcwO_u;2jBy=c3N6JFJZ?P(G^=sHJTnacJ>ltAW>sU#-Ua0*OGv$OdU6T@KObdXs9z zWRmAd;|@%7+gNLRde|d3E%lr&twFfpFSs;c^?f==%y%=1DYmhu7~D;u!TVD`G`V#k z;)Z7sg-b=Xuav4^)r`oH^lrMQF6@5gGcbw7KzCct2;PL@ z+BVy4`0&XNQRM`Ykx0Bx4Ur6K3_q5#(d5Zk7{a;>u?)4n``;Hma1Ju8_jhrUr z+^xU?-Aok6N{r{S!ql4foA2Ij1J{05lwy8OkXhth<2>^k1#;`oR2@+H6r}Z)^CZkS zrrwxoEl%&6+?0{Ny0J1Rn@CU$+oDCoNupAQHC6#dzb(Sk!1S(z>G9gpp|0=?uips#-=ooUh%D#zO9ObNktRn^M_=L79E?wdasf3lfd2 zodxJpsYggB*?!WQm3klrrM;4C#-_NoHlcsdbZO!Z20a4Eh1fkR>fX_k;Z#gdsZttd zeUH!ExQ-3(_C5&Ugepz(*co|q@p&f5t>EKBeL^hHykZUK>+4NS;oB|ilM*tXV81w< z=;d)2egco(mSEz!nqn$xMGtmcI7(UCv(6OPvI4dIur)N+wd*S%HI3dtGOl@By3CZG zm9HIZVL}G+Is1o7+X@06yo4Wf_PN|P7|fs%i`rj4&aG`svLweud$dgzxJvg)P+tz7 z|B&73-36gPYV~}8oewiv0T$WMV-RnfyRQExz0myk5~Cdw=j^j_y_L1>o%QL_-Yknv z3X@k@PG7NGKx$f{XcBDJh$Y~r@afr=fWmw%XtK>Y>A1Y+0l8vi0|x$ih3XD3oslvl z-J6-lFc8x?tUjJxD%01YL^|(sTgz+CwsXJl+0kf zY{3RXbGfH|I5*QcG`u{mHq^%%XeVOJb^!ZKw&nvH%OeA~fzj)&+E>m}X!0bak&;Ts z>Kd>@?L>O`EupUA<8$+|)AO^kx+?L}q?q)Gic0i{C99PzD8rZG+*Ks&_E?lV3oKNVea~iS!o5vPA{KvCpMK3SU zYYJ;YTE>?TuhPfa_9m&-8z+k?sy7#Z&h}PWeg9jVH%^O&hVc2^hnYA&*QUIYkuq7< zSn*d`W0LMxaI5&up^cRmA1jNBW~^leSKqYTRM?Sv{kY-o;Rb@ApTv$LS{X!!JjrN~L7u`w9BK3BXQ*3z1%f#pB9Qh zWA5)67wcYA%1ZfE7E}D$^-UNFk7>x3<@P`XM<~>kn4AL8meHrw)@3~wCAkw|w6n*@ zeh&F=t%zDiihhaF>EhlpTKxr2*H^yyg$qlt7n!TtsJkX9BHg_vY|8vRL8xvdCrcMkm@ZI~OwzlwuQbucvlyjBcKP z@^;pkb?5Z+UpJ*;pTuXBcIt~%S=MxT6Y=G<4J|<eC= z%wB%^;cYu`lv|v5&8yY~$kqqojrkZb8P66oEv3zJ^1A($r{`Rild*u+G)?|QtJv+F zm|$94Qkf7s*9oY4W4y&uX6h2#ciWGs^<1Kc!g)g8CYP3UeoSwZ z7?mqFW5ekXtnL2HG_s=4bSRPa!@1$pGPien!AuV{AeUk zV1I@|E^z<;0&t-W*=4g2Hnvz|-+;HTgK(H{y?ecC zeD+vW8_T1^w@QT4h$Nb~X#^bSyW*U+68sjnSJOO~!D0#x{5n1RvwuS#38;HqJq=C1 zC_N$xBe@c^3!EAa(`2rR%9`>rYT3fmeBOofjNC-@Re=}OyebG(0O-b8Vi7M9;gqeG zrIkg;MjdkkszLe!8GSEJ5Ng#wTmI0+8XAtOi2D)-iw*WKZuQBZ9(Bu9>P(D^Oy7(@ z{Tl_LANAOGGt=(7-wCg#sV4Zlqy9$;<$5%T)`;rc>Jfrz+?>Bb{u3F2hWc{@p3kzo zMF36y_6AaL{6fAg{P_R9u!+0y{heF8EQbMUvpkVw1{)H? zrNMtYOR{SiwWY)&CBlkr%Qmf0jiw@cEQ&|NwxLz$0A}u3_M1ZH%b%*7ZtT*!OUrtZ z(NX>(c#0y?%<;JMBEcqHrFO;9XImv z?UPkRHX^{spC4Iq^d$Z#(i1{BcpQ7Dk68DM=0%@56e*B~5lN|>n$#*BG#P|WrX_#{ zj{)xwH&2vZM*ii0MTi`tnGWiu)sQj1yrF-rCb9Ve`Z11+h4JwKIdN!v1{{Q@BlJlb z@aZD}>)+5KlqrLK>|B(juaUzLLk1pM_ZvP9Exzh5po>y@#Dwp`8MctW6s7y`+^C07 z;lCw%4PQy6kJR16sfO9T7)IDrI)oaB+2Xqa1E(7FCzAXhHujrSZFW9V4TS0RyM%*; z-vS(?>$^q%%a#ZpEolH3lYkW)U_(A&Em;|efet5yiir0=#OZi5gn5$@ZuO8(&7_!Q{GtMVc?{l?w9zBd3E!``M!ZCH6l={~w<%m(PA5 X0<9R-aeG{0piM?XQM^jjAn^YIZS5Ij literal 0 HcmV?d00001 diff --git a/extensions/vscode-aml/package.json b/extensions/vscode-aml/package.json index aaf3c746a..6e10e372c 100644 --- a/extensions/vscode-aml/package.json +++ b/extensions/vscode-aml/package.json @@ -2,9 +2,10 @@ "name": "vscode-aml", "displayName": "AML - Fast database design", "description": "Language support for Azimutt Markup Language (AML)", - "icon": "assets/icon.png", "version": "0.0.1", - "publisher": "loicknuchel", + "icon": "assets/icon.png", + "publisher": "azimutt", + "license": "MIT", "engines": { "vscode": "^1.95.0" }, @@ -12,11 +13,13 @@ "Programming Languages", "Snippets" ], + "keywords": ["database", "diagram", "sql"], "repository": { "type": "git", - "url": "git+https://github.com/azimuttapp/azimutt.git", + "url": "https://github.com/azimuttapp/azimutt", "directory": "extensions/vscode-aml" }, + "type": "module", "activationEvents": [], "browser": "./dist/web/extension.js", "contributes": { diff --git a/extensions/vscode-aml/tsconfig.json b/extensions/vscode-aml/tsconfig.json index 1d76149b4..760d93c5b 100644 --- a/extensions/vscode-aml/tsconfig.json +++ b/extensions/vscode-aml/tsconfig.json @@ -2,12 +2,10 @@ "compilerOptions": { "module": "Node16", "target": "ES2020", + "lib": ["ES2020", "WebWorker"], + "rootDir": "src", "outDir": "dist", - "lib": [ - "ES2020", "WebWorker" - ], "sourceMap": true, - "rootDir": "src", "strict": true /* enable all strict type-checking options */ /* Additional Checks */ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ diff --git a/extensions/vscode-aml/vsc-extension-quickstart.md b/extensions/vscode-aml/vsc-extension-quickstart.md deleted file mode 100644 index 5176d16cd..000000000 --- a/extensions/vscode-aml/vsc-extension-quickstart.md +++ /dev/null @@ -1,44 +0,0 @@ -# Welcome to your VS Code Extension - -## What's in the folder - -* This folder contains all of the files necessary for your web extension. -* `package.json` * this is the manifest file in which you declare your extension and command. -* `src/web/extension.ts` * this is the main file for the browser -* `webpack.config.js` * the webpack config file for the web main - -## Setup - -* install the recommended extensions (amodio.tsl-problem-matcher, ms-vscode.extension-test-runner, and dbaeumer.vscode-eslint) - -## Get up and running the Web Extension - -* Run `pnpm install`. -* Place breakpoints in `src/web/extension.ts`. -* Debug via F5 (Run Web Extension). -* Execute extension code via `F1 > Hello world`. - -## Make changes - -* You can relaunch the extension from the debug toolbar after changing code in `src/web/extension.ts`. -* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. - -## Explore the API - -* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. - -## Run tests - -* Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. -* Press `F5` to run the tests in a new window with your extension loaded. -* See the output of the test result in the debug console. -* Make changes to `src/web/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder. - * The provided test runner will only consider files matching the name pattern `**.test.ts`. - * You can create folders inside the `test` folder to structure your tests any way you want. - -## Go further - -* [Follow UX guidelines](https://code.visualstudio.com/api/ux-guidelines/overview) to create extensions that seamlessly integrate with VS Code's native interface and patterns. -* Check out the [Web Extension Guide](https://code.visualstudio.com/api/extension-guides/web-extensions). -* [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. -* Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). From 58347fb45d91b0bce0609a992ef5aeb93e2fcb5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Sat, 23 Nov 2024 18:40:34 +0100 Subject: [PATCH 08/20] Move VS Code extension to npm --- extensions/vscode-aml/package-lock.json | 6043 +++++++++++++++++++++++ extensions/vscode-aml/package.json | 16 +- pnpm-lock.yaml | 1394 +----- pnpm-workspace.yaml | 1 - 4 files changed, 6097 insertions(+), 1357 deletions(-) create mode 100644 extensions/vscode-aml/package-lock.json diff --git a/extensions/vscode-aml/package-lock.json b/extensions/vscode-aml/package-lock.json new file mode 100644 index 000000000..2872d8bae --- /dev/null +++ b/extensions/vscode-aml/package-lock.json @@ -0,0 +1,6043 @@ +{ + "name": "vscode-aml", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vscode-aml", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@azimutt/aml": "^0.1.8", + "@azimutt/models": "^0.1.16", + "@azimutt/parser-sql": "^0.1.3" + }, + "devDependencies": { + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@types/assert": "^1.5.11", + "@types/mocha": "^10.0.10", + "@types/vscode": "^1.95.0", + "@typescript-eslint/eslint-plugin": "^8.15.0", + "@typescript-eslint/parser": "^8.15.0", + "@vscode/test-web": "^0.0.64", + "assert": "^2.1.0", + "esbuild": "^0.24.0", + "eslint": "^9.15.0", + "glob": "^11.0.0", + "mocha": "^10.8.2", + "npm-run-all": "^4.1.5", + "typescript": "^5.6.3" + }, + "engines": { + "vscode": "^1.95.0" + } + }, + "node_modules/@azimutt/aml": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@azimutt/aml/-/aml-0.1.8.tgz", + "integrity": "sha512-gyNAkiW1TdaXA2rg9SpBWE2p1VUnPZIv1C1r+fSt4DlDVjcRnO4Q+9QpJZoqmVghu5Hqbd5c5ia+k/vAwufrkw==", + "dependencies": { + "@azimutt/models": "^0.1.15", + "@azimutt/utils": "^0.1.6", + "chevrotain": "10.5.0" + } + }, + "node_modules/@azimutt/models": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@azimutt/models/-/models-0.1.16.tgz", + "integrity": "sha512-cW/ATuEb97Slivnehbq3UyjgTilYpsJpLJ5qkWgBZOI6ldbBld9179ywopz17XvhjVBiZu1NGEm/jDPBXV8xOw==", + "dependencies": { + "@azimutt/utils": "^0.1.6", + "openai": "4.65.0", + "zod": "3.23.8", + "zod-to-json-schema": "3.23.3" + } + }, + "node_modules/@azimutt/parser-sql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@azimutt/parser-sql/-/parser-sql-0.1.3.tgz", + "integrity": "sha512-whsNHlfTNhGMXgUGZpW5YbCOrulFHMRO2rmM3U91ME/pa8kuYEXQ1U3u/cs3ZvTyS5zdW5p0H+41Okuwq9dQ/A==", + "dependencies": { + "@azimutt/models": "^0.1.16", + "@azimutt/utils": "^0.1.6", + "chevrotain": "10.5.0", + "zod": "3.23.8" + } + }, + "node_modules/@azimutt/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@azimutt/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-Qbe+78I1oseQUBJ82HbRK3OZKTiltStd+6bvnrvrnjWYMq739y86PDk4Jo5Ua8lT/i4jv9Gb5Ye584PuIXhXbw==" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.5.0.tgz", + "integrity": "sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==", + "dependencies": { + "@chevrotain/gast": "10.5.0", + "@chevrotain/types": "10.5.0", + "lodash": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz", + "integrity": "sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==", + "dependencies": { + "@chevrotain/types": "10.5.0", + "lodash": "4.17.21" + } + }, + "node_modules/@chevrotain/types": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.5.0.tgz", + "integrity": "sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==" + }, + "node_modules/@chevrotain/utils": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.5.0.tgz", + "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==" + }, + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + "dev": true, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "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, + "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/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "dev": true, + "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, + "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/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "dev": true, + "dependencies": { + "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, + "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, + "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, + "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, + "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, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@koa/cors": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-5.0.0.tgz", + "integrity": "sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==", + "dev": true, + "dependencies": { + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@koa/router": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-13.1.0.tgz", + "integrity": "sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==", + "dev": true, + "dependencies": { + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "path-to-regexp": "^6.3.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@playwright/browser-chromium": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.49.0.tgz", + "integrity": "sha512-SnDBEmw0h4XpbHcWR8T0LgLj1Cqn8Cvql+Nahot2zBud945z+MYXH3WVPvMI5U37WsWAgw9Cj7pZ6oL7haKrhg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "playwright-core": "1.49.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/assert": { + "version": "1.5.11", + "resolved": "https://registry.npmjs.org/@types/assert/-/assert-1.5.11.tgz", + "integrity": "sha512-FjS1mxq2dlGr9N4z72/DO+XmyRS3ZZIoVn998MEopAN/OmyN28F4yumRL5pOw2z+hbFLuWGYuF2rrw5p11xM5A==", + "dev": true + }, + "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 + }, + "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 + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.19.65", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.65.tgz", + "integrity": "sha512-Ay5BZuO1UkTmVHzZJNvZKw/E+iB3GQABb6kijEz89w2JrfhNA+M/ebp18pfz9Gqe9ywhMC8AA8yC01lZq48J+Q==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/vscode": { + "version": "1.95.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.95.0.tgz", + "integrity": "sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz", + "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/type-utils": "8.15.0", + "@typescript-eslint/utils": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz", + "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz", + "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz", + "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/utils": "8.15.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz", + "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz", + "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/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, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vscode/test-web": { + "version": "0.0.64", + "resolved": "https://registry.npmjs.org/@vscode/test-web/-/test-web-0.0.64.tgz", + "integrity": "sha512-V7fTb3K1HzlqwT+VrxIq+vZLqPYzoItu6Tg3vd6sbd87ll0srICQNiH/W7IBUn76zHf7v5xzEXzNOnhSQJ2/YQ==", + "dev": true, + "dependencies": { + "@koa/cors": "^5.0.0", + "@koa/router": "^13.1.0", + "@playwright/browser-chromium": "^1.48.2", + "glob": "^11.0.0", + "gunzip-maybe": "^1.4.2", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "koa": "^2.15.3", + "koa-morgan": "^1.0.1", + "koa-mount": "^4.0.0", + "koa-static": "^5.0.0", + "minimist": "^1.2.8", + "playwright": "^1.48.2", + "tar-fs": "^3.0.6", + "vscode-uri": "^3.0.8" + }, + "bin": { + "vscode-test-web": "out/server/index.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "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==", + "dev": true, + "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, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "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, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bare-events": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", + "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "dev": true, + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "dev": true, + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "dev": true, + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.4.2.tgz", + "integrity": "sha512-XZ4ln/KV4KT+PXdIWTKjsLY+quqCaEtqqtgGJVPw9AoM73By03ij64YjepK0aQvHSWDb6AfAZwqKaFu68qkrdA==", + "dev": true, + "optional": true, + "dependencies": { + "streamx": "^2.20.0" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "dev": true, + "dependencies": { + "pako": "~0.2.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dev": true, + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chevrotain": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.5.0.tgz", + "integrity": "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==", + "dependencies": { + "@chevrotain/cst-dts-gen": "10.5.0", + "@chevrotain/gast": "10.5.0", + "@chevrotain/types": "10.5.0", + "@chevrotain/utils": "10.5.0", + "lodash": "4.17.21", + "regexp-to-ast": "0.5.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookies": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "dev": true, + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "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, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "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.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/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, + "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, + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "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, + "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==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", + "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.15.0", + "@eslint/plugin-kit": "^0.2.3", + "@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.5", + "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-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, + "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": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/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, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "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/espree/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, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", + "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "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.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/gunzip-maybe": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", + "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", + "dev": true, + "dependencies": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "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, + "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, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "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, + "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==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dev": true, + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": true, + "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/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.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, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-deflate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", + "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.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, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", + "dev": true, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz", + "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dev": true, + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/koa": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", + "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", + "dev": true, + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.9.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/koa-morgan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/koa-morgan/-/koa-morgan-1.0.1.tgz", + "integrity": "sha512-JOUdCNlc21G50afBXfErUrr1RKymbgzlrO5KURY+wmDG1Uvd2jmxUJcHgylb/mYXy2SjiNZyYim/ptUBGsIi3A==", + "dev": true, + "dependencies": { + "morgan": "^1.6.1" + } + }, + "node_modules/koa-mount": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/koa-mount/-/koa-mount-4.0.0.tgz", + "integrity": "sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==", + "dev": true, + "dependencies": { + "debug": "^4.0.1", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/koa-send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-send/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-send/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/koa-static/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/koa/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", + "dev": true, + "engines": { + "node": "20 || >=22" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm-run-all/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm-run-all/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "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==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", + "dev": true + }, + "node_modules/openai": { + "version": "4.65.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.65.0.tgz", + "integrity": "sha512-LfA4KUBpH/8rA3vjCQ74LZtdK/8wx9W6Qxq8MHqEdImPsN1XPQ2ompIuJWkKS6kXt5Cs5i8Eb65IIo4M7U+yeQ==", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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 + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/peek-stream": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/playwright": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0.tgz", + "integrity": "sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==", + "dev": true, + "dependencies": { + "playwright-core": "1.49.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0.tgz", + "integrity": "sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "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, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", + "dev": true, + "dependencies": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/resolve-path/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/resolve-path/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/resolve-path/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/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 + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.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, + "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, + "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/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true + }, + "node_modules/streamx": { + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.2.tgz", + "integrity": "sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "dev": true, + "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/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "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, + "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-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-fs/node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", + "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-api-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true, + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" + }, + "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, + "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/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.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==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/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 + }, + "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, + "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.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ylru": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.23.3", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.3.tgz", + "integrity": "sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==", + "peerDependencies": { + "zod": "^3.23.3" + } + } + } +} diff --git a/extensions/vscode-aml/package.json b/extensions/vscode-aml/package.json index 6e10e372c..15bb76611 100644 --- a/extensions/vscode-aml/package.json +++ b/extensions/vscode-aml/package.json @@ -2,7 +2,7 @@ "name": "vscode-aml", "displayName": "AML - Fast database design", "description": "Language support for Azimutt Markup Language (AML)", - "version": "0.0.1", + "version": "0.1.0", "icon": "assets/icon.png", "publisher": "azimutt", "license": "MIT", @@ -13,7 +13,11 @@ "Programming Languages", "Snippets" ], - "keywords": ["database", "diagram", "sql"], + "keywords": [ + "database", + "diagram", + "sql" + ], "repository": { "type": "git", "url": "https://github.com/azimuttapp/azimutt", @@ -90,13 +94,13 @@ }, "scripts": { "test": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. --extensionTestsPath=dist/web/test/suite/extensionTests.js", - "pretest": "pnpm run compile-web", - "vscode:prepublish": "pnpm run package-web", - "compile-web": "pnpm run check-types && pnpm run lint && node esbuild.js", + "pretest": "npm run compile-web", + "vscode:prepublish": "npm run package-web", + "compile-web": "npm run check-types && npm run lint && node esbuild.js", "watch-web": "npm-run-all -p watch-web:*", "watch-web:esbuild": "node esbuild.js --watch", "watch-web:tsc": "tsc --noEmit --watch --project tsconfig.json", - "package-web": "pnpm run check-types && pnpm run lint && node esbuild.js --production", + "package-web": "npm run check-types && npm run lint && node esbuild.js --production", "check-types": "tsc --noEmit", "lint": "eslint src", "run-in-browser": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. ." diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4c3cc1c4..6196ba05c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -300,61 +300,6 @@ importers: specifier: ^5.96.1 version: 5.96.1(@swc/core@1.9.1) - extensions/vscode-aml: - dependencies: - '@azimutt/aml': - specifier: ^0.1.8 - version: 0.1.8 - '@azimutt/models': - specifier: ^0.1.16 - version: 0.1.16 - '@azimutt/parser-sql': - specifier: ^0.1.3 - version: 0.1.3 - devDependencies: - '@esbuild-plugins/node-globals-polyfill': - specifier: ^0.2.3 - version: 0.2.3(esbuild@0.24.0) - '@types/assert': - specifier: ^1.5.11 - version: 1.5.11 - '@types/mocha': - specifier: ^10.0.10 - version: 10.0.10 - '@types/vscode': - specifier: ^1.95.0 - version: 1.95.0 - '@typescript-eslint/eslint-plugin': - specifier: ^8.15.0 - version: 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/parser': - specifier: ^8.15.0 - version: 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@vscode/test-web': - specifier: ^0.0.64 - version: 0.0.64 - assert: - specifier: ^2.1.0 - version: 2.1.0 - esbuild: - specifier: ^0.24.0 - version: 0.24.0 - eslint: - specifier: ^9.15.0 - version: 9.15.0(jiti@1.21.6) - glob: - specifier: ^11.0.0 - version: 11.0.0 - mocha: - specifier: ^10.8.2 - version: 10.8.2 - npm-run-all: - specifier: ^4.1.5 - version: 4.1.5 - typescript: - specifier: ^5.6.3 - version: 5.6.3 - frontend: dependencies: '@azimutt/aml': @@ -620,7 +565,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -651,7 +596,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -682,7 +627,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -713,7 +658,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -744,7 +689,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -775,7 +720,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -809,7 +754,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -846,7 +791,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -880,7 +825,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -914,7 +859,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -951,7 +896,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1006,7 +951,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1055,7 +1000,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1110,7 +1055,7 @@ importers: version: 4.25.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1131,7 +1076,7 @@ importers: version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3) typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1342,9 +1287,6 @@ packages: resolution: {integrity: sha512-k0z5b5dkYSuOHY0AOZ4iyjcGBeVL9lWsQNF4+c+1oK3OW4fRWl/bNa1soMRMpangsHPzgyn/QkzuDbl7qR4qrw==} engines: {node: '>=16.0.0'} - '@azimutt/aml@0.1.8': - resolution: {integrity: sha512-gyNAkiW1TdaXA2rg9SpBWE2p1VUnPZIv1C1r+fSt4DlDVjcRnO4Q+9QpJZoqmVghu5Hqbd5c5ia+k/vAwufrkw==} - '@azimutt/connector-bigquery@0.1.2': resolution: {integrity: sha512-MXdXAZxxn/32nCKXz+ZIk4BQajHhdVw4eI5oIKj5+vrjdXnLmXNvf6QClbHJ+mR9anDSJLTvPDEDY4iI3X4nFw==} @@ -1375,12 +1317,6 @@ packages: '@azimutt/models@0.1.15': resolution: {integrity: sha512-Cog6HffVeKKPqx4KJE2iSYYy3ypE678cl2fIDDaeMsNHU8Agx6fXaOOOm9mj8MY1E7QANTIse2qFls9OXaB5Tg==} - '@azimutt/models@0.1.16': - resolution: {integrity: sha512-cW/ATuEb97Slivnehbq3UyjgTilYpsJpLJ5qkWgBZOI6ldbBld9179ywopz17XvhjVBiZu1NGEm/jDPBXV8xOw==} - - '@azimutt/parser-sql@0.1.3': - resolution: {integrity: sha512-whsNHlfTNhGMXgUGZpW5YbCOrulFHMRO2rmM3U91ME/pa8kuYEXQ1U3u/cs3ZvTyS5zdW5p0H+41Okuwq9dQ/A==} - '@azimutt/utils@0.1.6': resolution: {integrity: sha512-Qbe+78I1oseQUBJ82HbRK3OZKTiltStd+6bvnrvrnjWYMq739y86PDk4Jo5Ua8lT/i4jv9Gb5Ye584PuIXhXbw==} @@ -1837,11 +1773,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild-plugins/node-globals-polyfill@0.2.3': - resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} - peerDependencies: - esbuild: '*' - '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -1854,12 +1785,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -1872,12 +1797,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -1890,12 +1809,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -1908,12 +1821,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -1926,12 +1833,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -1944,12 +1845,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -1962,12 +1857,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -1980,12 +1869,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -1998,12 +1881,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -2016,12 +1893,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -2034,12 +1905,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.14.54': resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} engines: {node: '>=12'} @@ -2058,12 +1923,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -2076,12 +1935,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -2094,12 +1947,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -2112,12 +1959,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -2130,12 +1971,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -2148,12 +1983,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -2166,24 +1995,12 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -2196,12 +2013,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -2214,12 +2025,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -2232,12 +2037,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -2250,12 +2049,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -2268,12 +2061,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2288,18 +2075,10 @@ packages: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-array@0.19.0': - resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.7.0': resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.0': - resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2308,10 +2087,6 @@ packages: resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2320,10 +2095,6 @@ packages: resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.15.0': - resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2332,10 +2103,6 @@ packages: resolution: {integrity: sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.3': - resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fastify/ajv-compiler@3.6.0': resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} @@ -2531,14 +2298,6 @@ packages: '@js-joda/core@5.6.3': resolution: {integrity: sha512-T1rRxzdqkEXcou0ZprN1q9yDRlvzCPLqmlNt5IIsGBzoEVgLCCYrKEwc84+TvsXuAc95VAZwtWD2zVsKPY4bcA==} - '@koa/cors@5.0.0': - resolution: {integrity: sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==} - engines: {node: '>= 14.0.0'} - - '@koa/router@13.1.0': - resolution: {integrity: sha512-mNVu1nvkpSd8Q8gMebGbCkDWJ51ODetrFvLKYusej+V0ByD4btqHYnPIzTBLXnQMVUlm/oxVwqmWBY3zQfZilw==} - engines: {node: '>= 18'} - '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -2630,10 +2389,6 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/browser-chromium@1.49.0': - resolution: {integrity: sha512-SnDBEmw0h4XpbHcWR8T0LgLj1Cqn8Cvql+Nahot2zBud945z+MYXH3WVPvMI5U37WsWAgw9Cj7pZ6oL7haKrhg==} - engines: {node: '>=18'} - '@radix-ui/number@1.1.0': resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} @@ -3515,9 +3270,6 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - '@types/assert@1.5.11': - resolution: {integrity: sha512-FjS1mxq2dlGr9N4z72/DO+XmyRS3ZZIoVn998MEopAN/OmyN28F4yumRL5pOw2z+hbFLuWGYuF2rrw5p11xM5A==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -3641,9 +3393,6 @@ packages: '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@types/mocha@10.0.10': - resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} - '@types/mssql@9.1.5': resolution: {integrity: sha512-Q9EsgXwuRoX5wvUSu24YfbKMbFChv7pZ/jeCzPkj47ehcuXYsBcfogwrtVFosSjinD4Q/MY2YPGk9Yy1cM2Ywg==} @@ -3725,9 +3474,6 @@ packages: '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@types/vscode@1.95.0': - resolution: {integrity: sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==} - '@types/webextension-polyfill@0.8.3': resolution: {integrity: sha512-GN+Hjzy9mXjWoXKmaicTegv3FJ0WFZ3aYz77Wk8TMp1IY3vEzvzj1vnsa0ggV7vMI1i+PUxe4qqnIJKCzf9aTg==} @@ -3760,17 +3506,6 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.15.0': - resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@8.13.0': resolution: {integrity: sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3781,24 +3516,10 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.15.0': - resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/scope-manager@8.13.0': resolution: {integrity: sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.15.0': - resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.13.0': resolution: {integrity: sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3808,24 +3529,10 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.15.0': - resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/types@8.13.0': resolution: {integrity: sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.15.0': - resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.13.0': resolution: {integrity: sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3835,39 +3542,16 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.15.0': - resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/utils@8.13.0': resolution: {integrity: sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/utils@8.15.0': - resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/visitor-keys@8.13.0': resolution: {integrity: sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.15.0': - resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -3908,11 +3592,6 @@ packages: '@vitest/utils@2.1.4': resolution: {integrity: sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==} - '@vscode/test-web@0.0.64': - resolution: {integrity: sha512-V7fTb3K1HzlqwT+VrxIq+vZLqPYzoItu6Tg3vd6sbd87ll0srICQNiH/W7IBUn76zHf7v5xzEXzNOnhSQJ2/YQ==} - engines: {node: '>=16'} - hasBin: true - '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -4051,10 +3730,6 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -4201,9 +3876,6 @@ packages: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -4262,9 +3934,6 @@ packages: axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - b4a@1.6.7: - resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} - babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4293,28 +3962,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.5.0: - resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} - - bare-fs@2.3.5: - resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} - - bare-os@2.4.4: - resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} - - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} - - bare-stream@2.4.0: - resolution: {integrity: sha512-sd96/aZ8LjF1uJbEHzIo1LrERPKRFPEy1nZ1eOILftBxrVsFDAQkimHIIq87xrHcubzjNeETsD9PwN0wp+vLiQ==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -4403,12 +4053,6 @@ packages: resolution: {integrity: sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==} engines: {'0': node} - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - browserslist@4.24.2: resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -4464,10 +4108,6 @@ packages: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - cache-content-type@1.0.1: - resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} - engines: {node: '>= 6.0.0'} - cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -4774,10 +4414,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - cookies@0.9.1: - resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} - engines: {node: '>= 0.8'} - core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -4957,10 +4593,6 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -4980,9 +4612,6 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-equal@1.0.1: - resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -5091,10 +4720,6 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} @@ -5158,9 +4783,6 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - duplexify@4.1.3: resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} @@ -5521,11 +5143,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -5651,16 +5268,6 @@ packages: jiti: optional: true - eslint@9.15.0: - resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - esniff@2.0.1: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} @@ -5795,9 +5402,6 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -6057,11 +5661,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -6176,11 +5775,6 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true - glob@11.0.0: - resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} - engines: {node: 20 || >=22} - hasBin: true - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -6258,10 +5852,6 @@ packages: resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} engines: {node: '>=14.0.0'} - gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -6358,10 +5948,6 @@ packages: htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - http-assert@1.5.0: - resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} - engines: {node: '>= 0.8'} - http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -6376,10 +5962,6 @@ packages: resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} engines: {node: '>= 0.6'} - http-errors@1.8.1: - resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} - engines: {node: '>= 0.6'} - http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -6529,10 +6111,6 @@ packages: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -6573,9 +6151,6 @@ packages: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} - is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -6602,18 +6177,10 @@ packages: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -6629,10 +6196,6 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -6649,10 +6212,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - is-plain-obj@3.0.0: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} @@ -6784,10 +6343,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jackspeak@4.0.2: - resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} - engines: {node: 20 || >=22} - jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} @@ -6986,9 +6541,6 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -7049,10 +6601,6 @@ packages: jws@4.0.0: resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} - keygrip@1.1.0: - resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} - engines: {node: '>= 0.6'} - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -7064,32 +6612,6 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - koa-compose@4.1.0: - resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} - - koa-convert@2.0.0: - resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} - engines: {node: '>= 10'} - - koa-morgan@1.0.1: - resolution: {integrity: sha512-JOUdCNlc21G50afBXfErUrr1RKymbgzlrO5KURY+wmDG1Uvd2jmxUJcHgylb/mYXy2SjiNZyYim/ptUBGsIi3A==} - - koa-mount@4.0.0: - resolution: {integrity: sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==} - engines: {node: '>= 7.6.0'} - - koa-send@5.0.1: - resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} - engines: {node: '>= 8'} - - koa-static@5.0.0: - resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} - engines: {node: '>= 7.6.0'} - - koa@2.15.3: - resolution: {integrity: sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==} - engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} - kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} @@ -7138,10 +6660,6 @@ packages: resolution: {integrity: sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==} engines: {node: '>=4'} - load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -7239,10 +6757,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.0.2: - resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} - engines: {node: 20 || >=22} - lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -7316,10 +6830,6 @@ packages: memory-stream@1.0.0: resolution: {integrity: sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==} - memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -7393,10 +6903,6 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - minimatch@3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} @@ -7470,11 +6976,6 @@ packages: mnemonist@0.39.6: resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} - mocha@10.8.2: - resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} - engines: {node: '>= 14.0.0'} - hasBin: true - moment-timezone@0.5.46: resolution: {integrity: sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==} @@ -7511,10 +7012,6 @@ packages: socks: optional: true - morgan@1.10.0: - resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} - engines: {node: '>= 0.8.0'} - ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -7656,11 +7153,6 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true - npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} @@ -7695,10 +7187,6 @@ packages: resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -7751,9 +7239,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - only@0.0.2: - resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} - open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} @@ -7858,9 +7343,6 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -7876,10 +7358,6 @@ packages: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -7928,24 +7406,13 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} - path-to-regexp@0.1.10: resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} - path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-type@2.0.0: resolution: {integrity: sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==} engines: {node: '>=4'} - path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -7961,9 +7428,6 @@ packages: resolution: {integrity: sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==} engines: {node: '>=14', npm: '>=7'} - peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - pem@1.14.2: resolution: {integrity: sha512-TOnPtq3ZFnCniOZ+rka4pk8UIze9xG1qI+wNE7EmkiR/cg+53uVvk5QbkWZ7M6RsuOxzz62FW1hlAobJr/lTOA==} engines: {node: '>=6.0.0'} @@ -8033,19 +7497,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true - pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} @@ -8068,16 +7523,6 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - playwright-core@1.49.0: - resolution: {integrity: sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==} - engines: {node: '>=18'} - hasBin: true - - playwright@1.49.0: - resolution: {integrity: sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==} - engines: {node: '>=18'} - hasBin: true - plist@3.1.0: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} @@ -8284,15 +7729,9 @@ packages: pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -8322,9 +7761,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} @@ -8407,10 +7843,6 @@ packages: resolution: {integrity: sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==} engines: {node: '>=4'} - read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - readable-stream@1.0.31: resolution: {integrity: sha512-tco/Dwv1f/sgIgN6CWdj/restacPKNskK6yps1981ivH2ZmLYcs5o5rVzL3qaO/cSkhN8hYOMWs7+glzOLSgRg==} @@ -8508,10 +7940,6 @@ packages: resolution: {integrity: sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g==} engines: {node: '>=4', npm: '>=2'} - resolve-path@1.4.0: - resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} - engines: {node: '>= 0.8'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -8900,9 +8328,6 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamx@2.20.2: - resolution: {integrity: sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==} - string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -8915,10 +8340,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.padend@3.1.6: - resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} - engines: {node: '>= 0.4'} - string.prototype.trim@1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -9059,12 +8480,6 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} - - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -9119,9 +8534,6 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - text-decoder@1.2.1: - resolution: {integrity: sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==} - text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -9138,9 +8550,6 @@ packages: thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -9299,10 +8708,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsscmp@1.0.6: - resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} - engines: {node: '>=0.6.x'} - tsx@4.19.2: resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} engines: {node: '>=18.0.0'} @@ -9477,9 +8882,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utila@0.4.0: resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} @@ -9586,9 +8988,6 @@ packages: jsdom: optional: true - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - w3c-xmlserializer@4.0.0: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} @@ -9730,9 +9129,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerpool@6.5.1: - resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -9867,10 +9263,6 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -9891,10 +9283,6 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - ylru@1.4.0: - resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} - engines: {node: '>= 4.0.0'} - yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -10449,14 +9837,6 @@ snapshots: '@smithy/types': 3.6.0 tslib: 2.8.1 - '@azimutt/aml@0.1.8': - dependencies: - '@azimutt/models': 0.1.16 - '@azimutt/utils': 0.1.6 - chevrotain: 10.5.0 - transitivePeerDependencies: - - encoding - '@azimutt/connector-bigquery@0.1.2': dependencies: '@azimutt/models': 0.1.15 @@ -10553,24 +9933,6 @@ snapshots: transitivePeerDependencies: - encoding - '@azimutt/models@0.1.16': - dependencies: - '@azimutt/utils': 0.1.6 - openai: 4.65.0(encoding@0.1.13)(zod@3.23.8) - zod: 3.23.8 - zod-to-json-schema: 3.23.3(zod@3.23.8) - transitivePeerDependencies: - - encoding - - '@azimutt/parser-sql@0.1.3': - dependencies: - '@azimutt/models': 0.1.16 - '@azimutt/utils': 0.1.6 - chevrotain: 10.5.0 - zod: 3.23.8 - transitivePeerDependencies: - - encoding - '@azimutt/utils@0.1.6': {} '@azure/abort-controller@2.1.2': @@ -11376,109 +10738,72 @@ snapshots: '@elm_binaries/win32_x64@0.19.1-0': optional: true - '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.24.0)': - dependencies: - esbuild: 0.24.0 - '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/aix-ppc64@0.24.0': - optional: true - '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm64@0.24.0': - optional: true - '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-arm@0.24.0': - optional: true - '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/android-x64@0.24.0': - optional: true - '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.24.0': - optional: true - '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/darwin-x64@0.24.0': - optional: true - '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.24.0': - optional: true - '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.24.0': - optional: true - '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm64@0.24.0': - optional: true - '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-arm@0.24.0': - optional: true - '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-ia32@0.24.0': - optional: true - '@esbuild/linux-loong64@0.14.54': optional: true @@ -11488,114 +10813,75 @@ snapshots: '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-loong64@0.24.0': - optional: true - '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-mips64el@0.24.0': - optional: true - '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-ppc64@0.24.0': - optional: true - '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.24.0': - optional: true - '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-s390x@0.24.0': - optional: true - '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/linux-x64@0.24.0': - optional: true - '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.24.0': - optional: true - '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.24.0': - optional: true - '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.24.0': - optional: true - '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.24.0': - optional: true - '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-arm64@0.24.0': - optional: true - '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.23.1': optional: true - '@esbuild/win32-ia32@0.24.0': - optional: true - '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.23.1': optional: true - '@esbuild/win32-x64@0.24.0': - optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -11606,11 +10892,6 @@ snapshots: eslint: 9.14.0(jiti@1.21.6) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.1(eslint@9.15.0(jiti@1.21.6))': - dependencies: - eslint: 9.15.0(jiti@1.21.6) - eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.18.0': @@ -11621,18 +10902,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-array@0.19.0': - dependencies: - '@eslint/object-schema': 2.1.4 - debug: 4.3.7(supports-color@5.5.0) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@eslint/core@0.7.0': {} - '@eslint/core@0.9.0': {} - '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -11661,36 +10932,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.2.0': - dependencies: - ajv: 6.12.6 - debug: 4.3.7(supports-color@5.5.0) - espree: 10.3.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - '@eslint/js@8.57.1': {} '@eslint/js@9.14.0': {} - '@eslint/js@9.15.0': {} - '@eslint/object-schema@2.1.4': {} '@eslint/plugin-kit@0.2.2': dependencies: levn: 0.4.1 - '@eslint/plugin-kit@0.2.3': - dependencies: - levn: 0.4.1 - '@fastify/ajv-compiler@3.6.0': dependencies: ajv: 8.17.1 @@ -12063,16 +11314,6 @@ snapshots: '@js-joda/core@5.6.3': {} - '@koa/cors@5.0.0': - dependencies: - vary: 1.1.2 - - '@koa/router@13.1.0': - dependencies: - http-errors: 2.0.0 - koa-compose: 4.1.0 - path-to-regexp: 6.3.0 - '@leichtgewicht/ip-codec@2.0.5': {} '@loancrate/prisma-schema-parser@2.0.0': @@ -12204,10 +11445,6 @@ snapshots: '@pkgr/core@0.1.1': {} - '@playwright/browser-chromium@1.49.0': - dependencies: - playwright-core: 1.49.0 - '@radix-ui/number@1.1.0': {} '@radix-ui/primitive@1.1.0': {} @@ -13159,8 +12396,6 @@ snapshots: '@types/aria-query@5.0.4': {} - '@types/assert@1.5.11': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.2 @@ -13323,8 +12558,6 @@ snapshots: '@types/minimatch@5.1.2': optional: true - '@types/mocha@10.0.10': {} - '@types/mssql@9.1.5': dependencies: '@types/node': 22.9.0 @@ -13431,8 +12664,6 @@ snapshots: '@types/triple-beam@1.3.5': {} - '@types/vscode@1.95.0': {} - '@types/webextension-polyfill@0.8.3': {} '@types/webidl-conversions@7.0.3': {} @@ -13492,24 +12723,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/type-utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 - eslint: 9.15.0(jiti@1.21.6) - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.13.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.13.0 @@ -13536,29 +12749,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.3.7(supports-color@5.5.0) - eslint: 9.15.0(jiti@1.21.6) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/scope-manager@8.13.0': dependencies: '@typescript-eslint/types': 8.13.0 '@typescript-eslint/visitor-keys': 8.13.0 - '@typescript-eslint/scope-manager@8.15.0': - dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 - '@typescript-eslint/type-utils@8.13.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.13.0(typescript@5.6.3) @@ -13583,22 +12778,8 @@ snapshots: - eslint - supports-color - '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3) - debug: 4.3.7(supports-color@5.5.0) - eslint: 9.15.0(jiti@1.21.6) - ts-api-utils: 1.4.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/types@8.13.0': {} - '@typescript-eslint/types@8.15.0': {} - '@typescript-eslint/typescript-estree@8.13.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.13.0 @@ -13614,21 +12795,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': - dependencies: - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/visitor-keys': 8.15.0 - debug: 4.3.7(supports-color@5.5.0) - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.0(typescript@5.6.3) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.13.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) @@ -13651,28 +12817,11 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) - '@typescript-eslint/scope-manager': 8.15.0 - '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) - eslint: 9.15.0(jiti@1.21.6) - optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/visitor-keys@8.13.0': dependencies: '@typescript-eslint/types': 8.13.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.15.0': - dependencies: - '@typescript-eslint/types': 8.15.0 - eslint-visitor-keys: 4.2.0 - '@ungap/structured-clone@1.2.0': {} '@vercel/webpack-asset-relocator-loader@1.7.4': @@ -13726,26 +12875,6 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 - '@vscode/test-web@0.0.64': - dependencies: - '@koa/cors': 5.0.0 - '@koa/router': 13.1.0 - '@playwright/browser-chromium': 1.49.0 - glob: 11.0.0 - gunzip-maybe: 1.4.2 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - koa: 2.15.3 - koa-morgan: 1.0.1 - koa-mount: 4.0.0 - koa-static: 5.0.0 - minimist: 1.2.8 - playwright: 1.49.0 - tar-fs: 3.0.6 - vscode-uri: 3.0.8 - transitivePeerDependencies: - - supports-color - '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -13910,8 +13039,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -14064,14 +13191,6 @@ snapshots: assert-plus@1.0.0: {} - assert@2.1.0: - dependencies: - call-bind: 1.0.7 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.5 - util: 0.12.5 - assertion-error@2.0.1: {} astral-regex@2.0.0: {} @@ -14135,8 +13254,6 @@ snapshots: transitivePeerDependencies: - debug - b4a@1.6.7: {} - babel-jest@29.7.0(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 @@ -14194,44 +13311,17 @@ snapshots: balanced-match@1.0.2: {} - bare-events@2.5.0: - optional: true - - bare-fs@2.3.5: - dependencies: - bare-events: 2.5.0 - bare-path: 2.1.3 - bare-stream: 2.4.0 - optional: true + base64-js@1.5.1: {} - bare-os@2.4.4: - optional: true + batch@0.6.1: {} - bare-path@2.1.3: + bcrypt-pbkdf@1.0.2: dependencies: - bare-os: 2.4.4 - optional: true + tweetnacl: 0.14.5 - bare-stream@2.4.0: - dependencies: - streamx: 2.20.2 - optional: true + before-after-hook@2.2.3: {} - base64-js@1.5.1: {} - - basic-auth@2.0.1: - dependencies: - safe-buffer: 5.1.2 - - batch@0.6.1: {} - - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - - before-after-hook@2.2.3: {} - - big-integer@1.6.52: {} + big-integer@1.6.52: {} big.js@5.2.2: {} @@ -14323,12 +13413,6 @@ snapshots: browser-request@0.3.3: {} - browser-stdout@1.3.1: {} - - browserify-zlib@0.1.4: - dependencies: - pako: 0.2.9 - browserslist@4.24.2: dependencies: caniuse-lite: 1.0.30001679 @@ -14399,11 +13483,6 @@ snapshots: transitivePeerDependencies: - bluebird - cache-content-type@1.0.1: - dependencies: - mime-types: 2.1.35 - ylru: 1.4.0 - cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: @@ -14583,6 +13662,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + optional: true cliui@8.0.1: dependencies: @@ -14743,11 +13823,6 @@ snapshots: cookie@0.7.2: {} - cookies@0.9.1: - dependencies: - depd: 2.0.0 - keygrip: 1.1.0 - core-util-is@1.0.2: {} core-util-is@1.0.3: {} @@ -14957,16 +14032,8 @@ snapshots: optionalDependencies: supports-color: 5.5.0 - debug@4.3.7(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - decamelize@1.2.0: {} - decamelize@4.0.0: {} - decimal.js@10.4.3: {} decompress-response@6.0.0: @@ -14977,8 +14044,6 @@ snapshots: deep-eql@5.0.2: {} - deep-equal@1.0.1: {} - deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -15055,8 +14120,6 @@ snapshots: diff@4.0.2: {} - diff@5.2.0: {} - dijkstrajs@1.0.3: {} dir-compare@4.2.0: @@ -15121,13 +14184,6 @@ snapshots: dotenv@16.4.5: {} - duplexify@3.7.1: - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - duplexify@4.1.3: dependencies: end-of-stream: 1.4.4 @@ -15697,33 +14753,6 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 - esbuild@0.24.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 - escalade@3.2.0: {} escape-html@1.0.3: {} @@ -15915,47 +14944,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.15.0(jiti@1.21.6): - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.15.0(jiti@1.21.6)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.0 - '@eslint/core': 0.9.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.15.0 - '@eslint/plugin-kit': 0.2.3 - '@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.6 - chalk: 4.1.2 - cross-spawn: 7.0.5 - debug: 4.3.7(supports-color@5.5.0) - escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 1.21.6 - transitivePeerDependencies: - - supports-color - esniff@2.0.1: dependencies: d: 1.0.2 @@ -16126,8 +15114,6 @@ snapshots: fast-diff@1.3.0: {} - fast-fifo@1.3.2: {} - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -16447,9 +15433,6 @@ snapshots: fsevents@2.1.3: optional: true - fsevents@2.3.2: - optional: true - fsevents@2.3.3: optional: true @@ -16593,15 +15576,6 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - glob@11.0.0: - dependencies: - foreground-child: 3.3.0 - jackspeak: 4.0.2 - minimatch: 10.0.1 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -16728,15 +15702,6 @@ snapshots: - encoding - supports-color - gunzip-maybe@1.4.2: - dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - handle-thing@2.0.1: {} har-schema@2.0.0: {} @@ -16826,11 +15791,6 @@ snapshots: domutils: 2.8.0 entities: 2.2.0 - http-assert@1.5.0: - dependencies: - deep-equal: 1.0.1 - http-errors: 1.8.1 - http-cache-semantics@4.1.1: {} http-deceiver@1.2.7: {} @@ -16850,14 +15810,6 @@ snapshots: statuses: 1.5.0 toidentifier: 1.0.0 - http-errors@1.8.1: - dependencies: - depd: 1.1.2 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 1.5.0 - toidentifier: 1.0.1 - http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -17027,11 +15979,6 @@ snapshots: ipaddr.js@2.2.0: {} - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -17070,8 +16017,6 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-deflate@1.0.0: {} - is-docker@2.2.1: {} is-docker@3.0.0: {} @@ -17084,16 +16029,10 @@ snapshots: is-generator-fn@2.1.0: {} - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-gzip@1.0.0: {} - is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -17104,11 +16043,6 @@ snapshots: is-module@1.0.0: {} - is-nan@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - is-negative-zero@2.0.3: {} is-number-object@1.0.7: @@ -17119,8 +16053,6 @@ snapshots: is-path-inside@3.0.3: {} - is-plain-obj@2.1.0: {} - is-plain-obj@3.0.0: {} is-plain-object@2.0.4: @@ -17247,10 +16179,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jackspeak@4.0.2: - dependencies: - '@isaacs/cliui': 8.0.2 - jake@10.9.2: dependencies: async: 3.2.6 @@ -17714,8 +16642,6 @@ snapshots: json-buffer@3.0.1: {} - json-parse-better-errors@1.0.2: {} - json-parse-even-better-errors@2.3.1: {} json-schema-ref-resolver@1.0.1: @@ -17792,10 +16718,6 @@ snapshots: jwa: 2.0.0 safe-buffer: 5.2.1 - keygrip@1.1.0: - dependencies: - tsscmp: 1.0.6 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -17804,69 +16726,6 @@ snapshots: kleur@3.0.3: {} - koa-compose@4.1.0: {} - - koa-convert@2.0.0: - dependencies: - co: 4.6.0 - koa-compose: 4.1.0 - - koa-morgan@1.0.1: - dependencies: - morgan: 1.10.0 - transitivePeerDependencies: - - supports-color - - koa-mount@4.0.0: - dependencies: - debug: 4.3.7(supports-color@5.5.0) - koa-compose: 4.1.0 - transitivePeerDependencies: - - supports-color - - koa-send@5.0.1: - dependencies: - debug: 4.3.7(supports-color@5.5.0) - http-errors: 1.8.1 - resolve-path: 1.4.0 - transitivePeerDependencies: - - supports-color - - koa-static@5.0.0: - dependencies: - debug: 3.2.7 - koa-send: 5.0.1 - transitivePeerDependencies: - - supports-color - - koa@2.15.3: - dependencies: - accepts: 1.3.8 - cache-content-type: 1.0.1 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookies: 0.9.1 - debug: 4.3.7(supports-color@5.5.0) - delegates: 1.0.0 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - fresh: 0.5.2 - http-assert: 1.5.0 - http-errors: 1.8.1 - is-generator-function: 1.0.10 - koa-compose: 4.1.0 - koa-convert: 2.0.0 - on-finished: 2.4.1 - only: 0.0.2 - parseurl: 1.3.3 - statuses: 1.5.0 - type-is: 1.6.18 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - kuler@2.0.0: {} launch-editor@2.9.1: @@ -17922,13 +16781,6 @@ snapshots: pify: 2.3.0 strip-bom: 3.0.0 - load-json-file@4.0.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - loader-runner@4.3.0: {} loader-utils@2.0.4: @@ -18020,8 +16872,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.0.2: {} - lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -18118,8 +16968,6 @@ snapshots: dependencies: readable-stream: 3.6.2 - memorystream@0.3.1: {} - merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -18161,10 +17009,6 @@ snapshots: minimalistic-assert@1.0.1: {} - minimatch@10.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@3.0.8: dependencies: brace-expansion: 1.1.11 @@ -18236,29 +17080,6 @@ snapshots: dependencies: obliterator: 2.0.4 - mocha@10.8.2: - dependencies: - ansi-colors: 4.1.3 - browser-stdout: 1.3.1 - chokidar: 3.6.0 - debug: 4.3.7(supports-color@8.1.1) - diff: 5.2.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 8.1.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.1.6 - ms: 2.1.3 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.5.1 - yargs: 16.2.0 - yargs-parser: 20.2.9 - yargs-unparser: 2.0.0 - moment-timezone@0.5.46: dependencies: moment: 2.30.1 @@ -18278,16 +17099,6 @@ snapshots: optionalDependencies: socks: 2.8.3 - morgan@1.10.0: - dependencies: - basic-auth: 2.0.1 - debug: 2.6.9 - depd: 2.0.0 - on-finished: 2.3.0 - on-headers: 1.0.2 - transitivePeerDependencies: - - supports-color - ms@2.0.0: {} ms@2.1.1: {} @@ -18426,18 +17237,6 @@ snapshots: normalize-url@6.1.0: {} - npm-run-all@4.1.5: - dependencies: - ansi-styles: 3.2.1 - chalk: 2.4.2 - cross-spawn: 6.0.5 - memorystream: 0.3.1 - minimatch: 3.1.2 - pidtree: 0.3.1 - read-pkg: 3.0.0 - shell-quote: 1.8.1 - string.prototype.padend: 3.1.6 - npm-run-path@2.0.2: dependencies: path-key: 2.0.1 @@ -18467,11 +17266,6 @@ snapshots: object-inspect@1.13.3: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - object-keys@1.1.1: {} object.assign@4.1.5: @@ -18528,8 +17322,6 @@ snapshots: dependencies: mimic-fn: 2.1.0 - only@0.0.2: {} - open@10.1.0: dependencies: default-browser: 5.2.1 @@ -18642,8 +17434,6 @@ snapshots: package-json-from-dist@1.0.1: {} - pako@0.2.9: {} - param-case@3.0.4: dependencies: dot-case: 3.0.4 @@ -18661,11 +17451,6 @@ snapshots: dependencies: error-ex: 1.3.2 - parse-json@4.0.0: - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - parse-json@5.2.0: dependencies: '@babel/code-frame': 7.26.2 @@ -18705,23 +17490,12 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-scurry@2.0.0: - dependencies: - lru-cache: 11.0.2 - minipass: 7.1.2 - path-to-regexp@0.1.10: {} - path-to-regexp@6.3.0: {} - path-type@2.0.0: dependencies: pify: 2.3.0 - path-type@3.0.0: - dependencies: - pify: 3.0.0 - path-type@4.0.0: {} pathe@1.1.2: {} @@ -18730,12 +17504,6 @@ snapshots: pe-library@1.0.1: {} - peek-stream@1.1.3: - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 - pem@1.14.2: dependencies: es6-promisify: 6.1.1 @@ -18815,12 +17583,8 @@ snapshots: picomatch@4.0.2: {} - pidtree@0.3.1: {} - pify@2.3.0: {} - pify@3.0.0: {} - pino-abstract-transport@2.0.0: dependencies: split2: 4.2.0 @@ -18864,14 +17628,6 @@ snapshots: dependencies: find-up: 4.1.0 - playwright-core@1.49.0: {} - - playwright@1.49.0: - dependencies: - playwright-core: 1.49.0 - optionalDependencies: - fsevents: 2.3.2 - plist@3.1.0: dependencies: '@xmldom/xmldom': 0.8.10 @@ -19040,22 +17796,11 @@ snapshots: pstree.remy@1.1.8: {} - pump@2.0.1: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - pump@3.0.2: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - pumpify@1.5.1: - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - punycode@2.3.1: {} pure-rand@6.1.0: {} @@ -19080,8 +17825,6 @@ snapshots: queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - quick-format-unescaped@4.0.4: {} quick-lru@5.1.1: {} @@ -19169,12 +17912,6 @@ snapshots: normalize-package-data: 2.5.0 path-type: 2.0.0 - read-pkg@3.0.0: - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - readable-stream@1.0.31: dependencies: core-util-is: 1.0.3 @@ -19300,11 +18037,6 @@ snapshots: dependencies: get-installed-path: 2.1.1 - resolve-path@1.4.0: - dependencies: - http-errors: 1.6.3 - path-is-absolute: 1.0.1 - resolve-pkg-maps@1.0.0: {} resolve.exports@2.0.2: {} @@ -19803,14 +18535,6 @@ snapshots: stream-shift@1.0.3: {} - streamx@2.20.2: - dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 - text-decoder: 1.2.1 - optionalDependencies: - bare-events: 2.5.0 - string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -19828,13 +18552,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.padend@3.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 @@ -19993,20 +18710,6 @@ snapshots: tapable@2.2.1: {} - tar-fs@3.0.6: - dependencies: - pump: 3.0.2 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 2.3.5 - bare-path: 2.1.3 - - tar-stream@3.1.7: - dependencies: - b4a: 1.6.7 - fast-fifo: 1.3.2 - streamx: 2.20.2 - tar@6.2.1: dependencies: chownr: 2.0.0 @@ -20085,8 +18788,6 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 - text-decoder@1.2.1: {} - text-hex@1.0.0: {} text-table@0.2.0: {} @@ -20103,11 +18804,6 @@ snapshots: dependencies: real-require: 0.2.0 - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - through@2.3.8: {} thunky@1.1.0: {} @@ -20230,6 +18926,25 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.0) + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0))(typescript@5.6.3): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.3)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 5.6.3 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.26.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + ts-loader@9.5.1(typescript@5.6.3)(webpack@5.96.1(@swc/core@1.9.1)): dependencies: chalk: 4.1.2 @@ -20289,8 +19004,6 @@ snapshots: tslib@2.8.1: {} - tsscmp@1.0.6: {} - tsx@4.19.2: dependencies: esbuild: 0.23.1 @@ -20459,14 +19172,6 @@ snapshots: util-deprecate@1.0.2: {} - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.1.1 - is-generator-function: 1.0.10 - is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - utila@0.4.0: {} utils-merge@1.0.1: {} @@ -20567,8 +19272,6 @@ snapshots: - supports-color - terser - vscode-uri@3.0.8: {} - w3c-xmlserializer@4.0.0: dependencies: xml-name-validator: 4.0.0 @@ -20784,8 +19487,6 @@ snapshots: word-wrap@1.2.5: {} - workerpool@6.5.1: {} - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -20870,17 +19571,11 @@ snapshots: camelcase: 5.3.1 decamelize: 1.2.0 - yargs-parser@20.2.9: {} + yargs-parser@20.2.9: + optional: true yargs-parser@21.1.1: {} - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -20904,6 +19599,7 @@ snapshots: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 + optional: true yargs@17.7.2: dependencies: @@ -20925,8 +19621,6 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - ylru@1.4.0: {} - yn@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 35f8a8361..521470edc 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,7 +4,6 @@ packages: - "cli/html-report" - "extensions/browser-extension" - "extensions/desktop" - - "extensions/vscode-aml" - "frontend" - "gateway" - "libs/*" From 778fc14d8c69f1a967645a025d9662398a793ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Knuchel?= Date: Sat, 23 Nov 2024 21:49:30 +0100 Subject: [PATCH 09/20] Add boilerplate for AML preview --- extensions/vscode-aml/README.md | 8 +++- extensions/vscode-aml/package.json | 31 +++++++++----- extensions/vscode-aml/src/web/extension.ts | 47 ++++++++++++++++++++-- 3 files changed, 71 insertions(+), 15 deletions(-) diff --git a/extensions/vscode-aml/README.md b/extensions/vscode-aml/README.md index e00d46930..7a1c363d7 100644 --- a/extensions/vscode-aml/README.md +++ b/extensions/vscode-aml/README.md @@ -16,7 +16,11 @@ This Visual Studio Code extension provides language support for [AML](https://az ## Roadmap -- Add parsing errors and auto-complete +- Add parsing errors +- auto-complete +- quick-fixes (code actions) +- Go-to-definition for relations (cf https://microsoft.github.io/monaco-editor/typedoc/interfaces/languages.DocumentSymbolProvider.html) +- hover info - Add diagram preview & Open in Azimutt - Add AML support in Markdown - Connect to a database @@ -35,7 +39,7 @@ Here are some interesting VS Code documentation you may find helpful: - [VS Code extension get started](https://code.visualstudio.com/api/get-started/your-first-extension). - [Language Configuration Guide](https://code.visualstudio.com/api/language-extensions/language-configuration-guide) -- [Syntax Highlight Guide](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide) +- [Syntax Highlight Guide](https://code.visualstudio.com/api/language-extensions/syntax-highlight-guide) & [Semantic Highlight Guide](https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide) - [Snippet Guide](https://code.visualstudio.com/api/language-extensions/snippet-guide) Tips: diff --git a/extensions/vscode-aml/package.json b/extensions/vscode-aml/package.json index 15bb76611..22f7faa83 100644 --- a/extensions/vscode-aml/package.json +++ b/extensions/vscode-aml/package.json @@ -60,34 +60,47 @@ ], "commands": [ { - "command": "vscode-aml.fromJson", + "command": "aml.fromJson", "category": "AML", "title": "convert JSON to AML" }, { - "command": "vscode-aml.fromSQL", + "command": "aml.fromSQL", "category": "AML", "title": "convert SQL to AML" }, { - "command": "vscode-aml.convert", + "command": "aml.convert", "category": "AML", "title": "convert AML to" + }, + { + "command": "aml.preview", + "category": "AML", + "title": "preview AML", + "icon": "$(open-preview)" } ], "menus": { "commandPalette": [ { - "command": "vscode-aml.fromJson", - "when": "editorLangId == json" + "when": "editorLangId == json", + "command": "aml.fromJson" }, { - "command": "vscode-aml.fromSQL", - "when": "editorLangId == sql" + "when": "editorLangId == sql", + "command": "aml.fromSQL" }, { - "command": "vscode-aml.convert", - "when": "editorLangId == aml" + "when": "editorLangId == aml", + "command": "aml.convert" + } + ], + "editor/title": [ + { + "when": "editorLangId == aml", + "command": "aml.preview", + "group": "navigation" } ] } diff --git a/extensions/vscode-aml/src/web/extension.ts b/extensions/vscode-aml/src/web/extension.ts index 04155a0d6..50c101c85 100644 --- a/extensions/vscode-aml/src/web/extension.ts +++ b/extensions/vscode-aml/src/web/extension.ts @@ -1,4 +1,4 @@ -import vscode, {TextDocument, TextEditor, TextEditorEdit} from "vscode"; +import vscode, {TextDocument, TextEditor, TextEditorEdit, ViewColumn, WebviewPanel} from "vscode"; import {ParserError, ParserErrorLevel} from "@azimutt/models"; import {generateSql, parseSql} from "@azimutt/parser-sql"; import { @@ -14,10 +14,26 @@ import { } from "@azimutt/aml"; export function activate(context: vscode.ExtensionContext) { + let previewPanel: WebviewPanel | undefined = undefined context.subscriptions.push( - vscode.commands.registerTextEditorCommand('vscode-aml.fromJson', (editor: TextEditor, edit: TextEditorEdit) => convertJson(editor, edit)), - vscode.commands.registerTextEditorCommand('vscode-aml.fromSQL', (editor: TextEditor, edit: TextEditorEdit) => convertSql(editor, edit)), - vscode.commands.registerTextEditorCommand('vscode-aml.convert', (editor: TextEditor, edit: TextEditorEdit) => convertAml(editor, edit)) + vscode.commands.registerTextEditorCommand('aml.fromJson', (editor: TextEditor, edit: TextEditorEdit) => convertJson(editor, edit)), + vscode.commands.registerTextEditorCommand('aml.fromSQL', (editor: TextEditor, edit: TextEditorEdit) => convertSql(editor, edit)), + vscode.commands.registerTextEditorCommand('aml.convert', (editor: TextEditor, edit: TextEditorEdit) => convertAml(editor, edit)), + vscode.commands.registerTextEditorCommand('aml.preview', (editor: TextEditor, edit: TextEditorEdit) => { + vscode.window.showInformationMessage('aml.preview called') + if (editor.document.languageId !== 'aml') { + vscode.window.showErrorMessage('Needs AML file to preview it.') + return + } + const viewColumn = editor.viewColumn ? editor.viewColumn + 1 : ViewColumn.Two + if (!previewPanel) { + previewPanel = vscode.window.createWebviewPanel('aml-preview', 'Preview AML', {viewColumn, preserveFocus: true}, {localResourceRoots: []}) + previewPanel.onDidDispose(() => previewPanel = undefined, null, context.subscriptions) + } + updateAmlPreview(editor.document, previewPanel, viewColumn) + // TODO: update preview when editor text changes or when editor changes to another aml (with debounce) + // vscode.window.onDidChangeActiveTextEditor((editor: TextEditor) => {}) + }) ) } @@ -101,6 +117,28 @@ async function convertAml(editor: TextEditor, edit: TextEditorEdit): Promise + + + + + AML preview + + +